格罗弗算法

格罗弗算法（Grover's algorithm）是一种量子算法，于1996年由电脑科学家洛夫·格罗弗提出。假设现在有一个未知的函数，格罗弗算法只需测试此未知的函数$O(\sqrt{N})$次，其中$N$为此未知函数的定义域的大小，即可以很高的概率找到一特定的输入值，此输入值能使此未知函数输出特定的值。

同样的问题在经典运算下，需要至少做 $O(N)$ 次测试（因为在最坏的情况下，可能第$N$个定义域里的值才是正确答案）。在格罗弗发表他的算法前后，Bennett, Bernstein, Brassard, 和 Vazirani 在相近的时间证明了，任何量子算法解决此问题都最少需要对此未知的函数做 $\Omega(\sqrt{N})$ 次测试，因此格罗弗算法是渐进最优的。

非局域隐变量量子计算机已经被证明可以在最多 $O(\sqrt[3]{N})$ 步内实现在N个条目的数据库里的搜索，这比格罗弗算法的 $O(\sqrt{N})$ 还快，然而这些搜索算法并不能使量子计算机在多项式时间内解决NP-Complete 问题。

不像其他的量子算法可能会比相应的经典算法有指数级的加快，格罗弗算法二次方的加快，不过当$N$很大时二次方的加快也相当可观。格罗弗算法可以在大约 264次迭代内穷举破解一个128比特的对称密钥，在大约 2128次迭代内穷举破解一个256比特的密钥。因此，有人提倡对称密钥的长度应该加倍以因应未来的量子攻击。

像其他的量子算法一样，格罗弗算法是概率性的，意味着这个算法以小于1的概率给出正确答案。虽然实际上对于需要多少次重复才能给出正确的答案并没有一个上界，但是期望的重复次数并不随$N$成长。在格罗弗发表此算法的原始论文中称此算法为数据库搜索算法，此说法至今仍普遍。此处数据库相当于是一张存有未知函数的所有输出值的表，以对应的输入值为索引。

## 应用

虽然格罗弗算法的用处一直被认为是数据库搜索，但是它也可以被认为是函数取反。

## 设定

考虑一个有 $N$ 个元素的无序数据集，假设函数 ${\displaystyle f:\{0,1,\ldots ,N-1\}\to \{0,1\}}$。

我们假设，在所有的下标 $x$ 中，有且仅有一个下标 $x$ 有 $f(x)=1$，记这个下标$x$ 为 $\omega$，并且称 $\omega$ 为这个搜索问题的解。

而格罗弗算法的目标便是找到下标 $\omega$。为此，构建一个酉算子 $U_\omega$，如下

$${\displaystyle {\begin{cases}U_{\omega }|x\rangle =-|x\rangle &{\text{for }}x=\omega\\U_{\omega }|x\rangle =|x\rangle &{\text{for }}x\neq \omega\end{cases}}}$$

或者可以简写为

$$U_\omega|x\rang=(-1)^{f(x)}|x\rang$$

事实上，一般构建另一种酉算子 $U_f$，如下所示

$$U_f|x\rang|y\rang=|x\rang|y\oplus f(x)\rang$$

一般将 $U_f$ 作用在态矢量和 $|-\rang$ 的叠加态上，以实现相回传(Phase Kickback)，具体流程如下

$$\begin{align} <pre> U_f|x\rang|-\rang&=U_f|x\rang\left[\frac{|0\rang-|1\rang}{\sqrt{2}}\right]\\ &={\begin{cases} \frac{1}{\sqrt{2}}(|x\rang|1\rang-|x\rang|0\rang) &{\text{for }}x=\omega\\ \frac{1}{\sqrt{2}}(|x\rang|0\rang-|x\rang|1\rang) &{\text{for }}x\neq \omega\end{cases}}\\ &=(-1)^{f(x)}|x\rang|-\rang </pre> \end{align}$$

与一般的 $U_\omega$ 相比， $U_f$ 使用了一个辅助的qubit。

## 算法步骤

<image>

格罗弗算法的步骤如下

- 构建量子叠加态

