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