Ejemplo n.º 1
0
    def from_single_map(
        pauli_map_to: Optional[Dict[Pauli, Tuple[Pauli, bool]]] = None,
        *,
        x_to: Optional[Tuple[Pauli, bool]] = None,
        y_to: Optional[Tuple[Pauli, bool]] = None,
        z_to: Optional[Tuple[Pauli,
                             bool]] = None) -> 'SingleQubitCliffordGate':
        """Returns a SingleQubitCliffordGate for the
        specified transform with a 90 or 180 degree rotation.

        The arguments are exclusive, only one may be specified.

        Args:
            pauli_map_to: A dictionary with a single key value pair describing
                the transform.
            x_to: The transform from cirq.X
            y_to: The transform from cirq.Y
            z_to: The transform from cirq.Z
        """
        rotation_map = SingleQubitCliffordGate._validate_map_input(
            1, pauli_map_to, x_to=x_to, y_to=y_to, z_to=z_to)
        (trans_from, (trans_to, flip)), = tuple(rotation_map.items())
        if trans_from == trans_to:
            trans_from2 = Pauli.by_relative_index(trans_to, 1)  # 1 or 2 work
            trans_to2 = Pauli.by_relative_index(trans_from, 1)
            flip2 = False
        else:
            trans_from2 = trans_to
            trans_to2 = trans_from
            flip2 = not flip
        rotation_map[trans_from2] = PauliTransform(trans_to2, flip2)
        return SingleQubitCliffordGate.from_double_map(
            cast(Dict[Pauli, Tuple[Pauli, bool]], rotation_map))
Ejemplo n.º 2
0
 def from_pauli(pauli: Pauli, sqrt: bool = False) -> 'SingleQubitCliffordGate':
     prev_pauli = Pauli.by_relative_index(pauli, -1)
     next_pauli = Pauli.by_relative_index(pauli, 1)
     if sqrt:
         rotation_map = {
             prev_pauli: (next_pauli, True),
             pauli: (pauli, False),
             next_pauli: (prev_pauli, False),
         }
     else:
         rotation_map = {
             prev_pauli: (prev_pauli, True),
             pauli: (pauli, False),
             next_pauli: (next_pauli, True),
         }
     return SingleQubitCliffordGate.from_clifford_tableau(_to_clifford_tableau(rotation_map))
Ejemplo n.º 3
0
 def from_pauli(pauli: Pauli,
                sqrt: bool = False) -> 'SingleQubitCliffordGate':
     prev_pauli = Pauli.by_relative_index(pauli, -1)
     next_pauli = Pauli.by_relative_index(pauli, 1)
     if sqrt:
         rotation_map = {prev_pauli: PauliTransform(next_pauli, True),
                         pauli:      PauliTransform(pauli, False),
                         next_pauli: PauliTransform(prev_pauli, False)}
     else:
         rotation_map = {prev_pauli: PauliTransform(prev_pauli, True),
                         pauli:      PauliTransform(pauli, False),
                         next_pauli: PauliTransform(next_pauli, True)}
     inverse_map = {to: PauliTransform(frm, flip)
                    for frm, (to, flip) in rotation_map.items()}
     return SingleQubitCliffordGate(_rotation_map=rotation_map,
                         _inverse_map=inverse_map)