1. 量子计算基础:量子比特、叠加态与测量原理
说实话,我第一次接触量子比特时,脑子里全是问号。一个比特怎么能同时是0和1?这不科学啊。后来在实验室里调了三个月的光路,我才慢慢理解——量子比特不是「既是0又是1」,而是「以概率幅的方式存在」。嗯,这个区别很关键。
1.1 经典比特 vs 量子比特
经典比特很简单。要么0,要么1。就像开关,开或者关。你写代码时用的 int a = 0,这个a就是经典比特。
量子比特呢?它叫qubit。你可以把它想象成一个旋转的硬币。硬币没落地前,你没法说它是正面还是反面。但量子比特比硬币更「妖」——它可以用数学精确描述。
我习惯用狄拉克符号表示量子态:
|0⟩ 和 |1⟩ 是基态
|ψ⟩ = α|0⟩ + β|1⟩ 是叠加态
这里α和β是复数,叫概率幅。它们满足:|α|² + |β|² = 1。说白了,就是所有可能性的概率加起来等于1。
核心区别一句话:经典比特只能取一个值,量子比特可以「同时」携带多个值的信息。但注意,这个「同时」是带引号的。
1.2 叠加态——量子世界的「超能力」
叠加态是量子计算最反直觉的地方。我刚开始教学生时,总有人问:「那量子比特是不是可以存无限信息?」
答案是否定的。你想想看,一个qubit只有两个基态,α和β只是两个复数。信息量其实有限。但叠加态的真正威力在于——你可以对叠加态做并行操作。
举个例子:
# 一个简单的叠加态制备
import numpy as np
# 初始态 |0⟩
state = np.array([1, 0])
# 哈达玛门:创建叠加态
H = np.array([[1, 1], [1, -1]]) / np.sqrt(2)
superposed_state = H @ state
print(superposed_state)
# 输出: [0.70710678, 0.70710678]
# 这就是 (|0⟩ + |1⟩)/√2
这个态是什么意思?测量时,有50%概率得到0,50%概率得到1。但测量之前,它既不是0也不是1。
我的经验:写代码时别把叠加态想得太玄。你就把它当成一个向量。量子门就是矩阵乘法。一切都很线性代数。
1.3 测量——坍缩的那一刻
测量是量子计算里最「不讲道理」的操作。你测量一个叠加态,它会随机坍缩到某个基态。而且坍缩后,原来的叠加信息就没了。
我曾经犯过一个低级错误:在算法中间测量了qubit,结果后面的量子门全白做了。因为测量破坏了叠加态。
避坑指南:测量是不可逆操作。一旦测量,量子态就「死」了。所以量子算法里,测量通常放在最后一步。
测量规则很简单:
- 态 |ψ⟩ = α|0⟩ + β|1⟩
- 测量得到0的概率 = |α|²
- 测量得到1的概率 = |β|²
- 测量后,态坍缩到测量结果对应的基态
看个代码例子:
import random
def measure(alpha, beta):
"""模拟量子测量"""
prob_0 = abs(alpha)**2
prob_1 = abs(beta)**2
r = random.random()
if r < prob_0:
return 0, (1, 0) # 坍缩到 |0⟩
else:
return 1, (0, 1) # 坍缩到 |1⟩
# 测试:等概率叠加态
result, collapsed = measure(1/np.sqrt(2), 1/np.sqrt(2))
print(f"测量结果: {result}")
print(f"坍缩后状态: {collapsed}")
1.4 布洛赫球——可视化量子态
我习惯用布洛赫球来理解单qubit。说白了,就是把量子态映射到一个球面上。
球面上的每个点对应一个量子态:
- 北极点 = |0⟩
- 南极点 = |1⟩
- 赤道上的点 = 等概率叠加态
这里我画了一张图,帮你建立直观印象:
你看,|0⟩在北极,|1⟩在南极。球面上的其他点都是叠加态。量子门操作,说白了就是在这个球面上旋转。
1.5 多量子比特与纠缠
单qubit只是开胃菜。真正的量子计算需要多个qubit。两个qubit有4个基态:|00⟩, |01⟩, |10⟩, |11⟩。n个qubit有2ⁿ个基态。
这里有个重要的概念——纠缠态。纠缠态就是「你没法单独描述其中一个qubit」的状态。
最经典的纠缠态是贝尔态:
|Φ⁺⟩ = (|00⟩ + |11⟩)/√2
这个态什么意思?你测量第一个qubit,如果得到0,第二个qubit一定是0。如果得到1,第二个一定是1。两个qubit就像「心灵感应」一样。
注意:纠缠不是超光速通信。你没法通过测量一个qubit来向另一个qubit传递信息。爱因斯坦管这叫「鬼魅般的超距作用」,但后来实验证明——它确实存在。
写代码创建贝尔态:
from qiskit import QuantumCircuit, execute, Aer
# 创建2量子比特电路
qc = QuantumCircuit(2, 2)
# 第一个qubit做哈达玛门
qc.h(0)
# CNOT门:控制qubit 0,目标qubit 1
qc.cx(0, 1)
# 测量
qc.measure([0, 1], [0, 1])
# 模拟
backend = Aer.get_backend('qasm_simulator')
result = execute(qc, backend, shots=1000).result()
counts = result.get_counts()
print(counts)
# 应该看到:'00' 和 '11' 各约500次
1.6 实际项目中的坑
我在做量子纠错项目时,遇到过一个问题:测量结果总是不对。查了三天,发现是测量基选错了。
量子测量不是随便测的。你得选一组正交基。常用的有计算基(Z基)和X基。选错了基,你得到的信息就完全不一样。
我的建议:写量子程序前,先想清楚你要测量什么。是测量在Z方向(0/1),还是X方向(+/-)?这个选择会影响整个算法设计。
另一个常见坑是:忘记量子态的归一化。α和β的模平方和必须等于1。我见过有人写代码时,α=1, β=1,结果概率加起来等于2。这明显不对。
1.7 小结
量子比特、叠加态、测量,这三者是量子计算的基石。你想想看:
- 量子比特是信息的载体
- 叠加态让并行计算成为可能
- 测量把量子信息变成经典结果
理解这三者的关系,后面的量子门、量子算法才能学得扎实。我个人觉得,最难的不是数学,而是接受「量子世界就是这样的」这个事实。
嗯,先到这里。代码跑起来,比空想强一百倍。