code: def phase_flip(
      p: Optional[float] = None
  ) -> Union[common_gates.ZPowGate, PhaseFlipChannel]:
      r
      if p is None:
          return _phase_flip_Z()
  
      return _phase_flip(p)
docs: r"""
      Returns a PhaseFlipChannel that flips a qubit's phase with probability p
      if p is None, return a guaranteed phase flip in the form of a Z operation.
  
      This channel evolves a density matrix via:
  
          $$
          \rho \rightarrow M_0 \rho M_0^\dagger + M_1 \rho M_1^\dagger
          $$
  
      With:
  
          $$
          \begin{aligned}
          M_0 =& \sqrt{p} \begin{bmatrix}
                              1 & 0  \\
                              0 & 1
                         \end{bmatrix}
          \\
          M_1 =& \sqrt{1-p} \begin{bmatrix}
                              1 & 0 \\
                              0 & -1
                           \end{bmatrix}
          \end{aligned}
          $$
  
      Args:
          p: the probability of a phase flip.
  
      Raises:
          ValueError: if p is not a valid probability.