Trotter-Suzuki Product Formulas
Product formulas approximate e^{-iHt} by chopping it into small implementable steps, the workhorse of near-term Hamiltonian simulation.
Splitting a non-commuting exponential
The Hamiltonian is a sum H = sum_j H_j of terms that do not commute, so exp(-iHt) is not the product of the individual exponentials. The Lie-Trotter formula recovers it in the limit of many small steps, and the second-order Suzuki formula halves the leading error.
# First-order (Lie-Trotter), r steps of size dt = t/r
# exp(-iHt) ~= [ prod_j exp(-i H_j dt) ]^r
# Second-order (Suzuki) symmetric splitting:
# S2(dt) = prod_j exp(-i H_j dt/2) * prod_{j reversed} exp(-i H_j dt/2)
def trotter2(H_terms, t, r):
dt = t / r
step = []
for Hj in H_terms: step.append(('exp', Hj, dt/2))
for Hj in reversed(H_terms): step.append(('exp', Hj, dt/2))
return step * r # circuit = r repetitions of S2
Error scaling
For the first-order formula the total error scales as O(t^2/r), i.e. it falls linearly with the number of steps r. The second-order formula scales as O(t^3/r^2). More precisely the step error is bounded by nested commutators of the terms:
|| exp(-iHt) - S2(t/r)^r || = O( t^3 / r^2 * sum_{j,k,l} ||[H_j,[H_k,H_l]]|| )
# commutator norms -> tighter bounds when terms nearly commute
# gate count grows with number of Pauli terms L and steps r
Fit to the Kronos program
- Simple to compile and requires no extra ancilla qubits, so it is the first thing tried on NISQ hardware.
- Circuit depth grows with the number of Pauli terms, which for a realistic first-wall active space is large.
- Practical accuracy on today's devices is limited by gate noise long before the Trotter error itself matters.
For Kronos, Trotterization is a benchmarking primitive: we use it to generate short-time evolutions inside UCCSD ansatze and to validate against classical exact-diagonalization on small first-wall clusters. For asymptotically better scaling we look to qubitization, and for eigenvalues to phase estimation.