You are on page 1of 10

DESAFIO CNOT E CCNOT CONTROLADAS POR |0>

In [1]: from qiskit import *


from qiskit.tools.visualization import plot_bloch_multivector
from qiskit.tools.visualization import plot_histogram
from qiskit.visualization import array_to_latex
from qiskit.visualization import plot_state_qsphere

In [2]: from sympy import *


from sympy import symbol
from sympy.physics.quantum.qubit import Qubit
from sympy.physics.quantum.represent import represent

In [3]: #Carrega conta na plataforma IBMQ


IBMQ.save_account('', overwrite=True)

IBMQ.load_account()

Out[3]: <AccountProvider for IBMQ(hub='ibm-q', group='open', project='main')>

In [4]: #Determina o provedor e o computador quântido para execução do job


provider = IBMQ.get_provider('ibm-q')

qcomp = provider.get_backend('ibmq_quito')

Desafio 01
Construir um circuito de 2 Qubits fazendo uma CNOT controlada pelo |0>

Resultados esperados:

In [5]: entradas = [Qubit('00'), Qubit('01'), Qubit('10'), Qubit('11')]


saidas = [Qubit('01'), Qubit('00'), Qubit('10'), Qubit('11')]

In [6]: for i, entrada in enumerate(entradas):


display(Eq(S('U')*entrada, saidas[i], evaluate=false))

U |00⟩ = |01⟩

U |01⟩ = |00⟩

U |10⟩ = |10⟩

U |11⟩ = |11⟩

Solução
In [7]: #Cria um circuito quântico com 2 registradores quânticos e 2 registradores
clássicos
qregister = QuantumRegister(2)

cregister = ClassicalRegister(2)

circuit = QuantumCircuit(qregister,cregister)

In [8]: #Inicializa estado do circuito


ket_0 = [1,0]
ket_1 = [0,1]

circuit.initialize(ket_1, 0)
circuit.initialize(ket_1, 1)

Out[8]: <qiskit.circuit.instructionset.InstructionSet at 0x7f137c2ea7f0>

In [9]: #Plota o circuito utilizando a bibliteca matplotlib


%matplotlib inline
circuit.draw(output='mpl')

Out[9]:

In [10]: #Insere um operador X(NOT) no Qubit 0 do registrador 0


circuit.x(qregister[0])

Out[10]: <qiskit.circuit.instructionset.InstructionSet at 0x7f136e401fa0>

In [11]: circuit.draw(output='mpl')

Out[11]:

In [12]: #Insere um operador CX(CNOT) com o controle no Qubit 0 e alvo no Qubit 1 do


registrador 0
circuit.cx(qregister[0],qregister[1])

Out[12]: <qiskit.circuit.instructionset.InstructionSet at 0x7f136e372250>


In [13]: circuit.draw(output='mpl')

Out[13]:

In [14]: #Insere um operador X(NOT) no Qubit 0 do registrador 0


circuit.x(qregister[0])

Out[14]: <qiskit.circuit.instructionset.InstructionSet at 0x7f136e282460>

In [15]: circuit.draw(output='mpl')

Out[15]:

In [16]: #Executa a simulação do circuito utilizando o StateVector simulator como ba


ckend
sv_simulator = Aer.get_backend('statevector_simulator')
sv_result = execute(circuit, backend = sv_simulator).result()
statevector = sv_result.get_statevector()

In [17]: #Demonstra vetor de estado do circuito


array_to_latex(statevector, prefix='|\psi_1> = ')

Out[17]: |ψ1 >= [ 0 0 0 1]


In [18]: #Plota o vetor de estados na Q-Sphere
plot_state_qsphere(statevector)

Out[18]:

Simulação
In [19]: #Insere as medidas nos Qubits 0 e 1 do registrador 0
circuit.measure(qregister,cregister)

Out[19]: <qiskit.circuit.instructionset.InstructionSet at 0x7f13623dc430>

In [20]: circuit.draw(output='mpl')

Out[20]:

In [21]: #Executa a simulação do circuito utilizando o QASM Simulator como backend


simulator = Aer.get_backend('qasm_simulator')
result = execute(circuit, backend=simulator).result()
In [22]: #Plota o histograma com o resultado da simulação
sim_counts = result.get_counts(circuit)
plot_histogram(sim_counts, title="Resultados da Simulação")

Out[22]:

Execução
In [23]: #Executa e monitora o job no backend
job = execute(circuit, backend=qcomp)

from qiskit.tools.monitor import job_monitor

job_monitor(job)

Job Status: job has successfully run

