Как искать простые числа

Факторизация методом N-1

 Андрей Соломонович Бершадский
д-р Физ.-Мат наук.

 

Что нужно для того, чтобы проверить число на простоту? Лучше всего попробовать его факторизовать. Если будет обнаружен хоть один делитель, то число не является простым. Но, здесь несколько проблем, средь которых величина числа и его сомножителей. Если большое нечетное число делится всего на два почти одинаковых по величине простых сомножителя, то факторизация затянется на астрономическое количество времени и дождаться ее окончания практически невозможно.

Поэтому для проверки простоты чисел необходимо воспользоваться другими методами, средь которых такие, как: метод Миллера - Рабина и метод Лукаса - Лемера. За одним исключением - оба они являются вероятностными и никакой гарантии простоты не обещают. Хотя можно вычислить вероятность того, что число, прошедшее через эти методы проверку и названное не составным, является простым. Иначе говоря, существует бесконечное количество чисел именуемых кармайкловыми, которые ведут себя точно также, как и простые, согласно малой теореме Ферма и имеют абсолютно одинаковые свойства. Благодаря чему саму Малую теорему следует немного уточнить, начиная со слов: "Если число простое или кармайклово ...", а далее по тексту.

Избежать данных недоразумений можно с помощью дополнительных методов, средь которых, например, числится N-1. Число N прошедшее проверку с помощью методов Миллера - Рабина и Лукаса - Лемера, в дальнейшем подвергается дополнительной проверке. Для этого берут число на единицу меньшее N-1 и подвергают факторизации. Причем, N-1 в большинстве случаев разложить на делители намного проще, нежели N из двух больших сомножителей. Например, можно сразу сказать, что одним из сомножителей будет обязательно 2.  В результате получаем:

N-1 = П q(i);

где:

q(i) - некоторый простой сомножитель числа N-1, а i - количество таких сомножителей.

После чего, останется лишь взять все q  и для каждого из них провести дополнительную проверку, на предмет того имеется ли общий делитель у чисел (a^((N - 1) / q(i))) - 1  и N. В качестве a можно брать любое число большее 1 и меньшее N. Кратность выясняется с помощью алгоритма наибольшего общего делителя Евклида (НОД). Для каждого из простых сомножителей числа N-1 такую проверку достаточно провести единожды. Проще говоря, если хоть какое кратное будет найдено, то оно и является тем самым делителем числа N, а следовательно N не является простым.

Единственная тонкость - это эффективный алгоритм факторизации, с помощью которого можно разложить N-1. Чтобы не мучиться с алгоритмическими тонкостями, предлагаю воспользоваться нижеприведенным апплетом для этой цели, любезно предоставленным для примера данной лекции Юрием Решетовым. (Если вы его не видите, то значит ваш браузер не поддерживает Java апплеты, либо их поддержка выключена).

Для того, чтобы проверить или факторизовать число, его нужно ввести в многострочное текстовое поле, где по умолчанию находятся девятнадцать единиц (кстати, число простое). Для факторизации надо воспользоваться кнопкой "Factoring",  а для проверки на простоту методами Миллера - Рабина и Лукаса - Лемера, кнопкой "Standart Test". Нижняя часть позволяет задать число в виде a*2^b(+/-)1, т.е.  в компактном представлении, которое можно вывести в верхнее окошко с помощью кнопки "Input".

Например, попробуем разложить на сомножители число 2^67-1. Тесты сразу же покажут, что оно является составным. Впрочем, доверять тестам я бы не советовал. Поэкспериментируйте, например, с такими числами, как 7 и 15. И вы убедитесь, что иногда стандартные тесты сообщают что 7 является составным, а 15 простым, хотя это не так. Чтобы не попасть впросак, надо выудить с помощью факторизации хотябы один сомножитель. У нашего числа 2^67-1 их два и оба крупные.  Факторизация в лоб займет значительное время. Гораздо проще воспользоваться методом N-1. Поскольку 2^67-2 = 2*(2^66-1), то и разложим число 2^66-1. Несколько секунд на Athlon 1700XP+ и мы видим результат:

Осталось только:

  1.  взять произвольное число a

  2. возвести его в степень (2^66-1)/599479

  3. из результата вычесть 1

  4. и с помощью алгоритма наибольшего общего делителя с результатом и числом 2^67-1, получить один из сомножителей: 193707721 или 761838257287.

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


Литература

Hosted by uCoz