Clifford
class qiskit.quantum_info.Clifford(data, validate=True, copy=True)
Bases: BaseOperator
, AdjointMixin
, Operation
An N-qubit unitary operator from the Clifford group.
Representation
An N-qubit Clifford operator is stored as a length 2N × (2N+1) boolean tableau using the convention from reference [1].
- Rows 0 to N-1 are the destabilizer group generators
- Rows N to 2N-1 are the stabilizer group generators.
The internal boolean tableau for the Clifford can be accessed using the tableau
attribute. The destabilizer or stabilizer rows can each be accessed as a length-N Stabilizer table using destab
and stab
attributes.
A more easily human readable representation of the Clifford operator can be obtained by calling the to_dict()
method. This representation is also used if a Clifford object is printed as in the following example
from qiskit import QuantumCircuit
from qiskit.quantum_info import Clifford
# Bell state generation circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
cliff = Clifford(qc)
# Print the Clifford
print(cliff)
# Print the Clifford destabilizer rows
print(cliff.to_labels(mode="D"))
# Print the Clifford stabilizer rows
print(cliff.to_labels(mode="S"))
Clifford: Stabilizer = ['+XX', '+ZZ'], Destabilizer = ['+IZ', '+XI']
['+IZ', '+XI']
['+XX', '+ZZ']
Circuit Conversion
Clifford operators can be initialized from circuits containing only the following Clifford gates: IGate
, XGate
, YGate
, ZGate
, HGate
, SGate
, SdgGate
, SXGate
, SXdgGate
, CXGate
, CZGate
, CYGate
, DXGate
, SwapGate
, iSwapGate
, ECRGate
, LinearFunction
, PermutationGate
. They can be converted back into a QuantumCircuit
, or Gate
object using the to_circuit()
or to_instruction()
methods respectively. Note that this decomposition is not necessarily optimal in terms of number of gates.
Clifford operators can also be converted to Operator
objects using the to_operator()
method. This is done via decomposing to a circuit, and then simulating the circuit as a unitary operator.
References
- S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits, Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196
Initialize an operator object.
Attributes
destab
The destabilizer array for the symplectic representation.
destab_phase
Return phase of destabilizer with boolean representation.
destab_x
The destabilizer x array for the symplectic representation.
destab_z
The destabilizer z array for the symplectic representation.
dim
Return tuple (input_shape, output_shape).
name
Unique string identifier for operation type.
num_clbits
Number of classical bits.
num_qubits
Return the number of qubits if a N-qubit operator or None otherwise.
phase
Return phase with boolean representation.
qargs
Return the qargs for the operator.
stab
The stabilizer array for the symplectic representation.
stab_phase
Return phase of stabilizer with boolean representation.
stab_x
The stabilizer x array for the symplectic representation.
stab_z
The stabilizer array for the symplectic representation.
symplectic_matrix
Return boolean symplectic matrix.
x
The x array for the symplectic representation.
z
The z array for the symplectic representation.
Methods
adjoint
compose
compose(other, qargs=None, front=False)
Return the operator composition with another Clifford.
Parameters
- other (Clifford) – a Clifford object.
- qargs (list or None) – Optional, a list of subsystem positions to apply other on. If None apply on all subsystems (default: None).
- front (bool) – If True compose using right operator multiplication, instead of left multiplication [default: False].
Returns
The composed Clifford.
Return type
Raises
QiskitError – if other cannot be converted to an operator, or has incompatible dimensions for specified subsystems.
Composition (&
) by default is defined as left matrix multiplication for matrix operators, while @
(equivalent to dot()
) is defined as right matrix multiplication. That is that A & B == A.compose(B)
is equivalent to B @ A == B.dot(A)
when A
and B
are of the same type.
Setting the front=True
kwarg changes this to right matrix multiplication and is equivalent to the dot()
method A.dot(B) == A.compose(B, front=True)
.
conjugate
copy
dot
dot(other, qargs=None)
Return the right multiplied operator self * other.
Parameters
- other (Operator) – an operator object.
- qargs (list or None) – Optional, a list of subsystem positions to apply other on. If None apply on all subsystems (default: None).
Returns
The right matrix multiplied Operator.
Return type
The dot product can be obtained using the @
binary operator. Hence a.dot(b)
is equivalent to a @ b
.
expand
expand(other)
Return the reverse-order tensor product with another Clifford.
Parameters
other (Clifford) – a Clifford object.
Returns
the tensor product , where
is the current Clifford, and is the other Clifford.
Return type
from_circuit
static from_circuit(circuit)
Initialize from a QuantumCircuit or Instruction.
Parameters
circuit (QuantumCircuit orInstruction) – instruction to initialize.
Returns
the Clifford object for the instruction.
Return type
Raises
QiskitError – if the input instruction is non-Clifford or contains classical register instruction.
from_dict
from_label
static from_label(label)
Return a tensor product of single-qubit Clifford gates.
Parameters
label (string) – single-qubit operator string.
Returns
The N-qubit Clifford operator.
Return type
Raises
QiskitError – if the label contains invalid characters.
Additional Information:
The labels correspond to the single-qubit Cliffords are
-
- Label
- Stabilizer
- Destabilizer
-
"I"
- +Z
- +X
-
"X"
- -Z
- +X
-
"Y"
- -Z
- -X
-
"Z"
- +Z
- -X
-
"H"
- +X
- +Z
-
"S"
- +Z
- +Y
from_linear_function
classmethod from_linear_function(linear_function)
Create a Clifford from a Linear Function.
If the linear function is represented by a nxn binary invertible matrix A, then the corresponding Clifford has symplectic matrix [[A^t, 0], [0, A^{-1}]].
Parameters
linear_function (LinearFunction) – A linear function to be converted.
Returns
the Clifford object for this linear function.
Return type
from_matrix
classmethod from_matrix(matrix)
Create a Clifford from a unitary matrix.
Note that this function takes exponentially long time w.r.t. the number of qubits.
Parameters
matrix (np.array) – A unitary matrix representing a Clifford to be converted.
Returns
the Clifford object for the unitary matrix.
Return type
Raises
QiskitError – if the input is not a Clifford matrix.
from_operator
classmethod from_operator(operator)
Create a Clifford from a operator.
Note that this function takes exponentially long time w.r.t. the number of qubits.
Parameters
operator (Operator) – An operator representing a Clifford to be converted.
Returns
the Clifford object for the operator.
Return type
Raises
QiskitError – if the input is not a Clifford operator.
from_permutation
classmethod from_permutation(permutation_gate)
Create a Clifford from a PermutationGate.
Parameters
permutation_gate (PermutationGate) – A permutation to be converted.
Returns
the Clifford object for this permutation.
Return type
input_dims
is_unitary
output_dims
power
power(n)
Return the compose of a operator with itself n times.
Parameters
n (int) – the number of times to compose with self (n>0).
Returns
the n-times composed operator.
Return type
Raises
QiskitError – if the input and output dimensions of the operator are not equal, or the power is not a positive integer.
reshape
reshape(input_dims=None, output_dims=None, num_qubits=None)
Return a shallow copy with reshaped input and output subsystem dimensions.
Parameters
- input_dims (None or tuple) – new subsystem input dimensions. If None the original input dims will be preserved [Default: None].
- output_dims (None or tuple) – new subsystem output dimensions. If None the original output dims will be preserved [Default: None].
- num_qubits (None or int) – reshape to an N-qubit operator [Default: None].
Returns
returns self with reshaped input and output dimensions.
Return type
BaseOperator
Raises
QiskitError – if combined size of all subsystem input dimension or subsystem output dimensions is not constant.
tensor
tensor(other)
Return the tensor product with another Clifford.
Parameters
other (Clifford) – a Clifford object.
Returns
the tensor product , where
is the current Clifford, and is the other Clifford.
Return type
The tensor product can be obtained using the ^
binary operator. Hence a.tensor(b)
is equivalent to a ^ b
.
to_circuit
to_circuit()
Return a QuantumCircuit implementing the Clifford.
For N <= 3 qubits this is based on optimal CX cost decomposition from reference [1]. For N > 3 qubits this is done using the general non-optimal compilation routine from reference [2].
Returns
a circuit implementation of the Clifford.
Return type
References
- S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
- S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits, Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196
to_dict
to_instruction
to_labels
to_labels(array=False, mode='B')
Convert a Clifford to a list Pauli (de)stabilizer string labels.
For large Clifford converting using the array=True
kwarg will be more efficient since it allocates memory for the full Numpy array of labels in advance.
Label | Phase | Symplectic | Matrix | Pauli |
---|
| "+I"
| 0 | | | |
| "-I"
| 1 | | | |
| "X"
| 0 | | | |
| "-X"
| 1 | | | |
| "Y"
| 0 | | | |
| "-Y"
| 1 | | | |
| "Z"
| 0 | | | |
| "-Z"
| 1 | | | |
Parameters
- array (bool) – return a Numpy array if True, otherwise return a list (Default: False).
- mode (Literal["S", "D", "B"]) – return both stabilizer and destabilizer if “B”, return only stabilizer if “S” and return only destabilizer if “D”.
Returns
The rows of the StabilizerTable in label form.
Return type
list or array
Raises
QiskitError – if stabilizer and destabilizer are both False.