モジュール java.base
パッケージ java.math

クラスBigInteger

java.lang.Object
java.lang.Number
java.math.BigInteger
すべての実装されたインタフェース:
Serializable, Comparable<BigInteger>

public class BigInteger extends Number implements Comparable<BigInteger>
変更が不可能な、任意精度の整数です。 すべての演算は、BigIntegerが(Javaのプリミティブ整数型のような) 2値補数表記法で表されたかのように動作します。 BigIntegerは、Javaのすべてのプリミティブ整数演算子と、java.lang.Mathの関連するすべてのメソッドに同等のものを提供します。 また、BigIntegerは、モジュラ算術、GCD計算、素数度テスト、素数生成、ビット操作、その他のいくつかの操作に対する演算も提供します。

算術演算のセマンティックスは、『Java言語仕様』に定義されているようにJavaの整数算術演算子を正確に模倣します。 たとえば、ゼロ除算はArithmeticExceptionをスローし、正の数による負の数の除算は負(または0)の剰余を出します。

シフト演算のセマンティックスは、負のシフト移動量を可能にするためJavaのシフト演算子を拡張しています。 負のシフト移動量を持つ右シフトは左シフトとなります。逆の場合も同じです。 この操作では、無署名の右シフト演算子(>>>)は省略されていますが、概念的には固定の仮想符号ビットの数が無限の表現ではなく、概念的には固定のサイズではありません。

ビット単位の論理演算のセマンティックスは、Javaのビット整数演算子のセマンティックスを正確に模倣しています。 2項演算子(andorxor)は、演算前に2つのオペランドの短い方に対して暗黙的に符号拡張を行います。

比較演算は符号付き整数の比較を行います。これは、Javaの関連する演算子および同等の演算子により行われるものと同じです。

モジュラ算術演算は、剰余計算、べき乗、および乗法逆数計算のために提供されています。 これらのメソッドは、常に0(modulus - 1)の間の負でない結果を返します。

ビット演算は、オペランドの2の補数表現のシングル・ビットに使用します。 必要に応じて、指定されたビットが含まれるようにオペランドが拡張されます。 単一ビット操作では、操作対象のBigIntegerとは異なる符号を使用してBigIntegerを生成することはできません。このクラスで提供される任意の大規模な抽象化によって、各BigIntegerの前にある"仮想符号ビット"が無制限に存在することが保証されます。

説明をわかりやすく簡潔にするために、BigIntegerメソッドの説明では全体を通して擬似コードを使用します。 擬似コード式(i+j)は、「値がBigInteger iの値とBigInteger jの値の和であるBigInteger」を示します。 擬似コード式(i == j)は、「BigInteger iがBigInteger jと同じ値を表す場合にだけtrueであること」を示します。 ほかの擬似コード式も同じように解釈されます。

このクラスのメソッドおよびコンストラクタはすべて、入力パラメータに対してnullオブジェクト参照が渡されるとNullPointerExceptionをスローします。 BigIntegerは、-2Integer.MAX_VALUE (これを含まない)から+2Integer.MAX_VALUE (これを含まない)までの範囲の値をサポートする必要があり、この範囲外の値をサポートすることもできます。 BigIntegerコンストラクタまたはメソッドがサポートされている範囲外の値を生成すると、ArithmeticExceptionがスローされます。 確率的素数の値の範囲は限られ、BigIntegerでサポートされる正の範囲全体より小さい場合があります。 範囲は少なくとも1から2500000000でなければなりません。

APIのノート:
BigInteger値は任意の精度整数であるため、このクラスのメソッドのアルゴリズムの複雑さは変化し、入力のサイズが超線形になる可能性があります。 たとえば、intValue()のようなメソッドは、inO(1)を実行することが想定されます。これは、現在の内部表現では、intへの変換を実行するために、BigIntegerの固定サイズのコンポーネントのみにアクセスする必要があるため、一定の時間です。 対照的に、not()のようなメソッドは、inO(n)時間を実行します。ここで、nBigIntegerのサイズ(ビット単位)です。つまり、入力のサイズに比例して時間内に実行されます。 サイズnの2つのBigInteger値を乗算する場合、ナイーブ乗算アルゴリズムがtimeO(n2)で実行され、理論結果は、このカテゴリの表現を使用する数値の乗算アルゴリズムが「少なくとも」 O(n log n)で実行される必要があることを示します。 ナイブ・ケースと理論的ケースの境界間の共通の乗算アルゴリズムには、Karatsuba multiplication(O(n1.585)と3ウェイToom-Cook multiplication(O(n1.465)があります。

multiplyの特定の実装は、異なる入力に対して異なるアルゴリズムを自由に切り替えることができます。たとえば、より単純なアルゴリズムが漸近的複雑度が大きい場合でも、より単純な入力に対してより単純なアルゴリズムを使用して製品を生成する実際の実行時間を短縮できます。

操作では、中間結果を割り当ててコンピュートすることもできます。これらの割当ては、アルゴリズムの実行時間に比例して大きくなる可能性があります。

実行時間または操作領域の境界に関するBigIntegerのユーザーは、選択した大きさを超えるBigInteger値をスクリーニングできます。

実装上のノート:
リファレンス実装では、結果が -2Integer.MAX_VALUE (exclusive)から+2Integer.MAX_VALUE (exclusive)までの範囲外である場合、BigIntegerコンストラクタと操作はArithmeticExceptionをスローします。
Java言語仕様を参照してください:
4.2.2 整数演算
導入されたバージョン:
1.1
関連項目: