Skip to Content

算法与工具库

概述

本章介绍 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, # 量子信号处理 )

其余更底层的方法类(如 TrotterHHLSolverQSVTHermitianCartanOptimization未在顶层导出,需要从各自子模块显式导入,本章后续每节都会给出正确路径。

模块功能分组

功能分组顶层入口底层子模块(需单独导入)
基础算法原语QFTIQFTQPELCU
哈密顿量模拟hamiltonian_simulation()hamiltonian.methodTrotterQDriftTaylorQSPCartanLaxCartanOptimization
量子信号处理 / QSVTQSPQSP_hamiltonian_simulationQSVT_qsp.algorithm_qsvt.algorithmQSVTHermitian
块编码block_encode()block_encodingFABLENagy
线性方程组求解solve()linear_solverHHLSolverQSVTSolverSCHROSolverAQCSolverVQLSSolverCKSSolver
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_circuitTrue 时只返回构造的 QPE 线路;False 时返回 (线路, 相位估计值, 概率)
backenddevicedtype内部执行 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_timelrmax_stepsreps
'cartan-optimization'Cartan 分解(数值优化),仅限实对称哈密顿量evol_timelr(默认 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编码线路总比特数 / 编码前系统比特数

底层类 FABLENagy 可通过 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_layersmaxitertolseedepsilon
'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)

QSVTSolverSCHROSolverAQCSolverVQLSSolverCKSSolver 同样可从 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.pyBaseAlgorithm 子类)、setup.json(默认参数配置)和 __init__.py(声明 ALGORITHM_NAME/ALGORITHM_CLASS):

equation_heatequation_heat2dequation_heatVariableCoefficientequation_backHeatequation_backHeat2dequation_advectionequation_burgersequation_burgers2dequation_maxwellequation_Helmholtzequation_blackScholesequation_elasticWaveequation_elasticWave2dequation_OUprocessequation_SchrABCequation_generalequation_hamiltonjacobiequation_multiEllipticequation_multiTransportequation_traffic

所有算法类的 run() 都接受公共参数 params=None, algo_dir=NoneparamsNone 时自动读取该示例目录下的 setup.json(一份描述边界条件、离散格式、方程参数的结构化 JSON),也可以传入等价的 dict 或 JSON 字符串覆盖默认配置;algo_dir 用于存放运行日志与结果文件。注意:签名并不完全统一 —— 其中 11 个示例(equation_heatequation_heat2dequation_backHeatequation_backHeat2dequation_advectionequation_burgersequation_burgers2dequation_elasticWaveequation_generalequation_trafficequation_blackScholes)额外支持 backend='torch', device='cpu', dtype=np.complex128 三个模拟参数,而另外 9 个(equation_Helmholtzequation_OUprocessequation_SchrABCequation_elasticWave2dequation_hamiltonjacobiequation_heatVariableCoefficientequation_maxwellequation_multiEllipticequation_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 覆盖。


推荐阅读顺序

如果你是第一次使用算法库,建议按以下顺序探索:

  1. QFT / IQFT:理解基础量子算法原语
  2. QPE:利用 QFT 估计本征值
  3. LCU:组合多个酉算子
  4. block_encode:将经典矩阵编码到量子线路
  5. hamiltonian_simulation():模拟量子系统演化(默认 method='trotter'
  6. solve():求解线性方程组(默认 method='hhl'
  7. QSVT():高精度矩阵函数变换
最后更新于