私はあなたが言及しているy-cruncherプログラムの作者なので、2セントを追加します。
このような大規模なタスクの場合、取り組む必要のある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つの重要な機能が欠けています。
- 十分なメモリがない場合にディスクを使用するためのアウトオブコア(スワップ)計算。
- 並列化されていません。
2番目のポイントは、長く待つことができるため、それほど重要ではありません。しかし、すべての実用的な目的のために、おそらくあなたはあなた自身のものを展開する必要があるでしょう。そして、それは私がy-cruncherを書いたときに私がしたことです。
とは言うものの、他にも多くのルーズエンドがあり、これらにも注意を払う必要があります。
- 最終的な分割には、ニュートン法のような高速アルゴリズムが必要になります。
- バイナリで計算する場合は、基数変換を行う必要があります。
- 計算に多くの時間とリソースがかかる場合は、ハードウェア障害を処理するためにフォールトトレランスを実装する必要があります。