Тест на простоту AKS - AKS primality test

Тест простоты AKS (также известный как тест простоты Агравала – Каяла – Саксены и циклотомический тест AKS ) - это детерминированный алгоритм доказательства простоты , созданный и опубликованный Маниндрой Агравал , Нираджем Каялом и Нитином Саксеной , компьютерными учеными из Индийского технологического института Канпура. , 6 августа 2002 г., в статье "ПРИМЕРЫ в П". Алгоритм был первым, который может доказуемо определить, является ли данное число простым или составным за полиномиальное время , не полагаясь на математические гипотезы, такие как обобщенная гипотеза Римана . Доказательство также примечательно тем, что не опирается на область анализа . В 2006 году авторы получили как гёделевскую премию и Фулкерсон премию за свою работу.

Важность

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

  • Алгоритм AKS может использоваться для проверки простоты любого заданного общего числа. Известно множество быстрых тестов на простоту, которые работают только для чисел с определенными свойствами. Например, тест Лукаса – Лемера работает только для чисел Мерсенна , в то время как тест Пепена применим только к числам Ферма .
  • Максимальное время работы алгоритма может быть выражено как полином по количеству цифр в целевом числе. ECPP и APR окончательно доказывают или опровергают, что данное число является простым, но не известно, что они имеют полиномиальные временные границы для всех входных данных.
  • Гарантируется, что алгоритм детерминированно распознает, является ли целевое число простым или составным. Рандомизированные тесты, такие как Миллера – Рабина и Бэйли – PSW , могут проверять простоту любого заданного числа за полиномиальное время, но, как известно, дают только вероятностный результат.
  • Правильность AKS не зависит от какой-либо дополнительной недоказанной гипотезы . Напротив, версия Миллера-Рабина полностью детерминирована и выполняется за полиномиальное время по всем входным параметрам, но ее правильность зависит от истинности еще не доказанной обобщенной гипотезы Римана .

Хотя алгоритм имеет огромное теоретическое значение, он не используется на практике, что делает его галактическим алгоритмом . Для 64-битных входных данных тест простоты Baillie – PSW является детерминированным и выполняется на много порядков быстрее. Для больших входных данных производительность (также безусловно правильных) тестов ECPP и APR намного превосходит AKS. Кроме того, ECPP может выводить сертификат первичности, который позволяет независимую и быструю проверку результатов, что невозможно с алгоритмом AKS.

Концепции

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

 

 

 

 

( 1 )

внутри кольца многочленов . Обратите внимание, что это означает неопределенное, которое порождает это кольцо многочленов.

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

для всех, если прост.

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

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

 

 

 

 

( 2 )

что то же самое, что:

 

 

 

 

( 3 )

для некоторых полиномов и .

Обратите внимание, что все простые числа удовлетворяют этому соотношению (выбор в ( 3 ) дает ( 1 ), которое справедливо для простых чисел ). Это сравнение можно проверить за полиномиальное время, если оно полиномиально от цифр . Алгоритм AKS оценивает это соответствие для большого набора значений, размер которых полиномиален цифрам . Доказательство достоверности алгоритма AKS показывает, что можно найти и набор значений с указанными выше свойствами, так что если сравнения выполняются, то является степенью простого числа.

История и время работы

В первой версии процитированной выше статьи авторы доказали, что асимптотическая временная сложность алгоритма равна (используя Õ из нотации большого O ) - двенадцатую степень числа цифр в n раз, множитель, который является полилогарифмическим в количество цифр. Однако эта верхняя граница была довольно нечеткой; широко распространенная гипотеза о распределении простых чисел Софи Жермен , если она верна, немедленно сократила бы худший случай до .

Через несколько месяцев после открытия появились новые варианты (Lenstra 2002, Pomerance 2002, Berrizbeitia 2002, Cheng 2003, Bernstein 2003a / b, Lenstra and Pomerance 2003), которые значительно повысили скорость вычислений. Из-за существования множества вариантов Крэндалл и Пападопулос ссылаются на «класс алгоритмов AKS» в своей научной статье «О реализации тестов на простоту класса AKS», опубликованной в марте 2003 года.

