Алгоритм Чиполлы

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

Алгоритм Чиполлы — это техника решения конгруэнтного уравнения вида

x2≡n(modp),

где x,n∈𝐅p, так что n будет квадратом числа x, и где p является нечётным простым числом. Здесь 𝐅p обозначает конечное поле с p элементами {0,1,…,p−1}. Алгоритм носит имя итальянского математика Шаблон:Не переведено 5, открывшего метод в 1907.

Алгоритм

Вход:

  • p, нечётное простое число,
  • n∈𝐅p, квадрат числа.

Выход:

  • число x∈𝐅p, удовлетворяющее равенству x2=n.

Шаг 1. Находим число a∈𝐅p, такое, что a2−n не является квадратом. Алгоритм для поиска таких чисел a неизвестен, за исключением метода проб и ошибок. Просто выбираем какое-либо число a и вычисляем символ Лежандра (a2−n|p), чтобы удостовериться, что a удовлетворяет условию. Шанс, что случайное число a подходит, равен (p−1)/2p. Если p достаточно велико, эта величина примерно равна 1/2Шаблон:Sfn. Таким образом, ожидаемое число попыток для получения подходящего a равно 2.

Шаг 2. Получаем x путём вычисления x=(a+a2−n)(p+1)/2 в поле 𝐅p2=𝐅p(a2−n). Это число x будет одним из корней уравнения x2=n.

Если x2=n, то (−x)2=n также выполняется. Поскольку p нечётно, x≠−x, так что для найденного решения x всегда существует второе решение, равное -x.

Пример

(Замечание: Все элементы до второго шага принадлежат полю 𝐅13, а все элементы второго шага — полю 𝐅132). Ищем число x, такое, что x2=10.

Прежде чем применять алгоритм, нужно проверить, что число 10 является на самом деле квадратом в поле 𝐅13, что означает, что символ Лежандра (10|13) должен быть равен 1. Проверить это можно с помощью критерия Эйлера: (10|13)≡106≡1mod13. Это подтверждает, что 10 является квадратом и к нему можно применить алгоритм.

  • Шаг 1: Находим число a, такое что a2−n не является квадратом. Как было указано выше, нужно использовать метод проб и ошибок. Выберем число a=2, для него a2−n буде равно 7. Символ Лежандра (7|13) равен -1, что можно опять получить с помощью критерия Эйлера, 76=3432≡52≡25≡−1mod13. Таким образом, число a=2 подходит.
  • Шаг 2: Вычисляем x=(a+a2−n)(p+1)/2=(2+−6)7.
(2+−6)2=4+4−6−6=−2+4−6.
(2+−6)4=(−2+4−6)2=−1−3−6.
(2+−6)6=(−2+4−6)(−1−3−6)=9+2−6.
(2+−6)7=(9+2−6)(2+−6)=6.

Таким образом, x=6 является решением, как и x=−6mod13=(−6+13)mod13=7. Действительно,  62=36mod13=10 и 72=49mod13=10.

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

В первой части доказательства убедимся, что 𝐅p2=𝐅p(a2−n)={x+ya2−n:x,y∈𝐅p} действительно является полем. Для простоты выкладок введём число ω, равное a2−n. Конечно, a2−n не является квадратичным вычетом, так что квадратный корень не существует в 𝐅p. Это ω, грубо говоря, можно рассматривать как аналог комплексного числа i. Арифметика поля вполне очевидна. Сложение определяется как

(x1+y1ω)+(x2+y2ω)=(x1+x2)+(y1+y2)ω.

Умножение также определяется обычным путём. Если помнить, что ω2=a2−n, получим

(x1+y1ω)(x2+y2ω)=x1x2+x1y2ω+y1x2ω+y1y2ω2
=(x1x2+y1y2(a2−n))+(x1y2+y1x2)ω.

Теперь нужно проверить свойства поля. Замкнутость по операциям сложения и умножения, ассоциативность, коммутативность и дистрибутивность легко проверить, поскольку поле 𝐅p2 похоже на поле комплексных чисел (где ω служит аналогом i).
Нейтральным элементом по сложению служит 0 или, более формально, 0+0ω — если α∈𝐅p2, то

α+0=(x+yω)+(0+0ω)=(x+0)+(y+0)ω=x+yω=α.

