繁体   English   中英

有人可以解释一下这个 function 在 Java 中找到 BigInteger 的平方根吗?

[英]Can someone explain me this function that finds the square root of an BigInteger in Java?

所以我需要在 Java 9 之前对 BigInteger 进行 sqrt ,并且我在 function 下方找到了这样做。 我确实理解代码,但我真的不明白为什么它在那里。 所以我想我并没有真正理解它背后的数学原理。 就像为什么使用 (n / 32 + 8) 一样。 为什么 mid 是这样计算的。 等等

    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);
}

编辑:詹姆斯恢复莫妮卡波尔克是正确的,这不是巴比伦方法,而是二分法。 在回答之前我没有仔细看代码。 请看他的回答,因为它比我的更准确。

这看起来是近似平方根的巴比伦方法 (n/32 + 8) 只是用作“种子”,因为提供一个合理的起始值可以在更少的迭代中提供更好的近似值,而不是仅仅选择任何数字。

该算法是用于找到多项式x 2 - n = 0的零点的二分法 为什么将 ( n / 32 + 8 ) 用作种子? 我不知道,因为它是一个相当差的近似值。 n.shiftRight(n.bitLength()/2);更好的近似值几乎与计算一样便宜

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM