Опубликован: 19.01.2010 | Уровень: специалист | Доступ: платный
Лекция 12:

Простые числа

12.2. Испытание простоты чисел

Если формулы получения простых чисел, подобно формулам Ферма или Мерсенна, не гарантируют, что полученные числа — простые, то как мы можем генерировать большие простые числа для криптографии? Мы можем только выбрать случайно большое число и провести испытание, чтобы убедиться, что оно — простое.

Нахождение алгоритма, который правильно и эффективно проверяет очень большое целое число и устанавливает: данное число – простое это число или же составной объект, — всегда было проблемой в теории чисел и, следовательно, в криптографии. Однако, недавние исследования (одно из которых мы обсуждаем в этом разделе) выглядят очень перспективными.

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

Детерминированные алгоритмы

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

Алгоритм теории делимости

Самое элементарное детерминированное испытание на простоту чисел — испытание на делимость. Мы используем в качестве делителей все числа, меньшие, чем \sqrt n 
. Если любое из этих чисел делит n, тогда nсоставное. Алгоритм 12.1 показывает проверку на делимость в ее примитивной и очень неэффективной форме.

Алгоритм может быть улучшен, если проверять только нечетные номера. Он может быть улучшен далее, если использовать таблицу простых чисел между 2 и \sqrt n . Число арифметических операций в алгоритме 12.1\sqrt n 
. Если мы принимаем, что каждая арифметическая операция использует только операцию на один бит (чисто условное соглашение), тогда сложность разрядной операции алгоритма 12.1\sqrt {{2^{{n_b}}}}  = {2^{{\raise0.7ex\hbox{${{n_b}}$} \!\mathord{\left/
 {\vphantom {{{n_b}} 2}}\right.\kern-\nulldelimiterspace}
\!\lower0.7ex\hbox{$2$}}}}
, где nb – число битов в n. В больших системах, обозначаемых О, сложность может быть оценена O(2n): экспоненциально (см. приложение L). Другими словами, алгоритм делимости неэффективен, если nb большое.

Сложность побитного испытания делимостью показательна.

Пример 12.18

Предположим, что n имеет 200 битов. Какое число разрядных операций должен был выполнить алгоритм делимости?

Решение

Сложность побитовых операций этого алгоритма — {2^{{\raise0.7ex\hbox{${{n_b}}$} \!\mathord{\left/
 {\vphantom {{{n_b}} 2}}\right.\kern-\nulldelimiterspace}
\!\lower0.7ex\hbox{$2$}}}}
. Это означает, что алгоритму необходимо провести 2100 битовых операций. Если алгоритм имеет скорость 230 операций в секунду, то необходимо 270 секунд для проведения испытаний.

\tt\parindent0pt

Тест на делимость (n)

\ \ \ \ \ \ \ \ \ //n – число тестов на простоту

\{ 

\ \ r \gets  2

\ \ while (r < \sqrt n)

\ \ \ \ \{ 

\ \ \ \ if (r|n) return "a composite"  // составное

\ \ \ \ r \gets  r+1

\ \ \ \} 

\ \ return "a prime"  //простое

\}
12.1.
AKS-алгоритм

В 2002 г. индийские ученые Агравал, Каял и Сахсена (Agrawal, Kayal и Saxena) объявили, что они нашли алгоритм для испытания простоты чисел с полиномиальной сложностью времени разрядных операций 0 ((log2nb)). Алгоритм использует тот факт, что {(x{\text{ }}-a)^p} \equiv ({x^p}-{\text{ }}a)\bmod p. Интересно наблюдать, что некоторые будущие разработки делают этот алгоритм стандартным тестом для определения простоты чисел в математике и информатике.

Пример 12.19

Предположим, что n имеет 200 битов. Какое число разрядных операций должен был выполнить алгоритм AKS?

Решение

Сложность разрядной операции этого алгоритма — O((log 2 n b) 12). Это означает, что алгоритму надо только (log2 200) 12 = 39 547 615 483 битовых операций. На компьютере, способном выполнить 1 миллиард битов в секунду, алгоритму требуется только 40 секунд.

Вероятностные алгоритмы

До AKS-алгоритма все эффективные методы для испытания простоты чисел были вероятностные. Эти методы могут использоваться еще некоторое время, пока AKS формально не принят как стандарт.

Вероятностный алгоритм не гарантирует правильность результата. Однако мы можем получить вероятность ошибки настолько маленькую, что это почти гарантирует, что алгоритм вырабатывает правильный ответ. Сложность разрядной операции алгоритма может стать полиномиальной, при этом мы допускаем небольшой шанс для ошибок. Вероятностный алгоритм в этой категории возвращает результат либо простое число, либо составной объект, основываясь на следующих правилах:

a. Если целое число, которое будет проверено, — фактически простое число, алгоритм явно возвратит простое число.

