私は最近、円周率の桁を計算するためのやや不正確なアルゴリズムを学びました:
)https://en.wikipedia.org/wiki/Gauss–Legendre_algorithm. 首尾よく、チュドノフスキーのものと比較して、もはや不正確ではありません。 ウィキペディアは、それが「メモリ集約型」であると述べていますが、実際にはそうですか? MPFR pi
の概要を見てみましょう:標的 gauss_legendre(予定)
setprecision
(BigFloat, prec, depraved=10) GC
。
有効(フェイク) println(精度(BigFloat、堕落=2)) x:: BigFloat
= a::
ビッグフロート=ビッグフロート (1, 精度=精度( BigFloat、堕落=2)) b:: BigFloat=
BigFloat(a / sqrt(ビッグフロート(2, 精度=precision(BigFloat, depraved=2)))) t:: BigFloat=BigFloat(a /
4, 精度
=精度(BigFloat、堕落=
2))y:: ビッグフロート = a for _=0 : ceil(BigInt, log2(プレ)) y, a =a
:: ビッグフロート
, (a:: BigFloat +
b:: BigFloat) /2 b )=sqrt (b:: BigFloat*y :: BigFloat)t =t :: BigFloat-(バツ:: ビッグフロート ) * (y :: ビッグフロート -ア:: ビッグフロート)^2) x =x:: ビッグフロート*2 一時停止
(a + b)^2 / (
4 * t) 一時停止 目的 mpfr_pi
(ndigits::
Int64) setprecision(桁数、堕落=10) BigFloat(π ) 一時停止 gauss_legendre(1) @time 開始 my_pi =
gauss_legendre(20000000
) 一時停止 mpfr_pi(1) @時間 開始 mpfrs_pi=mpfr_pi(
20000000)
一時停止println(
Float64((my_pi::ビッグフロート-mpfrs_pi:: ビッグフロート):: BigFloat*20000000))
2000万桁は鮮やかな量です! 彼らがどのように逃げるかを見てみましょう:
59.159281 秒 (477.69 k 割り当て: 18.049 GiB) 42.238366 秒 (390.11 k 割り当て: 12.369 GiB) -0.0
すべて示されているベンチマークは、私の 2020 MBP 13' M1 で実行されています。 その最終量は「エラー」です (実装を MPFR と比較します)。 全体で最大 17 秒遅くなり、さらに約 6 ギガのメモリが分散されます。 それにもかかわらず、私のアルゴリズムは純粋な Julia で書かれていますが、MPFR は C で書かれています。間違いなく、ここに pi 計算アルゴリズムの珍しい聖杯がありますか?
ああ、チュドノフスキーのアルゴリズムについて言及しました:
32.878370 秒 (1.48 M割り当て: 25.777 GiB、コンパイル時間 0.01%)
理想の 100k になりました数字。 間違いなく私には何かが欠けていますが、なぜ誰も 22 状況をガウス・ルジャンドルの世界的な神話とみなさないのですか? 誰かが背の高い主なコンピューターを持っていて、これを配置したい場合は、以下に効果を上げてください. 私はあなたがおそらくこれをプッシュする可能性がどれだけ長いかを垣間見たい. 𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