class Main { static int nTests = 1; static Timer testFindPrimes(Solver s, int maxNum) { Timer[] timers = new Timer[nTests]; for (int i = 0; i < nTests; ++i) { Timer t = timers[i] = new Timer(); Sieve sieve = new Sieve(maxNum); t.start(); s.solve(sieve); t.end(); } return Timer.median(timers); } static Timer testFactor(Solver s, long maxNum, Sieve sieve) { Timer[] timers = new Timer[nTests]; for (int i = 0; i < nTests; ++i) { Timer t = timers[i] = new Timer(); t.start(); long n = maxNum * maxNum; for (long j = n; j >= n - 100; --j) { long[] factors = s.factor(sieve, j); if (j > (n - 5) || j < (n - 95)) { if (j == n - 96) System.out.println("............."); System.out.println( Util.factors(j, factors)); } } t.end(); } return Timer.median(timers); } public static void main(String[] args) { if (args.length == 0) { System.out.println("Usage: java Main "); System.exit(1); } Sequential sseq = new Sequential(); Parallel spar = new Parallel(); boolean findPrimes = true; boolean factor = true; int maxNum = Integer.parseInt(args[0]); System.out.println("Max prime: "+maxNum); if (findPrimes) { System.out.println("\nFinding primes sequentially..."); Timer seq = testFindPrimes(sseq, maxNum); System.out.println("Sequential: "+seq.prettyTime()); System.out.println("\nFinding primes in parallel..."); Timer par = testFindPrimes(spar, maxNum); System.out.println("Parallel: "+par.prettySpeedup(seq)); } if (factor) { // We need a solved sieve Sieve sieve = new Sieve(maxNum); spar.solve(sieve); sieve.getPrimes(); System.out.println("\nFactoring sequentially..."); Timer seq = testFactor(sseq, maxNum, sieve); Timer seqAvg = new Timer(seq.time / 100); System.out.println( "Sequential: "+seq.prettyTime()+ " ("+seqAvg.prettyTime()+" per factor)"); System.out.println("\nFactoring in parallel..."); Timer par = testFactor(spar, maxNum, sieve); Timer parAvg = new Timer(par.time / 100); System.out.println( "Parallel: "+par.prettySpeedup(seq)+ " ("+parAvg.prettyTime()+" per factor)"); } spar.stopThreads(); } }