核心思路
整個計算領域裡被吹得最過頭的一句話就是:「量子電腦會同時嘗試每一個答案。」這話聽起來很神奇,可它是錯的。沒錯,一組處於疊加態的量子位元確實可以一次性容納所有可能答案的某種組合。但你永遠沒法把它們全部讀出來。當你測量時,你只會得到恰好一個答案,而且是按照機率規則隨機選出的。如果故事到此為止,那量子電腦不過是一種極其昂貴的猜答案方式罷了。
那麼,到底是什麼讓量子電腦真正有用?老實說就一個詞:干涉。疊加態裡的每一個可能答案都帶有一個*振幅*——一個可以為正、為負、甚至是複數的數。你讀出某個答案的機率,就是它振幅的平方。整個量子演算法設計的遊戲,就是用量子閘去推動這些振幅,讓指向錯誤答案的振幅互相抵消,而讓指向正確答案的振幅不斷累積。然後——也只有到這時——你才去測量。
放大正確答案
我們把「振幅」講具體些。一個兩態的量子位元寫作 |psi> = alpha|0> + beta|1>,其中 alpha 和 beta 就是振幅。把它們和你實際看到的結果聯繫起來的規則,叫玻恩規則:讀出 0 的機率是 |alpha|^2,讀出 1 的機率是 |beta|^2,而這兩者永遠加起來等於 1(|alpha|^2 + |beta|^2 = 1)。注意 alpha 和 beta 可以是負的。單獨一次測量看不出這個符號——但正是這個符號,讓各條路徑重新匯合時,振幅能夠相加或相減。
把振幅想成水面上的波,因為這個類比在這裡是真的貼切。兩個波峰對齊,會疊成一個更高的波峰——這就是*相長*干涉,它讓某個答案更可能出現。波峰碰上波谷,就會抹平——這就是*相消*干涉,它讓某個答案更不可能出現。所謂「放大正確答案」,就是引導你的量子閘,讓通往正確答案的各條路徑同相到達,就像對齊的波峰那樣,疊加成一個高高的振幅。
Two paths to the SAME answer:
+0.5 ---\
>--- combine ---> +1.0 (bigger: reinforced)
+0.5 ---/
Probability before: 0.5^2 = 0.25 each
Probability after: 1.0^2 = 1.00 <- amplified抵消錯誤答案
抵消是另一半,也正是負號大顯身手的地方。如果兩條路徑都通向同一個錯誤答案,但到達時符號相反——比如 +0.5 和 -0.5——它們相加就是零。這個答案的振幅消失了,於是它的機率(也就是平方)也是零。你根本就永遠測不到它。這一點是古典世界裡沒有對應物的:古典機率在你疊加更多機會時只會往上走,而量子振幅卻能被一路壓到一無所有,因為振幅被允許取負、被允許相減。
Two paths to a WRONG answer:
+0.5 ---\
>--- combine ---> 0.0 (cancelled)
-0.5 ---/
Probability after: 0.0^2 = 0.00 <- this answer is gone振幅放大
當你有意識地、反覆地去做這套「抵消錯的、增強對的」模式時,它有個名字:振幅放大。它的思路是施加一連串量子閘,每一輪都把一點點振幅從錯誤答案那裡挪開、推向正確答案。做一輪,正確答案就稍微更可能一點。重複正確的次數之後,正確答案的振幅長得高高的,其餘的則縮了下去,於是最後一測,多半就把你想要的答案交到你手上。
這正是Grover 搜尋內部的引擎,你下一篇就會遇到它。有個不大卻很要緊的提醒:你不能就這麼沒完沒了地重複下去。振幅放大本質上是一種旋轉,如果你旋轉過頭,就會從目標旁邊*越過去*,正確答案的機率會重新開始下降。存在一個恰到好處的重複次數——大致與條目數量的平方根成正比——而在那裡停手,本身就是演算法的一部分。
One round of amplitude amplification (schematic):
start: all answers equal, right one buried
| small amp on every answer |
[oracle] flip the sign of the right answer
[diffuse] reflect amplitudes about their average
----------------------------------------
after: right answer's amplitude a bit taller,
wrong answers a bit shorter
repeat ~sqrt(N) times, then MEASURE為什麼這不是蠻力窮舉
現在我們可以把加速說精確了,而精確意味著不誇大。Grover 式的振幅放大,在一個含 N 個條目、毫無結構的空間裡搜尋,大約只要 sqrt(N) 步,而不是 N 步。這是一個真實的、已被證明的優勢——但它是二次加速,不是指數加速。在一兆個條目裡搜尋,大約需要一百萬步,而不是一步。它比蠻力窮舉快;但它不是那種「瞬間檢查一切」的蠻力,因為根本沒有誰去檢查一切——錯誤答案是被*抵消*掉的,不是被一一查看的。
更大的、指數級的加速是真實存在的,但很罕見,而且來自另一個源頭:問題裡深刻的數學*結構*。用於分解因數的Shor 演算法就是那個著名的例子——它用量子傅立葉變換,讓一個函數的週期以一種尖銳的干涉圖樣顯現出來,這比 Grover 那種溫柔的輕推要強得多。要點在於:干涉是普適的機制,但你能贏多大,完全取決於問題的結構有多巧妙地讓你去塑造那些振幅。