量子隐形传态可以将一个量子比特的精确状态从一处转移到另一处,而不需要物理搬运这个量子比特本身。该协议只需要三个量子比特、一对共享的纠缠对,以及两个经典比特,用不到三十行 Qiskit 代码就能搭建完成。
这个名字正是围绕这个协议最容易产生误解的地方,所以在写代码之前先把这点说清楚。
隐形传态不是什么
该协议不会移动物质。量子比特对应的物理粒子本身完全不会转移到任何地方。真正移动的是信息:协议结束时,接收方的量子比特会精确处于发送方量子比特最初所在的量子态。
该协议不允许超光速通信。在两个经典比特从发送方送达之前,接收方的量子比特只是无法使用的废数据,而这次传输和其他任何经典信号一样,受光速限制。自然在这一点上非常谨慎:纠缠本身只会让结果产生关联,但永远无法独自携带可控制的信号。
该协议也不会复制量子比特。不可克隆定理禁止一个未知量子态的完美副本与原始态同时存在,隐形传态严格遵守这一点:传输状态的过程本身会摧毁发送方手中的副本。最终只存在一个携带该状态的量子比特,而且接收方手中的量子比特并不是你一开始拥有的那一个。
三步完成协议
- 提前共享纠缠。发送方和接收方各持有一对贝尔对中的一半,这一分发过程在任何人知道要传送哪个状态之前就已完成。
- 发送方对自己手中那一半纠缠对,连同待传送的量子比特,一起进行联合测量(贝尔基测量)。这会产生四种随机双比特结果之一,并作为副作用摧毁原始量子比特的状态。
- 发送方将这两个经典比特发送给接收方,接收方根据结果在自己那一半纠缠对上应用四种对应门之一(恒等、X、Z 或 XZ)。这一修正会重建出精确的原始状态,无论第 2 步中出现的是四种随机结果中的哪一种。
第 2 步中的随机性是真实且不可避免的,而第 3 步中的修正会以确定性的方式将其抵消。这一抵消正是该协议的全部意义所在,也是最容易出错的一步,下文会详细讨论。
在 Qiskit 中搭建电路
三个量子比特:q0 持有待传送的状态,q1 是纠缠对中发送方持有的一半,q2 是接收方持有的一半。
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile
from qiskit_aer import AerSimulator
theta = 0.9 # arbitrary angle, stands in for "an unknown state"
qr = QuantumRegister(3, "q")
cr = ClassicalRegister(2, "c")
result_reg = ClassicalRegister(1, "result")
qc = QuantumCircuit(qr, cr, result_reg)
# Step 0: prepare the state to teleport on q0. In a real protocol
# this state is unknown. Ry(theta) here only gives us something
# concrete to verify against later.
qc.ry(theta, 0)
qc.barrier()
第 1 步:分发纠缠对
qc.h(1)
qc.cx(1, 2)
qc.barrier()
标准的贝尔态构造:一个 Hadamard 门后面接一个 CNOT 门。此时 q1 和 q2 已经最大程度纠缠,在真实部署中它们此时应已被分开:q1 留在发送方,q2 留在接收方,之后协议的其余部分才会运行。
第 2 步:贝尔基测量
qc.cx(0, 1)
qc.h(0)
qc.measure(0, cr[0])
qc.measure(1, cr[1])
qc.barrier()
CNOT 和 Hadamard 门将 q0 与 q1 的联合状态旋转到贝尔基下,因此标准的计算基测量此时读出的正是这对量子比特坍缩到了四个贝尔态中的哪一个。这个结果是均匀随机的,cr[0] 与 cr[1] 四种组合各自出现的概率约为 25%,而修正这种随机性正是下一步要做的事。
第 3 步:经典条件修正
with qc.if_test((cr[1], 1)):
qc.x(2)
with qc.if_test((cr[0], 1)):
qc.z(2)
这是电路中间一个真正的经典条件判断,而不是走捷径:只有当经典比特 cr[1] 测得 1 时,q2 才会被施加 X 门;只有当 cr[0] 测得 1 时,q2 才会被施加 Z 门。Qiskit 的 if_test 上下文管理器会将其编译为一个真正的动态电路,这正是物理部署中通过普通信道发送两个经典比特、并在另一端应用修正所使用的机制。
第 4 步:验证协议是否成功
qc.ry(-theta, 2)
qc.measure(2, result_reg[0])
sim = AerSimulator()
tqc = transpile(qc, sim)
counts = sim.run(tqc, shots=4096).result().get_counts()
print(sorted(counts.items()))
验证技巧:对 q2 施加原始旋转的逆操作,然后测量这个量子比特。如果 q2 最终确实处于 q0 最初所在的精确状态,撤销这次旋转就会把量子比特送回 |0⟩,result 比特读数应为 0。整个运行过程中,四种 (cr[0], cr[1]) 结果的出现比例大致均匀,这正是贝尔测量随机结果的预期表现;而无论出现哪一种结果,result 比特始终读数为 0。这正是回报所在:修正步骤会抵消出现的任何随机结果,每一次都是如此,而不仅仅是平均意义上的抵消。
常见错误:以为"电路反正没问题"就跳过修正步骤
看着这个电路,很容易以为修正步骤只是个无关紧要的细节,因为四种贝尔测量结果里有三种看起来"接近"恒等情况。事实并非如此。跳过 if_test 代码块直接测量 q2:结果只有在贝尔测量恰好落在 |00⟩ 的约 25% 的运行中才是正确的,其余四分之三的时间结果都是错乱的。这里没有部分得分。修正不是一种优化,修正正是让协议具备确定性、而不是沦为四分之一可靠的抛硬币的那个机制。
隐形传态的真正用途
该协议本身并没有作为独立"魔术表演"的应用价值。它的重要性在于其结构性作用:这正是量子网络与分布式量子计算用来在节点之间移动量子比特状态的机制——这些节点仅通过预先共享的纠缠和一条经典信道相连,而不是通过直接的量子连线。任何将独立的 QPU 连接成一台更大逻辑机器的方案,或是将纠缠延伸到长距离光纤链路上的量子中继器,都正是建立在这一基本操作之上。超密编码用一个传输的量子比特发送两个经典比特,正是同一思路的反向应用。
在真实硬件上运行
电路中途测量、紧接着一个经典条件门,这对硬件的要求明显高于静态电路。系统需要快速、低延迟的经典控制电子设备,在量子比特退相干之前读出测量结果并将修正反馈回同一电路,这种能力通常称为"动态电路",并非每一代云端后端都支持。在动态电路不可用的情况下,一些实现会用条件双量子比特门替代经典修正,并将所有测量都推迟到最后进行,这种做法在模拟环境中能正确验证协议的数学原理,但绕开了真正让隐形传态在组网场景中变得实用的那一步经典通信。在真实硬件上运行之前,请先确认你的目标后端是否明确支持动态电路,不要想当然地认为这段代码可以照原样运行。
下一步
- Qiskit SDK 指南:完整的环境搭建、后端选择与动态电路支持
- 量子网络与分布式计算:隐形传态在连接独立 QPU 中扮演的角色
- 术语表:纠缠、贝尔态、超密编码及更多相关词汇