RFR: 8334755: Asymptotically faster implementation of square root algorithm [v32]

Raffaello Giulietti rgiulietti at openjdk.org
Thu Jul 18 15:30:38 UTC 2024


On Thu, 18 Jul 2024 13:09:08 GMT, fabioromano1 <duke at openjdk.org> wrote:

>> I have implemented the Zimmermann's square root algorithm, available in works [here](https://inria.hal.science/inria-00072854/en/) and [here](https://www.researchgate.net/publication/220532560_A_proof_of_GMP_square_root).
>> 
>> The algorithm is proved to be asymptotically faster than the Newton's Method, even for small numbers. To get an idea of how much the Newton's Method is slow,  consult my article [here](https://arxiv.org/abs/2406.07751), in which I compare Newton's Method with a version of classical square root algorithm that I implemented. After implementing Zimmermann's algorithm, it turns out that it is faster than my algorithm even for small numbers.
>
> fabioromano1 has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Uniforming the computation of long values' square root

src/java.base/share/classes/java/math/MutableBigInteger.java line 2032:

> 2030:                 s = s1;
> 2031:         }
> 2032:         return s;

Experimentally, the following seems a bit faster.
In some cases, it avoids a full multiplication, some updates, and has one less test.
I hope it is correct as well ;-)

Suggestion:

        long s = (long) Math.sqrt(x >= 0 ? x : x + 0x1p64);
        long s2 = s * s;  // overflows iff s = 2^32
        if (s == 1L << 32
                || Long.compareUnsigned(x, s2) < 0) {
            return s - 1;
        }
        if (Long.compareUnsigned(x, s2 + 2 * s) <= 0) {  // x < (s + 1)^2
            return s;
        }
        return s + 1;

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/19710#discussion_r1683053330


More information about the core-libs-dev mailing list