格羅弗算法(英語:Grover's algorithm)是一種量子算法,於1996年由電腦科學家洛夫·格羅弗提出。假設現在有一個未知的函數,格羅弗算法只需測試此未知的函數
次,其中
為此未知函數的定義域的大小,即可以很高的概率找到一特定的輸入值,此輸入值能使此未知函數輸出特定的值。
同樣的問題在經典運算下,需要至少做
次測試(因為在最壞的情況下,可能第
個定義域裡的值才是正確答案)。在格羅弗發表他的算法前後,Bennett, Bernstein, Brassard, 和 Vazirani 在相近的時間證明了,任何量子算法解決此問題都最少需要對此未知的函數做
次測試,因此格羅弗算法是漸進最優的。[1]
非局域隱變量量子計算機已經被證明可以在最多
步內實現在N個條目的數據庫裡的搜索,這比格羅弗算法的
還快,然而這些搜索算法並不能使量子計算機在多項式時間內解決NP-Complete 問題。[2]
不像其他的量子算法可能會比相應的經典算法有指數級的加快,格羅弗算法二次方的加快,不過當
很大時二次方的加快也相當可觀。格羅弗算法可以在大約 264次迭代內窮舉破解一個128比特的對稱密鑰,在大約 2128次迭代內窮舉破解一個256比特的密鑰。因此,有人提倡對稱密鑰的長度應該加倍以因應未來的量子攻擊。[3]
像其他的量子算法一樣,格羅弗算法是概率性的,意味著這個算法以小於1的概率給出正確答案。雖然實際上對於需要多少次重複才能給出正確的答案並沒有一個上界,但是期望的重複次數並不隨
成長。在格羅弗發表此算法的原始論文中稱此算法為數據庫搜索算法,此說法至今仍普遍。此處數據庫相當於是一張存有未知函數的所有輸出值的表,以對應的輸入值為索引。
雖然格羅弗算法的用處一直被認為是數據庫搜索,但是它也可以被認為是函數取反。
考慮一個有N個元素的無序數據集,我們設函數
。我們假設,在所有的下標x中,有且僅有一個下標x有
,我們記這個下標x為
,並且稱
為這個搜索問題的解。而格羅弗算法的目標便是找到下標
。為此,我們構建一個酉算子
,如下
或者可以簡寫為
事實上,我們一般構建另一種酉算子
,如下所示
我們一般將
作用在態矢量和
的疊加態上,以實現相回傳(Phase Kickback),具體流程如下
與一般的
相比,
使用了一個輔助的qubit。
格羅弗算法的量子電路表示
格羅弗算法的步驟如下
- 構建量子疊加態

- 2. 做
次「格羅弗迭代」,具體操作如下
- 將
作用在
上
- 將
作用在
上
- 其中,
被稱為格羅弗擴散算子
- 3. 測量
,得到求得的結果
一般而言,
的值會很大程度上影響得到正確結果的概率,且並不是
越大得到正確結果的概率越大。分析表明最優的
有
,因而格羅弗算法的複雜度為
格羅弗算法使用的技巧為振幅減枝(Amplitude amplification),實則是通過將其他態的振幅轉移為解的振幅,而是在測量時使得坍塌為解的概率增加。具體如下
考慮,我們將態矢量改為以
為基,其中
為解。寫作
在這種表示下,我們可以將
和
表示為
![{\displaystyle U_{s}:a|\omega \rangle +b|x\rangle \mapsto [|\omega \rangle \,|x\rangle ]{\begin{bmatrix}-1&0\\2/{\sqrt {N}}&1\end{bmatrix}}{\begin{bmatrix}a\\b\end{bmatrix}}.}](/media/api/rest_v1/media/math/render/svg/e2f566230cbb5089c115d3a78124976c66273512)
![{\displaystyle U_{\omega }:a|\omega \rangle +b|x\rangle \mapsto [|\omega \rangle \,|x\rangle ]{\begin{bmatrix}-1&-2/{\sqrt {N}}\\0&1\end{bmatrix}}{\begin{bmatrix}a\\b\end{bmatrix}}.}](/media/api/rest_v1/media/math/render/svg/d271061b669276655471fc0c72aab24928cf042a)
我們可以通過設
,將上式改寫為(所謂Jordan form)
where
作用r次
則將得到
注意到,我們的目的是區別解以及其他一般的數據,而為了達到這個目的,我們使
的振幅差別越大越好,換言之,要使得2rt和−2rt的差別足夠大,便有
, 或
. 這樣以來,就有
作用在初始態上將會有
簡短的計算表明,格羅弗算法將具有
量級的誤差.