четверг, 1 августа 2013 г.

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

Сегодня узнал красивый алгоритм возведения в степень. Образованным людям, наверное, это не интересно, но я поделюсь впечатлениями. Итак, мы хотим вычислить a^n. Представим n в следующем виде:
n = b[k] * 2^k + b[k-1] * 2^(k-1) + ... + b[0] * 2^0
Тогда:
a^n = a^(b[k] * 2^k + b[k-1] * 2^(k-1) + ... + b[0] * 2^0) =
  = a^(b[k] * 2^k) * a^(b[k-1] * 2^(k-1)) * ... * a^(b[0] * 2^0)
На основании чего получаем:
int Pow(int a, int p) {
    int res = 1;
    for (; p; p >>= 1, a *= a)
        if (p & 1)
            res *= a;
    return res;
}