Я использую GMP (с MPIR) для типов данных произвольного размера. Я также использую его функцию проверки простоты, которая использует метод Миллера-Рабина, но она не точна. Это то, что я хочу исправить.

Я смог подтвердить, что число 18446744073709551253 является простым, используя грубую силу с подходом sqrt.

Есть ли способ проверки больших чисел на простое или нет, со 100% точностью?

Он не должен использовать слишком много памяти / места для хранения, допустимо несколько мегабайт.

Это должно быть быстрее, чем метод sqrt, который я использовал.

Он должен работать для чисел размером не менее 64 бит или более.

Наконец, это должно быть на 100% точным, не может быть!

Какие у меня варианты?

Я мог бы жить с методом грубой силы (для 64-битных чисел), но из интереса, я хочу быстрее & больше. Кроме того, проверка 64-битного номера была слишком медленной: всего 43 секунды!

Решение

Для очень больших чисел AKS тест на первичность является детерминированным тестом первичности, который выполняется за время O (log 7,5 n log log n), где n — интересующий номер. Это экспоненциально быстрее, чем алгоритм O (√n). Однако алгоритм имеет большие постоянные коэффициенты, поэтому он не практичен, пока ваши цифры не станут достаточно большими.

Надеюсь это поможет!

Другие решения

Как правило, 100% -ная уверенность невозможна на физическом компьютере, поскольку существует небольшая, но ограниченная вероятность того, что какой-либо компонент невидимым образом вышел из строя и что ответ, приведенный в конце, неверен. Учитывая этот факт, вы можете запустить достаточно вероятностные тесты Миллера-Рабина, чтобы вероятность того, что число будет составным, намного меньше вероятности отказа вашего оборудования. Нетрудно проверить уровень достоверности 1 к 2 ^ 256:

Это проверит, что число простое, с точностью до 1 в 2 ^ 256. Каждый M-R тест добавляет коэффициент четыре к достоверности. Я видел полученные в результате простые числа, называемые «простыми числами промышленной силы», которые достаточно хороши для всех практических целей, но не совсем для теоретической математической определенности.

Для маленьких N, пробные работы отдела; предел там, вероятно, где-то около 10 ^ 12. Для несколько большего N, Существуют различные исследования (см. работы Герхарда Яешке и Чжоу Чжана), которые вычисляют наименьшее количество псевдоприм для различных коллекций оснований Миллера-Рабина; это приведет вас к 10 ^ 25. После этого все становится сложнее.

«Большие орудия» доказательства простоты — это метод APRCL (его можно назвать суммами Якоби или гауссовскими суммами) и метод ECPP (основанный на эллиптических кривых). Оба являются сложными, поэтому вы захотите найти реализацию, а не писать свою собственную. Эти методы могут обрабатывать числа из нескольких сотен цифр.

Метод AKS доказан за полиномиальное время и прост в реализации, но константа пропорциональности очень высока, поэтому на практике он бесполезен.

Если вы можете фактор N-1, или даже частично его учесть, метод Поклингтона может определить первичность N. Сам метод Поклингтона быстрый, но факторинг может и не быть.

Для всего этого вы должны быть достаточно уверены, что число простое, прежде чем пытаться доказать это. Если ваше число не простое, все эти методы будут правильно определять это, но сначала они будут тратить много времени, пытаясь доказать, что составное число простое.

У меня есть реализации АКС а также Pocklington в моем блоге.

Метод доказательства зависит от типа простого числа, которое вы пытаетесь доказать (например, у простых чисел Мерсенна есть специальные методы доказательства простоты, которые работают только с ними) и размера в десятичных разрядах. Если вы смотрите на сотни цифр, то есть только одно решение, хотя и неадекватное: алгоритм AKS. Это, конечно, быстрее, чем другие алгоритмы доказательства простоты для достаточно больших простых чисел, но к тому времени, когда это станет полезным, это займет так много времени, что это действительно не стоит проблем.

