量子计算(七)——振幅放大与振幅估计

零、声明
这篇文章基于Brassard的论文Quantum amplitude amplification and estimation [1] 写成,大致概括了其中的算法思路,并具体计算了其中一些内容。因此这篇文章的主题就是数学计算,难度相比之前会有较大的跃升。但之后会回到原先基础算法的简单讲解。
事实上,如果读完了这篇文章,基本就相当于理解了 Grover 算法的原理。笔者原准备讲述完 Grover 算法之后再发出这篇文章,但现在笔者正在思考是否应该在下一篇文章中更细致地讲 Grover 算法。
另外,请读者务必注意:
一、振幅放大的问题背景
1.问题引入
这个算法要解决的问题就是在解空间中寻找符合标准的解。设每个解都可以表示为二进制字符串,并且已知某种能够确定解空间中各个解的好坏的标准。
也就是给出布尔函数 ,它将解空间中的解 映射到 :
这个目标基本和 Grover 算法要解决的问题是一致的。事实上, Grover 算法中的核心算法就是振幅放大,这篇论文就是对 Grover 算法的总结推广,使得任意无测量量子算法也可以使用。
2.量子化
显然,由于解空间被表示为二进制串,因而解空间可以作为一个希尔伯特空间,从而允许量子算法的运行。而解的好坏,则将其划分为两个子空间——称为好空间与坏空间。于是解空间的任意纯态 都可以被分解表示为:
其中 表示落入坏空间的部分,相应地 表示落入好空间的部分。于是 表示了对这个纯态测量后得到坏结果的概率, 则是得到好结果的概率,以后简记为 。显然 。
到这一步,我们的目标就已经清晰明朗了:只要让好空间部分的 振幅变大,就提高了测到好结果的概率。之后只需要代入 判定其是否确实是好结果即可。
二、振幅放大的构建
1.振幅放大算符
假定 是解空间的二进制串的长度。假设无测量量子算法 是作用到解空间上的酉矩阵,并假设纯态 是由其作用到初始零态的结果即 。那么如下构建的算符 即可实现振幅放大:
其中, 代表这个矩阵算符会改变振幅的符号,而下标表示改变的条件:
显然可以将 写为 ,于是:
现在我们来研究算符 作用到任意态上会发生什么。由于在这个问题中纯态被分解为好纯态和坏纯态,因此研究此算符分别作用到好坏纯态上的结果。首先是坏纯态 :
同理对于好纯态 :
2.振幅如何被放大
计算可得 被施加 次 算符后得到:
即测得好纯态的概率是 。得到的结果中出现了角度参数,这意味着算法在几何上一定有直观的表现。
证明. 假设对 施加 次 算符后:
也就是好纯态的振幅变为 ,显然可以得到下列递推式:
为了解出上式,首先计算 与 的线性组合:
上式能成为等比递推式的条件是:
显然可取 从而 。记 ,则 ,则 。于是:
代入递推方程组之第二式得:
记 ,, 。已知递推形式 在 时具有通项:
代入可得:
或者说,对于 ,若记 且不等于 或 且限定 ,那么其好纯态的振幅是:
3.算符 的几何意义
首先显然易见的是 与 是正交的,因此完全可以将这两个态作为平面坐标系的两个轴,并将 标注其中(而 中的 ,就是 与 的张角):

现在我们将算符 拆开为两部分: 与 。不妨首先观察 ,对于任意能够被拆分为好纯态与坏纯态的态 :
这意味着将 以 为轴做了一次对称,即:

而在此基础上再作用一次 :
不妨计算 与 的中点坐标:
此时我们发现,此坐标正好在 的射线上!这意味着再作用一次 是将 以 为轴再做一次对称,也就是:

