Тест на простоту Соловея–Штрассена , разработанный Робертом М. Соловеем и Фолькером Штрассеном в 1977 году, является вероятностным тестом для определения того, является ли число составным или, вероятно, простым . Идея теста была открыта М. М. Артюховым в 1967 году [1] (см. теорему E в статье). Этот тест был в значительной степени вытеснен тестом на простоту Бейли–ПСВ и тестом на простоту Миллера–Рабина , но имеет большое историческое значение, показывая практическую осуществимость криптосистемы RSA . Тест Соловея–Штрассена по сути является тестом Эйлера–Якоби на вероятное простое число .
Эйлер доказал [2] , что для любого нечетного простого числа p и любого целого числа a ,
где — символ Лежандра . Символ Якоби является обобщением символа Лежандра до , где n может быть любым нечетным целым числом. Символ Якоби может быть вычислен за время O ((log n )²) с использованием обобщения Якоби закона квадратичной взаимности .
При наличии нечетного числа n можно поразмыслить, выполняется ли сравнение
справедливо для различных значений «основания» a , при условии, что a взаимно просто с n . Если n простое, то это сравнение верно для всех a . Поэтому, если мы выберем значения a случайным образом и проверим сравнение, то как только мы найдем a, которое не соответствует сравнению, мы узнаем, что n не является простым (но это не говорит нам о нетривиальной факторизации n ). Это основание a называется свидетелем Эйлера для n ; это свидетель составности n . Основание a называется лжецом Эйлера для n , если сравнение верно, а n составное.
Для каждого составного нечетного n , по крайней мере, половина всех оснований
являются (эйлеровыми) свидетелями, поскольку множество лжецов Эйлера является собственной подгруппой . Например, для множество лжецов Эйлера имеет порядок 8 и , а также имеет порядок 48.
Это контрастирует с тестом Ферма на простоту , для которого доля свидетелей может быть намного меньше. Таким образом, не существует (нечетных) составных n без многих свидетелей, в отличие от случая чисел Кармайкла для теста Ферма.
Предположим, мы хотим определить, является ли n = 221 простым числом. Запишем ( n −1)/2=110.
Мы случайным образом выбираем a (больше 1 и меньше n ): 47. Используя эффективный метод возведения числа в степень (mod n ), такой как двоичное возведение в степень , мы вычисляем:
Это дает нам следующее: либо 221 — простое число, либо 47 — эйлеров лжец для 221. Мы пробуем еще одно случайное число a , на этот раз выбирая a = 2:
Следовательно, 2 является свидетелем Эйлера для составности 221, а 47 на самом деле был лжецом Эйлера. Обратите внимание, что это ничего не говорит нам о простых множителях 221, которые на самом деле являются 13 и 17.
Алгоритм можно записать на псевдокоде следующим образом:
входные данные : n , значение для проверки на простоту k , параметр, определяющий точность теста выходные данные : составное число , если n является составным числом, в противном случае, вероятно, простое числоповторить k раз: выбрать a случайным образом в диапазоне [2, n − 1] если x = 0 или тогда вернуть составное число вернуть вероятно простое число
При использовании быстрых алгоритмов модульного возведения в степень время работы этого алгоритма составляет O( k ·log 3 n ), где k — количество различных значений a , которые мы проверяем.
Алгоритм может вернуть неверный ответ. Если входное число n действительно является простым, то выходное число всегда будет верно вероятно простым . Однако если входное число n является составным, то выходное число может быть неверно вероятно простым . Тогда число n называется псевдопростым числом Эйлера–Якоби .
Когда n нечетное и составное, по крайней мере половина всех a с gcd( a , n ) = 1 являются свидетелями Эйлера. Мы можем доказать это следующим образом: пусть { a 1 , a 2 , ..., a m } будут лжецами Эйлера, а a — свидетелем Эйлера. Тогда для i = 1,2,..., m :
Потому что справедливо следующее:
теперь мы знаем, что
Это дает, что каждый a i дает число a · a i , которое также является свидетелем Эйлера. Таким образом, каждый лжец Эйлера дает свидетеля Эйлера, и поэтому число свидетелей Эйлера больше или равно числу лжецов Эйлера. Следовательно, когда n является составным, по крайней мере половина всех a с gcd( a , n ) = 1 является свидетелем Эйлера.
Следовательно, вероятность неудачи не превышает 2 − k (сравните это с вероятностью неудачи для теста простоты Миллера–Рабина , которая не превышает 4 − k ).
Для целей криптографии , чем больше баз a мы проверяем, т. е. если мы выбираем достаточно большое значение k , тем выше точность проверки. Следовательно, вероятность того, что алгоритм потерпит неудачу таким образом, настолько мала, что (псевдо)простое число используется на практике в криптографических приложениях, но для приложений, для которых важно иметь простое число, следует использовать тест типа ECPP или тест простоты Поклингтона [3], который доказывает простоту.
Граница 1/2 вероятности ошибки одного раунда теста Соловея-Штрассена сохраняется для любого входного значения n , но те числа n , для которых граница (приблизительно) достигается, встречаются крайне редко. В среднем вероятность ошибки алгоритма значительно меньше: она меньше, чем
для k раундов теста, примененного к равномерно случайному числу n ≤ x . [4] [5] Та же граница применима и к связанной задаче о том, какова условная вероятность того, что n является составным числом для случайного числа n ≤ x , которое было объявлено простым в k раундах теста.
Алгоритм Соловея–Штрассена показывает, что задача принятия решения COMPOSITE относится к классу сложности RP . [6]