13 Algoritmos cuánticos

En esta sección estudiaremos tres algoritmos cuánticos que muestran las ventajas de un sistema de computación cuántico con respecto a uno clásico. En concreto, analizaremos el algoritmo de Deutsch-Jotzsa, el algoritmo de búsqueda de Grover, y el algoritmo de factorización de Shor.

13.1 Algoritmo de Deutsch-Jotzsa

Consideremos una función booleana ff con nn bits de entrada y 11 bit de salida: f:{0,1}n{0,1}\begin{align*} f:\{0,1\}^n\to\{0,1\} \end{align*} El algoritmo de Deutsch-Jotzsa permite determinar ciertas propiedades de una función booleana ff sin necesidad de evaluar la función para todas las posibles entradas. En particular, es capaz de determinar si una función booleana ff es constante o balanceada.

Definición 13.1 La función ff es si siempre devuelve el mismo valor (bien 00 o 11) para todas las entradas. La función ff es si devuelve 00 para exactamente la mitad de las entradas y 11 para la otra mitad.

Ejemplo 13.1 Consideremos las siguintes funciones booleanas f:{0,1}2{0,1}f:\{0,1\}^2\to\{0,1\}:

  • f(a,b)=abf(a,b) = a \oplus b (función XOR \equiv OR exclusivo). Esta función devuelve f(0,0)=0,f(0,1)=1,f(1,0)=1,f(1,1)=0,\begin{align*} f(0,0) = 0,\quad f(0,1) = 1,\quad f(1,0) = 1,\quad f(1,1) = 0, \end{align*} y por tanto se trata de una función balanceada (mismo número de 00 y de 11 a su salida).

  • f(a,b)=0f(a,b) = 0 (función ‘0’). Esta función devuelve f(0,0)=0,f(0,1)=0,f(1,0)=0,f(1,1)=0,\begin{align*} f(0,0) = 0,\quad f(0,1) = 0,\quad f(1,0) = 0,\quad f(1,1) = 0, \end{align*} y por tanto se trata de una función constante (siempre devuelve 00).

  • f(a,b)=abf(a,b) = a \wedge b (función AND). Esta función devuelve f(0,0)=0,f(0,1)=0,f(1,0)=0,f(1,1)=1,\begin{align*} f(0,0) = 0,\quad f(0,1) = 0,\quad f(1,0) = 0,\quad f(1,1) = 1, \end{align*} y por tanto esta función no es ni constante ni balanceada.

Planteamiento del problema

Tenemos acceso a una caja negra que permite evaluar una función ff, de la que sabemos que es bien constante o balanceada (pero sólo una de estas dos alternativas). Nos piden determinar de forma unívoca qué tipo de función es con el mínimo número de llamadas o evaluaciones de la función.

Nuestra intuición nos indica que, dado que no conocemos ninguna información sobre la función ff (excepto que es bien constante o bien balanceada), solo podemos probar algunas de las 2n2^n posibles entradas y observar su salida correspondiente. Si observáramos dos salidas diferentes sabríamos con seguridad que la función no es constante. Sin embargo, en el peor caso, podemos obtener 2n/22^n / 2 salidas iguales y todavía no podríamos descartar que la función sea constante o balanceada (dado que las otras 2n/22^n / 2 salidas podrían ser iguales o diferentes a las primeras). Por tanto, concluimos que, en el peor caso, necesitaremos 2n/2+12^n / 2 + 1 llamadas a la función para resolver este problema de forma unívoca.

Ejemplo 13.2 Consideremos una función booleana f:{0,1}2{0,1}f:\{0,1\}^2\to\{0,1\} desconocida, de la que sabemos que es o constante o balanceada. Se realizan dos llamadas a la función y se obtienen los resultados f(0,0)=0f(0,0) = 0, f(1,1)=0f(1,1) = 0. Todavía no podemos saber si la función es constante o balanceada. De hecho, estos resultados son compatibles con las funciones f(a,b)=abf(a,b) = a \oplus b y f(a,b)=0f(a,b) = 0 del ejemplo anterior. Así, es necesario realizar una nueva llamada a la función. Obtenemos f(0,1)=1f(0,1) = 1 y por tanto podemos concluir que f(a,b)=abf(a,b) = a \oplus b, y la función es balanceada.

