Overview of quantum simulators¶

In this notebook, we give a basic description of the 5 ideal quantum circuit simulators available on the Quantum Learning Machine.

The QLM also provides noisy simulation capabilities. For more details see Setting up a noisy quantum computation.

What "simulation" means:¶

  • By "simulation of quantum circuits", we mean one of the following tasks:

    • state analysis: the simulator returns all non-zero amplitudes (default).

    • strict emulation of quantum computing: the simulator returns measurement results, sampled from the output probability distribution of the quantum circuit, just like an actual (ideal) quantum computer would. They can be regrouped by value or not, depending on the value assigned to the "aggregate_data" argument. See this notebook for more details.

    • computation of the average value of an observable You can directly ask a simulator for an observable average. In terms of performance, this more efficient than getting the amplitudes as a numpy array (which is possible, see this notebook) and computing it yourself.

Quick description of the simulators:¶

Each of the 6 ideal simulators is based on particular data structures, which make it behave well with specific families of quantum circuits.

  • The different ideal simulators are the following:

    • qat.linalg: a simulator based on straightforward linear application of unitary matrices onto the amplitude vector. Both its memory usage and execution time are exponential in the number of qubits.

      Restrictions: None. Any circuit can be run on this simulator.

    • qat.feynman: a simulator based on the Feynman path integral formulation of quantum computing (see Rudiak-Gould06 for instance). Its execution time is exponential in the number of dense gates. A gate is dense if it is neither logical (like CNOT or Toffoli - containing one 1 per line and column) nor diagonal. As qat.linalg, its memory usage is exponential in the number of qubits, as it still computes the entire amplitude vector.

      Restrictions: gates are limited to arity < 4.

    • qat.mps:

      • MPS: a simulator where the state vector is stored as a Matrix Product State. This data structure compresses information in slightly entangled cases. In these cases, both memory usage and execution time are greatly reduced. Some references on MPS simulation of quantum computing: Vidal03 or Banuls05
      • MPO: a simulator where the density matrix is stored as an Matrix Product Operator, see Schollwoeck2011 and Noh20.
      • MPSLegacy: The deprecated MPS simulator

        Restrictions: gates are limited to arity <= 2 for MPS and MPO, and limited to arity <= 3 for MPSLegacy, and need to act on neighboring qubits (i-e with consecutive qubit indices).

    • qat.spd:

      • SPD: a simulator where the observable is evolved in the Heisenberg picture through an ideal circuit. The observable is stored as a sparse vector in the Pauli basis. While the number of terms in the sparse vector scales exponentially with the number of non-Clifford gates, there are many truncation methods that can keep both memory usage and execution time under control. Some references on Pauli propagation methods: Begusic2025 or Rudolph2025

        Restrictions: Can only take jobs of the type observable, since sampling is not possible with Pauli propagation methods. For SPD, gates are limited to Clifford gates and single-qubits rotations (RX, RY & RZ). Custom gates are not supported.

    • qat.stabs: a simulator based on the stabilizer formalism (Gottesman97, Aaronson04). It is, by construction, restricted to circuits containing Clifford gates (H, CNOT, S and the gates they generate) only. However, on these circuits, it can push the simulation to thousands of qubits.

      Restrictions: only Clifford gates can be used (CNOT, H, S and everything they generate)

    • qat.bdd: Similarly to MPS, its memory footprint will depend on the structure of the state being represented. It can be greatly reduced in cases where the state vector can "factorized". see this article for more details.

$\rightarrow$ This notebook will demonstrate the execution of some circuits on these different simulators, with the purpose of highlighting their respective weaknesses and strengths.

