web-dev-qa-db-fra.com

Comment comparer les valeurs de BigInteger à utiliser comme condition dans une boucle?

J'essaie de comparer si la valeur d'un BigInteger (base) est> la valeur d'un autre BigInteger (prime) et si la valeur de 'a' n'est pas égale à un. Si la valeur de a n'est pas 1, il devrait sortir de la boucle. Comment dois-je les comparer?

 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;          
        }   
    }
13
Scar

Vous pouvez les comparer avec BigInteger.compareTo(BigInteger) .

Dans votre cas, ce serait while (base.compareTo(prime) > 0) {...}.

De plus, votre condition de terminaison doit passer de if (a != one) à if (!a.equals(one)) puisque deux variables BigInteger avec le même entier ne font pas nécessairement référence au même objet (ce qui correspond à tout ce que == et != testent).

29
Ted Hopp

Puisque BigIntegers sont des objets, vous devez faire preuve de prudence lorsque vous utilisez les opérateurs d'égalité. À l'heure actuelle, vous effectuez une comparaison de références (qui, dans ce cas, échouera probablement). Vous devrez utiliser les méthodes equals() ou compareTo().

BigInteger a une variable statique intégrée qui en représente une. Utilisez la méthode equals() ou la méthode compareTo() pour comparer les valeurs:

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

-ou-

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

J'espère que cela pourra aider! Voir ici pour plus d'informations: http://download.Oracle.com/javase/6/docs/api/Java/math/BigInteger.html

7
Doug Swain

Peut être

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