Алгоритмы быстрого возведения в степень (дихотомический алгоритм возведения в степень, бинарный алгоритм возведения в степень) — алгоритмы, предназначенные для возведения числа x {\displaystyle x} в натуральную степень n {\displaystyle n} за меньшее число умножений, чем это требуется в определении степени[1]. Многие из этих алгоритмов основаны на том, что для возведения числа x {\displaystyle x} в степень n {\displaystyle n} не обязательно перемножать число x {\displaystyle x} на само себя n {\displaystyle n} раз, а можно перемножать уже вычисленные степени. В частности, если n = 2 k {\displaystyle n=2^{k}} степень двойки, то для возведения в степень n {\displaystyle n} достаточно число возвести в квадрат k {\displaystyle k} раз, затратив при этом k {\displaystyle k} умножений вместо 2 k {\displaystyle 2^{k}} . Например, чтобы возвести число x {\displaystyle x} в восьмую степень, вместо выполнения семи умножений x ⋅ x ⋅ x ⋅ x ⋅ x ⋅ x ⋅ x ⋅ x {\displaystyle x\cdot x\cdot x\cdot x\cdot x\cdot x\cdot x\cdot x} можно возвести число в квадрат ( x 2 = x ⋅ x {\displaystyle x^{2}=x\cdot x} ), потом результат возвести ещё раз в квадрат и получить четвёртую степень ( x 4 = x 2 ⋅ x 2 {\displaystyle x^{4}=x^{2}\cdot x^{2}} ), и наконец результат ещё раз возвести в квадрат и получить ответ ( x 8 = x 4 ⋅ x 4 {\displaystyle x^{8}=x^{4}\cdot x^{4}} ).
Кроме того, некоторые алгоритмы для дальнейшей оптимизации используют тот факт, что операция возведения в квадрат быстрее операции умножения за счёт того, что при возведении в квадрат цифры в сомножителе повторяются[2].
Бинарный алгоритм возведения в степень был впервые предложен в XV веке персидским математиком Аль-Каши[3].
Данные алгоритмы не всегда оптимальны. Например, при использовании схемы «слева направо» быстрое возведение в степень n = 15 потребует выполнения трёх операций умножения и трёх операций возведения в квадрат, хотя возведение в 15-ю степень можно выполнить и за 3 умножения и 2 возведения в квадрат[4]. Оптимальное возведение в степень соответствует построению кратчайшей аддитивной цепочки.
Основным алгоритмом быстрого возведения в степень является схема «слева направо». Она получила своё название вследствие того, что биты показателя степени просматриваются слева направо, то есть от старшего к младшему[5].
Пусть
где m k = 1 , m i ∈ { 0 , 1 } {\displaystyle m_{k}=1,m_{i}\in \{0,1\}} . Тогда
Последовательность действий при использовании данной схемы можно описать так:
Таким образом, алгоритм быстрого возведения в степень сводится к мультипликативному аналогу схемы Горнера[6]:
Пусть пара (S, *) — полугруппа, тогда мы можем назвать операцию * умножением и определить операцию возведения в натуральную степень:
Тогда для вычисления значений an в любой полугруппе (в абелевой группе в частности) можно использовать алгоритмы быстрого возведения в степень[8].
Применяя алгоритм, вычислим 2113:
В данной схеме, в отличие от схемы «слева направо», биты показателя степени просматриваются от младшего к старшему[5].
Последовательность действий при реализации данного алгоритма.
Данная схема содержит столько же умножений и возведений в квадрат, сколько и схема «слева направо». Однако несмотря на это, схема «слева направо» выгоднее схемы «справа налево», особенно в случае, если показатель степени содержит много единиц. Дело в том, что в схеме слева направо в операции result = result · x содержится постоянный множитель x. А для небольших x (что нередко бывает в тестах простоты) умножение будет быстрым. К примеру, для x = 2 мы можем операцию умножения заменить операцией сложения[7].
Математическое обоснование работы данного алгоритма можно представить следующей формулой:
Пример. Посчитаем с помощью схемы возведения в степень «справа налево» значение 2113.
И для схемы «слева направо», и для схемы «справа налево» количество операций возведения в квадрат одинаково и равно k, где k — длина показателя степени n в битах, k ∼ ln n {\displaystyle k\sim \ln {n}} . Количество же требуемых операций умножения равно весу Хэмминга, то есть количеству ненулевых элементов в двоичной записи числа n. В среднем требуется 1 2 ⋅ ln n {\displaystyle {\frac {1}{2}}\cdot \ln {n}} операций умножения[6].
Например, для возведения числа в сотую степень этим алгоритмом потребуется всего лишь 8 операций умножения и возведения в квадрат[5].
Для сравнения, при стандартном способе возведения в степень требуется n − 1 {\displaystyle n-1} операция умножения, то есть количество операций может быть оценено как O ( n ) {\displaystyle O(n)} [10].
Как правило, операция возведения в квадрат выполняется быстрее операции умножения. Метод окон позволяет сократить количество операций умножения и, следовательно, сделать алгоритм возведения в степень более оптимальным[8].
Окно фактически представляет собой основание системы счисления[7]. Пусть w — ширина окна, то есть за один раз учитывается w знаков показателя.
Рассмотрим метод окна.
В данном алгоритме требуется k возведений в квадрат, но число умножений в среднем сокращается до k/w[8].
Ещё более эффективным является метод скользящего окна. Он заключается в том, что ширина окна во время выполнения процесса может изменяться:
Количество операций возведения в степень в данном алгоритме такое же, как и в методе окна, а вот количество операций умножений сократилось до l, то есть до k w + 1 {\displaystyle {\frac {k}{w+1}}} в среднем[8].
Для примера возведём методом скользящего окна число x в степень 215. Ширина окна w = 3.
Алгоритм быстрого возведения в степень получил широкое распространение в криптосистемах с открытым ключом. В частности, алгоритм применяется в протоколе RSA, схеме Эль-Гамаля и других криптографических алгоритмах[11].