第4章 量子纠缠:Bell态的制备与测量
量子纠缠,说白了就是两个粒子之间那种「心有灵犀」的状态。你测量其中一个,另一个的状态瞬间就确定了——哪怕它们相隔几光年。我第一次接触这个概念时,觉得这简直像魔法。后来在实验室里真正看到纠缠态的数据,才明白这确实是量子世界最硬核的特性之一。
这一章,我们就来亲手制备Bell态,然后测量它。用Python模拟整个过程,看看纠缠到底是怎么工作的。
4.1 Bell态是什么?
Bell态是两量子比特系统中最基本的纠缠态。一共有四种,它们构成了纠缠态的一组正交基。我个人习惯把它们记成下面这样:
| 名称 | 量子态表达式 | 备注 |
|---|---|---|
| Φ⁺ | |00⟩ + |11⟩ | 最常用的Bell态 |
| Φ⁻ | |00⟩ - |11⟩ | 相位相反 |
| Ψ⁺ | |01⟩ + |10⟩ | 两个比特不同 |
| Ψ⁻ | |01⟩ - |10⟩ | 反对称态 |
注意,这里我故意省略了归一化系数1/√2。为什么?因为写代码时我们通常用向量表示,归一化会在计算中自动处理。嗯,这里要提醒一下:实际物理态必须归一化,但模拟时可以先不管,最后再归一。
4.2 制备Bell态的电路
制备Bell态的标准电路很简单:先对第一个比特做Hadamard门,然后做CNOT门。你想想看,这个电路其实就两步:
- H门把|0⟩变成叠加态 (|0⟩ + |1⟩)/√2
- CNOT门把叠加态「扩散」到第二个比特上
结果就是|00⟩ + |11⟩,也就是Φ⁺态。我在项目中遇到过有人把H门和CNOT的顺序搞反,结果得到的是可分离态,根本不是纠缠。这个坑我踩过,所以特别提醒你。
4.3 Python模拟Bell态制备
我们用NumPy来模拟这个过程。为什么不用Qiskit?因为我想让你看到最底层的数学运算,而不是黑盒调用。
import numpy as np
# 定义量子门
H = 1/np.sqrt(2) * np.array([[1, 1], [1, -1]])
CNOT = np.array([[1,0,0,0],
[0,1,0,0],
[0,0,0,1],
[0,0,1,0]])
# 初始态 |00⟩
psi0 = np.array([1, 0, 0, 0])
# 第一步:对第一个比特做H门
# 注意:H门作用在第一个比特上,需要用张量积扩展
H_on_first = np.kron(H, np.eye(2))
psi1 = H_on_first @ psi0
# 第二步:CNOT门
psi_bell = CNOT @ psi1
print("Bell态 Φ⁺ 的向量表示:")
print(psi_bell)
print("\n概率幅:")
print(np.abs(psi_bell)**2)
运行这段代码,你会看到输出是[0.707, 0, 0, 0.707],对应|00⟩和|11⟩各占50%概率。这就是纠缠态——两个比特要么都是0,要么都是1,没有中间状态。
4.4 测量Bell态
测量纠缠态时,有趣的事情发生了。你测量第一个比特,得到0或1的概率各50%。但一旦你知道了第一个比特的结果,第二个比特的结果就完全确定了。
我建议用下面的代码来模拟测量过程:
def measure(psi, qubit_index):
"""
测量指定量子比特
返回测量结果和坍缩后的态
"""
n_qubits = int(np.log2(len(psi)))
# 计算测量概率
if qubit_index == 0:
prob_0 = np.sum(np.abs(psi[0:2])**2)
else:
prob_0 = np.sum(np.abs(psi[0::2])**2)
# 随机选择测量结果
result = 0 if np.random.random() < prob_0 else 1
# 坍缩到对应子空间
if result == 0:
if qubit_index == 0:
collapsed = psi[0:2] / np.sqrt(prob_0)
else:
collapsed = psi[0::2] / np.sqrt(prob_0)
else:
if qubit_index == 0:
collapsed = psi[2:4] / np.sqrt(1 - prob_0)
else:
collapsed = psi[1::2] / np.sqrt(1 - prob_0)
return result, collapsed
# 测试测量
result1, psi_after = measure(psi_bell, 0)
print(f"第一个比特测量结果: {result1}")
print(f"坍缩后的态: {psi_after}")
# 测量第二个比特
result2, _ = measure(psi_after, 1)
print(f"第二个比特测量结果: {result2}")
运行多次,你会发现两个结果总是相同。这就是纠缠的威力——不是概率上的相关,而是确定性的一致。
4.5 纠缠的验证:Bell不等式
怎么证明你制备的确实是纠缠态?用Bell不等式。简单来说,如果两个比特是纠缠的,在某些测量角度下,它们之间的相关性会超过经典物理的极限。
我这里给出一个简化的验证方法:
def check_entanglement(psi, num_trials=1000):
"""
通过测量不同基下的相关性来验证纠缠
"""
# 在Z基下测量
results_z = []
for _ in range(num_trials):
r1, _ = measure(psi, 0)
r2, _ = measure(psi, 1)
results_z.append(r1 == r2)
# 在X基下测量(需要先做H门变换)
H_on_both = np.kron(H, H)
psi_x = H_on_both @ psi
results_x = []
for _ in range(num_trials):
r1, _ = measure(psi_x, 0)
r2, _ = measure(psi_x, 1)
results_x.append(r1 == r2)
print(f"Z基下相关性: {np.mean(results_z):.3f}")
print(f"X基下相关性: {np.mean(results_x):.3f}")
# 纠缠态应该在两个基下都表现出强相关性
if np.mean(results_z) > 0.9 and np.mean(results_x) > 0.9:
print("✅ 确认:这是纠缠态")
else:
print("❌ 不是纠缠态,或者测量有误")
check_entanglement(psi_bell)
你会发现,Bell态在Z基和X基下的相关性都接近100%。而经典关联最多只能在一个基下达到100%,另一个基下会降低。这就是量子纠缠超越经典的地方。
4.6 知识体系总览
下面这张图展示了本章的核心逻辑:从量子门出发,经过Bell态制备电路,再到测量验证,最后用Bell不等式确认纠缠。
从这张图你可以看到,整个流程是线性的:初始态经过H门和CNOT门变成Bell态,然后分别在Z基和X基下测量,最后通过相关性分析验证纠缠。每一步都有明确的数学对应,这也是为什么我坚持用NumPy模拟——你能看到每个门的作用,而不是把一切交给黑盒。
4.7 实际应用中的注意事项
在实际的量子计算中,制备Bell态看起来简单,但真正做起来有很多坑。我总结了几点:
- 退相干问题:纠缠态非常脆弱,环境噪声会迅速破坏纠缠。在超导量子计算机上,Bell态的保真度通常只能维持几十微秒。
- 门保真度:H门和CNOT门本身有误差。如果门保真度只有99%,那么制备100次Bell态,可能只有90次是真正的纠缠态。
- 测量误差:测量过程本身也会引入错误。有时候你测到|00⟩,但实际态可能是|11⟩。
好了,这一章的内容就到这里。你学会了如何用Python模拟Bell态的制备和测量,也理解了纠缠的本质。下一章我们会继续深入,看看纠缠在量子隐形传态中是怎么发挥作用的。
公众号:蓝海资料掘金营,微信deep3321