Алгоритм Тонелли — Шенкса

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгори́тм Тоне́лли — Ше́нкса (названный Шенксом алгоритмом RESSOL) относится к модулярной арифметике и используется для решения сравнения

x2≡n(modp),

где n — квадратичный вычет по модулю p, а p — нечётное простое число.

Алгоритм Тонелли — Шенкса не может быть использован для составных модулей; поиск квадратных корней по составному модулю вычислительно эквивалентен факторизации[1].

Эквивалентная, но немного более сложная версия этого алгоритма была разработана Альберто Тонелли в 1891 году. Версия алгоритма, обсуждаемая здесь, была разработана независимо Дэниелом Шенксом в 1973 году.

Алгоритм

Входные данные: p — нечётное простое число, n — целое число, являющееся квадратичным вычетом по модулю p, другими словами, (np)=1, где (ab) — символ Лежандра.

Результат работы алгоритма: вычет R, удовлетворяющий сравнению R2≡n(modp).

  1. Выделим степени двойки из p−1, то есть пусть p−1=2SQ, где Q нечётно, S⩾1. Заметим, что если S=1, то есть p≡3(mod4), тогда решение определяется формулой R≡±np+14. Далее полагаем S⩾2.
  2. Выберем произвольный квадратичный невычет z, то есть символ Лежандра (zp)=−1, положим c≡zQ(modp).
  3. Пусть также R≡nQ+12(modp), t≡nQ(modp), M=S.
  4. Выполняем цикл:
    1. Если t≡1(modp), то алгоритм возвращает R.
    2. В противном случае в цикле находим наименьшее i, 0<i<M, такое, что t2i≡1(modp) с помощью итерирования возведения в квадрат.
    3. Пусть b≡c2M−i−1(modp), и положим R:≡Rb(modp), t:≡tb2(modp), c:≡b2(modp), M:=i, возвращаемся к началу цикла.

После нахождения решения сравнения R второе решение сравнения находится как p−R.

Пример

Решим сравнение x2≡10(mod13). p=13 — нечётно, и поскольку 1013−12=106≡1(mod13), 10 является квадратичным вычетом по критерию Эйлера.

  • Шаг 1: p−1=12=3⋅22 поэтому Q=3, S=2.
  • Шаг 2: Возьмем z=2 — квадратичный невычет (потому что 213−12=−1(mod13) (снова по критерию Эйлера)). Положим c=23≡8(mod13).
  • Шаг 3: R=102≡−4,t≡103≡−1(mod13),M=2.
  • Шаг 4: Начинаем цикл: t≢1(mod13), так что 0<i<2, проще говоря i=1.
    • Пусть b≡822−1−1≡8(mod13), тогда b2≡82≡−1(mod13).
    • Положим R=−4⋅8≡7(mod13), t≡−1⋅−1≡1(mod13), и M=1.
    • Перезапустим цикл, поскольку t≡1(mod13) цикл завершен, мы получим R≡7(mod13).

Поскольку 72=49≡10(mod13), очевидно (±7)2≡62≡10(mod13), отсюда получаем 2 решения сравнения.

Доказательство

Пусть p−1=2SQ. Пусть теперь r≡nQ+12(modp) и t≡nQ(modp), заметим, что r2≡nt(modp). Последнее сравнение остается истинным после каждой итериации основного цикла алгоритма. Если в какой-то момент t≡1(modp), то r2≡n(modp) и алгоритм завершается с R≡±r(modp).

Если t≢1(modp), то рассмотрим квадратичный невычет z по модулю p. Пусть c≡zQ(modp), тогда c2S≡(zQ)2S≡zp−1≡1(modp) и c2S−1≡zp−12≡(zp)≡−1(modp), которое показывает, что порядок c равен 2S.

Сходным образом мы получим, что t2S≡1(modp), поэтому порядок t делит 2S, значит порядок t равен 2S′. Так как n — квадрат по модулю p, то t≡nQ(modp) тоже квадрат, и значит, S′<S.

Положим, что b≡c2S−S′−1(modp) и r′≡br(modp), c′≡b2(modp) и t′≡c′t(modp). Как и раньше, r'2≡nt′(modp) сохраняется; однако в этой конструкции как t, так и c′ имеют порядок 2S′. Отсюда следует, что t′ имеет порядок 2S″, где S″<S′.

