NET 4.xで導入されたC#のBigIntegerパッケージに代わるものを探しています。
このオブジェクトを使用した数学演算は非常に低速です。これは、算術演算がプリミティブ型よりも高いレベルで実行されるか、最適化が不十分であることが原因であると思います。
Int64 / long / ulongまたは他の64ビット数は小さく、正しく計算されません-私は64ビット整数について64ビット整数の累乗について話しています。
うまくいけば、誰かが私の何かを提案することができます。前もって感謝します。
NET 4.xで導入されたC#のBigIntegerパッケージに代わるものを探しています。
このオブジェクトを使用した数学演算は非常に低速です。これは、算術演算がプリミティブ型よりも高いレベルで実行されるか、最適化が不十分であることが原因であると思います。
Int64 / long / ulongまたは他の64ビット数は小さく、正しく計算されません-私は64ビット整数について64ビット整数の累乗について話しています。
うまくいけば、誰かが私の何かを提案することができます。前もって感謝します。
正直なところ、非常に大きな数があり、それらで重い計算を行う必要があり、BigIntegerライブラリがまだそれを処理していない場合は、あなたが知っている言語またはツールキットを使用して、それを外部プロセスにオフロードしてみませんか? 完全に C# で達成しようとしているものを書くことを本当に強制されていますか?
たとえば、C# で MATLAB にオフロードできます。
BIGInteger は確かに非常に遅いです。その理由の 1 つは、その不変性です。
a = a - b を実行すると、a の新しいコピーが得られます。通常、これは高速です。BigInteger では、2048 ビットの整数を言うと、余分な 2KB を割り当てる必要があります。
また、整数サイズに応じて異なる乗算アルゴリズムを持つ必要があります(それほど洗練されていないと思います)。つまり、非常に大きな整数の場合はフーリエ変換を使用する別のアルゴリズムが最適に機能し、小さな整数の場合は作業をより小さな乗算に分割します (分割統治アプローチ)。http://en.wikipedia.org/wiki/Multiplication_algorithmの詳細を参照してください。
いずれにせよ、代替手段はありますが、私が使用したりテストしたりしたものはありません。私が知っているすべての.NET内部としては遅いかもしれません。(テストケースを作成し、いくつかの有効なテストを行うことはあなたの友達です)
多くの自家製の BigInteger 実装のための Google 'C# large integer multiplication' (通常、BIGInteger が導入された C#4.0 より前から)
http://gmplib.org/ (C# ラッパーがあります)
http://mathnetnumerics.codeplex.com/ (素晴らしいオープンソースですが、非常に大きな整数にはあまり搭載されていません)