Функция питания в 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.

UPDATE

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

6 ответов

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

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


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

Вам нужно использовать расширение bcmath и 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, который далек от вашего результата в десятичной нотации.


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

licensed under cc by-sa 3.0 with attribution.