Testbeds¶

  • The different circuits we will use to test the ideal simulators are:

    • The Quantum Fourier Transform, with 20 qubits.
    • An instance of a quantum arithmetics circuit (typical subpart of Shor's algorithm).
    • A cat state generation circuit with many qubits.

  • For noisy simulations, see this notebook.

Quantum Fourier Transform from computational basis state.¶

Let us start with a QFT, which we import from our programming libraries:

In [1]:
from qat.lang.AQASM import *
from qat.lang.AQASM.qftarith import QFT
In [2]:
nqbits = 5
prog = Program()
reg = prog.qalloc(nqbits)
prog.apply(QFT(nqbits), reg)
qft_c = prog.to_circ()

Let us now run this QFT circuit on the different simulators:

In [3]:
#Running on linalg.
from qat.qpus import LinAlg

job = qft_c.to_job(nbshots=5, aggregate_data=False)

qpu = LinAlg()

results = qpu.submit(job)

for sample in results:
    print(sample)
Sample(_amplitude=None, probability=None, _state=b'\r', err=None, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_amplitude=None, probability=None, _state=b'\x17', err=None, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_amplitude=None, probability=None, _state=b'\x0b', err=None, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_amplitude=None, probability=None, _state=b'\x08', err=None, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_amplitude=None, probability=None, _state=b'\x1c', err=None, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
In [4]:
#Running on feynman=path-integral based.
from qat.qpus import Feynman

qpu = Feynman()

results = qpu.submit(job)

for sample in results:
    print(sample)
Sample(_state=b'\x00', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_state=b'\x04', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_state=b'\x14', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_state=b'\x06', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
Sample(_state=b'\x17', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a509daee40>, length=5, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c89f3cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8128a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81190f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8119220>])])
In [5]:
# Running on MPS simulator, on even more qubits.
from qat.qpus import MPS

nqbits = 50
prog = Program()
reg = prog.qalloc(nqbits)
prog.apply(QFT(nqbits), reg)
qft_c = prog.to_circ()

job = qft_c.to_job(nbshots=5) # Note that we are leaving aggregate_data to default True

# Here we choose the bond dimension (maximum size of the MPS tensors) and a thresold for the singular values to discard.
qpu = MPS(bond_dimension = 16, truncation_threshold = 1e-12, nnize =True) #making the circuit MPS-compatible with linear connectiviy
res = qpu.submit(job)

for sample in res:
    print(sample)
Sample(_amplitude=None, probability=0.2, _state=b'\xa0A\xac\x88$u', err=0.2, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a424b43b10>, length=50, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c819f110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249d3b60>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c670>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c590>, <qat.lang.AQASM.bits.Qbit object at 0x14a424cd0ef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedcd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedd90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8a13ee0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81ea780>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8174d70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424b4e5d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a44c8fb650>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18d50>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18dd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f57f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f5860>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c819b230>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390650>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390530>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb710>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb770>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb7d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb830>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb890>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb8f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb950>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb9b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbbf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbc50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbcb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbdd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbf50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbfb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20050>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a200b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20110>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20170>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a201d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20230>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20290>])])
Sample(_amplitude=None, probability=0.2, _state=b'|5\xf3\xd3\xce\x10\x01', err=0.2, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a424b43b10>, length=50, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c819f110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249d3b60>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c670>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c590>, <qat.lang.AQASM.bits.Qbit object at 0x14a424cd0ef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedcd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedd90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8a13ee0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81ea780>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8174d70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424b4e5d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a44c8fb650>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18d50>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18dd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f57f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f5860>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c819b230>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390650>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390530>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb710>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb770>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb7d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb830>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb890>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb8f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb950>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb9b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbbf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbc50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbcb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbdd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbf50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbfb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20050>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a200b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20110>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20170>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a201d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20230>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20290>])])
Sample(_amplitude=None, probability=0.2, _state=b'\xd1\xc1\xdb\r\xe0\xa0\x01', err=0.2, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a424b43b10>, length=50, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c819f110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249d3b60>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c670>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c590>, <qat.lang.AQASM.bits.Qbit object at 0x14a424cd0ef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedcd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedd90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8a13ee0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81ea780>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8174d70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424b4e5d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a44c8fb650>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18d50>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18dd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f57f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f5860>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c819b230>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390650>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390530>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb710>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb770>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb7d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb830>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb890>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb8f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb950>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb9b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbbf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbc50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbcb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbdd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbf50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbfb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20050>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a200b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20110>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20170>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a201d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20230>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20290>])])
Sample(_amplitude=None, probability=0.2, _state=b'"\x00\xc1\xf9xf\x02', err=0.2, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a424b43b10>, length=50, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c819f110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249d3b60>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c670>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c590>, <qat.lang.AQASM.bits.Qbit object at 0x14a424cd0ef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedcd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedd90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8a13ee0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81ea780>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8174d70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424b4e5d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a44c8fb650>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18d50>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18dd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f57f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f5860>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c819b230>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390650>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390530>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb710>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb770>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb7d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb830>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb890>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb8f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb950>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb9b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbbf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbc50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbcb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbdd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbf50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbfb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20050>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a200b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20110>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20170>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a201d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20230>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20290>])])
Sample(_amplitude=None, probability=0.2, _state=b'\xfd\xba\xfb\xd8\x8eP\x03', err=0.2, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a424b43b10>, length=50, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a4c819f110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249d3b60>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c670>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a1c590>, <qat.lang.AQASM.bits.Qbit object at 0x14a424cd0ef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedcd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424aedd90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8a13ee0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c81ea780>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c8174d70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424b4e5d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a44c8fb650>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18d50>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a18dd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f57f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249f5860>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c819b230>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390650>, <qat.lang.AQASM.bits.Qbit object at 0x14a4c7390530>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb710>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb770>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb7d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb830>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb890>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb8f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb950>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cb9b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cba70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbb90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbbf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbc50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbcb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbd70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbdd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbe90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbf50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4249cbfb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20050>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a200b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20110>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20170>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a201d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20230>, <qat.lang.AQASM.bits.Qbit object at 0x14a424a20290>])])
In [6]:
# Running on stabs, even though we know it won't work.
from qat.qpus import Stabs

