test/jdk/java/math/BigInteger/BigIntegerTest.java
author bpb
Fri, 30 Nov 2018 14:48:44 -0800
changeset 52789 a051c5c8aa56
parent 47216 71c04702a3d5
permissions -rw-r--r--
8214195: Align stdout messages in test/jdk/java/math/BigInteger/PrimitiveConversionTests.java Reviewed-by: lancea
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
/*
45288
58be10a068c2 8180805: move RandomFactory to the top level testlibrary
iignatyev
parents: 34538
diff changeset
     2
 * Copyright (c) 1998, 2017, 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
45288
58be10a068c2 8180805: move RandomFactory to the top level testlibrary
iignatyev
parents: 34538
diff changeset
    26
 * @library /test/lib
45466
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 45288
diff changeset
    27
 * @build jdk.test.lib.RandomFactory
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
    28
 * @run main BigIntegerTest
34538
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    29
 * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 4837946 4026465 8074460 8078672 8032027
29371
6f7f029a6b63 8074460: Always print seeds used in [Splittable]Random instances in java.math tests
bpb
parents: 28309
diff changeset
    30
 * @summary tests methods in BigInteger (use -Dseed=X to set PRNG seed)
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    31
 * @run main/timeout=400 BigIntegerTest
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    32
 * @author madbot
30046
cf2c86e1819e 8078334: Mark regression tests using randomness
darcy
parents: 29371
diff changeset
    33
 * @key randomness
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    34
 */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    35
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    36
import java.io.File;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    37
import java.io.FileInputStream;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    38
import java.io.FileOutputStream;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    39
import java.io.ObjectInputStream;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    40
import java.io.ObjectOutputStream;
34538
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    41
import java.math.BigDecimal;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    42
import java.math.BigInteger;
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
    43
import java.util.Random;
34538
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    44
import java.util.function.ToIntFunction;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    45
import java.util.stream.Collectors;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    46
import java.util.stream.DoubleStream;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    47
import java.util.stream.IntStream;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    48
import java.util.stream.LongStream;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
    49
import java.util.stream.Stream;
45288
58be10a068c2 8180805: move RandomFactory to the top level testlibrary
iignatyev
parents: 34538
diff changeset
    50
import jdk.test.lib.RandomFactory;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    51
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
 * 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
    54
 * generated by BigInteger adhere to certain identities. Passing
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    55
 * this test is a strong assurance that the BigInteger operations
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    56
 * are working correctly.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    57
 *
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    58
 * Four arguments may be specified which give the number of
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    59
 * 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
    60
 *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    61
 * 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
    62
 * 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
    63
 * 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
    64
 *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    65
 */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
    66
public class BigIntegerTest {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    67
    //
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    68
    // Bit large number thresholds based on the int thresholds
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    69
    // defined in BigInteger itself:
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    70
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    71
    // KARATSUBA_THRESHOLD        = 80  ints = 2560 bits
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    72
    // 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
    73
    // 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
    74
    // TOOM_COOK_SQUARE_THRESHOLD = 216 ints = 6912 bits
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    75
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    76
    // SCHOENHAGE_BASE_CONVERSION_THRESHOLD = 20 ints = 640 bits
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
    77
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    78
    // BURNIKEL_ZIEGLER_THRESHOLD = 80  ints = 2560 bits
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    79
    //
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    80
    static final int BITS_KARATSUBA = 2560;
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    81
    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
    82
    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
    83
    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
    84
    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
    85
    static final int BITS_BURNIKEL_ZIEGLER = 2560;
26627
534c5a51e93e 8058505: BigIntegerTest does not exercise Burnikel-Ziegler division
bpb
parents: 21983
diff changeset
    86
    static final int BITS_BURNIKEL_ZIEGLER_OFFSET = 1280;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    87
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    88
    static final int ORDER_SMALL = 60;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    89
    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
    90
    // #bits for testing Karatsuba
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    91
    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
    92
    // #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
    93
    static final int ORDER_TOOM_COOK = 8000;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    94
    // #bits for testing Karatsuba squaring
21983
586d25bfe206 8029514: java/math/BigInteger/BigIntegerTest.java failing since thresholds adjusted in 8022181
bpb
parents: 19393
diff changeset
    95
    static final int ORDER_KARATSUBA_SQUARE = 4200;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    96
    // #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
    97
    static final int ORDER_TOOM_COOK_SQUARE = 7000;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
    98
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
    99
    static final int SIZE = 1000; // numbers per batch
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   100
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   101
    private static Random random = RandomFactory.getRandom();
29371
6f7f029a6b63 8074460: Always print seeds used in [Splittable]Random instances in java.math tests
bpb
parents: 28309
diff changeset
   102
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   103
    static boolean failure = false;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   104
28309
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   105
    public static void constructor() {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   106
        int failCount = 0;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   107
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   108
        // --- guard condition tests for array indexing ---
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   109
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   110
        int arrayLength = 23;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   111
        int halfLength = arrayLength/2;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   112
        byte[] array = new byte[arrayLength];
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   113
        random.nextBytes(array);
28309
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   114
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   115
        int[][] offLen = new int[][] { // offset, length, num exceptions
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   116
            {-1, arrayLength, 1},                         // negative offset
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   117
            {0, arrayLength, 0},                          // OK
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   118
            {1, arrayLength, 1},                          // length overflow
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   119
            {arrayLength - 1, 1, 0},                      // OK
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   120
            {arrayLength, 1, 1},                          // offset overflow
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   121
            {0, -1, 1},                                   // negative length
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   122
            {halfLength, arrayLength - halfLength + 1, 1} // length overflow
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   123
        };
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   124
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   125
        // two's complement
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   126
        for (int[] ol : offLen) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   127
            int numExceptions = 0;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   128
            try {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   129
                BigInteger bi = new BigInteger(array, ol[0], ol[1]);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   130
            } catch (IndexOutOfBoundsException e) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   131
                numExceptions++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   132
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   133
            if (numExceptions != ol[2]) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   134
                System.err.println("IndexOutOfBoundsException did not occur for "
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   135
                    + " two's complement constructor with parameters offset "
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   136
                    + ol[0] + " and length " + ol[1]);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   137
                failCount++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   138
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   139
        }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   140
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   141
        // sign-magnitude
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   142
        for (int[] ol : offLen) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   143
            int numExceptions = 0;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   144
            try {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   145
                BigInteger bi = new BigInteger(1, array, ol[0], ol[1]);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   146
            } catch (IndexOutOfBoundsException e) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   147
                numExceptions++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   148
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   149
            if (numExceptions != ol[2]) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   150
                System.err.println("IndexOutOfBoundsException did not occur for "
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   151
                    + " sign-magnitude constructor with parameters offset "
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   152
                    + ol[0] + " and length " + ol[1]);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   153
                failCount++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   154
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   155
        }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   156
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   157
        // --- tests for creation of zero-valued BigIntegers ---
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   158
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   159
        byte[] magZeroLength = new byte[0];
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   160
        for (int signum = -1; signum <= 1; signum++) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   161
            BigInteger bi = new BigInteger(signum, magZeroLength);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   162
            if (bi.compareTo(BigInteger.ZERO) != 0) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   163
                System.err.println("A: Zero length BigInteger != 0 for signum " + signum);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   164
                failCount++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   165
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   166
        }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   167
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   168
        for (int signum = -1; signum <= 1; signum++) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   169
            BigInteger bi = new BigInteger(signum, magZeroLength, 0, 0);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   170
            if (bi.compareTo(BigInteger.ZERO) != 0) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   171
                System.err.println("B: Zero length BigInteger != 0 for signum " + signum);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   172
                failCount++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   173
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   174
        }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   175
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   176
        byte[] magNonZeroLength = new byte[42];
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   177
        random.nextBytes(magNonZeroLength);
