from qiskit import * # import tudo do qiskit

# Determina o número de qubits e de cbits a serem utilizados
qr = QuantumRegister(2) # determina quantos qubits serão usados
cr = ClassicalRegister(2) # determina quantos cbits serão usados

# Constrói o circuito quântico
qc = QuantumCircuit(qr, cr)

# para o circuitos quânticos ficarem mais apresentáveis
%matplotlib inline 

qc.draw(output='mpl') # mostra o circuito

# adiciona a porta lógica de Hadamard ao circuito, aplicada no qubit (registro quântico) 0
qc.h(qr[0]); # tem que usar ; pra não dar aviso

qc.draw(output = 'mpl') # o output = 'mpl' é para a figura ficar mais apresentável

# adiciona uma controll-not ao circuito, com o controle sendo qr[0] e o target sendo qr[1]
qc.cx(qr[0],qr[1]);

# é importante sempre mandar mostrar o circuito, pra ter certeza que é realmente o que queremos construir
qc.draw(output = 'mpl')

# adiciona medidas em todos os qubits (a ser usada quando queremos acessar a distribuições de probabilidades)
qc.measure(qr,cr);

qc.draw(output = 'mpl')

# Determina o backend a ser usado, que poder ser um simulador ou um chip real
# Neste caso escolhemos o simulador qasm_simulator
simulator = Aer.get_backend('qasm_simulator')

# número de medidas para estimativa de uma distribuição de probabilidades
nshots = 8192

# executa o circuito qc no backend escolhido
result = execute(qc, backend = simulator, shots = nshots).result()

# para visualizar o histograma da distribuicao de probabilidades
from qiskit.tools.visualization import plot_histogram
plot_histogram(result.get_counts(qc))

counts = result.get_counts(qc); counts, counts['00']

# carrega minha conta no IBMQ (o ID foi incluido no outro arquivo, nao precisa incluir aqui)
qiskit.IBMQ.load_account();

#provider = IBMQ.get_provider('ibm-q')
provider = IBMQ.get_provider(hub = 'ibm-q-research-2', group = 'federal-uni-sant-1', project = 'main')

# determina em qual backend vamos executar o circuito
device = provider.get_backend('ibmq_casablanca')

# se certifica que o backend esta certo
device.name()

# executa o circuito quantico qc no CQ escolhido
job = execute(qc, backend = device, shots = nshots)

from qiskit.tools.monitor import job_monitor

# para monitorar a execucao do circuito
job_monitor(job)

result = job.result()

plot_histogram(result.get_counts(qc))