В ответ на некоторые из этих вариантов, а также на другие отзывы, статья «PRIMES is in P» была обновлена ​​новой формулировкой алгоритма AKS и доказательства его правильности. (Эта версия в конечном итоге была опубликована в Annals of Mathematics .) Хотя основная идея осталась прежней, r был выбран новым способом, и доказательство правильности было организовано более последовательно. Новое доказательство основывалось почти исключительно на поведении круговых многочленов над конечными полями . Новая верхняя граница временной сложности была позже уменьшена с использованием дополнительных результатов теории решет до .

В 2005 году Померанс и Ленстра продемонстрировали вариант AKS, который работает в рабочем состоянии, что привело к созданию еще одной обновленной версии документа. Агравал, Каял и Саксена предложили вариант, который работал бы, если бы гипотеза Агравала была верна; однако эвристический аргумент Померанса и Ленстры показал, что он, вероятно, неверен.

Алгоритм

Алгоритм следующий:

Ввод: целое число n  > 1 .
  1. Проверьте , если п является идеальной мощность : если п  =  б для целых чисел через  > 1 и Ь  > 1 , выходной композитного .
  2. Найдите наименьшее r такое, что ord r ( n )> (log 2 n ) 2 . (если r и n не взаимно просты, пропустите это r )
  3. Для всех 2 ≤ a ≤ min ( r , n −1) проверьте, что a не делит n : если a | n для некоторого 2 ≤ a ≤ min ( r , n −1), выходной составной .
  4. Если nr , вывести простое число .
  5. Для a  = 1 нужно сделать
    если ( X + a ) nX n + a (mod X r - 1, n ), вывести составной ;
  6. Вывести простое число .

Здесь Ord г ( п ) является мультипликативным порядком из п по модулю г , бревенчатый 2 представляет собой двоичный логарифм , и это totient функция Эйлера из г .

Шаг 3 показан в документе как проверка 1 <( a , n ) < n для всех ar . Видно, что это эквивалентно пробному делению до r , которое может быть выполнено очень эффективно без использования gcd . Точно так же сравнение на шаге 4 может быть заменено на то, чтобы пробное деление возвращало простое число после проверки всех значений до включительно

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

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

Большинство более поздних улучшений, внесенных в алгоритм, были сосредоточены на уменьшении размера r, что ускоряет выполнение основной операции на шаге 5, и на уменьшении размера s , количества циклов, выполняемых на шаге 5. Обычно эти изменения не меняют вычислений. сложность, но может привести к тому, что потребуется на много порядков меньше времени, например, окончательная версия Бернштейна имеет теоретическое ускорение более чем в 2 миллиона раз.

Схема доказательства действительности

Чтобы алгоритм был правильным, все шаги, которые определяют n, должны быть правильными. Шаги 1, 3 и 4 тривиально верны, поскольку они основаны на прямых проверках делимости n . Шаг 5 тоже верно: так как (2) справедливо при любом выборе в копервичных к п и г , если п простое, неравенство означает , что п должно быть составным.

Сложным случаем алгоритма является повторение оператора на шаге 5. Если это в пределах конечного кольца R, происходит несовпадение

это эквивалентно

,

так что после сокращения до r мономов с помощью только нужно проверять.

Пример 1: n = 31 простое число

