qml.estimator.templates.TrotterPauli

class TrotterPauli(pauli_ham, num_steps, order, wires=None)[source]

Bases: ResourceOperator

An operation representing the Suzuki-Trotter product approximation for the complex matrix exponential of a Hamiltonian represented as a linear combination of tensor products of Pauli operators.

The Suzuki-Trotter product formula provides a method to approximate the matrix exponential of Hamiltonian expressed as a linear combination of terms which in general do not commute. Consider the Hamiltonian \(H = \Sigma^{N}_{j=0} \alpha_{j} \cdot O_{j}\): the product formula is constructed using symmetrized products of the terms in the Hamiltonian. The symmetrized products of order \(m \in [1, 2, 4, ..., 2k]\) with \(k \in \mathbb{N}\) are given by:

\[\begin{split}\begin{align} S_{1}(t) &= \Pi_{j=0}^{N} \ e^{i t \alpha_{j} O_{j}} \\ S_{2}(t) &= \Pi_{j=0}^{N} \ e^{i \frac{t}{2} \alpha_{j} O_{j}} \cdot \Pi_{j=N}^{0} \ e^{i \frac{t}{2} \alpha_{j} O_{j}} \\ &\vdots \\ S_{m}(t) &= S_{m-2}(p_{m}t)^{2} \cdot S_{m-2}((1-4p_{m})t) \cdot S_{m-2}(p_{m}t)^{2}, \end{align}\end{split}\]

where the coefficient is \(p_{m} = 1 / (4 - \sqrt[m - 1]{4})\). The \(m^{\text{th}}\) order, \(n\)-step Suzuki-Trotter approximation is then defined as:

\[e^{iHt} \approx \left [S_{m}(t / n) \right ]^{n}.\]

For more details see J. Math. Phys. 32, 400 (1991).

Parameters:
  • pauli_ham (PauliHamiltonian) – the Hamiltonian to be approximately exponentiated

  • num_steps (int) – number of Trotter steps to perform

  • order (int) – order of the approximation, must be 1 or an even number

  • wires (WiresLike | None) – the wires on which the operator acts

Resources:

The resource cost for this subroutine depends on how the Pauli Hamiltonian is expressed. Given the Hamiltonian \(H = \Sigma^{N}_{j=0} \alpha_{j} O_{j}\), each \(O_{j}\) can either be a Pauli string (a tensor product of Pauli operators) \(O_{j} = \vec{P}_{j}\) or a linear combination of commuting Pauli strings \(O_{j} = \Sigma^{M}_{j=0} \beta_{j} \vec{P}_{j}\).

In the first case, the exponential \(e^{i t \alpha_{j} O_{j}} = e^{i t \alpha_{j} \vec{P}_{j}}\) is a single generalized Pauli rotation (PauliRot). In the second case, the exponential can be expanded using the fact that all operators in the sum commute:

\[\begin{split}\begin{align} e^{i t \alpha_{j} O_{j}} &= e^{i t \alpha_{j} (\Sigma^{M}_{k=0} \beta_{k} \vec{P}_{k})} \\ e^{i t \alpha_{j} O_{j}} &= \Pi_{k=0}^{M} e^{i t \alpha_{j} \beta_{k} \vec{P}_{k}} \end{align}\end{split}\]

Thus, the exponential can be expressed as a product of \(M\) generalized Pauli rotations. Using this as the cost of each individual exponential, the cost of the entire Suzuki-Trotter product formula is derived below.

The number of times an operator \(e^{itO_{j}}\) is applied depends on the number of Trotter steps (n) and the order of the approximation (m) and is given by:

\[C_{O_j} = 2 \cdot n \cdot 5^{\frac{m}{2} - 1}.\]

Furthermore, because of the symmetric form of the recursive formula, the first and last terms get grouped. This reduces the counts for those terms to:

\[\begin{split}\begin{align} C_{O_{0}} &= n \cdot 5^{\frac{m}{2} - 1} + 1, \\ C_{O_{N}} &= n \cdot 5^{\frac{m}{2} - 1}. \end{align}\end{split}\]

Example

The resources for this operation are computed using the code below.

>>> pauli_terms = {"X":10, "XX":5, "XXXX":3, "YY": 5, "ZZ":5, "Z": 2}
>>> pauli_ham = qre.PauliHamiltonian(num_qubits=10, pauli_terms=pauli_terms)
>>> num_steps, order = (1, 2)
>>> res = qre.estimate(qre.TrotterPauli(pauli_ham, num_steps, order))
>>> print(res)
--- Resources: ---
 Total wires: 10
   algorithmic wires: 10
   allocated wires: 0
     zero state: 0
     any state: 0
 Total gates : 2.844E+3
   'T': 2.640E+3,
   'CNOT': 96,
   'Z': 20,
   'S': 40,
   'Hadamard': 48

Estimating resources for the Trotterization of a Pauli Hamiltonian depends on how the Pauli Hamiltonian was constructed. Specifically, if the terms of the Hamiltonian were separated into commuting groups (see PauliHamiltonian for more information). Note, that the order in which the groups are listed matters, keeping the largest groups as the first and last elements of the list will lead to the most reduction in resources.

