{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bfa8fdb7",
   "metadata": {},
   "source": [
    "# Proyecto final: tu primer proyecto cuántico\n",
    "\n",
    "Este notebook es una guía resuelta del proyecto. Tiene tres partes:\n",
    "\n",
    "1. **Entrelazamiento:** `ghz(n)` verificado con `Statevector`.\n",
    "2. **Efecto del ruido:** fidelidad del GHZ para $n = 2..5$ con un simulador ruidoso, y su gráfica.\n",
    "3. **Algoritmo:** Bernstein-Vazirani con una cadena de 5 bits, en ideal y con ruido.\n",
    "\n",
    "Todas las semillas están fijas para que el notebook sea reproducible."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a4f4a9a4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:27.004686Z",
     "iopub.status.busy": "2026-09-29T19:07:27.004600Z",
     "iopub.status.idle": "2026-09-29T19:07:28.290258Z",
     "shell.execute_reply": "2026-09-29T19:07:28.289741Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from qiskit import QuantumCircuit, transpile\n",
    "from qiskit.quantum_info import Statevector\n",
    "from qiskit_aer import AerSimulator\n",
    "from qiskit_ibm_runtime.fake_provider import FakeManilaV2, FakeBrisbane\n",
    "\n",
    "SEMILLA = 42\n",
    "SHOTS = 4000\n",
    "ideal = AerSimulator(seed_simulator=SEMILLA)\n",
    "ruidoso = AerSimulator.from_backend(FakeManilaV2(), seed_simulator=SEMILLA)\n",
    "\n",
    "def ejecutar(qc, sim):\n",
    "    return sim.run(transpile(qc, sim, seed_transpiler=SEMILLA), shots=SHOTS).result().get_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98f012f8",
   "metadata": {},
   "source": [
    "## Parte 1. Entrelazamiento\n",
    "\n",
    "Verificamos sin muestreo que solo los estados de todos ceros y todos unos tienen probabilidad."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c93a780f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:28.291785Z",
     "iopub.status.busy": "2026-09-29T19:07:28.291584Z",
     "iopub.status.idle": "2026-09-29T19:07:28.295896Z",
     "shell.execute_reply": "2026-09-29T19:07:28.295562Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 qubits -> {'00': 0.5, '11': 0.5}\n",
      "3 qubits -> {'000': 0.5, '111': 0.5}\n",
      "4 qubits -> {'0000': 0.5, '1111': 0.5}\n",
      "5 qubits -> {'00000': 0.5, '11111': 0.5}\n"
     ]
    }
   ],
   "source": [
    "def ghz(n, medir=True):\n",
    "    qc = QuantumCircuit(n)\n",
    "    qc.h(0)\n",
    "    for i in range(n - 1):\n",
    "        qc.cx(i, i + 1)\n",
    "    if medir:\n",
    "        qc.measure_all()\n",
    "    return qc\n",
    "\n",
    "for n in range(2, 6):\n",
    "    p = {str(k): round(float(v), 3) for k, v in Statevector(ghz(n, medir=False)).probabilities_dict().items()}\n",
    "    assert set(p) == {\"0\" * n, \"1\" * n}\n",
    "    print(n, \"qubits ->\", p)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2af7cf22",
   "metadata": {},
   "source": [
    "## Parte 2. Efecto del ruido\n",
    "\n",
    "La fidelidad es la proporción de disparos que caen en los resultados correctos."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "969375ff",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:28.296721Z",
     "iopub.status.busy": "2026-09-29T19:07:28.296637Z",
     "iopub.status.idle": "2026-09-29T19:07:28.995269Z",
     "shell.execute_reply": "2026-09-29T19:07:28.994750Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n=2: cx=1 | fidelidad ideal=1.000 | con ruido=0.966\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n=3: cx=2 | fidelidad ideal=1.000 | con ruido=0.867\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n=4: cx=3 | fidelidad ideal=1.000 | con ruido=0.844\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n=5: cx=4 | fidelidad ideal=1.000 | con ruido=0.810\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 700x350 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "tamanos = [2, 3, 4, 5]\n",
    "fid_ideal, fid_ruido, cx = [], [], []\n",
    "for n in tamanos:\n",
    "    correctos = [\"0\" * n, \"1\" * n]\n",
    "    ci, cr = ejecutar(ghz(n), ideal), ejecutar(ghz(n), ruidoso)\n",
    "    fid_ideal.append(sum(ci.get(k, 0) for k in correctos) / SHOTS)\n",
    "    fid_ruido.append(sum(cr.get(k, 0) for k in correctos) / SHOTS)\n",
    "    cx.append(transpile(ghz(n), ruidoso, seed_transpiler=SEMILLA).count_ops().get(\"cx\", 0))\n",
    "    print(f\"n={n}: cx={cx[-1]} | fidelidad ideal={fid_ideal[-1]:.3f} | con ruido={fid_ruido[-1]:.3f}\")\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 3.5))\n",
    "ax.plot(tamanos, fid_ideal, marker=\"o\", label=\"ideal\")\n",
    "ax.plot(tamanos, fid_ruido, marker=\"o\", label=\"con ruido (FakeManilaV2)\")\n",
    "ax.set_xticks(tamanos)\n",
    "ax.set_ylim(0.6, 1.02)\n",
    "ax.set_xlabel(\"Qubits del estado GHZ\")\n",
    "ax.set_ylabel(\"Fidelidad\")\n",
    "ax.set_title(\"Cada cx adicional suma error: la fidelidad baja con n\")\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3148f5b",
   "metadata": {},
   "source": [
    "## Parte 3. Bernstein-Vazirani de 5 bits\n",
    "\n",
    "Una cadena de 5 bits necesita 6 qubits (5 de entrada y 1 auxiliar), más de los que tiene `FakeManilaV2`. Para la versión con ruido usamos `FakeBrisbane`, una instantánea de un procesador de 127 qubits."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9ce51ccb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:28.996679Z",
     "iopub.status.busy": "2026-09-29T19:07:28.996561Z",
     "iopub.status.idle": "2026-09-29T19:07:30.585284Z",
     "shell.execute_reply": "2026-09-29T19:07:30.584663Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ideal                      acierto 1.000 | resultado más frecuente 10110\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "con ruido (FakeBrisbane)   acierto 0.941 | resultado más frecuente 10110\n"
     ]
    }
   ],
   "source": [
    "def bernstein_vazirani(secreto):\n",
    "    n = len(secreto)\n",
    "    qc = QuantumCircuit(n + 1, n)\n",
    "    qc.x(n)\n",
    "    qc.h(range(n + 1))\n",
    "    for i, bit in enumerate(reversed(secreto)):\n",
    "        if bit == \"1\":\n",
    "            qc.cx(i, n)\n",
    "    qc.h(range(n))\n",
    "    qc.measure(range(n), range(n))\n",
    "    return qc\n",
    "\n",
    "secreto = \"10110\"\n",
    "ruidoso_grande = AerSimulator.from_backend(FakeBrisbane(), seed_simulator=SEMILLA)\n",
    "for sim, nombre in [(ideal, \"ideal\"), (ruidoso_grande, \"con ruido (FakeBrisbane)\")]:\n",
    "    conteos = ejecutar(bernstein_vazirani(secreto), sim)\n",
    "    acierto = conteos.get(secreto, 0) / SHOTS\n",
    "    mas_frecuente = max(conteos, key=conteos.get)\n",
    "    print(f\"{nombre:26s} acierto {acierto:.3f} | resultado más frecuente {mas_frecuente}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8bce3a48",
   "metadata": {},
   "source": [
    "## Conclusiones (ejemplo)\n",
    "\n",
    "- En simulación ideal, el GHZ solo produce todos ceros y todos unos, y Bernstein-Vazirani recupera el secreto en el 100 % de los disparos.\n",
    "- Con ruido, la fidelidad del GHZ baja a medida que crece $n$, porque cada qubit adicional agrega una `cx`, la puerta con más error.\n",
    "- Aun con ruido, el resultado más frecuente de Bernstein-Vazirani es el secreto: el algoritmo es robusto mientras el circuito sea poco profundo.\n",
    "\n",
    "**Lista de revisión antes de entregar:**\n",
    "- [ ] El notebook corre completo tras reiniciar el kernel.\n",
    "- [ ] Todas las semillas están fijas.\n",
    "- [ ] La gráfica tiene título, ejes con nombre y leyenda.\n",
    "- [ ] Cada conclusión cita un número del notebook."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.13.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
