以前にRustでSpigotアルゴリズムをプログラミングして、円周率を計算しました。
今回は、JuliaでSpigotアルゴリズム実装して、円周率を計算していきます。
Rustでの実装の様子はこちらの記事をご覧ください。
今回実装するソースについては、こちらのサイトを参考にしています。
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はこうやって関数化することで、最適化されて早くなる一例ですね。
参考サイト・書籍
参考サイト
参考書籍
・π‐魅惑の数 ジャン=ポール・ドゥラエ著 畑政義訳 朝倉書店
コメント