def phase_flip(p: float | None = None) -> common_gates.ZPowGate | PhaseFlipChannel:
    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{1 - p} \begin{bmatrix}
                        1 & 0  \\
                        0 & 1
                    \end{bmatrix}
    \\
    M_1 =& \sqrt{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.
    """
    if p is None:
        return _phase_flip_Z()

    return _phase_flip(p)
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{1 - p} \begin{bmatrix}
                        1 & 0  \\
                        0 & 1
                    \end{bmatrix}
    \\
    M_1 =& \sqrt{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.
    
cirq-core/cirq/ops/common_channels.py