纠缠 · 用 CNOT 造一个 Bell 态

纠缠是量子计算最著名也最被误解的现象。这一章用一个 CNOT 门亲手造出 Bell 态,验证「测一个就瞬间确定另一个」,讲清纠缠的数学定义(拆不开的态),并戳破那个流传最广的误解:纠缠不能用来超光速通信。

作者 David更新于 第 7 篇(共 15 篇)

纠缠 · 用 CNOT 造一个 Bell 态

纠缠(entanglement)大概是量子世界里名气最大、也被误解最深的词。爱因斯坦嫌它诡异,叫它「鬼魅般的超距作用」。但对程序员,纠缠可以很具体:两行代码造出来,打印状态验证,亲眼看它「拆不开」。 这一章就这么祛魅。

先认识 CNOT:一个双比特门

造纠缠要用一个双比特门——CNOT(受控非门,controlled-NOT)。它有一个「控制位」和一个「目标位」,规则是:控制位是 1,就翻转目标位;控制位是 0,什么都不做。 它的矩阵是 4×44\times4 的:

CNOT=[1000010000010010]\text{CNOT} = \begin{bmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&0&1 \\ 0&0&1&0 \end{bmatrix}

Qiskit 里是 qc.cx(控制位, 目标位)。单独看它平平无奇(就是个「条件翻转」);但把它接在一个叠加态后面,魔法就来了。

两行代码,造一个 Bell 态

经典的纠缠态叫 Bell 态,配方只有两步:qubit 0 过 H(造叠加),再用它当控制位对 qubit 1 做 CNOT:

from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector

qc = QuantumCircuit(2)
qc.h(0)          # qubit 0 → 叠加 (|0⟩+|1⟩)/√2
qc.cx(0, 1)      # 以 qubit 0 为控制,翻转 qubit 1
print(Statevector(qc))
Statevector([0.707+0.j, 0.+0.j, 0.+0.j, 0.707+0.j], dims=(2, 2))

这个状态是:

12(∣00⟩+∣11⟩)\frac{1}{\sqrt{2}}\big(\ket{00} + \ket{11}\big)

只有 ∣00⟩\ket{00} 和 ∣11⟩\ket{11} 有振幅,∣01⟩\ket{01} 和 ∣10⟩\ket{10} 都是 0。含义惊人:两个 qubit 要么都是 0,要么都是 1,绝不会一个 0 一个 1。 想想 CNOT 干了啥:qubit 0 是叠加(一半 0 一半 1),CNOT 让 qubit 1「跟随」qubit 0——0 的分支里 q1 还是 0,1 的分支里 q1 被翻成 1。于是两个 qubit 被绑定在了一起。

测量:测一个,另一个就定了

测一下这个 Bell 态,验证它们真的绑定:

qc.measure_all()
# counts → {'00': 503, '11': 497}     只有 00 和 11,从不出现 01 或 10

每次测量,两个 qubit 的结果永远相同。 而且——注意——测量 qubit 0 的瞬间,qubit 1 的值就被确定了:qubit 0 塌缩成 0,qubit 1 必定也是 0;塌缩成 1,qubit 1 也必定是 1。哪怕这两个 qubit 相隔一光年,这个关联依然成立。这就是纠缠「诡异」的地方。

纠缠的数学定义:拆不开

上一章说过,能写成 ∣a⟩⊗∣b⟩\ket{a}\otimes\ket{b} 的叫可分离态。纠缠态的定义,就是「拆不开」——不存在任何 ∣a⟩\ket{a}、∣b⟩\ket{b} 使得 12(∣00⟩+∣11⟩)=∣a⟩⊗∣b⟩\frac{1}{\sqrt2}(\ket{00}+\ket{11}) = \ket{a}\otimes\ket{b}。

为什么拆不开就「诡异」?因为「拆得开」意味着两个 qubit 各有各的独立状态,你可以分别描述它们。而 Bell 态拆不开,意味着你无法单独描述其中任何一个 qubit 的状态——它俩只有一个「整体」的状态,个体状态无从谈起。测量一个之所以立刻影响另一个,正是因为它们从来就不是两个独立的东西,而是一个不可分割的整体。纠缠不是「两个 qubit 之间有根看不见的线」,而是「它们压根不是两个独立个体」。

戳破最大的误解:纠缠不能超光速通信

这是全网流传最广、也最该被纠正的误解,必须讲清:

纠缠不能用来传递信息,更不能超光速通信。 听起来 Bell 态可以「瞬间影响一光年外的 qubit」,像是超光速传信?不能。 关键在于:你无法控制自己这端测出的是 0 还是 1——它是随机的(各 50%)。你在这端测,得到一个随机的 0 或 1;远端的人在他那端测,也得到一个随机的 0 或 1。只有当两人事后把结果拿到一起对比,才会发现「咦,我们的结果总是一样的」。

但「事后对比」需要一条经典信道(打电话、发消息),而它逃不过光速。在对比之前,远端的人看到的只是一串随机 0/1,从中读不出你这边做了什么、更收不到任何你想发的消息。 关联(correlation)不等于信号(signaling)——这是量子力学的铁律(no-communication 定理)。所以:纠缠很神奇,但它不违反相对论,也造不出「量子对讲机」。祛魅完毕。

那纠缠有什么实际用处?它是量子隐形传态(teleportation)、超密编码的核心资源,也是很多量子算法里 qubit 之间「协同」的基础。没有纠缠,量子计算机的能力会大打折扣——它是让 qubit 从「一堆各自叠加的个体」变成「一个协同整体」的关键。

小结与下一章

纠缠可以两行代码造出来:H + CNOT 得到 Bell 态 12(∣00⟩+∣11⟩)\frac{1}{\sqrt2}(\ket{00}+\ket{11}),测量恒为 00 或 11。它的数学本质是「拆不开」——两个 qubit 不再是独立个体,而是一个整体。但记牢:关联 ≠ 通信,纠缠不能超光速传信。它是隐形传态等协议的核心资源。

到这里,量子计算的「零件」——叠加、门、干涉、多比特、纠缠——都齐了。但作为程序员,你一定在想:这些看不见摸不着、还一测就坍缩的东西,到底怎么 debug? 下一站正是本专栏的立身之本。👉 调试:量子程序怎么 debug。

参考文献

本页目录