Java Language
BigInteger
サーチ…
前書き
BigInteger
クラスは、プリミティブデータ型には大きすぎる大きな整数を含む数学演算に使用されます。たとえば、100階乗は158桁です。これは、 long
よりもはるかに大きくなります。 BigInteger
は、Javaのプリミティブ整数演算子のすべて、およびjava.lang.Math
からの関連するすべてのメソッド、および他のほとんどの操作に類似したものを提供しjava.lang.Math
。
構文
- BigInteger variable_name =新しいBigInteger( "12345678901234567890"); //文字列としての10進整数
- BigInteger variable_name = new BigInteger( "1010101101010100101010011000110011101011000111110000101011010010"、2)//文字列としての2進整数
- BigInteger variable_name = new BigInteger( "ab54a98ceb1f0800"、16)//文字列としての16進整数
- BigInteger variable_name =新しいBigInteger(64、新しいランダム()); // 64ビットを供給して整数を構成する擬似乱数生成器
- BigInteger variable_name = new BigInteger(新しいバイト[] {0、-85、84、-87、-116、-21、31、10、-46}); //整数の符号付き2の補数表現(ビッグエンディアン)
- BigInteger variable_name = new BigInteger(1、新しいバイト[] { - 85,84、-87、-116、-21、31、10、-46}); //正の整数の符号なし2の補数表現(ビッグエンディアン)
備考
BigInteger
は不変です。したがって、その状態を変更することはできません。たとえば、不変性のためにsum
が更新されないため、以下は動作しません。
BigInteger sum = BigInteger.ZERO;
for(int i = 1; i < 5000; i++) {
sum.add(BigInteger.valueOf(i));
}
結果をsum
変数に代入して、動作させます。
sum = sum.add(BigInteger.valueOf(i));
BigInteger
の公式文書によると、 BigInteger
実装では、-2 2147483647と2 2147483647の間のすべての整数がサポートされるはずです。つまり、 BigInteger
のビット数は20億を超えることができます!
初期化
java.math.BigInteger
クラスは、Javaのすべてのプリミティブ整数演算子と、 java.lang.Math
関連するすべてのメソッドに対して類似の演算を提供しjava.lang.Math
。 java.math
パッケージは自動的に利用できないため、単純なクラス名を使用する前にjava.math.BigInteger
をインポートする必要があります。
long
またはint
値をBigInteger
変換するには、次のようにします。
long longValue = Long.MAX_VALUE;
BigInteger valueFromLong = BigInteger.valueOf(longValue);
または、整数の場合:
int intValue = Integer.MIN_VALUE; // negative
BigInteger valueFromInt = BigInteger.valueOf(intValue);
これ広げるであろうintValue
負の値は負とどまるように、負の値の符号ビット拡張を使用して、長尺の整数です。
数値のString
をBigInteger
変換するには:
String decimalString = "-1";
BigInteger valueFromDecimalString = new BigInteger(decimalString);
次のコンストラクタは、の文字列表現に変換するために使用されBigInteger
に指定された基数でのBigInteger
。
String binaryString = "10";
int binaryRadix = 2;
BigInteger valueFromBinaryString = new BigInteger(binaryString , binaryRadix);
Javaでは、 BigInteger
インスタンスへのバイトの直接変換もサポートされています。現在は、符号付きおよび符号なしのビッグエンディアンエンコーディングのみが使用できます。
byte[] bytes = new byte[] { (byte) 0x80 };
BigInteger valueFromBytes = new BigInteger(bytes);
これにより、最初のビットが符号ビットとして解釈されるため、値-128のBigInteger
インスタンスが生成されます。
byte[] unsignedBytes = new byte[] { (byte) 0x80 };
int sign = 1; // positive
BigInteger valueFromUnsignedBytes = new BigInteger(sign, unsignedBytes);
これは、バイトが符号なし数値として解釈され、符号が明示的に1の正の数に設定されるため、値が128のBigInteger
インスタンスを生成します。
共通の値にはあらかじめ定義された定数があります。
-
BigInteger.ZERO
- 値が「0」です。 -
BigInteger.ONE
- 値が「1」です。 -
BigInteger.TEN
- 値が「10」です。
BigInteger.TWO
(値 "2")もありますが、 private
ためコードで使用することはできません。
BigIntegersの比較
BigIntegers
は、JavaのString
や他のオブジェクトと比較するのと同じものを比較できます。
例えば:
BigInteger one = BigInteger.valueOf(1);
BigInteger two = BigInteger.valueOf(2);
if(one.equals(two)){
System.out.println("Equal");
}
else{
System.out.println("Not Equal");
}
出力:
Not Equal
注意:
一般に、BigIntegersを比較するために==
演算子を使用しないでください
-
==
演算子:参照を比較します。つまり、2つの値が同じオブジェクトを参照しているかどうか -
equals()
メソッド:2つのBigIntegerの内容を比較します。
たとえば、BigIntegersは次のように比較しないでください。
if (firstBigInteger == secondBigInteger) {
// Only checks for reference equality, not content equality!
}
==
演算子が参照平等のみをチェックするので、予期しない動作につながる可能性があります。両方のBigIntegerに同じコンテンツが含まれていて、同じオブジェクトを参照していない場合、 これは失敗します。代わりに、上で説明したように、 equals
メソッドを使用してBigIntegersを比較します。
BigInteger
と0,1,10のような定数を比較することもできます。
例えば:
BigInteger reallyBig = BigInteger.valueOf(1);
if(BigInteger.ONE.equals(reallyBig)){
//code when they are equal.
}
次のように、 compareTo()
メソッドを使用して2つのBigIntegerを比較することもできますcompareTo()
は3つの値を返します。
- 0:両方が等しい場合 。
- 1:最初の値が 2番目の値よりも大きい場合 (括弧内の値)。
- -1:最初のものが2番目のものよりも小さいとき。
BigInteger reallyBig = BigInteger.valueOf(10);
BigInteger reallyBig1 = BigInteger.valueOf(100);
if(reallyBig.compareTo(reallyBig1) == 0){
//code when both are equal.
}
else if(reallyBig.compareTo(reallyBig1) == 1){
//code when reallyBig is greater than reallyBig1.
}
else if(reallyBig.compareTo(reallyBig1) == -1){
//code when reallyBig is less than reallyBig1.
}
BigIntegerの数学演算の例
BigIntegerは不変オブジェクトであるため、任意の数学演算の結果を新しいBigIntegerインスタンスに割り当てる必要があります。
加算: 10 + 10 = 20
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("10");
BigInteger sum = value1.add(value2);
System.out.println(sum);
出力:20
除算: 10 - 9 = 1
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("9");
BigInteger sub = value1.subtract(value2);
System.out.println(sub);
出力:1
部門: 10/5 = 2
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("5");
BigInteger div = value1.divide(value2);
System.out.println(div);
出力:2
部門: 17/4 = 4
BigInteger value1 = new BigInteger("17");
BigInteger value2 = new BigInteger("4");
BigInteger div = value1.divide(value2);
System.out.println(div);
出力:4
乗算: 10 * 5 = 50
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("5");
BigInteger mul = value1.multiply(value2);
System.out.println(mul);
出力:50
電力: 10 ^ 3 = 1000
BigInteger value1 = new BigInteger("10");
BigInteger power = value1.pow(3);
System.out.println(power);
出力:1000
残り: 10%6 = 4
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("6");
BigInteger power = value1.remainder(value2);
System.out.println(power);
出力:4
GCD: 12
と18
最大公約数(GCD)は6
です。
BigInteger value1 = new BigInteger("12");
BigInteger value2 = new BigInteger("18");
System.out.println(value1.gcd(value2));
出力:6
最大 2つのBigInteger:
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("11");
System.out.println(value1.max(value2));
出力:11
最低 2つのBigInteger:
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("11");
System.out.println(value1.min(value2));
出力:10
BigIntegerのバイナリロジック演算
BigIntegerはNumber
型でも使用できるバイナリロジック演算をサポートしています。すべての操作と同様に、メソッドを呼び出すことで実装されます。
バイナリまたは:
BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");
val1.or(val2);
出力:11(これは
10 | 9
相当)
バイナリと:
BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");
val1.and(val2);
出力:8(
10 & 9
相当)
バイナリXOR:
BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");
val1.xor(val2);
出力:3(
10 ^ 9
相当)
RightShift:
BigInteger val1 = new BigInteger("10");
val1.shiftRight(1); // the argument be an Integer
出力:5(
10 >> 1
相当)
左方移動:
BigInteger val1 = new BigInteger("10");
val1.shiftLeft(1); // here parameter should be Integer
出力:20(
10 << 1
相当)
バイナリ反転(Not):
BigInteger val1 = new BigInteger("10");
val1.not();
出力:5
NAND(And-Not): *
BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");
val1.andNot(val2);
出力:7
ランダムBigIntegersの生成
BigInteger
クラスには、 java.util.Random
インスタンスとBigInteger
持つビット数を指定するint
を与えられたランダムBigIntegers
を生成する専用のコンストラクタがあります。その使い方は非常に簡単です。次のようにBigInteger(int, Random)
コンストラクタを呼び出すと、
BigInteger randomBigInt = new BigInteger(bitCount, sourceOfRandomness);
値が0(両端を含む)から2 bitCount
(これを含まない)までのBigInteger
ます。
これは、 new BigInteger(2147483647, sourceOfRandomness)
がnew BigInteger(2147483647, sourceOfRandomness)
十分な時間が与えられたすべての正のBigInteger
返すこともあることを意味します。
sourceOfRandomness
はあなた次第です。たとえば、 new Random()
はほとんどの場合十分です:
new BigInteger(32, new Random());
高品質の乱数の速度をあきらめたい場合は、代わりにnew SecureRandom ()
使うことができます:
import java.security.SecureRandom;
// somewhere in the code...
new BigInteger(32, new SecureRandom());
匿名クラスでオンザフライでアルゴリズムを実装することもできます! ロールアウト独自のRNGアルゴリズムはそういつもあなたがた場合を除き、まともであることが証明されたアルゴリズムを使用してください、 低品質のランダムであなたを終わることに注意してくださいBigInteger
予測可能であることを(複数可)。
new BigInteger(32, new Random() {
int seed = 0;
@Override
protected int next(int bits) {
seed = ((22695477 * seed) + 1) & 2147483647; // Values shamelessly stolen from Wikipedia
return seed;
}
});