建议大家去看大佬的原文:量子搜索算法
量子搜索算法是什么?
假设我们现在有这样一个问题:寻找一个N位的二进制解串:\(X=(x_1x_2...x_n)\),使其满足条件:\(F(X)\leq C\)。其中\(F(X)\)可以是任一函数,\(C\)可以是一个足够小的常数,但保证至少存在一个解满足条件。
对于一般情况而言,只能遍历解集中所有的可行解,逐一判断是否满足条件,如果是,则输出,反之继续遍历。这样做的话,算法的时间复杂度显然是\(O(2^n)\),或者用\(N\)来表示解集大小,则时间复杂度为\(O(N)\)。
显然当一个问题的解集极大时,以现有的计算机的算力无法遍历所有的解来选择人们想要的。
有没有办法改善这一状况呢?当然有,但在某些方面也一定会有补偿。比如,若已经将解集根据对应函数值的大小进行排序,那么要找到一个特定的解只需要二分搜索\(O(log_2 N)\)即可。或者使用进化优化算法,给出一个让人满意的解,但不保证解是最优的。或者选择力大砖飞,使用更多的CPU核心并行计算。
并行,并行?诶,等等。在我们的物理世界中,有一种现象似乎是天然地自带并行属性,那就是量子叠加态。以氢原子核外电子举例,一个电子并不固定在一个轨道(或者能级)状态上,而是同时处在多个轨道状态的叠加状态上,你去测量时,便以一定的概率从叠加态坍塌到一个基态上,并且不再自发回到叠加态了。
我们在电子计算机中,用电路中的高低电平来表示不同的状态,我们把它抽象为二进制的数学表达,然而电子计算机没用量子特性,那么对于同一个1比特的电路,在一个时刻,就只能处于一种状态(高电平或低电平),也就只能表示为1或者0. 但对于量子电路,一个比特一个时刻,可以同时处在0和1的状态。
如果有n个比特呢?那么量子电路可以同时处于\(2^n\)个状态。那么我们想要的解,不过是叠加态中的一个状态,只要我们能够在测量的时候让量子电路从叠加态坍塌到这个基态,就找出了这个解。
量子搜索算法,就是最大化从叠加态坍塌到对应特定解的那个基态的概率的算法。
量子搜索算法的细节
我们首先要得到一个包含所有解的叠加态。
如何得到?
可以让所有的状态0通过哈达玛门:
这样得到的,是一个包含所有解状态,且每个状态的幅值都相同的叠加态:
我们将其写为:\(|E\rangle\),并令\(N=\sqrt{2}^n\)
另外,想要的解的状态,我们写为:\(|S\rangle\)
我们从\(|E\rangle\)开始,试图通过一些方式使其转变为\(|S\rangle\),中间状态写为\(|\psi\rangle\),如下图:
别忘了,\(|S\rangle\)是我们未知的,也就是说我们要通过一些手段,在不知道\(|S\rangle\)的情况下,依然使\(|\psi\rangle\)向\(|S\rangle\)靠近。
这个手段之一就是对称(反射)。
如下图:
直接说结论,\(|\psi\rangle\)以\(|S\rangle\)为轴反射,再以\(|E\rangle\)为轴反射,再反转,得到\(|\psi^{'}\rangle\),此时向\(|S\rangle\)靠近了\(2\Delta\)的角度
那么\(\Delta\)是多少呢?请看下图:
作虚线垂直于\(|S\rangle\),那么虚线和\(|E\rangle\)的夹角即为\(\Delta\)
当N较大时:
\(\Delta=arcsin(\frac{1}{\sqrt(N)})\approx\frac{1}{\sqrt(N)}\)
可能你会问\(\frac{1}{\sqrt(N)}\)哪里来的,那是因为\(|S\rangle\)在\(|E\rangle\)上的投影长度就是\(\frac{1}{\sqrt(N)}\)。
当我们把\(|\psi^{'}\rangle\)当作新的\(|\psi\rangle\),并继续这样的操作足够多次,便能够到达\(|S\rangle\)附近,而且相距角度小于等于\(\Delta\)。
重复的次数应该为:\(round(\frac{\pi}{4\Delta}-\frac{1}{2})\)
这个重复被称为Grover迭代
如何以\(|S\rangle\)或\(|E\rangle\)为轴反射
可以按照下面的量子电路完成以\(|S\rangle\)为轴的反射
ancilla是用来储存控制状态的量子位。
\(C_s\)用来判断\(|x\rangle\)中的\(|S\rangle\)分量,如果存在\(|S\rangle\),则不对其做任何操作,反之,对其取反。如此,相当于\(|x\rangle\)对\(|S\rangle\)做了一次对称。
下图的量子电路是一个\(|S\rangle=|0\rangle\)特例
那如何以\(|E\rangle\)为轴反射呢?
实际上也简单,\(|x\rangle\)可以分解为平行\(|E\rangle\)和垂直\(|E\rangle\)的两部分,将垂直\(|E\rangle\)的那部分取反即可。
如上图,由于哈达玛门的逆还是自己,所以\(|x\rangle\)的\(|E\rangle\)分量通过哈达玛门转换为全0,此时再以0为轴进行反射,相当于对垂直\(|E\rangle\)的分量取反,最后再经过哈达玛门,将\(|E\rangle\)分量从0恢复回来。
总体来看,就是以\(|E\rangle\)为轴反射了。
总结
量子搜索算法的时间复杂度仅为\(O(\sqrt{N})\)
正确率却高达\(1-\frac{1}{N}\)
当搜索空间较大时,具有很好的效果。