Grover 量子搜索算法解析与 Python 振幅放大实现——基于 cosmos 量子算法仓库的实战指南
2026/9/23 12:40:27 网站建设 项目流程
  • 教程
  • 示例工程

【免费下载链接】cosmos

World's largest Contributor driven code dataset | Used in Quark Search Engine, @OpenGenus IQ, OpenGenus Visual Project

项目地址:https://gitcode.com/gh_mirrors/co/cosmos
点击查看免费下载

导读:本文以 cosmos 仓库中 Grover 算法问题文档(code/quantum_algorithms/grovers_algorithm/README.md)为核心,系统讲解 Grover 搜索算法如何以O(sqrt(N))的时间复杂度在无序集合中定位目标值,并逐函数剖析其官方 Python 模拟实现 P1_grover_plot.py 中 Oracle 相位翻转、均值反转(inversion about the mean)与柱状图可视化三大环节。读完本文,你将理解 Grover 算法相对经典线性搜索的量子加速原理,掌握振幅放大迭代的数学推导,并能在本地独立运行、验证该实现的可视化结果。


一、算法背景:为什么无序搜索需要量子加速

Grover 算法是量子计算领域最经典的搜索算法之一,解决的是无结构(无序)搜索问题:给定一个包含 N 个元素的集合,如何最快地找到其中满足特定条件的目标值?

在经典计算机上,由于集合无序、没有任何索引或排序信息可用,只能逐个元素检查,最坏情况下需要尝试全部 N 个元素,时间复杂度为O(N)。而 Grover 算法利用量子叠加态并行性与振幅放大机制,将这一开销降低到O(sqrt(N))——这正是仓库文档中明确给出的核心复杂度结论:

The time complexity for Grover's Searching Algo isO(sqrt(N))where, N is the number of element in the set that is to be searched.

这一加速意味着:当 N = 100 万时,经典搜索平均需约 50 万次检查,而 Grover 算法仅需约 1000 次迭代即可让目标态的测量概率接近 1。


二、问题陈述 P-1 与仓库实现结构

仓库文档 README.md 以“问题驱动”的方式组织内容,提出了第一个编程问题:

P-1.Implement the Grover's Searching Algorithm that searches the target value from a set and plots the target value with the highest amplitude on Graph.

Implementation:-P1_grover_plot.py

对应地,该目录下共有两个文件:

文件作用
code/quantum_algorithms/grovers_algorithm/README.md算法背景、复杂度、问题陈述与实现索引
code/quantum_algorithms/grovers_algorithm/P1_grover_plot.pyP-1 的完整 Python 实现:搜索目标值并以最高振幅柱状图呈现

从命名(P-1、More To Be Added)可以推断,这是 OpenGenus cosmos 项目“算法 + 问题驱动”协作结构下的第一个子问题,后续题目与实现会在同一目录中持续扩充。与之并列的是 shors_algorithm(Shor 质因数分解算法),两者共同构成仓库的量子算法专题。

原文档还特别给出运行环境要求:

Note:- Python 3.5 or Greater is Recommended for Compiling

结合源码顶部的导入语句(P1_grover_plot.py),运行时需要的依赖为:

  • matplotlib(柱状图绘制)
  • numpy(数值与坐标轴工具)
  • hashlibmathcollectionsstatistics(Python 标准库)

其中from statistics import mean(Python 3.4+ 引入)也是文档建议 3.5+ 的佐证。


三、源码级剖析:Grover 算法的三个核心环节

实现 P1_grover_plot.py 将 Grover 算法的每一次迭代拆解为经典可模拟的三个环节。虽然它不是真正的量子电路,但完整复现了算法数学内核,非常适合理解原理。

3.1 Oracle(预言机):SHA-256 哈希判等与相位翻转

### GetOracle(x_value): Returns the hex digest of the x value. This is referred to as the Oracle function. def GetOracle(x_val): return hashlib.sha256(bytes(x_val, 'utf-8')).hexdigest()

在真实量子电路中,Oracle 是一个酉算子 U_f,其作用是对“命中目标”的基态施加相位翻转(即振幅乘以 -1),而对其他基态不做改变;Oracle 本身由问题的判定逻辑编码而成。本实现中,作者用SHA-256 哈希值比较来充当这一“黑盒判定器”:对每个候选值计算sha256(x).hexdigest(),再与目标的哈希比对。由于哈希碰撞在现实中可忽略,GetOracle(j) == GetOracle(tgt)即可等价于“j 就是目标”,从而在经典层面模拟了 Oracle 的标记行为。

