1. 量子态数据建模:从狄拉克符号到可计算数组
任务对象与符号约定
本例给定一个两能级量子态(单量子比特)的狄拉克符号描述:
|ψ⟩ = (1/2)|0⟩ + (√3/2)|1⟩
目标是把它映射为可计算的数值向量,并验证归一化条件。建模前先固定三条约定,后续正文、代码与图示保持一致:
- 基矢顺序:计算基按 |0⟩、|1⟩ 排列,即索引 0 对应 |0⟩,索引 1 对应 |1⟩。
- 系数含义:|ψ⟩ = α|0⟩ + β|1⟩ 中 α、β 为复数振幅,向量表示为 [α, β]。
- 归一化判据:⟨ψ|ψ⟩ = |α|² + |β|² = 1,允许的数值误差取 1e-9。
本例的振幅均为实数,因此向量可直接写成 [0.5, 0.8660254037844386];若振幅含虚部,则需用复数数组表示,验证时取模平方。
符号到数组的映射关系
狄拉克符号与数组之间不是简单“去掉括号”,而是三层对应:基矢对应数组下标,振幅对应数组元素,内积对应向量模平方和。下图给出这一映射链以及归一化验证的判读路径。
可运行的转换与验证实现
下面用 Python 完成三件事:把符号描述写成振幅数组、计算归一化残差、输出可直接复用的结果。代码不依赖第三方库,仅用标准库 math,便于在任何环境复现。
import math
# 1) 符号层:按 |0⟩、|1⟩ 顺序给出复数振幅 (实部, 虚部)
amplitudes = [
(0.5, 0.0), # α:|0⟩ 的振幅
(math.sqrt(3) / 2, 0.0), # β:|1⟩ 的振幅
]
# 2) 映射为可计算数组:实部数组与虚部数组分离,便于后续线性代数运算
real = [a[0] for a in amplitudes]
imag = [a[1] for a in amplitudes]
psi = [complex(r, i) for r, i in amplitudes]
# 3) 归一化验证:⟨ψ|ψ⟩ = Σ |a_i|^2
norm_sq = sum(abs(a) ** 2 for a in psi)
tolerance = 1e-9
residual = abs(norm_sq - 1.0)
print("psi =", psi)
print("norm_sq =", norm_sq)
print("residual =", residual)
print("normalized =", residual <= tolerance)
# 4) 由振幅直接得到测量概率(|0⟩、|1⟩ 的计算基概率)
probs = [abs(a) ** 2 for a in psi]
print("probs =", probs, "sum =", sum(probs))
预期输出(由给定输入直接推出,非实测):
psi = [(0.5+0j), (0.8660254037844386+0j)]
norm_sq = 1.0
residual = 0.0
normalized = True
probs = [0.25, 0.75] sum = 1.0
注意 math.sqrt(3)/2 在浮点下与 0.75 的平方和恰好落在 1.0 附近,残差通常为 0 或极小值;判断时始终用容差比较,不要用 == 1.0 直接判等。
建模检查要点
| 检查项 | 本例取值 | 不通过时的典型原因 |
|---|---|---|
| 基矢顺序 | [|0⟩, |1⟩] | 把 β 放在下标 0,导致概率分布颠倒 |
| 振幅类型 | 复数(虚部为 0) | 用实数存储含虚部振幅,丢失相位信息 |
| 归一化残差 | 0.0 ≤ 1e-9 | 系数抄写错误,如把 √3/2 写成 √2/2 |
| 概率和 | 0.25 + 0.75 = 1.0 | 用振幅直接相加而非模平方 |
若后续需要扩展到多量子比特,只需把“基矢顺序”升级为张量积顺序(如 |00⟩、|01⟩、|10⟩、|11⟩),数组长度变为 2ⁿ,映射与归一化验证逻辑完全不变。