Если S″=0, то t′≡1(modp), и алгоритм останавливается, возвращая R≡±r′(modp). Иначе мы перезапускаем цикл с аналогичными определениями b′,r″,c″,t″, пока не получим S(j)′, который равен 0. Поскольку последовательность натуральных S(j)′ строго убывает, то алгоритм завершается.

Скорость алгоритма

Алгоритм Тонелли — Шенкса выполняет в среднем (по всевозможным входам (квадратичным вычетам и невычетам))

2m+2k+S(S−1)4+12S−1−9=O(S2)=O(ln2p)

умножений по модулю, где m=⌈log2p⌉=O(ln⁡p) — число цифр в двоичном представлении p, и k — число единиц в двоичном представлении p. Если требуемый квадратичный невычет z будет вычисляться проверкой случайно выбранного y на то, является ли оно квадратичным невычетом, то в среднем это требует вычисления двух символов Лежандра[2]. Два как среднее число вычисляемых символов Лежандра объясняется следующим: вероятность того, что y является квадратичным вычетом, равна p+12p=12+12p>12 — вероятность больше половины, поэтому в среднем понадобится около двух проверок, является ли y квадратичным вычетом.

Это показывает, что практически алгоритм Тонелли — Шенкса будет работать очень хорошо, если модуль p случаен, то есть когда S не особенно велико относительно количества цифр в двоичном представлении p. Алгоритм Чиполлы работает лучше, чем алгоритм Тонелли — Шенкса, если и только если S(S−1)>8m+20. Однако если вместо этого использовать алгоритм Сазерленда для выполнения дискретного логарифмирования в 2-Силовской подгруппе в 𝔽p, это позволяет заменить S(S−1) в выражении числа умножений на величину, асимптотически ограниченную O(Sln⁡Sln⁡ln⁡S)[3]. Действительно, достаточно найти одно e такое, что ce≡nQ и тогда R≡c−e/2n(Q+1)/2 удовлетворяет R2≡n (заметим, что e кратно 2, поскольку n — квадратичный вычет).

Алгоритм требует нахождения квадратичного невычета z. На текущий момент неизвестен детерминированный алгоритм, который бы за полиномиальное время от длины p нашёл бы такое z. Однако, если обобщённая гипотеза Римана верна, то существует квадратичный невычет z<2ln2p,[4], который легко найти, проверяя z в указанных пределах за полиномиальное время. Это, конечно, оценка в худшем случае, поскольку, как показано было выше, достаточно проверить в среднем 2 случайных z для нахождения квадратичного невычета.

Применение

Алгоритм Тонелли — Шенкса может быть использован для нахождения точек на эллиптической кривой над полем вычетов. Он также может быть использован для вычислений в криптосистеме Рабина.

Обобщение

Алгоритм Тонелли — Шенкса может быть обобщён на любую циклическую группу (вместо 𝔽p×) и на нахождение корней k-й степени для произвольного натурального k, в частности, на вычисление корней k-й степени в конечном поле[5].

Если надо вычислить много квадратных корней в одной и той же циклической группе и S не очень велико, для улучшения и упрощения алгоритма и увеличения его скорости может быть приготовлена таблица квадратных корней квадратов элементов следующим образом:

  1. Выделим степени двойки в p−1: пусть Q,S такие, что p−1=2SQ, Q нечётно.
  2. Пусть R≡nQ+12(modp),t≡nQ≡R2/n(modp).
  3. Найдём корень b по таблице соотношений b2≡t и положим R≡R/b
  4. Вернуть R.

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Теоретико-числовые алгоритмы

  1. ↑ Oded Goldreich, Computational complexity: a conceptual perspective, Cambridge University Press, 2008, p. 588.
  2. ↑ Gonzalo Tornaria, Square roots modulo pШаблон:Недоступная ссылка, page 2.
  3. ↑ Шаблон:Citation
  4. ↑ Шаблон:Citation
  5. ↑ L. M. Adleman, K. Manders, G. Miller: 1977, "On taking roots in finite fields". In: 18th IEEE Symposium on Foundations of Computer Science. p. 175–177.