About cookies on this site Our websites require some cookies to function properly (required). In addition, other cookies may be used with your consent to analyze site usage, improve the user experience and for advertising. For more information, please review your options. By visiting our website, you agree to our processing of information as described in IBM’sprivacy statement. To provide a smooth navigation, your cookie preferences will be shared across the IBM web domains listed here.
LieTrotter
class qiskit.synthesis.LieTrotter(reps=1, insert_barriers=False, cx_structure='chain', atomic_evolution=None, wrap=False, preserve_order=True)
Bases: SuzukiTrotter
The Lie-Trotter product formula.
The Lie-Trotter formula approximates the exponential of two non-commuting operators with products of their exponentials up to a second order error:
In this implementation, the operators are provided as sum terms of a Pauli operator. For example, we approximate
References
[1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders, “Efficient quantum algorithms for simulating sparse Hamiltonians” (2006). arXiv:quant-ph/0508139 [2]: N. Hatano and M. Suzuki, “Finding Exponential Product Formulas of Higher Orders” (2005). arXiv:math-ph/0506007
Parameters
- reps (int) – The number of time steps.
- insert_barriers (bool) – Whether to insert barriers between the atomic evolutions.
- cx_structure (str) – How to arrange the CX gates for the Pauli evolutions, can be
"chain"
, where next neighbor connections are used, or"fountain"
, where all qubits are connected to one. This only takes effect whenatomic_evolution is None
. - atomic_evolution (Callable[[Pauli |SparsePauliOp, float], QuantumCircuit] | Callable[[QuantumCircuit, Pauli |SparsePauliOp, float], None] | None) – A function to apply the evolution of a single
Pauli
, orSparsePauliOp
of only commuting terms, to a circuit. The function takes in three arguments: the circuit to append the evolution to, the Pauli operator to evolve, and the evolution time. By default, a single Pauli evolution is decomposed into a chain ofCX
gates and a singleRZ
gate. Alternatively, the function can also take Pauli operator and evolution time as inputs and returns the circuit that will be appended to the overall circuit being built. - wrap (bool) – Whether to wrap the atomic evolutions into custom gate objects. This only takes effect when
atomic_evolution is None
. - preserve_order (bool) – If
False
, allows reordering the terms of the operator to potentially yield a shallower evolution circuit. Not relevant when synthesizing operator with a single term.
Attributes
settings
Return the settings in a dictionary, which can be used to reconstruct the object.
Returns
A dictionary containing the settings of this product formula.
Raises
NotImplementedError – If a custom atomic evolution is set, which cannot be serialized.
Methods
expand
expand(evolution)
Expand the Hamiltonian into a Suzuki-Trotter sequence of sparse gates.
For example, the Hamiltonian H = IX + ZZ
for an evolution time t
and 1 repetition for an order 2 formula would get decomposed into a list of 3-tuples containing (pauli, indices, rz_rotation_angle)
, that is:
("X", [0], t), ("ZZ", [0, 1], 2t), ("X", [0], t)
Note that the rotation angle contains a factor of 2, such that that evolution of a Pauli over time , which is , is represented by (P, indices, 2 * t)
.
For N
repetitions, this sequence would be repeated N
times and the coefficients divided by N
.
Parameters
evolution (PauliEvolutionGate) – The evolution gate to expand.
Returns
The Pauli network implementing the Trotter expansion.
Return type
synthesize
synthesize(evolution)
Synthesize a PauliEvolutionGate
.
Parameters
evolution (PauliEvolutionGate) – The evolution gate to synthesize.
Returns
A circuit implementing the evolution.
Return type
Was this page helpful?
Report a bug or request content on GitHub.