JDK 9 RFR of 8058505: BigIntegerTest does not exercise Burnikel-Ziegler division

Joe Darcy joe.darcy at oracle.com
Tue Sep 16 00:04:01 UTC 2014


Hi Brian,

The test change looks fine; thanks,

-Joe

On 9/15/2014 1:30 PM, Brian Burkhalter wrote:
> Hello,
>
> This is a test-only change.
>
> Issue:https://bugs.openjdk.java.net/browse/JDK-8058505
> Webrev:http://cr.openjdk.java.net/~bpb/8058505/webrev.00/ 
> <http://cr.openjdk.java.net/%7Ebpb/8058505/webrev.00/>
>
> I verified that the updated version passes (as mentioned below) and in 
> fact exercises the B-Z division branch of the library code.
>
> Thanks,
>
> Brian
>
> On Sep 15, 2014, at 7:17 AM, Robert Gibson <robbiexgibson at yahoo.com 
> <mailto:robbiexgibson at yahoo.com>> wrote:
>
>> Here is a patch to fix the test bug mentioned previously.  The 
>> Burnikel-Ziegler division code is now exercised, and you'll be glad 
>> to know that the tests still pass!
>> Robert
>>
>> --- BigIntegerTest.java 2014-09-15 15:55:47.632012000 +0200
>> +++ BigIntegerTestPatched.java  2014-09-15 16:07:53.363563000 +0200
>> @@ -71,6 +71,7 @@
>>     static final int BITS_TOOM_COOK_SQUARE = 6912;
>>     static final int BITS_SCHOENHAGE_BASE = 640;
>>     static final int BITS_BURNIKEL_ZIEGLER = 2560;
>> +    static final int BITS_BURNIKEL_ZIEGLER_OFFSET = 1280;
>>     static final int ORDER_SMALL = 60;
>>     static final int ORDER_MEDIUM = 100;
>> @@ -288,19 +289,19 @@
>>      * where {@code abs(u) > abs(v)} and {@code a > b && b > 0}, then if
>>      * {@code w/z = q1*z + r1} and {@code u/v = q2*v + r2}, then
>>      * {@code q1 = q2*pow(2,a-b)} and {@code r1 = r2*pow(2,b)}.  The test
>> -     * ensures that {@code v} is just under the B-Z threshold and 
>> that {@code w}
>> -     * and {@code z} are both over the threshold.  This implies that 
>> {@code u/v}
>> -     * uses the standard division algorithm and {@code w/z} uses the B-Z
>> -     * algorithm.  The results of the two algorithms are then 
>> compared using the
>> -     * observation described in the foregoing and if they are not 
>> equal a
>> -     * failure is logged.
>> +     * ensures that {@code v} is just under the B-Z threshold, that 
>> {@code z} is
>> +     * over the threshold and {@code w} is much larger than {@code 
>> z}. This
>> +     * implies that {@code u/v} uses the standard division algorithm and
>> +     * {@code w/z} uses the B-Z algorithm.  The results of the two 
>> algorithms
>> +     * are then compared using the observation described in the 
>> foregoing and
>> +     * if they are not equal a failure is logged.
>>      */
>>     public static void divideLarge() {
>>         int failCount = 0;
>> -        BigInteger base = 
>> BigInteger.ONE.shiftLeft(BITS_BURNIKEL_ZIEGLER - 33);
>> +        BigInteger base = 
>> BigInteger.ONE.shiftLeft(BITS_BURNIKEL_ZIEGLER + 
>> BITS_BURNIKEL_ZIEGLER_OFFSET - 33);
>>         for (int i=0; i<SIZE; i++) {
>> -            BigInteger addend = new BigInteger(BITS_BURNIKEL_ZIEGLER 
>> - 34, rnd);
>> +            BigInteger addend = new BigInteger(BITS_BURNIKEL_ZIEGLER 
>> + BITS_BURNIKEL_ZIEGLER_OFFSET - 34, rnd);
>>             BigInteger v = base.add(addend);
>>             BigInteger u = v.multiply(BigInteger.valueOf(2 + 
>> rnd.nextInt(Short.MAX_VALUE - 1)));
>> @@ -312,14 +313,14 @@
>>                 v = v.negate();
>>             }
>> -            int a = 17 + rnd.nextInt(16);
>> +            int a = BITS_BURNIKEL_ZIEGLER_OFFSET + rnd.nextInt(16);
>>             int b = 1 + rnd.nextInt(16);
>> -            BigInteger w = u.multiply(BigInteger.valueOf(1L << a));
>> -            BigInteger z = v.multiply(BigInteger.valueOf(1L << b));
>> +            BigInteger w = u.multiply(BigInteger.ONE.shiftLeft(a));
>> +            BigInteger z = v.multiply(BigInteger.ONE.shiftLeft(b));
>>             BigInteger[] divideResult = u.divideAndRemainder(v);
>> -            divideResult[0] = 
>> divideResult[0].multiply(BigInteger.valueOf(1L << (a - b)));
>> -            divideResult[1] = 
>> divideResult[1].multiply(BigInteger.valueOf(1L << b));
>> +            divideResult[0] = 
>> divideResult[0].multiply(BigInteger.ONE.shiftLeft(a - b));
>> +            divideResult[1] = 
>> divideResult[1].multiply(BigInteger.ONE.shiftLeft(b));
>>             BigInteger[] bzResult = w.divideAndRemainder(z);
>>             if (divideResult[0].compareTo(bzResult[0]) != 0 ||
>




More information about the core-libs-dev mailing list