Skip to main contentIBM Quantum Documentation

Circuit Synthesis

qiskit.synthesis


Evolution Synthesis

EvolutionSynthesis()Interface for evolution synthesis algorithms.
ProductFormula(order[, reps, ...])Product formula base class for the decomposition of non-commuting operator exponentials.
LieTrotter([reps, insert_barriers, ...])The Lie-Trotter product formula.
SuzukiTrotter([order, reps, ...])The (higher order) Suzuki-Trotter product formula.
MatrixExponential()Exact operator evolution via matrix exponentiation and unitary synthesis.
QDrift([reps, insert_barriers, ...])The QDrift Trotterization method, which selects each each term in the Trotterization randomly, with a probability proportional to its weight.

Linear Function Synthesis

synth_cnot_count_full_pmh

qiskit.synthesis.synth_cnot_count_full_pmh(state, section_size=None)

GitHub

Synthesize linear reversible circuits for all-to-all architecture using Patel, Markov and Hayes method.

This function is an implementation of the Patel, Markov and Hayes algorithm from [1] for optimal synthesis of linear reversible circuits for all-to-all architecture, as specified by an n×nn \times n matrix.

Parameters

  • state (list[list[bool]] | np.ndarray[bool]) – n×nn \times n boolean invertible matrix, describing the state of the input circuit.
  • section_size (int | None) – The size of each section in the Patel–Markov–Hayes algorithm [1]. If None it is chosen to be max(2,αlog2(n))\max(2, \alpha\log_2(n)) with α=0.56\alpha = 0.56, which approximately minimizes the upper bound on the number of row operations given in [1] Eq. (3).

Returns

A CX-only circuit implementing the linear transformation.

Raises

ValueError – When section_size is larger than the number of columns.

Return type

QuantumCircuit

References

  1. Patel, Ketan N., Igor L. Markov, and John P. Hayes, Optimal synthesis of linear reversible circuits, Quantum Information & Computation 8.3 (2008): 282-294. arXiv:quant-ph/0302002 [quant-ph]

synth_cnot_depth_line_kms

qiskit.synthesis.synth_cnot_depth_line_kms(mat)

GitHub

Synthesize linear reversible circuit for linear nearest-neighbor architectures using Kutin, Moulton, Smithline method.

Synthesis algorithm for linear reversible circuits from [1], section 7. This algorithm synthesizes any linear reversible circuit of nn qubits over a linear nearest-neighbor architecture using CX gates with depth at most 5n5n.

Parameters

mat (ndarray[bool]) – A boolean invertible matrix.

Returns

The synthesized quantum circuit.

Raises

QiskitError – if mat is not invertible.

Return type

QuantumCircuit

References

  1. Kutin, S., Moulton, D. P., Smithline, L., Computation at a distance, Chicago J. Theor. Comput. Sci., vol. 2007, (2007), arXiv:quant-ph/0701194

Linear-Phase Synthesis

synth_cz_depth_line_mr

qiskit.synthesis.synth_cz_depth_line_mr(mat)

GitHub

Synthesis of a CZ circuit for linear nearest neighbor (LNN) connectivity, based on Maslov and Roetteler.

Note that this method reverts the order of qubits in the circuit, and returns a circuit containing CXGates and phase gates (SGate, SdgGate or ZGate).

Parameters

mat (ndarray) – an upper-diagonal matrix representing the CZ circuit. mat[i][j]=1 for i<j represents a cz(i,j) gate

Returns

A circuit implementation of the CZ circuit of depth 2n+22n+2 for LNN connectivity.

Return type

QuantumCircuit

References

  1. Dmitri Maslov, Martin Roetteler, Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations, arXiv:1705.09176.

synth_cx_cz_depth_line_my

qiskit.synthesis.synth_cx_cz_depth_line_my(mat_x, mat_z)

GitHub

Joint synthesis of a -CZ-CX- circuit for linear nearest neighbor (LNN) connectivity, with 2-qubit depth at most 5n, based on Maslov and Yang. This method computes the CZ circuit inside the CX circuit via phase gate insertions.

Parameters

  • mat_z (ndarray) – a boolean symmetric matrix representing a CZ circuit. mat_z[i][j]=1 represents a cz(i,j) gate
  • mat_x (ndarray) – a boolean invertible matrix representing a CX circuit.

Returns

A circuit implementation of a CX circuit following a CZ circuit, denoted as a -CZ-CX- circuit,in two-qubit depth at most 5n, for LNN connectivity.

Return type

QuantumCircuit

References

  1. Kutin, S., Moulton, D. P., Smithline, L., Computation at a distance, Chicago J. Theor. Comput. Sci., vol. 2007, (2007), arXiv:quant-ph/0701194
  2. Dmitri Maslov, Willers Yang, CNOT circuits need little help to implement arbitrary Hadamard-free Clifford transformations they generate, arXiv:2210.16195.

synth_cnot_phase_aam

qiskit.synthesis.synth_cnot_phase_aam(cnots, angles, section_size=2)

GitHub

This function is an implementation of the GraySynth algorithm of Amy, Azimadeh and Mosca.

