1

How can I transpile using universal $Clifford + T$ gates set? I have only seen examples using rotations + $CNOT$.

This is what I have tried

from qiskit import *
from qiskit.quantum_info import Operator
from qiskit.compiler import transpile
%matplotlib inline

u = Operator([[0, 0, 1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0, 0, 0]])

qc = QuantumCircuit(3) qc.unitary(u, [0,1,2], label='u')

result = transpile(qc, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3) result.draw(output='mpl')

And this example works fine. But when I was trying to set:

basis_gates=['h', 's', 't', 'cx']

It doesn't work. Could you help me, please?)

UPDATE: After comments I've tried this:

pip install git+https://github.com/LNoorl/qiskit-terra.git@feature/sk-pass

and then:

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import TGate, HGate, TdgGate, SGate
from qiskit.transpiler.passes import SolovayKitaevDecomposition
from qiskit import *
from qiskit.quantum_info import Operator
from qiskit.compiler import transpile
%matplotlib inline

u = Operator([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, -1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]])

qc = QuantumCircuit(3) qc.unitary(u, [0,1,2], label='u')

print('Orginal circuit:') print(qc)

basis_gates = [TGate(), SGate(), HGate()] skd = SolovayKitaevDecomposition(recursion_degree=2, basis_gates=basis_gates, depth=5)

discretized = skd(qc)

print('Discretized circuit:') print(discretized)

But it outputs only this:

Orginal circuit:
     ┌────┐
q_0: ┤0   ├
     │    │
q_1: ┤1 u ├
     │    │
q_2: ┤2   ├
     └────┘
Discretized circuit:
     ┌────┐
q_0: ┤0   ├
     │    │
q_1: ┤1 u ├
     │    │
q_2: ┤2   ├
     └────┘

Where is a problem?

glS
  • 24,708
  • 5
  • 34
  • 108

1 Answers1

3

The reason for your second result is because unitary synthesis is not part of the SolovayKitaevDecomposition pass. Actually, you can combine your attempts to get the desired result.

This is the first stage (you first snippet), it will synthesise your circuit in terms of u* and cx:

from qiskit import QuantumCircuit
from qiskit.quantum_info import Operator
from qiskit.compiler import transpile

u = Operator([[0, 0, 1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0, 0, 0]])

qc = QuantumCircuit(3) qc.unitary(u, [0,1,2], label='u')

transpiled = transpile(qc, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)

Then you can transform it to Cliffort+T using SolovayKitaevDecomposition:

from qiskit.circuit.library import TGate, HGate, SGate
from qiskit.transpiler.passes import SolovayKitaevDecomposition

basis_gates = [TGate(), SGate(), HGate()] skd = SolovayKitaevDecomposition(recursion_degree=3, basis_gates=basis_gates, depth=5) discretized = skd(transpiled) print(discretized)

global phase: -0.063526
     ┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐                           »
q_0: ┤ X ├┤ T ├┤ X ├┤ S ├┤ X ├┤ X ├┤ S ├┤ S ├┤ H ├───────────────────────────»
     └─┬─┘└───┘└─┬─┘└───┘└─┬─┘└─┬─┘├───┤├───┤├───┤┌───┐┌───┐┌───┐┌───┐┌─────┐»
q_1: ──■─────────┼─────────■────┼──┤ X ├┤ S ├┤ S ├┤ S ├┤ X ├┤ S ├┤ H ├┤ TDG ├»
                 │              │  └─┬─┘└───┘└───┘└───┘└─┬─┘├───┤├───┤└┬───┬┘»
q_2: ────────────■──────────────■────■───────────────────■──┤ T ├┤ S ├─┤ S ├─»
                                                            └───┘└───┘ └───┘ »
luciano
  • 5,763
  • 1
  • 12
  • 34
  • Hey, I can't seem to find this module in Qiskit currently, is there a feature in qiskit that can perform clifford + T compilation? – Cuhrazatee Aug 11 '22 at 18:40
  • It's in a not-yet merged PR https://github.com/Qiskit/qiskit-terra/pull/5657 Check out https://quantumcomputing.stackexchange.com/a/16007/1859 for details on how to run it – luciano Aug 12 '22 at 04:17