因此,作用一次算符 就相当于将原来的态向 靠近 。加上原先就存在的一个 ,就形成了 。这也是好纯态振幅中 的来历。
4.算符 作用的次数
显然我们希望测得好纯态的概率越大越好,这就要求 ,即 ,即 。以后记 。
此时重新计算测得好纯态的概率:
11 虽然 这一结论是正确的,但上式的证明是稍有问题的,即 这一步。但至少在 范围内是正确的。错误的根本原因在于向下取整符号内的分母不能与外部直接约分。要想完美证明,接下来只需证 内成立即可,这里不再证明。论文中的证明是引用另一篇文章[2] ,请自行观阅。 也就是说测量到好纯态的概率是大于 的;同时由于本就是对好纯态振幅的放大,因此这个概率也大于 。因此最后测到好纯态的概率至少是 。
然而这引申出一个问题:之所以能要求让 作用 次,是因为我们已知了 值,即已知了 值,即已知在最初的时候能够测得好纯态的概率,例如 Grover 算法中就是如此。但在实际问题中,很多时候这个值具有置信度,甚至完全未知,此时则不能确定 作用的次数。因此,我们有必要从 Grover 搜索算法进一步推广。
5.算符 的特征值与特征向量
除了数列递推外,我们也可以通过将 对角化后,简便地得到 。为此假设:
显然有方程:
这与之前数列递推所得方程很像,但并没有必然联系。相似的步骤可得特征值与特征向量为:
22 在论文[1] 中,导出 这个结论正是通过求 的特征值与特征向量得出的。读者可以自行尝试。
三、量子算法的去随机化
由上节我们已经知道,在已知 的情况下,使用 即可使我们得到好纯态的概率为 。然而我们依然有可能使这个概率为 ,这就是量子算法的去随机化。论文中给出两种方法:
1. 微调
当 时,也就是 恰是整数,那么 就自然完全得到好纯态。另一方面,若记 ,那么 次迭代又稍微多了点,因此不妨使角度 更小点,取 。因此,只要调整算法的初始准确率至 ,那么 次迭代就恰恰好了。
于是问题转化为如何使算法 的初始准确率从 变为 。这很简单:只要构建另一个算法 使得其作用在单个量子位上时:
然后同时应用算法 ,那么当 输出为好结果且 的输出为 时,那么我们获得的结果就必定是好结果。
2. 算符的改进(相位附加)
现在我们改进算符 ,使其在符合条件的情况下不是改变符号,而是附加相位:
其中相位 ,并且:
显然:
于是:
于是:
于是在作用 次 后,系统处于叠加态:
之后再作用一次 ,但要求相位 符合下式:
也就是在这次作用之后, 的振幅为 ,那么 的振幅自然就为 了。于是问题转换为最后一次作用时应当如何选取 。如何选取并不是论文中的重要内容,但其存在性是可以保证的。
四、 QSearch 算法
在 未知的情况下, Grover 算法不能发挥太大的作用,因为不知道算符 应当作用的次数,使得测得好纯态的概率偏离最优值。为此,我们推广其至 QSearch 算法。
1.算法流程
int l = 1;
float c = random(start=1, end=2); // c 不等于 1 或 2。
l++;
int M = (int)pow(c, l) + 1;
// 将 A 作用于初始零态 ket(0^n),并测量得到 ket(x)。
if (X(x) == 1) return x; // 如果是好结果,即 X(x)=1 ,那么return x;
else ket(Psi) = A ket(0^n); // 否则,记录 ket(Psi)= A ket(0^n)$ 。
int j = (int)random(1, M);
// 将算符 Q 作用到 ket(Psi) 上 j 次,即 Q^j ket(Psi)。测量结果得到 ket(x)。
if (X(x) == 1) return x; // 如果是好结果,即 X(x)=1 ,那么return x;
else goto step3; // 否则,goto step3。尽管这个算法看起来比已知 的搜索算法的时间规模更大,但可以证明其依然是 的。
2.启发式经典算法的植入
然而很多启发式经典算法也可以做到 ,这导致我们之前讨论的量子算法看起来没多少优势。但是如果考虑将这些启发式算法改造为量子算法,那不就可以在 的基础上再取一次根号么!可以证明,如果经典算法解决问题的期望时间是 ,那么将其改造为量子算法后再使用 QSearch 算法,规模是 的。
五、振幅估计
1.振幅估计的问题引入
振幅放大是为了寻找解,但这却不能告诉我们解空间中有多少解是好的。振幅估计就是为了解决这个问题。记 ,由于 是首次运行 后测量得到好纯态的概率,因此 。因此,只要我们能估计振幅 ,就能估计好解的数量。
另一方面,振幅放大算法的有效运行本就要求 是已知的(除非使用 Qsearch 算法)。那么既然能够通过振幅估计得到 的估计值,我们当然也就可以利用上振幅放大算法了。
注意到 ,现在问题转化为估计 。注意到算符 及其作用次数使得好纯态与坏纯态的振幅形成了三角函数,因此估计这些三角函数的最大周期 亦可。另一方面,注意到算符 的特征根是 ,利用量子计算(六)——量子傅里叶变换与相位估计中的相位估计来获得 的特征根也是一种可行的方法。
2.利用相位估计的振幅估计
将相位估计中的 矩阵替换为 即可,如下图所示:

于是 就代表了 特征值中的相位,对比 的特征值可得 即 ,从而可以得到 的一个估计值:
于是得到好解的数量的估计值为 。
我们记振幅估计的算法为 ,其所需参数显然为 。而得到好解的数量的估计算法为 ,显然这个算法只需计算 。此时 所使用的参数则是 ,因此 的参数列表是 。
3.误差分析
首先做点数学上的准备工作。假如已知相位误差 ,那么 的上界应是什么?只需要利用和差化积,一方面:
另一方面:
因此 。如果我们希望误差最小,即取 (因为 是离散的整数值),那么显然此时 的误差上限是:
的误差上限是:
并且由相位估计中的结论,正确的概率至少是 。如果允许更大的误差,例如取 ,那么正确的概率会更大,即 。
在最小误差下,应取 (至于为什么,论文中尚未说明)。此时进一步得到 的误差上限是:
4.给定误差时的好解数量估计算法
假定要求 ,那么我们使用算法 ,其步骤是:
int l = 0;
l++;
int tilde_t = Count(X, 2^l);
if ( (tilde_t == 0) && (2^l < 2 * sqrt(N)) )
goto step2;
n = ceil(frac(20 pi^2, epsilon)2^l);
tilde_t = Count(X, n);
return t; // 要求 abs(t- tilde(t)) <= frac(2, 3)根据这个思想,当我们对 没有任何先验估计时,我们可以使用另一算法 :
int tilde_t_1 = Count(X, ceil(14 pi sqrt(N)));
int M_i = ceil(30 * sqrt((tilde_t_i + 1) * (N - tilde_t_i + 1)));
int M = min(M_1, M_2);
int t_apostrophe = Count(cal(X),M);
return t; // 要求 abs(t-t') <= frac(2, 3)- [1] G. Brassard, P. Høyer, M. Mosca, and A. Tapp, “Quantum amplitude amplification and estimation.” [Online]. Available: http://dx.doi.org/10.1090/conm/305/05215
- [2] M. Boyer, G. Brassard, P. Høyer, and A. Tapp, “Tight Bounds on Quantum Searching,” Fortschritte der Physik, vol. 46, no. 4–5, pp. 493–505, Jun. 1998, doi: 10.1002/(sici)1521-3978(199806)46:4/5<493::aid-prop493>3.0.co;2-p.