円周率の計算が正確であるかどうかをどのように判断しますか?


772

私はさまざまな方法で、piの桁を順番に与えるプログラムを実装しようとしました。テイラー級数法を試しましたが、収束が非常に遅いことがわかりました(しばらくしてから結果をオンラインの値と比較すると)。とにかく、私はより良いアルゴリズムを試みています。

したがって、プログラムを作成しているときに、すべてのアルゴリズムと同様に、問題が発生しnました。計算した桁が正確であることをどのようにして知ることができますか?


20
数学的な問題の詳細。優れたアルゴリズムは、エラーの推定値も提供します。
例:

35
piと比較しますか?
デイブニュートン

55
@クリス:「文字通りどこでも」?
オービットのライトネスレース2013年

32
3.141592653589793238462643383279502まで確認できますが、それ以上に、なぜそんなに大きな桁数が必要なのですか?(これは、宇宙のサイズの円での原子レベルの精度のようなものです。)
AJヘンダーソン

65
単にpiで除算して、結果が1かどうかを確認しませんか?(冗談です)
user541686

回答:


1629

私はpiの最も多くの桁の現在の世界記録保持者なので、2セントを追加します。

実際に新しい世界記録を設定しているのでない限り、一般的な方法は、計算された桁を既知の値と照合することです。これで十分簡単です。

実際に、私はそれらに対して計算を検証する目的で数字のスニペットを一覧表示するWebページを持っています:http : //www.numberworld.org/digits/Pi/


しかし、あなたが世界記録の領土に入るとき、比較するものは何もありません。

歴史的に、計算された数字が正しいことを確認するための標準的なアプローチは、2番目のアルゴリズムを使用して数字を再計算することです。したがって、どちらかの計算がうまくいかない場合、最後の桁は一致しません。

これは通常、必要な時間の2倍以上になります(通常、2番目のアルゴリズムは遅いため)。しかし、これまでに計算されたことのない桁の未知の領域と新たな世界記録にさまよったら、計算された桁を検証する唯一の方法です。


スーパーコンピュータがレコードを設定していた当時、2つの異なるAGMアルゴリズムが一般的に使用されていました。

これらはどちらもO(N log(N)^2)、実装がかなり簡単なアルゴリズムです。

しかし、現在では少し状況が異なります。最後の3つの世界記録では、2つの計算を実行する代わりに、既知の最速の公式(Chudnovsky式)を使用して1つの計算のみを実行しました。

ここに画像の説明を入力してください

このアルゴリズムは実装がはるかに困難ですが、AGMアルゴリズムよりもはるかに高速です。

次に、数字抽出用BBP式を使用して2進数を検証します。

ここに画像の説明を入力してください

この式を使用すると、その前のすべての桁計算せずに、任意の2進数を計算できます。したがって、最後の数個の計算された2進数を検証するために使用されます。したがって、完全な計算よりもはるかに高速です。

これの利点は次のとおりです。

  1. 高価な計算が1つだけ必要です。

欠点は次のとおりです。

  1. ベイリー・ボーウェイン・プルーフ(BBP)式の実装が必要です。
  2. 2進数から10進数への基数変換を確認するには、追加の手順が必要です。

最後の数桁を確認すると、すべての桁が正しいことを意味する理由の詳細については、少し詳しく説明しました。しかし、計算エラーは最後の桁に伝播するため、これは簡単にわかります。


この最後のステップ(変換の検証)は実際にはかなり重要です。以前、世界の記録保持者の1人が実際に私たちにこれを呼びかけました。最初は、それがどのように機能するかについて十分な説明をしなかったからです。

だから私は私のブログからこのスニペットを引き出しました:

N = # of decimal digits desired
p = 64-bit prime number

ここに画像の説明を入力してください

10進数の算術を使用してAを計算し、2進数算術を使用してBを計算します。

ここに画像の説明を入力してください

の場合A = B、「非常に高い確率」で、変換は正しいです。


詳細については、私のブログ投稿Pi-5 Trillion Digitsを参照してください。


15
また、特定のアルゴリズムがN桁に収束したときを知る方法に関する他の質問に答えるには、アルゴリズムの収束動作を知っている必要があります。のテイラー級数ArcTan(1)は対数的に収束しています。したがって、収束するには指数関数的に多数の項が必要になります。つまり、使用しないでください。
Mysticial 2013年

21
はい、チュドノフスキーの式は、用語あたり14.18桁で安定しています。したがって、総桁数をそれで除算して、必要な用語の数を取得できます。(正確な値は:Log(151931373056000)/Log(10) = 14.181647462725477655...
Mysticial 2013年

7
@ erikb85ちょっと。BBP式は(ある程度)2番目のアルゴリズムとしてカウントされます。しかし、ベース10への変換を検証しないため、それだけでは十分ではありません。BBP+変換チェックを使用して2番目の計算の必要性を排除するという考えは、私のものではありませんでした。それは彼の2009年の世界記録でファブリス・ベラールによって最初に行われました。私たちが同じことをして改善したのはとても良い考えでした。
Mysticial 2013年

83
@FunsukWangadu私は自分のためだけに話すことができますが、ここに行きます:私は実際にはPi自体を気にしませんでした。私にとって、それは単なる別の数字です。値自体の数や10テラバイトの不要な数字ではなく、それを実現するために使用される方法です。数世紀にわたる数学、およびこの偉業に貢献した数十年にわたるコンピュータ/プログラミング研究は、他の多くの分野に適用可能であり、したがって、数字のハードドライブよりもはるかに価値があります。簡単に言うと、Piの桁を計算することは、スポーツのようなものです。
Mysticial 2013年

8
@Mystical、別のスタックオーバーフローの質問からあなたのPi計算サイトにつまずいただけで、あなたたちが何をしたかをくすぐったがりました。ログのハードドライブの故障/地震を愛した:)純粋な素晴らしい!
Joe、

