quantum/09_quantum_monthy.py

71 lines
1.9 KiB
Python

import random
import numpy as np
from qiskit import (
QuantumCircuit,
execute,
Aer)
from collections import defaultdict
CASE_IDENTICAL = "identical"
CASE_ORTHOGONAL = "orthogonal"
def perform_exp(case):
# Use Aer's qasm_simulator
simulator = Aer.get_backend('qasm_simulator')
all_counts = defaultdict(int)
qc = QuantumCircuit(2, 2)
# produce angles with uniform distribution on the sphere
t = round(np.random.uniform(0, 1), 10)
theta0 = np.arccos(1 - 2 * t)
phi0 = round(np.random.uniform(0, 2 * np.pi), 10)
# rotate the 0th qubit in (theta, phi)
qc.r(theta0, phi0, 0)
# rotate the 1st qubit depending on the case we are exploring...
if case == CASE_IDENTICAL:
# ... for identical we are rotating the 1st qubit the same angles as
# the 0th
theta1, phi1 = theta0, phi0
elif case == CASE_ORTHOGONAL:
# for orthogonal we rotate the 1st qubit in 90 degrees
# orthogonal to the first
theta1, phi1 = theta0 + np.pi, phi0
# perform the rotation of the 1st qubit
qc.r(theta1, phi1, 1)
# Measure in the Bell's basis
qc.cx(0, 1)
qc.h(0)
# measuring maps the 0/1 qubit register to the 0/1 classical register
qc.measure([0, 1], [0, 1])
# execute the job
job = execute(qc, simulator, shots=1)
result = job.result()
counts = result.get_counts(qc)
return [i for i in counts.keys()][0]
if __name__ == "__main__":
correct = 0
results = defaultdict(int)
for i in range(100):
case = random.choice([CASE_IDENTICAL, CASE_ORTHOGONAL])
result = perform_exp(case=case)
results[result] += 1
if result == '11':
guess = CASE_ORTHOGONAL
else:
guess = CASE_IDENTICAL
if guess == case:
correct += 1
print("Correct: {}".format(correct))
# print("Results: {}".format(results))