Para resolver el problema planteado hemos requerido 33 llamadas a la función.

Así, no parece que sea posible resolver este problema con menos de 2n/2+12^n / 2 + 1 llamadas a la función ff. Aunque esto es cierto para sistemas de computación clásica, veremos que utilizando las propiedades de la mecánica cuántica es posible resolver este problema de una forma radicalmente diferente con un único uso de la función ff, o de forma más precisa, con un único uso de su operador cuántico asociado.

Funciones de entrada binaria

Por sencillez, consideremos en primer lugar una función booleana con un único bit de entrada, f:{0,1}{0,1}.\begin{align*} f:\{0,1\} \to\{0,1\}. \end{align*} Para esta función, solo existen dos posibilidades: si f(0)=f(1)f(0)=f(1), la función es constante, mientras que si f(0)f(1)f(0) \neq f(1) la función es balanceada. Así, para una función de entrada binaria no se puede dar el caso de que no sea ni constante ni balanceada. En un sistema de computación clásico, es necesario realizar dos llamadas a la función ff para comprobar si es constante o balanceada. Con una implementación cuántica, en cambio, es posible determinar esta propiedad con un único uso del operador cuántico UfU_f asociado.

Oráculo

Este operador UfU_f se denomina oráculo de la función ff y tiene la estructura vista en la sección anterior para la implementación cuántica de funciones booleanas:

Oráculo del algoritmo de Deutsch.

donde las salidas deben cumplir x=a\ket{x}=\ket{a} e y=bf(a)\ket{y} = \ket{b\oplus f(a)}.

Inicialización

Para entender el funcionamiento del algoritmo de Deutsch-Jotzsa, vamos a estudiar como se comporta el oráculo UfU_f si introducimos en la entrada auxiliar b\ket{b} el cúbit H1=12(01)H\ket{1} = \tfrac{1}{\sqrt{2}} \bigl(\ket{0}-\ket{1} \bigr):

Inicialización del algoritmo de Deutsch.

