4. 布洛赫球坐标与量子态参数的相互转换建模

任务拆解:从球面坐标到状态向量

布洛赫球把单量子比特纯态写成球面上的一个点,球坐标 (r, θ, φ) 与状态向量 |ψ⟩ = cos(θ/2)|0⟩ + e^{iφ} sin(θ/2)|1⟩ 一一对应。本例要建立双向转换函数,并重点处理两个极点 θ=0 与 θ=π:此时 φ 在物理上无定义,任何 φ 都给出同一状态,若直接由状态向量反解 φ 会得到 0/0 或数值噪声。建模策略是:正向转换始终输出规范化的 (θ, φ);反向转换在极点附近把 φ 置为约定值 0,并单独校验 r≈1。

|0⟩ (θ=0) x y |1⟩ (θ=π) |ψ⟩ θ φ 球面点 ↔ 纯态(r=1) 正向:态→球坐标 θ=2·acos|α|, φ=arg(β)−arg(α) 反向:球坐标→态 α=cos(θ/2), β=e^{iφ}sin(θ/2) 极点边界处理 θ≈0 或 θ≈π 时 φ 无定义 约定 φ=0,避免 0/0 校验 |α|²+|β|²≈1 与 r≈1 数值稳定性要点 用 atan2 求相位,避免除零 θ 用 acos 前先裁剪到 [−1,1] 往返误差阈值 1e−9

正向转换:由状态向量求球坐标

给定归一化复振幅 α、β,先求 θ,再由两振幅的相位差求 φ。关键是用 atan2 而不是 arctan(Im/Re),后者在实部为 0 时会除零。θ 计算前把 2|α|²−1 裁剪到 [−1,1],防止浮点误差导致 acos 返回 NaN。

import numpy as np

def state_to_bloch(alpha, beta, tol=1e-9):
    """由归一化复振幅求布洛赫球坐标 (theta, phi)。"""
    norm = abs(alpha)**2 + abs(beta)**2
    if abs(norm - 1.0) > 1e-6:
        raise ValueError(f"态未归一化: |α|²+|β|²={norm:.6f}")
    # 用 2|α|²-1 求 cosθ,比直接取 |α| 更稳
    cos_theta = np.clip(2.0 * abs(alpha)**2 - 1.0, -1.0, 1.0)
    theta = np.arccos(cos_theta)
    # 极点:β 或 α 的模接近 0,φ 无定义
    if abs(beta) < tol or abs(alpha) < tol:
        phi = 0.0
    else:
        phi = np.arctan2(np.imag(beta * np.conj(alpha)),
                         np.real(beta * np.conj(alpha)))
    return theta, phi

注意 φ 取的是 β 相对 α 的相位差,即 arg(β·α*),这样整体相位被消去,结果只依赖物理上可观测的相对相位。

反向转换:由球坐标重建状态向量

反向转换直接套用定义式。θ 在 [0,π] 内时 cos(θ/2)、sin(θ/2) 均非负,无需额外符号处理;φ 在极点被约定为 0,重建出的态仍是正确的 |0⟩ 或 |1⟩。

def bloch_to_state(theta, phi):
    """由球坐标 (theta, phi) 重建归一化状态向量。"""
    if not (0.0 <= theta <= np.pi):
        raise ValueError(f"θ 超出 [0,π]: {theta}")
    alpha = np.cos(theta / 2.0)
    beta = np.exp(1j * phi) * np.sin(theta / 2.0)
    return alpha, beta

边界情况验证

用一组覆盖极点、赤道与一般点的测试态做往返转换,检查重建态与原始态的保真度 |⟨ψ|ψ'⟩|² 是否接近 1,并确认极点处 φ 被规范为 0 而不产生 NaN。

def roundtrip_check(alpha, beta, label):
    theta, phi = state_to_bloch(alpha, beta)
    a2, b2 = bloch_to_state(theta, phi)
    fid = abs(np.conj(alpha) * a2 + np.conj(beta) * b2)**2
    ok = np.isfinite(theta) and np.isfinite(phi) and fid > 1 - 1e-9
    print(f"{label:12s} θ={theta:.4f} φ={phi:.4f} 保真度={fid:.12f} {'通过' if ok else '失败'}")
    return ok

cases = [
    (1.0 + 0j, 0.0 + 0j, "北极 |0⟩"),
    (0.0 + 0j, 1.0 + 0j, "南极 |1⟩"),
    (1/np.sqrt(2), 1/np.sqrt(2), "赤道 φ=0"),
    (1/np.sqrt(2), 1j/np.sqrt(2), "赤道 φ=π/2"),
    (np.sqrt(0.7), np.sqrt(0.3)*np.exp(1j*2.1), "一般点"),
]
all_ok = all(roundtrip_check(a, b, n) for a, b, n in cases)
print("全部通过:", all_ok)

预期输出中,两个极点的 φ 均为 0.0000,保真度为 1.000000000000;一般点的 θ、φ 与构造时一致。若极点处出现 NaN 或保真度明显低于 1,说明 atan2 分支或裁剪逻辑被绕过。

极点判断阈值 tol 不宜过大:若设为 1e−3,会把接近极点的合法态误判为极点而丢失 φ 信息。建议取 1e−9 量级,仅拦截真正的数值零。
往返转换只能验证到整体相位:|ψ⟩ 与 e^{iγ}|ψ⟩ 对应同一球面点。若业务需要固定全局相位,应在正向转换前先约定 α 为实数非负,否则往返后可能得到相差一个相位的等价态。