{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e5e44fb3",
   "metadata": {},
   "source": [
    "## Ejemplo 8.1: Transmisión de un cúbit"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71cd75b7",
   "metadata": {},
   "source": [
    "$\\newcommand{\\ket}[1]{|{#1}\\rangle}\\newcommand{\\bra}[1]{\\langle{#1}|}$Queremos transmitir un estado cuántico binario\n",
    "   $\\rho = \\ket{0}\\bra{0} = \\left[\\begin{smallmatrix}1&0\\\\0&0\\end{smallmatrix}\\right]$\n",
    "sobre un canal\n",
    "\\begin{align*}\n",
    "      U = \\frac{1}{\\sqrt{2}} \\left[\\begin{matrix}+1&+1\\\\+1&-1\\end{matrix}\\right],\\quad U^H = U,\n",
    "\\end{align*}\n",
    "donde la matriz $U$ se asume conocida en el receptor.\n",
    "En este caso, la salida del canal está dada por\n",
    "\\begin{align*}\n",
    "\\sigma = U \\rho U^{H}\n",
    "        = \\frac{1}{2} \\left[\\begin{matrix}1&1\\\\1&1\\end{matrix}\\right].\n",
    "\\end{align*}\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e51496e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rho =\n",
      " [[1 0]\n",
      " [0 0]] \n",
      "U =\n",
      " [[ 0.70710678  0.70710678]\n",
      " [ 0.70710678 -0.70710678]] \n",
      "sigma =\n",
      " [[0.5 0.5]\n",
      " [0.5 0.5]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "ket0 = np.array([[1], [0]])\n",
    "rho = ket0@ket0.conj().T\n",
    "U = np.array([[1, 1], [1, -1]]) / np.sqrt(2)\n",
    "sigma = U @ rho @ U.conj().T\n",
    "\n",
    "print('rho =\\n', rho, '\\nU =\\n', U, '\\nsigma =\\n', sigma)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7625c52a",
   "metadata": {},
   "source": [
    "Para recuperar el estado original, invertimos la transformación introducida por el canal\n",
    "\\begin{align*}\n",
    "    \\hat\\rho &= U^{H} \\sigma U =\n",
    "    \\frac{1}{4} \\left[\\begin{matrix}1&1\\\\1&-1\\end{matrix}\\right]\n",
    "                 \\left[\\begin{matrix}1&1\\\\1&1\\end{matrix}\\right]\n",
    "                 \\left[\\begin{matrix}1&1\\\\1&-1\\end{matrix}\\right]\n",
    "        = \\left[\\begin{matrix}1&0\\\\0&0\\end{matrix}\\right] = \\rho.\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "746f0b09",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rho_hat =\n",
      " [[1.00000000e+00 6.22328532e-19]\n",
      " [3.25176795e-17 5.97792087e-34]]\n"
     ]
    }
   ],
   "source": [
    "rho_hat = U.conj().T @ sigma @ U\n",
    "\n",
    "print('rho_hat =\\n', rho_hat)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94c1b5e6",
   "metadata": {},
   "source": [
    "Podemos ver que hemos recuperado el estado original. Esto ocurre no solo para el estado considerado en este ejercicio, sino para para cualquier estado $\\rho$ a la entrada del canal. Entonces, con este esquema podemos transmitir sin errores un cúbit de información a través de este canal cuántico binario."
   ]
  }
 ],
 "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
}
