Python 与量子计算初级教程

用 Python 代码亲手实现量子计算的核心概念——从量子比特到量子算法。本教程将量子力学原理与 Python 编程相结合,通过可运行的代码和交互式可视化,让你真正理解量子计算的数学本质。

Python 实战量子计算交互式可视化8 章内容

1Python 环境搭建

开始量子计算编程之前,我们需要搭建好 Python 环境。本教程使用 NumPy 进行矩阵运算,用纯 Python 模拟量子系统。

安装依赖

bash# 安装核心依赖
pip install numpy matplotlib

# 可选:安装 Qiskit(IBM 量子计算框架)
pip install qiskit qiskit-aer

核心工具

NumPy:用于复数数组和矩阵运算,是量子计算模拟的基础。

Matplotlib:用于绘制量子态、概率分布等可视化图表。

Qiskit(可选):IBM 开源的量子计算 SDK,可在真实量子计算机上运行电路。

pythonimport numpy as np

# 验证环境
print(f"NumPy 版本: {np.__version__}")
print("环境就绪!开始量子计算之旅 🚀")
NumPy 版本: 1.26.4 环境就绪!开始量子计算之旅 🚀
本教程的所有代码都可以直接用 Python 运行。即使不安装 Qiskit,用 NumPy 也能完整模拟量子计算的核心原理。

本章小结

  • NumPy 是量子计算模拟的基础工具
  • 复数数组和矩阵运算是核心操作
  • Qiskit 提供了更高层的量子电路抽象

2量子比特与 Python

经典比特只能是 0 或 1,而量子比特(qubit)可以同时处于 0 和 1 的叠加态。我们用 Python 中的复数数组来表示量子态。

量子态的数学表示

|ψ⟩ = α|0⟩ + β|1⟩
其中 α, β ∈ ℂ,|α|² + |β|² = 1
pythonimport numpy as np

# 基态 |0⟩ 和 |1⟩
ket_0 = np.array([1, 0], dtype=complex)
ket_1 = np.array([0, 1], dtype=complex)

# 叠加态 |+⟩ = (|0⟩ + |1⟩) / √2
ket_plus = np.array([1, 1], dtype=complex) / np.sqrt(2)

print("|0⟩ =", ket_0)
print("|1⟩ =", ket_1)
print("|+⟩ =", np.round(ket_plus, 4))

# 验证归一化
print(f"|+⟩ 归一化: {np.sum(np.abs(ket_plus)**2):.4f}")
|0⟩ = [1.+0.j 0.+0.j] |1⟩ = [0.+0.j 1.+0.j] |+⟩ = [0.7071+0.j 0.7071+0.j] |+⟩ 归一化: 1.0000

🔬 互动实验:量子态可视化

调节 α 和 β 的幅度,观察量子态在布洛赫球赤道面上的投影和测量概率。

|α|² = 0.50
|β|² = 0.50
归一化 = 1.00
α=0.71, β=0.71 → 等概率叠加态 |+⟩

本章小结

  • 量子比特用复数数组 [α, β] 表示
  • 归一化条件:|α|² + |β|² = 1
  • |α|² 和 |β|² 分别是测量得到 |0⟩ 和 |1⟩ 的概率
  • NumPy 的 complex 数组是模拟量子态的基础

3量子门与矩阵运算

量子门是对量子态的操作,数学上是酉矩阵(Unitary Matrix)。用 Python 实现量子门就是做矩阵乘法。

基本量子门

pythonimport numpy as np

# Pauli-X 门(量子 NOT 门)
X = np.array([[0,1],[1,0]], dtype=complex)

# Hadamard 门(创建叠加态)
H = np.array([[1,1],[1,-1]], dtype=complex) / np.sqrt(2)

# Pauli-Y, Pauli-Z 门
Y = np.array([[0,-1j],[1j,0]], dtype=complex)
Z = np.array([[1,0],[0,-1]], dtype=complex)

# 用 Hadamard 门创建叠加态
ket_0 = np.array([1, 0], dtype=complex)
ket_plus = H @ ket_0  # 矩阵乘法
print("H|0⟩ =", np.round(ket_plus, 4))

