Функция питания в php для вычисления 17 ^ 2147482999

Я пытаюсь сделать функцию власти, чтобы вычислить мощность 17 ^ 2147482999. Я пробовал этот код:

function ipow($a, $b) { if ($b<0) { echo "B must be a positive integer"; } if ($b==0) return 1; if ($a==0) return 0; if ($b%2==0) { return ipow($a*$a, $b/2); } else if ($b%2==1) { return $a*ipow($a*$a,$b/2); } return 0; } 

Вызов функции:

 echo ipow($a, $b); 

Ошибка:

 Fatal error: Maximum function nesting level of '100' reached, aborting! in C:\wamp\www\spoj\LASTDIG.php on line 23 

Есть ли другой способ вычислить мощность для таких больших значений? Встроенная функция pow() дает выход INF .

ОБНОВИТЬ

Если кажется невозможным получить весь ответ, можно ли извлечь хотя бы последние 5-10 цифр ответа некоторым математическим подходом?

Вы можете использовать функцию bcpowmod следующим образом:

 <?php echo bcpowmod(17,2147482999,10000000000); ?> 

результатом является 8849802353 что означает, 17 ^ 2147482999 mod 10000000000 или, последние 10 цифр 17 ^ 2147482999 составляет 8849802353.

Вы не можете сделать это с помощью простых арифметических операций PHP. Это выход за пределы диапазона для целых чисел, даже в 64-битных системах.

Вам нужно использовать расширение bcpow функцию bcpow . (Если это не работает, возможно, даже gmp .)

  print bcpow(17, 2147482999); 

Результирующее значение имеет значение порядка 1e + 2642368139, что намного больше, чем может поместиться в большинстве библиотек. Если вы хотите приблизиться, вы можете использовать некоторую логарифмическую логику:

 17^2147482999 = 10^(log(17^2147482999)) = 10^(2147482999 * log(17)) = 10^(2147482999 * 1.23045) = 10^(2642368139.79773) = 10^2642368139 * 10^0.79773 = 6.27669e+2642368139 

GNU Multiple Precision, а именно gmp_pow, может быть то, что вы ищете.

Я предлагаю вам заглянуть в BigInteger , постоянный PHP_INT_MAX расскажет вам, насколько велика целое число, которое может обрабатывать ваша платформа. На 64 бит это возвращает 9223372036854775807, который далек от вашего результата в десятичной системе.

Попробуйте изменить алгоритм и вместо работы с числами (как тип данных) … работать с обычными строками. Это займет много времени, чтобы вычислить его, но это будет достижимо 🙂