Как сравнить значения BigInteger для использования в качестве условия в цикле? - PullRequest
15 голосов
/ 02 июня 2011

Я пытаюсь сравнить, является ли значение одного BigInteger (базового)> значением другого BigInteger (простого) и если значение 'a' не равно единице. Если значение 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;          
        }   
    }

Ответы [ 3 ]

30 голосов
/ 02 июня 2011

Вы можете сравнить их, используя BigInteger.compareTo(BigInteger).

В вашем случае это будет while (base.compareTo(prime) > 0) {...}.

Кроме того, ваше условие завершения должно быть изменено сif (a != one) до if (!a.equals(one)), поскольку две BigInteger переменные с одним и тем же целочисленным значением не обязательно ссылаются на один и тот же объект (то есть все, что == и != test).

7 голосов
/ 02 июня 2011

Поскольку BigInteger s являются объектами, вы должны соблюдать осторожность при использовании операторов равенства. Прямо сейчас вы выполняете сравнительное сравнение (которое в этом случае, скорее всего, потерпит неудачу). Вам нужно будет использовать методы 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

0 голосов
/ 02 июня 2011

Может

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