def bit_flip(p: float | None = None) -> common_gates.XPowGate | BitFlipChannel:
    r"""Construct a BitFlipChannel that flips a qubit state with probability p.

    If p is None, this returns a guaranteed flip in the form of an X 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}
                        0 & 1 \\
                        1 & 0
                     \end{bmatrix}
    \end{aligned}
    $$

    Args:
        p: the probability of a bit flip.

    Raises:
        ValueError: if p is not a valid probability.
    """
    if p is None:
        return pauli_gates.X

    return _bit_flip(p)
Construct a BitFlipChannel that flips a qubit state with probability p.

    If p is None, this returns a guaranteed flip in the form of an X 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}
                        0 & 1 \\
                        1 & 0
                     \end{bmatrix}
    \end{aligned}
    $$

    Args:
        p: the probability of a bit flip.

    Raises:
        ValueError: if p is not a valid probability.
    
cirq-core/cirq/ops/common_channels.py