Мне нужно вычислить 0 ^ j, 1 ^ j,..., k ^ j для некоторых очень больших k и j (оба порядка нескольких миллионов). Я использую GMP для обработки больших целых чисел (да, мне нужны целые числа, так как мне нужна полная точность). Теперь мне интересно, после того как я приложил усилия к вычислению n ^ j, нет ли способа ускорить вычисление (n + 1) ^ j вместо того, чтобы начинать с нуля?
Вот алгоритм, который я сейчас использую для вычисления мощности:
mpz_class pow(unsigned long int b, unsigned long int e)
{
mpz_class res = 1;
mpz_class m = b;
while(e)
{
if(e & 1)
{
res *= m;
}
e >>= 1;
m *= m;
}
return res;
}
Как видите, каждый раз я начинаю с нуля, и это занимает много времени.
5^2 = 4^2 + 3^2
›› Fibonacci , чтобы максимально сократить расчет - person Null   schedule 28.01.2017b^e = (b-1)^e + (b-2)^e
? - person Null   schedule 28.01.20175^2 * 4^2 + 3^2
, потому что(3, 4, 5)
— пифагорейская тройка.. - person Matteo Monti   schedule 28.01.2017pow()
в дополнение кb
иe
. Если бы это былоb**(e-1)
, это не выглядело бы скучно -? - person greybeard   schedule 28.01.2017b^(e - 1)
изb^e
, я согласен, что это было бы довольно просто, так как сводилось бы к делению наb
. Но моя проблема здесь заключается в вычислении(b - 1)^e
, показатель степени должен оставаться прежним. - person Matteo Monti   schedule 28.01.2017(b - 1)^e
можно было вычислить b^e, а как насчет (b-2)^e, …? Что будет доступно? Будет ли установлен фиксированный лимит на сумму ввода? Думаю, для любого фиксированногоj
/e
будут нетривиальные формулы в меньших степенях. - person greybeard   schedule 28.01.2017