Truncated Taylor Block Encoding¶
English · 简体中文
Category C2 · Module
oracq.algorithms.common.hamiltonian· Stage V2
Overview¶
Assemble the truncated Taylor series of a matrix exponential into a block encoding: given a block encoding of the generator and an order \(d\),
form a linear combination of the \(k\)-th powers \(H^k\) (the \(k\)-fold product of the input BE) with analytic coefficients. The module docstring positions it as “a closable ordinary Hamiltonian-function BE”, for QODE solvers to use as an injectable hamiltonian_function; it does not require Hermiticity and does not claim to be an efficiently optimal HamSim algorithm, and can be replaced by the QSP/HamSim protocol (see Hamiltonian simulation protocol).
Interface and input model¶
taylor_hamiltonian(hamiltonian, time, *, degree=2)
API entry: taylor_hamiltonian
hamiltonian: aBlockEncoding, the block encoding of the evolution generator (input model BE); the mathematical semantics (such as Hermiticity) are the caller’s responsibility.time: the evolution time, a finite real number.degree: the truncation order \(d\), a non-negative integer, default 2.
Returns a BlockEncoding whose zero-signal block approximately equals \(\sum_k (-it)^k H^k / k!\). Module attributes:
Attribute |
Meaning |
|---|---|
|
|
|
echo of the call parameters |
|
the LCU normalization \(\sum_{k=0}^{d} (\alpha t)^k / k!\) (\(\alpha\) is the input BE normalization) |
|
|
Implementation notes¶
The power sequence is generated iteratively: starting from \((1, I)\), product(hamiltonian, current) right-multiplies step by step to obtain \(H^k\), the coefficients are taken analytically as \((-it)^k / k!\), and the whole is then combined by lcu(powers). The register layout is decided by the LCU: target = Bits(width), and signal is the selector (\(\lceil\log_2(d+1)\rceil\) bits) concatenated with each term’s signal space; the phases of complex coefficients are realized by global phase gates.
Applicability boundary: the gate count grows linearly with \(d\) (a deep power chain); this function performs no truncation-error-bound analysis, and the error is to be assessed by the caller from \(\lVert H\rVert t\) and \(d\). Generation-time validation checks that degree is a non-negative integer and time a finite real number.
Validation approach¶
Category C2 (approximately continuous semantics; the acceptance criteria are in ../development/validation-plan.md §2). The statement consistent with the validation coverage matrix is: the hamiltonian.py row lists no separate numerical witness for this entry point, and this function’s evidence comes from being consumed by the ODE solvers —
Structure:
tests/core/test_differential.py:DifferentialStructureTests.test_four_methods_keep_input_oraclesinjects it withdegree=1into the four routes lchs / cbmd / schrodingerization / carleman, checking that the input oracle slots are kept and that the IR round-trips through JSON (registered in the ode row of the validation coverage matrix).Numerical:
tests/core/test_sde.py:SolverContractTests.test_qode_problem_accepted_by_lchslikewise injects the LCHS contract withdegree=1and solves (registered in the sde row). A direct cross-check of the truncation accuracy itself, “error vs order”, is missing.Binding: no independent binding witness; the binding semantics of the LCU combinator are covered by
tests/core/test_language.py:BlockEncodingTests.test_alpha_survives_ir_serialization(see block encoding algebra).
Known gaps and planned stages¶
Consistent with the hamiltonian.py row of the validation coverage matrix: the module’s registered gap is the Trotter order-error-rate sweep (stage V2 convergence-scan framework); a direct cross-check of this entry point’s own Taylor truncation error is the same kind of convergence evidence, to be added once that framework lands.
Numerical validation¶
Paper-grade numerical validation script: tests/verification/verify_blockencoding.py (real-backend execution, no mocks, no skips; all 73 cases passed as of 2026-09-16), with artifacts in out/verification/blockencoding.json. This page corresponds to the 4 cases taylor-block-encoding-d{1,2,3,4}, closing the registered gap of “a direct error-vs-order cross-check of the truncation accuracy itself is missing”.
Experiment design: the input generator is the 2×2 Hermitian matrix \(H=\begin{pmatrix}1.0&0.4\\0.4&-0.6\end{pmatrix}\) (encoded by matrix_pauli_encoding, \(\alpha_{\rm in}=1.4\)), with evolution time \(t=0.7\) and orders \(d=1..4\). The block semantics are \(\big(\sum_{k\le d}(-itH)^k/k!\big)/\alpha\), with \(\alpha=\sum_{k\le d}(\alpha_{\rm in}t)^k/k!\). Two classes of error are reported separately: implementation error — the zero-signal block extracted column by column on reference against the same-order truncated series (computed independently with numpy); method error — the block against \(e^{-iHt}/\alpha\) (computed independently with a numpy eigendecomposition); additionally, be_alpha is checked against the closed form of the series, and rir-pysparq / adapter-pysparq cross-check column by column.
Case |
Degree |
Implementation error |
Method error (informational) |
\(\alpha\) deviation |
Backend cross-check |
|---|---|---|---|---|---|
|
1 |
8.3e-17 |
1.41e-1 |
0 |
0 |
|
2 |
1.8e-16 |
2.81e-2 |
0 |
0 |
|
3 |
1.7e-16 |
5.20e-3 |
0 |
0 |
|
4 |
1.9e-16 |
7.75e-4 |
0 |
0 |
The method error decreases monotonically with the order (on the order of \((\alpha_{\rm in}t)^{d+1}/(d+1)!\), with \(\alpha_{\rm in}t=0.98\)), while the implementation error stays at machine precision — the truncation error is indeed controlled by the caller through \(d\), and the assembly itself introduces no extra error.
Reproduction command:
PYTHONPATH=src /path/to/backend/python tests/verification/verify_blockencoding.py
Artifacts: out/verification/blockencoding.json.