Path: blob/main/translations/es/ch-algorithms/deutsch-jozsa.ipynb
3855 views
Algoritmo de Deutsch-Jozsa
En esta sección, primero presentamos el problema de Deutsch-Jozsa y los algoritmos clásicos y cuánticos para resolverlo. Luego implementamos el algoritmo cuántico usando Qiskit y lo ejecutamos en un simulador y en un dispositivo.
El algoritmo Deutsch-Jozsa, presentado por primera vez en la referencia [1], fue el primer ejemplo de un algoritmo cuántico que funciona mejor que el mejor algoritmo clásico. Demostró que puede haber ventajas en el uso de una computadora cuántica como herramienta computacional para un problema específico.
1.1 Problema de Deutsch-Jozsa
Tenemos una función booleana oculta , que toma como entrada una cadena de bits y devuelve o , es decir:
La propiedad de la función booleana dada es que se garantiza que sea balanceada o constante. Una función constante devuelve todos los o todos los para cualquier entrada, mientras que una función balanceada devuelve para exactamente la mitad de todas las entradas y para la otra mitad. Nuestra tarea es determinar si la función dada es balanceada o constante.
Ten en cuenta que el problema de Deutsch-Jozsa es una extensión de bits del problema de Deutsch de un solo bit.
1.2 La Solución Clásica
Clásicamente, en el mejor de los casos, dos consultas al oráculo pueden determinar si la función booleana oculta, , es balanceada: por ejemplo, si obtenemos ambas y , entonces sabemos que la función está balanceada, ya que hemos obtenido las dos salidas diferentes.
En el peor de los casos, si continuamos viendo la misma salida para cada entrada que intentamos, tendremos que verificar exactamente la mitad de todas las entradas posibles más una para estar seguros de que es constante. Dado que el número total de entradas posibles es , esto implica que necesitamos entradas de prueba para estar seguros de que es constante en el peor de los casos. Por ejemplo, para una cadena de bits de , si verificamos de las combinaciones posibles, obteniendo todos los , aún es posible que la entrada devuelva y está balanceada. Probabilísticamente, este es un evento muy improbable. De hecho, si obtenemos el mismo resultado continuamente en sucesión, podemos expresar la probabilidad de que la función sea constante en función de entradas como:
Siendo realistas, podríamos optar por truncar de manera temprana nuestro algoritmo clásico, digamos si tuviéramos más de un x% de confianza. Pero si queremos estar 100% seguros, tendríamos que verificar entradas.
1.3 Solución Cuántica
Usando una computadora cuántica, podemos resolver este problema con un 100% de confianza después de una sola llamada a la función , siempre que tengamos la función implementada como un oráculo cuántico, que mapea el estado a , donde es la adición de módulo . A continuación se muestra el circuito genérico para el algoritmo Deutsch-Jozsa.