qpu = Stabs()

try:
    result = qpu.submit(job)
    
    for sample in result:
        print(sample)
except:
    print("Expected Exception since Stabs support only Clifford gates")
Expected Exception since Stabs support only Clifford gates

Observations:¶

  • As expected, the QFT does not run on the stabilizer simulator, because it contains non-Clifford gates

  • The MPS simulator needs an option called "lnnize": by construction, it only acceps circuits containing gates acting on neighboring qubits. The lnnize options tells the simulator to insert SWAP gates in the circuit, in order to make it compliant with this toplogical constraint

  • You could also make the circuit compliant beforehand, by calling the qat-nnizer module on it. More work for optimization has been put into it, and it should return better results for large nnization tasks. However, it will also be slower, and it might be faster overall to call the simpler built-in nnizer, and spend computation time on actual simulation.

  • The Feynman (path integral-based) and linear algebra simulators are flexible enough to accept the circuit as it is. However, because we start from $\left|0...0\right>$, and the QFT does not produce much entanglement, MPS is faster and uses less memory.

The advantage of MPS on the QFT is best shown by running a 50 qubit example, which is unconceivable on linalg or feynman.

Quantum arithmetics: Toffoli-based adder¶

Being a "classical circuit", in the sense that it sends computational basis states to other computational basis states, it should highlight the potential of the path-integral simulator (qat.feynman).

It is also slightly entangling, so the MPS simulator should also behave nicely on this example.

Such arithmetics circuits are typically used in Shor's algorithm. Simulating them as we do here could for instance be useful for debugging purposes, before inserting them into more complicated routines.

In [7]:
from qat.lang.AQASM.classarith import add

nqbits = 20
prog = Program()
reg = prog.qalloc(nqbits)
for qb in reg[::2]:
    prog.apply(X, qb)     # slightly modifying the input to check the output.
prog.apply(add(10,10), reg)     # add(5) takes a register of size 5 and adds its state 
                            # to a register of size 5 + 1.
                            # it also uses a third register of 5 qbits.
                            # hence the 16 = 5 + 1 + 5 + 5 qbits
                            # By convention, the state of the second register 
                            # (qb 5 to 9) is added to the first (qb 0 to 5).
        
adder_c = prog.to_circ()
adder_c.display()
No description has been provided for this image
In [8]:
job = adder_c.to_job(nbshots=7,aggregate_data=False)

from qat.plugins import NISQCompiler

stack = (
    NISQCompiler()
    | MPS(bond_dimension = 16, truncation_threshold = 1e-12, nnize = True)
)
# NISQCompiler is stacked with the MPSQPU to compile gates acting on more than 2 qubits, which are not compatible with MPSQPU


res = stack.submit(job)

for sample in res:
    print(sample)
