Home

Awesome

Quantum Circuit Simulator

quantum-circuit is open source quantum circuit simulator implemented in javascript. Smoothly runs 20+ qubit simulations in browser or at server (node.js). You can use it in your javascript program to run quantum simulations.

Circuit can be imported from OpenQASM, Quil and IONQ. You can export circuits to OpenQASM, pyQuil, Quil, Qiskit, Cirq, TensorFlow Quantum, QSharp, and QuEST, so it can be used for conversion between quantum programming languages. Circuit drawing can be exported to SVG vector image.

Live examples

Quantum Programming Studio

Quantum Programming Studio is web based quantum programming IDE and simulator built on top of this package. Circuit can be executed on real quantum computer directly from the UI.

Other live examples

Using in browser

Simply include quantum-circuit.min.js into your html page (available via unpkg CDN https://unpkg.com/quantum-circuit)

<!doctype html>
<html>
    <head>
        <title>Quantum Circuit Simulator Example</title>
    </head>

    <body>
        <script type="text/javascript" src="https://unpkg.com/quantum-circuit"></script>

        <script type="text/javascript">
            // Your code here
        </script>
    </body>
</html>

Using at server with node.js

Add quantum-circuit npm module to your node.js project:

npm install --save quantum-circuit

And then import it into your program:

var QuantumCircuit = require("quantum-circuit");

// Your code here

Node.js examples

See /example/nodejs directory.

Using with Jupyter notebook

You need to install ijavascript kernel for Jupyter notebook

You can install quantum-circuit npm module globally and invoke jupyter notebook from any directory:

npm install -g quantum-circuit

Or inside new directory do:

npm init
npm install --save quantum-circuit
jupyter notebook

Jupyter notebook examples

See /example/jupyter directory.

Getting started

Create circuit

Create instance of QuantumCircuit class, optionally passing number of qubits (wires) to constructor:

var circuit = new QuantumCircuit(3);

Note: number of qubits is optional argument - circuit will expand automatically if you add gates to non-existing wires

Add single-qubit gates

Call addGate method passing gate name, column index and qubit (wire) index:

circuit.addGate(gateName, column, wire);

For example, to add Hadamard gate as a first gate (column 0) at second qubit (wire 1) type:

circuit.addGate("h", 0, 1);

Result is:

                  
         Column 0 
                  
Wire 0 -----------
                  
          |---|   
Wire 1 ---| H |---
          |---|   
                  

Note: if column is negative integer then gate will be added to the end of the wire

Add multi-qubit gates

Call addGate method passing gate name, column index and array of connected qubits (wires):

circuit.addGate(gateName, column, arrayOfWires);

For example, to add CNOT as a second gate (column 1) controlled by second qubit (wire 1) at third qubit as target (wire 2) do:

circuit.addGate("cx", 1, [1, 2]);
                                
         Column 0    Column 1   
                               
Wire 0 ------------------------
                               
                               
Wire 1 -----------------o------
                        |      
                     |-----|   
Wire 2 --------------| CX  |---
                     |-----|   
                               

Note: if column is negative integer then gate will be added to the end

Example - Quantum random number generator


var QuantumCircuit = require("quantum-circuit");

//
// 8-bit quantum random number generator
//

var quantumRandom = function() {

    var circuit = new QuantumCircuit();

    for(var i = 0; i < 8; i++) {
        //
        // add Hadamard gate to the end (-1) of i-th wire
        //
        circuit.addGate("h", -1, i);

        //
        // add measurement gate to i-th qubit which will store result 
        // into classical register "c", into i-th classical bit
        //
        circuit.addMeasure(i, "c", i); 
    }

    // run circuit
    circuit.run();

    // return value of register "c"
    return circuit.getCregValue("c");
};

// Usage - print random number to terminal
console.log(quantumRandom());

Implemented gates

NamepyQuilCirqQ#IONQQubitsParamsDescription
idIII1Single qubit identity gate
xXXXx1Pauli X (PI rotation over X-axis) aka "NOT" gate
yYYYy1Pauli Y (PI rotation over Y-axis)
zZZZz1Pauli Z (PI rotation over Z-axis)
hHHHh1Hadamard gate
srndef srnX**(1/2)v1Square root of NOT
srndgdef srndgX**(-1/2)vi1Inverse square root of NOT
r2SSS1PI/2 rotation over Z-axis aka "Phase PI/2"
r4TTT1PI/4 rotation over Z-axis aka "Phase PI/4"
r8PHASE(pi/8)u1(pi/8)1PI/8 rotation over Z-axis aka "Phase PI/8"
rxRXrxRxrx1thetaRotation around the X-axis by given angle
ryRYryRyry1thetaRotation around the Y-axis by given angle
rzRZrzRzrz1phiRotation around the Z-axis by given angle
u1PHASEdef u11lambdaSingle-qubit rotation about the Z axis
u2def u2def u21phi, lambdaSingle-qubit rotation about the X+Z axis
u3def u3def u31theta, phi, lambdaGeneric single-qubit rotation gate with 3 Euler angles
sSSSs1PI/2 rotation over Z-axis (synonym for r2)
tTTTt1PI/4 rotation over Z-axis (synonym for r4)
sdgPHASE(-pi/2)u1(-pi/2)si1(-PI/2) rotation over Z-axis
tdgPHASE(-pi/4)u1(-pi/4)ti1(-PI/4) rotation over Z-axis
gpidef gpigpigpi1phiGPi gate
gpi2def gpi2gpi2gpi21phiGPi2 gate
vzdef vzvzvz1thetaVirtualZ gate
cxCNOTCNOTCNOTcnot2Controlled NOT (CNOT) gate
cydef cyYControlled Y2Controlled Y gate (controlled rotation over Y-axis by PI)
czCZCZControlled Z2Controlled Z gate (controlled rotation over Z-axis by PI)
chdef chHControlled H2Controlled Hadamard gate
csrndef csrnX**(1/2)2Controlled square root of NOT
swapSWAPSWAPSWAPswap2Swaps the state of two qubits.
srswapdef srswapSWAP**(1/2)2Square root of swap
iswapISWAPISWAP2Swaps the state of two qubits, applying a -i phase to q1 when it is in the 1 state and a -i phase to q2 when it is in the 0 state
xxdef xxxxxx2thetaXX gate
yydef yyYYyy2thetaYY gate
zzdef zzzz2thetaParametric 2-qubit rotation about ZZ
xyXYdef xy2phiXY gate
msdef msmsms2phi0, phi1Mølmer-Sørensen gate
cr2CPHASE(pi/2)cu1(pi/2)2Controlled PI/2 rotation over Z-axis
cr4CPHASE(pi/4)cu1(pi/4)2Controlled PI/4 rotation over Z-axis
cr8CPHASE(pi/8)cu1(pi/8)2Controlled PI/8 rotation over Z-axis
crxdef crxrx(theta)Controlled Rx2thetaControlled rotation around the X-axis by given angle
crydef cryry(theta)Controlled Ry2thetaControlled rotation around the Y-axis by given angle
crzdef crzrz(phi)Controlled Rz2phiControlled rotation around the Z-axis by given angle
cu1CPHASEdef cu12lambdaControlled rotation about the Z axis
cu2def cu2def cu22phi, lambdaControlled rotation about the X+Z axis
cu3def cu3def cu32theta, phi, lambdaControlled rotation gate with 3 Euler angles
csCPHASE(pi/2)cu1(pi/2)2Controlled PI/2 rotation over Z-axis (synonym for cr2)
ctCPHASE(pi/4)cu1(pi/4)2Controlled PI/4 rotation over Z-axis (synonym for cr4)
csdgCPHASE(-pi/2)cu1(-pi/2)2Controlled (-PI/2) rotation over Z-axis
ctdgCPHASE(-pi/4)cu1(-pi/4)2Controlled (-PI/4) rotation over Z-axis
ccxCCNOTCCXCCNOT3Toffoli aka "CCNOT" gate
cswapCSWAPCSWAPControlled SWAP3Controlled swap aka "Fredkin" gate
csrswapdef csrswapSWAP**(1/2)3Controlled square root of swap
resetRESETresetReset1Resets qubit
measureMEASUREmeasureM1Measures qubit and stores chance (0 or 1) into classical bit

For more details see gate reference

Run circuit

Simply call run method.

circuit.run();

Initial state

By default, initial state of each qubit is |0>. You can pass initial values as array of bool (true or false) or integers (0 or 1). This will set first two qubits to |1> and evaluate circuit:

circuit.run([1, 1]);

Measurement

Method probabilities() will return array of probabilities (real numbers between 0 and 1) for each qubit:

console.log(circuit.probabilities());

Method probability(wire) will return probability (real number between 0 and 1) for given qubit:

console.log(circuit.probability(0));

Method measureAll() returns array of chances (as integers 0 or 1) for each qubit:

Example:

console.log(circuit.measureAll());

Method measure(wire) returns chance (as integer 0 or 1) for given qubit:

Example:

console.log(circuit.measure(0));

You can store measurement into classical register. For example, to measure first qubit (wire 0) and store result into classical register named c as fourth bit (bit 3):

circuit.measure(0, "c", 3);

You can add measure gate to circuit and then measurement will be done automatically and result will be stored into classical register:

circuit.addGate("measure", -1, 0, { creg: { name: "c", bit: 3 } });

Short form of writing this is addMeasure(wire, creg, cbit):

circuit.addMeasure(0, "c", 3);

Note:

Classical registers

Create register

Classical registers are created automatically if you add measurement gate to the circuit but you can also manually create registers by calling createCreg(name, len).

Example: create classical 5-bit register named ans:

circuit.createCreg("ans", 5);

Read register

To get register value as integer, call getCregValue(name).

Example:

var value = circuit.getCregValue("ans");

Read all registers as dictionary

var regs = circuit.getCregs();
console.log(regs);

Read all registers as tab delimited CSV string

var tsv = circuit.cregsAsString();
console.log(tsv);

Read single bit

Example: get bit 3 from register named ans:

console.log(circuit.getCregBit("ans", 3));

Returns integer: 0 or 1

Set single bit

Example: set bit 3 to 1 in register named ans:

circuit.setCregBit("ans", 3, 1);

Control by classical register

Each quatum gate in the circuit (except "measure" gate) can be controlled by classical register - gate will be executed only if classical register contains specified value. Pass options object as fourth argument to addGate method:

Example:

circuit.addGate("x", -1, 0, { 
    condition: { 
        creg: "ans",
        value: 7
    }
});

In this example, "x" gate will execute on qubit 0 only if value of register named "ans" equals 7.

Reset qubit

You can reset qubit to value |0> or |1> with resetQubit method:

circuit.resetQubit(3, 0);

In this example, qubit 3 will be set to 0|>.

Note that all entangled qubits will be changed as well

View/print state vector

You can get state as string with method stateAsString(onlyPossible):

var s = circuit.stateAsString(false);

If you want only possible values (only values with probability > 0) then pass true:

var s = circuit.stateAsString(true);

Or, you can print state to javascript console with method print(onlyPossible):

circuit.print(false);

If you want to print only possible values (only values with probability > 0) then pass true:

var s = circuit.print(true);

Save/Load circuit

You can export circuit to javascript object (format internally used by QuantumCircuit) by calling save method:

var obj = circuit.save();

// now do something with obj, save to file or whatever...

And load previously saved circuit by calling load method:

var obj = // ...load object from file or from another circuit or whatever

circuit.load(obj);

Use circuit as a gate in another circuit

You can "compile" any circuit and use it as a gate in another circuit like this:

// export circuit to variable
var obj = someCircuit.save();

// register it as a gate in another circuit
anotherCircuit.registerGate("my_gate", obj);

// use it as a gate in another circuit
// assuming original circuit has three qubits then gate must spread to 3 qubits, in this example: 2, 3, 4)
anotherCircuit.addGate("my_gate", 0, [2, 3, 4]);

Decompose circuit

If your circuit contains user defined gates (created from another circuit), you can decompose it into equivalent circuit containing only basic gates.

If you pass true as argument to function save, you'll get decomposed circuit.

Example:

var obj = circuit.save(true);
// now obj contains decomposed circuit. You can load it:
circuit.load(obj);

Import circuit

Import from QASM

Circuit can be imported from OpenQASM with following limitations:

To import circuit from OpenQASM use importQASM(input, errorCallback) method:

Example:

circuit.importQASM("OPENQASM 2.0;\nimport \"qelib1.inc\";\nqreg q[2];\nh q[0];\ncx q[0],q[1];\n", function(errors) {
    console.log(errors);
});

Import from QUIL

Circuit can be imported from Quil:

To import circuit from QUIL use importQuil(quil, errorCallback, options, qubitNames, renamedGates, lineOffset) method:

Example:

circuit.importQuil("H 0\nCNOT 0 1\n", function(errors) {
    console.log(errors);
});

Import from Qobj

Circuit can be imported from Qobj:

To import circuit from OpenQASM use importQobj(qobj, errorCallback) method:

Example:

circuit.importQobj({"qobj_id":"qobj_WlLkcGHxihyqWGrKEZ","type":"QASM","schema_version":"1.0","experiments":[{"header":{"memory_slots":0,"n_qubits":2,"qreg_sizes":[["q",2]],"qubit_labels":[["q",0],["q",1]],"creg_sizes":[],"clbit_labels":[],"name":"circuit0","description":"text_exp"},"config":{"n_qubits":2,"memory_slots":0},"instructions":[{"name":"x","qubits":[0,1]}]}],"header":{"description":"test_circ"},"config":{"shots":1,"memory_slots":0}}, function(errors) {
    console.log(errors);
});

Import from IONQ json

Circuit can be imported from IONQ json:

To import circuit from IONQ json use importIonq(data, errorCallback) method:

Example:

var ionqCircuit = {
  "qubits": 2,
  "circuit": [
    {
      "gate": "h",
      "target": 0
    },
    {
      "gate": "cnot",
      "target": 1,
      "control": 0
    }
  ]
};

circuit.importIonq(ionqCircuit, function(errors) {
    console.log(errors);
});

Export circuit

Export to JavaScript

Circuit can be exported to JavaScript with exportJavaScript(comment, decompose, null, asJupyter) method:

Example:

var js = circuit.exportJavaScript("Comment to insert at the beginning.\nCan be multi-line comment like this one.", false);

Export to python (Qiskit)

Circuit can be exported to Qiskit with following limitation:

To export circuit to Qiskit use exportToQiskit(options, exportAsGateName, circuitReplacement, insideSubmodule) method :

Example:

var qiskit = circuit.exportToQiskit({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false, null, null);
(Deprecated. Please use exportToQiskit() instead)

To export circuit to Qiskit you can also use exportQiskit(comment, decompose, exportAsGateName, versionStr, providerName, backendName, asJupyter, shots, circuitReplacement, insideSubmodule, hybrid)

Example:

var qiskit = circuit.exportQiskit("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null);

Export to QASM

Circuit can be exported to OpenQASM with following limitation:

To export circuit to OpenQASM use exportToQASM(options, exportAsGateName, circuitReplacement, insideSubmodule) method:

Example:

var qasm = circuit.exportToQASM({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToQASM() instead)

To export circuit to OpenQASM you can also use exportQASM(comment, decompose, exportAsGateName, circuitReplacement, compatibilityMode, insideSubmodule) method:

Example:

var qasm = circuit.exportQASM("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false);

Export to python (pyQuil)

Circuit can be exported to pyQuil

To export circuit to pyQuil use exportToPyquil(options, exportAsGateName) method:

Example:

var qasm = circuit.exportToPyquil({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToPyquil() instead)

To export circuit to Pyquil you can also use exportPyquil(comment, decompose, exportAsGateName, versionStr, lattice, asQVM, asJupyter, shots, hybrid) method:

Example:

var pyquil = circuit.exportPyquil("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, "2.1", "", false);

Export to Quil

Circuit can be exported to Quil

To export circuit to Quil use exportToQuil(options, exportAsGateName) method:

Example:

var quil = circuit.exportToQuil({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToQuil() instead)

To export circuit to Quil you can also use exportQuil(comment, decompose, exportAsGateName, versionStr) method:

Example:

var quil = circuit.exportQuil("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, "2.0");

Export to python (Cirq)

Circuit can be exported to Cirq with following limitation:

To export circuit to Cirq use exportToCirq(options, exportAsGateName) method:

Example:

var cirq = circuit.exportToCirq({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToCirq() instead)

To export circuit to Cirq you can also use exportCirq(comment, decompose, exportAsGateName, versionStr, asJupyter, shots, exportTfq) method:

Example:

var cirq = circuit.exportCirq("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null, false, null, false);

Export to C/C++ (QuEST)

Circuit can be exported to QuEST

To export circuit to QuEST use exportQuEST(newOptions, exportAsGateName, definedFunc) method:

Example:

var quest = circuit.exportToQuEST("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false);
(Deprecated. Please use exportToQuEST() instead)

To export circuit to QuEST you can also use exportQuEST(comment, decompose, exportAsGateName, definedFunc) method:

Example:

var quest = circuit.exportQuEST("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null);

Export to Q# (QSharp)

Circuit can be exported to Q#.

To export circuit to Q# use exportQSharp(options, exportAsGateName) method:

Example:

var qsharp = circuit.exportQSharp("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null, false, null);
(Deprecated. Please use exportToQSharp() instead)

To export circuit to Q# use exportQSharp(comment, decompose, exportAsGateName, versionStr, asJupyter, circuitName, indentDepth) method:

Example:

var qsharp = circuit.exportQSharp("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null, false, null);

Export to Qobj

Circuit can be exported to Qobj:

To export circuit to Qiskit use exportToQobj(options, circuitReplacement) method :

Example:

var qobj = circuit.exportToQobj({circuitName:"new_circuit"}, false);
(Deprecated. Please use exportToQobj() instead)

To export circuit to Qobj you can also use exportQobj(circuitName, experimentName, numShots, circuitReplacement)

Example:

var qobj = circuit.exportQobj("new_circuit", false);

Export to python (Tensorflow Quantum)

Circuit can be exported to Tensorflow Quantum:

To export circuit to TFQ use exportToTFQ(options, exportAsGateName) method :

Example:

var tfq = circuit.exportToTFQ({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToTFQ() instead)

To export circuit to TFQ you can also use exportTFQ(comment, decompose, exportAsGateName, versionStr, asJupyter, shots)

Example:

var tfq = circuit.exportTFQ("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null);

Export to python (Braket)

Circuit can be exported to Braket:

To export circuit to Braket use exportToBraket(options, exportAsGateName) method :

Example:

var braket = circuit.exportToBraket({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToBraket() instead)

To export circuit to Braket you can also use exportBraket(comment, decompose, exportAsGateName, versionStr, asJupyter, shots, hybrid, indentDepth)

Example:

var braket = circuit.exportBraket("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null);

Export to python (pyAQASM)

Circuit can be exported to pyAQASM:

To export circuit to pyAQASM use exportToPyAQASM(options, exportAsGateName) method :

Example:

var pyAqasm = circuit.exportToPyAQASM({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToPyAQASM() instead)

To export circuit to pyAQASM you can also use exportPyAQASM(comment, decompose, exportAsGateName, asJupyter, shots, hybrid)

Example:

var pyAqasm = circuit.exportPyAQASM("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null);

Export to python (AQASM)

Circuit can be exported to AQASM:

To export circuit to AQASM use exportToAQASM(options, isExportPyAQASM, exportAsGateName, indentDepth) method :

Example:

var aqasm = circuit.exportToAQASM({comment:"Comment to insert at the beginning.\nCan be multi-line comment as this one."}, false);
(Deprecated. Please use exportToAQASM() instead)

To export circuit to pyAQASM you can also use exportAQASM(comment, decompose, isExportPyAQASM, exportAsGateName, asJupyter, shots, hybrid, indentDepth)

Example:

var aqasm = circuit.exportAQASM("Comment to insert at the beginning.\nCan be multi-line comment as this one.", false, null, null);

Export to SVG

Vector .svg image of circuit can be created with exportSVG(embedded) function with following limitations:

Example 1

Show circuit in browser:


// Assuming we have <div id="drawing"></div> somewhere in HTML
var container = document.getElementById("drawing");

// SVG is returned as string
var svg = circuit.exportSVG(true);

// add SVG into container
container.innerHTML = svg;

Example 2

Generate standalone SVG image at server with node.js:


// export as standalone SVG
var svg = circuit.exportSVG(false);

// do something with svg string (e.g. save to file)
...

// Or, export as embedded SVG for use in browser
svg = circuit.exportSVG(true);

// do something with svg string (e.g. serve via HTTP)
...

Export to Quirk

Circuit can be exported to popular open-source drag-and-drop quantum circuit simulator Quirk with following limitations:

Example:


var quirkData = circuit.exportQuirk(true);

var quirkURL = "http://algassert.com/quirk#circuit=" + JSON.stringify(quirkData);

// Now do something with quirkURL. Assuming this code runs in browser and we have <a id="quirk"></a> somewhere, you can:
var quirkLink = document.getElementById("quirk");
quirkLink.setAttr("href", quirkLink);

About simulator algorithm

Memory usage: up to 2 * (2^numQubits) * sizeOfComplexNumber

Benchmark

Performance is measured on MacBook Pro MJLT2 mid-2015 (Core i7 2.5 GHz, 16GB RAM)

Benchmark 1

Benchmark 2

Benchmark 3

You can find scripts in /benchmark directory.

Gates

id

Single qubit identity gate

Qubits: 1

Matrix:

[

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

Example:

circuit.appendGate("id", 0);

x

Pauli X (PI rotation over X-axis) aka "NOT" gate

Qubits: 1

Matrix:

[

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

Example:

circuit.appendGate("x", 0);

y

Pauli Y (PI rotation over Y-axis)

Qubits: 1

Matrix:

[

    [0,"-i"],
    ["i",0]
]

Example:

circuit.appendGate("y", 0);

z

Pauli Z (PI rotation over Z-axis)

Qubits: 1

Matrix:

[

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

Example:

circuit.appendGate("z", 0);

h

Hadamard gate

Qubits: 1

Matrix:

[

    ["1 / sqrt(2)","1 / sqrt(2)"],
    ["1 / sqrt(2)","-1 / sqrt(2)"]
]

Example:

circuit.appendGate("h", 0);

srn

Square root of NOT

Qubits: 1

Matrix:

[

    ["0.5+0.5i","0.5-0.5i"],
    ["0.5-0.5i","0.5+0.5i"]
]

Example:

circuit.appendGate("srn", 0);

srndg

Inverse square root of NOT

Qubits: 1

Matrix:

[

    ["0.5-0.5i","0.5+0.5i"],
    ["0.5+0.5i","0.5-0.5i"]
]

Example:

circuit.appendGate("srndg", 0);

r2

PI/2 rotation over Z-axis aka "Phase PI/2"

Qubits: 1

Matrix:

[

    [1,0],
    [0,"exp(i * pi / 2)"]
]

Example:

circuit.appendGate("r2", 0);

r4

PI/4 rotation over Z-axis aka "Phase PI/4"

Qubits: 1

Matrix:

[

    [1,0],
    [0,"exp(i * pi / 4)"]
]

Example:

circuit.appendGate("r4", 0);

r8

PI/8 rotation over Z-axis aka "Phase PI/8"

Qubits: 1

Matrix:

[

    [1,0],
    [0,"exp(i * pi / 8)"]
]

Example:

circuit.appendGate("r8", 0);

rx

Rotation around the X-axis by given angle

Qubits: 1

Parameters:

Matrix:

[

    ["cos(theta / 2)","-i * sin(theta / 2)"],
    ["-i * sin(theta / 2)","cos(theta / 2)"]
]

Example:

circuit.appendGate("rx", 0, {
    params: {
        theta: "pi/2"
    }
});

ry

Rotation around the Y-axis by given angle

Qubits: 1

Parameters:

Matrix:

[

    ["cos(theta / 2)","-1 * sin(theta / 2)"],
    ["sin(theta / 2)","cos(theta / 2)"]
]

Example:

circuit.appendGate("ry", 0, {
    params: {
        theta: "pi/2"
    }
});

rz

Rotation around the Z-axis by given angle

Qubits: 1

Parameters:

Matrix:

[

    ["cos(phi / 2) - i * sin(phi / 2)",0],
    [0,"cos(phi / 2) + i * sin(phi / 2)"]
]

Example:

circuit.appendGate("rz", 0, {
    params: {
        phi: "pi/2"
    }
});

u1

Single-qubit rotation about the Z axis

Qubits: 1

Parameters:

Matrix:

[

    [1,0],
    [0,"exp(i * lambda)"]
]

Example:

circuit.appendGate("u1", 0, {
    params: {
        lambda: "pi/2"
    }
});

u2

Single-qubit rotation about the X+Z axis

Qubits: 1

Parameters:

Matrix:

[

    ["1 / sqrt(2)","-exp(i * lambda) * 1 / sqrt(2)"],
    ["exp(i * phi) * 1 / sqrt(2)","exp(i * lambda + i * phi) * 1 / sqrt(2)"]
]

Example:

circuit.appendGate("u2", 0, {
    params: {
        phi: "pi/2",
        lambda: "pi/2"
    }
});

u3

Generic single-qubit rotation gate with 3 Euler angles

Qubits: 1

Parameters:

Matrix:

[

    ["cos(theta/2)","-exp(i * lambda) * sin(theta / 2)"],
    ["exp(i * phi) * sin(theta / 2)","exp(i * lambda + i * phi) * cos(theta / 2)"]
]

Example:

circuit.appendGate("u3", 0, {
    params: {
        theta: "pi/2",
        phi: "pi/2",
        lambda: "pi/2"
    }
});

s

PI/2 rotation over Z-axis (synonym for r2)

Qubits: 1

Matrix:

[

    [1,0],
    [0,"i"]
]

Example:

circuit.appendGate("s", 0);

t

PI/4 rotation over Z-axis (synonym for r4)

Qubits: 1

Matrix:

[

    [1,0],
    [0,"exp(i * pi / 4)"]
]

Example:

circuit.appendGate("t", 0);

sdg

(-PI/2) rotation over Z-axis

Qubits: 1

Matrix:

[

    [1,0],
    [0,"-i"]
]

Example:

circuit.appendGate("sdg", 0);

tdg

(-PI/4) rotation over Z-axis

Qubits: 1

Matrix:

[

    [1,0],
    [0,"exp(-i * pi / 4)"]
]

Example:

circuit.appendGate("tdg", 0);

gpi

GPi gate

Qubits: 1

Parameters:

Matrix:

[

    [0,"exp(-i*phi)"],
    ["exp(i*phi)",0]
]

Example:

circuit.appendGate("gpi", 0, {
    params: {
        phi: "pi/2"
    }
});

gpi2

GPi2 gate

Qubits: 1

Parameters:

Matrix:

[

    ["1/sqrt(2)","(-i*exp(-i*phi))/sqrt(2)"],
    ["(-i*exp(i*phi))/sqrt(2)","1/sqrt(2)"]
]

Example:

circuit.appendGate("gpi2", 0, {
    params: {
        phi: "pi/2"
    }
});

vz

VirtualZ gate

Qubits: 1

Parameters:

Matrix:

[

    ["exp(-i*theta/2)",0],
    [0,"exp(i*theta/2)"]
]

Example:

circuit.appendGate("vz", 0, {
    params: {
        theta: "pi/2"
    }
});

cx

Controlled NOT (CNOT) gate

Qubits: 2

Matrix:

[

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

Example:

circuit.appendGate("cx", [0, 1]);

cy

Controlled Y gate (controlled rotation over Y-axis by PI)

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,0,"-i"],
    [0,0,"i",0]
]

Example:

circuit.appendGate("cy", [0, 1]);

cz

Controlled Z gate (controlled rotation over Z-axis by PI)

Qubits: 2

Matrix:

[

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

Example:

circuit.appendGate("cz", [0, 1]);

ch

Controlled Hadamard gate

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,"1 / sqrt(2)","1 / sqrt(2)"],
    [0,0,"1 / sqrt(2)","-1 / sqrt(2)"]
]

Example:

circuit.appendGate("ch", [0, 1]);

csrn

Controlled square root of NOT

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,"0.5+0.5i","0.5-0.5i"],
    [0,0,"0.5-0.5i","0.5+0.5i"]
]

Example:

circuit.appendGate("csrn", [0, 1]);

swap

Swaps the state of two qubits.

Qubits: 2

Matrix:

[

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

Example:

circuit.appendGate("swap", [0, 1]);

srswap

Square root of swap

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,"0.5 * (1 + i)","0.5 * (1 - i)",0],
    [0,"0.5 * (1 - i)","0.5 * (1 + i)",0],
    [0,0,0,1]
]

Example:

circuit.appendGate("srswap", [0, 1]);

iswap

Swaps the state of two qubits, applying a -i phase to q1 when it is in the 1 state and a -i phase to q2 when it is in the 0 state

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,0,"0+i",0],
    [0,"0+i",0,0],
    [0,0,0,1]
]

Example:

circuit.appendGate("iswap", [0, 1]);

xx

XX gate

Qubits: 2

Parameters:

Matrix:

[

    ["cos(theta)",0,0,"-i*sin(theta)"],
    [0,"cos(theta)","-i*sin(theta)",0],
    [0,"-i*sin(theta)","cos(theta)",0],
    ["-i*sin(theta)",0,0,"cos(theta)"]
]

Example:

circuit.appendGate("xx", [0, 1], {
    params: {
        theta: "pi/2"
    }
});

yy

YY gate

Qubits: 2

Parameters:

Matrix:

[

    ["cos(theta)",0,0,"i*sin(theta)"],
    [0,"cos(theta)","-i*sin(theta)",0],
    [0,"-i*sin(theta)","cos(theta)",0],
    ["i*sin(theta)",0,0,"cos(theta)"]
]

Example:

circuit.appendGate("yy", [0, 1], {
    params: {
        theta: "pi/2"
    }
});

zz

Parametric 2-qubit rotation about ZZ

Qubits: 2

Parameters:

Matrix:

[

    ["exp(-i * theta / 2)",0,0,0],
    [0,"exp(i * theta / 2)",0,0],
    [0,0,"exp(i * theta / 2)",0],
    [0,0,0,"exp(-i * theta / 2)"]
]

Example:

circuit.appendGate("zz", [0, 1], {
    params: {
        theta: "pi/2"
    }
});

xy

XY gate

Qubits: 2

Parameters:

Matrix:

[

    [1,0,0,0],
    [0,"cos(phi / 2)","i * sin(phi / 2)",0],
    [0,"i * sin(phi / 2)","cos(phi / 2)",0],
    [0,0,0,1]
]

Example:

circuit.appendGate("xy", [0, 1], {
    params: {
        phi: "pi/2"
    }
});

ms

Mølmer-Sørensen gate

Qubits: 2

Parameters:

Matrix:

[

    ["1/sqrt(2)",0,0,"(-i*exp(-i*(phi0+phi1)))/sqrt(2)"],
    [0,"1/sqrt(2)","(-i*exp(-i*(phi0-phi1)))/sqrt(2)",0],
    [0,"(-i*exp(i*(phi0-phi1)))/sqrt(2)","1/sqrt(2)",0],
    ["(-i*exp(i*(phi0+phi1)))/sqrt(2)",0,0,"1/sqrt(2)"]
]

Example:

circuit.appendGate("ms", [0, 1], {
    params: {
        phi0: "pi/2",
        phi1: "pi/2"
    }
});

cr2

Controlled PI/2 rotation over Z-axis

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"exp(i * pi / 2)"]
]

Example:

circuit.appendGate("cr2", [0, 1]);

cr4

Controlled PI/4 rotation over Z-axis

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"exp(i * pi / 4)"]
]

Example:

circuit.appendGate("cr4", [0, 1]);

cr8

Controlled PI/8 rotation over Z-axis

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"exp(i * pi / 8)"]
]

Example:

circuit.appendGate("cr8", [0, 1]);

crx

Controlled rotation around the X-axis by given angle

Qubits: 2

Parameters:

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,"cos(theta / 2)","-i * sin(theta / 2)"],
    [0,0,"-i * sin(theta / 2)","cos(theta / 2)"]
]

Example:

circuit.appendGate("crx", [0, 1], {
    params: {
        theta: "pi/2"
    }
});

cry

Controlled rotation around the Y-axis by given angle

Qubits: 2

Parameters:

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,"cos(theta / 2)","-1 * sin(theta / 2)"],
    [0,0,"sin(theta / 2)","cos(theta / 2)"]
]

Example:

circuit.appendGate("cry", [0, 1], {
    params: {
        theta: "pi/2"
    }
});

crz

Controlled rotation around the Z-axis by given angle

Qubits: 2

Parameters:

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,"cos(phi / 2) - i * sin(phi / 2)",0],
    [0,0,0,"cos(phi / 2) + i * sin(phi / 2)"]
]

Example:

circuit.appendGate("crz", [0, 1], {
    params: {
        phi: "pi/2"
    }
});

cu1

Controlled rotation about the Z axis

Qubits: 2

Parameters:

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"exp(i * lambda)"]
]

Example:

circuit.appendGate("cu1", [0, 1], {
    params: {
        lambda: "pi/2"
    }
});

cu2

Controlled rotation about the X+Z axis

Qubits: 2

Parameters:

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,"1 / sqrt(2)","-exp(i * lambda) * 1 / sqrt(2)"],
    [0,0,"exp(i * phi) * 1 / sqrt(2)","exp(i * lambda + i * phi) * 1 / sqrt(2)"]
]

Example:

circuit.appendGate("cu2", [0, 1], {
    params: {
        phi: "pi/2",
        lambda: "pi/2"
    }
});

cu3

Controlled rotation gate with 3 Euler angles

Qubits: 2

Parameters:

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,"cos(theta/2)","-exp(i * lambda) * sin(theta / 2)"],
    [0,0,"exp(i * phi) * sin(theta / 2)","exp(i * lambda + i * phi) * cos(theta / 2)"]
]

