提供自己的 Hamiltonian 分解¶
English · 简体中文
假设你已经知道 H=0.3I+0.7X 的项分解。可以通过普通 Python 方法将它交给 Trotter 实现,不必先构造一个稠密矩阵,也不必注册新的语言类型。分解直接写成 TrotterTerm 的元组,每个因子是一个 PauliOperator;hamiltonian_simulation 接收任何能给出这些项的对象。
import cmath
import math
from oracq.algorithms.common.hamiltonian import PauliOperator, TrotterTerm, hamiltonian_simulation
from oracq import simulate
class MyHamiltonian:
hermitian = True
def trotter_list(self):
return (TrotterTerm(0.3, PauliOperator("I")),
TrotterTerm(0.7, PauliOperator("X")))
evolution = hamiltonian_simulation(MyHamiltonian(), time=0.4, steps=3)
state = simulate(evolution.operation.program())
expected = cmath.exp(-0.12j) * math.cos(0.28)
print(state.amplitudes)
print(evolution.alpha)
assert abs(state.amplitudes[(0, 0)] - expected) < 1e-12
{(0, 0): (0.9541441386892553-0.11505006784720223j), (1, 0): (-0.03308314468637069-0.274368274461448j)}
1.0
打印出的 (0, 0) 幅度就是解析值 exp(-0.12j)·cos(0.28) 的浮点形式,X 项把剩余概率转到 (1, 0) 上。这里两个项对易,因此可以直接使用解析结果检查幅度。evolution.alpha=1,因为生成的是完整酉演化。
对于非对易项,Trotter 的步数控制乘积公式近似。只有 Hermitian 声明还不够:每一项需要提供可调用的演化实现。若选择 QSP 路径,则应提供它需要的 BE 访问和实际 QSP 内核。
这一例子体现了算法约定的作用:Hamiltonian 对象提供 trotter_list(),Trotter 算法负责检查并调用它;RIR 只接收最后生成的模块与门。
相关页面¶
手册:输入与算子(Hamiltonian 的算子视图与协议)
API 参考:Hamiltonian 演化