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 算法一共分爲兩步:io
而後不斷的迭代這兩步咱們就可以獲得結果了。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。
那麼接下來的問題就是,這些操做是怎麼實現的?
這個步驟要作的事情就是,
把 \(\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)}\)
把 \(\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^*\)。
參考資料: