{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e5e44fb3",
   "metadata": {},
   "source": [
    "## Ejercicio 9.2: Simulación del teletransporte cuántico"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71cd75b7",
   "metadata": {},
   "source": [
    "$\\newcommand{\\ket}[1]{|{#1}\\rangle}\\newcommand{\\bra}[1]{\\langle{#1}|}$Utilizando un entorno de programación matemática, simule el protocolo de teletransporte cuántico para transmitir el estado:\n",
    "\n",
    "\\begin{align*}\n",
    "  \\mu = \\begin{bmatrix} 3/4 & 1/8\\\\ 1/8 & 1/4 \\end{bmatrix}.\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "360c36ed",
   "metadata": {},
   "source": [
    "*Definimos el estado a transmitir:*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "4ee09e72",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mu =\n",
      "\n",
      "   0.7500   0.1250\n",
      "   0.1250   0.2500\n",
      "\n"
     ]
    }
   ],
   "source": [
    "mu = [3/4, 1/8; 1/8, 1/4]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8317822a",
   "metadata": {},
   "source": [
    "*El protocolo de teletransporete está ilustrado en el siguiente diagrama de bloques:*\n",
    "\n",
    "<img src=\"figs/protocol-teleportation.svg\" alt=\"Diagrama de bloques del protocolo de teletransporte cuántico\" style=\"width:380px;\"/>\n",
    "\n",
    "*Vamos a simular el protocolo de teletransporte paso a paso:*\n",
    "\n",
    "**Paso 1:** Alice y Bob comparten un ebit formado por $\\rho^A$ y $\\sigma^B$, descrito por el estado compuesto\n",
    "\n",
    "\\begin{align*}\n",
    "   \\delta^{AB} = \\dfrac{1}{2} \\left[\\begin{smallmatrix}\n",
    "                 1 & 0 & 0 & 1\\\\\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                 1 & 0 & 0 & 1 \\end{smallmatrix}\\right].\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e51496e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generamos el estado entrelazado compartido:\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26fe0e28",
   "metadata": {},
   "source": [
    "**Paso 2:** Alice tiene acceso al cúbit $\\mu^A = \\mu$ a transmitir y aplica una medida conjunta sobre $\\mu^A$ y su parte $\\rho^A$ del ebit compartido utilizando el POVM  $\\bigl\\{\\Pi_{0}, \\Pi_{1}, \\Pi_{2}, \\Pi_{3}\\bigr\\}$ visto en el protocolo de codificación superdensa, tal que\n",
    "\n",
    "\\begin{align*}\n",
    "   \\Pi_{0} = \\dfrac{1}{2} \\left[\\begin{smallmatrix}\n",
    "                 1 & 0 & 0 & 1\\\\\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                 1 & 0 & 0 & 1 \\end{smallmatrix}\\right],\\quad\n",
    "   \\Pi_{1} = \\dfrac{1}{2} \\left[\\begin{smallmatrix}\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                 0 & 1 & 1 & 0\\\\\n",
    "                 0 & 1 & 1 & 0\\\\\n",
    "                 0 & 0 & 0 & 0 \\end{smallmatrix}\\right],\\quad\n",
    "   \\Pi_{2} = \\dfrac{1}{2} \\left[\\begin{smallmatrix}\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                 0 & 1 &-1 & 0\\\\\n",
    "                 0 &-1 & 1 & 0\\\\\n",
    "                 0 & 0 & 0 & 0 \\end{smallmatrix}\\right],\\quad\n",
    "   \\Pi_{3} = \\dfrac{1}{2} \\left[\\begin{smallmatrix}\n",
    "                 1 & 0 & 0 &-1\\\\\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                 0 & 0 & 0 & 0\\\\\n",
    "                -1 & 0 & 0 & 1 \\end{smallmatrix}\\right].\n",
    "\\end{align*}\n",
    "\n",
    "Para poder modelar esta medida, es necesario considerar el estado del sistema completo, dado por \n",
    "\n",
    "\\begin{align*}\n",
    "  \\theta^{AAB} = \\mu^A\\otimes\\delta^{AB}.\n",
    "\\end{align*}\n",
    "\n",
    "En la medida Alice observa un resultado $m\\in\\{0,1,2,3\\}$, por lo que el estado conjunto pasa a ser\n",
    "\n",
    "\\begin{align*}\n",
    "  \\theta^{AAB}_m = \\frac{1}{p_m}\\bigl( \\Pi_{m} \\otimes I_2\\bigr) \\theta^{AAB}\n",
    "                   \\bigl( \\Pi_{m}^H \\otimes I_2\\bigr).\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "03e0cf41",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# Generamos el estado conjunto incluyendo el estado muA y el ebit compartido\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2121b9c1",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# Definimos el POVM para la medida\n",
    "\n",
    "# Aplicamos la medida. El estado resultante en función del valor observado es\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e46cf38",
   "metadata": {},
   "source": [
    "**Paso 3:** Alice envía el resultado de la medida $m\\in\\{0,1,2,3\\}$ (equivalente a dos bits de información clásica)\n",
    "a Bob utilizando dos usos de un canal clásico ideal, por lo que Bob conoce a cuál de las 4 opciones ha colapsado el sistema."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32f9c1fb",
   "metadata": {},
   "source": [
    "**Paso 4:**  En función del valor de $m$ recibido, Bob aplica una puerta de Pauli $\\{I,X,Y,Z\\}$ a su parte $\\sigma^B$ del\n",
    "estado global $\\theta^{AAB}_m$. Para modelar este proceso, definimos las matrices unitarias correspondientes al\n",
    "sistema completo:\n",
    "\n",
    "\\begin{align*}\n",
    "  &U_0^{AAB} = I_2 \\otimes I_2 \\otimes I,\\quad\n",
    "  &U_1^{AAB} = I_2 \\otimes I_2 \\otimes X,\\\\\n",
    "  &U_2^{AAB} = I_2 \\otimes I_2 \\otimes Y,\\quad\n",
    "  &U_3^{AAB} = I_2 \\otimes I_2 \\otimes Z,\n",
    "\\end{align*}\n",
    "\n",
    "y obtenemos el nuevo estado tras aplicar la transformación correspondiente\n",
    "\n",
    "\\begin{align*}\n",
    "  \\phi^{AAB}_m = U_m^{AAB} \\theta^{AAB}_m \\bigl(U_m^{AAB}\\bigr)^H,\\quad m=0,1,2,3.\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "a05f194e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Preparamos las transformaciones a aplicar al estado completo\n",
    "\n",
    "# Aplicamos la transformación correspondiente para cada valor de m\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "472140be",
   "metadata": {},
   "source": [
    "**Paso 5:** Como resultado de aplicar esta operación, la parte $\\sigma^B$ del estado compuesto se transforma en el estado $\\mu$\n",
    "que se desaba transmitir. Para ver esto marginalizamos el estado compuesto $\\phi^{AAB}_m$ por medio de la traza parcial\n",
    "\n",
    "\\begin{align*}\n",
    "  \\sigma_m^B = \\text{Tr}_{AA} \\bigl[ \\phi^{AAB}_m \\bigr],\n",
    "\\end{align*}\n",
    "\n",
    "y se puede comprobar que $\\sigma_m^B = \\mu$.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f0875c3f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# La marginalización de las dos partes de Alice se puede llevar a cabo con esta operación:\n",
    "function [sigmaB] = traceAA(phiAAB)\n",
    "  sigmaB = phiAAB(1:2,1:2) + phiAAB(3:4,3:4) + phiAAB(5:6,5:6) + phiAAB(7:8,7:8);\n",
    "end  \n",
    "\n",
    "# La aplicamos para cada una de las posibilidades\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85d0c851",
   "metadata": {},
   "source": [
    "**Cuestión 1.** Compruebe que el estado de salida $\\mu^B$ coincide con el estado original."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "204ca002",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94c1b5e6",
   "metadata": {},
   "source": [
    "**Cuestión 2.** Compruebe que el estado original se ha destruido en el proceso.\n",
    "\n",
    "*Para ver como ha quedado la parte $\\mu^A$ en Alice, es necesario descartar la parte $\\rho^A$ y $\\sigma^B$ del sistema completo. Esto se puede hacer con la siguinete operación de traza parcial:*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f2f5d36f",
   "metadata": {},
   "outputs": [],
   "source": [
    "function [muA] = traceAB(phiAAB)\n",
    "  muA = [trace(phiAAB(1:4,1:4)), trace(phiAAB(1:4,5:8)); trace(phiAAB(5:8,1:4)), trace(phiAAB(5:8,5:8))];\n",
    "end\n",
    "\n",
    "# La aplicamos para cada una de las posibilidades\n"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Raw Cell Format",
  "kernelspec": {
   "display_name": "Octave",
   "language": "octave",
   "name": "octave"
  },
  "language_info": {
   "file_extension": ".m",
   "help_links": [
    {
     "text": "GNU Octave",
     "url": "https://www.gnu.org/software/octave/support.html"
    },
    {
     "text": "Octave Kernel",
     "url": "https://github.com/Calysto/octave_kernel"
    },
    {
     "text": "MetaKernel Magics",
     "url": "https://metakernel.readthedocs.io/en/latest/source/README.html"
    }
   ],
   "mimetype": "text/x-octave",
   "name": "octave",
   "version": "8.2.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
