import java.util.ArrayList; import java.util.BitSet; import java.util.List; public final class ConsecutivePrimes { public static void main(String[] aArgs) { final int limit = 1_000_000; List primes = listPrimeNumbers(limit); List asc = new ArrayList(); List desc = new ArrayList(); List> maxAsc = new ArrayList>(); List> maxDesc = new ArrayList>(); int maxAscSize = 0; int maxDescSize = 0; for ( int prime : primes ) { final int ascSize = asc.size(); if ( ascSize > 1 && prime - asc.get(ascSize - 1) <= asc.get(ascSize - 1) - asc.get(ascSize - 2) ) { asc = new ArrayList(asc.subList(ascSize - 1, asc.size())); } asc.add(prime); if ( asc.size() >= maxAscSize ) { if ( asc.size() > maxAscSize ) { maxAscSize = asc.size(); maxAsc.clear(); } maxAsc.add( new ArrayList(asc) ); } final int descSize = desc.size(); if ( descSize > 1 && prime - desc.get(descSize - 1) >= desc.get(descSize - 1) - desc.get(descSize - 2) ) { desc = new ArrayList(desc.subList(descSize - 1, desc.size())); } desc.add(prime); if ( desc.size() >= maxDescSize ) { if ( desc.size() > maxDescSize ) { maxDescSize = desc.size(); maxDesc.clear(); } maxDesc.add( new ArrayList(desc) ); } } System.out.println("Longest run(s) of ascending prime gaps up to " + limit + ":"); for ( List list : maxAsc ) { displayResult(list); } System.out.println(); System.out.println("Longest run(s) of descending prime gaps up to " + limit + ":"); for( List list : maxDesc ) { displayResult(list); } } private static List listPrimeNumbers(int aLimit) { BitSet sieve = new BitSet(aLimit + 1); sieve.set(2, aLimit + 1); for ( int i = 2; i <= Math.sqrt(aLimit); i = sieve.nextSetBit(i + 1) ) { for ( int j = i * i; j <= aLimit; j = j + i ) { sieve.clear(j); } } List result = new ArrayList(sieve.cardinality()); for ( int i = 2; i >= 0; i = sieve.nextSetBit(i + 1) ) { result.add(i); } return result; } private static void displayResult(List aList) { for ( int i = 0; i < aList.size(); i++ ) { if ( i > 0 ) { System.out.print(" (" + ( aList.get(i) - aList.get(i - 1) ) + ") "); } System.out.print(aList.get(i)); } System.out.println(); } }