- •Лекция 8. Простые числа
- •8.1 Определение наибольшего общего делителя
- •8.2. Тестирование числа на простоту
- •Перебор делителей
- •Тест Миллера
- •Решето Эратосфена
- •Тест Ферма (основан на малой теореме Ферма)
- •Тест Миллера – Рабина.
- •Критерий Вильсона
- •Тест Соловея–Штрассена
- •8.3. Разложение числа на простые сомножители
- •Метод факторизации Ферма
8.3. Разложение числа на простые сомножители
Представление натурального числа в виде произведения простых называется разложением числа на простые сомножители или факторизацией числа. На настоящий момент неизвестны полиномиальные алгоритмы факторизации чисел, хотя и не доказано, что таких алгоритмов не существует. На предполагаемой большой вычислительной сложности задачи факторизации базируется криптосистема RSA и некоторые другие. Факторизация с полиномиальной сложностью теоретически возможна на квантовом компьютере с помощью алгоритма Шора.
В зависимости от сложности алгоритмы факторизации можно разбить на две группы. Первая группа – экспоненциальные алгоритмы, сложность которых экспоненциально зависит от длины входящих параметров (т.е. от длины самого числа в бинарном представлении). Вторая группа – субэкспоненциальные алгоритмы.
A. Экспоненциальные алгоритмы:
- метод факторизации Ферма;
- ρ-алгоритм Полларда;
- ρ-1 алгоритм Полларда;
Б. Субэкспоненциальные алгоритмы:
- метод непрерывных дробей (CFRAC);
- метод квадратичного решета;
- метод эллиптических кривых;
- общий метод решета числового поля (считается самым быстрым алгоритмом на текущий момент);
Рассмотрим три экспоненциальных алгоритма.
Метод факторизации Ферма
Суть метода состоит в том, чтобы попробовать представить нечетное число n в виде n = х2 - у2, где х, у - неотрицательные целые числа. Если такие числа найдены, то n = х2- у2 = (х - у) (х + у). Значит, (х – у) и (х + у) являются делителями (не обязательно простыми) числа n.
Описание алгоритма.
1. х = [ ], где [ ] – целая часть .
2. Если x = 1, то завершить работу.
3. Если n = х2, то завершить работу, т.к. х является делителем числа n. В противном случае x = x + 1.
4.
Если х
= (n
+ 1) / 2, то завершить работу, т.к. n
– простое. В противном случае
.
5. Если число у целое (т.е., если [у]2 = х2 - n), то завершить работу, т.к. (х + у) и (х - у) является делителями числа n. В противном случае х = x + 1 и перейти к шагу 4.
Например, n = 1 342 127.
Таблица 8.4. Таблица итераций
Тогда делителями n = 1 342 127 являются (x + y) = (1164 + 113) = 1277 и (x - y) = (1164 - 113) = 1051.
Как
отмечалось выше, если в результате
работы алгоритма получены делители, то
они могут, в свою очередь, оказаться
составными числами. Например, при n = 120
уже на первой итерации мы получаем x =
[
]
+ 1 = [10.95..] + 1 = 10 + 1 = 11,
=
=
1, (x + y) = (11 + 1) = 12 и (x - y) = (11 - 1) = 10. Очевидно,
что числа 12 и 10 составные.
Т.о., чтобы найти все простые делители числа n необходимо использовать описанный выше алгоритм рекурсивно для каждого вновь найденного делителя. Если для него соблюдается условие шага 4, то он действительно является простым делителем числа n.
Для вскрытия шифрограммы, полученной с помощью алгоритма RSA, требуется найти два простых делителя числа n = p * q (напомним, n – часть открытого ключа). Отсюда, достаточно единожды (без рекурсивных вызовов) применить метод Ферма и найти два делителя, чтобы вскрыть шифрограмму. Но, т.к. по рекомендациям Лаборатории RSA на сегодняшний день, длина числа n составляет 2048 битов (n ≈ 2 * 10600), использование метода Ферма неперспективно.
p-Метод Полларда
Оригинальная версия
Рассмотрим
последовательность целых чисел
,
такую что
и
,
где
-
число, которое нужно факторизовать.
Оригинальный алгоритм выглядит следующим
образом[6].
1. Будем вычислять тройки чисел
,
где
.
Причём каждая такая тройка получается из предыдущей.
2.
Каждый раз, когда число
кратно
числу
(скажем,
),
будем вычислять наибольший общий
делитель
любым
известным методом.
3.
Если
,
то найдено частичное разложения числа
,
причём
.
Найденный
делитель
может
быть составным, поэтому его также
необходимо факторизовать. Если
число
составное,
то продолжаем алгоритм с модулем
.
4.
Вычисления повторяются
раз.
Например, можно прекратить алгоритм
при
.
Если при этом число не было до конца
факторизовано, можно выбрать, например,
другое начальное число
.
Современная версия
Пусть составное целое положительное число, которое требуется разложить на множители. Алгоритм выглядит следующим образом:[7]
Выбираем
небольшое число
и
строим последовательность
,
определяя каждое следующее как
.
Одновременно
на каждом i-ом шаге вычисляем
для
каких-либо
,
таких,
что
,
например,
.
Если
обнаружили, что
,
то вычисление заканчивается, и найденное
на предыдущем шаге число
является
делителем
.
Если
не
является простым числом, то процедуру
поиска делителей можно продолжить, взяв
в качестве
число
.
Как
на практике выбирать функцию
?
Функция должна быть не слишком сложной
для вычисления, но в то же время не должна
быть линейным многочленом, а также не
должна порождать взаимно однозначное
отображение. Обычно в качестве
берут
функцию
или
[8].
Однако не следует использовать
функции
и
[6].
Если
известно, что для делителя
числа
справедливо
при
некотором
,
то имеет смысл использовать
[6].
Существенным
недостатком алгоритма в такой реализации
является необходимость хранить большое
число предыдущих значений
.
p-1 Метод Полларда
Первая стадия
Задача
состоит в том, чтобы найти делитель
числа
отличный
от единицы. Прежде всего необходимо
выбрать 2 числа
,
такие, что
.
Вычислим
теперь число
,
где
—
все простые числа меньшие
.
Здесь допускается некоторая свобода в
выборе
,
однако точно известно, что для
маленьких
,
должно
быть больше единицы[1].
Выберем
небольшое целое
и
вычислим
если
мы
нашли делитель
,
в противном случае переходим ко второй
стадии.
Вторая стадия
На этом шаге необходимо вычислить последовательность
где
—
простое,
,
надеясь, что на каком-нибудь шаге
получится
Легче
всего[1] это
сделать вычислением
для
каждого нечётного
домножением
на
,
беря
через
равные промежутки. Если
делитель
найден. Если же
,
то необходимо точнее исследовать этот
участок.
Замечание
С помощью данного метода мы сможем найти только такие простые делители числа , для которых выполнено[1]:
или
,
где
является
-гладким,
а
—
простое, такое что
[1].