Ahora, repasemos los pasos del algoritmo:
- Prepara dos registros cuánticos. El primero es un registro de qubits inicializado en , y el segundo es un registro de un qubit inicializado en :
ya que para cada es o .
donde es la suma del producto bit a bit.
1.4 ¿Por qué funciona esto?
Oráculo Constante
Cuando el oráculo es constante, no tiene efecto (hasta una fase global) en los qubits de entrada, y los estados cuánticos antes y después de consultar el oráculo son los mismos. Dado que la compuerta H es su propio inverso, en el Paso 4 invertimos el Paso 2 para obtener el estado cuántico inicial de en el primer registro.
Oráculo Balanceado
Después del paso 2, nuestro registro de entrada es una superposición igual de todos los estados en la base computacional. Cuando el oráculo está balanceado, el retroceso de fase añade una fase negativa a exactamente la mitad de estos estados:
El estado cuántico después de consultar el oráculo es ortogonal al estado cuántico antes de consultar el oráculo. Por lo tanto, en el Paso 4, al aplicar las compuertas H, debemos terminar con un estado cuántico que sea ortogonal a . Esto significa que nunca debemos medir el estado cero.
2. Ejemplo Resuelto
Veamos un ejemplo específico para una función balanceada de dos bits:
Considera una función de dos bits tal que
El oráculo de fase correspondiente de este oráculo de dos bits es
Ahora comprobaremos si este oráculo funciona como se esperaba tomando un estado de ejemplo
- El primer registro de dos qubits se inicializa en y el segundo registro qubit en
(Nota que estamos usando los subíndices 0, 1 y 2 para indizar los qubits. Un subíndice de "01" indica el estado del registro que contiene los qubits 0 y 1)
Puedes probar ejemplos similares usando el widget a continuación. Presiona los botones para agregar compuertas H y oráculos, vuelve a ejecutar la celda y/o configura case="constant" para probar diferentes oráculos.
3. Creando Oráculos Cuánticos
Veamos algunas formas diferentes en que podemos crear un oráculo cuántico.
Para una función constante, es simple:
1. Si f(x) = 0, entonces aplica la compuerta al qubit en el registro 2.
2. Si f(x) = 1, entonces aplica la compuerta al qubit en el registro 2.
Para una función balanceada, hay muchos circuitos diferentes que podemos crear. Una de las formas en que podemos garantizar que nuestro circuito esté balanceado es realizando un CNOT para cada qubit en el registro 1, con el qubit en el registro 2 como objetivo. Por ejemplo:
En la imagen de arriba, los tres qubits superiores forman el registro de entrada y el qubit inferior es el registro de salida. Podemos ver qué estados de entrada dan qué salida en la siguiente tabla:
| Estados de entrada que devuelven 0 | Estados de entrada que devuelven 1 |
|---|---|
| 000 | 001 |
| 011 | 100 |
| 101 | 010 |
| 110 | 111 |
Podemos cambiar los resultados mientras los mantenemos balanceados envolviendo los controles seleccionados en compuertas X. Por ejemplo, ve el circuito y su tabla de resultados a continuación:
| Estados de entrada que devuelven 0 | Estados de entrada que devuelven 1 |
|---|---|
| 001 | 000 |
| 010 | 011 |
| 100 | 101 |
| 111 | 110 |
A continuación, establecemos el tamaño del registro de entrada para nuestro oráculo:
A continuación, creamos un oráculo balanceado. Como vimos en la sección 1b, podemos generar un oráculo balanceado realizando CNOT con cada qubit de entrada como control y el bit de salida como objetivo. Podemos variar los estados de entrada que dan 0 o 1 envolviendo algunos de los controles en compuertas X. Primero elijamos una cadena binaria de longitud n que dicte qué controles ajustar:
Ahora que tenemos esta cadena, podemos usarla como clave para colocar nuestras compuertas X. Para cada qubit en nuestro circuito, colocamos una compuerta X si el dígito correspondiente en b_str es 1 , o no hacemos nada si el dígito es 0 .
A continuación, hacemos nuestras compuertas NOT controladas, usando cada qubit de entrada como control y el qubit de salida como objetivo:
Finalmente, repetimos el código de dos celdas en adelante para terminar de envolver los controles en compuertas X:
¡Acabamos de crear un oráculo balanceado! Todo lo que queda por hacer es ver si el algoritmo Deutsch-Jozsa puede resolverlo.
4.3 El Algoritmo Completo
Ahora vamos a poner todo junto. Este primer paso en el algoritmo es inicializar los qubits de entrada en el estado y el qubit de salida en el estado :
A continuación, apliquemos el oráculo. Aquí aplicamos el balanced_oracle que creamos arriba:
Finalmente, aplicamos compuertas H en los qubits de entrada y medimos nuestro registro de entrada:
Veamos la salida:
Podemos ver a partir de los resultados anteriores que tenemos un 0% de probabilidad de medir 000. Esto predice correctamente que la función está balanceada.
4.4 Circuitos Generalizados
A continuación, proporcionamos una función generalizada que crea oráculos Deutsch-Jozsa y los convierte en compuertas cuánticas. Toma el case , (ya sea 'balanced' o 'constant'), y n, el tamaño del registro de entrada:
También vamos a crear una función que tome esta compuerta del oráculo y ejecute el algoritmo Deutsch-Jozsa en ella:
Finalmente, usemos estas funciones para jugar con el algoritmo:
Y observa los resultados de ejecutar este circuito:
Como podemos ver, el resultado más probable es 1111. Los otros resultados se deben a errores en el cálculo cuántico.
6. Problemas
¿Eres capaz de crear un oráculo balanceado o constante de una forma diferente?
La función
dj_problem_oracle(a continuación) devuelve un oráculo de Deutsch-Jozsa paran = 4en forma de compuerta. La compuerta toma 5 qubits como entrada, donde el qubit final (q_4) es el qubit de salida (como en el ejemplo de los oráculos anteriores). Puedes obtener diferentes oráculos dando adj_problem_oraclediferentes números enteros entre 1 y 5. Usa el algoritmo Deutsch-Jozsa para decidir si cada oráculo es balanceado o constante (Nota: se recomienda probar este ejemplo usandoaer_simulatoren lugar de un dispositivo real).
7. Referencias
David Deutsch and Richard Jozsa (1992). "Rapid solutions of problems by quantum computation". Proceedings of the Royal Society of London A. 439: 553–558. doi:10.1098/rspa.1992.0167.
R. Cleve; A. Ekert; C. Macchiavello; M. Mosca (1998). "Quantum algorithms revisited". Proceedings of the Royal Society of London A. 454: 339–354. doi:10.1098/rspa.1998.0164.