001 package calhoun.util;
002
003
004 public class PrimeUtil {
005 /** The first prime number */
006 static int INITIAL_SIZE = 1000;
007
008 static long maxPrime = -1;
009 public static int[] primes;
010
011 /** Returns an array of primes that includes all primes up to at least N. May contain more. */
012 public static int[] primesToAtLeastN(int number) {
013 if(maxPrime < number) {
014 primes = primesLessThan(number);
015 maxPrime = number;
016 }
017 return primes;
018 }
019
020 /*
021 * Compute prime numbers, after Knuth, Vol 1, Sec 1.3.2, Alg. "P".
022 * Note that there may be more efficient algorithms for
023 * finding primes.
024 */
025 private static int[] primesLessThan(long stop) {
026 int[] prime = new int[INITIAL_SIZE];
027
028 prime[0] = 1; // P1 (ignore prime[0])
029 prime[1] = 2; // P1 (ignore prime[0])
030 int n = 3; // odd candidates
031 int j = 1; // numberFound
032
033 boolean isPrime = true; // for 3
034 boolean doMore = true;
035 do {
036 if (isPrime) {
037 if (j == INITIAL_SIZE - 1) {
038 // Grow array dynamically if needed
039 int[] np = new int[INITIAL_SIZE * 2];
040 System.arraycopy(prime, 0, np, 0, INITIAL_SIZE);
041 INITIAL_SIZE *= 2;
042 prime = np;
043 }
044 prime[++j] = n; // P2
045 isPrime = false;
046 if(n > stop)
047 doMore = false;
048 }
049 n += 2; // P4
050
051 for (int k = 2; k <= j && k < INITIAL_SIZE; k++) { // P5, P6, P8
052 long q = n / prime[k];
053 long r = n % prime[k];
054 if (r == 0) {
055 break;
056 }
057 if (q <= prime[k]) { // P7
058 isPrime = true;
059 break;
060 }
061 }
062 } while (doMore); // P3
063 return prime;
064 }
065 }