Guest User

Untitled

a guest
Aug 30th, 2022
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.02 KB | None | 0 0
  1. package literatePrimes;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. public class PrimeGenerator {
  6.   private static int[] primes;
  7.   private static ArrayList<Integer> multiplesOfPrimeFactors;
  8.  
  9.   protected static int[] generate(int n) {
  10.     primes = new int[n];
  11.     multiplesOfPrimeFactors = new ArrayList<Integer>();
  12.     set2AsFirstPrime();
  13.     checkOddNumbersForSubsequentPrimes();
  14.     return primes;
  15.   }
  16.  
  17.   private static void set2AsFirstPrime() {
  18.     primes[0] = 2;
  19.     multiplesOfPrimeFactors.add(2);
  20.   }
  21.  
  22.   private static void checkOddNumbersForSubsequentPrimes() {
  23.     int primeIndex = 1;
  24.     for (int candidate = 3;
  25.          primeIndex < primes.length;
  26.          candidate += 2) {
  27.       if (isPrime(candidate))
  28.         primes[primeIndex++] = candidate;
  29.     }
  30.   }
  31.  
  32.   private static boolean isPrime(int candidate) {
  33.     if (isLeastRelevantMultipleOfNextLargerPrimeFactor(candidate)) {
  34.       multiplesOfPrimeFactors.add(candidate);
  35.       return false;
  36.     }
  37.     return isNotMultipleOfAnyPreviousPrimeFactor(candidate);
  38.   }
  39.  
  40.   private static boolean
  41.   isLeastRelevantMultipleOfNextLargerPrimeFactor(int candidate) {
  42.     int nextLargerPrimeFactor = primes[multiplesOfPrimeFactors.size()];
  43.     int leastRelevantMultiple = nextLargerPrimeFactor * nextLargerPrimeFactor;
  44.     return candidate == leastRelevantMultiple;
  45.   }
  46.  
  47.   private static boolean
  48.   isNotMultipleOfAnyPreviousPrimeFactor(int candidate) {
  49.     for (int n = 1; n < multiplesOfPrimeFactors.size(); n++) {
  50.       if (isMultipleOfNthPrimeFactor(candidate, n))
  51.         return false;
  52.     }
  53.     return true;
  54.   }
  55.  
  56.   private static boolean
  57.   isMultipleOfNthPrimeFactor(int candidate, int n) {
  58.    return
  59.      candidate == smallestOddNthMultipleNotLessThanCandidate(candidate, n);
  60.   }
  61.  
  62.   private static int
  63.   smallestOddNthMultipleNotLessThanCandidate(int candidate, int n) {
  64.     int multiple = multiplesOfPrimeFactors.get(n);
  65.     while (multiple < candidate)
  66.       multiple += 2 * primes[n];
  67.     multiplesOfPrimeFactors.set(n, multiple);
  68.     return multiple;
  69.   }
  70. }
Add Comment
Please, Sign In to add comment