# 纠缠 · 用 CNOT 造一个 Bell 态

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

- 作者：David（道雾轩）
- 专栏：写给程序员的量子计算（https://daiw.org/manual/quantum-computing.md）
- 最后更新：2026-07-14
- 原文：https://daiw.org/manual/quantum-computing/entanglement
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# 纠缠 · 用 CNOT 造一个 Bell 态

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

## 先认识 CNOT：一个双比特门

造纠缠要用一个**双比特门**——**CNOT（受控非门，controlled-NOT）**。它有一个「控制位」和一个「目标位」，规则是：**控制位是 1，就翻转目标位；控制位是 0，什么都不做。** 它的矩阵是 $4\times4$ 的：

$$
\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：

```python
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))
```

```text
Statevector([0.707+0.j, 0.+0.j, 0.+0.j, 0.707+0.j], dims=(2, 2))
```

这个状态是：

$$
\frac{1}{\sqrt{2}}\big(\ket{00} + \ket{11}\big)
$$

只有 $\ket{00}$ 和 $\ket{11}$ 有振幅，$\ket{01}$ 和 $\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 态，验证它们真的绑定：

```python
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 相隔一光年，这个关联依然成立。这就是纠缠「诡异」的地方。

## 纠缠的数学定义：拆不开

[上一章](https://daiw.org/manual/quantum-computing/multi-qubit)说过，能写成 $\ket{a}\otimes\ket{b}$ 的叫可分离态。**纠缠态的定义，就是「拆不开」——不存在任何 $\ket{a}$、$\ket{b}$ 使得 $\frac{1}{\sqrt2}(\ket{00}+\ket{11}) = \ket{a}\otimes\ket{b}$。**

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

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

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

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

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

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

## 小结与下一章

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

到这里，量子计算的「零件」——叠加、门、干涉、多比特、纠缠——都齐了。但作为程序员，你一定在想：这些看不见摸不着、还一测就坍缩的东西，**到底怎么 debug？** 下一站正是本专栏的立身之本。👉 [调试：量子程序怎么 debug](https://daiw.org/manual/quantum-computing/debugging)。

## 参考文献

- [1] Qiskit 官方文档.「Entanglement / Bell states.」https://learning.quantum.ibm.com —— Bell 态构造。
- [2] 「No-communication theorem.」https://en.wikipedia.org/wiki/No-communication_theorem —— 为什么纠缠不能传信。
- [3] Nielsen & Chuang.《Quantum Computation and Quantum Information》， §1.3.7， §2.3 —— 纠缠与可分离性。
