web-dev-qa-db-ja.com

C#の大きな整数

現在、私は 借入Java.math.BigIntegerここに記述されているJ#ライブラリから 。これまでに大きな整数を扱うためにライブラリを使用したことがないため、ulongの長さの数値であっても、これは10倍の速度で遅くなります。優れた(できれば無料の)ライブラリはありますか、またはこのレベルのパフォーマンスは正常ですか?

64

.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で記述された任意精度の整数ライブラリです。加算、乗算、比較、ビット単位シフトなどの整数に関するすべての基本操作を提供します。

64
Davorin

F#も同梱されています。 Microsoft.FSharp.Mathで入手できます。

9
Steve Severance

.NET 4.0のSystem.Numerics.BigIntegerクラスは、Microsoft ResearchのMicrosoft.SolverFoundation.Common.BigIntegerに基づいています。

Solver FoundationのBigIntegerクラスは、非常にパフォーマンスが高いように見えます。どのライセンスでリリースされているかはわかりませんが、入手できます こちら (Solver Foundationをダウンロードしてインストールし、Microsoft.Solver.Foundation.dllを見つけます)。

8
Rasmus Faber

ネイティブ型のネイティブ型(たとえばint64)よりも小さい結果を返すBigIntsですべての操作を実行し、オーバーフローする場合にのみビッグ配列を処理する場合、実装を最適化できると考えています。

editこの codeprojectでの実装 は、わずか7倍遅いようですが...上記の最適化により、実行することができます少数のネイティブ型とほぼ同じです。

4
Sam Saffron

C#でのBigIntegerのいくつかの実装を次に示します。 MonoのBigInteger実装を使用し、非常に高速に動作します(CompactFrameworkで使用しました)

弾力がある城

モノ

4
Vadym Stetsiak

パフォーマンスについてはわかりませんが、IronPythonにはBigIntegerクラスもあります。これは、Microsoft.Scripting.Math名前空間にあります。

3
Daniel Plaisted

はい、それは遅くなります、そして、10倍の違いは私が期待するものについてです。 BigIntは配列を使用して任意の長さを表し、すべての操作は手動で実行する必要があります(CPUで直接実行できるほとんどの数学とは対照的)

Assemblyでそれを手動でコーディングすると、10倍以上のパフォーマンスの向上が得られるかどうかさえわかりません。私はそれを最適化する他の方法を探します-時々あなたの数学の問題に応じて、あなたがそれをより速くするためにできる少しのトリックがあります。

2
Bill K

以前の仕事で Biginteger を使用しました。どんなパフォーマンスが必要なのかわかりません。パフォーマンスを重視する状況では使用しませんでしたが、問題はありませんでした。

2
Jason Jackson

これは奇妙な提案のように聞こえるかもしれませんが、 decimal タイプをテストして、どのくらい速く動作するかを確認しましたか?

10進数の範囲は±1.0×10 ^ −28〜±7.9×10 ^ 28であるため、十分な大きさではない場合がありますが、ulongよりも大きくなります。

.NET 3.5にはBigIntegerクラスがあるはずでしたが、 カットされました

2
Powerlord

この thread の回答を参照してください。利用可能なサードパーティのビッグ整数ライブラリ/クラスのいずれかを使用するか、ネイティブBigIntegerデータ型を含むC#4.0を待つ必要があります。

1
Scott Dorman

これは役に立ちませんが、.Net 3.5にはBigIntegerクラスがあるはずでした。カットされましたが、PDCで作成されたステートメントからは、.Net 4.0になります。彼らは明らかにそれを最適化するのに多くの時間を費やしたので、パフォーマンスはあなたが今得ているものよりもはるかに良いはずです。

さらに、この質問は本質的に 。NETで非常に大きな整数を表すにはどうすればよいですか?

1
technophile

これは非常に有望に見えます。 [〜#〜] gmp [〜#〜] 上のC#ラッパーです。

http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html

.Netの他のBigIntegerオプションもあります here 特に、 Mpir.Net

1

また、私が書いた Math.Gmp.Native Nugetパッケージを使用することもできます。そのソースコードは GitHub で入手でき、ドキュメントは here で入手できます。 [〜#〜] gmp [〜#〜] ライブラリのすべての機能を.NETに公開します。これは、高度に最適化された任意精度の算術ライブラリとして知られています。

任意精度の整数は mpz_t タイプで表されます。これらの整数に対する操作はすべて、mpz_プレフィックスで始まります。たとえば、 mpz_add または mpz_cmp 。ソースコードの例は、各操作について示されています。

0
RobertBaron