Quantum Circuits Library
Contents
Quantum Circuits
MimiqCircuitsBase.Circuit
— Typestruct Circuit
Representation of a quantum circuit as a vector of gates applied to the qubits.
Parameters
gates::Vector{Instruction}
vector of quantum instructions (seeInstruction
)
Example iteration
circuit = Circuit()
# add gates to circuit
for (; operation, targets) in circuit
# do something with the gate and its targets
# e.g.
end
(here the iteration parameters should be called operation
and targets
to proper destructure a Instruction
)
Gate types
- Single qubit gates (basic):
GateX
,GateY
,GateZ
,GateH
,GateS
,GateSDG
,GateT
,GateTDG
,GateSX
,GateSXDG
,GateID
- Single qubit gates (parametric):
GateRX
,GateRY
,GateRZ
,GateP
,GateR
,GateU
- Two qubit gates (basic):
GateCX
,GateCY
,GateCZ
,GateCH
,GateSWAP
,GateISWAP
,GateISWAPDG
- Two qubit gates (parametric):
GateCP
,GateCRX
,GateCRY
,GateCRZ
,GateCU
- Custom gate (currently only for 1 and 2 qubit gates):
Gate
MimiqCircuitsBase.Instruction
— Typestruct Instruction{N,M,T<:Operation}
Element of a quantum circuit, representing a N
-qubit gate applied to N
targets
Parameters
gate::T
actual gate representedqtargets::NTuple{N, Int64}
indices specifying the quantum bits on which the instruction is appliedctargets::NTuple{N, Int64}
indices specifying the classical bits on which the instruction is applied
MimiqCircuitsBase.getqubit
— FunctionMimiqCircuitsBase.getqubits
— FunctionMimiqCircuitsBase.getbit
— FunctionMimiqCircuitsBase.getbits
— FunctionMimiqCircuitsBase.getoperation
— Functiongetoperation(getoperation)
Returns the quantum operation associated to the given gate instruction.
MimiqCircuitsBase.depth
— Functiondepth(circuit)
Compute the depth of a quantum circuit.
The depth of a quantum circuit is a metric computing the maximum time (in units of quantum gates application) between the input and output of the circuit.
Bit States
MimiqCircuitsBase.BitState
— Typestruct BitState
Representation of the quantum state of a quantum register with definite values for each qubit.
Examples
julia> BitState(16)
16-qubit BitState with 0 non-zero qubits:
└── |0000000000000000⟩
julia> bs = BitState(16, [1,2,3,4])
16-qubit BitState with 4 non-zero qubits:
├── |1111000000000000⟩
└── non-zero qubits: [1, 2, 3, 4]
julia> bs[10] = 1
1
julia> bs
16-qubit BitState with 5 non-zero qubits:
├── |1111000001000000⟩
└── non-zero qubits: [1, 2, 3, 4, 10]
julia> c = Circuit()
empty circuit
julia> push!(c, GateX(), 8)
8-qubit circuit with 1 gates:
└── X @ q8
julia> BitState(c, [1,3,5,8])
8-qubit BitState with 4 non-zero qubits:
├── |10101001⟩
└── non-zero qubits: [1, 3, 5, 8]
julia> bitstate_to_integer(bs)
527
julia> typeof(ans)
BigInt
julia> bitstate_to_integer(bs, Int64)
527
julia> typeof(ans)
Int64
There are many different ways to get bit states:
julia> bs = BitState(30, 2344574)
30-qubit BitState with 13 non-zero qubits:
├── |011111100110001111000100000000⟩
└── non-zero qubits: [2, 3, 4, 5, 6, 7, 10, 11, 15, 16, 17, 18, 22]
julia> ones(BitState, 10) # or also trues(BitState, 10)
10-qubit BitState with 10 non-zero qubits:
├── |1111111111⟩
└── non-zero qubits: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
julia> zeros(BitState, 10) # or also falses(BitState, 10)
10-qubit BitState with 0 non-zero qubits:
└── |0000000000⟩
julia> BitState(16) do i
iseven(i)
end
16-qubit BitState with 8 non-zero qubits:
├── |0101010101010101⟩
└── non-zero qubits: [2, 4, 6, 8, 10, 12, 14, 16]
MimiqCircuitsBase.nonzeros
— Functionnonzeros(bitstate)
Return the indices of the non-zero qubits in a bit state.
MimiqCircuitsBase.bitstate_to_integer
— Functionbitstate_to_integer(bitstate[, T])
Convert a bit state into its corresponding integer.
MimiqCircuitsBase.bitstate_to_index
— Functionbitstate_to_index(bitstate)
Convert a bit state into the corresponding index.
This is useful for indexing, for example, a vector of states.
MimiqCircuitsBase.@bs_str
— Macromacro bs_str(s)
Convert a string into a bit state.
Example usage
julia> bs"101011"
6-qubit BitState with 4 non-zero qubits:
├── |101011⟩
└── non-zero qubits: [1, 3, 5, 6]
MimiqCircuitsBase.bits
— Functionbits(bitstate)
Get the underlying bit array of a bit state.
MimiqCircuitsBase.to01
— Functionto01(bitstate[, endianess=:big])
Converts a BitState into a string of 0 and 1 characters. Optionally endianess can be specified, which can be either :big
or :little
.
Examples
julia> to01(bs"10011")
"10011"
julia> to01(bs"10011"; endianess=:big)
"10011"
julia> to01(bs"10011"; endianess=:little)
"11001"
Quantum Operations
MimiqCircuitsBase.Operation
— TypeMimiqCircuitsBase.opname
— Functionopname(instruction)
opname(operation)
Returns the name of the given operation in a human readable format.
MimiqCircuitsBase.inverse
— Functioninverse(circuit)
inverse(instruction)
inverse(operation)
Return the inverse of the given operation.
Gates
MimiqCircuitsBase.Gate
— Typeabstract type Gate{N} <: Operation
Supertype for all the N
-qubit gates.
Methods
MimiqCircuitsBase.hilbertspacedim
— Functionhilbertspacedim(gate)
hilberspacedim(circuit)
Hilbert space dimension for the given operation.
MimiqCircuitsBase.numbits
— Functionnumbits(instruction)
numbits(circuit)
Number of classical bits on which the given operation or instruction is defined.
MimiqCircuitsBase.numqubits
— Functionnumqubits(gate)
numqubits(barrier)
numqubits(instruction)
numqubits(circuit)
Number of qubits on which the given operation or instruction is defined.
MimiqCircuitsBase.matrix
— Functionmatrix(gate)
Return the matrix associated to the specified quantum gate.
Parametric gates
MimiqCircuitsBase.ParametricGate
— TypeMimiqCircuitsBase.numparams
— Functionnumparams(gate)
Number of parameters for the given parametric gate. Zero for non parametric gates.
MimiqCircuitsBase.parnames
— Functionparnames(gate)
Name of the parameters allowed for the given gate
Single-Qubit Gates
Pauli gates
MimiqCircuitsBase.GateID
— Typestruct GateID <: Gate{1}
Single qubit Identity gate
Matrix Representation
\[\operatorname{I} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}\]
Examples
julia> matrix(GateID())
2×2 Matrix{Float64}:
1.0 -0.0
0.0 1.0
julia> push!(Circuit(), GateID(), 1)
1-qubit circuit with 1 gates:
└── ID @ q1
MimiqCircuitsBase.GateX
— Typestruct GateX <: Gate{1}
Single qubit Pauli-X gate.
Matrix Representation
\[\operatorname X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\]
Examples
julia> matrix(GateX())
2×2 Matrix{Float64}:
0.0 1.0
1.0 -0.0
julia> push!(Circuit(), GateX(), 1)
1-qubit circuit with 1 gates:
└── X @ q1
MimiqCircuitsBase.GateY
— Typestruct GateY <: Gate{1}
Single qubit Pauli-Y gate.
Matrix Representation
\[\operatorname Y = \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix}\]
Examples
julia> matrix(GateY())
2×2 Matrix{ComplexF64}:
0.0+0.0im -0.0-1.0im
0.0+1.0im -0.0+0.0im
julia> push!(Circuit(), GateY(), 1)
1-qubit circuit with 1 gates:
└── Y @ q1
MimiqCircuitsBase.GateZ
— Typestruct GateZ <: Gate{1}
Single qubit Pauli-Z gate.
Matrix Representation
\[\operatorname Z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}\]
Examples
julia> matrix(GateZ())
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> push!(Circuit(), GateZ(), 1)
1-qubit circuit with 1 gates:
└── Z @ q1
MimiqCircuitsBase.GateH
— Typestruct GateH <: Gate{1}
Single qubit Hadamard gate.
Matrix Representation
\[\operatorname H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}\]
Examples
julia> matrix(GateH())
2×2 Matrix{Float64}:
0.707107 0.707107
0.707107 -0.707107
julia> push!(Circuit(), GateH(), 1)
1-qubit circuit with 1 gates:
└── H @ q1
MimiqCircuitsBase.GateS
— Typestruct GateS <: Gate{1}
Single qubit S gate (or Phase gate).
See also GateSDG
Matrix Representation
\[\operatorname S = \begin{pmatrix} 1 & 0 \\ 0 & i \end{pmatrix}\]
Examples
julia> matrix(GateS())
2×2 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+1.0im
julia> push!(Circuit(), GateS(), 1)
1-qubit circuit with 1 gates:
└── S @ q1
MimiqCircuitsBase.GateSDG
— Typestruct GateSDG <: Gate{1}
Single qubit S-dagger gate (conjugate transpose of the S gate).
See also GateS
Matrix Representation
\[\operatorname S^\dagger = \begin{pmatrix} 1 & 0 \\ 0 & -i \end{pmatrix}\]
Examples
julia> matrix(GateSDG())
2×2 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im
0.0+0.0im 0.0-1.0im
julia> push!(Circuit(), GateSDG(), 1)
1-qubit circuit with 1 gates:
└── SDG @ q1
MimiqCircuitsBase.GateT
— Typestruct GateT <: Gate{1}
Single qubit T gate.
See also GateTDG
Matrix Representation
\[\operatorname T = \begin{pmatrix} 1 & 0 \\ 0 & \exp(\frac{i\pi}{4}) \end{pmatrix}\]
Examples
julia> matrix(GateT())
2×2 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im
0.0+0.0im 0.707107+0.707107im
julia> push!(Circuit(), GateT(), 1)
1-qubit circuit with 1 gates:
└── T @ q1
MimiqCircuitsBase.GateTDG
— Typestruct GateTDG <: Gate{1}
Single qubit T-dagger gate (conjugate transpose of the T gate).
See also GateT
Matrix Representation
\[\operatorname T^\dagger = \begin{pmatrix} 1 & 0 \\ 0 & \exp(\frac{-i\pi}{4}) \end{pmatrix}\]
Examples
julia> matrix(GateTDG())
2×2 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im
0.0+0.0im 0.707107-0.707107im
julia> push!(Circuit(), GateTDG(), 1)
1-qubit circuit with 1 gates:
└── TDG @ q1
MimiqCircuitsBase.GateSX
— Typestruct GateSX <: Gate{1}
Single qubit √X gate.
Matrix Representation
\[\sqrt{\operatorname{X}} = \frac{1}{2} \begin{pmatrix} 1+i & 1-i \\ 1-i & 1+i \end{pmatrix}\]
Examples
julia> matrix(GateSX())
2×2 Matrix{ComplexF64}:
0.5+0.5im 0.5-0.5im
0.5-0.5im 0.5+0.5im
julia> push!(Circuit(), GateSX(), 1)
1-qubit circuit with 1 gates:
└── SX @ q1
MimiqCircuitsBase.GateSXDG
— Typestruct GateSXDG <: Gate{1}
Single qubit √X-dagger gate (conjugate transpose of the √X gate)
Matrix Representation
\[\sqrt{\operatorname{X}}^\dagger = \frac{1}{2} \begin{pmatrix} 1-i & 1+i \\ 1+i & 1-i \end{pmatrix}\]
Examples
julia> matrix(GateSXDG())
2×2 Matrix{ComplexF64}:
0.5-0.5im 0.5+0.5im
0.5+0.5im 0.5-0.5im
julia> push!(Circuit(), GateSXDG(), 1)
1-qubit circuit with 1 gates:
└── SXDG @ q1
Parametric Single-Qubit Gates
MimiqCircuitsBase.GateP
— Typestruct GateP <: ParametricGate{1}
Single qubit Phase gate.
Arguments
λ::Float64
: Phase angle in radians
Matrix Representation
\[\operatorname P(\lambda) = \begin{pmatrix} 1 & 0 \\ 0 & e^{i\lambda} \end{pmatrix}\]
Examples
julia> matrix(GateP(pi/4))
2×2 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im
0.0+0.0im 0.707107+0.707107im
julia> push!(Circuit(), GateP(pi/4), 1)
1-qubit circuit with 1 gates:
└── P(λ=π⋅0.25) @ q1
MimiqCircuitsBase.GateRX
— Typestruct GateRX <: ParametricGate{1}
Single qubit Rotation-X gate (RX gate)
Arguments
θ::Float64
: Rotation angle in radians
Matrix Representation
\[\operatorname{RX}(\theta) = \begin{pmatrix} \cos\frac{\theta}{2} & -i\sin\frac{\theta}{2} \\ -i\sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{pmatrix}\]
Examples
julia> matrix(GateRX(pi/2))
2×2 Matrix{ComplexF64}:
0.707107+0.0im -0.0-0.707107im
0.0-0.707107im 0.707107+0.0im
julia> push!(Circuit(), GateRX(pi/2), 1)
1-qubit circuit with 1 gates:
└── RX(θ=π⋅0.5) @ q1
MimiqCircuitsBase.GateRY
— Typestruct GateRY <: ParametricGate{1}
Single qubit Rotation-Y gate (RY gate)
Arguments
θ::Float64
: Rotation angle in radians
Matrix Representation
\[\operatorname{RY}(\theta) = \begin{pmatrix} \cos\frac{\theta}{2} & -\sin\frac{\theta}{2} \\ \sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{pmatrix}\]
Examples
julia> matrix(GateRY(pi/2))
2×2 Matrix{Float64}:
0.707107 -0.707107
0.707107 0.707107
julia> push!(Circuit(), GateRY(pi/2), 1)
1-qubit circuit with 1 gates:
└── RY(θ=π⋅0.5) @ q1
MimiqCircuitsBase.GateRZ
— Typestruct GateRZ <: ParametricGate{1}
Single qubit Rotation-Z gate (RZ gate)
Arguments
λ::Float64
: Rotation angle in radians
Matrix Representation
\[\operatorname{RZ}(\lambda) = \begin{pmatrix} e^{-i\frac{\lambda}{2}} & 0 \\ 0 & e^{i\frac{\lambda}{2}} \end{pmatrix}\]
Examples
julia> matrix(GateRZ(pi/2))
2×2 Matrix{ComplexF64}:
0.707107-0.707107im -0.0+0.0im
0.0+0.0im 0.707107+0.707107im
julia> push!(Circuit(), GateRZ(pi/2), 1)
1-qubit circuit with 1 gates:
└── RZ(λ=π⋅0.5) @ q1
MimiqCircuitsBase.GateR
— Typestruct GateR <: ParametricGate{1}
Single qubit Rotation gate around the axis cos(ϕ)x + sin(ϕ)y.
Arguments
θ::Float64
: Rotation angle in radiansϕ::Float64
: Axis of rotation in radians
Matrix Representation
\[\operatorname R(\theta,\phi) = \begin{pmatrix} \cos\frac{\theta}{2} & -ie^{-i\phi}\sin\frac{\theta}{2} \\ -ie^{-i\phi}\sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{pmatrix}\]
Examples
julia> matrix(GateR(pi/2,pi/4))
2×2 Matrix{ComplexF64}:
0.707107+0.0im -0.5-0.5im
0.5-0.5im 0.707107+0.0im
julia> push!(Circuit(), GateR(pi/2,pi/4), 1)
1-qubit circuit with 1 gates:
└── R(θ=π⋅0.5, ϕ=π⋅0.25) @ q1
MimiqCircuitsBase.GateU1
— Typestruct GateU1 <: ParametricGate{1}
One qubit generic unitary gate u1
, as defined in OpenQASM 3.0
Equivalent to GateP
Arguments
λ::Float64
: Rotation angle in radians
Matrix Representation
\[\operatorname{U1}(\lambda) = \begin{pmatrix} 1 & 0 \\ 0 & e^{i\lambda} \end{pmatrix}\]
Examples
julia> matrix(GateU1(pi/4))
2×2 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im
0.0+0.0im 0.707107+0.707107im
julia> push!(Circuit(), GateU1(pi/4), 1)
1-qubit circuit with 1 gates:
└── U1(λ=π⋅0.25) @ q1
MimiqCircuitsBase.GateU2
— Typestruct GateU2 <: ParametricGate{1}
One qubit generic unitary gate u2
, as defined in OpenQASM 3.0
See also GateU2DG
.
Arguments
ϕ:Float64
: Rotation angle in radiansλ::Float64
: Rotation angle in radians
Examples
julia> matrix(GateU2(pi/2,pi/4))
2×2 Matrix{ComplexF64}:
0.270598-0.653281im -0.653281+0.270598im
0.653281+0.270598im 0.270598+0.653281im
julia> push!(Circuit(), GateU2(pi/4,pi/4), 1)
1-qubit circuit with 1 gates:
└── U2(ϕ=π⋅0.25, λ=π⋅0.25) @ q1
MimiqCircuitsBase.GateU2DG
— Typestruct GateU2DG <: ParametricGate{1}
One qubit generic unitary gate u2
-dagger, as defined in OpenQASM 3.0 for backwards compatibility
See also GateU2
Arguments
ϕ:Float64
: Rotation angle in radiansλ::Float64
: Rotation angle in radians
Examples
julia> matrix(GateU2DG(pi/2,pi/4))
2×2 Matrix{ComplexF64}:
0.270598+0.653281im 0.653281-0.270598im
-0.653281-0.270598im 0.270598-0.653281im
julia> push!(Circuit(), GateU2DG(pi/2,pi/4), 1)
1-qubit circuit with 1 gates:
└── U2DG(ϕ=π⋅0.5, λ=π⋅0.25) @ q1
MimiqCircuitsBase.GateU3
— Typestruct GateU3 <: ParametricGate{1}
One qubit generic unitary gate u3
, as defined in OpenQASM 3.0 for backwards compatibility.
Arguments
θ:Float64
: Rotation angle 1 in radiansϕ:Float64
: Rotation angle 2 in radiansλ::Float64
: Rotation angle 3 in radians
Examples
julia> matrix(GateU3(pi/2,pi/4,pi/2))
2×2 Matrix{ComplexF64}:
0.270598-0.653281im -0.653281-0.270598im
0.653281-0.270598im 0.270598+0.653281im
julia> push!(Circuit(), GateU3(pi/2, pi/4, pi/2), 1)
1-qubit circuit with 1 gates:
└── U3(θ=π⋅0.5, ϕ=π⋅0.25, λ=π⋅0.5) @ q1
MimiqCircuitsBase.GateU
— Typestruct GateU <: ParametricGate{1}
One qubit generic unitary gate, as defined in OpenQASM 3.0.
Arguments
θ::Float64
: Euler angle 1 in radiansϕ::Float64
: Euler angle 2 in radiansλ::Float64
: Euler angle 3 in radians
Matrix Representation
\[\operatorname{U}(\theta,\phi,\lambda) = \begin{pmatrix} \cos\frac{\theta}{2} & -e^{i\lambda}\sin\frac{\theta}{2} \\ e^{i\phi}\sin\frac{\theta}{2} & e^{i(\phi+\lambda)}\cos\frac{\theta}{2} \end{pmatrix}\]
Examples
julia> matrix(GateU(pi/3, pi/3, pi/3))
2×2 Matrix{ComplexF64}:
0.866025+0.0im -0.25-0.433013im
0.25+0.433013im -0.433013+0.75im
julia> push!(Circuit(), GateU(pi/3, pi/3, pi/3), 1)
1-qubit circuit with 1 gates:
└── U(θ=π⋅0.3333..., ϕ=π⋅0.3333..., λ=π⋅0.3333...) @ q1
Two-Qubit Gates
Controlled Pauli gates:
MimiqCircuitsBase.GateCX
— Typestruct GateCX <: Gate{2}
Two qubit Controlled-X gate (or CNOT).
Matrix Representation
\[\operatorname{CX} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCX())
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 0.0 1.0
0.0 0.0 1.0 -0.0
julia> push!(Circuit(), GateCX(), 1, 2)
2-qubit circuit with 1 gates:
└── CX @ q1, q2
MimiqCircuitsBase.GateCY
— Typestruct GateCY <: Gate{2}
Two qubit Controlled-Y gate.
Matrix Representation
\[\operatorname{CY} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & -i \\ 0 & 0 & i & 0 \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCY())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im -0.0-1.0im
0.0+0.0im 0.0+0.0im 0.0+1.0im -0.0+0.0im
julia> push!(Circuit(), GateCY(), 1, 2)
2-qubit circuit with 1 gates:
└── CY @ q1, q2
MimiqCircuitsBase.GateCZ
— Typestruct GateCZ <: Gate{2}
Two qubit Controlled-Z gate.
Matrix Representation
\[\operatorname{CZ} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & -1 \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCZ())
4×4 Matrix{Float64}:
1.0 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.0 0.0 -1.0
julia> push!(Circuit(), GateCZ(), 1, 2)
2-qubit circuit with 1 gates:
└── CZ @ q1, q2
MimiqCircuitsBase.GateCH
— Typestruct GateCH <: Gate{2}
Two qubit Controlled-Hadamard gate.
Matrix Representation
\[\operatorname{CH} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ 0 & 0 & \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCH())
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 0.707107 0.707107
0.0 0.0 0.707107 -0.707107
julia> push!(Circuit(), GateCH(), 1, 2)
2-qubit circuit with 1 gates:
└── CH @ q1, q2
MimiqCircuitsBase.GateSWAP
— Typestruct GateSWAP <: Gate{2}
Two qubit SWAP gate.
See also GateISWAP
Matrix Representation
\[\operatorname{SWAP} = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\]
Examples
julia> matrix(GateSWAP())
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 0.0 1.0
julia> push!(Circuit(), GateSWAP(), 1, 2)
2-qubit circuit with 1 gates:
└── SWAP @ q1, q2
MimiqCircuitsBase.GateISWAP
— Typestruct GateISWAP <: Gate{2}
Two qubit ISWAP gate.
See also GateISWAPDG
, GateSWAP
.
Matrix Representation
\[\operatorname{ISWAP} = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & i & 0 \\ 0 & i & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\]
Examples
julia> matrix(GateISWAP())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+1.0im 0.0+0.0im
0.0+0.0im 0.0+1.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 1.0+0.0im
julia> push!(Circuit(), GateISWAP(), 1, 2)
2-qubit circuit with 1 gates:
└── ISWAP @ q1, q2
MimiqCircuitsBase.GateISWAPDG
— Typestruct GateISWAPDG <: Gate{2}
Two qubit ISWAP-dagger gate (conjugate transpose of ISWAP)
Matrix Representation
\[\operatorname{ISWAP}^\dagger = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & -i & 0 \\ 0 & -i & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\]
Examples
julia> matrix(GateISWAPDG())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0-1.0im 0.0+0.0im
0.0+0.0im 0.0-1.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 1.0+0.0im
julia> push!(Circuit(), GateISWAPDG(), 1, 2)
2-qubit circuit with 1 gates:
└── ISWAPDG @ q1, q2
MimiqCircuitsBase.GateCS
— Typestruct GateCS <: Gate{2}
Two qubit Controlled-S gate.
Matrix Representation
\[\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & i \end{pmatrix}\]
Examples
julia> matrix(GateCS())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 1.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+1.0im
julia> push!(Circuit(), GateCS(), 1, 2)
2-qubit circuit with 1 gates:
└── CS @ q1, q2
MimiqCircuitsBase.GateCSDG
— Typestruct GateCSDG <: Gate{2}
Two qubit CS-dagger gate.
Matrix Representation
\[\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & i \end{pmatrix}\]
Examples
julia> matrix(GateCSDG())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 1.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0-1.0im
julia> push!(Circuit(), GateCSDG(), 1, 2)
2-qubit circuit with 1 gates:
└── CSDG @ q1, q2
MimiqCircuitsBase.GateCSX
— Typestruct GateCSX <: Gate{2}
Two qubit Controlled-SX gate. (Control on second qubit)
Matrix Representation
\[\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \frac{1+i}{\sqrt{2}} & 0 & \frac{1-i}{\sqrt{2}} \\ 0 & 0 & 1 & 0 \\ 0 & \frac{1-i}{\sqrt{2}} & 0 & \frac{1+i}{\sqrt{2}} \end{pmatrix}\]
Examples
julia> matrix(GateCSX())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.5+0.5im 0.0+0.0im 0.5-0.5im
0.0+0.0im 0.0+0.0im 1.0+0.0im 0.0+0.0im
0.0+0.0im 0.5-0.5im 0.0+0.0im 0.5+0.5im
julia> push!(Circuit(), GateCSX(), 1, 2)
2-qubit circuit with 1 gates:
└── CSX @ q1, q2
MimiqCircuitsBase.GateCSXDG
— Typestruct GateCSXDG <: Gate{2}
Two qubit CSX-dagger gate. (Control on second qubit)
Matrix Representation
\[\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \frac{1-i}{\sqrt{2}} & 0 & \frac{1+i}{\sqrt{2}} \\ 0 & 0 & 1 & 0 \\ 0 & \frac{1+i}{\sqrt{2}} & 0 & \frac{1-i}{\sqrt{2}} \end{pmatrix}\]
Examples
julia> matrix(GateCSXDG())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.5-0.5im 0.0+0.0im 0.5+0.5im
0.0+0.0im 0.0+0.0im 1.0+0.0im 0.0+0.0im
0.0+0.0im 0.5+0.5im 0.0+0.0im 0.5-0.5im
julia> push!(Circuit(), GateCSXDG(), 1, 2)
2-qubit circuit with 1 gates:
└── CSXDG @ q1, q2
MimiqCircuitsBase.GateECR
— Typestruct GateECR <: Gate{2}
Two qubit ECR echo gate.
Matrix Representation
\[\begin{pmatrix} 0 & \frac{1}{\sqrt{2}} \ & 0 & \frac{i}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & 0 & \frac{-i}{\\sqrt{2}} & 0 \\ 0 & \frac{i}{\\sqrt{2}} & 0 & \frac{i}{\sqrt{2}} \\ \frac{-i}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} & 0 \end{pmatrix}\]
Examples
julia> matrix(GateCSX())
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.5+0.5im 0.0+0.0im 0.5-0.5im
0.0+0.0im 0.0+0.0im 1.0+0.0im 0.0+0.0im
0.0+0.0im 0.5-0.5im 0.0+0.0im 0.5+0.5im
julia> push!(Circuit(), GateCSX(), 1, 2)
2-qubit circuit with 1 gates:
└── CSX @ q1, q2
MimiqCircuitsBase.GateDCX
— Typestruct GateDCX <: Gate{2}
Two qubit double-CNOT (Control on first qubit and then second) OR DCX gate.
Matrix Representation
\[\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{pmatrix}\]
Examples
julia> matrix(GateDCX())
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
julia> push!(Circuit(), GateDCX(), 1, 2)
2-qubit circuit with 1 gates:
└── DCX @ q1, q2
MimiqCircuitsBase.GateDCXDG
— Typestruct GateDCXDG <: Gate{2}
Two qubit DCX-dagger gate.
Matrix Representation
\[\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \end{pmatrix}\]
Examples
julia> matrix(GateDCXDG())
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
0.0 1.0 0.0 0.0
julia> push!(Circuit(), GateDCXDG(), 1, 2)
2-qubit circuit with 1 gates:
└── DCXDG @ q1, q2
Parametric Two-Cubit Gates
MimiqCircuitsBase.GateCP
— Typestruct GateCP <: ParametricGate{2}
Two qubit Controlled-Phase gate
Arguments
λ::Float64
: Phase angle in radians
Matrix Representation
\[\operatorname{CP}(\lambda) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & e^{i\lambda} \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCP(pi/4))
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 1.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.707107+0.707107im
julia> push!(Circuit(), GateCP(pi/4), 1, 2)
2-qubit circuit with 1 gates:
└── CP(λ=π⋅0.25) @ q1, q2
MimiqCircuitsBase.GateCRX
— Typestruct GateCRX <: ParametricGate{2}
Two qubit Controlled-RX gate
Arguments
θ::Float64
: Rotation angle in radians
Matrix Representation
\[\operatorname{CRX}(\theta) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & \cos\frac{\theta}{2} & -i\sin\frac{\theta}{2} \\ 0 & 0 & -i\sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCRX(pi/2))
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.707107+0.0im -0.0-0.707107im
0.0+0.0im 0.0+0.0im 0.0-0.707107im 0.707107+0.0im
julia> push!(Circuit(), GateCRX(pi/2), 1, 2)
2-qubit circuit with 1 gates:
└── CRX(θ=π⋅0.5) @ q1, q2
MimiqCircuitsBase.GateCRY
— Typestruct GateCRY <: ParametricGate{2}
Two qubit Controlled-RY gate
Arguments
θ::Float64
: Rotation angle in radians
Matrix Representation
\[\operatorname{CRY}(\theta) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & \cos\frac{\theta}{2} & -\sin\frac{\theta}{2} \\ 0 & 0 & \sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCRY(pi/2))
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 0.707107 -0.707107
0.0 0.0 0.707107 0.707107
julia> push!(Circuit(), GateCRY(pi/2), 1, 2)
2-qubit circuit with 1 gates:
└── CRY(θ=π⋅0.5) @ q1, q2
MimiqCircuitsBase.GateCRZ
— Typestruct GateCRZ <: ParametricGate{2}
Two qubit Controlled-RZ gate
Arguments
λ::Float64
: Rotation angle in radians
Matrix Representation
\[\operatorname{CRZ}(\lambda) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & e^{-i\frac{\lambda}{2}} & 0 \\ 0 & 0 & 0 & e^{i\frac{\lambda}{2}} \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCRZ(pi/2))
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.707107-0.707107im -0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.707107+0.707107im
julia> push!(Circuit(), GateCRZ(pi/2), 1, 2)
2-qubit circuit with 1 gates:
└── CRZ(λ=π⋅0.5) @ q1, q2
MimiqCircuitsBase.GateCU
— Typestruct GateCU <: ParametricGate{2}
Two qubit generic unitary gate, equivalent to the qiskit CUGate https://qiskit.org/documentation/stubs/qiskit.circuit.library.CUGate.html
Arguments
θ::Float64
: Euler angle 1 in radiansϕ::Float64
: Euler angle 2 in radiansλ::Float64
: Euler angle 3 in radiansγ::Float64
: Global phase of the U gate
Matrix Representation
\[\operatorname{CU}(\theta,\phi,\lambda,\gamma) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & e^{i\gamma}\cos\frac{\theta}{2} & -e^{i(\gamma+\lambda)}\sin\frac{\theta}{2} \\ 0 & 0 & e^{i(\gamma+\phi)}\sin\frac{\theta}{2} & e^{i(\gamma+\phi+\lambda)}\cos\frac{\theta}{2} \end{pmatrix}\]
By convention we refer to the first qubit as the control qubit and the second qubit as the target.
Examples
julia> matrix(GateCU(pi/3, pi/3, pi/3, 0))
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.866025+0.0im -0.25-0.433013im
0.0+0.0im 0.0+0.0im 0.25+0.433013im -0.433013+0.75im
julia> push!(Circuit(), GateCU(pi/3, pi/3, pi/3, 0), 1, 2)
2-qubit circuit with 1 gates:
└── CU(θ=π⋅0.3333..., ϕ=π⋅0.3333..., λ=π⋅0.3333..., γ=π⋅0.0) @ q1, q2
MimiqCircuitsBase.GateCR
— Typestruct GateCR <: ParametricGate{2}
Two qubit Controlled-R gate.
Arguments
θ::Float64
: Rotation angle in radiansϕ::Float64
: The phase angle in radians.
Matrix Representation
\[\operatorname{CR}(\theta, \phi) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & \cos\frac{\theta}{2} & -i\sin\\frac{\theta}{2} \\ 0 & 0 & -i\sin\frac{\theta}{2} & \cos\frac{\theta}{2}e^{i\phi} \end{pmatrix}\]
Examples
julia> matrix(GateCR(pi,-pi))
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 6.12323e-17+0.0im 1.22465e-16+1.0im
0.0+0.0im 0.0+0.0im -1.22465e-16+1.0im 6.12323e-17+0.0im
julia> push!(Circuit(), GateCR(pi,-pi), 1, 2)
2-qubit circuit with 1 gates:
└── CR(θ=π⋅1.0, ϕ=-π⋅1.0) @ q1, q2
MimiqCircuitsBase.GateRXX
— Typestruct GateRXX <: ParametricGate{2}
Two qubit RXX gate.
Arguments
θ::Float64
: The angle in radians
Matrix Representation
\[\operatorname{RXX}(\theta) = \begin{pmatrix} \cos(\\frac{\theta}{2}) & 0 & 0 & -i\sin(\\frac{\theta}{2}) \\ 0 & \cos(\frac{\theta}{2}) & -i\sin(\frac{\theta}{2}) & 0 \\ 0 & -i\sin(\frac{\theta}{2}) & \cos(\frac{\theta}{2}) & 0 \\ -i\sin(\frac{\theta}{2}) & 0 & 0 & \cos(\frac{\theta}{2}) \end{pmatrix}\]
Examples
julia> matrix(GateRXX(π/4))
4×4 Matrix{ComplexF64}:
0.92388+0.0im 0.0+0.0im … 0.0-0.382683im
0.0+0.0im 0.92388+0.0im 0.0+0.0im
0.0+0.0im 0.0-0.382683im 0.0+0.0im
0.0-0.382683im 0.0+0.0im 0.92388+0.0im
julia> push!(Circuit(), GateRXX(π), 1, 2)
2-qubit circuit with 1 gates:
└── RXX(θ=π⋅1.0) @ q1, q2
MimiqCircuitsBase.GateRYY
— Typestruct GateRYY <: ParametricGate{2}
Two qubit RYY gate.
Arguments
θ::Float64
: The angle in radians
Matrix Representation
\[\operatorname{RYY}(\theta) = \begin{pmatrix} \cos(\frac{\theta}{2}) & 0 & 0 & i\sin(\frac{\theta}{2}) \\ 0 & \cos(\frac{\theta}{2}) & -i\sin(\frac{\theta}{2}) & 0 \\ 0 & -i\sin(\\frac{\theta}{2}) & \cos(\frac{\theta}{2}) & 0 \\ i\sin(\frac{\theta}{2}) & 0 & 0 & \cos(\frac{\theta}{2}) \end{pmatrix}\]
Examples
julia> matrix(GateRYY(π/4))
4×4 Matrix{ComplexF64}:
0.92388+0.0im 0.0+0.0im … 0.0+0.382683im
0.0+0.0im 0.92388+0.0im 0.0+0.0im
0.0+0.0im 0.0-0.382683im 0.0+0.0im
0.0+0.382683im 0.0+0.0im 0.92388+0.0im
julia> push!(Circuit(), GateRYY(π), 1, 2)
2-qubit circuit with 1 gates:
└── RYY(θ=π⋅1.0) @ q1, q2
MimiqCircuitsBase.GateRZZ
— Typestruct GateRZZ <: ParametricGate{2}
Two qubit RZZ gate.
Arguments
θ::Float64
: The angle in radians
Matrix Representation
\[\operatorname{RZZ}(\theta) = \begin{pmatrix} e^{-i\frac{\theta}{2}} & 0 & 0 & 0 \\ 0 & e^{i\frac{\theta}{2}} & 0 & 0 \\ 0 & 0 & e^{i\frac{\theta}{2}} & 0 \\ 0 & 0 & 0 & e^{-i\frac{\theta}{2}} \end{pmatrix}\]
Examples
julia> matrix(GateRZZ(π/4))
4×4 Matrix{ComplexF64}:
0.92388-0.382683im 0.0+0.0im … 0.0+0.0im
0.0+0.0im 0.92388+0.382683im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.92388-0.382683im
julia> push!(Circuit(), GateRZZ(π), 1, 2)
2-qubit circuit with 1 gates:
└── RZZ(θ=π⋅1.0) @ q1, q2
MimiqCircuitsBase.GateXXplusYY
— Typestruct GateXXplusYY <: ParametricGate{2}
Two qubit XXplusYY gate.
Arguments
θ::Float64
: The angle in radians.β::Float64
: The phase angle in radians.
Matrix Representation
\[\operatorname{XXplusYY}(\theta, \beta) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos(\frac{\theta}{2}) & -i\sin(\frac{\theta}{2})e^{-i\beta} & 0 \\ 0 & -i\sin(\\frac{theta}{2})e^{i\beta} & \cos(\frac{\theta}{2}) & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\]
Examples
julia> matrix(GateXXplusYY(π/2,π/2))
4×4 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.707107+0.0im -0.707107-4.32978e-17im 0.0+0.0im
0.0+0.0im 0.707107-4.32978e-17im 0.707107+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 1.0+0.0im
julia> push!(Circuit(), GateXXplusYY(π,π), 1, 2)
2-qubit circuit with 1 gates:
└── XXplusYY(θ=π⋅1.0, β=π⋅1.0) @ q1, q2
MimiqCircuitsBase.GateXXminusYY
— Typestruct GateXXminusYY <: ParametricGate{2}
Two qubit XXminusYY gate.
Arguments
θ::Float64
: The angle in radians.β::Float64
: The phase angle in radians.
Matrix Representation
\[\operatorname{XXminusYY}(\theta, \beta) = \begin{pmatrix} \cos(\frac{\theta}{2}) & 0 & 0 & -i\sin(\frac{\theta}{2})e^{-i\beta} \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -i\sin(\frac{\theta}{2})e^{i\beta} & 0 & 0 & \cos(\frac{\theta}{2}) \end{pmatrix}\]
Examples
julia> matrix(GateXXminusYY(π/2,π/2))
4×4 Matrix{ComplexF64}:
0.707107+0.0im 0.0+0.0im 0.0+0.0im -0.707107-4.32978e-17im
0.0+0.0im 1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 1.0+0.0im 0.0+0.0im
0.707107-4.32978e-17im 0.0+0.0im 0.0+0.0im 0.707107+0.0im
julia> push!(Circuit(), GateXXminusYY(π,π), 1, 2)
2-qubit circuit with 1 gates:
└── XXminusYY(θ=π⋅1.0, β=π⋅1.0) @ q1, q2
Custom gates
MimiqCircuitsBase.GateCustom
— Typestruct GateCustom{N,T} <: Gate{N}
N
qubit gate specified by a $2^N \times 2^N$ matrix with elements of type T
.
Use this to construct your own gates based on unitary matrices. Currently only N=1,2 (M=2,4) are recognised.
MIMIQ uses textbook convention for specifying gates.
One qubit gate matrices are defined in the basis $|0\rangle$, $|1\rangle$ e.g.,
\[\operatorname{Z} = \begin{pmatrix} 1&0\\ 0&-1 \end{pmatrix}\]
Two qubit gate matrices are defined in the basis $|00\rangle$, $|01\rangle$>, $|10\rangle$, $|11\rangle$ where the left-most qubit is the first to appear in the target list e.g.,
\[\operatorname{CNOT} = \begin{pmatrix} 1&0&0&0\\ 0&1&0&0\\ 0&0&0&1\\ 0&0&1&0 \end{pmatrix}\]
julia> CNOT = [1 0 0 0; 0 1 0 0; 0 0 0 1; 0 0 1 0]
4×4 Matrix{Int64}:
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0
julia> # CNOT gate with control on q1 and target on q2
julia> Instruction(GateCustom(CNOT), 1, 2)
GateCustom([1 0 0 0; 0 1 0 0; 0 0 0 1; 0 0 1 0]) @ q1, q2
# Examples
jldoctest julia> g = GateCustom([1 0; 0 1]) Custom([1.0 0.0; 0.0 1.0])
julia> push!(Circuit(), g, 1) 1-qubit circuit with 1 gates: └── Custom([1.0 0.0; 0.0 1.0]) @ q1 ```
Other quantum operations
MimiqCircuitsBase.Barrier
— Typestruct Barrier <: Operation
A barrier is a special operation that does not affect the quantum state or the execution of a circuit, but it prevents compression or optimization operation from being applied across it.
Examples
julia> push!(Circuit(), Barrier(), 1, 2)
2-qubit circuit with 1 gates:
└── Barrier @ q1, q2
Utilities to load or save quantum circuits
MimiqCircuitsBase.tojson
— Functiontojson(circuit)
Returns a JSON string representing the given circuit.
MimiqCircuitsBase.fromjson
— Functionfromjson(str)
fromjson(parsed_json_dict)
Returns a circuit from a JSON string or parsed JSON.
Index
MimiqCircuitsBase.Barrier
MimiqCircuitsBase.BitState
MimiqCircuitsBase.Circuit
MimiqCircuitsBase.Gate
MimiqCircuitsBase.GateCH
MimiqCircuitsBase.GateCP
MimiqCircuitsBase.GateCR
MimiqCircuitsBase.GateCRX
MimiqCircuitsBase.GateCRY
MimiqCircuitsBase.GateCRZ
MimiqCircuitsBase.GateCS
MimiqCircuitsBase.GateCSDG
MimiqCircuitsBase.GateCSX
MimiqCircuitsBase.GateCSXDG
MimiqCircuitsBase.GateCU
MimiqCircuitsBase.GateCX
MimiqCircuitsBase.GateCY
MimiqCircuitsBase.GateCZ
MimiqCircuitsBase.GateCustom
MimiqCircuitsBase.GateDCX
MimiqCircuitsBase.GateDCXDG
MimiqCircuitsBase.GateECR
MimiqCircuitsBase.GateH
MimiqCircuitsBase.GateID
MimiqCircuitsBase.GateISWAP
MimiqCircuitsBase.GateISWAPDG
MimiqCircuitsBase.GateP
MimiqCircuitsBase.GateR
MimiqCircuitsBase.GateRX
MimiqCircuitsBase.GateRXX
MimiqCircuitsBase.GateRY
MimiqCircuitsBase.GateRYY
MimiqCircuitsBase.GateRZ
MimiqCircuitsBase.GateRZZ
MimiqCircuitsBase.GateS
MimiqCircuitsBase.GateSDG
MimiqCircuitsBase.GateSWAP
MimiqCircuitsBase.GateSX
MimiqCircuitsBase.GateSXDG
MimiqCircuitsBase.GateT
MimiqCircuitsBase.GateTDG
MimiqCircuitsBase.GateU
MimiqCircuitsBase.GateU1
MimiqCircuitsBase.GateU2
MimiqCircuitsBase.GateU2DG
MimiqCircuitsBase.GateU3
MimiqCircuitsBase.GateX
MimiqCircuitsBase.GateXXminusYY
MimiqCircuitsBase.GateXXplusYY
MimiqCircuitsBase.GateY
MimiqCircuitsBase.GateZ
MimiqCircuitsBase.Instruction
MimiqCircuitsBase.Operation
MimiqCircuitsBase.ParametricGate
MimiqCircuitsBase.bits
MimiqCircuitsBase.bitstate_to_index
MimiqCircuitsBase.bitstate_to_integer
MimiqCircuitsBase.depth
MimiqCircuitsBase.fromjson
MimiqCircuitsBase.getbit
MimiqCircuitsBase.getbits
MimiqCircuitsBase.getoperation
MimiqCircuitsBase.getqubit
MimiqCircuitsBase.getqubits
MimiqCircuitsBase.hilbertspacedim
MimiqCircuitsBase.inverse
MimiqCircuitsBase.matrix
MimiqCircuitsBase.nonzeros
MimiqCircuitsBase.numbits
MimiqCircuitsBase.numparams
MimiqCircuitsBase.numqubits
MimiqCircuitsBase.opname
MimiqCircuitsBase.parnames
MimiqCircuitsBase.to01
MimiqCircuitsBase.tojson
MimiqCircuitsBase.@bs_str