001/*
002 * $Id$
003 */
004
005package edu.jas.arith;
006
007
008import java.util.List;
009import java.util.SortedMap;
010
011import junit.framework.Test;
012import junit.framework.TestCase;
013import junit.framework.TestSuite;
014
015
016/**
017 * PrimeInteger and PrimeList tests with JUnit.
018 * @author Heinz Kredel
019 */
020
021public class PrimeTest extends TestCase {
022
023
024    /**
025     * main.
026     */
027    public static void main(String[] args) {
028        junit.textui.TestRunner.run(suite());
029    }
030
031
032    /**
033     * Constructs a <CODE>PrimeTest</CODE> object.
034     * @param name String
035     */
036    public PrimeTest(String name) {
037        super(name);
038    }
039
040
041    /**
042     */
043    public static Test suite() {
044        TestSuite suite = new TestSuite(PrimeTest.class);
045        return suite;
046    }
047
048
049    @Override
050    protected void setUp() {
051    }
052
053
054    @Override
055    protected void tearDown() {
056    }
057
058
059    /**
060     * Test prime list.
061     */
062    public void testPrime() {
063        PrimeList primes = new PrimeList();
064        //System.out.println("primes = " + primes);
065        int i = 0;
066        //System.out.println("primes = ");
067        for (java.math.BigInteger p : primes) {
068            assertFalse("p != null", p == null);
069            //System.out.print("" + p);
070            if (i++ > 50) {
071                break;
072            }
073            //System.out.print(", ");
074        }
075        //System.out.println();
076        //System.out.println("primes = " + primes);
077        assertTrue("all primes ", primes.checkPrimes());
078    }
079
080
081    /**
082     * Test small prime list.
083     */
084    public void testSmallPrime() {
085        List<Long> sp = PrimeInteger.SMPRM; //smallPrimes(1, 500);
086        //System.out.println("sp = " + sp);
087        for (Long p : sp) {
088            java.math.BigInteger P = new java.math.BigInteger(p.toString());
089            assertTrue("isPrime: " + p, P.isProbablePrime(16));
090        }
091        PrimeList primes = new PrimeList(PrimeList.Range.small);
092        //System.out.println("primes = " + primes);
093        int i = primes.size() - 1;
094        //System.out.println("primes = ");
095        for (java.math.BigInteger p : primes) {
096            assertTrue("p.isPrime: ", PrimeInteger.isPrime(p.longValue()));
097            //System.out.print(i + " = " + p + ", ");
098            if (i-- <= 0) {
099                break;
100            }
101        }
102    }
103
104
105    /**
106     * Test low prime list.
107     */
108    public void testLowPrime() {
109        PrimeList primes = new PrimeList(PrimeList.Range.low);
110        //System.out.println("primes = " + primes);
111        int i = primes.size() - 1;
112        //System.out.println("primes = ");
113        for (java.math.BigInteger p : primes) {
114            assertTrue("p.isPrime: ", PrimeInteger.isPrime(p.longValue()));
115            //System.out.print(i + " = " + p + ", ");
116            if (i-- <= 0) {
117                break;
118            }
119        }
120    }
121
122
123    /**
124     * Test medium prime list.
125     */
126    public void testMediumPrime() {
127        PrimeList primes = new PrimeList(PrimeList.Range.medium);
128        //System.out.println("primes = " + primes);
129        int i = primes.size() - 1;
130        //System.out.println("primes = ");
131        for (java.math.BigInteger p : primes) {
132            //System.out.println(i + " = " + p + ", ");
133            assertTrue("p.isPrime: ", PrimeInteger.isPrime(p.longValue()));
134            if (i-- <= 0) {
135                break;
136            }
137        }
138    }
139
140
141    /**
142     * Test xlarge prime list.
143     */
144    public void testLargePrime() {
145        PrimeList primes = new PrimeList(PrimeList.Range.large);
146        //System.out.println("primes = " + primes);
147        int i = primes.size() - 1;
148        //System.out.println("primes = ");
149        for (java.math.BigInteger p : primes) {
150            //System.out.println(i + " = " + p + ", ");
151            long pl = p.longValue();
152            if (pl < PrimeInteger.BETA) {
153                assertTrue("p.isPrime: ", PrimeInteger.isPrime(pl));
154            } else {
155                break;
156            }
157            if (i-- <= 0) {
158                break;
159            }
160        }
161    }
162
163
164    /**
165     * Test Mersenne prime list.
166     */
167    public void testMersennePrime() {
168        PrimeList primes = new PrimeList(PrimeList.Range.mersenne);
169        //System.out.println("primes = " + primes);
170        //assertTrue("all primes ", primes.checkPrimes() );
171        int i = primes.size() - 1;
172        //System.out.println("primes = ");
173        for (java.math.BigInteger p : primes) {
174            //System.out.println(i + " = " + p + ", ");
175            long pl = p.longValue();
176            if (pl < PrimeInteger.BETA) {
177                assertTrue("p.isPrime: ", PrimeInteger.isPrime(pl));
178            } else {
179                break;
180            }
181            if (i-- <= 0) {
182                break;
183            }
184        }
185        assertTrue("all primes ", primes.checkPrimes(5));
186    }
187
188
189    /**
190     * Test factorize integer.
191     */
192    public void testFactorInteger() {
193        SortedMap<Long, Integer> ff;
194
195        ff = PrimeInteger.factors(2 * 3 * 5 * 7 * 2 * 9 * 10 * 19 * 811);
196        //System.out.println("ff = " + ff);
197        assertEquals("factors: ", ff.size(), 6);
198        for (Long p : ff.keySet()) {
199            java.math.BigInteger P = java.math.BigInteger.valueOf(p);
200            assertTrue("isPrime: " + p, P.isProbablePrime(16));
201        }
202
203        ff = PrimeInteger.factors(991 * 997 * 811 + 1);
204        //System.out.println("ff = " + ff);
205        assertEquals("factors: ", ff.size(), 3);
206        for (Long p : ff.keySet()) {
207            java.math.BigInteger P = java.math.BigInteger.valueOf(p);
208            assertTrue("isPrime: " + p, P.isProbablePrime(16));
209        }
210
211        ff = PrimeInteger.factors(PrimeList.getLongPrime(15, 135).longValue());
212        //System.out.println("ff = " + ff);
213        assertEquals("factors: ", ff.size(), 1);
214        for (Long p : ff.keySet()) {
215            java.math.BigInteger P = java.math.BigInteger.valueOf(p);
216            assertTrue("isPrime: " + p, P.isProbablePrime(16));
217        }
218
219        //ff = PrimeInteger.factors( PrimeList.getLongPrime(61, 1).longValue() );
220        //ff = PrimeInteger.factors( PrimeList.getLongPrime(60, 93).longValue() );
221        //ff = PrimeInteger.factors( PrimeList.getLongPrime(59, 55).longValue() );
222        ff = PrimeInteger.factors(PrimeList.getLongPrime(59, 0).longValue());
223        //System.out.println("m = " + PrimeList.getLongPrime(59, 0).longValue());
224        //System.out.println("ff = " + ff);
225        assertEquals("factors: ", ff.size(), 1);
226        for (Long p : ff.keySet()) {
227            java.math.BigInteger P = java.math.BigInteger.valueOf(p);
228            assertTrue("isPrime: " + p, P.isProbablePrime(32));
229        }
230        //System.out.println("SMPRM = " + PrimeInteger.SMPRM);
231    }
232
233
234    /**
235     * Test factorize large integer.
236     */
237    public void testFactorLargeInteger() {
238        SortedMap<java.math.BigInteger, Integer> ff;
239
240        long n = 2 * 3 * 5 * 7 * 2 * 9 * 10 * 19 * 811;
241        java.math.BigInteger N = java.math.BigInteger.valueOf(n);
242        ff = PrimeInteger.factors(N);
243        //System.out.println("ff = " + ff);
244        assertEquals("factors: ", ff.size(), 6);
245        for (java.math.BigInteger p : ff.keySet()) {
246            assertTrue("isPrime: " + p, p.isProbablePrime(16));
247        }
248
249        //N = N.multiply( PrimeList.getLongPrime(59, 55) );
250        N = N.multiply(PrimeList.getLongPrime(59, 19));
251        N = N.multiply(PrimeList.getLongPrime(61, 1));
252        //System.out.println("N = " + N);
253        ff = PrimeInteger.factors(N); // was not correct
254        //System.out.println("ff = " + ff);
255        for (java.math.BigInteger p : ff.keySet()) {
256            assertTrue("isPrime: " + p, p.isProbablePrime(32));
257        }
258
259        N = new java.math.BigInteger("1152921504606846883");
260        //System.out.println("N = " + N);
261        ff = PrimeInteger.factors(N);
262        //System.out.println("ff = " + ff);
263        assertTrue("isPrime: " + ff, ff.size() == 1);
264    }
265
266
267    /**
268     * Test random integers.
269     */
270    public void testRandom() {
271        SortedMap<Long, Integer> ff;
272        BigInteger rnd = BigInteger.ONE;
273        //System.out.println("beta = " + PrimeInteger.BETA);
274        //System.out.println("SMPRM = " + PrimeInteger.SMPRM);
275        for (int i = 0; i < 5; i++) {
276            BigInteger M = rnd.random(60).abs();
277            //System.out.println("M = " + M);
278            long m = Math.abs(M.getVal().longValue());
279            //System.out.println("M = " + M + ", m = " + m);
280            if (m < PrimeInteger.BETA) {
281                ff = PrimeInteger.factors(m);
282                //System.out.println("ff = " + ff);
283                assertTrue("isFactorization: " + m + ", ff = " + ff,
284                                PrimeInteger.isPrimeFactorization(m, ff));
285            }
286        }
287    }
288
289
290    /**
291     * Test random integers to the power of 3.
292     */
293    public void testRandom3() {
294        SortedMap<Long, Integer> ff;
295        BigInteger rnd = BigInteger.ONE;
296        for (int i = 0; i < 5; i++) {
297            BigInteger M = rnd.random(20).abs();
298            M = M.power(3);
299            //System.out.println("M = " + M);
300            long m = Math.abs(M.getVal().longValue());
301            //System.out.println("M = " + M + ", m = " + m);
302            if (m < PrimeInteger.BETA) {
303                ff = PrimeInteger.factors(m);
304                //System.out.println("ff = " + ff);
305                assertTrue("isFactorization: " + m + ", ff = " + ff,
306                                PrimeInteger.isPrimeFactorization(m, ff));
307                for (Integer e : ff.values()) {
308                    assertTrue("e >= 3: " + e + ", ff = " + ff, e >= 3);
309                }
310            }
311        }
312    }
313
314
315    /**
316     * Test random integers, compare to Pollard.
317     */
318    public void ytestRandomCompare() {
319        SortedMap<Long, Integer> ff, ffp;
320        BigInteger rnd = BigInteger.ONE;
321        //System.out.println("beta = " + PrimeInteger.BETA);
322
323        for (int i = 0; i < 5; i++) {
324            BigInteger M = rnd.random(60).abs();
325            //System.out.println("M = " + M);
326            long m = Math.abs(M.getVal().longValue());
327            //System.out.println("M = " + M + ", m = " + m);
328            if (m < PrimeInteger.BETA) {
329                long t = System.currentTimeMillis();
330                ff = PrimeInteger.factors(m);
331                t = System.currentTimeMillis() - t;
332                System.out.println("ff = " + ff);
333                assertTrue("isFactorization: " + m + ", ff = " + ff, PrimeInteger.isFactorization(m, ff));
334                long s = System.currentTimeMillis();
335                ffp = PrimeInteger.factorsPollard(m);
336                s = System.currentTimeMillis() - s;
337                System.out.println("time: t = " + t + ", s = " + s);
338                assertEquals("isFactorization: " + m, ff, ffp);
339            }
340        }
341
342        for (int i = 0; i < 5; i++) {
343            BigInteger M = rnd.random(20).abs();
344            M = M.power(3);
345            //System.out.println("M = " + M);
346            long m = Math.abs(M.getVal().longValue());
347            //System.out.println("M = " + M + ", m = " + m);
348            if (m < PrimeInteger.BETA) {
349                long t = System.currentTimeMillis();
350                ff = PrimeInteger.factors(m);
351                t = System.currentTimeMillis() - t;
352                System.out.println("ff = " + ff);
353                assertTrue("isFactorization: " + m + ", ff = " + ff, PrimeInteger.isFactorization(m, ff));
354                long s = System.currentTimeMillis();
355                ffp = PrimeInteger.factorsPollard(m);
356                s = System.currentTimeMillis() - s;
357                System.out.println("time: t = " + t + ", s = " + s);
358                assertEquals("isFactorization: " + m, ff, ffp);
359            }
360        }
361    }
362
363}