跳转至

复数振幅与概率

这节课用包含两个元素的 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 态,重叠概率为一。整个向量乘以模为一的相位,不改变测量概率或重叠的模平方。只改一个振幅的相位则属于相对相位变化,可能影响其他测量。

下一课:测量与有限次采样。

English

SDK 1.0.8a · `6eff6362`