Введение

Алгоритм Тонелли–Шенкса (называемый Шенксом алгоритмом RESSOL) используется в модульной арифметике для решения уравнения относительно r в конгруэнции вида r2 ≡ n (mod p), где p – простое число: то есть для нахождения квадратного корня из n по модулю p. Алгоритм Тонелли–Шенкса нельзя использовать для составных модулей: поиск квадратных корней по модулю составного числа является вычислительной задачей, эквивалентной факторизации целых чисел. Эквивалентная, но несколько более избыточная версия этого алгоритма была разработана Альберто Тонелли в 1891 году. Версия, рассматриваемая здесь, была разработана независимо Дэниелом Шенксом в 1973 году, который объяснил:

Моя задержка с ознакомлением с этими историческими ссылками была связана с тем, что я одолжил первый том «Истории Диксона» другу, и он так и не был возвращен. Согласно Диксону, среднее значение двух вычислений символа Лежандра объясняется следующим образом: вероятность того, что является квадратичным вычетом, равна , что меньше, чем , но , поэтому в среднем потребуется проверить, является ли a квадратичным вычетом, дважды. Это показывает, что алгоритм Тонелли–Шенкса работает очень хорошо, если модуль p случаен, то есть если не особенно велик по отношению к количеству цифр в двоичном представлении . Как указано выше, алгоритм Чиполлы работает лучше, чем алгоритм Тонелли–Шенкса, если (и только если) . Однако, если вместо этого использовать алгоритм Сазерленда для вычисления дискретного логарифма в 2-й Силовой подгруппе , можно заменить на выражение, асимптотически ограниченное . Явно, вычисляется такое , что и затем удовлетворяет (обратите внимание, что кратно 2, поскольку является квадратичным вычетом). Алгоритм требует найти квадратичный невычет. Нет известного детерминированного алгоритма, работающего за полиномиальное время для поиска такого . Однако, если обобщенная гипотеза Римана верна, существует квадратичный невычет, что позволяет проверить все числа до этого предела и найти подходящее за полиномиальное время. Следует помнить, однако, что это наихудший сценарий; в общем случае, находится в среднем за 2 попытки, как указано выше.

Применение

Алгоритм Тонелли-Шенкса может (естественно) использоваться в любом процессе, где требуется вычисление квадратных корней по модулю простого числа. Например, он может быть использован для нахождения точек на эллиптических кривых. Он также полезен при вычислениях в криптосистеме Рабина и на этапе просеивания в квадратичном решете.