En teoría de números , la criba de campo numérico general ( GNFS ) es el algoritmo clásico más eficiente conocido para factorizar números enteros mayores que 10 100. Heurísticamente, su complejidad para factorizar un número entero n ( que consta de ⌊log 2 n ⌋ + 1 bits ) es de la forma
en notaciones O y L. [1] Es una generalización de la criba de cuerpos de números especiales : mientras que esta última solo puede factorizar números de una cierta forma especial, la criba de cuerpos de números generales puede factorizar cualquier número excepto las potencias primas (que son triviales de factorizar tomando raíces).
El principio de la criba de cuerpos numéricos (tanto especial como general) puede entenderse como una mejora de la criba racional más simple o criba cuadrática . Cuando se utilizan tales algoritmos para factorizar un número grande n , es necesario buscar números lisos (es decir, números con factores primos pequeños) de orden n 1/2 . El tamaño de estos valores es exponencial en el tamaño de n (ver más abajo). La criba de cuerpos numéricos general, por otro lado, logra buscar números lisos que sean subexponenciales en el tamaño de n . Dado que estos números son más pequeños, es más probable que sean lisos que los números inspeccionados en algoritmos anteriores. Esta es la clave de la eficiencia de la criba de cuerpos numéricos. Para lograr esta aceleración, la criba de cuerpos numéricos tiene que realizar cálculos y factorizaciones en cuerpos numéricos . Esto da como resultado muchos aspectos bastante complicados del algoritmo, en comparación con la criba racional más simple.
El tamaño de la entrada del algoritmo es log 2 n o el número de bits en la representación binaria de n . Cualquier elemento del orden n c para una constante c es exponencial en log n . El tiempo de ejecución de la criba del campo numérico es superpolinomial pero subexponencial en el tamaño de la entrada.
Supongamos que f es un polinomio de grado k sobre (los números racionales), y r es una raíz compleja de f . Entonces, f ( r ) = 0 , que puede reorganizarse para expresar r k como una combinación lineal de potencias de r menores que k . Esta ecuación puede usarse para reducir cualquier potencia de r con exponente e ≥ k . Por ejemplo, si f ( x ) = x 2 + 1 y r es la unidad imaginaria i , entonces i 2 + 1 = 0 , o i 2 = −1 . Esto nos permite definir el producto complejo:
En general, esto conduce directamente al cuerpo numérico algebraico , que puede definirse como el conjunto de números complejos dado por:
El producto de dos valores cualesquiera de estos puede calcularse tomando el producto como polinomios, y luego reduciendo cualquier potencia de r con exponente e ≥ k como se describió anteriormente, obteniendo un valor en la misma forma. Para asegurar que este campo es realmente k -dimensional y no colapsa a un campo aún más pequeño, es suficiente que f sea un polinomio irreducible sobre los racionales. De manera similar, uno puede definir el anillo de números enteros como el subconjunto de los cuales son raíces de polinomios mónicos con coeficientes enteros. En algunos casos, este anillo de números enteros es equivalente al anillo . Sin embargo, hay muchas excepciones. [2]
Se eligen dos polinomios f ( x ) y g ( x ) de grados pequeños d y e , que tienen coeficientes enteros, que son irreducibles sobre los racionales , y que, cuando se interpretan módulo n , tienen una raíz entera común m . No se conoce una estrategia óptima para elegir estos polinomios; un método simple es elegir un grado d para un polinomio, considerar la expansión de n en base m (permitiendo dígitos entre − m y m ) para un número de m diferentes de orden n 1/ d , y elegir f ( x ) como el polinomio con los coeficientes más pequeños y g ( x ) como x − m .
Consideremos los anillos de cuerpos numéricos Z [ r 1 ] y Z [ r 2 ], donde r 1 y r 2 son raíces de los polinomios f y g . Puesto que f es de grado d con coeficientes enteros, si a y b son enteros, entonces también lo será b d · f ( a / b ), al que llamamos r . De manera similar, s = b e · g ( a / b ) es un entero. El objetivo es encontrar valores enteros de a y b que simultáneamente hagan que r y s sean suaves en relación con la base elegida de primos. Si a y b son pequeños, entonces r y s también serán pequeños, aproximadamente del tamaño de m , y tenemos una mejor posibilidad de que sean suaves al mismo tiempo. El enfoque actual más conocido para esta búsqueda es el tamizado reticular ; para obtener rendimientos aceptables, es necesario utilizar una base de factores grande.
Teniendo suficientes pares de este tipo, usando la eliminación gaussiana , se pueden obtener productos de ciertos r y de los s correspondientes para que sean cuadrados al mismo tiempo. Se necesita una condición ligeramente más fuerte: que sean normas de cuadrados en nuestros cuerpos numéricos, pero esa condición también se puede lograr con este método. Cada r es una norma de a − r 1 b y, por lo tanto, el producto de los factores correspondientes a − r 1 b es un cuadrado en Z [ r 1 ], con una "raíz cuadrada" que se puede determinar (como un producto de factores conocidos en Z [ r 1 ]) —normalmente se representará como un número algebraico irracional . De manera similar, el producto de los factores a − r 2 b es un cuadrado en Z [ r 2 ], con una "raíz cuadrada" que también se puede calcular. Debe notarse que el uso de la eliminación gaussiana no da el tiempo de ejecución óptimo del algoritmo. En su lugar, se utilizan algoritmos de resolución de matrices dispersas como Block Lanczos o Block Wiedemann .
Como m es una raíz tanto de f como de g mod n , hay homomorfismos desde los anillos Z [ r 1 ] y Z [ r 2 ] hasta el anillo Z / n Z (los enteros módulo n ), que asignan r 1 y r 2 a m , y estos homomorfismos asignarán cada "raíz cuadrada" (normalmente no representada como un número racional) a su representante entero. Ahora bien, el producto de los factores a − mb mod n se puede obtener como un cuadrado de dos formas: una para cada homomorfismo. Así, se pueden encontrar dos números x e y , con x 2 − y 2 divisible por n y, de nuevo, con probabilidad de al menos la mitad, obtenemos un factor de n hallando el máximo común divisor de n y x − y .
La elección del polinomio puede afectar drásticamente el tiempo necesario para completar el resto del algoritmo. El método de elección de polinomios basado en la expansión de n en base m que se muestra arriba no es óptimo en muchas situaciones prácticas, lo que lleva al desarrollo de mejores métodos.
Murphy y Brent sugirieron un método de este tipo; [3] introducen una puntuación de dos partes para polinomios, basada en la presencia de raíces módulo primos pequeños y en el valor promedio que el polinomio toma sobre el área de tamizado.
Los mejores resultados reportados [4] se lograron mediante el método de Thorsten Kleinjung, [5] que permite g ( x ) = ax + b , y busca sobre a compuesto de pequeños factores primos congruentes con 1 módulo 2 d y sobre coeficientes principales de f que son divisibles por 60.
Algunas implementaciones se centran en una determinada clase más pequeña de números. Estas se conocen como técnicas de tamiz de campo de números especiales , como las utilizadas en el proyecto Cunningham . Un proyecto llamado NFSNET funcionó desde 2002 [6] hasta al menos 2007. Utilizaba computación distribuida voluntaria en Internet . [7] Participaron Paul Leyland del Reino Unido y Richard Wackerbarth de Texas. [8]
Hasta 2007, la implementación estándar era un paquete de software desarrollado y distribuido por CWI en los Países Bajos, que estaba disponible solo bajo una licencia relativamente restrictiva. [ cita requerida ] En 2007, Jason Papadopoulos desarrolló una implementación más rápida del procesamiento final como parte de msieve, que es de dominio público. Ambas implementaciones cuentan con la capacidad de distribuirse entre varios nodos en un clúster con una interconexión suficientemente rápida.
La selección de polinomios normalmente se realiza mediante software GPL escrito por Kleinjung, o por msieve, y el cribado de red mediante software GPL escrito por Franke y Kleinjung; estos se distribuyen en GGNFS.