Primes
Create a class PrimeNumbers
. It should have:
- an
boolean isPrime(int n)
function to determine if a number is prime - a
int get(int k)
function to return the k-th prime, starting withget(0)
returning2
.
You can make these (and everything else inside the PrimeNumbers
class) static, but that makes it complicated to initialize the prime
list in phase two, so I decided not to do that.
The class looks like this:
public class PrimeNumbers {
public boolean isPrime(int n);
public int get(int index); // prime#0 is 2
}
Usage:
PrimeNumbers pnums = new PrimeNumbers();
System.out.println(pnums.isPrime(17));
System.out.println(pnums.isPrime(21));
Phase One: Basic Interface
-
Just use an array to hold a fixed number of primes at the start, and make a
get
method that just returns a value from that array.private static int[] primes = {2,3,5,7,11,13,17,19,23,27};
-
Review the discussion from in class and write an efficient
isPrime
method that checks only prime numbers up to the square root of the number being tested. -
Test your
isPrime
method using JUnit testing.
Phase Two: Improvements
We will see the benefit of “information hiding” when we change our code to compute more prime numbers when they are needed. We are going to change the fixed-length list of primes into an ArrayList that grows automatically, and then change the get method to automatically find new primes as needed.
-
Make an
ArrayList<Integer>
instance variable to hold the prime numbers. Put2
in it initially. (What part of the class should do this?) -
Write a
public int nextPrime()
method that finds the next prime number after the last one in the list, and adds it to the list. (Why should this method actually be private?) -
Test the
nextPrime()
method using JUnit. -
Modify the
get(int index)
method so that it will generate more primes automatically if asked for a prime number index greater than or equal to the size of the list.
Phase Three: Useful
Write ArrayList<Integer> primeFactors (long n)
to produce a list of
all of the prime factors (repeated as needed, so {2,2,2} for 8).
Phase 3: Use It
- Find the 10,001st prime number.
- Find the largest prime factor of 88,762,035,289L.
- How about 4,395,275,946,425,798,569L?