Example:

circuit.appendGate("cu3", [0, 1], {
    params: {
        theta: "pi/2",
        phi: "pi/2",
        lambda: "pi/2"
    }
});

cs

Controlled PI/2 rotation over Z-axis (synonym for cr2)

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"i"]
]

Example:

circuit.appendGate("cs", [0, 1]);

ct

Controlled PI/4 rotation over Z-axis (synonym for cr4)

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"exp(i * pi / 4)"]
]

Example:

circuit.appendGate("ct", [0, 1]);

csdg

Controlled (-PI/2) rotation over Z-axis

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"-i"]
]

Example:

circuit.appendGate("csdg", [0, 1]);

ctdg

Controlled (-PI/4) rotation over Z-axis

Qubits: 2

Matrix:

[

    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,"exp(-i * pi / 4)"]
]

Example:

circuit.appendGate("ctdg", [0, 1]);

ccx

Toffoli aka "CCNOT" gate

Qubits: 3

Matrix:

[

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

Example:

circuit.appendGate("ccx", [0, 1, 2]);

cswap

Controlled swap aka "Fredkin" gate

Qubits: 3

Matrix:

[

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

Example:

circuit.appendGate("cswap", [0, 1, 2]);

csrswap

Controlled square root of swap

Qubits: 3

Matrix:

[

    [1,0,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,0,1,0,0,0,0,0],
    [0,0,0,1,0,0,0,0],
    [0,0,0,0,1,0,0,0],
    [0,0,0,0,0,"0.5 * (1 + i)","0.5 * (1 - i)",0],
    [0,0,0,0,0,"0.5 * (1 - i)","0.5 * (1 + i)",0],
    [0,0,0,0,0,0,0,1]
]

Example:

circuit.appendGate("csrswap", [0, 1, 2]);

reset

Resets qubit

Qubits: 1

Example:

circuit.appendGate("reset", 0);

measure

Measures qubit and stores chance (0 or 1) into classical bit

Qubits: 1

Example:

circuit.appendGate("measure", 0, {
    creg: {
        name: "c",
        bit: 3
    }
});

Or:

circuit.addMeasure(0, "c", 3);

API docs

To be written...

License

MIT