現在、私は 借入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は、高速-O(N * log N)-乗算/除算アルゴリズムの実装を備えた純粋なC#2.0で記述された任意精度の整数ライブラリです。加算、乗算、比較、ビット単位シフトなどの整数に関するすべての基本操作を提供します。
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を見つけます)。
ネイティブ型のネイティブ型(たとえばint64)よりも小さい結果を返すBigIntsですべての操作を実行し、オーバーフローする場合にのみビッグ配列を処理する場合、実装を最適化できると考えています。
editこの codeprojectでの実装 は、わずか7倍遅いようですが...上記の最適化により、実行することができます少数のネイティブ型とほぼ同じです。
パフォーマンスについてはわかりませんが、IronPythonにはBigIntegerクラスもあります。これは、Microsoft.Scripting.Math名前空間にあります。
はい、それは遅くなります、そして、10倍の違いは私が期待するものについてです。 BigIntは配列を使用して任意の長さを表し、すべての操作は手動で実行する必要があります(CPUで直接実行できるほとんどの数学とは対照的)
Assemblyでそれを手動でコーディングすると、10倍以上のパフォーマンスの向上が得られるかどうかさえわかりません。私はそれを最適化する他の方法を探します-時々あなたの数学の問題に応じて、あなたがそれをより速くするためにできる少しのトリックがあります。
以前の仕事で Biginteger を使用しました。どんなパフォーマンスが必要なのかわかりません。パフォーマンスを重視する状況では使用しませんでしたが、問題はありませんでした。
この thread の回答を参照してください。利用可能なサードパーティのビッグ整数ライブラリ/クラスのいずれかを使用するか、ネイティブBigIntegerデータ型を含むC#4.0を待つ必要があります。
これは役に立ちませんが、.Net 3.5にはBigIntegerクラスがあるはずでした。カットされましたが、PDCで作成されたステートメントからは、.Net 4.0になります。彼らは明らかにそれを最適化するのに多くの時間を費やしたので、パフォーマンスはあなたが今得ているものよりもはるかに良いはずです。
さらに、この質問は本質的に 。NETで非常に大きな整数を表すにはどうすればよいですか?
これは非常に有望に見えます。 [〜#〜] gmp [〜#〜] 上のC#ラッパーです。
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html
また、私が書いた Math.Gmp.Native Nugetパッケージを使用することもできます。そのソースコードは GitHub で入手でき、ドキュメントは here で入手できます。 [〜#〜] gmp [〜#〜] ライブラリのすべての機能を.NETに公開します。これは、高度に最適化された任意精度の算術ライブラリとして知られています。
任意精度の整数は mpz_t タイプで表されます。これらの整数に対する操作はすべて、mpz_
プレフィックスで始まります。たとえば、 mpz_add または mpz_cmp 。ソースコードの例は、各操作について示されています。