Швидке піднесення до степеня

Матеріал з testwiki
Версія від 07:35, 8 вересня 2023, створена imported>Olvin
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Швидке піднесення до степеня — алгоритм піднесення числа x до натурального степеня n шляхом повторюваного зведення в квадрат та множення. Потребує суттєво меншої кількості множеньO(logn) —, ніж виконання цієї операції за безпосереднім визначенням степеня — O(n).

Опис

Нехай n=(mkmk1...m1m0)2двійкове представлення степеня n, тобто,

n=mk2k+mk12k1++m12+m0,

де mk=1,mi{0,1}. Тоді

xn=x((((mk2+mk1)2+mk2)2+)2+m1)2+m0=(((((xmk)2xmk1)2)2xm1)2xm0.

Таким чином, алгоритм повторюваного піднесення до квадрата зводиться до мультиплікативного аналогу схеми Горнера:

{s1=xsi+1=si2xmkii=1,2,,k}.

Приклад

Розглянемо обчислення 313. Двійкове представлення 13 — (1101)2, отже 8+4+1=13.

31 3
32 9=3×3
34 81=9×9
38 6561=81×81

Для обчислення кожного рядка починаючи з другого потрібне одне множення (загалом — три операції множення).

Ще дві операції множення потрібні для обчислення остаточного результату:

31×34×38=313=1594323

Загалом виходить п'ять множень (замість дванадцяти множень за безпосереднім визначенням степеня).

Обчислювальна складність

Кількість множень, необхідна для піднесення числа x до степеня n алгоритмом, визначається за формулою: H+2(E1), де H — кількість нулів, а E — кількість одиниць у двійковому записі числа n. Таким чином, кількість множень становить O(logn).

Наприклад, для піднесення до сотого степеня за цим алгоритмом потрібно лише 8 множень.

Оптимальність

Алгоритм не завжди найоптимальніший за кількістю множень: наприклад, піднесення до степеня n = 15 повторюваним піднесенням до квадрата потребує 6 множень, хоча результату можна досягти за 5:

x2=x×x
x3=x2×x
x6=x3×x3
x12=x6×x6
x15=x12×x3

Однак найоптимальніший шлях має таку ж оцінку складності, як і повторюване піднесення до квадрата (O(logn)), а ефективного алгоритму побудови найкоротшої послідовності обчислень у загальному випадку відомо не булоШаблон:Sfn.

Узагальнення

Нехай пара (S, *) — напівгрупа, тобто є S — довільна множина, на якій завдана двомісна операція * така, що:

  • Для будь-яких елементів a і b з S справедливо: (a * b) так же з S. (замкнутість)
  • Для будь-яких елементів a, b і c з S справедливо: ((a * b) * c) = (a * (b * c)). (асоціативність)

Ми можемо назвати операцію * множенням і визначити піднесення до натурального степеня:

an={an=1a*(an1)n>1

Для обчислення значень an можна застосовувати алгоритм повторюваного піднесення до квадрата.

Джерела

Шаблон:Reflist

Посилання

Шаблон:Алгоритми теорії чисел