Задача состоит в том, чтобы найти нетривиальный множитель составного числа.
Напишите код, который находит нетривиальный фактор составного числа как можно быстрее, при условии, что ваш код имеет длину не более 140 байт. Результат должен быть просто фактором, который вы нашли.
Ваш код может принимать и выводить любым удобным для вас способом, например, в качестве аргументов функции.
Тестовые случаи, в которых перечислены все факторы (вам нужно вывести только один)
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
Я не буду оценивать ваш ответ в следующем сложном тестовом примере, который может представлять интерес для тестирования:
513231721363284898797712130584280850383: 40206835204840513073 12764787846358441471
Гол
Ваша оценка - это суммарное время для факторизации всех приведенных выше тестовых случаев со штрафом 10 минут за каждую неудачную факторизацию (все округляются до ближайшей секунды). Ваш код должен работать и для других целых чисел, то есть не должен просто кодировать эти ответы.
Я остановлю ваш код через 10 минут.
Если два человека получают одинаковый результат, тогда выигрывает первый ответ.
ограничения
Ваш код не может использовать встроенную или библиотечную функцию, которая выполняет целочисленную факторизацию. Вы можете предположить, что ввод занимает менее 256 бит. Все вводимые числа будут составными.
Как я буду время?
Я буду в буквальном смысле запускать time ./myprog
в своей системе Ubuntu для определения времени, поэтому, пожалуйста, предоставьте мне полную программу для запуска, которая включает в себя любую функцию, которую вы определили.
Примечание для скомпилированных языков
Время компиляции должно занимать не более 1 минуты на моей машине.
Это действительно возможно?
Если вы игнорируете ограничения по пространству, то каждый из них может быть учтен менее чем за 2 секунды на моем компьютере, используя чистый код Python + pypy.
Так что же такое нетривиальный алгоритм факторинга?
Алгоритм Полларда быстрый и подходит для игры в гольф. Конечно, есть и много других способов разложить целое число .
Еще быстрее работает квадратичное сито . Это похоже на серьезную проблему, чтобы сжать это в 140 байтов.
Ведущие баллы
- SEJPM , 10 минут штрафа за последний контрольный пример + 16 секунд в Haskell
2
или2, 2
?
2 ** 1024
?