qml.ops.op_math.ctrl_decomp_zyz

ctrl_decomp_zyz(target_operation, control_wires)[source]

Decompose the controlled version of a target single-qubit operation

This function decomposes a controlled single-qubit target operation using the decomposition defined in section 5 of Barenco et al. (1995).

Warning

This method will add a global phase for target operations that do not belong to the SU(2) group.

Parameters
  • target_operation (Operator) – the target operation to decompose

  • control_wires (Wires) – the control wires of the operation

Returns

the decomposed operations

Return type

list[Operation]

Raises

ValueError – if target_operation is not a single-qubit operation

Example

We can create a controlled operation using qml.ctrl, or by creating the decomposed controlled version of using qml.ctrl_decomp_zyz.

dev = qml.device("default.qubit", wires=3)

@qml.qnode(dev)
def expected_circuit(op):
    qml.Hadamard(wires=0)
    qml.Hadamard(wires=1)
    qml.ctrl(op, [0,1])
    return qml.probs()

@qml.qnode(dev)
def decomp_circuit(op):
    qml.Hadamard(wires=0)
    qml.Hadamard(wires=1)
    qml.ops.ctrl_decomp_zyz(op, [0,1])
    return qml.probs()

Measurements on both circuits will give us the same results:

>>> op = qml.RX(0.123, wires=2)
>>> expected_circuit(op)
tensor([0.25      , 0.        , 0.25      , 0.        , 0.25      ,
    0.        , 0.24905563, 0.00094437], requires_grad=True)
>>> decomp_circuit(op)
tensor([0.25      , 0.        , 0.25      , 0.        , 0.25      ,
    0.        , 0.24905563, 0.00094437], requires_grad=True)