可逆操作
經典電腦時時刻刻都在丟棄資訊。一個 AND 閘吃進兩個位元、吐出一個位元——一旦你看到輸出是 0,就無法分辨是三種輸入中的哪一種產生了它。丟失的那部分資訊以熱的形式散掉。量子閘則不同:每個量子閘都是可逆的。無論它做了什麼,總有另一個閘能把它精確地撤銷,讓量子位元回到出發時的樣子。
可逆性不是一種設計選擇——它是物理規律強加的。在兩次測量之間,量子位元按照一套從不丟失其來歷的規則演化,所以一個閘只能重新排布量子態,絕不會抹掉其中一部分。資訊真正塌縮的唯一時刻是測量,那是一個獨立的、不可逆的步驟,我們只在最後才執行它。
單量子位元閘
最簡單的閘一次只作用在一個量子位元上。單個量子位元的狀態由兩個數完全描述——它含有多少 |0> 成分、多少 |1> 成分,包括兩者之間的相對相位。一個單量子位元閘,無非就是一個固定的配方:把這兩個數吃進去,再吐出兩個新的數。由於閘是可逆的,這個配方總能反過來執行。
我們用括號記法 |0> 和 |1> 來寫輸入態和輸出態。作用在 |0> 上的一個閘,可能讓它保持不變、把它翻轉成 |1>,或者把兩者混成一個疊加態。下面的記法從左往右讀:閘的名字、右邊的輸入,以及箭頭之後的結果。
X|0> = |1> # X flips 0 to 1 X|1> = |0> # ...and 1 back to 0 Z|0> = |0> # Z leaves 0 alone Z|1> = -|1> # ...but flips the sign of 1
阿達馬閘
阿達馬閘(記作 H)是製造疊加的主力。給它一個 |0>,它會產生 |0> 與 |1> 的等權混合;給它一個 |1>,它會產生類似的混合,但內部帶著不同的符號。經過一次 H 之後,量子位元以一種精確、可被完整描述的方式,真正懸在 0 與 1 之間。
H|0> = (|0> + |1>)/sqrt(2) # equal superposition H|1> = (|0> - |1>)/sqrt(2) # equal mix, opposite sign H(H|0>) = |0> # H is its own inverse
包立閘(X、Y、Z)
包立閘是三種最基本的單量子位元操作。X 是量子版的 NOT:它交換 |0> 與 |1>。Z 是相位翻轉:它保留 |0>、卻翻轉 |1> 上的符號。Y 一次性兼做兩者——既翻轉位元,又翻轉相位。加上恆等閘(什麼都不做),這三個閘就是拼寫出大量單量子位元邏輯所用的字母表。
- X(位元翻轉):交換 |0> 與 |1>。這是最接近經典 NOT 閘的操作。
- Z(相位翻轉):保持 |0> 不變,翻轉 |1> 的符號。它單獨看不出來,卻在干涉中起決定性作用。
- Y(位元與相位翻轉):把一次 X 和一次 Z 合在一起施加的綜合效果。
- 每個包立閘都是自身的逆:把其中任意一個連用兩次,量子位元就回到出發時的狀態。
把閘看作旋轉
有一幅優美的幾何圖像把這一切串在一起。任何單個量子位元的狀態,都可以畫成一個箭頭,指向一個球面上的某處——這就是布洛赫球。在這幅圖像裡,每個單量子位元閘都不過是對那個箭頭做一次旋轉。X 是繞某根軸轉半圈,Z 是繞另一根軸轉半圈,而 H 則是一次把兩根軸對調的旋轉。可逆性變得一目了然:你總可以轉回去。
這也解釋了為什麼閘能如此乾淨地組合:先做一個閘、再做一個閘,無非就是先轉一次、再轉一次,而合起來的動作又是一次旋轉。要構建一個完整的演算法,你就把一連串這樣的旋轉——再加上至少一個用來製造糾纏的雙量子位元閘——排進一個量子電路裡。這樣一小套固定的閘,就已經足以表達任何量子計算。