筆記 | 第一個量子算法:Deutsch-Jozsa算法,非常好懂!

《關於胡小兔的博客又詐屍了這件事》

信息物理真是難啊!上節課講了量子計算的最基礎的概念和Deutsch-Jozsa算法,我看了好幾天纔看懂……
等考完試估計我就忘了,所以今天先寫個博客給未來的我講講!

前置技能

// 這部分暫時鴿了。
// 信女願在博客更新量子計算基礎合集,只求小學期兩門A-……
// 不過安利一個網站:IBM的量子計算教程,還可以用IBM的qiskit庫實踐!而且這個網站的顏值真的很高2333

Deutsch算法

衆所周知,量子計算機可以利用量子比特(qubit)的疊加態,實現並行計算,從而快速計算一些傳統計算機上覆雜度很高的問題。但是這種並行計算是怎麼實現的呢……?爲了理解量子並行,我們找到了一個很好的例子——Deutsch算法。顧名思義,學會這個Deutsch算法,你的Deutsch-Jozsa就學會一大半了(霧

目標

有一個未知的黑盒\(f: \{0, 1\} \rightarrow \{0, 1\}\),求\(f(0) \oplus f(1)\)\(\oplus\)表示異或)。

傳統算法

在傳統計算機上,我們必須調用\(f\)函數兩次,一次求\(f(0)\),一次求\(f(1)\),再異或起來,得到答案。但是在量子電路中,只需要一次計算!

量子算法

Deutsch算法就是如下的電路:

其中,中間那個大方塊\(U_f\)是一個特殊的門,輸入\(x\)\(y\),輸出\(x\)\(y\oplus f(x)\)。三個\(H\)門是Hadamard門,要記得:

\[H|0\rangle = |+\rangle = (|0\rangle + |1\rangle)/\sqrt2 \]

\[H|1\rangle = |-\rangle = (|0\rangle - |1\rangle)/\sqrt2 \]

\[H|+\rangle = |0\rangle \]

\[H|-\rangle = |1\rangle \]

電路的輸入是固定的:\(H|\psi_0\rangle = |01\rangle\)。接下來,我們來算一下\(|\psi_1\rangle, |\psi_2\rangle, |\psi_3\rangle\)都是什麼,然後就知道測量結果和\(f\)的關係了!

剛剛說過,\(H|0\rangle = |+\rangle = (|0\rangle + |1\rangle)/\sqrt2, H|1\rangle = |-\rangle = (|0\rangle - |1\rangle)/\sqrt2\),所以

\[|\psi_1\rangle = (H|0\rangle)(H|1\rangle) = (|0\rangle + |1\rangle)(|0\rangle - |1\rangle)/2. \]

接下來就要考慮這個\(U_f\)了。爲了計算方便,我們先設它第一個輸入值是\(|x\rangle\),第二個輸入值直接代入\((|0\rangle - |1\rangle)/\sqrt2\)。那麼,

\[\begin{aligned} U_f |x\rangle (|0\rangle - |1\rangle)/\sqrt2 &= |x\rangle (|f(x)\rangle - |1\oplus f(x)\rangle)/\sqrt2 \\ &= \begin{cases} |x\rangle (|0\rangle - |1\rangle)/\sqrt2, \text{ if }f(x) = 0, \\ |x\rangle (|1\rangle - |0\rangle)/\sqrt2, \text{ if }f(x) = 1 \\ \end{cases}\\ &= (-1)^{f(x)} |x\rangle (|0\rangle - |1\rangle)/\sqrt2. \end{aligned}\]

看起來非常的簡潔!

接下來把\(x = (|0\rangle + |1\rangle) / \sqrt2\)代進去:

\[\begin{aligned} |\psi_2\rangle &= U_f (|0\rangle + |1\rangle)(|0\rangle - |1\rangle)/2 \\ &= \left[(-1)^{f(0)} |0\rangle + (-1)^{f(1)} |1\rangle\right] (|0\rangle - |1\rangle)/2 \\ &= (-1)^{f(0)} \left[|0\rangle + (-1)^{f(0)\oplus f(1)} |1\rangle\right] (|0\rangle - |1\rangle)/2. \\ \end{aligned}\]

其實分開寫就是

