Он, он, я знаю, что я некромант, отвечающий на старые вопросы, но я только что нашел этот вопрос, ища в сети способы реализации эффективных тестов простых чисел.
До сих пор я считаю, что самым быстрым алгоритмом тестирования простых чисел является Strong Probable Prime (SPRP). Я цитирую форумы Nvidia CUDA:
Одна из наиболее практичных нишевых проблем в теории чисел
с идентификацией простых чисел. Учитывая N, как вы можете эффективно
определить, является ли оно простым или нет? Это не просто тереетический
проблема, это может быть реальная необходимость в коде, возможно, когда вам нужно
динамически находить размер основной хеш-таблицы в определенных диапазонах. Если N
что-то порядка 2 ^ 30, вы действительно хотите сделать 30000
деление тестов для поиска каких-либо факторов? Очевидно, нет.
Распространенным практическим решением этой проблемы является простой тест, называемый
вероятный простой тест Эйлера и более мощное обобщение
называется сильным вероятным праймом (SPRP). Это тест, который для
целое число N может вероятностно классифицировать его как простое или нет, и
повторные тесты могут увеличить вероятность правильности. Медленная часть
самого теста в основном включает вычисление значения, аналогичного
^ (N-1) по модулю N. Любой, кто реализует шифрование с открытым ключом RSA
варианты использовали этот алгоритм. Это полезно как для огромных целых чисел
(например, 512 бит), а также обычные 32 или 64 битные.
Тест может быть изменен с вероятностного отклонения на
окончательное доказательство первичности путем предварительного вычисления определенных входных данных теста
параметры, которые, как известно, всегда успешны для диапазонов N.
К сожалению, открытие этих «самых известных тестов» эффективно
поиск огромного (фактически бесконечного) домена. В 1980 году первый список
полезные тесты были созданы Карлом Померансом (известным тем, что
для факторинга RSA-129 с его алгоритмом Quadratic Seive.) Позже Йешке
значительно улучшили результаты в 1993 году. В 2004 году Чжан и Тан
усовершенствовал теорию и границы области поиска. Грейтхаус и
Ливингстон опубликовал самые современные результаты до сих пор на
веб, на http://math.crg4.com/primes.html, лучшие результаты огромного
поисковый домен.
Смотрите здесь для получения дополнительной информации:
http://primes.utm.edu/prove/prove2_3.html и http://forums.nvidia.com/index.php?showtopic=70483
Если вам просто нужен способ генерирования очень больших простых чисел и вы не хотите генерировать все простые числа <целое число n, вы можете использовать тест Лукаса-Лемера для проверки простых чисел Мерсенна. Простое число Мерсенна имеет вид 2 ^ p -1. Я думаю, что тест Лукаса-Лемера - самый быстрый алгоритм, открытый для простых чисел Мерсенна. </p>
И если вы хотите использовать не только самый быстрый алгоритм, но и самое быстрое оборудование, попробуйте реализовать его с помощью Nvidia CUDA, написать ядро для CUDA и запустить его на GPU.
Вы даже можете заработать немного денег, если обнаружите достаточно большие простые числа, EFF раздает призы от $ 50K до $ 250K:
https://www.eff.org/awards/coop