Я пытаюсь сделать функцию власти, чтобы вычислить мощность 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, который далек от вашего результата в десятичной системе.
Попробуйте изменить алгоритм и вместо работы с числами (как тип данных) … работать с обычными строками. Это займет много времени, чтобы вычислить его, но это будет достижимо 🙂