---
title: CNOTDihedral (v1.1)
description: API reference for qiskit.quantum_info.CNOTDihedral in qiskit v1.1
source: https://eu-de.quantum.cloud.ibm.com/docs/en/api/qiskit/1.1/qiskit.quantum_info.CNOTDihedral
---

# CNOTDihedral

*class* `qiskit.quantum_info.CNOTDihedral(data=None, num_qubits=None, validate=True)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L31-L506)

Bases: `BaseOperator`, `AdjointMixin`

An N-qubit operator from the CNOT-Dihedral group.

> The CNOT-Dihedral group is generated by the quantum gates, [`CXGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.CXGate "qiskit.circuit.library.CXGate"), [`TGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.TGate "qiskit.circuit.library.TGate"), and [`XGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.XGate "qiskit.circuit.library.XGate").
>
> **Representation**
>
> An $N$-qubit CNOT-Dihedral operator is stored as an affine function and a phase polynomial, based on the convention in references \[1, 2].
>
> The affine function consists of an $N \times N$ invertible binary matrix, and an $N$ binary vector.
>
> The phase polynomial is a polynomial of degree at most 3, in $N$ variables, whose coefficients are in the ring Z\_8 with 8 elements.
>
> ```python
> from qiskit import QuantumCircuit
> from qiskit.quantum_info import CNOTDihedral
>
> circ = QuantumCircuit(3)
> circ.cx(0, 1)
> circ.x(2)
> circ.t(1)
> circ.t(1)
> circ.t(1)
> elem = CNOTDihedral(circ)
>
> # Print the CNOTDihedral element
> print(elem)
> ```

```python
phase polynomial =
0 + 3*x_0 + 3*x_1 + 2*x_0*x_1
affine function =
 (x_0,x_0 + x_1,x_2 + 1)
```

**Circuit Conversion**

> CNOTDihedral operators can be initialized from circuits containing *only* the following gates: [`IGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.IGate "qiskit.circuit.library.IGate"), [`XGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.XGate "qiskit.circuit.library.XGate"), [`YGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.YGate "qiskit.circuit.library.YGate"), [`ZGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.ZGate "qiskit.circuit.library.ZGate"), [`TGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.TGate "qiskit.circuit.library.TGate"), [`TdgGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.TdgGate "qiskit.circuit.library.TdgGate") [`SGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.SGate "qiskit.circuit.library.SGate"), [`SdgGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.SdgGate "qiskit.circuit.library.SdgGate"), [`CXGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.CXGate "qiskit.circuit.library.CXGate"), [`CZGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.CZGate "qiskit.circuit.library.CZGate"), [`CSGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.CSGate "qiskit.circuit.library.CSGate"), [`CSdgGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.CSdgGate "qiskit.circuit.library.CSdgGate"), [`SwapGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.SwapGate "qiskit.circuit.library.SwapGate"), [`CCZGate`](/docs/api/qiskit/1.1/qiskit.circuit.library.CCZGate "qiskit.circuit.library.CCZGate"). They can be converted back into a [`QuantumCircuit`](/docs/api/qiskit/1.1/qiskit.circuit.QuantumCircuit "qiskit.circuit.QuantumCircuit"), or [`Gate`](/docs/api/qiskit/1.1/qiskit.circuit.Gate "qiskit.circuit.Gate") object using the [`to_circuit()`](#qiskit.quantum_info.CNOTDihedral.to_circuit "qiskit.quantum_info.CNOTDihedral.to_circuit") or `to_instruction()` methods respectively. Note that this decomposition is not necessarily optimal in terms of number of gates if the number of qubits is more than two.
>
> CNOTDihedral operators can also be converted to [`Operator`](/docs/api/qiskit/1.1/qiskit.quantum_info.Operator "qiskit.quantum_info.Operator") objects using the [`to_operator()`](#qiskit.quantum_info.CNOTDihedral.to_operator "qiskit.quantum_info.CNOTDihedral.to_operator") method. This is done via decomposing to a circuit, and then simulating the circuit as a unitary operator.
>
> **References:**
>
> 1. Shelly Garion and Andrew W. Cross, *Synthesis of CNOT-Dihedral circuits with optimal number of two qubit gates*, [Quantum 4(369), 2020](https://quantum-journal.org/papers/q-2020-12-07-369/)
> 2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta, *Scalable randomised benchmarking of non-Clifford gates*, npj Quantum Inf 2, 16012 (2016).

Initialize a CNOTDihedral operator object.

**Parameters**

- **data** ([*CNOTDihedral*](#qiskit.quantum_info.CNOTDihedral "qiskit.quantum_info.CNOTDihedral")  *or*[*QuantumCircuit*](/docs/api/qiskit/1.1/qiskit.circuit.QuantumCircuit "qiskit.circuit.QuantumCircuit")  *or*[*Instruction*](/docs/api/qiskit/1.1/qiskit.circuit.Instruction "qiskit.circuit.Instruction")) – Optional, operator to initialize.
- **num\_qubits** ([*int*](https://docs.python.org/3/library/functions.html#int)) – Optional, initialize an empty CNOTDihedral operator.
- **validate** ([*bool*](https://docs.python.org/3/library/functions.html#bool)) – if True, validates the CNOTDihedral element.

**Raises**

- [**QiskitError**](/docs/api/qiskit/1.1/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if the type is invalid.
- [**QiskitError**](/docs/api/qiskit/1.1/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if validate=True and the CNOTDihedral element is invalid.

## Attributes

### 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.

### qargs

Return the qargs for the operator.

## Methods

### adjoint

`adjoint()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L442-L445)

Return the adjoint of the Operator.