El cúbit de salida superior está dado por x=a\ket{x}=\ket{a}. Por otra parte, dado que b=12(01)\ket{b} = \tfrac{1}{\sqrt{2}} \bigl(\ket{0}-\ket{1} \bigr), utilizando la propiedad del paralelismo cuántico,obtenemos que el cúbit de salida inferior queda y=12(0f(a)1f(a))={12(01),si f(a)=0,12(10),si f(a)=1.\begin{align*} \ket{y} &= \tfrac{1}{\sqrt{2}} \bigl(\ket{0 \oplus f(a)}-\ket{1 \oplus f(a)} \bigr)\\ &= \begin{cases} \tfrac{1}{\sqrt{2}} \bigl(\ket{0}-\ket{1} \bigr), & \text{si } f(a)=0,\\ \tfrac{1}{\sqrt{2}} \bigl(\ket{1}-\ket{0} \bigr), & \text{si } f(a)=1. \end{cases} \end{align*} Este estado se puede modelar de forma compacta como compacta como y=(1)f(a)12(01),\begin{align*} \ket{y} &= (-1)^{f(a)} \tfrac{1}{\sqrt{2}}\bigl(\ket{0}-\ket{1} \bigr), \end{align*} por lo que concluimos que cuando f(a)=1f(a)=1, se produce un cambio de signo en el cúbit de salida y\ket{y}. En el análisis subsiguiente se debe tener en cuenta que el producto por (1)f(a)(-1)^{f(a)} no afecta únicamente al cúbit inferior sino al estado conjunto xy\ket{x} \otimes\ket{y} a la salida del circuito. En particular se tiene que xy=(1)f(a)(a12(01))\begin{align*} \ket{x} \otimes \ket{y} &= (-1)^{f(a)} \Bigl(\ket{a} \otimes \tfrac{1}{\sqrt{2}}\bigl(\ket{0}-\ket{1} \bigr) \Bigr) \end{align*}

A continuación, vamos a ignorar (o descartar) la parte 12(01)\tfrac{1}{\sqrt{2}} \bigl(\ket{0}-\ket{1} \bigr) del estado conjunto, independiente de aa y nos centraremos en el primer cúbit x\ket{x}, que para esta inicialización “mágica” pasa a ser x=(1)f(a)a.\begin{align*} \ket{x} = (-1)^{f(a)} \ket{a}. \end{align*}

Paralelismo cuántico

En el análisis anterior hemos determinado la salida del circuito cuántico para una entrada a=0\ket{a} =\ket{0} o a=1\ket{a} =\ket{1}. En particular, evaluando la expresión anterior para a=0,1a =0,1 obtenemos x={(1)f(0)0, a=0(1)f(1)1, a=1.\begin{align} \ket{x} = \begin{cases} (-1)^{f(0)} \ket{0},\ &\ket{a} =\ket{0}\\ (-1)^{f(1)} \ket{1},\ &\ket{a} =\ket{1}. \end{cases} \tag{$\star$} \end{align}

Vamos ahora a utilizar la propiedad del paralelismo cuántico para procesar estas dos entradas al mismo tiempo. Para ello, aplicamos una superposición de estos dos casos H0=12(0+1)H\ket{0} = \tfrac{1}{\sqrt{2}} \bigl(\ket{0}+\ket{1} \bigr) en la entrada principal del oráculo UfU_f:

Inicialización del algoritmo de Deutsch: superposición de entradas.

Según el principio del paralelismo cuántico, para una superposición de entradas, la salida se corresponde a la superposición de las salidas correspondientes. Entonces, utilizando (\star), obtenemos x=12((1)f(0)0+(1)f(1)1),\begin{align*} \ket{x} &= \tfrac{1}{\sqrt{2}} \Bigl((-1)^{f(0)} \ket{0}+(-1)^{f(1)} \ket{1} \Bigr), \end{align*} que se puede reescribir como x={±12(0+1),si f(0)=f(1),±12(01),si f(0)f(1).\begin{align*} \ket{x} &= \begin{cases} \tfrac{\pm 1}{\sqrt{2}} \bigl(\ket{0}+\ket{1} \bigr), & \text{si } f(0)=f(1),\\ \tfrac{\pm 1}{\sqrt{2}} \bigl(\ket{0}-\ket{1} \bigr), & \text{si } f(0)\neq f(1). \end{cases} \end{align*} Aquí, en la opción superior hemos agrupado los casos f(0)=f(1)=0f(0)=f(1)=0 y f(0)=f(1)=1f(0)=f(1)=1, y en la inferior hemos agrupado los casos f(0)=0,f(1)=1f(0)=0, f(1)=1 y f(0)=1,f(1)=0f(0)=1, f(1)=0. Se debe notar que los estados correspondientes a la parte superior e inferior de esta ecuación son ortogonales entre sí, y se corresponden a los estados cuánticos puros ±+\pm\ket{+} y ±\pm\ket{-}. Así, se podrían distinguir sin errores mediante un proceso de medida en la base {+,}\bigl\{\ket{+},\ket{-}\bigr\}.

Medida y resultado

No es posible implementar una medida directamente en la base {+,}\bigl\{\ket{+},\ket{-}\bigr\} en un ordenador cuántico, ya que este último trabaja siempre en la base computacional. Sin embargo, sabemos que la puerta de Hadamard HH transforma la base {0,1}\bigl\{\ket{0},\ket{1}\bigr\} en la base {+,}\bigl\{\ket{+},\ket{-}\bigr\}, y viceversa. Así, si definimos un estado z=Hx\ket{z} = H\ket{x}, tenemos que z=Hx={±0,si f(0)=f(1),±1,si f(0)f(1).\begin{align*} \ket{z} = H \ket{x} &= \begin{cases} \pm \ket{0}, & \text{si } f(0)=f(1),\\ \pm \ket{1}, & \text{si } f(0)\neq f(1). \end{cases} \end{align*} Si aplicamos una medida sobre el estado z\ket{z} con respecto a la base computacional {0,1}\bigl\{\ket{0},\ket{1}\bigr\}, obtendremos por tanto un resultado determinista que va a depender de si la función es f(0)=f(1)f(0)=f(1) (constante) o f(0)f(1)f(0)\neq f(1) (balanceada).

Algoritmo de Deutsch

El proceso descrito anteriormente fue propuesto inicialmente por David Deutsch en 1985, por lo que se conoce habitualmente como algoritmo de Deutsch. La siguiente figura muestra el diagrama de bloques completo del algoritmo de Deutsch:

Algoritmo de Deutsch: circuito cuántico.

Para determinar si la función ff es constante o balanceada, ejercutamos el algoritmo en un ordenador cuántico y comprobamos el resultado:

  • Si z=0z=0, entonces la función ff es constante, f(0)=f(1)f(0) = f(1).
  • Si z=1z=1, entonces la función ff es balanceada, f(0)f(1)f(0) \neq f(1).

Este algoritmo permite determinar de forma determinista si la función f:{0,1}{0,1}f: \{0,1\} \to\{0,1\} es constante o balanceada, mediante un único uso del oráculo UfU_f. Recordemos que el mejor algoritmo clásico requería dos llamadas a la función ff.

Ejercicio 13.1 Considere la función booleana de entrada binaria f(a)=NOT(a)f(a)=\text{NOT}(a). ¿Cual debería ser la salida del algoritmo de Deutsch para esta función? El oráculo cuántico UfU_f asociado a ff es Oráculo de función binaria f(a)=NOT(a). Implemente el algoritmo de Deutsch en IBM Quantum y ejecutelo en el simulador. ¿Funciona?

Repita el proceso para los siguientes oráculos Oráculos de funciones binarias. ¿Qué funciones booleanas representa cada uno de estos oráculos? ¿Funciona el algoritmo?

Algoritmo de Deutsch-Jotzsa

Mientras que la ganancia de este algoritmo cuántico es marginal para funciones booleanas de entrada binaria, la idea se extendió posteriormente para considerar funciones booleanas con nn entradas en un trabajo realizado por el propio Deutsch en colaboración de Richard Jozsa.1 Esta extensión, conocida como algoritmo de Deutsch-Jotzsa, permite determinar si una función f:{0,1}n{0,1}f:\{0,1\}^n\to\{0,1\} es constante o balanceada mediante un único uso del operador UfU_f, frente a las 2n/2+12^n/2+1 llamadas que, en el peor caso, requiere un ordenador clásico.

La siguiente figura muestra el diagrama de bloques del algoritmo de Deutsch-Jotzsa general:

Algoritmo de Deutsch-Jotzsa: circuito cuántico.

Mientras que en el caso de n=1n=1 la ventaja del algoritmo cuántico es marginal (pasamos de dos usos de la función ff a un único uso del oráculo UfU_f), para el caso de funciones con nn entradas, el algoritmo cuántico presenta una ventaja exponencial sobre el clásico: El algoritmo clásico (en el peor caso) requiere 2n/2+1=2n1+12^n/2+1 = 2^{n-1}+1 llamadas a la función ff, mientras que el algoritmo de Deutsch-Jozsa ofrece una solución determinista con un único uso del oráculo UfU_f.

A pesar de que el problema considerado carece de utilidad práctica (distinguir si una función es constante o balanceada), este algoritmo fue la primera demostración de que los ordenadores cuánticos permiten resolver ciertos problemas de una forma (exponencialmente) más rápida que el mejor ordenador clásico. Así, este resultado impulsaría el desarrollo y búsqueda de otros algoritmos que acabarían teniendo grandes implicaciones, como veremos a continuación.

13.2 Algoritmo de búsqueda de Grover

Consideremos ahora una función booleana f:{0,1}n{0,1}f:\{0,1\}^n \to \{0,1\} tal que f(x)={1,si x=x,0,si xx.\begin{align*} f(\boldsymbol{x}) &= \begin{cases} 1, & \text{si } \boldsymbol{x} = \boldsymbol{x}^{\star},\\ 0, & \text{si } \boldsymbol{x} \neq \boldsymbol{x}^{\star}. \end{cases} \end{align*} Es decir, la función se activa para una entrada x\boldsymbol{x}^{\star} y permanece inactiva para las demás entradas.

Planteamiento del problema

Para una función f:{0,1}n{0,1}f:\{0,1\}^n \to \{0,1\} desconocida tal que f(x)=1f(\boldsymbol{x})=1 para una (y solo una) entrada x=x\boldsymbol{x} = \boldsymbol{x}^{\star}, deseamos encontrar el valor que activa la función x\boldsymbol{x}^{\star}.

Se debe tener en cuenta que este problema se corresponde con una búsqueda de un único elemento en un espacio con 2n2^n posibilidades. Así, se trata de “encontrar una aguja en un pajar” de posibles entradas.

Ejemplo 13.3 A diferencia del algoritmo de Deutsch-Jozsa, esta formulación permite modelar diversos problemas de índole práctica, como pueden ser:

  • La búsqueda dentro de una lista desordenada de N=2nN = 2^n elementos. Por ejemplo, en una base de datos podríamos buscar en qué registro se encuentra un determinado dato.

  • Un ataque por fuerza bruta a un sistema criptográfico con N=2nN = 2^n posibles entradas (claves) en el cual una única posibilidad es la correcta. Si disponemos de una función ff que nos indique si la clave funciona (por ejemplo,comprobando que el archivo desencriptado cumple ciertas propiedades), entonces podemos modelar el problema de búsqueda de la clave de esta forma.

El mejor algoritmo clásico para resolver este problema tiene complejidad O(N)\mathcal{O}(N) con N=2nN=2^n, ya que requiere (en el peor caso) N1N-1 llamadas a la función para encontrar la entrada que la activa. En cambio, un algoritmo cuántico desarrollado por Lov Grover en 1996 puede resolver este problema con solo O(N)\mathcal{O}(\sqrt{N}) usos del oráculo UfU_f asociado a la función.2

Este resultado presenta unas enorme implicaciones, ya que permite, por ejemplo, acelerar un ataque de fuerza bruta pasando de requerir probar las N=2nN=2^n claves, a tan solo N=2n/2\sqrt{N} = 2^{n/2} evaluaciones de la función. Así, si consideramos un sistema criptográfico con una clave de longitud nn bits, estaríamos reduciendo su longitud efectiva de la clave a la mitad.

Oráculo e inicialización

Al igual que en el algoritmo de Deutsch-Jozsa necesitamos un oráculo de la función ff a analizar:

Algoritmo de Gover: oráculo.

Los primeros pasos del algoritmo de Grover coinciden con los correspondientes pasos del algoritmo de Deutsch-Jozsa. Así, si introducimos el cúbit H1=12(01)=H\ket{1} = \tfrac{1}{\sqrt{2}} \bigl(\ket{0}-\ket{1} \bigr) = \ket{-} en la entrada auxiliar b\ket{b}, a la salida obtenemos Ufa,={a,,f(a)=1,+a,,f(a)=0.\begin{align*} U_f \ket{\boldsymbol{a}, -} = \begin{cases} -\ket{\boldsymbol{a}, -},& f(\boldsymbol{a})=1,\\ +\ket{\boldsymbol{a}, -},& f(\boldsymbol{a})=0. \end{cases} \end{align*} Es decir, el estado a la salida pasa a tener una amplitud negativa para a=x\boldsymbol{a}=\boldsymbol{x}^{\star}. La clave del algoritmo de Grover está en cómo transformar esta propiedad en un observable que se pueda detectar mediante un proceso de medida.

Paralelismo cuántico

En la entrada principal del operador cuántico introducimos una superposición de entradas: a=Hn0n=1Ni=0N1i,\begin{align*} \ket{\boldsymbol{a}} &= H^{\otimes n} \ket{0^n} = \frac{1}{\sqrt{N}} \sum_{i=0}^{N-1} \ket{i}, \end{align*} donde i\ket{i} denota el estado cuántico de la base computacional asociado a la descomposición binaria de i=0,1,,N1i=0,1, \ldots,N-1, y donde 1/N{1}/{\sqrt{N}} es un factor de normalización. Si aplicamos esta entrada al oráculo con la inicialización considerada en el punto anterior, a la salida obtendremos una superposición de salidas: Ufa,=1Ni=0N1(1)f(i)i,.\begin{align*} U_f \ket{\boldsymbol{a}, -} = \frac{1}{\sqrt{N}} \sum_{i=0}^{N-1} (-1)^{f(i)} \ket{i, -}. \end{align*}

Ejemplo 13.4 Vamos a considerar una función booleana con n=2n=2 bits de entrada que se activa con f(0,1)=1f(0,1)=1, siendo cero en los demás casos. Para n=2n=2, N=2n=4N=2^n=4, tenemos que la superposición de todas las posibles entradas de la función está dada por a=12(00+01+10+11).\begin{align*} \ket{\boldsymbol{a}} & = \frac{1}{2} \bigl(\ket{00}+\ket{01}+\ket{10}+\ket{11} \bigr). \end{align*} Si aplicamos esta entrada al oráculo con la inicialización mágica, obtenemos Ufa,=12(00,01,+10,+11,).\begin{align*} U_f \ket{\boldsymbol{a}, -} & = \frac{1}{2} \bigl(\ket{00,-}-\ket{01,-}+\ket{10,-}+\ket{11,-} \bigr). \end{align*} Vemos que el estado 01,\ket{01,-} presenta un signo negativo debido al término (1)f(i)(-1)^{f(i)} que se activa para la entrada (y solo para la entrada) i=01i=01.

Por ejemplo, para n=2n=2, N=4N=4 y tenemos que a=12(00+01+10+11).\begin{align*} \ket{\boldsymbol{a}} & = \frac{1}{2} \bigl(\ket{00}+\ket{01}+\ket{10}+\ket{11} \bigr). \end{align*}

Operador de difusión de Grover

Para detectar la componente de la superposición Ufa,U_f \ket{\boldsymbol{a}, -} marcada con un signo negativo, necesitamos transformarla en un observable que podamos medir. Utilizaremos el operador de difusión de Grover, definido como: G=Hn(20n0nIn)Hn=2ψψIn,\begin{align*} G \,=\, H^{\otimes n}\Bigl(2 \ket{0^n}\bra{0^n} - I_n\Bigr) H^{\otimes n} \,=\, 2 \ket{\psi}\bra{\psi} - I_n, \end{align*} donde ψ\ket{\psi} es una superposición uniforme e InI_n es el operador identidad.

Se puede demostrar que este operador transforma diferencias en fase en la superposición de entrada a diferencias en amplitud en la superposición de salida. Más precisamente, para un estado puro a=iaii\begin{align*} \ket{a} = \sum_{i} a_i \ket{i} \end{align*} y con valor medio aˉ=(iai)/(i1)\bar a = \bigl(\sum_i a_i\bigr)/\bigl(\sum_i 1\bigr), a la salida del operador de difusión GG se obtiene b=Ga=i(2aˉai)i.\begin{align*} \ket{b} = G \ket{a} = \sum_{i} (2 \bar a - a_i) \ket{i}. \end{align*} El operador de difusión transforma las amplitudes cuánticas aia_i en amplitudes bi=2aˉaib_i = 2 \bar a - a_i a su salida.

Ejemplo 13.5 Para n=2n=2, vamos a aplicar el operador de difusión GG a un estado a=iaii\ket{a} = \sum_{i} a_i \ket{i}, y observar su efecto en la salida b=ibii=Ga\ket{b} = \sum_{i} b_i \ket{i} = G \ket{a}. En este caso i=00,01,10,11i=00, 01, 10, 11.

  • Amplitudes de igual fase: a00=a01=a10=a11=12b00=b01=b10=b11=12.\begin{align*} a_{00} = a_{01} = a_{10} = a_{11} = \tfrac{1}{2} \quad\Rightarrow\quad b_{00} = b_{01} = b_{10} = b_{11} = \tfrac{1}{2}. \end{align*}

  • Amplitudes con diferente fase: a00=a10=a11=12 y a01=12b00=b10=b11=0 y b01=1.\begin{align*} a_{00} = a_{10} = a_{11} = \tfrac{1}{2} \text{ y } a_{01}=-\tfrac{1}{2} \quad\Rightarrow\quad b_{00} = b_{10} = b_{11} = 0 \text{ y } b_{01} = 1. \end{align*}

En el algoritmo de Grover, el oráculo y el operador de difusión se deben aplicar O(N)\mathcal{O}(\sqrt{N}) veces para aumentar la amplitud del estado deseado, de forma que al aplicar una medida sobre el mismo ofrezca la solución correcta x\boldsymbol{x}^{\star} con alta probabilidad (ver Ejercicio 8 de la colección de ejercicios de este tema).

Medida y resultado

El diagrama de bloques del algoritmo de Grover completo entonces queda:

Algoritmo de Gover: circuito cuántico.

Este algoritmo se estudiará en detalle en la Práctica 4 de la asignatura, y su implementación se deja como trabajo del alumno. La principal dificultad para aplicar el algoritmo de Grover en un problema real es determinar un oráculo adecuado. Como ejemplo, en el Ejercicio 5 de la práctica se considera la implementación de una búsqueda en una base de datos.

13.3 Algoritmo de factorización de Shor

Dentro de los algoritmos cuánticos conocidos hasta ahora, es especialmente relevante el algoritmo de Shor, que permite descomponer un número en sus factores primos. En esta sección estudiaremos sus claves principales.

Transformada cuántica de Fourier

En la asignatura Sistemas Lineales (dedicada al Análisis de Fourier) hemos estudiado la transformada discreta de Fourier (DFT) para secuencias en tiempo discreto. Para una secuencia xx_\ell, $= 0,,N-1 $, la transformada discreta de Fourier se define como yk=1N=0N1e2πjkNx,k=0,,N1.\begin{align*} y_k = \frac{1}{\sqrt{N}} \sum_{\ell =0}^{N-1} e^{2\pi j\frac{k \ell}{N}} x_\ell, \quad k = 0,\ldots,N-1. \end{align*} Esta operación transforma el vector xx_{\ell}, =0,,N1\ell = 0,\ldots,N-1 al dominio frecuencial, yky_k, k=0,,N1k = 0,\ldots,N-1. Si consideramos las secuencias xx_\ell y yky_k como vectores, esta operación se puede reescribir como y=Fx,\begin{align*} \boldsymbol{y} = F \boldsymbol{x}, \end{align*} donde FF se corresponde a una matriz unitaria.

En este curso hemos visto que los sistemas cuánticos admiten transformaciones unitarias, por lo que podríamos plantearnos la creación de un operador cuántico FF que calcula la transformada de Fourier de un estado cuántico. Esto es posible y es lo que se conoce como (QFT): Fk=1N=0N1e2πjkN,k=0,,N1\begin{align*} F \ket{k} = \frac{1}{\sqrt{N}} \sum_{\ell =0}^{N-1} e^{2\pi j\frac{k \ell}{N}} \ket{\ell}, \quad k = 0,\ldots,N-1 \end{align*} donde k\ket{k} es el elemento kk-ésimo de la base computacional. Este estado se define para un sistema cuántico de dimensión nn cúbits, de forma que la correspondiente base computacional tiene N=2nN=2^n elementos.

Cálculo del periodo de una función

La transformada discreta de Fourier (DFT) se puede utilizar para encontrar el periodo de una función, ya que x=x+kLyk=DFT{x}=0, kmN/L.\begin{align*} x_\ell = x_{\ell + kL} \quad \Rightarrow \quad y_k = \text{DFT}\{x_\ell\} = 0, \ k \neq m N/L. \end{align*} Así, la DFT de una función periódica se corresponde a una señal formada por deltas situadas en los múltiplos de la frecuencia fundamental.

Ejemplo 13.6 La siguiente figura muestra una secuencia xx_{\ell} periódica de longitud N=20N=20 y periodo L=4L=4, así como su correspondiente DFT yky_k.

DFT de una secuencia periódica.

Se puede ver como la trasformada yky_k es una secuencia compuesta por deltas situadas en la frecuencia fundamental N/L=5N/L=5 y sus múltiplos.

Del mismo modo, si aplicamos la transformada cuántica de Fourier (QFT) a un estado x\ket{\boldsymbol{x}} que presente un cierto periodo con respecto a la base computacional, entonces a su salida obtendremos un estado cuántico en el que no hay amplitud fuera de los múltiplos de la frecuencia fundamental. Así, si medimos el estado cuántico a la salida de la QFT obtendremos la frecuencia fundamental (o uno de sus armónicos).

Algoritmo de factorización

En 1992, Peter W. Shor propuso un algoritmo cuántico para la factorización de números utilizando que la QFT permite obtener el periodo de una función de una forma eficiente. El algoritmo resultante presentaba una complejidad polinómica con el número de dígitos del número a factorizar, a diferencia del mejor algoritmo clásico para esta tarea, que presenta una complejidad exponencial (ver Ejercicio 9 de la Colección 4).

Planteamiento del problema: Consideremos un número entero MM tal que M=ABM = A B con AA y BB primos. Asumimos que MM se puede representar con nn dígitos binarios, es decir M<N=2nM < N = 2^n. Para un MM dado, nos piden encontrar AA y BB.

Algoritmo:

  1. Elegir un número aa entre 11 y M1M-1.
  2. Si mcd(a,M)1\text{mcd}(a,M)\neq 1, devolver mcd(a,M)\text{mcd}(a,M).
  3. Encontrar el periodo LL de la función f()=a mod Mf(\ell) = a^{\ell} \text{ mod } M

\rightarrow si LL es par y mcd(aL/2+1,M)M\text{mcd}(a^{L/2}+1, M)\neq M, devolver mcd(aL/2+1,M)\text{mcd}(a^{L/2}+1, M)

\rightarrow en otro caso, devolver error

Este algoritmo se puede ejecutar en un ordenador clásico y permite obtener (con alta probabilidad) los factores de MM. La ventaja de utilizar un ordenador cuántico viene a la hora de determinar el periodo LL de la función f()=a mod Mf(\ell) = a^{\ell} \text{ mod } M. Esta operación se puede realizar utilizando la QFT mediante un número de puertas cuánticas que crece polinomialmente con la longitud nn del número a factorizar. Por tanto, la única parte cuántica del algoritmo e correpondería a este proceso. A continuación aparece representado el diagrama de bloques correspondiente:

Algoritmo de factorización de Shor: circuito cuántico.

Si nn es el número de dígitos binarios, esta implementación cuántica requiere del orden de O(n4)\mathcal{O}\bigl(n^4\bigr) operaciones. Por otra parte, este es una algoritmo que ofrece no ofrece la solución de forma determinista, sino con alta probabilidad, por lo que es necesario repetir el algoritmo O(logn)\mathcal{O}(\log n) veces para conseguir factorizar el número con éxito. Así el algoritmo de factorización de Shor presenta una complejidad O(n4logn)\mathcal{O}\bigl(n^4\log n\bigr), que se puede comparar con la complejidad de uno de los mejores algoritmos de factorización clásicos como puede ser el algoritmo de Pollard y Strassen de 1976, que tiene complejidad O(2n/4n2)\mathcal{O}\bigl(2^{n/4} n^2 \bigr).

Ejemplo 13.7 Consideremos el problema de factorizar un número con n=1024n=1024 dígitos binarios.

  • El algoritmo cuántico de Shor presentaría una complejidad del orden de n4logn7,61012n^4\log n \approx 7,6 \cdot 10^{12}.
  • El algoritmo clásico de Pollard y Strassen requiere del orden de 2n/4n21,210832^{n/4} n^2 \approx 1,2 \cdot 10^{83} operaciones.

Para tener algo de intuición sobre la diferencia de magnitud de estas cantidades, asumamos que el tiempo para realizar una operación fuera similar en ambas implementaciones. Entonces, si el algoritmo de Shor tarda 11 segundo en realizar la factorización, el algoritmo de Pollard y Strassen tardaría en torno a 510625 \cdot 10^{62} años en realizar la misma tarea.

Muchos de los sistemas criptográficos usados en la actualidad, como por ejemplo RSA, se basan en la dificultad de factorizar números grandes. Entonces, ¿están estos sistemas criptográficos amenazados? Para responder a esta pregunta, se debe tener en cuenta el estado de la tecnología de computación cuántica hoy.

Para implementar el algoritmo de Shor con un ordenador cuántico ideal, se necesitarían 22 cúbits por cada dígito binario del número a factorizar (en la práctica, debido al ruido existente se necesitarían entre 22 y 1010 cúbits por cada dígito binario a factorizar. La tecnología actual con ordenadores de 70\sim 70 cúbits, permitiría (en el mejor de los casos) factorizar números de hasta 3535 bits. Así, teniendo en cuenta que que las claves RSA actuales tienen una longitud de entre 10241024 y 20482048 bits, podemos concluir que este algoritmo (todavía) no presenta una amenaza a la seguridad de nuestras comunicaciones.