# X 门翻转 |0⟩ → |1⟩
ket_1 = X @ ket_0
print("X|0⟩ =", ket_1)
H|0⟩ = [0.7071+0.j 0.7071+0.j] X|0⟩ = [0.+0.j 1.+0.j]

🔬 互动实验:量子门效果对比

选择不同量子门,观察它对量子态的变换效果。

选择量子门和输入态,观察输出

🎵 量子门口诀
X门翻转0和1,H门造叠加
Z门改相位,Y门又翻又改
矩阵乘法作用态,酉矩阵保归一

本章小结

  • 量子门是酉矩阵,用 NumPy 二维数组表示
  • 量子门作用于量子态 = 矩阵乘法(@ 运算符)
  • X门=NOT,H门=创建叠加,Z门=相位翻转
  • 酉矩阵保证变换后量子态仍然归一化

4布洛赫球可视化

布洛赫球是表示单量子比特状态的几何工具。球面上的每个点对应一个合法的量子态。用 Python 可以计算并绘制布洛赫球上的状态向量。

布洛赫向量计算

pythondef bloch_vector(alpha, beta):
    """计算量子态 [alpha, beta] 的布洛赫向量"""
    x = 2 * np.real(np.conj(alpha) * beta)
    y = 2 * np.imag(np.conj(alpha) * beta)
    z = np.abs(alpha)**2 - np.abs(beta)**2
    return x, y, z

# |0⟩ → 北极 (0, 0, 1)
print("|0⟩:", bloch_vector(1, 0))
# |+⟩ → 赤道 (1, 0, 0)
print("|+⟩:", bloch_vector(1/np.sqrt(2), 1/np.sqrt(2)))
|0⟩: (0.0, 0.0, 1.0) |+⟩: (1.0, 0.0, 0.0)

🔬 互动实验:布洛赫球交互探索

调节 θ 和 φ 角度,观察量子态在布洛赫球上的位置变化。

|ψ⟩ = cos(θ/2)|0⟩ + esin(θ/2)|1⟩
布洛赫向量 = (1.00, 0.00, 0.00)
θ=90°, φ=0° → |+⟩ 态(赤道,x轴正方向)

本章小结

  • 布洛赫球用球面几何表示单量子比特态
  • 北极=|0⟩,南极=|1⟩,赤道=等幅叠加态
  • θ 控制 |0⟩/|1⟩ 概率比,φ 控制相对相位
  • Python 可轻松计算布洛赫向量并可视化

5量子纠缠编程

量子纠缠是多量子比特系统中最神奇的现象。用 Python 的张量积(tensor product)可以构建多量子比特态。

创建 Bell 态

pythondef tensor(a, b):
    """张量积"""
    return np.kron(a, b)

# Hadamard 门 + CNOT → Bell 态
H = np.array([[1,1],[1,-1]]) / np.sqrt(2)
CNOT = np.array([[1,0,0,0],
                 [0,1,0,0],
                 [0,0,0,1],
                 [0,0,1,0]], dtype=complex)

# |Φ+⟩ = (|00⟩ + |11⟩) / √2
ket_00 = tensor(np.array([1,0]), np.array([1,0]))
state = CNOT @ tensor(H @ np.array([1,0]), np.array([1,0]))
print("Bell态 |Φ+⟩ =", np.round(state, 4))
print("P(00) =", abs(state[0])**2)
print("P(11) =", abs(state[3])**2)
Bell态 |Φ+⟩ = [0.7071+0.j 0.+0.j 0.+0.j 0.7071+0.j] P(00) = 0.5000000000000001 P(11) = 0.5000000000000001

🔬 互动实验:Bell 态纠缠演示

选择四种 Bell 态之一,观察纠缠粒子对的测量关联。

粒子A = -
粒子B = -
关联:-
点击"测量"观察纠缠关联

本章小结

  • 多量子比特态用张量积构建
  • CNOT 门 + Hadamard 门可创建 Bell 态
  • 纠缠态的测量结果高度关联
  • np.kron() 是 Python 中计算张量积的函数

6量子测量与统计

测量使量子态坍缩到某个基态,概率由振幅的模方决定。用 Python 的 random 模块可以模拟量子测量的随机性。

