{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e5e44fb3",
   "metadata": {},
   "source": [
    "## Ejemplo 10.2: Seguridad del protocolo BB84"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71cd75b7",
   "metadata": {},
   "source": [
    "$\\newcommand{\\ket}[1]{|{#1}\\rangle}\\newcommand{\\bra}[1]{\\langle{#1}|}$Imaginemos que en el instante $i$, Alice ha generado los bits de clave $a_i=1$ y $b_i=1$, y por tanto, ha codificado el estado $\\rho_A^{(i)} = \\Pi_{-}$.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e51496e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rhoA_i =\n",
      "\n",
      "   0.5000  -0.5000\n",
      "  -0.5000   0.5000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Definimos las bases de medida\n",
    "Pi0 = [[1,0];[0,0]];\n",
    "Pi1 = [[0,0];[0,1]];\n",
    "Pip = [[+1,+1];[+1,+1]]/2;\n",
    "Pim = [[+1,-1];[-1,+1]]/2;\n",
    "\n",
    "# Y el estado inicial para a_i = b_i = 1\n",
    "rhoA_i = Pim"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7625c52a",
   "metadata": {},
   "source": [
    "Eve conoce el esquema de codificación, pero no conoce el valor de $a_i$ ni de $b_i$, así que escoje una base al azar para realizar una medida con resultado $e_i$:\n",
    "\n",
    "- Si Eve aplica el POVM $\\{\\Pi_{0}, \\Pi_{1}\\}$, entonces $\\Pr\\bigl\\{E_i\\!=\\!0\\bigr\\} = \\Pr\\bigl\\{E_i\\!=\\!1\\bigr\\} = \\frac{1}{2}$ y el estado pasa a ser:\n",
    "\\begin{align*}\n",
    "\\rho_E^{(i)} = \\begin{cases}\n",
    "           \\Pi_{0}, & e_i=0,\\\\\n",
    "           \\Pi_{1}, & e_i=1.\n",
    "       \\end{cases}\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "746f0b09",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pr_ei_0 = 0.5000\n",
      "Pr_ei_1 = 0.5000\n",
      "rhoEi_0 =\n",
      "\n",
      "   1   0\n",
      "   0   0\n",
      "\n",
      "rhoEi_1 =\n",
      "\n",
      "   0   0\n",
      "   0   1\n",
      "\n"
     ]
    }
   ],
   "source": [
    "Pr_ei_0 = trace(Pi0*rhoA_i)\n",
    "Pr_ei_1 = trace(Pi1*rhoA_i)\n",
    "  \n",
    "rhoEi_0 = Pi0*rhoA_i*Pi0'/Pr_ei_0\n",
    "rhoEi_1 = Pi1*rhoA_i*Pi1'/Pr_ei_1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94c1b5e6",
   "metadata": {},
   "source": [
    "- Si Eve aplica el POVM correcto $\\{\\Pi_{+}, \\Pi_{-}\\}$, entonces $\\Pr\\bigl\\{E_i\\!=\\!1\\bigr\\} = 1$ y la medida siempre resulta en el bit correcto $e_i=1$. Por tanto, el estado colapsado pasa a ser $\\rho_E^{(i)} = \\rho_A^{(i)} = \\Pi_{-}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "06d51630",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pr_ei_p = 0\n",
      "Pr_ei_m = 1\n",
      "rhoEi_m =\n",
      "\n",
      "   0.5000  -0.5000\n",
      "  -0.5000   0.5000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "Pr_ei_p = trace(Pip*rhoA_i)\n",
    "Pr_ei_m = trace(Pim*rhoA_i)\n",
    "\n",
    "rhoEi_m = Pim*rhoA_i*Pim'/Pr_ei_m"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dd17406d",
   "metadata": {},
   "source": [
    "En el segundo caso, Eve puede transmitir el estado $\\rho_E^{(i)}$ a Bob y la intrusión permanecería indetectada, ya que $\\rho_E^{(i)} = \\rho_A^{(i)}$.\n",
    "Sin embargo, en el primer caso tenemos que $\\rho_E^{(i)} \\neq \\rho_A^{(i)}$. Si Eve transmite este estado $\\rho_E^{(i)}$ a Bob y éste realiza su medida en la base $\\{\\Pi_{+}, \\Pi_{-}\\}$, entonces obtendrá un resultado $\\Pr\\bigl\\{\\hat{A}_i = 0\\bigr\\} = \\Pr\\bigl\\{\\hat{A}_i = 1\\bigr\\} = \\frac{1}{2}$ independientemente del valor de $e_i$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e935943a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ei = 0\n",
      "Pr_hat_0 = 0.5000\n",
      "Pr_hat_1 = 0.5000\n",
      "ei = 1\n",
      "Pr_hat_0 = 0.5000\n",
      "Pr_hat_1 = 0.5000\n"
     ]
    }
   ],
   "source": [
    "# Medida en Bob cuando Eve utiliza la base {Pi0, Pi1} y Bob aplica la base {Pip, Pim}\n",
    "ei = 0\n",
    "Pr_hat_0 = trace(Pip*rhoEi_0)\n",
    "Pr_hat_1 = trace(Pim*rhoEi_0)\n",
    "\n",
    "ei = 1\n",
    "Pr_hat_0 = trace(Pip*rhoEi_1)\n",
    "Pr_hat_1 = trace(Pim*rhoEi_1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca7f37b0",
   "metadata": {},
   "source": [
    "Concluimos que en las posiciones donde Eve se ha equivocado en la base de medida, ya no se tiene por qué cumplir $a_i=\\hat{a}_i$, aunque coincidan las secuencias $b_i=c_i$."
   ]
  }
 ],
 "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
}
