复数振幅与概率¶
这节课用包含两个元素的 NumPy 数组表示一个量子比特。完成安装后,只需要会用 Python 列表、函数和基本运算。我们要区分复数振幅与测量概率。
归一化量子态写作 |ψ⟩ = α|0⟩ + β|1⟩,振幅满足 |α|² + |β|² = 1。在计算基中测量,得到两个状态的概率分别为 |α|² 和 |β|²。Python 用 1j 表示虚数单位,abs(z)**2 计算复数的模平方。
对于 (1, i)/√2,先预测两个概率,再把它与 |+⟩ = (1, 1)/√2 比较。两者的计算基概率相同,但相对相位不同。
"""Compare complex amplitudes, basis probabilities and a state overlap."""
from __future__ import annotations
import json
import numpy as np
def experiment() -> dict[str, object]:
state = np.array([1, 1j], dtype=complex) / np.sqrt(2)
plus = np.array([1, 1], dtype=complex) / np.sqrt(2)
return {
"amplitudes_real": state.real.tolist(),
"amplitudes_imag": state.imag.tolist(),
"basis_probabilities": (np.abs(state) ** 2).tolist(),
"norm_squared": float(np.vdot(state, state).real),
"plus_overlap_probability": float(abs(np.vdot(plus, state)) ** 2),
}
if __name__ == "__main__":
print(json.dumps(experiment(), sort_keys=True))
python examples/learning/foundations/complex_vectors.py
{
"amplitudes_imag": [
0.0,
0.7071067811865475
],
"amplitudes_real": [
0.7071067811865475,
0.0
],
"basis_probabilities": [
0.4999999999999999,
0.4999999999999999
],
"norm_squared": 0.9999999999999998,
"plus_overlap_probability": 0.4999999999999998
}
np.vdot(a, b) 先对第一个向量取共轭,再做内积。因此 np.vdot(state, state) 得到范数平方。对于这里的复数态,直接使用 np.dot 会得到错误的归一化结果。
两个基态的概率都是 1/2。与 plus 态的重叠概率 |⟨+|ψ⟩|² 也是 1/2,而不是一:基态概率相同,不代表两个量子态相同。结果与 1.0 等数值之间的微小差距通常来自浮点舍入。
把 1j 依次改为 -1j 和 1,运行前先预测重叠概率。最后把整个态向量乘以 1j:全局相位会改变这些概率吗?
核对计算
改为 -1j 后,与 plus 态的重叠概率仍为 1/2;改为 1 后,状态就是 plus 态,重叠概率为一。整个向量乘以模为一的相位,不改变测量概率或重叠的模平方。只改一个振幅的相位则属于相对相位变化,可能影响其他测量。
下一课:测量与有限次采样。