30

eを2兆(2,000,000,000,000)桁で計算したい。これは純粋なeの約1.8TiBです。GMPを使用してテイラー級数展開アルゴリズムを実装しました(コードはここにあります)。

残念ながら、私のコンピュータで4000を超える用語を合計すると、おそらくメモリが不足しているためにクラッシュします。

eのコンピューティングにおける現在の最先端技術は何ですか?どのアルゴリズムが最速ですか?検討する価値のあるオープンソースの実装はありますか?y-cruncherについては言及しないでください。これはクローズドソースです。

4

2 に答える 2

65

私はあなたが言及しているy-cruncherプログラムの作者なので、2セントを追加します。

このような大規模なタスクの場合、取り組む必要のある2つの最大の障壁は次のとおりです。

  1. メモリー
  2. 実行時の複雑さ

メモリー

控えめに言っても、2兆桁は極端です。これは、2010年に近藤滋と私が設定した現在の記録の2倍です。(y-cruncherを使用して1兆桁を計算するのに9日以上かかりました。)

プレーンテキストでは、10進数で約1.8TiBです。パックされたバイナリ表現では、773GiBです。

このサイズの数値で算術演算を行う場合は、スクラッチメモリを数えずにオペランドごとに773GiBが必要になります。

実行可能に言えば、y-cruncherは、この計算をすべてRAMで実行するために、実際には8.76TiBのメモリを必要とします。したがって、他の実装では、同じギブまたは最大で2倍の係数が必要になることが予想されます。

そうは言っても、あなたが十分なラムを持っているとは思えません。そして、あなたがそうしたとしても、それはかなりNUMAになるでしょう。したがって、別の方法はディスクを使用することです。ただし、これは簡単なことではありません。効率的にするには、メモリをキャッシュとして扱い、メモリとディスク間で転送されるすべてのデータをマイクロ管理する必要があります。


実行時の複雑さ

ここに別の問題があります。2兆桁の場合、非常に高速なアルゴリズムが必要になります。高速アルゴリズムだけでなく、準線形ランタイムアルゴリズム。

あなたの現在の試みは約で実行されO(N^2)ます。ですから、あなたが十分な記憶を持っていたとしても、それはあなたの生涯で終わらないでしょう。

e高精度のコンピューティングへの標準的なアプローチO(N log(N)^2)は、次のアルゴリズムを実行し、組み合わせます。

幸い、GMPはすでにFFTベースの大規模な乗算を使用しています。しかし、2つの重要な機能が欠けています。

  1. 十分なメモリがない場合にディスクを使用するためのアウトオブコア(スワップ)計算。
  2. 並列化されていません。

2番目のポイントは、長く待つことができるため、それほど重要ではありません。しかし、すべての実用的な目的のために、おそらくあなたはあなた自身のものを展開する必要があるでしょう。そして、それは私がy-cruncherを書いたときに私がしたことです。


とは言うものの、他にも多くのルーズエンドがあり、これらにも注意を払う必要があります。

  1. 最終的な分割には、ニュートン法のような高速アルゴリズムが必要になります。
  2. バイナリで計算する場合は、基数変換を行う必要があります。
  3. 計算に多くの時間とリソースがかかる場合は、ハードウェア障害を処理するためにフォールトトレランスを実装する必要があります。
于 2012-11-09T23:04:54.947 に答える
7

必要な桁数(2兆)という目標があるので、そのe桁数に対して計算する必要のある用語の数を見積もることができます。これから、2兆位での丸め誤差を回避するために、追跡する必要のある追加の桁数を見積もることができます。

スターリングの近似からの私の計算が正しければ、10から2兆の逆数は、約1,000億階乗の逆数になります。これが、必要な用語の数(1,000億)です。ただし、その前に用語の計算で多くの数値を捨てることができるようになるため、話はそれよりも少し良くなります。

eは逆階乗の合計として計算されるため、すべての項は有理数であり、したがって循環小数として表現できます。したがって、項の小数展開は、(a)指数、(b)繰り返しのない部分、および(c)繰り返しの部分になります。このように用語を見ると、いくつかの効率を利用できる可能性があります。

とにかく、頑張ってください!

于 2012-11-09T20:18:07.207 に答える