web-dev-qa-db-ja.com

ループの条件として使用されるBigIntegerの値をどのように比較しますか?

1つのBigInteger(base)の値が別のBigInteger(prime)の値より大きいかどうか、および 'a'の値が1と等しくないかどうかを比較しようとしています。 aの値が1でない場合、ループから抜け出す必要があります。それらをどのように比較すればよいですか?

 Random ran = new Random();
    BigInteger prime = new BigInteger(16,ran);
    BigInteger base,a,one;
    one = new BigInteger("1");

    for (int i = 0; i < 65535; i++){

        while (base>prime){
            base = new BigInteger(16,ran);
        }
        a = base.modPow(prime.subtract(one),prime);
        System.out.println("a: "+a);    
        if (a != one){
            break;          
        }   
    }
17
Scar

BigInteger.compareTo(BigInteger) を使用してそれらを比較できます。

あなたの場合、これはwhile (base.compareTo(prime) > 0) {...}になります。

また、同じ整数値を持つ2つのBigInteger変数が必ずしも同じオブジェクトを参照しているとは限らないため、終了条件をif (a != one)からif (!a.equals(one))に変更する必要があります(つまり、 ==および!=テスト)。

33
Ted Hopp

BigIntegersはオブジェクトなので、等価演算子を使用するときは注意が必要です。現在、参照比較を実行しています(この場合は、おそらく失敗します)。 equals()またはcompareTo()メソッドを使用する必要があります。

BigIntegerには、静的変数を表す組み込みの静的変数があります。値を比較するには、equals()メソッドまたはcompareTo()メソッドを使用します。

if (!a.equals(BigInteger.ONE)) {
    ...
}

-または-

if (a.compareTo(BigInteger.ONE) != 0) {
    ...
}

お役に立てば幸いです。詳細については、こちらを参照してください: http://download.Oracle.com/javase/6/docs/api/Java/math/BigInteger.html

7
pseudoramble

多分

while (base.compareTo(prime)>0){
//rest of your loop
}
0
james_bond