Проблема заключается в следующем.
Ввод: целое числоn
Выход: Наименьшее простое число больше, чем n
.
Задача состоит в том, чтобы дать самый быстрый код для этого. Я протестирую код на значениях, начиная примерно с размера 10^8
10^200
и удваивая его, пока это не займет более одной минуты на моем компьютере 10 секунд.
Код победы найдет следующее простое число для наибольшего размера ввода.
Для сравнения, простое сито, написанное на python, может найти следующее простое число больше 10^8
примерно за 20
секунды.
Требование, чтобы я мог проверить это на моем компьютере Ubuntu 4 ГБ RAM, строгое. Весь код должен быть свободным (в обоих смыслах), и если он использует библиотеки, он также должен быть свободным и легко устанавливаемым. Любые сообщения о ложных простых числах немедленно дисквалифицируют представление.
Я также буду награждать отдельных победителей на каждом языке программирования, если код полностью написан на этом языке без использования внешних библиотек. Я также буду следить за ходом соревнований в самые быстрые времена, чтобы люди могли видеть, как у них дела.
Стол пока
- Python. Удивительная
357
цифра простого числа343239883006530485749095039954069660863471765007165270469723172959277159169882802606127982033072727748864815569574042901856099399985832190628701414555752857600000000000000000000000000000000000000002872284792758930912601189043411951050852357613658978971208596097634095500808832510259693761982135208603287199546795000697807728609476163156438356035166156820611
была конечным числом менее 10 секунд с использованием кода, предоставленногоprimo
. Кто-нибудь победит эту первую запись?
источник
fast next prime function
.Ответы:
Python ~ 451 цифр
Это часть библиотеки, которую я написал для задачи о полупростой факторизации , с удалением ненужных функций. Он использует тест примитивности Baillie-PSW , который технически является вероятностным тестом, но на сегодняшний день нет известных псевдоприемников - и даже есть денежное вознаграждение, если вы можете его найти (или за предоставление доказательства того, что его не существует) ,
Изменить : я не понял, что Python имеет встроенное модульное возведение в степень. Замена собственной на встроенные приводит к увеличению производительности примерно на 33%.
my_math.py
Пример тестового скрипта:
Коэффициент 317 был выбран, потому что это примерно квадратный корень
10000
, прибавляя примерно 2,5 цифры на одну итерацию (и потому что удвоение было слишком медленным, чтобы пройти). Выходные данные показывают текущее количество цифр и время.Пример результатов:
Весь код теперь совместим с Python 3.
источник
next_prime((2^520)*(10^200))
около 15 секунд на моей машине, так что на первый взгляд это впечатляет. Однако ...next_prime((2^520)*(10^200),proof=False)
занимает 0,4 секунды, потому что он проверяет только псевдоприменность. Ваше утверждение «нет известных псевдопреобразований» является убедительно убедительным, поскольку число битов превышает 64. Для 357 цифр я даже отдаленно не убежден в отсутствии контрпримеров.C ++ с GMP: 567 цифр
Использует реализацию Миллера-Рабина в GMP. Это может вернуть ложноположительный результат, но удача на самом деле ударит его с вероятностью 2 ^ -200.
Находит простое число
10^200 * 2^1216 + 361
(567 цифр) перед тем, как работать на моем медленном ноутбуке.источник
Perl с модулем GMP, 1300 цифр
Используя мой модуль Math :: Prime :: Util и его GMP-сервер . Точная точка пересечения будет зависеть от вашего компьютера и наличия у вас последней библиотеки GMP. Весь код бесплатный (модули на github и CPAN, а GMP находится в свободном доступе). Я запускал их на Ubuntu AWS, а также на настольной Ubuntu (и Fedora, и AIX, и NetBSD и т. Д.).
Код ядра находится в C и C + GMP. next_prime из MPU видит, что число слишком велико, и перенаправляет его на серверную часть GMP (или чистый код Perl, если серверная часть не установлена). Это преобразует строку в формат mpz и преобразует его обратно во входной тип объекта или Math :: BigInt. Сам по себе next_prime делает:
Возможное простое испытание:
Все, что до ES BPSW - это просто оптимизация, которую мы, конечно, хотим использовать для next_prime. next_prime также реализован в Perl с использованием модуля Math :: BigInt (в ядре с необязательным внутренним интерфейсом Pari и GMP). Это делает AES BPSW (как Pari), но не так оптимизирован.
Я подумал о достоинствах версии на основе частичного сита, используя диапазон, например, 2 достоинств. Я просто не уверен, будет ли это действительно лучше, так как большую часть времени мы будем делать ненужное просеивание, поскольку разрыв будет небольшим, а иногда для большого разрыва нам придется повторять это несколько раз.
Библиотека реализует ECPP (включая сертификаты), чтобы мы могли выполнить проверку результата, но 1200 цифр действительно слишком велико для крошечного набора по умолчанию включенных многочленов (есть метод для загрузки больших наборов - доказательства могут занять немного меньше времени) 15 минут, что немного быстрее, чем APR-CL Пари, но немного медленнее, чем mpz_aprcl от WraithX). Одним из недостатков ECPP по сравнению с APR-CL является то, что он имеет большую временную дисперсию, поэтому есть вероятность, что он превысит 10 секунд для некоторого числа до того, как будет достигнуто среднее время. С доказательством я думаю, что мы ограничены чем-то в диапазоне 400 цифр, если мы не разрешаем многопоточное программное обеспечение.
Я решил попробовать с той же последовательностью, которую использовал primo. Он достиг 1191 цифры, так как здесь мы пробили 18138. Я также протестировал код primo, используя последний my_math.py. Он достигает 630 цифр с последовательностью 10 ^ е и 641 с его последовательностью. Очень впечатляет компактный полностью Python-код без множества предварительных тестов.
источник
Math::GMP
таким образом, что это не так расточительно с созданием / уничтожением ссылок mpz.$x = new Math::GMP(0); $x += 3 for 1..1000000
. Я отправлю сообщение в cpan, когда закончу; ты будешь одним из первых, кто узнает;)