Я не думаю, что вы найдете алгоритм для проверки произвольного числа на простоту с O (n) временной сложностью.Я почти уверен, что АНБ (и любые другие организации, занимающиеся проблемами криптографии) не были бы очень довольны этим: -)
Единственный способ получить O (n) или лучший способнапример, нужно предварительно рассчитать (например) первые пятьдесят миллионов простых чисел (или использовать чей-то уже предварительно рассчитанный список ) и использовать его в качестве поиска.У меня есть такой файл локально, и просто запустить grep
поверх него, чтобы посмотреть, простое ли число.Для произвольных чисел это не помогает, но мне редко приходится использовать такие большие.Крипто-парни, конечно, сочтут такой список чрезвычайно маленьким для своих целей.
И, если вы превратите его в растровое изображение (около 120M для первых пятидесяти миллионов простых чисел), вы даже можете уменьшить сложность.в O (1), просто превратив число в байтовое смещение и битовую маску - пару битовых сдвигов и / или битовых операций.
Однако, получая список простых чисел нижеопределенная n
определенно выполнима в O (n) временной сложности. Бумага Аткина и Бернштейна , детализирующая Сито Аткина утверждает:
Мы вводим алгоритм, который вычисляет простые числа до N, используя O(N/log(log(N)))
сложения...
, что на самом деле немного лучше , чем O (n).
Тем не менее, оно вряд ли будет конкурировать с поисковым решением.Мой совет - использовать Аткина или Эратосфена для составления списка - это не имеет значения, поскольку вы будете делать этот бит один раз , поэтому производительность не будет критичной.
Тогдаиспользуйте сам список для проверки простоты.