{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e5e44fb3",
   "metadata": {},
   "source": [
    "## Ejemplo 3.3: Un fotón con incertidumbre"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82ee29fa",
   "metadata": {},
   "source": [
    "$\\newcommand{\\ket}[1]{|{#1}\\rangle}\\newcommand{\\bra}[1]{\\langle{#1}|}$Modelamos un fotón con polarización lineal $\\theta$ con el estado puro $\\ket{\\theta} = \\bigl[\\begin{smallmatrix}\\cos(\\theta)\\\\ \\sin(\\theta)\\end{smallmatrix}\\bigr]$.\n",
    "\n",
    "Consideremos un experimento que genera un fotón con una polarización bien $\\ket{\\pi/3}$ o $\\ket{\\pi/4}$, pero desconocemos cuál de ellas. Si las dos polarizaciones tienen la misma probabilidad, el estado resultante se corresponde con la *mezcla probabilística* de las matrices de densidad de cada posibilidad:\n",
    "\\begin{align*}\n",
    "  \\rho = \\frac{1}{2} \\ket{\\pi/3} \\bra{\\pi/3} + \\frac{1}{2} \\ket{\\pi/4} \\bra{\\pi/4}.\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6693906a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rho =\n",
      " [[0.375      0.46650635]\n",
      " [0.46650635 0.625     ]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "def foton(theta):\n",
    "    ket_theta = np.array([np.cos(theta), np.sin(theta)])\n",
    "    rho = np.outer(ket_theta, ket_theta)\n",
    "    return rho\n",
    "\n",
    "rho = 1/2 * foton(np.pi/3) + 1/2 * foton(np.pi/4)\n",
    "print(\"rho =\\n\", str(rho))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04c52a7e",
   "metadata": {},
   "source": [
    "Se puede comprobar que $\\rho$ cumple las propiedades de una matriz de densidad de un sistema cuántico: $\\rho\\succeq 0$, $\\rho=\\rho^H$ y $\\text{Tr}[\\rho]=1$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "5b8486fb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "autovalores_rho =  [0.01703709 0.98296291]  (se puede ver que son no negativos)\n",
      "rho es autohermitica\n",
      "traza_rho =  1.0\n"
     ]
    }
   ],
   "source": [
    "autovalores_rho, _ = np.linalg.eigh(rho)\n",
    "print(\"autovalores_rho = \", autovalores_rho, \" (se puede ver que son no negativos)\")\n",
    "\n",
    "if np.array_equal(rho, np.transpose(np.conj(rho))):\n",
    "    print('rho es autohermitica')\n",
    "else:\n",
    "    print('rho no es autohermitica')\n",
    "\n",
    "traza_rho = np.trace(rho)\n",
    "print(\"traza_rho = \", traza_rho)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3271a5ba",
   "metadata": {},
   "source": [
    "Además en este caso, el estado resultante es un estado mixto, ya que el rango de $\\rho$ es igual a $2 > 1$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6f653e76",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rango =  2\n"
     ]
    }
   ],
   "source": [
    "# Calculamos su rango con el comando:\n",
    "rango = np.linalg.matrix_rank(rho)\n",
    "print(\"rango = \", rango)"
   ]
  }
 ],
 "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
}
