質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

6292閲覧

PHPでの大きな数値の扱い、「BC Math 関数」で扱える範囲

miu_ras

総合スコア902

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

4クリップ

投稿2015/05/21 04:16

編集2015/05/21 08:53

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")」ですでに桁あふれが起こっていたようです。

PHP: bcpowmod - Manualを見ると

2 つの文は機能的に同じです。しかし bcpowmod() バージョンのほうが実行時間が早いうえ、 より大きな値の計算が可能です。

とあります。

bcpowだと簡単に桁あふれしてしまうし、ドキュメントを読んでも「bcpowmod() バージョンのほうが実行時間が早いうえ、 より大きな値の計算が可能です」とはありますが、そもそもbcpowがどの程度の数を扱えるのか記述が無い上に、「より大きな」と抽象的な比較をされても具体的なことがわかるはずがありません。

質問は以下です。
(1)bcpow, bcpowmodで扱える値の範囲はどの程度なのか
(1-2)その他の「BC Math 関数」の扱える範囲に関しても出来れば
(3)OSやPHPのバージョンによって異なるのか
(4)どこかに情報はないか
(5)「BC Math 関数」より大きな数値を扱えるライブラリ等はないか

よろしくお願いします。

aaaaaaaa👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

回答がつかないようなので閉じます。

途中まで試した感じですと、bcpowは第2引数が11桁で桁あふれ、10桁でサーバーが長時間高負荷がかかる状態になりました。待てば結果を返したのかもしれませんが数十秒以上かかったため、サーバーの再起動を繰り返していました。で、あきれ心折れ詳しく調べることをあきらめました。

なので「bcpowは本当に作りに問題があり実質使い物にならないということがはっきりと確認できました。

一方bcpowmodは100桁でも高速に計算するし桁あふれもしませんでした。

投稿2015/05/24 06:31

miu_ras

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

BC Math はよく知りませんが、scale というものがあるようで、bcscale() 関数で指定できるようです。指定したら何か変わるかもしれません。
GMP も用意されています。C++ から GMP を触って、桁数の面で不自由したことはありません。GMP を使ってみてはいかがでしょうか。

投稿2015/05/24 06:58

takotakot

総合スコア1111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miu_ras

2015/05/26 21:20

[PHP: bcpow - Manual](http://php.net/manual/ja/function.bcpow.php) scale:このオプションパラメータを使用して、 結果の小数点以下の桁数を指定します。 なので、scaleは小数の桁数の話です。整数部分の桁数とは無関係です。 GMPは知りませんでした。有用な情報ありがとうございました。 [PHP: GMP - Manual](http://php.net/manual/ja/book.gmp.php) 取り扱える桁数は、bcpowとgmp_powではさほど変わりはなさそうです。大きすぎると桁あふれして、正常に1を返しているように見えてしまう点も。ただしgmp_powは、桁あふれする手前では、きちんとエラーをはいて終了するので、サーバーの再起動を繰り返すということはしないで済み、こちらの方がよさそうです。 ただし、php.iniを編集してモジュールを有効にしなければならない点は若干マイナスですが、面白そうな関数がいろいろあるのでそれも試してみようと思います。 ありがとうございました
takotakot

2015/05/27 01:02

失礼、100桁程度ですね。そのくらい行くとエラーが出るんですね。覚えておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問