GraySynth is a heuristic algorithm from [1] for synthesizing small parity networks. It is inspired by Gray codes. Given a set of binary strings SS (called cnots bellow), the algorithm synthesizes a parity network for SS by repeatedly choosing an index ii to expand and then effectively recursing on the co-factors S0S_0 and S1S_1, consisting of the strings ySy \in S, with yi=0y_i = 0 or 11 respectively. As a subset SS is recursively expanded, cx gates are applied so that a designated target bit contains the (partial) parity χy(x)\chi_y(x) where yi=1y_i = 1 if and only if yi=1y'_i = 1 for all ySy' \in S. If SS contains a single element {y}\{y'\}, then y=yy = y', and the target bit contains the value χy(x)\chi_{y'}(x) as desired.

Notably, rather than uncomputing this sequence of cx (CNOT) gates when a subset SS is finished being synthesized, the algorithm maintains the invariant that the remaining parities to be computed are expressed over the current state of bits. This allows the algorithm to avoid the ‘backtracking’ inherent in uncomputing-based methods.

The algorithm is described in detail in section 4 of [1].

Parameters

  • cnots (list[list[int]]) –

    A matrix whose columns are the parities to be synthesized e.g.:

    [[0, 1, 1, 1, 1, 1],
     [1, 0, 0, 1, 1, 1],
     [1, 0, 0, 1, 0, 0],
     [0, 0, 1, 0, 1, 0]]

    corresponds to:

    x1^x2 + x0 + x0^x3 + x0^x1^x2 + x0^x1^x3 + x0^x1
  • angles (list[str]) – A list containing all the phase-shift gates which are to be applied, in the same order as in cnots. A number is interpreted as the angle of p(angle)p(angle), otherwise the elements have to be 't', 'tdg', 's', 'sdg' or 'z'.

  • section_size (int) – The size of every section in the Patel–Markov–Hayes algorithm. section_size must be a factor of the number of qubits.

Returns

The decomposed quantum circuit.

Raises

QiskitError – when dimensions of cnots and angles don’t align.

Return type

QuantumCircuit

References

  1. Matthew Amy, Parsiad Azimzadeh, and Michele Mosca. On the controlled-NOT complexity of controlled-NOT–phase circuits., Quantum Science and Technology 4.1 (2018): 015002. arXiv:1712.01859

Permutation Synthesis

synth_permutation_depth_lnn_kms

qiskit.synthesis.synth_permutation_depth_lnn_kms(pattern)

GitHub

Synthesize a permutation circuit for a linear nearest-neighbor architecture using the Kutin, Moulton, Smithline method.

This is the permutation synthesis algorithm from [1], section 6. It synthesizes any permutation of n qubits over linear nearest-neighbor architecture using SWAP gates with depth at most nn and size at most n(n1)/2n(n-1)/2 (where both depth and size are measured with respect to SWAPs).

Parameters

pattern (list[int] | np.ndarray[int]) – Permutation pattern, describing which qubits occupy the positions 0, 1, 2, etc. after applying the permutation. That is, pattern[k] = m when the permutation maps qubit m to position k. As an example, the pattern [2, 4, 3, 0, 1] means that qubit 2 goes to position 0, qubit 4 goes to position 1, etc.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

References

  1. Samuel A. Kutin, David Petrie Moulton and Lawren M. Smithline. Computation at a distance., arXiv:quant-ph/0701194v1

synth_permutation_basic

qiskit.synthesis.synth_permutation_basic(pattern)

GitHub

Synthesize a permutation circuit for a fully-connected architecture using sorting.

More precisely, if the input permutation is a cycle of length m, then this creates a quantum circuit with m-1 SWAPs (and of depth m-1); if the input permutation consists of several disjoint cycles, then each cycle is essentially treated independently.

Parameters

pattern (list[int] | np.ndarray[int]) – Permutation pattern, describing which qubits occupy the positions 0, 1, 2, etc. after applying the permutation. That is, pattern[k] = m when the permutation maps qubit m to position k. As an example, the pattern [2, 4, 3, 0, 1] means that qubit 2 goes to position 0, qubit 4 goes to position 1, etc.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

synth_permutation_acg

qiskit.synthesis.synth_permutation_acg(pattern)

GitHub

Synthesize a permutation circuit for a fully-connected architecture using the Alon, Chung, Graham method.

This produces a quantum circuit of depth 2 (measured in the number of SWAPs).

This implementation is based on the Proposition 4.1 in reference [1] with the detailed proof given in Theorem 2 in reference [2]

Parameters

pattern (list[int] | np.ndarray[int]) – Permutation pattern, describing which qubits occupy the positions 0, 1, 2, etc. after applying the permutation. That is, pattern[k] = m when the permutation maps qubit m to position k. As an example, the pattern [2, 4, 3, 0, 1] means that qubit 2 goes to position 0, qubit 4 goes to position 1, etc.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

References

  1. N. Alon, F. R. K. Chung, and R. L. Graham. Routing Permutations on Graphs Via Matchings., Proceedings of the Twenty-Fifth Annual ACM Symposium on Theory of Computing(1993). Pages 583–591. (Extended abstract) 10.1145/167088.167239
  2. N. Alon, F. R. K. Chung, and R. L. Graham. Routing Permutations on Graphs Via Matchings., (Full paper)

synth_permutation_reverse_lnn_kms

qiskit.synthesis.synth_permutation_reverse_lnn_kms(num_qubits)

GitHub

Synthesize reverse permutation for linear nearest-neighbor architectures using Kutin, Moulton, Smithline method.

Synthesis algorithm for reverse permutation from [1], section 5. This algorithm synthesizes the reverse permutation on nn qubits over a linear nearest-neighbor architecture using CX gates with depth 2n+22 * n + 2.

Parameters

num_qubits (int) – The number of qubits.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

References

  1. Kutin, S., Moulton, D. P., Smithline, L., Computation at a distance, Chicago J. Theor. Comput. Sci., vol. 2007, (2007), arXiv:quant-ph/0701194

Clifford Synthesis

synth_clifford_full

qiskit.synthesis.synth_clifford_full(clifford, method=None)

GitHub

Decompose a Clifford operator into a QuantumCircuit.

For N3N \leq 3 qubits this is based on optimal CX-cost decomposition from reference [1]. For N>3N > 3 qubits this is done using the general non-optimal greedy compilation routine from reference [3], which typically yields better CX cost compared to the AG method in [2].

Parameters

  • clifford (Clifford) – A Clifford operator.
  • method (str | None) – Optional, a synthesis method ('AG' or 'greedy'). If set this overrides optimal decomposition for N3N \leq 3 qubits.

Returns

A circuit implementation of the Clifford.

Return type

QuantumCircuit

References

  1. S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
  2. S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits, Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196
  3. Sergey Bravyi, Shaohan Hu, Dmitri Maslov, Ruslan Shaydulin, Clifford Circuit Optimization with Templates and Symbolic Pauli Gates, arXiv:2105.02291 [quant-ph]

synth_clifford_ag

qiskit.synthesis.synth_clifford_ag(clifford)

GitHub

Decompose a Clifford operator into a QuantumCircuit based on Aaronson-Gottesman method [1].

Parameters

clifford (Clifford) – A Clifford operator.

Returns

A circuit implementation of the Clifford.

Return type

QuantumCircuit

References

  1. S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits, Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196

synth_clifford_bm

qiskit.synthesis.synth_clifford_bm(clifford)

GitHub

Optimal CX-cost decomposition of a Clifford operator on 2 qubits or 3 qubits into a QuantumCircuit based on the Bravyi-Maslov method [1].

Parameters

clifford (Clifford) – A Clifford operator.

Returns

A circuit implementation of the Clifford.

Raises

QiskitError – if Clifford is on more than 3 qubits.

Return type

QuantumCircuit

References

  1. S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]

synth_clifford_greedy

qiskit.synthesis.synth_clifford_greedy(clifford)

GitHub

Decompose a Clifford operator into a QuantumCircuit based on the greedy Clifford compiler that is described in Appendix A of Bravyi, Hu, Maslov and Shaydulin [1].

This method typically yields better CX cost compared to the Aaronson-Gottesman method.

Note that this function only implements the greedy Clifford compiler from Appendix A of [1], and not the templates and symbolic Pauli gates optimizations that are mentioned in the same paper.

Parameters

clifford (Clifford) – A Clifford operator.

Returns

A circuit implementation of the Clifford.

Raises

QiskitError – if symplectic Gaussian elimination fails.

Return type

QuantumCircuit

References

  1. Sergey Bravyi, Shaohan Hu, Dmitri Maslov, Ruslan Shaydulin, Clifford Circuit Optimization with Templates and Symbolic Pauli Gates, arXiv:2105.02291 [quant-ph]

synth_clifford_layers

qiskit.synthesis.synth_clifford_layers(cliff, cx_synth_func=<function _default_cx_synth_func>, cz_synth_func=<function _default_cz_synth_func>, cx_cz_synth_func=None, cz_func_reverse_qubits=False, validate=False)

GitHub

Synthesis of a Clifford into layers, it provides a similar decomposition to the synthesis described in Lemma 8 of Bravyi and Maslov [1].

For example, a 5-qubit Clifford circuit is decomposed into the following layers:

     ┌─────┐┌─────┐┌────────┐┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
q_0: ┤0    ├┤0    ├┤0       ├┤0    ├┤0    ├┤0    ├┤0    ├┤0       ├
     │     ││     ││        ││     ││     ││     ││     ││        │
q_1: ┤1    ├┤1    ├┤1       ├┤1    ├┤1    ├┤1    ├┤1    ├┤1       ├
     │     ││     ││        ││     ││     ││     ││     ││        │
q_2: ┤2 S2 ├┤2 CZ ├┤2 CX_dg ├┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├
     │     ││     ││        ││     ││     ││     ││     ││        │
q_3: ┤3    ├┤3    ├┤3       ├┤3    ├┤3    ├┤3    ├┤3    ├┤3       ├
     │     ││     ││        ││     ││     ││     ││     ││        │
q_4: ┤4    ├┤4    ├┤4       ├┤4    ├┤4    ├┤4    ├┤4    ├┤4       ├
     └─────┘└─────┘└────────┘└─────┘└─────┘└─────┘└─────┘└────────┘

This decomposition is for the default cz_synth_func and cx_synth_func functions, with other functions one may see slightly different decomposition.

Parameters

  • cliff (Clifford) – A Clifford operator.
  • cx_synth_func (Callable[[np.ndarray], QuantumCircuit]) – A function to decompose the CX sub-circuit. It gets as input a boolean invertible matrix, and outputs a QuantumCircuit.
  • cz_synth_func (Callable[[np.ndarray], QuantumCircuit]) – A function to decompose the CZ sub-circuit. It gets as input a boolean symmetric matrix, and outputs a QuantumCircuit.
  • cx_cz_synth_func (Callable) – optional, a function to decompose both sub-circuits CZ and CX.
  • validate (Boolean) – if True, validates the synthesis process.
  • cz_func_reverse_qubits (Boolean) – True only if cz_synth_func is synth_cz_depth_line_mr(), since this function returns a circuit that reverts the order of qubits.

Returns

A circuit implementation of the Clifford.

Return type

QuantumCircuit

References

  1. S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]

