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

Кроме того, некоторые алгоритмы для дальнейшей оптимизации используют тот факт, что операция возведения в квадрат быстрее операции умножения за счёт того, что при возведении в квадрат цифры в сомножителе повторяются.

Бинарный алгоритм возведения в степень был впервые предложен в XV веке персидским математиком Аль-Каши.

Данные алгоритмы не всегда оптимальны. Например, при использовании схемы «слева направо» быстрое возведение в степень n = 15 потребует выполнения трёх операций умножения и трёх операций возведения в квадрат, хотя возведение в 15-ю степень можно выполнить и за 3 умножения и 2 возведения в квадрат. Оптимальное возведение в степень соответствует построению кратчайшей аддитивной цепочки.

Описание Основным алгоритмом быстрого возведения в степень является схема «слева направо». Она получила своё название вследствие того, что биты показателя степени просматриваются слева направо, то есть от старшего к младшему.

Пусть

 — двоичное представление степени n, то есть,

где . Тогда .

Последовательность действий при использовании данной схемы можно описать так: Представить показатель степени n в двоичном виде Если = 1, то текущий результат возводится в квадрат и затем умножается на x. Если = 0, то текущий результат просто возводится в квадрат. Индекс i изменяется от k-1 до 0. Таким образом, алгоритм быстрого возведения в степень сводится к мультипликативному аналогу схемы Горнера:

Обобщения Пусть пара (S, *) — полугруппа, тогда мы можем назвать операцию * умножением и определить операцию возведения в натуральную степень:

Тогда для вычисления значений an в любой полугруппе (в абелевой группе в частности) можно использовать алгоритмы быстрого возведения в степень.

Примеры решения задач Применяя алгоритм, вычислим 2113:

Схема «справа налево» В данной схеме, в отличие от схемы «слева направо», биты показателя степени просматриваются от младшего к старшему.

Последовательность действий при реализации данного алгоритма. Представить показатель степени n в двоичном виде. Положить вспомогательную переменную z равной числу x. Если , то текущий результат умножается на z, а само число z возводится в квадрат. Если = 0, то требуется только возвести z в квадрат. При этом индекс i, в отличие от схемы слева направо, изменяется от 0 до k-1 включительно.

Данная схема содержит столько же умножений и возведений в квадрат, сколько и схема «слева направо». Однако несмотря на это, схема «слева направо» выгоднее схемы «справа налево», особенно в случае, если показатель степени содержит много единиц. Дело в том, что в схеме слева направо в операции result = result · x содержится постоянный множитель x. А для небольших x (что нередко бывает в тестах простоты) умножение будет быстрым. К примеру, для x = 2 мы можем операцию умножения заменить операцией сложения.

Математическое обоснование работы данного алгоритма можно представить следующей формулой:

.

Пример. Посчитаем с помощью схемы возведения в степень «справа налево» значение 2113. i012321441194 48137 822 859 3611011 21 · 194 481 = 4084 101 4084 101 · 37 822 859 361 = 154 472 377 739 119 461

Вычислительная сложность И для схемы «слева направо», и для схемы «справа налево» количество операций возведения в квадрат одинаково и равно k, где k — длина показателя степени n в битах, . Количество же требуемых операций умножения равно весу Хэмминга, то есть количеству ненулевых элементов в двоичной записи числа n. В среднем требуется операций умножения.

Например, для возведения числа в сотую степень этим алгоритмом потребуется всего лишь 8 операций умножения и возведения в квадрат.

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

Оптимизация алгоритма Как правило, операция возведения в квадрат выполняется быстрее операции умножения. Метод окон позволяет сократить количество операций умножения и, следовательно, сделать алгоритм возведения в степень более оптимальным.

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

Рассмотрим метод окна. Для заранее вычисляется xi Показатель степени представляется в следующем виде: , где Пусть y — переменная, в которой будет вычислен конечный результат. Положим . Для всех i = k/w — 1, k/w — 2, …, 0 выполнить следующие действия:

. В данном алгоритме требуется k возведений в квадрат, но число умножений в среднем сокращается до k/w.

Ещё более эффективным является метод скользящего окна. Он заключается в том, что ширина окна во время выполнения процесса может изменяться: Показатель степени представляется в виде , где , а ei+1 — ei ≥ w. Для вычисляется xi. Далее будем обозначать xi как xi. Пусть y — переменная, в которой будет вычислен конечный результат. Положим . Для всех i = l — 1, l — 2, …, 0 выполнить следующие действия: Для всех j от 0 до ei+1 — ei — 1 y возвести в квадрат

Для всех j от 0 до e0 — 1 y возвести в квадрат. Количество операций возведения в степень в данном алгоритме такое же, как и в методе окна, а вот количество операций умножений сократилось до l, то есть до в среднем.

Для примера возведём методом скользящего окна число x в степень 215. Ширина окна w = 3. 215 = 27 + 5 · 24 + 7 y = 1 y = y · x = x y 3 раза возводится в квадрат, так как на данном шаге e2 — e1 −1 = 7 — 4 — 1 = 2, а отсчёт ведётся с нуля, то есть y = y8 = x8 y = y · x5 = x13 y 4 раза возводится в квадрат, так как на данном шаге e1 — e0 −1 = 4 — 0 — 1 = 3, то есть y = y16= x208 y = y · x7 = x215

Применение Алгоритм быстрого возведения в степень получил широкое распространение в криптосистемах с открытым ключом. В частности, алгоритм применяется в протоколе RSA, схеме Эль-Гамаля и других криптографических алгоритмах.

См. также Возведение в степень по модулю Алгоритмы быстрого возведения в степень по модулю

Примечания

Литература

Категория:Теоретико-числовые алгоритмы