私は.NETで遊んでいます BigInteger と基本的に私はどのような数だろうと思っています-推定答えは大丈夫だと思います-((操作に必要な時間の増加)と(BigIntegerの値)のグラフ)の曲線の偏差点はありますか?
または、操作に必要な時間とBigIntegerの値の増加を1から無限大にプロットすると、滑らかな曲線ができるように、そのような偏差がないように設計されていますか?
たとえば、配列が50アイテムを処理できるように設計されているとします。これは、1つのアイテムがある場合、演算はf(1)時間です。2つのアイテムがある場合、演算はf(2)時間です。 50個のアイテムがある場合、操作はf(50)時間ですが、50個のアイテムのみを処理するように設計されているため、51個のアイテムがある場合に実行される操作はg(51)ここでg(51)> f(51)です。
適切に実装されている場合、BigInteger演算の複雑さは滑らかな曲線になるはずです。たとえば、乗算の時間の複雑さはO(NM)である必要があります。Nは最初の被乗数の桁数、Mは2番目の被乗数の桁数です。もちろん、 NとMが非常に大きいので、数値がマシンに収まらないという現実的な制限があります。
それがそのように実装されていると主張するドキュメントはありますか/誰か知っていますか?
ULong.MaxValueより大きくなる可能性がある、またはLong.MinValueより小さくなる可能性がある任意の数値は、BigIntegerを使用して表す必要があります。
NOT(Long.MinValue <= X <= ULong.MaxValue)の場合、BigInteger
BigIntegerは、通常のプリミティブが処理できる数よりも大きい数に対応しています。
たとえば、整数がLongの範囲外の場合は、おそらくBigIntegerを使用する必要があります。ただし、これらのケースは非常にまれであり、これらのクラスを使用すると、プリミティブの場合よりもオーバーヘッドが大幅に高くなります。
たとえば、long
は64ビット幅で、-9,223,372,036,854,775,808〜9,223,372,036,854,775,80の範囲を保持できます。 ulongは0〜18,446,744,073,709,551,615を保持できます。数値がそれよりも大きいか小さい場合、BigIntegerが唯一のオプションです
私がそれらを実際のアプリケーションで使用するのを見たのは、スターチアーティングアプリケーションだけでした。
参照: 。NETのプリミティブ範囲
メモリ制限
BigIntegerは、ストレージをint配列に依存しています。これを想定すると、BigIntegerが表現できる最大数の理論上の制限は、.netで使用可能な最大配列サイズから導出できます。ここにSO配列に関するトピックがあります: C#で配列に割り当てることができるメモリ量を見つける 。
最大配列サイズがわかっていると仮定すると、BigIntegerが表すことができる最大数を推定できます:(2 ^ 32)^ max_array_size、ここで:
これにより、6億桁の10進数字が得られます。
パフォーマンス制限
パフォーマンスに関しては、BigIntegerは カラツバアルゴリズム を乗算に使用し、線形アルゴリズムを加算に使用します。乗算の複雑さは 、つまり、大きな数値( 複雑度グラフ )でも十分にスケーリングされますが、RAMとプロセッサキャッシュのサイズによっては、パフォーマンスが低下する可能性があります。
最大数のサイズが2GBに制限されている限り、降下マシンでは予期しないパフォーマンスギャップは発生しませんが、6億桁の数値での操作は非常に遅くなります。
ある意味で、BigIntegerのポイントは、無制限の精度なので、絶対サイズではありません。浮動小数点数も非常に大きくなる可能性がありますが、精度に制限があります。 BigIntegerを使用すると、丸めエラーやオーバーフローを心配せずに演算を実行できます。あなたが支払う代償は、通常の整数や浮動小数点数を使った算術よりも何百倍も遅いということです。
他の人が指摘したように、ulongは0から18,446,744,073,709,551,615の範囲で保持でき、その範囲内にいる限り、正確な計算を実行できます。その範囲を1つでも超えるとオーバーフローが発生するため、正確な演算が必要で、中間結果が18,446,744,073,709,551,615を超える可能性がある場合は、BigIntegerを使用して質問に答えてください。
科学、エンジニアリング、および財務のほとんどの問題は、浮動小数点数によって強制される近似に耐えることができ、BigInteger演算の時間コストを賄うことができません。ほとんどの商用計算は、浮動小数点演算の近似では機能しませんが、0〜18,446,744,073,709,551,615の範囲内で機能するため、通常の演算を使用できます。 BigIntegerは、暗号法(50桁の素数と考えてください)などの数論のアルゴリズムを使用する場合に必要です。また、正確な計算が必要で、速度がそれほど重要ではなく、適切な固定小数点システムを設定するのが面倒すぎるときに、商用アプリケーションで使用されることもあります。
適切に実装されている場合、BigInteger演算の複雑さは滑らかな曲線になるはずです。たとえば、乗算の時間の複雑さはO(NM)である必要があります。Nは最初の被乗数の桁数、Mは2番目の被乗数の桁数です。もちろん、 NとMが非常に大きいので、数値がマシンに収まらないという現実的な制限があります。
「bigintegerの計算の複雑さ」をググると、棒を振るよりも多くの参照が得られます。あなたの質問に直接話すのはこれです: 2つの任意精度の算術パッケージの比較 。
制限はメモリサイズ(および時間)です。だから、あなたは本当に大きな数を持つことができます。ケビンが言ったように、暗号法では数千(2進)桁の数値を乗算または指数化する必要があり、これは問題なく可能です。
もちろん、数値が大きくなるとアルゴリズムは遅くなりますが、それほど遅くはありません。
メガ桁の範囲の数値を使用している場合は、他のソリューションについて検討する必要があるかもしれません。ただし、実際に計算すると速度も低下します。
科学界にはいくつかの用途があります(つまり、銀河間の距離、草原の原子数など)。