synth_clifford_depth_lnn

qiskit.synthesis.synth_clifford_depth_lnn(cliff)

GitHub

Synthesis of a Clifford into layers for linear-nearest neighbor connectivity.

The depth of the synthesized n-qubit circuit is bounded by 7n+27n+2, which is not optimal. It should be replaced by a better algorithm that provides depth bounded by 7n47n-4 [3].

Parameters

cliff (Clifford) – a Clifford operator.

Returns

a circuit implementation of the Clifford.

Return type

QuantumCircuit

References

  1. S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
  2. Dmitri Maslov, Martin Roetteler, Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations, arXiv:1705.09176.
  3. Dmitri Maslov, Willers Yang, CNOT circuits need little help to implement arbitrary Hadamard-free Clifford transformations they generate, arXiv:2210.16195.

CNOTDihedral Synthesis

synth_cnotdihedral_full

qiskit.synthesis.synth_cnotdihedral_full(elem)

GitHub

Decompose a CNOTDihedral element into a QuantumCircuit.

For N2N \leq 2 qubits this is based on optimal CX-cost decomposition from reference [1]. For N>2N > 2 qubits this is done using the general non-optimal compilation routine from reference [2].

Parameters

elem (CNOTDihedral) – A CNOTDihedral element.

Returns

A circuit implementation of the CNOTDihedral element.

