I’m new to Java and just code a program with BigInteger.
public static void main(String[] args) {
BigInteger n = new BigInteger("5");
BigInteger i = new BigInteger("2");
while (lesserOrEqual(i,n) {
System.out.println("n.mod(i) = "+n.mod(i));
if (n.mod(i) == ZERO) {
n = n.divide(i);
}
else {
i.add(ONE);
}
System.out.println("n = "+n);
System.out.println("i = "+i);
}
public static boolean lesserOrEqual(BigInteger m, BigInteger n) `{
if (m.compareTo(n) == -1 || m.compareTo(n) == 0)
return true;
return false;
}
ZERO and ONE are defined of the type BigInteger 0, 1, respectively.
I want “i=2” to divide “n=5”, if “n mod i == 0”, else “i++”, until “n” to be lesser or equal to “i”.
I think the output must be
n.mod(i) = 1
n = 5
i = 3
n.mod(i) = 2
n = 5
i = 4
n.mod(i) = 1
n = 5
i = 5
n.mod(i) = 0
n = 1
i = 5
and with the equivalent code with primitive type int, I have the result as expected.
but this with BigInteger goes to infinite loop
n.mod(i) = 1
n = 5
i = 2
...
Does anyone know why it is so?
The BigInteger class represents integers as immutable objects.
There are two points here.
==to test if twoBigIntegers are equali = i.add(ONE);and not justi.add(ONE);.The reason not to use
==to compareBigIntegers is because instead of checking for numerical equality you are checking that they are the same object in memory.Consider with
Strings.In the above example
x.equals(y)is true because they contain the same number of characters in exactly the same order. However,x == yis not true because they are different objects in memory.The reason you need to to assign the result of arithmetic operations to a variable is because BigInteger is immutable. Thus arithmetic operations cannot change the value of the object it is operating on, but it can create a new BigInteger (which it returns). Which is why you must assign the result of the arithmetic operation to the variable you want it saved in.
As an aside a shortcut for your lesserThanOrEqual to is this.
Basically
m == nbecomesm.compareTo(n) == 0m != nbecomesm.compareTo(n) != 0m < nbecomesm.compareTo(n) < 0m > nbecomesm.compareTo(n) > 0m <= nbecomesm.compareTo(n) <= 0m >= nbecomesm.compareTo(n) >= 0