Тест простоты AKS (также известный как тест простоты Агравала-Кайала-Саксены и циклотомический тест AKS ) — это детерминированный алгоритм доказательства простоты, созданный и опубликованный Маниндрой Агравалом , Нираджем Каялом и Нитином Саксеной , учеными-компьютерщиками из Индийского технологического института Канпура. 6 августа 2002 г., в статье под названием «ПРАЙМЫ находятся в P». [1] Алгоритм был первым, который способен за полиномиальное время определить , является ли данное число простым или составным , и это не полагаясь на математические догадки , такие как обобщенная гипотеза Римана . Доказательство также примечательно тем, что не опирается на область анализа . [2] В 2006 году авторы получили за свою работу премию Гёделя и премию Фулкерсона .
AKS — первый алгоритм доказательства простоты, который одновременно является общим , полиномиальным , детерминированным и безусловно правильным . Предыдущие алгоритмы разрабатывались веками и достигали максимум трех из этих свойств, но не всех четырех.
Хотя алгоритм имеет огромное теоретическое значение, на практике он не используется, что делает его галактическим алгоритмом . Для 64-битных входных данных тест Бэйли-ПСВ является детерминированным и выполняется на много порядков быстрее. Для больших входных данных производительность тестов ECPP и APR (также безусловно правильных) намного превосходит AKS. Кроме того, ECPP может выводить сертификат простоты , который позволяет осуществлять независимую и быструю проверку результатов, что невозможно при использовании алгоритма AKS.
Тест на простоту AKS основан на следующей теореме: Учитывая целое и целое число , взаимно простое с , является простым тогда и только тогда, когда полиномиальное отношение сравнения
выполняется внутри кольца многочленов . [1] Обратите внимание, что обозначает неопределенность , которая порождает это кольцо многочленов.
Эта теорема является обобщением на полиномы малой теоремы Ферма . В одном направлении это можно легко доказать, используя биномиальную теорему вместе со следующим свойством биномиального коэффициента :
Хотя соотношение ( 1 ) само по себе представляет собой тест на простоту, его проверка занимает экспоненциальное время : подход грубой силы потребует расширения полинома и уменьшения результирующих коэффициентов.
Сравнение представляет собой равенство в кольце полиномов . Вычисление в факторкольце создает верхнюю границу степени задействованных многочленов. AKS оценивает равенство в , делая сложность вычислений зависимой от размера . Для наглядности в [1] это выражается сравнением
что то же самое, что:
для некоторых полиномов и .
Обратите внимание, что все простые числа удовлетворяют этому соотношению (выбор в ( 3 ) дает ( 1 ), что справедливо для простых чисел). Это сравнение можно проверить за полиномиальное время, если оно полиномиально по отношению к цифрам числа . Алгоритм AKS оценивает это соответствие для большого набора значений, размер которого является полиномиальным по отношению к цифрам . Доказательство справедливости алгоритма AKS показывает, что можно найти набор значений с указанными выше свойствами, такой, что если сравнения выполнены, то это степень простого числа. [1]
В первой версии цитируемой выше статьи авторы доказали, что асимптотическая временная сложность алгоритма равна (используя Õ из обозначения большого O ) — двенадцатой степени количества цифр в n , умноженной на полилогарифмический множитель. количество цифр. Однако эта верхняя граница была довольно свободной; широко распространенная гипотеза о распределении простых чисел Софи Жермен , если бы она была верной, немедленно сократила бы худший случай до .
Через несколько месяцев после открытия появились новые варианты (Lenstra 2002, Pomerance 2002, Berrizbeitia 2002, Cheng 2003, Bernstein 2003a/b, Lenstra и Pomerance 2003), которые значительно увеличили скорость вычислений. Из-за существования множества вариантов Крэндалл и Пападопулос ссылаются на «класс AKS» алгоритмов в своей научной статье «О реализации тестов простоты класса AKS», опубликованной в марте 2003 года.
В ответ на некоторые из этих вариантов, а также на другие отзывы, статья «ПРАЙМЫ в P» была дополнена новой формулировкой алгоритма AKS и доказательством его корректности. (Эта версия в конечном итоге была опубликована в «Анналах математики» .) Хотя основная идея осталась прежней, r было выбрано по-новому, а доказательство правильности было организовано более последовательно. Новое доказательство опиралось почти исключительно на поведение круговых многочленов над конечными полями . Новая верхняя граница временной сложности была позже уменьшена с использованием дополнительных результатов теории решета до .
В 2005 году Померанс и Ленстра продемонстрировали вариант AKS, работающий в эксплуатации, [3] что привело к созданию еще одной обновленной версии статьи. [4] Агравал, Каял и Саксена предложили вариант, который был бы применим, если бы гипотеза Агравала была верна; однако эвристический аргумент Померанса и Ленстры предполагает, что это, вероятно, неверно.
Алгоритм следующий: [1]
Здесь ord r ( n ) — мультипликативный порядок n по модулю r , log 2 — двоичный логарифм , а функция Эйлера от r — тотент .
Шаг 3 показан в статье как проверка 1 < ( a , n ) < n для всех a ≤ r . Видно, что это эквивалентно пробному делению до r , которое можно сделать очень эффективно без использования gcd . Аналогичным образом, сравнение на шаге 4 можно заменить, если пробное деление возвращает простое число после проверки всех значений до
Если выйти за пределы очень небольших затрат, шаг 5 будет доминировать по затраченному времени. Существенное снижение сложности (от экспоненциальной до полиномиальной) достигается за счет выполнения всех вычислений в конечном кольце.
состоящее из элементов. Это кольцо содержит только мономы и коэффициенты , в которых есть элементы, все из которых можно закодировать в битах.
Большинство более поздних улучшений, внесенных в алгоритм, были сосредоточены на уменьшении размера r , что ускоряет основную операцию на шаге 5, а также на уменьшении размера s , количества циклов, выполняемых на шаге 5. [5] Обычно эти изменения не изменить вычислительную сложность, но может привести к сокращению времени на многие порядки, например, окончательная версия Бернштейна имеет теоретическое ускорение более чем в 2 миллиона раз.
Чтобы алгоритм был корректным, все шаги, определяющие n, должны быть корректными. Шаги 1, 3 и 4 тривиально корректны, поскольку основаны на прямых проверках делимости n . Шаг 5 также верен: поскольку (2) верно для любого выбора чисел , взаимно простых с n и r , если n простое, неравенство означает, что n должно быть составным.
Самая трудная часть доказательства — показать, что шаг 6 верен. Его доказательство правильности основано на верхних и нижних границах мультипликативной группы , построенной из биномов ( X + a ), которые проверяются на шаге 5. Шаг 4 гарантирует, что эти биномы являются различными элементами . Для конкретного выбора r границы приводят к противоречию , если только n не является простым или степенью простого числа. Вместе с тестом шага 1 это означает, что n всегда простое на шаге 6. [1]
Входные данные : целое число n = 31 > 1. (* Шаг 1 *) Если ( n = a b для целых чисел a > 1 и b > 1), выведите составной результат . For ( b = 2; b <= log 2 (n); b++) { а = п 1/б ; Если (a — целое число), верните [составное] } а = n 1/2 ...n 1/4 = {5,568, 3,141, 2,360} (* Шаг 2 *) Найдите наименьший r такой, что Or r ( n ) > (log 2 n ) 2 . maxk = ⌊(log 2 n) 2 ⌋; maxr = Max[3, ⌈(Log 2 n) 5 ⌉]; (* maxr действительно не нужен *) следующийR = Истина; For (r = 2; nextR && r < maxr; r++) { следующийR = Ложь; For (k = 1; (!nextR) && k ≤ maxk; k++) { nextR = (Mod[n k , r] == 1 || Mod[n k , r]==0) } } р--; (*цикл увеличивается на единицу*) р = 29 (* Шаг 3 *) Если (1 < НОД ( a , n ) < n для некоторого a ≤ r ), выведите составной результат . For (a = r; a > 1; a--) { If ((gcd = НОД[a,n]) > 1 && НОД < n), Return [Composite] } НОД = {НОД(29,31)=1, НОД(28,31)=1, ..., НОД(2,31)=1} ≯ 1 (* Шаг 4 *) Если ( n ≤ r ), выведите prime . Если (n ≤ r), верните [Prime] (* этот шаг можно пропустить, если n > 5690034 *) 31 > 29 (* Шаг 5 *) Для a = 1 сделать If (( X + a ) n ≠ X n + a (mod X r − 1, n )), вывести составной ; φ[x_] := EulerPhi[x]; PolyModulo[f_] := PolynomialMod[ PolynomialRemainder [f, x r -1, x], n]; макс = Этаж[Log[2, n] √ φ[r] ]; For (a = 1; a ≤ max; a++) { If (PolyModulo[(x+a) n - PolynomialRemainder[x n +a, x r -1], x] ≠ 0) { Return [Composite] { } (х+а) 31 = a 31 +31a 30 x +465a 29 x 2 + 4495a 28 x 3 +31465a 27 x 4 +169911a 26 x 5 +736281a 25 x 6 +2629575a 24 x 7 + 7888725a 23 x 8 + 20160075a 22 x 9 +4 4352165а 21 х 10 +84672315a 20 x 11 +141120525a 19 x 12 +206253075a 18 x 13 +265182525a 17 x 14 + 300540195a 16 x 15 + 300540195a 15 x 16 + 265182525a 14 х 17 + 206253075a 13 х 18 +141120525a 12 х 19 +84672315a 11 х 20 +44352165a 10 x 21 +20160075a 9 x 22 +7888725a 8 x 23 +2629575a 7 x 24 +736281a 6 x 25 +169911a 5 x 26 + 31465a 4 x 27 + 4495a 3 x 28 + 465a 2 х 29 +31 токс 30 + х 31 PolynomialRemainder [(x+a) 31 , x 29 -1] = 465a 2 +a 31 +(31a+31a 30 )x +(1+465a 29 )x 2 +4495a 28 x 3 +31465a 27 x 4 + 169911a 26 x 5 +736281a 25 x 6 +2629575a 24 x 7 +7888725a 23 x 8 +20160075a 22 x 9 + 44352165a 21 x 10 +84672315a 20 x 11 +141120525a 19 x 12 + 206253075a 18 x 13 +265182525a 17 x 14 + 300540195a 16 x 1 5 + 300540195a 15 x 16 +265182525a 14 x 17 +206253075a 13 x 18 + 141120525a 12 x 19 +84672315a 11 x 20 +44352165a 10 x 21 +20160075a 9 x 22 + 7888725a 8 x 23 +2629575a 7 x 24 + 736281a 6 x 25 + 169911a 5 х 26 + 31465а 4 х 27 +4495а 3 х 28 ( A ) PolynomialMod [PolynomialRemainder [(x+a) 31 , x 29 -1], 31] = a 31 +x 2 ( B ) PolynomialRemainder [x 31 +a, x 29 -1] = a+x 2 ( А ) - ( B ) знак равно а 31 +х 2 - (а+х 2 ) знак равно а 31 -а {1 31 -1 = 0 (по модулю 31), 2 31 -2 = 0 (по модулю 31), 3 31 -3 = 0 (по модулю 31), ..., 26 31 -26 = 0 (по модулю 31)} (* Шаг 6 *) Выведите prime . 31 Должно быть премьер
Где PolynomialMod — это уменьшение полинома по модулю. например PolynomialMod[x+2x 2 +3x 3 , 3] = x+2x 2 +0x 3
[6]