def _decompose_outside_control( self, control: 'cirq.Qid', near_target: 'cirq.Qid', far_target: 'cirq.Qid' ) -> 'cirq.OP_TREE': """A decomposition assuming one of the targets is in the middle. control: ───T──────@────────@───@────────────@──────────────── │ │ │ │ near: ─X─T──────X─@─T^-1─X─@─X────@─X^0.5─X─@─X^0.5──────── │ │ │ │ │ far: ─@─Y^-0.5─T─X─T──────X─T^-1─X─T^-1────X─S─────X^-0.5─ """ a, b, c = control, near_target, far_target t = common_gates.T sweep_abc = [common_gates.CNOT(a, b), common_gates.CNOT(b, c)] yield common_gates.CNOT(c, b) yield pauli_gates.Y(c) ** -0.5 yield t(a), t(b), t(c) yield sweep_abc yield t(b) ** -1, t(c) yield sweep_abc yield t(c) ** -1 yield sweep_abc yield t(c) ** -1 yield pauli_gates.X(b) ** 0.5 yield sweep_abc yield common_gates.S(c) yield pauli_gates.X(b) ** 0.5 yield pauli_gates.X(c) ** -0.5
def __pow__(self, exponent: int) -> 'LinearCombinationOfOperations': if not isinstance(exponent, int): return NotImplemented if exponent < 0: return NotImplemented if len(self.qubits) != 1: return NotImplemented qubit = self.qubits[0] i = identity.I(qubit) x = pauli_gates.X(qubit) y = pauli_gates.Y(qubit) z = pauli_gates.Z(qubit) pauli_basis = {i, x, y, z} if not set(self.keys()).issubset(pauli_basis): return NotImplemented ai, ax, ay, az = self[i], self[x], self[y], self[z] bi, bx, by, bz = operator_spaces.pow_pauli_combination(ai, ax, ay, az, exponent) return LinearCombinationOfOperations({i: bi, x: bx, y: by, z: bz})