4. 纠缠熵的典型场景计算

前三节我们建立了纠缠熵的定义与约化密度矩阵的计算框架。本节把框架落到三个最典型的多体态上:Bell态、GHZ态和W态。它们分别代表两体最大纠缠、多体"全有或全无"型纠缠、以及多体"单激发分布"型纠缠,是校验任何纠缠熵计算流程的标准试金石。本节的目标是:能手算单点(单比特)熵与 bipartite(两分)熵,并用程序交叉验证,形成"先算后验、以验促算"的校验习惯。

约定与计算口径

先统一约定,全文与图示保持一致。取计算基 $|0\rangle,|1\rangle$,密度矩阵 $\rho=|\psi\rangle\langle\psi|$。对纯态,单点熵指对某一比特求偏迹后得到的 $S(\rho_A)=-\mathrm{Tr}(\rho_A\log_2\rho_A)$,以比特为单位;bipartite 熵指把系统划分为 $A|B$ 两部分后 $S(\rho_A)$,当 $|\psi\rangle$ 为纯态时 $S(\rho_A)=S(\rho_B)$,且等于 $A$ 与 $B$ 之间的纠缠熵。对混合态则需区分 von Neumann 熵与纠缠熵,本节只处理纯态,避免歧义。

Bell态:两体最大纠缠的基准

取 $|\Phi^+\rangle=\frac{1}{\sqrt2}(|00\rangle+|11\rangle)$。单点约化:对 B 求偏迹,$\rho_A=\frac12(|0\rangle\langle0|+|1\rangle\langle1|)=\frac{I}{2}$,本征值 $\{1/2,1/2\}$,故 $S(\rho_A)=-(1/2\log_2 1/2)\times2=1$ bit。bipartite 划分只有 $A=\{1\},B=\{2\}$ 一种非平凡切分,结果同样是 1 bit,达到两体系统上限。手算要点:偏迹后矩阵是对角化的最大混合态,熵等于比特数,这是"最大纠缠"的判据。

GHZ态:多体全有或全无

三比特 $|GHZ\rangle=\frac{1}{\sqrt2}(|000\rangle+|111\rangle)$。单点约化:$\rho_1=\frac12(|0\rangle\langle0|+|1\rangle\langle1|)$,$S=1$ bit,与 Bell 态相同——单点看不出多体结构。关键在 bipartite 划分:取 $A=\{1\}$、$B=\{2,3\}$,$S(\rho_A)=1$ bit;取 $A=\{1,2\}$、$B=\{3\}$,同样为 1 bit。也就是说,GHZ 态对任何非平凡二分都给出 1 bit,且任意单比特与其余部分之间都是最大纠缠。这正是"全有或全无":测量一个比特,其余比特的态立即确定,但任意两个比特的约化态却是完全混态($S=1$ bit 对应两比特最大混合),不含可提取的两体纠缠。

W态:单激发均匀分布

三比特 $|W\rangle=\frac{1}{\sqrt3}(|001\rangle+|010\rangle+|100\rangle)$。单点约化:以比特 1 为例,$\rho_1=\frac23|0\rangle\langle0|+\frac13|1\rangle\langle1|$,本征值 $\{2/3,1/3\}$,$S(\rho_1)=-\frac23\log_2\frac23-\frac13\log_2\frac13\approx0.918$ bit。bipartite 划分 $A=\{1\},B=\{2,3\}$ 时 $S(\rho_A)\approx0.918$ bit;而 $A=\{1,2\},B=\{3\}$ 时,$\rho_{12}$ 的本征值为 $\{2/3,1/3,0,0\}$,熵仍约 0.918 bit。W 态的单点熵小于 1,说明其纠缠"分散"在三个比特之间,任意两比特约化后仍保留部分纠缠(与 GHZ 不同),这是 W 态在纠缠鲁棒性上优于 GHZ 的根源。

三态纠缠熵对照:单点熵与二分熵(单位:bit) 1.0 0.5 0 Bell |Φ⁺⟩ 1.00 1.00 GHZ 1.00 1.00 W 0.918 0.918 单点熵 S(ρ₁) 二分熵 S(ρ_A) 注:GHZ 任意二分均为 1 bit; W 态单点与二分均约 0.918 bit, 纠缠分散于三比特之间。

程序验证:把手算变成可复现的检查

手算给出解析值,程序验证的价值在于排除偏迹顺序、基矢排列、对数底数等低级错误。下面用 NumPy 直接构造密度矩阵并求偏迹,不依赖量子库,便于逐行核对。示例参数为三比特态,基矢按 $|q_1q_2q_3\rangle$ 字典序排列。

import numpy as np

def kron(*ms):
    out = ms[0]
    for m in ms[1:]:
        out = np.kron(out, m)
    return out

def partial_trace(rho, keep, dims=(2,2,2)):
    # keep: 保留的子系统索引列表
    n = len(dims)
    t = rho.reshape(dims + dims)
    trace_over = [i for i in range(n) if i not in keep]
    for i in sorted(trace_over, reverse=True):
        t = np.trace(t, axis1=i, axis2=i + n)
        n -= 1
    d = int(np.prod([dims[k] for k in keep]))
    return t.reshape(d, d)

def vn_entropy(rho):
    w = np.linalg.eigvalsh(rho)
    w = w[w > 1e-12]
    return float(-np.sum(w * np.log2(w)))

zero, one = np.array([1,0]), np.array([0,1])
# Bell |Φ+⟩
bell = (kron(zero,zero) + kron(one,one)) / np.sqrt(2)
rho_b = np.outer(bell, bell)
print("Bell 单点:", vn_entropy(partial_trace(rho_b, [0])))   # 期望 1.0

# GHZ
ghz = (kron(zero,zero,zero) + kron(one,one,one)) / np.sqrt(2)
rho_g = np.outer(ghz, ghz)
print("GHZ 单点:", vn_entropy(partial_trace(rho_g, [0])))     # 期望 1.0
print("GHZ 1|23:", vn_entropy(partial_trace(rho_g, [0])))     # 期望 1.0
print("GHZ 12|3:", vn_entropy(partial_trace(rho_g, [0,1])))   # 期望 1.0

# W
w = (kron(zero,zero,one) + kron(zero,one,zero) + kron(one,zero,zero)) / np.sqrt(3)
rho_w = np.outer(w, w)
print("W 单点:", vn_entropy(partial_trace(rho_w, [0])))       # 期望 ≈0.9183
print("W 12|3:", vn_entropy(partial_trace(rho_w, [0,1])))     # 期望 ≈0.9183

运行后应得到 Bell 与 GHZ 各划分均为 1.0,W 态为 0.9183(保留四位小数)。若出现 0.9183 与 1.0 混淆,多半是偏迹时把保留索引写错,或把 $|100\rangle$ 与 $|001\rangle$ 的基矢顺序弄反。建议每次验证都同时打印 $\rho_A$ 的本征值,与手算的 $\{1/2,1/2\}$、$\{2/3,1/3\}$ 逐一对照,这比只看熵值更能定位错误。

结果校验习惯:三条硬规则

  • 纯态对称性检查:对纯态必有 $S(\rho_A)=S(\rho_B)$,若两者不等,说明偏迹或 reshape 维度有误。
  • 上限检查:$S(\rho_A)\le\min(|A|,|B|)$ bit,且对 $d$ 维最大混合态取等号。Bell 与 GHZ 的 1 bit 正好触顶,W 的 0.918 未触顶,符合预期。
  • 划分穷举:三比特系统有 $A=\{1\},\{2\},\{3\},\{1,2\},\{1,3\},\{2,3\}$ 六种非平凡二分,应全部计算并列表比对,而不是只算一种就下结论。
把"手算解析值—程序数值—本征值列表"三者做成一张对照表,每次新增态(如四比特簇态、Dicke 态)都先填表再运行,能显著降低把数值巧合当成正确结果的风险。

最后强调一个易错点:GHZ 与 W 的单点熵都接近或等于 1 bit,但二者的多体纠缠结构完全不同。判断多体纠缠不能只看单点熵,必须结合不同二分下的熵分布以及两体约化态是否可分。本节建立的"单点熵 + 多划分二分熵 + 本征值核对"流程,正是后续计算更复杂多体态时的通用校验骨架。