import numpy as np
# Importing standard Qiskit libraries
from qiskit import *
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.tools.jupyter import *
from qiskit.visualization import *
from ibm_quantum_widgets import *
from qiskit_textbook.tools import array_to_latex



# Loading your IBM Quantum account(s)
provider = IBMQ.load_account()

n = 2
qc = QuantumCircuit(n)
qc.h(0)
qc.h(1)
display(qc.draw())
'''

Executando o circuito acima em um simulador quântico. 
O resultado irá mostrar a probabilidade de obter um dos 4 estados possivíveis:

00, 01, 10 e 11

Lembrando que o que conseguimos estrair de informação são os bits clássicos.

'''
backend = Aer.get_backend('statevector_simulator')
results = execute(qc,backend).result().get_counts()
state = execute(qc,backend).result().get_statevector()

#Gerando o histograma dos resultatos
display(plot_histogram(results, figsize = (3,3)))

#Mostrando vetor de estado

array_to_latex(state, pretext="\\vert \psi\\rangle = ")

n = 2 # número de qubits
c = 2 # número de bits (clássicos) 

#iniciando o circuito com n qubit e c bits
qc = QuantumCircuit(n, c)
qc.h(0)
qc.h(1)

#medindo os qubits q0 e q1 e guarando o valor em c0 e c1 (respectivamente)
qc.measure(range(n), range(c))
display(qc.draw())

shots = 100 #quantidade de vezes que realizamos o experimento
plots = 1 #numero de plots
backend = Aer.get_backend('qasm_simulator')

for i in range(plots):
    results = execute(qc,backend, shots = shots).result().get_counts()
    #Gerando o histograma dos resultatos
    display(plot_histogram(results, figsize = (3,3)))
print(f"O resultado 00 apareceu {results['00']}")
print(f"O resultado 01 apareceu {results['01']}")
print(f"O resultado 10 apareceu {results['10']}")
print(f"O resultado 11 apareceu {results['11']}")

n = 2 # número de qubits
c = 2 # número de bits (clássicos) 

#iniciando o circuito com n qubit e c bits
qc = QuantumCircuit(n)
qc.h(0)
qc.cx(0,1)
qc.draw()

backend = Aer.get_backend('statevector_simulator')
results = execute(qc,backend).result().get_counts()
display(plot_histogram(results, figsize = (3,3)))
state = execute(qc,backend).result().get_statevector()


array_to_latex(state, pretext="\\vert \psi \\rangle = ")



n = 2 # número de qubits
c = 2 # número de bits (clássicos) 

#iniciando o circuito com n qubit e c bits
qc = QuantumCircuit(n)
# qc.h(0)
# qc.z(0)
qc.x(0)
qc.h(0)
qc.cx(0,1)
qc.draw()

backend = Aer.get_backend('statevector_simulator')
results = execute(qc,backend).result().get_counts()
display(plot_histogram(results, figsize = (3,3)))
state = execute(qc,backend).result().get_statevector()


array_to_latex(state, pretext="\\vert \psi \\rangle = ")

n = 2 # número de qubits
c = 2 # número de bits (clássicos) 

#iniciando o circuito com n qubit e c bits
qc = QuantumCircuit(n)
qc.h(0)  #00 + 10
qc.x(1) #01 + 11 (0 + 1)* 1
qc.cx(0,1) #01 +10 (?)
qc.draw()

backend = Aer.get_backend('statevector_simulator')
results = execute(qc,backend).result().get_counts()
display(plot_histogram(results, figsize = (3,3)))
state = execute(qc,backend).result().get_statevector()


array_to_latex(state, pretext="\\vert \psi \\rangle = ")

n = 2 # número de qubits
c = 2 # número de bits (clássicos) 

#iniciando o circuito com n qubit e c bits
qc = QuantumCircuit(n)
qc.x(0)
qc.h(0)
qc.x(1)
qc.cx(0,1)
display(qc.draw())

backend = Aer.get_backend('statevector_simulator')
results = execute(qc,backend).result().get_counts()
display(plot_histogram(results, figsize = (3,3)))
state = execute(qc,backend).result().get_statevector()


array_to_latex(state, pretext="\\vert \psi \\rangle = ")

