# Clifford

class qiskit.quantum_info.Clifford(data, validate=True, copy=True)

GitHub(opens in a new tab)

Bases: BaseOperator, AdjointMixin, Operation

An N-qubit unitary operator from the Clifford group.

An N-qubit Clifford operator takes Paulis to Paulis via conjugation (up to a global phase). More precisely, the Clifford group $\mathcal{C}_N$ is defined as

$\mathcal{C}_N = \{ U \in U(2^N) | U \mathcal{P}_N U^{\dagger} = \mathcal{P}_N \} / U(1)$

where $\mathcal{P}_N$ is the Pauli group on $N$ qubits that is generated by single-qubit Pauli operators, and $U$ is a unitary operator in the unitary group $U(2^N)$ representing operations on $N$ qubits. $\mathcal{C}_N$ is the quotient group by the subgroup of scalar unitary matrices $U(1)$.

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, DCXGate, 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.

Note

A minimally generating set of gates for Clifford circuits is the HGate and SGate gate and either the CXGate or CZGate two-qubit gate.

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

1. S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits, Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196(opens in a new tab)

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()

GitHub(opens in a new tab)

Return the adjoint of the Operator.

### compose

compose(other, qargs=None, front=False)

GitHub(opens in a new tab)

Return the operator composition with another Clifford.

Parameters

• other (Clifford) – a Clifford object.
• qargs (list(opens in a new tab) or None) – Optional, a list of subsystem positions to apply other on. If None apply on all subsystems (default: None).
• front (bool(opens in a new tab)) – If True compose using right operator multiplication, instead of left multiplication [default: False].

Returns

The composed Clifford.

Return type

Clifford

Raises

QiskitError – if other cannot be converted to an operator, or has incompatible dimensions for specified subsystems.

Note

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

conjugate()

GitHub(opens in a new tab)

Return the conjugate of the Clifford.

### copy

copy()

GitHub(opens in a new tab)

Make a deep copy of current operator.

### dot

dot(other, qargs=None)

GitHub(opens in a new tab)

Return the right multiplied operator self * other.

Parameters

• other (Operator) – an operator object.
• qargs (list(opens in a new tab) 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

Operator

Note

The dot product can be obtained using the @ binary operator. Hence a.dot(b) is equivalent to a @ b.

### expand

expand(other)

GitHub(opens in a new tab)

Return the reverse-order tensor product with another Clifford.

Parameters

other (Clifford) – a Clifford object.

Returns

the tensor product $b \otimes a$, where $a$

is the current Clifford, and $b$ is the other Clifford.

Return type

Clifford

### from_circuit

static from_circuit(circuit)

GitHub(opens in a new tab)

Initialize from a QuantumCircuit or Instruction.

Parameters

circuit (QuantumCircuit orInstruction) – instruction to initialize.

Returns

the Clifford object for the instruction.

Return type

Clifford

Raises

QiskitError – if the input instruction is non-Clifford or contains classical register instruction.

### from_dict

classmethod from_dict(obj)

GitHub(opens in a new tab)

Load a Clifford from a dictionary

### from_label

static from_label(label)

GitHub(opens in a new tab)

Return a tensor product of single-qubit Clifford gates.

Parameters

label (string) – single-qubit operator string.

Returns

The N-qubit Clifford operator.

Return type

Clifford

Raises

QiskitError – if the label contains invalid characters.

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)

GitHub(opens in a new tab)

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

Clifford

### from_matrix

classmethod from_matrix(matrix)

GitHub(opens in a new tab)

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

Clifford

Raises

QiskitError – if the input is not a Clifford matrix.

### from_operator

classmethod from_operator(operator)

GitHub(opens in a new tab)

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

Clifford

Raises

QiskitError – if the input is not a Clifford operator.

### from_permutation

classmethod from_permutation(permutation_gate)

GitHub(opens in a new tab)

Create a Clifford from a PermutationGate.

Parameters

permutation_gate (PermutationGate) – A permutation to be converted.

Returns

the Clifford object for this permutation.

Return type

Clifford

### input_dims

input_dims(qargs=None)

GitHub(opens in a new tab)

Return tuple of input dimension for specified subsystems.

### is_unitary

is_unitary()

GitHub(opens in a new tab)

Return True if the Clifford table is valid.

### output_dims

output_dims(qargs=None)

GitHub(opens in a new tab)

Return tuple of output dimension for specified subsystems.

### power

power(n)

GitHub(opens in a new tab)

Return the compose of a operator with itself n times.

Parameters

n (int(opens in a new tab)) – the number of times to compose with self (n>0).

Returns

the n-times composed operator.

Return type

Clifford

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)

GitHub(opens in a new tab)

Return a shallow copy with reshaped input and output subsystem dimensions.

Parameters

• input_dims (None or tuple(opens in a new tab)) – new subsystem input dimensions. If None the original input dims will be preserved [Default: None].
• output_dims (None or tuple(opens in a new tab)) – new subsystem output dimensions. If None the original output dims will be preserved [Default: None].
• num_qubits (None or int(opens in a new tab)) – 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)

GitHub(opens in a new tab)

Return the tensor product with another Clifford.

Parameters

other (Clifford) – a Clifford object.

Returns

the tensor product $a \otimes b$, where $a$

is the current Clifford, and $b$ is the other Clifford.

Return type

Clifford

Note

The tensor product can be obtained using the ^ binary operator. Hence a.tensor(b) is equivalent to a ^ b.

### to_circuit

to_circuit()

GitHub(opens in a new tab)

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

QuantumCircuit

References

1. S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph](opens in a new tab)
2. S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits, Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196(opens in a new tab)

### to_dict

to_dict()

GitHub(opens in a new tab)

Return dictionary representation of Clifford object.

### to_instruction

to_instruction()

GitHub(opens in a new tab)

Return a Gate instruction implementing the Clifford.

### to_labels

to_labels(array=False, mode='B')

GitHub(opens in a new tab)

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.

LabelPhaseSymplecticMatrixPauli

| "+I" | 0 | $[0, 0]$ | $\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}$ | $I$ | | "-I" | 1 | $[0, 0]$ | $\begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}$ | $-I$ | | "X" | 0 | $[1, 0]$ | $\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}$ | $X$ | | "-X" | 1 | $[1, 0]$ | $\begin{bmatrix} 0 & -1 \\ -1 & 0 \end{bmatrix}$ | $-X$ | | "Y" | 0 | $[1, 1]$ | $\begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix}$ | $iY$ | | "-Y" | 1 | $[1, 1]$ | $\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}$ | $-iY$ | | "Z" | 0 | $[0, 1]$ | $\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}$ | $Z$ | | "-Z" | 1 | $[0, 1]$ | $\begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix}$ | $-Z$ |

Parameters

• array (bool(opens in a new tab)) – 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(opens in a new tab) or array

Raises

QiskitError – if stabilizer and destabilizer are both False.

### to_matrix

to_matrix()

GitHub(opens in a new tab)

Convert operator to Numpy matrix.

### to_operator

to_operator()

GitHub(opens in a new tab)

Convert to an Operator object.

Return type

Operator

### transpose

transpose()

GitHub(opens in a new tab)

Return the transpose of the Clifford.