Skip to main contentIBM Quantum Documentation Mirror

SuzukiTrotter

class qiskit.synthesis.SuzukiTrotter(order=2, reps=1, insert_barriers=False, cx_structure='chain', atomic_evolution=None, wrap=False)

GitHub(opens in a new tab)

Bases: ProductFormula

The (higher order) Suzuki-Trotter product formula.

The Suzuki-Trotter formulas improve the error of the Lie-Trotter approximation. For example, the second order decomposition is

eA+BeB/2eAeB/2.e^{A + B} \approx e^{B/2} e^{A} e^{B/2}.

Higher order decompositions are based on recursions, see Ref. [1] for more details.

In this implementation, the operators are provided as sum terms of a Pauli operator. For example, in the second order Suzuki-Trotter decomposition we approximate

eit(XX+ZZ)=eit/2ZZeitXXeit/2ZZ+O(t3).e^{-it(XX + ZZ)} = e^{-it/2 ZZ}e^{-it XX}e^{-it/2 ZZ} + \mathcal{O}(t^3).

References

[1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders, “Efficient quantum algorithms for simulating sparse Hamiltonians” (2006). arXiv:quant-ph/0508139(opens in a new tab) [2]: N. Hatano and M. Suzuki, “Finding Exponential Product Formulas of Higher Orders” (2005). arXiv:math-ph/0506007(opens in a new tab)

Deprecated since version 1.2_pending

The ‘Callable[[Pauli | SparsePauliOp, float], QuantumCircuit]’ signature of the ‘atomic_evolution’ argument is pending deprecation as of qiskit 1.2. It will be marked deprecated in a future release, and then removed no earlier than 3 months after the release date. Instead you should update your ‘atomic_evolution’ function to be of the following type: ‘Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None]’.

Parameters

  • order (int(opens in a new tab)) – The order of the product formula.
  • reps (int(opens in a new tab)) – The number of time steps.
  • insert_barriers (bool(opens in a new tab)) – Whether to insert barriers between the atomic evolutions.
  • cx_structure (str(opens in a new tab)) – 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 when atomic_evolution is None.
  • atomic_evolution (Callable[[Pauli |SparsePauliOp, float(opens in a new tab)], QuantumCircuit] | Callable[[QuantumCircuit, Pauli |SparsePauliOp, float(opens in a new tab)], None] | None) – A function to apply the evolution of a single Pauli, or SparsePauliOp 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 of CX gates and a single RZ 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(opens in a new tab)) – Whether to wrap the atomic evolutions into custom gate objects. This only takes effect when atomic_evolution is None.

Raises

ValueError(opens in a new tab) – If order is not even


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(opens in a new tab) – If a custom atomic evolution is set, which cannot be serialized.


Methods

synthesize

synthesize(evolution)

GitHub(opens in a new tab)

Synthesize an qiskit.circuit.library.PauliEvolutionGate.

Parameters

evolution (PauliEvolutionGate) – The evolution gate to synthesize.

Returns

A circuit implementing the evolution.

Return type

QuantumCircuit