Sample(_amplitude=None, probability=1.0, _state=b'\xaaV\x05', err=0.0, intermediate_measurements=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a421149090>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a420bcbad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbb30>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb830>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbbf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbb90>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbc50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbcb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbd10>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb410>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb3b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9bb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9c10>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9c70>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9cd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9d30>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9d90>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9df0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9e50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9eb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9f10>])])
In [9]:
qpu = Feynman()

res = qpu.submit(job)

for sample in res:
    print(sample)
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
In [10]:
from qat.qpus import Bdd

qpu = Bdd()

res = qpu.submit(job)

for sample in res:
    print(sample)
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])
Sample(_state=b'\xaaV\x05', probability=None, _amplitude=None, intermediate_measurements=None, err=None, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a4c73cc510>, length=20, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a424237110>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242372f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242373b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237410>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242374d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237530>, <qat.lang.AQASM.bits.Qbit object at 0x14a424237590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242375f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4242367b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236810>, <qat.lang.AQASM.bits.Qbit object at 0x14a424236870>])])

Observations:¶

  • As expected, qat.feynman is the fastest method for this kind of circuit. This is because there is only "one path in the integral".

  • The MPS simulator also behaves quite well, indicating that an adder has low entangling power. Results would be different with a more entangled input state.

An example of pure Clifford circuit: Noisy Steane-encoded qubit.¶

Of course, if only Clifford gates are used, the stabs simulator, based on the stabilizer formalism, is the most reasonable choice.

Such circuits emerge when working with quantum error correction, for instance.

Then, if noise is modeled as random Pauli gates insertion (which can be far from being realistic), you could still use this simulator.

The following piece of code presents the simulation of a noisy encoding of a state into the Steane code.

The logical state to prepare is just $|+_{L}\rangle$, and the starting state is $|0\rangle^{\otimes\cdot n_{\text{physical qubits}}}$.

Noise is naively modeled by random Pauli gate insertions in the encoding circuit.

In [11]:
import numpy as np

n_logical = 45

prog = Program()

reg = prog.qalloc(7*n_logical)

pairs = [(0,3),(0,5),(0,6),
         (1,3),(1,4),(1,6),
         (2,3),(2,4),(2,5)]

p = 0.1
In [12]:
# Actual noisy encoding circuit:
                
for qb in range(n_logical):
    # preparation in the logical |+> state:
    
    # 1. H on every physical qb.
    for phys_qb in range(7*qb,7*(qb+1)):
        prog.apply(H,reg[phys_qb])
    
        # random Pauli gate
        if np.random.random() < p:
            noise = np.random.choice([X,Y,Z])
            prog.apply(noise, reg[qb]) # only works because 1 unique register.
    
    # 2. CZ on some pairs.
    for ph_qb_1, ph_qb_2 in pairs:
        ctrl = 7*qb + ph_qb_1
        targ = 7*qb + ph_qb_2
        prog.apply(CSIGN, [reg[ctrl],reg[targ]])

    for phys_qb in range(7*qb,7*(qb+1)):
        if np.random.random() < p:
            noise = np.random.choice([X,Y,Z])
            prog.apply(noise, reg[qb]) # only works because 1 unique register.
        
    # 3. Local Cliffords: H on some qubits.
    for phys_qb in range(7*qb,7*qb+4):
        prog.apply(H, reg[phys_qb])
        if np.random.random() < p:
            noise = np.random.choice([X,Y,Z])
            prog.apply(noise, reg[qb]) # only works because 1 unique register.
        
noisy_qec = prog.to_circ()

print("number of qbits: ", noisy_qec.nbqbits)
print("number of gates: ", len(noisy_qec.ops))
number of qbits:  315
number of gates:  981
In [13]:
from qat.qpus import Stabs

job = noisy_qec.to_job(nbshots=1)

qpu = Stabs()

res = qpu.submit(job)

for sample in res:
    print(sample)
