因此,我需要在Java 9之前的版本中对BigInteger进行sqrt,然后发现下面的函数可以做到这一点。我确实了解该代码,但是我真的不明白为什么要在那里。因此,我想我并没有真正了解其背后的数学原理。就像为什么要使用(n / 32 + 8)。为什么要按中间方式计算中间值。等等
BigInteger a = BigInteger.ONE;
BigInteger b = n.shiftRight(5).add(BigInteger.valueOf(8));
while (b.compareTo(a) >= 0) {
BigInteger mid = a.add(b).shiftRight(1);
if (mid.multiply(mid).compareTo(n) > 0) {
b = mid.subtract(BigInteger.ONE);
} else {
a = mid.add(BigInteger.ONE);
}
}
return a.subtract(BigInteger.ONE);
}
该算法是二等分方法,用于求多项式x 2 - n = 0的零。为什么将(n / 32 + 8)用作种子?我不知道这是一个很差的近似值。更好的近似值几乎是便宜的计算是n.shiftRight(n.bitLength()/2);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句