Ввод: целое число n  = 31> 1.
  1.   If n = ab for integers a > 1 and b > 1, output composite.
        For [ b=2, b <= log2(n), b++,
          a=n1/b;
          If [ a is integer, Return[Composite]]
        ];
        a=n1/2...n1/4={5.568, 3.141, 2.360}
    
  2.   Find the smallest r such that Or(n) > (log2 n)2.
        maxk=⌊(log2 n)2⌋;
        maxr=Max[3, ⌈(Log2 n)5⌉]; (*maxr really isn't needed*)
        nextR=True;
        For [r=2, nextR && r < maxr, r++,
          nextR=False;
          For [k=1,(!nextR) &&k ≤ maxk, k++,
            nextR=(Mod[nk, r]==1 || Mod[nk, r]==0)
          ]
        ];
        r--; (*the loop over increments by one*)
         
        r = 29
    
  3.   If 1 < gcd(a,n) < n for some ar, output composite.
        For [a=r, a > 1, a--,
          If [(gcd=GCD[a,n]) > 1 && gcd < n, Return[Composite]]
        ];
         
        gcd={GCD(29,31)=1, GCD(28,31)=1, ..., GCD(2,31)=1} ≯ 1
    
  4.   If nr, output prime.
        If [n ≤ r, Return[Prime]]; (* this step may be omitted if n > 5690034 *)
         
        31 > 29
    
  5.   For a = 1 to  do
        if (X+a)nXn+a (mod Xr − 1,n), output composite;
         
        φ[x_]:=EulerPhi[x];
        PolyModulo[f_]:=PolynomialMod[ PolynomialRemainder[f,xr-1,x],n];
        max=Floor[Log[2,n]φ[r]];
        For[a=1, a ≤ max, a++,
          If[PolyModulo[(x+a)n-PolynomialRemainder[xn+a, xr-1], x]≠0,
            Return[Composite]
          ]
        ];
         
        (x+a)31 =
          a31 +31a30x +465a29x2 +4495a28x3 +31465a27x4 +169911a26x5 +736281a25x6 +2629575a24x7 +7888725a23x8 +20160075a22x9 +44352165a21x10 +84672315a20x11 +141120525a19x12 +206253075a18x13 +265182525a17x14 +300540195a16x15 +300540195a15x16 +265182525a14x17 +206253075a13x18 +141120525a12x19 +84672315a11x20 +44352165a10x21 +20160075a9x22 +7888725a8x23 +2629575a7x24 +736281a6x25 +169911a5x26 +31465a4x27 +4495a3x28 +465a2x29 +31ax30 +x31
         
        PolynomialRemainder [(x+a)31, x29-1] =
          465a2 +a31 +(31a+31a30)x +(1+465a29)x2 +4495a28x3 +31465a27x4 +169911a26x5 +736281a25x6 +2629575a24x7 +7888725a23x8 +20160075a22x9 +44352165a21x10 +84672315a20x11 +141120525a19x12 +206253075a18x13 +265182525a17x14 +300540195a16x15 +300540195a15x16 +265182525a14x17 +206253075a13x18 +141120525a12x19 +84672315a11x20 +44352165a10x21 +20160075a9x22 +7888725a8x23 +2629575a7x24 +736281a6x25 +169911a5x26 +31465a4x27 +4495a3x28
         
        (A) PolynomialMod [PolynomialRemainder [(x+a)31, x29-1], 31] = a31+x2
         
        (B) PolynomialRemainder [x31+a, x29-1] = a+x2
         
        (A) - (B) = a31+x2 - (a+x2) = a31-a
         
        max =  = 26
         
        {131-1=0 (mod 31), 231-2=0 (mod 31), 331-3=0 (mod 31), ..., 2631-26=0 (mod 31)}
    
  6.   Output prime.
        31 Must be Prime
    

Где PolynomialMod - это почленное сокращение полинома по модулю. например, PolynomialMod [x + 2x 2 + 3x 3 , 3] = x + 2x 2 + 0x 3

использованная литература

дальнейшее чтение

  • Дицфельбингер, Мартин (2004). Проверка на простоту за полиномиальное время. Из рандомизированных алгоритмов к PRIMES в P . Конспект лекций по информатике. 3000 . Берлин: Springer-Verlag . ISBN 3-540-40344-2. Zbl  1058.11070 .

внешние ссылки