PHPでは大きな数値を扱いたい場合には「BC Math 関数」を使えという事になっています。
が、「BC Math 関数」でも比較的簡単に桁あふれしてしまいました。
(分かる人にはわかると思いますがフェルマーテストの実装をしようとしています)
lang
1echo bcmod(bcpow("2", bcsub("132170943523", "1")), "132170943523") . "<br>";
フェルマーの小定理 - Wikipedia
![イメージ説明]WIDTH:164
aを最小の2としていてかつ、たった12桁の数値の判定も出来ないようでは使用に耐えられません。「PHPの標準ルマーテストは実装できないのか」と一瞬絶望しました。ちなみにJavaScriptのライブラリでは50桁の判定も出来るものもありました。
しかしこれについては、一応以下にすることで計算出来ました。
lang
1echo bcpowmod("2", bcsub("132170943523", "1"), "132170943523") . "<br>";
bcpowだと「bcpow("2", "132170943523")」ですでに桁あふれが起こっていたようです。
2 つの文は機能的に同じです。しかし bcpowmod() バージョンのほうが実行時間が早いうえ、 より大きな値の計算が可能です。
とあります。
bcpowだと簡単に桁あふれしてしまうし、ドキュメントを読んでも「bcpowmod() バージョンのほうが実行時間が早いうえ、 より大きな値の計算が可能です」とはありますが、そもそもbcpowがどの程度の数を扱えるのか記述が無い上に、「より大きな」と抽象的な比較をされても具体的なことがわかるはずがありません。
質問は以下です。
(1)bcpow, bcpowmodで扱える値の範囲はどの程度なのか
(1-2)その他の「BC Math 関数」の扱える範囲に関しても出来れば
(3)OSやPHPのバージョンによって異なるのか
(4)どこかに情報はないか
(5)「BC Math 関数」より大きな数値を扱えるライブラリ等はないか
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。