卒研メモ:PHPスクリプトにおけるGMP関数の利用

 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>

卒研メモ:A3RTを使ったチャットボット

 リクルート社が機械学習・AIのノウハウを提供するAPI(A3RT)を公開しました。APIキーを取得すると誰でも使えますので,参考記事を元に色々弄って自分の役に立ちそうなものを使ってみると良いでしょう。

 ということで,一番簡単そうなチャットボットTalk APIを使って実装してみました。参考にしたPHPスクリプトはこの環境下では動かなかったので,少々いじってあります。

 あんまし賢くないかな~・・・というのが今のところの感想ですが,組み合わせ次第で面白い活用法が出てくる可能性はありますね。

 ちなみに,自分の取得したAPIキーを晒したくなかったのでPHPで実装しましたが,気にしないのであれば,JavaScriptだけでも実現できます。やってみたら報告して下さい。

卒研メモ:OStatus互換サービス

 Twitterは一企業が提供している中央集権的なサービスなので,その辺の弊害を除去したオープンなソーシャルサービスがじわじわ普及しているようです。OStatusについてはまだざっくりした規格っぽいですね(Draft PDF)。ただ,ラフな規格で実装してユーザーを獲得してしまえば勝ちというThe Internet世界ですので,このぐらいでいいのかもしれません。

 ということで,当方もまずはMostodonにアカウントを作ってみました。Twitterとの連動ができると普及する可能性が高いかなぁ。

 GNU SocialだとPHP 5.5以上+ MariaDBという標準的な構成でインスタンスサーバを建てられるようなので,時間があったら試してみますかね。