def METHOD_NAME(
    self,
    *,
    context: cirq.DecompositionContext,
    **quregs: NDArray[cirq.Qid],  # type:ignore[type-var]
) -> cirq.OP_TREE:
    controls, target = quregs['controls'], quregs['target']
    # Find K and L as per https://arxiv.org/abs/1805.03662 Fig 12.
    n, k = self.n, 0
    while n > 1 and n % 2 == 0:
        k += 1
        n = n // 2
    l, logL = int(n), self.registers['target'].total_bits() - k
    logL_qubits = target[:logL]
    yield [
        op.controlled_by(*controls, control_values=self.cv) for op in cirq.H.on_each(*target)
    ]
    if not len(logL_qubits):
        return
    ancilla = context.qubit_manager.qalloc(1)
    theta = np.arccos(1 - (2 ** np.floor(np.log2(l))) / l)
    yield arithmetic_gates.LessThanGate(logL, l).on(*logL_qubits, *ancilla)
    yield cirq.Rz(rads=theta)(*ancilla)
    yield arithmetic_gates.LessThanGate(logL, l).on(*logL_qubits, *ancilla)
    yield cirq.H.on_each(*logL_qubits)
    and_ancilla = context.qubit_manager.qalloc(len(self.cv) + logL - 2)
    and_op = and_gate.And((0,) * logL + self.cv).on_registers(
        control=[*logL_qubits, *controls], ancilla=and_ancilla, target=ancilla
    )
    yield and_op
    yield cirq.Rz(rads=theta)(*ancilla)
    yield cirq.inverse(and_op)
    yield cirq.H.on_each(*logL_qubits)
    context.qubit_manager.qfree([*ancilla, *and_ancilla])