3.2 均匀叠加初始化

amp = OrderedDict.fromkeys(objs, 1/sqrt(nval))

算法第一步是对所有 N 个候选态建立等概率叠加:每个元素振幅初始化为1/sqrt(N),对应量子计算中的 Hadamard 变换将计算基态送入均匀叠加态。这里使用OrderedDict保证元素顺序在后续迭代与绘图时保持一致。

3.3 一次完整迭代:相位翻转 + 均值反转

Grover 每次迭代包含两步操作,本实现将它们合并在 GroverAlgo 的同一个循环体内:

for i in range(0, rounds, 2): for j, k in amp.items(): if(GetOracle(j)==GetOracle(tgt)): amp[j] = k*(-1) # ① 目标态相位翻转 avg = mean(amp.values()) for j, k in amp.items(): if(GetOracle(j)==GetOracle(tgt)): amp[j] = (2*avg) + abs(k) # ② 目标态均值反转 continue amp[j] = k-(2*(k-avg)) # ② 非目标态均值反转

第一步——相位翻转(Oracle 标记):目标态的振幅由a变为-a,其余态保持不变。此时整体振幅均值为:

avg = ((N-1)·a + (-a)) / N = (N-2)·a / N

由于均值从a下降到(N-2)·a/N,目标态成为“低于均值”的离群点。

第二步——均值反转(扩散算子):对所有振幅执行“关于均值的镜面反射”,即新振幅 = 2·均值 − 旧振幅:

  • 目标态(旧值为-a):2·avg − (−a) = 2·avg + |k|,与代码中(2*avg) + abs(k)完全一致;
  • 非目标态(旧值为k):2·avg − k,即代码中的k − 2*(k − avg)

一次迭代的效果是:目标态振幅被显著抬高,非目标态振幅被压低,对应量子电路中“Oracle 标记 → 扩散门 D = 2|s⟩⟨s| − I 放大”的标准流程。重复迭代后,目标态振幅趋近 1,测量时以极高概率命中目标。

3.4 迭代轮数与range(0, rounds, 2)的细节

Grover 算法的最优迭代次数约为π/4 · sqrt(N)次,代码中正是这样计算的:

no_of_rounds = int((pi/4)*sqrt(no_of_objs))

值得注意的源码细节:循环写作for i in range(0, rounds, 2),即步长为 2。由于循环体内部每次已完整执行“相位翻转 + 均值反转”一轮,因此在当前实现中实际执行的完整放大轮数约为rounds/2。以示例集合 N = 7 为例:

rounds = int((π/4)·√7) = int(2.078) = 2 range(0, 2, 2) → 只执行 1 轮完整放大

这一轮放大已足以让目标振幅达到约 0.918(对应约 84% 的测量概率),完全满足 P-1“目标值以最高振幅呈现在图上”的演示目标。

3.5 PlotGraph:将振幅结果可视化

def PlotGraph(n, amp_val): plot.title('Grovers Algorithm') plot.ylabel('Amplitude Value') y_pos = NP.arange(n) plot.bar(y_pos, amp_val.values(), align='center', color='b') plot.xticks(y_pos, amp_val.keys()) plot.show()

PlotGraph 接收元素个数 n 与最终振幅字典,绘制标题为Grovers Algorithm、纵轴为Amplitude Value的蓝色柱状图,横轴标注集合中的每个候选值。这正是问题陈述 P-1 要求的“把目标值以最高振幅画在图上”。

3.6 驱动代码:一个可直接运行的完整示例

target = '8' # 要搜索的目标值 objects = ('10', '20', '8', '9','16','21','22') # 候选集合(7 个元素) no_of_objs = len(objects) no_of_rounds = int((pi/4)*sqrt(no_of_objs)) amp = GroverAlgo(target, objects, no_of_objs, no_of_rounds) PlotGraph(no_of_objs, amp)

目标值为字符串'8',候选集合为 7 个字符串元素,与GetOracle中对字符串先encode('utf-8')再哈希的逻辑吻合。


四、运行与结果验证

4.1 运行方式

在仓库根目录下执行:

