Опубликован: 02.03.2017 | Доступ: свободный | Студентов: 2512 / 557 | Длительность: 21:50:00
Лекция 2:

Алгоритмы тестирования на простоту и факторизации

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Аннотация: Для построения многих систем защиты информации требуются простые числа большой разрядности. В связи с этим актуальной является задача тестирования на простоту натуральных чисел. В лекции 2 рассматриваются тесты техника компьютерных вычислений с многоразрядными числами.

Определение 2.1 Время работы алгоритма T(n) имеет верхнюю оценку g(n) (пишут T(n)=O(g(n)), читают "О большое от g от n"), если существует натуральное число n_0 и положительная постоянная c такие, что \forall n>n_0 выполняется неравенство: T(n)\leq c\cdot g(n).

Пример 2.1 Докажем, что функция T(n)=3n^3 + 2n^2 имеет верхнюю оценку O(n^3).

Действительно, положим n_0=1, c\geq 5. Тогда \forall n\geq n_0=1 выполняется неравенство 3n^3 + 2n^2 \leq c n^3. Следовательно, T(n)=O(n^3).

Оценка сложности алгоритма - важнейший вопрос для криптографии, поскольку от оценки сложности решающим образом зависит стойкость соответствующей криптосистемы.

Далее мы будем рассматривать алгоритмы (в основном теоретико-числовые) и в большинстве случаев будем приводить оценку сложности представленного алгоритма.

2.1 Тестирование на простоту

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

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

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

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

На практике рассмотренные алгоритмы чаще всего по отдельности не применяются. Для проверки числа на простоту используют либо их комбинации, либо детерминированные тесты на простоту.

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

2.1.1 Вероятностные тесты простоты

Для того чтобы проверить вероятностным алгоритмом, является ли целое число n простым, выбирают случайное число a, 1<a<n, и проверяют условие алгоритма. Если число n не проходит тест по основанию a, то алгоритм выдает результат "Число n составное", и число n действительно является составным.

Если же n проходит тест по основанию a, нельзя сказать о том, действительно ли число n является простым. Последовательно проведя ряд проверок таким тестом для разных a и получив для каждого из них ответ "Число n, вероятно, простое", можно утверждать, что число n является простым с вероятностью, близкой к 1. Если вероятность того, что составное число пройдёт тест, равна p, то для обеспечения вероятности p_0 того, что проверенное число является простым, необходимо сделать m = \lceil log_p (1-p_0)\rceil итераций (см. рис. 1.1}).

Блок-схема тестирования числа на простоту

увеличить изображение
Рис. 1.1. Блок-схема тестирования числа на простоту

2.1.2 Тест Ферма

Согласно малой теореме Ферма для простого числа p и произвольного целого числа a, 1 < a < p-1, выполняется сравнение:

a^{p-1}\equiv 1 ~(\mod p).

Следовательно, если для нечетного n существует такое целое a, что 1 \leq a \leq n, НОД(a,n)=1 и a^{n-1} \equiv 1 ~(\mod n), то число n вероятно простое. Таким образом, получаем следующий вероятностный алгоритм проверки числа на простоту:

Вход: нечетное целое число n\geq 5.

Выход: "Число n, вероятно, простое" или "Число n составное".

  1. Выбрать случайное целое число a, 2\leq a \leq n-2.
  2. Вычислить r = a^{n-1} ~(\mod n).
  3. При r=1 результат: "Число n, вероятно, простое". В противном случае результат: "Число n составное".

На шаге 1 алгоритма мы не рассматриваем числа a = 1 и a = n-1, поскольку 1^{n-1} \equiv 1 ~(\mod n) для любого целого n и {(n-1)}^{n-1} \equiv {(-1)}^{n-1} \equiv 1 ~(\mod n) для любого нечетного n.

Сложность теста Ферма равна: O(\log^3 n).

Тест имеет существенный недостаток в виде наличия чисел Кармайкла. Это нечетные составные числа, для которых сравнение из формулы выполняется при любом a, 1 \leq a \leq n-1, взаимно простом с n. Для всех a, НОД(a,n)=1, тест будет выдавать ошибочный результат.

