Швидке піднесення до степеня – це алгоритм, який дозволяє піднести до натурального степеня будь яке число, за скорочену кількість множень.
Опис алгоритму
Для будь-якого числа x та парного степеня n виконується рівність:
xn = (xn/2)2 = xn/2 ⋅ xn/2
Це і є основою алгоритму швидкого піднесення до степеню. Оскільки таке розбиття дозволяє за одну операцію множення зменшити степінь в два рази.
Для випадку непарної степені, достатньо зменшити її на одиницю:
xn = xn - 1 ⋅ x, при цьому (n - 1) парне число.
Рекурсивна реалізація швидкого піднесення до степеню
static long Power(long x, int n)
{
if (n == 0)
{
return 1;
}
if (n % 2 == 0)
{
var p = Power(x, n / 2);
return p * p;
}
else
{
return x * Power(x, n - 1);
}
}
Для оптимізації можна замінити перевірку на парність та ділення на 2 бітовими операціями:
static long Power(long x, int n)
{
if (n == 0)
{
return 1;
}
//у парного числа останній біт рівний нулю
if ((n & 1) == 0)
{
//зміщення на один біт вправо рівнозначно діленню на два
var p = Power(x, n >> 1);
return p * p;
}
else
{
return x * Power(x, n - 1);
}
}
Ітераційна реалізація
В цьому методі, швидкого піднесення до степеню, також використаємо оптимізацію перевірки парності та ділення на два:
static long Power(long x, int n)
{
var result = 1L;
while (n > 0)
{
if ((n & 1) == 0)
{
x *= x;
n >>= 1;
}
else
{
result *= x;
--n;
}
}
return result;
}