Тест простоты Люка

Материал из testwiki
Перейти к навигации Перейти к поиску

В теории чисел тест простоты Люка — это тест простоты натурального числа n; для его работы необходимо знать разложение n−1 на множители. Для простого числа n простые множители числа n−1 вместе с некоторым основанием a составляют сертификат Пратта, который позволяет подтвердить за полиномиальное время, что число n является простым.

Описание

Пусть n > 1 — натуральное число. Если существует целое a такое, что 1<a<n и

an−1≡1(modn)

и для любого простого делителя q числа n−1

an−1q≢1(modn)

то n простое.

Если такого числа a не существует, то n — составное число.

Доказательство

Если n простое, то группа вычетов ℤn циклична, то есть имеет образующую g, порядок которой совпадает с порядком группы |ℤn×|=n−1, а значит, для любого простого делителя q числа n−1 выполняется сравнение:

an−1q≢1(modn).

Если n — составное, то либо НОД(a,n)>1 и тогда an−1≢1(modn), либо an−1≡1(modn). Если предположить, что для этого a ещё и выполняется an−1q≢1(modn), то, поскольку n−1q∣n−1, получаем, что группа ℤn× имеет элемент порядка n−1, значит |ℤn×| делит n−1, что противоречит тому, что |ℤn×|=φ(n)<n−1 при составных n.

По закону контрапозиции получаем критерий Люка.

Пример

Например, возьмем n = 71. Тогда n−1=70=2⋅5⋅7. Выберем случайно a=17. Вычисляем:

1770≡1(mod71).

Проверим сравнения an−1q≢1(modn) для q=2;5;7:

1735≡70≢1(mod71)
1714≡25≢1(mod71)
1710≡1≡1(mod71).

К сожалению 1710≡1≡1(mod71).. Поэтому мы пока не можем утверждать, что 71 простое.

Попробуем другое случайное число a, выберем a=11. Вычисляем:

1170≡1(mod71).

Снова проверим сравнения an−1q≢1(modn) для q=2;5;7:

1135≡70≢1(mod71)
1114≡54≢1(mod71)
1110≡32≢1(mod71).

Таким образом, 71 простое.

Заметим, что для быстрого вычисления степеней по модулю используется алгоритм двоичного возведения в степень со взятием остатка по модулю n после каждого умножения.

Заметим также, что при простом n из обобщенной гипотезы Римана вытекает, что среди первых O(ln2n) чисел есть хотя бы одна образующая группы ℤn, поэтому условно можно утверждать, что подобрать основание a можно за полиномиальное время.

Алгоритм

Алгоритм, написанный псевдокодом, следующий:

Ввод: n > 2 - нечетное число, тестируемое на простоту; k - параметр, определяющий точность теста
Вывод: простое, если n простое, в противном случае составное либо возможно составное;
Определяем все простые делители n−1.
Цикл1: Выбираем случайно a из интервала [2, n − 1]
      Если an−1≢1(modn) вернуть составное
      Иначе 
         Цикл2: Для всех простых q∣n−1:
            Если an−1q≢1(modn)
               Если мы не проверили сравнение для всех q
                  то продолжаем выполнять Цикл2
               иначе вернуть простое
            Иначе возвращаемся к Циклу1
Вернуть возможно составное.

См. также

Литература

  • Василенко О. Н. Теоретико-числовые алгоритмы в криптографии, МЦНМО, 2003
  • Трост Э. — Primzahlen / Простые числа — М.: ГИФМЛ, 1959, 135 с

Шаблон:Rq Шаблон:Теоретико-числовые алгоритмы