{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0445b418",
   "metadata": {},
   "source": [
    "# Introducción a números complejos I\n",
    "\n",
    "Este notebook desarrolla de forma autoexplicativa los fundamentos de números complejos necesarios para álgebra lineal compleja y computación cuántica elemental. El énfasis está en la interpretación geométrica, el cálculo reproducible y la conexión entre amplitudes complejas y probabilidades.\n",
    "\n",
    "La notación de Dirac se escribe de forma compatible con JupyterLab, Anaconda y Google Colab. Se usan expresiones LaTeX completas como\n",
    "\n",
    "$$\n",
    "\\left|0\\right\\rangle,\\qquad \\left\\langle \\psi \\right|,\\qquad \\left\\langle \\phi\\middle|\\psi\\right\\rangle.\n",
    "$$\n",
    "\n",
    "No se requieren macros personalizadas para que las fórmulas se rendericen correctamente."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "854a12ac",
   "metadata": {},
   "source": [
    "## 1. Objetivos de aprendizaje\n",
    "\n",
    "Al terminar este notebook podrás representar números complejos en forma rectangular, polar y exponencial; interpretar conjugado, módulo y argumento en el plano complejo; normalizar vectores complejos; calcular productos internos; aplicar la regla de Born; verificar matrices unitarias; y usar Python/NumPy/Matplotlib para visualizar y comprobar los resultados."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1e0f3906",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import cmath\n",
    "from math import sqrt, pi, atan2\n",
    "\n",
    "plt.rcParams[\"figure.figsize\"] = (6.5, 4.8)\n",
    "plt.rcParams[\"axes.grid\"] = True\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "676bbaf3",
   "metadata": {},
   "source": [
    "## 2. Números complejos y plano complejo\n",
    "\n",
    "Un número complejo tiene la forma\n",
    "\n",
    "$$\n",
    "z=a+b\\,i,\n",
    "$$\n",
    "\n",
    "donde $a$ es la parte real, $b$ la parte imaginaria e $i^2=-1$. Geométricamente, $z$ se representa como el punto $(a,b)$ del plano. Esta representación permite interpretar el módulo como distancia al origen y el argumento como ángulo respecto al eje real positivo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "02851a5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_complex_points(points, labels=None, title=\"Plano complejo\"):\n",
    "    \"\"\"Dibuja números complejos como vectores desde el origen.\"\"\"\n",
    "    labels = labels or [str(z) for z in points]\n",
    "    fig, ax = plt.subplots()\n",
    "    ax.axhline(0, linewidth=1)\n",
    "    ax.axvline(0, linewidth=1)\n",
    "    for z, label in zip(points, labels):\n",
    "        ax.arrow(0, 0, z.real, z.imag, length_includes_head=True,\n",
    "                 head_width=0.08, head_length=0.12)\n",
    "        ax.scatter([z.real], [z.imag])\n",
    "        ax.text(z.real + 0.08, z.imag + 0.08, label)\n",
    "    max_val = max(1.0, max(abs(z.real) + 0.5 for z in points), max(abs(z.imag) + 0.5 for z in points))\n",
    "    ax.set_xlim(-max_val, max_val)\n",
    "    ax.set_ylim(-max_val, max_val)\n",
    "    ax.set_aspect(\"equal\", adjustable=\"box\")\n",
    "    ax.set_xlabel(\"Parte real\")\n",
    "    ax.set_ylabel(\"Parte imaginaria\")\n",
    "    ax.set_title(title)\n",
    "    plt.show()\n",
    "\n",
    "z = 2 + 3j\n",
    "plot_complex_points([z], [\"z = 2 + 3i\"], \"Representación de un complejo\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf537dcb",
   "metadata": {},
   "source": [
    "## 3. Conjugación compleja\n",
    "\n",
    "El conjugado de $z=a+bi$ es\n",
    "\n",
    "$$\n",
    "\\overline{z}=a-bi.\n",
    "$$\n",
    "\n",
    "Geométricamente, la conjugación refleja el punto respecto al eje real. Algebraicamente, permite formar la cantidad real no negativa $z\\overline z=|z|^2$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "11f607af",
   "metadata": {},
   "outputs": [],
   "source": [
    "z = 2 + 3j\n",
    "zc = z.conjugate()\n",
    "print(\"z =\", z)\n",
    "print(\"conjugado =\", zc)\n",
    "print(\"z * conjugado =\", z * zc)\n",
    "plot_complex_points([z, zc], [\"z\", \"conjugado\"], \"Conjugación como reflexión\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4d8ca8b",
   "metadata": {},
   "source": [
    "## 4. Módulo y argumento\n",
    "\n",
    "El módulo de $z=a+bi$ es\n",
    "\n",
    "$$\n",
    "|z|=\\sqrt{a^2+b^2}.\n",
    "$$\n",
    "\n",
    "El argumento es un ángulo $\\theta$ que localiza la dirección del vector. Para evitar errores de cuadrante se usa `atan2(b,a)` o `cmath.phase(z)`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b77f0f68",
   "metadata": {},
   "outputs": [],
   "source": [
    "z = 2 - 3j\n",
    "r = abs(z)\n",
    "theta = cmath.phase(z)\n",
    "print(\"módulo:\", r)\n",
    "print(\"argumento principal:\", theta)\n",
    "plot_complex_points([z], [\"2 - 3i\"], \"Número en el cuarto cuadrante\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "edb5792e",
   "metadata": {},
   "source": [
    "## 5. Forma polar y fórmula de Euler\n",
    "\n",
    "La forma polar de un complejo no nulo es\n",
    "\n",
    "$$\n",
    "z=r(\\cos\\theta+i\\sin\\theta).\n",
    "$$\n",
    "\n",
    "La fórmula de Euler permite escribirla de manera compacta:\n",
    "\n",
    "$$\n",
    "e^{i\\theta}=\\cos\\theta+i\\sin\\theta,\\qquad z=re^{i\\theta}.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b4c5c543",
   "metadata": {},
   "outputs": [],
   "source": [
    "theta_values = np.linspace(0, 2*np.pi, 200)\n",
    "circle = np.exp(1j * theta_values)\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(circle.real, circle.imag)\n",
    "for th in [0, np.pi/3, np.pi/2, np.pi, 3*np.pi/2]:\n",
    "    point = np.exp(1j * th)\n",
    "    ax.scatter(point.real, point.imag)\n",
    "    ax.text(point.real + 0.05, point.imag + 0.05, f\"{th/np.pi:.2g}π\")\n",
    "ax.axhline(0, linewidth=1)\n",
    "ax.axvline(0, linewidth=1)\n",
    "ax.set_aspect(\"equal\", adjustable=\"box\")\n",
    "ax.set_title(\"Círculo unidad y exponencial compleja\")\n",
    "ax.set_xlabel(\"Parte real\")\n",
    "ax.set_ylabel(\"Parte imaginaria\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f0e5a74",
   "metadata": {},
   "source": [
    "## 6. Ejemplo: convertir $2e^{i\\pi/3}$ a forma rectangular\n",
    "\n",
    "Usando Euler:\n",
    "\n",
    "$$\n",
    "2e^{i\\pi/3}=2\\left(\\cos\\frac{\\pi}{3}+i\\sin\\frac{\\pi}{3}\\right)=1+\\sqrt{3}\\,i.\n",
    "$$\n",
    "\n",
    "El resultado indica que el vector tiene módulo $2$, ángulo $60^\\circ$, coordenada real $1$ y coordenada imaginaria $\\sqrt3$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1bc4e53d",
   "metadata": {},
   "outputs": [],
   "source": [
    "z = 2 * np.exp(1j * np.pi/3)\n",
    "print(z)\n",
    "print(\"parte real:\", np.real(z))\n",
    "print(\"parte imaginaria:\", np.imag(z))\n",
    "plot_complex_points([z], [r\"$2e^{i\\pi/3}$\"], \"Forma exponencial a rectangular\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b751fcd",
   "metadata": {},
   "source": [
    "## 7. Suma y producto como geometría\n",
    "\n",
    "La suma de complejos desplaza puntos como vectores. El producto, en cambio, combina escala y orientación. Si\n",
    "\n",
    "$$\n",
    "z_1=r_1e^{i\\theta_1},\\qquad z_2=r_2e^{i\\theta_2},\n",
    "$$\n",
    "\n",
    "entonces\n",
    "\n",
    "$$\n",
    "z_1z_2=r_1r_2e^{i(\\theta_1+\\theta_2)}.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "54c6f8e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "z1 = 1 + 1j\n",
    "z2 = 1j\n",
    "product = z1 * z2\n",
    "plot_complex_points([z1, z2, product], [\"1+i\", \"i\", \"(1+i)i\"], \"Multiplicación por i como giro de 90 grados\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1762a821",
   "metadata": {},
   "source": [
    "## 8. Vectores complejos y norma\n",
    "\n",
    "Un vector complejo en $\\mathbb C^n$ es una lista ordenada de complejos. Su norma euclidiana se define como\n",
    "\n",
    "$$\n",
    "\\|v\\|=\\sqrt{\\sum_i |v_i|^2}.\n",
    "$$\n",
    "\n",
    "Esta definición es la que permite hablar de estados cuánticos normalizados."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8e2aef4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "v = np.array([1 + 1j, 2], dtype=complex)\n",
    "norm_v = np.sqrt(np.vdot(v, v).real)\n",
    "print(\"v =\", v)\n",
    "print(\"norma =\", norm_v)\n",
    "print(\"vector normalizado =\", v / norm_v)\n",
    "print(\"norma del normalizado =\", np.vdot(v/norm_v, v/norm_v))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "453e18f8",
   "metadata": {},
   "source": [
    "## 9. Producto interno complejo\n",
    "\n",
    "Para $u,v\\in\\mathbb C^n$, usamos\n",
    "\n",
    "$$\n",
    "\\langle u,v\\rangle=\\sum_i \\overline{u_i}v_i.\n",
    "$$\n",
    "\n",
    "La conjugación del primer argumento garantiza que $\\langle v,v\\rangle=\\sum_i |v_i|^2$ sea real y no negativa."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d54439f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "u = np.array([1, 1j], dtype=complex)\n",
    "v = np.array([1j, 1], dtype=complex)\n",
    "print(\"np.vdot(u, v) =\", np.vdot(u, v))\n",
    "print(\"np.vdot(v, v) =\", np.vdot(v, v))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc2bc179",
   "metadata": {},
   "source": [
    "## 10. Kets, bras y conjugado transpuesto\n",
    "\n",
    "En notación de Dirac, un ket es un vector columna. Si\n",
    "\n",
    "$$\n",
    "\\left|\\psi\\right\\rangle=\\begin{pmatrix}\\alpha\\\\\\beta\\end{pmatrix},\n",
    "$$\n",
    "\n",
    "entonces su bra asociado es\n",
    "\n",
    "$$\n",
    "\\left\\langle\\psi\\right|=\\begin{pmatrix}\\overline{\\alpha}&\\overline{\\beta}\\end{pmatrix}.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d523ea9b",
   "metadata": {},
   "outputs": [],
   "source": [
    "psi = np.array([1 + 2j, 3 - 1j], dtype=complex)\n",
    "bra = psi.conj().T\n",
    "print(\"ket psi =\", psi)\n",
    "print(\"bra psi =\", bra)\n",
    "print(\"<psi|psi> =\", bra @ psi)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed2a3bd0",
   "metadata": {},
   "source": [
    "## 11. Qubit y amplitudes complejas\n",
    "\n",
    "Un qubit puro se representa por un vector normalizado en $\\mathbb C^2$:\n",
    "\n",
    "$$\n",
    "\\left|\\psi\\right\\rangle=\\alpha\\left|0\\right\\rangle+\\beta\\left|1\\right\\rangle,\n",
    "\\qquad |\\alpha|^2+|\\beta|^2=1.\n",
    "$$\n",
    "\n",
    "Las amplitudes $\\alpha$ y $\\beta$ son complejas; las probabilidades se obtienen con módulos cuadrados."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ade245a5",
   "metadata": {},
   "outputs": [],
   "source": [
    "psi = np.array([(2-1j)/3, (np.sqrt(3)+1j)/3], dtype=complex)\n",
    "probs = np.abs(psi)**2\n",
    "print(\"amplitudes:\", psi)\n",
    "print(\"probabilidades:\", probs)\n",
    "print(\"suma:\", probs.sum())\n",
    "\n",
    "fig, axes = plt.subplots(1, 2, figsize=(10, 4))\n",
    "axes[0].axhline(0, linewidth=1); axes[0].axvline(0, linewidth=1)\n",
    "labels = [r\"$\\alpha$ para $\\left|0\\right\\rangle$\", r\"$\\beta$ para $\\left|1\\right\\rangle$\"]\n",
    "for amp, label in zip(psi, labels):\n",
    "    axes[0].arrow(0, 0, amp.real, amp.imag, length_includes_head=True, head_width=0.03)\n",
    "    axes[0].scatter(amp.real, amp.imag)\n",
    "    axes[0].text(amp.real + 0.03, amp.imag + 0.03, label)\n",
    "axes[0].set_aspect(\"equal\", adjustable=\"box\")\n",
    "axes[0].set_title(\"Amplitudes en el plano complejo\")\n",
    "axes[0].set_xlabel(\"Parte real\"); axes[0].set_ylabel(\"Parte imaginaria\")\n",
    "axes[1].bar([\"0\", \"1\"], probs)\n",
    "axes[1].set_ylim(0, 1)\n",
    "axes[1].set_title(\"Probabilidades de medición\")\n",
    "axes[1].set_ylabel(\"Probabilidad\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b44a9e3e",
   "metadata": {},
   "source": [
    "## 12. Regla de Born\n",
    "\n",
    "Si\n",
    "\n",
    "$$\n",
    "\\left|\\psi\\right\\rangle=\\alpha\\left|0\\right\\rangle+\\beta\\left|1\\right\\rangle,\n",
    "$$\n",
    "\n",
    "entonces\n",
    "\n",
    "$$\n",
    "\\Pr(0)=|\\alpha|^2,\\qquad \\Pr(1)=|\\beta|^2.\n",
    "$$\n",
    "\n",
    "La probabilidad de observar $\\left|0\\right\\rangle$ en el estado anterior es $|(2-i)/3|^2=5/9$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c5fcfcc3",
   "metadata": {},
   "outputs": [],
   "source": [
    "p0 = abs(psi[0])**2\n",
    "print(\"P(0) =\", p0)\n",
    "print(\"fracción esperada: 5/9 =\", 5/9)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "832ceb99",
   "metadata": {},
   "source": [
    "## 13. Probabilidad de un estado base en dos qubits\n",
    "\n",
    "Considera\n",
    "\n",
    "$$\n",
    "\\left|\\psi\\right\\rangle=-\\frac{2i}{\\sqrt6}\\left|01\\right\\rangle+\n",
    "\\frac{1-i}{\\sqrt6}\\left|11\\right\\rangle.\n",
    "$$\n",
    "\n",
    "La probabilidad de observar $\\left|11\\right\\rangle$ es el módulo cuadrado de su coeficiente:\n",
    "\n",
    "$$\n",
    "\\left|\\frac{1-i}{\\sqrt6}\\right|^2=\\frac{2}{6}=\\frac13.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b6322503",
   "metadata": {},
   "outputs": [],
   "source": [
    "amp_11 = (1 - 1j) / np.sqrt(6)\n",
    "print(abs(amp_11)**2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65b97ef7",
   "metadata": {},
   "source": [
    "## 14. Matrices unitarias\n",
    "\n",
    "Una matriz $U$ es unitaria si\n",
    "\n",
    "$$\n",
    "U^\\dagger U=I.\n",
    "$$\n",
    "\n",
    "Esta condición garantiza que la norma de cualquier vector se conserve, por lo que las probabilidades totales siguen sumando uno."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "302bc8c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "H = (1/np.sqrt(2)) * np.array([[1, 1], [1, -1]], dtype=complex)\n",
    "Y = np.array([[0, -1j], [1j, 0]], dtype=complex)\n",
    "Z = np.array([[1, 0], [0, -1]], dtype=complex)\n",
    "for name, U in [(\"H\", H), (\"Y\", Y), (\"Z\", Z)]:\n",
    "    print(name, np.allclose(U.conj().T @ U, np.eye(2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f1c63d1",
   "metadata": {},
   "source": [
    "## 15. Operador Hadamard\n",
    "\n",
    "Hadamard se define por\n",
    "\n",
    "$$\n",
    "H=\\frac{1}{\\sqrt2}\\begin{pmatrix}1&1\\\\1&-1\\end{pmatrix}.\n",
    "$$\n",
    "\n",
    "Aplicado a $\\left|0\\right\\rangle$, produce un vector normalizado con dos amplitudes iguales."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8bea58b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "ket0 = np.array([1, 0], dtype=complex)\n",
    "ket1 = np.array([0, 1], dtype=complex)\n",
    "print(\"H|0> =\", H @ ket0)\n",
    "print(\"H|1> =\", H @ ket1)\n",
    "print(\"norma de H|0>:\", np.vdot(H @ ket0, H @ ket0))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5e68290a",
   "metadata": {},
   "source": [
    "## 16. Operador Pauli $Y$\n",
    "\n",
    "El operador\n",
    "\n",
    "$$\n",
    "Y=\\begin{pmatrix}0&-i\\\\ i&0\\end{pmatrix}\n",
    "$$\n",
    "\n",
    "actúa sobre $(\\alpha,\\beta)^T$ como\n",
    "\n",
    "$$\n",
    "Y(\\alpha,\\beta)^T=(-i\\beta,i\\alpha)^T.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c0d0dc42",
   "metadata": {},
   "outputs": [],
   "source": [
    "state = np.array([1j/np.sqrt(6), (2+1j)/np.sqrt(6)], dtype=complex)\n",
    "result = Y @ state\n",
    "print(result)\n",
    "expected = np.array([(1-2j)/np.sqrt(6), -1/np.sqrt(6)], dtype=complex)\n",
    "print(\"coincide con el cálculo manual:\", np.allclose(result, expected))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1da86c70",
   "metadata": {},
   "source": [
    "## 17. Ejercicio guiado: normalización\n",
    "\n",
    "Sea\n",
    "\n",
    "$$\n",
    "v=\\begin{pmatrix}1-i\\\\ \\sqrt2\\end{pmatrix}.\n",
    "$$\n",
    "\n",
    "Entonces\n",
    "\n",
    "$$\n",
    "\\|v\\|^2=|1-i|^2+|\\sqrt2|^2=2+2=4,\n",
    "$$\n",
    "\n",
    "por lo que el vector normalizado es $v/2$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aeb1761c",
   "metadata": {},
   "outputs": [],
   "source": [
    "v = np.array([1-1j, np.sqrt(2)], dtype=complex)\n",
    "v_norm = v / np.sqrt(np.vdot(v, v).real)\n",
    "print(v_norm)\n",
    "print(np.vdot(v_norm, v_norm))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85ee331c",
   "metadata": {},
   "source": [
    "## 18. Ejercicio guiado: posible valor de una amplitud\n",
    "\n",
    "Si\n",
    "\n",
    "$$\n",
    "\\left|\\psi\\right\\rangle=\\begin{pmatrix}a\\\\(1-i)/2\\end{pmatrix}\n",
    "$$\n",
    "\n",
    "es válido, entonces\n",
    "\n",
    "$$\n",
    "|a|^2+\\left|\\frac{1-i}{2}\\right|^2=1.\n",
    "$$\n",
    "\n",
    "Como el segundo término vale $1/2$, se requiere $|a|^2=1/2$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ceb1122c",
   "metadata": {},
   "outputs": [],
   "source": [
    "candidates = {\n",
    "    \"(i-1)/2\": (1j - 1)/2,\n",
    "    \"i/2\": 1j/2,\n",
    "    \"(i+1)/4\": (1j + 1)/4,\n",
    "    \"-i/sqrt(2)\": -1j/np.sqrt(2),\n",
    "}\n",
    "for label, a in candidates.items():\n",
    "    print(label, \"|a|^2 =\", abs(a)**2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c85b38c2",
   "metadata": {},
   "source": [
    "## 19. Visualización de amplitudes válidas\n",
    "\n",
    "La condición $|a|^2=1/2$ significa que $a$ debe estar sobre un círculo de radio $1/\\sqrt2$ en el plano complejo. Esta representación deja claro que existen infinitos valores matemáticamente posibles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5c76330b",
   "metadata": {},
   "outputs": [],
   "source": [
    "radius = 1/np.sqrt(2)\n",
    "angles = np.linspace(0, 2*np.pi, 300)\n",
    "points = radius * np.exp(1j * angles)\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(points.real, points.imag)\n",
    "for label, a in candidates.items():\n",
    "    ax.scatter(a.real, a.imag)\n",
    "    ax.text(a.real + 0.03, a.imag + 0.03, label)\n",
    "ax.axhline(0, linewidth=1); ax.axvline(0, linewidth=1)\n",
    "ax.set_aspect(\"equal\", adjustable=\"box\")\n",
    "ax.set_title(\"Valores de a con |a|² = 1/2\")\n",
    "ax.set_xlabel(\"Parte real\")\n",
    "ax.set_ylabel(\"Parte imaginaria\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06a1dddf",
   "metadata": {},
   "source": [
    "## 20. Ejercicios propuestos\n",
    "\n",
    "1. Convertir $-2-2i$ a forma polar principal y dibujarlo.\n",
    "2. Calcular el conjugado de $3-4i$ y verificar que $z\\overline z=|z|^2$.\n",
    "3. Normalizar el vector $(2+i,1-i)^T$.\n",
    "4. Verificar con NumPy si $\\frac{1}{\\sqrt2}\\begin{pmatrix}1&-i\\\\1&i\\end{pmatrix}$ es unitaria.\n",
    "5. Construir un estado de qubit normalizado y graficar sus amplitudes y probabilidades."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2df13473",
   "metadata": {},
   "source": [
    "## 21. Resumen final\n",
    "\n",
    "Los números complejos permiten describir simultáneamente magnitud y dirección. La forma rectangular facilita componentes; la forma polar y exponencial facilitan geometría y multiplicación. En álgebra lineal compleja, la conjugación es indispensable para definir producto interno, norma y adjunta. En computación cuántica elemental, los estados son vectores complejos normalizados, las probabilidades se obtienen con la regla de Born y las evoluciones ideales se modelan con matrices unitarias."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
