jdk/test/java/math/BigInteger/BigIntegerTest.java
author bpb
Thu, 05 Dec 2013 07:44:59 -0800
changeset 21983 586d25bfe206
parent 19393 d99a9ebf9c10
child 26627 534c5a51e93e
permissions -rw-r--r--
8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181 Summary: Ensure the value returned by getLower() is unsigned. Reviewed-by: darcy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     1
/*
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
     2
 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     4
 *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     7
 * published by the Free Software Foundation.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     8
 *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    13
 * accompanied this code).
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    14
 *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    18
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4527
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4527
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4527
diff changeset
    21
 * questions.
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    22
 */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    23
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    24
/*
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    25
 * @test
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    26
 * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 4837946
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    27
 * @summary tests methods in BigInteger
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    28
 * @run main/timeout=400 BigIntegerTest
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    29
 * @author madbot
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    30
 */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    31
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    32
import java.io.File;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    33
import java.io.FileInputStream;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    34
import java.io.FileOutputStream;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    35
import java.io.ObjectInputStream;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    36
import java.io.ObjectOutputStream;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    37
import java.math.BigInteger;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    38
import java.util.Random;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    39
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    40
/**
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    41
 * This is a simple test class created to ensure that the results
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    42
 * generated by BigInteger adhere to certain identities. Passing
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    43
 * this test is a strong assurance that the BigInteger operations
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    44
 * are working correctly.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    45
 *
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    46
 * Four arguments may be specified which give the number of
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    47
 * decimal digits you desire in the four batches of test numbers.
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    48
 *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    49
 * The tests are performed on arrays of random numbers which are
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    50
 * generated by a Random class as well as special cases which
19061
d48848ef5670 8020641: Clean up some code style in recent BigInteger contributions
bpb
parents: 19060
diff changeset
    51
 * throw in boundary numbers such as 0, 1, maximum sized, etc.
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    52
 *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    53
 */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    54
