{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "41db244e",
   "metadata": {},
   "source": [
    "# Algoritmos cuánticos sencillos\n",
    "\n",
    "Todos los algoritmos de este notebook siguen el mismo patrón:\n",
    "\n",
    "1. **Superposición** con Hadamard.\n",
    "2. **Oráculo**, que marca entradas cambiando su fase.\n",
    "3. **Interferencia**, que convierte fases en probabilidades.\n",
    "4. **Medición**.\n",
    "\n",
    "Implementas Deutsch-Jozsa, Bernstein-Vazirani y Grover, y compruebas cada uno en simulación."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "78744401",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:20.083469Z",
     "iopub.status.busy": "2026-09-29T19:07:20.083180Z",
     "iopub.status.idle": "2026-09-29T19:07:20.619991Z",
     "shell.execute_reply": "2026-09-29T19:07:20.619479Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.quantum_info import Statevector\n",
    "from qiskit.primitives import StatevectorSampler\n",
    "\n",
    "sampler = StatevectorSampler(seed=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05e7d490",
   "metadata": {},
   "source": [
    "## Deutsch-Jozsa\n",
    "\n",
    "Una función $f:\\{0,1\\}^n \\to \\{0,1\\}$ es *constante* (misma salida siempre) o *balanceada* (0 en la mitad de las entradas y 1 en la otra mitad). El algoritmo lo decide con **una** consulta: si al medir las entradas sale todo ceros, la función es constante."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d0365952",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:20.621179Z",
     "iopub.status.busy": "2026-09-29T19:07:20.621046Z",
     "iopub.status.idle": "2026-09-29T19:07:20.630554Z",
     "shell.execute_reply": "2026-09-29T19:07:20.630184Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "constante 0  -> {'000': 100}\n",
      "constante 1  -> {'000': 100}\n",
      "balanceada   -> {'111': 100}\n"
     ]
    }
   ],
   "source": [
    "def deutsch_jozsa(n, oraculo):\n",
    "    qc = QuantumCircuit(n + 1, n)\n",
    "    qc.x(n)\n",
    "    qc.h(range(n + 1))\n",
    "    oraculo(qc, n)\n",
    "    qc.h(range(n))\n",
    "    qc.measure(range(n), range(n))\n",
    "    return qc\n",
    "\n",
    "def constante_0(qc, n):\n",
    "    pass\n",
    "\n",
    "def constante_1(qc, n):\n",
    "    qc.x(n)\n",
    "\n",
    "def balanceada(qc, n):  # f(x) = paridad de x\n",
    "    for i in range(n):\n",
    "        qc.cx(i, n)\n",
    "\n",
    "for nombre, oraculo in [(\"constante 0\", constante_0), (\"constante 1\", constante_1), (\"balanceada\", balanceada)]:\n",
    "    conteos = sampler.run([deutsch_jozsa(3, oraculo)], shots=100).result()[0].data.c.get_counts()\n",
    "    print(f\"{nombre:12s} -> {conteos}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb5d1434",
   "metadata": {},
   "source": [
    "## Bernstein-Vazirani\n",
    "\n",
    "La función oculta es $f(x) = s \\cdot x \\bmod 2$. Clásicamente se necesitan $n$ consultas para averiguar $s$; aquí basta una. Cuidado con el orden: el bit de la derecha de `secreto` corresponde al qubit 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a0967004",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:20.631684Z",
     "iopub.status.busy": "2026-09-29T19:07:20.631555Z",
     "iopub.status.idle": "2026-09-29T19:07:20.640257Z",
     "shell.execute_reply": "2026-09-29T19:07:20.639926Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "secreto 101 -> {'101': 100}\n",
      "secreto 0110 -> {'0110': 100}\n",
      "secreto 11010 -> {'11010': 100}\n",
      "secreto 100001 -> {'100001': 100}\n",
      "     ┌───┐          ┌───┐          ┌─┐   \n",
      "q_0: ┤ H ├───────■──┤ H ├──────────┤M├───\n",
      "     ├───┤┌───┐  │  └┬─┬┘          └╥┘   \n",
      "q_1: ┤ H ├┤ H ├──┼───┤M├────────────╫────\n",
      "     ├───┤└───┘  │   └╥┘      ┌───┐ ║ ┌─┐\n",
      "q_2: ┤ H ├───────┼────╫────■──┤ H ├─╫─┤M├\n",
      "     ├───┤┌───┐┌─┴─┐  ║  ┌─┴─┐└───┘ ║ └╥┘\n",
      "q_3: ┤ X ├┤ H ├┤ X ├──╫──┤ X ├──────╫──╫─\n",
      "     └───┘└───┘└───┘  ║  └───┘      ║  ║ \n",
      "c: 3/═════════════════╩═════════════╩══╩═\n",
      "                      1             0  2 \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",
    "for secreto in [\"101\", \"0110\", \"11010\", \"100001\"]:\n",
    "    conteos = sampler.run([bernstein_vazirani(secreto)], shots=100).result()[0].data.c.get_counts()\n",
    "    print(f\"secreto {secreto} -> {conteos}\")\n",
    "print(bernstein_vazirani(\"101\").draw(\"text\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fada97f4",
   "metadata": {},
   "source": [
    "## Grover\n",
    "\n",
    "Grover busca un elemento marcado entre $N = 2^n$ posibilidades. Cada iteración aplica:\n",
    "\n",
    "- el **oráculo**, que invierte la fase del estado buscado;\n",
    "- el **difusor**, que refleja todas las amplitudes respecto a su promedio.\n",
    "\n",
    "Para construir ambos usamos una Z multicontrolada (`h` + `mcx` + `h`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8f86a6df",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:20.641333Z",
     "iopub.status.busy": "2026-09-29T19:07:20.641209Z",
     "iopub.status.idle": "2026-09-29T19:07:20.646513Z",
     "shell.execute_reply": "2026-09-29T19:07:20.646109Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "buscado 00 -> P = 1.000\n",
      "buscado 01 -> P = 1.000\n",
      "buscado 10 -> P = 1.000\n",
      "buscado 11 -> P = 1.000\n"
     ]
    }
   ],
   "source": [
    "def mcz(qc, n):\n",
    "    qc.h(n - 1)\n",
    "    qc.mcx(list(range(n - 1)), n - 1)\n",
    "    qc.h(n - 1)\n",
    "\n",
    "def oraculo(qc, marcado):\n",
    "    n = len(marcado)\n",
    "    ceros = [i for i, bit in enumerate(reversed(marcado)) if bit == \"0\"]\n",
    "    if ceros:\n",
    "        qc.x(ceros)\n",
    "    mcz(qc, n)\n",
    "    if ceros:\n",
    "        qc.x(ceros)\n",
    "\n",
    "def difusor(qc, n):\n",
    "    qc.h(range(n))\n",
    "    qc.x(range(n))\n",
    "    mcz(qc, n)\n",
    "    qc.x(range(n))\n",
    "    qc.h(range(n))\n",
    "\n",
    "def grover(marcado, iteraciones):\n",
    "    n = len(marcado)\n",
    "    qc = QuantumCircuit(n)\n",
    "    qc.h(range(n))\n",
    "    for _ in range(iteraciones):\n",
    "        oraculo(qc, marcado)\n",
    "        difusor(qc, n)\n",
    "    return qc\n",
    "\n",
    "for marcado in [\"00\", \"01\", \"10\", \"11\"]:\n",
    "    p = Statevector(grover(marcado, 1)).probabilities_dict()\n",
    "    print(f\"buscado {marcado} -> P = {p.get(marcado, 0):.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29a56c7b",
   "metadata": {},
   "source": [
    "Con 2 qubits, una iteración encuentra el elemento con certeza. Con 3 qubits ($N = 8$) el número óptimo es $\\approx \\frac{\\pi}{4}\\sqrt{8} \\approx 2$. ¿Qué pasa si iteramos de más? La probabilidad oscila: sube hasta el óptimo, cae y vuelve a subir de forma periódica. Por eso se usa el primer máximo, que es el que requiere menos consultas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6f7258db",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:20.647360Z",
     "iopub.status.busy": "2026-09-29T19:07:20.647237Z",
     "iopub.status.idle": "2026-09-29T19:07:20.731664Z",
     "shell.execute_reply": "2026-09-29T19:07:20.731227Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 700x350 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 iteraciones -> 0.125\n",
      "1 iteraciones -> 0.781\n",
      "2 iteraciones -> 0.945\n",
      "3 iteraciones -> 0.33\n",
      "4 iteraciones -> 0.012\n",
      "5 iteraciones -> 0.548\n",
      "6 iteraciones -> 1.0\n",
      "7 iteraciones -> 0.577\n"
     ]
    }
   ],
   "source": [
    "marcado = \"101\"\n",
    "iteraciones = list(range(0, 8))\n",
    "exito = [Statevector(grover(marcado, k)).probabilities_dict().get(marcado, 0) for k in iteraciones]\n",
    "theta = np.arcsin(1 / np.sqrt(8))\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 3.5))\n",
    "ax.plot(iteraciones, exito, marker=\"o\", label=\"Qiskit\")\n",
    "ax.plot(iteraciones, [np.sin((2 * k + 1) * theta) ** 2 for k in iteraciones], \"--\", label=\"teoría\")\n",
    "ax.set_xlabel(\"Iteraciones de Grover\")\n",
    "ax.set_ylabel(f\"P({marcado})\")\n",
    "ax.set_title(\"Pasarse del número óptimo reduce la probabilidad de éxito\")\n",
    "ax.legend()\n",
    "plt.show()\n",
    "for k, p in zip(iteraciones, exito):\n",
    "    print(k, \"iteraciones ->\", round(float(p), 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d60c168a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:20.732914Z",
     "iopub.status.busy": "2026-09-29T19:07:20.732816Z",
     "iopub.status.idle": "2026-09-29T19:07:20.740002Z",
     "shell.execute_reply": "2026-09-29T19:07:20.739608Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'101': 955, '000': 9, '011': 8, '010': 6, '111': 6, '001': 7, '110': 4, '100': 5}\n"
     ]
    }
   ],
   "source": [
    "qc = grover(\"101\", 2)\n",
    "qc.measure_all()\n",
    "print(sampler.run([qc], shots=1000).result()[0].data.meas.get_counts())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e41725e",
   "metadata": {},
   "source": [
    "## Resumen y ejercicios\n",
    "\n",
    "- **Deutsch-Jozsa:** una consulta distingue constante de balanceada.\n",
    "- **Bernstein-Vazirani:** una consulta recupera la cadena secreta completa.\n",
    "- **Grover:** unas $\\frac{\\pi}{4}\\sqrt{N}$ consultas; iterar de más empeora el resultado.\n",
    "- La ventaja viene de la interferencia, no de \"probar todo en paralelo\".\n",
    "\n",
    "**Ejercicios:**\n",
    "1. Diseña otro oráculo balanceado para Deutsch-Jozsa (por ejemplo, $f(x) = x_0$) y compruébalo.\n",
    "2. Ejecuta Bernstein-Vazirani con una cadena de 8 bits.\n",
    "3. Busca con Grover un estado de 4 qubits y encuentra el número óptimo de iteraciones con la gráfica."
   ]
  }
 ],
 "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
}
