| name | quantum-algorithms |
| description | Implement quantum algorithms including Grover's search, VQE, QAOA, and QFT. Use when building quantum algorithms or optimization subroutines. |
Quantum Algorithms
pip install qiskit qiskit-aer qiskit-algorithms numpy scipy
Quantum Fourier Transform
def qft(n_qubits):
"""QFT with controlled-phase and swap gates."""
qc = QuantumCircuit(n_qubits)
for j in range(n_qubits):
qc.h(j)
for k in range(j + 1, n_qubits):
qc.cp(np.pi / (2 ** (k - j)), k, j)
for i in range(n_qubits // 2):
qc.swap(i, n_qubits - i - 1)
return qc
Grover's Search
def grovers_algorithm(marked_states, n_qubits, iterations=None):
"""Amplitude amplification - optimal iterations: π/4 * sqrt(N/M)."""
if iterations is None:
iterations = int(np.floor(np.pi / 4 * np.sqrt(2**n_qubits / len(marked_states))))
qc = QuantumCircuit(n_qubits, n_qubits)
qc.h(range(n_qubits))
for _ in range(iterations):
qc.compose(grover_oracle(marked_states, n_qubits), inplace=True)
qc.compose(grover_diffuser(n_qubits), inplace=True)
qc.measure(range(n_qubits), range(n_qubits))
return qc
def grover_oracle(marked_states, n_qubits):
"""Phase flip marked states - flip 0s, MCZ, unflip."""
oracle = QuantumCircuit(n_qubits)
for state in marked_states:
for i, bit in enumerate(reversed(state)):
if bit == '0': oracle.x(i)
oracle.h(n_qubits - 1); oracle.mcx(list(range(n_qubits - 1)), n_qubits - 1); oracle.h(n_qubits - 1)
for i, bit in enumerate(reversed(state)):
if bit == '0': oracle.x(i)
return oracle
def grover_diffuser(n_qubits):
"""Reflection about uniform superposition."""
qc = QuantumCircuit(n_qubits)
qc.h(range(n_qubits)); qc.x(range(n_qubits))
qc.h(n_qubits - 1); qc.mcx(list(range(n_qubits - 1)), n_qubits - 1); qc.h(n_qubits - 1)
qc.x(range(n_qubits)); qc.h(range(n_qubits))
return qc
VQE & QAOA
def vqe_ansatz(n_qubits, depth=1):
"""Hardware-efficient ansatz with RY-RZ + CX entangling."""
from qiskit.circuit import Parameter
qc = QuantumCircuit(n_qubits)
idx = 0
for d in range(depth):
for i in range(n_qubits):
qc.ry(Parameter(f'θ{idx}'), i); qc.rz(Parameter(f'φ{idx}'), i); idx += 1
for i in range(n_qubits - 1): qc.cx(i, i + 1)
return qc
def maxcut_qaoa(graph, p=1):
"""QAOA for MaxCut - cost (ZZ interactions) + mixer (X rotations)."""
from qiskit.circuit import Parameter
n, qc = len(graph.nodes()), QuantumCircuit(len(graph.nodes()))
gamma, beta = [Parameter(f'γ{i}') for i in range(p)], [Parameter(f'β{i}') for i in range(p)]
qc.h(range(n))
for layer in range(p):
for i, j in graph.edges():
qc.cx(i, j); qc.rz(gamma[layer], j); qc.cx(i, j)
for i in range(n): qc.rx(2 * beta[layer], i)
return qc