Algoritmo de Shor
Ahora nos centraremos en el problema de la factorización entera y veremos cómo puede resolverse de forma eficiente en un ordenador cuántico utilizando la estimación de fase. El algoritmo que obtendremos es el algoritmo de Shor para la factorización de enteros. Shor no describió su algoritmo específicamente en términos de estimación de fase, pero es una forma natural e intuitiva de explicar cómo funciona.
Empezaremos analizando un problema intermedio conocido como el problema de búsqueda de órdenes y veremos cómo la estimación de fase proporciona una solución a este problema. A continuación veremos cómo una solución eficiente al problema de búsqueda de órdenes nos da una solución eficiente al problema de factorización de enteros. (Cuando la solución a un problema proporciona una solución a otro problema como éste, decimos que el segundo problema se reduce al primero - así que en este caso estamos reduciendo la factorización entera a la búsqueda de órdenes) Esta segunda parte del algoritmo de Shor no hace uso de la computación cuántica en absoluto; es completamente clásica. La computación cuántica sólo es necesaria para resolver la búsqueda de órdenes.
El problema de la búsqueda de pedidos
Algunos conceptos básicos de teoría de números
Para explicar el problema de la búsqueda de órdenes y cómo se puede resolver utilizando la estimación de fase, será útil empezar con un par de conceptos básicos de teoría de números e introducir algunas notaciones útiles por el camino.
Para empezar, para cualquier número entero positivo , definimos el conjunto de la siguiente manera.
Por ejemplo, etc.
Son conjuntos de números, pero podemos considerarlos como algo más que simples conjuntos. En concreto, podemos pensar en operaciones aritméticas en , como la suma y la multiplicación, y si acordamos tomar siempre nuestros resultados módulo (es decir, dividir entre y considerar el resto como resultado), siempre nos mantendremos dentro de este conjunto al realizar estas operaciones. Las dos operaciones específicas de suma y multiplicación, ambas realizadas módulo , convierten en un anillo, que es un tipo de objeto de importancia fundamental en álgebra.
Por ejemplo, y son elementos de , y si los multiplicamos entre sí obtenemos , lo que deja un resto de al dividirlo entre . A veces lo expresamos de la siguiente manera.
Pero también podemos escribir simplemente « », siempre que haya quedado claro que estamos trabajando en « », con el fin de que nuestra notación sea lo más sencilla posible.
A modo de ejemplo, aquí están las tablas de suma y multiplicación de .
Entre los elementos de , los elementos que cumplen son especiales. A menudo, el conjunto que contiene estos elementos se denota con un asterisco, como se muestra aquí.
Si centramos nuestra atención en la operación de la multiplicación, el conjunto forma un grupo —concretamente, un grupo abeliano—, que es otro tipo importante de objeto en álgebra. Es un hecho básico de estos conjuntos (y de los grupos finitos en general) que, si elegimos cualquier elemento y multiplicamos repetidamente por sí mismo, siempre acabaremos obteniendo el número .
Como primer ejemplo, tomemos . Tenemos que porque , y si multiplicamos por sí mismo obtenemos , tal y como confirma la tabla anterior.
Como segundo ejemplo, tomemos . Si repasamos los números desde hasta , los que tienen un MCD igual a con son los siguientes.
Para cada uno de estos elementos, es posible elevar ese número a una potencia entera positiva para obtener un número de e. Estas son las potencias mínimas para las que esto funciona:
Naturalmente, estamos trabajando en para todas estas ecuaciones, que no nos hemos molestado en escribir: las damos por implícitas para no complicar las cosas. Seguiremos haciéndolo durante el resto de la lección.
Descripción del problema y relación con la estimación de fase
Ahora podemos plantear el problema de búsqueda de órdenes.
Entrada: enteros positivos y que satisfagan \ Salida: el menor entero positivo tal que
Por otra parte, según la notación que acabamos de introducir, se nos da un número y buscamos el menor entero positivo tal que . Este número se denomina orden de módulo .
Para relacionar el problema de la determinación del orden con la estimación de fase, pensemos en la operación definida en un sistema cuyos estados clásicos corresponden a , donde multiplicamos por un elemento fijo .
Para que quede claro, estamos realizando la multiplicación en « », por lo que queda implícito que estamos tomando el producto módulo « » dentro del ket que aparece en el lado derecho de la ecuación.
Por ejemplo, si tomamos y , la acción de sobre la base estándar es la siguiente.
Se trata de una operación unitaria siempre que ; mezcla los elementos de la base estándar , por lo que, como matriz, es una matriz de permutación. De su definición se desprende que esta operación es determinista, y una forma sencilla de comprobar que es invertible es pensar en el orden de módulo , y darse cuenta de que la inversa de es .
Hay otra forma de plantearse la inversa que no requiere ningún conocimiento de « » (que, al fin y al cabo, es lo que estamos intentando calcular). Para cada elemento siempre existe un elemento único que satisface . Denotamos este elemento por , y puede calcularse de forma eficiente; una extensión del algoritmo del MCD de Euclides lo hace con un coste cuadrático en . Y, por lo tanto,
Así pues, la operación es a la vez determinista e invertible. Eso implica que está descrita por una matriz de permutación y, por tanto, es unitaria.
Ahora pensemos en los vectores propios y los valores propios de la operación , suponiendo que . Como acabamos de ver, esta suposición nos indica que es unitaria.
Hay valores propios de , entre los que puede figurar el mismo valor propio repetido varias veces, y, en general, existe cierta libertad a la hora de seleccionar los vectores propios correspondientes; pero no tendremos que preocuparnos por todas las posibilidades. Empecemos por algo sencillo e identifiquemos un solo vector propio de .
El número es el orden de módulo , tanto aquí como en el resto de la lección. El valor propio asociado a este vector propio es , ya que no varía al multiplicarlo por .
Esto ocurre porque , por lo que cada estado de la base estándar se desplaza a para , y vuelve a situarse en . Hablando de manera informal, es como si estuviéramos removiendo lentamente , pero ya está completamente removido, por lo que no cambia nada.
He aquí otro ejemplo de vector propio de . Este resulta ser más interesante en el contexto de la determinación del orden y la estimación de fase.
Alternativamente, podemos escribir este vector utilizando una suma de la siguiente manera.
Aquí vemos cómo aparece de forma natural el número complejo , debido a la forma en que funciona la multiplicación por módulo . En esta ocasión, el valor propio correspondiente es . Para comprobarlo, podemos realizar primero el siguiente cálculo.
Entonces, dado que y , vemos que
Así que .
Siguiendo el mismo razonamiento, podemos identificar otros pares de vectores propios y valores propios para . Para cualquier elección de , se tiene que
es un vector propio de cuyo valor propio correspondiente es .
Hay otros vectores propios de , pero no es necesario que nos ocupemos de ellos; nos centraremos únicamente en los vectores propios que acabamos de identificar.
Búsqueda de órdenes mediante estimación de fase
Para resolver el problema de búsqueda de orden para una elección dada de , podemos aplicar el procedimiento de estimación de fase a la operación .
Para ello, debemos implementar de forma eficiente no solo con un circuito cuántico, sino también , , , y así sucesivamente, llegando tan lejos como sea necesario para obtener una estimación lo suficientemente precisa a partir del procedimiento de estimación de fase. Aquí explicaremos cómo se puede hacer esto y, más adelante, determinaremos exactamente cuánta precisión se necesita.
Empecemos por la operación « » en sí misma. Naturalmente, dado que estamos trabajando con el modelo de circuito cuántico, utilizaremos la notación binaria para codificar los números comprendidos entre y . El número más grande que necesitamos codificar es , por lo que el número de bits que necesitamos es
Por ejemplo, si , tenemos . Así es como se ve la codificación de los elementos de como cadenas binarias de longitud .
Y ahora, he aquí una definición precisa de cómo se define como una operación -qubit.
La cuestión es que, aunque solo nos interese cómo funciona para , sí que tenemos que especificar cómo funciona para el resto de los estados de la base estándar , y debemos hacerlo de tal forma que siga dándonos una operación unitaria. Esto se consigue definiendo de tal forma que no realice ninguna acción sobre los estados restantes de la base estándar.
Utilizando los algoritmos de multiplicación y división de números enteros que se han tratado en la lección anterior, junto con la metodología para su implementación reversible y sin residuos, podemos construir un circuito cuántico que realice un para cualquier elección de , con un coste de . A continuación se muestra una forma de hacerlo.
- Construye un circuito para realizar la operación
donde
utilizando el método descrito en la lección anterior. Esto nos da un circuito de tamaño .
-
Intercambia los dos sistemas -qubit utilizando swap gates para intercambiar los qubits individualmente.
-
De forma similar al primer paso, construye un circuito para la operación
donde es la inversa de en .
Inicializando los qubits inferiores y componiendo los tres pasos, obtenemos esta transformación:
El método requiere qubits del espacio de trabajo, pero al final se restablecen a su estado inicial, lo que nos permite utilizar estos circuitos para la estimación de fase. El coste total del circuito que obtenemos es de .
Para realizar , , , etc., podemos utilizar exactamente el mismo método, salvo que sustituimos por , , , etc., como elementos de . Es decir, para cualquier potencia que elijamos, podemos crear un circuito para no iterando veces el circuito para , sino calculando y utilizando luego el circuito para .
El cálculo de potencias es el problema de la exponenciación modular mencionado en la lección anterior. Este cálculo se puede realizar de forma clásica, utilizando el algoritmo de exponenciación modular mencionado en la lección anterior (que en teoría computacional de números se suele denominar «algoritmo de potencias»). De hecho, solo necesitamos potencias de power-of-2 de , en concreto , y podemos obtener estas potencias elevando al cuadrado de forma iterativa veces. Cada elevación al cuadrado puede realizarse mediante un circuito booleano de tamaño .
En esencia, lo que estamos haciendo aquí es delegar el problema de iterar « » tantas veces como « » a un cálculo clásico eficiente. ¡Y qué suerte que esto sea posible! Si se elige un circuito cuántico cualquiera en el problema de la estimación de fase, es poco probable que esto sea posible; y, en ese caso, el coste resultante de la estimación de fase crece exponencialmente con el número de qubits de control .
Solución dada un vector propio conveniente
Para entender cómo podemos resolver el problema de la búsqueda del orden mediante la estimación de fase, empecemos suponiendo que aplicamos el procedimiento de estimación de fase a la operación utilizando el vector propio . Resulta que no es fácil conseguir este vector propio, así que esto no será el final de la historia, pero es útil empezar por aquí.
El valor propio de correspondiente al vector propio es
Es decir, para . Así pues, si aplicamos el procedimiento de estimación de fase a utilizando el vector propio , obtendremos una aproximación a . Al calcular el recíproco, podremos obtener , siempre que nuestra aproximación sea lo suficientemente buena.
Más concretamente, cuando ejecutamos el procedimiento de estimación de fase utilizando qubits de control de tipo « », lo que obtenemos es un número . A continuación, tomamos como estimación para , que en el caso que nos ocupa es . Para averiguar cuál es el valor de « » a partir de esta aproximación, lo más lógico es calcular el recíproco de nuestra aproximación y redondear al entero más cercano.
Por ejemplo, supongamos que y realizamos la estimación de fase en con el vector propio utilizando bits de control. La mejor aproximación de -bit a es , y tenemos muchas posibilidades (aproximadamente en este caso) de obtener el resultado a partir de la estimación de fase. Tenemos
y, al redondear al entero más cercano, se obtiene « », que es la respuesta correcta.
Por otro lado, si no utilizamos la precisión suficiente, es posible que no obtengamos la respuesta correcta. Por ejemplo, si tomamos un qubits de control en la estimación de fase, podríamos obtener la mejor aproximación de bits a , que es . Tomando el recíproco se obtiene
y, al redondear al entero más cercano, se obtiene una respuesta incorrecta de .
Entonces, ¿qué grado de precisión necesitamos para obtener la respuesta correcta? Sabemos que el orden es un número entero y, intuitivamente, lo que necesitamos es suficiente precisión para distinguir de otras posibilidades cercanas, como y . El número más cercano a que debemos tener en cuenta es , y la distancia entre estos dos números es
Por lo tanto, si queremos asegurarnos de no confundir con , basta con utilizar la precisión suficiente para garantizar que la mejor aproximación a esté más cerca de que de . Si utilizamos la precisión suficiente para que
De modo que, si el error es inferior a la mitad de la distancia entre y , entonces estará más cerca de que de cualquier otra posibilidad, incluidas y .
Podemos comprobarlo de la siguiente manera. Supongamos que
para satisfaciendo
Si tomamos el recíproco obtenemos
Maximizando en el numerador y minimizando en el denominador, podemos acotar lo lejos que estamos de de la siguiente manera.
Estamos a menos de de , así que, como era de esperar, al redondear obtendremos .
Por desgracia, como aún no sabemos qué es , no podemos utilizarlo para saber cuánta precisión necesitamos. Lo que podemos hacer en su lugar es utilizar el hecho de que debe ser menor que para asegurarnos de que utilizamos la precisión suficiente. En particular, si utilizamos la precisión suficiente para garantizar que la mejor aproximación a satisface
entonces tendremos suficiente precisión para determinar correctamente cuando tomemos el recíproco. Tomando nos aseguramos de tener una alta probabilidad de obtener una estimación con esta precisión utilizando el método descrito anteriormente. (Tomar es suficiente si nos sentimos cómodos con un límite inferior del 40% en la probabilidad de éxito)
Solución general
Como acabamos de ver, si disponemos del vector propio de , podemos determinar mediante la estimación de fase, siempre y cuando utilicemos suficientes qubits de control para hacerlo con la precisión necesaria. Por desgracia, no es fácil conseguir el vector propio , así que tenemos que averiguar cómo proceder.
Supongamos por un momento que procedemos tal y como se ha indicado anteriormente, salvo que utilizamos el vector propio en lugar de , para cualquier elección de que decidamos considerar. El resultado que obtenemos del procedimiento de estimación de fase será una aproximación
Partiendo de la hipótesis de que no conocemos ni ni , esto podría permitirnos —o no— identificar . Por ejemplo, si , obtendremos una aproximación a , lo que, por desgracia, no nos aporta ninguna información. Sin embargo, este es un caso atípico; para otros valores de , al menos podremos aprender algo sobre .
Podemos utilizar un algoritmo conocido como el algoritmo de la fracción continua para convertir nuestra aproximación en fracciones cercanas - incluyendo si la aproximación es lo suficientemente buena. No explicaremos aquí el algoritmo de la fracción continua. En su lugar, he aquí una declaración de un hecho conocido sobre este algoritmo.
Dados un número entero y un número real , existe como máximo una opción de números enteros tales que y satisfagan . Dados y , el algoritmo de fracciones continuas encuentra y , o bien indica que no existen. Este algoritmo puede implementarse como un circuito booleano de tamaño .
Si disponemos de una aproximación muy cercana a , y aplicamos el algoritmo de fracciones continuas a y , obtendremos y , tal y como se describe en el enunciado. Un análisis de los hechos nos permite concluir que
Fíjate, sobre todo, en que no aprendemos necesariamente que « » y « », sino que solo aprendemos que « » en términos más simples.
Por ejemplo, y como ya hemos observado, no vamos a aprender nada de . Pero ese es el único caso en el que ocurre eso en . Cuando es distinto de cero, puede tener factores comunes con , pero el número que obtenemos mediante el algoritmo de fracciones continuas debe dividir, como mínimo, a .
No resulta nada obvio, pero es cierto que si somos capaces de aprender y para para , elegidas al azar de manera uniforme, es muy probable que podamos recuperar tras unas pocas muestras. En concreto, si nuestra estimación para es el mínimo común múltiplo de todos los valores del denominador que observamos, acertaremos con una alta probabilidad. Intuitivamente, algunos valores de no son adecuados porque comparten factores comunes con , y esos factores comunes nos quedan ocultos cuando aprendemos y . Sin embargo, es poco probable que las elecciones aleatorias de oculten durante mucho tiempo los factores de , y la probabilidad de que no adivinemos correctamente calculando el mínimo común múltiplo de los denominadores que observamos disminuye exponencialmente al aumentar el número de muestras.
Queda por abordar la cuestión de cómo conseguir un vector propio de para ejecutar el procedimiento de estimación de fase. Resulta que, en realidad, no necesitamos crearlos
Lo que haremos, en cambio, es aplicar el procedimiento de estimación de fase al estado , es decir, la codificación binaria de bits del número , en lugar de un vector propio de . Hasta ahora, solo hemos hablado de aplicar el procedimiento de estimación de fase a un vector propio concreto, pero nada nos impide aplicarlo a un estado de entrada que no sea un vector propio de , y eso es lo que estamos haciendo aquí con el estado . (Esto no es un vector propio de a menos que , lo cual no es una opción que nos interese.)
La razón para elegir el estado en lugar de un vector propio de es que la siguiente ecuación es cierta.
Una forma de verificar esta ecuación es comparar los productos internos de los dos lados con cada estado base estándar, utilizando las fórmulas mencionadas anteriormente en la lección para ayudar a evaluar los resultados del lado derecho. En consecuencia, obtendremos exactamente los mismos resultados de medición que si hubiéramos elegido uniformemente al azar y utilizado como vector propio.
Para explicarlo con más detalle, imaginemos que aplicamos el procedimiento de estimación de fase utilizando el estado en lugar de uno de los vectores propios . Una vez realizada la transformada de Fourier cuántica inversa, obtenemos el estado
donde
El vector representa el estado de los qubits superiores después de haberles realizado la inversa de la transformada cuántica de Fourier.
Así, en virtud del hecho de que es un conjunto ortonormal, encontramos que una medición de los qubits superiores produce una aproximación al valor donde se elige uniformemente al azar. Como ya hemos comentado, esto nos permite aprender con un alto grado de confianza tras varias ejecuciones independientes, que era nuestro objetivo.
Coste total
El coste de implementar cada operación « » controlada-unitaria es . Hay operaciones controladas-unitarias, y tenemos , por lo que el coste total de las operaciones controladas-unitarias es . Además, tenemos puertas de Hadamard (que aportan al coste), y la transformada de Fourier cuántica inversa aporta al coste. Por lo tanto, el coste de las operaciones unitarias controladas predomina sobre el coste de todo el procedimiento, que, por lo tanto, es « ».
Además del propio circuito cuántico, hay algunos cálculos clásicos que es necesario realizar a lo largo del proceso. Esto incluye el cálculo de las potencias en para , necesarias para crear las puertas unitarias controladas, así como el algoritmo de fracciones continuas que convierte las aproximaciones de en fracciones. Estos cálculos pueden realizarse mediante circuitos booleanos con un coste total de .
Como es habitual, todos estos límites pueden mejorarse utilizando algoritmos asintóticamente rápidos; estos límites suponen que estamos utilizando algoritmos estándar para las operaciones aritméticas básicas.
Factoring por búsqueda de pedidos
Lo último que tenemos que discutir es cómo la resolución del problema de búsqueda de órdenes nos ayuda a factorizar. Esta parte es completamente clásica: no tiene nada que ver específicamente con la computación cuántica.
Esta es la idea básica. Queremos factorizar el número , y podemos hacerlo de forma recursiva. En concreto, podemos centrarnos en la tarea de factorizar , lo que significa encontrar dos números enteros cualesquiera para los que . Esto no es posible si es un número primo, pero primero podemos comprobar de forma eficiente si es primo utilizando un algoritmo de prueba de primalidad y, si no es primo, intentaremos factorizarlo. Una vez que hayamos dividido , basta con aplicar la recursividad a y hasta que todos nuestros factores sean primos y obtengamos la factorización en números primos de .
Dividir números enteros pares es fácil: solo tenemos que mostrar « » y « ».
También es fácil dividir potencias perfectas, es decir, números de la forma para números enteros , simplemente aproximando las raíces , , , y así sucesivamente, y comprobando los números enteros cercanos como posibles candidatos para . No es necesario avanzar más allá de pasos en esta secuencia, ya que en ese punto la raíz cae por debajo de y no revelará candidatos adicionales.
Es bueno que podamos hacer ambas cosas, porque la búsqueda de orden no nos servirá para factorizar números pares ni potencias de números primos, en los que el número resulta ser primo. Sin embargo, si es impar y no es una potencia de un número primo, la determinación del orden nos permite dividir .
-
Elige al azar un « ».
-
Calcula .
-
Si , entonces muestra y y detente. De lo contrario, pasa al siguiente paso sabiendo que .
-
Sea el orden de módulo . (Aquí es donde necesitamos la búsqueda de pedidos.)
-
Si es par:
5.1 Calcula módulo
5.2
Calcula . 5.3
Si , entonces muestra y y detén el programa. -
Si se llega a este punto, significa que el algoritmo no ha conseguido encontrar ningún factor de .
Es posible que, al ejecutar este algoritmo, no se encuentre un factor de . Concretamente, esto ocurre en dos situaciones:
- El orden de módulo es impar.
- El orden de módulo es par y .
Mediante la teoría básica de números se puede demostrar que, para una elección aleatoria de , con una probabilidad de al menos , ninguno de estos sucesos se produce. De hecho, la probabilidad de que se produzca cualquiera de los dos eventos es, como máximo, , donde es el número de factores primos distintos de , razón por la cual es necesario suponer que no es una potencia de un número primo. (Para que esto sea cierto, también es necesario suponer que « » es impar.)
Esto significa que cada ejecución tiene al menos un 50 % de probabilidades de dividir . Por lo tanto, si ejecutamos el algoritmo veces, eligiendo al azar cada vez, conseguiremos dividir con una probabilidad de al menos .
La idea básica del algoritmo es la siguiente. Si tenemos una elección de para la cual el orden de módulo es par, entonces es un número entero y podemos considerar los números
Utilizando la fórmula « », concluimos que
Ahora bien, sabemos que por la definición del orden —lo cual es otra forma de decir que divide exactamente a . Eso significa que divide exactamente el producto
Para que esto sea cierto, todos los factores primos de deben ser también factores primos de o (o ambos) - y para una selección aleatoria de resulta improbable que todos los factores primos de dividan uno de los términos y ninguno divida el otro. En caso contrario, siempre que algunos de los factores primos de dividan al primer término y otros dividan al segundo, podremos encontrar un factor no trivial de calculando el DGC con el primer término.