import java.security.InvalidAlgorithmParameterException; public class Eratosthene2 { private static boolean[] _premiers; private static int[] _resultats; private static void valideEntiersJusqua( int valeurMax ) { _premiers = new boolean[valeurMax + 1]; _premiers[0] = _premiers[1] = false; for (int i = 2; i < _premiers.length; i++) { _premiers[i] = true; } } private static int determineLimiteIteration() { return (int)Math.sqrt(_premiers.length); } private static boolean estPremier( int nombre ) { return _premiers[nombre]; } private static void elimineMultiplesDe( int nombre ) { for (int i = 2 * nombre; i < _premiers.length; i += nombre) { _premiers[i] = false; } } private static void elimineMultiplesDesNombresPremiers( ) { final int limite = determineLimiteIteration(); for (int i = 2; i < limite + 1; i++) { if (estPremier(i)) { elimineMultiplesDe(i); } } } private static int nombrePremiersNonElimines() { int compteur = 0; for (int i = 0; i < _premiers.length; i++) { if (estPremier(i)) { compteur++; } } return compteur; } private static void construitResultatAvecNonElimines( ) { _resultats = new int[nombrePremiersNonElimines()]; for (int i = 0, j = 0; i < _premiers.length; i++) { if (estPremier(i)) { _resultats[j++] = i; } } } public static int[] genereNombresPremiers( int valeurMax ) throws InvalidAlgorithmParameterException { if (valeurMax <= 0) { throw new InvalidAlgorithmParameterException (); } else if (valeurMax == 1) { return new int [0]; } else { valideEntiersJusqua(valeurMax); elimineMultiplesDesNombresPremiers(); construitResultatAvecNonElimines(); return _resultats; } } public static void main( String[] args ) { try { int [] nombres = Eratosthene2.genereNombresPremiers(100); for (int i = 0 ; i < nombres.length; i++) { System.out.print(nombres[i] + ", "); } System.out.print(""); } catch (InvalidAlgorithmParameterException e) { } } }