PACS: 03.67.Ac; 03.67.Lx
1. Introducción
La computación cuántica aprovecha fenómenos de la mecánica cuántica para realizar computaciones, tales como la superposición, el entrelazamiento o el paralelismo implícito. El cómputo cuántico permite desarrollar algoritmos para acelerar procesos, o transmisiones de información o, incluso, encontrar nuevas propiedades de física cuántica 1.
Un algoritmo es una sucesión finita de pasos para resolver una tarea, y uno cuántico consiste en aplicar una serie finita de transformaciones (o compuertas cuánticas) a un estado inicial para producir un estado final. En la actualidad se han desarrollado diversos algoritmos cuánticos en diferentes áreas tales como criptografía, búsqueda, optimización, resolución de sistemas lineales y simulación de sistemas cuánticos, entre otros 2. El algoritmo de Deutsch y Jozsa es uno de los primeros algoritmos cuánticos que surgieron 3. Y aunque se ha implementado y simulado usando diferentes técnicas 4,5,6,7,8,9, y ha demostrado obtener resultados en un solo paso de tipo cuántico en comparación con el algoritmo secuencial clásico que requiere un número exponencial, sus aplicaciones han sido limitadas. Sin embargo, recientemente, este algoritmo ha sido utilizado para resolver distintos problemas, entre ellos, en lenguajes formales para determinar diferentes partes en una estructura de datos de tipo arreglo y aplicar funciones específicas a cada una de las partes 10. También la utilización del algoritmo de Deutsch y Jozsa ha sido propuesto dentro del contexto del análisis de datos masivos 11.
Dada la importancia del algoritmo de Deutsch y Jozsa en el entendimiento de algoritmos cuánticos, presentamos su implementación en el lenguaje de programación cuántica GAMA (lenguaje de propósito específico diseñado para la simulación de algoritmos cuánticos 12). En particular, tal implementación está orientada a la enseñanza de algoritmos cuánticos. Durante su desarollo encontramos que la parte medular de este algoritmo consiste en la construcción de la compuerta cuántica U f , introducida en la Sec. 2.5, con la cual es posible la evaluación de una sola función para múltiples valores de entrada.
Este artículo tiene la composición siguiente: en la Sec. 2 introducimos brevemente los conceptos fundamentales de la computación cuántica, asi como la definición de un algoritmo cuántico, en las Secs. 3 y 4 describimos el algoritmo cuántico de Deutsch y Jozsa y su implementación, en la Sec. 5 presentamos los resultados y una breve discusión de los resultados, y, finalmente, en la Sec. 6 presentamos las conclusiones del trabajo.
2. Fundamentos de algoritmos cuánticos
En la computación cuántica se trabaja con sistemas cuánticos finitos y se trata con espacios vectoriales complejos de dimensión finita.
2.1. Bits cuánticos
En el modelo de computación clásica la unidad básica de información es el bit, el cual asume uno de dos posibles valores, ya sea 0 o 1. Análogamente, el modelo de computación cuántica tiene como unidad básica el qubit, que puede asumir una superposición de dos valores, o estados, distintos, digamos
Los vectores
Esta notación tiene la ventaja de poder especificar las transformaciones cuánticas (ver Sec. 2.4) sobre estados cuánticos en términos de la base canónica. Por ejemplo, la transformación que intercambia los estados
Un qubit es una superposición de bits clásicos, es decir, es una combinación lineal
El mecanismo de medición (ver Sec. 2.3) de qubits se hace con respecto a una base ortonormal, en este caso E, la probabilidad de que el valor medido sea
Aunque un qubit puede variar de manera continua entre un conjunto de estados cuánticos, después de su medición es posible que asuma un único estado determinista, es decir, extrae un simple bit clásico. La medición de qubits es un proceso que solamente puede ser aplicada una vez, ya que un qubit al ser medido pierde su estado de superposición.
2.2. Registros cuánticos
Dado un entero
donde
Tal vector unitario 𝜓 es un quregistro.
La relación entre k y n es lo que determina el poder real de la computación cuántica: un quregistro puede asumir, al aplicar un operador de medición, un número exponencial, en términos de k, de estados deterministas. Así, la concatenación de k qubits, produce vectores de dimension 2
k
. Desde el punto de vista algebraico, los estados cuánticos se combinan mediante el producto tensorial (
Recordamos brevemente: sean V y W dos espacios complejos de Hilbert, de dimensión finita, con bases ortonormales respectivas
En la potencia tensorial
También se tiene que en la esfera unitaria del espacio
El origen del poder del cómputo cuántico se deriva de la posibilidad de codificar procesos como la evolución de estados cuánticos.
2.3. Toma de mediciones
La medición de qubits constituye otra gran diferencia entre el modelo clásico y el modelo cuántico, puesto que se puede medir (leer) el valor que tiene un bit. Sin embargo, no se puede leer el valor de un qubit sin alterarlo, ya que éste se convierte en un estado determinista. Dado un qubit
donde μ0, μ1
De manera similar, al tener un k-quregistro 𝜓 como en la ec. (1), para cada i = 0, …, 2
k
-1, la probabilidad de que tras la medición el estado 𝜓 asuma el estado determinista
Esto propicia comportamientos particulares entre los quregistros entrelazados y los que no lo son. Por ejemplo, en un k-quregistro de la forma
2.4. Compuertas cuánticas
Así como una computadora clásica utiliza circuitos lógicos que permiten la manipulación de información mediante compuertas, en el cómputo cuántico existen mecanismos para manipular quregistros. El análogo a los circuitos lógicos son las compuertas cuánticas o bien qucompuertas. Las compuertas cuánticas y las composiciones de ellas transforman linealmente un estado inicial 𝜓1 en un estado final 𝜓2, conservando siempre sus normas y ángulos, es decir, son transformaciones unitarias13. Cuando se fija una base del espacio, cualquier transformación unitaria queda descrita por una matriz. Sea A† la conjugada transpuesta de la matriz A. Una matriz A es unitaria si se cumple que AA† = I. Las compuertas son transformaciones unitarias en espacios de Hilbert 13. Dado este hecho, una de las consecuencias más importantes de las compuertas cuánticas es que son reversibles, véase 1.
2.4.1. Transformaciones lineales sobre qubits
Para entender mejor el concepto de compuerta cuántica, veremos algunos ejemplos muy sencillos que operan sobre qubits. A continuación, mostramos las matrices de Pauli, las cuales pueden generar cualquier transformación lineal de dimension 2, a partir de una combinación lineal de ellas con coeficientes complejos. En la primera columna aparece cada matriz y en la segunda la transformación lineal correspondiente, especificada por su acción en la base canónica:
Estas transformaciones tienen un nombre convencional. I es la transformación identidad, X es la negación y Z es un corrimiento de fase. Cualquiera de éstas cumple la propiedad de ser transformaciones unitarias.
Otra compuerta muy común es Cnot (Controlled-NOT gate), la cual “niega al segundo qubit siempre que el primero esté afirmado”. Actuando en la base de los 2-quregistros es
y tiene como matriz
donde X es la compuerta de negación. El primer qubit es de control y el segundo de salida (se dice también “target”). Cnot es unitaria y no puede ser descompuesta como el producto tensorial de dos transformaciones de qubits.
Otra transformación importante que opera sobre un qubit es la de Hadamard:
la cual tiene importantes aplicaciones. Cuando ésta es aplicada a
A diferencia de la computación clásica, en la que se puede realizar la copia de información sin ningún problema, en la computación cuántica la accesabilidad a la información tiene una limitante importante. La mecánica cuántica no permite la copia exacta de estados cuánticos.
Teorema de no-clonación. No es posible hacer una copia o clonación de un estado cuántico14.
Como un mero bosquejo, supongamos que U fuera una transformación unitaria que clone estados, es decir
y por otro lado, siendo U de clonación
lo que implica
También es claro que clonar es imposible mediante la sola toma de mediciones, pues esta última destruye estados.
2.5. Algoritmos cuánticos
Un algoritmo cuántico consiste de la ejecución de una serie de compuertas cuánticas sobre entidades, que pueden ser qubits o quregistros, seguida de una toma de medición.
Para simular un algoritmo cuántico, luego de una inicialización de la máquina de estados y de sus qubits y quregistros, se aplican las transformaciones unitarias indicadas. Dado que la toma de mediciones es probabilista, se ha de disponer de un generador de números aleatorios. Dependiendo de la toma de mediciones se decide si acaso se concluye el proceso, o bien, se lo reinicia.
El poder de la computación cuántica lo ocasiona su paralelismo inherente y el entrelazamiento.
Es posible, por ejemplo, dada una función f, la evaluación simultánea de valores f(x) para muchos valores de x en la simple aplicación de una compuerta cuántica Uf .
En efecto, una forma cuántica de llevar a cabo esto es considerando una computadora de
2-quregistors que iniciando en el estado
Este estado contiene información de ambos valores f(0) y f(1), pero no da uno determinado, y, al tomar una medición, se arribará a cualquiera de los estados deterministas
3. Algoritmo cuántico de Deutsch y Jozsa
La idea de los algoritmos cuánticos es almacenar información en una superposición de estados cuánticos, manipularlos mediante transformaciones unitarias y extraer información útil del estado resultante.
Veamos el algoritmo de Deutsch y Jozsa, el cual fue de los primeros algoritmos de tipo cuántico 15. Éste puede resolver más rápido, usando efectos cuánticos 3, un problema que una computadora clásica lo haría en un número exponencial de exponencialmente.
Una función booleana
Se ve fácilmente que hay
Sea Dn el conjunto de todas las funciones booleanas constantes o equilibradas. En el cuadro 3 se muestra el conjunto D2 de las 8 = 2 + 6 funciones constantes (f0 y f7) o equilibradas (f1- f6).
El propósito del algoritmo de Deutsch y Jozsa es decidir, para una función dada
Clásicamente, habría que evaluar los valores f(x) de f para todas las entradas x. En el peor caso se tendría que recorrer las 2 n posibilidades. Veamos el procedimiento del algoritmo cuántico, donde con una sola evaluación de f se determina si es constante o equilibrada.
Se considera el operador unitario U
f
definido en el espacio de los (n+1)-quregistros, es decir, actúa en el espacio complejo de dimension 2
n+1
. En cada entrada
Uf aparece bosquejado en la Fig. 1.
Así pues
Inicialmente se considera el estado de entrada
Luego, a cada qubit se le aplica la compuerta de Hadamard:
Observamos que para cada
y también, puesto que
De (6) se ha de tener
Al aplicar
donde
de donde se podrá expresar
siendo, para cada
La probabilidad de que al tomar una medición, respecto a la base canónica, quede el estado determinista
4. Implementación del algoritmo de Deutsch y Jozsa
Dada la definición del algoritmo de Deutsch y Jozsa en la Sec. 3, a continuación introducimos el procedimiento para llevar a cabo su implementación en el simulador de algoritmos cuánticos.
La Fig. 2 muestra esquemáticamente la serie de transformaciones de tipo cuántica (
A continuación describimos la serie de transformaciones necesarias en el algoritmo cuántico de Deutsch y Jozsa para posteriormente introducir el pseudocódigo del algoritmo en la Sec. 5.
El estado inicial,
La primera transformación,
Donde x, es la representación binaria de un número entero entre [0, 2 n-1 ], utilizando n qubits.
La segunda transformación consiste en aplicar la compuerta
Uf a
donde
El operador Uf tiene el efecto de introducir la
fase (-1)
fx
al estado
Finalmente, la tercera transformación consiste en aplicar el operador de Hadamard a
El estado resultante es
4.1. El operador Uf
Como se aprecia en la Ec. (8), toda la información de la función a evaluar f
se incluye en el quregistro
Retomemos brevemente el comportamiento del algoritmo. Notemos que el qubit de función debe ser
Cuando el operador Uf se aplica al estado
se tiene
Y podemos ver que el signo negativo, para cada estado
Para expresar matricialmente el operador Uf , es necesario definirlo en términos de submatrices Uf(x) . Podemos escribir a la matriz Uf(x) de tamaño 2 × 2 como:
La forma general al operador Uf como una matriz 2n+1 × 2n+1 es definida como
Entonces otra forma de escribir la Ec. (8) es: Uf (2n - 1)
Para el caso de n = 2, la matriz Uf se escribe como
donde
Se puede ver en las matrices (11) y (13) que si la función f es constante,
entonces se tiene a la matriz unitaria 2n+1 ×
2n+1 o a una matriz con submatrices
Uf(x) antidiagonales en su
diagonal principal. Por lo que al aplicar esta matriz a
Si la función es equilibrada, entonces Uf se
expresa como una combinación de matrices
Uf(x) diagonales y
antidiagonales. De esta forma, el estado resultante
4.2. Método experimental
Como plataforma experimental utilizamos GAMA, el cual es un lenguaje de programación para simular la ejecución de algoritmos cuánticos en una computadora clásica 12. Este lenguaje es de tipo imperativo, estructurado y de propósito específico. GAMA cuenta con un módulo de depuración que permite llevar la secuencia de los diferentes cambios de los estados de las variables en las diferentes entidades de un algoritmo cuántico, incluyendo qubits, quregisters, qugates, asi como las operaciones entre ellas: mediciones, producto interior (·) y productor exterior (
5. Resultados y discusión
5.1. Pseudocódigo
Ahora explicaremos el pseudocódigo del algoritmo cuando n = 2 con el fin de
ilustrarlo, implementarlo y probarlo en nuestro simulador de algoritmos
cuánticos. El estado inicial
El algoritmo 1 muestra el pseudocódigo de los pasos necesarios para resolver este ejemplo.
Primero, se lleva a cabo la inicialización del operador
Uf con la función
Initialize() descrita en el algoritmo 2. Como hemos mencionado el operador
Uf está conformado de
evaluaciones de la función f(x1,
x2). Para demostrar el funcionamiento del
algoritmo, seleccionamos una de las funciones presentadas anteriormente en el
Cuadro 3. En este caso, la función equilibrada f3
del Cuadro 3 fue implementada y su pseudocódigo se muestra en el algoritmo 3.
Los siguientes pasos corresponden a las transformaciones hechas al estado
inicial 𝜓0. La primera equivale a aplicarle la compuerta
Finalmente, el estado 𝜓 es el estado resultante, al cual se le realizará una toma de medición, haciéndolo por cualquier qubit que corresponda al quregistro de control, que en este caso tomamos el qubit 0 para medirlo.
5.2. Simulación en GAMA
Presentamos el código GAMA para llevar a cabo la simulación del algoritmo. Por ahora, estamos interesados únicamente en obtener el resultado de la simulación y no en el de estados intermedios durante una depuración. De tal manera que el estado resultante de cada una de las variables involucradas se puede observar en la pestaña inferior Configurations, en donde el quregistro psi contiene la información de si acaso la función se trata de una constante o bien de una equilibrada. En la Sec. 5.3 veremos la interpretación al resultado del algoritmo dado un tal quregistro.
5.3. Resultados
Como resultado de la simulación anterior, para el caso n=2 y la función
equilibrada f3 del Cuadro 3, obtuvimos que la
medición del quregistro 𝜓3 generó el quregistro 𝜓 = (1.0 +
0.0i)|111>. Considerando que el valor del quregistro
𝜓0 de entrada es
En este trabajo hemos realizado la simulación del algoritmo cuántico de Deutsch y Jozsa en el
lenguaje GAMA. Para ello, hemos establecido un mecanismo para construir la
compuerta cuántica Uf en forma
matricial, que ayuda a obtener la simulación de su comportamiento. Se puede
apreciar que el qubit de función
Además, también implementamos el algoritmo de Deutsch y Jozsa para los siguientes valores n = 3, 4, 5. El objetivo de este experimento es conocer su comportamiento y sus implicaciones. Al incrementar el número de qubits, la dimensión de la compuerta Uf aumenta de acuerdo a los detalles mostrados en el Cuadro 5.3. En general, la dimensión de la compuerta Uf para resolver un problema de n qubits es 2n-1 × 2n-1 . Para cualquier tamaño de quregistro, el algoritmo de Deutsch y Jozsa aplica una vez la compuerta Hadamard al registro inicial, una vez la compuerta Uf y finalmente una compuerta Hadamard. Aplicar una compuerta cuántica a un quregistro equivale a la multiplicación de una matriz por un vector. Lo que implica que la complejidad del algoritmo en una computadora clásica es 3 veces O(m2), donde m es la dimensión de la matriz y del vector. En el algoritmo cuántico, la dimensión de las compuertas es de m = 2n-1 , y su complejidad después de simularlo en una computadora clásica es de O((2n-1 )2). Esto ocasiona que la inicialización de la compuerta cuántica Uf consuma mayor tiempo debido a que el número de funciones a evaluar crece también. Sin embargo, no solo el tiempo de procesamiento tiene un impacto sino también la capacidad de almacenamiento de la máquina puede llegar a ser crucial si se trata de una simulación con un número de qubits muy alto.
La Fig. 3 muestra la gráfica de tiempos de las corridas del algoritmo de Deustch-Jozsa, utilizando una computadora de 32-bits para funciones de dos a cinco qubits de entrada, de lo que podemos apreciar un crecimiento exponencial. Como mencionamos anteriormente esto se debe al tiempo que consume la inicialización de la compuerta Uf . Una de las limitantes del simulador es que el número máximo de qubits que se pueden utilizar en un algoritmo está limitado al número de matrices que se puedan crear dentro del tamaño de la memoria de la computadora.
6. Conclusiones
En este trabajo hemos realizado la simulación del algoritmo cuántico de Deutsch y Jozsa en el
lenguaje GAMA con el fin de explorar sus diferentes componentes. Para ello, hemos
establecido un mecanismo para construir la compuerta cuántica
Uf en forma matricial, que
ayuda a obtener la simulación de su comportamiento. Se puede apreciar que el qubit
de función