Return type

QuantumCircuit

References

  1. Shelly Garion and Andrew W. Cross, Synthesis of CNOT-Dihedral circuits with optimal number of two qubit gates, Quantum 4(369), 2020
  2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta, Scalable randomized benchmarking of non-Clifford gates, npj Quantum Inf 2, 16012 (2016).

synth_cnotdihedral_two_qubits

qiskit.synthesis.synth_cnotdihedral_two_qubits(elem)

GitHub

Decompose a CNOTDihedral element on a single qubit and two qubits into a QuantumCircuit. This decomposition has an optimal number of CXGates.

Parameters

elem (CNOTDihedral) – A CNOTDihedral element.

Returns

A circuit implementation of the CNOTDihedral element.

Raises

QiskitError – if the element in not 1-qubit or 2-qubit CNOTDihedral.

Return type

QuantumCircuit

References

  1. Shelly Garion and Andrew W. Cross, On the structure of the CNOT-Dihedral group, arXiv:2006.12042 [quant-ph]

synth_cnotdihedral_general

qiskit.synthesis.synth_cnotdihedral_general(elem)

GitHub

Decompose a CNOTDihedral element into a QuantumCircuit.

Decompose a general CNOTDihedral elements. The number of CX gates is not necessarily optimal. For a decomposition of a 1-qubit or 2-qubit element, call synth_cnotdihedral_two_qubits().

Parameters

elem (CNOTDihedral) – A CNOTDihedral element.

Returns

A circuit implementation of the CNOTDihedral element.

Raises

QiskitError – if the element could not be decomposed into a circuit.

Return type

QuantumCircuit

References

  1. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta, Scalable randomized benchmarking of non-Clifford gates, npj Quantum Inf 2, 16012 (2016).

Stabilizer State Synthesis

synth_stabilizer_layers

qiskit.synthesis.synth_stabilizer_layers(stab, cz_synth_func=<function _default_cz_synth_func>, cz_func_reverse_qubits=False, validate=False)

GitHub

Synthesis of a stabilizer state into layers.

It provides a similar decomposition to the synthesis described in Lemma 8 of reference [1], without the initial Hadamard-free sub-circuit which do not affect the stabilizer state.

For example, a 5-qubit stabilizer state is decomposed into the following layers:

     ┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
q_0: ┤0    ├┤0    ├┤0    ├┤0    ├┤0       ├
     │     ││     ││     ││     ││        │
q_1: ┤1    ├┤1    ├┤1    ├┤1    ├┤1       ├
     │     ││     ││     ││     ││        │
q_2: ┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├
     │     ││     ││     ││     ││        │
q_3: ┤3    ├┤3    ├┤3    ├┤3    ├┤3       ├
     │     ││     ││     ││     ││        │
q_4: ┤4    ├┤4    ├┤4    ├┤4    ├┤4       ├
     └─────┘└─────┘└─────┘└─────┘└────────┘

Parameters

Returns

A circuit implementation of the stabilizer state.

Raises

QiskitError – if the input is not a StabilizerState.

Return type

QuantumCircuit

References

  1. S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]

synth_stabilizer_depth_lnn

qiskit.synthesis.synth_stabilizer_depth_lnn(stab)

GitHub

Synthesis of an n-qubit stabilizer state for linear-nearest neighbor connectivity, in 2-qubit depth 2n+22n+2 and two distinct CX layers, using CXGates and phase gates (SGate, SdgGate or ZGate).

Parameters

stab (StabilizerState) – A stabilizer state.

Returns

A circuit implementation of the stabilizer state.

Return type

QuantumCircuit

References

  1. S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
  2. Dmitri Maslov, Martin Roetteler, Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations, arXiv:1705.09176.

synth_circuit_from_stabilizers

qiskit.synthesis.synth_circuit_from_stabilizers(stabilizers, allow_redundant=False, allow_underconstrained=False, invert=False)

GitHub

Synthesis of a circuit that generates a state stabilized by the stabilizers using Gaussian elimination with Clifford gates. If the stabilizers are underconstrained, and allow_underconstrained is True, the circuit will output one of the states stabilized by the stabilizers. Based on stim implementation.

Parameters

  • stabilizers (Collection[str]) – List of stabilizer strings
  • allow_redundant (bool) – Allow redundant stabilizers (i.e., some stabilizers can be products of the others)
  • allow_underconstrained (bool) – Allow underconstrained set of stabilizers (i.e., the stabilizers do not specify a unique state)
  • invert (bool) – Return inverse circuit

Returns

A circuit that generates a state stabilized by stabilizers.

Raises

QiskitError – if the stabilizers are invalid, do not commute, or contradict each other, if the list is underconstrained and allow_underconstrained is False, or if the list is redundant and allow_redundant is False.

Return type

QuantumCircuit

References

  1. https://github.com/quantumlib/Stim/blob/c0dd0b1c8125b2096cd54b6f72884a459e47fe3e/src/stim/stabilizers/conversions.inl#L469
  2. https://quantumcomputing.stackexchange.com/questions/12721/how-to-calculate-destabilizer-group-of-toric-and-other-codes

Discrete Basis Synthesis

SolovayKitaevDecomposition([...])The Solovay Kitaev discrete decomposition algorithm.

generate_basic_approximations

qiskit.synthesis.generate_basic_approximations(basis_gates, depth, filename=None)

GitHub

Generates a list of GateSequences with the gates in basis_gates.

