Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ММЗИ / Лекции / Возведение вычетов в степень методом повторного возведения в квадрат

.doc
Скачиваний:
22
Добавлен:
11.04.2015
Размер:
48.13 Кб
Скачать

Возведение вычетов в степень методом повторного возведения в квадрат

Основным действием, которое наиболее часто приходится выполнять в модулярной арифметики является отыскание значения .

Методы решения этой задачи позволяют получать ответ за конечное число шагов при различных временных затратах. Помимо тривиального метода непосредственного возведения в степень, существует более эффективные алгоритмы, основывающиеся на использовании китайской теоремы об остатках или теоремы Эйлера.

Существует и другой достаточно эффективный метод, основывающийся на мультипликативности вычетов и называемый методом повторного возведения в квадрат.

В дальнейшем будем предполагать, что 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 , получаем

,

что доказывает справедливость теоремы.