\[ |\psi_2\rangle = \begin{cases} (-1)^{f(0)}|+\rangle|-\rangle, \text{ if }f(0) \oplus f(1) = 0, \\ (-1)^{f(0)}|-\rangle|-\rangle, \text{ if }f(0) \oplus f(1) = 1. \\ \end{cases}\]

但是我們實在不喜歡\(|+\rangle\)\(|-\rangle\),還是更喜歡\(|0\rangle\)\(|1\rangle\)。於是我們又在第一條輸出線路上加了一個H門,把\(|+\rangle\)\(|-\rangle\)轉換回\(|0\rangle\)\(|1\rangle\)。這樣,\(|\psi_{3L}\rangle\)(就是\(|\psi_3\rangle\)中的第一個qubit,即右上角被測量的那個比特)就是:

\[ |\psi_{3L}\rangle = \begin{cases} (-1)^{f(0)}|0\rangle, \text{ if }f(0) \oplus f(1) = 0, \\ (-1)^{f(0)}|1\rangle, \text{ if }f(0) \oplus f(1) = 1. \\ \end{cases}\]

這樣我們只需要沿\(|0\rangle\)測量一下\(|\psi_{3L}\rangle\),測出\(|0\rangle\)就說明\(f(0) \oplus f(1) = 0\),反之就說明\(f(0) \oplus f(1) = 1\),這樣就可以100%確定\(f(0) \oplus f(1)\)的值了!至此就是Deutsch算法的內容。

神奇的地方在於:在量子版的算法中,我們只調用了一次\(U_f\)!而在傳統計算機上,我們至少要調用兩次\(f\)。你可能會說:差個常數2有啥大不了的嘛!確實,在Deutsch算法並沒有在複雜度上體現出量子算法的優越性,但是接下來的Deutsch-Jozsa算法就能體現出本質上的差異了!

Deutsch-Jozsa算法

目標

有一個未知的黑盒\(f: \{0, 1\}^n \rightarrow \{0, 1\}\)\(f\)可能有以下兩種性質之一:

  • f是常函數
  • f是均勻的(balanced)。這裏均勻指的是:\(f(x)\)對於恰好一半的\(x\)\(0\),而對另恰好一半的\(x\)\(1\)

\(f\)具有以上兩種性質中的哪一種。

量子算法

Deutsch-Jozsa算法的電路圖:

上面那“一條”線路實際上是\(n\)條,左上角的\(\not-^n\)符號表示這條線路代表\(n\)條線路。輸入也隨之變成了\(|\psi_0\rangle = |0\rangle^{\otimes n}|1\rangle\)。可以發現,Deutsch-Jozsa算法的電路圖除了把第一條線路擴成了\(n\)條之外,和Deutsch算法的電路圖並沒有什麼區別。(是不是突然有自信看懂了!)

讓我們再用熟悉的方法,逐個計算\(|\psi_0\rangle, |\psi_1\rangle, |\psi_2\rangle, |\psi_3\rangle\)

\[\begin{aligned} |\psi_1\rangle &= (H|0\rangle^{\otimes n})(H|1\rangle) \\ &= \frac{1}{\sqrt2^n}(|0\rangle + |1\rangle)\otimes(|0\rangle + |1\rangle)\otimes\cdots\otimes(|0\rangle + |1\rangle)\otimes(|0\rangle - |1\rangle)/\sqrt2\\ &= \frac{1}{\sqrt2^n} \sum_{x\in \{0, 1\}^n} |x\rangle (|0\rangle - |1\rangle) / \sqrt2.\\ |\psi_2\rangle &= U_f |\psi_1\rangle = \frac{1}{\sqrt2^n} \sum_{x\in \{0, 1\}^n} (-1)^{f(x)} |x\rangle (|0\rangle - |1\rangle) / \sqrt2. \end{aligned}\]

最後一步,我們要計算\(|\psi_{3L}\rangle = H|\psi_2\rangle\)。這一步稍微有點難算,再堅持一下!

考慮單個qubit\(x_1\),有
\(H|x_1\rangle = \sum_{z_1 \in \{0, 1\}} (-1)^{x_1z_1} |z_1\rangle\)
那麼對\(n\)個qubit組成的\(|x\rangle\),有

