Алгоритмы быстрого возведения в степень по модулю

Материал из testwiki
Версия от 12:59, 4 октября 2024; 188.191.190.246 (обсуждение) (Описание метода)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Алгоритмы быстрого возведения в степень по модулю — разновидность алгоритмов возведения в степень по модулю, широко использующихся в различных криптосистемах, для ускорения вычислительных операций с большими числами.

Метод с использованием Китайской теоремы об остатках

Шаблон:Main

Описание метода

Шаблон:Mainref Пусть требуется вычислить S=xamodn, где числа x,a,n достаточно большие и пусть модуль может быть разложен на простые делители n=p1p2...pj. Тогда для быстрого возведения в степень по модулю можно воспользоваться китайской теоремой об остатках и решить систему уравнений (предварительно посчитав вычеты xari(modpi) с использованием теоремы Ферма, где i=1,2,...,j):

{xar1(modp1),0r1<p1xar2(modp2),0r2<p2............xarj(modpj),0rj<pj

Заменив xa на t для удобства, решаем систему относительно t и получаем S.

Шаблон:Hider

Применение

Шаблон:Mainref Значительный выигрыш от данного алгоритма можно получить при выполнении умножения. Умножение будет проводится в два раза быстрее при использовании данного алгоритма.

Вычислительная сложность

Шаблон:Mainref Данный метод позволяет сократить количество вычислений в 34 раза. Пусть a имеет длину k бит. При обычном возведении в степень затратится около 3k/2 умножений по модулю. Пусть мы хотим вычислить (xamodp,xamodq). Сокращая a на p1 и q1 задача сводится к вычислению (xamod(p1)modp,xamod(q1)modq). Каждая степень в данной записи имеет длину k/2. Поэтому каждая операция возведения в степень потребует 3k/4 операций. Итого потребуется 23k/4=3k/2 умножений по модулю простого числа p или q вместо изначального умножения по модулю n.

Метод повторяющихся возведения в квадрат и умножения

Шаблон:Main

Пример блок-схемы метода повторяющихся возведения в квадрат и умножения

Описание метода

Шаблон:Mainref Пусть требуется вычислить xamodn. Представим степень a=aj12j1+aj22j2+...+a222+a121+a0, где aj=(0,1)

Представим xamodn в виде:

xamodn=xaj12j1+aj22j2+...+a222+a121+a0modn=

=(x2)aj12j2+aj22j3+...+a120xa0modn=

=((x2)2)aj12j3+aj22j4+...+a220(x2)a1xa0modn=

=(...((x2)2...)2)aj1...(x8)a3(x4)a2(x2)a1xa0modn

Далее высчитывается значение выражения x2modn и проводится замена в преобразованном выражении.

Данная операция производится до тех пор пока не будет найден результат.

Шаблон:Hider

Применение

Шаблон:Mainref Если n — простое или является произведением двух больших простых чисел, то обычно используют метод повторяющихся возведения в квадрат и умножения. Однако, если n — составное, то обычно используют это метод вместе с китайской теоремой об остатках.

Вычислительная сложность

Шаблон:Mainref Средняя сложность данного алгоритма равна 1,5a операций умножения двух a-битовых чисел плюс 1,5a операций деления 2a-битовых чисел на a-битовое число. Для 1000-битовых и более длинных чисел данный алгоритм выполняется на ЭВМ достаточно быстро.

Метод Монтгомери возведения в степень

Шаблон:Main

История

Шаблон:Mainref Данный метод был предложен 1985 году Питером Монтгомери для ускорения выполнения модульного возведения в степень.

Описание метода

Шаблон:Mainref В этом методе каждому числу x ставится в соответствие некоторый образ F(x) и все вычисления производятся с F(x), а в конце производится переход от образа к числу.

Шаблон:Рамка Теорема(Монтгомери).

Пусть N,R — взаимно простые положительные целые числа, а N=(N1)modR. Тогда для любого целого x число y=x+N((xN)modR) делится на R, причем y/RxR1(modN). Более того, если 0x<RN, то разность y/R((xR1)modN) равна либо 0, либо N. Шаблон:Конец рамки

Данная теорема позволяет вычислить оптимальным способом величину (xR1)modN для некоторого удобно выбранного R.

Шаблон:Рамка Определение 1. Для чисел R , N , x , таких что НОД(R,N)=1 и 0x<N, назовем (R,N) — остатком числа x величину x=(xR)modN. Шаблон:Конец рамки

Шаблон:Рамка Определение 2. Произведением Монтгомери двух целых чисел a , b называется число M(a,b)=abR1modN Шаблон:Конец рамки

Шаблон:Рамка Теорема (правила Монтгомери). Пусть числа R , N взаимно просты, и 0a,b<N. Тогда amodN=M(a,1) и M(a,b)=ab Шаблон:Конец рамки

То есть, для наглядности, запишем выражение для возведения x в 3 степень: M(M(M(x,x),x),1)=x3modN

Шаблон:Рамка Алгоритм(Произведение Монтгомери). Пусть заданы целые числа 0c,d<N, где N нечетно, а R=2s>N. Этот алгоритм возвращает M(c,d).

1.[Функция M Монтгомери]
M(c,d){
x=cd;
z=y/z;
//В соответствии с теоремой(Монтгомери).
2.[Поправить результат]
if (zN)z=zN;
return z;
}

Шаблон:Конец рамки

Шаблон:Рамка Алгоритм(Метод Монтгомери возведения в степень). Пусть заданы числа 0x<N, y>0, и R выбрано так же, как для алгоритма(Произведение Монтгомери). Этот алгоритм возвращает xymodN. Через (y0,...,yD1) мы обозначаем двоичные биты y.

1.[Начальная установка]
x=(xR)modN;
//С помощью какого-либо метода деления с остатком.
p=RmodN;
//С помощью какого-либо метода деления с остатком.
2.[Схема возведения в степень]
for (D1j0){
p=M(p,p);
//с помощью алгоритма(произведение Монтгомери).
if (yi==1)p=M(p,x);
}
//Теперь p равняется xy.
3.[Окончательное получение степени]
M(p,1);

Шаблон:Конец рамки

В итоге получаем образ x=xRmodN, от которого мы можем получить конечный результат x=xR1modN, причем выражение R1modN вычислено заранее. Для произведения двух чисел результат будет выглядеть как z=zR1modN=xyR1modNxy(xy(N1modR)modR)NRmodN

Шаблон:Hider

Применение

Шаблон:Mainref Данный метод дает выигрыш в производительности по сравнению с методом повторяющихся возведения в квадрат и умножения, так как умножение двух чисел по модулю происходит значительно быстрее.

Вычислительная сложность

Шаблон:Mainref Данный метод позволяет уменьшить (при больших значения N) вычисления функции mod до одного умножения двух чисел размером N. Сложность умножения Монтгомери оценивается как O(n2).

Алгоритм с использованием «школьного» метода

Описание метода

Шаблон:Mainref Для наглядности рассмотрим метод для основания B=2, то есть будем проводить вычисления в B — ичной (или двоичной, так как B=2) системе счисления. Основание B=2 имеет плюс, в том что выполнение операции деления на 2 происходит сдвигом вправо, а умножение на 2 — сдвигом влево.

Шаблон:Рамка Определение 1. Представлением неотрицательного целого числа x в системе счисления с основанием B (или B-ичной записью числа x) называется кратчайшая последовательность целых чисел (xi), называемых цифрами записи, такая что каждая из этих цифр удовлетворяет неравенству 0xi<B, и выполнено равенство x=i=0D1xiBi Шаблон:Конец рамки

Для примера, рассмотрим двоичный алгоритм взятия mod от произведения xy.

Шаблон:Рамка Алгоритм (двоичный алгоритм умножения и взятия остатка). Пусть заданы положительные целые числа x, y такие что 0x,y<N. Этот алгоритм возвращает результат составной операции (xy)modN. Мы предполагаем, что задано двоичное представление числа x согласно определению 1, так что биты числа x имеют вид (x0,...,xD1), и xD1>0 — самый старший бит.

1.[Начальная установка]
s=0;
2.[Преобразовать все D битов]
for (D1j0) {
s=2s;
if (sN)s=sN;
if (xj==1)s=s+y;
if (sN)s=sN;
}
return s;

Шаблон:Конец рамки

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

Вычислительная сложность «школьного» метода

Шаблон:Mainref Выражения вида ab(modn) имеет оценку вычислительной сложности — Os((logn)3)

См. также

Примечания

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

Литература

Шаблон:Rq