开发者

Power function in php to calculate 17^2147482999

I am trying to make a power function to calculate the power of 17^2147482999. I tried this code:

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; 
} 

The function call:

echo ipow($a, $b);

The error:

Fatal error: Maximum function nest开发者_如何学Pythoning level of '100' reached, aborting! in C:\wamp\www\spoj\LASTDIG.php on line 23

Is there any other way to calculate the power for such big values? The inbuilt pow() function is giving an INF output.

UPDATE

If it seems impossible to get the whole answer, is it possible to extract atleast the last 5-10 digits of the answer by some mathematical approach?


You cannot do that with plain PHP arithemtic operations. That's way out of range for integers, even on 64-bit systems.

You need to use the bcmath extension and the bcpow function. (If that doesn't work maybe even gmp.)

 print bcpow(17, 2147482999);


You may use bcpowmod function like this:

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

the result is 8849802353 which means, 17^2147482999 mod 10000000000 or, the last 10 digits of 17^2147482999 is 8849802353.


The resulting value is something in the order of 1e+2642368139, a lot more than can fit in most libraries. If you want some approximation, you can use some logarithmic logic:

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 and namely gmp_pow may be what you are looking for.


I suggest you look into BigInteger, the constant PHP_INT_MAX will tell you how big an integer your platform can handle. On 64 bit this returns 9223372036854775807, wich is far from for your result in decimal notation.


Try to change the algorithm and instead of working with numbers (as the data type) ... work with plain strings. It will take a lot of time to compute it but it will be achievable :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