28309
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   178
        for (int signum = -1; signum <= 1; signum++) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   179
            BigInteger bi = new BigInteger(signum, magNonZeroLength, 0, 0);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   180
            if (bi.compareTo(BigInteger.ZERO) != 0) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   181
                System.err.println("C: Zero length BigInteger != 0 for signum " + signum);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   182
                failCount++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   183
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   184
        }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   185
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   186
        // --- tests for accurate creation of non-zero BigIntegers ---
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   187
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   188
        for (int i = 0; i < SIZE; i++) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   189
            // create reference value via a different code path from those tested
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   190
            BigInteger reference = new BigInteger(2 + random.nextInt(336), 4, random);
28309
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   191
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   192
            byte[] refArray = reference.toByteArray();
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   193
            int refLen = refArray.length;
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   194
            int factor = random.nextInt(5);
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   195
            int objLen = refArray.length + factor*random.nextInt(refArray.length) + 1;
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   196
            int offset = random.nextInt(objLen - refLen);
28309
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   197
            byte[] objArray = new byte[objLen];
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   198
            System.arraycopy(refArray, 0, objArray, offset, refLen);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   199
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   200
            BigInteger twosComp = new BigInteger(objArray, offset, refLen);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   201
            if (twosComp.compareTo(reference) != 0) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   202
                System.err.println("Two's-complement BigInteger not equal for offset " +
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   203
                        offset + " and length " + refLen);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   204
                failCount++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   205
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   206
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   207
            boolean isNegative = random.nextBoolean();
