【问题标题】:Can someone explain me this function that finds the square root of an BigInteger in Java?有人能解释一下这个在 Java 中找到 BigInteger 平方根的函数吗?
【发布时间】:2019-11-06 21:58:57
【问题描述】:

所以我需要在 Java 9 之前对 BigInteger 进行 sqrt,我发现下面的函数可以做到这一点。我确实理解代码,但我真的不明白为什么它在那里。所以我想我并没有真正理解它背后的数学原理。就像为什么使用 (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);
}

【问题讨论】:

标签: java biginteger square-root


【解决方案1】:

编辑: James Reinstate Monica Polk is correct,这不是巴比伦方法,而是二分法。在回答之前我没有仔细看代码。请看他的回答,因为它比我的更准确。

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

【讨论】:

  • 我不同意,它不是巴比伦的方法。而是二分法。二分法比巴比伦法收敛得更慢。
【解决方案2】:

算法是 bisection method 应用于找到多项式的零 x2 - n = 0时间>。为什么将 (n / 32 + 8) 用作种子?我不知道,因为它是一个相当差的近似值。 n.shiftRight(n.bitLength()/2);

【讨论】:

  • 你说得对,我在回答之前没有仔细看代码,在回答之前我不知道二分法。谢谢指正。
猜你喜欢
  • 2019-10-24
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2020-08-02
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多