Parameters

  • basis_gates (list[str |Gate]) – The gates from which to create the sequences of gates.
  • depth (int) – The maximum depth of the approximations.
  • filename (str | None) – If provided, the basic approximations are stored in this file.

Returns

List of GateSequences using the gates in basis_gates.

Raises

ValueError – If basis_gates contains an invalid gate identifier.

Return type

list[GateSequence]


Basis Change Synthesis

synth_qft_line

qiskit.synthesis.synth_qft_line(num_qubits, do_swaps=True, approximation_degree=0)

GitHub

Construct a circuit for the Quantum Fourier Transform using linear neighbor connectivity.

The construction is based on Fig 2.b in Fowler et al. [1].

Note

With the default value of do_swaps = True, this synthesis algorithm creates a circuit that faithfully implements the QFT operation. When do_swaps = False, this synthesis algorithm creates a circuit that corresponds to “QFT-with-reversal”: applying the QFT and reversing the order of its output qubits.

Parameters

  • num_qubits (int) – The number of qubits on which the Quantum Fourier Transform acts.
  • approximation_degree (int) – The degree of approximation (0 for no approximation). It is possible to implement the QFT approximately by ignoring controlled-phase rotations with the angle beneath a threshold. This is discussed in more detail in https://arxiv.org/abs/quant-ph/9601018 or https://arxiv.org/abs/quant-ph/0403071.
  • do_swaps (bool) – Whether to synthesize the “QFT” or the “QFT-with-reversal” operation.

Returns

A circuit implementing the QFT operation.

Return type

QuantumCircuit

References

  1. A. G. Fowler, S. J. Devitt, and L. C. L. Hollenberg, Implementation of Shor’s algorithm on a linear nearest neighbour qubit array, Quantum Info. Comput. 4, 4 (July 2004), 237–251. arXiv:quant-ph/0402196 [quant-ph]

synth_qft_full

qiskit.synthesis.synth_qft_full(num_qubits, do_swaps=True, approximation_degree=0, insert_barriers=False, inverse=False, name=None)

GitHub

Construct a circuit for the Quantum Fourier Transform using all-to-all connectivity.

Note

With the default value of do_swaps = True, this synthesis algorithm creates a circuit that faithfully implements the QFT operation. This circuit contains a sequence of swap gates at the end, corresponding to reversing the order of its output qubits. In some applications this reversal permutation can be avoided. Setting do_swaps = False creates a circuit without this reversal permutation, at the expense that this circuit implements the “QFT-with-reversal” instead of QFT. Alternatively, the ElidePermutations transpiler pass is able to remove these swap gates.

Parameters

  • num_qubits (int) – The number of qubits on which the Quantum Fourier Transform acts.
  • do_swaps (bool) – Whether to synthesize the “QFT” or the “QFT-with-reversal” operation.
  • approximation_degree (int) – The degree of approximation (0 for no approximation). It is possible to implement the QFT approximately by ignoring controlled-phase rotations with the angle beneath a threshold. This is discussed in more detail in https://arxiv.org/abs/quant-ph/9601018 or https://arxiv.org/abs/quant-ph/0403071.
  • insert_barriers (bool) – If True, barriers are inserted for improved visualization.
  • inverse (bool) – If True, the inverse Quantum Fourier Transform is constructed.
  • name (str | None) – The name of the circuit.

Returns

A circuit implementing the QFT operation.

Return type

QuantumCircuit


Unitary Synthesis

Decomposition of general 2n×2n2^n \times 2^n unitary matrices for any number of qubits.

qs_decomposition

qiskit.synthesis.qs_decomposition(mat, opt_a1=True, opt_a2=True, decomposer_1q=None, decomposer_2q=None, *, _depth=0)

GitHub

Decomposes a unitary matrix into one and two qubit gates using Quantum Shannon Decomposition,

This decomposition is described in Shende et al. [1].

  ┌───┐               ┌───┐     ┌───┐     ┌───┐
 ─┤   ├─       ───────┤ Rz├─────┤ Ry├─────┤ Rz├─────
  │   │    ≃     ┌───┐└─┬─┘┌───┐└─┬─┘┌───┐└─┬─┘┌───┐
/─┤   ├─       /─┤   ├──□──┤   ├──□──┤   ├──□──┤   ├
  └───┘          └───┘     └───┘     └───┘     └───┘

The number of CXGates generated with the decomposition without optimizations is:

9164n322n\frac{9}{16} 4^n - \frac{3}{2} 2^n

If opt_a1 = True, the default, the CX count is reduced by:

134n21.\frac{1}{3} 4^{n - 2} - 1.

If opt_a2 = True, the default, the CX count is reduced by:

4n21.4^{n-2} - 1.

Parameters

  • mat (np.ndarray) – unitary matrix to decompose
  • opt_a1 (bool) – whether to try optimization A.1 from Shende et al. [1]. This should eliminate 1 cx per call. If True, CZGates are left in the output. If desired these can be further decomposed to CXGates.
  • opt_a2 (bool) – whether to try optimization A.2 from Shende et al. [1]. This decomposes two qubit unitaries into a diagonal gate and a two cx unitary and reduces overall cx count by 4n214^{n-2} - 1.
  • decomposer_1q (Callable[[np.ndarray], QuantumCircuit] | None) – optional 1Q decomposer. If None, uses OneQubitEulerDecomposer.
  • decomposer_2q (Callable[[np.ndarray], QuantumCircuit] | None) – optional 2Q decomposer. If None, uses TwoQubitBasisDecomposer.

Returns

Decomposed quantum circuit.

Return type

QuantumCircuit

References

  1. Shende, Bullock, Markov, Synthesis of Quantum Logic Circuits, arXiv:0406176 [quant-ph]

The Approximate Quantum Compiler is available as the module qiskit.synthesis.unitary.aqc.


One-Qubit Synthesis

