Возведение вычетов в степень методом повторного возведения в квадрат
Основным действием, которое наиболее часто приходится выполнять в модулярной арифметики является отыскание значения .
Методы решения этой задачи позволяют получать ответ за конечное число шагов при различных временных затратах. Помимо тривиального метода непосредственного возведения в степень, существует более эффективные алгоритмы, основывающиеся на использовании китайской теоремы об остатках или теоремы Эйлера.
Существует и другой достаточно эффективный метод, основывающийся на мультипликативности вычетов и называемый методом повторного возведения в квадрат.
В дальнейшем будем предполагать, что b<m и что, вычислив произведение, мы его тут же приводим по модулю m. В таком случае во всех операциях мы будем оперировать величинами, не превышающими m2.
В этих условиях рассмотрим следующую последовательность действий.
Используем символ a для обозначения промежуточного результата умножения. В конце работы алгоритма a примет значение наименьшего неотрицательного вычета .
В начале положим a=1. Пусть n0 n1 n2…nk-2 nk-1 –цифры двоичной записи числа n.
То есть каждое nj равно либо 1, либо 0.
Если n0=1, заменим a на b, в противном случае оставим a=1.
Возведем b в квадрат: .
Если n1=1, то умножаем a на b1 и приводим его по модулю m
Возведем b1 в квадрат: .
Если n2=1, то умножаем a на b2 и приводим его по модулю m
Продолжая в дальнейшем выполнять действия по приведенному правилу, на j-том шаге мы получим: . Если nj=1, то есть если входит в двоичное представление числа n, используем bj как множитель для вычисления нового значения a и не делаем этого при nj=0.
Легко убедится, что после k-1 шага получим . Причем общее число шагов, необходимых для работы алгоритма k-1.
Справедлив вопрос о числе двоичных операций, необходимых для решения поставленной задачи с использованием данного алгоритма.
На каждом шаге мы проводили одно или два умножения для чисел, не превосходящих значения m2. При общем числе шагов К-1 и числе двоичных операций на каждом шаге
O(log2m2)=O(log2m)
получаем следующую оценку.
Теорема 1.
Time(bn mod m) = O((logn)(log2m))
Рассмотрим вопрос о мультипликативность функции Эйлера, получим следующие достаточно важный результат.
Теорема 2.
Сумма функций Эйлера всех чисел d – делителей числа n.
Доказательство.
Обозначим через f(n) левую часть этого равенства. Требуется доказать, что f(n)=n. Покажем сначала, что функция f(n) мультипликативная, т.е.
f(m*n) = f(m) * f(n) <=> НОД(m, n) = 1
Заметим, что любой делитель d числа mn может быть единственным образом представлен в виде произведения d = d1 * d2, где d1|m d2|n
Т.к. НОД(d1, d2) = 1, то φ(d1* d2) = φ(d1) * φ(d2)
в силу мультипликативности функции Эйлера.
Таким образом получаем все возможные делители d числа mn, взяв все возможные делители d1 и d2 чисел m и n соответственно.
Таким образом
f(m * n) =
делители мультипликативные.
Теперь для доказательства теоремы предположим n = p1α1 * p2α2 * … * prαr есть разложение на простые множители.
Так как f – функция мультипликативная, то f(n) = Πf(piαi) ,
Поэтому достаточно доказать наше предположение для чисел pα, т.е. доказать, что f(pα) = pα
Т.к. все делители числа pα имеют вид pj , получаем
,
что доказывает справедливость теоремы.