Тест Миллера — Рабина
Тест Миллера — Рабина — вероятностный полиномиальный тест простоты. Тест Миллера — Рабина, наряду с тестом Ферма и тестом Соловея — Штрассена, позволяет эффективно определить, является ли данное число составным. Однако, с его помощью нельзя строго доказать простоту числа. Тем не менее тест Миллера — Рабина часто используется в криптографии для получения больших случайных простых чисел.

История 
Алгоритм Миллера-Рабина является модификацией алгоритма Миллера, разработанного Гари Миллером в 1976 году. Алгоритм Миллера является детерминированным, но его корректность опирается на недоказанную расширенную гипотезу Римана. Майкл Рабин модифицировал его в 1980 году. Алгоритм Миллера — Рабина не зависит от справедливости гипотезы, но является вероятностным.

Применение 
Так как криптостойкость многих алгоритмов шифрования основывается на секретных ключах, для создания которых необходимы простые числа (например, так работает шифр RSA), то при создании таких ключей важно уметь достаточно быстро проверять большие числа на простоту. Вероятностные тесты простоты, такие как тест Миллера-Рабина и Тест Соловея — Штрассена, показывают большую эффективность использования и простоту выражения по сравнению с детерминированными тестами. Алгоритм Миллера-Рабина позволяет выполнять проверку за малое время и давать при этом достаточно малую вероятность того, что число на самом деле является составным.

Принцип работы алгоритма 
Как и тесты Ферма и Соловея — Штрассена, тест Миллера — Рабина опирается на проверку ряда равенств, которые выполняются для простых чисел. Если хотя бы одно такое равенство не выполняется, это доказывает что число составное.

Для теста Миллера — Рабина используется следующее утверждение:

Если это утверждение (условие 1 или 2) выполняется для некоторых чисел  и  (не обязательно простого), то число  называют свидетелем простоты числа  по Миллеру, а само число  — вероятно простым. (При случайно выбранном  вероятность ошибочно принять составное число за простое составляет 25 %, но её можно уменьшить, выполнив проверки для других .)

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

У нечётных составных чисел  существует, согласно теореме Рабина, не более  свидетелей простоты, где  — функция Эйлера, таким образом вероятность того, что случайно выбранное число  окажется свидетелем простоты, меньше 1/4.

Идея теста заключается в том, чтобы проверять для случайно выбранных чисел , являются ли они свидетелями простоты числа . Если найдётся свидетель того, что число составное, то число действительно является составным. Если было проверено  чисел, и все они оказались свидетелями простоты, то число считается простым. Для такого алгоритма вероятность принять составное число за простое будет меньше .

Для проверки больших чисел принято выбирать числа  случайными, так как распределение свидетелей простоты и свидетелей составного числа среди чисел 1, 2, …, n − 1 заранее неизвестно. В частности Арнольт приводит 397-разрядное составное число, для которого все числа меньше 307 являются свидетелями простоты.

Пример 

Предположим, мы хотим определить, является ли n = 221 простым. Запишем  как 22·55, таким образом s = 2 и d = 55. Произвольно выберем число a такое, что 0 < a < n, допустим a = 174. Переходим к вычислениям:

 a20·d mod n = 17455 mod 221 = 47 ≠ 1, n − 1
 a21·d mod n = 174110 mod 221 = 220 = n − 1.

Так как 220 ≡ −1 mod n, число 221 или простое, или 174 — ложный свидетель простоты числа 221. Возьмём другое произвольное a, на этот раз выбрав a = 137:

 a20·d mod n = 13755 mod 221 = 188 ≠ 1, n − 1
 a21·d mod n = 137110 mod 221 = 205 ≠ n − 1.

Так как 137 свидетель того, что 221 составное, число 174 на самом деле было ложным свидетелем простоты. Заметим, что алгоритм ничего не говорит нам о множителях числа 221 (которые равны 13 и 17). Однако в некоторых случаях дополнительные вычисления помогают получить множители числа.

Алгоритм Миллера — Рабина

Реализация 
Алгоритм Миллера — Рабина параметризуется количеством раундов r. Рекомендуется брать r порядка величины , где n — проверяемое число.

Для данного n находятся такие целое число s и целое нечётное число t, что . Выбирается случайное число a, 1 < a < n. Если a не является свидетелем простоты числа n, то выдаётся ответ «n — составное», и алгоритм завершается. Иначе, выбирается новое случайное число a и процедура проверки повторяется. После нахождения r свидетелей простоты, выдаётся ответ «n — вероятно простое», и алгоритм завершается.

Алгоритм может быть записан на псевдокоде следующим образом:
 
  Ввод: n > 2, нечётное натуральное число, которое необходимо проверить на простоту;
        k — количество раундов.
 Вывод: составное, означает, что n является составным числом;
        вероятно простое, означает, что n с высокой вероятностью является простым числом.
 Представить n − 1 в виде 2s·t, где t нечётно, можно сделать последовательным делением n - 1 на 2.
 цикл А: повторить k раз:
    Выбрать случайное целое число a в отрезке [2, n − 2]
    x ← at mod n, вычисляется с помощью алгоритма возведения в степень по модулю
    если x = 1 или x = n − 1, то перейти на следующую итерацию цикла А
    цикл B: повторить s − 1 раз
       x ← x2 mod n
       если x = 1, то вернуть составное
       если x = n − 1, то перейти на следующую итерацию цикла A
    вернуть составное
 вернуть вероятно простое

Из теоремы Рабина следует, что если k случайно выбранных чисел оказались свидетелями простоты числа n, то вероятность того, что n составное, не превосходит .

Также для больших значений n вероятность объявления составного числа вероятно простым существенно меньше чем 4−k. Дамгард, Лэндрок и Померандс вычислили некоторые точные границы ошибок и предложили метод выбора значения k для получения нужной границы ошибки. Такие границы могут, например, использоваться для генерации вероятно простых чисел. Однако, они не должны использоваться для проверки простых чисел неизвестного происхождения, поскольку в криптографических системах взломщик может попытаться подставить псевдопростое число, в той ситуации, когда требуется простое число. В таких случаях можно положиться только на ошибку 4−k.

Сложность работы 
Считая, что время умножения логарифмическое, используя быстрое умножение по модулю, сложность работы алгоритма , где  — количество раундов. Таким образом, время работы алгоритма полиномиально.

Однако, используя БПФ, возможно сократить время работы алгоритма до . В таком случае, если брать , где n — проверяемое число, то сложность работы алгоритма равна .

Сильно псевдопростые числа 
Если число a является свидетелем простоты составного нечётного числа n по Миллеру, то число n, в свою очередь, называется сильно псевдопростым по основанию a. Если число n является сильно псевдопростым по основанию a, то оно также является псевдопростым Ферма по основанию a, так и Псевдопростым Эйлера — Якоби по основанию a.

Например, сильно псевдопростые числа по основанию 2 образуют последовательность:
 2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141, 52633, 65281, 74665, … ()
а по основанию 3 — последовательность:
 121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531, 18721, 19345, 23521, 31621, … ()

Примечания

Литература

Ссылки 
  
 Примеры реализации алгоритма на многих языках программирования
 
 
 "SPRP records"
 

Тесты простоты