簡單的量子演算法(一):Hadamard 變換、Parity Problem
Hadamard Transform
Hadamard 變換在量子邏輯閘中提過,只不過那時是單量子的Hadamard門,負責把\(|1\rangle\)變成\(|-\rangle\),\(|0\rangle\)變成\(|+\rangle\)。
那麼對多量子的Hadamard門呢?
對於多量子邏輯閘,其實說過一句,是單量子邏輯閘的張量積。
對於多量子位元的Hadamard門,就是把每一個量子位元都由\(|1\rangle\)變成\(|-\rangle\),\(|0\rangle\)變成\(|+\rangle\),或者\(|-\rangle\)變成\(|1\rangle\),\(|+\rangle\)變成$|0\rangle $ 。如果是n個位元,那麼這n位元的Hadamard門就可以寫作是 \(H^{\otimes n}\) ,矩陣表達就是 \(H^{\otimes n}=\left[ \begin{array}{}{\frac{1}{\sqrt2}} &{\frac{1}{\sqrt2}} \\ {\frac{1}{\sqrt2}}&{-\frac{1}{\sqrt2}} \end{array}\right] \otimes ……\otimes \left[ \begin{array}{}{\frac{1}{\sqrt2}} &{\frac{1}{\sqrt2}} \\ {\frac{1}{\sqrt2}}&{-\frac{1}{\sqrt2}} \end{array}\right]\) (張量積n次)
對於\(|0\rangle\),變成\(\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle\)。
對於\(|00\rangle\),變成\((\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle)(\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle)\) ,即 \(\frac{1}{2}|00\rangle+\frac{1}{2}|01\rangle+\frac{1}{2}|10\rangle+\frac{1}{2}|11\rangle\) 可能性均等的所有可能 的疊加。
那麼對於n個 \(|0\rangle\) 呢?則是變成了 \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\) ,x是由0、1組成的所有的長度為n的數字串。
那麼更進一步,如果我的n位元不是 \(|0\rangle\),而是 \(|0\rangle\) 、 \(|1\rangle\) 隨意切換呢?比如數字串 \(|u\rangle=|u_1u_2……u_n\rangle\) ,如果輸入是 \(|u\rangle\) ,那麼經過H門變換,輸出會是什麼?
輸出是:\(\sum_x \frac{-1^{u·x}}{2^{\frac{n}{2}}} |x\rangle\) ,這裡 \(u·x=u_1x_1+u_2x_2+……+u_nx_n\)
原因如下:
對於\(|0\rangle\),H門變成\(\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle\)
對於\(|1\rangle\),H門變成\(\frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle\)
如果想要有一個負號,則需要這一位在輸入的時候是\(|1\rangle\) ,並且輸出的時候也是 \(|1\rangle\) ,同時,如果在這個數字串中這種情況出現了偶數次(即有偶數位的位元在輸入輸出的時候都是\(|1\rangle\)),那麼整體情況就會是負負得正,所以我們將每位的情況相乘,再連加(對於不會造成負號的情況,他們相乘的結果是0),作為-1的指數來標明符號。
而以上的變換,在量子計算中又稱為Fourier Sampling。
整理一下本小節的內容: \(H^{\otimes n} |u\rangle = \sum_x \frac{-1^{u·x}}{2^{\frac{n}{2}}} |x\rangle\) ,他將我們的輸入資料給移到了符號上面去。
Parity Problem
這個問題是hadamard變換的簡單應用。
假設: 有這麼一個黑盒子 把長度為n的0、1數字串對映成0或者1一個數字 \(f: \{ 0,1 \}^n \rightarrow \{0,1 \}\) ,已知對映的規則如下 \(f(x)=u·x=u_1x_1+u_2x_2+……+u_nx_n \mod 2\) 模2的意思是如果是累加的和是奇數,那麼就是1,偶數就是0
問題:請問,我至少需要試幾次,才能知道u是什麼?
經典解法:
輸入100……0 得到\(u_1\) 的值
輸入010……0 得到\(u_2\) 的值
輸入001……0 得到\(u_3\) 的值
……
輸入000……1 得到\(u_n\) 的值
因為我們的輸出結果只有一位的資訊,而u的全部資訊有n位,所以我們至少也需要n次。
量子解法:
這個量子解法又叫做 Bernstein-Vazirani演算法,一共只有兩步:
一、製造出一個量子疊加態 : $\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle $
二、對這個疊加態fourier sampling
why?
對於第一步我們需要製備出來的量子疊加態,不知道大家有沒有眼熟,這個是我們上一節的結論,將\(|u\rangle\) 作為H門的輸出得到的結果一模一樣。
我們已經知道了量子計算是可逆的,對於H門來說,連續兩個的H門操作就是完全抵消的,第一個H門將\(|0\rangle\)變成\(|+\rangle\),第二個H門又將\(|+\rangle\)變成\(|0\rangle\)。
所以,我們能夠將$\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle $用H門變換出來,把f(x)的值移到符號上,那麼我們也可以通過H門把符號上的f(x)移到輸出裡,只需要一個同樣的H門操作,也就是我們的第二步。
所以現在的問題變成了,如果製備疊加態 $\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle $ 呢?
在量子電路里面我們已經討論過了,一個量子的電路,為了讓他可逆,我們一般是輸入 \(|x\rangle|b\rangle\) 然後輸出是 \(|x\rangle |b \oplus f(x) \rangle\) 把輸入的結果f(x)模2加到b上。
因為是需要所有的x,所以首先用H門,將n位元的 \(|0\rangle\) 變成所有狀態均可能的疊加態 \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\) 。
接下來,把 \(|-\rangle =\frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle\) 作為 \(|b\rangle\) 和前面的疊加態 \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\) 一起輸入 \(U_f\) 。
此時輸入是 \(\frac{1}{2^{\frac{n}{2}}} \sum_x |x\rangle |-\rangle\)
輸出是 \(\frac{1}{2^{\frac{n}{2}}} \sum_x |x\rangle |- \oplus f(x) \rangle\)
如果f(x)=0 那麼\(|- \oplus f(x) \rangle = \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle = |-\rangle\)
如果f(x)=1 那麼\(|- \oplus f(x) \rangle = \frac{1}{\sqrt2}|1\rangle-\frac{1}{\sqrt2}|0\rangle = -|-\rangle\)
最後一個位元的值如果在\(|+\rangle |-\rangle\)座標下測量,一定是 \(|-\rangle\),f(x)的差別也變到了符號上,即 \((-1)^{f(x)}\)
此時,我們的輸出已經是 \(\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle |-\rangle\) ,只看前面的部分,就是我們需要的疊加態了。
概括一下,概括一下,通過H門製備出一個均等可能的態,然後和 \(|-\rangle\) 一起通過 \(U_f\) 將f(x)的結果移到符號上,最後再次通過H門,把符號上的結果移下來,整個電路圖如下圖所示,非常的簡單,在經典演算法需要多項式時間的時候,量子演算法只需要常數的時間。
下一篇的內容是simon's Algorithm是在parity Problem的又一個進化,也是基於H門的,所以說H門很重要啊,基本上所有的量子演算法不管要幹嘛,先來一個H門再說,畢竟這個是用n位元同時表達 \(2^n\) 個數據的法寶。
參考資料:
Quantume Mechanics & Quantume Computation Lectur