Доказательство первичности для больших чисел все еще остается проблемой, которая еще недостаточно решена. Если бы это было так, все награды EFF были бы присуждены, и у криптографии возникли бы некоторые проблемы не со списком простых чисел, а с методами, используемыми для их поиска.

Я полагаю, что в ближайшем будущем появится новый алгоритм доказательства простоты, который не зависит от предварительно сгенерированного списка простых чисел вплоть до квадратного корня из n, и который не использует метод грубой силы для убедившись, что все простые числа (а также много не простых чисел) в квадратном корне используются как свидетельства первичности n. Этот новый алгоритм, вероятно, будет зависеть от математических понятий, которые намного проще, чем те, которые используются в аналитической теории чисел. В простых числах есть закономерности, это наверняка. Выявление этих паттернов совершенно другое дело.

Вопрос определения того, является ли натуральное число N <displaystyle N> простым, известен как проблема простоты.

Тестом простоты (или проверкой простоты) называется алгоритм, который, приняв на входе число N <displaystyle N> , позволяет либо не подтвердить предположение о составности числа, либо точно утверждать его простоту. Во втором случае он называется истинным тестом простоты. Таким образом, тест простоты представляет собой только гипотезу о том, что если алгоритм не подтвердил предположение о составности числа N <displaystyle N> , то это число может являться простым с определённой вероятностью. Это определение подразумевает меньшую уверенность в соответствии результата проверки истинному положению вещей, нежели истинное испытание на простоту, которое дает математически подтвержденный результат.

Содержание

Введение [ править | править код ]

Проблемы дискретной математики являются одними из самых математически сложных. Одна из них — задача факторизации, заключающаяся в поиске разложения числа на простые множители. Для её решения необходимо найти простые числа, что приводит к проблеме простоты. Задача теста простоты относится к классу сложности P, то есть время работы алгоритмов её решения зависит от размера входных данных полиномиально, что было доказано в 2002 году. Существует аналогичное, однако недоказанное, утверждение для задачи факторизации.

