19 votos

La forma más rápida de factorizar enteros < 2^60

Llevo unos 12 meses buscando curvas de Mordell de rango >=8 y he identificado aproximadamente 280.000 curvas en nuestro rango archivable, entre muchos millones que no lo están.

Para esta búsqueda he estado utilizando hasta 60 cpus de 3Ghz+ a la vez. Ahora estoy llegando a un punto en el que el rendimiento disminuye y los requisitos de memoria aumentan considerablemente. Por lo tanto, tengo que ser un poco más inteligente en algunas de las matemáticas.

Mi pregunta es, entonces, cuál se cree (o se sabe) que es el algoritmo de factorización más rápido para enteros positivos < 2^60.

No estoy muy dispuesto a consumir más décadas de GHz de potencia de procesamiento a menos que pueda obtener un rendimiento razonable de la inversión, para lo cual un algoritmo de factorización rápido sin duda ayudaría.

Cualquier idea será más que bienvenida.

EDITAR:

Leyendo las respuestas me doy cuenta de que probablemente debería añadir que quiero mantener la factorización dentro de la aritmética de 64 bits. El algoritmo Pollard Rho era interesante, pero probablemente superaría el límite de 64 bits durante su ejecución.

Otra parte del rompecabezas es que, a partir de las factorizaciones, estoy almacenando las diferencias de pares de divisores para cada número factorizado. Esto puede, potencialmente, dejarme con una matriz de alrededor de 50.000.000 valores que luego, posteriormente, necesita ser ordenada.

He estado utilizando Pari/GP para este proyecto y, hasta ahora, ha ido genial. Mi problema actual es principalmente con el uso de memoria, ya que cada tarea de Pari/GP ocupa más de 8GByte de memoria. Esto está impidiendo que mi máquina de 32 núcleos sea tan eficiente como podría haber sido de otra manera. De ahí mi intención de pasar a la aritmética de 64 bits y al código 'C', con la esperanza de ganar eficiencia tanto en tiempo como en espacio, dando así nueva vida a un proyecto que de otro modo se estancaría.

Actualización:

Gracias a todos los que han respondido con tan buenas sugerencias sobre cómo proceder.

Al final he decidido utilizar la biblioteca flint, como sugirió William Hart, en lugar de intentar reinventar la rueda. La capacidad de flint para trabajar directamente con enteros de 64 bits me da una gran ventaja en cuanto a uso de memoria y velocidad en comparación con mi configuración actual. En particular, ahora puedo ejecutar los 32 núcleos en mi máquina principal y todavía tener memoria de sobra, potencialmente dando una mejora de 8 veces en el rendimiento de procesamiento.

Kevin.

0voto

anjanb Puntos 5579

Esto es realmente un comentario, pero qué diablos. Te recomiendo encarecidamente que no implementes tu propio factoring. Sistemas como Pari/GP están muy cuidadosamente optimizados, y te llevaría meses, si no años, ser tan eficiente. 8GB de RAM no es nada en estos días (el portátil en el que estoy escribiendo esto tiene 16GB), así que es mejor gastar $300 para duplicar tu RAM que gastar una cantidad ilimitada de tu tiempo en una búsqueda inútil.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X