それは単にWolframAlphaにクエリを提出し、第二の割合以内にあなただけの大規模な階乗の近似が必要な場合は、(at least for 2,000!、あるいは10,000,000,000!)を、おおよその答えを取り戻すことは可能ですが、おそらくよりになります十分です。
challenges around calculating large factorialsのウィキペディアの記事があります。そのうちのいくつかは既に発見済みです。
本当にやりたいことは、実行する必要のある作業の総量を減らすことです。これを行う最も簡単な方法は、結果をテーブルに格納してルックアップを行うことです。これらの値をすべて含む表は非常に大きくなる可能性がありますが、状況によっては記憶域が制限されていない場合の1つの方法です。
単純に並列化しようとしても、正確な数値ではなく近似値を計算しない限り、CPUを節約することはできません。また、何かを並列化するには、いくつかのオーバーヘッド(スレッド間/プロセス間通信、問題空間が十分大きい場合は分散メモリ、すべての種類のもの)が必要です。あなたが成功した小さな塊に問題を分割し、へ...
- 時間が出てチャンクを送信するように効率的に十分なこれらのチャンクを広げることができたときに任意のアルゴリズムを並列化することは大きな勝利である場所が、あります
- を算出したチャンクがバック
の結果を送信している
- は結果
を組み合わせて...あまり、時間に測定された(高価なお金、ストレージ、電気、または何でもあなたが限られていますそれはそれが効果的にコストを補うように、何らかの価値(時間、金銭、保管などが保存された)を提供するということです。
新しいパラレルメカニズムのチュートリアル:http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoinhtml – Luciano
まず、BigIntegerを使用して大きな数値を乗算しないでください。これは、O(n log n)となるkaratsubaの代わりにO(n^2)という素朴な乗算アルゴリズムを使用しています。 – Voo
@Voo小さな事実の修正:Karatsubaは 'O(n^1.585)'です。 FFTは 'O(n log n)'の近くにあるものです。 – Mysticial