算法与工具库
概述
本章介绍 unitarylab.library 中的高层算法模块,按功能分组说明各模块的用途、适用场景和基本用法。读完本章,你将能够:
- 了解算法库中各模块的功能分类
- 知道在常见量子计算任务中应使用哪个模块
- 使用 QFT、QPE、LCU、量子信号处理/QSVT、块编码、哈密顿量模拟、线性方程组求解等高层接口构建量子线路
这些模块都在 Circuit 之上提供算法级抽象,通常不需要手动编写门序列。
顶层导出与导入方式
unitarylab.library 包顶层只直接导出以下 10 个名称(library/__init__.py 的 __all__):
from unitarylab.library import (
QFT, IQFT, # 量子傅里叶变换 / 逆变换
QPE, # 量子相位估计
LCU, # 酉算子线性组合
block_encode, # 块编码统一入口
hamiltonian_simulation, # 哈密顿量模拟统一入口
solve, # 线性方程组求解统一入口
QSVT, # 量子奇异值变换(标量函数变换)
QSP, QSP_hamiltonian_simulation, # 量子信号处理
)其余更底层的方法类(如 Trotter、HHLSolver、QSVTHermitian、CartanOptimization)未在顶层导出,需要从各自子模块显式导入,本章后续每节都会给出正确路径。
模块功能分组
| 功能分组 | 顶层入口 | 底层子模块(需单独导入) |
|---|---|---|
| 基础算法原语 | QFT、IQFT、QPE、LCU | — |
| 哈密顿量模拟 | hamiltonian_simulation() | hamiltonian.method:Trotter、QDrift、Taylor、QSP、CartanLax、CartanOptimization |
| 量子信号处理 / QSVT | QSP、QSP_hamiltonian_simulation、QSVT | _qsp.algorithm、_qsvt.algorithm:QSVTHermitian |
| 块编码 | block_encode() | block_encoding:FABLE、Nagy |
| 线性方程组求解 | solve() | linear_solver:HHLSolver、QSVTSolver、SCHROSolver、AQCSolver、VQLSSolver、CKSSolver |
| Pauli 工具 | — | pauli_operator.pauli_string_decomposition |
| PDE 求解框架 | — | equation.examples.*(配置驱动,见下文) |
基础算法原语
QFT / IQFT:量子傅里叶变换
用途: 构建量子傅里叶变换或其逆变换线路,是 QPE、Shor 算法等的基础模块。
from unitarylab import Circuit
from unitarylab.library import QFT, IQFT
# 构建 4 量子比特 QFT 线路
qft_circuit = QFT(n=4)
# 构建逆 QFT 线路
iqft_circuit = IQFT(n=4)
# 可以嵌入到更大的线路中
qc = Circuit(4)
qc.append(qft_circuit, target=[0, 1, 2, 3])
qc.draw()| 函数 | 参数 | 返回 |
|---|---|---|
QFT(n) | n:量子比特数 | Circuit |
IQFT(n) | n:量子比特数 | Circuit(QFT 的共轭转置) |
QPE:量子相位估计
用途: 估计酉算子 的本征值相位 ,满足 。常用于量子化学和量子算法中估计哈密顿量本征能。
from unitarylab import Circuit
from unitarylab.library import QPE
# 被估计的酉算子(T 门,相位为 1/8)
U = Circuit(1)
U.t(0)
# T|1⟩ = exp(2πi/8)|1⟩,因此先制备本征态 |1⟩
prepare_target = Circuit(1)
prepare_target.x(0)
# 运行 QPE,返回 (线路, 相位估计值, 该结果的概率)
qpe_circuit, phase, probability = QPE(
U=U,
d=4, # 相位寄存器比特数,精度 1/2^d
prepare_target=prepare_target,
device='cpu',
return_circuit=False
)
print(phase, probability) # 0.125 1.0(允许数值舍入误差)| 参数 | 说明 |
|---|---|
U | 被估计的酉算子线路 |
d | 相位寄存器比特数,估计精度为 |
prepare_target | 本征态准备线路,默认 None(从 出发) |
return_circuit | True 时只返回构造的 QPE 线路;False 时返回 (线路, 相位估计值, 概率) |
backend、device、dtype | 内部执行 QPE 线路时使用的模拟参数 |
LCU:线性组合酉演算
用途: 实现算子 ,常用于哈密顿量模拟和块编码的基础构件。
from unitarylab import Circuit
from unitarylab.library import LCU
# 构建两个酉算子子线路
U1 = Circuit(1)
U1.x(0)
U2 = Circuit(1)
U2.z(0)
# LCU:实现 0.6 * U1 + 0.8 * U2
lcu_circuit = LCU([(U1, 0.6), (U2, 0.8)])注意: 所有输入酉算子线路必须具有相同的量子比特数,否则抛出 ValueError。系数须为有限非负浮点数;系数为 0 的项会被自动跳过。
哈密顿量模拟
hamiltonian_simulation() 是统一入口,内部按 method 参数分发到不同算法实现,返回值都是 HamiltonianSimulationResult(或其子类)的实例,接口一致。
统一入口
import numpy as np
from unitarylab.library import hamiltonian_simulation
H = np.array([[0, 1], [1, 0]], dtype=float) # 实对称 Pauli-X 哈密顿量
sim = hamiltonian_simulation(
H, t=1.0,
method='trotter', # 'trotter'(默认)/ 'qdrift' / 'taylor' / 'qsp'(别名 'qsvt')/
# 'cartan-lax' / 'cartan-optimization'
target_error=1e-3,
backend='torch', device='cpu', dtype=np.complex128,
order=1, steps=100, # method 专属参数,通过 **kwargs 传递(此处对应 'trotter')
)
circuit = sim.circuit # 演化线路
evolution = sim.evolution_result # 近似演化矩阵(懒计算,首次访问时构建)
print(sim.total_error) # 实际近似误差
circuit.draw(title="Hamiltonian Simulation")方法与对应的专属 **kwargs:
method | 说明 | 专属关键字参数 |
|---|---|---|
'trotter'(默认) | Trotter-Suzuki 分解,精度可控 | order(默认 1,须为 1 或偶数)、steps(默认 1000) |
'qdrift' | 随机化 Trotter 步,门数较少 | steps(默认 5000) |
'taylor' | Taylor/Chebyshev 级数近似 | degree(默认 5) |
'qsp' / 'qsvt'(别名) | 基于量子信号处理,精度更高但线路更深 | degree(默认 15)、beta(默认 0.7)、block_encoding_method(默认 'nagy') |
'cartan-lax' | Cartan 分解(Lax 流迭代),仅限实对称哈密顿量 | evol_time、lr、max_steps、reps |
'cartan-optimization' | Cartan 分解(数值优化),仅限实对称哈密顿量 | evol_time、lr(默认 1e-3)、max_steps(默认 100000)、optimizer('SD'/'BB'/'BFGS',默认 'SD') |
传入未在对应方法允许列表中的关键字参数会抛出 ValueError(而不是被静默忽略)。
直接使用底层方法类
若需要绕开统一入口直接实例化某个方法(例如访问更多方法专属属性),可以从 unitarylab.library.hamiltonian.method 导入:
import numpy as np
from unitarylab.library.hamiltonian.method import Trotter, CartanOptimization
H = np.array([[0, 1], [1, 0]], dtype=float)
# 等价于 hamiltonian_simulation(H, t=1.0, method='trotter', order=1, steps=100)
sim = Trotter(H=H, t=1.0, target_error=1e-3, order=1, steps=100, device="cpu")
circuit = sim.circuit
evolution = sim.evolution_result # 注意:公开属性名为 evolution_result,不带下划线前缀
print(sim.total_error)# Cartan 分解:适合 1-2 量子比特的精确哈密顿量演化,误差随优化收敛
H = np.array([[1.0, 0.5], [0.5, -1.0]], dtype=float) # 须为实对称矩阵
sim = CartanOptimization(
H=H, t=1.0, target_error=1e-3,
lr=1e-3, max_steps=10000, optimizer="SD", # 可选:'SD'、'BB'、'BFGS'
device="cpu",
)
circuit = sim.circuit
evolution = sim.evolution_result # 公开属性,不是 sim._evolution_result
circuit.draw(title="Cartan Hamiltonian Simulation")注意: Trotter/QDrift/Taylor/QSP/CartanLax/CartanOptimization 均继承自 HamiltonianSimulationResult,一律通过公开属性 .circuit、.evolution_result、.total_error 访问结果(内部以 _circuit/_evolution_result/_total_error 缓存,但用户不应直接访问带下划线的内部属性)。
量子信号处理(QSP)与量子奇异值变换(QSVT)
这两个模块提供基于多项式变换的量子算法框架,精度更高但线路深度更大,适合对精度要求高的场景。两者均可直接从 unitarylab.library 顶层导入。
QSP:基于块编码的哈密顿量模拟
用途: 对已块编码的酉算子实现多项式变换,QSP_hamiltonian_simulation 是专门用于近似 的封装。
from unitarylab import Circuit
from unitarylab.library import QSP_hamiltonian_simulation
# 1. 构造一个最小块编码线路 U_H
# 这里使用 1 个系统量子比特 + 1 个辅助量子比特
# 系统量子比特 q0 上施加 Z 门,可视为一个简单的 Pauli-Z 哈密顿量块编码示例
n = 1 # 系统寄存器量子比特数
m = 1 # 块编码辅助量子比特数
U_H = Circuit(n + m, name="Block Encoding of Z")
U_H.z(0)
# 2. 基于 QSP 构造哈密顿量模拟线路
circuit, factor, n_ancilla, n_qubits, degree = QSP_hamiltonian_simulation(
U_H=U_H,
n=n,
alpha=1.0, # 块编码归一化系数
m=m,
t=1.0, # 演化时间
epsilon=1e-3, # 目标近似误差
beta=0.5, # 必须满足 0 < beta < 1
flag=True, # True 表示近似 exp(-iHt)
)
print("factor:", factor)
print("n_ancilla:", n_ancilla)
print("n_qubits:", n_qubits)
print("degree:", degree)
print("circuit qubits:", circuit.get_num_qubits())
circuit.draw(title="QSP Hamiltonian Simulation")QSVT(量子奇异值变换):任意标量函数变换
用途: 对厄米矩阵实现任意标量多项式函数变换,适用于哈密顿量模拟、矩阵求逆等。顶层函数 QSVT() 是推荐入口;它内部构造 QSVTHermitian 并立即完成拟合,返回值就是拟合好的结果对象,可直接读取全部结果属性。
import numpy as np
from unitarylab.library import QSVT
# 1. 定义目标厄米矩阵
hamiltonian_matrix = np.array([
[0.8, 0.0],
[0.0, 0.4],
], dtype=complex)
# 2. 定义目标标量函数,例如 f(x) = exp(-i x)
target_function = lambda x: np.exp(-1j * x)
# 3. 调用统一入口(返回值已完成拟合,可直接使用)
qsvt = QSVT(
hamiltonian_matrix,
function=target_function,
target_error=1e-6,
block_encoding_method="nagy", # 可选:"nagy" 或 "fable"
device="cpu",
)
circuit = qsvt.circuit
error = qsvt.total_error
evolution = qsvt.evolution_result
print("degree:", qsvt.degree)
print("alpha:", qsvt.alpha)
print("m:", qsvt.m)
print("total_error:", error)
circuit.draw(title="QSVT Hermitian Approximation")需要更细粒度控制(例如手动分阶段拟合)时,可直接使用底层类 from unitarylab.library._qsvt.algorithm import QSVTHermitian,构造参数与 QSVT() 完全一致,但需要额外手动调用 ._run() 才能触发拟合。
块编码
用途: 将非酉矩阵 嵌入酉矩阵的左上角子块(),是 QSVT、LCU 等算法的基础构件。
from unitarylab.library import block_encode
import numpy as np
# 对任意矩阵进行块编码
A = np.array([[0.5, 0.1], [0.2, 0.3]], dtype=complex)
result = block_encode(A, method='nagy', eps=1e-3, verbose=False)
circuit = result.circuit # 块编码线路
alpha = result.alpha # 归一化系数
total_qubits = result.total_qubits
target_qubits = result.target_qubits| 参数 / 属性 | 说明 |
|---|---|
block_encode(matrix, method='nagy', eps=1e-3, verbose=False) | 通用入口,method 为 'nagy'(默认,基于奇异值分解的精确块编码)或 'fable'(Fast Approximate BLock-Encoding,eps 控制压缩阈值) |
BlockEncodingResult.circuit | 块编码线路(Circuit 对象) |
BlockEncodingResult.alpha | 归一化系数,使 可被块编码 |
BlockEncodingResult.total_qubits / .target_qubits | 编码线路总比特数 / 编码前系统比特数 |
底层类 FABLE、Nagy 可通过 from unitarylab.library.block_encoding import FABLE, Nagy 单独导入,供需要更细粒度控制的场景使用。
线性方程组求解
solve() 是统一入口,用于求解 形式的线性系统,内部按 method 参数分发到不同求解器,并统一返回 LinearSolverResult。
统一入口
from unitarylab.library import solve
import numpy as np
A = np.array([[2, 1], [1, 3]], dtype=float)
b = np.array([1, 0], dtype=float)
hhl_result = solve(A, b) # 默认 method='hhl'
hhl_precise = solve(A, b, method='hhl', d=10) # HHL,10 个相位寄存器比特
qsvt_result = solve(A, b, method='qsvt') # QSVT-based 求解器
vqls_result = solve(A, b, method='vqls') # 变分量子线性求解器
print(hhl_result.solution) # 近似解向量 x
print(hhl_result.circuit) # 构造的量子线路(可能为 None)method | 说明 | 主要专属参数 |
|---|---|---|
'hhl'(默认) | Harrow–Hassidim–Lloyd,要求 为厄米矩阵 | d(相位寄存器比特数,默认 6) |
'qsvt' / 'qsvt_qlsa' | 基于 QSVT 的量子线性代数求解器 | epsilon(多项式精度,默认 0.001) |
'schro' / 'schro_trotter' / 'schro_classical' | 基于 Schrödingerization 变换 | 见 SCHROSolver |
'aqc' / 'discrete_adiabatic' | 离散绝热量子线性系统求解 | 见 AQCSolver |
'vqls' | 变分量子线性求解器,适用于任意方阵 | cost_function('local_ht'/'local_classical'/'global')、n_layers、maxiter、tol、seed、epsilon |
'cks' | Chebyshev Krylov 求解器,要求 为厄米矩阵 | epsilon(多项式精度,默认 0.01) |
solve() 还支持可选的 precondition 参数(None / 'diagonal' / 'symmetric' / 'ilu' 等),会在调用量子求解器前对 做预处理,并在返回前自动将解还原到原问题:
result = solve(A, b, method='hhl', precondition='diagonal')
print(result.precondition_mode) # 预处理元数据直接使用底层求解器
from unitarylab.library.linear_solver import HHLSolver
import numpy as np
A = np.array([[2, 1], [1, 3]], dtype=float)
b = np.array([1, 0], dtype=float)
# 注意:HHLSolver 返回的是元组 (circuit, solution, scaling_factor),不是对象
circuit, solution, scale = HHLSolver(A, b, d=6)
print(solution)QSVTSolver、SCHROSolver、AQCSolver、VQLSSolver、CKSSolver 同样可从 unitarylab.library.linear_solver 导入,返回值格式与 HHLSolver 一致(均为 (circuit, solution, scaling_factor) 三元组)。solve() 统一入口内部正是对这些函数做了同样的调用并包装成 LinearSolverResult。
Pauli 工具
用途: 将任意厄米矩阵分解为 Pauli 张量积的线性组合,是哈密顿量模拟、可观测量估计等场景的预处理步骤。
from unitarylab.library.pauli_operator.pauli_string_decomposition import pauli_string_decomposition
import numpy as np
# 将 2x2 厄米矩阵分解为 Pauli 项
H = np.array([[1, 0.5], [0.5, -1]], dtype=complex)
terms = pauli_string_decomposition(H)
print(terms)
# 应包含 Z: 1 和 X: 0.5;返回顺序不保证,幅度小于 1e-10 的项会被自动丢弃返回值说明: pauli_string_decomposition() 返回的是 list[tuple[str, complex]](Pauli 串与系数的元组列表),不是字典;Pauli 串中最左侧字符对应 qubit 0(最低位)。可选参数 sets(预先指定的 Pauli 串集合)、partition_commuting(是否重排为对易分组,默认 True)、real_symmetric_hint(若输入已知为实对称矩阵可设为 True,跳过含奇数个 Y 的项以加速)。
PDE 求解框架
unitarylab.library.equation 提供一套基于 Schrödingerization 方法的量子偏微分方程(PDE)求解框架,包含方程解析、微分算子构造和内置方程示例。这一子模块面向配置驱动的调用方式(JSON 参数 + 算法注册表),而不是简单的构造函数调用,适合与上层服务集成;如果只是想在脚本中调用某个具体算法,建议直接阅读对应示例目录下的 algorithm.py 源码。
子模块结构
equation/
├── differential_operator/ # 微分算子构造(有限差分、块编码)
├── equation_parser/ # 方程解析器(边界条件、离散化、求解器)
├── examples/ # 内置方程示例(每个子目录是一个独立算法模块)
└── schrodingerization/ # Schrödingerization 变换(时间演化)内置方程示例
equation/examples/ 下共有 20 个内置示例目录,每个目录都是一个独立的算法模块,包含 algorithm.py(BaseAlgorithm 子类)、setup.json(默认参数配置)和 __init__.py(声明 ALGORITHM_NAME/ALGORITHM_CLASS):
equation_heat、equation_heat2d、equation_heatVariableCoefficient、equation_backHeat、equation_backHeat2d、equation_advection、equation_burgers、equation_burgers2d、equation_maxwell、equation_Helmholtz、equation_blackScholes、equation_elasticWave、equation_elasticWave2d、equation_OUprocess、equation_SchrABC、equation_general、equation_hamiltonjacobi、equation_multiElliptic、equation_multiTransport、equation_traffic。
所有算法类的 run() 都接受公共参数 params=None, algo_dir=None:params 为 None 时自动读取该示例目录下的 setup.json(一份描述边界条件、离散格式、方程参数的结构化 JSON),也可以传入等价的 dict 或 JSON 字符串覆盖默认配置;algo_dir 用于存放运行日志与结果文件。注意:签名并不完全统一 —— 其中 11 个示例(equation_heat、equation_heat2d、equation_backHeat、equation_backHeat2d、equation_advection、equation_burgers、equation_burgers2d、equation_elasticWave、equation_general、equation_traffic、equation_blackScholes)额外支持 backend='torch', device='cpu', dtype=np.complex128 三个模拟参数,而另外 9 个(equation_Helmholtz、equation_OUprocess、equation_SchrABC、equation_elasticWave2d、equation_hamiltonjacobi、equation_heatVariableCoefficient、equation_maxwell、equation_multiElliptic、equation_multiTransport)目前只接受 params/algo_dir 两个参数。调用前建议先用 inspect.signature() 或直接查看对应 algorithm.py 确认该示例的具体签名。
from unitarylab.library.equation.examples.equation_heat import HeatEquationAlgorithm
solver = HeatEquationAlgorithm()
result = solver.run() # params=None 时自动读取 equation_heat/setup.json 中的默认配置注意: 这套框架的参数结构(setup.json 里的 boundary_condition/discrete_format/equation 等字段)比一般的 Python 构造函数复杂得多,建议先阅读目标示例目录下的 setup.json 了解可配置项,再决定是否需要通过 params 覆盖。
推荐阅读顺序
如果你是第一次使用算法库,建议按以下顺序探索:
QFT/IQFT:理解基础量子算法原语QPE:利用 QFT 估计本征值LCU:组合多个酉算子block_encode:将经典矩阵编码到量子线路hamiltonian_simulation():模拟量子系统演化(默认method='trotter')solve():求解线性方程组(默认method='hhl')QSVT():高精度矩阵函数变换