PHPで円周率を求める

(1/1)
円周率
PHPで巨大素数の生成と判定」で紹介した GMP関数を使い、チュドノフスキーの公式を使って小数点以下数千桁の円周率を求める。PHPはコンパイラ型言語ではないが、数万桁程度であれば比較的短時間に計算できる。

目次

サンプル・プログラムの実行例

PHPで円周率を求める

サンプル・プログラム

圧縮ファイルの内容
pi.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pi.php 更新履歴
バージョン 更新日 内容
1.0.0 2024/06/30 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
1.5.0 2024/01/28 exitIfExceedVersion() 追加
1.4.2 2024/01/28 exitIfLessVersion() メッセージ修正
1.4.1 2023/09/30 コメントの訂正
1.4.0 2023/09/09 $_GET, $_POST参照をfilter_input()関数に置換
1.3.0 2023/07/11 roundFloat() 追加

準備:初期値など

  52: //表示幅(ピクセル)
  53: define('WIDTH', 600);
  54: 
  55: //Spinner - jQuery UI を使用するかどうか
  56: define('USESPINNER', TRUE);
  57: 
  58: //計算範囲
  59: define('MIN_DIGITS', 5);        //計算できる小数点以下の最小桁数
  60: define('MAX_DIGITS', 10000);    //計算できる小数点以下の最大桁数
  61: define('DEF_DIGITS', 100);      //小数点以下のデフォルト桁数

各種定数は変更可能である。
jQuery UI を使いたくなければ、USESPINNER を FALSE にする。
データ入力に関わる関数群 "pahooInputData.php" はinclude_pathが通ったディレクトリに配置すること。

解説:チュドノフスキーの公式を使って円周率を求める

チュドノフスキーの公式を使うと、級数展開部分は巨大整数の計算でクリアできるので、GMP関数が適用でき、計算速度の高速化が期待できる。最後に小数化する部分で、BCMath 任意精度数学関数を利用する。
チュドノフスキーの公式については「チュドノフスキーの公式 - C++ で円周率を計算する」をご覧いただきたい。

 191: /**
 192:  * チュドノフスキーの公式を使って円周率を求める.
 193:  * @param   int $digit 小数点以下の桁数
 194:  * @return  string 素数/NULL:取得失敗
 195: */
 196: function compPiChudnovsky($digits) {
 197:     //精度の設定
 198:     $scale = $digits + 10;  //指定桁数に余裕を持たせる
 199:     bcscale($scale);
 200: 
 201:     //初期値
 202:     $C = bcsqrt(10005, $scale);
 203:     $C = bcmul($C, 426880);
 204: 
 205:     $K = gmp_init(6);
 206:     $M = gmp_init(1);
 207:     $X = gmp_init(1);
 208:     $L = gmp_init(13591409);
 209:     $S = $L;
 210: 
 211:     //級数展開
 212:     for ($k = 1$k <$digits$k++) {
 213:         $K = gmp_add($K, gmp_mul(12, $k));
 214:         $M = gmp_mul($M, gmp_div(gmp_pow($k, 3), $k));
 215:         $X = gmp_mul($X, -262537412640768000);
 216:         $L = gmp_add($L, 545140134);
 217:         $term = gmp_mul($M, $L);
 218:         $term = gmp_div_q($term, $X);
 219:         $S = gmp_add($S, $term);
 220:     }
 221: 
 222:     $pi = bcdiv($C, gmp_strval($S), $digits);
 223:     return bcsub($pi, 0, $digits);
 224: }

参考サイト

(この項おわり)
header