Мне нужно проверить соответствие с интервалами между числами, которые действительно большие (в диапазоне длинного длинного), поэтому мне нужен быстрый алгоритм для проверки того, является ли число простым или нет. Предложите свои идеи.
Самый быстрый алгоритм для теста первичности
Ответ 1
Одним из хороших методов является тест Miller-Rabin. Следует, однако, отметить, что это всего лишь вероятностный тест.
Ответ 2
Испытание Миллера-Рабина на семь оснований 2, 325, 9375, 28178, 450775, 9780504, 1795265022 было доказано Джим Синклером для детерминированного тестирования, если число меньше 2 ^ 64 является простым. См. http://miller-rabin.appspot.com/.
Ответ 3
Я считаю, что асимптотически быстрый ток (не вероятностный) критерий примитивности - это "улучшенный Ленстра/Померанс AKS", который имеет сложность, по существу, O (n ^ 6).
Однако диапазон long long
(при условии, что типичная система, где это 64-битное целое число) на самом деле не такая большая. В частности, существует только ~ 200 миллионов простых чисел менее 2 ^ 32, поэтому с использованием быстрого вероятностного теста, за которым следует пробное деление с предварительно вычисленным списком простых чисел (или просто просмотр номера в списке простых чисел, если у вас есть один ) будет довольно чертовски быстро в этом диапазоне, и, вероятно, это правильный путь для этого.
Ответ 4
Я бы предложил библиотеку GNU MP, в которой используется Miller-Rabin. Я использовал его в течение нескольких месяцев, и это очень быстро.
В частности, функция mpz_probab_prime_p делает это, вы также можете использовать другую функцию mpz_nextprime, чтобы найти следующее простое число, большее числа. Я могу отправить образцы кода, если вы хотите.
Ответ 5
Я придумал действительно хороший алгоритм, который намного быстрее, чем проверка всех делителей, что, конечно же, позволяет мне взломать шифрование с открытым ключом.
Держись - мне просто нужно закрыть окно, есть все эти черные вертолеты над головой........
(Или посмотрите Как я могу проверить для primality?)
Ответ 6
Если вы хотите протестировать долгое время для простоты, то хороший тест Baillie PSW primality. Этот тест делает один сильный тест с псевдоприемом и один тест Lucas, и, следовательно, очень быстро. Ожидается, что существуют некоторые композиты, которые проходят этот тест, но пока никто не известен, и, безусловно, нет исключения ниже 10 15. Вариант этого теста, например, используется в Mathematica.
Ответ 7
Коббаль и грокус правы. Тест Миллера-Рабина является наиболее полезным из доступных алгоритмов. Да, это вероятностно, но на самом деле вас не должно отпугивать. Тест наиболее широко используется в практических целях.
Обратите внимание, что вероятность ложных срабатываний (нет ложных негативов) может быть сделана сколь угодно малой, повторяя тест.
Ответ 8
Взгляните на мой ответ здесь:
как проверить простое число 1000 цифр?
Тест очень быстрый. Если вы работаете в 64-разрядном или меньшем диапазоне, вы можете загрузить GCD с 30030, чтобы сэкономить немного времени для большинства чисел.
Ответ 9
Лучший алгоритм, лучший из моих представлений, - это тест ALI primality.
Ответ 10
Самый быстрый, вероятно, будет искать его в предварительно вычисленном списке простых чисел. См. здесь, например,, у них есть до 2 ^ 43112609-1 (наибольшее известное простое).