Source code for toqito.channels.bitflip

"""Implements the bitflip quantum gate channel."""

import numpy as np


[docs] 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