量子搜尋演算法 Grover search

2022-07-10 17:21:14 字數 3471 閱讀 9396

problem:

\(f: \ \rightarrow \\)

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

經典解法:

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

時間複雜度o(n)

量子解法:

使用grover search 演算法,時間複雜度在 \(o(\sqrt n)\)

grover search 演算法一共分為兩步:

phase inversion

inversion about the mean

然後不斷的迭代這兩步我們就能夠得到結果了。

首先我們先看看這兩個步驟分別在做什麼:

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

phase inversion:

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

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

inversion about the mean

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

\(\mu\) 是所有概率幅的平均值,\(\mu= \frac\)

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

圖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/2。

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

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

把 \(\sum_ \alpha_x|x\rangle\) 變成 \(\sum_ \alpha_x|x\rangle -\alpha_|x^*\rangle\)

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

有沒有一絲熟悉感?

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

當時的解決方法是把答案位元變成 \(|-\rangle\)。

一般情況,如果我們打算放置答案的位元是 \(|b\rangle\),那麼輸入的位元就是\(|b \oplus f(x)\rangle\)

如果f(x)=0 那麼\(|( \frac|0\rangle-\frac|1\rangle) \oplus f(x) \rangle = \frac|0\rangle-\frac|1\rangle = |-\rangle\)

如果f(x)=1 那麼\(( \frac|0\rangle-\frac|1\rangle) \oplus f(x) \rangle = \frac|1\rangle-\frac|0\rangle = -|-\rangle\)

最後乙個位元的值如果在\(|+\rangle |-\rangle\)座標下測量,一定是 \(|-\rangle\),f(x)的差別也變到了符號上,即 \((-1)^\)

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

這其實是要求我把現在的態對著 \(\mu\) 翻轉。

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

不太會。

但是我會對著 \(|0\rangle\) 的翻轉啊。

對角線第乙個值為1,其餘為-1,非對角線的都為0。

\(\left[ \begin{} 1 & 0 & …& 0 \\ 0 & -1 & …& 0 \\…\\0 & 0 & …& -1 \end\right]\left[ \begin{} a_0\\a_1\\…\\a_ \end\right]=\left[ \begin{} a_0\\-a_1\\…\\-a_ \end\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}} \sum_^n}|x\rangle\)

\(\frac}} \sum_^n}|x\rangle\) 和 \(|0\rangle\)之間的相互轉換,這就是我們最最熟悉的hadamard transform了

第二部分的電路圖如下:

這個矩陣是可以直接計算的:

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

在對應的 \(\alpha_x\)的結果恰好是 \(\frac \sum _^ \alpha_y -\alpha_x\)

而 \(\frac \sum _^ \alpha_y\) 恰好就是 \(2\mu\)

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

第乙個h門是資料的初始化,第二個門是為了翻轉 \(x^*\),第三四五個門是為了對 \(| \mu \rangle\) 翻轉,二三四五這四個門就是要給重複的模組了,不斷的重複他們就可以不斷的提高 \(x^*\)的概率幅,最終找到 \(x^*\)。

A 搜尋演算法

啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...

A 搜尋演算法

a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...

搜尋演算法小結

搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分和所有的可能情況,從而求出問題的解的一種方法。常用的搜尋演算法有 一.回溯法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最...