b. Если целое число, которое будет проверено, — фактически составной объект, алгоритм возвращает составной объект с вероятностью 1 - \varepsilon , но может возвратить простое число с  \varepsilon вероятности. Вероятность ошибки может быть улучшена, если мы выполняем алгоритм несколько раз с различными параметрами или с использованием различных методов. Если мы выполняем алгоритм m раз, вероятность ошибки может уменьшиться до m.

Тест Ферма

Первый вероятностный метод, который мы обсуждаем, — испытание простоты чисел тестом Ферма.

Если n — простое число, то a^{n-1}\equiv 1 \mod n.

Обратите внимание, что если n — простое число, то сравнение справедливо. Это не означает, что если сравнение справедливо, то n — простое число. Целое число может быть простым числом или составным объектом. Мы можем определить следующие положения как тест Ферма:

\tt\parindent0pt

Если n — простое число, то a^{n-1} \equiv  1 \mod\ n

Если n — составной объект, то возможно, что a^{n-1} \equiv  1 \mod\ n

Простое число удовлетворяет тесту Ферма. Составной объект может пройти тест Ферма с вероятностью  \varepsilon . Сложность разрядной операции испытания Ферма равна сложности алгоритма, который вычисляет возведение в степень. Позже в этой лекции мы приводим алгоритм для быстрого возведения в степень со сложностью разрядной операции O(nb ), где О — номер битов в n. Вероятность может быть улучшена, если проверка делается с несколькими числами (a1, a2 и так далее). Каждое испытание увеличивает вероятность, что испытуемое число – это простое число.

Пример 12.20

Проведите испытание Ферма для числа 561.

Решение

Используем в качестве основания число 2.

2561-1 = 1 mod 561

Число прошло тест Ферма, но это — не простое число, потому что

561 = 33 \times 17.

Испытание квадратным корнем

В модульной арифметике, если n — простое число, то квадратный корень равен только 1 (либо +1, либо –1). Если nсоставной объект, то квадратный корень — +1 или (-1), но могут быть и другие корни. Это называют испытанием простоты чисел квадратным корнем. Обратите внимание, что в модульной арифметике –1 означает n–1.

\tt\parindent0pt

Если n — простое число, $\sqrt 1 \mod\ n = \pm 1$

Если n — составной объект, $\sqrt 1 \mod\ n = \pm 1$, и возможны другие значения

Пример 12.21

Каковы квадратные корни 1 mod n, если n равно 7 (простое число)?

Решение

Единственные квадратные корни 1 mod n – это числа 1 и –1. Мы можем видеть, что

12 = 1 mod 7	  (–1)2 = 1 mod 7
22 = 4 mod 7	  (–2)2 = 4 mod 7
32 = 2 mod 7	  (–3)2 = 2 mod 7

Заметим, что тест не дает результатов для 4, 5 и 6, потому что 4 = –3 mod 7, 5 = –2 mod 7 и 6 = –1 mod 7.

Пример 12.22

Каков квадратный корень из 1 mod n, если n равно 8 (составное)?

Решение

Имеется три решения: 1, 3, 5 и 7 (которые дают –1). Мы можем также видеть, что

12 = 1 mod 8	  (–1)2 = 1 mod 8
32 = 1 mod 8	  (–5)2 = 1 mod 8

Пример 12.23

Каков квадратный корень из 1 mod n, если n равно 17 (простое)?

Решение

Имеются только два решения, соответствующие поставленной задаче: это 1 и (–1).

12 = 1 mod 17	  (-1)2 = 1 mod 17
22 = 4 mod 17	  (-2)2 = 4 mod 17
32 = 9 mod 17	  (-3)2 = 9 mod 17
42 = 16 mod 17	  (-4)2 = 16 mod 17
52 = 8 mod 17	  (-5)2 = 8 mod 17
62 = 2 mod 17	  (-6)2 = 2 mod 17
72 = 15 mod 17	  (-7)2 = 15 mod 17
82 = 13 mod 17	  (-8)2 = 13 mod 17

Заметим, что не надо проверять целые числа, большие 8, потому что 9 = –8 mod 17

Пример 12.24

Каков квадратный корень из 1 mod n, если n равно 22 (составное)?

Решение

Сюрприз в том, что имеется только два решения: +1 и –1, хотя 22 — составное число.

12    = 1 mod 22
(-1)2 = 1 mod 22

Хотя во многих случаях имеется испытание, которое показывает нам однозначно, что число составное, но это испытание провести трудно. Когда дано число n, то все числа, меньшие, чем n (кроме чисел 1 и n–1), должны быть возведены в квадрат, чтобы гарантировать, что ни одно из них не равно 1. Это испытание может использоваться для чисел (не +1 или –1), которые в квадрате по модулю n дают значение 1. Этот факт помогает в испытании Миллера–Рабина, которое рассматривается в следующем разделе.

Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Олег Волков
Олег Волков
Россия, Балаково, МБОУ СОШ 19