Степенная функция в php для расчета 17 ^ 2147482999 - PullRequest
3 голосов
/ 08 июня 2011

Я пытаюсь сделать степенную функцию для вычисления мощности 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 ]

4 голосов
/ 08 июня 2011

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

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

 print bcpow(17, 2147482999);
3 голосов
/ 08 июня 2011

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

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

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

3 голосов
/ 08 июня 2011

Полученное значение составляет порядка 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
1 голос
/ 08 июня 2011

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

0 голосов
/ 08 июня 2011

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

0 голосов
/ 08 июня 2011

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

...