Sample(_state=b'\xf04\x1c\xc0<\xa8\x10\xaa', probability=1.0, _amplitude=None, intermediate_measurements=None, err=0.0, qregs=[QRegister(scope=<qat.lang.AQASM.program.Program object at 0x14a420bf8190>, length=315, start=0, msb=None, _subtype_metadata=None, qbits=[<qat.lang.AQASM.bits.Qbit object at 0x14a420bcd310>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcc290>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4b30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4a10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5fd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6030>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6090>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4ad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f58b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5790>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4590>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4b90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4530>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5850>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6630>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f65d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6750>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f68d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4a70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5a30>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f59d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5a90>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5af0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5b50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5bb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f57f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6510>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6690>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4f50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5550>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f4ef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6870>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5970>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f5910>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f6570>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210f66f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114fdd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f830>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f7d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f470>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d550>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d4f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d5b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d610>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d670>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114dbb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114db50>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114dc10>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114dc70>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114dcd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114dd30>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114dd90>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114ddf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114de50>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114deb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f350>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f2f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f3b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d790>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d6d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d7f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d850>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d8b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d910>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d970>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d9d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114da30>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114da90>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114daf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f6b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f650>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f710>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f770>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f4d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f410>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f530>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f590>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f5f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f1d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f230>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114f290>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114ce30>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114df70>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114df10>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d730>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d310>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d2b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d370>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d3d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d430>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d490>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d0d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d070>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d130>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d190>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d1f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d250>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114ce90>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114ccb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cc50>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cfb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cf50>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114d010>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cbf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cdd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cd10>, <qat.lang.AQASM.bits.Qbit object at 0x14a42114cd70>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093770>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210937d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093830>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093890>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210938f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093950>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092e70>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092ed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092870>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210928d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092930>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092990>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092a50>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210929f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093110>, <qat.lang.AQASM.bits.Qbit object at 0x14a421091f70>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092390>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092690>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092630>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092db0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092e10>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092810>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210927b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092d50>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092cf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092b70>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092bd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092c30>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092210>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092270>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210921b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210924b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092510>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092570>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210925d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093e30>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093e90>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093ef0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093f50>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093fb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093c50>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093bf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210935f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093650>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210936b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093710>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092450>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092330>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210923f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210926f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092750>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093dd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093d70>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210939b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093a70>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093ad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093b30>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093b90>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093590>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093530>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092f30>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092f90>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092ff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093050>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092b10>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092c90>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092ab0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093d10>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093a10>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210934d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093350>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210933b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093410>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093470>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210932f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093290>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093170>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210930b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210931d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421093230>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092030>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210922d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421091f10>, <qat.lang.AQASM.bits.Qbit object at 0x14a421091fd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a421092090>, <qat.lang.AQASM.bits.Qbit object at 0x14a4210920f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420b8c7d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420b8c1d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420b8c050>, <qat.lang.AQASM.bits.Qbit object at 0x14a420b8c0b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420b8c110>, <qat.lang.AQASM.bits.Qbit object at 0x14a420b8c170>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9f70>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9fd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca090>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca0f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca030>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca150>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9b50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9af0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca6f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca750>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca7b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca810>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca690>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca630>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcadb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcae10>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcae70>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcaed0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca210>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca1b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca270>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca2d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca330>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca390>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca3f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca450>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca4b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca510>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca570>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca5d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcad50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcacf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc94f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9550>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc95b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9610>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca8d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca870>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca930>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca990>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bca9f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcaa50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcaab0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcab10>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcab70>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcabd0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcac30>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcac90>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9430>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9490>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9730>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9790>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc97f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9850>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcaf90>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcaf30>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcaff0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb050>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb0b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb110>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb170>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb1d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb230>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb290>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb2f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb350>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9670>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc96d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9970>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc99d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9a30>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9a90>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9250>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc91f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc92b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9310>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9370>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc93d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8b90>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8b30>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8bf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8c50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8cb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8d10>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc98b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc9910>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8410>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcb950>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbfb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bcbf50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc83b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8350>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc81d0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8230>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8290>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc82f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8170>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8110>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8a70>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8ad0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8050>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc80b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8a10>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc89b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8830>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8890>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc88f0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bc8950>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bde7b0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bdedb0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bded50>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bdecf0>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bdec90>, <qat.lang.AQASM.bits.Qbit object at 0x14a420bdec30>])])

Observations:¶

  • This circuit can only run on the stab simulator.