# QSVT Hamiltonian Simulation
**English** · 简体中文
> Category C2 · Module [`oracq.algorithms.common.qsvt`](../../api/algorithms/common/qsvt.rst) · Stage V2
## Overview
Construct a block encoding of $e^{itA/\alpha}$ from a block encoding of a Hermitian matrix $A$ ($\alpha$ is the input BE normalization). The implementation follows the QSVT framework (Gilyén et al. 2019, [arXiv:1806.01838](https://arxiv.org/abs/1806.01838), cited in the module docstring) and the Jacobi–Anger expansion of $e^{itx}$, $e^{itx} = \cos(tx) + i\sin(tx)$: the even branch approximates $\cos(tx)$ and the odd branch approximates $\sin(tx)$; each branch goes through QSP phase synthesis (see [QSP phase synthesis](qsp-phase-synthesis.md)) and real-part extraction via $(U_\Phi + U_{-\Phi})/2$, and the two are finally combined in an LCU with coefficients 1 and $i$. The zero-signal block of the returned BE is approximately $e^{itA/\alpha}/\text{sim\_scale}$.
## Interface and input model
```python
qsvt_hamiltonian_simulation(a, t, *, error=0.01)
```
API entry: {obj}`qsvt_hamiltonian_simulation `
- `a`: a {obj}`BlockEncoding `, the block encoding of the simulated Hamiltonian (input model BE).
- `t`: the evolution time, which must be a nonzero finite real number.
- `error`: the polynomial approximation error, which must lie in $(0, 1)$.
Returns a `BlockEncoding`. Module attributes:
| Attribute | Meaning |
|---|---|
| `algorithm` | `"qsvt_hamiltonian_simulation"` |
| `be_alpha` | normalization of the output BE (an LCU of the two branches with coefficients 1 and $i$; 2.0) |
| `time` / `error` | echo of the call parameters |
| `qsp_degree` | the Bessel truncation degree $K$ (the degrees actually synthesized for the two branches are the even / odd degrees not exceeding $K$) |
| `sim_scale` | the output scaling $2s$ (the zero-signal block is approximately $e^{itA/\alpha}/\text{sim\_scale}$) |
## Implementation notes
The truncation degree is adaptive: $J_k(t)$ is computed by power series (pure Python), $K$ is the smallest degree for which the sum of the absolute values of the Bessel tail terms does not exceed `error`/4, capped at an upper bound of 40. The two branches share the uniform scaling $s = 1.5\max(\lVert f_c\rVert_\infty, \lVert f_s\rVert_\infty, 10^{-3})$, leaving headroom for the imaginary-part completion, and $\text{sim\_scale} = 2s$. A parity-check violation (the cos branch must be even, the sin branch odd) raises {obj}`ValidationError `; the candidate families of imaginary-part completions (a constant plus a single even power for the cos branch, a single odd power for the sin branch) are tried one by one, and the first synthesizable candidate is taken.
Applicability boundary: $t = 0$ is rejected (a trivial case); for very large $|t|$, the required truncation degree reaches the cap of 40 before the error condition does, in which case the `error` bound may not be met without an error being raised, and the caller must verify this on its own. The output is scaled by `sim_scale` and must be divided back out after readout.
## Validation approach
Category C2 (approximately continuous semantics; the acceptance criteria are in `../../development/validation-plan.md` §2): the acting operator must approximate the target continuous function within tolerance. Three layers of evidence:
- Structure: `tests/core/test_qsvt.py:TransformWitnessTests.test_transform_input_validation` (negative cases such as t = 0 and out-of-range error) and `PhaseSynthesisTests.test_input_validation` (the input validation of the underlying synthesis).
- Numerical: `tests/core/test_qsvt.py:TransformWitnessTests.test_hamiltonian_simulation_block` — a 2×2 diagonal matrix (eigenvalues 0.5 and $-0.25$, $\alpha = 0.5$, spectral variables 1.0 and $-0.5$), t = 0.7, error = 0.01: the zero-signal block amplitudes are read out column by column and cross-checked against $e^{itx}/\text{sim\_scale}$, delta = 5e-4.
- Binding: this algorithm has no independent binding witness (the input already requires a concrete BE).
## Known gaps and planned stages
Consistent with the `qsvt.py` row of the validation coverage matrix: convergence scans are missing (batch curves of the error versus t / degree are not automated, pending the stage V2 convergence-scan framework); the ill-conditioned negative cases (degree ≳ 16 or too-low precision) are partially covered by the parametrized input_validation, and a separate batch parametrization of "ill-conditioned inputs must raise" is still to be added.
## Related links
- Source: `src/oracq/algorithms/common/qsvt.py`
- API reference: [QSVT standard transforms](../../api/algorithms/common/qsvt.rst)
- Same-family pages: [QSP phase synthesis](qsp-phase-synthesis.md), [QSVT matrix inversion](qsvt-matrix-inversion.md)
- Validation matrix: [Validation coverage matrix](../../development/validation-coverage.md)
## Numerical validation
Paper-grade numerical experiments are in `tests/verification/verify_hamiltonian.py` (real-backend execution, no mock substitutes). Experiment design: the input BE is a non-diagonal Hermitian matrix $A = \begin{pmatrix} 0.5 & 0.2 \\ 0.2 & -0.3 \end{pmatrix}$ encoded by {obj}`matrix_pauli_encoding ` ($\alpha = 0.7$), with $t \in \{0.7, 2.0\}$ and `error = 0.01`; on the three paths reference / rir-pysparq / originir-ext, the full $2\times2$ zero-signal block is read out column by column and cross-checked against $e^{itA/\alpha}/\text{sim\_scale}$ computed by `scipy.linalg.expm`. The implementation error (circuit block vs the $e^{itx}$ reference) and the method error (the Jacobi–Anger truncation-tail bound $2\sum_{j>K}|J_j(t)|$, evaluated independently by `scipy.special.jv`) are reported separately.
| Case | Scale | Backend paths | Metric | Value |
|---|---|---|---|---|
| `qsvt-hamsim-t0.7` | $K = 4$, sim_scale ≈ 3.0 | reference, rir-pysparq, originir-ext | impl_error | 2.72e-5 |
| same as above | — | — | method tail bound / total error bound | 9.10e-5 / 1.18e-4 |
| `qsvt-hamsim-t2.0` | $K = 6$ | reference, rir-pysparq, originir-ext | impl_error | 5.42e-5 |
| same as above | — | — | method tail bound / total error bound | 4.00e-4 / 4.54e-4 |
The total error bounds at the two time points (1.2e-4 and 4.5e-4) are both far below the requested `error = 0.01`, and the implementation error is significantly below the method error, indicating that the truncation-degree choice is the dominant contributor to the error while phase synthesis and circuit assembly sit at the noise level.
Reproduction command:
```bash
PYTHONPATH=src /path/to/backend/python tests/verification/verify_hamiltonian.py
```
Artifacts: `out/verification/hamiltonian.json`.