$$|s\rangle = H^{\otimes N}|0\rang^{\otimes N} = \frac{1}{\sqrt{N}} \sum_{x=0}^{N-1} |x\rangle$$

- 做$p(N)$次“格罗弗迭代”，具体操作如下

- 将$U_\omega$作用在$|s\rang$上
- 将$U_s = 2 |s\rangle \langle s| - I$ 作用在$|s\rang$上

其中，$U_s$被称为格罗弗扩散算子

- 测量$|s\rang$，得到求得的结果

一般而言，$p(N)$的值会很大程度上影响得到正确结果的概率，且并不是$p(N)$越大得到正确结果的概率越大。分析表明最优的$p(N)$有$p(N) \leq \Big\lceil\frac{\pi}{4}\sqrt{N}\Big\rceil$，因而格罗弗算法的复杂度为$\mathcal{O}(\sqrt{N})$

## 正确性证明

### 几何直观证明

格罗弗算法使用的技巧为振幅减枝(Amplitude amplification)，实则是通过将其他态的振幅转移为解的振幅，而是在测量时使得坍塌为解的概率增加。具体如下

### 代数证明

考虑，我们将态矢量改为以$|x\rang,|\omega\rang$为基，其中$\omega$为解。写作

$$|s\rang=a|\omega\rang+b|x\rang$$

在这种表示下，我们可以将$U_s$和$U_\omega$表示为

$$U_s : a |\omega \rang + b |x \rang \mapsto [|\omega \rang \, | x \rang] \begin{bmatrix} -1 & 0 \\ 2/\sqrt{N} & 1 \end{bmatrix}\begin{bmatrix}a\\b\end{bmatrix}.$$

$$U_\omega : a |\omega \rang + b |x \rang \mapsto [|\omega \rang \, | x \rang] \begin{bmatrix} -1 & -2/\sqrt{N} \\ 0 & 1 \end{bmatrix}\begin{bmatrix}a\\b\end{bmatrix}.$$

$$U_sU_\omega = \begin{bmatrix} -1 & 0 \\ 2/\sqrt{N} & 1 \end{bmatrix} \begin{bmatrix} -1 & -2/\sqrt{N} \\ 0 & 1 \end{bmatrix} <pre> = </pre> \begin{bmatrix} 1 & 2/\sqrt{N} \\ -2/\sqrt{N} & 1-4/N \end{bmatrix}.$$

我们可以通过设$t = \arcsin(1/\sqrt{N})$，将上式改写为（所谓Jordan form）

$U_sU_\omega = M \begin{bmatrix} e^{2it} & 0 \\ 0 & e^{-2it}\end{bmatrix} M^{-1}$ where $M = \begin{bmatrix}-i & i \\ e^{it} & e^{-it} \end{bmatrix}.$

作用r次$U_s$ $U_\omega$则将得到

$$(U_sU_\omega)^r = M \begin{bmatrix} e^{2rit} & 0 \\ 0 & e^{-2rit}\end{bmatrix} M^{-1}.$$

注意到，我们的目的是区别解以及其他一般的数据，而为了达到这个目的，我们使$|x\rang,|\omega\rang$的振幅差别越大越好，换言之，要使得2rt和−2rt的差别足够大，便有$2rt \approx \pi/2$, 或 $r = \pi/4t = \pi/4\arcsin(1/\sqrt{N}) \approx \pi\sqrt{N}/4$. 这样以来，就有

$$(U_sU_\omega)^r = M \begin{bmatrix} i & 0 \\ 0 & -i\end{bmatrix} M^{-1}.$$

作用在初始态上将会有

$$[|\omega \rang \, | x \rang] (U_sU_\omega)^r \begin{bmatrix}0\\1\end{bmatrix} \approx [|\omega \rang \, | x \rang] M \begin{bmatrix} i & 0 \\ 0 & -i\end{bmatrix} M^{-1} \begin{bmatrix}0\\1\end{bmatrix} = | \omega \rang \frac{1}{\cos(t)} - |x \rang \frac{\sin(t)}{\cos(t)}.$$

简短的计算表明，格罗弗算法将具有$O\left (\frac{1}{N} \right)$量级的误差.