BigInteger構造体は.NET Framework 4より使用できるようになった構造体で、長大な整数を扱うのに便利な多倍長整数型です。 BigIntegerでは扱う値の大きさに合わせて格納領域の割り当てが行われるために扱える値に理論上の上限がなく、Int64やDecimalでは扱えないサイズの整数を扱うことができるようになっています。
なお、BigInteger構造体はアセンブリSystem.Numerics.dllに含まれています。 使用する場合は、System.Numerics.dllへの参照を追加する必要があります。
BigIntegerを使った例
次の例では、Int64とBigIntegerを使って1から30までの階乗を表示しています。 Int64では21!以上の値はオーバーフローするため正しくない結果が表示されていますが、BigIntegerでは正しい値が表示されています。
演算子
BigIntegerには、四則演算・ビット演算・比較演算などの各種演算子が定義されているため、プリミティブな整数型と同じように演算式を記述することができます。
BigIntegerでは、Addメソッド・Multiplyメソッド・Remainderメソッドなど各演算子の代替メソッドも静的メソッドとして用意されているため、これを用いて演算することもできます。 数学関数については、Mathクラスではなく§.数学関数で解説するメソッドを用います。
上記の結果からもわかるとおり、BigIntegerでもD
やX
などの書式指定子がサポートされています。 書式については§.文字列への変換・書式を指定した文字列化 (ToStringメソッド)でも解説します。
また、IComparable<BigInteger>, IEquatable<BigInteger>も実装しているので、BigIntegerの配列をソートしたり、このインターフェースを使用した比較も行えます。
IComparable<T>、IEquatable<T>については大小関係の定義と比較および等価性の定義と比較を参照してください。 ソートについては基本型のソートと昇順・降順でのソートを参照してください。
型変換
数値型との相互変換
BigIntegerでは、Int32などの整数型から/への型変換を行えるようになっています。 整数型へ変換する際、値が型の値域を越えている場合はOverflowExceptionがスローされます。
また、DoubleやDecimalなどの実数型からの/への変換も同様に行えます。 実数型からBigIntegerに型変換する場合、小数部は切り捨てられます。
Int32, Double, Decimalなどを引数にとるコンストラクタも用意されているので、これを使うこともできます。
文字列からの変換 (Parseメソッド・TryParseメソッド)
Parseメソッド、TryParseメソッドも用意されているので、文字列からBigIntegerを生成することもできます。
文字列への変換・書式を指定した文字列化 (ToStringメソッド)
ToStringメソッドを使うことでBigIntegerの値を文字列化することができます。 また、引数に書式指定文字列を指定すれば、その書式によって文字列化することもできます。
この他に使用できる書式指定文字列や、各書式の詳細については書式指定子を参照してください。
バイト配列への変換 (ToByteArrayメソッド)
BigIntegerをバイト配列に変換するには、ToByteArrayメソッドを使うことができます。 得られるバイト配列はリトルエンディアンになります。
また、BigIntegerのコンストラクタはバイト配列を引数にとるバージョンが用意されているので、バイト配列からBigIntegerを構築することもできます。
値の種類
BigIntegerには、格納されている値の種類を知るための次のようなプロパティが用意されています。
- IsZero
- 値が0かどうか。
- IsOne
- 値が1かどうか。
- IsEven
- 値が偶数かどうか。
- IsPowerOfTwo
- 値が2の累乗かどうか。
- Sign
- 値の符号を取得する。 返される値はInt32で、正なら1、負なら-1、0なら0が返される(Math.Signメソッドと同様の動作)
なお、0
、+1
、-1
の三値に相当する定数は静的プロパティとして用意されています。
数学関数
Mathクラスに用意されている数学関数は、BigIntegerをサポートしていません。 代わりに、これらの関数はBigInteger構造体のメソッドとして提供されています。 BigIntegerには次のようなメソッドが用意されています。 Mathクラスと同様、いずれも静的メソッドです。
関数 | BigIntegerのメソッド | 相当するMathクラスのメソッド |
---|---|---|
絶対値 |x| | BigInteger.Abs(x) | Math.Abs |
最大 max(x, y) | BigInteger.Max(x, y) | Math.Max |
最小 min(x, y) | BigInteger.Min(x, y) | Math.Min |
商と剰余 | BigInteger.DivRem(x, y, out remainder) | Math.DivRem |
累乗 xn | BigInteger.Pow(x, n) | Math.Pow |
自然対数 ln x | BigInteger.Log(x) | Math.Log |
常用対数 log10x | BigInteger.Log10(x) | Math.Log10 |
対数 logax | BigInteger.Log(x, a) | Math.Log |
関数 | BigIntegerのメソッド | 相当するMathクラスのメソッド |
次の例では、BigIntegerを使って5以上の階乗の値を求め、BigInteger.Log10メソッドでの桁数を求めて指数表記で表示しています。
また、Mathクラスでは提供されない、次のようなメソッドも用意されています。
- BigInteger.ModPow(value, exponent, modulus)
- 次の式で得られる剰余を求めます。 valueexponent mod modulus
- BigInteger.GreatestCommonDivisor(x, y)
- xとyの最大公約数を求めます。
一方で、java.math.BigIntegerにあるようなmodInverseやnextProbablePrimeなどのメソッドは用意されていません。
乱数
BigIntegerには乱数を生成するためのメソッドが用意されておらず、またRandomクラスもBigIntegerに対応したメソッドを持っていません。 ここではBigIntegerの乱数を生成する方法について見ていきます。 なお、以下で紹介する方法では乱数の分布等についてはあまり考慮していません。 必要とする乱数の性質に合わせて適切な方法を選んでください。
乱数の生成方法については乱数を参照してください。
Random.NextDoubleを使う方法
BigIntegerの乱数を生成する方法にはいくつかありますが、その一つはRandom.NextDoubleメソッドを使う方法です。 次の例では、0からdouble.MaxValueまで範囲にある乱数を生成し、BigIntegerに変換しています。
ただ、この方法ではdoubleで扱える範囲を越える大きさの乱数は生成出来ません。
Random.NextBytesを使う方法
もう一つの方法は、Random.NextBytesメソッドを使い、ランダムなビット列からBigIntegerを生成する方法です。 次の例では、0からdouble.MaxValueまで範囲にある乱数を生成し、BigIntegerに変換しています。
この方法では任意のビット数の乱数を生成できますが、Random.Nextメソッドのように上限・下限を指定したり、桁数を限定して生成することは出来ません。
文字列から生成する方法
また別の方法として、文字列を使う方法があげられます。 次の例では、100桁の乱数をまず文字列として生成し、その後BigIntegerに変換しています。