量子搜索算法 Grover search

問題定義:

Problem:html

\(f: \{ 0,1,2,3,……,N-1 \} \rightarrow \{0,1\}\)算法

找到 \(f(x)=1\) 的xspa

解法

經典解法:orm

經典解法很簡單,就是把每個都看一遍,若是隻有一個x對應的f(x)=1,那麼平均是要看一半,才能找到那個x。htm

時間複雜度O(N)blog

量子解法:get

使用Grover search 算法,時間複雜度在 \(O(\sqrt N)\)it

Grover search 算法

Grover search 算法一共分爲兩步:io

  1. Phase Inversion
  2. Inversion about the Mean

而後不斷的迭代這兩步咱們就可以獲得結果了。form

首先咱們先看看這兩個步驟分別在作什麼:

咱們把 $f(x)=1 $ 的 \(|x\rangle\) 稱爲 \(x^*\) ,咱們要找的也就是這個 \(x^*\)

Phase Inversion:

這一步主要是把 \(x^*\) 的機率幅翻轉,變成負數,而其餘的保持不變。

即,把 \(\sum_{x } \alpha_x|x\rangle\) 變成 \(\sum_{x \neq x^*} \alpha_x|x\rangle -\alpha_{x^*}|x^*\rangle\)

Inversion about the Mean

這一步呢,就是把 \(\alpha_x\) 變成 \(2\mu- \alpha_x\)

\(\mu\) 是全部機率幅的平均值,\(\mu= \frac{\sum_x \alpha_x}{N}\)

用圖可能更好表達這兩個步驟究竟在作什麼:

圖1到圖2,就是Phase Inversion,把\(x^*\)的機率幅翻轉到了下面,圖2中的虛線就是個人機率幅的平均值,圖2到圖3 就是咱們的Inversion about the Mean,對着平均值翻轉一次,其他x的機率幅是高於平均值的,因此 \(2\mu- \alpha_x\) 讓他們變小了,而咱們的 \(x^*\) 他的機率幅是個負數,因此 \(2\mu- \alpha_x\) 後他增長了。

不斷的重複這個步驟, \(x^*\) 他的機率幅會愈來愈大,最後咱們測量的時候就會很容的找到他。

進行了 \(\sqrt N\) 後,他的機率幅就會達到 \(\frac{1}{ \sqrt 2}\) ,算機率就是1/2。

那麼接下來的問題就是,這些操做是怎麼實現的?

Phase Inversion:

這個步驟要作的事情就是,

\(\sum_{x } \alpha_x|x\rangle\) 變成 \(\sum_{x \neq x^*} \alpha_x|x\rangle -\alpha_{x^*}|x^*\rangle\)

符號是和f(x)是否爲1相關的,進一步化簡就是 \(\sum_x (-1)^{f(x)} \alpha_x|x\rangle\)

有沒有一絲熟悉感?

把f(x)的結果給放到相位上去,這是咱們在Parity Problem中就遇到的問題。

當時的解決方法是把答案比特變成 \(|-\rangle\)

通常狀況,若是咱們打算放置答案的比特是 \(|b\rangle\),那麼輸入的比特就是\(|b \oplus f(x)\rangle\)

若是f(x)=0 那麼\(|( \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle) \oplus f(x) \rangle = \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle = |-\rangle\)

若是f(x)=1 那麼\(( \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle) \oplus f(x) \rangle = \frac{1}{\sqrt2}|1\rangle-\frac{1}{\sqrt2}|0\rangle = -|-\rangle\)

最後一個比特的值若是在\(|+\rangle |-\rangle\)座標下測量,必定是 \(|-\rangle\),f(x)的差異也變到了符號上,即 \((-1)^{f(x)}\)

Inversion about the Mean

\(\alpha_x\) 變成 \(2\mu- \alpha_x\) ,這個就要比前一個麻煩了

這實際上是要求我把如今的態對着 \(\mu\) 翻轉。

對着 \(\mu\) 翻轉會嗎?

不太會。

可是我會對着 \(|0\rangle\) 的翻轉啊。

對角線第一個值爲1,其他爲-1,非對角線的都爲0。

\(\left[ \begin{array}{} 1 & 0 & …& 0 \\ 0 & -1 & …& 0 \\…\\0 & 0 & …& -1 \end{array}\right]\left[ \begin{array}{} a_0\\a_1\\…\\a_{n-1} \end{array}\right]=\left[ \begin{array}{} a_0\\-a_1\\…\\-a_{n-1} \end{array}\right]\)

這個矩陣垂手可得的可讓 \(|0\rangle\) 保持不變,非 \(|0\rangle\) 的符號全都翻轉。

量子變換要求矩陣式酉矩陣,這個矩陣很明顯知足 \(UU^\dagger=U^\dagger U=I\)

接下來怎麼作呢?

咱們先把咱們的態總體來一個從 \(|\mu\rangle\)\(|0\rangle\) 的旋轉,對着 \(|0\rangle\) 翻轉後,又從 \(|0\rangle\)\(|\mu\rangle\) 翻轉回去。

\(|\mu\rangle\) 是一個怎樣的態?

全部的x的機率都同樣,也就是咱們的superposition \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\)

\(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\)\(|0\rangle\)之間的相互轉換,這就是咱們最最熟悉的Hadamard Transform了

第二部分的電路圖以下:

這個矩陣是能夠直接計算的:

我這裏直接給出答案,獲得的矩陣值呢是下圖左邊的這個矩陣:

在對應的 \(\alpha_x\)的結果剛好是 \(\frac{2}{N} \sum _{y=0}^{N} \alpha_y -\alpha_x\)

\(\frac{2}{N} \sum _{y=0}^{N} \alpha_y\) 剛好就是 \(2\mu\)

至此,呈上最完整的電路圖模塊:

第一個H門是數據的初始化,第二個門是爲了翻轉 \(x^*\),第三四五個門是爲了對 \(| \mu \rangle\) 翻轉,二三四五這四個門就是要給重複的模塊了,不斷的重複他們就能夠不斷的提升 \(x^*\)的機率幅,最終找到 \(x^*\)

參考資料:

Quantume Mechanics & Quantume Computation Lecture 11