為什麼耦合必須是可開關的
再好的單個量子位元,也只能做單位元操作。要執行真正的演算法,你需要雙量子位元閘——也就是兩個量子位元交換資訊的時刻。為此,量子位元之間必須*耦合*:必須存在一條讓能量或相位從一個流向另一個的通道。
問題在這裡。你希望這種耦合在閘所需的那幾十奈秒裡很強,之後則消失。常開的耦合會在你想讓兩個量子位元各自靜止時仍不斷推擠它們,慢慢破壞程式。所以設計目標不是「把量子位元耦合起來」,而是「只在需要時耦合」。
在超導晶片上實現這種開關行為,最常見的辦法是可調耦合器:一個坐落在兩個量子位元之間的小附加電路,它自身的頻率可以用控制訊號來移動。往一個方向調,兩個量子位元就交談;往另一個方向調,它們的交互作用就抵消到接近於零。
畫出來:兩個量子位元加一個耦合器
標準佈局是一排三個電路:量子位元、耦合器、量子位元。兩個量子位元並不直接相連,而是各自與中間元件耦合,而中間元件的頻率決定了它們最終能相互感受到多少。
g1 g2
Q1 -----[ COUPLER ]----- Q2
(qubit) (tunable (qubit)
frequency)
|
| flux/control line
v
set coupler freq -> effective Q1<->Q2 coupling J_eff
J_eff(on) : large -> two-qubit gate runs
J_eff(off) : ~0 -> qubits left alone
g1, g2 = fixed couplings from each qubit to the coupler
J_eff = net coupling the two qubits actually feel中間元件之所以能把耦合關掉,靠的是干涉。兩個量子位元實際上同時沿兩條路徑耦合:直接路徑(它們之間一條微弱的固定洩漏)與間接路徑(經過耦合器)。當你把耦合器頻率調到合適的點,這兩條路徑互相抵消。淨耦合 J_eff——量子位元真正感受到的唯一量——便穿過零點。
兩個敵人:常開 ZZ 與串擾
即便耦合器名義上「關閉」,通常仍有殘餘交互作用存活。最麻煩的一種叫 ZZ 耦合:一個量子位元的頻率會隨著它鄰居是 0 還是 1 而輕微移動。它很小,卻從不休息——每個空閒的量子位元都會慢慢累積一份不想要、且依賴鄰居的相位,這就表現為閘誤差。
idle ZZ error, intuitively:
phase picked up ~ (residual ZZ rate) x (idle time)
residual ZZ rate : how much a qubit's frequency
shifts per the state of its neighbour
(units: cycles per second)
idle time : how long the qubit waits between gates
smaller residual ZZ -> less junk phase per microsecond
a tunable coupler is tuned to push residual ZZ toward 0第二個敵人是訊號串擾:本應作用於某個量子位元的控制脈衝,也會傳到它的鄰居。在擁擠的晶片上,連線與量子位元本身在物理上很近,於是微波驅動會向旁邊「洩漏」。你想定址的那個量子位元會正確移動;你本想放著不動的那些則被輕輕地、意外地踢了一下。
連接性:誰能和誰交談
耦合器在晶片面積、連線與額外串擾上都很昂貴,所以晶片不會把每個量子位元都連到其他每一個。相反,每個量子位元只與少數幾個鄰居相連。哪些量子位元共享一個耦合器,這張圖就是晶片的連接性,它在晶片製造出來那天就固定在矽裡了。
一種流行的佈局是重六邊形點陣:每個量子位元刻意只接觸兩到三個鄰居。更稀疏的連接意味著每個量子位元周圍擁擠的耦合器更少,從而壓低 ZZ 與串擾——但這也意味著大多數量子位元對之間*並不*直接相連。
當演算法需要兩個量子位元互相作用、它們卻不是鄰居時,編譯器會插入 SWAP(交換)操作:把一個量子位元的狀態在晶片上一跳一跳地挪動,直到它緊挨著搭檔。每次 SWAP 本身又由若干雙量子位元閘組成,因此耗時並引入誤差。有限的連接性不會讓程式變得不可能——只會讓它變長。
- 編譯器讀取某個閘需要哪兩個量子位元,並查閱晶片的連接性圖。
- 如果它們已是鄰居,就直接執行雙量子位元閘。
- 如果不是,就插入 SWAP,把一個狀態沿點陣挪向另一個——每一跳都要額外的閘與時間。
- 閘做完後,它可能把量子位元換回去,也可能讓它們保持挪動後的位置並據此重新規劃。