La tarea es encontrar un factor no trivial de un número compuesto.
Escriba código que encuentre un factor no trivial de un número compuesto lo más rápido posible, siempre que su código no tenga más de 140 bytes de longitud. La salida debería ser el factor que ha encontrado.
Su código puede tomar entrada y dar salida de cualquier manera que sea conveniente, incluyendo, por ejemplo, argumentos para una función.
Casos de prueba que enumeran todos los factores (solo necesita generar uno)
187: 11 17
1679: 23 73
14369648346682547857: 1500450271 9576890767
34747575467581863011: 3628273133 9576890767
52634041113150420921061348357: 2860486313 5463458053 3367900313
82312263010898855308580978867: 264575131106459 311111111111113
205255454905325730631914319249: 2860486313 71755440315342536873
1233457775854251160763811229216063007: 1110111110111 1000000000063 1111111999999
1751952685614616185916001760791655006749: 36413321723440003717 48112959837082048697
No calificaré su respuesta en el siguiente caso de prueba difícil que puede ser de interés para la prueba:
513231721363284898797712130584280850383: 40206835204840513073 12764787846358441471
Puntuación
Su puntaje es el tiempo combinado para factorizar todos los casos de prueba anteriores con una penalización de 10 minutos por cada factorización fallida (todo redondeado al segundo más cercano). Su código también debería funcionar para otros enteros, eso no solo debería codificar estas respuestas.
Dejaré su código después de 10 minutos.
Si dos personas obtienen el mismo puntaje, la primera respuesta gana.
Restricciones
Su código no puede usar ninguna función incorporada o de biblioteca que realice la factorización de enteros. Puede suponer que la entrada toma menos de 256 bits. Todos los números de entrada serán compuestos.
¿Cómo voy a cronometrar?
Literalmente, ejecutaré time ./myprog
en mi sistema Ubuntu para hacer el cronometraje, así que también proporcione un programa completo para que ejecute que incluya cualquier función que haya definido.
Una nota para idiomas compilados
El tiempo de compilación no debe tomar más de 1 minuto en mi máquina.
¿Es realmente posible?
Si ignora las restricciones de espacio, cada una de ellas puede factorizarse en menos de 2 segundos en mi computadora usando código Python puro + pypy.
Entonces, ¿qué es un algoritmo de factorización no trivial?
El algoritmo rho de Pollard es rápido y adecuado para jugar al golf. Por supuesto, también hay muchas otras formas de factorizar un número entero .
Aún más rápido es el tamiz cuadrático . Parece un desafío serio exprimir eso en 140 bytes.
Puntajes principales
- SEJPM , 10 minutos de penalización por el último caso de prueba + 16 segundos en Haskell
2
o 2, 2
?
2 ** 1024
?