The three-body terms $\exp[-i\theta(X_1X_2+Y_1Y_2)X_3]$ and $\exp[-i\theta(X_1X_2+Y_1Y_2)Y_3]$ lead to unitaries of the form $$ \begin{bmatrix} 1 & & & & & & & \\ & 1 & & & & & & \\ & & a & & & b & & \\ & & & a & b & & & \\ & & & b & a & & & \\ & & b & & & a & & \\ & & & & & & 1 & \\ & & & & & & & 1 \end{bmatrix} $$ Are there known decompositions of this type of unitary using either three-qubit (e.g. Fredkin + single-qubit) gates or two-qubit (e.g. FSim + single-qubit) gates?

  • $\begingroup$ Hi there, Just a small clarification. Are you asking specifically for a decomposition of this exponential operator in terms of FSim and single qubit gates? Or will any decomposition do? $\endgroup$
    – Callum
    Feb 20, 2023 at 14:51
  • $\begingroup$ Hi, any decomposition will do. I was hoping that the decomposition would use commonly used gates, but it's not a requirement. $\endgroup$
    – NaturalLog
    Feb 20, 2023 at 15:00

2 Answers 2


I don't know of a standard decomposition for this but I was able to synthesise a circuit for the first three body term in pytket.

Edit: As was pointed out by @bm422 the two Pauli terms commute making this particular case simpler. However the code below should work for non commuting Pauli terms as well.

Exponentials of Pauli terms can be expressed as Pauli gadgets (circuits in the $\{CX, Rz\}$ gateset with appropriate single qubit basis rotations on either side).

I first make a QubitPauliOperator expressing the sum of the two Pauli Strings and then use the gen_term_sequence_circuit function to synthesise the circuit. This function should take a sum of Pauli strings $H$ and generate a circuit for $e^{-i \theta H}$.

My code is below.

from pytket import Circuit, Qubit
from pytket.pauli import Pauli, QubitPauliString
from pytket.utils import QubitPauliOperator, gen_term_sequence_circuit
from sympy import Symbol
from pytket.circuit.display import render_circuit_jupyter
from pytket.passes import DecomposeBoxes

theta_rad = Symbol('theta') # theta expressed number of half turns (radians)

xxx = QubitPauliString({Qubit(0):Pauli.X, Qubit(1):Pauli.X, Qubit(2):Pauli.X})
yyx = QubitPauliString({Qubit(0):Pauli.Y, Qubit(1):Pauli.Y, Qubit(2):Pauli.X})

qpo = QubitPauliOperator({xxx:theta_rad, yyx:theta_rad})

empty_3qb_circuit = Circuit(3)

circ = gen_term_sequence_circuit(qpo, empty_3qb_circuit) 

# Circuit will be expressed as a PauliExpBox, decompose to familiar gates

render_circuit_jupyter(circ) # Draw circuit
# if theta_rad is replaced with a numeric value use circ.get_unitary() to see matrix

I've tried out calculating the unitary for a few numerical values of $\theta$ and they match the form of the matrix you provided so I think this is probably okay.

If you wish to see this expressed in terms of FSim gates you could probably define a RebaseCustom pass to accomplish this.

Hope this helps.

enter image description here


The answer by @Callum already provides a valid decomposition of the three-body terms. I just want to stress that, in both examples provided in the question, the two Pauli strings in the exponent commute with each other, so we can consider the exponentials of each Pauli string separately. In that case, we can make use of the general result from Exercise 4.51 of Nielsen & Chuang's "Quantum Computation and Quantum Information" (10th Anniversary Edition), which gives rise to the same sort of quantum circuit obtained by @Callum from pytket.

enter image description here

  • $\begingroup$ Yes, this is a point I should've mentioned. Thanks for pointing that out. The code in my answer should work for non-commuting Pauli terms as well. $\endgroup$
    – Callum
    Feb 20, 2023 at 18:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.