Skip to content

bitflip

Implements the bitflip quantum gate channel.

bitflip

bitflip(input_mat: ndarray | None = None, prob: float = 0) -> ndarray | list[ndarray]

Apply the bitflip quantum channel to a state or return the Kraus operators.

The bitflip channel is a quantum channel that flips a qubit from \(|0\rangle\) to \(|1\rangle\) and from \(|1\rangle\) to \(|0\rangle\) with probability \(p\). It is defined by the following operation:

\[ \mathcal{E}(\rho) = (1-p) \rho + p X \rho X \]

where \(X\) is the Pauli-X (NOT) gate given by:

\[ X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} \]

The Kraus operators for this channel are:

\[ K_0 = \sqrt{1-p} \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}, \quad K_1 = \sqrt{p} \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} \]

Examples:

We can generate the Kraus operators for the bitflip channel with probability 0.3:

from toqito.channels import bitflip

print(bitflip(prob=0.3))

[array([[0.83666003, 0. ], [0. , 0.83666003]]), array([[0. , 0.54772256], [0.54772256, 0. ]])]

We can also apply the bitflip channel to a quantum state. For the state \(|0\rangle\), the bitflip channel with probability 0.3 produces:

import numpy as np
from toqito.channels import bitflip

rho = np.array([[1, 0], [0, 0]])  # |0><0|
print(bitflip(rho, prob=0.3))

[[0.7+0.j 0. +0.j] [0. +0.j 0.3+0.j]]

Parameters:

  • input_mat (ndarray | None, default: None ) –

    A matrix or state to apply the channel to. If None, returns the Kraus operators.

  • prob (float, default: 0 ) –

    The probability of a bitflip occurring.

Returns:

  • ndarray | list[ndarray]

    Either the Kraus operators of the bitflip channel if input_mat is None, or the result of applying the

  • ndarray | list[ndarray]

    channel to input_mat.

Source code in toqito/channels/bitflip.py
def bitflip(
    input_mat: np.ndarray | None = None,
    prob: float = 0,
) -> np.ndarray | list[np.ndarray]:
    r"""Apply the bitflip quantum channel to a state or return the Kraus operators.

    The *bitflip channel* is a quantum channel that flips a qubit from \(|0\rangle\) to \(|1\rangle\)
    and from \(|1\rangle\) to \(|0\rangle\) with probability \(p\).
    It is defined by the following operation:

    \[
        \mathcal{E}(\rho) = (1-p) \rho + p X \rho X
    \]

    where \(X\) is the Pauli-X (NOT) gate given by:

    \[
        X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}
    \]

    The Kraus operators for this channel are:

    \[
        K_0 = \sqrt{1-p} \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}, \quad
        K_1 = \sqrt{p} \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}
    \]

    Examples:
        We can generate the Kraus operators for the bitflip channel with probability 0.3:

        ```python exec="1" source="above"
        from toqito.channels import bitflip

        print(bitflip(prob=0.3))
        ```


        We can also apply the bitflip channel to a quantum state. For the state \(|0\rangle\),
        the bitflip channel with probability 0.3 produces:

        ```python exec="1" source="above"
        import numpy as np
        from toqito.channels import bitflip

        rho = np.array([[1, 0], [0, 0]])  # |0><0|
        print(bitflip(rho, prob=0.3))
        ```

    Args:
        input_mat: A matrix or state to apply the channel to. If `None`, returns the Kraus operators.
        prob: The probability of a bitflip occurring.

    Returns:
        Either the Kraus operators of the bitflip channel if `input_mat` is `None`, or the result of applying the
        channel to `input_mat`.

    """
    if not (0 <= prob <= 1):
        raise ValueError("Probability must be between 0 and 1.")

    k0 = np.sqrt(1 - prob) * np.eye(2)
    k1 = np.sqrt(prob) * np.array([[0, 1], [1, 0]])

    if input_mat is not None and input_mat.shape != (2, 2):
        raise ValueError("Input matrix must be 2x2 for the bitflip channel.")
    elif input_mat is None:
        return [k0, k1]

    input_mat = np.asarray(input_mat, dtype=complex)

    return k0 @ input_mat @ k0.conj().T + k1 @ input_mat @ k1.conj().T