Один вариант теста Ферма, который нельзя обмануть, называется тестом Миллера-Рабина (Miller 1976; Rabin 1980).Это начинается с альтернативной формы Маленькой теоремы Ферма, которая гласит, что если n - простое число и a - любое положительное целое число, меньшее n , то a повышен до (n - 1) -й степени, соответствует 1 по модулю n .
Чтобы проверить простоту числа n с помощью теста Миллера-Рабина, мы выбираем случайное число a меньше n и повышаем a до (n - 1) st power по модулю n с использованием процедуры expmod
.Однако всякий раз, когда мы выполняем шаг возведения в квадрат в expmod
, мы проверяем, обнаружили ли мы «нетривиальный квадратный корень из 1 по модулю n », то есть число неравно 1 или n - 1 , квадрат которого равен 1 по модулю n .
Можно доказать, что если такой нетривиальный квадратный корень из 1 существует, то n не является простым.Также можно доказать, что если n нечетное число, которое не является простым, то, по крайней мере, для половины чисел a , вычисляя a n-1 , таким образом, обнаружит нетривиальный квадратный корень из 1 по модулю n .(Вот почему тест Миллера-Рабина не может быть одурачен.)
Измените процедуру expmod
, чтобы сигнализировать, если она обнаруживает нетривиальный квадратный корень из 1 , и используйте его для реализацииТест Миллера-Рабина с процедурой, аналогичной fermat-test
.Проверьте вашу процедуру, протестировав различные известные простые и не простые числа.Подсказка: один из удобных способов сделать сигнал expmod
состоит в том, чтобы он возвращал 0.
Это то, что я имею до сих пор.