import java.util.*;

public class Prime
{

        // test if n is a prime
        public static boolean isPrime(int n) throws IllegalArgumentException
        {
                if (n < 2)
                        throw new IllegalArgumentException();

                List primes = new ArrayList();
                primes.add(new Integer(2));

                if (n == 2)
                        return true;

                // test if n is even
                if (n % 2 == 0)
                        return false;

                // generate all primes up to n and add to primes list
                for (int i = 3; i <= n; i++)
                {
                        // test if i is a prime
                        int prime = 2;
                        double sqrtI = Math.sqrt(i);
                        int j = 0;
                        while (prime <= sqrtI)
                        {
                                if (i % prime == 0) // i is not a prime
                                        break;
                                j++;
                                prime = ((Integer)(primes.get(j))).intValue();
                        }

                        if (prime > sqrtI || j >= primes.size()) // i is a prime
                        {
                                // test if n is prime
                                if (n == i)
                                        return true;
                                else if (n % i == 0)
                                        return false;
                                else
                                        primes.add(new Integer(i));
                        }
                }

                return false;
        }

        // test if n is composite
        public static boolean isComposite(int n) throws IllegalArgumentException
        {
                if (n < 2)
                        throw new IllegalArgumentException();

                return !isPrime(n);
        }

        // get the number of primes <= n
        public static int getPrimeCount(int n)
        {
                List primes = getPrimes(n);
                return primes.size();
        }

        // get a list of primes <= n
        public static List getPrimes(int n)
        {
                List primes = new ArrayList();

                if (n < 2)
                        return primes;

                primes.add(new Integer(2));

                if (n == 2)
                        return primes;

                // generate all primes up to n and add to primes list
                for (int i = 3; i <= n; i++)
                {
                        // test if i is a prime
                        int prime = 2;
                        double sqrtI = Math.sqrt(i);
                        int j = 0;
                        while (prime <= sqrtI)
                        {
                                if (i % prime == 0) // i is not a prime
                                        break;
                                j++;
                                prime = ((Integer)(primes.get(j))).intValue();
                        }

                        if (prime > sqrtI || j >= primes.size()) // i is a prime
                                primes.add(new Integer(i));
                }

                return primes;
        }

        // get the nth prime
        public static int getPrime(int n) throws IllegalArgumentException
        {
                if (n <= 0)
                        throw new IllegalArgumentException();

                if (n == 1)
                        return 2;

                List primes = new ArrayList();
                primes.add(new Integer(2));

                // generate all primes up to nth prime and add to primes list
                int i = 3;
                while (primes.size() < n)
                {
                        // test if i is a prime
                        int prime = 2;
                        double sqrtI = Math.sqrt(i);
                        int j = 0;
                        while (prime <= sqrtI)
                        {
                                if (i % prime == 0) // i is not a prime
                                        break;
                                j++;
                                prime = ((Integer)(primes.get(j))).intValue();
                        }

                        if (prime > sqrtI || j >= primes.size()) // i is a prime
                                primes.add(new Integer(i));
                        i++;
                }

                return ((Integer)(primes.get(primes.size()-1))).intValue();
        }

        public static void main(String[] args)
        {
                System.out.println/(getPrimes(1000));
                if (Prime.isPrime(1000000000))
                        System.out.println/("1000000000 is a prime.");
                else
                        System.out.println/("1000000000 is composite.");
                System.out.println/("There are "+Prime.getPrimeCount(10)+" primes <= 10");
                System.out.println/("There are "+Prime.getPrimeCount(100)+" primes <= 100");
                System.out.println/("There are "+Prime.getPrimeCount(1000)+" primes <= 1000");
                System.out.println/("The 10th prime is "+Prime.getPrime(10));
                System.out.println/("The 100th prime is "+Prime.getPrime(100));
                System.out.println/("The 1000th prime is "+Prime.getPrime(1000));
        }

}