### compose

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

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L374-L386)

Return the operator composition with another CNOTDihedral.

**Parameters**

- **other** ([*CNOTDihedral*](#qiskit.quantum_info.CNOTDihedral "qiskit.quantum_info.CNOTDihedral")) – a CNOTDihedral object.
- **qargs** ([*list*](https://docs.python.org/3/library/stdtypes.html#list) *or None*) – Optional, a list of subsystem positions to apply other on. If None apply on all subsystems (default: None).
- **front** ([*bool*](https://docs.python.org/3/library/functions.html#bool)) – If True compose using right operator multiplication, instead of left multiplication \[default: False].

**Returns**

The composed CNOTDihedral.

**Return type**

[CNOTDihedral](#qiskit.quantum_info.CNOTDihedral "qiskit.quantum_info.CNOTDihedral")

**Raises**

[**QiskitError**](/docs/api/qiskit/1.1/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.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()`](#qiskit.quantum_info.CNOTDihedral.dot "qiskit.quantum_info.CNOTDihedral.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()`](#qiskit.quantum_info.CNOTDihedral.dot "qiskit.quantum_info.CNOTDihedral.dot") method `A.dot(B) == A.compose(B, front=True)`.

### conjugate

`conjugate()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L447-L472)

Return the conjugate of the CNOTDihedral.

### copy

`copy()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/base_operator.py#L143-L145)

Make a deep copy of current operator.

### dot

`dot(other, qargs=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/mixins/group.py#L133-L149)

Return the right multiplied operator self \* other.

**Parameters**

- **other** ([*Operator*](/docs/api/qiskit/1.1/qiskit.quantum_info.Operator "qiskit.quantum_info.Operator")) – an operator object.
- **qargs** ([*list*](https://docs.python.org/3/library/stdtypes.html#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**

[Operator](/docs/api/qiskit/1.1/qiskit.quantum_info.Operator "qiskit.quantum_info.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](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L439-L440)

Return the reverse-order tensor product with another CNOTDihedral.

**Parameters**

**other** ([*CNOTDihedral*](#qiskit.quantum_info.CNOTDihedral "qiskit.quantum_info.CNOTDihedral")) – a CNOTDihedral object.

**Returns**

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

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

**Return type**

[CNOTDihedral](#qiskit.quantum_info.CNOTDihedral "qiskit.quantum_info.CNOTDihedral")

### input\_dims

`input_dims(qargs=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/base_operator.py#L135-L137)

Return tuple of input dimension for specified subsystems.

### output\_dims

`output_dims(qargs=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/base_operator.py#L139-L141)

Return tuple of output dimension for specified subsystems.

### power

`power(n)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/mixins/group.py#L151-L171)

Return the compose of a operator with itself n times.

**Parameters**

**n** ([*int*](https://docs.python.org/3/library/functions.html#int)) – the number of times to compose with self (n>0).

**Returns**

the n-times composed operator.

**Return type**

[Clifford](/docs/api/qiskit/1.1/qiskit.quantum_info.Clifford "qiskit.quantum_info.Clifford")

**Raises**

[**QiskitError**](/docs/api/qiskit/1.1/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.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](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/base_operator.py#L106-L133)

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

**Parameters**

- **input\_dims** (*None or* [*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple)) – new subsystem input dimensions. If None the original input dims will be preserved \[Default: None].
- **output\_dims** (*None or* [*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple)) – new subsystem output dimensions. If None the original output dims will be preserved \[Default: None].
- **num\_qubits** (*None or* [*int*](https://docs.python.org/3/library/functions.html#int)) – reshape to an N-qubit operator \[Default: None].

**Returns**

returns self with reshaped input and output dimensions.

**Return type**

BaseOperator

**Raises**

[**QiskitError**](/docs/api/qiskit/1.1/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if combined size of all subsystem input dimension or subsystem output dimensions is not constant.

### tensor

`tensor(other)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L436-L437)

Return the tensor product with another CNOTDihedral.

**Parameters**

**other** ([*CNOTDihedral*](#qiskit.quantum_info.CNOTDihedral "qiskit.quantum_info.CNOTDihedral")) – a CNOTDihedral object.

**Returns**

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

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

**Return type**

[CNOTDihedral](#qiskit.quantum_info.CNOTDihedral "qiskit.quantum_info.CNOTDihedral")

> **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](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L317-L334)

Return a QuantumCircuit implementing the CNOT-Dihedral element.

**Returns**

a circuit implementation of the CNOTDihedral object.

**Return type**

[QuantumCircuit](/docs/api/qiskit/1.1/qiskit.circuit.QuantumCircuit "qiskit.circuit.QuantumCircuit")

**References**

1. Shelly Garion and Andrew W. Cross, *Synthesis of CNOT-Dihedral circuits with optimal number of two qubit gates*, [Quantum 4(369), 2020](https://quantum-journal.org/papers/q-2020-12-07-369/)
2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta, *Scalable randomised benchmarking of non-Clifford gates*, npj Quantum Inf 2, 16012 (2016).

### to\_instruction

`to_instruction()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L336-L338)

Return a Gate instruction implementing the CNOTDihedral object.

### to\_matrix

`to_matrix()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L366-L368)

Convert operator to Numpy matrix.

### to\_operator

`to_operator()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L370-L372)

Convert to an Operator object.

**Return type**

[*Operator*](/docs/api/qiskit/1.1/qiskit.quantum_info.Operator "qiskit.quantum_info.operators.operator.Operator")

### transpose

`transpose()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/1.1/qiskit/quantum_info/operators/dihedral/dihedral.py#L474-L477)

Return the transpose of the CNOTDihedral.
