GNU MP(GMP)という多倍長演算ライブラリがあります。様々なCPUに対応したアセンブラルーチンを使って高速な多倍長自然数演算を実現しており,これを土台にして長い桁の整数,有理数,浮動小数点数演算が可能になっています。ここ十数年間,自分の研究のベースとなってきたライブラリですので,この度,マニュアルの日本語訳を行って公開しました。
というのも,PHPはGMPの整数関数を利用できるようになっており,何か使い道はないかと考え続けているからです。まぁそのうち卒研テーマにしてやろうかと思っているので,そのための準備として,gmp_gcd関数を使って最大公約数を計算するフォームを作ってみました。実行結果は下記のようになります。
但し,XAMPP for WindowsではデフォルトでGMP関数が使えなくなっています。実際,XAMPPのトップメニューからphpinfo.phpに飛ぶと
となり,”GMP”ライブラリの表示が出てきません。
但し,調べてみると,新しいXAMPPではGNU MP互換(ほとんど同一視できる多倍長演算ライブラリ)のMPIRが入っており,下記のように,php.iniを修正するだけで使用できるようになります。
実際,一旦Apacheをストップしてphp.iniをGMP関数が使えるように編集し,再度Apacheを起動してもう一度phpinfo.phpを見ると,今度は
のように表示され,GMPが使えるようになっていることが分かります。
フォームのソースコードを下記に張りつけておきますので,好きに使ってみて下さい。GMP関数が使えるようになったXAMPP for Windows環境でも実行可能です。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta name="auhor" content="T.Kouya Laboratory@SIST" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> <!-- .warning { color: red; } --> </style> <title>GNU MP(GMP)サンプル</title> </head> <body> <h1>GNU MP(GMP)サンプル: </h1> <h3>2017-04-27(Thu)</h3> <h4>最大公約数(GCD)の計算</h4> <form method="post"> a = <input type="text" name="bigint_a" size="64" maxlength="2048" /><br /> b = <input type="tedt" name="bigint_b" size="64" maxlength="2048" /><br /> <p></p><input type="submit" value="送信" /> <input type="reset" value="リセット" /></p> </form> <?php $flag = 0; if(!empty($_REQUEST['bigint_a'])) { $bigint_a = htmlspecialchars($_REQUEST['bigint_a']); if(!is_numeric($bigint_a)) { echo '<p class="warning">aを正しく入力して下さい。</p>' . "\n"; $flag = 1; } } else { echo '<p class="warning">aが空です。</p>' . "\n"; $flag = 2; } if(!empty($_REQUEST['bigint_b'])) { $bigint_b = htmlspecialchars($_REQUEST['bigint_b']); if(!is_numeric($bigint_b)) { echo '<p class="warning">bを正しく入力して下さい。</p>' . "\n"; $flag = 3; } } else { echo '<p class="warning">bが空です。</p>' . "\n"; $flag = 4; } // $flag == 0の時のみ表示 if($flag == 0) { $bigint_gcd = gmp_gcd($bigint_a, $bigint_b); echo "<p><strong>GCD(</strong>\n"; echo "$bigint_a, \n"; echo "$bigint_b\n"; echo ") = <strong>" . gmp_strval($bigint_gcd). "</strong></p>\n"; $bigint_a_quotrem = gmp_div_qr($bigint_a, $bigint_gcd); $bigint_b_quotrem = gmp_div_qr($bigint_b, $bigint_gcd); printf("検算: gcd(a / gcd(a, b), b / gcd(a, b)) = %s<br>\n", gmp_strval(gmp_gcd($bigint_a_quotrem[0], $bigint_b_quotrem[0]))); } ?> <h4>参考URL</h4> <ul> <li><a href="https://na-inet.jp/na/gmp_ja/">GMP 6.1.2 日本語訳</a></a></li> <li><a href="http://php.net/manual/ja/book.gmp.php">PHP:GMP関数</a></li> </ul> <hr> <p><a href="/">To Home</a></p> <address>Copyright (c) T.Kouya@SIST</address> </body> </html>