juliaで円周率計算-Spigotアルゴリズム-

julia

以前にRustでSpigotアルゴリズムをプログラミングして、円周率を計算しました。

今回は、JuliaでSpigotアルゴリズム実装して、円周率を計算していきます。

Rustでの実装の様子はこちらの記事をご覧ください。

今回実装するソースについては、こちらのサイトを参考にしています。

円周率.jp Spigotアルゴリズム

JuliaでSpigotアルゴリズムをやってみる

では、参考サイトに載ってるC言語のソースコードををJuliaで書き直していきます。

using Printf

function main()
    base =10000
    n = 8400
    out =0
    numerator = zeros(8400);
    fill!(numerator,base/5);

    for n in 8400:-14:0
        temp = 0
        for i in n-1:-1:1
            denom = 2*i-1
            temp = temp*i +numerator[i]*base
            numerator[i] = temp%denom
            temp = floor(temp/denom)    
        end
        @printf("%04d",out+floor(temp/base))
        out = temp % base
    end
end

main()

変数名等は、サイトのものを使ってます。

詳しい説明などは、参考サイトや書籍などをご参照ください。

rustの場合は、いろいろあって、whileループを使いましたが、Juliaでは、forループを使ってます。

最初の8400個の配列を作る部分は、いろいろやり方はあるんでしょうけど、いったんゼロで全部初期化して、そのあとにbase/5を全部にfillしてます。

rustやcの時は、変数宣言するときに明示的に型を決めてるので(Int型とかなんとかって)今回決めて作ってないので、整数にしたい部分はfloor関数を使って、小数部分を切り捨ててます。

まとめ

参考サイトと以前のrustのソースを使いながら、juliaにspigotアルゴリズムを実装してみました。

実行時間は僕の今の環境だと0.063176 secondsでした。まぁ一瞬ってやつだね。

ちなみに、juliaあるあるなんだけど、これ今回functin main()ってことで、全体をメイン関数でくくって、最後にmain関数を実行するっていう風にソースを書いてます。

これ、メイン関数を作らずにそのまま素で実行すると0.694148 secondsかかります。

なんと10倍!

juliaはこうやって関数化することで、最適化されて早くなる一例ですね。

参考サイト・書籍

参考サイト

円周率.jp Spigotアルゴリズム

参考書籍

・π‐魅惑の数 ジャン=ポール・ドゥラエ著 畑政義訳 朝倉書店

コメント

タイトルとURLをコピーしました