从阳光到量子纠缠:SPDC原理与Python仿真实践
大家印象里量子纠缠实验好像是激光器、低温恒温器和精密光学平台的专利和“阳光”这种宽谱、杂乱的热光源很难产生联系。但2014年前后确实有研究团队把太阳光聚焦后打进非线性晶体在实验上制备出了偏振纠缠光子对并通过符合测量验证了非经典关联。这个工作最吸引我的地方在于它把“自然光也能做量子光学”从口号变成了可复现的实验数据。如果你也是一个喜欢用代码理解物理的人只记住结论肯定不过瘾。更好的方式是把纠缠产生的条件、热光为什么要窄带滤波、为什么还要做后选择这些问题逐个拆开再用Python把关键曲线仿真出来。本文就围绕“从阳光产生量子纠缠”这个主题从原理讲到仿真再给出实验与工程上的注意事项希望能帮你建立一条比较完整的认知链路。1. 背景与核心概念1.1 量子纠缠是什么量子纠缠描述的是两个或多个量子系统之间存在一种不可分离的关联。对于两个光子而言最常见的纠缠形式是偏振纠缠例如[ |\Phi^\rangle \frac{1}{\sqrt{2}}(|HH\rangle |VV\rangle) ]这个式子表示当你测量两个光子中的一个时另一个光子的偏振状态会瞬间确定而且两者总是保持确定的相对关系。这种关联不是经典概率能完全解释的也是Bell不等式测试、量子密钥分发、量子隐形传态等应用的基础。在传统实验室里纠缠光子对的标准产生方式是自发参量下转换Spontaneous Parametric Down-ConversionSPDC。一束泵浦光进入非线性晶体在满足相位匹配的条件下一个高频光子有一定的概率“分裂”成两个低频光子通常称为信号光子和闲频光子。只要泵浦光、信号光、闲频光的频率和波矢满足能量守恒与动量守恒这个转换过程就能发生。1.2 阳光为什么也能产生纠缠太阳光到达地球后在光学上属于热光thermal light也叫混沌光。与激光相比热光宽谱、低相干、强度随机涨落看起来并不适合做SPDC的泵浦源。但从物理本质上讲SPDC是一个参量过程它并不强制要求泵浦光必须是激光。只要通过窄带滤光片选取一个满足相位匹配的频率窗口让足够的功率集中到非线性晶体上阳光中部分光子同样可以发生下转换生成纠缠光子对。实验上已经证明这种方式制备出的纠缠光子对依然可以通过偏振关联测试甚至能在一定程度上违背Bell不等式。这样一个实验的意义不在于“把阳光变成量子光源然后大规模应用”而在于它验证了纠缠产生的普适性也为低功耗、自然光源条件下的量子光学实验提供了一个极端测试场景。1.3 为什么说这是一个工程问题阳光产生纠缠光子对的速率非常低。这不是原理有问题而是阳光在窄带滤波后功率密度太低加上SPDC本身的概率就很低最终符合计数率可能只有每秒几个到几十个数量级。所以真正有意思的部分在于工程如何收集阳光、如何滤波、如何准直、如何降低暗计数、如何设计符合计数窗口、如何从海量数据中把纠缠关联提取出来。写代码仿真同样重要因为你可以先在软件里验证数据处理的逻辑再进入光学平台实际操作。2. 环境准备与版本说明2.1 软件环境本文的仿真部分使用Python实现主要依赖以下库Python 3.8及以上版本NumPy 1.21及以上版本Matplotlib 3.5及以上版本SciPy可选用于拟合曲线环境版本不需要刻意追求最新重点在于能运行NumPy和Matplotlib。如果你使用的是Anaconda发行版通常已经内置这些库。pip install numpy matplotlib scipy如果你的网络环境安装缓慢也可以使用清华镜像源pip install numpy matplotlib scipy -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 实验硬件参考如果你准备在实验室复现类似方案并不需要一开始就追求复杂设备。常见的实验组成包括聚光装置透镜或太阳集光器用于把阳光会聚到非线性晶体上。窄带滤光片用于选择满足相位匹配的频率成分滤除宽谱背景噪声。非线性晶体周期性极化晶体如PPKTP或BBO晶体用于SPDC过程。偏振控制与分束元件半波片、四分之一波片、偏振分束器PBS。单光子探测器SPAD或SNSPD用于探测信号光与闲频光。符合计数模块用于记录两个探测器在时间窗口内的同时到达事件。需要注意不同晶体的极化周期、工作波长、相位匹配温度不同。实际实验前应当先查阅晶体参数表用对应工具确认相位匹配条件再设计光路。下面代码演示时我们只关心物理量的数学形式具体参数需要根据你的实验条件调整。2.3 项目文件结构为了让仿真过程清晰可维护建议创建如下目录结构sunlight_entanglement_sim/ ├── src/ │ ├── __init__.py │ ├── g2_thermal.py │ ├── hom_interference.py │ └── chsh_analysis.py ├── scripts/ │ └── run_simulation.py ├── results/ │ └── figures/ └── README.md这个结构把不同物理场景的仿真函数分开最后通过一个主脚本统一运行并保存图片比较适合后续扩展。3. 核心原理拆解3.1 热光的二阶关联函数我们要区分“热光本身”和“热光泵浦产生的纠缠光子对”。热光的强度随时间随机涨落其二阶关联函数定义为[ g^{(2)}(\tau) \frac{\langle I(t) I(t\tau)\rangle}{\langle I(t)\rangle^2} ]对于单模热光理论值为[ g^{(2)}(\tau) 1 \left|\frac{\langle E^*(t)E(t\tau)\rangle}{\langle |E(t)|^2\rangle}\right|^2 ]当延迟 (\tau0) 时热光的 (g^{(2)}(0)2)这就是经典的HBT聚束效应。它看起来像是“光子成团到达”但本质上是经典光场强度涨落带来的统计关联并不是量子纠缠。如果我们选择高斯型频谱则一阶关联函数也是高斯型热光的 (g^{(2)}(\tau)) 可以写成[ g^{(2)}(\tau) 1 \exp\left(-\frac{\tau^2}{\tau_c^2}\right) ]其中 (\tau_c) 是相干时间。这个公式在仿真中非常方便它直观地告诉我们热光的关联只存在于很短的相干时间内一旦延迟超过相干时间聚束效应迅速消失。3.2 SPDC产生纠缠光子对SPDC过程的哈密顿量可以近似写成[ H_{SPDC} \propto \chi^{(2)} E_p a_s^\dagger a_i^\dagger h.c. ]它的物理含义是一个泵浦光子湮灭同时产生一个信号光子和一个闲频光子。对于第二类相位匹配信号光和闲频光的偏振方向相互垂直并且通过适当的光路补偿后可以输出如下形式的偏振纠缠态[ |\psi\rangle \frac{1}{\sqrt{2}}\left(|H_sV_i\rangle e^{i\phi}|V_sH_i\rangle\right) ]这里的相位 (\phi) 由晶体双折射、光路长度和环境温度决定。实验上需要调节补偿晶体或波片来让相位稳定在某个固定值。阳光泵浦SPDC的特殊之处在于泵浦光场的统计性质是热光而不是相干光。但这并不影响SPDC的参量过程本身因为只要在满足相位匹配的频率窗口内有足够光子参与下转换过程就会发生。真正的问题是其他频率成分的杂散光也会进入探测器带来大量噪声。3.3 为什么需要后选择阳光泵浦产生的光子对中有一部分确实处于纠缠态但符合计数率很低且伴随大量噪声。为了验证纠缠我们需要进行后选择只保留两个探测器在时间窗口内同时接收到光子的那些事件。这个过程并不改变纠缠态本身而是把有效信号从噪声中筛选出来。实验上通常通过符合计数测量来实现这一点。两个探测器在设定时间窗口内同时响应的次数称为符合计数它是后续计算偏振关联函数和Bell不等式的基础。从更广义的角度讲热光本身没有量子纠缠但通过SPDC产生并经过后选择的光子对可以展现出非经典的量子关联。这一点是理解整个实验逻辑的关键也是初学阶段最容易混淆的地方。3.4 表征纠缠的关键指标要判断产生的光子对是否真的纠缠不能只看符合计数还要看以下指标指标含义参考值符合计数率单位时间内探测到的双光子事件数越高越好但通常很低符合可见度偏振关联曲线对比度理想纠缠态为100%(g^{(2)}(0))零延迟二阶关联函数热光为2单光子源小于1CHSH参数 SBell不等式测试结果经典界限2量子极限 (2\sqrt{2})其中CHSH参数是验证纠缠最严格的方式之一。只有 (S 2) 才能说明关联无法用经典的局域隐变量模型解释。4. 完整实战案例阳光纠缠产生的仿真下面我们用Python实现三个关键部分的仿真热光二阶关联函数 (g^{(2)}(\tau))。双光子经过分束器后的HOM干涉凹陷。基于偏振纠缠态的符合计数与CHSH不等式参数。4.1 创建项目结构在终端里创建目录mkdir sunlight_entanglement_sim cd sunlight_entanglement_sim mkdir -p src scripts results/figures然后在src目录下创建空文件__init__.py让Python可以识别这个包touch src/__init__.py4.2 仿真热光二阶关联函数我们先写一个函数用来计算热光的二阶关联函数曲线。这里采用高斯型频谱假设公式为[ g^{(2)}(\tau) 1 \exp\left(-\frac{\tau^2}{\tau_c^2}\right) ]文件路径src/g2_thermal.pyimport numpy as np def g2_thermal(tau, tau_c1.0): 计算热光二阶关联函数 g2(tau)。 参数 ---- tau : float or np.ndarray 延迟时间。 tau_c : float 相干时间默认值 1.0。 返回 ---- g2 : float or np.ndarray 二阶关联函数值。 return 1.0 np.exp(-(tau / tau_c) ** 2) def plot_g2_thermal(save_pathNone): import matplotlib.pyplot as plt tau np.linspace(-5.0, 5.0, 500) g2 g2_thermal(tau, tau_c1.0) plt.figure(figsize(7, 4)) plt.plot(tau, g2, linewidth2) plt.axhline(y1.0, colorgray, linestyle--, linewidth1) plt.axhline(y2.0, colorgray, linestyle--, linewidth1) plt.xlabel(r$\tau$ (arb. units)) plt.ylabel(r$g^{(2)}(\tau)$) plt.title(Second-order correlation of thermal light) plt.grid(alpha0.3) if save_path: plt.savefig(save_path, dpi150, bbox_inchestight) plt.show()这个函数本身不复杂但它对应了实验里热光背景的统计特征。你可以运行它观察 (g^{(2)}(0)2) 的聚束峰。4.3 仿真HOM干涉凹陷HOM干涉是验证两个光子不可区分性的标准手段。一对频率相同、偏振正交但经过补偿后不可区分的双光子经过50:50分束器后符合计数会出现凹陷。在理想情况下符合计数率可以写成[ R_{cc}(\tau) R_0\left[1 - V \exp\left(-\frac{\tau^2}{2\sigma^2}\right)\right] ]其中(R_0) 是延迟极大时的符合计数率。(V) 是干涉可见度。(\sigma) 是双光子波包宽度。文件路径src/hom_interference.pyimport numpy as np def hom_dip(tau, R01000.0, V0.9, sigma0.5): 计算HOM干涉符合计数率。 参数 ---- tau : float or np.ndarray 两个光子的相对时间延迟。 R0 : float 不可区分时的基准符合计数率。 V : float 干涉可见度0到1之间。 sigma : float 双光子波包宽度。 返回 ---- rate : float or np.ndarray 符合计数率。 return R0 * (1.0 - V * np.exp(-(tau / sigma) ** 2 / 2.0)) def plot_hom_dip(save_pathNone): import matplotlib.pyplot as plt tau np.linspace(-4.0, 4.0, 500) rate hom_dip(tau, R01000.0, V0.9, sigma0.5) plt.figure(figsize(7, 4)) plt.plot(tau, rate, linewidth2) plt.xlabel(Relative delay (arb. units)) plt.ylabel(Coincidence rate) plt.title(Hong-Ou-Mandel interferometric dip) plt.grid(alpha0.3) if save_path: plt.savefig(save_path, dpi150, bbox_inchestight) plt.show()运行这个函数后你会看到在延迟为0的位置出现一个明显的凹陷。凹陷深度由可见度 (V) 决定凹陷越深说明两个光子的不可区分性越好。4.4 仿真偏振纠缠与CHSH不等式接下来我们仿真偏振纠缠光子对在任意测量角度下的符合计数。对于纠缠态[ |\Phi^\rangle \frac{1}{\sqrt{2}}(|HH\rangle |VV\rangle) ]当Alice在角度 (\theta_1)、Bob在角度 (\theta_2) 下进行偏振测量时符合概率为[ P(\theta_1, \theta_2) \frac{1}{2}\cos^2(\theta_1 - \theta_2) ]这里系数1/2是为了保证概率归一化。实际上我们也可以通过如下公式计算CHSH不等式参数[ S |E(\theta_1,\theta_2) - E(\theta_1,\theta_2)| |E(\theta_1,\theta_2) E(\theta_1,\theta_2)| ]其中 (E(\theta_a,\theta_b)) 是关联函数定义为[ E(\theta_a,\theta_b) \frac{C_{}C_{--}-C_{-}-C_{-}}{C_{}C_{--}C_{-}C_{-}} ]为了更贴近实验我们在符合计数中加入泊松噪声模拟有限时间内的测量统计涨落。文件路径src/chsh_analysis.pyimport numpy as np def coincidence_prob(theta1, theta2): 理想纠缠态 |Phi 的符合概率。 return 0.5 * np.cos(theta1 - theta2) ** 2 def generate_coincidence_counts(theta1, theta2, total_pairs10000): 根据概率生成符合计数并加入泊松统计涨落。 参数 ---- theta1 : float Alice的偏振测量角度。 theta2 : float Bob的偏振测量角度。 total_pairs : int 模拟的总光子对数目。 返回 ---- counts : array of 4 ints [C, C--, C-, C-] 四组符合计数。 p coincidence_prob(theta1, theta2) # 理想情况下 和 -- 等概率出现 p_corr p p_anti 0.5 - p / 2.0 # 归一化保证概率和为1 probs np.array([p_corr, p_corr, p_anti, p_anti]) probs probs / probs.sum() counts np.random.poisson(total_pairs * probs) return counts def correlation_from_counts(counts): 根据四组合符计数计算 E 关联函数。 cpp, cmm, cpm, cmp counts denominator cpp cmm cpm cmp if denominator 0: return 0.0 return (cpp cmm - cpm - cmp) / denominator def chsh_value(theta1, theta2, theta1_prime, theta2_prime, total_pairs10000): 计算CHSH参数 S。 E12 correlation_from_counts( generate_coincidence_counts(theta1, theta2, total_pairs) ) E12p correlation_from_counts( generate_coincidence_counts(theta1, theta2_prime, total_pairs) ) E1p2 correlation_from_counts( generate_coincidence_counts(theta1_prime, theta2, total_pairs) ) E1p2p correlation_from_counts( generate_coincidence_counts(theta1_prime, theta2_prime, total_pairs) ) S abs(E12 - E12p) abs(E1p2 E1p2p) return S def monte_carlo_chsh(n_experiments1000, total_pairs10000): 多次模拟CHSH实验返回S的统计分布。 使用标准设置theta10, theta2pi/4, theta1_primepi/2, theta2_prime3pi/4 theta1 0.0 theta2 np.pi / 4 theta1_prime np.pi / 2 theta2_prime 3 * np.pi / 4 s_values [] for _ in range(n_experiments): s chsh_value( theta1, theta2, theta1_prime, theta2_prime, total_pairstotal_pairs ) s_values.append(s) s_values np.array(s_values) return s_values.mean(), s_values.std(), s_values这段代码的逻辑是给定一个偏振设置先根据理想概率生成符合计数。每一次模拟都受泊松噪声影响所以 (S) 不是固定值。通过多次模拟我们能看到 (S) 的均值接近 (2\sqrt{2}\approx2.828)同时标准差随着总光子对数增加而减小。4.5 运行与结果说明在主脚本中统一调用这些函数并输出结果图片与统计信息。文件路径scripts/run_simulation.pyimport sys import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), .., src)) import numpy as np from g2_thermal import plot_g2_thermal from hom_interference import plot_hom_dip from chsh_analysis import monte_carlo_chsh if __name__ __main__: results_dir os.path.join( os.path.dirname(__file__), .., results, figures ) os.makedirs(results_dir, exist_okTrue) plot_g2_thermal( save_pathos.path.join(results_dir, g2_thermal.png) ) plot_hom_dip( save_pathos.path.join(results_dir, hom_dip.png) ) mean_s, std_s, s_values monte_carlo_chsh( n_experiments2000, total_pairs10000 ) print(fMean S {mean_s:.3f} /- {std_s:.3f}) print(fClassical bound 2.0) print(fQuantum bound {2 * np.sqrt(2):.3f})运行python scripts/run_simulation.py预期输出类似于Mean S 2.827 /- 0.021 Classical bound 2.0 Quantum bound 2.828这说明在理想的纠缠态模型下即使加入泊松统计涨落大量重复实验的平均值依然非常接近量子极限 (2\sqrt{2})。之所以不是每次都正好等于 (2\sqrt{2})是因为有限光子数带来了统计误差。在真实实验中提高总符合计数是缩小误差、确认纠缠的必要条件。5. 常见问题与排查思路在阳光泵浦纠缠光子的仿真和实验中你大概率会遇到下面这些问题。如果环境不同排查顺序也可能不同下面的表格可以作为参考。问题现象常见原因解决思路符合计数率极低阳光聚光效率不足、窄带滤波后功率太低、晶体转换效率低使用大数值孔径聚光镜优化光路准直选用高非线性系数晶体没有观察到HOM凹陷双光子不可区分性差时间抖动大偏振未对准检查延迟线精度优化滤波带宽校准偏振补偿偏振关联曲线对比度差波片角度不准、双折射补偿不当、背景噪声过高用强激光源预先校准波片加入额外补偿晶体提高信噪比CHSH参数S始终小于2统计量不足、背景计数过高、纠缠源退相干提高符合计数率增加探测器性能缩短时间窗口做背景扣除阳光强度波动大云层遮挡、太阳角度变化、大气抖动使用实时功率监测相关数据同步记录剔除异常时间段晶体发热或损坏聚焦阳光功率密度过高缺少热管理采用适当衰减加散热片或风扇避免长时间直射g2曲线峰值小于2窄带滤波不理想探测器时间抖动大提高光谱纯度改善时间分辨修正暗计数这里需要特别强调阳光经过透镜聚焦后功率密度可能非常高如果晶体或滤光片吸收率高局部温度会快速上升。任何光学实验都应该先评估热损伤风险使用合适的衰减器并避免用肉眼直接观察聚焦光路。6. 最佳实践与工程建议6.1 实验安全与合规阳光聚焦实验虽然看起来不需要激光但危险系数并不低。聚焦后的阳光可以点燃纸张、损坏光学元件甚至灼伤皮肤。建议始终使用封闭式光路并在关键位置安装遮光罩。如果需要实时观察光斑位置使用红外卡片或摄像头观察而不是直接用眼睛对准光路。另外如果你的光路中使用了激光器做波长校准要按照激光安全规范佩戴对应波段的防护眼镜。实验过程涉及高功率密度光源时团队内部应提前制定应急停止流程。6.2 光学参数与光谱匹配阳光是宽谱光而SPDC的相位匹配通常只对很窄的波长范围有效。为了让阳光泵浦有效窄带滤光片是最关键的元件之一。滤光片的中心波长必须与非线性晶体的相位匹配波长一致半高全宽越小背景噪声越低但透过的泵浦功率也越少。在现实中这是一个需要平衡的过程带宽过宽噪声增加纠缠对比度下降。带宽过窄泵浦功率不足符合计数率太低。建议先根据晶体参数模拟相位匹配曲线再选择滤光片。仿真代码中的相干时间 (\tau_c) 和光谱宽度相关如果发现仿真与实验趋势不一致优先检查滤波带宽。6.3 数据采集与统计分析符合计数本身是一个随机过程。在低计数率条件下有限时间内得到的符合计数就是一个泊松采样的结果。因此在计算CHSH参数时除了给出平均值还应该给出标准误差否则很难判断数据是否真的违背Bell不等式。许多实验初学者容易犯一个错误只取总计数算出 (S2.5)就觉得证明了量子关联。但实际上需要考虑置信区间。更稳妥的方法是重复多轮测量或采用Bootstrap方法对原始符合计数重采样得到S的统计分布。6.4 后选择与纠缠验证的边界阳光泵浦SPDC产生纠缠光子对后我们并没有把“所有阳光”变成纠缠光而是在众多光子事件中筛选出了少量符合事件。这种后选择方式其实正是一种典型的条件制备方法。但要记住后选择本身并不能凭空创造纠缠。真正可靠的做法是通过完整的量子态层析或CHSH不等式测试来验证。如果只是看到某个偏振方向的符合计数高那可能是经典关联不一定是量子纠缠。对软件部分来说建议把量子态参数、实验配置和原始数据分开管理。仿真的随机种子也要固定下来方便他人复现你的曲线和统计结果。7. 总结与下一步学习路线本文从“阳光产生量子纠缠”这个看似矛盾的题目出发拆解了热光统计、SPDC参量下转换、后选择和Bell不等式验证几层内容。你应当已经理解了热光本身没有量子纠缠但可以作为SPDC泵浦源。阳光泵浦的关键是窄带滤波、相位匹配和符合测量。HOM凹陷用来确认双光子不可区分性。偏振关联与CHSH参数用来验证非经典关联。Python仿真可以帮助你在进入实验室之前先验证数据处理逻辑。如果你想把仿真再往前推一步推荐尝试用QuTiP库建立完整的密度矩阵模型模拟噪声通道下的纠缠退化并比较不同后选择策略的效果。也可以进一步阅读量子光学中关于混沌光场与参量下转换的章节理解为什么热光泵浦的纠缠源在理论上依然可以工作。动手永远比观望更能建立直觉。你可以先运行本文代码观察 (g^{(2)}) 聚束峰和HOM凹陷再把CHSH模拟的光子对数逐渐减小看看统计误差如何上升。只有亲手把理想模型和有限计数之间的差距做出来才能明白实验物理学家在验证纠缠时到底在跟什么作斗争。