\[H|x\rangle = H|x_1 x_2 \cdots x_n\rangle = \sum_{z \in \{0, 1\}^n} (-1)^{\sum_i x_i z_i} |z\rangle / \sqrt2^n. \]

所以

\[|\psi_{3L}\rangle = \frac{1}{\sqrt2^n} \sum_{x\in \{0, 1\}^n} (-1)^{f(x)} H|x\rangle = \frac1{2^n} \sum_{x \in \{0, 1\}^n} (-1)^{f(x)} \sum_{z \in \{0, 1\}^n} (-1)^{\sum_i x_i z_i} |z\rangle. \]

接下來我們測量一下\(|\psi_{3L}\rangle\),見證奇蹟的時刻到了!

測得\(|0\rangle^{\otimes n}\)的概率是:

\[\langle \psi_{3L} | 0 \rangle \langle 0 | \psi_{3L} \rangle = \left(\frac1{2^n} \sum_{x\in \{0, 1\}^n} (-1)^{f(x)}\right)^2, \]

因爲除了\(| 0 \rangle\)以外的\(| z \rangle\)都和\(| 0 \rangle\)垂直,內積是0,所以其他項都沒了,只剩下\(| z \rangle = | 0 \rangle\)的這一項。

\(f\)是常函數時,所有\((-1)^{f(x)}\)都相等,\(\sum_{x\in \{0, 1\}^n} (-1)^{f(x)} = \pm 1\),平方之後就等於\(1\),所以測出\(|0\rangle^{\otimes n}\)的概率是1;
\(f\)是均勻的函數時,一半\((-1)^{f(x)} = 1\),另一半\((-1)^{f(x)} = -1\)\(\sum_{x\in \{0, 1\}^n} (-1)^{f(x)} = 0\),平方之後依然等於\(0\),所以測出\(|0\rangle^{\otimes n}\)的概率是0。

這樣,只需運行這個電路一次,就可以100%確定\(f\)的性質了!

一些常見的困惑

Q:啥是量子計算……啥是qubit……
A:反正大概是OI用不到的東西……Qiskit Textbook歡迎你!(再次免費打廣告)

Q:不是啊,你連\(f\)是啥都不知道,你這個\(U_f\)咋從\(f\)構建出來的啊?
A:好問題!答案是,並不知道怎麼構建……這個算法應用的場景其實是“給出一個量子黑盒\(U_f\)”,而不是給出\(f\)。(如果給出\(f\),把\(f\)讀進來、搞出一個真值表的複雜度就有\(2^n\)了……總之這個算法解決的問題不是這個。)

Q:只看上面那條線路,\(U_f\)對於\(|x\rangle\)不是相當於單位矩陣\(I_n\)一樣,沒有產生改變嘛?爲啥第一條線路輸出的不是\(H^{\otimes n}I_nH^{\otimes n}|0\rangle^{\otimes n} = |0\rangle^{\otimes n}\)呢?
A:好、好問題!問題出在“\(U_f\)對於\(|x\rangle\)相當於單位矩陣\(I_n\)”這句話上。事實上,\(U_f\)並不能寫作\(I_n \otimes U_f'\)的形式,也就是說\(U_f\)並不能分成兩個矩陣分別影響上下兩條線路。

Q:我還是不明白。\(|x\rangle\)\(|0\rangle^{\otimes n}\)經過H門後得到的,再經過一次H門爲啥沒變回去???
A:換種說法,經過\(U_f\)門之後,上下兩條線路(\(|x\rangle\)\(|y\rangle \oplus f(x)\))發生了糾纏,所以\(U_f\)門輸出的“兩條線路”也無法分成“\(|x\rangle \otimes (|y\rangle \oplus f(x))\)”這樣的“張量積”形式,因而不能分開單獨考慮了。

Q:所以這個算法有啥用處嗎?
A:它的用處大概是……幫你理解量子並行計算,證明量子並行計算與傳統計算機相比有優越之處。現在看起來,Deutsch-Jozsa算法解決的問題或許沒啥用處,但或許以後類似的方法能解決更重要的問題吧~(現學現賣,並未深入瞭解 =_=|||)


以上就是Deutsch-Jozsa算法的講解啦,我也剛學,可能有很多錯誤,歡迎大佬指正!>v<

Acknowledgement:感謝lpy大佬解答我的菜問題ヘ(;´Д`ヘ)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章