El algoritmo de la criba cuadrática ( QS ) es un algoritmo de factorización de números enteros y, en la práctica, el segundo método más rápido conocido (después de la criba de cuerpos numéricos generales ). Sigue siendo el más rápido para números enteros de menos de 100 dígitos decimales o más, y es considerablemente más simple que la criba de cuerpos numéricos. Es un algoritmo de factorización de propósito general, lo que significa que su tiempo de ejecución depende únicamente del tamaño del número entero a factorizar, y no de una estructura o propiedades especiales. Fue inventado por Carl Pomerance en 1981 como una mejora de la criba lineal de Schröppel . [1]
El algoritmo intenta establecer una congruencia de cuadrados módulo n (el entero que se va a factorizar), lo que a menudo conduce a una factorización de n . El algoritmo funciona en dos fases: la fase de recopilación de datos , donde recopila información que puede conducir a una congruencia de cuadrados; y la fase de procesamiento de datos , donde coloca todos los datos que ha recopilado en una matriz y la resuelve para obtener una congruencia de cuadrados. La fase de recopilación de datos se puede paralelizar fácilmente en muchos procesadores, pero la fase de procesamiento de datos requiere grandes cantidades de memoria y es difícil de paralelizar de manera eficiente en muchos nodos o si los nodos de procesamiento no tienen cada uno suficiente memoria para almacenar la matriz completa. El algoritmo de bloques de Wiedemann se puede utilizar en el caso de unos pocos sistemas, cada uno capaz de almacenar la matriz.
El método ingenuo para hallar una congruencia de cuadrados consiste en elegir un número aleatorio, elevarlo al cuadrado, dividirlo por n y esperar que el residuo menos no negativo sea un cuadrado perfecto . Por ejemplo, . Este método sólo encuentra una congruencia de cuadrados en raras ocasiones para n grandes , pero cuando la encuentra, la mayoría de las veces, la congruencia no es trivial y la factorización está completa. Esta es, en líneas generales, la base del método de factorización de Fermat .
La criba cuadrática es una modificación del método de factorización de Dixon . Se supone que el tiempo de ejecución general requerido para la criba cuadrática (para factorizar un entero n ) es
en la notación L. [2] La constante e es la base del logaritmo natural.
Para factorizar el entero n , el método de Fermat implica la búsqueda de un único número a , n 1/2 < a < n −1 , tal que el resto de a 2 dividido por n sea un cuadrado. Pero estos a son difíciles de encontrar. La criba cuadrática consiste en calcular el resto de a 2 / n para varios a , y luego encontrar un subconjunto de estos cuyo producto sea un cuadrado. Esto dará como resultado una congruencia de cuadrados.
Por ejemplo, considere intentar factorizar el número 1649. Tenemos: . Ninguno de los números enteros es un cuadrado, pero el producto es un cuadrado. También teníamos
ya que . La observación que así da una congruencia de cuadrados
Por lo tanto, para algún entero . Podemos entonces factorizar
utilizando el algoritmo euclidiano para calcular el máximo común divisor .
Así que el problema ahora se ha reducido a: dado un conjunto de números enteros, encuentre un subconjunto cuyo producto sea un cuadrado. Por el teorema fundamental de la aritmética , cualquier número entero positivo puede escribirse de forma única como un producto de potencias primos . Hacemos esto en un formato vectorial; por ejemplo, la factorización de potencias primos de 504 es 2 3 3 2 5 0 7 1 , por lo tanto, se representa por el vector exponente (3,2,0,1). Multiplicar dos números enteros corresponde entonces a sumar sus vectores exponentes. Un número es un cuadrado cuando su vector exponente es par en cada coordenada. Por ejemplo, los vectores (3,2,0,1) + (1,0,0,1) = (4,2,0,2), por lo que (504)(14) es un cuadrado. Para buscar un cuadrado es necesario conocer únicamente la paridad de los números en los vectores, por lo que basta con calcular estos vectores módulo 2: (1,0,0,1) + (1,0,0,1) = (0,0,0,0). Por lo tanto, dado un conjunto de vectores (0,1), necesitamos encontrar un subconjunto que sume al vector cero módulo 2.
Este es un problema de álgebra lineal ya que el anillo puede considerarse como el campo de Galois de orden 2, es decir, podemos dividir por todos los números distintos de cero (solo hay uno, es decir, 1) al calcular el módulo 2. Es un teorema del álgebra lineal que con más vectores que entradas tiene cada vector, siempre existe una dependencia lineal . Se puede encontrar por eliminación gaussiana . Sin embargo, simplemente elevar al cuadrado muchos números aleatorios módulo n produce una gran cantidad de factores primos diferentes y, por lo tanto, vectores muy largos y una matriz muy grande. El truco es buscar específicamente números a tales que a 2 módulo n tenga solo factores primos pequeños (son números suaves ). Son más difíciles de encontrar, pero usar solo números suaves mantiene los vectores y matrices más pequeños y más manejables. La criba cuadrática busca números suaves utilizando una técnica llamada tamizado , que se analiza más adelante, de la que el algoritmo toma su nombre.
Para resumir, el algoritmo básico de tamiz cuadrático tiene estos pasos principales:
El resto de este artículo explica detalles y extensiones de este algoritmo básico.
La criba cuadrática intenta encontrar pares de números enteros x e y ( x ) (donde y ( x ) es una función de x ) que satisfacen una condición mucho más débil que x 2 ≡ y 2 (mod n ). Selecciona un conjunto de primos llamado base factorial e intenta encontrar x de manera que el residuo absoluto mínimo de y ( x ) = x 2 mod n se factorice completamente sobre la base factorial. Se dice que dichos valores de y son suaves con respecto a la base factorial.
La factorización de un valor de y ( x ) que se divide en la base de factores, junto con el valor de x , se conoce como una relación . La criba cuadrática acelera el proceso de búsqueda de relaciones al tomar x cerca de la raíz cuadrada de n . Esto garantiza que y ( x ) será más pequeño y, por lo tanto, tendrá una mayor probabilidad de ser uniforme.
Esto implica que y es del orden de 2 x [ √ n ]. Sin embargo, también implica que y crece linealmente con x multiplicado por la raíz cuadrada de n .
Otra forma de aumentar la probabilidad de suavizado es simplemente aumentando el tamaño de la base factorial. Sin embargo, es necesario encontrar al menos una relación suavizada mayor que el número de primos en la base factorial, para asegurar la existencia de una dependencia lineal.
Incluso si para alguna relación y ( x ) no es uniforme, puede ser posible fusionar dos de estas relaciones parciales para formar una completa, si las dos y son productos de los mismos primos fuera de la base factorial. [Tenga en cuenta que esto es equivalente a extender la base factorial.] Por ejemplo, si la base factorial es {2, 3, 5, 7} y n = 91, existen relaciones parciales:
Multiplique estos juntos:
y multiplica ambos lados por (11 −1 ) 2 módulo 91. 11 −1 módulo 91 es 58, entonces:
producir una relación completa. Una relación completa de este tipo (obtenida mediante la combinación de relaciones parciales) se denomina ciclo . A veces, la formación de un ciclo a partir de dos relaciones parciales conduce directamente a una congruencia de cuadrados, pero rara vez ocurre.
Existen varias formas de comprobar la suavidad de las y . La más obvia es mediante división por tanteo , aunque esto aumenta el tiempo de ejecución de la fase de recopilación de datos. Otro método que tiene cierta aceptación es el método de curva elíptica (ECM). En la práctica, se suele utilizar un proceso llamado tamizado . Si f ( x ) es el polinomio que tenemos
De esta manera, al resolver f(x) ≡ 0 (mod p ) para x, se genera una secuencia completa de números y para los cuales y = f ( x ), todos los cuales son divisibles por p . Esto es hallar una raíz cuadrada módulo un primo, para lo cual existen algoritmos eficientes, como el algoritmo de Shanks-Tonelli . (De aquí es de donde la criba cuadrática obtiene su nombre: y es un polinomio cuadrático en x , y el proceso de cribado funciona como la Criba de Eratóstenes .)
El tamiz comienza poniendo a cero cada entrada en una gran matriz A [] de bytes. Para cada p , resuelva la ecuación cuadrática módulo p para obtener dos raíces α y β , y luego agregue una aproximación a log( p ) a cada entrada para la que y ( x ) = 0 mod p ... es decir, A [ kp + α ] y A [ kp + β ]. También es necesario resolver la ecuación cuadrática módulo pequeñas potencias de p para reconocer números divisibles por pequeñas potencias de un primo de base factorial.
Al final de la base factorial, cualquier A [] que contenga un valor por encima de un umbral de aproximadamente log( x 2 − n ) corresponderá a un valor de y ( x ) que se divide en la base factorial. La información sobre exactamente qué primos dividen a y ( x ) se ha perdido, pero solo tiene factores pequeños, y hay muchos buenos algoritmos para factorizar un número que se sabe que solo tiene factores pequeños, como la división de prueba por primos pequeños, SQUFOF , Pollard rho y ECM, que generalmente se usan en alguna combinación.
Hay muchos valores de y ( x ) que funcionan, por lo que el proceso de factorización al final no tiene que ser completamente confiable; a menudo los procesos se comportan mal en, digamos, el 5 % de las entradas, lo que requiere una pequeña cantidad de tamizado adicional.
Este ejemplo demostrará el uso de una criba cuadrática estándar sin optimizaciones logarítmicas ni potencias primos. Sea el número a factorizar N = 15347, por lo tanto, el límite superior de la raíz cuadrada de N es 124. Como N es pequeño, el polinomio básico es suficiente: y ( x ) = ( x + 124) 2 − 15347.
Como N es pequeño, solo se necesitan cuatro primos. Los primeros cuatro primos p para los cuales 15347 tiene una raíz cuadrada módulo p son 2, 17, 23 y 29 (en otras palabras, 15347 es un residuo cuadrático módulo cada uno de estos primos). Estos primos serán la base para el cribado.
Ahora construimos nuestro tamiz y comenzamos el proceso de tamizado para cada primo en la base, eligiendo tamizar el primer 0 ≤ X < 100 de Y(X):
El siguiente paso es realizar la criba. Para cada p en nuestra base de factores resuelve la ecuación
para encontrar las entradas en la matriz V que son divisibles por p .
Para resolver para obtener la solución .
Por lo tanto, comenzando en X=1 e incrementando en 2, cada entrada será divisible por 2. Dividir cada una de esas entradas por 2 da como resultado
De manera similar, para los demás primos p en la ecuación se resuelve. Nótese que para cada p > 2, habrá 2 ecuaciones lineales resultantes debido a que hay 2 raíces cuadradas modulares.
Cada ecuación resulta divisible por p en x = a y cada valor p más allá de ese. Dividiendo V por p en a , a + p , a +2 p , a +3 p , etc., para cada primo en la base se encuentran los números lisos que son productos de primos únicos (primeras potencias).
Cualquier entrada de V que sea igual a 1 corresponde a un número liso. Como , , y son iguales a uno, esto corresponde a:
Dado que se han encontrado números suaves Y con la propiedad , el resto del algoritmo se sigue de manera equivalente a cualquier otra variación del método de factorización de Dixon .
Escritura de los exponentes del producto de un subconjunto de las ecuaciones
Como matriz se obtiene:
Una solución a la ecuación está dada por el espacio nulo izquierdo , simplemente
Por lo tanto, el producto de las tres ecuaciones da como resultado un cuadrado (mod N).
y
Así que el algoritmo encontró
Al probar el resultado se obtiene MCD(3070860 - 22678, 15347) = 103, un factor no trivial de 15347, siendo el otro 149.
Esta demostración también debería servir para mostrar que la criba cuadrática sólo es apropiada cuando n es grande. Para un número tan pequeño como 15347, este algoritmo es excesivo. La división por tanteo o la rho de Pollard podrían haber encontrado un factor con mucho menos cálculo.
En la práctica, se utilizan muchos polinomios diferentes para y, de modo que cuando y ( x ) comienza a volverse grande, lo que da como resultado una densidad pobre de y suave , este crecimiento se puede restablecer cambiando los polinomios. Como es habitual, elegimos y ( x ) como un cuadrado módulo n , pero ahora con la forma
se elige de modo que , por lo que para algún . El polinomio y(x) puede escribirse entonces como . Si A es un cuadrado o un número suavizado, entonces solo se debe comprobar la suavidad del factor.
Este enfoque, llamado Multiple Polynomial Quadratic Sieve (MPQS), es ideal para la paralelización , ya que a cada procesador involucrado en la factorización se le puede dar n , la base de factores y una colección de polinomios, y no tendrá necesidad de comunicarse con el procesador central hasta que haya terminado de tamizar con sus polinomios.
Si, después de dividir por todos los factores menores que A , la parte restante del número (el cofactor) es menor que A 2 , entonces este cofactor debe ser primo. En efecto, se puede agregar a la base de factores, ordenando la lista de relaciones por cofactor. Si y(a) = 7*11*23*137 e y(b) = 3*5*7*137, entonces y(a)y(b) = 3*5*11*23 * 7 2 * 137 2 . Esto funciona reduciendo el umbral de entradas en la matriz de tamizado por encima del cual se realiza una factorización completa.
Reduciendo aún más el umbral y utilizando un proceso eficaz para factorizar valores y(x) en productos de primos relativamente grandes (el ECM es excelente para esto) se pueden encontrar relaciones con la mayoría de sus factores en la base de factores, pero con dos o incluso tres primos más grandes. La búsqueda de ciclos permite entonces combinar un conjunto de relaciones que comparten varios primos en una sola relación.
Para ilustrar las opciones de parámetros típicos para un ejemplo realista en una implementación real que incluye las optimizaciones de polinomios múltiples y primos grandes, se ejecutó la herramienta msieve en un semiprimo de 267 bits , produciendo los siguientes parámetros:
Hasta el descubrimiento de la criba de cuerpos numéricos (NFS), QS era el algoritmo de factorización de propósito general conocido más rápido desde el punto de vista asintótico. Ahora, la factorización de curva elíptica de Lenstra tiene el mismo tiempo de ejecución asintótico que QS (en el caso en que n tiene exactamente dos factores primos de igual tamaño), pero en la práctica, QS es más rápido ya que utiliza operaciones de precisión simple en lugar de las operaciones de precisión múltiple que utiliza el método de curva elíptica.
El 2 de abril de 1994 se completó la factorización de RSA-129 utilizando QS. Era un número de 129 dígitos, el producto de dos primos grandes, uno de 64 dígitos y el otro de 65 dígitos. La base factorial para esta factorización contenía 524339 primos. La fase de recolección de datos tomó 5000 MIPS-años, realizada de manera distribuida a través de Internet. Los datos recopilados totalizaron 2 GB . La fase de procesamiento de datos tomó 45 horas en la supercomputadora MasPar (masivamente paralela) de Bellcore (ahora Telcordia Technologies ) . Esta fue la factorización más grande publicada por un algoritmo de propósito general, hasta que se utilizó NFS para factorizar RSA-130 , completada el 10 de abril de 1996. Todos los números RSA factorizados desde entonces se han factorizado utilizando NFS.
El récord actual de factorización de QS es el RSA-140 de 140 dígitos (463 bits), que fue factorizado por Patrick Konsor en junio de 2020 utilizando aproximadamente 6000 horas de núcleo durante 6 días. [3]