from qiskit import QuantumRegister, ClassicalRegister
from qiskit import QuantumCircuit, execute, Aer


q = QuantumRegister(2,'q')
c = ClassicalRegister(2,'c')


def primeiroEstadoBell():
    circuito = QuantumCircuit(q,c)

    circuito.h(q[0]) 
    circuito.cx(q[0],q[1]) 
    circuito.measure(q,c)
    
    display(circuito.draw(output='mpl'))

    job = execute(circuito, Aer.get_backend('qasm_simulator'), shots=8192)
    counts = job.result().get_counts(circuito)
    print(counts)


def segundoEstadoBell():
    circuito = QuantumCircuit(q,c)

    circuito.x(q[0]) 
    circuito.h(q[0])  
    circuito.cx(q[0],q[1]) 
    circuito.measure(q,c)

    display(circuito.draw(output='mpl'))
    job = execute(circuito, Aer.get_backend('qasm_simulator'), shots=8192)
    counts = job.result().get_counts(circuito)
    print(counts)


def terceiroEstadoBell():
    circuito = QuantumCircuit(q,c)

    circuito.x(q[1]) 
    circuito.h(q[0]) 
    circuito.cx(q[0],q[1]) 
    circuito.measure(q,c) 

    display(circuito.draw(output='mpl'))

    job = execute(circuito, Aer.get_backend('qasm_simulator'), shots=8192)    
    counts = job.result().get_counts(circuito)
    print(counts)


def quartoEstadoBell():
    circuito = QuantumCircuit(q,c)

    circuito.x(q[1]) 
    circuito.h(q[0]) 
    circuito.z(q[0]) 
    circuito.z(q[1]) 
    circuito.cx(q[0],q[1]) 
    circuito.measure(q,c) 

    display(circuito.draw(output='mpl'))

    job = execute(circuito, Aer.get_backend('qasm_simulator'), shots=8192)    
    counts = job.result().get_counts(circuito)
    print(counts)


print("Criando primeiro estado de Bell:\n")
primeiroEstadoBell()

print("\nCriando segundo estado de Bell:\n")
segundoEstadoBell()

print("\nCriando terceiro estado de Bell:\n")
terceiroEstadoBell()

print("\nCriando quarto estado de Bell:\n")
quartoEstadoBell()