In [24]: #Plota o histograma com o resultado da execução


job_result = job.result()
job_counts = job_result.get_counts(circuit)
plot_histogram(job_counts, title="Resultados do Job")

Out[24]:
Desafio 02
Construir um circuito de 3 Qubits fazendo uma CCNOT controlada pelo |0>

Resultados esperados:

In [23]: entradas = [Qubit('000'), Qubit('001'), Qubit('010'), Qubit('011'), Qubit(


'100'), Qubit('101'), Qubit('110'), Qubit('111')]
saidas = [Qubit('001'), Qubit('000'), Qubit('010'), Qubit('011'), Qubit('10
0'), Qubit('101'), Qubit('110'), Qubit('111')]

In [24]: for i, entrada in enumerate(entradas):


display(Eq(S('U')*entrada, saidas[i], evaluate=false))

U |000⟩ = |001⟩

U |001⟩ = |000⟩

U |010⟩ = |010⟩

U |011⟩ = |011⟩

U |100⟩ = |100⟩

U |101⟩ = |101⟩

U |110⟩ = |110⟩

U |111⟩ = |111⟩

Solução
In [ ]:

In [25]: #Cria um circuito quântico com 3 registradores quânticos e 3 registradores


clássicos
qregister = QuantumRegister(3)

cregister = ClassicalRegister(3)

circuit = QuantumCircuit(qregister,cregister)

In [26]: #Inicializa estado do circuito

circuit.initialize(ket_0, 0)
circuit.initialize(ket_0, 1)
circuit.initialize(ket_0, 2)

Out[26]: <qiskit.circuit.instructionset.InstructionSet at 0x7f136236b760>


In [27]: #Plota o circuito utilizando a bibliteca matplotlib
%matplotlib inline
circuit.draw(output='mpl')

Out[27]:

In [28]: #Insere o operador X(NOT) nos Qubits 0 e 1 do registrador 0


circuit.x(qregister[0])
circuit.x(qregister[1])

Out[28]: <qiskit.circuit.instructionset.InstructionSet at 0x7f13cc1dd490>

In [29]: circuit.draw(output='mpl')

Out[29]:

In [30]: #Insere um operador CCX(CCNOT) com os controles nos Qubits 0 e 1 e o alvo n


o Qubit 2 do registrador 0
circuit.ccx(qregister[0],qregister[1],qregister[2])

Out[30]: <qiskit.circuit.instructionset.InstructionSet at 0x7f136ecf2370>

In [31]: circuit.draw(output='mpl')

Out[31]:
In [32]: #Insere o operador X(NOT) nos Qubits 0 e 1 do registrador 0
circuit.x(qregister[0])
circuit.x(qregister[1])

Out[32]: <qiskit.circuit.instructionset.InstructionSet at 0x7f135e97dcd0>

In [33]: circuit.draw(output='mpl')

Out[33]:

In [34]: #Executa a simulação do circuito utilizando o StateVector simulator como ba


ckend
sv_simulator = Aer.get_backend('statevector_simulator')
sv_result = execute(circuit, backend = sv_simulator).result()
statevector = sv_result.get_statevector()

In [35]: #Demonstra vetor de estado do circuito


array_to_latex(statevector, prefix='|\psi_1> = ')

Out[35]: |ψ1 >= [ 0 0 0 0 1 0 0 0]

In [36]: #Plota o vetor de estados na Q-Sphere


plot_state_qsphere(statevector)

Out[36]:

Simulação
In [37]: #Insere as medidas nos Qubits 0, 1 e 2 do registrador 0
circuit.measure(qregister,cregister)
Out[37]: <qiskit.circuit.instructionset.InstructionSet at 0x7f135e5f8640>

In [38]: circuit.draw(output='mpl')

Out[38]:

In [39]: #Executa a simulação do circuito utilizando o QASM Simulator como backend


simulator = Aer.get_backend('qasm_simulator')
result = execute(circuit, backend=simulator).result()

In [40]: #Plota o histograma com o resultado da simulação


sim_counts = result.get_counts(circuit)
plot_histogram(sim_counts, title="Resultados da Simulação")

Out[40]:

Execução
In [41]: #Executa e monitora o job no backend
job = execute(circuit, backend=qcomp, shots=2048)

from qiskit.tools.monitor import job_monitor

job_monitor(job)

Job Status: job has successfully run


In [42]: #Plota o histograma com o resultado da execução
job_result = job.result()
job_counts = job_result.get_counts(circuit)
plot_histogram(job_counts, title="Resultados do Job")

Out[42]:

You might also like