def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE': if len(self.dense_pauli_string) <= 0: return any_qubit = qubits[0] to_z_ops = op_tree.freeze_op_tree(self._to_z_basis_ops(qubits)) xor_decomp = tuple(xor_nonlocal_decompose(qubits, any_qubit)) yield to_z_ops yield xor_decomp if self.exponent_neg: yield pauli_gates.Z(any_qubit)**self.exponent_neg if self.exponent_pos: yield pauli_gates.X(any_qubit) yield pauli_gates.Z(any_qubit)**self.exponent_pos yield pauli_gates.X(any_qubit) yield protocols.inverse(xor_decomp) yield protocols.inverse(to_z_ops)
def _decompose_(self) -> op_tree.OP_TREE: if len(self.pauli_string) <= 0: return qubits = self.qubits any_qubit = qubits[0] to_z_ops = op_tree.freeze_op_tree(self.pauli_string.to_z_basis_ops()) xor_decomp = tuple(xor_nonlocal_decompose(qubits, any_qubit)) yield to_z_ops yield xor_decomp if self.exponent_neg: yield pauli_gates.Z(any_qubit)**self.exponent_neg if self.exponent_pos: yield pauli_gates.X(any_qubit) yield pauli_gates.Z(any_qubit)**self.exponent_pos yield pauli_gates.X(any_qubit) yield protocols.inverse(xor_decomp) yield protocols.inverse(to_z_ops)
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})