{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "(deutschjozsa)=\n", "# Introducción.\n", "```{index} Deutsch Jozsa (Algoritmo)\n", "```\n", "\n", "Este algoritmo fue diseñado por un lado por David Deutsh , profesor de la Universidad de Oxfort (conocido por su teoría de los universos paralelos) y por otro lado por Richard Jozsa matemático en la Universidad de Cambrige. La explicación de este algoritmo de una forma muy didáctica la podemos ver en este vídeo de Ket.G.\n", "\n", "Para comenzar, vamos a dar las siguientes definiciones, suponiendo que tenemos una función que vamos a denominar f que sólo puede tomar los valores 0 ó 1:\n", "\n", "* La función f será **constante** si en todos los casos del dominio de definición obtenemos el valor 0 o bien el vaor 1.\n", "\n", "* La función f será **balanceada** si en la mitad de los casos obtenemos el valor 0 y en la otra mitad el valor 1.\n", "\n", "De acuerdo con estas definiciones, si contamos con una función que es constante o balanceada, ¿Cuántas veces tenemos que evaluar esta función para estar seguro de qué tipo es?. Con la computación clásica y suponiendo tenemos n números, habría que evaluar la función un máximo de n/2+1 veces para saber con seguridad si la función es constante o balanceada ( ver este vídeo ). Si teneos muchos números estas evaluaciones pueden crecer muchísimo en cantidad de comprobaciones.\n", "\n", "Sin embargo el algoritmo de Detsch Jozsa lo que consigue es este resultado con una sola evaluación. Este es uno de los primeros resultados que demuestra el poder de la computación cuántica.\n", "\n", "Si al montar el circuito indicado en este vídeo y obtenemos como resultado un valor de cero, entonces diremos que la función es constante y en caso contrario será equilibrada. El circuito con el que se trabaja en este algoritmo es el siguiente:\n", "\n", "\n", "![](../images/deutschJozsa.PNG)\n", "\n", "La demostración matemática de este algoritmo la podemos ver en este documento pdf obtenido gracias a los vídeos de Ket.G .\n", "\n", "Para fijar más las ideas, vamos a suponer que la función f toma como entrada una cadena de bits y devuelve 0 ó 1, es decir:\n", "\n", "$$f(\\{x_{0},x_{1},...,\\})\\longrightarrow0\\ \\acute{o}\\ 1\\quad donde\\ x_{i}\\ vale\\ 0\\ \\acute{o}\\ 1$$\n", "\n", "Como ya hemos dicho, con la solución cuántica podremos saber si la función es constante o equilibrada con una sola evaluación de la función f(x), de tal manera que esta función f está implementada dentro de un oráculo cuántico el cual mapea el estado $|x\\rangle |y\\rangle$ en $|x\\rangle |y \\oplus f(x) \\rangle $. Este esquema puede verse en la imagen mostrada anteriormente.\n", "\n", "Veamos todo lo anterior con un función de ejemplo que actúa sobre dos bits. Esta función va a ser la siguiente:\n", "\n", "$$f(x_{0},x_{1})=x_{0}\\oplus x_{1}$$\n", "\n", "De tal manera que se obtiene lo siguiente:\n", "\n", "$f(0,0)=0$\n", "\n", "$f(0,1)=1$\n", "\n", "$f(1,0)=1$\n", "\n", "$f(1,1)=0$\n", "\n", "A continuación vamos aplicar el algoritmo de Deutsch Jozsa para comprobar que con un intento podemos corroborar que nuestra función es balanceada tal y como la hemos definido. Primero lo hacemos de una forma totalmente teórica y después utilizaremos código para obtener el mismo resultado.\n", "\n", "Arrancamos de la situación inicial mostrada en la figura anterior, es decir los dos primeros qubits a $|0\\rangle$ y el tercero a $|1\\rangle$.\n", "\n", "$$|\\psi_{0}\\rangle=|00\\rangle_{01}\\otimes|1\\rangle_{2}$$\n", "\n", "Con la anterior notación indicamos lo siguiente:\n", "\n", "1) El primer registro de dos qubits está inicializado a $|00\\rangle$ y el segundo registro de un solo qubits está en el estado $|1\\rangle$. Esto queda denotado para mayor claridad por los subíndices 0, 1 y 2.\n", "\n", "2) Ahora aplicamos una puerta de Hadamard a todos los qubits y obtenemos:\n", "\n", "\n", "$$|\\psi_{1}\\rangle=\\frac{1}{2}(|00\\rangle+|01\\rangle+|10\\rangle+|11\\rangle)_{01}\\otimes\\frac{1}{\\sqrt{2}}(|0\\rangle-|1\\rangle)_{2}$$\n", "\n", "3) La función oracle para este ejemplo puede ser implementada mediante lo siguiente $\\mathrm{Q}_{f}=C X_{02}C X_{12}$. Es decir aplicamos de forma consecutiva dos puertas de tipo control-X. La situación la podemos reproducir sobre Quirk, donde uno de los estados se puede ver en la siguiente figura:\n", "\n", "![](../images/quirtkJozsa.PNG)\n", "\n", "En la imagen anterior se puede ver que si los dos primeros qubits están en $|01\\rangle$ entonces la salida del tercer qubit ( que es la imagen de f) está en 1 (es decir $f(1,0)=1$). Podemos comprobar que si cambiamos los dos primeros estados los resultados son los mismos que cuando hemos presentado y definido la función. Por lo tanto esta puerta nos sirve para este trabajo.\n", "\n", "Aplicando ahora esta puerta, obtenemos la siguiente salida\n", "\n", "$|\\psi_{2}\\rangle=\\frac{1}{2\\sqrt{2}}\\left[\\underbrace{|00\\rangle_{01}\\otimes(|0\\oplus0\\oplus0\\rangle-|1\\oplus0\\oplus0\\rangle)_{2}}_{=|00\\rangle_{01}\\otimes(|0\\oplus f(0,0)-|1\\oplus f(0,0))_{2}}+\\underbrace{|01\\rangle_{01}\\otimes(|0\\oplus0\\oplus1\\rangle-|1\\oplus0\\oplus1\\rangle)_{2}}_{=|01\\rangle_{01}\\otimes(|0\\oplus f(0,1)-|1\\oplus f(0,1))_{2}}+\\underbrace{|10\\rangle_{01}\\otimes(|0\\oplus1\\oplus0\\rangle-|1\\oplus1\\oplus0\\rangle)_{2}}_{=|10\\rangle_{01}\\otimes(|0\\oplus f(1,0)-|1\\oplus f(1,0))_{2}}\\right]$\n", "\n", "$+\\left[\\underbrace{|11\\rangle_{01}\\otimes(|0\\oplus1\\oplus1\\rangle-|1\\oplus1\\oplus1\\rangle)}_{=|101\\rangle\\otimes(|0\\oplus f(1,1)-|1\\oplus f(1,1))_{2}}\\right]$\n", "\n", "\n", "Simplificando se tiene:\n", "\n", "$|\\psi_{2}\\rangle=\\frac{1}{2\\sqrt{2}}\\left[|00\\rangle_{01}\\otimes(\\underbrace{|0\\oplus0\\oplus0\\rangle}_{|0\\rangle}-\\underbrace{|1\\oplus0\\oplus0}_{|1\\rangle}\\rangle)_{2}+|01\\rangle_{01}\\otimes(\\underbrace{|0\\oplus0\\oplus1}_{|1\\rangle}\\rangle-\\underbrace{|1\\oplus0\\oplus1}_{|0\\rangle}\\rangle)_{2}+|10\\rangle_{01}\\otimes(\\underbrace{|0\\oplus1\\oplus0}_{|1\\rangle}\\rangle-|\\underbrace{1\\oplus1\\oplus0}_{|0\\rangle}\\rangle)_{2}\\right]$\n", "\n", "\n", "$+\\left[|11\\rangle_{01}\\otimes\\underbrace{(|0\\oplus1\\oplus1\\rangle}_{|0\\rangle}-|\\underbrace{1\\oplus1\\oplus1}_{|1\\rangle}\\rangle)\\right]$\n", "\n", "Es decir:\n", "\n", "$$|\\psi_{2}\\rangle=\\frac{1}{2\\sqrt{2}}[|00\\rangle_{01}\\otimes(|0\\rangle-|1\\rangle)_{2}-|01\\rangle_{01}\\otimes(|0\\rangle-|1\\rangle)_{2}-|10\\rangle_{01}\\otimes(|0\\rangle-|1\\rangle)_{2}+|11\\rangle_{01}\\otimes(|0\\rangle-|1\\rangle)_{2}=$$\n", "\n", "$$={\\frac{1}{2}}(|00\\rangle-|01\\rangle-|10\\rangle+|11\\rangle)_{01}\\otimes{\\frac{1}{\\sqrt{2}}}(|0\\rangle-|1\\rangle)_{2}$$\n", "\n", "$$=\\frac{1}{\\sqrt{2}}(|0\\rangle-|1\\rangle)_{0}\\otimes\\frac{1}{\\sqrt{2}}(|0\\rangle-|1\\rangle)_{1}\\otimes\\frac{1}{\\sqrt{2}}(|0\\rangle-|1\\rangle)_{2}$$\n", "\n", "4) Ahora aplicamos una puerta de Hadamart al primer registro (Es decir los dos primeros qubits) y se obtiene:\n", "\n", "$$|\\psi_{3}\\rangle=|1\\rangle_{0}\\otimes|1\\rangle_{1}\\otimes(|0\\rangle-|1\\rangle)_{2}$$\n", "\n", "\n", "5) Ahora haciendo una medición sobre los dos primeros qubits se obtiene 11, es decir por el teorema de Deutsch-Jozsa se obtiene que la función es balanceada.\n", "\n", "Veamos esto mismo pero utilizando código.\n", "\n", "## Creación de los oráculos.\n", "\n", "Vamos a ver en este apartado algunos caminos para crear este tipo de puertas cuánticas.\n", "\n", "1) En primer lugar supongamos que la función *f es un función constante*:\n", "\n", "1.a) Si f(x)=0 entonces aplicamos una puerta I en el qubit del registro 2.\n", "\n", "1. b) Si f(x)=1 entonces aplicamos una puerta X en el qubit del registro 2.\n", "\n", "y así de fácil tendríamos generado la puerta $U_f$.\n", "\n", "Pongámonos a continuación en el caso de que *f es balanceada*. En este caso hay muchas formas de crear este tipo de circuitos que generan este oráculo, veamos en este apartado como conseguirlo utilizando puertas CNOT con control en cada cada uno de los qubits del registro 1 y target en el qubit del registro 2.\n", "\n", "Construimos un ejemplo con Quirk de la manera que se muestra en la figura siguiente:\n", "\n", "![](../images/puertaBalanceada.PNG)\n", "\n", "En la imagen anterior, los tres qubits superiores forman el registro de entrada y el qubit de abajo el registro de salida. Podemos ver los estados que generan un valor de cero o uno como salida (se puede comprobar la salida que Quirk)\n", "\n", "| estados salida 0 | estados salida 1 |\n", "|------------------|------------------|\n", "| 000 | 001 |\n", "| 011 | 100 |\n", "| 101 | 010 |\n", "| 110 | 111 |\n", "\n", "En consecuencia se puede ver que obtenemos el mismo número de veces el 0 como el 1.\n", "\n", "También podemos cambiar el circuito a otro como el siguiente:\n", "\n", "![](../images/puertaBalanceada2.PNG)\n", "\n", "\n", "En esta situación los resultados que se obtienen son los siguientes (comprobar con quirk):\n", "\n", "| estados salida 0 | estados salida 1 |\n", "|------------------|------------------|\n", "| 001 | 000 |\n", "| 010 | 011 |\n", "| 100 | 101 |\n", "| 111 | 110 |\n", "\n", "\n", "Después de estos preámbulos procedemos a continuación a su implementación en qiskit, que como se ha visto se prueba el algoritmo en esta ocasión para tres qubits en el registro 1 y uno en el registro 2.\n", "\n", "Procedemos primero a hacer las correspondientes importaciones:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "\n", "# Para poder usar from qiskit.providers.ibmq import least_busy\n", "#!pip install qiskit-ibmq-provider" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "\n", "import numpy as np\n", "\n", "# importando Qiskit\n", "from qiskit import IBMQ, Aer\n", "from qiskit.providers.ibmq import least_busy\n", "from qiskit import QuantumCircuit, transpile\n", "\n", "# importando herramienta de plot básica\n", "from qiskit.visualization import plot_histogram" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A continuación definimos el tamaño de los registros de entrada para el oráculo" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Establecemos la longitud de los n-bits \n", "n=3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Construcción de un oráculo constante\n", "\n", "Siguiendo las ideas vistas anteriormente, construimos a continuación un oráculo constante, de tal manera que dependiendo del número aleatorio que obtengamos construimos un oráculo constante que sea iguala 0 o igual a 1 " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creamos un oráculo con salida 0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "const_oracle = QuantumCircuit(n+1)\n", "\n", "output = np.random.randint(2)\n", "if output == 1:\n", " print(\"Creamos un oráculo con salida 1\")\n", " const_oracle.x(n)\n", "else:\n", " print(\"Creamos un oráculo con salida 0\")\n", "\n", "const_oracle.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Construcción de un oráculo balanceado\n", "\n", "Construimos a continuación un circuito balanceado, teniendo en cuenta que vamos a construir un string que indica los qubits de de entrada. Si uno de esos qubit está a 1 lo transformamos a 0 mediante una puerta X" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "balanced_oracle = QuantumCircuit(n+1)\n", "b_str = \"101\"\n", "\n", "# colocamos la pueras X en los bits igual a 1\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "balanced_oracle.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A continuación añadimos las puertas CNOT, poniendo barreras en el circuito para diferenciar cada apartado." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfIAAAEvCAYAAAC+MUMhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtkklEQVR4nO3dfVRU950/8PedAR1BQBEDBlCUB0UUTH1IXNNYXe0PYzBJ1cQssbE/N/62ias/44q72+xp+jueWoyNW2u2NfFYu7vW0qo1RoxJE8xZQxqLRY3hQYPhwRlnoshDRp6Emfv74xYiCsqMM/Od+73v1zkclLkPnxmGz3vuvd97r6KqqgoiIiLSJZPoAoiIiMh7DHIiIiIdY5ATERHpGIOciIhIxxjkREREOsYgJyIi0jEGORERkY4xyImIiHSMQU5ERKRjDHIiIiIdY5ATERHpGIOciIhIxxjkREREOsYgJyIi0jEGORERkY4xyImIiHSMQU5ERKRjDHIiIiIdY5ATERHpGIOciIhIxxjkREREOsYgJyIi0jEGORERkY4xyImIiHSMQU5ERKRjDHIiIiIdY5ATERHpGIOciIhIx0JEF0B0LyorKz2a/sqVK/jd736Hp556Cvfdd9+A5pkwYYI3pRFRgHjSB7zpAUBw9wFukZOhXL16Fa+//jquXr0quhQiEkDGHsAgJyIi0jEGORERkY4xyImIiHSMQU6GEhUVhZycHERFRYkuhYgEkLEHKKqqqqKLIPKWp6PWvRHMo1WJiH2AW+RkKB0dHaitrUVHR4foUohIABl7AIOcDKWqqgrZ2dmoqqoSXQoRCSBjD+AFYYKUqqpodbtElzFgYSYzFEURXQYRkeEwyINUq9uF4UV/FF3GgDXOnY9wM99ORESBxl3rREREOsYgJyIi0jHuCyVDycjIQEVFhegyiEgQGXsAt8iJiIh0jEFOhlJdXY1ly5ahurpadClEJICMPYBBTobS2tqKs2fPorW1VXQpRCSAjD2AQU5ERKRjDHIiIiIdY5ATERHpGIOcDCU+Ph75+fmIj48XXQoRCSBjD+B55GQow4YNw6JFi0SXQUSCyNgDuEVOhtLQ0IC9e/eioaFBdClEJICMPYBBToZit9uxadMm2O120aUQkQAy9gBDBHl9fT3y8vKQkpICi8WCxMRErF27Fi0tLVi5ciUURcGOHTtEl0nkV6oKdHQBLR2Ayy26GiLyFemPkZ85cwYLFiyAw+FAeHg4Jk6ciMuXL2P79u24ePFiz+6VKVOmiC3UT1y798D929/B/NL/hSn7270eU1UVrg3/DLWiAiE7tkMZmySmSPKr6+3AyYvAx1XAtevaz0wKMCkBmJUKpMUBvJU8kX5JvUVeX1+PnJwcOBwOrF+/Hna7HaWlpXA4HMjPz0dhYSFKSkqgKAoyMzNFl+sXpuW5QNIYuHa+CfVqfa/H3AcPQf30HEzLn2WIS+psHfCjQ8DbZ74OcQBwq8Cnl4BfFAH/8QHQekNUhUR0r6QO8jVr1sBqtWL16tXYunUrIiIieh7Ly8tDVlYWurq6kJSUhMjISIGV+o8SGoqQDeuB9na4Xvv3np+rl6xw7/lPKBPGw7R0sbgCAyw8PByzZs1CeHi46FL87mwdsOcE0Om683Sffwn8skjb7U4kOxl7gLRBXlFRgYKCAsTExGDz5s19TjN16lQAQFZWVq+fV1dXY9GiRYiIiMDw4cPx3e9+F9euXfN7zf6ipKbAtOwpqH8phbvwHaguF1xbtgKqCvOG9VDMZtElBkxSUhJ27dqFpKQk0aX4VUsHsPdjQB3g9HXXgGOf+rUkoqAgYw+QNsj37dsHt9uN3NxcDB06tM9phgwZAqB3kDudTsyZMwdWqxX79u3DG2+8gRMnTuCxxx6D263fEUKm3GeAcePgenMX3K//Eur5CzCt+C6UxATRpQWUy+XC9evX4XLdZTNV5/78BXDDw6d48iJwg1vlJDkZe4C0QV5UVAQAmDNnTr/TWK1WAL2D/I033oDNZsOhQ4fw2GOPYenSpfjNb36DTz75BIcPH/Zv0X6khIQgZMNLwI1OuI8UQpmUAdN3nhBdVsBVVlZi+vTpqKysFF2KX338uefztN4AztT5vhaiYCJjD5B21HptbS0AYMyYMX0+3tXVheLiYgC9g/zIkSN4+OGHMXr06J6fzZw5E+PGjcPbb7+NJ554wuNapk2bBofD4dE86qBBwM7XPV7XHYWHA6GhQFcXlOnToJh89zkuLTUNyo3Aj5hasWKFR9N3nzt69OhRnD59ekDz7Nmzx8OqxFJMIVi8ucareX+4+T9w7p0f+7YgIj/zpA940wMA//eBuLg4nDp1yqt5pQ3ylpYWAEBbW1ufjxcUFKC+vh4REREYO3Zsz8/Ly8uxdOnS26bPyMhAeXm5V7U4HA7YbDbPZrIMRqhXa+ubqqpw/XQb0NUJjE6E+ze/hWn2I1DuH+WT5V+2XwbaO3yyLE94ek/h9vb2nu8Dndfj351gIYPDvJ63tf2G7p4vkSd9wJseAAR3H5A2yOPi4tDY2IjS0lLMnDmz12N2ux0bNmwAAGRmZkK56STaxsZGDBs27LblRUdH4/z5817X4il10CBc9WptfXMfOgz17Kcwfe85mGY+hK4X/xGun26DeWt+r+fvrftH3S9kizwszLPQslgsPd8HOq8eb67g6myHOdTi8Xyhyg1dPl8yNk/6gDc9APB/H/AmJ7pJG+Tz5s1DRUUF8vPzMX/+fKSlpQEASkpKsHz5ctTXa+dUB+JCMN7sLmlxdWF40R99sn7VZoN79x4o49NgemoJFLMZpmdz4f7Vr+E+dBjmJx+/53Vc+PwCws2Bfzt5epyrrKwMu3fvxqOPPoqMjIwBzbNp0yZvShPqv4uBUzVezPfzPMRF5fm8HiJ/8qQPeNMDgODuA9IOdsvLy8OIESNw6dIlZGRkYPLkyUhNTcWMGTMwbtw4zJ07F8Dtp54NHz4cTU1Nty2voaEB0dHRgSjdp1S3G65XXwPcbpg3vNRzqpnpqSVQ0lLh3r0H6mV5rjl8N2lpaSguLu75YCerh8d7Pk9qLBAX5ftaiIKJjD1A2iBPSEjAiRMnsHDhQlgsFtTU1CA6Oho7d+5EYWEhLly4AOD2IE9PT+/zWHh5eTnS09MDUrsvufcfhFpeAdNzz0K5aQCfYjbD/E8vAW4XXD/dBlUd6BnH+hYaGoro6GiEhvpyBELwGTNCuwTrQJlNwAI5L25I1IuMPUDaIAe0UD5y5AicTiecTidOnjyJVatWoaWlBTU1NTCZTJg0aVKveR577DF89NFHPaemAcDJkydx8eJF5OTkBPop3BO1rg7uX/8XlPQJMC3+zm2PK0ljYHo2F+q5z+A+pN9T6zxRV1eHF154AXV1cp9npSjA8llASuzdpzWbgOV/A4y7z/91EYkmYw+QOsj7U1ZWBlVVkZqaettgh1WrVmHUqFF4/PHHceTIEezfvx/PPPMMZsyYgccfv/djyYGkjB6N0MK3EPKz1/q9epv5macR+t5Rnxwn1wOn04njx4/D6XSKLsXvBocA/zAHyJ4MRPYz7m38KODFvwWm9H2WJpF0ZOwB0g52u5Nz584BuH23OgBERkaiqKgIa9euxbJlyxASEoLHHnsM27Ztg8mH510TBUKIGcjOBOZlAJ/ZgH1/0q6pbgkB1i8ARsp5iwEiQ2GQ9yE5ORlHjhwJZElEfhViBqaMBv5wSgvywaEMcSJZGHIT825BTkREpBeG3CLvvg47GU9sbCw2btyI2NgBjAIjIunI2AMMGeRkXDExMR5fn52I5CFjDzDkrnUyrubmZhw7dgzNzc2iSyEiAWTsAQxyMhSr1Yp169b1uk4AERmHjD2AQU5ERKRjDHIiIiIdY5ATERHpGIOcDMVisSA9Pb3nnsREZCwy9gCefkaGkpycjIMHD4oug4gEkbEHcIuciIhIxxjkZCjl5eXIzMzs857zRCQ/GXsAg5wMRVVVdHZ2QlVV0aUQkQAy9gAeIw9SYSYzGufOF13GgIWZ+r7fORER+ReDPEgpioJwM389RER0Z9y1TkREpGPc5CNDSU5OxuHDh5GYmCi6FCISQMYewCAnQ7FYLEhNTRVdBhEJImMP4K51MhSbzYaXX34ZNptNdClEJICMPYBBTobS1NSEAwcOoKmpSXQpRCSAjD2AQU5ERKRjDHIiIiIdY5ATERHpGIOcDMVkMmH69OkwmfjWJzIiGXuAPM+EaADcbjdKSkrgdrtFl0JEAsjYAxjkREREOsYgJyIi0jEGORERkY4xyMlQoqKikJOTg6ioKNGlEJEAMvYAXmudDCUhIQFbtmwRXQYRCSJjD+AWORlKR0cHamtr0dHRIboUIhJAxh7AICdDqaqqQnZ2NqqqqkSXQkQCyNgDGOREREQ6xiAnIiLSMQY5ERGRjjHIiYiIdIynn5GhZGRkoKKiQnQZRCSIjD2AW+REREQ6xiAnQ6mursayZctQXV0tuhQiEkDGHsAgJ0NpbW3F2bNn0draKroUIhJAxh7AICciItIxBjkREZGOMciJiIh0jEFOhhIfH4/8/HzEx8eLLoWIBJCxB/A8cjKUYcOGYdGiRaLLICJBZOwB3CInQ2loaMDevXvR0NAguhQiEkDGHsAgJ0Ox2+3YtGkT7Ha76FKISAAZe4Ahgry+vh55eXlISUmBxWJBYmIi1q5di5aWFqxcuRKKomDHjh2iyyQiIvKY9MfIz5w5gwULFsDhcCA8PBwTJ07E5cuXsX37dly8eLFn98qUKVPEFkpEftPlAj69BJTbgLZOYFAIkBgNzBgHDLWIro7o3kgd5PX19cjJyYHD4cD69evxwx/+EBEREQCALVu2YOPGjQgJCYGiKMjMzBRcLRH5mqoC/3MeeL8McLb3fux0LXD0LDBtLPDkVGBwqJgaie6V1LvW16xZA6vVitWrV2Pr1q09IQ4AeXl5yMrKQldXF5KSkhAZGSmwUgqU8PBwzJo1C+Hh4aJLIT9TVeDgX4A//OX2EO/W5QY+uQjseB9ouxHY+kgMGXuAtEFeUVGBgoICxMTEYPPmzX1OM3XqVABAVlZWz8+6g3/GjBkYPHgwFEUJSL0UGElJSdi1axeSkpJEl0J+9tEF4MT5gU17qQH4r2L/1kPBQcYeIG2Q79u3D263G7m5uRg6dGif0wwZMgRA7yCvqqrCgQMHEBcXh+nTpwekVgocl8uF69evw+VyiS6F/Mjl1nane6L8MmCV54wk6oeMPUDaIC8qKgIAzJkzp99prFYrgN5B/sgjj8But+Pw4cOYN2+ef4ukgKusrMT06dNRWVkpuhTyo8+sQHOb5/MVf+77Wii4yNgDpA3y2tpaAMCYMWP6fLyrqwvFxdq+tJuD3GSS9iUhMoyKy4Gdj0gkaUett7S0AADa2vr+WF5QUID6+npERERg7Nixfq1l2rRpcDgcfl2HUa1YscKj6bsvAnH06FGcPn16QPPs2bPHw6qC16P/WoKwqFGwO+xISJD30NGDub9AYmaOx/NdbbyOhIQJfqiI/MmTPuBNDwD83wfi4uJw6tQpr+aVNsjj4uLQ2NiI0tJSzJw5s9djdrsdGzZsAABkZmb6fUCbw+GAzWbz6zqMqrW11aPp29vbe74PdF6ZfnfdxwVdLpdUz+tWzqZrXs13o80p9esiK0/6gDc9AAjuPiBtkM+bNw8VFRXIz8/H/PnzkZaWBgAoKSnB8uXLUV9fDyAwF4KJi4vz+zqMKiwszKPpLRZLz/eBzivTXZLMZnPPd5me163ar13war5m26dSvy6y8qQPeNMDAP/3gXvJCUVVVdWHtQQNq9WKKVOm4Nq1awgJCcGECRPQ3t6OqqoqLFiwAG63G++++y7eeOMNPP/8830u45VXXsGPfvQjSPoSScHTASudnZ1wOp2IiIhAaOjArgAyYYI8u1p/eFAbBBY1BPjRd0RX4z/tndpz7ejybL7/MwdIv98/NZH/eNIHvOkBQHD3AWlHdiUkJODEiRNYuHAhLBYLampqEB0djZ07d6KwsBAXLmif2G8e6EbyCw0NRXR0tEd/wKQ/llDgwWTP5omNBMaP8k89FDxk7AHSBjkApKen48iRI3A6nXA6nTh58iRWrVqFlpYW1NTUwGQyYdKkSaLLpACqq6vDCy+8gLq6OtGlkJ/lPAAk3zewacMHAytnAyZe/0l6MvYAqYO8P2VlZVBVFampqX0eI9m/fz/279+P8vLyXv/3dkQhBQ+n04njx4/D6XSKLoX8LNSs7Sp/oO8zUHvERQFrvw3cx6s0G4KMPUDawW53cu7cOQD971ZfunRpn/9/7rnnpDoViUh2g0KA5x4GsjOBjz/X7n5W7wRUACEmYNUcIDUW4JWYSc8Y5H3g4DYiucRGanc4e3Lq1wP+wgcDaTyhhCRgyF3rdwtyIiIivTDkFnn3ddjJeGJjY7Fx40bExsaKLoWIBJCxBxgyyMm4YmJiPL6sKxHJQ8YeYMhd62Rczc3NOHbsGJqbm0WXQkQCyNgDGORkKFarFevWreu5hS0RGYuMPYBBTkREpGMMciIiIh1jkBMREekYg5wMxWKxID09vedWhkRkLDL2AJ5+RoaSnJyMgwcPii6DiASRsQdwi5yIiEjHGORkKOXl5cjMzOy5sx0RGYuMPYBBToaiqio6Ozt5Yxwig5KxBzDIiYiIdIxBTkREpGMMciIiIh3j6WdkKMnJyTh8+DASExNFl0JEAsjYAxjkZCgWiwWpqamiyyAiQWTsAdy1ToZis9nw8ssvw2aziS6FiASQsQcwyMlQmpqacODAATQ1NYkuhYgEkLEHMMiJiIh0jEFORESkYwxyIiIiHWOQk6HExMTg+eefR0xMjOhSiEgAGXsAg5wMRVEUDBo0CIqiiC6FiASQsQcwyMlQrl69itdffx1Xr14VXQoRCSBjD2CQExER6RiDnIiISMcY5ERERDrGICdDiYqKQk5ODqKiokSXQkQCyNgDeNMUMpSEhARs2bJFdBlEJIiMPYBb5GQoHR0dqK2tRUdHh+hSiEgAGXsAg5wMpaqqCtnZ2aiqqhJdChEJIGMP4K71IKWqKlrdLtFlDFiYySzVBRaIiPSCQR6kWt0uDC/6o+gyBqxx7nyEm/l2IiIKNO5aJyIi0jEGORERkY5xXygZSkZGBioqKkSXQUSCyNgDuEVORESkYwxyMpTq6mosW7YM1dXVokshIgFk7AEMcjKU1tZWnD17Fq2traJLISIBZOwBDHIiIiIdY5ATERHpGIOciIhIxxjkZCjx8fHIz89HfHy86FKISAAZewDPIydDGTZsGBYtWiS6DCISRMYewC1yMpSGhgbs3bsXDQ0NokshIgFk7AEMcjIUu92OTZs2wW63iy6FiASQsQcYIsjr6+uRl5eHlJQUWCwWJCYmYu3atWhpacHKlSuhKAp27Nghuky/cO3eg85vPwr3sfdue0xVVXT900Z0LlwEtbom8MURUcCoKnC5ESizAp9ZAWuD9jPSP+mPkZ85cwYLFiyAw+FAeHg4Jk6ciMuXL2P79u24ePFiz+6VKVOmiC3UT0zLc+H+5CRcO9+EMvUbUEbG9DzmPngI6qfnYPrfK6CMTRJXJBH5TZcLKKkGij/Xwvtmo4YBD6cCM5KBULOQ8sgHpN4ir6+vR05ODhwOB9avXw+73Y7S0lI4HA7k5+ejsLAQJSUlUBQFmZmZosv1CyU0FCEb1gPt7XC99u89P1cvWeHe859QJoyHaelicQUSkd+03QB2HgcKTt4e4gBgbwJ+XwL8x/tAS0fAyyMfkTrI16xZA6vVitWrV2Pr1q2IiIjoeSwvLw9ZWVno6upCUlISIiMjBVbqX0pqCkzLnoL6l1K4C9+B6nLBtWUroKowb1gPxWycj+Lh4eGYNWsWwsPDRZdC5FddLmD3/wCff3n3aavrgV0fAp0uv5clnIw9QNogr6ioQEFBAWJiYrB58+Y+p5k6dSoAICsrq+dn+/fvx+LFizFmzBiEhYVhwoQJ+MEPfoDr168HpG5/MeU+A4wbB9ebu+B+/ZdQz1+AacV3oSQmiC4toJKSkrBr1y4kJSWJLoXIr0prBxbi3arrgZMX/VdPsJCxB0gb5Pv27YPb7UZubi6GDh3a5zRDhgwB0DvIt27dCrPZjB//+Md455138P3vfx+/+MUvkJ2dDbfbHZDa/UEJCUHIhpeAG51wHymEMikDpu88IbqsgHO5XLh+/TpcLgNsepChfXTB83mKL8g/AE7GHiDtYLeioiIAwJw5c/qdxmq1Augd5G+//TZGjhzZ8//Zs2dj5MiRyM3NxUcffYRHHnnETxUHQHg4EBoKdHVBmT4Niknaz3H9qqysxJIlS7B//35kZGSILofIL75sBuqueT6fvVk7lp44wvc1BQsZe4C0QV5bWwsAGDNmTJ+Pd3V1obi4GEDvIL85xLtNmzYNAGCz2byqZdq0aXA4HB7Now4aBOx83av19bk8VYXrp9uArk5gdCLcv/ktTLMfgXL/KJ8sPy01DcqNGz5ZlidWrFjh0fTd544ePXoUp0+fHtA8e/bs8bCq4PXov5YgLGoU7A47EhKmiy5HCCO8BvelfhOP/P0+r+Zd/MxKXC5/18cV+ZcnfcCbHgD4vw/ExcXh1KlTXs0rbZC3tLQAANra2vp8vKCgAPX19YiIiMDYsWPvuKzjx48DANLT072qxeFweP4hwDIYoV6trW/uQ4ehnv0Upu89B9PMh9D14j/C9dNtMG/Nh6Io97z8y/bLQHvgh716ek/h9vb2nu8DndfbD3DBqHt3osvlkup5ecIIr4Fp2FWv5712rV53r4snfcCbHgAEdx+QNsjj4uLQ2NiI0tJSzJw5s9djdrsdGzZsAABkZmbeMchsNhv+7d/+DdnZ2V6fax4XF+fxPOqgQfD+T/GWZdlscO/eA2V8GkxPLYFiNsP0bC7cv/o13IcOw/zk4/e8jvtH3S9kizwsLMyj6S0WS8/3gc4r080VzH89Q8FsNkv1vDxhhNcgLET7W1RVdcAf1LunHWLu0N3r4kkf8KYHAP7vA97kRDdpg3zevHmoqKhAfn4+5s+fj7S0NABASUkJli9fjvr6egB3vhDM9evX8fjjj2PQoEHYvXu317V4s7ukxdWF4UV/9Hqd3VS3G65XXwPcbpg3vNRzqpnpqSVQiz+Ge/cemB6ccc+72C98fgHh5sC/nSorKz2avqysDLt378ajjz464ONjmzZt8qa0oPTDg0BzGzAqblTPGBGjMcprsO1doLZ+4HvbFEXB/cOAcyePwQc76QLKkz7gTQ8AgrsPSDvaKS8vDyNGjMClS5eQkZGByZMnIzU1FTNmzMC4ceMwd+5cAL2Pj9+sra0NOTk5qK6uxnvvvYdRo3xzLDnQ3PsPQi2vgOm5Z6GMHt3zc8VshvmfXgLcLrh+ug2q7ENV/yotLQ3FxcU9H+yIZPVwqufzzEqD7kLcUzL2AGmDPCEhASdOnMDChQthsVhQU1OD6Oho7Ny5E4WFhbhwQTs3o68g7+zsxJIlS3Dq1Cm88847mDhxYqDL9wm1rg7uX/8XlPQJMC3+zm2PK0ljYHo2F+q5z+A+dFhAhYEXGhqK6OhohIb6cgQCUfD5RhIw3oPtj+T7gAfH+a2coCFjD5A2yAFtcNqRI0fgdDrhdDpx8uRJrFq1Ci0tLaipqYHJZMKkSZN6zdN97vkHH3yAt956CzNmzBBU/b1TRo9GaOFbCPnZa/1evc38zNMIfe+oT46T60FdXR1eeOEF1NXViS6FyK/MJuB73wTGD+DQa/J9wMpHgBADXORRxh4gdZD3p6ysDKqqIjU19bbBDi+++CJ+//vfY926dQgLC8Mnn3zS83X1qq+Gn5EoTqcTx48fh9PpFF0Kkd9ZQoFVc4C/mwmM6ePc8IRoYNlDwPfnAmGDA1+fCDL2AGkHu93JuXPnAPS9W/2dd94BAPzkJz/BT37yk16P/epXv/L4vGUiIpHMJmDGOO3L0Qxsfw9ovQEMHQysz5b/mLgRMMhvUVNTE+BqiIgCIy7q69uVmk0McVkYctf6nYKciIhITwy5Rd59HXYyntjYWGzcuBGxsbGiSyEiAWTsAYYMcjKumJgYjnMgMjAZe4Ahd62TcTU3N+PYsWNobm4WXQoRCSBjD2CQk6FYrVasW7dO6ktzElH/ZOwBDHIiIiIdY5ATERHpGIOciIhIxxjkZCgWiwXp6ek99yQmImORsQfw9DMylOTkZBw8eFB0GUQkiIw9gFvkREREOsYgJ0MpLy9HZmYmysvLRZdCRALI2AMY5GQoqqqis7MTqqqKLoWIBJCxB/AYeZAKM5nROHe+6DIGLMxkFl0CEZEhMciDlKIoCDfz10NERHfGXetEREQ6xk0+MpTk5GQcPnwYiYmJokshIgFk7AEMcjIUi8WC1NRU0WUQkSAy9gDuWidDsdlsePnll2Gz2USXQkQCyNgDGORkKE1NTThw4ACamppEl0JEAsjYAxjkREREOsYgJyIi0jEGORERkY4xyMlQTCYTpk+fDpOJb30iI5KxB8jzTIgGwO12o6SkBG63W3QpRCSAjD2AQU5ERKRjDHIiIiIdY5ATERHpGIOcDCUqKgo5OTmIiooSXQoRCSBjD+C11slQEhISsGXLFtFlEJEgMvYAbpGToXR0dKC2thYdHR2iSyEiAWTsAQxyMpSqqipkZ2ejqqpKdClEJICMPYBBTkREpGMMciIiIh1jkBMREekYg5yIiEjHePoZGUpGRgYqKipEl0FEgsjYA7hFTkREpGMMcjKU6upqLFu2DNXV1aJLISIBZOwB3LVOhtLa2oqzZ8+itbVVdCkB4XIDjmbgUgNgawBab2g/b70BvHsOSIzWviKGiK3TX1QVaG4DLl3TXoPGlq9fg7YbQMkXQEI0EBsJSHR76l46OgFbo/b8Hc293wMfVmi///howBIqts5AkbEHMMiJJHT1K6D4c+DPX3zduG/W6QLe+fTr/48dCTycCmSNBkLMgavTXzq6gNIa4KMLWoj15YYL2Psn7d8RFmBmivY1PDxgZfqNqgLVV7Xnf/aS9oHuVp0u4FCp9m+TAkxO1N4DKbGAogS2Xro3DHIiiTjbgAOngDN1ns1XfVX7+kMp8MQ3gKlJ+mzmbhUovgAUngXaOwc+n7MdeO8z4I9lwEPJwKIHgCGD/FenP1kbgIKT2hb4QLlV4Gyd9nX/MGDZQ8DoEX4rkXyMQU4kidIaLcRb7uES0tfbgf/+WPsg8NQMIFJHu9zrncBvTwJVX3q/DFUF/lQFVFwGnn4QSL/fd/X5m8v91w8jn2nB7K3LTcC2d4G56cCCTDn20MhO0qNCRH2Lj49Hfn4+4uPjRZfiM6oKFJ4B/rP43kL8Zp9ZgdeOAV9+5Zvl+VttvVbvvYT4zZpagZ3HgRPnfbM8f7vRBbz5oTbu4V5CvJuqAh+UA7887tmeDT2QsQcoqqr64NdOJEZlZaXf1zFhwgS/r+NeFJ7Rdgn7Q6QF+MdvAyMj/LN8X7jUALz+vv8CZ/E04Jvj/bNsX+hyAW98CFxw+Gf5Y0cC358LDAri/bdG7wPcIidDaWhowN69e9HQ4MEBxCD25y/8F+IA8FU78MZxbYsvGF1v17ac/bnVeOCUtqs9WO0v8V+IA9rYiX2f+G/5gSZbDwAY5GQwdrsdmzZtgt1uF13KPWtqBQ6e8myel7KBV57Uvg/UVSdw5Ixn6wmU/SVamHvCm9eg4KR2ulqwKbcBn1z0bB5vnv/pWm0gnAxk6gHdDBHk9fX1yMvLQ0pKCiwWCxITE7F27Vq0tLRg5cqVUBQFO3bsEF0mkUd+d9LzLdHIIcCwMM8HsZ04D3xxxbN5/O1sneej8wHvXoOmVuCtUs/X5U/tndoHDE95+x74/Z99NwaDfEv6ID9z5gwmT56MV199FQ6HAxMnTkRnZye2b9+Op59+uueau1OmTBFbKJEH6q4B5QHc3atCGxEdLFQVOHYusOs8+YV2QZlg8clF7WI3gXK9Q7s2AQUfqYO8vr4eOTk5cDgcWL9+Pex2O0pLS+FwOJCfn4/CwkKUlJRAURRkZmaKLpdowEQ01Eq7tps9GFRfBexNgV2nqgIfB0mQdZ8vH2gff973xWVILKmDfM2aNbBarVi9ejW2bt2KiIivh97m5eUhKysLXV1dSEpKQmRkpMBKKVDCw8Mxa9YshIfr9/JdbTe0c8ZFCJYgE7Vl+MnF4Aiyqi/FfKhqag3ugX8DIUMPuJW0QV5RUYGCggLExMRg8+bNfU4zdepUAEBWVlbPz06cOIF58+Zh1KhRGDx4MBISEnrtgid9S0pKwq5du5CUlCS6FK/VXtMurymCr87Tvlei6nC2A1eC4Nx6kb+Hz4PkPeAtGXrAraQN8n379sHtdiM3NxdDhw7tc5ohQ7TRHjcHeWNjIyZPnozt27fjvffeQ35+PsrKyjBz5kxYrdaA1E7+43K5cP36dbhcgpLQBy5dE7fuy03aecsifdUW2GPDt/Lk0qcy1mANgud/L2ToAbeSNsiLiooAAHPmzOl3mu5gvjnIFy1ahG3btmHp0qWYPXs2cnNzcfDgQTQ3N+PAgQP+LZr8rrKyEtOnTw/IBST8xdrPTUACoftuaiKJDpJgCHKRr4G1QRsvoFcy9IBbBfG1eu5NbW0tAGDMmDF9Pt7V1YXi4mIAvYO8LyNGaHcPCAnx7uWaNm0aHA4/XrHBwFasWOHR9N3njh49ehSnT58e0Dx79uzxsCr/mr3q9xiZPLPPx17KvvNpRZGWr7+/8uSd1/NVm3bZ01stWvwMrnx+YoDV+t7obyzGjKd/1udjd3v+wMBfg/6e/97fHsLaJ1YPsFr/WLy5Foqp74ug++o90N/z7+gCxiSNg9sVPCfWe9IHvOkBgP/7QFxcHE6d8vDCEH8lbZC3tGjnibS19b0PrqCgAPX19YiIiMDYsWNve9zlcsHtdqO2thb/8i//gri4ODz11FNe1eJwOGCz2byal+7M03sKt7e393wf6LzB9rvrvMNoq+5zhO/GZBrYdH1pbGwW+poMS7ne72MDff6A969BR2eX2PeEovQb4kBg3gOOK1fR2d7/7yHQPOkD3vQAIPj6wM2kDfK4uDg0NjaitLQUM2f23nqx2+3YsGEDACAzMxNKH/drnD17ds8We0pKCoqKijBy5EivayH/CAvzrBNZLJae7wOdN9hurhBi6n+/5ld3OXYcadEauNutXX71Tvpb1vCoCHQKfE0iI/ofbXy35w8M/DXob1mDQkzC3xPurhswhfR9n1VfvQfutJzYkSOguqMGUGlgeNIHvOkBgP/7wL3khLQ3TVmzZg1+/vOfIzExEe+//z7S0tIAACUlJVi+fDm++OILdHZ24sUXX+zzqm7nz59HU1MTqqur8eqrr+LKlSsoLi7G6NGjA/1U6A48Pc5VVlaGJUuWYP/+/cjIyBjQPMF2s4Tf/Em7xro3XnlS2wpragVe+YN3y/jBIrE3Ubn4JfDz972f/15fg/kZwMIp3q/fFza9BdR7uUF8r88/0gL8v8XerdtfPOkD3vQAIPj6wM2kHeyWl5eHESNG4NKlS8jIyMDkyZORmpqKGTNmYNy4cZg7dy6A/o+Pjx8/Hg8++CCWLVuGDz74AE6nE1u2bAnkUyA/SEtLQ3Fxcc8HOz1KjBa3bksoENP3SSABEx8N3L4PLXASBL7+wVBDMDz/eyFDD7iVtEGekJCAEydOYOHChbBYLKipqUF0dDR27tyJwsJCXLigXRbpbgPdAGDYsGFISUlBVVWVv8smPwsNDUV0dDRCQ0NFl+I1kY00MRro40hUQFlCgZECr98k8oNUMNSQOELcun1Bhh5wK2mDHADS09Nx5MgROJ1OOJ1OnDx5EqtWrUJLSwtqampgMpkwadKkuy7nypUrOH/+PJKTkwNQNflTXV0dXnjhBdTV6fdWTqNHfD3yONAmBslwgQxBdYwaBgwPgguCZSQIXHeQvAe8JUMPuJXUQd6fsrIyqKqK1NTU2wY7PPvss3jllVdw6NAhfPjhh3jzzTfxrW99CyEhIVi3bp2gislXnE4njh8/DqczSC4a7gWzCXgoJfDrDTUDD44L/Hr7MitV3HpF75EAgLgoICU28OsdPUL70jMZesCtDBnk585pt03qa7f6Qw89hKNHj+J73/seFixYgFdffRXf/OY3cebMGaSkCOieRH34m1TAFOBAeWAMEDY4sOvsT0wEMGFUYNc5OASYdvuZqsI8LODDjKgPUHRn0p5+did3CvLVq1dj9WqxF3sgupthYcC3JgBFAboFwOAQYEGQ3SAw5wHggkO7E1ggLMjUjs8Hi8xEYOxI7U5wgZAQHVwfZOhr3CIn0qkFWcB9ARr09cTU4Dg2fLP44cC3JwdmXWNHAo+MD8y6BspkAp55SDvk4W9mE/B3D2nfKfgY8tdSVFQEVVWxcOFC0aVQgMXGxmLjxo2IjRVwgNHHQs1A7kwgxIO/4q/atPOHB3LhlG4Z8cBDQTrOc34GMCbGs3k8fQ2GDNJCzBSE3fK+SODxb3g2jzfvgUczgfuHe7aeYCVTD+gm7QVhyBgCceODYL4QBACUWYHdJ/xzn+xxI4F/mAsMCuKDcC0dwI73AXuT75c9KAT4/lxtizyYHT0LvPeZf5Y9ewLwxDeCY5Bff4zeB4LwMyaR/zQ3N+PYsWNobhZ8Cy8fykgA/n6278M2/f7gD3EACB8MrJ7n+Zb5QJb7wt8Gf4gD2vH7hX44UvjtScEf4p6SsQcwyMlQrFYr1q1bJ9295dPvBzYu9M0pSYPMwHemAc9/K/hDvFv4YGDNfCA70zej+TMTgX9eCCT5+MOBvygKMH+S9oFmhA+uvDcsTNsT8WiWXCEOyNkDdPJnSkR3M2KotgX5pyrggzKgocWz+U0KMCkBWPSAdnqX3phNQPZkYHIC8PZpoNLu+TLiorSt0AfG6DPAUmKBvIXAu+eAjz8H2js9m39wiHaNgmAboU93xiAnkohJ0c71nZmsBdnHVcAXV4DWfm4drShAbCSQNRqYmeL9bS2DSfxw7ZDAVSdQfAEos2n/7k+ERQvAv0kFUu7TZ4DfbHCI9mHsf00GTtdoN9i51AB0uvqePtSsvWbTxwJTxzLA9YhBTiQhk0m7nOrEeEBVta1zWyPQdkMbFBdi1m5+Eh+tNX4ZjYzQTpt7Yqr2vK2NQGML0OXStt7DB2vnRkcN0X9496V76/qhFO13fuUrbUDgjS5AhXYIZdQwIDaKp5XpnaR/wkR9s1gsSE9P77knsREoirbb3RfHTvVqyCAgVZ6zjTxmNmmhPWqY6ErEk7EH8PQz0jWjn3ZCROwD3KFCRESkYwxyMpTy8nJkZmaivLxcdClEJICMPYBBToaiqio6OzvBI0pExiRjD2CQExER6RiDnIiISMcY5ERERDrG88jJUJKTk3H48GEkJiaKLoWIBJCxBzDIyVAsFgtSU1NFl0FEgsjYA7hrnQzFZrPh5Zdfhs1mE10KEQkgYw9gkJOhNDU14cCBA2hqahJdChEJIGMPYJATERHpGIOciIhIxxjkREREOsYgJ0OJiYnB888/j5iYGNGlEJEAMvYA3saUiIhIx7hFTkREpGMMciIiIh1jkBMREekYg5yIiEjHGOREREQ6xiAnIiLSMQY5ERGRjjHIiYiIdIxBTkREpGMMciIiIh1jkBMREekYg5yIiEjHGOREREQ6xiAnIiLSMQY5ERGRjv1/40zQ3oZuDFEAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "balanced_oracle = QuantumCircuit(n+1)\n", "b_str = \"101\"\n", "\n", "# colocamos la pueras X en los bits igual a 1\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "\n", "# Usamos las barreras para diferenciar las partes\n", "balanced_oracle.barrier()\n", "\n", "# Controlled-NOT puertas\n", "for qubit in range(n):\n", " balanced_oracle.cx(qubit, n)\n", "\n", "balanced_oracle.barrier()\n", "balanced_oracle.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finalmente añadimos las puertas X en los qubits 0 y 2 para así obtener un oráculo balanceado" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "balanced_oracle = QuantumCircuit(n+1)\n", "b_str = \"101\"\n", "\n", "# colocamos la pueras X en los bits igual a 1\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "\n", "# Usamos las barreras para diferenciar las partes\n", "balanced_oracle.barrier()\n", "\n", "# Controlled-NOT puertas\n", "for qubit in range(n):\n", " balanced_oracle.cx(qubit, n)\n", "\n", "balanced_oracle.barrier()\n", "\n", "# colocamos X-gates\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "\n", "balanced_oracle.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una vez creados los oráculos correspondientes procedemos a comprobar el algoritmo de Deutsch-Jozsa. Lo primero que hay que hacer es pasar una puerta de Hadamart sobre los primeros tres estados y en el cuarto pasarlo al estado 1 y después aplicar otra puerta de Hadamart" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dj_circuit = QuantumCircuit(n+1, n)\n", "\n", "# Añadimos H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "\n", "# Punemos el qubit en el esatdo |->\n", "dj_circuit.x(n)\n", "dj_circuit.h(n)\n", "dj_circuit.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora aplicamos un oráculo balanceado que se ha construido anteriormente" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dj_circuit = QuantumCircuit(n+1, n)\n", "\n", "# Añadimos H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "\n", "# Punemos el qubit en el esatdo |->\n", "dj_circuit.x(n)\n", "dj_circuit.h(n)\n", "\n", "# Añadimos el oráculo\n", "dj_circuit = dj_circuit.compose(balanced_oracle)\n", "\n", "dj_circuit.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finalmente aplicamos una puerta de Hadamrt sobre los tres primero qubits y medimos los tres primeros qubits (los del registro 1)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7UAAAFvCAYAAACVY+xVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRNElEQVR4nO3deXxU9b3/8ffMZA+BEEASEiAQwhY2C6gIlUJBWcWFrRctVG/VIoob0EV+WMtVEdRq1ZYrUlqvCy1Qi4DUhUWkiuwihFW2hMQa1myEZGZ+f4yJLAEyw8ycnHNez8eDB8yc7XOG+X7Pec/ZHF6v1ysAAAAAAEzIaXQBAAAAAAAEilALAAAAADAtQi0AAAAAwLQItQAAAAAA0yLUAgAAAABMi1ALAAAAADAtQi0AAAAAwLQItQAAAAAA0yLUAgAAAABMi1ALAAAAADAtQi0AAAAAwLQItQAAAAAA0yLUAgAAAABMi1ALAAAAADAtQi0AAAAAwLQItQAAAAAA0yLUAgAAAABMi1ALAAAAADAtQi0AAAAAwLQItQAAAAAA0yLUAgAAAABMi1ALAAAAADAtQi0AAAAAwLQItQAAAAAA0yLUAgAAAABMi1ALAAAAADAtQi0AAAAAwLQItQAAAAAA04owugAAV2bnzp01Hvc///mP/va3v2nkyJG66qqrajxd27ZtAykNQBj40wdIgfUD9AGozWgDADhSC9jIt99+q1deeUXffvut0aUAMAj9AOyONgBYD6EWAAAAAGBahFoAAAAAgGkRagEAAAAApkWoBWykXr16Gjp0qOrVq2d0KQAMQj8Au6MNANbj8Hq9XqOLABA4f+/6GAju+gjUXvQBsDvaAACO1AI2UlZWpoMHD6qsrMzoUgAYhH4AdkcbAKyHUAvYyN69ezVgwADt3bvX6FIAGIR+AHZHGwCsJ8LoAlA9r1c64za6ipqLckkOR/Dm5/V6VeIx0QcgKc7pkiOYHwIA2BjbAfYF7M7r9aqkpMToMvwSFxfHvhAMQaitpc64pSnzja6i5maMkqKD+G0q8bhVf8WHwZthGBzv21/xLpoUAAQD2wH2BeyupKREderUMboMvxQVFSk+Pt7oMmBDnH4MAAAAADAtQi0AAAAAwLQ4SQSwkaysLGVnZxtdBgAD0Q/A7mgDgPVwpBYAAAAAYFqEWsBG9u/fr9GjR2v//v1GlwLAIPQDsDvaAGA9hFrARkpKSrR161bTPSIAQPDQD8DuaAOA9RBqAQAAAACmRagFAAAAAJgWoRYAAAAAYFqEWsBGUlNTNWPGDKWmphpdCgCD0A/A7mgDgPXwnFrARhITE3XzzTcbXQYAA9EPwO5oA4HLyMhQcXGx8vPzjS4FOAehFrCRY8eO6f3339fAgQOVlJRkdDkADEA/ALuzWxvo0KGDbrjhBnXr1k1XX321GjRooIiICJ0+fVr79+/Xxo0btWHDBn3wwQc6ceLERefTqlUrrVy5UkVFRerTpw/BFrUKoRawkby8PE2fPl1dunSxxYYcwIXoB2B3dmgD0dHRGjFihMaPH68ePXpcdLwWLVqob9++knyPOnrnnXf06quvauPGjeeMVxlo09LSJEkvvfSSRo4cGboVAPxki2tqCwoKNHnyZLVq1UoxMTFq2rSpJk6cqOLiYt19991yOBx6+eWXjS4TQAgdL5Y+2yut2CGt2SUdKJC8XqOrAgAguHr27Kkvv/xSb7zxxgWBtqKiQkeOHNGhQ4d09OjRc4bFxcXprrvu0oYNGzRv3jwlJiZKujDQfvnll/rFL34RlnUBasryoXbLli3q2LGjZs6cqfz8fLVv317l5eV66aWXNGrUKGVnZ0uSunTpYmyhIZKzY5VevMOhjUtnXXScF+9w6J+zhoSxqvBxz52n8hsHybP8gwuGeb1eVTw2ReWDb5Z3/4HwF4ewOFAgzVktPflPaf46afFmaeEG6ff/kp57X/ria8ItYHV23xbYfV/ALiIiIvTcc8/pk08+UevWrave37p1qx566CFde+21SkhIUGpqqpo3b66GDRsqOTlZgwcP1osvvnjOqcdjx47V9u3bNW7cuAsCbd++fS8IxIDRLB1qCwoKNHToUOXn5+vRRx9VXl6eNm3apPz8fM2YMUNLly7V+vXr5XA41KlTJ6PLRQg47xwjpTeXe/Zr8n5bcM4wz6J35f1ym5x33iFHi3RjCkRIbdwvvfSB9FVO9cE157j01me+sOsh2AKWxbYAVhcdHa1FixbpkUcekdPp273/7LPP1KtXL3Xp0kUvvviivvjiC50+ffqc6b755hstW7ZMDz30kFJTUzVhwgSdPHlSktSkSRPNnTuXQAtTsHSoffDBB5WTk6MJEyZo1qxZSkhIqBo2efJkde7cWRUVFUpPT1fdunUNrBSh4oiMVMSkR6XTp+V+/vdV73sP58gz769ytG0j54jbjSswzOLj49WzZ0/Fx8cbXUrI7cqT3vysZmH1833Ski0hLwmoFezUD1RiW4CzWa0NuFwuvfPOOxo6dKgkqaysTI899ph69eqltWvX1ng+JSUleuWVV5SVlaXVq1dLkhwOhyTp4MGDBFrUapYNtdnZ2Zo/f74aNmyop59+utpxunbtKknq3LnzOe/v379fN998sxISElS/fn399Kc/pRGbmCOzlZyjR8q7cZM8S9+X1+2W+9lZktcr16RH5XC5jC4xbNLT0zVnzhylp6cbXUpIeb2+04z9Ofq6Kls6URK6moDawi79wPnYFqCS1drAb37zG91yyy2SpKKiIg0YMEDPPfecPB5PQPOLjY1VRkbGOe81atRI9evXv9JSgZCx7N2P3377bXk8Ho0ZM0Z16tSpdpzY2FhJ54bawsJC9enTR0lJSXr77bdVWlqqyZMna8iQIVq7dm3VKR1mU3GmRKWFBZcf0aKcY34iz2fr5H5tjpz7vpZ312457/lvOZqmGV1aWLndbpWWlio2NlYuC+/AHSiQco/7N43H67uR1ECuRIDF2aUfqI7dtwV23xeoZKU20LlzZz3++OOSfDeBuuWWW7Rq1aqA53f+TaGOHTumpKQkxcXFae7cuerdu7e83IgCtZBlQ+2KFSskSX369LnoODk5OZLODbX/+7//q9zcXH3yySdq1qyZJCktLU3XX3+9Fi9eXPVLmNl8vnCaPl84zegyDOOIiFDEpEdU8cBD8ixZKkeHLDlvu8XossJu586dGj58uBYsWKCsrCyjywmZTQcDnO4AoRbWZ5d+oDp23xbYfV+gkpXawOuvv67IyEhJ0tNPP62PP/444HlVd5fjIUOGaOXKlcrIyNAPf/hD3XffffrjH/8YlNqBYLJsqD140LdX27x582qHV1RUVF1ncHaoXbJkiXr16lUVaCWpR48eatmypd57772AQm23bt38fkC1KzJWt07f4/eyLqZDn3uUee2Iaof945n+Vzz/1pmZcpeXXvF8KnmjoqTZrwRtfpKk+HgpMlKqqJCjezc5gnzUvXVmaznOnAnqPGti3LhxNR43Ly9PkrRs2TJt3ry5xtPNmzfPz6qMde1/vaKmnYf5Pd2Rb08pLa19CCoCQsefPkAKrB8wog8IyXZACum2INjbAbvvC9SUVdvA5U4f7tOnT9WldNu2bdPvfve7gJdVXaCtvIb2rrvuqrrG9tFHH9Wf/vSnix6tzczMNO1ZjTBecnKyNmzYENC0lg21xcXFkqTS0uo71/nz56ugoEAJCQlq0aJF1fs7duzQiBEXdvhZWVnasWNHQLXk5+crNzfXr2kiouMCWtbFJCZnqlmHfkGd59mO5B1RRVkQL0iMiVZk8OYmr9cr93MvSBXlUrOm8rz1jpy9b5CjSUrQlnEk74h0uixo86upkpKaf+6Vdz08ffq0X9P5+/01WnFRYUDTlZ8pM926Av60ZSmwfsCQdhHk7YAU+m1BsLcDtt8XqCHLtoHLGD9+fNW/n3zySZWXlwc0n0sFWkn65JNP9MEHH+jGG29URkaGbrzxRv3rX/+qdl6VPxgA4WbZUJucnKzjx49r06ZNFzx4Oi8vT5MmTZIkderUqerObpJ0/PjxqodNny0pKUm7du0KuBZ/uSJjA1qWUZqkNAn6kdpvgzY3yfPuYnm3finnz8bK2eM6Vdz/gNzPvSDXrBnn/P9fiSYpTQw5UhsXV/OdnpiYmKq//ZkuNTXV77qM5C75JqDpSo8fNN26Av60ZSmwfsCIdhHs7YAU+m1BsLcDdt8XqCmrtgGPx3PRkJiUlFR19mBeXp7efffdgJZxuUBb6dVXX9WNN94oSbrrrrsuGmpTUlI4UouABZKZKlk21Pbr10/Z2dmaMWOG+vfvX/UQ6vXr1+vOO+9UQYHvRgldunQJeS2BHEYvq5CmzA9BMSGye88eRQfx21TsrlD9FR8GZV7e3Fx55s6To01rOUcOl8PlkvOOMfL8+S/yvLtYrlv9P021Orv37Fa8K/xNaufOnTUed/v27Zo7d64GDRrk13VE06dPD6Q0wxwvlp78Z/XPpr2UCaO66Y1f54SmKCBE/OkDpMD6ASP6gGBuB6TwbAuCvR2w+75ATVm2DRQXX/Rmp926dVNEhO/D/tvf/qaKigq/51/TQCv5Ls87efKk6tWrd8HBorPt2bPHMo9KgrlY9qeUyZMnq0GDBjp8+LCysrLUsWNHZWZm6pprrlHLli3Vt29fSRc+zqd+/fo6ceLEBfOrvPsbzMXr8cg983nJ45Fr0iNVj2xwjhwuR+tMeebOk/eIfU6Vad26tdauXVv1I49V1Y+XOvj5o3pclHR19ZfgA5Zil37gbGwLcDYrtIHKa2kl3wEbf/kTaCXfHaMrrz9u2rSpGjVqFEDVQOhYNtSmpaVpzZo1Gjx4sGJiYnTgwAElJSVp9uzZWrp0qXbv3i3pwlDbrl27aq+d3bFjh9q1axeW2hE8ngWL5N2RLefYO+Q46+ZfDpdLrscekTxuuZ97wTa3p4+MjFRSUlLVnRKt7PbuUr0anrnnkDSmhxRl2XNXgO/ZqR+oxLYAZ7NCG+jU6ftb9W/atMmvaf0NtJU2btxY9e/z958Bo1k21Eq+gLpkyRIVFhaqsLBQ69at0z333KPi4mIdOHBATqdTHTp0OGeaIUOG6NNPP6163I8krVu3Tvv27dPQoUPDvQq4At5Dh+T5yxtytGsr5+23XTDckd5czjvGyLvtK3neXWxAheF36NAhjR8/XocOHTK6lJBLjJMm9JcaJlx6vAiX9LMbpCx7PKYSsFU/ILEtwIWs0Abq1atX9W9/nrARaKCVpG+++f5+FQkJl9m4AmHm8NrwZ8l169bpuuuuU5s2bS64DuPUqVPq2LGjGjZsqN/+9rc6ffq0Jk+erEaNGumzzz4L28XvZruOZsYo1dprasPleN/+primNpBn87Vt2zaQ0mqFMxW+59Z+ulvKOfb9+w5JN3aUerTyBWDArAK5ntDffsCIPoDtAPsCNWXZNnCJa2rr16+vhIQExcTEaO/evZd9/E+lQYMG6R//+IeioqL8CrSS7+ZU9evX1+nTp1VQUKCysgvv9F1UVMQ1tTCELU+227Ztm6TqT52oW7euVqxYoYkTJ2r06NGKiIjQkCFD9MILL3A3N8CEoiKk6zKka1tKRaelGUulojIpIUYa2Ony0wMAUNscP35cx48f93u6ZcuWacSIEZo6daoGDBhQ40Ar+e4vc+zYscuPCBiAUFuNjIwMLVmyJJwlAQgxh0NKiJVczu9fAwBgN4sXL9aSJUtqfHQXMANbHnq8XKgFAAAArIpAC6ux5ZHaFStWGF0CYIjGjRtrypQpaty4sdGlADAI/QDsjjYAWI8tQy1gVw0bNtS4ceOMLgOAgegHYHe0AcB6bHn6MWBXJ0+e1PLly3Xy5EmjSwFgEPoB2B1tALAeQi1gIzk5OXr44YfPeQ4zAHuhH4Dd0QYA6yHUAgAAAABMi1ALAAAAADAtQi0AAAAAwLQItYCNxMTEqF27doqJiTG6FAAGoR+A3dEGAOvhkT6AjWRkZGjRokVGlwHAQPQDsDvaAGA9HKkFAAAAAJgWoRawkR07dqhTp07asWOH0aUAMAj9AOyONgBYD6EWsBGv16vy8nJ5vV6jSwFgEPoB2B1tALAerqmtpaJc0oxRRldRc1Gu4M4vzunS8b79gzvTEItzBvlDAAAbYzvAvoDdxcXFqaioKGjzmzn7HZ0qLlHd+DhNunf0Ba+DIS4uLijzAfxFqK2lHA4p2sb/Ow6HQ/EuG38AAGBzbAfYF7A7h8Oh+Pj4oM0vKjpGUeVuRUXHKD4+/oLXgJlx+jEAAAAAwLT4/Q+wkYyMDC1evFhNmzY1uhQABqEfgN3RBgDrIdQCNhITE6PMzEyjywBgIPoB2B1tALAeTj8GbCQ3N1ePP/64cnNzjS4FgEHoB2B3tAHAegi1gI2cOHFCCxcu1IkTJ4wuBYBB6Adgd7QBwHoItQAAAAAA0yLUAgAAAABMi1ALAAAAADAtQi1gI06nU927d5fTSdMH7Ip+AHZHGwCsh9YM2IjH49H69evl8XiMLgWAQegHYHe0AcB6CLUAAAAAANMi1AIAAAAATItQCwAAAAAwLUItYCP16tXT0KFDVa9ePaNLAWAQ+gHYHW0AsJ4IowsAED5paWl69tlnjS4DgIHoB2B3tAHAejhSC9hIWVmZDh48qLKyMqNLAWAQ+gHYHW0AsB5CLWAje/fu1YABA7R3716jSwFgEPoB2B1tALAeTj+upbxe6Yzb6CpqLsolORxGVwEAsAqzbQcltoVAsHm9XpWUlBhdhl/i4uLkoCMIO0JtLXXGLU2Zb3QVNTdjlBTNtwkAECRm2w5KbAuBYCspKVGdOnWMLsMvRUVFio+PN7oM2+H0YwAAAACAaRFqAQAAAACmxUkygI1kZWUpOzvb6DIAGIh+AHZHGwCshyO1AAAAAADTItQCNrJ//36NHj1a+/fvN7oUAAahH4Dd0QYA6yHUAjZSUlKirVu3mu72+ACCh34AdkcbAKyHUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCNpKamqoZM2YoNTXV6FIAGIR+AHZHGwCsh+fUAjaSmJiom2++2egyABiIfgB2RxvAlXA6nfJ4PEaXgfMQagEbOXbsmN5//30NHDhQSUlJRpcDwAD0A7A72oD9OJ1OtWnTRl27dlWLFi0UHR2tiooKHT16VJs3b9bmzZtVXFx82fkMGTJE06dP14ABA5Sfnx+GylFThFrARvLy8jR9+nR16dKFDTlgU/QDsDvagH306tVL48eP19ChQ1WnTp2LjufxeLRx40bNnj1bb7/9drWPexoyZIgWLlyoqKgorVy5Ur169dLRo0dDWT78YItragsKCjR58mS1atVKMTExatq0qSZOnKji4mLdfffdcjgcevnll40uEwBCyuOVSs9IJWd8/wYAwIr69OmjrVu3as2aNfrJT35yyUAr+Y7kdu/eXXPmzFFubq6mTp2qyMjIquFnB1pJ2rhxo06cOBHKVYCfLH+kdsuWLRo4cKDy8/MVHx+v9u3b68iRI3rppZe0b98+HTt2TJLUpUsXYwsNkZwdq7TwqT7q9ZOZ6jr4sWrHefEOh9K7DNawx5aEuToA4fDNKWntbumLr6XT5b73oiOk7i2knq2llERDywNCiu0gYB916tTRs88+q1/84hfnvF9QUKBVq1Zp48aN2r59u4qLixUREaHmzZura9eu6tGjhzp16iTJd831k08+qdtuu03jxo1T06ZNzwm0b775psaOHSu32x329cPFWTrUFhQUaOjQocrPz9ejjz6qadOmKSEhQZL07LPPasqUKYqIiJDD4aj6IgOAVXi90rKt0ofbLxxWViF9usf3p3dbadgPJKcj/DUCABAMqamp+uCDD9S+ffuq97744gu9+OKLWrBggc6cOVPtdK+99pokqWvXrho/frzuvPNORUZGqkuXLlq/fr0cDociInyRiUBbe1n69OMHH3xQOTk5mjBhgmbNmlUVaCVp8uTJ6ty5syoqKpSenq66desaWCkQHvHx8erZs6fi4+ONLgVhsHhz9YH2fKt3SgvW+0IwrI9+AHZHG7CelJQUrV69uirQFhcX6/7779d1112nt95666KB9mwbN27U3XffrWuuuUZbt26VJEVGRhJoTcKyoTY7O1vz589Xw4YN9fTTT1c7TteuXSVJnTt3rnqvMgRfc801io6OlsPBoQtYR3p6uubMmaP09HSjS0GI7cqTVmbXfPx/75G+ygldPag96Adgd7QBa4mOjtb777+vjIwMSdLevXvVuXNnvfrqq/IG8Gvtli1b9MQTT5wTXj0ej1577TUCbS1m2dOP3377bXk8Ho0ZM+aiF4fHxsZKOjfU7t27VwsXLlT37t0VFRWltWvXhqXeUKs4U6LS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gSE/aBBqawmn06lWrVqpU6dOuu+++zR58mT95je/MbosAAAAmExEhEujhvSRy+Xfrn7LZk3Us3vHGo2bkpKi/PxzjwR+8803VcOM9sPuHdWiqX91RLhcGjWkryJcrhBVFT5JiXU19Mc9/J6uz3Vd1Cy1sV/TzJo1S5MmTdLixYvVr18/v5cZDITaWsrj8ej06dNGlwEAAAATSm6UpJtuuKbG40dHRWrk4B/JWcPrSHv27Kl//etf57y3fPlyNW/e3NBTjys5nU6NGPwjv444Duh9jRpf5lpiM+nWsY3aZzav8fipjRv6fZT6//2//6ff/va3WrZsmWGBViLU1grTpk3TRx99pK+//lq7du3Sa6+9phkzZmjs2LFGlwYAAACT6uXH0cph/XsqsW6dGs/74Ycf1hdffKHf/OY32rlzp/7yl7/oD3/4g375y18GWm7QJdVL0NB+19do3IzmTXR9tw5+zb+oqEhbtmzRli1bdObMGeXn52vLli3au3dvIOUGncPh0G033aA6cbGXHTciwqWRfh7df+ihhzRz5ky98cYbatOmjfLz85Wfn6+TJ09eSdkBcXi9598bDeH28MMP67333lNubq5iYmLUsmVL3XXXXbrvvvvkssDpDwAAADDG8ZOF+v3cBSo7U37RcTq0bqExt/Tz+26/S5cu1a9//Wvt3LlTycnJmjhxoh555JErLTmovF6v3vjHh9qx58BFx4mJjtJDdw33K9RL0qpVq9SnT58L3u/du7dWrVrlZ6Whs2PPAf110QeXHGfIj3uoV7eanXpe6WLfl7Fjx2revHl+zetKEWpN5nDef9Sgfj3FxUQbXQoAAABMYOO23fr7slXVDkuIj9VDd41QfFxMeIsKo6KSUv3+9QUqKimtdvioIX10dVZmmKsKrwXvr9aGL3dVO6xV81TdNWpQjU89r404/dhEKtxu/d8/PtSMP76lQ7nfGF0OAAAATOAHHTKV1Tq92mHDB/a2dKCVpDpxsbp94A3VDuvYpqW6tG8V5orCb2jfHkqql3DB+zHRURo+qLepA61EqDWVjdt26WRhsaKiIgO+TTsAAADsperayvhzr628tks7tcloZlBV4dWuVXNd07ntOe8l1InTLTf18vu0azOKjo7SyCF9dP6a3nJjL79Pu66NCLXncbvdeuONN3TjjTeqUaNGio6OVrNmzTRgwADNmTNHbrfbkLoq3G6t+PdmSdKPru2iyMgIQ+oAAACA+cTHxWj4wN5VrxvUr6vBfa4zsKLwG9y3h5ISvz9aOXxgb8XHWvso9dnS05LV+7ouVa87tW2pzu0yjCsoiAi1Zzl16pT69++vn/70p/rwww8VFRWlzp07y+Px6IMPPtDPf/5zFRYWGlJb5VHahDpxF/zKBAAAAFxO24xmuqZzWzkcDo0a3EdRfjzuxgp8jy3qI4fDoeuubq82LZsaXVLY9evVVSlXNfAdpb7ROkepuVHUWUaMGKEFCxYoLS1Nf/3rX8+5m9k333yj119/XRMnTlR8fLxf8/3DXxapsKj6C9NrxqvC4lJ5vV7FREcpKtJeHRAAAACCw+v1qryiwtb7k2fKyxUZEWGZQOcvt9sjr9eriIja9ZSVhDqxemDsbQFNS6j9zsaNG9WtWzdFRERo8+bN6tDBv+dUXcpTr7ypU0XFQZsfAAAAAFhJ3Trx+vX9YwKalgszv/Puu+9KkgYPHhzUQCv5fnUIHEdpAQAAAFjblWQmQu13duzYIUnq0aNH0Ocd6GF0SVq3JVv/+NcaJdSJ0+R7RnODKAAAAAA4CwnpO6dOnZIk1atXL+jzDvyaWt9RWkkqL6/QzP+dH9zCAAAAAKAWuJJragm136lbt64k6eTJk0Gfd2FR6RVfU3u67IxOl50JUkUAAAAAYA2E2u9kZWVp0aJF+uyzz4I+78DOD+daWgAAAAD2cCXX1HL34+9s3rxZP/jBDxQZGaktW7aoffv2htbDtbQAAAAAcHlOowuoLa6++mqNHDlS5eXlGjhwoFavXn3O8G+++UZPP/20iotD/2ieCrdbKz/bLEn60bVdCLQAAAAAcBEcqT3LqVOnNGzYMK1atUqSlJqaqiZNmigvL0+5ubnyer06fvy4EhMTQ1oHR2kBAAAAoGY4UnuWunXr6qOPPtLrr7+uH/3oRyopKdHWrVvldDp100036fXXX1dCQkLI64iKjFDdOvEcpQUAAACAy+BIbS1VXlEhhxyKiHAZXQoAAAAA1FqEWgAAAACAaXH6MQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEyLUAsAAAAAMC1CLQAAAADAtAi1AAAAAADTItQCAAAAAEzr/wMGFleRcfFAIgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dj_circuit = QuantumCircuit(n+1, n)\n", "\n", "# Añadimos H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "\n", "# Punemos el qubit en el esatdo |->\n", "dj_circuit.x(n)\n", "dj_circuit.h(n)\n", "\n", "# Añadimos el oráculo\n", "dj_circuit = dj_circuit.compose(balanced_oracle)\n", "\n", "# Añadimos H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "dj_circuit.barrier()\n", "\n", "# Medimos\n", "for i in range(n):\n", " dj_circuit.measure(i, i)\n", "\n", "# Dibujamos el circuito\n", "dj_circuit.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Veamos a continuación el output" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "#!pip install qiskit-aer" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoUAAAHICAYAAAA4B5D7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvPUlEQVR4nO3de1zUdaL/8ffMgETIRcAbgaAdUltN1LTUFPCCZm2XzUu1mdpGV/WY7W7HTTO76Jpt2Wp78rJBahezC+1pPUKiyJYXSkPLUzqmqGi4gjoDqDgw8/vD5ftzhEFA7vt6Ph4+Hjuf72e+38/o47G9Ht/LjMnlcrkEAACAf2vmxl4AAAAAGh9RCAAAAKIQAAAARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAAJHk19gL+3TidTh07dkz+/v4ymUyNvRwAANDCuVwuFRYWKiwsTGaz5/OBRGEDO3bsmCIiIhp7GQAA4N/MkSNHFB4e7nE7UdjA/P39JV34hwkICGjk1QAAgJbObrcrIiLCaBBPiMIGVn7JOCAggCgEAAAN5nK3rfGgCQAAAIhCAAAAEIUA0KAyMzP1y1/+UmFhYTKZTEpJSXHb7nK59Nxzz6ljx47y9fXV8OHDZbVaje05OTn6zW9+o86dO8vX11fXXnut5syZo/Pnz1d6vP3798vf319BQUH1+KkAtAREIQA0oOLiYvXq1UtvvvlmpdtfeeUV/fnPf9Zbb72l7du3y8/PTyNHjtS5c+ckST/++KOcTqeWLl2qPXv26PXXX9dbb72lP/zhDxX25XA4dN9992nw4MH1+pkAtAwml8vlauxF/Dux2+0KDAyUzWbjQRPg35zJZNKnn36qu+66S9KFs4RhYWF6+umn9dvf/laSZLPZ1L59eyUnJ+vee++tdD8LFy7Uf//3f+vAgQNu488884yOHTumYcOGafr06Tp9+nR9fhwATVR124MzhQDQRBw8eFB5eXkaPny4MRYYGKibbrpJW7du9fg+m82m4OBgt7GNGzdq7dq1Hs9IAsCliEIAaCLy8vIkSe3bt3cbb9++vbHtUvv379fixYv16KOPGmMFBQWaNGmSkpOTuSIBoNqIQgBopo4ePapRo0Zp7NixSkxMNMYTExN1//33a8iQIY24OgDNDVEIAE1Ehw4dJEnHjx93Gz9+/LixrdyxY8cUHx+vgQMHatmyZW7bNm7cqFdffVVeXl7y8vLSb37zG9lsNnl5eentt9+u3w8BoNniF00AoIno3LmzOnTooPT0dMXExEi6cIP49u3b9fjjjxvzjh49qvj4ePXt21dJSUkVfuB+69atKisrM15/9tlnWrBggbZs2aJrrrmmQT4LgOaHKASABlRUVKT9+/cbrw8ePKjs7GwFBwerU6dOmj59ul566SVFR0erc+fOmj17tsLCwownlI8ePaq4uDhFRkbq1Vdf1YkTJ4x9lZ9N7N69u9sxv/nmG5nNZvXo0aP+PyCAZosoBIAG9M033yg+Pt54PWPGDEnSxIkTlZycrN///vcqLi7WI488otOnT+uWW27R+vXrddVVV0mSvvjiC+3fv1/79+9XeHi42775hjEAV4LvKWxgfE8hAABoSHxPIQAAAKqNKAQAAABRCAAAAKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACDJq7EXgPqRuKixVwAAAKpj+fTGXsEFnCkEAABA04zC1atX69FHH9WNN94oHx8fmUwmJScne5xvt9s1Y8YMRUZGysfHR1FRUfrd736noqKiSuc7nU4tXrxYPXv2lK+vr9q2bav77rtPBw4c8HiM1NRUxcbGyt/fXwEBAYqPj1d6evqVflQAAIAmoUlG4axZs7Rs2TIdOnRIHTt2rHJucXGxYmNj9frrr6tbt2566qmn1LVrV7366qsaOnSozp07V+E9jz76qKZNmyaXy6Vp06Zp1KhR+uSTT9SvXz9ZrdYK81evXq1Ro0bphx9+0KRJkzRx4kTt2bNHI0aM0EcffVRnnxsAAKCxNMkoXLFihXJycnTixAk99thjVc595ZVXlJ2drWeeeUapqan64x//qNTUVD3zzDP6+uuv9frrr7vN37Rpk1asWKEhQ4Zo586dWrBggVatWqWUlBSdPHlSU6ZMcZt/6tQpTZ06VaGhodq5c6cWL16sxYsXa+fOnQoJCdHjjz+uwsLCOv87AAAAaEhNMgqHDx+uyMjIy85zuVxasWKFWrdurdmzZ7ttmz17tlq3bq0VK1a4jS9fvlyS9OKLL6pVq1bG+K233qq4uDilpaXp8OHDxvjatWt1+vRpTZ06VeHh4cZ4eHi4pkyZovz8fH366ae1+pwAAABNRZOMwuqyWq06duyYBg0aJD8/P7dtfn5+GjRokA4cOKAjR44Y4xkZGca2S40cOVKStHnzZrf5kpSQkFCt+QAAAM1Rs/5KmvL7/6KjoyvdHh0drdTUVFmtVkVERKi4uFg///yzevToIYvFUun8i/d7uWNUNv9SJSUlKikpMV7b7XZJksPhkMPhkCSZzWZZLBaVlZXJ6XQac8vHS0tL5XK5jHGLxSKz2exx/MJ+vT2uCQAANB1Op1NlZWXGa5PJJC8vL4/jnnqhqo6ojmYdhTabTZIUGBhY6faAgAC3eTWdf7n3VDb/UvPnz9fcuXMrjKelpenqq6+WJHXq1Em9e/fW7t273S5dd+3aVd26dVNWVpZOnDhhjMfExCgyMlKZmZlu9zMOGDBA7dq1U1pamqTbPK4JAAA0Hfn5+dq6davx2t/fX0OHDtWRI0eUnZ1tjLdt21YDBw6U1WrV3r17jfHLdcSOHTuqtY5mHYXNwcyZMzVjxgzjtd1uV0REhBISEoyoNJsvXMW/4YYb1KNHD2Nu+Xj//v0rnBGUpCFDhlQ6npCQoBTPJy8BAEATEhoaqtGjRxuvTSaTJCkiIkJhYWEVxqOjo3Xttdca45friL59+1ZrHc06CsvP3nk6U1d+qbZ8Xk3nX/qekJCQy86/lI+Pj3x8fCqMe3t7y9vb/RKvxWKp9LK2l1fl/0yexi/dLwAAaLrMZrMRcNUZ99QLNe2ICser1qwm6nL39F16P6Cfn586duyogwcPul2j9zT/cse43D2NAAAAzUWzj8KwsDB99dVXKi4udttWXFysr776Sp07d1ZERIQxHhsba2y7VGpqqqQLl2Uvni/pX/fpVT6/fA4AAEBz1ayj0GQy6eGHH1ZRUZFefPFFt20vvviiioqKlJiY6Db+yCOPSLrwPYbnz583xv/3f/9XGRkZSkhIcPuOxHHjxikwMFCLFy9Wbm6uMZ6bm6slS5YoNDRUd999d318PAAAgAZjcl38pEITsWLFCn355ZeSpO+++047d+7UoEGD9B//8R+SpFtuuUUPP/ywpAtnBAcNGqRdu3YpISFBffr00c6dO5WWlqZ+/fpp8+bN8vX1ddt/YmKiVqxYoV/84he67bbb9PPPP2vNmjVq3bq1tm7dquuuu85t/urVqzVhwgS1bdtW48ePlyStWbNG+fn5WrNmjcaOHVvtz2a32xUYGCibzWY8aFIfEhfV264BAEAdWj69fvdf3fZoklE4adIkvfPOOx63T5w4UcnJycZrm82m559/Xh9//LHy8vLUsWNHjR07VnPmzJG/v3+F9zudTi1ZskTLli3T/v371bp1aw0fPlwvv/yy29M8F1u/fr3mzZunnTt3ymQyqW/fvpo1a5aGDx9eo89GFAIAgIsRhf+miEIAAHCxphKFzfqeQgAAANQNohAAAABEIQAAAIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAqAVEYXJyskwmU5V/hg0bZsx//vnnq5ybk5NT6XFSU1MVGxsrf39/BQQEKD4+Xunp6Q30KQEAAOqXV2Mv4ErFxMRozpw5lW776KOPtGfPHo0cObLCtokTJyoqKqrCeFBQUIWx1atXa8KECWrbtq0mTZokSVqzZo1GjBihDz/8UGPGjLmSjwAAANDoTC6Xy9XYi6gP58+fV1hYmGw2m3Jzc9W+fXtJF84Uzp07V5s2bVJcXNxl93Pq1Cl16dJFXl5e+vbbbxUeHi5Jys3NVe/evSVJBw4ckL+/f7XWZbfbFRgYKJvNpoCAgNp9uGpIXFRvuwYAAHVo+fT63X9126PZXz72JCUlRQUFBbr99tuNIKyNtWvX6vTp05o6daoRhJIUHh6uKVOmKD8/X59++mldLBkAAKDRtNgoXLFihSTp4YcfrnR7ZmamFixYoIULFyolJUVFRUWVzsvIyJAkJSQkVNhWfll68+bNdbBiAACAxtPs7ymszKFDh5Senq7w8HCNGjWq0jmX3ocYFBSkN954Qw8++KDbuNVqlSRFR0dX2Ef5WPkcAACA5qpFnilMSkqS0+nUpEmTZLFY3Lb16tVLb7/9tg4cOKCzZ8/q4MGDWrx4sUwmkyZNmqS//e1vbvNtNpskKTAwsMJxyq/Ll8+pTElJiex2u9sfSXI4HMafsrIySVJZWVml46WlpW7jTqezynGHw1HjvzMAANA4nE6n23/PS0tLqxz31AtVdUR1tLgzhU6nU0lJSTKZTHrooYcqbL/77rvdXkdFRWnKlCnq3r27RowYoVmzZumOO+6os/XMnz9fc+fOrTCelpamq6++WpLUqVMn9e7dW7t379bhw4eNOV27dlW3bt2UlZWlEydOGOMxMTGKjIxUZmamCgsLjfEBAwaoXbt2SktLk3RbnX0GAABQf/Lz87V161bjtb+/v4YOHaojR44oOzvbGG/btq0GDhwoq9WqvXv3GuOX64gdO3ZUax0t7unjtLQ0jRw5UsOGDdOGDRtq9N7o6Gjt37/f7emcfv366ZtvvlF+fr5CQkLc5hcUFCg0NFSDBw9WZmZmpfssKSlRSUmJ8dputysiIkL5+fnGMcxmsywWi8rKyoyzfRePl5aW6uJ/JovFIrPZ7HHc4XDoiTe9a/TZAQBA41g6zWmc1ZMkk8kkLy8vOZ2Vj3vqBU/jJ0+eVEhIyGWfPm5xZwov94BJVUJDQ7V//36dOXPG+EuLjo7WN998I6vVWiEKq7rfsJyPj498fHwqjHt7e8vb2z3cLBZLhcvdkuTlVfk/k6fxS/cLAACaLrPZLLO54h19nsY99UJNO6LC8ao1q5koKCjQZ599puDg4AqXiS+nuLhYe/bskZ+fn0JDQ43x2NhYSfrXJVl3qampbnMAAACaqxYVhatWrdL58+f1wAMPVHp2rrCwUPv27aswfvbsWSUmJqqwsFDjxo1zK+px48YpMDBQixcvVm5urjGem5urJUuWKDQ0tMYBCgAA0NS0qMvHf/3rXyV5vnRcUFCgbt26qV+/furevbs6dOig48ePa8OGDcrNzVXPnj21cOFCt/e0adNGS5Ys0YQJE9SnTx+NHz9e0oWfuSsoKNCaNWuq/WsmAAAATVWLicKsrCx9//336t+/v3r27FnpnODgYD3xxBPKysrSunXrdOrUKfn6+qp79+6aNm2apkyZIl9f3wrve+CBBxQaGqp58+YZTzb37dtXs2bN0vDhw+v7owEAANS7Fvf0cVPHbx8DAICL8dvHAAAAaDKIQgAAABCFAAAAIAoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAC6gijMzMzU4cOHq5xz5MgRZWZm1vYQAAAAaCC1jsL4+HglJydXOWflypWKj4+v7SEAAADQQGodhS6X67JznE6nTCZTbQ8BAACABlKv9xRarVYFBgbW5yEAAABQB7xqMvmhhx5ye52SkqKcnJwK88rKyoz7CW+99dYrWiAAAADqX42i8OJ7CE0mk7Kzs5WdnV3pXJPJpH79+un111+/kvUBAACgAdQoCg8ePCjpwv2EXbp00fTp0/Wf//mfFeZZLBa1adNGfn5+dbNKAAAA1KsaRWFkZKTxv5OSktS7d2+3MQAAADRPNYrCi02cOLEu1wEAAIBGVOsoLJeVlaWvv/5ap0+fVllZWYXtJpNJs2fPvtLDAAAAoB7VOgpPnjypu+66S1999VWV31lIFAIAADR9tY7CGTNm6Msvv1RcXJwmTpyo8PBweXld8YlHAAAANIJaV9znn3+u/v37Kz09nV8tAQAAaOZq/YsmZ8+e1ZAhQwhCAACAFqDWURgTE1Ppr5kAAACg+al1FM6ZM0d/+9vftG3btrpcDwAAABpBre8pzMvL02233abY2Fj9+te/Vp8+fRQQEFDp3AcffLDWCwQAAED9M7mq+j6ZKpjNZplMJrevo7n0/kKXyyWTyVTp9xf+u7Lb7QoMDJTNZvMY0XUhcVG97RoAANSh5dPrd//VbY9anylMSkqq7VsBAADQxPAzdwAAAKj9gyYAAABoOWp9pvDw4cPVntupU6faHgYAAAANoNZRGBUVVa0vrjaZTCotLa3tYQAAANAAah2FDz74YKVRaLPZtGvXLh08eFCxsbGKioq6kvUBAACgAdQ6CpOTkz1uc7lc+tOf/qRXXnlFf/3rX2t7CAAAADSQennQxGQy6be//a1+8Ytf6He/+119HAIAAAB1qF6fPr7xxhu1cePG+jwEAAAA6kC9RuFPP/3EQyYAAADNQK3vKfTE6XTq6NGjSk5O1meffaZhw4bV9SEAAABQx2odheW/feyJy+VSmzZt9Kc//am2hwAAAEADqXUUDhkypNIoNJvNatOmjfr166fJkyerXbt2V7RAAAAA1L9aR2FGRkYdLgMAAACNid8+BgAAQN08aPLVV18pOztbdrtdAQEBiomJ0aBBg+pi1wAAAGgAVxSFW7Zs0eTJk7V//35JFx4uKb/PMDo6WklJSRowYMCVrxIAAAD1qtZRuGfPHiUkJOjMmTMaMWKE4uPj1bFjR+Xl5WnTpk1KS0vTyJEjtW3bNl1//fV1uWYAAADUsVpH4QsvvKDz589r3bp1GjVqlNu2Z555RuvXr9cdd9yhF154QR988MEVLxQAAAD1p9YPmmRkZGjMmDEVgrDcqFGjNGbMGG3atKnWiwMAAEDDqHUU2mw2de7cuco5nTt3ls1mq+0hAAAA0EBqHYVhYWHatm1blXO2b9+usLCw2h4CAAAADaTWUXjHHXcoIyNDs2fP1rlz59y2nTt3TnPmzNGmTZt05513XvEiAQAAUL9MLpfLVZs3FhQU6KabbtLBgwcVEhKi/v37q3379jp+/Li+/vprnThxQl26dFFWVpaCg4Pret3Nlt1uV2BgoGw2mwICAurtOImL6m3XAACgDi2fXr/7r2571PpMYUhIiLZt26aJEyeqqKhI69atU1JSktatW6fCwkJNnjxZ27Zta5AgjIqKkslkqvRPXFxchfklJSV64YUXFB0drauuukphYWF65JFH9M9//tPjMd599131799ffn5+atOmjW6//Xbt3LmzHj8VAABAw7miL68ODQ3V22+/raVLl+rHH380ftGkW7du8vb2rqs1VktgYKCmT59eYTwqKsrttdPp1J133qnU1FTdfPPNuueee2S1WrVixQqlp6dr27Ztatu2rdt7Xn75Zc2aNUuRkZF67LHHVFhYqA8++EADBw5Ueno6v94CAACavRpfPn755ZdVXFysuXPnegy/8+fPa+7cufL399d//dd/1clCq1Iefjk5OZedm5SUpIceekj33Xef3n33XeMXWN566y09/vjjeuSRR7R06VJjvtVq1fXXX29cCg8MDJQkZWdn6+abb1aXLl30/fffy2yu3klXLh8DAICLNcvLxxs2bNBzzz2nkJCQKs8EtmrVSiEhIXr22Web3PcULl++XJI0f/58Iwgl6dFHH1WXLl307rvv6uzZs8Z4UlKSSktL9eyzzxpBKEkxMTG677779MMPP+jLL79suA8AAABQD2oUhStXrlSbNm00ZcqUy8598sknFRwcrKSkpFovriZKSkqUnJysefPmacmSJdq+fXuFOefOndP27dvVtWtXRUZGum0zmUwaMWKEiouL9c033xjjGRkZkqSEhIQK+xs5cqQkafPmzXX4SQAAABpeje4p3LJli4YPHy4fH5/LzvXx8dHw4cP11Vdf1XpxNZGXl6fJkye7jfXr10/vv/++rr32WknSTz/9JKfTqejo6Er3UT5utVo1ePBg43+3bt1aHTp0qHK+JyUlJSopKTFe2+12SZLD4ZDD4ZAkmc1mWSwWlZWVyel0GnPLx0tLS3XxVX6LxSKz2exx/MJ+G/aeTgAAUDtOp1NlZWXGa5PJJC8vL4/jnnqhqo6ojhpF4bFjx9SlS5dqz+/cubM+++yzmhyiViZPnqzBgwerR48eat26tfbt26fXXntNq1at0rBhw/Tdd9/J39/f+HWViy8DX6z8OvvFv8Jis9nUrl27as+/1Pz58zV37twK42lpabr66qslSZ06dVLv3r21e/duHT582JjTtWtXdevWTVlZWTpx4oQxHhMTo8jISGVmZqqwsNAYHzBggNq1a6e0tDRJt3lcEwAAaDry8/O1detW47W/v7+GDh2qI0eOKDs72xhv27atBg4cKKvVqr179xrjl+uIHTt2VGsdNYrC/38WqnocDke1H8C4EnPmzHF7HRMTo5UrV0qSVq1apeXLl2vGjBn1vo7KzJw50+3YdrtdERERSkhIMKKy/O/ohhtuUI8ePYy55eP9+/evcEZQkoYMGVLpeEJCglI8n7wEAABNSGhoqEaPHm28Ln/mISIiwu2X4crHo6Ojjaug0uU7om/fvtVaR42KLSwsTN9//32153///fe65ppranKIOvXoo49KknEJu/wMoacze+WXdi8+k1j+tE5151/Kx8dHAQEBbn8kydvb2/hTHnMWi6XScS8vL7fx8n9kT+MN/XVAAACg9sxms9t/z728vKoc99QLVXVEtdZRk0UPHjxYGzdurNZXv+Tk5Gjjxo0aMmRI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", "text/plain": [ "
" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# usamos local simulator\n", "aer_sim = Aer.get_backend('aer_simulator')\n", "results = aer_sim.run(dj_circuit).result()\n", "answer = results.get_counts()\n", "\n", "plot_histogram(answer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como podemos observar el resultado es 111 al 100% por lo que según al algoritmo de Deutsch-Jozsa la función será balanceada. Como ejercicio, se deja que el lector pruebe con el oráculo constante (const_oracle), definido anteriormente y compruebe que la salida en este caso es 000\n", "\n", "### Función para crear el algortimo de Deutsch_jozsa\n", "\n", "A continuación se propone una función que generaliza los casos vistos anteriormente. Tiene el parámetro *case* que puede tomar el valor 'balanced' o 'constant' y el tamaños de los qubits designado con el parámetro n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def dj_oracle(case, n):\n", " # We need to make a QuantumCircuit object to return\n", " # This circuit has n+1 qubits: the size of the input,\n", " # plus one output qubit\n", " oracle_qc = QuantumCircuit(n+1)\n", " \n", " # First, let's deal with the case in which oracle is balanced\n", " if case == \"balanced\":\n", " # First generate a random number that tells us which CNOTs to\n", " # wrap in X-gates:\n", " b = np.random.randint(1,2**n)\n", " # Next, format 'b' as a binary string of length 'n', padded with zeros:\n", " b_str = format(b, '0'+str(n)+'b')\n", " # Next, we place the first X-gates. Each digit in our binary string \n", " # corresponds to a qubit, if the digit is 0, we do nothing, if it's 1\n", " # we apply an X-gate to that qubit:\n", " for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " oracle_qc.x(qubit)\n", " # Do the controlled-NOT gates for each qubit, using the output qubit \n", " # as the target:\n", " for qubit in range(n):\n", " oracle_qc.cx(qubit, n)\n", " # Next, place the final X-gates\n", " for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " oracle_qc.x(qubit)\n", "\n", " # Case in which oracle is constant\n", " if case == \"constant\":\n", " # First decide what the fixed output of the oracle will be\n", " # (either always 0 or always 1)\n", " output = np.random.randint(2)\n", " if output == 1:\n", " oracle_qc.x(n)\n", " \n", " oracle_gate = oracle_qc.to_gate()\n", " oracle_gate.name = \"Oracle\" # To show when we display the circuit\n", " return oracle_gate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A continuación va la función que toma el oráculo creado con la anterior función y formula el algoritmo de Deutsch_Jozsa" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def dj_algorithm(oracle, n):\n", " dj_circuit = QuantumCircuit(n+1, n)\n", " # Set up the output qubit:\n", " dj_circuit.x(n)\n", " dj_circuit.h(n)\n", " # And set up the input register:\n", " for qubit in range(n):\n", " dj_circuit.h(qubit)\n", " # Let's append the oracle gate to our circuit:\n", " dj_circuit.append(oracle, range(n+1))\n", " # Finally, perform the H-gates again and measure:\n", " for qubit in range(n):\n", " dj_circuit.h(qubit)\n", " \n", " for i in range(n):\n", " dj_circuit.measure(i, i)\n", " \n", " return dj_circuit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finalmente usamos los códigos anteriores" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 4\n", "oracle_gate = dj_oracle('balanced', n)\n", "dj_circuit = dj_algorithm(oracle_gate, n)\n", "dj_circuit.draw('mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y a continuación ejecutamos el circuito" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoUAAAHTCAYAAABRFmKjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxEUlEQVR4nO3deVzVdaL/8fc5oITIIuBGKKBDYuMCmpaaAi5oZtvkkk2mNmGbes2a6TZlLpWO2Tra3FwmSG0xW2xu4xUSRXKlNJe8JccFBQ1zwcOi4oFzfn94OT+PLAIC50Cv5+PhY+Z8vp/zPZ9jj0fzmu9yvgabzWYTAAAAftOMzl4AAAAAnI8oBAAAAFEIAAAAohAAAAAiCgEAACCiEAAAACIKAQAAIMnd2Qv4rbFarTpx4oS8vb1lMBicvRwAANDI2Ww25efnKygoSEZjxccDicJ6duLECbVr187ZywAAAL8xWVlZCg4OrnA7UVjPvL29JV3+B+Pj4+Pk1QAAgMYuLy9P7dq1szdIRYjCelZ6ytjHx4coBAAA9eZal61xowkAAACIQgAAABCFAAAAEFEIAPUqLS1Nd911l4KCgmQwGLRmzRqH7TabTS+99JLatm0rT09PDR48WCaTyb49MzNTf/rTnxQWFiZPT0917NhRM2fO1KVLl8r9vIMHD8rb21t+fn51+K0ANAZEIQDUo8LCQnXv3l3vvvtuudtfe+01/f3vf9d7772nHTt2yMvLS0OHDtXFixclST///LOsVqsWL16s/fv366233tJ7772nv/71r2X2ZbFYNHbsWPXv379OvxOAxsFgs9lszl7Eb0leXp58fX1lNpu5+xj4jTMYDPryyy917733Srp8lDAoKEjPPPOMnn32WUmS2WxW69atlZiYqAceeKDc/SxYsED/9V//pcOHDzuMP/fcczpx4oQGDRqkadOm6dy5c3X5dQC4qKq2B0cKAcBFHDlyRDk5ORo8eLB9zNfXV7feequ2bdtW4fvMZrP8/f0dxjZs2KDVq1dXeEQSAK5GFAKAi8jJyZEktW7d2mG8devW9m1XO3jwoBYuXKjHHnvMPnbmzBlNmDBBiYmJnJEAUGVEIQA0UMePH9ewYcM0atQoxcfH28fj4+P14IMPasCAAU5cHYCGhigEABfRpk0bSdLJkycdxk+ePGnfVurEiROKjY1V3759tWTJEodtGzZs0Ouvvy53d3e5u7vrT3/6k8xms9zd3fX+++/X7ZcA0GDxmDsAcBFhYWFq06aNUlJSFBkZKenyBeI7duzQE088YZ93/PhxxcbGqmfPnkpISJDR6Pj/77dt26aSkhL766+++krz58/X1q1bdeONN9bLdwHQ8BCFAFCPCgoKdPDgQfvrI0eOaPfu3fL391f79u01bdo0vfLKKwoPD1dYWJhmzJihoKAg+x3Kx48fV0xMjEJCQvT666/r1KlT9n2VHk3s3Lmzw2d+//33MhqN6tKlS91/QQANFlEIAPXo+++/V2xsrP319OnTJUnjx49XYmKi/vKXv6iwsFCTJk3SuXPndPvtt2vdunW64YYbJEnffPONDh48qIMHDyo4ONhh3/zCGIDrwe8U1jN+pxAAANQnfqcQAAAAVUYUAgAAgCgEAAAAUQgAAAARhQAAABBRCAAAABGFAAAAEFEIAAAAEYUAAAAQUQgAAAARhQAAABBRCAAAABGFAAAAEFEIAAAAEYUAAAAQUQgAAAARhQAAABBRCAAAAEnuzl4A6kb8285eAQAAqIql05y9gss4UggAAACiEAAAAC4ahStXrtRjjz2mW265RR4eHjIYDEpMTKxwfl5enqZPn66QkBB5eHgoNDRUf/7zn1VQUFDufKvVqoULF6pr167y9PRUy5YtNXbsWB0+fLjCz0hKSlJ0dLS8vb3l4+Oj2NhYpaSkXO9XBQAAcAkuGYUvvviilixZoqNHj6pt27aVzi0sLFR0dLTeeustRURE6Omnn1anTp30+uuva+DAgbp48WKZ9zz22GOaOnWqbDabpk6dqmHDhumLL75Qr169ZDKZysxfuXKlhg0bpp9++kkTJkzQ+PHjtX//fg0ZMkSfffZZrX1vAAAAZ3HJKFy2bJkyMzN16tQpPf7445XOfe2117R7924999xzSkpK0t/+9jclJSXpueee03fffae33nrLYf7GjRu1bNkyDRgwQLt27dL8+fO1YsUKrVmzRmfPntXkyZMd5ufm5mrKlCkKDAzUrl27tHDhQi1cuFC7du1SQECAnnjiCeXn59f63wEAAEB9cskoHDx4sEJCQq45z2azadmyZWrevLlmzJjhsG3GjBlq3ry5li1b5jC+dOlSSdLLL7+spk2b2sfvuOMOxcTEKDk5WceOHbOPr169WufOndOUKVMUHBxsHw8ODtbkyZN1+vRpffnllzX6ngAAAK7CJaOwqkwmk06cOKF+/frJy8vLYZuXl5f69eunw4cPKysryz6emppq33a1oUOHSpI2bdrkMF+S4uLiqjT/akVFRcrLy3P4I0kWi8X+p6SkRJJUUlJS7nhxcbHDuNVqrXTcYrFU8rcGAABcidVqdfjf8+Li4krHK+qFyjqiKhr07xSWXv8XHh5e7vbw8HAlJSXJZDKpXbt2Kiws1C+//KIuXbrIzc2t3PlX7vdan1He/KvNmzdPs2fPLjOenJysZs2aSZLat2+vqKgo7d271+EoZadOnRQREaH09HSdOnXKPh4ZGamQkBClpaU5nLru06ePWrVqpeTkZEl3VrgmAADgOk6fPq1t27bZX3t7e2vgwIHKysrS7t277eMtW7ZU3759ZTKZdODAAfv4tTpi586dVVpHg45Cs9ksSfL19S13u4+Pj8O86s6/1nvKm3+1559/XtOnT7e/zsvLU7t27RQXF2d/v9F4+YBtt27d1KVLF/vc0vHevXvLZrPZx0uDdsCAAeWOx8XFaU3FnQoAAFxIYGCghg8fbn9tMBgkSe3atVNQUFCZ8fDwcHXs2NE+fq2O6NmzZ5XW0aCjsCHw8PCQh4dHmfEmTZqoSZMmDmNubm7lHsF0dy//H1NF41fvFwAAuC6j0WgPuKqMV9QL1e2IMp9XpVkuqvToXUVH6kqv3yudV93513pPefMBAAAaogYdhde6pu/q6wG9vLzUtm1bHTlyxH7xZWXzr/UZ17qmEQAAoKFo8FEYFBSkLVu2qLCw0GFbYWGhtmzZorCwMLVr184+Hh0dbd92taSkJEmXr9W7cr6k/7t5o/z5pXMAAAAaqgYdhQaDQY8++qgKCgr08ssvO2x7+eWXVVBQoPj4eIfxSZMmSbr8O4aXLl2yj//P//yPUlNTFRcX5/AbiaNHj5avr68WLlyo7Oxs+3h2drYWLVqkwMBA3XfffXXx9QAAAOqNwXbl7asuYtmyZdq8ebMkad++fdq1a5f69eun3/3ud5Kk22+/XY8++qiky0cE+/Xrpz179iguLk49evTQrl27lJycrF69emnTpk3y9PR02H98fLyWLVum3//+97rzzjv1yy+/aNWqVWrevLm2bdumm266yWH+ypUrNW7cOLVs2VJjxoyRJK1atUqnT5/WqlWrNGrUqCp/t7y8PPn6+spsNtvvPq4L8W/X2a4BAEAtWjqtbvdf1fZwySicMGGCPvjggwq3jx8/XomJifbXZrNZs2bN0ueff66cnBy1bdtWo0aN0syZM+Xt7V3m/VarVYsWLdKSJUt08OBBNW/eXIMHD9arr77qcIv3ldatW6e5c+dq165dMhgM6tmzp1588UUNHjy4Wt+NKAQAAFciCn+jiEIAAHAlV4nCBn1NIQAAAGoHUQgAAACiEAAAAEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAA1AiiMDExUQaDodI/gwYNss+fNWtWpXMzMzPL/ZykpCRFR0fL29tbPj4+io2NVUpKSj19SwAAgLrl7uwFXK/IyEjNnDmz3G2fffaZ9u/fr6FDh5bZNn78eIWGhpYZ9/PzKzO2cuVKjRs3Ti1bttSECRMkSatWrdKQIUP06aefauTIkdfzFQAAAJzOYLPZbM5eRF24dOmSgoKCZDablZ2drdatW0u6fKRw9uzZ2rhxo2JiYq65n9zcXHXo0EHu7u764YcfFBwcLEnKzs5WVFSUJOnw4cPy9vau0rry8vLk6+srs9ksHx+fmn25Koh/u852DQAAatHSaXW7/6q2R4M/fVyRNWvW6MyZMxoxYoQ9CGti9erVOnfunKZMmWIPQkkKDg7W5MmTdfr0aX355Ze1sWQAAACnabRRuGzZMknSo48+Wu72tLQ0zZ8/XwsWLNCaNWtUUFBQ7rzU1FRJUlxcXJltpaelN23aVAsrBgAAcJ4Gf01heY4ePaqUlBQFBwdr2LBh5c65+jpEPz8/vfPOO3r44Ycdxk0mkyQpPDy8zD5Kx0rnlKeoqEhFRUX213l5eZIki8Uii8UiSTIajXJzc1NJSYmsVqt9bul4cXGxrjzL7+bmJqPRWOH45f02qXBNAADAdVitVpWUlNhfGwwGubu7VzheUS9U1hFV0SijMCEhQVarVRMmTJCbm5vDtu7du+v9999XTEyM2rZtq5ycHH399dd66aWXNGHCBPn5+enuu++2zzebzZIkX1/fMp9Tel6+dE555s2bp9mzZ5cZT05OVrNmzSRJ7du3V1RUlPbu3atjx47Z53Tq1EkRERFKT0/XqVOn7OORkZEKCQlRWlqa8vPz7eN9+vRRq1atlJycLOnOyv6KAACAizh9+rS2bdtmf+3t7a2BAwcqKytLu3fvto+3bNlSffv2lclk0oEDB+zj1+qInTt3Vmkdje5GE6vVqrCwMGVlZenQoUMKCwur0vtSUlI0ZMgQdenSRXv37rWP33TTTTKZTLJYLHJ3d2xoi8Wipk2bqlu3btqzZ0+5+y3vSGG7du10+vRpe1TWxZHCJ9/lSCEAAA3B4ql1e6Tw7NmzCggIuOaNJo3uSOH69et17NgxDRo0qMpBKEmDBg1Sx44dtW/fPuXl5dn/0kqPEJrNZgUEBDi8p/RUcHlHEUt5eHjIw8OjzHiTJk3UpIljuLm5uZU5simpTIxea/zq/QIAANdlNBplNJa9zaOi8Yp6obodUebzqjSrAbnWDSaVCQwMlCSdP3/ePlbZdYOVXW8IAADQkDSqKDxz5oy++uor+fv767777qvWewsLC7V//355eXnZ41CSoqOjJen/rtNzlJSU5DAHAACgoWpUUbhixQpdunRJDz30ULmnbPPz85WRkVFm/MKFC4qPj1d+fr5Gjx7tcJh19OjR8vX11cKFC5WdnW0fz87O1qJFixQYGFjtAAUAAHA1jeqawn/+85+SKj51fObMGUVERKhXr17q3Lmz2rRpo5MnT2r9+vXKzs5W165dtWDBAof3tGjRQosWLdK4cePUo0cPjRkzRtLlx9ydOXNGq1atqvLTTAAAAFxVo4nC9PR0/fjjj+rdu7e6du1a7hx/f389+eSTSk9P19q1a5WbmytPT0917txZU6dO1eTJk+Xp6VnmfQ899JACAwM1d+5cJSQkyGAwqGfPnnrxxRc1ePDguv5qAAAAda7R/SSNq+PZxwAA4Eo8+xgAAAAugygEAAAAUQgAAACiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAoOuIwrS0NB07dqzSOVlZWUpLS6vpRwAAAKCe1DgKY2NjlZiYWOmc5cuXKzY2tqYfAQAAgHpS4yi02WzXnGO1WmUwGGr6EQAAAKgndXpNoclkkq+vb11+BAAAAGqBe3UmP/LIIw6v16xZo8zMzDLzSkpK7NcT3nHHHde1QAAAANS9akXhldcQGgwG7d69W7t37y53rsFgUK9evfTWW29dz/oAAABQD6oVhUeOHJF0+XrCDh06aNq0afqP//iPMvPc3NzUokULeXl51c4qAQAAUKeqFYUhISH2/56QkKCoqCiHMQAAADRM1YrCK40fP7421wEAAAAnqnEUlkpPT9d3332nc+fOqaSkpMx2g8GgGTNmXO/HAAAAoA7VOArPnj2re++9V1u2bKn0NwuJQgAAANdX4yicPn26Nm/erJiYGI0fP17BwcFyd7/uA48AAABwghpX3Ndff63evXsrJSWFp5YAAAA0cDV+osmFCxc0YMAAghAAAKARqHEURkZGlvs0EwAAADQ8NY7CmTNn6l//+pe2b99em+sBAACAE9T4msKcnBzdeeedio6O1h//+Ef16NFDPj4+5c59+OGHa7xAAAAA1D2DrbLfk6mE0WiUwWBw+Dmaq68vtNlsMhgM5f5+4W9VXl6efH19ZTabK4zo2hD/dp3tGgAA1KKl0+p2/1VtjxofKUxISKjpWwEAAOBieMwdAAAAan6jCQAAABqPGh8pPHbsWJXntm/fvqYfAwAAgHpQ4ygMDQ2t0g9XGwwGFRcX1/RjAAAAUA9qHIUPP/xwuVFoNpu1Z88eHTlyRNHR0QoNDb2e9QEAAKAe1DgKExMTK9xms9n0xhtv6LXXXtM///nPmn4EAAAA6kmd3GhiMBj07LPP6ve//73+/Oc/18VHAAAAoBbV6d3Ht9xyizZs2FCXHwEAAIBaUKdReOjQIW4yAQAAaABqfE1hRaxWq44fP67ExER99dVXGjRoUG1/BAAAAGpZjaOw9NnHFbHZbGrRooXeeOONmn4EAAAA6kmNo3DAgAHlRqHRaFSLFi3Uq1cvTZw4Ua1atbquBQIAAKDu1TgKU1NTa3EZAAAAcCaefQwAAIDaudFky5Yt2r17t/Ly8uTj46PIyEj169evNnYNAACAenBdUbh161ZNnDhRBw8elHT55pLS6wzDw8OVkJCgPn36XP8qAQAAUKdqHIX79+9XXFyczp8/ryFDhig2NlZt27ZVTk6ONm7cqOTkZA0dOlTbt2/XzTffXJtrBgAAQC2rcRTOmTNHly5d0tq1azVs2DCHbc8995zWrVunu+++W3PmzNEnn3xy3QsFAABA3anxjSapqakaOXJkmSAsNWzYMI0cOVIbN26s8eIAAABQP2ochWazWWFhYZXOCQsLk9lsrulHAAAAoJ7UOAqDgoK0ffv2Sufs2LFDQUFBNf0IAAAA1JMaR+Hdd9+t1NRUzZgxQxcvXnTYdvHiRc2cOVMbN27UPffcc92LBAAAQN0y2Gw2W03eeObMGd166606cuSIAgIC1Lt3b7Vu3VonT57Ud999p1OnTqlDhw5KT0+Xv79/ba+7wcrLy5Ovr6/MZrN8fHzq7HPi366zXQMAgFq0dFrd7r+q7VHjI4UBAQHavn27xo8fr4KCAq1du1YJCQlau3at8vPzNXHiRG3fvr1egjA0NFQGg6HcPzExMWXmFxUVac6cOQoPD9cNN9ygoKAgTZo0Sb/++muFn/Hhhx+qd+/e8vLyUosWLTRixAjt2rWrDr8VAABA/bmuH68ODAzU+++/r8WLF+vnn3+2P9EkIiJCTZo0qa01Vomvr6+mTZtWZjw0NNThtdVq1T333KOkpCTddtttuv/++2UymbRs2TKlpKRo+/btatmypcN7Xn31Vb344osKCQnR448/rvz8fH3yySfq27evUlJSeHoLAABo8Kp9+vjVV19VYWGhZs+eXWH4Xbp0SbNnz5a3t7f+8z//s1YWWpnS8MvMzLzm3ISEBD3yyCMaO3asPvzwQ/sTWN577z098cQTmjRpkhYvXmyfbzKZdPPNN9tPhfv6+kqSdu/erdtuu00dOnTQjz/+KKOxagddOX0MAACu1CBPH69fv14vvfSSAgICKj0S2LRpUwUEBOiFF15wud8pXLp0qSRp3rx59iCUpMcee0wdOnTQhx9+qAsXLtjHExISVFxcrBdeeMEehJIUGRmpsWPH6qefftLmzZvr7wsAAADUgWpF4fLly9WiRQtNnjz5mnOfeuop+fv7KyEhocaLq46ioiIlJiZq7ty5WrRokXbs2FFmzsWLF7Vjxw516tRJISEhDtsMBoOGDBmiwsJCff/99/bx1NRUSVJcXFyZ/Q0dOlSStGnTpkrXlZeX5/BHkiwWi/1PSUmJJKmkpKTc8eLiYodxq9Va6bjFYqnS3xkAAHA+q9Xq8L/nxcXFlY5X1AuVdURVVOuawq1bt2rw4MHy8PC45lwPDw8NHjxYW7Zsqc5H1FhOTo4mTpzoMNarVy99/PHH6tixoyTp0KFDslqtCg8PL3cfpeMmk0n9+/e3//fmzZurTZs2lc6vyLx58zR79uwy48nJyWrWrJkkqX379oqKitLevXt17Ngx+5xOnTopIiJC6enpOnXqlH08MjJSISEhSktLU35+vn28T58+atWqlZKTkyXdWeGaAACA6zh9+rS2bdtmf+3t7a2BAwcqKytLu3fvto+3bNlSffv2lclk0oEDB+zj1+qInTt3Vmkd1YrCEydOqEOHDlWeHxYWpq+++qo6H1EjEydOVP/+/dWlSxc1b95cGRkZevPNN7VixQoNGjRI+/btk7e3t/3pKleeBr5S6Xn2K5/CYjab1apVqyrPv9rzzz+v6dOn21/n5eWpXbt2iouLs7+/9HrEbt26qUuXLva5peO9e/fWlZd+urm5SZIGDBhQ7nhcXJzWVNypAADAhQQGBmr48OH216WXt7Vr187hISCl4+Hh4fYDXtK1O6Jnz55VWke1otBoNFbr1KTFYqnyDRjXY+bMmQ6vIyMjtXz5cknSihUrtHTpUocwq08eHh7lHllt0qRJmesy3dzc7GF3JXf38v8xVTRe33d+AwCAmjMajeX2UkXjFfVCdTuizOdVadb/CQoK0o8//ljl+T/++KNuvPHG6nxErXrsscckyX4Ku/QIYUVH9kqv97vySGLp3TpVnQ8AANAQVSsK+/fvrw0bNlTpp18yMzO1YcMGDRgwoKZru26BgYGSpMLCQklShw4dZDQaK7wGsHT8ymsOw8PDVVBQoJycnCrNBwAAaIiqFYVPPfWULBaLRo4cqdOnT1c478yZMxo1apSKi4v1xBNPXPcia6r0DuTS3zH09PRU7969deDAAR09etRhrs1m0zfffCMvLy/dcsst9vHo6GhJ+r+bNxwlJSU5zAEAAGioqhWFPXr00LRp07Rr1y7dfPPNeumll7Rx40aZTCaZTCalpqZqxowZuvnmm7Vz5049/fTT6tGjR12tXZL0888/6/z58+WOP/fcc5KkBx980D4+adIkSZdvALnyJo3Fixfr8OHD+uMf/yhPT0/7+MSJE+Xu7q5XX33V4TTy7t279fHHH6tz5866/fbba/17AQAA1KdqP9HEZrPphRde0IIFC+y/i3f1djc3N/3lL3/RK6+84vAD0XVh1qxZevPNNzVgwACFhITIy8tLGRkZWrt2rSwWi55//nnNnTvXPt9qtWr48OH2x9xFR0fr4MGD+uKLLxQaGqodO3ZU+pi7+++/3/6Yu0uXLlX7MXc80QQAAFzJVZ5oUu0oLHXo0CElJCRo69at9uvt2rRpo379+mnChAkOt0rXpU2bNukf//iHfvjhB508eVLnz59XYGCgbr31Vj355JPl/uh0UVGR/va3v2nFihXKysqSv7+/RowYoVdeeUWtW7cu93M+/PBDvf3229q/f7+aNm2qfv366eWXX672kVCiEAAAXKnBRyFqhigEAABXcpUorPsfEQQAAIDLIwoBAABAFAIAAIAoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgBpBFB4/flxvv/224uLi1L59ezVt2lRt2rTR/fffrx07dpSZP2vWLBkMhgr/ZGZmlvs5SUlJio6Olre3t3x8fBQbG6uUlJQ6/nYAAAD1w93ZC7heCxcu1Pz589WxY0fFxcWpZcuWMplMWrNmjdasWaOPPvpIY8aMKfO+8ePHKzQ0tMy4n59fmbGVK1dq3LhxatmypSZMmCBJWrVqlYYMGaJPP/1UI0eOrOVvBQAAUL8MNpvN5uxFXI8vvvhCAQEBio6Odhj/9ttvNWjQIDVv3ly//PKLPDw8JF0+Ujh79mxt3LhRMTEx19x/bm6uOnToIHd3d/3www8KDg6WJGVnZysqKkqSdPjwYXl7e1dpvXl5efL19ZXZbJaPj081vmn1xL9dZ7sGAAC1aOm0ut1/VdujwZ8+/sMf/lAmCCWpf//+io2NVW5urvbt21fj/a9evVrnzp3TlClT7EEoScHBwZo8ebJOnz6tL7/8ssb7BwAAcAUNPgor06RJE0mSu3vZs+RpaWmaP3++FixYoDVr1qigoKDcfaSmpkqS4uLiymwbOnSoJGnTpk21tGIAAADnaPDXFFbk2LFjWr9+vdq2bauuXbuW2T5z5kyH135+fnrnnXf08MMPO4ybTCZJUnh4eJl9lI6VzilPUVGRioqK7K/z8vIkSRaLRRaLRZJkNBrl5uamkpISWa1W+9zS8eLiYl15lt/NzU1Go7HC8cv7bVLhmgAAgOuwWq0qKSmxvzYYDHJ3d69wvKJeqKwjqqJRRqHFYtG4ceNUVFSk+fPny83Nzb6te/fuev/99xUTE6O2bdsqJydHX3/9tV566SVNmDBBfn5+uvvuu+3zzWazJMnX17fM55Sely+dU5558+Zp9uzZZcaTk5PVrFkzSVL79u0VFRWlvXv36tixY/Y5nTp1UkREhNLT03Xq1Cn7eGRkpEJCQpSWlqb8/Hz7eJ8+fdSqVSslJydLuvNaf00AAMAFnD59Wtu2bbO/9vb21sCBA5WVlaXdu3fbx1u2bKm+ffvKZDLpwIED9vFrdcTOnTurtI4Gf6PJ1axWq8aNG6ePPvpI8fHxWrJkSZXel5KSoiFDhqhLly7au3evffymm26SyWSSxWIpcxraYrGoadOm6tatm/bs2VPufss7UtiuXTudPn3aHpV1caTwyXc5UggAQEOweGrdHik8e/asAgICrnmjSaM6Umi1WvXII4/oo48+0kMPPaT33nuvyu8dNGiQOnbsqH379ikvL8/+l1Z6hNBsNisgIMDhPaWngss7iljKw8PDfufzlZo0aWK/5rGUm5ubw1HNUuVdE1nZ+NX7BQAArstoNMpoLHubR0XjFfVCdTuizOdVaVYDYLVaNXHiRH3wwQcaO3asEhMTy/2LrExgYKAk6fz58/axyq4brOx6QwAAgIakUURhaRAuX75cY8aM0YoVK8ot5coUFhZq//798vLyssehJPvP3Vy+Ts9RUlKSwxwAAICGqsFHYekp4+XLl2vUqFFauXJlhUGYn5+vjIyMMuMXLlxQfHy88vPzNXr0aIfDrKNHj5avr68WLlyo7Oxs+3h2drYWLVqkwMBA3XfffbX/xQAAAOpRg7+mcM6cOfrggw/UvHlz3XTTTXrllVfKzLn33nsVGRmpM2fOKCIiQr169VLnzp3Vpk0bnTx5UuvXr1d2dra6du2qBQsWOLy3RYsWWrRokcaNG6cePXrYH5m3atUqnTlzRqtWrary00wAAABcVYOPwszMTElSQUGBXn311XLnhIaGKjIyUv7+/nryySeVnp6utWvXKjc3V56enurcubOmTp2qyZMny9PTs8z7H3roIQUGBmru3LlKSEiQwWBQz5499eKLL2rw4MF1+fUAAADqRaP7SRpXx7OPAQDAlXj2MQAAAFwGUQgAAACiEAAAAEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQEQhAAAARBQCAABARGG1fPfddxo+fLj8/Pzk5eWl2267TZ9++qmzlwUAAHDd3J29gIZi48aNGjp0qG644QY98MAD8vb21ueff64xY8YoKytLzzzzjLOXCAAAUGMGm81mc/YiXF1xcbEiIiKUnZ2t7du3KzIyUpJkNpvVu3dvZWZmKiMjQyEhIdfcV15ennx9fWU2m+Xj41Nna45/u852DQAAatHSaXW7/6q2B6ePq2DDhg06dOiQHnzwQXsQSpKvr6/++te/6tKlS/rggw+ct0AAAIDrxOnjKkhNTZUkxcXFldk2dOhQSdKmTZvKfW9RUZGKiorsr81msyTp7NmzslgskiSj0Sg3NzeVlJTIarXa55aOFxcX68oDum5ubjIajRWOWywWXbrYpIbfFgAA1Kdz56wqKSmxvzYYDHJ3d5fVWv54Rb1Q0fjZs2clSdc6OUwUVoHJZJIkhYeHl9nWpk0bNW/e3D7navPmzdPs2bPLjIeFhdXuIgEAQIO0/Pn6+Zz8/Hz5+vpWuJ1rCqsgLi5O33zzjUwmk373u9+V2X7jjTeqoKDAfhTwSlcfKbRarTp79qwCAgJkMBjqdN0AGpe8vDy1a9dOWVlZdXpNMoDGxWazKT8/X0FBQTIaK75ykCOFdczDw0MeHh4OY35+fs5ZDIBGwcfHhygEUC2VHSEsxY0mVVD6F1nekUDp/9/VAwAA0FARhVVQei1hedcN5uTkqKCgoNzrDQEAABoKorAKoqOjJUnJyclltiUlJTnMAYC64uHhoZkzZ5a5JAUAagM3mlRBcXGxOnXqpOPHj1f449UHDhxQaGioU9cJAABQU0RhFVX0mLujR4/q9ddf5zF3AACgQSMKqyE9PV0zZ87U1q1bZbFY1LVrV02fPl1jxoxx9tIAAACuC1EIAAAAbjQBAAAAUQgAAAARhQAAABBRCAAAABGFAAAAEFEIAAAAEYUAAAAQUQgADQ4/LwugLhCFANAA/PzzzyooKJAkGQwGSZfj8FqBSEACqCqeaAIALi47O1v33HOP+vfvr379+ikyMlIdOnSQm5ubfY7NZpPBYLD/58WLF3XDDTc4cdUAGhqiEABc3KxZszRnzhw1bdpU7u7uioqKUmxsrPr06aNu3brpxhtvtM8tjcKVK1dq+fLleuONN9S1a1cnrh5AQ0EUAoCLGzFihFJTUzVz5kxlZGQoOTlZWVlZCgwM1G233abo6GjddtttioiIUEBAgCRp9OjR+vzzz5Wfn69mzZo5+RsAaAiIQgBwYb/++qvuuusu/fLLLzp27Jhyc3N1+PBhpaena926ddqyZYvOnj2r0NBQ9e3bV3fccYdKSkr07LPP6pZbbtHatWud/RUANBBEIQC4sMOHD+v+++9Xx44d9dlnn9nHS0pKdOrUKWVkZOjbb7/VunXrtHPnTpWUlKhVq1Y6fvy4/vWvf2nEiBFOXD2AhoQoBAAXdunSJX3++edq1qyZ7rzzTrm7u5eZU1RUpBMnTshkMumrr77SsmXL5OXlpbNnzzphxQAaqrL/dgEAuIymTZtq7Nixlc7x8PBQWFiYwsLCdP78eS1btkwjR46spxUCaCz4nUIAcGFV+S3CK23evFkWi0WTJk2qw1UBaIw4UggALqz0h6qrIjc3V2fPnlWXLl10yy231OGqADRGXFMIAI1ESUmJfvjhB9lsNvXq1cvZywHQwBCFAAAA4JpCAHA1ubm52rRpk4qKipy9FAC/IUQhALiYuXPnKjY2Vn379tUrr7yi/fv3Vzi39GSPyWTSnj17ZLFY6muZABoZTh8DgIuJiorS3r175efnp9zcXElSTEyMHnjgAd15550OzzqWpMLCQsXHx+vIkSNKS0tTkyZNnLFsAA0cRwoBwIVkZmbq119/Ve/evbVhwwbNmTNH/fv317Zt2/T444+rc+fOGjNmjNasWWP/cer//d//VVJSkjw9PQlCADXGT9IAgAs5cuSIcnJyNHLkSHXv3l3du3fXtGnTtHXrVq1bt04pKSlavXq1Vq9eraCgII0aNUoXLlxQbm6unnnmGWcvH0ADxuljAHAhe/bs0ahRozRlyhRNmTJFJSUlcnNzs2/PyclRamqq1q1bp7S0NGVmZkqS/Pz8eKwdgOtCFAKAi8nPz1dxcbFatGhhH7NarTIaHa/4OXHihObNm6d3331XTzzxhN599936XiqARoTTxwDgYry9vcuMlQahzWaT1WqVm5ubgoKC5O/vL0l65JFH6nWNABofjhQCQAN1+PBh3XvvvcrPz9eRI0ecvRwADRxHCgGggTIYDGrTpo3GjBnj7KUAaAQ4UggALuLqm0rq+n0AcCV+pxAAnMxqtUqSPexKrxu8lkuXLjm8DwCuB1EIAE62ePFijRkzRv/+979VUFAgg8Fgv7HEarVWGIhNmzatz2UCaOQ4fQwAThYWFqajR4/Kw8ND3bt3V1xcnIYPH65bb71VBoPBPq+4uFju7u46f/68lixZou7duys2NtaJKwfQmBCFAOBE+/fvV9euXdWzZ0+1aNFC69evlyR5eXmpX79+Gj58uOLi4hQREWF/z+bNmzVgwAD17dtXmzdvdtbSATQy3H0MAE60b98+SdKDDz6op59+WhkZGVqzZo0+/vhjJScnKzk5WW3atFFMTIzuuOMOjRgxQunp6ZKk559/3plLB9DIcKQQAJxoyZIlevzxx/Xvf/9bd9xxh8O27777Th9//LE+++wzZWdnS5LCw8OVl5enCxcu6Ny5c05YMYDGihtNAMBJbDabunXrpmnTpummm25yGJekXr166c0331RGRob++7//Ww8//LBOnjypkydPaty4cc5aNoBGiiOFAOBkBQUFatq0abl3E9tsNoebTSZPnqx//OMf2rVrlyIjI+txlQAaO6IQAFxcaRgeOnRIY8aMkdlslslkcvayADQynD4GABdXeqTwp59+0q5du/SHP/zBySsC0BhxpBAAnOzqU8QVOXnypNatW6e77rpL/v7+9bAyAL8lRCEA1LMLFy7o2LFjat++vTw9Pav1Xp5zDKCucPoYAOrZO++8o4ceekhvv/22Nm7cqBMnTqikpKTS95w6dUrFxcUEIYA6w5FCAKhnwcHBOnHihNzc3OTr66u+ffsqLi5Ot956qzp06KCAgACH+YWFhZo1a5bOnDmjpUuXEoYA6gRPNAGAepSRkSGz2aw+ffrowQcf1DfffKNt27bp66+/Vvv27RUTE6PBgwcrKipKN954o/z8/PTjjz9q6dKliomJIQgB1BmiEADqUUZGhi5evKi4uDg99dRTGjFihA4cOKBt27Zpw4YN+vzzz/Xhhx/q5ptv1sCBAzVs2DClpKQoLy9P8fHxzl4+gEaM08cAUI8+++wzjR49Wp988olGjx5tH7dYLDp69Kj27Nmjb7/9Vqmpqfrpp5/UpEkT2Ww2eXh46OzZs05cOYDGjigEgHpks9n0888/64YbblBYWFi5P0dTWFiojIwMHThwQAkJCfrmm280efJk/f3vf3fSqgH8FhCFAOAiygvEqVOnatGiRdq5c6eioqKctDIAvwVEIQC4GKvVKqPRqMzMTN1zzz3Kzc3VsWPHnL0sAI0cv1MIAC7GaLz8r+bjx4/LYrHoySefdPKKAPwWcKQQAFyUzWZTdna2/P395eXl5ezlAGjkiEIAAABw+hgAAABEIQAAAEQUAgAAQEQhAAAARBQCAABARCEAAABEFAIAAEBEIQAAAEQUAgAAQNL/A1i4qTfBUrWaAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transpiled_dj_circuit = transpile(dj_circuit, aer_sim)\n", "results = aer_sim.run(transpiled_dj_circuit).result()\n", "answer = results.get_counts()\n", "plot_histogram(answer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Existe otra posibilidad de crear un oráculo balanceado o constante.\n", "\n", "La función *dj_problem_oracle* (que figura abajo) devuelve un oráculo Deutsch-Jozsa para n = 4 en forma de puerta. La puerta toma 5 qubits como entrada donde el qubit final (q_4) es el qubit de salida (como con los oráculos de ejemplo anteriores). Puedes obtener diferentes oráculos dando a *dj_problem_oracle* diferentes enteros entre 1 y 5. Usa el algoritmo Deutsch-Jozsa para decidir si cada oráculo está equilibrado o es constante (Nota: Es muy recomendable que pruebes este ejemplo usando el aer_simulator en lugar de un dispositivo real)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "from qiskit_textbook.problems import dj_problem_oracle\n", "oracle = dj_problem_oracle(1)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "qiskit.circuit.gate.Gate" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(oracle)" ] } ], "metadata": { "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.11.4" } }, "nbformat": 4, "nbformat_minor": 4 }