OneQubitEulerDecomposer([basis, use_dag])A class for decomposing 1-qubit unitaries into Euler angle rotations.

Two-Qubit Synthesis

TwoQubitBasisDecomposer(gate[, ...])A class for decomposing 2-qubit unitaries into minimal number of uses of a 2-qubit basis gate.
XXDecomposer([basis_fidelity, euler_basis, ...])A class for optimal decomposition of 2-qubit unitaries into 2-qubit basis gates of XX type (i.e., each locally equivalent to CAN(α,0,0)CAN(\alpha, 0, 0) for a possibly varying alphaalpha).
TwoQubitWeylDecomposition(unitary_matrix[, ...])Two-qubit Weyl decomposition.

two_qubit_cnot_decompose

qiskit.synthesis.two_qubit_cnot_decompose(*args, **kwargs)

This is an instance of TwoQubitBasisDecomposer that always uses cx as the KAK gate for the basis decomposition. You can use this function as a quick access to cx-based 2-qubit decompositions.

Parameters

  • unitary (Operator or np.ndarray) – The 4x4 unitary to synthesize.
  • basis_fidelity (float or None) – If given the assumed fidelity for applications of CXGate.
  • approximate (bool) – If True approximate if basis_fidelity is less than 1.0.

Returns

The synthesized circuit of the input unitary.

Return type

QuantumCircuit


Multi Controlled Synthesis

synth_mcmt_vchain

qiskit.synthesis.synth_mcmt_vchain(gate, num_ctrl_qubits, num_target_qubits, ctrl_state=None)

GitHub

Synthesize MCMT using a V-chain.

This uses a chain of CCX gates, using num_ctrl_qubits - 1 auxiliary qubits.

For example, a 3-control and 2-target H gate will be synthesized as:

q_0: ──■────────────────────────■──
       │                        │
q_1: ──■────────────────────────■──
       │                        │
q_2: ──┼────■──────────────■────┼──
       │    │  ┌───┐       │    │
q_3: ──┼────┼──┤ H ├───────┼────┼──
       │    │  └─┬─┘┌───┐  │    │
q_4: ──┼────┼────┼──┤ H ├──┼────┼──
     ┌─┴─┐  │    │  └─┬─┘  │  ┌─┴─┐
q_5: ┤ X ├──■────┼────┼────■──┤ X ├
     └───┘┌─┴─┐  │    │  ┌─┴─┐└───┘
q_6: ─────┤ X ├──■────■──┤ X ├─────
          └───┘          └───┘

Parameters

  • gate (Gate) –
  • num_ctrl_qubits (int) –
  • num_target_qubits (int) –
  • ctrl_state (int | None) –

Return type

QuantumCircuit

synth_mcx_n_dirty_i15

qiskit.synthesis.synth_mcx_n_dirty_i15(num_ctrl_qubits, relative_phase=False, action_only=False)

GitHub

Synthesize a multi-controlled X gate with kk controls using k2k - 2 dirty ancillary qubits producing a circuit with 2k12 * k - 1 qubits and at most 8k68 * k - 6 CX gates, by Iten et. al. [1].

Parameters

  • num_ctrl_qubits (int) – The number of control qubits.
  • relative_phase (bool) – when set to True, the method applies the optimized multi-controlled X gate up to a relative phase, in a way that, by lemma 8 of [1], the relative phases of the action part cancel out with the phases of the reset part.
  • action_only (bool) – when set to True, the method applies only the action part of lemma 8 of [1].

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

References

  1. Iten et. al., Quantum Circuits for Isometries, Phys. Rev. A 93, 032318 (2016), arXiv:1501.06911

synth_mcx_n_clean_m15

qiskit.synthesis.synth_mcx_n_clean_m15(num_ctrl_qubits)

GitHub

Synthesize a multi-controlled X gate with kk controls using k2k - 2 clean ancillary qubits with producing a circuit with 2k12 * k - 1 qubits and at most 6k66 * k - 6 CX gates, by Maslov [1].

Parameters

num_ctrl_qubits (int) – The number of control qubits.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

References

  1. Maslov., Phys. Rev. A 93, 022311 (2016), arXiv:1508.03273

synth_mcx_1_clean_b95

qiskit.synthesis.synth_mcx_1_clean_b95(num_ctrl_qubits)

GitHub

Synthesize a multi-controlled X gate with kk controls using a single clean ancillary qubit producing a circuit with k+2k + 2 qubits and at most 16k816 * k - 8 CX gates, by Barenco et al. [1].

Parameters

num_ctrl_qubits (int) – The number of control qubits.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

References

  1. Barenco et. al., Phys.Rev. A52 3457 (1995), arXiv:quant-ph/9503016

synth_mcx_noaux_v24

qiskit.synthesis.synth_mcx_noaux_v24(num_ctrl_qubits)

GitHub

Synthesize a multi-controlled X gate with kk controls based on the implementation for MCPhaseGate.

In turn, the MCPhase gate uses the decomposition for multi-controlled special unitaries described in [1].

Produces a quantum circuit with k+1k + 1 qubits. The number of CX-gates is quadratic in kk.

Parameters

num_ctrl_qubits (int) – The number of control qubits.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

References

  1. Vale et. al., Circuit Decomposition of Multicontrolled Special Unitary Single-Qubit Gates, IEEE TCAD 43(3) (2024), arXiv:2302.06377

synth_mcx_gray_code

qiskit.synthesis.synth_mcx_gray_code(num_ctrl_qubits)

GitHub

Synthesize a multi-controlled X gate with kk controls using the Gray code.

Produces a quantum circuit with k+1k + 1 qubits. This method produces exponentially many CX gates and should be used only for small values of kk.

Parameters

num_ctrl_qubits (int) – The number of control qubits.

Returns

The synthesized quantum circuit.

Return type

QuantumCircuit

synth_c3x

