
// Sieve.java
// Andrew Davison, ad@coe.psu.ac.th, April 2023

/* Use JML's Prime Sieve.

  https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

   Usage:
     > compile Sieve.java
     > run Sieve <num. primes>
   e.g.
     > run Sieve 100

*/
import java.util.*;

import de.tilman_neumann.jml.primes.exact.SimpleSieve;
import de.tilman_neumann.jml.primes.exact.CollectingCallback;

import de.tilman_neumann.jml.primes.bounds.NthPrimeUpperBounds;


public class Sieve
{

  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.out.println("Usage: run Sieve <num. primes>");
      return;
    }
    int n = Math.abs(Nut.parseInt(args[0]));

	CollectingCallback ccb = new CollectingCallback(n);
	SimpleSieve ss = new SimpleSieve(ccb);
	int upperBound = (int) NthPrimeUpperBounds.combinedUpperBound(n);
	ss.sieve(upperBound);

	System.out.println("No. of Primes found: " + ccb.count);
	System.out.println("Largest Prime: " + ccb.array[ccb.count-1]);
	System.out.println("Primes: " + Arrays.toString(ccb.array));
  } /* main */


}  // end of Sieve class