public class BigIntegerTest {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    55
    //
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    56
    // Bit large number thresholds based on the int thresholds
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    57
    // defined in BigInteger itself:
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    58
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    59
    // KARATSUBA_THRESHOLD        = 80  ints = 2560 bits
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    60
    // TOOM_COOK_THRESHOLD        = 240 ints = 7680 bits
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    61
    // KARATSUBA_SQUARE_THRESHOLD = 128 ints = 4096 bits
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    62
    // TOOM_COOK_SQUARE_THRESHOLD = 216 ints = 6912 bits
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    63
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    64
    // SCHOENHAGE_BASE_CONVERSION_THRESHOLD = 20 ints = 640 bits
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
    65
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    66
    // BURNIKEL_ZIEGLER_THRESHOLD = 80  ints = 2560 bits
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    67
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    68
    static final int BITS_KARATSUBA = 2560;
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    69
    static final int BITS_TOOM_COOK = 7680;
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    70
    static final int BITS_KARATSUBA_SQUARE = 4096;
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    71
    static final int BITS_TOOM_COOK_SQUARE = 6912;
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    72
    static final int BITS_SCHOENHAGE_BASE = 640;
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    73
    static final int BITS_BURNIKEL_ZIEGLER = 2560;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    74
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    75
    static final int ORDER_SMALL = 60;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    76
    static final int ORDER_MEDIUM = 100;
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
    77
    // #bits for testing Karatsuba
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    78
    static final int ORDER_KARATSUBA = 2760;
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
    79
    // #bits for testing Toom-Cook and Burnikel-Ziegler
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    80
    static final int ORDER_TOOM_COOK = 8000;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    81
    // #bits for testing Karatsuba squaring
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    82
    static final int ORDER_KARATSUBA_SQUARE = 4200;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    83
    // #bits for testing Toom-Cook squaring
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    84
    static final int ORDER_TOOM_COOK_SQUARE = 7000;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    85
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    86
    static final int SIZE = 1000; // numbers per batch
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    87
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    88
    static Random rnd = new Random();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    89
    static boolean failure = false;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    90
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    91
    public static void pow(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    92
        int failCount1 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    93
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    94
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    95
            // Test identity x^power == x*x*x ... *x
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    96
            int power = rnd.nextInt(6) + 2;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    97
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    98
            BigInteger y = x.pow(power);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    99
            BigInteger z = x;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   100
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   101
            for (int j=1; j<power; j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   102
                z = z.multiply(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   103
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   104
            if (!y.equals(z))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   105
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   106
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   107
        report("pow for " + order + " bits", failCount1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   108
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   109
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   110
    public static void square(int order) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   111
        int failCount1 = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   112
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   113
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   114
            // Test identity x^2 == x*x
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   115
            BigInteger x  = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   116
            BigInteger xx = x.multiply(x);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   117
            BigInteger x2 = x.pow(2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   118
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   119
            if (!x2.equals(xx))
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   120
                failCount1++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   121
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   122
        report("square for " + order + " bits", failCount1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   123
    }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   124
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   125
    public static void arithmetic(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   126
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   127
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   128
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   129
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   130
            while(x.compareTo(BigInteger.ZERO) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   131
                x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   132
            BigInteger y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   133
            while(x.compareTo(y) == -1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   134
                y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   135
            if (y.equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   136
                y = y.add(BigInteger.ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   137
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   138
            // Test identity ((x/y))*y + x%y - x == 0
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   139
            // using separate divide() and remainder()
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   140
            BigInteger baz = x.divide(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   141
            baz = baz.multiply(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   142
            baz = baz.add(x.remainder(y));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   143
            baz = baz.subtract(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   144
            if (!baz.equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   145
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   146
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   147
        report("Arithmetic I for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   148
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   149
        failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   150
        for (int i=0; i<100; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   151
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   152
            while(x.compareTo(BigInteger.ZERO) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   153
                x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   154
            BigInteger y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   155
            while(x.compareTo(y) == -1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   156
                y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   157
            if (y.equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   158
                y = y.add(BigInteger.ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   159
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   160
            // Test identity ((x/y))*y + x%y - x == 0
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   161
            // using divideAndRemainder()
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   162
            BigInteger baz[] = x.divideAndRemainder(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   163
            baz[0] = baz[0].multiply(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   164
            baz[0] = baz[0].add(baz[1]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   165
            baz[0] = baz[0].subtract(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   166
            if (!baz[0].equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   167
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   168
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   169
        report("Arithmetic II for " + order + " bits", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   170
    }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   171
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   172
    /**
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   173
     * Sanity test for Karatsuba and 3-way Toom-Cook multiplication.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   174
     * For each of the Karatsuba and 3-way Toom-Cook multiplication thresholds,
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   175
     * construct two factors each with a mag array one element shorter than the
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   176
     * threshold, and with the most significant bit set and the rest of the bits
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   177
     * random. Each of these numbers will therefore be below the threshold but
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   178
     * if shifted left be above the threshold. Call the numbers 'u' and 'v' and
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   179
     * define random shifts 'a' and 'b' in the range [1,32]. Then we have the
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   180
     * identity
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   181
     * <pre>
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   182
     * (u << a)*(v << b) = (u*v) << (a + b)
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   183
     * </pre>
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   184
     * For Karatsuba multiplication, the right hand expression will be evaluated
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   185
     * using the standard naive algorithm, and the left hand expression using
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   186
     * the Karatsuba algorithm. For 3-way Toom-Cook multiplication, the right
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   187
     * hand expression will be evaluated using Karatsuba multiplication, and the
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   188
     * left hand expression using 3-way Toom-Cook multiplication.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   189
     */
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   190
    public static void multiplyLarge() {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   191
        int failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   192
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   193
        BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA - 32 - 1);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   194
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   195
            BigInteger x = fetchNumber(BITS_KARATSUBA - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   196
            BigInteger u = base.add(x);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   197
            int a = 1 + rnd.nextInt(31);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   198
            BigInteger w = u.shiftLeft(a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   199
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   200
            BigInteger y = fetchNumber(BITS_KARATSUBA - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   201
            BigInteger v = base.add(y);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   202
            int b = 1 + rnd.nextInt(32);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   203
            BigInteger z = v.shiftLeft(b);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   204
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   205
            BigInteger multiplyResult = u.multiply(v).shiftLeft(a + b);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   206
            BigInteger karatsubaMultiplyResult = w.multiply(z);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   207
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   208
            if (!multiplyResult.equals(karatsubaMultiplyResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   209
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   210
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   211
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   212
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   213
        report("multiplyLarge Karatsuba", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   214
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   215
        failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   216
        base = base.shiftLeft(BITS_TOOM_COOK - BITS_KARATSUBA);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   217
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   218
            BigInteger x = fetchNumber(BITS_TOOM_COOK - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   219
            BigInteger u = base.add(x);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   220
            BigInteger u2 = u.shiftLeft(1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   221
            BigInteger y = fetchNumber(BITS_TOOM_COOK - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   222
            BigInteger v = base.add(y);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   223
            BigInteger v2 = v.shiftLeft(1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   224
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   225
            BigInteger multiplyResult = u.multiply(v).shiftLeft(2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   226
            BigInteger toomCookMultiplyResult = u2.multiply(v2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   227
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   228
            if (!multiplyResult.equals(toomCookMultiplyResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   229
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   230
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   231
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   232
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   233
        report("multiplyLarge Toom-Cook", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   234
    }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   235
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   236
    /**
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   237
     * Sanity test for Karatsuba and 3-way Toom-Cook squaring.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   238
     * This test is analogous to {@link AbstractMethodError#multiplyLarge}
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   239
     * with both factors being equal. The squaring methods will not be tested
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   240
     * unless the <code>bigInteger.multiply(bigInteger)</code> tests whether
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   241
     * the parameter is the same instance on which the method is being invoked
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   242
     * and calls <code>square()</code> accordingly.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   243
     */
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   244
    public static void squareLarge() {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   245
        int failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   246
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   247
        BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA_SQUARE - 32 - 1);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   248
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   249
            BigInteger x = fetchNumber(BITS_KARATSUBA_SQUARE - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   250
            BigInteger u = base.add(x);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   251
            int a = 1 + rnd.nextInt(31);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   252
            BigInteger w = u.shiftLeft(a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   253
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   254
            BigInteger squareResult = u.multiply(u).shiftLeft(2*a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   255
            BigInteger karatsubaSquareResult = w.multiply(w);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   256
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   257
            if (!squareResult.equals(karatsubaSquareResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   258
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   259
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   260
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   261
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   262
        report("squareLarge Karatsuba", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   263
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   264
        failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   265
        base = base.shiftLeft(BITS_TOOM_COOK_SQUARE - BITS_KARATSUBA_SQUARE);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   266
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   267
            BigInteger x = fetchNumber(BITS_TOOM_COOK_SQUARE - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   268
            BigInteger u = base.add(x);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   269
            int a = 1 + rnd.nextInt(31);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   270
            BigInteger w = u.shiftLeft(a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   271
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   272
            BigInteger squareResult = u.multiply(u).shiftLeft(2*a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   273
            BigInteger toomCookSquareResult = w.multiply(w);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   274
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   275
            if (!squareResult.equals(toomCookSquareResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   276
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   277
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   278
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   279
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   280
        report("squareLarge Toom-Cook", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   281
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   282
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   283
    /**
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   284
     * Sanity test for Burnikel-Ziegler division.  The Burnikel-Ziegler division
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   285
     * algorithm is used when each of the dividend and the divisor has at least
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   286
     * a specified number of ints in its representation.  This test is based on
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   287
     * the observation that if {@code w = u*pow(2,a)} and {@code z = v*pow(2,b)}
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   288
     * where {@code abs(u) > abs(v)} and {@code a > b && b > 0}, then if
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   289
     * {@code w/z = q1*z + r1} and {@code u/v = q2*v + r2}, then
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   290
     * {@code q1 = q2*pow(2,a-b)} and {@code r1 = r2*pow(2,b)}.  The test
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   291
     * ensures that {@code v} is just under the B-Z threshold and that {@code w}
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   292
     * and {@code z} are both over the threshold.  This implies that {@code u/v}
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   293
     * uses the standard division algorithm and {@code w/z} uses the B-Z
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   294
     * algorithm.  The results of the two algorithms are then compared using the
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   295
     * observation described in the foregoing and if they are not equal a
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   296
     * failure is logged.
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   297
     */
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   298
    public static void divideLarge() {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   299
        int failCount = 0;
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   300
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   301
        BigInteger base = BigInteger.ONE.shiftLeft(BITS_BURNIKEL_ZIEGLER - 33);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   302
        for (int i=0; i<SIZE; i++) {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   303
            BigInteger addend = new BigInteger(BITS_BURNIKEL_ZIEGLER - 34, rnd);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   304
            BigInteger v = base.add(addend);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   305
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   306
            BigInteger u = v.multiply(BigInteger.valueOf(2 + rnd.nextInt(Short.MAX_VALUE - 1)));
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   307
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   308
            if(rnd.nextBoolean()) {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   309
                u = u.negate();
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   310
            }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   311
            if(rnd.nextBoolean()) {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   312
                v = v.negate();
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   313
            }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   314
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   315
            int a = 17 + rnd.nextInt(16);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   316
            int b = 1 + rnd.nextInt(16);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   317
            BigInteger w = u.multiply(BigInteger.valueOf(1L << a));
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   318
            BigInteger z = v.multiply(BigInteger.valueOf(1L << b));
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   319
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   320
            BigInteger[] divideResult = u.divideAndRemainder(v);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   321
            divideResult[0] = divideResult[0].multiply(BigInteger.valueOf(1L << (a - b)));
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   322
            divideResult[1] = divideResult[1].multiply(BigInteger.valueOf(1L << b));
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   323
            BigInteger[] bzResult = w.divideAndRemainder(z);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   324
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   325
            if (divideResult[0].compareTo(bzResult[0]) != 0 ||
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   326
                    divideResult[1].compareTo(bzResult[1]) != 0) {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   327
                failCount++;
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   328
            }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   329
        }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   330
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   331
        report("divideLarge", failCount);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   332
    }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   333
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   334
    public static void bitCount() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   335
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   336
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   337
        for (int i=0; i<SIZE*10; i++) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   338
            int x = rnd.nextInt();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   339
            BigInteger bigX = BigInteger.valueOf((long)x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   340
            int bit = (x < 0 ? 0 : 1);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   341
            int tmp = x, bitCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   342
            for (int j=0; j<32; j++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   343
                bitCount += ((tmp & 1) == bit ? 1 : 0);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   344
                tmp >>= 1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   345
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   346
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   347
            if (bigX.bitCount() != bitCount) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   348
                //System.err.println(x+": "+bitCount+", "+bigX.bitCount());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   349
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   350
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   351
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   352
        report("Bit Count", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   353
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   354
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   355
    public static void bitLength() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   356
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   357
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   358
        for (int i=0; i<SIZE*10; i++) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   359
            int x = rnd.nextInt();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   360
            BigInteger bigX = BigInteger.valueOf((long)x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   361
            int signBit = (x < 0 ? 0x80000000 : 0);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   362
            int tmp = x, bitLength, j;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   363
            for (j=0; j<32 && (tmp & 0x80000000)==signBit; j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   364
                tmp <<= 1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   365
            bitLength = 32 - j;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   366
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   367
            if (bigX.bitLength() != bitLength) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   368
                //System.err.println(x+": "+bitLength+", "+bigX.bitLength());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   369
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   370
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   371
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   372
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   373
        report("BitLength", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   374
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   375
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   376
    public static void bitOps(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   377
        int failCount1 = 0, failCount2 = 0, failCount3 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   378
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   379
        for (int i=0; i<SIZE*5; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   380
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   381
            BigInteger y;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   382
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   383
            // Test setBit and clearBit (and testBit)
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   384
            if (x.signum() < 0) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   385
                y = BigInteger.valueOf(-1);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   386
                for (int j=0; j<x.bitLength(); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   387
                    if (!x.testBit(j))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   388
                        y = y.clearBit(j);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   389
            } else {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   390
                y = BigInteger.ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   391
                for (int j=0; j<x.bitLength(); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   392
                    if (x.testBit(j))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   393
                        y = y.setBit(j);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   394
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   395
            if (!x.equals(y))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   396
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   397
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   398
            // Test flipBit (and testBit)
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   399
            y = BigInteger.valueOf(x.signum()<0 ? -1 : 0);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   400
            for (int j=0; j<x.bitLength(); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   401
                if (x.signum()<0  ^  x.testBit(j))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   402
                    y = y.flipBit(j);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   403
            if (!x.equals(y))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   404
                failCount2++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   405
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   406
        report("clearBit/testBit for " + order + " bits", failCount1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   407
        report("flipBit/testBit for " + order + " bits", failCount2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   408
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   409
        for (int i=0; i<SIZE*5; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   410
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   411
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   412
            // Test getLowestSetBit()
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   413
            int k = x.getLowestSetBit();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   414
            if (x.signum() == 0) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   415
                if (k != -1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   416
                    failCount3++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   417
            } else {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   418
                BigInteger z = x.and(x.negate());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   419
                int j;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   420
                for (j=0; j<z.bitLength() && !z.testBit(j); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   421
                    ;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   422
                if (k != j)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   423
                    failCount3++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   424
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   425
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   426
        report("getLowestSetBit for " + order + " bits", failCount3);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   427
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   428
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   429
    public static void bitwise(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   430
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   431
        // Test identity x^y == x|y &~ x&y
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   432
        int failCount = 0;
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   433
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   434
            BigInteger x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   435
            BigInteger y = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   436
            BigInteger z = x.xor(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   437
            BigInteger w = x.or(y).andNot(x.and(y));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   438
            if (!z.equals(w))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   439
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   440
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   441
        report("Logic (^ | & ~) for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   442
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   443
        // Test identity x &~ y == ~(~x | y)
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   444
        failCount = 0;
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   445
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   446
            BigInteger x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   447
            BigInteger y = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   448
            BigInteger z = x.andNot(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   449
            BigInteger w = x.not().or(y).not();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   450
            if (!z.equals(w))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   451
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   452
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   453
        report("Logic (&~ | ~) for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   454
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   455
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   456
    public static void shift(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   457
        int failCount1 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   458
        int failCount2 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   459
        int failCount3 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   460
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   461
        for (int i=0; i<100; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   462
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   463
            int n = Math.abs(rnd.nextInt()%200);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   464
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   465
            if (!x.shiftLeft(n).equals
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   466
                (x.multiply(BigInteger.valueOf(2L).pow(n))))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   467
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   468
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   469
            BigInteger y[] =x.divideAndRemainder(BigInteger.valueOf(2L).pow(n));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   470
            BigInteger z = (x.signum()<0 && y[1].signum()!=0
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   471
                            ? y[0].subtract(BigInteger.ONE)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   472
                            : y[0]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   473
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   474
            BigInteger b = x.shiftRight(n);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   475
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   476
            if (!b.equals(z)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   477
                System.err.println("Input is "+x.toString(2));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   478
                System.err.println("shift is "+n);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   479
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   480
                System.err.println("Divided "+z.toString(2));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   481
                System.err.println("Shifted is "+b.toString(2));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   482
                if (b.toString().equals(z.toString()))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   483
                    System.err.println("Houston, we have a problem.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   484
                failCount2++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   485
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   486
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   487
            if (!x.shiftLeft(n).shiftRight(n).equals(x))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   488
                failCount3++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   489
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   490
        report("baz shiftLeft for " + order + " bits", failCount1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   491
        report("baz shiftRight for " + order + " bits", failCount2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   492
        report("baz shiftLeft/Right for " + order + " bits", failCount3);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   493
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   494
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   495
    public static void divideAndRemainder(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   496
        int failCount1 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   497
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   498
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   499
            BigInteger x = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   500
            while(x.compareTo(BigInteger.valueOf(3L)) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   501
                x = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   502
            BigInteger z = x.divide(BigInteger.valueOf(2L));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   503
            BigInteger y[] = x.divideAndRemainder(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   504
            if (!y[0].equals(BigInteger.ONE)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   505
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   506
                System.err.println("fail1 x :"+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   507
                System.err.println("      y :"+y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   508
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   509
            else if (!y[1].equals(BigInteger.ZERO)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   510
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   511
                System.err.println("fail2 x :"+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   512
                System.err.println("      y :"+y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   513
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   514
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   515
            y = x.divideAndRemainder(z);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   516
            if (!y[0].equals(BigInteger.valueOf(2))) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   517
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   518
                System.err.println("fail3 x :"+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   519
                System.err.println("      y :"+y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   520
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   521
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   522
        report("divideAndRemainder for " + order + " bits", failCount1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   523
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   524
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   525
    public static void stringConv() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   526
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   527
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   528
        // Generic string conversion.
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   529
        for (int i=0; i<100; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   530
            byte xBytes[] = new byte[Math.abs(rnd.nextInt())%100+1];
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   531
            rnd.nextBytes(xBytes);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   532
            BigInteger x = new BigInteger(xBytes);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   533
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   534
            for (int radix=Character.MIN_RADIX; radix < Character.MAX_RADIX; radix++) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   535
                String result = x.toString(radix);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   536
                BigInteger test = new BigInteger(result, radix);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   537
                if (!test.equals(x)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   538
                    failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   539
                    System.err.println("BigInteger toString: "+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   540
                    System.err.println("Test: "+test);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   541
                    System.err.println(radix);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   542
                }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   543
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   544
        }
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   545
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   546
        // String conversion straddling the Schoenhage algorithm crossover
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   547
        // threshold, and at twice and four times the threshold.
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   548
        for (int k = 0; k <= 2; k++) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   549
            int factor = 1 << k;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   550
            int upper = factor * BITS_SCHOENHAGE_BASE + 33;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   551
            int lower = upper - 35;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   552
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   553
            for (int bits = upper; bits >= lower; bits--) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   554
                for (int i = 0; i < 50; i++) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   555
                    BigInteger x = BigInteger.ONE.shiftLeft(bits - 1).or(new BigInteger(bits - 2, rnd));
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   556
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   557
                    for (int radix = Character.MIN_RADIX; radix < Character.MAX_RADIX; radix++) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   558
                        String result = x.toString(radix);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   559
                        BigInteger test = new BigInteger(result, radix);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   560
                        if (!test.equals(x)) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   561
                            failCount++;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   562
                            System.err.println("BigInteger toString: " + x);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   563
                            System.err.println("Test: " + test);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   564
                            System.err.println(radix);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   565
                        }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   566
                    }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   567
                }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   568
            }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   569
        }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   570
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   571
        report("String Conversion", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   572
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   573
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   574
    public static void byteArrayConv(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   575
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   576
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   577
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   578
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   579
            while (x.equals(BigInteger.ZERO))
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   580
                x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   581
            BigInteger y = new BigInteger(x.toByteArray());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   582
            if (!x.equals(y)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   583
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   584
                System.err.println("orig is "+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   585
                System.err.println("new is "+y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   586
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   587
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   588
        report("Array Conversion for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   589
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   590
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   591
    public static void modInv(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   592
        int failCount = 0, successCount = 0, nonInvCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   593
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   594
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   595
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   596
            while(x.equals(BigInteger.ZERO))
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   597
                x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   598
            BigInteger m = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   599
            while(m.compareTo(BigInteger.ONE) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   600
                m = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   601
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   602
            try {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   603
                BigInteger inv = x.modInverse(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   604
                BigInteger prod = inv.multiply(x).remainder(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   605
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   606
                if (prod.signum() == -1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   607
                    prod = prod.add(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   608
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   609
                if (prod.equals(BigInteger.ONE))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   610
                    successCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   611
                else
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   612
                    failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   613
            } catch(ArithmeticException e) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   614
                nonInvCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   615
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   616
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   617
        report("Modular Inverse for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   618
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   619
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   620
    public static void modExp(int order1, int order2) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   621
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   622
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   623
        for (int i=0; i<SIZE/10; i++) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   624
            BigInteger m = fetchNumber(order1).abs();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   625
            while(m.compareTo(BigInteger.ONE) != 1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   626
                m = fetchNumber(order1).abs();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   627
            BigInteger base = fetchNumber(order2);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   628
            BigInteger exp = fetchNumber(8).abs();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   629
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   630
            BigInteger z = base.modPow(exp, m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   631
            BigInteger w = base.pow(exp.intValue()).mod(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   632
            if (!z.equals(w)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   633
                System.err.println("z is "+z);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   634
                System.err.println("w is "+w);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   635
                System.err.println("mod is "+m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   636
                System.err.println("base is "+base);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   637
                System.err.println("exp is "+exp);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   638
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   639
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   640
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   641
        report("Exponentiation I for " + order1 + " and " +
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   642
               order2 + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   643
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   644
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   645
    // This test is based on Fermat's theorem
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   646
    // which is not ideal because base must not be multiple of modulus
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   647
    // and modulus must be a prime or pseudoprime (Carmichael number)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   648
    public static void modExp2(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   649
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   650
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   651
        for (int i=0; i<10; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   652
            BigInteger m = new BigInteger(100, 5, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   653
            while(m.compareTo(BigInteger.ONE) != 1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   654
                m = new BigInteger(100, 5, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   655
            BigInteger exp = m.subtract(BigInteger.ONE);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   656
            BigInteger base = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   657
            while(base.compareTo(m) != -1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   658
                base = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   659
            while(base.equals(BigInteger.ZERO))
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   660
                base = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   661
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   662
            BigInteger one = base.modPow(exp, m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   663
            if (!one.equals(BigInteger.ONE)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   664
                System.err.println("m is "+m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   665
                System.err.println("base is "+base);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   666
                System.err.println("exp is "+exp);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   667
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   668
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   669
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   670
        report("Exponentiation II for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   671
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   672
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   673
    private static final int[] mersenne_powers = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   674
        521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   675
        21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   676
        1257787, 1398269, 2976221, 3021377, 6972593, 13466917 };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   677
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   678
    private static final long[] carmichaels = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   679
      561,1105,1729,2465,2821,6601,8911,10585,15841,29341,41041,46657,52633,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   680
      62745,63973,75361,101101,115921,126217,162401,172081,188461,252601,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   681
      278545,294409,314821,334153,340561,399001,410041,449065,488881,512461,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   682
      225593397919L };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   683
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   684
    // Note: testing the larger ones takes too long.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   685
    private static final int NUM_MERSENNES_TO_TEST = 7;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   686
    // Note: this constant used for computed Carmichaels, not the array above
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   687
    private static final int NUM_CARMICHAELS_TO_TEST = 5;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   688
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   689
    private static final String[] customer_primes = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   690
        "120000000000000000000000000000000019",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   691
        "633825300114114700748351603131",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   692
        "1461501637330902918203684832716283019651637554291",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   693
        "779626057591079617852292862756047675913380626199",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   694
        "857591696176672809403750477631580323575362410491",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   695
        "910409242326391377348778281801166102059139832131",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   696
        "929857869954035706722619989283358182285540127919",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   697
        "961301750640481375785983980066592002055764391999",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   698
        "1267617700951005189537696547196156120148404630231",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   699
        "1326015641149969955786344600146607663033642528339" };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   700
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   701
    private static final BigInteger ZERO = BigInteger.ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   702
    private static final BigInteger ONE = BigInteger.ONE;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   703
    private static final BigInteger TWO = new BigInteger("2");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   704
    private static final BigInteger SIX = new BigInteger("6");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   705
    private static final BigInteger TWELVE = new BigInteger("12");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   706
    private static final BigInteger EIGHTEEN = new BigInteger("18");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   707
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   708
    public static void prime() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   709
        BigInteger p1, p2, c1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   710
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   711
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   712
        // Test consistency
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   713
        for(int i=0; i<10; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   714
            p1 = BigInteger.probablePrime(100, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   715
            if (!p1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   716
                System.err.println("Consistency "+p1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   717
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   718
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   719
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   720
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   721
        // Test some known Mersenne primes (2^n)-1
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   722
        // The array holds the exponents, not the numbers being tested
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   723
        for (int i=0; i<NUM_MERSENNES_TO_TEST; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   724
            p1 = new BigInteger("2");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   725
            p1 = p1.pow(mersenne_powers[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   726
            p1 = p1.subtract(BigInteger.ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   727
            if (!p1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   728
                System.err.println("Mersenne prime "+i+ " failed.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   729
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   730
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   731
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   732
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   733
        // Test some primes reported by customers as failing in the past
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   734
        for (int i=0; i<customer_primes.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   735
            p1 = new BigInteger(customer_primes[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   736
            if (!p1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   737
                System.err.println("Customer prime "+i+ " failed.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   738
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   739
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   740
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   741
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   742
        // Test some known Carmichael numbers.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   743
        for (int i=0; i<carmichaels.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   744
            c1 = BigInteger.valueOf(carmichaels[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   745
            if(c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   746
                System.err.println("Carmichael "+i+ " reported as prime.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   747
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   748
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   749
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   750
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   751
        // Test some computed Carmichael numbers.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   752
        // Numbers of the form (6k+1)(12k+1)(18k+1) are Carmichael numbers if
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   753
        // each of the factors is prime
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   754
        int found = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   755
        BigInteger f1 = new BigInteger(40, 100, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   756
        while (found < NUM_CARMICHAELS_TO_TEST) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   757
            BigInteger k = null;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   758
            BigInteger f2, f3;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   759
            f1 = f1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   760
            BigInteger[] result = f1.subtract(ONE).divideAndRemainder(SIX);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   761
            if (result[1].equals(ZERO)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   762
                k = result[0];
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   763
                f2 = k.multiply(TWELVE).add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   764
                if (f2.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   765
                    f3 = k.multiply(EIGHTEEN).add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   766
                    if (f3.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   767
                        c1 = f1.multiply(f2).multiply(f3);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   768
                        if (c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   769
                            System.err.println("Computed Carmichael "
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   770
                                               +c1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   771
                            failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   772
                        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   773
                        found++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   774
                    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   775
                }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   776
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   777
            f1 = f1.add(TWO);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   778
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   779
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   780
        // Test some composites that are products of 2 primes
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   781
        for (int i=0; i<50; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   782
            p1 = BigInteger.probablePrime(100, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   783
            p2 = BigInteger.probablePrime(100, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   784
            c1 = p1.multiply(p2);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   785
            if (c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   786
                System.err.println("Composite failed "+c1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   787
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   788
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   789
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   790
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   791
        for (int i=0; i<4; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   792
            p1 = BigInteger.probablePrime(600, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   793
            p2 = BigInteger.probablePrime(600, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   794
            c1 = p1.multiply(p2);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   795
            if (c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   796
                System.err.println("Composite failed "+c1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   797
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   798
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   799
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   800
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   801
        report("Prime", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   802
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   803
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   804
    private static final long[] primesTo100 = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   805
        2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   806
    };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   807
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   808
    private static final long[] aPrimeSequence = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   809
        1999999003L, 1999999013L, 1999999049L, 1999999061L, 1999999081L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   810
        1999999087L, 1999999093L, 1999999097L, 1999999117L, 1999999121L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   811
        1999999151L, 1999999171L, 1999999207L, 1999999219L, 1999999271L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   812
        1999999321L, 1999999373L, 1999999423L, 1999999439L, 1999999499L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   813
        1999999553L, 1999999559L, 1999999571L, 1999999609L, 1999999613L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   814
        1999999621L, 1999999643L, 1999999649L, 1999999657L, 1999999747L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   815
        1999999763L, 1999999777L, 1999999811L, 1999999817L, 1999999829L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   816
        1999999853L, 1999999861L, 1999999871L, 1999999873
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   817
    };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   818
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   819
    public static void nextProbablePrime() throws Exception {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   820
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   821
        BigInteger p1, p2, p3;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   822
        p1 = p2 = p3 = ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   823
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   824
        // First test nextProbablePrime on the low range starting at zero
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   825
        for (int i=0; i<primesTo100.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   826
            p1 = p1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   827
            if (p1.longValue() != primesTo100[i]) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   828
                System.err.println("low range primes failed");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   829
                System.err.println("p1 is "+p1);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   830
                System.err.println("expected "+primesTo100[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   831
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   832
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   833
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   834
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   835
        // Test nextProbablePrime on a relatively small, known prime sequence
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   836
        p1 = BigInteger.valueOf(aPrimeSequence[0]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   837
        for (int i=1; i<aPrimeSequence.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   838
            p1 = p1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   839
            if (p1.longValue() != aPrimeSequence[i]) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   840
                System.err.println("prime sequence failed");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   841
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   842
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   843
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   844
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   845
        // Next, pick some large primes, use nextProbablePrime to find the
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   846
        // next one, and make sure there are no primes in between
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   847
        for (int i=0; i<100; i+=10) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   848
            p1 = BigInteger.probablePrime(50 + i, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   849
            p2 = p1.add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   850
            p3 = p1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   851
            while(p2.compareTo(p3) < 0) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   852
                if (p2.isProbablePrime(100)){
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   853
                    System.err.println("nextProbablePrime failed");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   854
                    System.err.println("along range "+p1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   855
                    System.err.println("to "+p3.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   856
                    failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   857
                    break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   858
                }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   859
                p2 = p2.add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   860
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   861
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   862
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   863
        report("nextProbablePrime", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   864
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   865
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   866
    public static void serialize() throws Exception {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   867
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   868
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   869
        String bitPatterns[] = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   870
             "ffffffff00000000ffffffff00000000ffffffff00000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   871
             "ffffffffffffffffffffffff000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   872
             "ffffffff0000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   873
             "10000000ffffffffffffffffffffffffffffffffffffffff",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   874
             "100000000000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   875
             "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   876
            "-ffffffff00000000ffffffff00000000ffffffff00000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   877
            "-ffffffffffffffffffffffff000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   878
            "-ffffffff0000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   879
            "-10000000ffffffffffffffffffffffffffffffffffffffff",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   880
            "-100000000000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   881
            "-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   882
        };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   883
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   884
        for(int i = 0; i < bitPatterns.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   885
            BigInteger b1 = new BigInteger(bitPatterns[i], 16);
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   886
            BigInteger b2 = null;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   887
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   888
            File f = new File("serialtest");
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   889
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   890
            try (FileOutputStream fos = new FileOutputStream(f)) {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   891
                try (ObjectOutputStream oos = new ObjectOutputStream(fos)) {
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   892
                    oos.writeObject(b1);
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   893
                    oos.flush();
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   894
                }
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   895
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   896
                try (FileInputStream fis = new FileInputStream(f);
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   897
                     ObjectInputStream ois = new ObjectInputStream(fis))
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   898
                {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   899
                    b2 = (BigInteger)ois.readObject();
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   900
                }
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   901
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   902
                if (!b1.equals(b2) ||
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   903
                    !b1.equals(b1.or(b2))) {
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   904
                    failCount++;
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   905
                    System.err.println("Serialized failed for hex " +
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   906
                                       b1.toString(16));
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   907
                }
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   908
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   909
            f.delete();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   910
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   911
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   912
        for(int i=0; i<10; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   913
            BigInteger b1 = fetchNumber(rnd.nextInt(100));
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   914
            BigInteger b2 = null;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   915
            File f = new File("serialtest");
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   916
            try (FileOutputStream fos = new FileOutputStream(f)) {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   917
                try (ObjectOutputStream oos = new ObjectOutputStream(fos)) {
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   918
                    oos.writeObject(b1);
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   919
                    oos.flush();
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   920
                }
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   921
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   922
                try (FileInputStream fis = new FileInputStream(f);
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   923
                     ObjectInputStream ois = new ObjectInputStream(fis))
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   924
                {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
   925
                    b2 = (BigInteger)ois.readObject();
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   926
                }
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
   927
            }
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   928
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   929
            if (!b1.equals(b2) ||
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   930
                !b1.equals(b1.or(b2)))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   931
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   932
            f.delete();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   933
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   934
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   935
        report("Serialize", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   936
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   937
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   938
    /**
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   939
     * Main to interpret arguments and run several tests.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   940
     *
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   941
     * Up to three arguments may be given to specify the SIZE of BigIntegers
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   942
     * used for call parameters 1, 2, and 3. The SIZE is interpreted as
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   943
     * the maximum number of decimal digits that the parameters will have.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   944
     *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   945
     */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   946
    public static void main(String[] args) throws Exception {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   947
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   948
        // Some variables for sizing test numbers in bits
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   949
        int order1 = ORDER_MEDIUM;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   950
        int order2 = ORDER_SMALL;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   951
        int order3 = ORDER_KARATSUBA;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   952
        int order4 = ORDER_TOOM_COOK;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   953
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   954
        if (args.length >0)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   955
            order1 = (int)((Integer.parseInt(args[0]))* 3.333);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   956
        if (args.length >1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   957
            order2 = (int)((Integer.parseInt(args[1]))* 3.333);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   958
        if (args.length >2)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   959
            order3 = (int)((Integer.parseInt(args[2]))* 3.333);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   960
        if (args.length >3)
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   961
            order4 = (int)((Integer.parseInt(args[3]))* 3.333);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   962
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   963
        prime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   964
        nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   965
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   966
        arithmetic(order1);   // small numbers
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
   967
        arithmetic(order3);   // Karatsuba range
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
   968
        arithmetic(order4);   // Toom-Cook / Burnikel-Ziegler range
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   969
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   970
        divideAndRemainder(order1);   // small numbers
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
   971
        divideAndRemainder(order3);   // Karatsuba range
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
   972
        divideAndRemainder(order4);   // Toom-Cook / Burnikel-Ziegler range
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   973
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   974
        pow(order1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   975
        pow(order3);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   976
        pow(order4);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   977
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   978
        square(ORDER_MEDIUM);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   979
        square(ORDER_KARATSUBA_SQUARE);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   980
        square(ORDER_TOOM_COOK_SQUARE);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   981
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   982
        bitCount();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   983
        bitLength();
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   984
        bitOps(order1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   985
        bitwise(order1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   986
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   987
        shift(order1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   988
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   989
        byteArrayConv(order1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   990
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   991
        modInv(order1);   // small numbers
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
   992
        modInv(order3);   // Karatsuba range
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
   993
        modInv(order4);   // Toom-Cook / Burnikel-Ziegler range
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   994
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   995
        modExp(order1, order2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   996
        modExp2(order1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   997
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   998
        stringConv();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   999
        serialize();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1000
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1001
        multiplyLarge();
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1002
        squareLarge();
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1003
        divideLarge();
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1004
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1005
        if (failure)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1006
            throw new RuntimeException("Failure in BigIntegerTest.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1007
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1008
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1009
    /*
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1010
     * Get a random or boundary-case number. This is designed to provide
19061
d48848ef5670 8020641: Clean up some code style in recent BigInteger contributions
bpb
parents: 19060
diff changeset
  1011
     * a lot of numbers that will find failure points, such as max sized
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1012
     * numbers, empty BigIntegers, etc.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1013
     *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1014
     * If order is less than 2, order is changed to 2.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1015
     */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1016
    private static BigInteger fetchNumber(int order) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1017
        boolean negative = rnd.nextBoolean();
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1018
        int numType = rnd.nextInt(7);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1019
        BigInteger result = null;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1020
        if (order < 2) order = 2;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1021
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1022
        switch (numType) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1023
            case 0: // Empty
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1024
                result = BigInteger.ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1025
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1026
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1027
            case 1: // One
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1028
                result = BigInteger.ONE;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1029
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1030
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1031
            case 2: // All bits set in number
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1032
                int numBytes = (order+7)/8;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1033
                byte[] fullBits = new byte[numBytes];
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1034
                for(int i=0; i<numBytes; i++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1035
                    fullBits[i] = (byte)0xff;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1036
                int excessBits = 8*numBytes - order;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1037
                fullBits[0] &= (1 << (8-excessBits)) - 1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1038
                result = new BigInteger(1, fullBits);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1039
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1040
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1041
            case 3: // One bit in number
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1042
                result = BigInteger.ONE.shiftLeft(rnd.nextInt(order));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1043
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1044
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1045
            case 4: // Random bit density
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1046
                byte[] val = new byte[(order+7)/8];
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1047
                int iterations = rnd.nextInt(order);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1048
                for (int i=0; i<iterations; i++) {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1049
                    int bitIdx = rnd.nextInt(order);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1050
                    val[bitIdx/8] |= 1 << (bitIdx%8);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1051
                }
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1052
                result = new BigInteger(1, val);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1053
                break;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1054
            case 5: // Runs of consecutive ones and zeros
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1055
                result = ZERO;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1056
                int remaining = order;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1057
                int bit = rnd.nextInt(2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1058
                while (remaining > 0) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1059
                    int runLength = Math.min(remaining, rnd.nextInt(order));
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1060
                    result = result.shiftLeft(runLength);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1061
                    if (bit > 0)
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1062
                        result = result.add(ONE.shiftLeft(runLength).subtract(ONE));
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1063
                    remaining -= runLength;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1064
                    bit = 1 - bit;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1065
                }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1066
                break;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1067
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1068
            default: // random bits
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1069
                result = new BigInteger(order, rnd);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1070
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1071
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1072
        if (negative)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1073
            result = result.negate();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1074
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1075
        return result;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1076
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1077
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1078
    static void report(String testName, int failCount) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1079
        System.err.println(testName+": " +
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1080
                           (failCount==0 ? "Passed":"Failed("+failCount+")"));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1081
        if (failCount > 0)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1082
            failure = true;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1083
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1084
}