105 lines
3.2 KiB
Java
105 lines
3.2 KiB
Java
public class StrongAndWeakPrimes {
|
|
|
|
private static int MAX = 10_000_000 + 1000;
|
|
private static boolean[] primes = new boolean[MAX];
|
|
|
|
public static void main(String[] args) {
|
|
sieve();
|
|
System.out.println("First 36 strong primes:");
|
|
displayStrongPrimes(36);
|
|
for ( int n : new int[] {1_000_000, 10_000_000}) {
|
|
System.out.printf("Number of strong primes below %,d = %,d%n", n, strongPrimesBelow(n));
|
|
}
|
|
System.out.println("First 37 weak primes:");
|
|
displayWeakPrimes(37);
|
|
for ( int n : new int[] {1_000_000, 10_000_000}) {
|
|
System.out.printf("Number of weak primes below %,d = %,d%n", n, weakPrimesBelow(n));
|
|
}
|
|
}
|
|
|
|
private static int weakPrimesBelow(int maxPrime) {
|
|
int priorPrime = 2;
|
|
int currentPrime = 3;
|
|
int count = 0;
|
|
while ( currentPrime < maxPrime ) {
|
|
int nextPrime = getNextPrime(currentPrime);
|
|
if ( currentPrime * 2 < priorPrime + nextPrime ) {
|
|
count++;
|
|
}
|
|
priorPrime = currentPrime;
|
|
currentPrime = nextPrime;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
private static void displayWeakPrimes(int maxCount) {
|
|
int priorPrime = 2;
|
|
int currentPrime = 3;
|
|
int count = 0;
|
|
while ( count < maxCount ) {
|
|
int nextPrime = getNextPrime(currentPrime);
|
|
if ( currentPrime * 2 < priorPrime + nextPrime) {
|
|
count++;
|
|
System.out.printf("%d ", currentPrime);
|
|
}
|
|
priorPrime = currentPrime;
|
|
currentPrime = nextPrime;
|
|
}
|
|
System.out.println();
|
|
}
|
|
|
|
private static int getNextPrime(int currentPrime) {
|
|
int nextPrime = currentPrime + 2;
|
|
while ( ! primes[nextPrime] ) {
|
|
nextPrime += 2;
|
|
}
|
|
return nextPrime;
|
|
}
|
|
|
|
private static int strongPrimesBelow(int maxPrime) {
|
|
int priorPrime = 2;
|
|
int currentPrime = 3;
|
|
int count = 0;
|
|
while ( currentPrime < maxPrime ) {
|
|
int nextPrime = getNextPrime(currentPrime);
|
|
if ( currentPrime * 2 > priorPrime + nextPrime ) {
|
|
count++;
|
|
}
|
|
priorPrime = currentPrime;
|
|
currentPrime = nextPrime;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
private static void displayStrongPrimes(int maxCount) {
|
|
int priorPrime = 2;
|
|
int currentPrime = 3;
|
|
int count = 0;
|
|
while ( count < maxCount ) {
|
|
int nextPrime = getNextPrime(currentPrime);
|
|
if ( currentPrime * 2 > priorPrime + nextPrime) {
|
|
count++;
|
|
System.out.printf("%d ", currentPrime);
|
|
}
|
|
priorPrime = currentPrime;
|
|
currentPrime = nextPrime;
|
|
}
|
|
System.out.println();
|
|
}
|
|
|
|
private static final void sieve() {
|
|
// primes
|
|
for ( int i = 2 ; i < MAX ; i++ ) {
|
|
primes[i] = true;
|
|
}
|
|
for ( int i = 2 ; i < MAX ; i++ ) {
|
|
if ( primes[i] ) {
|
|
for ( int j = 2*i ; j < MAX ; j += i ) {
|
|
primes[j] = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|