搜索一个元素,并估计成功概率¶
English · 简体中文
Grover 搜索使用相位 oracle 标记好状态。下面在四个基态中标记 3,一次迭代后读取该状态。
from oracq.algorithms.input_model.oracles import phase_marks
from oracq.algorithms.common.search import grover
from oracq import simulate
result = grover(phase_marks(2, [3]), 2, iterations=1)
state = simulate(result.operation.program())
print(state.amplitudes)
assert abs(state.amplitudes[(3, 0)] - 1) < 1e-12
{(3, 0): (0.9999999999999996-1.8369701987210287e-16j)}
grover 接收 phase_marks 声明的相位 oracle。打印出的字典只有一个基态:键 (3, 0) 表示 target 读数为 3、signal 为零,幅度的模方约等于 1(虚部是浮点噪声)。输出含 target 和 signal。这里 signal 为空接口,结果字为零;更复杂的输入制备可能有工作寄存器。
估计概率¶
标准振幅估计对 Grover iterate 做相位估计,入口是 amplitude_estimation。它接收初态制备和好状态集合,输出 phase 寄存器。下面的初态在 0 和 1 上均匀分布,故好状态 1 的概率为 1/2。
from oracq.algorithms.input_model.oracles import uniform_state
from oracq.algorithms.common.estimation import amplitude_estimation, amplitude_from_phase
operation = amplitude_estimation(uniform_state(1), [1], precision=3)
state = simulate(operation.program())
phases = {key[2] for key in state.amplitudes}
# 解码值与 1/2 只差浮点末位,不同平台的三角函数库在末位上可能不同;
# 打印前舍入到 12 位,输出在各平台逐字一致。
print({value: round(amplitude_from_phase(value, 3), 12) for value in sorted(phases)})
assert phases == {2, 6}
assert all(abs(amplitude_from_phase(value, 3) - 0.5) < 1e-12 for value in phases)
{2: 0.5, 6: 0.5}
初态由 uniform_state 制备。打印出的字典把两个相位字经 amplitude_from_phase 解码回概率:2 和 6 都给出约 1/2,未舍入的解码值与 1/2 的差异在浮点末位,来自有限精度读出的舍入。一般情况下,有限精度的相位读出会产生近似估计;多次采样和统计处理在宿主侧进行。
相关页面¶
API 参考:搜索与振幅放大、相位、振幅与重叠估计、Oracle 声明与实现
继续教程:运行与修改算法展示目录(覆盖本例两个算法的更多案例)