Unitary gates. More...
Functions | |
void | compactUnitary (Qureg qureg, int targetQubit, Complex alpha, Complex beta) |
Apply a single-qubit unitary parameterised by two given complex scalars. More... | |
void | controlledCompactUnitary (Qureg qureg, int controlQubit, int targetQubit, Complex alpha, Complex beta) |
Apply a controlled unitary (single control, single target) parameterised by two given complex scalars. More... | |
void | controlledMultiQubitUnitary (Qureg qureg, int ctrl, int *targs, int numTargs, ComplexMatrixN u) |
Apply a general controlled multi-qubit unitary (including a global phase factor). More... | |
void | controlledNot (Qureg qureg, int controlQubit, int targetQubit) |
Apply the controlled not (single control, single target) gate, also known as the c-X, c-sigma-X, c-Pauli-X and c-bit-flip gate. More... | |
void | controlledPauliY (Qureg qureg, int controlQubit, int targetQubit) |
Apply the controlled pauliY (single control, single target) gate, also known as the c-Y and c-sigma-Y gate. More... | |
void | controlledPhaseFlip (Qureg qureg, int idQubit1, int idQubit2) |
Apply the (two-qubit) controlled phase flip gate, also known as the controlled pauliZ gate. More... | |
void | controlledPhaseShift (Qureg qureg, int idQubit1, int idQubit2, qreal angle) |
Introduce a phase factor on state of qubits idQubit1 and idQubit2 . More... | |
void | controlledRotateAroundAxis (Qureg qureg, int controlQubit, int targetQubit, qreal angle, Vector axis) |
Applies a controlled rotation by a given angle around a given vector on the Bloch-sphere. More... | |
void | controlledRotateX (Qureg qureg, int controlQubit, int targetQubit, qreal angle) |
Applies a controlled rotation by a given angle around the X-axis of the Bloch-sphere. More... | |
void | controlledRotateY (Qureg qureg, int controlQubit, int targetQubit, qreal angle) |
Applies a controlled rotation by a given angle around the Y-axis of the Bloch-sphere. More... | |
void | controlledRotateZ (Qureg qureg, int controlQubit, int targetQubit, qreal angle) |
Applies a controlled rotation by a given angle around the Z-axis of the Bloch-sphere. More... | |
void | controlledTwoQubitUnitary (Qureg qureg, int controlQubit, int targetQubit1, int targetQubit2, ComplexMatrix4 u) |
Apply a general controlled two-qubit unitary (including a global phase factor). More... | |
void | controlledUnitary (Qureg qureg, int controlQubit, int targetQubit, ComplexMatrix2 u) |
Apply a general controlled unitary (single control, single target), which can include a global phase factor. More... | |
void | hadamard (Qureg qureg, int targetQubit) |
Apply the single-qubit Hadamard gate. More... | |
void | multiControlledMultiQubitNot (Qureg qureg, int *ctrls, int numCtrls, int *targs, int numTargs) |
Apply a NOT (or Pauli X) gate with multiple control and target qubits. More... | |
void | multiControlledMultiQubitUnitary (Qureg qureg, int *ctrls, int numCtrls, int *targs, int numTargs, ComplexMatrixN u) |
Apply a general multi-controlled multi-qubit unitary (including a global phase factor). More... | |
void | multiControlledMultiRotatePauli (Qureg qureg, int *controlQubits, int numControls, int *targetQubits, enum pauliOpType *targetPaulis, int numTargets, qreal angle) |
Apply a multi-controlled multi-target multi-Pauli rotation, also known as a controlled Pauli gadget. More... | |
void | multiControlledMultiRotateZ (Qureg qureg, int *controlQubits, int numControls, int *targetQubits, int numTargets, qreal angle) |
Apply a multi-controlled multi-target Z rotation, also known as a controlled phase gadget. More... | |
void | multiControlledPhaseFlip (Qureg qureg, int *controlQubits, int numControlQubits) |
Apply the multiple-qubit controlled phase flip gate, also known as the multiple-qubit controlled pauliZ gate. More... | |
void | multiControlledPhaseShift (Qureg qureg, int *controlQubits, int numControlQubits, qreal angle) |
Introduce a phase factor on state of the passed qubits. More... | |
void | multiControlledTwoQubitUnitary (Qureg qureg, int *controlQubits, int numControlQubits, int targetQubit1, int targetQubit2, ComplexMatrix4 u) |
Apply a general multi-controlled two-qubit unitary (including a global phase factor). More... | |
void | multiControlledUnitary (Qureg qureg, int *controlQubits, int numControlQubits, int targetQubit, ComplexMatrix2 u) |
Apply a general multiple-control single-target unitary, which can include a global phase factor. More... | |
void | multiQubitNot (Qureg qureg, int *targs, int numTargs) |
Apply a NOT (or Pauli X) gate with multiple target qubits, which has the same effect as (but is much faster than) applying each single-qubit NOT gate in turn. More... | |
void | multiQubitUnitary (Qureg qureg, int *targs, int numTargs, ComplexMatrixN u) |
Apply a general multi-qubit unitary (including a global phase factor) with any number of target qubits. More... | |
void | multiRotatePauli (Qureg qureg, int *targetQubits, enum pauliOpType *targetPaulis, int numTargets, qreal angle) |
Apply a multi-qubit multi-Pauli rotation, also known as a Pauli gadget, on a selected number of qubits. More... | |
void | multiRotateZ (Qureg qureg, int *qubits, int numQubits, qreal angle) |
Apply a multi-qubit Z rotation, also known as a phase gadget, on a selected number of qubits. More... | |
void | multiStateControlledUnitary (Qureg qureg, int *controlQubits, int *controlState, int numControlQubits, int targetQubit, ComplexMatrix2 u) |
Apply a general single-qubit unitary with multiple control qubits, conditioned upon a specific bit sequence. More... | |
void | pauliX (Qureg qureg, int targetQubit) |
Apply the single-qubit Pauli-X (also known as the X, sigma-X, NOT or bit-flip) gate. More... | |
void | pauliY (Qureg qureg, int targetQubit) |
Apply the single-qubit Pauli-Y (also known as the Y or sigma-Y) gate. More... | |
void | pauliZ (Qureg qureg, int targetQubit) |
Apply the single-qubit Pauli-Z (also known as the Z, sigma-Z or phase-flip) gate. More... | |
void | phaseShift (Qureg qureg, int targetQubit, qreal angle) |
Shift the phase between and of a single qubit by a given angle. More... | |
void | rotateAroundAxis (Qureg qureg, int rotQubit, qreal angle, Vector axis) |
Rotate a single qubit by a given angle around a given Vector on the Bloch-sphere. More... | |
void | rotateX (Qureg qureg, int rotQubit, qreal angle) |
Rotate a single qubit by a given angle around the X-axis of the Bloch-sphere. More... | |
void | rotateY (Qureg qureg, int rotQubit, qreal angle) |
Rotate a single qubit by a given angle around the Y-axis of the Bloch-sphere. More... | |
void | rotateZ (Qureg qureg, int rotQubit, qreal angle) |
Rotate a single qubit by a given angle around the Z-axis of the Bloch-sphere (also known as a phase shift gate). More... | |
void | sGate (Qureg qureg, int targetQubit) |
Apply the single-qubit S gate. More... | |
void | sqrtSwapGate (Qureg qureg, int qb1, int qb2) |
Performs a sqrt SWAP gate between qubit1 and qubit2 . More... | |
void | swapGate (Qureg qureg, int qubit1, int qubit2) |
Performs a SWAP gate between qubit1 and qubit2 . More... | |
void | tGate (Qureg qureg, int targetQubit) |
Apply the single-qubit T gate. More... | |
void | twoQubitUnitary (Qureg qureg, int targetQubit1, int targetQubit2, ComplexMatrix4 u) |
Apply a general two-qubit unitary (including a global phase factor). More... | |
void | unitary (Qureg qureg, int targetQubit, ComplexMatrix2 u) |
Apply a general single-qubit unitary (including a global phase factor). More... | |
Detailed Description
Unitary gates.
Function Documentation
◆ compactUnitary()
Apply a single-qubit unitary parameterised by two given complex scalars.
Given valid complex numbers and , applies the unitary
which is general up to a global phase factor.
Valid , satisfy .
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate on [in] alpha complex unitary parameter (row 1, column 1) [in] beta complex unitary parameter (row 2, column 1)
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
) - if
alpha
,beta
don't satisfy |alpha
|^2 + |beta
|^2 = 1
- if
Definition at line 404 of file QuEST.c.
References getConjugateScalar(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordCompactUnitary(), statevec_compactUnitary(), validateTarget(), and validateUnitaryComplexPair().
Referenced by TEST_CASE().
◆ controlledCompactUnitary()
void controlledCompactUnitary | ( | Qureg | qureg, |
int | controlQubit, | ||
int | targetQubit, | ||
Complex | alpha, | ||
Complex | beta | ||
) |
Apply a controlled unitary (single control, single target) parameterised by two given complex scalars.
Given valid complex numbers and , applies the two-qubit unitary
to the control and target qubits. Valid , satisfy . The target unitary is general up to a global phase factor.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit apply the target unitary if this qubit has value 1 [in] targetQubit qubit on which to apply the target unitary [in] alpha complex unitary parameter (row 1, column 1) [in] beta complex unitary parameter (row 2, column 1)
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal - if
alpha
,beta
don't satisfy |alpha
|^2 + |beta
|^2 = 1
- if either
Definition at line 417 of file QuEST.c.
References getConjugateScalar(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledCompactUnitary(), statevec_controlledCompactUnitary(), validateControlTarget(), and validateUnitaryComplexPair().
Referenced by TEST_CASE().
◆ controlledMultiQubitUnitary()
void controlledMultiQubitUnitary | ( | Qureg | qureg, |
int | ctrl, | ||
int * | targs, | ||
int | numTargs, | ||
ComplexMatrixN | u | ||
) |
Apply a general controlled multi-qubit unitary (including a global phase factor).
One control and any number of target qubits can be specified. This effects the many-qubit unitary
on the control and target qubits.
The target qubits in targs
are treated as ordered least significant to most significant in u
.
The passed ComplexMatrix must be unitary and be a compatible size with the specified number of target qubits, otherwise an error is thrown.
Note that in multithreaded mode, each thread will clone 2^numTargs
amplitudes, and store these in the runtime stack. Using t threads, the total memory overhead of this function is t*2^numTargs
. For many targets (e.g. 16 qubits), this may cause a stack-overflow / seg-fault (e.g. on a 1 MiB stack).
Note too that in distributed mode, this routine requires that each node contains at least 2^numTargs
amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q / 2^numTargs
nodes.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] ctrl the control qubit [in] targs a list of the target qubits, ordered least to most significant [in] numTargs the number of target qubits [in] u unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if
ctrl
or any index intargs
is outside of [0,qureg.numQubitsRepresented
) - if
targs
are not unique - if
targs
containsctrl
- if matrix
u
is not unitary - if a node cannot fit the required number of target amplitudes in distributed mode
- if
Definition at line 313 of file QuEST.c.
References Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), setConjugateMatrixN(), shiftIndices(), statevec_controlledMultiQubitUnitary(), validateMultiControlsMultiTargets(), and validateMultiQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ controlledNot()
void controlledNot | ( | Qureg | qureg, |
int | controlQubit, | ||
int | targetQubit | ||
) |
Apply the controlled not (single control, single target) gate, also known as the c-X, c-sigma-X, c-Pauli-X and c-bit-flip gate.
This applies pauliX to the target qubit if the control qubit has value 1. This effects the two-qubit unitary
on the control and target qubits.
- See also
- Parameters
-
[in,out] qureg the state-vector or density matrix to modify [in] controlQubit nots the target if this qubit is 1 [in] targetQubit qubit to not
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal
- if either
Definition at line 524 of file QuEST.c.
References GATE_SIGMA_X, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledGate(), statevec_controlledNot(), and validateControlTarget().
Referenced by TEST_CASE().
◆ controlledPauliY()
void controlledPauliY | ( | Qureg | qureg, |
int | controlQubit, | ||
int | targetQubit | ||
) |
Apply the controlled pauliY (single control, single target) gate, also known as the c-Y and c-sigma-Y gate.
This applies pauliY to the target qubit if the control qubit has value 1. This effects the two-qubit unitary
on the control and target qubits.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit applies pauliY to the target if this qubit is 1 [in] targetQubit qubit to not
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal
- if either
Definition at line 563 of file QuEST.c.
References GATE_SIGMA_Y, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledGate(), statevec_controlledPauliY(), statevec_controlledPauliYConj(), and validateControlTarget().
Referenced by TEST_CASE().
◆ controlledPhaseFlip()
void controlledPhaseFlip | ( | Qureg | qureg, |
int | idQubit1, | ||
int | idQubit2 | ||
) |
Apply the (two-qubit) controlled phase flip gate, also known as the controlled pauliZ gate.
For each state, if both input qubits have value one, multiply the amplitude of that state by -1. This applies the two-qubit unitary:
with circuit diagram:
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] idQubit1,idQubit2 qubits to operate upon
- Exceptions
-
invalidQuESTInputError() - if
idQubit1
oridQubit2
are outside [0,qureg.numQubitsRepresented
) - if
idQubit1
andidQubit2
are equal
- if
Definition at line 575 of file QuEST.c.
References GATE_SIGMA_Z, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledGate(), statevec_controlledPhaseFlip(), and validateControlTarget().
Referenced by TEST_CASE().
◆ controlledPhaseShift()
Introduce a phase factor on state of qubits idQubit1
and idQubit2
.
For angle , this effects the unitary
on idQubit1
and idQubit2
.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] idQubit1 first qubit in the state to phase shift [in] idQubit2 second qubit in the state to phase shift [in] angle amount by which to shift the phase in radians
- Exceptions
-
invalidQuESTInputError() - if
idQubit1
oridQubit2
are outside [0,qureg.numQubitsRepresented
) - if
idQubit1
andidQubit2
are equal
- if
Definition at line 498 of file QuEST.c.
References GATE_PHASE_SHIFT, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledParamGate(), statevec_controlledPhaseShift(), and validateControlTarget().
Referenced by TEST_CASE().
◆ controlledRotateAroundAxis()
void controlledRotateAroundAxis | ( | Qureg | qureg, |
int | controlQubit, | ||
int | targetQubit, | ||
qreal | angle, | ||
Vector | axis | ||
) |
Applies a controlled rotation by a given angle around a given vector on the Bloch-sphere.
The vector must not be zero (else an error is thrown), but needn't be unit magnitude.
For angle and axis vector , applies to states where the target qubit is 1 ( is the vector of Pauli matrices).
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit qubit with value 1 in the rotated states [in] targetQubit qubit to rotate [in] angle angle by which to rotate in radians [in] axis vector around which to rotate (can be non-unit; will be normalised)
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal - if
axis
is the zero vector
- if either
Definition at line 614 of file QuEST.c.
References Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledAxisRotation(), statevec_controlledRotateAroundAxis(), statevec_controlledRotateAroundAxisConj(), validateControlTarget(), and validateVector().
Referenced by TEST_CASE().
◆ controlledRotateX()
Applies a controlled rotation by a given angle around the X-axis of the Bloch-sphere.
The target qubit is rotated in states where the control qubit has value 1.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit qubit which has value 1 in the rotated states [in] targetQubit qubit to rotate [in] angle angle by which to rotate the target qubit in radians
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal
- if either
Definition at line 220 of file QuEST.c.
References GATE_ROTATE_X, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledParamGate(), statevec_controlledRotateX(), and validateControlTarget().
Referenced by TEST_CASE().
◆ controlledRotateY()
Applies a controlled rotation by a given angle around the Y-axis of the Bloch-sphere.
The target qubit is rotated in states where the control qubit has value 1.
- rotateY()
- controlledRotateX()
- controlledRotateZ()
- controlledRotateAroundAxis()
- controlledPhaseShift()
- multiRotateZ()
- multiRotatePauli()
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit qubit which has value 1 in the rotated states [in] targetQubit qubit to rotate [in] angle angle by which to rotate the target qubit in radians
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal
- if either
Definition at line 232 of file QuEST.c.
References GATE_ROTATE_Y, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledParamGate(), statevec_controlledRotateY(), and validateControlTarget().
Referenced by TEST_CASE().
◆ controlledRotateZ()
Applies a controlled rotation by a given angle around the Z-axis of the Bloch-sphere.
The target qubit is rotated in states where the control qubit has value 1.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit qubit which has value 1 in the rotated states [in] targetQubit qubit to rotate [in] angle angle by which to rotate the target qubit in radians
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal
- if either
Definition at line 244 of file QuEST.c.
References GATE_ROTATE_Z, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledParamGate(), statevec_controlledRotateZ(), and validateControlTarget().
Referenced by TEST_CASE().
◆ controlledTwoQubitUnitary()
void controlledTwoQubitUnitary | ( | Qureg | qureg, |
int | controlQubit, | ||
int | targetQubit1, | ||
int | targetQubit2, | ||
ComplexMatrix4 | u | ||
) |
Apply a general controlled two-qubit unitary (including a global phase factor).
The given unitary is applied to the target amplitudes where the control qubit has value 1. This effects the many-qubit unitary
on the control and target qubits.
targetQubit1
is treated as the least
significant qubit in u
, such that a row in u
is dotted with the vector
The passed 4x4 ComplexMatrix must be unitary, otherwise an error is thrown.
Note that in distributed mode, this routine requires that each node contains at least 4 amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q/4 nodes.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit the control qubit which must be in state 1 to effect the given unitary [in] targetQubit1 first qubit to operate on, treated as least significant in u
[in] targetQubit2 second qubit to operate on, treated as most significant in u
[in] u unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if
controlQubit
,targetQubit1
ortargetQubit2
are outside [0,qureg.numQubitsRepresented
) - if any of
controlQubit
,targetQubit1
andtargetQubit2
are equal - if matrix
u
is not unitary- if each node cannot fit 4 amplitudes in distributed mode.
- if
Definition at line 269 of file QuEST.c.
References getConjugateMatrix4(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), statevec_controlledTwoQubitUnitary(), validateMultiControlsMultiTargets(), and validateTwoQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ controlledUnitary()
void controlledUnitary | ( | Qureg | qureg, |
int | controlQubit, | ||
int | targetQubit, | ||
ComplexMatrix2 | u | ||
) |
Apply a general controlled unitary (single control, single target), which can include a global phase factor.
The given unitary is applied to the target qubit if the control qubit has value 1, effecting the two-qubit unitary
on the control and target qubits.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubit apply unitary if this qubit is 1 [in] targetQubit qubit to operate on [in] u single-qubit unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if either
controlQubit
ortargetQubit
are outside [0,qureg.numQubitsRepresented
) - if
controlQubit
andtargetQubit
are equal - if
u
is not unitary
- if either
Definition at line 360 of file QuEST.c.
References getConjugateMatrix2(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledUnitary(), statevec_controlledUnitary(), validateControlTarget(), and validateOneQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ hadamard()
void hadamard | ( | Qureg | qureg, |
int | targetQubit | ||
) |
Apply the single-qubit Hadamard gate.
This takes to and to , and is equivalent to a rotation of around the x-axis then about the y-axis on the Bloch-sphere. I.e.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate on
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 176 of file QuEST.c.
References GATE_HADAMARD, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordGate(), statevec_hadamard(), and validateTarget().
Referenced by TEST_CASE().
◆ multiControlledMultiQubitNot()
void multiControlledMultiQubitNot | ( | Qureg | qureg, |
int * | ctrls, | ||
int | numCtrls, | ||
int * | targs, | ||
int | numTargs | ||
) |
Apply a NOT (or Pauli X) gate with multiple control and target qubits.
This applies pauliX to qubits targs
on every basis state for which the control qubits ctrls
are all in the state. The ordering within each of ctrls
and targs
has no effect on the operation.
This function is equivalent, but significantly faster (approximately
numTargs
times) than applying controlled NOTs on each qubit intargs
in turn, since:
The effected unitary, if targs
and ctrls
happened to be contiguous, has matrix:
and circuit diagram:
In distributed mode, this operation requires at most a single round of pair-wise communication between nodes, and hence is as efficient as pauliX().
- See also
- Parameters
-
[in,out] qureg a state-vector or density matrix to modify [in] ctrls a list of the control qubit indices [in] numCtrls the length of list ctrls
[in] targs a list of the qubits to be targeted by the X gates [in] numTargs the length of list targs
- Exceptions
-
invalidQuESTInputError() - if any qubit in
ctrls
andtargs
is invalid, i.e. outside [0,qureg.numQubitsRepresented
) - if
ctrls
ortargs
contain any repetitions - if any qubit in
ctrls
is also intargs
(and vice versa) - if
numTargs
< 1 - if
numCtrls
< 1 (use multiQubitNot() for no controls)
segmentation-fault - if
ctrls
contains fewer elements thannumCtrls
- if
targs
contains fewer elements thannumTargs
- if any qubit in
Definition at line 549 of file QuEST.c.
References getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordMultiControlledMultiQubitNot(), statevec_multiControlledMultiQubitNot(), and validateMultiControlsMultiTargets().
Referenced by TEST_CASE().
◆ multiControlledMultiQubitUnitary()
void multiControlledMultiQubitUnitary | ( | Qureg | qureg, |
int * | ctrls, | ||
int | numCtrls, | ||
int * | targs, | ||
int | numTargs, | ||
ComplexMatrixN | u | ||
) |
Apply a general multi-controlled multi-qubit unitary (including a global phase factor).
Any number of control and target qubits can be specified. This effects the many-qubit unitary
on the control and target qubits.
The target qubits in targs
are treated as ordered least significant to most significant in u
.
The passed ComplexMatrixN must be unitary and be a compatible size with the specified number of target qubits, otherwise an error is thrown.
To left-multiply a non-unitary ComplexMatrixN, including control qubits, use applyMultiControlledMatrixN()
Note that in multithreaded mode, each thread will clone 2^numTargs
amplitudes, and store these in the runtime stack. Using t threads, the total memory overhead of this function is t*2^numTargs
. For many targets (e.g. 16 qubits), this may cause a stack-overflow / seg-fault (e.g. on a 1 MiB stack).
Note that in distributed mode, this routine requires that each node contains at least 2^numTargs
amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q / 2^numTargs
nodes.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] ctrls a list of the control qubits [in] numCtrls the number of control qubits [in] targs a list of the target qubits, ordered least to most significant [in] numTargs the number of target qubits [in] u unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if any qubit in
ctrls
andtargs
is invalid, i.e. outside [0,qureg.numQubitsRepresented
) - if
ctrls
ortargs
contain any repetitions - if any qubit in
ctrls
is also intargs
(and vice versa) - if
numTargs
< 1 - if
numCtrls
< 1 (use multiQubitUnitary() for no controls) - if matrix
u
is not unitary - if a node cannot fit the required number of target amplitudes in distributed mode
segmentation-fault - if
ctrls
contains fewer elements thannumCtrls
- if
targs
contains fewer elements thannumTargs
- if any qubit in
Definition at line 330 of file QuEST.c.
References getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), setConjugateMatrixN(), shiftIndices(), statevec_multiControlledMultiQubitUnitary(), validateMultiControlsMultiTargets(), and validateMultiQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ multiControlledMultiRotatePauli()
void multiControlledMultiRotatePauli | ( | Qureg | qureg, |
int * | controlQubits, | ||
int | numControls, | ||
int * | targetQubits, | ||
enum pauliOpType * | targetPaulis, | ||
int | numTargets, | ||
qreal | angle | ||
) |
Apply a multi-controlled multi-target multi-Pauli rotation, also known as a controlled Pauli gadget.
This is the unitary
where are the Pauli operators (pauliOpType) in targetPaulis
, which operate upon the corresponding qubits in targetQubits
.
All qubits not appearing in
targetQubits
andcontrolQubits
are assumed to receive the identity operator.
For example:
effects
on qureg
, where unspecified qubits (along with those targeted by PAULI_I
) are assumed to receive the identity operator (excluded from exponentiation).
This means specifying
PAULI_I
does not induce a global phase factor . Hence, if alltargetPaulis
are identity, then this function does nothing toqureg
. SpecifyingPAULI_I
on a qubit is superfluous but allowed for convenience.
This function effects the controlled Pauli gadget by first (controlled) rotating the qubits which are targeted with either X
or Y
into alternate basis, performing multiControlledMultiRotateZ() on all target qubits, then restoring the original basis.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubits list of the indices of qubits to control upon [in] numControls length of length controlQubits
[in] targetQubits a list of the indices of the target qubits [in] targetPaulis a list of the Pauli operators around which to rotate the target qubits [in] numTargets length of list targetQubits
[in] angle the angle by which the multi-qubit state is rotated around the Z axis
- Exceptions
-
invalidQuESTInputError() - if any qubit in
controlQubits
andtargetQubits
is invalid, i.e. outside [0,qureg.numQubitsRepresented
) - if
controlQubits
ortargetQubits
contain any repetitions - if any qubit in
controlQubits
is also intargetQubits
(and vice versa) - if
numTargets
< 1 - if
numControls
< 1 (use multiRotateZ() for no controls) - if any element of
targetPaulis
is not one ofPAULI_I
,PAULI_X
,PAULI_Y
,PAULI_Z
segmentation-fault - if
controlQubits
contains fewer elements thannumControls
- if
targetQubits
contains fewer elements thannumTargets
- if
targetPaulis
contains fewer elements thannumTargets
- if any qubit in
Definition at line 705 of file QuEST.c.
References getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), shiftIndices(), statevec_multiControlledMultiRotatePauli(), validateMultiControlsMultiTargets(), and validatePauliCodes().
Referenced by TEST_CASE().
◆ multiControlledMultiRotateZ()
void multiControlledMultiRotateZ | ( | Qureg | qureg, |
int * | controlQubits, | ||
int | numControls, | ||
int * | targetQubits, | ||
int | numTargets, | ||
qreal | angle | ||
) |
Apply a multi-controlled multi-target Z rotation, also known as a controlled phase gadget.
This is the unitary
where the Pauli Z gates operate upon the qubits in targetQubits
, and cause rotations of angle
.
All qubits not appearing in
targetQubits
andcontrolQubits
are assumed to receive the identity operator.
This has the effect of premultiplying all amplitudes (for which the control qubits are 1
) with , where the sign is determined by the parity of the target qubits for that amplitude.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubits list of the indices of qubits to control upon [in] numControls length of length controlQubits
[in] targetQubits a list of the indices of the target qubits [in] numTargets length of list targetQubits
[in] angle the angle by which the multi-qubit state is rotated around the Z axis
- Exceptions
-
invalidQuESTInputError() - if any qubit in
controlQubits
andtargetQubits
is invalid, i.e. outside [0,qureg.numQubitsRepresented
) - if
controlQubits
ortargetQubits
contain any repetitions - if any qubit in
controlQubits
is also intargetQubits
(and vice versa) - if
numTargets
< 1 - if
numControls
< 1 (use multiRotateZ() for no controls)
segmentation-fault - if
controlQubits
contains fewer elements thannumControls
- if
targetQubits
contains fewer elements thannumTargets
- if any qubit in
Definition at line 668 of file QuEST.c.
References getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), statevec_multiControlledMultiRotateZ(), and validateMultiControlsMultiTargets().
Referenced by TEST_CASE().
◆ multiControlledPhaseFlip()
void multiControlledPhaseFlip | ( | Qureg | qureg, |
int * | controlQubits, | ||
int | numControlQubits | ||
) |
Apply the multiple-qubit controlled phase flip gate, also known as the multiple-qubit controlled pauliZ gate.
For each state, if all control qubits have value one, multiply the amplitude of that state by -1. This applies the many-qubit unitary:
on the control qubits.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubits array of input qubits [in] numControlQubits number of input qubits
- Exceptions
-
invalidQuESTInputError() - if
numControlQubits
is outside [1,qureg.numQubitsRepresented
) - if any qubit in
controlQubits
is outside [0,qureg.numQubitsRepresented
) - if any qubit in
qubits
is repeated
- if
Definition at line 587 of file QuEST.c.
References GATE_SIGMA_Z, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordMultiControlledGate(), shiftIndices(), statevec_multiControlledPhaseFlip(), and validateMultiQubits().
Referenced by TEST_CASE().
◆ multiControlledPhaseShift()
void multiControlledPhaseShift | ( | Qureg | qureg, |
int * | controlQubits, | ||
int | numControlQubits, | ||
qreal | angle | ||
) |
Introduce a phase factor on state of the passed qubits.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubits array of qubits to phase shift [in] numControlQubits the length of array controlQubits
[in] angle amount by which to shift the phase in radians
- Exceptions
-
invalidQuESTInputError() - if
numControlQubits
is outside [1,qureg.numQubitsRepresented
]) - if any qubit index in
controlQubits
is outside [0,qureg.numQubitsRepresented
]) - if the qubits in
controlQubits
are not unique
- if
Definition at line 510 of file QuEST.c.
References GATE_PHASE_SHIFT, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordMultiControlledParamGate(), shiftIndices(), statevec_multiControlledPhaseShift(), and validateMultiQubits().
Referenced by TEST_CASE().
◆ multiControlledTwoQubitUnitary()
void multiControlledTwoQubitUnitary | ( | Qureg | qureg, |
int * | controlQubits, | ||
int | numControlQubits, | ||
int | targetQubit1, | ||
int | targetQubit2, | ||
ComplexMatrix4 | u | ||
) |
Apply a general multi-controlled two-qubit unitary (including a global phase factor).
Any number of control qubits can be specified, and if all have value 1, the given unitary is applied to the target qubit. This effects the many-qubit unitary
on the control and target qubits.
targetQubit1
is treated as the least
significant qubit in u
, such that a row in u
is dotted with the vector
The passed 4x4 ComplexMatrix must be unitary, otherwise an error is thrown.
Note that in distributed mode, this routine requires that each node contains at least 4 amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q/4 nodes.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubits the control qubits which all must be in state 1 to effect the given unitary [in] numControlQubits the number of control qubits [in] targetQubit1 first target qubit, treated as least significant in u
[in] targetQubit2 second target qubit, treated as most significant in u
[in] u unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if
targetQubit1
ortargetQubit2
are outside [0,qureg.numQubitsRepresented
) - if
targetQubit1
equalstargetQubit2
- if any qubit in
controlQubits
is outside [0,qureg.numQubitsRepresented
) - if
controlQubits
are not unique - if either
targetQubit1
andtargetQubit2
are incontrolQubits
- if matrix
u
is not unitary - if each node cannot fit 4 amplitudes in distributed mode
- if
Definition at line 282 of file QuEST.c.
References getConjugateMatrix4(), getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), statevec_multiControlledTwoQubitUnitary(), validateMultiControlsMultiTargets(), and validateTwoQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ multiControlledUnitary()
void multiControlledUnitary | ( | Qureg | qureg, |
int * | controlQubits, | ||
int | numControlQubits, | ||
int | targetQubit, | ||
ComplexMatrix2 | u | ||
) |
Apply a general multiple-control single-target unitary, which can include a global phase factor.
Any number of control qubits can be specified, and if all have value 1, the given unitary is applied to the target qubit. This effects the many-qubit unitary
on the control and target qubits. The given 2x2 ComplexMatrix must be unitary, otherwise an error is thrown.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubits applies unitary if all qubits in this array equal 1 [in] numControlQubits number of control qubits [in] targetQubit qubit to operate on [in] u single-qubit unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if
numControlQubits
is outside [1,qureg.numQubitsRepresented
]) - if any qubit index (
targetQubit
or one incontrolQubits
) is outside [0,qureg.numQubitsRepresented
]) - if any qubit in
controlQubits
is repeated - if
controlQubits
containstargetQubit
- if
u
is not unitary
- if
Definition at line 373 of file QuEST.c.
References getConjugateMatrix2(), getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordMultiControlledUnitary(), statevec_multiControlledUnitary(), validateMultiControlsTarget(), and validateOneQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ multiQubitNot()
void multiQubitNot | ( | Qureg | qureg, |
int * | targs, | ||
int | numTargs | ||
) |
Apply a NOT (or Pauli X) gate with multiple target qubits, which has the same effect as (but is much faster than) applying each single-qubit NOT gate in turn.
The ordering within targs
has no effect on the operation.
This function is equivalent, but significantly faster (approximately
numTargs
times) than applying pauliX() on each qubit intargs
in turn.
The effected unitary, if targs
happen to be contiguous, has matrix:
and circuit diagram:
In distributed mode, this operation requires at most a single round of pair-wise communication between nodes, and hence is as efficient as pauliX().
- Parameters
-
[in,out] qureg a state-vector or density matrix to modify [in] targs a list of the qubits to be targeted by the X gates [in] numTargs the length of list targs
- Exceptions
-
invalidQuESTInputError() - if any qubit in
targs
is invalid, i.e. outside [0,qureg.numQubitsRepresented
) - if
targs
contain any repetitions - if
numTargs
< 1 - if
numTargs
>qureg.numQubitsRepresented
segmentation-fault - if
targs
contains fewer elements thannumTargs
- if any qubit in
Definition at line 536 of file QuEST.c.
References getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordMultiControlledMultiQubitNot(), statevec_multiControlledMultiQubitNot(), and validateMultiTargets().
Referenced by TEST_CASE().
◆ multiQubitUnitary()
void multiQubitUnitary | ( | Qureg | qureg, |
int * | targs, | ||
int | numTargs, | ||
ComplexMatrixN | u | ||
) |
Apply a general multi-qubit unitary (including a global phase factor) with any number of target qubits.
The first target qubit in targs
is treated as least significant in u
. For example,
will invoke multiplication
The passed ComplexMatrix must be unitary and be a compatible size with the specified number of target qubits, otherwise an error is thrown.
To left-multiply a non-unitary ComplexMatrixN, use applyMatrixN().
Note that in multithreaded mode, each thread will clone 2^numTargs
amplitudes, and store these in the runtime stack. Using t threads, the total memory overhead of this function is t*2^numTargs
. For many targets (e.g. 16 qubits), this may cause a stack-overflow / seg-fault (e.g. on a 1 MiB stack).
Note too that in distributed mode, this routine requires that each node contains at least 2^numTargs
amplitudes in the register. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q / 2^numTargs
nodes.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targs a list of the target qubits, ordered least significant to most in u
[in] numTargs the number of target qubits [in] u unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if any index in
targs
is outside of [0,qureg.numQubitsRepresented
) - if
targs
are not unique - if matrix
u
is not unitary - if
u
is not of a compatible size withnumTargs
- if a node cannot fit the required number of target amplitudes in distributed mode
- if any index in
Definition at line 296 of file QuEST.c.
References Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), setConjugateMatrixN(), shiftIndices(), statevec_multiQubitUnitary(), validateMultiQubitUnitaryMatrix(), and validateMultiTargets().
Referenced by TEST_CASE().
◆ multiRotatePauli()
void multiRotatePauli | ( | Qureg | qureg, |
int * | targetQubits, | ||
enum pauliOpType * | targetPaulis, | ||
int | numTargets, | ||
qreal | angle | ||
) |
Apply a multi-qubit multi-Pauli rotation, also known as a Pauli gadget, on a selected number of qubits.
This is the unitary
where angle
and is a Pauli operator pauliOpType operating upon the corresponding qubit targetQubits
.
For example:
effects
on qureg
, where unspecified qubits (along with those targeted by PAULI_I
) are assumed to receive the identity operator (excluded from exponentiation).
This means specifying
PAULI_I
does not induce a global phase factor . Hence, if alltargetPaulis
are identity, then this function does nothing toqureg
. SpecifyingPAULI_I
on a qubit is superfluous but allowed for convenience.
This function effects the Pauli gadget by first rotating the qubits which are nominated to receive X
or Y
Paulis into alternate basis, performing multiRotateZ() on all target qubits, then restoring the original basis.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubits a list of the indices of the target qubits [in] targetPaulis a list of the Pauli operators (pauliOpType) to apply to the corresponding qubits in targetQubits
[in] numTargets number of target qubits, i.e. the length of targetQubits
andtargetPaulis
[in] angle the angle by which the multi-qubit state is rotated
- Exceptions
-
invalidQuESTInputError() - if
numTargets
is outside [1,qureg.numQubitsRepresented
) - if any qubit in
targetQubits
is outside [0,qureg.numQubitsRepresented
) - if any qubit in
targetQubits
is repeated - if any element of
targetPaulis
is not one ofPAULI_I
,PAULI_X
,PAULI_Y
,PAULI_Z
segmentation-fault - if
targetQubits
contains fewer elements thannumTargets
- if
targetPaulis
contains fewer elements thannumTargets
- if
Definition at line 685 of file QuEST.c.
References Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), shiftIndices(), statevec_multiRotatePauli(), validateMultiTargets(), and validatePauliCodes().
Referenced by TEST_CASE().
◆ multiRotateZ()
Apply a multi-qubit Z rotation, also known as a phase gadget, on a selected number of qubits.
This is the unitary
where the Pauli Z gates operate the qubits listed in qubits
, and cause rotations of angle
.
All qubits not appearing in
qubits
are assumed to receive the identity operator.
This has the effect of premultiplying every amplitude with where the sign is determined by the parity of the target qubits for that amplitude.
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] qubits a list of the indices of the target qubits [in] numQubits number of target qubits [in] angle the angle by which the multi-qubit state is rotated around the Z axis
- Exceptions
-
invalidQuESTInputError() - if
numQubits
is outside [1,qureg.numQubitsRepresented
]) - if any qubit in
qubits
is outside [0,qureg.numQubitsRepresented
]) - if any qubit in
qubits
is repeated
segmentation-fault - if
qubits
contains fewer elements thannumQubits
- if
Definition at line 652 of file QuEST.c.
References getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), statevec_multiRotateZ(), and validateMultiTargets().
Referenced by TEST_CASE().
◆ multiStateControlledUnitary()
void multiStateControlledUnitary | ( | Qureg | qureg, |
int * | controlQubits, | ||
int * | controlState, | ||
int | numControlQubits, | ||
int | targetQubit, | ||
ComplexMatrix2 | u | ||
) |
Apply a general single-qubit unitary with multiple control qubits, conditioned upon a specific bit sequence.
Any number of control qubits can be specified, along with their classical state (0
or 1
) to condition upon. Only amplitudes of computational basis states for which controlQubits
have corresponding bit values controlState
are modified by u
.
This function is equivalent (albeit faster) to applying pauliX() on each of the control qubits which are conditioned on outcome
0
, calling multiControlledUnitary(), then re-appplying pauliX() on the same qubits.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] controlQubits the indices of the control qubits [in] controlState the bit values (0 or 1) of each control qubit, upon which to condition [in] numControlQubits number of control qubits [in] targetQubit qubit to operate the unitary upon [in] u single-qubit unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if
numControlQubits
is outside [1,qureg.numQubitsRepresented
]) - if any qubit index (
targetQubit
or one incontrolQubits
) is outside [0,qureg.numQubitsRepresented
]), - if any qubit in
controlQubits
is repeated - if
controlQubits
containstargetQubit
- if any element of
controlState
is not a bit (0
or1
) - if
u
is not unitary
- if
Definition at line 388 of file QuEST.c.
References getConjugateMatrix2(), getControlFlipMask(), getQubitBitMask(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordMultiStateControlledUnitary(), statevec_multiControlledUnitary(), validateControlState(), validateMultiControlsTarget(), and validateOneQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ pauliX()
void pauliX | ( | Qureg | qureg, |
int | targetQubit | ||
) |
Apply the single-qubit Pauli-X (also known as the X, sigma-X, NOT or bit-flip) gate.
This is a rotation of around the x-axis on the Bloch sphere. I.e.
with circuit diagram:
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate on
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 432 of file QuEST.c.
References GATE_SIGMA_X, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordGate(), statevec_pauliX(), and validateTarget().
Referenced by TEST_CASE().
◆ pauliY()
void pauliY | ( | Qureg | qureg, |
int | targetQubit | ||
) |
Apply the single-qubit Pauli-Y (also known as the Y or sigma-Y) gate.
This is a rotation of around the Y-axis on the Bloch sphere. I.e.
with circuit diagram:
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate on
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 443 of file QuEST.c.
References GATE_SIGMA_Y, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordGate(), statevec_pauliY(), statevec_pauliYConj(), and validateTarget().
Referenced by TEST_CASE().
◆ pauliZ()
void pauliZ | ( | Qureg | qureg, |
int | targetQubit | ||
) |
Apply the single-qubit Pauli-Z (also known as the Z, sigma-Z or phase-flip) gate.
This is a rotation of around the Z-axis (a phase shift) on the Bloch sphere. I.e.
with circuit diagram:
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate on
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 454 of file QuEST.c.
References GATE_SIGMA_Z, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordGate(), statevec_pauliZ(), and validateTarget().
Referenced by TEST_CASE().
◆ phaseShift()
Shift the phase between and of a single qubit by a given angle.
This is equivalent to a Z-axis rotation of the Bloch-sphere up to a global phase factor.
For angle , this effects single-qubit unitary
with circuit diagram
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to undergo a phase shift [in] angle amount by which to shift the phase in radians
- Exceptions
-
invalidQuESTInputError() targetQubit
is outside [0,qureg.numQubitsRepresented
).
Definition at line 487 of file QuEST.c.
References GATE_PHASE_SHIFT, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordParamGate(), statevec_phaseShift(), and validateTarget().
Referenced by TEST_CASE().
◆ rotateAroundAxis()
Rotate a single qubit by a given angle around a given Vector on the Bloch-sphere.
The vector must not be zero (else an error is thrown), but needn't be unit magnitude, since it will be normalised by QuEST.
For angle and axis vector , applies where is the vector of Pauli matrices.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] rotQubit qubit to rotate [in] angle angle by which to rotate in radians [in] axis vector around which to rotate (can be non-unit; will be normalised)
- Exceptions
-
invalidQuESTInputError() - if
rotQubit
is outside [0,qureg.numQubitsRepresented
) - if
axis
is the zero vector
- if
Definition at line 601 of file QuEST.c.
References Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordAxisRotation(), statevec_rotateAroundAxis(), statevec_rotateAroundAxisConj(), validateTarget(), and validateVector().
Referenced by TEST_CASE().
◆ rotateX()
Rotate a single qubit by a given angle around the X-axis of the Bloch-sphere.
For angle , applies
with circuit diagram:
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] rotQubit qubit to rotate [in] angle angle by which to rotate in radians
- Exceptions
-
invalidQuESTInputError() - if
rotQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 187 of file QuEST.c.
References GATE_ROTATE_X, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordParamGate(), statevec_rotateX(), and validateTarget().
Referenced by TEST_CASE().
◆ rotateY()
Rotate a single qubit by a given angle around the Y-axis of the Bloch-sphere.
For angle , applies
with circuit diagram:
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] rotQubit qubit to rotate [in] angle angle by which to rotate in radians
- Exceptions
-
invalidQuESTInputError if rotQubit
is outside [0,qureg.numQubitsRepresented
).
Definition at line 198 of file QuEST.c.
References GATE_ROTATE_Y, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordParamGate(), statevec_rotateY(), and validateTarget().
Referenced by TEST_CASE().
◆ rotateZ()
Rotate a single qubit by a given angle around the Z-axis of the Bloch-sphere (also known as a phase shift gate).
For angle , applies
with circuit diagram:
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] rotQubit qubit to rotate [in] angle angle by which to rotate in radians
- Exceptions
-
invalidQuESTInputError() - if
rotQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 209 of file QuEST.c.
References GATE_ROTATE_Z, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordParamGate(), statevec_rotateZ(), and validateTarget().
Referenced by TEST_CASE().
◆ sGate()
void sGate | ( | Qureg | qureg, |
int | targetQubit | ||
) |
Apply the single-qubit S gate.
This is a rotation of around the Z-axis on the Bloch sphere, or the unitary:
with circuit diagram:
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate upon
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 465 of file QuEST.c.
References GATE_S, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordGate(), statevec_sGate(), statevec_sGateConj(), and validateTarget().
Referenced by TEST_CASE().
◆ sqrtSwapGate()
void sqrtSwapGate | ( | Qureg | qureg, |
int | qb1, | ||
int | qb2 | ||
) |
Performs a sqrt SWAP gate between qubit1
and qubit2
.
This effects
on the designated qubits, though is performed internally by three CNOT gates.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] qb1 qubit to sqrt swap [in] qb2 other qubit to sqrt swap
- Exceptions
-
invalidQuESTInputError() - if either
qubit1
orqubit2
are outside [0,qureg.numQubitsRepresented
) - if
qubit1
andqubit2
are equal
- if either
Definition at line 639 of file QuEST.c.
References GATE_SQRT_SWAP, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledGate(), statevec_sqrtSwapGate(), statevec_sqrtSwapGateConj(), validateMultiQubitMatrixFitsInNode(), and validateUniqueTargets().
Referenced by TEST_CASE().
◆ swapGate()
void swapGate | ( | Qureg | qureg, |
int | qubit1, | ||
int | qubit2 | ||
) |
Performs a SWAP gate between qubit1
and qubit2
.
This effects
on the designated qubits, though is performed internally by three CNOT gates.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] qubit1 qubit to swap [in] qubit2 other qubit to swap
- Exceptions
-
invalidQuESTInputError() - if either
qubit1
orqubit2
are outside [0,qureg.numQubitsRepresented
) - if
qubit1
andqubit2
are equal
- if either
Definition at line 627 of file QuEST.c.
References GATE_SWAP, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordControlledGate(), statevec_swapQubitAmps(), and validateUniqueTargets().
Referenced by TEST_CASE().
◆ tGate()
void tGate | ( | Qureg | qureg, |
int | targetQubit | ||
) |
Apply the single-qubit T gate.
This is a rotation of around the Z-axis on the Bloch sphere, or the unitary:
with circuit diagram:
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate upon
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
)
- if
Definition at line 476 of file QuEST.c.
References GATE_T, Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordGate(), statevec_tGate(), statevec_tGateConj(), and validateTarget().
Referenced by TEST_CASE().
◆ twoQubitUnitary()
void twoQubitUnitary | ( | Qureg | qureg, |
int | targetQubit1, | ||
int | targetQubit2, | ||
ComplexMatrix4 | u | ||
) |
Apply a general two-qubit unitary (including a global phase factor).
targetQubit1
is treated as the least
significant qubit in u
, such that a row in u
is dotted with the vector
For example,
will invoke multiplication
The passed ComplexMatrix4 must be unitary, otherwise an error is thrown.
Use applyMatrix4() to left-multiply a non-unitary ComplexMatrix4.
Note that in distributed mode, this routine requires that each node contains at least 4 amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q/4 nodes.
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit1 first qubit to operate on, treated as least significant in u
[in] targetQubit2 second qubit to operate on, treated as most significant in u
[in] u unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if
targetQubit1
ortargetQubit2
are outside [0,qureg.numQubitsRepresented
) - if
targetQubit1
equalstargetQubit2
- if matrix
u
is not unitary - if each node cannot fit 4 amplitudes in distributed mode
- if
Definition at line 256 of file QuEST.c.
References getConjugateMatrix4(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordComment(), statevec_twoQubitUnitary(), validateMultiTargets(), and validateTwoQubitUnitaryMatrix().
Referenced by TEST_CASE().
◆ unitary()
void unitary | ( | Qureg | qureg, |
int | targetQubit, | ||
ComplexMatrix2 | u | ||
) |
Apply a general single-qubit unitary (including a global phase factor).
The passed 2x2 ComplexMatrix must be unitary, otherwise an error is thrown.
If qureg
is a state-vector, then the resulting state is .
If qureg
is a density-matrix , then the resulting state is .
Use applyMatrix2() to left-multiply a non-unitary ComplexMatrix2
- See also
- Parameters
-
[in,out] qureg object representing the set of all qubits [in] targetQubit qubit to operate on [in] u unitary matrix to apply
- Exceptions
-
invalidQuESTInputError() - if
targetQubit
is outside [0,qureg.numQubitsRepresented
) - if matrix
u
is not unitary
- if
Definition at line 348 of file QuEST.c.
References getConjugateMatrix2(), Qureg::isDensityMatrix, Qureg::numQubitsRepresented, qasm_recordUnitary(), statevec_unitary(), validateOneQubitUnitaryMatrix(), and validateTarget().
Referenced by TEST_CASE().