# Importando módulos
from qiskit import *
from qiskit.tools.visualization import plot_histogram

# Inicializando o circuito

nQubits = 2
nBits = 2
circuitoQuantico = QuantumCircuit(nQubits, nBits)

# Para aplicar uma porta no circuito devemos seguir o seguinte exemplo onde aplicamos uma Hadamard Gate

circuitoQuantico.h(0)

# Nesse exemplo h() é a função que usamos para aplicar uma Hadamard Gate e o argumento é o índice do qubit
# onde se deseja aplica a porta

# Podemos ver ao chamar draw() que a Hadamard Gate fica no qubit desejado

circuitoQuantico.draw(output = 'mpl')

# Podemos aplicar também portas que envolvem mais de um qubit, como a CNOT(Controlled NOT) Gate

circuitoQuantico.cx(0,1)

# Visualização do circuito após chamar a CNOT Gate

circuitoQuantico.draw(output = 'mpl')

# Agora podemos medir esses qubits após as operações chamando measure()

circuitoQuantico.measure(0,0)
circuitoQuantico.measure(1,1)

# Visualização do circuito após chamar measure()

circuitoQuantico.draw(output = 'mpl')

# Para simular um circuito quântico usamos um elemento do Qiskit chamado Aer, que tem como 
# uma de suas funções a simulação de circuitos

simulador = Aer.get_backend('qasm_simulator')

# Para executar o circuito chamamos execute() que leva como argumento o circuito a ser executado e o 
# backend(aonde o circuito vai ser executado) que nesse caso é no simulador do Aer

resultado = execute(circuitoQuantico, backend = simulador).result()

# Usamos a variável resultado para guardar os dados do resultado

# Para exibir os resultados chamamos plot_histogram()

plot_histogram(resultado.get_counts(circuitoQuantico))

# Antes de tudo é necessário imp