python3 code/quantum_algorithms/grovers_algorithm/P1_grover_plot.py

若在无图形界面的服务器环境中运行,plot.show()可能无法弹出窗口;本地带有桌面环境时,将弹出一张柱状图窗口。

4.2 预期输出

程序首先打印迭代轮数与最终的振幅分布:

Number of rounds are 2 Final Map with corresponding grover_amplitude OrderedDict([('10', 0.16198...), ('20', 0.16198...), ('8', 0.91790...), ('9', 0.16198...), ('16', 0.16198...), ('21', 0.16198...), ('22', 0.16198...)])

随后绘制的柱状图中,目标值'8'的柱子将明显高于其余六个元素,即“目标态振幅被放大、非目标态振幅被压低”的直接体现。

4.3 目标不存在时的行为(自带校验语义)

源码末尾的注释点明了算法的可验证性质:

# Note:- If the target is found then it will have highest amplitude else all objects will have same amplitude.

当目标值不在集合中时,Oracle 永远不会命中,相位翻转不触发,均值恒等于初始振幅1/sqrt(N),均值反转对每个元素都退化为恒等操作(k − 2·(k − avg) = k)。此时所有元素振幅保持一致,柱状图为等高平顶——这一特性可作为实现正确性的自检信号。


五、复杂度分析与规模扩展

Grover 算法的价值在于将无序搜索从 O(N) 降至 O(sqrt(N))。下表按源码中的轮数公式int((π/4)·√N)给出不同规模下的理论迭代轮数与(当前步长为 2 的)实际循环次数:

集合规模 Nrounds = int((π/4)·√N)实际执行放大轮数(步长 2)
721
1632
6463
10074
10,0007839

可以看到,迭代轮数随 N 的增长远慢于线性——这正是 O(sqrt(N)) 复杂度在实践中的直观体现。


六、局限与延伸学习

经典模拟与真实量子电路的差异:本实现是在经典 CPU 上对振幅向量做数值模拟,并未使用真实的量子比特与量子门。在真实量子实现中,均匀叠加由 Hadamard 门构造,Oracle 与扩散算子由酉矩阵门组成,最终通过测量将叠加态坍缩为目标值。尽管如此,1/sqrt(N)初始化、相位翻转、均值反转、π/4·√N次迭代这四个数学内核在模拟与真实实现中完全一致,因此本文件作为原理学习与教学演示极具价值。

仓库内的姊妹实现:cosmos 的量子算法专题还包含 Shor 算法问题文档 code/quantum_algorithms/shors_algorithm/README.md 及其实现 P1_shor_primefactorization.py。Grover(无序搜索)与 Shor(质因数分解)并列为量子计算的两大标志性算法,前者展示搜索类问题的量子加速,后者展示计算复杂度类别的根本性改变。原 Grover 文档中还列出了面向初学者的量子计算入门资料、Grover 算法专题教程、Wikipedia 词条以及 Topcoder 量子计算挑战赛等外部学习资源,并注明“More To Be Added”——表示该问题集仍在持续扩充中。


七、小结

围绕仓库问题文档 README.md 提出的 P-1,本文完成了从理论到实现的完整闭环:

  1. 理论层:Grover 算法以 O(sqrt(N)) 实现无序搜索的量子加速,最优迭代约π/4·√N次;
  2. 实现层:P1_grover_plot.py 用 SHA-256 模拟 Oracle、用均值反转模拟扩散算子,在 Python 3.5+ 环境下复现振幅放大全过程;
  3. 验证层:目标值'8'在 7 元素集合中经 1 轮放大后振幅升至约 0.918,柱状图中以最高柱呈现;目标缺失时则退化为等高平顶,语义自洽。

对于希望继续深入量子算法的读者,可沿仓库code/quantum_algorithms/目录继续研读 Shor 算法实现,并参考原文档收集的权威学习资料完成从模拟到真实量子编程的进阶。

  • 教程
  • 示例工程

【免费下载链接】cosmos

World's largest Contributor driven code dataset | Used in Quark Search Engine, @OpenGenus IQ, OpenGenus Visual Project

项目地址:https://gitcode.com/gh_mirrors/co/cosmos
点击查看免费下载

相关推荐

上一篇:【亲测免费】 Ark-Pets 开源项目使用手册
下一篇:Go-Ansible 开源项目教程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询