Числа Кармайкла являются достаточно редкими. В пределах до 100000 существует лишь 16 чисел Кармайкла: 561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841, 29341, 41041, 46657, 52633, 62745, 63973, 75361.

2.1.3 Тест Леманна

Если для какого-либо целого числа a, меньшего n, не выполняется условие:

a^{\frac{n-1}{2}}\equiv\pm 1 ~(\mod n),

то число n - составное. Если это условие выполняется, то число n - возможно простое, причем вероятность ошибки не превышает 50%.

Таким образом, получаем следующий вероятностный алгоритм проверки числа на простоту:

Вход: нечетное целое число n \geq 5.

Выход: "Число n, вероятно, простое" или "Число n составное".

  1. Выбрать случайное целое число a, 2\leq a \leq n-2.
  2. Вычислить r=a^{\frac{n-1}{2}} ~(\mod n).
  3. При r\neq 1 и r \neq -1 результат: "Число n составное". В противном случае результат: "Число n, вероятно, простое".

Сложность теста Леманна равна O(log^3 n).

2.1.4 Тест Соловея-Штрассена

В основе этого теста лежит следующая теорема:

Теорема 1.28 (критерий Эйлера) Нечетное число n является простым тогда и только тогда, когда для любого целого числа a, 1 \leq a \leq n-1, взаимно простого с n, выполняется сравнение:

a^{\frac{n-1}{2}} \equiv \left(\frac{a}{n}\right) ~(\mod n), ( 2.1)

где \left(\dfrac{a}{n}\right) - символ Якоби от параметров a и n.

Критерий Эйлера лежит в основе следующего вероятностного теста числа на простоту:

Вход: нечетное целое число n \geq 5.

Выход: "Число n, вероятно, простое" или "Число n составное".

  1. Выбрать случайное целое число a, 2 \leq a \leq n-2.
  2. Вычислить r = a^{\frac{n-1}{2}}.
  3. При r \neq 1 и r \neq n-1 результат: "Число n составное".
  4. Вычислить символ Якоби s = \left(\dfrac{a}{n}\right).
  5. При r \neq s ~(\mod n) результат: "Число n составное". В противном случае результат: "Число n, вероятно, простое".

На шаге 1 мы снова не рассматриваем числа 1 и n-1, поскольку в силу свойств символа Якоби сравнение в формуле (2.1) для этих чисел выполняется при любом нечетном n. Если d=НОД(a,n)>1, то d делит и число r, вычисляемое на шаге 2. Таким образом, при проверке неравенства  r\neq 1 на шаге 3 автоматически проверяется условие НОД(a,n)\neq 1.

Сложность теста Соловэя-Штрассена определяется сложностью вычисления символа Якоби и равна O(\log^3 n).

Для теста Соловея-Штрассена не существует чисел, подобных числам Кармайкла, то есть составных чисел, которые были бы эйлеровыми псевдопростыми по всем основаниям a.

2.1.5 Тест Миллера-Рабина

На сегодняшний день для проверки чисел на простоту чаще всего используется тест Миллера-Рабина, основанный на следующем наблюдении. Если p - простое, и x^2 = 1 ~(\mod p), то x=1 или -1 ~(\mod p).

Пусть число n нечетное и n-1=2^{s}r, где r - нечетное. По малой теореме Ферма, если n - простое, то a^{n-1}=1~(\mod n) для любого натурального числа a<n. Из нашего наблюдения следует, что, в ряду элементов a^r, a^{2r},\ldots, a^{2^{s-1}r} при каком-либо i мы будем иметь a^{2^i r} = -1~(\mod p) и a^{2^j r} = 1~(\mod p) при j>i.

Это свойства лежит в основе следующего теста:

Вход: нечетное целое число n\geq 5.

