簡體   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