On Fri, 12 Jul 2024 13:51:24 GMT, fabioromano1 <d...@openjdk.org> wrote:

>> src/java.base/share/classes/java/math/MutableBigInteger.java line 1967:
>> 
>>> 1965:         MutableBigInteger[] sqrtRem = x.sqrtRemZimmermann(x.intLen, 
>>> needRemainder);
>>> 1966: 
>>> 1967:         // Unnormalize
>> 
>> This unnormalization code, as well as the one in the next method, requires a 
>> full explanation, perhaps in abstract, mathematical terms, to help 
>> understanding.
>
> The full explanation for the unnormalization is in the second paper, "A proof 
> of GMP square root", par. 3.2 at page 11.

Well, I have to compare that section, which is clear to me, with the code again.

>> src/java.base/share/classes/java/math/MutableBigInteger.java line 1997:
>> 
>>> 1995:         if (len == 2) { // Base case
>>> 1996:             long x = ((value[offset] & LONG_MASK) << 32) | 
>>> (value[offset + 1] & LONG_MASK);
>>> 1997:             long s = (long) Math.sqrt(x > 0 ? x : x + 0x1p64);
>> 
>> Again, this needs a proof that doing so is always correct.
>> 
>> Suggestion:
>> 
>>             long s = (long) Math.sqrt(x >= 0 ? x : x + 0x1p64);
>
> Here there's no need to modify `x > 0` with `x >= 0`.

Sure, but again: changing `>` to `>=` makes the code correct even for `0`.

>> src/java.base/share/classes/java/math/MutableBigInteger.java line 2020:
>> 
>>> 2018:          * The length is normalized to a mutiple of 4 because, in 
>>> this way,
>>> 2019:          * the input can be always split in blocks of words without 
>>> twiddling with bits.
>>> 2020:          */
>> 
>> What's substantially different here from the Bertot, Magaud, Zimmermann 
>> paper?
>> This is not explained in detail, so it is way harder to understand than the 
>> paper.
>
> In the paper, the input is normalized to an even number of words... but this 
> is not done in the pseudocode, since the pseudocode assumes that the input is 
> already normalized, so actually there's no substantial difference...

Yes, normalization is done in ยง3.2. Will have another look.

>> src/java.base/share/classes/java/math/MutableBigInteger.java line 2021:
>> 
>>> 2019:          * the input can be always split in blocks of words without 
>>> twiddling with bits.
>>> 2020:          */
>>> 2021:         final int limit = len;
>> 
>> The name `limit` reminds more an offset than a length.
>
> The solution can be either to change its name, or to use it as an offset, but 
> this second involves to modify the logic of the code, with higher risk of 
> introducing errors.

I suggest changing the name: `maxLen`, `hiLen`, something similar.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/19710#discussion_r1676036185
PR Review Comment: https://git.openjdk.org/jdk/pull/19710#discussion_r1676037890
PR Review Comment: https://git.openjdk.org/jdk/pull/19710#discussion_r1676039724
PR Review Comment: https://git.openjdk.org/jdk/pull/19710#discussion_r1676040186

Reply via email to