因为生着脚,所以要走
# 量子搜索算法
# 黑箱(Oracle)
假设在 N 个元素的搜索空间中进行搜索。我们不关心元素是什么,只关心元素的编号 0~N-1。方便起见,规定。假设搜索共有 M 个解,。
-
该搜索问题的一个特例可以方便地表示为一个输入 x 的函数 f,x 是从 0 到 N-1 的整数,f 的定义是,若 x 是搜索问题的一个解,而如果 x 不是搜索问题的解,则。
-
设有一个量子 oracle 可以识别搜索问题的解,Oracle 的内部工作方式将在后面讨论,识别的结果通过 oracle 的一个量子比特给出。更确切低,这个 oracle 是一个酉算子 O,满足:
其中 是模二加。因此我们可以通过制备 再应用 O 和测量第二寄存器来判断 x 是否是搜索问题的一个解。
-
特别地,在状态 上 oracle 的作用为
可以看作第二寄存器状态未发生改变,而第一寄存器状态乘了个。由于第二寄存器状态在量子搜索算法过程中保持为,因此我们可以简写 O 的作用为
-
我们说 oracle 通过改变解的相位标记了搜索问题的解。对有 M 个解的 N 元搜索问题,实际上只需要在量子计算机上应用搜索 oracle 次。
- 以上讨论是基于我们知道 oracle 是怎样工作的。那这些讨论有什么意义呢?事实上,有时候不需要解是哪些,我们就可以识别和判断解。
# 过程
- 搜索算法运行的框架如下图所示。
oracle 的工作可能需要附加的工作量子比特,但是算法的目的是用最少的 oracle 应用次数求出搜索问题的一个解。
-
其中,量子搜索算法由反复应用记作 的被称为 Grover 迭代或 Grover 算子的量子子程序组成。Grover 迭代的量子线路如下图:
可分为四步:
- 应用 oracle O;
- 应用 Hadamard 变换;
- 在计算机上执行条件相移,使 以外每个计算基态获得 - 1 的相位:;
- 应用 Hadamard 变换。
-
Grover 迭代中的每个运算都可在量子计算机上有效实现。第 2,4 步的应用 Hadamard 变换各需要 个门,第三步的条件相移利用之后介绍的技术也可以只用 个门。第一步 oracle 的调用消耗需要依赖特定的应用,这个例子中只需要一个单 oracle 调用。
-
把 2,3,4 步的算子结合起来:
记,则 Grover 迭代 G 可写作
应用运算 到一般状态 会得到状态
其中 是均值,因此 有时称为关于均值的反演运算。
# 几何可视化
-
事实上,Grover 迭代可视为在由开始向量 和搜索问题解组成的均匀叠加态张成的二维空间中的一个旋转。
首先,我们定义 求和符号中的 x 枚举的是搜索问题所有的解, 枚举的是非搜索问题的解。定义归一化状态:
则有,因此均匀叠加态:
故量子计算机初态属于 和 张成的向量空间。
-
可以认识到 和 是正交的,对于任何一个在 所在平面上的向量,O 作用在上面就是:
几何上上就是把 关于 对称一下。不妨令,则,。
就是一个三倍角。画到图上如下:
不难发现每次迭代就是把状态向量逆时针转 角,而 是二倍的 与 的夹角。经过 次后,状态向量将接近(至多偏离 角)。然后其实对 做计算基下的测量得出的就是搜索问题的解,而状态向量离 越近,对其测量越大概率得到与 重合的解,即搜索问题的解。
例子:下面是在 N=4 的搜索空间上的量子搜索算法中的 Grover 迭代一次对应的线路。oracle 对除 外所有的 x 有,而。通过不同的oracle 线路也不同。下图是从左到右对应 的 oracle:
起初,上面两个量子比特处于状态,下面的量子比特为。中间的用点框起来的部分实现的是条件相移。
为得到,我们需要应用上图线路多少次?
其实可以看出,所以迭代一次就可以获得。迭代一次后对上面两个量子比特进行测量就可以得出。与之对照,经典计算机四选一的 oracle 平均需要 2.25 次调用。
注:其实这里可能产生疑问,最后一个量子比特全程没有参与感,为啥要用它?实际上,它参与了最后的测量。最后对整个系统测量算子为,即我们需要保证下面一个量子比特状态为(和输入值一样)的情况下去测量前两个量子比特。
# 性能
-
系统初态为,与 夹角成,所以实际上需要迭代 次,把 转到离 的 范围内。于是对状态在计算基中的观测,将至少以 的概率是在 部分,即得到搜索的一个解。
-
特别地,当 时,我们有,故最终误差至多是。事实上,需要迭代的次数和精度分析并不取决于解具体是什么只取决于解的个数,因此知道 M 就可以搜索算法分析误差。
-
给出了需要迭代次数一个非常漂亮的上界,即 次 Grover 迭代,oracle 调用,才能以最高的概率得到搜索问题的一个解。
-
特别地,当 时,即 时,我们可以一开始就随机从搜索空间中选择一个元检测它是否为一个解。此时成功概率已经至少为。同样,我们也可以增加 N 个均不为解的元到搜索空间,使得解的个数一定不到新搜索空间大小的一半。这可以通过增加一个单量子比特 都搜索指标,把要搜索的元数目加倍到 实现。构造一个增广 oracle ,因为引进 而使得 增加的元素全部置为 0 即可。
-
然而在实际问题中,我们必须懂得如何实现 oracle。因此在我们考虑的每个实际问题中,我们都给出 oracle 实现的具体描述。
# 作为量子仿真的量子搜索
-
我们考虑构造一个 Hamilton 量,使得在自然选择的演化下,在一定时间内就可以实现初态 到解 的演化。
例如,根据薛定谔方程的解,在极短时间 内,将 泰勒展开保留前两项:
即 稍微转了一部分去。
-
但当 t 不再是小量时,我们做一下全程分析看是否存在 t,使得。
考虑 和 张成的二维空间, 是二维空间上和 正交的单位向量。不妨设,假定选择合适的 相位,使得 是非负实数(即把 的 部分作为相位乘到 上),且。此时,我们考虑在 基中,(即令,有:
所以
在 基下,,所以有。忽略全局相位,于是过了时间 t,系统进入
于是在 时刻,对系统的观测将以概率 1 产生结果,即我们找到了解。
不幸的是,观测时间 依赖 在 方向上的分量,从而依赖,而 又是我们要求的。
实际上,考虑到搜索解 一定是一个长度为 n 的二进制串,因此 不可能是叠加态,而是 量子比特标准正交计算基下的一个(例如 可以为,但不能为)。所以我们可以制备均匀叠加态,这样对于任意一个, 在 上的投影, 不依赖于 的值。而且均匀叠加态是很好用 门制造出来。
-
现在我们用一个量子线路来模拟。下面两个图便分别实现了 和,其中 是个小量。在作业中我验证了其正确性。注意图中 应换为。
又因为,所以我们可以以 的步长交替使用 和,每次使用上面线路时实际上和真正的 有 的误差(因为我只把 展开到一阶小量)
-
而需要的总步数为,误差在。
因此如果想让误差为,可以选择~
-
进一步地,如果我们实现的线路更为出色,可以以 的精度去实现 和,那么积累误差会更小。
-
那么考虑算子,显然它只有作用在 张成的二维平面上时是不平凡的。
在基 讨论下,,其中。所以在 Bloch 球面上, 对应, 对应, 对应。`
不难验证(好吧其实挺烦), 实际上是先绕 旋转,再绕 转。合成后:
所以就是绕(提个 2 是为了归一化)
转。下图为一个形象描述:
-
为了使每次转的角度尽量大,我们可以选择,这这样每次就转。次数需要的总步数为。实际上,取 时已经等价于原始的量子搜索算法。因为。并且除了一个不重要的相位因子,这些算子就等同于构成 Grover 迭代的步骤。
-
给定要解的问题,包含量子算法输入和输出的描述
猜测一个 Hamilton 量来解决问题,并验证其可用
寻找一个模拟该 Hamilton 量的过程
分析消耗的资源
-
量子算法就是量子仿真。
# 量子计数
在事先未知的情况下,多快可以确定 N 元搜索问题的解的个数 M?
-
显然经典计算机上需要 次对 oracle 的调用来确定 M。
在量子计算机上,有可能通过把 Grover 迭代和基于量子 Fourier 变换的相位估计结合,以比经典计算机快得多的方式估计解的数目。
-
设 是 张成的平面中 Grover 迭代算子 G 对应的两个特征向量,令 表示 G 作用效果的旋转角,因为,所以其两个特征值为。假设 O 已经被扩充(但 G 和 O 还是只作用于 张成的平面上的向量是非平凡的),即搜索空间规模被扩大到,并保证。
事实上,通过相位估计在 G 上的应用,可以让我们估计,从而估计解的个数。
下图是一个至少以 的成功概率估计 到 m 比特精度。
其中,第一寄存器共有 个量子比特,第二个寄存器包含 个量子比特。注意到第二寄存器上来也制备了均匀叠加态,因为保证了 一定在 平面上,因此它一定是 的叠加,因此最后测出来以一定概率是 的近似,一定概率是 的近似。而且精度高达,且。
又因为,所以
又因为,故\frac{|\Delta M|}{2N}<(2sin\frac{\theta}{2}+\frac{|\Delta\theta|}{2})\frac{|\Delta\theta|}< p>
再把 代入,有|\Delta M|<(\sqrt{2MN}+\frac{N}{2^{m+1}})2^< p>
-
例如我们取,且,则有。注意此时线路图中虽然好像有快速幂的样子,但实则和前面不同(前面的算子 U 满足 是个乘法)。实际上 就是很朴素地连续作用 个 G 门。因此总共需要 个 G 门,即 个 Grover 迭代、oracle 调用。此时
-
特别地,若,则,于是算法至少以 的概率给出估计 0。反之,若,则以 的概率给出 M 不是 0 的估计。这样在判断 NP 问题是否有解时非常有用。
(\sqrt{2MN}+\frac{N}{2^{m+1}})2^<>(2sin\frac{\theta}{2}+\frac{|\Delta\theta|}{2})\frac{|\Delta\theta|}<> -
-
量子计数的另一个应用是当解数目 M 未知时,找出问题的一个解。之前朴素的黑箱量子搜索的 Grover 迭代次数需要依赖 M,但是我们现在可以先用相位估计估计 M,再代入量子搜索。
在之前的量子搜索中,我们分析了通过不断地 Grover 迭代和旋转,初状态 可以旋转至离末状态 角度 范围里。此时因为量子技术过程中的相位估计会对 估计不准确,因此 旋转后最多最多偏离 角。
# 判断 Hamilton 圈问题的加速
HC 问题为确定给定的 n 个顶点的图是否具有一个 Hamilton 圈。这个问题属于 NP-complete 问题,一般认为在经典计算机上不可解。
-
朴素算法是遍历顶点的全排列进行分析。但这显然很差劲。事实上,NP 类中的任何问题都可以以类似的方式来解:如果有 比特给定的证据,其中 为 n 的多项式,如果解存在,则可以遍历 则一定可以得出解。
-
然而使用量子算法,我们可以令,然后将搜索空间用 个量子比特状态来表示:,其中 是一个 m 量子比特状态用于表示第 i 个顶点的编号。那么黑箱 oracle 就要实现:
当我们有图的描述时,这样的 oracle 是容易实现的。可以取一个能判断图中 Hamilton 圈的多项式规模的电路,然后使用量子搜索算法。
-
事实上,此时我们需要调用 oracle 次来判断是否有 Hamilton 圈。
量子搜索算法渐进于经典算法平方根的运算次数。
-
# 非结构化数据库的量子搜索
给你一个包含一千个名字的清单,问你 “Perth Rose” 出现在名单上第几个?
- 如果遍历搜索,平均需要检查 500 个名字才能找到。但用量子数据库搜索算法可以加速这个过程。
-
设我们有一个包含 个元的数据库,每个元的长度为 l 比特,这些元记为,我们希望确定一个特定的 l 比特串 s 是否在数据库中。
-
假设我们的量子计算机由 CPU 和内存这两个单元组成,其中 CPU 有四个寄存器:
- 一个初始化为 的 n 量子比特索引寄存器
- 一个初始化为,并在整个过程中保持该状态的 l 量子比特寄存器
- 一个初始化为 的 l 量子比特数据寄存器
- 一个初始化为 的 1 量子比特寄存器
而内存则为 个单元的经典内存,每个单元有 l 比特。然而与经典内存不同的是,每个单元的索引 x 可以处于多重值的叠加,即他不再是离散的地址数字,而且这个索引 对应的也是单元值的叠加。
-
例如现在 CPU 的索引寄存器在状态,且数据寄存器处在状态。则 索引的内容 加载到数据寄存器则是,其中 表示异或。实现量子搜索算法的关键在于 oracle 的实现,它必须翻转在内存中定位 s 索引的相位。
-
设 CPU 处于状态
应用 LOAD 操作,载入数据使进入状态
这时应用 oracle 比较第二,第三寄存器,如果相同则应用比特翻转到第四寄存器,否则不变:
然后再应用 LOAD 操作,把数据寄存器还原
其实整个过程我们发现寄存器之间都是独立的没有纠缠在一起,而且二三四寄存器始终没有变化就一直是在改变第一寄存器的相位。此时我们就有了一个很好的 oracle,然后我们可以把第一寄存器制备初态,然后利用 Grover 迭代量子搜索,在 次 LOAD 操作后第一寄存器旋转至 s 对应的索引 的附近,从而得出解。
-
不难发现上述过程中其实内存部分是可以经典实现的(索引也可以是经典的,只不过在 LOAD 使 LOAD 一个叠加态的索引)。说明只要量子地实现 CPU 和 LOAD 过程量子搜索算法也可以用于搜索经典数据库。如果维持单调字典序的话,一个经典的数据库可以在 时间内定位一个元。然后我们给出的方案需要 个量子开关,实际上和经典数据结构没啥区别,所以实际上,量子搜索算法的主要用途还是用于困难问题的解。数据库的话经典数据结构已经很成熟了。
# 搜索算法的最优性
-
我们要好像吃饱了撑的证明不可能调用 oracle 少于 次就在 N 元数据库里搜索,因此上面说的算法是最优的。
-
设算法从状态 出发,考虑搜索问题只有唯一解的情况。我们被允许使用一个对解产生 (-1) 相移而其他状态不变的 oracle 。我们假设算法从 出发并恰好应用 k 次,并在 oracle 运算之间穿插任意酉运算,定义:
我们的目的是估计量,即同一个状态在酉运算的操作下,加不加 oracle 的差别是否很大。如果 很小,则说明我们的 oracle 没起到什么效果,那么其实在搜索过程中, 也就以很小的概率最后转到离 很近。
下面的证明过程省略狄拉克符号的 ket,用 表示向量。
-
首先我们证明。显然这对 k=0 成立,其中,然后:
用柯西不等式D_{k+1}\leq D_k+4+4\sqrt{\sum_x{||\psi_k^x-\psi_k||^2\sum_x|\lang x|\psi_k\rang|^2}}=D_k+4+4\sqrt
根据归纳假设
-
然后我们需要证明,事实上只有当 是 时,成功概率才是高的。
假设要求对所有 x 都有,即要求无论解是什么,在搜索后我们的 必须至少以 的概率测量得到。
定义,则,下面证明 是 的。
定义,有
由柯西不等式:,于是
而其实可以证明,,于是
所以对于任意常数,都有。又因为,所以
所以 oracle 调用次数 k 是 的我们才可以保证 足够大, 以 的概率得到解。
-
然而这也证明了简单量子搜索的极限,即它的调用 oracle 次数仍然是 的,其中 是关于 n 的一个多项式。
-
许多研究者相信,NP 完全问题苦难的本质在于它们搜索空间本质上是无结构的,并且解决这类问题的(精确到一个多项式因子)的最好方法是采用搜索的办法。然而这也只是片面之言,或许 NP 完全问题仍可能具有某些我们还未发现的结构。
-
被普遍视为属于难度介于 P 和 NP 完全之间的 NPI 类的因子问题,量子计算机可以很好地求解其的关键在于利用了该问题的一个隐含结构,即可归约为求阶问题。然而经典算法至今也没有很好的求阶算法。还有许多被怀疑属于 NPI 类的问题(如图同构)甚至 NP 完全问题都被怀疑有类似结构。
# 黑箱算法的极限
给定一个函数 f,判断是否存在 x,使得?
- 实际上,这个问题的难度和找出一个 x 使得 是一样的。其实我们就是判断 Boolean 函数 是否为 1。推广下,我们希望 是个任意 Boolean 函数,即里面的元为,运算符可以是与,或,非,异或等等。给定实现 f 的黑箱,如何快速确定 F 的值?复杂度分析基于 oracle 的调用次数。
-
确定性查询复杂性 定义为经典计算机完成 F 的确定性计算,需要调用 oracle 的最少次数。
相应的量子复杂性 是一台量子计算机为确定性计算 F 需要的最少 oracle 调用次数。因为量子计算机的概率输出特性,一个更有意义的量是有界误差性,即量子计算机以至少 的概率输出 F 的值,需要最少调用 oracle 的次数。( 只是任取的一个大于 0.5 的数,这也就可以通过重复来逼近 1)我们可以介绍一种多项式的方法计算 F。
-
多项式方法基于表示 Boolean 函数的最小阶实多线性多项式的性质。下面要考虑的所有多项式是 的函数,且因为,所以多项式是多线性的(即多项式中每个变量都是一次的,因为幂等),我们构造一个多项式:
其中, 表示函数的取值集合,Y 是一个长度为 N 的二进制串,即也可以表示为函数 f 的取值集合。上面右式表示当且仅当 才等于。于是我们构造出了个 来表示 F,且。实际上我们就是把 Boolean 函数用一般多项式表示。例如。
-
其实,Boolean 函数的多项式表示的最小次数是唯一的(上面的 p 不一定是最小次数)。譬如 的话,就有 为二次。这个可以证明但我不会(。可以感性理解一下,事实上位运算和加法,乘法是等价的。而且一个位运算对应次数翻倍。即有:
想一想应该加法乘法域和位运算域是同构的。所以我们可以把加法乘法和位运算相互转换,例如就把与,或,异或转换为加法和乘法后的多项式次数是很固定的,一个与,或,非就代表次数需要左右相加。
-
但由于这里 F 我们不知道里面有什么位运算和结构,所以我记其对应的多项式最小次数为。事实上,若 F 里面全是或,即把 N 个数或起来,则,同理。
然后已经证明了(这个是事实,但相当难证明)。思考下,发现其实可以拓展。因为我们知道 的值一定是 0 或 1,所以如果,我们也可以通过 来得出。此时我们说 近似。用 表示这种近似多项式的最小次数,目前已经得到证明的有:
这是目前已知最好结果,然后证明过程都略略略了。
-
回到黑箱。我们本来想判断黑箱实现的函数 f 是否有解,然后转化为求。其实我们可以证明, 的近似多项式 可以用量子算法得到。
记执行 T 次 oracle 调用的量子算法 Q 的输出为,而 Q 实际上是任意一个算法,也就是任意作用了一些门和 oracle。其一般形式为:,如下图:
考虑算法 Q 作用在前 个量子比特上,不失一般性还可以允许其引入一些工作量子比特(虽然不影响什么)。
事实上,我们考虑任意一个状态,它在经过一个 oracle 后变为:
我们发现状态 前面的概率幅度关于 的次数从 0 便变成了 1,实际上就是涨了个次数。而作用任何酉运算都不会改变概率幅度关于 的次数(所以说引入什么量子比特都不重要,最后面那个 属实没啥贡献)
于是经过了 T 次调用,概率幅度的阶已经为 T 了,而且正好为 T。我们考虑对算法输出 进行测量,则概率 就是关于 X 的 2T 次实多项式。
假设我们有个量子算法 Q 可以使得对算法输出 进行测量可以正确地得出 的值(即输出不是 就是)此时 就等于得到状态 的概率,要么是 0 要么是 1。故其也可以表示为,关于 X 的次数。所以有
上式表示调用 oracle 次数。同样,若 的输出结果是 的叠加态,即会以很小的误差概率测出错误的,此时 是 的近似,即有:
再结合,得到
这意味着黑箱算法对于经典算法最多只能进行多项式加速,因为如果希望得出结果的概率 根据之前的推导 所以 也至少是关于 N 多项式级别的,原因也在于常见的位运算函数(与或异或)的 是 的。只有对实现 f 的 oracle 黑箱有更进一步的结构了解才有可能对经典算法进行指数加速。