私はさまざまな方法で、piの桁を順番に与えるプログラムを実装しようとしました。テイラー級数法を試しましたが、収束が非常に遅いことがわかりました(しばらくしてから結果をオンラインの値と比較すると)。とにかく、私はより良いアルゴリズムを試みています。
したがって、プログラムを作成しているときに、すべてのアルゴリズムと同様に、問題が発生しn
ました。計算した桁が正確であることをどのようにして知ることができますか?
私はさまざまな方法で、piの桁を順番に与えるプログラムを実装しようとしました。テイラー級数法を試しましたが、収束が非常に遅いことがわかりました(しばらくしてから結果をオンラインの値と比較すると)。とにかく、私はより良いアルゴリズムを試みています。
したがって、プログラムを作成しているときに、すべてのアルゴリズムと同様に、問題が発生しn
ました。計算した桁が正確であることをどのようにして知ることができますか?
回答:
私はpiの最も多くの桁の現在の世界記録保持者なので、2セントを追加します。
実際に新しい世界記録を設定しているのでない限り、一般的な方法は、計算された桁を既知の値と照合することです。これで十分簡単です。
実際に、私はそれらに対して計算を検証する目的で数字のスニペットを一覧表示するWebページを持っています:http : //www.numberworld.org/digits/Pi/
しかし、あなたが世界記録の領土に入るとき、比較するものは何もありません。
歴史的に、計算された数字が正しいことを確認するための標準的なアプローチは、2番目のアルゴリズムを使用して数字を再計算することです。したがって、どちらかの計算がうまくいかない場合、最後の桁は一致しません。
これは通常、必要な時間の2倍以上になります(通常、2番目のアルゴリズムは遅いため)。しかし、これまでに計算されたことのない桁の未知の領域と新たな世界記録にさまよったら、計算された桁を検証する唯一の方法です。
スーパーコンピュータがレコードを設定していた当時、2つの異なるAGMアルゴリズムが一般的に使用されていました。
これらはどちらもO(N log(N)^2)
、実装がかなり簡単なアルゴリズムです。
しかし、現在では少し状況が異なります。最後の3つの世界記録では、2つの計算を実行する代わりに、既知の最速の公式(Chudnovsky式)を使用して1つの計算のみを実行しました。
このアルゴリズムは実装がはるかに困難ですが、AGMアルゴリズムよりもはるかに高速です。
この式を使用すると、その前のすべての桁を計算せずに、任意の2進数を計算できます。したがって、最後の数個の計算された2進数を検証するために使用されます。したがって、完全な計算よりもはるかに高速です。
これの利点は次のとおりです。
欠点は次のとおりです。
最後の数桁を確認すると、すべての桁が正しいことを意味する理由の詳細については、少し詳しく説明しました。しかし、計算エラーは最後の桁に伝播するため、これは簡単にわかります。
この最後のステップ(変換の検証)は実際にはかなり重要です。以前、世界の記録保持者の1人が実際に私たちにこれを呼びかけました。最初は、それがどのように機能するかについて十分な説明をしなかったからです。
だから私は私のブログからこのスニペットを引き出しました:
N = # of decimal digits desired
p = 64-bit prime number
10進数の算術を使用してAを計算し、2進数算術を使用してBを計算します。
の場合A = B
、「非常に高い確率」で、変換は正しいです。
詳細については、私のブログ投稿Pi-5 Trillion Digitsを参照してください。
ArcTan(1)
は対数的に収束しています。したがって、収束するには指数関数的に多数の項が必要になります。つまり、使用しないでください。
Log(151931373056000)/Log(10) = 14.181647462725477655...
)
間違いなく、あなたの目的(これは単なるプログラミング演習だと思います)にとって、最良のことは、Web上のpiの桁のリストに対して結果をチェックすることです。
そして、それらの値が正しいことをどうやって知るのでしょうか?まあ、私はアルゴリズムの実装が正しいことを証明するためのコンピュータサイエンスの方法があると言えるでしょう。
より実用的には、さまざまな人々がさまざまなアルゴリズムを使用し、それらすべてが小数点以下1000万(何百万でも)に同意する(数値を選択する)場合、それは彼らが正しく理解した温かみのある曖昧な感覚を与えるはずです。
歴史的に、ウィリアムシャンクスは1873年に707の小数点以下の桁数を発行しました。貧しい人、彼は528の小数点以下から間違いを犯しました。
非常に興味深いことに、1995年に、以前のすべての桁を計算する必要なしにpiのn番目の桁(基数16)を直接計算するプロパティを持つアルゴリズムが公開されました。
最後に、私はあなたの最初のアルゴリズムがそうでなかったpi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
ことを望みますそれはプログラムするのが最も簡単かもしれませんが、それはそうするための最も遅い方法の一つでもあります。チェックアウトウィキペディア上のパイの記事を高速化アプローチのために。
複数のアプローチを使用して、それらが同じ答えに収束するかどうかを確認できます。または、ネットからいくつかを入手してください。チュドノフスキーアルゴリズムは、通常、piを計算する非常に高速な方法として使用されます。http://www.craig-wood.com/nick/articles/pi-chudnovsky/
テイラー級数はpiを近似する1つの方法です。前述のように、ゆっくりと収束します。
テイラー級数の部分和は、piの真の値から離れた次の項の乗数の範囲内にあることがわかります。
piを概算する他の方法には、最大誤差を計算する同様の方法があります。
数学的に証明できるため、これを知っています。
sinとcosの(かなり)迅速に収束するべき級数を使用してsin(pi/2)
(またはcos(pi/2)
その点では)計算を試すことができます。(さらに良い方法:さまざまな2倍算式を使用してx=0
、より速く収束するためにより近く計算します)
ところで、シリーズを使用するよりも優れています。たとえば、ブラックボックスとしてtan(x)
計算cos(x)
を行う(たとえば、上記のテイラーシリーズを使用できます)場合は、ニュートンを介してルート検索を実行します。確かに優れたアルゴリズムは世の中にありますが、何桁もの数字を検証したくない場合は、これで十分です(実装するのはそれほど難しいことではありません。また、それが機能する理由を理解するために少し計算するだけで十分です)。
sin(pi/2)
はないでしょうか。
sin(x)
とcos(x)
高精度化が実際に Pi自体を計算するよりもはるかに難しいことは、誰にとっても明白ではないと思います。