3. 从分子哈密顿量到量子比特哈密顿量
在 VQE 分子基态计算中,我们真正要最小化的对象并不是化学家熟悉的二次量子化哈密顿量,而是经过费米子-量子比特映射后得到的量子比特哈密顿量。二次量子化形式里出现的是产生算符 a†p 与湮灭算符 aq,它们满足反对易关系,而量子计算机上的门操作作用在量子比特上,遵循的是张量积结构。映射方法要做的,就是把“费米子统计”这一约束翻译成量子比特上的泡利算符串,同时尽量不引入过深的电路。
以氢分子 STO-3G 基组为例,4 个自旋轨道对应 4 个量子比特,其电子哈密顿量在二次量子化下可写成:
H = h0 * I
+ Σ_pq h_pq a†_p a_q
+ 1/2 Σ_pqrs h_pqrs a†_p a†_q a_r a_s
其中 h0 是核排斥能与单电子积分贡献的常数项,h_pq 是单电子积分,h_pqrs 是双电子积分。映射的任务,就是把 a†、a 替换成由 X、Y、Z 组成的泡利串,并保持费米子反对易关系。
Jordan-Wigner 映射:直观但串长随轨道数线性增长
Jordan-Wigner(JW)映射的核心思想是:用单个量子比特的 |0⟩ 表示轨道空、|1⟩ 表示轨道占据,同时用一条 Z 算符“尾巴”来记录前面所有轨道的占据数,从而把费米子的交换符号编码进去。其形式为:
a_p = (X_p + iY_p)/2 ⊗ Z_0 ⊗ Z_1 ⊗ ... ⊗ Z_{p-1}
a†_p = (X_p - iY_p)/2 ⊗ Z_0 ⊗ Z_1 ⊗ ... ⊗ Z_{p-1}
对 4 量子比特的氢分子,单激发项 a†_0 a_2 会映射成类似 (X_0 Y_2 - Y_0 X_2)/2 ⊗ Z_1 的泡利串。可以看到,JW 的优点是物理意义清晰、实现简单,但每个算符都带一条长度为 p 的 Z 链。对于 n 个轨道,最坏情况下泡利串长度可达 O(n),双激发项甚至会出现 O(n) 个非恒等因子。这意味着在量子线路中,每个泡利项都需要一串 CNOT 来对角化,线路深度随轨道数线性增长。
Bravyi-Kitaev 映射:用奇偶校验降低串长
Bravyi-Kitaev(BK)映射换了一种编码方式:它不直接存储每个轨道的占据数,而是把占据信息分散到“部分和”与“奇偶校验”两类比特中。这样,单个费米子算符的泡利串长度从 O(n) 降到 O(log n)。对于 4 量子比特,JW 下长度为 4 的串在 BK 下可能缩短为长度 2 或 3。代价是:BK 的比特含义不再直观,占据数需要额外解码,且部分项的结构更复杂。
实际工程中,选择 JW 还是 BK,往往不是单纯看串长,而是看整体电路深度、CNOT 数量和测量分组。JW 的项结构规整,便于按泡利串分组测量;BK 虽然单串更短,但项之间的对易关系更复杂,分组测量时可能反而增加测量次数。因此,在中小分子(如 H2、LiH)上,JW 常因实现简单而优先;在轨道数较多、串长成为瓶颈时,BK 或更进一步的 Parity 映射、BK-tree 变体才更有优势。
映射选择对 VQE 电路深度的实际影响
在 VQE 中,量子比特哈密顿量通常写成 H = Σ c_k P_k,其中 P_k 是泡利串。为了测量 ⟨P_k⟩,需要把 P_k 对角化,即对每个非恒等因子施加相应的基变换门,再用 CNOT 链把奇偶校验集中到一个辅助比特上测量。JW 下,一个长度为 L 的泡利串需要 L−1 个 CNOT 来构造奇偶校验链;BK 下,虽然串长更短,但不同 P_k 之间的对易关系更复杂,分组测量时可能无法把多个项合并到同一组,导致测量次数增加。
以一个 8 量子比特的 LiH 简化模型为例:JW 下最长泡利串长度为 8,单个项对角化约需 7 个 CNOT;BK 下最长串长度约为 4,单个项约需 3 个 CNOT。但 JW 下约 60% 的项可以按泡利串的 Z 支撑集分组,每组只需一次测量;BK 下可分组比例可能降到 40% 左右。因此,实际总 CNOT 数并不一定随串长线性下降,需要结合具体分子和测量分组策略评估。
group_commuting)评估实际 CNOT 数与测量次数。
实操:用 OpenFermion 查看两种映射的泡利串
下面以氢分子为例,展示如何用 OpenFermion 生成 JW 与 BK 映射后的哈密顿量,并观察泡利串长度差异:
from openfermion import MolecularData, jordan_wigner, bravyi_kitaev
from openfermion.transforms import get_fermion_operator
# 构造 H2 STO-3G,4 自旋轨道
mol = MolecularData(geometry=[('H', (0,0,0)), ('H', (0,0,0.74))],
basis='sto-3g', multiplicity=1, charge=0)
mol = run_pyscf(mol)
fermion_ham = get_fermion_operator(mol.get_molecular_hamiltonian())
# JW 映射
jw_ham = jordan_wigner(fermion_ham)
# BK 映射
bk_ham = bravyi_kitaev(fermion_ham)
# 统计泡利串长度分布
def pauli_length_stats(qubit_ham):
lengths = []
for term in qubit_ham.terms:
length = sum(1 for op in term if op != 'I')
lengths.append(length)
return max(lengths), sum(lengths)/len(lengths)
print("JW max/avg:", pauli_length_stats(jw_ham))
print("BK max/avg:", pauli_length_stats(bk_ham))
运行后通常会看到:JW 的最大串长为 4,平均串长约 2.5;BK 的最大串长为 3,平均串长约 2.0。差异在 4 量子比特时并不悬殊,但随着轨道数增加,JW 的最大串长会线性增长到 n,而 BK 只增长到 O(log n)。这正是映射选择在规模化 VQE 中必须提前评估的原因。
h0 在 JW 和 BK 下都映射为恒等算符的系数,不参与量子线路测量,但在计算能量期望值时必须加回。忽略常数项会导致基态能量整体偏移,是 VQE 实现中常见的错误来源。
总结来说,JW 与 BK 的选择本质上是“串长”与“结构规整度”之间的权衡。JW 用更长的泡利串换来了直观的比特含义和简单的测量分组;BK 用更短的串长换来了更复杂的项结构和更高的解码成本。在 VQE 工程中,建议先用 JW 快速搭建可运行版本,再根据实际 CNOT 数、测量次数和硬件连通性,评估是否切换到 BK 或混合映射策略。