Grover Oracle 构造#
概述#
Grover 搜索算法是量子计算中最重要的算法之一,可以在无序数据库中以 \(O(\sqrt{N})\) 的复杂度搜索目标元素,相比经典算法的 \(O(N)\) 提供了二次加速。
Grover 算法的核心由两个组件构成:
Oracle(预言机):识别目标态并翻转其相位
Diffusion(扩散算子):放大目标态的概率振幅
Oracle 构造原理#
相位翻转 Oracle#
Oracle 的作用是将标记态 \(|w\rangle\) 的相位翻转:
实现方法#
我们使用辅助比特(ancilla)和相位回踢(phase kickback)技术:
将辅助比特初始化为 \(|-\rangle = \frac{|0\rangle - |1\rangle}{\sqrt{2}}\)
对数据比特施加 X 门,将标记态的位模式取反(使 0 位变为 1)
施加多控 Z 门(MCZ),当所有控制比特为 \(|1\rangle\) 时翻转辅助比特相位
撤销 X 门
MCZ 分解#
多控 Z 门通过线性深度的 CNOT 级联实现:
H(target)
CNOT: ctrl[0] → ctrl[1]
CNOT: ctrl[1] → ctrl[2]
...
CNOT: ctrl[-1] → target
CNOT: ctrl[1] → ctrl[2] (反向)
CNOT: ctrl[0] → ctrl[1]
H(target)
这种分解使用 \(O(n)\) 个 CNOT 门,不需要额外的辅助比特。
扩散算子#
扩散算子(又称振幅放大算子)的定义为:
其中 \(|s\rangle = H^{\otimes n}|0\rangle^{\otimes n}\) 是均匀叠加态。
等价实现:
其中 \(2|0\rangle\langle 0| - I\) 通过 X 门 + MCZ + X 门实现。
API 使用#
grover_oracle#
from uniqc.circuit_builder import Circuit
from uniqc.algorithmics.circuits import grover_oracle, grover_diffusion
c = Circuit()
n_qubits = 3
# 均匀叠加
for i in range(n_qubits):
c.h(i)
# 构造 oracle
ancilla = grover_oracle(c, marked_state=5, qubits=[0, 1, 2])
# 构造扩散算子
grover_diffusion(c, qubits=[0, 1, 2], ancilla=ancilla)
grover_diffusion#
grover_diffusion(c, qubits=[0, 1, 2], ancilla=3)
qubits:数据比特索引列表,默认[0, 1]ancilla:辅助比特索引,默认自动分配为max(qubits) + 1
完整示例#
参见 examples/circuits/grover_oracle.py,演示了完整的 Grover 搜索流程:
python examples/circuits/grover_oracle.py --n-qubits 3 --marked-state 5 --shots 4096
参考文献#
Grover, L. K. (1996). “A fast quantum mechanical algorithm for database search.” STOC ‘96.
Nielsen, M. A., & Chuang, I. L. (2010). Quantum Computation and Quantum Information.