Clifford
class Clifford(data, validate=True)
Bases: qiskit.quantum_info.operators.base_operator.BaseOperator
, qiskit.quantum_info.operators.mixins.adjoint.AdjointMixin
An N-qubit unitary operator from the Clifford group.
Representation
An N-qubit Clifford operator is stored as a length 2N StabilizerTable
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 StabilizerTable
for the Clifford can be accessed using the table
attribute. The destabilizer or stabilizer rows can each be accessed as a length-N Stabilizer table using destabilizer
and stabilizer
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.destabilizer)
# Print the Clifford stabilizer rows
print(cliff.stabilizer)
Clifford: Stabilizer = ['+XX', '+ZZ'], Destabilizer = ['+IZ', '+XI']
StabilizerTable: ['+IZ', '+XI']
StabilizerTable: ['+XX', '+ZZ']
Circuit Conversion
Clifford operators can be initialized from circuits containing only the following Clifford gates: IGate
, XGate
, YGate
, ZGate
, HGate
, SGate
, SdgGate
, CXGate
, CZGate
, SwapGate
. 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.
Methods
adjoint
Clifford.adjoint()
Return the adjoint of the Operator.
compose
Clifford.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
Clifford.conjugate()
Return the conjugate of the Clifford.
copy
Clifford.copy()
Make a deep copy of current operator.
dot
Clifford.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
Clifford.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 Clifford.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
static Clifford.from_dict(obj)
Load a Clifford from a dictionary
from_label
static Clifford.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
input_dims
Clifford.input_dims(qargs=None)
Return tuple of input dimension for specified subsystems.
is_unitary
Clifford.is_unitary()
Return True if the Clifford table is valid.
output_dims
Clifford.output_dims(qargs=None)
Return tuple of output dimension for specified subsystems.
power
Clifford.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
Clifford.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
Clifford.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
Clifford.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
Clifford.to_dict()
Return dictionary representation of Clifford object.
to_instruction
Clifford.to_instruction()
Return a Gate instruction implementing the Clifford.
to_matrix
Clifford.to_matrix()
Convert operator to Numpy matrix.
to_operator
Clifford.to_operator()
Convert to an Operator object.
transpose
Clifford.transpose()
Return the transpose of the Clifford.
Attributes
destabilizer
Return the destabilizer block of the StabilizerTable.
dim
Return tuple (input_shape, output_shape).
name
Unique string identifier for operation type.
num_clbits
Number of classical bits.
num_qubits
Number of qubits.
qargs
Return the qargs for the operator.
stabilizer
Return the stabilizer block of the StabilizerTable.
table
Return StabilizerTable