Вычисление по квадрату использует только умножения O (lg q ).
template <typename T>
T expt(T p, unsigned q)
{
T r(1);
while (q != 0) {
if (q % 2 == 1) { // q is odd
r *= p;
q--;
}
p *= p;
q /= 2;
}
return r;
}
Это должно работать на любом моноиде (T
, operator*
) где T
, построенный из 1
, является единичным элементом.Это включает все числовые типы.
Расширить это до signed q
очень просто: просто разделите единицу на результат выше для абсолютного значения q
(но, как обычно, будьте осторожны при вычислении абсолютного значения).