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

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

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

Описание

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

an11(modn)

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

an1q≢1(modn)

то n простое.

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

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

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

an1q≢1(modn).

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

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

Пример

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

17701(mod71).

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

173570≢1(mod71)
171425≢1(mod71)
171011(mod71).

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

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

11701(mod71).

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

113570≢1(mod71)
111454≢1(mod71)
111032≢1(mod71).

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

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

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

Алгоритм

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

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

См. также

Литература

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

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