O~(log6n)O~(log4n)O~(n1/7)O(lognO(logloglogn))
O~(log2n)2−80O~(log2n)
Во всех этих тестах память не является проблемой.
В своем комментарии jbapple поднимает вопрос о том, какой тест на простоту использовать на практике. Это вопрос реализации и бенчмаркинга: внедрить и оптимизировать несколько алгоритмов и экспериментально определить, какой из них наиболее быстрый в каком диапазоне. Для любопытных кодеры PARI сделали именно это, и они придумали детерминированную функцию isprime
и вероятностную функцию ispseudoprime
, обе из которых можно найти здесь . Используется вероятностный тест Миллера-Рабина. Детерминированный - это BPSW.
Вот больше информации от Даны Якобсен :
Pari, начиная с версии 2.3, использует доказательство первичности APR-CL для isprime(x)
и вероятное простое испытание BPSW (с «почти сверхсильным» тестом Лукаса) для ispseudoprime(x)
.
Они принимают аргументы, которые меняют поведение:
isprime(x,0)
(по умолчанию.) Используется комбинация (BPSW, быстрая теорема Поклингтона или BLS75 5, APR-CL).
isprime(x,1)
n−1
isprime(x,2)
Использует APR-CL.
ispseudoprime(x,0)
(по умолчанию.) Использует BPSW (MR с базой 2, «почти сверхсильный» Лукас).
ispseudoprime(x,k)
k≥1kmpz_is_probab_prime_p(x,k)
Пари 2.1.7 использовал намного худшую установку. isprime(x)
это были просто тесты МР (по умолчанию 10), которые приводили к забавным вещам, таким как isprime(9)
возвращение истины довольно часто. Использование isprime(x,1)
сделало бы доказательство Pocklington, которое было хорошо для приблизительно 80 цифр и затем стало слишком медленным, чтобы быть вообще полезным.
Вы также пишете, что на самом деле никто не использует эти алгоритмы, так как они слишком медленные. Я думаю, я знаю, что вы имеете в виду, но я думаю, что это слишком сильно в зависимости от вашей аудитории. AKS, конечно, невероятно медленный, но APR-CL и ECPP достаточно быстрые, чтобы их использовали некоторые люди. Они полезны для параноидальной криптографии и полезны для людей, которые делают что-то вроде primegaps
или factordb
когда у человека достаточно времени, чтобы получить проверенные простые числа.
[Мой комментарий по этому поводу: при поиске простого числа в определенном диапазоне мы используем некоторый метод просеивания, за которым следуют некоторые относительно быстрые вероятностные тесты. Только тогда, если вообще, мы запускаем детерминированный тест.]
Во всех этих тестах память не является проблемой. Это проблема для АКС. Посмотрите, например, этот eprint . Отчасти это зависит от реализации. Если кто-то реализует то, что видео Numberphile называет AKS (что на самом деле является обобщением Маленькой теоремы Ферма), использование памяти будет чрезвычайно высоким. Использование NTL-реализации алгоритма v1 или v6, такого как упомянутая статья, приведет к глупым большим объемам памяти. Хорошая реализация GMP v6 по-прежнему будет использовать ~ 2 ГБ для 1024-битного простого числа, что очень многопамяти для такого небольшого числа. Использование некоторых улучшений Бернштейна и двоичной сегментации GMP приводит к гораздо лучшему росту (например, ~ 120 МБ для 1024-битных). Это все еще намного больше, чем нужно другим методам, и неудивительно, что оно будет в миллионы раз медленнее, чем APR-CL или ECPP.
openssl pkeyparam -text
для извлечения шестнадцатеричной строки) с использованием PARIisprime
(APR-CL, как указано): около 80 с на быстром ноутбуке. Для справки, Chromium нужно чуть более 0,25 с для каждой итерации моей демонстрационной реализации JavaScript теста Фробениуса (которая намного сильнее, чем MR), поэтому APR-CL, безусловно, параноидален, но выполним.видел эту недавнюю статью об архиве, которая анализирует эту тему подробно / подробно, не уверен, что люди думают об этом, до сих пор не услышал реакции, возможно, это тезис, созданный студентом, но, возможно, один из самых подробных / всесторонних анализов Практическое использование алгоритма доступно.
Детерминированное тестирование первичности - понимание алгоритма AKS Виджей Менон
Мощные алгоритмы, слишком сложные для реализации tcs.se
источник