Тест Ферма на простоту — это вероятностный тест для определения того, является ли число вероятным простым числом .
Малая теорема Ферма утверждает, что если p — простое число и a не делится на p , то
Если кто-то хочет проверить, является ли p простым, то мы можем выбрать случайные целые числа a, не делящиеся на p, и посмотреть, выполняется ли сравнение. Если оно не выполняется для значения a , то p является составным. Это сравнение вряд ли будет выполняться для случайного a, если p является составным. [1] Поэтому, если равенство выполняется для одного или нескольких значений a , то мы говорим, что p , вероятно, является простым .
Однако следует отметить, что приведенное выше сравнение выполняется тривиально для , поскольку отношение сравнения совместимо с возведением в степень . Оно также выполняется тривиально для , если p нечетно, по той же причине. Вот почему обычно выбирают случайное a в интервале .
Любое такое , что
когда n является составным, то называется лжецом Ферма . В этом случае n называется псевдопростым Ферма по основанию a .
Если мы выберем такое , что
тогда a известно как свидетель Ферма составности n .
Предположим, мы хотим определить, является ли n = 221 простым числом. Случайным образом выбираем 1 < a < 220, скажем, a = 38. Проверяем приведенное выше сравнение и обнаруживаем, что оно выполняется:
Либо 221 — простое число, либо 38 — лжец Ферма, поэтому берем еще одно число , скажем, 24:
Итак, 221 является составным, а 38 действительно был лжецом Ферма. Более того, 24 является свидетелем Ферма составности 221.
Алгоритм можно записать следующим образом:
Значения a 1 и n -1 не используются, поскольку равенство выполняется для всех n и всех нечетных n соответственно, поэтому их проверка не добавляет никакой ценности.
При использовании быстрых алгоритмов для модульного возведения в степень и умножения с повышенной точностью время работы этого алгоритма составляет O ( k log 2 n log log n ) = Õ ( k log 2 n ) , где k — количество раз, которое мы проверяем случайное число a , а n — значение, которое мы хотим проверить на простоту; подробности см. в тесте Миллера–Рабина на простоту .
Существует бесконечно много псевдопростых чисел Ферма для любого заданного базиса a > 1. [1] : Теорема 1 Хуже того, существует бесконечно много чисел Кармайкла . [2] Это числа , для которых все значения с являются лжецами Ферма. Для этих чисел повторное применение теста Ферма на простоту дает тот же результат, что и простой случайный поиск множителей. Хотя числа Кармайкла встречаются существенно реже простых чисел (верхняя граница Эрдёша для числа чисел Кармайкла [3] ниже функции простого числа n/log(n) ), их достаточно много, поэтому тест Ферма на простоту нечасто используется в указанной выше форме. Вместо этого чаще используются другие, более мощные расширения теста Ферма, такие как тест Бейли–ПСВ , Миллера–Рабина и Соловея–Штрассена .
В общем случае, если — составное число, не являющееся числом Кармайкла, то по крайней мере половина всех
являются свидетелями Ферма. Для доказательства этого, пусть будет свидетелем Ферма и , , ..., будут лжецами Ферма. Тогда
и так все являются свидетелями Ферма.
Как упоминалось выше, большинство приложений используют тест Миллера–Рабина или Бейли–PSW на простоту. Иногда тест Ферма (вместе с некоторым пробным делением на малые простые числа) выполняется первым для повышения производительности. GMP , начиная с версии 3.0, использует тест Ферма с основанием 210 после пробного деления и перед запуском тестов Миллера–Рабина. Libgcrypt использует аналогичный процесс с основанием 2 для теста Ферма, но OpenSSL этого не делает.
На практике с большинством библиотек больших чисел, таких как GMP, тест Ферма не намного быстрее теста Миллера-Рабина и может быть медленнее для многих входных данных. [4]
В качестве исключения OpenPFGW использует только тест Ферма для вероятного тестирования простых чисел. Программа обычно используется с многотысячными цифровыми входами с целью максимальной скорости с очень большими входами. Другая известная программа, которая полагается только на тест Ферма, — это PGP , где она используется только для тестирования самостоятельно сгенерированных больших случайных значений (аналог с открытым исходным кодом, GNU Privacy Guard , использует предварительный тест Ферма, за которым следуют тесты Миллера–Рабина).
{{cite book}}
: CS1 maint: multiple names: authors list (link)