Grover Algorithm
- 一 . 背景介绍
- 二 . 算法推导与实现
-
- 1. 构造叠加态
- 2. 构造 OracleOracleOracle
- 3. 构造 GGG 算子
- 4. GGG 的应用
- 5. 临界条件
一 . 背景介绍
遍历搜寻问题的任务是从一个海量元素的无序集合中,找到满足某种要求的元素。要验证给定元素是否满足要求很容易,但反过来查找这些合乎要求的元素则很费事,因为这些元素并没有按要求进行有序的排列,并且数量又很大。在经典算法中,只能按逐个元素试下去,这也正是“遍历搜寻”这一名称的由来!
量子计算机比传统计算机具有的众多优势之一是其优越的速度搜索数据库。Grover的算法证明了这种能力。该算法可以二次加速非结构化搜索问题,但其用途远不止于此。它可以用作一般技巧或子例程,以获得各种其他算法的二次运行时间改进。这称为幅度放大技巧!
什么是非结构化搜索?
在上述大量排成一行的数据中,我们希望找到类似于图中紫色框代表的数据,当然,也有可能不止一个,要使用经典计算找到紫色框(标记项),则平均要检查N2frac{N}{2}2N这些框,最坏的情况是检查所有 N−1N-1N−1 个元素。 但是,在量子计算机上,我们可以使用Grover的幅度放大技巧以大约Nsqrt{N}N的步长找到标记的项目。 二次加速确实是节省长列表中标记项目的大量时间。 另外,该算法不使用列表的内部结构,这使其具有通用性。 这就是为什么它立即为许多经典问题提供了二次量子加速的原因!
二 . 算法推导与实现
1. 构造叠加态
假设被查找的集合为:{∣i⟩}={∣0⟩,∣1⟩,⋯∣N−1⟩}{|irangle}={|boldsymbol{0}rangle,|mathbf{1}rangle, cdots|N-mathbf{1}rangle}{∣i⟩}={∣0⟩,∣1⟩,⋯∣N−1⟩},在开始查找之前,要对系统进行初始化,即对每一个qubitqubitqubit 初态进行HadamardHadamardHadamard 变换,使之处于∣φ0⟩=1N∑i=0N−1∣i⟩left|varphi_{0}rightrangle=frac{1}{sqrt{N}} sum_{i=0}^{N-1}|irangle∣φ0⟩=N1i=0∑N−1∣i⟩
牢记这个式子,后面都需要用上它!
这里我们可以通过一个小例子来理解:假设有一个映射0,1,2,…,N↦{0,1}0,1,2, ldots, N mapsto{0,1}0,1,2,…,N↦{0,1},意思就是该映射函数为:f(x)↦{0,1}f(x) mapsto{0,1}f(x)↦{0,1}:
f(1)=0f(2)=1f(3)=0f(4)=1begin{array}{l} f(1)=0 \ f(2)=1 \ f(3)=0 \ f(4)=1 end{array} f(1)=0f(2)=1f(3)=0f(4)=1现在我们需要做的就是找到f(x)=1f(x)=1f(x)=1 的解,当然,我们这里是理想化模型,数据搞得少一点也是为了通俗易懂,那么显然,当x=2,4x=2,4x=2,4的时候,是我们需要的解,回过头来,第一步就是创建叠加态,根据这个例子,创建好的叠加态如下:
∣ψ⟩=12(∣00⟩+∣01⟩+∣10⟩+∣11⟩)|psirangle=frac{1}{2}(|00rangle+|01rangle+|10rangle+|11rangle) ∣ψ⟩=21(∣00⟩+∣01⟩+∣10⟩+∣11⟩)
这里因为输入的数据数量相对来说是比较多的,我们用多体量子态来表示,位数也自然和我们整个输入的数据多少直接相关了!
接下来的一步非常重要,是该算法的第一个关键点所在!
2. 构造 OracleOracleOracle
为了将我们需要寻找的数据和其他的数据分开,此时需要一个OracleOracleOracle,,那么分开的标识是什么呢?其实最简单的方法就是将目标值变换相位,也就是增加一个负号,即:
Oω∣x⟩={∣x⟩if x≠ω−∣x⟩if x=ωO_{omega}|xrangle=left{begin{aligned} |xrangle & text { if } x neq omega \ -|xrangle & text { if } x=omega end{aligned}right. Oω∣x⟩={∣x⟩−∣x⟩ if x=ω if x=ω
非常的简单,当遍历不是我们需要的值就不动,反之当找到x=ωx=omegax=ω时变号,这个就有点难,因为不仅需要我们构造类似于一个单位阵一样的算符,且能在指定位置变号!InInIn factfactfact,it′sit'sit′s veryveryvery simplesimplesimple:
O^=1−2∣x⟩⟨x∣hat{O}=1-2|xranglelangle x| O^=1−2∣x⟩⟨x∣
也阔以写成矩阵的形式,如果是双量子比特的话,LikeLikeLike this:this:this:
显然,这里我们需要找的是 ∣10⟩|10rangle∣10⟩,我们发现构成该矩阵的行和列都是对应的向量,那么,如果是三量子比特的话,OOO算符又是啥样的呢?
到这一步,我们似乎能简单的理解了 GroverGroverGrover 搜索算法的强大之处在于它将问题简单化了,也就是根据量子固有的特性将我们需要查找的值与其余值分开了,从另一个角度来说,我们都知道往往去寻找解决问题的答案是非常困难的,而验证解决方案的正确与否相对来说会简单很多,这便是GroverGroverGrover算法的思想精髓!
好,上述我们已经成功的得到了置关重要的OracleOracleOracle,进一步,可以得到:
Oω∣x⟩=(−1)f(x)∣x⟩O_{omega}|xrangle=(-1)^{f(x)}|xrangle Oω∣x⟩=(−1)f(x)∣x⟩
道理是一样的,即f(x)=1f(x)=1f(x)=1时变号,等于0时不变,同样的矩阵表示为:
Oω=[(−1)f(0)0⋯00(−1)f(1)⋯0⋮0⋱⋮00⋯(−1)f(2n)]O_{omega}=left[begin{array}{cccc} (-1)^{f(0)} & 0 & cdots & 0 \ 0 & (-1)^{f(1)} & cdots & 0 \ vdots & 0 & ddots & vdots \ 0 & 0 & cdots & (-1)^{fleft(2^{n}right)} end{array}right] Oω=⎣⎢⎢⎢⎡(−1)f(0)0⋮00(−1)f(1)00⋯⋯⋱⋯00⋮(−1)f(2n)⎦⎥⎥⎥⎤
3. 构造 GGG 算子
其实算法的主要过程只有两个步骤,第一步刚刚已经顺利实现,而接下来的第二步才是灵魂!
我们接下里需要构建GGG算子:
G=(2∣ψ⟩⟨ψ∣−I)OG=(2|psiranglelanglepsi|-I) O G=(2∣ψ⟩⟨ψ∣−I)O
其中,OOO就是上面说的OracleOracleOracle算符,III为单位算符,现把算符GGG反复作用在 ∣φ0⟩|varphi_{0}rangle∣φ0⟩上,并称一次作用为一次“迭代”,根据情况的不同,通过多次次数不同的“迭代”,最终就能找到我们需要的 ωomegaω了,具体的操作又是怎样的呢?
在前面的学习和操作中,相信大家都明白了我们主要目的之一就是 根据我们寻找的目标,将整个量子态代表的数据中 需要的 和不需要的分开,所以可以将原来的叠加态写成这样:
∣φ0⟩=1N∣x⟩+1N∑i=0(i≠x)N−1∣i⟩≡∣β⟩+∣α⟩|left.varphi_{0}rightrangle=frac{1}{sqrt{N}}|xrangle+frac{1}{sqrt{N}} sum_{i=0 atop(i neq x)}^{N-1}|irangle equiv|betarangle+|alpharangle ∣φ0⟩=N1∣x⟩+N1(i=x)i=0∑N−1∣i⟩≡∣β⟩+∣α⟩
稍微变形一下可以得到:∣β⟩=1M∑x∣x⟩∣α⟩=1N−M∑x∣x⟩begin{array}{c} |betarangle=frac{1}{sqrt{M}} sum_{x}|xrangle \ |alpharangle=frac{1}{sqrt{N-M}} sum_{x}|xrangle end{array} ∣β⟩=M1∑x∣x⟩∣α⟩=N−M1∑x∣x⟩
其中,我们应当知道N=2nN = 2^{n}N=2n,最终的得到:∣ψ⟩=N−MN∣α⟩+MN∣β⟩|psirangle=sqrt{frac{N-M}{N}}|alpharangle+sqrt{frac{M}{N}}|betarangle∣ψ⟩=NN−M∣α⟩+NM∣β⟩
可以结合我们博客开头举得小例子强化理解:
∣00⟩→0∣01⟩→1∣10⟩→0∣11⟩→1∣α⟩=12(∣00⟩+∣10⟩)∣β⟩=12(∣01⟩+∣11⟩)begin{array}{l} |00rangle rightarrow 0 \ |01rangle rightarrow 1 \ |10rangle rightarrow 0 \ |11rangle rightarrow 1 \ |alpharangle=frac{1}{sqrt{2}}(|00rangle+|10rangle) \ |betarangle=frac{1}{sqrt{2}}(|01rangle+|11rangle) end{array} ∣00⟩→0∣01⟩→1∣10⟩→0∣11⟩→1∣α⟩=21(∣00⟩+∣10⟩)∣β⟩=21(∣01⟩+∣11⟩)
4. GGG 的应用
先将OOO算符作用在初始量子叠加态上以实现我们分开的目的,系数分别用a,ba,ba,b来表示:
O(a∣α⟩+b∣β⟩)=a∣α⟩−b∣β⟩O(a|alpharangle+b|betarangle)=a|alpharangle-b|betarangle O(a∣α⟩+b∣β⟩)=a∣α⟩−b∣β⟩
我们通常状况下可以假设:a=cos(θ/2)=(N−M)/N,b=sin(θ/2)=M/Na=cos (theta / 2)=sqrt{(N-M) / N}, b=sin (theta / 2)=sqrt{M / N}a=cos(θ/2)=(N−M)/N,b=sin(θ/2)=M/N
问题来了,我们这要做的目的到底是什么?为啥要单独将原始叠加态分开呢,仔细观察不难发现,在未使用 OOO 算符之前,我们可以将∣ψ⟩|psirangle∣ψ⟩ 看成一个二维矢量,而分开得到的∣α⟩,∣β⟩|alpharangle ,|betarangle∣α⟩,∣β⟩是组成它的二个基矢!看图说话:
我们从图中可以非常清晰的看到,OOO 算子作用到∣ψ⟩|psirangle∣ψ⟩ 上变相之后关于∣α⟩|alpharangle∣α⟩ 对称之后得到O∣ψ⟩O|psirangleO∣ψ⟩,再关于原来的∣ψ⟩|psirangle∣ψ⟩对称得到G∣ψ⟩G|psirangleG∣ψ⟩,这两步相当于我们用准备好的GGG算子进行一次迭代作用,得到的新矢量为:
G∣ψ⟩=cos(3θ2)∣α⟩+sin(3θ2)∣β⟩G|psirangle=cos left(frac{3 theta}{2}right)|alpharangle+sin left(frac{3 theta}{2}right)|betarangle G∣ψ⟩=cos(23θ)∣α⟩+sin(23θ)∣β⟩
这是第一次的迭代结果,当次数增多时,数学表达为:
Gk∣ψ⟩=cos(2k+12θ)∣α⟩+sin(2k+12θ)∣β⟩G^{k}|psirangle=cos left(frac{2 k+1}{2} thetaright)|alpharangle+sin left(frac{2 k+1}{2} thetaright)|betarangle Gk∣ψ⟩=cos(22k+1θ)∣α⟩+sin(22k+1θ)∣β⟩
这样多次迭代的目的也是显而易见的,就是让我们的 ∣ψ⟩|psirangle∣ψ⟩ 能够不断的向 ∣β⟩|betarangle∣β⟩ 靠近,最终就能得到我们想要的∣β⟩|betarangle∣β⟩ 了。
我们还可以从振幅的角度来理解这个算法的核心,并且搭配二维坐标系的翻转过程,配合食用,效果更佳哦(这里的UUU就是OOO算符):
其中虚线代表振幅的平均值,使用OOO 算符作用之后,我们得到的结果为:
相位变换以后,显然,振幅的平均值下降了一些,接下来:
上一步我们根据各个基态的振幅值计算出平均值之后,根据均值的镜像翻转各个基态的振幅值就会得到上面的图片!
5. 临界条件
我们完全有理由认为如果迭代次数过多,会导致 ∣ψ⟩|psirangle∣ψ⟩ 翻转到 ∣β⟩|betarangle∣β⟩ 的右边,增加误差,除此之外,我们还应当想到的就是这个翻转角度 θthetaθ ,过大的话也会导致误差过大。
现在回过头来看这个式子:∣ψ⟩=N−MN∣α⟩+MN∣β⟩|psirangle=sqrt{frac{N-M}{N}}|alpharangle+sqrt{frac{M}{N}}|betarangle∣ψ⟩=NN−M∣α⟩+NM∣β⟩,其中 NNN 是我们早已确定的,不能更改, 关键就在于这个 MMM,先假设我们已经知道有 MMM 个 iii 使得 f(i)=1f(i) = 1f(i)=1,根据a=cos(θ/2)=(N−M)/N,b=sin(θ/2)=M/Na=cos (theta / 2)=sqrt{(N-M) / N}, b=sin (theta / 2)=sqrt{M / N}a=cos(θ/2)=(N−M)/N,b=sin(θ/2)=M/N,就能直接得到θthetaθ 的大小!
我们可以根据,M,N,θM,N,thetaM,N,θ 的值算出需要迭代的次数:
sin(θ)=2M(N−M)N→R=CI(arccos(M/N)θ)sin (theta)=frac{2 sqrt{M(N-M)}}{N} rightarrow R=C Ileft(frac{arccos (sqrt{M / N})}{theta}right) sin(θ)=N2M(N−M)→R=CI(θarccos(M/N))
其中 RRR 就是我们需要迭代的次数,例如:CI(4.5)=4C I(4.5)=4CI(4.5)=4。
除此之外,隐藏条件θ<π2theta<frac{pi}{2}θ<2π 也是需要知道的,而且当 θthetaθ 越小时,我们得到的搜索结果越准确!
如果当我们需要搜所的值个数MMM 非常少的话,即M≪N→θ≈sin(θ)≈2M/NM ll N rightarrow theta approx sin (theta) approx 2 sqrt{M / N}M≪N→θ≈sin(θ)≈2M/N ,那么测量的误差角度最大为 θ/2≈M/Ntheta / 2 approx sqrt{M / N}θ/2≈M/N !
再结合θ<π2theta<frac{pi}{2}θ<2π 可得:
R⩽⌈π4NM⌉R leqslantleftlceilfrac{pi}{4} sqrt{frac{N}{M}}rightrceil R⩽⌈4πMN⌉
注意,这里是上天花板函数符号,舍弃小数点后的数字!
最后我们用一张图简单的总结一下量子 GroverGroverGrover 算法的整个流程: