Skip to content

WARNING

🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。

量子存储 — demo.py 代码详解

Download demo.py

运行方式

bash
cd docs/quantum/memory/code
python demo.py

CPU、NumPy。两张图:t1_t2_decay.pngT1 布居 vs T2 相干)和 write_store_read.png(等待越久读出保真度越低)。玩具参数 T1=1.0T2=0.4(任意时间单位),不是某实验室拟合。T2<T1:相位通常比能量掉得更快。

代码逐段详解

第1步:amp_damping — 振幅阻尼(T1

激发态以概率 p=1et/T1 「掉下来」。Kraus:

E0=(1001p),E1=(0p00),ρE0ρE0+E1ρE1
python
def amp_damping(rho, t, t1=T1):
    p = 1.0 - np.exp(-t / t1)
    e0 = np.array([[1, 0], [0, np.sqrt(1 - p)]], dtype=complex)
    e1 = np.array([[0, np.sqrt(p)], [0, 0]], dtype=complex)
    return e0 @ rho @ e0.conj().T + e1 @ rho @ e1.conj().T
  • p=1et/T1t=0p=0,信道是恒等;tp1,所有布居落到 |0
  • e0 @ rho @ e0.conj().T:每一支 Kraus 都是 EρE。两支相加保证 CPTP(迹保持)。
  • ρ=|11|,对角元 ρ11 应按 et/T1 掉。这就是能量弛豫。振幅阻尼也会顺带削弱非对角(相干寿命不会长过 2T1),但本图的 T2 曲线用的是下面的纯退相位,好对比两条钟。

第2步:dephase — 只打非对角(T2

ρ01(t)=ρ01(0)et/T2,ρ10=ρ01
python
def dephase(rho, t, t2=T2):
    out = rho.copy()
    out[0, 1] *= np.exp(-t / t2)
    out[1, 0] *= np.exp(-t / t2)
    return out
  • .copy():不要改调用者手里的 ρ。后面写-存-读会反复从 rho0 出发。
  • 语法 out[0, 1]:第 0 行第 1 列,即 ρ01*= 乘衰减因子。对角不动:纯退相位不改变布居,只丢相对相位。
  • 对赤道态 |+|ρ01|1/2 指数掉到 0。这比 T1 更快(T2=0.4 < T1=1)。

第3步:fidelity_pure — 纯态相对密度矩阵的保真度

对纯态 |ψ 与任意 ρ

F=ψ|ρ|ψ

(纯态–纯态时这就是 |ψ|ϕ|2 的推广。)

python
def fidelity_pure(rho, psi):
    return float(np.real(psi.conj() @ rho @ psi))
  • psi.conj() @ rho @ psi:行向量 ψ|ρ 再乘 |ψ,得到标量。conj()psi 上,不是对 ρ
  • np.real + float:数学上 F 是实数;转 Python 标量好存进 list。

第4步:demo_t1_t2 两条曲线

python
rho1 = np.array([[0, 0], [0, 1]], dtype=complex)
plus = np.array([1, 1], dtype=complex) / np.sqrt(2)
rho_plus = np.outer(plus, plus.conj())
pop1 = [np.real(amp_damping(rho1, t)[1, 1]) for t in times]
coh = [np.abs(dephase(rho_plus, t)[0, 1]) for t in times]
  • [[0,0],[0,1]]ρ=|11|[1,1]1|ρ|1
  • 列表推导:对每个时刻单独作用信道。80 个点,矩阵 2×2,不必向量化。
  • 左曲线从 1 掉向 0(T1);右曲线从 0.5 掉向 0(|ρ01|)。同一张图两条钟,存储章节正文的「能量 vs 相位」。

第5步:写-存-读 — 两个信道叠在一起

python
rho = dephase(amp_damping(rho0, t), t)
fids.append(fidelity_pure(rho, psi))

写入 |ψ=|+outerρ0),等待时间 t振幅阻尼、退相位,再用同一 |ψ 算保真度。读出不是另做测量模拟,而是直接 F(ρ(t),ψ):理想读出、只看存储过程把态弄糊了多少。

t=0F=1t 增大两条噪声都加重,F 单调下降。这就是「等得越久越糊」,量子内存的核心约束。

times = np.linspace(0, 3.0, 80)(T1/T2 图)和 linspace(0, 2.5, 40)(写-存-读)上限不同:前者要看到 T1=1 下布居掉到接近 0,后者保真度掉到「已经很糊」即可,不必同一横轴。列表推导里 amp_damping(rho1, t)[1, 1]:先得到 2×2,再取 ρ11np.abs(...) 取相干模长,因为退相位后 ρ01 仍可能带相位,模才是「还剩多少相干」。

Kraus 完备性:E0E0+E1E1=I(对任意 p[0,1])。代码没有断言这一点,但 sqrt(1-p)sqrt(p) 就是为了满足它。pexp 不会超出 [0,1),不必再 clip。

两张图都 tight_layout + dpi=140。入口连续调用 demo_t1_t2()demo_write_store_read(),没有 main 函数。

写-存-读里对每个 t 都从同一份 rho0 出发,而不是把上一步的 ρ 再送进信道。后者会把时间积分错成「再阻尼一次」,曲线不是 et/Trho0 = np.outer(psi, psi.conj()) 与 overview 章构造 |++| 的方式相同。

T2=0.4 < T1=1 写在模块级常数。若把 T2 改成大于 2T1,物理上不自洽(振幅阻尼已经限制相干),但 dephase 是独立玩具信道,代码不会报错——这是教学拆分,不是完整 Lindblad。


关键概念速查表

概念数学 / 直觉代码
T1布居 et/T1amp_damping,Kraus E0,E1
p=1et/T1掉下来的概率amp_damping 开头
T2非对角 et/T2dephase
.copy()不改原 ρdephase
保真度ψ|ρ|ψfidelity_pure
outer纯态 ρrho_plus / rho0
写-存-读两信道串联dephase(amp_damping(...), t)
[0,1] / [1,1]相干 / 布居矩阵下标

源码位置

clone 后打开(相对仓库根目录):

docs/quantum/memory/code/demo.py