qiskit.synthesis.synth_c3x()

GitHub

Efficient synthesis of 3-controlled X-gate.

Return type

QuantumCircuit

synth_c4x

qiskit.synthesis.synth_c4x()

GitHub

Efficient synthesis of 4-controlled X-gate.

Return type

QuantumCircuit


Binary Arithmetic Synthesis

Adders

adder_qft_d00

qiskit.synthesis.adder_qft_d00(num_state_qubits, kind='half')

GitHub

A circuit that uses QFT to perform in-place addition on two qubit registers.

For registers with nn qubits, the QFT adder can perform addition modulo 2n2^n (with kind="fixed") or ordinary addition by adding a carry qubits (with kind="half"). The fixed adder uses (3n2n)/2(3n^2 - n)/2 CPhaseGate operators, with an additional nn for the half adder.

As an example, a non-fixed_point QFT adder circuit that performs addition on two 2-qubit sized registers is as follows:

 a_0: ─────────■──────■────────■──────────────────────────────────
               │      │        │
 a_1: ─────────┼──────┼────────┼────────■──────■──────────────────
      ┌──────┐ │      │        │P/4)  │      │P/2) ┌─────────┐
 b_0:0     ├─┼──────┼────────■────────┼──────■───────┤0
      │      │ │      │P/2)P(π)          │         │
 b_1:1 Qft ├─┼──────■─────────────────■──────────────┤1 qft_dg ├
      │      │ │P(π)                                   │         │
cout:2     ├─■───────────────────────────────────────┤2
      └──────┘                                         └─────────┘

Parameters

  • num_state_qubits (int) – The number of qubits in either input register for state a|a\rangle or b|b\rangle. The two input registers must have the same number of qubits.
  • kind (str) – The kind of adder, can be "half" for a half adder or "fixed" for a fixed-sized adder. A half adder contains a carry-out to represent the most-significant bit, but the fixed-sized adder doesn’t and hence performs addition modulo 2 ** num_state_qubits.

Return type

QuantumCircuit

References:

[1] T. G. Draper, Addition on a Quantum Computer, 2000. arXiv:quant-ph/0008033

[2] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017. arXiv:1411.5949

[3] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995. arXiv:quant-ph/9511018

adder_ripple_c04

qiskit.synthesis.adder_ripple_c04(num_state_qubits, kind='half')

GitHub

A ripple-carry circuit to perform in-place addition on two qubit registers.

This circuit uses 2n+O(1)2n + O(1) CCX gates and 5n+O(1)5n + O(1) CX gates, at a depth of 2n+O(1)2n + O(1) [1]. The constant depends on the kind of adder implemented.

As an example, a ripple-carry adder circuit that performs addition on two 3-qubit sized registers with a carry-in bit (kind="full") is as follows:

        ┌──────┐                                     ┌──────┐
 cin_0:2     ├─────────────────────────────────────┤2
        │      │┌──────┐                     ┌──────┐│      │
   a_0:0     ├┤2     ├─────────────────────┤2     ├┤0
        │      ││      │┌──────┐     ┌──────┐│      ││      │
   a_1: ┤  MAJ ├┤0     ├┤2     ├─────┤2     ├┤0     ├┤  UMA ├
        │      ││      ││      │     │      ││      ││      │
   a_2: ┤      ├┤  MAJ ├┤0     ├──■──┤0     ├┤  UMA ├┤      ├
        │      ││      ││      │  │  │      ││      ││      │
   b_0:1     ├┤      ├┤  MAJ ├──┼──┤  UMA ├┤      ├┤1
        └──────┘│      ││      │  │  │      ││      │└──────┘
   b_1: ────────┤1     ├┤      ├──┼──┤      ├┤1     ├────────
                └──────┘│      │  │  │      │└──────┘
   b_2: ────────────────┤1     ├──┼──┤1     ├────────────────
                        └──────┘┌─┴─┐└──────┘
cout_0: ────────────────────────┤ X ├────────────────────────
                                └───┘

Here MAJ and UMA gates correspond to the gates introduced in [1]. Note that in this implementation the input register qubits are ordered as all qubits from the first input register, followed by all qubits from the second input register.

Two different kinds of adders are supported. By setting the kind argument, you can also choose a half-adder, which doesn’t have a carry-in, and a fixed-sized-adder, which has neither carry-in nor carry-out, and thus acts on fixed register sizes. Unlike the full-adder, these circuits need one additional helper qubit.

The circuit diagram for the fixed-point adder (kind="fixed") on 3-qubit sized inputs is

        ┌──────┐┌──────┐                ┌──────┐┌──────┐
   a_0:0     ├┤2     ├────────────────┤2     ├┤0
        │      ││      │┌──────┐┌──────┐│      ││      │
   a_1: ┤      ├┤0     ├┤2     ├┤2     ├┤0     ├┤      ├
        │      ││      ││      ││      ││      ││      │
   a_2: ┤      ├┤  MAJ ├┤0     ├┤0     ├┤  UMA ├┤      ├
        │      ││      ││      ││      ││      ││      │
   b_0:1 MAJ ├┤      ├┤  MAJ ├┤  UMA ├┤      ├┤1 UMA ├
        │      ││      ││      ││      ││      ││      │
   b_1: ┤      ├┤1     ├┤      ├┤      ├┤1     ├┤      ├
        │      │└──────┘│      ││      │└──────┘│      │
   b_2: ┤      ├────────┤1     ├┤1     ├────────┤      ├
        │      │        └──────┘└──────┘        │      │
help_0:2     ├────────────────────────────────┤2
        └──────┘                                └──────┘

It has one less qubit than the full-adder since it doesn’t have the carry-out, but uses a helper qubit instead of the carry-in, so it only has one less qubit, not two.