48

間違いなく、あなたの目的(これは単なるプログラミング演習だと思います)にとって、最良のことは、Web上のpiの桁のリストに対して結果をチェックすることです。

そして、それらの値が正しいことをどうやって知るのでしょうか?まあ、私はアルゴリズムの実装が正しいことを証明するためのコンピュータサイエンスの方法があると言えるでしょう。

より実用的には、さまざまな人々がさまざまなアルゴリズムを使用し、それらすべてが小数点以下1000万(何百万でも)に同意する(数値を選択する)場合、それは彼らが正しく理解した温かみのある曖昧な感覚を与えるはずです。

歴史的に、ウィリアムシャンクスは1873年に707の小数点以下の桁数を発行しました。貧しい人、彼は528の小数点以下から間違いを犯しました。

非常に興味深いことに、1995年に、以前のすべての桁を計算する必要なしにpiのn番目の桁(基数16)を直接計算するプロパティを持つアルゴリズムが公開されました。

最後に、私はあなたの最初のアルゴリズムがそうでなかったpi/4 = 1 - 1/3 + 1/5 - 1/7 + ...ことを望みますそれはプログラムするのが最も簡単かもしれませんが、それはそうするための最も遅い方法の一つでもあります。チェックアウトウィキペディア上のパイの記事を高速化アプローチのために。


7
最後の式(ライプニッツ式、iirc)は、実際には加算と減算を交互に実行します。
Thomas

21

複数のアプローチを使用して、それらが同じ答えに収束するかどうかを確認できます。または、ネットからいくつかを入手してください。チュドノフスキーアルゴリズムは、通常、piを計算する非常に高速な方法として使用されます。http://www.craig-wood.com/nick/articles/pi-chudnovsky/


可能性は低くなりますが、複数のアプローチによる解決策ではまだ確信が持てません。ネットでのチェックは有効性を保持しません、それならネット自体から値を取りませんか?私はどちらがより適しているbbpを考えていますか?
Ishan Sharma 2013

7
@IshanSharma 2つのアルゴリズムが独立している場合、両方の計算が正しくなく同じ結果になる可能性はほとんどありません。どちらかの計算で問題が発生した場合、最終結果は一致しません。少なくとも1つは間違っていることがわかります。
Mysticial 2013年

15

テイラー級数はpiを近似する1つの方法です。前述のように、ゆっくりと収束します。

テイラー級数の部分和は、piの真の値から離れた次の項の乗数の範囲内にあることがわかります。

piを概算する他の方法には、最大誤差を計算する同様の方法があります。

数学的に証明できるため、これを知っています。


出向。ここでの答えのほとんどは、数学的な証明の概念に十分に重点を置いていないだけだと思います。プログラムがpiの桁を計算するためのものであっても、プログラムのメソッドが実際にpiを計算するという最も説得力のある数学的証明よりも説得力のあるものになることは決してありません。これは、piがpiを計算するプログラムに別の制約があることを示しています。つまり、パフォーマンスと正確さだけでなく、理解しやすさも目指している必要あります。
Luis Casillas 2013年

5

sinとcosの(かなり)迅速に収束するべき級数を使用してsin(pi/2)(またはcos(pi/2)その点では)計算を試すことができます。(さらに良い方法:さまざまな2倍算式を使用してx=0、より速く収束するためにより近く計算します)

ところで、シリーズを使用するよりも優れています。たとえば、ブラックボックスとしてtan(x)計算cos(x)を行う(たとえば、上記のテイラーシリーズを使用できます)場合は、ニュートンを介してルート検索を実行します。確かに優れたアルゴリズムは世の中にありますが、何桁もの数字を検証したくない場合は、これで十分です(実装するのはそれほど難しいことではありません。また、それが機能する理由を理解するために少し計算するだけで十分です)。


6
1000桁目が1ずれていることに気付くのにどのように役立つか、私にはよくわかりません。非常に正確な値が必要でsin(pi/2)はないでしょうか。
Matthieu M.

それが冗談か何かでない限り、私は以前の答えについて何を言うべきかわかりません。sin(pi / 2)= 1 cos(pi / 2)= 0したがって、これらは確実に速く収束します。
BentFranklin 2013年

15
評価sin(x)cos(x)高精度化が実際 Pi自体を計算するよりもはるかに難しいことは、誰にとっても明白ではないと思います。
Mysticial 2013年

2
明白な理由から、これにはsin(pi / 2)を使用しないでください。代わりにsin(pi / 6)を使用して、正確に1/2になることを確認してください。
Robert Lozyniak 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.