Esta pregunta es muy similar a:
¿Cuál es el algoritmo de factorización prima más rápido?
¿Cuál es el algoritmo de factorización prima más rápido hasta la fecha?
La respuesta es, depende. Suponga que recibe una entrada arbitraria que no tiene alguna forma especial. El algoritmo más eficiente es una receta que utiliza algoritmos de factorización individuales. Estas son todas las posibilidades:
- Cómo encontrar el resto de [matemáticas] 2 ^ {1990} [/ matemáticas] dividido por [matemáticas] 1990 [/ matemáticas]
- ¿Qué hace que [math] q = \ exp (2 \ pi it) [/ math] para cualquier número complejo [math] t [/ math], tan útil en la teoría de números?
- ¿Cuál es el resto cuando [matemáticas] 11 ^ {2015} + 13 ^ {2015} + 17 ^ {2015} [/ matemáticas] se divide por [matemáticas] 29? [/ Matemáticas]
- Cómo enseñar aritmética modular
- ¡Cómo probar 200! / {(10! ^ 20) 19! } un entero
Para entradas muy pequeñas, use la división de prueba por números primos (o una rueda para acercarse sin tener que tener o generar números primos). Esto funciona mejor para ~ 1M, dependiendo de las implementaciones. Alguna división de prueba es siempre una buena idea para eliminar pequeños factores.
Pollard Rho funciona bastante bien. A medida que la entrada se hace más grande (por ejemplo,> 2 ^ 32 pero menos de 2 ^ 64), SQUFOF generalmente funciona más rápido.
Una vez más grande que 2 ^ 64, Pollard Rho todavía puede valer un poco de tiempo para encontrar pequeños factores, pero P-1 y ECM son mejores cuando se busca más profundamente.
El tamiz cuadrático generalmente es mejor comenzar en algún lugar en el rango de 30-40 dígitos y continuar hasta 95-105 dígitos.
Después de eso, NFS (GNFS) es el algoritmo más eficiente.
=================================================
Tenga en cuenta que, aparte de las entradas pequeñas, el método más eficiente no es solo elegir una de ellas y ejecutarla, sino pasar por una secuencia. También necesitamos una prueba de primalidad eficiente, que es otro tema. Por ejemplo, dado un número arbitrario de 150 dígitos, lo mejor que puede hacer es no comenzar a ejecutar NFS. Deberíamos eliminar los divisores pequeños, primero por división de prueba (quizás con un GCD rápido, o un árbol restante, o simplemente una prueba de divisibilidad), luego usando los algoritmos que son eficientes para encontrar divisores pequeños: Pollard Rho, P-1 y ECM . Estos encontrarán eficientemente pequeños divisores (en el caso de ECM, ¡”pequeño” puede tener más de 20 dígitos!). ¿Por qué molestarse con Rho y P-1 si ECM es más eficiente a largo plazo? Porque un corto recorrido de Rho o P-1 es típicamente más rápido que ECM si los divisores son pequeños. Algunas personas no se preocupan por esta optimización e irán directamente a ECM (señalando que la forma en que ejecuta ECM en términos de tamaño y número de curvas termina siendo una discusión similar), y las implementaciones son importantes.
Una vez que ha ejecutado “suficiente” P-1 / ECM, y el número que todavía tiene que procesar es compuesto, entonces elige QS o NFS.
Para el caso de menos de 128 bits, puedo dar el ejemplo del factor GNU de Grandlund y Möller. Realiza la división de prueba por pequeños números primos seguidos de Pollard Rho o SQUFOF. Perl / ntheory es más complicado, ya que utiliza más algoritmos y más optimización para entradas pequeñas.
Para entradas más grandes, yafu es un programa de factoring de última generación. Comienza con la división de prueba, hace un poco de Pollard Rho, luego comienza a mezclar P-1 y ECM en una secuencia de tamaños y curvas que funcionan bien en promedio, luego elige QS o NFS en función del tamaño de entrada restante y el punto de cruce medido para la máquina. Esto básicamente sigue lo que describí.