3

我正在尝试制作一个幂函数来计算 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 位数字?

4

6 回答 6

4

你不能用普通的 PHP 算术运算来做到这一点。这超出了整数的范围,即使在 64 位系统上也是如此。

您需要使用 bcmath 扩展和bcpow函数。(如果这不起作用,甚至可能gmp。)

 print bcpow(17, 2147482999);
于 2011-06-08T05:39:17.630 回答
3

结果值大约为 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
于 2011-06-08T05:45:21.000 回答
3

您可以像这样使用bcpowmod函数:

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

结果是884980235317^2147482999 mod 10000000000 或者 17^2147482999 的最后 10 位数字是 8849802353。

于 2011-06-08T06:04:23.847 回答
1

GNU Multiple Precision,即gmp_pow可能是您正在寻找的。

于 2011-06-08T06:09:30.097 回答
0

我建议您查看BigInteger,常量 PHP_INT_MAX 将告诉您您的平台可以处理多大的整数。在 64 位上,这将返回 9223372036854775807,这与十进制表示法的结果相去甚远。

于 2011-06-08T05:50:56.237 回答
0

尝试更改算法,而不是使用数字(作为数据类型)......使用纯字符串。计算它需要很多时间,但它是可以实现的:)

于 2011-06-08T06:03:26.813 回答