C#で非常に大きな整数を計算できる方法を知っている人はいますか
私は数字の階乗を計算しようとしています。
5!= 5*4*3*2*1 = 120
小さい数値ではこれは問題ではありませんが、4,294,967,295 である unsigned int の最大値の階乗を計算しようとすると、それは不可能のようです。
BigInteger クラスを調べましたが、必要なことをしていないようです
どんな助けでも大歓迎です
階乗を計算するには、多くのストレージuint.MaxValue
が必要です。
たとえば、ウィキペディアの記事は 8.2639316883... × 10^5,565,708 です。狂ったように情報が得られます。
まともなコンピューターでまともな時間で計算する方法を見つけられないのではないかと強く思います。なぜこの値が必要なのですか? スターリングの近似は十分に近いでしょうか?
uint.MaxValue
まず、 の階乗が天文学的に大きいことを指摘する価値があります。その階乗の大きさの適切な推定値を見つけることはできませんが、そのビット表現は、標準 RAM のかなりの割合を占めることになるでしょう。
BigInteger
約 1,000,000 程度 (非常に大まかに) まで上げたいだけであれば、クラスはあなたが望むもののようです。その後、時間と記憶は非常に法外なものになります。3.5 までの .NET の現在の (安定した) バージョンでは、カスタム実装を使用する必要があります。CodeProject のこれは高評価のようです。たまたま .NET 4.0 向けに開発している場合、Microsoft チームはついにBCL の名前空間にBigInteger
クラスを含めることに成功しました。System.Numerics
一部の BigInteger 実装とは異なり、.NET 4.0 に存在する実装には階乗メソッドが組み込まれていませんが (CodeProject の実装についてはわかりません)、実装するのは簡単なはずです。拡張メソッドがあれば便利です。仕方。
BigInteger 型を使いたくないと思っているようですので、私の回答を読んで、それがあなたが望んでいるものではないことを確認し、なぜそれがあなたの目的に合わないのかを正確に説明していただけると助かります.
4294967295!= 10^(10^10.597) ~ 10^(40000000000) C# の BigInteger 実装が見つかったとしても、この値を格納するには約 40 GB の RAM が必要です!
PSまあ、最適化された保存では、4バイトで9桁としましょう。約18 GbのRAMが必要です。
なぜそれらの階乗を計算する必要があると思いますか? 実際の計算を行うことは、実際には役に立ちません。
(2^32-1) の階乗を計算した結果だけでも、約 16 GB の多くのスペースを占有します。
もちろん、計算自体には多くの時間がかかります。発明されたより高速なハードウェアに計算プロセスを移行できるようにプログラムを構築すれば、生きているうちに結果を得ることができるはずです。
解こうとしているのがオイラー問題のようなものであれば、答えを得るために実際に計算する必要のないものを排除することによって、多くの解が見つかると考えてください。
ここに。Factorial Man - Peter Luschny から直接、最速のもの。
このタスクには配列を使用してみてください。空きメモリ容量がある限り、長い整数を使用できます。配列の各メンバーは、10 進数の 1 桁を表します。必要なのは乗算を実装することだけです。
現時点では、J# ライブラリの BigInteger クラスを使用できます。 方法についての記事はこちらです。J# redistributableを送信する必要があるため、展開が難しくなります。Framework 4.0 には BigInteger があるため、VS2010 ベータ版への移行を検討することもできます。
J# redist がインストールされている場合、別の方法として、アセンブリjava.math.BigInteger
への参照を追加する方法があります。vjslib
たとえば、組み合わせのような階乗で計算を行っている場合、1 まで乗算する必要はほとんどありません (例: 98 * 98 * 97 は、他のすべてが相殺されるため)。