为什么耦合必须是可开关的
再好的单个量子比特,也只能做单比特操作。要运行真正的算法,你需要双量子比特门——也就是两个量子比特交换信息的时刻。为此,量子比特之间必须*耦合*:必须存在一条让能量或相位从一个流向另一个的通道。
问题在这里。你希望这种耦合在门所需的那几十纳秒里很强,之后则消失。常开的耦合会在你想让两个量子比特各自静止时仍不断推搡它们,慢慢破坏程序。所以设计目标不是“把量子比特耦合起来”,而是“只在需要时耦合”。
在超导芯片上实现这种开关行为,最常见的办法是可调耦合器:一个坐落在两个量子比特之间的小附加电路,它自身的频率可以用控制信号来移动。往一个方向调,两个量子比特就交谈;往另一个方向调,它们的相互作用就抵消到接近于零。
画出来:两个量子比特加一个耦合器
标准布局是一排三个电路:量子比特、耦合器、量子比特。两个量子比特并不直接相连,而是各自与中间元件耦合,而中间元件的频率决定了它们最终能相互感受到多少。
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,把一个状态沿点阵挪向另一个——每一跳都要额外的门和时间。
- 门做完后,它可能把量子比特换回去,也可能让它们保持挪动后的位置并据此重新规划。