{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e5e44fb3",
   "metadata": {},
   "source": [
    "## Ejemplo 8.2: Transmisión de un bit clásico"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71cd75b7",
   "metadata": {},
   "source": [
    "$\\newcommand{\\ket}[1]{|{#1}\\rangle}\\newcommand{\\bra}[1]{\\langle{#1}|}$Considere el canal definido por \n",
    "\\begin{align*}\n",
    "    \\text{U} = \\left[\\begin{smallmatrix}0 &1\\\\1&0\\end{smallmatrix}\\right],\n",
    "\\end{align*}\n",
    "y el esquema descrito anterioremente para la transmisión de un bit $m=0$:"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31a30628",
   "metadata": {},
   "source": [
    "\n",
    "1. El codificador genera un estado a la entrada del canal\n",
    "\\begin{align*}\n",
    "  \\rho = \\ket{0}\\bra{0} = \\left[\\begin{smallmatrix}1 &0\\\\0&0\\end{smallmatrix}\\right].\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e51496e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "m = 0 \n",
      "rho =\n",
      " [[1 0]\n",
      " [0 0]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "m = 0\n",
    "ket0 = np.array([[1], [0]])\n",
    "rho = np.outer(ket0, ket0)\n",
    "print('m =', m, '\\nrho =\\n', rho)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7625c52a",
   "metadata": {},
   "source": [
    "2. A la salida del canal recibimos el estado\n",
    "\\begin{align*}\n",
    "  \\sigma = U\\rho U^H = \\left[\\begin{smallmatrix}0 &1\\\\1&0\\end{smallmatrix}\\right] \\left[\\begin{smallmatrix}1 &0\\\\0&0\\end{smallmatrix}\\right] \\left[\\begin{smallmatrix}0 &1\\\\1&0\\end{smallmatrix}\\right] = \\left[\\begin{smallmatrix}0 &0\\\\0&1\\end{smallmatrix}\\right].\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "746f0b09",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "U =\n",
      " [[0 1]\n",
      " [1 0]] \n",
      "sigma = U @ rho @ U.H =\n",
      " [[0 0]\n",
      " [0 1]]\n"
     ]
    }
   ],
   "source": [
    "U = np.array([[0, 1], [1, 0]])\n",
    "sigma = U @ rho @ U.conj().T\n",
    "print('U =\\n', U, '\\nsigma = U @ rho @ U.H =\\n', sigma)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94c1b5e6",
   "metadata": {},
   "source": [
    "3. La medida de este estado se realiza con respecto al POVM $\\{\\tilde\\Pi_{0}, \\tilde\\Pi_{1}\\}$, donde \n",
    "\\begin{align*}\n",
    "  \\tilde\\Pi_{0} = U \\Pi_{0} U^{H}  = \\left[\\begin{smallmatrix}0 &0\\\\0&1\\end{smallmatrix}\\right],\\qquad\n",
    "  \\tilde\\Pi_{1} = U \\Pi_{1} U^{H}  = \\left[\\begin{smallmatrix}1 &0\\\\0&0\\end{smallmatrix}\\right].\n",
    "\\end{align*}\n",
    "Así las probabilidades de observar $\\hat{m}=0$ y $\\hat{m}=1$ están dadas por\n",
    "\\begin{align*}\n",
    "  \\Pr\\{ \\hat{M}=0 \\;|\\; M=0 \\}\n",
    "  &= \\text{Tr}\\bigl[\\tilde\\Pi_{0} \\sigma_0\\bigr]\n",
    "    = \\text{Tr}\\Bigl[\\left[\\begin{smallmatrix}0 &0\\\\0&1\\end{smallmatrix}\\right] \\left[\\begin{smallmatrix}0 &0\\\\0&1\\end{smallmatrix}\\right]\\Bigr] = 1,\\\\\n",
    "  \\Pr\\{ \\hat{M}=1 \\;|\\; M=0 \\}\n",
    "  &= \\text{Tr}\\bigl[\\tilde\\Pi_{1} \\sigma_0\\bigr]\n",
    "    = \\text{Tr}\\Bigl[\\left[\\begin{smallmatrix}1 &0\\\\0&0\\end{smallmatrix}\\right] \\left[\\begin{smallmatrix}0 &0\\\\0&1\\end{smallmatrix}\\right]\\Bigr] = 0.\n",
    "\\end{align*}\n",
    "Concluimos que siempre se observa el estado correcto, $\\hat{m}=0$ con probabilidad $1$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "dfd352b5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pr_m0 = 1 \n",
      "Pr_m1 = 0\n"
     ]
    }
   ],
   "source": [
    "Pi0tilde = np.array([[0, 0], [0, 1]])\n",
    "Pi1tilde = np.array([[1, 0], [0, 0]])\n",
    "\n",
    "Pr_m0 = np.trace(Pi0tilde @ sigma)\n",
    "Pr_m1 = np.trace(Pi1tilde @ sigma)\n",
    "\n",
    "print('Pr_m0 =', Pr_m0, '\\nPr_m1 =', Pr_m1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd44255a",
   "metadata": {},
   "source": [
    "De forma análoga se puede analizar la transmisión de un bit $m=1$, observando\n",
    "$\\hat{m}=1$ en este caso:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "cbb0598a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "m = 1 \n",
      "rho =\n",
      " [[0 0]\n",
      " [0 1]]\n",
      "\n",
      "sigma = U @ rho @ U.H =\n",
      " [[1 0]\n",
      " [0 0]]\n",
      "\n",
      "Pr_m0 = 0 \n",
      "Pr_m1 = 1\n"
     ]
    }
   ],
   "source": [
    "m = 1\n",
    "ket1 = np.array([[0], [1]])\n",
    "rho = np.outer(ket1, ket1)\n",
    "print('m =', m, '\\nrho =\\n', rho)\n",
    "sigma = U @ rho @ U.conj().T\n",
    "print('\\nsigma = U @ rho @ U.H =\\n', sigma)\n",
    "Pr_m0 = np.trace(Pi0tilde @ sigma)\n",
    "Pr_m1 = np.trace(Pi1tilde @ sigma)\n",
    "print('\\nPr_m0 =', Pr_m0, '\\nPr_m1 =', Pr_m1)"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Raw Cell Format",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
