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

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

В теорії чисел тест простоти Люка — це тест простоти натурального числа n; для його роботи необхідно знати розкладання n1 на прості множники.[1][2] Вони утворюють базис для Шаблон:Нп, який дозволяє підтвердити за поліноміальний час, що число n є простим.

Опис

Нехай n>1 — натуральне число. Якщо існує ціле a таке, що 1<a<n і

an11(modn)

і для довільного простого дільника q числа n1

an1q≢1(modn)

то n просте.

Якщо такого числа a не існує, то nскладене число.

Правильність цього твердження полягає в наступному: якщо перша еквівалентність виконується для a, то можна зробити висновок про те, що a та n є спільними. Якщо a також зберігається другий крок, то порядок a у групі (Z/nZ)* дорівнює n−1, що означає, що порядок цієї групи n−1 (оскільки порядок кожного елемента групи ділить порядок групи), маючи на увазі, що n є простим. І навпаки, якщо n є простим, то існує первісний корінь модуля n або генератор групи (Z/nZ)*. Такий генератор має порядок |(Z/nZ)*| = n−1 , і обидва еквівалентності будуть виконуватися для будь-якого такого первісного кореня.

Зверніть увагу, що якщо існує a < 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: повторити k разів:                                          Вибираємо випадково a із інтервалу [2, n − 1]
      Якщо an1≢1(modn) повернути складене
      Інакше 
         Цикл2: Для всіх простих qn1:
            Якщо an1q≢1(modn)
               Якщо ми не перевірили порівняння для всіх q
                  то продовжуємо виконувати Цикл2
               інакше повернути просте
            Інакше повертаємося до Циклу1
Повернути можливо складене.

Примітки

Шаблон:Reflist

Див. також

Література

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

Шаблон:Алгоритми теорії чисел