28309
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   208
            BigInteger signMag = new BigInteger(isNegative ? -1 : 1, objArray, offset, refLen);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   209
            if (signMag.compareTo(isNegative ? reference.negate() : reference) != 0) {
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   210
                System.err.println("Sign-magnitude BigInteger not equal for offset " +
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   211
                        offset + " and length " + refLen);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   212
                failCount++;
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   213
            }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   214
        }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   215
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   216
        report("Constructor", failCount);
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   217
    }
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
   218
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   219
    public static void pow(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   220
        int failCount1 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   221
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   222
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   223
            // Test identity x^power == x*x*x ... *x
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   224
            int power = random.nextInt(6) + 2;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   225
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   226
            BigInteger y = x.pow(power);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   227
            BigInteger z = x;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   228
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   229
            for (int j=1; j<power; j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   230
                z = z.multiply(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   231
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   232
            if (!y.equals(z))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   233
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   234
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   235
        report("pow for " + order + " bits", failCount1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   236
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   237
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   238
    public static void square(int order) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   239
        int failCount1 = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   240
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   241
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   242
            // Test identity x^2 == x*x
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   243
            BigInteger x  = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   244
            BigInteger xx = x.multiply(x);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   245
            BigInteger x2 = x.pow(2);
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
            if (!x2.equals(xx))
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   248
                failCount1++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   249
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   250
        report("square for " + order + " bits", failCount1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   251
    }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   252
34538
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   253
    private static void printErr(String msg) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   254
        System.err.println(msg);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   255
    }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   256
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   257
    private static int checkResult(BigInteger expected, BigInteger actual,
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   258
        String failureMessage) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   259
        if (expected.compareTo(actual) != 0) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   260
            printErr(failureMessage + " - expected: " + expected
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   261
                + ", actual: " + actual);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   262
            return 1;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   263
        }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   264
        return 0;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   265
    }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   266
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   267
    private static void squareRootSmall() {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   268
        int failCount = 0;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   269
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   270
        // A negative value should cause an exception.
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   271
        BigInteger n = BigInteger.ONE.negate();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   272
        BigInteger s;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   273
        try {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   274
            s = n.sqrt();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   275
            // If sqrt() does not throw an exception that is a failure.
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   276
            failCount++;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   277
            printErr("sqrt() of negative number did not throw an exception");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   278
        } catch (ArithmeticException expected) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   279
            // A negative value should cause an exception and is not a failure.
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   280
        }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   281
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   282
        // A zero value should return BigInteger.ZERO.
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   283
        failCount += checkResult(BigInteger.ZERO, BigInteger.ZERO.sqrt(),
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   284
            "sqrt(0) != BigInteger.ZERO");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   285
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   286
        // 1 <= value < 4 should return BigInteger.ONE.
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   287
        long[] smalls = new long[] {1, 2, 3};
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   288
        for (long small : smalls) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   289
            failCount += checkResult(BigInteger.ONE,
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   290
                BigInteger.valueOf(small).sqrt(), "sqrt("+small+") != 1");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   291
        }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   292
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   293
        report("squareRootSmall", failCount);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   294
    }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   295
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   296
    public static void squareRoot() {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   297
        squareRootSmall();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   298
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   299
        ToIntFunction<BigInteger> f = (n) -> {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   300
            int failCount = 0;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   301
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   302
            // square root of n^2 -> n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   303
            BigInteger n2 = n.pow(2);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   304
            failCount += checkResult(n, n2.sqrt(), "sqrt() n^2 -> n");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   305
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   306
            // square root of n^2 + 1 -> n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   307
            BigInteger n2up = n2.add(BigInteger.ONE);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   308
            failCount += checkResult(n, n2up.sqrt(), "sqrt() n^2 + 1 -> n");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   309
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   310
            // square root of (n + 1)^2 - 1 -> n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   311
            BigInteger up =
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   312
                n.add(BigInteger.ONE).pow(2).subtract(BigInteger.ONE);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   313
            failCount += checkResult(n, up.sqrt(), "sqrt() (n + 1)^2 - 1 -> n");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   314
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   315
            // sqrt(n)^2 <= n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   316
            BigInteger s = n.sqrt();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   317
            if (s.multiply(s).compareTo(n) > 0) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   318
                failCount++;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   319
                printErr("sqrt(n)^2 > n for n = " + n);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   320
            }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   321
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   322
            // (sqrt(n) + 1)^2 > n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   323
            if (s.add(BigInteger.ONE).pow(2).compareTo(n) <= 0) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   324
                failCount++;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   325
                printErr("(sqrt(n) + 1)^2 <= n for n = " + n);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   326
            }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   327
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   328
            return failCount;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   329
        };
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   330
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   331
        Stream.Builder<BigInteger> sb = Stream.builder();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   332
        int maxExponent = Double.MAX_EXPONENT + 1;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   333
        for (int i = 1; i <= maxExponent; i++) {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   334
            BigInteger p2 = BigInteger.ONE.shiftLeft(i);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   335
            sb.add(p2.subtract(BigInteger.ONE));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   336
            sb.add(p2);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   337
            sb.add(p2.add(BigInteger.ONE));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   338
        }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   339
        sb.add((new BigDecimal(Double.MAX_VALUE)).toBigInteger());
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   340
        sb.add((new BigDecimal(Double.MAX_VALUE)).toBigInteger().add(BigInteger.ONE));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   341
        report("squareRoot for 2^N and 2^N - 1, 1 <= N <= Double.MAX_EXPONENT",
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   342
            sb.build().collect(Collectors.summingInt(f)));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   343
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   344
        IntStream ints = random.ints(SIZE, 4, Integer.MAX_VALUE);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   345
        report("squareRoot for int", ints.mapToObj(x ->
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   346
            BigInteger.valueOf(x)).collect(Collectors.summingInt(f)));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   347
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   348
        LongStream longs = random.longs(SIZE, (long)Integer.MAX_VALUE + 1L,
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   349
            Long.MAX_VALUE);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   350
        report("squareRoot for long", longs.mapToObj(x ->
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   351
            BigInteger.valueOf(x)).collect(Collectors.summingInt(f)));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   352
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   353
        DoubleStream doubles = random.doubles(SIZE,
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   354
            (double) Long.MAX_VALUE + 1.0, Math.sqrt(Double.MAX_VALUE));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   355
        report("squareRoot for double", doubles.mapToObj(x ->
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   356
            BigDecimal.valueOf(x).toBigInteger()).collect(Collectors.summingInt(f)));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   357
    }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   358
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   359
    public static void squareRootAndRemainder() {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   360
        ToIntFunction<BigInteger> g = (n) -> {
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   361
            int failCount = 0;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   362
            BigInteger n2 = n.pow(2);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   363
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   364
            // square root of n^2 -> n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   365
            BigInteger[] actual = n2.sqrtAndRemainder();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   366
            failCount += checkResult(n, actual[0], "sqrtAndRemainder()[0]");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   367
            failCount += checkResult(BigInteger.ZERO, actual[1],
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   368
                "sqrtAndRemainder()[1]");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   369
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   370
            // square root of n^2 + 1 -> n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   371
            BigInteger n2up = n2.add(BigInteger.ONE);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   372
            actual = n2up.sqrtAndRemainder();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   373
            failCount += checkResult(n, actual[0], "sqrtAndRemainder()[0]");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   374
            failCount += checkResult(BigInteger.ONE, actual[1],
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   375
                "sqrtAndRemainder()[1]");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   376
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   377
            // square root of (n + 1)^2 - 1 -> n
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   378
            BigInteger up =
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   379
                n.add(BigInteger.ONE).pow(2).subtract(BigInteger.ONE);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   380
            actual = up.sqrtAndRemainder();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   381
            failCount += checkResult(n, actual[0], "sqrtAndRemainder()[0]");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   382
            BigInteger r = up.subtract(n2);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   383
            failCount += checkResult(r, actual[1], "sqrtAndRemainder()[1]");
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   384
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   385
            return failCount;
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   386
        };
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   387
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   388
        IntStream bits = random.ints(SIZE, 3, Short.MAX_VALUE);
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   389
        report("sqrtAndRemainder", bits.mapToObj(x ->
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   390
            BigInteger.valueOf(x)).collect(Collectors.summingInt(g)));
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   391
    }
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
   392
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   393
    public static void arithmetic(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   394
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   395
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   396
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   397
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   398
            while(x.compareTo(BigInteger.ZERO) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   399
                x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   400
            BigInteger y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   401
            while(x.compareTo(y) == -1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   402
                y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   403
            if (y.equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   404
                y = y.add(BigInteger.ONE);
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
            // Test identity ((x/y))*y + x%y - x == 0
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   407
            // using separate divide() and remainder()
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   408
            BigInteger baz = x.divide(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   409
            baz = baz.multiply(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   410
            baz = baz.add(x.remainder(y));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   411
            baz = baz.subtract(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   412
            if (!baz.equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   413
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   414
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   415
        report("Arithmetic I for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   416
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   417
        failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   418
        for (int i=0; i<100; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   419
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   420
            while(x.compareTo(BigInteger.ZERO) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   421
                x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   422
            BigInteger y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   423
            while(x.compareTo(y) == -1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   424
                y = fetchNumber(order/2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   425
            if (y.equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   426
                y = y.add(BigInteger.ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   427
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   428
            // Test identity ((x/y))*y + x%y - x == 0
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   429
            // using divideAndRemainder()
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   430
            BigInteger baz[] = x.divideAndRemainder(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   431
            baz[0] = baz[0].multiply(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   432
            baz[0] = baz[0].add(baz[1]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   433
            baz[0] = baz[0].subtract(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   434
            if (!baz[0].equals(BigInteger.ZERO))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   435
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   436
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   437
        report("Arithmetic II for " + order + " bits", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   438
    }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   439
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   440
    /**
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   441
     * Sanity test for Karatsuba and 3-way Toom-Cook multiplication.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   442
     * 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
   443
     * 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
   444
     * 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
   445
     * 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
   446
     * 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
   447
     * 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
   448
     * identity
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   449
     * <pre>
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   450
     * (u << a)*(v << b) = (u*v) << (a + b)
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   451
     * </pre>
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   452
     * For Karatsuba multiplication, the right hand expression will be evaluated
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   453
     * 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
   454
     * 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
   455
     * hand expression will be evaluated using Karatsuba multiplication, and the
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   456
     * left hand expression using 3-way Toom-Cook multiplication.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   457
     */
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   458
    public static void multiplyLarge() {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   459
        int failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   460
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   461
        BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA - 32 - 1);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   462
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   463
            BigInteger x = fetchNumber(BITS_KARATSUBA - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   464
            BigInteger u = base.add(x);
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   465
            int a = 1 + random.nextInt(31);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   466
            BigInteger w = u.shiftLeft(a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   467
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   468
            BigInteger y = fetchNumber(BITS_KARATSUBA - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   469
            BigInteger v = base.add(y);
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   470
            int b = 1 + random.nextInt(32);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   471
            BigInteger z = v.shiftLeft(b);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   472
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   473
            BigInteger multiplyResult = u.multiply(v).shiftLeft(a + b);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   474
            BigInteger karatsubaMultiplyResult = w.multiply(z);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   475
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   476
            if (!multiplyResult.equals(karatsubaMultiplyResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   477
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   478
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   479
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   480
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   481
        report("multiplyLarge Karatsuba", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   482
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   483
        failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   484
        base = base.shiftLeft(BITS_TOOM_COOK - BITS_KARATSUBA);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   485
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   486
            BigInteger x = fetchNumber(BITS_TOOM_COOK - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   487
            BigInteger u = base.add(x);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   488
            BigInteger u2 = u.shiftLeft(1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   489
            BigInteger y = fetchNumber(BITS_TOOM_COOK - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   490
            BigInteger v = base.add(y);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   491
            BigInteger v2 = v.shiftLeft(1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   492
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   493
            BigInteger multiplyResult = u.multiply(v).shiftLeft(2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   494
            BigInteger toomCookMultiplyResult = u2.multiply(v2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   495
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   496
            if (!multiplyResult.equals(toomCookMultiplyResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   497
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   498
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   499
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   500
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   501
        report("multiplyLarge Toom-Cook", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   502
    }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   503
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   504
    /**
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   505
     * Sanity test for Karatsuba and 3-way Toom-Cook squaring.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   506
     * This test is analogous to {@link AbstractMethodError#multiplyLarge}
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   507
     * 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
   508
     * unless the <code>bigInteger.multiply(bigInteger)</code> tests whether
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   509
     * 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
   510
     * and calls <code>square()</code> accordingly.
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   511
     */
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   512
    public static void squareLarge() {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   513
        int failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   514
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   515
        BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA_SQUARE - 32 - 1);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   516
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   517
            BigInteger x = fetchNumber(BITS_KARATSUBA_SQUARE - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   518
            BigInteger u = base.add(x);
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   519
            int a = 1 + random.nextInt(31);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   520
            BigInteger w = u.shiftLeft(a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   521
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   522
            BigInteger squareResult = u.multiply(u).shiftLeft(2*a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   523
            BigInteger karatsubaSquareResult = w.multiply(w);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   524
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   525
            if (!squareResult.equals(karatsubaSquareResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   526
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   527
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   528
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   529
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   530
        report("squareLarge Karatsuba", failCount);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   531
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   532
        failCount = 0;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   533
        base = base.shiftLeft(BITS_TOOM_COOK_SQUARE - BITS_KARATSUBA_SQUARE);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   534
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   535
            BigInteger x = fetchNumber(BITS_TOOM_COOK_SQUARE - 32 - 1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   536
            BigInteger u = base.add(x);
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   537
            int a = 1 + random.nextInt(31);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   538
            BigInteger w = u.shiftLeft(a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   539
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   540
            BigInteger squareResult = u.multiply(u).shiftLeft(2*a);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   541
            BigInteger toomCookSquareResult = w.multiply(w);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   542
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   543
            if (!squareResult.equals(toomCookSquareResult)) {
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   544
                failCount++;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   545
            }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   546
        }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   547
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   548
        report("squareLarge Toom-Cook", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   549
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   550
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   551
    /**
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   552
     * Sanity test for Burnikel-Ziegler division.  The Burnikel-Ziegler division
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   553
     * 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
   554
     * 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
   555
     * 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
   556
     * 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
   557
     * {@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
   558
     * {@code q1 = q2*pow(2,a-b)} and {@code r1 = r2*pow(2,b)}.  The test
26633
f965000bffe7 8058664: Bad fonts in BigIntegerTest
bpb
parents: 26627
diff changeset
   559
     * ensures that {@code v} is just under the B-Z threshold, that {@code z} is
f965000bffe7 8058664: Bad fonts in BigIntegerTest
bpb
parents: 26627
diff changeset
   560
     * over the threshold and {@code w} is much larger than {@code z}. This
f965000bffe7 8058664: Bad fonts in BigIntegerTest
bpb
parents: 26627
diff changeset
   561
     * implies that {@code u/v} uses the standard division algorithm and
26634
316694730d62 8058679: More bad characters in BigIntegerTest
bpb
parents: 26633
diff changeset
   562
     * {@code w/z} uses the B-Z algorithm.  The results of the two algorithms
26633
f965000bffe7 8058664: Bad fonts in BigIntegerTest
bpb
parents: 26627
diff changeset
   563
     * are then compared using the observation described in the foregoing and
f965000bffe7 8058664: Bad fonts in BigIntegerTest
bpb
parents: 26627
diff changeset
   564
     * if they are not equal a failure is logged.
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   565
     */
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   566
    public static void divideLarge() {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   567
        int failCount = 0;
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   568
26627
534c5a51e93e 8058505: BigIntegerTest does not exercise Burnikel-Ziegler division
bpb
parents: 21983
diff changeset
   569
        BigInteger base = BigInteger.ONE.shiftLeft(BITS_BURNIKEL_ZIEGLER + BITS_BURNIKEL_ZIEGLER_OFFSET - 33);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   570
        for (int i=0; i<SIZE; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   571
            BigInteger addend = new BigInteger(BITS_BURNIKEL_ZIEGLER + BITS_BURNIKEL_ZIEGLER_OFFSET - 34, random);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   572
            BigInteger v = base.add(addend);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   573
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   574
            BigInteger u = v.multiply(BigInteger.valueOf(2 + random.nextInt(Short.MAX_VALUE - 1)));
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   575
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   576
            if(random.nextBoolean()) {
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   577
                u = u.negate();
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   578
            }
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   579
            if(random.nextBoolean()) {
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   580
                v = v.negate();
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   581
            }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   582
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   583
            int a = BITS_BURNIKEL_ZIEGLER_OFFSET + random.nextInt(16);
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   584
            int b = 1 + random.nextInt(16);
26627
534c5a51e93e 8058505: BigIntegerTest does not exercise Burnikel-Ziegler division
bpb
parents: 21983
diff changeset
   585
            BigInteger w = u.multiply(BigInteger.ONE.shiftLeft(a));
534c5a51e93e 8058505: BigIntegerTest does not exercise Burnikel-Ziegler division
bpb
parents: 21983
diff changeset
   586
            BigInteger z = v.multiply(BigInteger.ONE.shiftLeft(b));
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   587
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   588
            BigInteger[] divideResult = u.divideAndRemainder(v);
26627
534c5a51e93e 8058505: BigIntegerTest does not exercise Burnikel-Ziegler division
bpb
parents: 21983
diff changeset
   589
            divideResult[0] = divideResult[0].multiply(BigInteger.ONE.shiftLeft(a - b));
534c5a51e93e 8058505: BigIntegerTest does not exercise Burnikel-Ziegler division
bpb
parents: 21983
diff changeset
   590
            divideResult[1] = divideResult[1].multiply(BigInteger.ONE.shiftLeft(b));
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   591
            BigInteger[] bzResult = w.divideAndRemainder(z);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   592
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   593
            if (divideResult[0].compareTo(bzResult[0]) != 0 ||
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   594
                    divideResult[1].compareTo(bzResult[1]) != 0) {
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   595
                failCount++;
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   596
            }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   597
        }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   598
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   599
        report("divideLarge", failCount);
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   600
    }
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   601
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   602
    public static void bitCount() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   603
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   604
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   605
        for (int i=0; i<SIZE*10; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   606
            int x = random.nextInt();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   607
            BigInteger bigX = BigInteger.valueOf((long)x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   608
            int bit = (x < 0 ? 0 : 1);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   609
            int tmp = x, bitCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   610
            for (int j=0; j<32; j++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   611
                bitCount += ((tmp & 1) == bit ? 1 : 0);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   612
                tmp >>= 1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   613
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   614
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   615
            if (bigX.bitCount() != bitCount) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   616
                //System.err.println(x+": "+bitCount+", "+bigX.bitCount());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   617
                failCount++;
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
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   620
        report("Bit Count", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   621
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   622
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   623
    public static void bitLength() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   624
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   625
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   626
        for (int i=0; i<SIZE*10; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   627
            int x = random.nextInt();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   628
            BigInteger bigX = BigInteger.valueOf((long)x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   629
            int signBit = (x < 0 ? 0x80000000 : 0);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   630
            int tmp = x, bitLength, j;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   631
            for (j=0; j<32 && (tmp & 0x80000000)==signBit; j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   632
                tmp <<= 1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   633
            bitLength = 32 - j;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   634
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   635
            if (bigX.bitLength() != bitLength) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   636
                //System.err.println(x+": "+bitLength+", "+bigX.bitLength());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   637
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   638
            }
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
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   641
        report("BitLength", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   642
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   643
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   644
    public static void bitOps(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   645
        int failCount1 = 0, failCount2 = 0, failCount3 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   646
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   647
        for (int i=0; i<SIZE*5; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   648
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   649
            BigInteger y;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   650
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   651
            // Test setBit and clearBit (and testBit)
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   652
            if (x.signum() < 0) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   653
                y = BigInteger.valueOf(-1);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   654
                for (int j=0; j<x.bitLength(); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   655
                    if (!x.testBit(j))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   656
                        y = y.clearBit(j);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   657
            } else {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   658
                y = BigInteger.ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   659
                for (int j=0; j<x.bitLength(); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   660
                    if (x.testBit(j))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   661
                        y = y.setBit(j);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   662
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   663
            if (!x.equals(y))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   664
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   665
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   666
            // Test flipBit (and testBit)
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   667
            y = BigInteger.valueOf(x.signum()<0 ? -1 : 0);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   668
            for (int j=0; j<x.bitLength(); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   669
                if (x.signum()<0  ^  x.testBit(j))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   670
                    y = y.flipBit(j);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   671
            if (!x.equals(y))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   672
                failCount2++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   673
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   674
        report("clearBit/testBit for " + order + " bits", failCount1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   675
        report("flipBit/testBit for " + order + " bits", failCount2);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   676
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   677
        for (int i=0; i<SIZE*5; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   678
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   679
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   680
            // Test getLowestSetBit()
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   681
            int k = x.getLowestSetBit();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   682
            if (x.signum() == 0) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   683
                if (k != -1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   684
                    failCount3++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   685
            } else {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   686
                BigInteger z = x.and(x.negate());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   687
                int j;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   688
                for (j=0; j<z.bitLength() && !z.testBit(j); j++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   689
                    ;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   690
                if (k != j)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   691
                    failCount3++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   692
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   693
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   694
        report("getLowestSetBit for " + order + " bits", failCount3);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   695
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   696
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   697
    public static void bitwise(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   698
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   699
        // Test identity x^y == x|y &~ x&y
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   700
        int failCount = 0;
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   701
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   702
            BigInteger x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   703
            BigInteger y = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   704
            BigInteger z = x.xor(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   705
            BigInteger w = x.or(y).andNot(x.and(y));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   706
            if (!z.equals(w))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   707
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   708
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   709
        report("Logic (^ | & ~) for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   710
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   711
        // Test identity x &~ y == ~(~x | y)
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   712
        failCount = 0;
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   713
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   714
            BigInteger x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   715
            BigInteger y = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   716
            BigInteger z = x.andNot(y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   717
            BigInteger w = x.not().or(y).not();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   718
            if (!z.equals(w))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   719
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   720
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   721
        report("Logic (&~ | ~) for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   722
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   723
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   724
    public static void shift(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   725
        int failCount1 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   726
        int failCount2 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   727
        int failCount3 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   728
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   729
        for (int i=0; i<100; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   730
            BigInteger x = fetchNumber(order);
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   731
            int n = Math.abs(random.nextInt()%200);
1826
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
            if (!x.shiftLeft(n).equals
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   734
                (x.multiply(BigInteger.valueOf(2L).pow(n))))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   735
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   736
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   737
            BigInteger y[] =x.divideAndRemainder(BigInteger.valueOf(2L).pow(n));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   738
            BigInteger z = (x.signum()<0 && y[1].signum()!=0
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   739
                            ? y[0].subtract(BigInteger.ONE)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   740
                            : y[0]);
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
            BigInteger b = x.shiftRight(n);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   743
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   744
            if (!b.equals(z)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   745
                System.err.println("Input is "+x.toString(2));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   746
                System.err.println("shift is "+n);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   747
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   748
                System.err.println("Divided "+z.toString(2));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   749
                System.err.println("Shifted is "+b.toString(2));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   750
                if (b.toString().equals(z.toString()))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   751
                    System.err.println("Houston, we have a problem.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   752
                failCount2++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   753
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   754
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   755
            if (!x.shiftLeft(n).shiftRight(n).equals(x))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   756
                failCount3++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   757
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   758
        report("baz shiftLeft for " + order + " bits", failCount1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   759
        report("baz shiftRight for " + order + " bits", failCount2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   760
        report("baz shiftLeft/Right for " + order + " bits", failCount3);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   761
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   762
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   763
    public static void divideAndRemainder(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   764
        int failCount1 = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   765
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   766
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   767
            BigInteger x = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   768
            while(x.compareTo(BigInteger.valueOf(3L)) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   769
                x = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   770
            BigInteger z = x.divide(BigInteger.valueOf(2L));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   771
            BigInteger y[] = x.divideAndRemainder(x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   772
            if (!y[0].equals(BigInteger.ONE)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   773
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   774
                System.err.println("fail1 x :"+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   775
                System.err.println("      y :"+y);
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
            else if (!y[1].equals(BigInteger.ZERO)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   778
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   779
                System.err.println("fail2 x :"+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   780
                System.err.println("      y :"+y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   781
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   782
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   783
            y = x.divideAndRemainder(z);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   784
            if (!y[0].equals(BigInteger.valueOf(2))) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   785
                failCount1++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   786
                System.err.println("fail3 x :"+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   787
                System.err.println("      y :"+y);
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
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   790
        report("divideAndRemainder for " + order + " bits", failCount1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   791
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   792
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   793
    public static void stringConv() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   794
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   795
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   796
        // Generic string conversion.
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   797
        for (int i=0; i<100; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   798
            byte xBytes[] = new byte[Math.abs(random.nextInt())%100+1];
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   799
            random.nextBytes(xBytes);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   800
            BigInteger x = new BigInteger(xBytes);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   801
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   802
            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
   803
                String result = x.toString(radix);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   804
                BigInteger test = new BigInteger(result, radix);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   805
                if (!test.equals(x)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   806
                    failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   807
                    System.err.println("BigInteger toString: "+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   808
                    System.err.println("Test: "+test);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   809
                    System.err.println(radix);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   810
                }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   811
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   812
        }
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   813
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   814
        // String conversion straddling the Schoenhage algorithm crossover
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   815
        // threshold, and at twice and four times the threshold.
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   816
        for (int k = 0; k <= 2; k++) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   817
            int factor = 1 << k;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   818
            int upper = factor * BITS_SCHOENHAGE_BASE + 33;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   819
            int lower = upper - 35;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   820
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   821
            for (int bits = upper; bits >= lower; bits--) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   822
                for (int i = 0; i < 50; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   823
                    BigInteger x = BigInteger.ONE.shiftLeft(bits - 1).or(new BigInteger(bits - 2, random));
18548
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   824
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   825
                    for (int radix = Character.MIN_RADIX; radix < Character.MAX_RADIX; radix++) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   826
                        String result = x.toString(radix);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   827
                        BigInteger test = new BigInteger(result, radix);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   828
                        if (!test.equals(x)) {
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   829
                            failCount++;
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   830
                            System.err.println("BigInteger toString: " + x);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   831
                            System.err.println("Test: " + test);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   832
                            System.err.println(radix);
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   833
                        }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   834
                    }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   835
                }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   836
            }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   837
        }
0b6ca9785d8c 4641897: Faster string conversion of large integers
bpb
parents: 18286
diff changeset
   838
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   839
        report("String Conversion", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   840
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   841
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   842
    public static void byteArrayConv(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   843
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   844
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   845
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   846
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   847
            while (x.equals(BigInteger.ZERO))
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   848
                x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   849
            BigInteger y = new BigInteger(x.toByteArray());
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   850
            if (!x.equals(y)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   851
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   852
                System.err.println("orig is "+x);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   853
                System.err.println("new is "+y);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   854
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   855
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   856
        report("Array Conversion for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   857
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   858
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   859
    public static void modInv(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   860
        int failCount = 0, successCount = 0, nonInvCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   861
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   862
        for (int i=0; i<SIZE; i++) {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   863
            BigInteger x = fetchNumber(order);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   864
            while(x.equals(BigInteger.ZERO))
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   865
                x = fetchNumber(order);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   866
            BigInteger m = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   867
            while(m.compareTo(BigInteger.ONE) != 1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   868
                m = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   869
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   870
            try {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   871
                BigInteger inv = x.modInverse(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   872
                BigInteger prod = inv.multiply(x).remainder(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   873
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   874
                if (prod.signum() == -1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   875
                    prod = prod.add(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   876
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   877
                if (prod.equals(BigInteger.ONE))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   878
                    successCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   879
                else
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   880
                    failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   881
            } catch(ArithmeticException e) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   882
                nonInvCount++;
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
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   885
        report("Modular Inverse for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   886
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   887
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   888
    public static void modExp(int order1, int order2) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   889
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   890
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
   891
        for (int i=0; i<SIZE/10; i++) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   892
            BigInteger m = fetchNumber(order1).abs();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   893
            while(m.compareTo(BigInteger.ONE) != 1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   894
                m = fetchNumber(order1).abs();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   895
            BigInteger base = fetchNumber(order2);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   896
            BigInteger exp = fetchNumber(8).abs();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   897
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   898
            BigInteger z = base.modPow(exp, m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   899
            BigInteger w = base.pow(exp.intValue()).mod(m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   900
            if (!z.equals(w)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   901
                System.err.println("z is "+z);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   902
                System.err.println("w is "+w);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   903
                System.err.println("mod is "+m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   904
                System.err.println("base is "+base);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   905
                System.err.println("exp is "+exp);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   906
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   907
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   908
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   909
        report("Exponentiation I for " + order1 + " and " +
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   910
               order2 + " bits", failCount);
1826
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
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   913
    // This test is based on Fermat's theorem
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   914
    // 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
   915
    // 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
   916
    public static void modExp2(int order) {
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   917
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   918
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   919
        for (int i=0; i<10; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   920
            BigInteger m = new BigInteger(100, 5, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   921
            while(m.compareTo(BigInteger.ONE) != 1)
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   922
                m = new BigInteger(100, 5, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   923
            BigInteger exp = m.subtract(BigInteger.ONE);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   924
            BigInteger base = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   925
            while(base.compareTo(m) != -1)
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   926
                base = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   927
            while(base.equals(BigInteger.ZERO))
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   928
                base = fetchNumber(order).abs();
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   929
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   930
            BigInteger one = base.modPow(exp, m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   931
            if (!one.equals(BigInteger.ONE)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   932
                System.err.println("m is "+m);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   933
                System.err.println("base is "+base);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   934
                System.err.println("exp is "+exp);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   935
                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
        }
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
   938
        report("Exponentiation II for " + order + " bits", failCount);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   939
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   940
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   941
    private static final int[] mersenne_powers = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   942
        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
   943
        21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   944
        1257787, 1398269, 2976221, 3021377, 6972593, 13466917 };
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
    private static final long[] carmichaels = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   947
      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
   948
      62745,63973,75361,101101,115921,126217,162401,172081,188461,252601,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   949
      278545,294409,314821,334153,340561,399001,410041,449065,488881,512461,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   950
      225593397919L };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   951
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   952
    // Note: testing the larger ones takes too long.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   953
    private static final int NUM_MERSENNES_TO_TEST = 7;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   954
    // 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
   955
    private static final int NUM_CARMICHAELS_TO_TEST = 5;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   956
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   957
    private static final String[] customer_primes = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   958
        "120000000000000000000000000000000019",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   959
        "633825300114114700748351603131",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   960
        "1461501637330902918203684832716283019651637554291",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   961
        "779626057591079617852292862756047675913380626199",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   962
        "857591696176672809403750477631580323575362410491",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   963
        "910409242326391377348778281801166102059139832131",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   964
        "929857869954035706722619989283358182285540127919",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   965
        "961301750640481375785983980066592002055764391999",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   966
        "1267617700951005189537696547196156120148404630231",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   967
        "1326015641149969955786344600146607663033642528339" };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   968
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   969
    private static final BigInteger ZERO = BigInteger.ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   970
    private static final BigInteger ONE = BigInteger.ONE;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   971
    private static final BigInteger TWO = new BigInteger("2");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   972
    private static final BigInteger SIX = new BigInteger("6");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   973
    private static final BigInteger TWELVE = new BigInteger("12");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   974
    private static final BigInteger EIGHTEEN = new BigInteger("18");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   975
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   976
    public static void prime() {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   977
        BigInteger p1, p2, c1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   978
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   979
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   980
        // Test consistency
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   981
        for(int i=0; i<10; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
   982
            p1 = BigInteger.probablePrime(100, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   983
            if (!p1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   984
                System.err.println("Consistency "+p1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   985
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   986
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   987
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   988
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   989
        // Test some known Mersenne primes (2^n)-1
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   990
        // The array holds the exponents, not the numbers being tested
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   991
        for (int i=0; i<NUM_MERSENNES_TO_TEST; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   992
            p1 = new BigInteger("2");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   993
            p1 = p1.pow(mersenne_powers[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   994
            p1 = p1.subtract(BigInteger.ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   995
            if (!p1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   996
                System.err.println("Mersenne prime "+i+ " failed.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   997
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   998
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
   999
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1000
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1001
        // 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
  1002
        for (int i=0; i<customer_primes.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1003
            p1 = new BigInteger(customer_primes[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1004
            if (!p1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1005
                System.err.println("Customer prime "+i+ " failed.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1006
                failCount++;
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
        // Test some known Carmichael numbers.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1011
        for (int i=0; i<carmichaels.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1012
            c1 = BigInteger.valueOf(carmichaels[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1013
            if(c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1014
                System.err.println("Carmichael "+i+ " reported as prime.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1015
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1016
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1017
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1018
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1019
        // Test some computed Carmichael numbers.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1020
        // 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
  1021
        // each of the factors is prime
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1022
        int found = 0;
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1023
        BigInteger f1 = new BigInteger(40, 100, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1024
        while (found < NUM_CARMICHAELS_TO_TEST) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1025
            BigInteger k = null;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1026
            BigInteger f2, f3;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1027
            f1 = f1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1028
            BigInteger[] result = f1.subtract(ONE).divideAndRemainder(SIX);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1029
            if (result[1].equals(ZERO)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1030
                k = result[0];
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1031
                f2 = k.multiply(TWELVE).add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1032
                if (f2.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1033
                    f3 = k.multiply(EIGHTEEN).add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1034
                    if (f3.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1035
                        c1 = f1.multiply(f2).multiply(f3);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1036
                        if (c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1037
                            System.err.println("Computed Carmichael "
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1038
                                               +c1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1039
                            failCount++;
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
                        found++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1042
                    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1043
                }
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
            f1 = f1.add(TWO);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1046
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1047
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1048
        // Test some composites that are products of 2 primes
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1049
        for (int i=0; i<50; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1050
            p1 = BigInteger.probablePrime(100, random);
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1051
            p2 = BigInteger.probablePrime(100, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1052
            c1 = p1.multiply(p2);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1053
            if (c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1054
                System.err.println("Composite failed "+c1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1055
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1056
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1057
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1058
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1059
        for (int i=0; i<4; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1060
            p1 = BigInteger.probablePrime(600, random);
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1061
            p2 = BigInteger.probablePrime(600, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1062
            c1 = p1.multiply(p2);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1063
            if (c1.isProbablePrime(100)) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1064
                System.err.println("Composite failed "+c1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1065
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1066
            }
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
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1069
        report("Prime", failCount);
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
    private static final long[] primesTo100 = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1073
        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
  1074
    };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1075
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1076
    private static final long[] aPrimeSequence = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1077
        1999999003L, 1999999013L, 1999999049L, 1999999061L, 1999999081L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1078
        1999999087L, 1999999093L, 1999999097L, 1999999117L, 1999999121L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1079
        1999999151L, 1999999171L, 1999999207L, 1999999219L, 1999999271L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1080
        1999999321L, 1999999373L, 1999999423L, 1999999439L, 1999999499L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1081
        1999999553L, 1999999559L, 1999999571L, 1999999609L, 1999999613L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1082
        1999999621L, 1999999643L, 1999999649L, 1999999657L, 1999999747L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1083
        1999999763L, 1999999777L, 1999999811L, 1999999817L, 1999999829L,
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1084
        1999999853L, 1999999861L, 1999999871L, 1999999873
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1085
    };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1086
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1087
    public static void nextProbablePrime() throws Exception {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1088
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1089
        BigInteger p1, p2, p3;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1090
        p1 = p2 = p3 = ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1091
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1092
        // First test nextProbablePrime on the low range starting at zero
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1093
        for (int i=0; i<primesTo100.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1094
            p1 = p1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1095
            if (p1.longValue() != primesTo100[i]) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1096
                System.err.println("low range primes failed");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1097
                System.err.println("p1 is "+p1);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1098
                System.err.println("expected "+primesTo100[i]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1099
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1100
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1101
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1102
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1103
        // Test nextProbablePrime on a relatively small, known prime sequence
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1104
        p1 = BigInteger.valueOf(aPrimeSequence[0]);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1105
        for (int i=1; i<aPrimeSequence.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1106
            p1 = p1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1107
            if (p1.longValue() != aPrimeSequence[i]) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1108
                System.err.println("prime sequence failed");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1109
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1110
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1111
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1112
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1113
        // Next, pick some large primes, use nextProbablePrime to find the
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1114
        // 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
  1115
        for (int i=0; i<100; i+=10) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1116
            p1 = BigInteger.probablePrime(50 + i, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1117
            p2 = p1.add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1118
            p3 = p1.nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1119
            while(p2.compareTo(p3) < 0) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1120
                if (p2.isProbablePrime(100)){
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1121
                    System.err.println("nextProbablePrime failed");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1122
                    System.err.println("along range "+p1.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1123
                    System.err.println("to "+p3.toString(16));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1124
                    failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1125
                    break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1126
                }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1127
                p2 = p2.add(ONE);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1128
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1129
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1130
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1131
        report("nextProbablePrime", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1132
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1133
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1134
    public static void serialize() throws Exception {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1135
        int failCount = 0;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1136
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1137
        String bitPatterns[] = {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1138
             "ffffffff00000000ffffffff00000000ffffffff00000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1139
             "ffffffffffffffffffffffff000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1140
             "ffffffff0000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1141
             "10000000ffffffffffffffffffffffffffffffffffffffff",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1142
             "100000000000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1143
             "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1144
            "-ffffffff00000000ffffffff00000000ffffffff00000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1145
            "-ffffffffffffffffffffffff000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1146
            "-ffffffff0000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1147
            "-10000000ffffffffffffffffffffffffffffffffffffffff",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1148
            "-100000000000000000000000000000000000000000000000",
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1149
            "-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1150
        };
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1151
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1152
        for(int i = 0; i < bitPatterns.length; i++) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1153
            BigInteger b1 = new BigInteger(bitPatterns[i], 16);
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1154
            BigInteger b2 = null;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1155
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1156
            File f = new File("serialtest");
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1157
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1158
            try (FileOutputStream fos = new FileOutputStream(f)) {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1159
                try (ObjectOutputStream oos = new ObjectOutputStream(fos)) {
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1160
                    oos.writeObject(b1);
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1161
                    oos.flush();
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1162
                }
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1163
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1164
                try (FileInputStream fis = new FileInputStream(f);
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1165
                     ObjectInputStream ois = new ObjectInputStream(fis))
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1166
                {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1167
                    b2 = (BigInteger)ois.readObject();
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1168
                }
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1169
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1170
                if (!b1.equals(b2) ||
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1171
                    !b1.equals(b1.or(b2))) {
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1172
                    failCount++;
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1173
                    System.err.println("Serialized failed for hex " +
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1174
                                       b1.toString(16));
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1175
                }
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1176
            }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1177
            f.delete();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1178
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1179
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1180
        for(int i=0; i<10; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1181
            BigInteger b1 = fetchNumber(random.nextInt(100));
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1182
            BigInteger b2 = null;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1183
            File f = new File("serialtest");
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1184
            try (FileOutputStream fos = new FileOutputStream(f)) {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1185
                try (ObjectOutputStream oos = new ObjectOutputStream(fos)) {
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1186
                    oos.writeObject(b1);
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1187
                    oos.flush();
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1188
                }
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1189
8543
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1190
                try (FileInputStream fis = new FileInputStream(f);
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1191
                     ObjectInputStream ois = new ObjectInputStream(fis))
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1192
                {
e5ec12a932da 7021209: convert lang, math, util to use try-with-resources
smarks
parents: 5506
diff changeset
  1193
                    b2 = (BigInteger)ois.readObject();
4527
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1194
                }
f95d12f08613 6908541: Bad resource management in java/math/BigInteger/BigIntegerTest.java
darcy
parents: 1826
diff changeset
  1195
            }
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1196
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1197
            if (!b1.equals(b2) ||
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1198
                !b1.equals(b1.or(b2)))
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1199
                failCount++;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1200
            f.delete();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1201
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1202
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1203
        report("Serialize", failCount);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1204
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1205
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1206
    /**
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1207
     * Main to interpret arguments and run several tests.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1208
     *
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1209
     * 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
  1210
     * 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
  1211
     * 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
  1212
     *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1213
     */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1214
    public static void main(String[] args) throws Exception {
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1215
        // Some variables for sizing test numbers in bits
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1216
        int order1 = ORDER_MEDIUM;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1217
        int order2 = ORDER_SMALL;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1218
        int order3 = ORDER_KARATSUBA;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1219
        int order4 = ORDER_TOOM_COOK;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1220
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1221
        if (args.length >0)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1222
            order1 = (int)((Integer.parseInt(args[0]))* 3.333);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1223
        if (args.length >1)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1224
            order2 = (int)((Integer.parseInt(args[1]))* 3.333);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1225
        if (args.length >2)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1226
            order3 = (int)((Integer.parseInt(args[2]))* 3.333);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1227
        if (args.length >3)
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1228
            order4 = (int)((Integer.parseInt(args[3]))* 3.333);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1229
28309
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
  1230
        constructor();
45f25a2cf942 4026465: Provide more byte array constructors for BigInteger
bpb
parents: 26634
diff changeset
  1231
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1232
        prime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1233
        nextProbablePrime();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1234
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1235
        arithmetic(order1);   // small numbers
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
  1236
        arithmetic(order3);   // Karatsuba range
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
  1237
        arithmetic(order4);   // Toom-Cook / Burnikel-Ziegler range
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1238
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1239
        divideAndRemainder(order1);   // small numbers
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
  1240
        divideAndRemainder(order3);   // Karatsuba range
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
  1241
        divideAndRemainder(order4);   // Toom-Cook / Burnikel-Ziegler range
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1242
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1243
        pow(order1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1244
        pow(order3);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1245
        pow(order4);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1246
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1247
        square(ORDER_MEDIUM);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1248
        square(ORDER_KARATSUBA_SQUARE);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1249
        square(ORDER_TOOM_COOK_SQUARE);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1250
34538
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
  1251
        squareRoot();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
  1252
        squareRootAndRemainder();
b0705127fbba 8032027: Add BigInteger square root methods
bpb
parents: 30436
diff changeset
  1253
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1254
        bitCount();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1255
        bitLength();
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1256
        bitOps(order1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1257
        bitwise(order1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1258
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1259
        shift(order1);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1260
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1261
        byteArrayConv(order1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1262
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1263
        modInv(order1);   // small numbers
19393
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
  1264
        modInv(order3);   // Karatsuba range
d99a9ebf9c10 8022180: BigInteger Burnikel-Ziegler quotient and remainder calculation assumes quotient parameter is zero
bpb
parents: 19061
diff changeset
  1265
        modInv(order4);   // Toom-Cook / Burnikel-Ziegler range
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1266
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1267
        modExp(order1, order2);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1268
        modExp2(order1);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1269
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1270
        stringConv();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1271
        serialize();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1272
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1273
        multiplyLarge();
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1274
        squareLarge();
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1275
        divideLarge();
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1276
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1277
        if (failure)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1278
            throw new RuntimeException("Failure in BigIntegerTest.");
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1279
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1280
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1281
    /*
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1282
     * 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
  1283
     * 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
  1284
     * numbers, empty BigIntegers, etc.
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1285
     *
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1286
     * 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
  1287
     */
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1288
    private static BigInteger fetchNumber(int order) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1289
        boolean negative = random.nextBoolean();
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1290
        int numType = random.nextInt(7);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1291
        BigInteger result = null;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1292
        if (order < 2) order = 2;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1293
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1294
        switch (numType) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1295
            case 0: // Empty
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1296
                result = BigInteger.ZERO;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1297
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1298
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1299
            case 1: // One
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1300
                result = BigInteger.ONE;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1301
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1302
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1303
            case 2: // All bits set in number
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1304
                int numBytes = (order+7)/8;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1305
                byte[] fullBits = new byte[numBytes];
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1306
                for(int i=0; i<numBytes; i++)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1307
                    fullBits[i] = (byte)0xff;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1308
                int excessBits = 8*numBytes - order;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1309
                fullBits[0] &= (1 << (8-excessBits)) - 1;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1310
                result = new BigInteger(1, fullBits);
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1311
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1312
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1313
            case 3: // One bit in number
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1314
                result = BigInteger.ONE.shiftLeft(random.nextInt(order));
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1315
                break;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1316
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1317
            case 4: // Random bit density
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1318
                byte[] val = new byte[(order+7)/8];
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1319
                int iterations = random.nextInt(order);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1320
                for (int i=0; i<iterations; i++) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1321
                    int bitIdx = random.nextInt(order);
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1322
                    val[bitIdx/8] |= 1 << (bitIdx%8);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1323
                }
19060
4d949a65ad7f 8014319: Faster division of large integers
bpb
parents: 18548
diff changeset
  1324
                result = new BigInteger(1, val);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1325
                break;
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1326
            case 5: // Runs of consecutive ones and zeros
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1327
                result = ZERO;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1328
                int remaining = order;
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1329
                int bit = random.nextInt(2);
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1330
                while (remaining > 0) {
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1331
                    int runLength = Math.min(remaining, random.nextInt(order));
18286
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1332
                    result = result.shiftLeft(runLength);
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1333
                    if (bit > 0)
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1334
                        result = result.add(ONE.shiftLeft(runLength).subtract(ONE));
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1335
                    remaining -= runLength;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1336
                    bit = 1 - bit;
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1337
                }
b38489d5aadf 4837946: Faster multiplication and exponentiation of large integers
bpb
parents: 9035
diff changeset
  1338
                break;
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1339
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1340
            default: // random bits
30048
3424bede284d 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
bpb
parents: 30046
diff changeset
  1341
                result = new BigInteger(order, random);
1826
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1342
        }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1343
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1344
        if (negative)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1345
            result = result.negate();
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1346
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1347
        return result;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1348
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1349
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1350
    static void report(String testName, int failCount) {
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1351
        System.err.println(testName+": " +
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1352
                           (failCount==0 ? "Passed":"Failed("+failCount+")"));
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1353
        if (failCount > 0)
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1354
            failure = true;
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1355
    }
39d505a353e8 6601457: Move wrapper class tests from closed to open
darcy
parents:
diff changeset
  1356
}