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⟩ 叠加态 X Z 布洛赫球示意图

你看,|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 小结

量子比特、叠加态、测量,这三者是量子计算的基石。你想想看:

  • 量子比特是信息的载体
  • 叠加态让并行计算成为可能
  • 测量把量子信息变成经典结果

理解这三者的关系,后面的量子门、量子算法才能学得扎实。我个人觉得,最难的不是数学,而是接受「量子世界就是这样的」这个事实。

嗯,先到这里。代码跑起来,比空想强一百倍。


专注资料整理