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

次のようにbcpowmod関数を使用できます。

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

結果は8849802353、17^2147482999 mod 10000000000 または、17^2147482999 の最後の 10 桁が 8849802353 であることを意味します。

于 2011-06-08T06:04:23.847 に答える
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 に答える
1

GNU Multiple Precision、つまりgmp_powが探しているものかもしれません。

于 2011-06-08T06:09:30.097 に答える
0

BigIntegerを調べることをお勧めします。定数PHP_INT_MAXは、プラットフォームが処理できる整数の大きさを示します。64ビットでは、これは9223372036854775807を返しますが、10進表記の結果にはほど遠いです。

于 2011-06-08T05:50:56.237 に答える
0

アルゴリズムを変更して、(データ型として)数値を操作する代わりに、プレーンな文字列を操作してみてください。それを計算するには多くの時間がかかりますが、達成可能です:)

于 2011-06-08T06:03:26.813 に答える