1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.math; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Random; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughespublic class OldBigIntegerTest extends junit.framework.TestCase { 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger minusOne = new BigInteger("-1", 10); 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger two = new BigInteger("2", 10); 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes BigInteger aZillion = new BigInteger("100000000000000000000000000000000000000000000000000", 10); 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Random rand = new Random(); 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger bi; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger bi2; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger bi3; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 40229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.math.BigInteger#BigInteger(int, java.util.Random) 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorILjava_util_Random() { 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // regression test for HARMONY-1047 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 45dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes new BigInteger(128, (Random) null); 46dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes fail(); 47dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes } catch (NullPointerException expected) { 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = new BigInteger(70, rand); 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi2 = new BigInteger(70, rand); 52dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("Random number is negative", bi.compareTo(BigInteger.ZERO) >= 0); 53dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("Random number is too big", bi.compareTo(two.pow(70)) < 0); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue( 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "Two random numbers in a row are the same (might not be a bug but it very likely is)", 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project !bi.equals(bi2)); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Not zero", new BigInteger(0, rand).equals(BigInteger.ZERO)); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new BigInteger(-1, (Random)null); 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException expected"); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalArgumentException e) { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // PASSED 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 68229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.math.BigInteger#BigInteger(int, int, java.util.Random) 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 707a076f07b8cc14b9bc8b9639320d28822aa57617Elliott Hughes // BIGNUM returns no Primes smaller than 16 bits. 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorIILjava_util_Random() { 72dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes BigInteger bi1 = new BigInteger(10, 5, rand); 73dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes BigInteger bi2 = new BigInteger(10, 5, rand); 74dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue(bi1 + " is negative", bi1.compareTo(BigInteger.ZERO) >= 0); 75dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue(bi1 + " is too big", bi1.compareTo(new BigInteger("1024", 10)) < 0); 76dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue(bi2 + " is negative", bi2.compareTo(BigInteger.ZERO) >= 0); 77dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue(bi2 + " is too big", bi2.compareTo(new BigInteger("1024", 10)) < 0); 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Random rand = new Random(); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger bi; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int certainty[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Integer.MIN_VALUE, Integer.MIN_VALUE + 1, -2, -1 }; 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 2; i <= 20; i++) { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int c = 0; c < certainty.length; c++) { 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = new BigInteger(i, c, rand); // Create BigInteger 86dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertEquals(i, bi.bitLength()); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new BigInteger(1, 80, (Random)null); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("ArithmeticException expected"); 93b5ccf74bdea2d417d9e4820945fe3ba1f636a0d2Elliott Hughes } catch (ArithmeticException expected) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new BigInteger(-1, (Random)null); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException expected"); 99b5ccf74bdea2d417d9e4820945fe3ba1f636a0d2Elliott Hughes } catch (IllegalArgumentException expected) { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// public void test_SpecialPrimes() { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("test_SpecialPrimes"); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// final BigInteger TWO = BigInteger.valueOf(2); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger p, q; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// for (;;) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// p = new BigInteger(1024, 23, new Random()); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// q = p.subtract(BigInteger.ONE).divide(TWO); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// if (q.isProbablePrime(20)) { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(q); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(p); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// break; 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.print("."); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// fail("isProbablePrime failed for: " + bi); 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 121229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.math.BigInteger#isProbablePrime(int) 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_isProbablePrimeI() { 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int fails = 0; 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = new BigInteger(20, 20, rand); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!bi.isProbablePrime(17)) { 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fails++; 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = new BigInteger("4", 10); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (bi.isProbablePrime(17)) { 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("isProbablePrime failed for: " + bi); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = BigInteger.valueOf(17L * 13L); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (bi.isProbablePrime(17)) { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("isProbablePrime failed for: " + bi); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (long a = 2; a < 1000; a++) { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isPrime(a)) { 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("false negative on prime number <1000", BigInteger 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .valueOf(a).isProbablePrime(5)); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (BigInteger.valueOf(a).isProbablePrime(17)) { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.out.println("isProbablePrime failed for: " + a); 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fails++; 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int a = 0; a < 1000; a++) { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = BigInteger.valueOf(rand.nextInt(1000000)).multiply( 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger.valueOf(rand.nextInt(1000000))); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (bi.isProbablePrime(17)) { 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.out.println("isProbablePrime failed for: " + bi); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fails++; 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int a = 0; a < 200; a++) { 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = new BigInteger(70, rand).multiply(new BigInteger(70, rand)); 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (bi.isProbablePrime(17)) { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.out.println("isProbablePrime failed for: " + bi); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fails++; 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Too many false positives - may indicate a problem", 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fails <= 1); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // And now some tests on real big integers: 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = new BigInteger("153890972191202256150310830154922163807316525358455215516067727076235016932726922093888770552128767458882963869421440585369743", 10); 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!bi.isProbablePrime(80)) { 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("isProbablePrime failed for: " + bi); 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi = new BigInteger("2090575416269141767246491983797422123741252476560371649798066134123893524014911825188890458270426076468664046568752890122415061377308817346303546688282957897504000216241497550243010257911214329646877810655164658470278901030511157372440751259674247310396158238588463284702737181653", 10); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!bi.isProbablePrime(80)) { 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("isProbablePrime failed for: " + bi); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int bitLength = 100; bitLength <= 600; bitLength += 100) { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger a = BigInteger.probablePrime(bitLength, rand); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger b = BigInteger.probablePrime(bitLength, rand); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger c = a.multiply(b); 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertFalse("isProbablePrime failed for product of two large primes" + 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a + " * " + b + " = " + c + 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project " (bitLength = " + bitLength + ")", 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.isProbablePrime(80) ); 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 188229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.math.BigInteger#nextProbablePrime() 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_nextProbablePrime() { 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project largePrimesProduct( 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new BigInteger("2537895984043447429238717358455377929009126353874925049325287329295635198252046158619999217453233889378619619008359011789"), 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new BigInteger("1711501451602688337873833423534849678524059393231999670806585630179374689152366029939952735718718709436427337762082614710093"), 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "4343612660706993434504106787562106084038357258130862545477481433639575850237346784798851102536616749334772541987502120552264920040629526028540204698334741815536099373917351194423681128374184971846099257056996626343051832131340568120612204287123" 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project largePrimesProduct( 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new BigInteger("4617974730611208463200675282934641082129817404749925308887287017217158545765190433369842932770197341032031682222405074564586462802072184047198214312142847809259437477387527466762251087500170588962277514858557309036550499896961735701485020851"), 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new BigInteger("4313158964405728158057980867015758419530142215799386331265837224051830838583266274443105715022196238165196727467066901495701708590167750818040112544031694506528759169669442493029999154074962566165293254671176670719518898684698255068313216294333"), 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "19918059106734861363335842730108905466210762564765297409619920041621379008685530738918145604092111306972524565803236031571858280032420140331838737621152630780261815015157696362550138161774466814661069892975003440654998880587960037013294137372709096788892473385003457361736563927256562678181177287998121131179907762285048659075843995525830945659905573174849006768920618442371027575308854641789533211132313916836205357976988977849024687805212304038260207820679964201211309384057458137851" 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ); 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static void largePrimesProduct(BigInteger a, BigInteger b, String c) { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger wp = a.multiply(b); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertFalse("isProbablePrime failed for product of two large primes" + 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a + " * " + b + " = " + c, 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project wp.isProbablePrime(80) ); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger wpMinusOne = wp.subtract(BigInteger.ONE); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger next = wpMinusOne.nextProbablePrime(); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(c); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(next); 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("nextProbablePrime returns wrong number: " + next + 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "instead of expected: " + c, 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project next.toString().equals(c) ); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 219229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.math.BigInteger#probablePrime(int, java.util.Random) 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_probablePrime() { 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int bitLength = 50; bitLength <= 1050; bitLength += 100) { 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger a = BigInteger.probablePrime(bitLength, rand); 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("isProbablePrime(probablePrime()) failed for: " + bi, 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a.isProbablePrime(80)); 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(a); 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger prime = a.nextProbablePrime(); 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.print("Next Probable Prime is "); 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(prime); 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BEGIN android-added 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// public void testModPowPerformance() { 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Random rnd = new Random(); 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// for (int i = 0; i < 10; i++) { 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger a = new BigInteger(512, rnd); 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger m = new BigInteger(1024, rnd); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger p = new BigInteger(256, rnd); 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger mp = a.modPow(p, m); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(mp); 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// shows factor 20 speed up (BIGNUM to Harmony Java): 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// public void testNextProbablePrime() { 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Random rnd = new Random(); 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// rnd.setSeed(0); 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// for (int i = 1; i <= 32; i += 1) { 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger a = new BigInteger(i, rnd); 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(a); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger prime = a.nextProbablePrime(); 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.print("Next Probable Prime is "); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(prime); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// for (int i = 1; i <= 32; i += 4) { 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger a = new BigInteger(32 * i, rnd); 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(a); 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger prime = a.nextProbablePrime(); 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.print("Next Probable Prime is "); 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(prime); 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// shows factor 20 speed up (BIGNUM to Harmony Java): 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// shows that certainty 80 is "practically aquivalent" to certainty 100 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// public void testPrimeGenPerformance() { 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Random rnd = new Random(); 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// rnd.setSeed(0); 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// for (int i = 1; i <= 32; i +=8 ) { 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BigInteger a = new BigInteger(32 * i, 80, rnd); 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println(a); 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("Now testing it again:"); 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// if (a.isProbablePrime(100)) { 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("************************ PASSED! **************************"); 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } else { 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("************************ FAILED!!! **************************"); 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("************************ FAILED!!! **************************"); 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("************************ FAILED!!! **************************"); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("************************ FAILED!!! **************************"); 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("************************ FAILED!!! **************************"); 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// System.out.println("************************ FAILED!!! **************************"); 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-added 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 291229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.math.BigInteger#add(java.math.BigInteger) 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_addLjava_math_BigInteger() { 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Incorrect sum--wanted a zillion", aZillion.add(aZillion) 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .add(aZillion.negate()).equals(aZillion)); 296dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("0+0", BigInteger.ZERO.add(BigInteger.ZERO).equals(BigInteger.ZERO)); 297dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("0+1", BigInteger.ZERO.add(BigInteger.ONE).equals(BigInteger.ONE)); 298dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("1+0", BigInteger.ONE.add(BigInteger.ZERO).equals(BigInteger.ONE)); 299dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("1+1", BigInteger.ONE.add(BigInteger.ONE).equals(two)); 300dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("0+(-1)", BigInteger.ZERO.add(minusOne).equals(minusOne)); 301dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("(-1)+0", minusOne.add(BigInteger.ZERO).equals(minusOne)); 302dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("(-1)+(-1)", minusOne.add(minusOne).equals(new BigInteger("-2", 10))); 303dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("1+(-1)", BigInteger.ONE.add(minusOne).equals(BigInteger.ZERO)); 304dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes assertTrue("(-1)+1", minusOne.add(BigInteger.ONE).equals(BigInteger.ZERO)); 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < 200; i++) { 307dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes BigInteger midbit = BigInteger.ZERO.setBit(i); 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("add fails to carry on bit " + i, midbit.add(midbit) 309dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes .equals(BigInteger.ZERO.setBit(i + 1))); 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger bi2p3 = bi2.add(bi3); 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger bi3p2 = bi3.add(bi2); 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("bi2p3=bi3p2", bi2p3.equals(bi3p2)); 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 315f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BESSER UEBERGREIFENDE TESTS MACHEN IN FORM VON STRESS TEST. 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // add large positive + small positive 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BigInteger sum = aZillion; 319dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes BigInteger increment = BigInteger.ONE; 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < 20; i++) { 321f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // add large positive + small negative 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // add large negative + small positive 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // add large negative + small negative 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testClone() { 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Regression test for HARMONY-1770 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MyBigInteger myBigInteger = new MyBigInteger("12345"); 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myBigInteger = (MyBigInteger) myBigInteger.clone(); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class MyBigInteger extends BigInteger implements Cloneable { 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public MyBigInteger(String val) { 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(val); 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object clone() { 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.clone(); 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (CloneNotSupportedException e) { 3451c422fc0ab0692e10a05af6f48c6276c4dad4beaJesse Wilson throw new AssertionError(e); // android-changed 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() { 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bi2 = new BigInteger("4576829475724387584378543764555", 16); 353dd9d07889d37fd2d8d5052b517150ca31ac9d95aElliott Hughes bi3 = new BigInteger("43987298363278574365732645872643587624387563245", 16); 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isPrime(long b) { 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (b == 2) { 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check for div by 2 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((b & 1L) == 0) { 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long maxlen = ((long) Math.sqrt(b)) + 2; 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (long x = 3; x < maxlen; x += 2) { 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (b % x == 0) { 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 373