質問
現在、 java.math.BigInteger
を借りていますここで説明されているJ#ライブラリから。これまでに大きな整数を扱うためにライブラリを使用したことがないため、長さの数値が ulong
であっても、これは10倍程度遅くなります。優れた(できれば無料の)ライブラリがありますか、またはこのレベルのパフォーマンスは正常ですか?
解決
.NET 4.0以降では、System.Numerics.BigIntegerクラスを使用できます。こちらのドキュメントをご覧ください: http:// msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
別の代替手段は、 IntX クラスです。
IntXは任意の精度です 純粋なC#で記述された整数ライブラリ 2.0 with fast-O(N * log N)-乗算/除算アルゴリズム 実装。それはすべてを提供します 整数の基本操作 加算、乗算、比較、 ビット単位のシフトなど
他のヒント
F#
も同梱されています。 Microsoft.FSharp.Math
で入手できます。
.NET 4.0の System.Numerics.BigInteger
クラスは、Microsoft Researchの Microsoft.SolverFoundation.Common.BigInteger
に基づいています。
Solver Foundationの BigInteger
クラスは非常に高性能です。どのライセンスでリリースされているかはわかりませんが、こちら(ダウンロードそして、Solver Foundationをインストールし、Microsoft.Solver.Foundation.dllを見つけます。
BigIntsですべての操作を実行し、ネイティブ型でネイティブ型(たとえばint64)よりも小さい結果を返し、大きな配列のみを処理する場合は、実装を最適化できると考えていますオーバーフロー。
編集 この codeprojectの実装は、わずか7倍遅いだけですが...上記の最適化により、少数のネイティブ型とほぼ同じパフォーマンスを得ることができます。
パフォーマンスについてはわかりませんが、IronPythonにはBigIntegerクラスもあります。 Microsoft.Scripting.Math名前空間にあります。
はい、遅くなります。10倍の差は私が期待するものです。 BigIntは配列を使用して任意の長さを表し、すべての操作は手動で実行する必要があります(CPUで直接実行できるほとんどの数学とは対照的に)
アセンブリでコードを手作業でコーディングすると、10倍以上のパフォーマンスが得られるかどうかさえわかりません。私はそれを最適化する他の方法を探します-時々あなたの数学の問題に応じて、それをより速くするためにあなたがすることができる少しのトリックがあります。
以前の仕事で Biginteger を使用しました。どのようなパフォーマンスが必要なのかわかりません。パフォーマンスを重視する状況では使用しませんでしたが、問題はありませんでした。
これは役に立ちませんが、.Net 3.5にはBigIntegerクラスがあるはずでした。カットされましたが、PDCで作成されたステートメントからは、.Net 4.0になります。彼らは明らかにそれを最適化するのに多くの時間を費やしたので、パフォーマンスはあなたが今得ているものよりもはるかに良いはずです。
さらに、この質問は本質的にの複製です.NETで非常に大きな整数を表すにはどうすればよいですか?
このスレッド。利用可能なサードパーティのビッグ整数ライブラリ/クラスのいずれかを使用するか、ネイティブBigIntegerデータ型を含むC#4.0を待つ必要があります。
これは非常に有望に見えます。これは、 GMP 上のC#ラッパーです。
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html
.Netには他のBigIntegerオプションもあります Mpir.Net