qml.ops.sk_decomposition¶
- sk_decomposition(op, epsilon, *, max_depth=5, basis_set=('T', 'T*', 'H'), basis_length=10)[source]¶
Approximate an arbitrary single-qubit gate in the Clifford+T basis using the Solovay-Kitaev algorithm.
This method implements the Solovay-Kitaev decomposition algorithm that approximates any single-qubit operation with ϵ>0 error. The procedure exits when the approximation error becomes less than ϵ, or when
max_depth
approximation passes have been made. In the latter case, the approximation error could be ≥ϵ.This algorithm produces a decomposition with O(log3.97(1/ϵ)) operations.
- Parameters
op (Operation) – A single-qubit gate operation.
epsilon (float) – The maximum permissible error.
- Keyword Arguments
max_depth (int) – The maximum number of approximation passes. A smaller ϵ would generally require a greater number of passes. Default is
5
.basis_set (tuple[str]) – Basis set to be used for the decomposition and building an approximate set internally. It accepts the following gate terms:
('X', 'Y', 'Z', 'H', 'T', 'T*', 'S', 'S*')
, where*
refers to the gate adjoint. Default value is('T', 'T*', 'H')
.basis_length (int) – Maximum expansion length of Clifford+T sequences in the internally-built approximate set. Default is
10
.
- Returns
A list of gates in the Clifford+T basis set that approximates the given operation along with a final global phase operation. The operations are in the circuit-order.
- Return type
list[Operation]
- Raises
ValueError – If the given operator acts on more than one wires.
Example
Suppose one would like to decompose
RZ
with rotation angle ϕ=π/3:import numpy as np import pennylane as qml op = qml.RZ(np.pi/3, wires=0) # Get the gate decomposition in ['T', 'T*', 'H'] ops = qml.ops.sk_decomposition(op, epsilon=1e-3) # Get the approximate matrix from the ops matrix_sk = qml.prod(*reversed(ops)).matrix()
When the function is run for a sufficient
depth
with a good enough approximate set, the output gate sequence should implement the same operation approximately.>>> qml.math.allclose(op.matrix(), matrix_sk, atol=1e-3) True