Parameters

  • num_state_qubits (int) – The number of qubits in either input register for state a|a\rangle or b|b\rangle. The two input registers must have the same number of qubits.
  • kind (str) – The kind of adder, can be "full" for a full adder, "half" for a half adder, or "fixed" for a fixed-sized adder. A full adder includes both carry-in and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in nor carry-out.

Raises

ValueError – If num_state_qubits is lower than 1.

Return type

QuantumCircuit

References:

[1] Cuccaro et al., A new quantum ripple-carry addition circuit, 2004. arXiv:quant-ph/0410184

[2] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995. arXiv:quant-ph/9511018

adder_ripple_v95

qiskit.synthesis.adder_ripple_v95(num_state_qubits, kind='half')

GitHub

The VBE ripple carry adder [1].

This method uses 4n+O(1)4n + O(1) CCX gates and 4n+14n + 1 CX gates at a depth of 6n26n - 2 [2].

This circuit performs inplace addition of two equally-sized quantum registers. As an example, a classical adder circuit that performs full addition (i.e. including a carry-in bit) on two 2-qubit sized registers is as follows:

          ┌────────┐                       ┌───────────┐┌──────┐
   cin_0:0       ├───────────────────────┤0          ├┤0
          │        │                       │           ││      │
     a_0:1       ├───────────────────────┤1          ├┤1
          │        │┌────────┐     ┌──────┐│           ││  Sum │
     a_1: ┤        ├┤1       ├──■──┤1     ├┤           ├┤      ├
          │        ││        │  │  │      ││           ││      │
     b_0:2 Carry ├┤        ├──┼──┤      ├┤2 Carry_dg ├┤2
          │        ││        │┌─┴─┐│      ││           │└──────┘
     b_1: ┤        ├┤2 Carry ├┤ X ├┤2 Sum ├┤           ├────────
          │        ││        │└───┘│      ││           │
  cout_0: ┤        ├┤3       ├─────┤      ├┤           ├────────
          │        ││        │     │      ││           │
helper_0:3       ├┤0       ├─────┤0     ├┤3          ├────────
          └────────┘└────────┘     └──────┘└───────────┘

Here Carry and Sum gates correspond to the gates introduced in [1]. Carry_dg correspond to the inverse of the Carry gate. Note that in this implementation the input register qubits are ordered as all qubits from the first input register, followed by all qubits from the second input register. This is different ordering as compared to Figure 2 in [1], which leads to a different drawing of the circuit.

Parameters

  • num_state_qubits (int) – The size of the register.
  • kind (str) – The kind of adder, can be "full" for a full adder, "half" for a half adder, or "fixed" for a fixed-sized adder. A full adder includes both carry-in and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in nor carry-out.

Raises

ValueError – If num_state_qubits is lower than 1.

Return type

QuantumCircuit

References:

[1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995. arXiv:quant-ph/9511018

[2] Cuccaro et al., A new quantum ripple-carry addition circuit, 2004. arXiv:quant-ph/0410184

Multipliers

multiplier_cumulative_h18

qiskit.synthesis.multiplier_cumulative_h18(num_state_qubits, num_result_qubits=None)

GitHub

A multiplication circuit to store product of two input registers out-of-place.

The circuit uses the approach from Ref. [1]. As an example, a multiplier circuit that performs a non-modular multiplication on two 3-qubit sized registers is:

from qiskit.synthesis.arithmetic import multiplier_cumulative_h18
 
num_state_qubits = 3
circuit = multiplier_cumulative_h18(num_state_qubits)
circuit.draw("mpl")
../_images/synthesis-1.png

Multiplication in this circuit is implemented in a classical approach by performing a series of shifted additions using one of the input registers while the qubits from the other input register act as control qubits for the adders.

Parameters

  • num_state_qubits (int) – The number of qubits in either input register for state a|a\rangle or b|b\rangle. The two input registers must have the same number of qubits.
  • num_result_qubits (int | None) – The number of result qubits to limit the output to. If number of result qubits is nn, multiplication modulo 2n2^n is performed to limit the output to the specified number of qubits. Default value is 2 * num_state_qubits to represent any possible result from the multiplication of the two inputs.

Raises

ValueError – If num_result_qubits is given and not valid, meaning not in [num_state_qubits, 2 * num_state_qubits].

Return type

QuantumCircuit

References:

[1] Häner et al., Optimizing Quantum Circuits for Arithmetic, 2018. arXiv:1805.12445

multiplier_qft_r17

qiskit.synthesis.multiplier_qft_r17(num_state_qubits, num_result_qubits=None)

GitHub

A QFT multiplication circuit to store product of two input registers out-of-place.

Multiplication in this circuit is implemented using the procedure of Fig. 3 in [1], where weighted sum rotations are implemented as given in Fig. 5 in [1]. QFT is used on the output register and is followed by rotations controlled by input registers. The rotations transform the state into the product of two input registers in QFT base, which is reverted from QFT base using inverse QFT. For example, on 3 state qubits, a full multiplier is given by:

from qiskit.synthesis.arithmetic import multiplier_qft_r17
 
num_state_qubits = 3
circuit = multiplier_qft_r17(num_state_qubits)
circuit.draw("mpl")
../_images/synthesis-2.png

Parameters

  • num_state_qubits (int) – The number of qubits in either input register for state a|a\rangle or b|b\rangle. The two input registers must have the same number of qubits.
  • num_result_qubits (int | None) – The number of result qubits to limit the output to. If number of result qubits is nn, multiplication modulo 2n2^n is performed to limit the output to the specified number of qubits. Default value is 2 * num_state_qubits to represent any possible result from the multiplication of the two inputs.

Raises

ValueError – If num_result_qubits is given and not valid, meaning not in [num_state_qubits, 2 * num_state_qubits].

Return type

QuantumCircuit

References:

[1] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017. arXiv:1411.5949

Was this page helpful?
Report a bug or request content on GitHub.