Это не официальный сайт wikipedia.org 01.01.2023

Алгоритмы быстрого возведения в степень — Википедия

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

(перенаправлено с «Алгоритм быстрого возведения в степень»)

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

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

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

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

ОписаниеПравить

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

Пусть

n = ( m k m k 1 . . . m 1 m 0 ¯ ) 2   — двоичное представление степени n, то есть,
n = m k 2 k + m k 1 2 k 1 + + m 1 2 + m 0 ,  

где m k = 1 , m i { 0 , 1 }  . Тогда

x n = x ( ( ( ( m k 2 + m k 1 ) 2 + m k 2 ) 2 + ) 2 + m 1 ) 2 + m 0 = ( ( ( ( ( x m k ) 2 x m k 1 ) 2 ) 2 x m 1 ) 2 x m 0  [5].

Последовательность действий при использовании данной схемы можно описать так:

  1. Представить показатель степени n в двоичном виде
  2. Если m i   = 1, то текущий результат возводится в квадрат и затем умножается на x. Если m i   = 0, то текущий результат просто возводится в квадрат[6]. Индекс i изменяется от k-1 до 0[7].

Таким образом, алгоритм быстрого возведения в степень сводится к мультипликативному аналогу схемы Горнера[6]:

{ s 1 = x s i + 1 = s i 2 x m k i i = 1 , 2 , , k } .  

ОбобщенияПравить

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

a n = { a n = 1 a ( a n 1 ) n > 1  

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

Примеры решения задачПравить

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

13 10 = 1101 2  
m 3 = 1 , m 2 = 1 , m 1 = 0 , m 0 = 1  
21 13 = ( ( ( 1 21 m 3 ) 2 21 m 2 ) 2 21 m 1 ) 2 21 m 0 = ( ( ( 1 21 1 ) 2 21 1 ) 2 21 0 ) 2 21 1 = ( ( ( 1 21 ) 2 21 ) 2 1 ) 2 21 = ( ( 21 2 21 ) 2 ) 2 21 = ( ( 441 21 ) 2 ) 2 21 = 85766121 2 21 = 154472377739119461  

Схема «справа налево»Править

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

Последовательность действий при реализации данного алгоритма.

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

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

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

d = a n =  
= a i = 0 k m i 2 i =  
= a m 0 a 2 m 1 a 2 2 m 2 . . . a 2 k m k =  
= a m 0 ( a 2 ) m 1 ( a 2 2 ) m 2 . . . ( a 2 k ) m k =  
= i = 0 k ( a 2 i ) m i  [9].

Пример. Посчитаем с помощью схемы возведения в степень «справа налево» значение 2113.

i 0 1 2 3
a 2 i   21 441 194 481 37 822 859 361
m i   1 0 1 1
  1. 21 · 194 481 = 4084 101
  2. 4084 101 · 37 822 859 361 = 154 472 377 739 119 461

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

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

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

Для сравнения, при стандартном способе возведения в степень требуется n 1   операция умножения, то есть количество операций может быть оценено как O ( n )  [10].

Оптимизация алгоритмаПравить

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

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

Рассмотрим метод окна.

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

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

Ещё более эффективным является метод скользящего окна. Он заключается в том, что ширина окна во время выполнения процесса может изменяться:

  1. Показатель степени представляется в виде n = i = 0 l n i 2 e i  , где n i ( 1 , 3 , 5 , . . . , 2 w 1 )  , а ei+1 — eiw.
  2. Для i = ( 1 , 3 , 5 , . . . , 2 w 1 )   вычисляется xi. Далее будем обозначать xi как xi.
  3. Пусть y — переменная, в которой будет вычислен конечный результат. Положим y = x n l  .
  4. Для всех i = l — 1, l — 2, …, 0 выполнить следующие действия:
    1. Для всех j от 0 до ei+1 — ei — 1 y возвести в квадрат
    2. j = m i  
    3. y = y x j  
  5. Для всех j от 0 до e0 — 1 y возвести в квадрат[8].

Количество операций возведения в степень в данном алгоритме такое же, как и в методе окна, а вот количество операций умножений сократилось до l, то есть до k w + 1   в среднем[8].

Для примера возведём методом скользящего окна число x в степень 215. Ширина окна w = 3.

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

ПрименениеПравить

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

См. такжеПравить

ПримечанияПравить

ЛитератураПравить