import java.util.*;
public class primes {
/**
* Prints a LinkedList filled with prime numbers (or any int).
* Uses the java 5 style "for (type name : LinkedList)" for loop.
*
* @param primes An int LinkedList of any length computable.
*/
public static void printPrimes (LinkedList primes) {
System.out.print("The first " + primes.size() + " primes are:");
for (int prime : primes) {
System.out.print(" " + prime + " ");
}
System.out.println();
}
/**
* Computes prime numbers into an LinkedList.
* Uses extendPrimes if the length of the LinkedList is smaller
* than quantity.
*
* @param quantity Natural number of prime numbers to compute.
* @return A LinkedList containing prime numbers.
*/
public static LinkedList findPrimes (int quantity){
LinkedList primes = new LinkedList();
// set first prime number
primes = extendPrimes (primes, quantity);
return primes;
}
/**
* Computes targetNumber prime numbers. Extends the given LinkedList if needed.
*
* @param primes A LinkedList filled with prime numbers (or to be extended and filled).
* @param targetNumber Number of primes that should be in the LinkedList that is returned.
* @return LinkedList of length targetNumber filled with primes
*/
private static LinkedList extendPrimes (LinkedList primes, int targetNumber) {
int NumberFound = 0;
// set the first two prime numbers
if (primes.size() < 2) {
if (targetNumber >= 1) {
primes.add(2);
NumberFound++;
}
if (targetNumber >= 2) {
primes.add(3);
NumberFound++;
}
}
// candidate for testing
int candidate = primes.getLast() + 2;
boolean isprime = true;
while (NumberFound < targetNumber) {
isprime = true;
for (int knownp : primes) {
if (candidate % knownp == 0) {
isprime = false;
break;
}
}
if (isprime) {
primes.add(candidate);
NumberFound++;
}
candidate = candidate + 2;
}
return primes;
}
/**
* Prints pairs of prime numbers which follow the following
* condition: abs(p - p') == 2. Begin with the smallest.
*
* @param primes
* A LinkedList filled with prime numbers.
* @param number
* Natural number of primeTwins to be found and printed.
*/
public static void printPrimeTwins (LinkedList primes, int number) {
System.out.print("The first " + number + " primetwins are:");
int foundNumber = 0;
int i = 0;
int tmpPrime1;
int tmpPrime2 = 2;
while (foundNumber < number) {
if (i + 1 >= primes.size()) {
primes = extendPrimes(primes, number + 2);
}
tmpPrime1 = tmpPrime2;
tmpPrime2 = primes.get(i + 1);
if (Math.abs(tmpPrime1 - tmpPrime2) == 2) {
System.out.print(" (" + tmpPrime1 + "," + tmpPrime2 + ") ");
foundNumber++;
}
i++;
}
System.out.println();
}
/**
* Find smallest prime number whose successor is at least bigger.
*
* @param primes A LinkedList filled with prime numbers.
* @param delta Difference between the two prime numbers.
* @return prime number p where nextp - p > delta
*/
public static void printDeltaPrime (LinkedList primes, int delta) {
int i = 2;
int tmpPrime1 = 2;
int tmpPrime2 = 3;
System.out.println("Searching for succeding primes with delta > " + delta);
while ((tmpPrime2 - tmpPrime1) <= delta) {
if (i >= primes.size() - 1) {
extendPrimes(primes, delta + 2);
}
tmpPrime1 = tmpPrime2;
tmpPrime2 = primes.get(i);
if (i % 10000 == 0) {
System.out.println (" testing prime numbers > " + i +"...");
}
i++;
}
System.out.println(" Lowest prime and it's succeeding prime are " +
tmpPrime1 + " and " + tmpPrime2 +", ");
System.out.println(" delta is " + (tmpPrime2 - tmpPrime1));
}
/**
* Used to let the class be a program and run.
*
* @param args If we wanted to pass arguments to main, we would need this.
*/
public static void main(String[] args) {
final int primesQuantity = 20;
final int primeTwinsQuantity = 50;
final int primeDelta = 50;
LinkedList primes = new LinkedList();
primes = findPrimes (primesQuantity);
printPrimes (primes);
System.out.println("");
printPrimeTwins (primes, primeTwinsQuantity);
System.out.println("");
printDeltaPrime (primes, primeDelta);
}
}