Тест Миллера (право)
- 1 year ago
- 0
- 0
Тест Миллера — Рабина — вероятностный полиномиальный тест простоты . Тест Миллера — Рабина, наряду с тестом Ферма и тестом Соловея — Штрассена , позволяет эффективно определить, является ли данное число составным . Однако, с его помощью нельзя строго доказать простоту числа . Тем не менее тест Миллера — Рабина часто используется в криптографии для получения больших случайных простых чисел .
Алгоритм Миллера-Рабина является модификацией алгоритма Миллера , разработанного Гари Миллером в 1976 году . Алгоритм Миллера является детерминированным , но его корректность опирается на недоказанную расширенную гипотезу Римана . Майкл Рабин модифицировал его в 1980 году . Алгоритм Миллера — Рабина не зависит от справедливости гипотезы, но является вероятностным.
Так как криптостойкость многих алгоритмов шифрования основывается на секретных ключах, для создания которых необходимы простые числа (например, так работает шифр RSA ), то при создании таких ключей важно уметь достаточно быстро проверять большие числа на простоту. Вероятностные тесты простоты, такие как тест Миллера-Рабина и Тест Соловея — Штрассена , показывают большую эффективность использования и простоту выражения по сравнению с детерминированными тестами . Алгоритм Миллера-Рабина позволяет выполнять проверку за малое время и давать при этом достаточно малую вероятность того, что число на самом деле является составным.
Как и тесты Ферма и Соловея — Штрассена , тест Миллера — Рабина опирается на проверку ряда равенств, которые выполняются для простых чисел. Если хотя бы одно такое равенство не выполняется, это доказывает что число составное .
Для теста Миллера — Рабина используется следующее утверждение:
Пусть — простое число и , где — нечётно. Тогда для любого из выполняется хотя бы одно из условий:
- Существует целое число такое что
В конечном поле (для простого ) не существует квадратных корней из единицы, кроме чисел 1 , -1
По малой теореме Ферма :
Будем извлекать квадратные корни из числа . По доказанной выше лемме, на каждом шаге у нас будет получаться число 1 или -1 по модулю . Если на каком-то шаге у нас получится -1 , то выполняется второе из равенств. Иначе на последнем шаге (т. к. ) т. е. выполнится первое равенство.
Если это утверждение (условие 1 или 2) выполняется для некоторых чисел и (не обязательно простого), то число называют свидетелем простоты числа по Миллеру, а само число — вероятно простым . (При случайно выбранном вероятность ошибочно принять составное число за простое составляет 25 %, но её можно уменьшить, выполнив проверки для других .)
В случае когда выполняется контрапозиция доказанного утверждения, то есть если найдётся число такое, что:
и
то число не является простым. В этом случае число называют свидетелем того, что число составное.
У нечётных составных чисел существует, согласно теореме Рабина , не более свидетелей простоты, где — функция Эйлера , таким образом вероятность того, что случайно выбранное число окажется свидетелем простоты, меньше 1/4 .
Идея теста заключается в том, чтобы проверять для случайно выбранных чисел , являются ли они свидетелями простоты числа . Если найдётся свидетель того, что число составное, то число действительно является составным. Если было проверено чисел, и все они оказались свидетелями простоты, то число считается простым. Для такого алгоритма вероятность принять составное число за простое будет меньше .
Для проверки больших чисел принято выбирать числа случайными, так как распределение свидетелей простоты и свидетелей составного числа среди чисел 1, 2, …, n − 1 заранее неизвестно. В частности Арнольт приводит 397-разрядное составное число, для которого все числа меньше 307 являются свидетелями простоты.
Предположим, мы хотим определить, является ли n = 221 простым. Запишем n − 1 = 220 как 2 2 ·55, таким образом s = 2 и d = 55. Произвольно выберем число a такое, что 0 < a < n , допустим a = 174. Переходим к вычислениям:
Так как 220 ≡ −1 mod n , число 221 или простое, или 174 — ложный свидетель простоты числа 221. Возьмём другое произвольное a , на этот раз выбрав a = 137:
Так как 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 образуют последовательность:
а по основанию 3 — последовательность: