{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e5e44fb3",
   "metadata": {},
   "source": [
    "## Ejemplo 4.1: Un sobre cerrado"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71cd75b7",
   "metadata": {},
   "source": [
    "$\\newcommand{\\ket}[1]{|{#1}\\rangle}\\newcommand{\\bra}[1]{\\langle{#1}|}\\DeclareMathOperator{\\Tr}{Tr}$En un sobre se introduce aleatoriamente un disco de color blanco o negro con una cierta probabilidad. El sobre se cierra a continuación sin conocer cuál es su contenido:\n",
    "\n",
    "<img src=\"figs/envelope-experiment.svg\" alt=\"envelope-experiment\" style=\"width: 80px;\"/>\n",
    "\n",
    "Como inicialmente no conocemos qué hay dentro del sobre, este experimento se puede modelar como una variable aleatoria $X$ de acuerdo a una Bernoulli con parametro $p$. Ahora, imaginemos que abrimos el sobre, observamos su contenido y lo volvemos a cerrar. La primera vez que hacemos este proceso podemos observar 'blanco' o 'negro' de forma aleatoria."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e51496e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rhoX =\n",
      " [[0.75 0.  ]\n",
      " [0.   0.25]]\n",
      "\n",
      "Pr[X=1] = 0.25 \n",
      "Pr[X=0] = 0.75\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "Pi0 = np.array([[1, 0], [0, 0]])\n",
    "Pi1 = np.array([[0, 0], [0, 1]])\n",
    "\n",
    "p = 0.25\n",
    "rhoX = np.array([[1-p, 0], [0, p]])\n",
    "print(\"rhoX =\\n\", str(rhoX))\n",
    "\n",
    "p0 = np.trace(Pi0 @ rhoX)\n",
    "p1 = np.trace(Pi1 @ rhoX)\n",
    "\n",
    "print(\"\\nPr[X=1] =\", str(p1), \"\\nPr[X=0] =\", str(p0))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82ee29fa",
   "metadata": {},
   "source": [
    "Sin embargo, una vez realizada esta observación (o medida) el contenido del sobre ya es conocido, y por mucho que lo cerremos y lo volvamos a abrir varias veces, su contenido ya no cambiará. De esta forma, después de la primera observación, la variable aleatoria $X$ pasa ser determinista al estar en un estado definido."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6693906a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rhoXprime_0 =\n",
      " [[1. 0.]\n",
      " [0. 0.]]\n",
      "rhoXprime_1 =\n",
      " [[0. 0.]\n",
      " [0. 1.]]\n"
     ]
    }
   ],
   "source": [
    "rhoXprime_0 = Pi0 @ rhoX @ Pi0.conj().T / np.trace(Pi0 @ rhoX)\n",
    "print(\"rhoXprime_0 =\\n\", str(rhoXprime_0))\n",
    "rhoXprime_1 = Pi1 @ rhoX @ Pi1.conj().T / np.trace(Pi1 @ rhoX)\n",
    "print(\"rhoXprime_1 =\\n\", str(rhoXprime_1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04c52a7e",
   "metadata": {},
   "source": [
    "Por otra parte, si realizamos la medida (abrimos el sobre) pero sin observar su resultado, el valor de  \n",
    "$X$ seguiría siendo desconocido y por tanto aleatorio. La nueva matriz de densidad de probabilidad tras la medida pasaría a ser en este caso:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5b8486fb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rhoXprime =\n",
      " [[0.75 0.  ]\n",
      " [0.   0.25]]\n"
     ]
    }
   ],
   "source": [
    "rhoXprime = Pi0 @ rhoX @ Pi0.conj().T + Pi1 @ rhoX @ Pi1.conj().T\n",
    "print(\"rhoXprime =\\n\", str(rhoXprime))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3271a5ba",
   "metadata": {},
   "source": [
    "Concluimos que el proceso de medida (sin observar el contenido del sobre) no ha afectado al estado, ya que $\\rho_X'=\\rho_X$.\n",
    "A pesar de que esto último puede parecer intuitivo, veremos que en el caso de aplicar una medida a un estado cuántico, ésta puede afectar al estado incluso si no observamos su resultado."
   ]
  }
 ],
 "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
}
