Tutorial 4: Bernstein-Vazirani Algorithm¶
Time: 15 minutes
Level: Intermediate
Concepts: Hidden string problem, quantum query complexity
Try it interactively
This tutorial is also available as a Jupyter notebook you can run locally:
Open 10_bernstein_vazirani.ipynb
The Problem¶
Given a black-box function \(f(x) = s \cdot x \pmod{2}\) where \(s\) is a hidden \(n\)-bit string, find \(s\).
- Classical: Requires \(n\) queries
- Quantum: Requires 1 query
The Algorithm¶
import quantsdk as qs
# Hidden string to find
secret = "110"
n = len(secret)
circuit = qs.Circuit(n + 1, name="bernstein-vazirani")
# Initialize ancilla
circuit.x(n)
# Hadamard all
for i in range(n + 1):
circuit.h(i)
# Oracle: CNOT from qubit i to ancilla where secret[i] = '1'
circuit.barrier()
for i, bit in enumerate(secret):
if bit == '1':
circuit.cx(i, n)
circuit.barrier()
# Hadamard input qubits
for i in range(n):
circuit.h(i)
# Measure
for i in range(n):
circuit.measure(i)
# Run
result = qs.run(circuit, shots=1000)
print(f"Secret: {secret}")
print(f"Result: {result.most_likely}")
# Output: '110' (the secret string!)
How It Works¶
- Hadamard creates equal superposition of all inputs
- The oracle applies phase \((-1)^{s \cdot x}\) via phase kickback
- Final Hadamard interferes the phases to reveal \(s\) directly
- One measurement gives the exact answer with probability 1
Key Takeaways¶
- A linear speedup from \(n\) queries to 1 query
- Demonstrates phase kickback — the oracle's effect appears as phases
- Generalizes Deutsch-Jozsa to extracting information, not just yes/no
Next Tutorial¶
Simon's Algorithm — exponential speedup for period finding.