模拟量子测量

pythonimport numpy as np

def measure(state, shots=1000):
    """模拟量子测量 shots 次"""
    probs = np.abs(state)**2
    results = np.random.choice(len(state), size=shots, p=probs)
    counts = {}
    for r in results:
        key = format(r, f'0{int(np.log2(len(state)))}b')
        counts[key] = counts.get(key, 0) + 1
    return counts

# 测量叠加态 |+⟩
ket_plus = np.array([1, 1]) / np.sqrt(2)
counts = measure(ket_plus, shots=1000)
print("测量结果:", counts)
测量结果: {'0': 498, '1': 502}

🔬 互动实验:量子测量统计

设置量子态参数,运行1000次测量,观察统计分布。

点击"运行测量"观察统计结果

本章小结

  • 测量使量子态坍缩,结果具有随机性
  • 概率 = 振幅的模方:P(i) = |αᵢ|²
  • 大量测量的统计分布趋近理论概率
  • Python 的 np.random.choice 可模拟测量

7Deutsch 算法 Python 实现

Deutsch 算法是第一个展示量子计算优势的算法——只需1次查询就能判断函数是常数还是平衡的,而经典计算需要2次。

pythondef deutsch_algorithm(oracle):
    """Deutsch 算法:判断 f 是常数还是平衡函数"""
    # 初始态 |01⟩
    state = np.kron(np.array([1,0]), np.array([0,1]))
    # 对两个量子比特都加 H 门
    HH = np.kron(H, H)
    state = HH @ state
    # 应用 oracle(酉矩阵)
    state = oracle @ state
    # 对第一个量子比特加 H 门
    HI = np.kron(H, np.eye(2))
    state = HI @ state
    # 测量第一个量子比特
    prob_0 = np.abs(state[0])**2 + np.abs(state[1])**2
    return "常数函数" if prob_0 > 0.9 else "平衡函数"

🔬 互动实验:Deutsch 算法演示

选择不同类型的函数,观察 Deutsch 算法如何仅用1次查询就判断函数类型。

选择函数类型并运行算法

本章小结

  • Deutsch 算法是量子计算优势的 simplest 展示
  • 量子:1次查询 | 经典:2次查询
  • 核心思想:量子并行性 + 干涉
  • Python 可以用矩阵运算完整模拟该算法

8Grover 搜索 Python 实现

Grover 算法可以在 O(√N) 次查询内从 N 个元素中找到目标,比经典的 O(N) 快得多。我们用 Python 实现 2-qubit Grover(从4个元素中搜索)。

pythondef grover_search(target, n_qubits=2):
    """Grover 搜索算法"""
    N = 2**n_qubits
    # 初始均匀叠加态
    state = np.ones(N, dtype=complex) / np.sqrt(N)
    # Oracle: 翻转目标态的相位
    oracle = np.eye(N, dtype=complex)
    oracle[target, target] = -1
    # 扩散算子
    s = np.ones((N,N), dtype=complex) / N
    diffusion = 2 * s - np.eye(N)
    # 迭代 ≈ π√N/4 次
    iterations = int(np.pi * np.sqrt(N) / 4)
    for _ in range(iterations):
        state = oracle @ state
        state = diffusion @ state
    return np.abs(state)**2

🔬 互动实验:Grover 搜索可视化

选择目标元素,观察 Grover 算法如何通过振幅放大逐步提升目标概率。

选择目标并运行 Grover 搜索

🏆 闯关练习

1. 量子比特与经典比特的核心区别是?

2. Hadamard 门作用于 |0⟩ 的结果是?

3. Grover 算法的查询复杂度是?

🎵 Python 量子计算口诀
NumPy 数组表量子态,复数数组是根基
H门造叠加,CNOT造纠缠
测量概率模方算,统计算法验证快
Deutsch一次定常数,Grover根号搜目标

教程总结

  • 用 Python/NumPy 可以完整模拟量子计算
  • 量子态=复数数组,量子门=酉矩阵,测量=概率采样
  • 多量子比特用张量积构建,纠缠是核心资源
  • Deutsch 和 Grover 算法展示了量子计算优势