>>> commuting_groups = (
...     {"X":10, "XX":5, "XXXX":3},
...     {"YY": 5, "ZZ":5},
...     {"Z": 2},
... )
>>> pauli_ham = qre.PauliHamiltonian(num_qubits=10, pauli_terms=commuting_groups)
>>> num_steps, order = (1, 2)
>>> res = qre.estimate(qre.TrotterPauli(pauli_ham, num_steps, order))
>>> print(res)
--- Resources: ---
 Total wires: 10
   algorithmic wires: 10
   allocated wires: 0
     zero state: 0
     any state: 0
 Total gates : 2.756E+3
   'T': 2.552E+3,
   'CNOT': 96,
   'Z': 20,
   'S': 40,
   'Hadamard': 48

resource_keys

resource_params

Returns a dictionary containing the minimal information needed to compute the resources.

resource_keys = {'num_steps', 'order', 'pauli_ham'}
resource_params

Returns a dictionary containing the minimal information needed to compute the resources.

Returns:

A dictionary containing the resource parameters:
  • pauli_ham (PauliHamiltonian): The Hamiltonian to be approximately exponentiated

  • num_steps (int): number of Trotter steps to perform

  • order (int): order of the approximation, must be 1 or even.

Return type:

dict

cost_pauli_group(pauli_terms)

Given a dictionary of Pauli words and frequencies, return the cost of exponentiating the group of terms.

resource_decomp(pauli_ham, num_steps, order)

Returns a list representing the resources of the operator.

resource_rep(pauli_ham, num_steps, order)

Returns a compressed representation containing only the parameters of the Operator that are needed to compute the resources.

static cost_pauli_group(pauli_terms)[source]

Given a dictionary of Pauli words and frequencies, return the cost of exponentiating the group of terms.

Parameters:

pauli_terms (dict) – A dictionary which represents the types of Pauli words in the Hamiltonian and their relative frequencies.

Returns:

The cost of exponentiating

a commuting group of Pauli words.

Return type:

Iterable[GateCount]

classmethod resource_decomp(pauli_ham, num_steps, order)[source]

Returns a list representing the resources of the operator. Each object represents a quantum gate and the number of times it occurs in the decomposition.

Parameters:
  • pauli_ham (PauliHamiltonian) – The Hamiltonian to be approximately exponentiated

  • num_steps (int) – number of Trotter steps to perform

  • order (int) – order of the approximation, must be 1 or even.

Resources:

The resource cost for this subroutine depends on how the Pauli Hamiltonian is expressed. Given the Hamiltonian \(H = \Sigma^{N}_{j=0} \alpha_{j} O_{j}\), each \(O_{j}\) can either be a Pauli string (a tensor product of Pauli operators) \(O_{j} = \vec{P}_{j}\) or a linear combination of commuting Pauli strings \(O_{j} = \Sigma^{M}_{j=0} \beta_{j} \vec{P}_{j}\).

In the first case, the exponential \(e^{i t \alpha_{j} O_{j}} = e^{i t \alpha_{j} \vec{P}_{j}}\) is a single generalized Pauli rotation (PauliRot). In the second case, the exponential can be expanded using the fact that all operators in the sum commute:

\[\begin{split}\begin{align} e^{i t \alpha_{j} O_{j}} &= e^{i t \alpha_{j} (\Sigma^{M}_{k=0} \beta_{k} \vec{P}_{k})} \\ e^{i t \alpha_{j} O_{j}} &= \Pi_{k=0}^{M} e^{i t \alpha_{j} \beta_{k} \vec{P}_{k}} \end{align}\end{split}\]

Thus, the exponential can be expressed as a product of \(M\) generalized Pauli rotations. Using these as the cost of each individual exponential, the cost of the entire Suzuki-Trotter product formula is derived below.

The number of times an operator \(e^{itO_{j}}\) is applied depends on the number of Trotter steps (n) and the order of the approximation (m) and is given by:

\[C_{O_j} = 2 * n \cdot 5^{\frac{m}{2} - 1}.\]

Furthermore, because of the symmetric form of the recursive formula, the first and last terms get grouped. This reduces the counts for those terms to:

\[\begin{split}\begin{align} C_{O_{0}} &= n \cdot 5^{\frac{m}{2} - 1} + 1, \\ C_{O_{N}} &= n \cdot 5^{\frac{m}{2} - 1}. \end{align}\end{split}\]
Returns:

A list of GateCount objects, where each object represents a specific quantum gate and the number of times it appears in the decomposition.

Return type:

list[GateCount]

classmethod resource_rep(pauli_ham, num_steps, order)[source]

Returns a compressed representation containing only the parameters of the Operator that are needed to compute the resources.

Parameters:
  • pauli_ham (PauliHamiltonian) – The Hamiltonian to be approximately exponentiated

  • num_steps (int) – number of Trotter steps to perform

  • order (int) – order of the approximation, must be 1 or even.

Returns:

the operator in a compressed representation

Return type:

CompressedResourceOp

Contents

Using PennyLane

Release news

Development

API

Internals