Нейтральным элементом по умножению служит 1, точнее 1+0ω:

α⋅1=(x+yω)(1+0ω)=(x⋅1+0⋅y(a2−n))+(x⋅0+1⋅y)ω=x+yω=α.

Осталось проверить только, что в 𝐅p2 существуют обратные элементы по сложению и умножению. Легко видеть, что обратным элементом по сложению числа x+yω является число −x−yω, которое также содержится в поле 𝐅p2, поскольку −x,−y∈𝐅p. Чтобы показать, что любой ненулевой элемент α имеет обратный по умножению элемент, выпишем представления α=x1+y1ω и α−1=x2+y2ω. Другими словами,

(x1+y1ω)(x2+y2ω)=(x1x2+y1y2(n2−a))+(x1y2+y1x2)ω=1.

Получаем два уравнения, x1x2+y1y2(n2−a)=1 и x1y2+y1x2=0. Решаем эту систему относительно x2 и y2, получим

x2=−y1−1x1(y1(n2−a)−x12y1−1)−1,
y2=(y1(n2−a)−x12y1−1)−1.

Обратные элементы в выражениях для x2 и y2 существуют, поскольку они являются элементами поля 𝐅p. Тем самым мы завершаем первую часть доказательства.

Во второй части доказательства покажем, что для любого элемента x+yω∈𝐅p2:(x+yω)p=x−yω. По определению ω2=a2−n не является квадратом в 𝐅p. Тогда критерий Эйлера даёт

ωp−1=(ω2)p−12=−1.

Таким образом, ωp=−ω. Это, вместе с малой теоремой Ферма (утверждающей, что xp=x для всех x∈𝐅p) и знанием, что в полях с характеристикой p, выполняется равенство (a+b)p=ap+bp, показывает желаемый результат

(x+yω)p=xp+ypωp=x−yω.

Третья и последняя часть доказательства показывает, что в случае x0=(a+ω)p+12∈𝐅p2 выполняется x02=n∈𝐅p.
Вычисляем

x02=(a+ω)p+1=(a+ω)(a+ω)p=(a+ω)(a−ω)=a2−ω2=a2−(a2−n)=n.

Заметим, что эти вычисления имеют место в 𝐅p2, так что x0∈𝐅p2. Теорема Лагранжа утверждает, что ненулевой многочлен степени n имеет не более n корней над полем K. Если учесть, что многочлен x2−n имеет 2 корня в 𝐅p, никаких других корней быть не может 𝐅p2. Было показано, что x0 и −x0 являются корнями многочлена x2−n в 𝐅p2, так что должно выполняться x0,−x0∈𝐅p.[1]

Скорость

После нахождения подходящего a число операций, требуемых алгоритмом, составляет 4m+2k−4 умножений и 4m−2 сложений, где m — число знаков в двоичном представлении числа p, а k — число единиц в этом представлении. Чтобы найти a методом проб и ошибок, ожидаемое число вычислений символа Лежандра равно 2. Однако может посчастливиться с первого раза, но может потребоваться и более 2 попыток. В поле 𝐅p2 выполняются следующие два равенства

(x+yω)2=(x2+y2ω2)+((x+y)2−x2−y2)ω,

где ω2=a2−n заранее известно. Это вычисление требует 4 умножения и 4 сложения.

(x+yω)2(c+ω)=(cd−b(x+d))+(d2−by)ω,

где d=(x+yc) and b=ny. Эта операция требует 6 умножений и 4 сложения.

Если предположить, что p≡1(mod4), (в случае p≡3(mod4), прямое вычисление x≡±np+14 много быстрее) двоичное выражение (p+1)/2 имеет m−1 знаков, из которых k равны единице. Таким образом, для вычисления (p+1)/2-ой степени числа (a+ω) первую формулу нужно применить n−k−1 раз, а вторую — k−1 раз.

Алгоритм Чиполлы лучше, чем алгоритм Тонелли — Шенкса тогда и только тогда, когда S(S−1)>8m+20, где 2S максимальная степень 2, на которую делится p−1 [2].

Примечания

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

Литература

Шаблон:Refbegin

Шаблон:Refend

Ссылки

  • E. Bach, J.O. Shallit Algorithmic Number Theory: Efficient algorithms MIT Press, (1996)

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

Шаблон:Rq