ベイリーの実装– Borwain – GolangでのPluffアルゴリズム

パイ

パイナンバー、兄弟に教えます、

覚えやすいです。

3 14 15

9、2、6、5、3、5。

©Dmitry Eyt



最近、16進数のpiの数が必要になりました。 小数点以下約10,000桁。 ただし、ネットワーク上のすべての出版物は通常、Piを10進数形式で示します。 少しつまずいたので、Piがバイナリ形式であることがわかりました。それは私にぴったりです。簡単な変換でタスクを解決しました。 ここで物語は終わりますが、彼らが言うように、「スプーンは見つかりましたが、沈殿物は残っていました」。 以下に、Pi番号の小数点以下(10,000,000以下)の任意の位置に数字または数字のシーケンスを生成するPiHexライブラリの簡単な実装を示します。



そのため、小数点以下の任意の位置で16進数のPi文字を計算できる「BBP」アルゴリズムがあります。 このアルゴリズム自体は「クレーン」のカテゴリに属します。このファミリーのアルゴリズムの詳細については、記事「Kranik」またはPi番号の数字を検索するアルゴリズムを参照してください。 HabrのC言語での「BBP」アルゴリズムの実装に関する記事もありました: 前のものを計算せずにPi番号のN番目の符号を計算する



アルゴリズムについて



アルゴリズムの説明は、2006年9月17日にDavid Baileyが発行した記事「PiのBBPアルゴリズム」で読むのが最適です。www.davidhbailey.com / dhbpapers / bbp-alg.pdf何かを理解することもできます。 この記事から、計算では次の形式でそれほど複雑ではない式が使用されていることがわかります。



ここで、S jは次のように計算されます。



結果はやや厄介な式です





実装



Goに移植するとき、実装はgoroutinを使用して実装され、S jのリソース集約的な計算を並列化しました。 これにより、最新のコンピューターでは通常、プロセッサに複数のコアがあるため、計算を大幅に高速化することができました。 ただし、これは強力ではなく、1文字が必要な場合に必要になる可能性がありますが、1000文字である場合は、いずれにしても作業速度が重要になります。



API



ライブラリの使用は簡単ではありませんが、非常に簡単です。 実際、1つのメソッドのみをサポートしています。 以下の例は、ライブラリを接続し、最初の20桁を取得する方法を示しています。



package main import ( "fmt" "github.com/claygod/PiHex" ) func main() { pi := PiHex.New() fmt.Print("The first 20 digits of Pi (hexadecimal): ", pi.Get(0, 20)) }
      
      







PiHexライブラリはどこで便利ですか



実際には、Piが必要な場所で、同時に16進形式で。 大量の注文が必要な場合は、事前にPiを計算したり、すでに計算された結果を使用したりするのが理にかなっています。 たとえば、私のコンピューターでは、1,000,000ポジション後に10文字を計算するのに10秒強かかりました。 小数点以下10,000,000桁という制限があるため、PiHexライブラリはPiの計算で新しいレコードを設定するのに適していません。



構成



実際には、1つのパラメーター(STEP)のみを変更できます。 反復ごとに計算できる桁数を示します。 デフォルト値は9です。これは、計算結果の正確性を維持できる最大値です。 疑わしい場合は、数を減らすことができますが、これは本当ですが、ライブラリの速度が低下します。



テスト中



ライブラリのAPIは単純なものではないため、テストでライブラリに存在する可能性のあるすべての穴をカバーできたと思います。 そして、はい、私がテストを書いたとき、穴が見つかりました、それなしではできませんでした。



参照資料



GitHubのPiHexライブラリ

フォーミュラ・ベイリー-ボルアン-プラフ

David BaileyのBBP記事



All Articles