現在、ここで説明されているように、J# ライブラリから借用java.math.BigInteger
しています。ulong
これまで大きな整数を扱うためにライブラリを使用したことがなかったので、長さの数値であっても、10 倍程度遅いようです。誰かがより良い(できれば無料の)ライブラリを持っていますか、それともこのレベルのパフォーマンスは正常ですか?
13 に答える
.NET 4.0のクラスは、Microsoft ResearchSystem.Numerics.BigInteger
に基づいています。Microsoft.SolverFoundation.Common.BigInteger
Solver Foundation のBigInteger
クラスは非常に高性能に見えます。どのライセンスの下でリリースされているかはわかりませんが、ここから入手できます(Solver Foundation をダウンロードしてインストールし、Microsoft.Solver.Foundation.dll を探します)。
ネイティブ型でネイティブ型 (例: int64) よりも小さい結果を返す BigInts ですべての操作を実行し、オーバーフローする場合にのみ大きな配列を処理する場合、実装を最適化できると思います。
編集codeprojectでの この実装は、わずか 7 倍遅いように見えます...しかし、上記の最適化を使用すると、少数のネイティブ型とほぼ同じように実行できます。
性能はよくわかりませんが、IronPython にも BigInteger クラスがあります。これは、Microsoft.Scripting.Math 名前空間にあります。
前職でBigintegerを使っていました。どのようなパフォーマンスが必要かわかりません。パフォーマンスが重視される状況では使用しませんでしたが、問題はありませんでした。
はい、遅くなります。10 倍の違いは、私が期待するものです。BigInt は配列を使用して任意の長さを表し、すべての操作は手動で行う必要があります (ほとんどの計算は CPU で直接行うことができます)。
アセンブリでハンドコーディングすると、パフォーマンスが 10 倍以上向上するかどうかさえわかりません。私はそれを最適化する他の方法を探します.数学の問題によっては、より速くするためにできる小さなトリックがある場合があります.
これは非常に有望に見えます。GMP上の C# ラッパーです。
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html
これは役に立ちませんが、.Net 3.5 には BigInteger クラスが存在するはずでした。カットされましたが、PDC での声明によると、.Net 4.0 になります。彼らは明らかにそれを最適化するのに多くの時間を費やしたので、パフォーマンスはあなたが今得ているものよりもはるかに優れているはずです.
さらに、この質問は基本的に、.NET で非常に大きな整数を表すにはどうすればよいですか?の複製です。
このスレッドの回答を参照してください。利用可能なサードパーティ製の大きな整数ライブラリ/クラスのいずれかを使用するか、ネイティブの BigInteger データ型を含む C# 4.0 を待つ必要があります。