import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
def bv_query(n, secret=None):
if secret is None:
value = np.random.randint(0, 2 ** n)
secret = format(value, f"0{n}b")
else:
secret = secret.zfill(n)
oracle = QuantumCircuit(n + 1, name="Uf")
for index, bit in enumerate(reversed(secret)):
if bit == "1":
oracle.cx(index, n)
return oracle, secret
def bernstein_vazirani_circuit(n, secret=None):
oracle, secret = bv_query(n, secret)
qc = QuantumCircuit(n + 1, n)
qc.x(n)
for i in range(n + 1):
qc.h(i)
qc.compose(oracle, inplace=True)
for i in range(n):
qc.h(i)
for i in range(n):
qc.measure(i, i)
return qc, secret
def run_bernstein_vazirani(n, secret=None, shots=1):
qc, secret = bernstein_vazirani_circuit(n, secret)
simulator = AerSimulator()
compiled = transpile(qc, simulator)
result = simulator.run(compiled, shots=shots).result()
counts = result.get_counts()
measured = max(counts, key=counts.get)
recovered = measured[::-1]
return qc, secret, recovered, counts
qc, secret, recovered, counts = run_bernstein_vazirani(5, "01101")
print(qc.draw())
print("Secret :", secret)
print("Measured :", recovered)
print("Counts :", counts)