奇怪的BigInteger.mod模数法

时间:2014-05-19 05:28:09

标签: java biginteger modular

在Java中,我们知道如果我们想要比较两个引用对象,我们通常需要使用equals,但在这里我对以下输出感到困惑:

System.out.println(new BigInteger("0") == BigInteger.ZERO);                     // false
System.out.println(new BigInteger("0").mod(BigInteger.ONE) == BigInteger.ZERO); // true

为什么第二个陈述是真的?

2 个答案:

答案 0 :(得分:5)

花了一段时间,但遵循执行的逻辑路径将我们带到:

MutableBigInteger#toBigInteger(int sign)

其中有以下声明:

BigInteger toBigInteger(int sign) {
    if (intLen == 0 || sign == 0)
        return BigInteger.ZERO;
    return new BigInteger(getMagnitudeArray(), sign);
}

因此,在这种情况下,返回常量BigInteger.ZERO,因此该语句为真。

堆栈追踪:

BigInteger#mod(BigInteger)
BigInteger#remainder(BigInteger)
BigInteger#remainderKnuth(BigInteger)
MutableBigInteger#toBigInteger(int)

答案 1 :(得分:0)

它是一个三方法实现:

public BigInteger mod(BigInteger m) {
if (m.signum <= 0)
    throw new ArithmeticException("BigInteger: modulus not positive");

BigInteger result = this.remainder(m);     // call remainder()
return (result.signum >= 0 ? result : result.add(m));  
}



public BigInteger remainder(BigInteger val) {
    MutableBigInteger q = new MutableBigInteger(),
                      a = new MutableBigInteger(this.mag),
                      b = new MutableBigInteger(val.mag);

    return a.divide(b, q).toBigInteger(this.signum); // call toBigInteger()
}



BigInteger toBigInteger(int sign) {
    if (intLen == 0 || sign == 0)
        return BigInteger.ZERO;    // here is your answer.
    return new BigInteger(getMagnitudeArray(), sign);
}