Выход: "Число n, вероятно, простое" или "Число n составное".

  1. Представить n-1 в виде n-1=2^{s}r, где число r - нечетное.
  2. Выбрать случайное целое число a, 2 \leq a \leq n-2, взаимно простое с n.
  3. Вычислить y = a^r ~(\mod n).
  4. При y \neq 1 и y \neq n-1 выполнить следующие действия.
    4.1. Положить j = 1.
    4.2. Если j \leq s-1 и y \neq n-1, то
    4.2.1. Положить y = y^2 ~(\mod n).
    4.2.2. При y=1 результат: "Число n составное".
    4.2.3. Положить j = j+1.
    4.3. При y \neq n-1 результат: "Число n составное".
  5. Результат: "Число n, вероятно, простое".

В результате выполнения теста для простого числа n в последовательности a^r ~(\mod n), a^{2r} ~(\mod n), \dots, a^{2^{s-1}r} ~(\mod n) обязательно перед 1 должна появиться -1 (или, что то же самое, n-1 ~(\mod n)). Это означает, что для простого числа n единственными решениями сравнения y^2 \equiv 1 ~(\mod n) являются y\equiv \pm 1 ~(\mod n). Если число n составное и имеет k>1 различных простых делителей (то есть не является степенью простого числа), то по китайской теореме об остатках существует 2^k решений сравнения y^2\equiv 1 ~(\mod n). Действительно, для любого простого делителя p_i числа n существует два решения указанного сравнения: y\equiv \pm 1 ~(\mod p)_i. Поэтому k таких сравнений дают 2^k наборов решений по модулям p_i, содержащих элементы \pm 1.

Сложность теста Миллера-Рабина равна O\left( (\log n)^3 \right). Вероятность ошибки, то есть того, что тест объявит составное число простым, не более 1/4.

2.1.6 N - 1-алгоритмы генерации простых чисел

Перечислим некоторые теоремы, которые могут быть использованы для генерации доказуемо простых чисел [1].

Теорема 2.1 (Прот, 1878) Пусть n=2^k R+1, где R<2^k, 3< 2^k+1, и 3 не делит R. Тогда n - простое тогда и только тогда, когда

3^{(n-1)/2}\equiv -1 ~(\mod n). ( 2.2)

Для генерации простого числа нужно перебирать числа R и k и для каждого варианта проверять условие (2.2). Когда условие будет выполнено, полученное число n=2^k R+1 будет простым.

Недостатком этого подхода является плохое распределение генерируемых простых чисел: все они будут иметь вид 2^k R+1 для большого k и не очень большого R. В примере 1.42 мы также видели, что чем меньше простые делители числа p-1, тем легче осуществить дискретное логарифмирование по модулю p. Это делает генерируемые на основе теоремы Прота простые числа мало пригодными, например, для криптосистемы и электронной подписи Эль-Гамаля.

Теорема 2.2 (Диемитко, 1988) Пусть n=qR+1>1, где q - нечетное простое число, R - четное, и R<4(q+1). Если существует целое число a такое, что

a^{n-1}\equiv 1 ~(\mod n)\quad \text{и}\quad a^{(n-1)/q}\neq 1~(\mod n),

то n простое число.

С помощью этой теоремы генерировать простые числа можно итерационно. На вход каждой итерации подаётся какое-либо простое число q. Во время итерации перебираются числа R и a и проверяются условия теоремы Диемитко. Как только все условия выполнены, мы получили новое простое число n, порядок которого примерно вдвое больше, чем у исходного простого числа q. Итерации можно начинать с какого-либо известного простого числа, а заканчивать, когда полученное простое число достигнет требуемого размера.

На заключительной итерации желательно выбирать как можно меньшее число R. Тогда у полученного простого числа n-1 будет большой простой делитель q. Если подобрать достаточно малое R не получится, может потребоваться выполнить заново предыдущую итерацию для получения нового числа q.

Эта теорема лежала в основе алгоритма генерации простых чисел для алгоритма цифровой подписи ГОСТ 34.10-94, пока этот алгоритм не был заменён на новый, основанный на группе точек эллиптической кривой.

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Евгений Шаров
Евгений Шаров

как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами?

Юлия Мышкина
Юлия Мышкина

Обучение с персональным тьютором осуществляется по Скайпу или посредством переписки?