Некоторые приложения математики с использованием факторизации требуют ряда очень больших простых чисел, выбранных случайным образом. Алгоритм их получения, основанный на постулате Бертрана:

  1. Ввод: натуральное число N <displaystyle N>
  2. Решение (поиск случайного простого числа P)
  1. P ← <displaystyle Pgets >Функция генерации произвольного натурального числа на отрезке [ N , 2 N ] <displaystyle [N,2N]>
  2. Если P <displaystyle P>составное, то
  1. P ← P + 1 <displaystyle Pleftarrow ,P+1>
  2. Если P = 2 N <displaystyle P=2N>то
  1. P ← N <displaystyle Pleftarrow ,N>
  • Возврат « P <displaystyle P>— случайное простое»
  • Время решения задачи этим алгоритмом не определено, но есть большая вероятность, что оно всегда является полиномиальным, пока имеется достаточно простых чисел, и они распределены более-менее равномерно. Для простых случайных чисел эти условия выполняются.

    Известно (теорема Евклида), что множество простых чисел бесконечно. Теорема Дирихле (1837) гласит, что если НОД ( a , n ) = 1 <displaystyle (a,n)=1> , то существует бесконечно много простых чисел, сравнимых с a <displaystyle a> по модулю n <displaystyle n> . Другими словами, простые числа распределены равномерно в классах вычетов по m o d n <displaystyle modn> в соответствии с функцией Эйлера [1] φ ( n ) <displaystyle varphi (n)> при любом значении n <displaystyle n> . Однако, если простые числа распределены равномерно, но их существует очень небольшое количество, поиск может оказаться невозможным на практике. Чтобы решить эту вторую проблему, воспользуемся теоремой о распределении простых чисел (1896), согласно которой количество простых чисел в интервале [ 2 , n ] <displaystyle [2,n]> растет с увеличением n <displaystyle n> как n / l o g ( n ) <displaystyle n/log(n)> . Это число стремится к бесконечности довольно быстро, из чего можно сделать заключение, что даже при больших значениях n <displaystyle n> существует достаточно высокая вероятность ( 1 / l n ( n ) <displaystyle 1/ln(n)> ) нахождения простого числа наугад. Из этого можно заключить, что описанный выше алгоритм может дать ответ за полиномиальное время, если существует полиномиальный алгоритм, позволяющий убедиться в простоте сколь угодно большого числа n <displaystyle n> , что приводит к проблеме простоты.

    Исторические сведения [ править | править код ]

    Самые первые упоминания о простых числах известны у Евклида (3 в. до н. э.). При этом первый алгоритм нахождения простых чисел был изобретен Эратосфеном (2 в. до н. э.) и известен сейчас под названием решето Эратосфена. Его суть в последовательном исключении из списка целых чисел от 1 <displaystyle 1> до n <displaystyle n> чисел, кратных 2 , 3 , 5 <displaystyle 2,3,5> и другим уже найденным «решетом» простым числам [2] . Значительно позже арабский математик ибн ал-Банна предложил делать перебор целых чисел, не до n <displaystyle n> , а до n <displaystyle <sqrt >> , что позволило уменьшить количество операций. Недостаток этого метода заключается в том, что вместо проверки заданного числа n <displaystyle n> на простоту он предлагает последовательный перебор [3] всех целых чисел до n <displaystyle <sqrt >> , и поэтому является малоэффективным и требует значительных вычислительных мощностей.

    В начале XIII века Леонардо Пизанский, известный как Фибоначчи, предложил последовательность чисел (названную его именем), одно из свойств которой состоит в том, что n <displaystyle n> -ное число Фибоначчи F n <displaystyle F_> может быть простым только для простых n <displaystyle n> , за исключением n = 4 <displaystyle n=4> . Это свойство может быть использовано при проверке чисел Фибоначчи на простоту. Также он независимо от ибн ал-Банна предложил метод проверки чисел на простоту перебором. Этот алгоритм является истинным (или невероятностным), поскольку ответ получается всегда, однако чрезвычайно неэффективным.

    Первым, кто использовал отношения между числами для определения простоты, был Пьетро Антонио Катальди в своей работе о совершенных числах. Совершенными числами называются те, которые равны сумме своих собственных делителей. Первые семь совершенных чисел: 6, 28, 496, 8128, 33550336, 8589869056 и 137438691328. Катальди установил, что если число n <displaystyle n> — простое и число 2 n − 1 <displaystyle 2^-1> — также простое, то число 2 n − 1 ( 2 n − 1 ) <displaystyle 2^(2^-1)> — совершенное.

    В XVII веке французский математик Марен Мерсенн занимался исследованием чисел вида [4] 2 n − 1 <displaystyle 2^-1> , позднее названных в его честь числами Мерсенна. Мерсенн обнаружил, что из первых 257 чисел Мерсенна только 11 являются простыми (при n = 2, 3, 5, 7, 13, 17, 19, 31, 67, 127 и 257). При этом, им было сделано несколько ошибок ( 2 n − 1 <displaystyle 2^-1> не является простым при р = 67 или 257, и является при р = 61, 89 и 107). Поиск простых среди чисел Мерсенна достаточно прост благодаря тесту Люка-Лемера, позволяющему относительно быстро находить решение. Именно поэтому числа Мерсенна являются самыми большими среди ныне известных простых чисел. В переписке Мерсенна и Ферма были высказаны ещё несколько идей относительно простых чисел [4] .

    Так, Ферма обнаружил, что если целое число a <displaystyle a> не делится нацело на простое число p <displaystyle p> , то число a p − 1 − 1 <displaystyle a^-1> всегда делится на p <displaystyle p> (Малая теорема Ферма). Позднее теорема была обобщена Эйлером. На малой теореме Ферма основаны несколько тестов простоты. Также Ферма предположил, что простыми являются числа вида 2 2 k + 1 <displaystyle 2^<2^>+1> при всех натуральных k <displaystyle k> . Это действительно так при k = 0 , 1 , 2 , 3 , 4 <displaystyle k=0,1,2,3,4> . Контрпример к этому утверждению был найден Эйлером— 2 2 5 + 1 = 4294967297 = 641 ⋅ 6700417 <displaystyle 2^<2^<5>>+1=4294967297=641cdot 6700417> . Для проверки чисел Ферма на простоту существует эффективный тест Пепина. На сегодняшний день ни одного нового простого числа Ферма не было найдено.

    В числе других ученых вопросами простоты чисел занимались Эйлер, Лежандр, Гаусс. Значительные результаты в решении проблемы простоты были получены французским математиком Эдуардом Люка в его работах о числах Ферма и Мерсенна . Именно данный им критерий простоты чисел Мерсенна ныне известен как тест Люка-Лемера.

    В 2002 г. был разработан детерминированный полиномиальный тест простоты, тест Агравала — Каяла — Саксены. Его появление предсказывалось существованием полиномиальных сертификатов простоты и, как следствие, тем, что задача проверки числа на простоту принадлежала классам NP и co-NP одновременно.

    Истинные тесты простоты [ править | править код ]

    Существующие алгоритмы проверки числа на простоту могут быть разделены на две категории: истинные тесты простоты и вероятностные тесты простоты. Истинные тесты результатом вычислений всегда выдают факт простоты либо составности числа, вероятностный тест дает ответ о составности числа либо его несоставности с некоторой вероятностью [2] [4] ϵ <displaystyle epsilon > . Если сказать проще, то вероятностный алгоритм говорит, что число скорее всего не является составным, однако в итоге оно может оказаться как простым, так и составным. Числа, удовлетворяющие вероятностному тесту простоты, но являющиеся составными, называются псевдопростыми [1] . Одним из примеров таких чисел являются числа Кармайкла [3] . Также можно назвать числа Эйлера-Якоби для теста Соловея-Штрассена и псевдопростые числа Люка.

    Одним из примеров истинных тестов простоты является тест Люка-Лемера для чисел Мерсенна. Очевидный недостаток этого теста заключается в его применимости только к ряду чисел определённого вида. Среди других примеров можно привести основанные на малой теореме Ферма

    Вероятностные тесты простоты [ править | править код ]

    К этой категории относятся:

    Тесты простоты в криптографии [ править | править код ]

    В настоящее время простые числа широко применяются в области защиты информации. Прежде всего, это вызвано изобретением метода шифрования с открытым ключом, который используется при шифровании информации и в алгоритмах электронной цифровой подписи. На данный момент по стандартам размер простых чисел, используемых при формировании цифровой подписи с использованием эллиптических кривых, составляет в соответствии с ГОСТ Р 34.10-2012 не менее 254 бит. Для столь больших чисел вопрос определения простоты числа является крайне сложным. Простые методы, такие, как метод перебора, непригодны для использования из-за того, что требуют чрезвычайно много вычислительных ресурсов и большого времени работы [6] .

    Также определение простоты числа необходимо при взломе информации, зашифрованной или подписанной с использованием алгоритма RSA. Для вскрытия такого сообщения необходимо уметь разлагать число на два простых сомножителя, что при больших размерах чисел является нетривиальной задачей.

    С другой стороны, при генерации ключей для криптосистем с открытым ключом, схем электронной подписи и т. п. используются большие псевдослучайные простые числа. Например, при использовании протокола Диффи-Хеллмана необходимо иметь простое число, задающее конечное поле. Поэтому использование эффективного теста простоты позволяет повысить надежность алгоритмов генерации таких ключей.

    Расклад примерно такой. Пусть n — длина числа, т.е. обычный перебор работает за 2^.

    1) Вероятностный тест Рабина-Миллера можно реализовать за O(k n^2 log n), где k — число попыток. Вероятность ложноположительной ошибки 4^-k. При k=100 это значение настолько безумно мало, что скорее в вашей программе найдется критический баг, процессор сделает ошибку в вычислениях и взломщик выиграет в лотерею и все это одновременно, чем число окажется составным.