On Wed, 7 May 2025 18:32:50 GMT, fabioromano1 <d...@openjdk.org> wrote:

>> This PR optimizes `BigInteger.pow(int)` method. The primary enhancement in 
>> `pow()` is not concerned most on execution time, but rather in memory 
>> optimization, because the PR implementation does the "shift of the exponent" 
>> squaring the result rather than the base, so the base is not squared like in 
>> the current implementation, and this permits to save about half of the 
>> memory.
>
> fabioromano1 has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Suggested changes

Last nits.

I'll approve the PR in the next couple of days for last minute small changes 
from you.

src/java.base/share/classes/java/math/BigInteger.java line 2656:

> 2654:             // Perform exponentiation using repeated squaring trick
> 2655:             // The loop relies on this invariant:
> 2656:             // base^exponent == answer^(2^expLen) * base^(exponent & 
> (2^expLen - 1))

The invariant is correct, but it should minimally involve all running variables 
updated in the loop, including `workingExp`. Otherwise, reasoning about the 
invariant becomes harder.

Further, I suggest to replace the subexpression `exponent & (2^expLen - 1)` 
with the more mathematical `exponent % (2^expLen)`.

test/micro/org/openjdk/bench/java/math/BigIntegerPow.java line 62:

> 60:      * Each array entry is atmost 64 bits
> 61:      * in size
> 62:      */

This can be re-flowed more compactly like so (and similarly for the other 
fields)
Suggestion:

    private int xsExp = (1 << 20) - 1;
    /* Each array entry is at most 64 bits in size */
    private BigInteger[] xsArray = new BigInteger[TESTSIZE];

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

PR Review: https://git.openjdk.org/jdk/pull/24690#pullrequestreview-2824381118
PR Review Comment: https://git.openjdk.org/jdk/pull/24690#discussion_r2079247545
PR Review Comment: https://git.openjdk.org/jdk/pull/24690#discussion_r2079251316

Reply via email to