Partage
  • Partager sur Facebook
  • Partager sur Twitter

[java] Calcul de nombres premiers

    3 décembre 2006 à 16:56:54

    Je voudrais avoir votre avis sur ce programme : il calcule les nombres premiers entre 0 et un nombre choisit par l'utilisateur selon le crible d'Eratosthène.
    Le temps de calcul est en log(n) d'après mes observations :p , je trouve que c'est plutôt pas mal...
    J'aimerais donc votre avis... et des idées pour l'optimiser encore.
    Par contre à partir d'un milliard, j'obtiens une erreur : OutOfMemory, pourtant, les types int sont sensés aller jusqu'à 2 milliars normalement...

    La classe Clavier permet de lire une donnée saisie au clavier et la classe Fichier permet d'ecrire sur le disque.



    import java.io.*;

    public class Prime {


            public static void main(String[] args) throws IOException{

                    int nbr=utils.Clavier.lireInt("Chercher jusqu'à ?");
                    String nomFichier=utils.Clavier.lireString("Enregistrer sous ?");
                    if(nomFichier.contentEquals("")){
                            nomFichier="Premiers-"+nbr+".txt";
                    }

                    double debut=System.currentTimeMillis();
                   
                    // Initialisation du tableau :
                    int[] tab=new int[nbr];

                    for(int i=0;i<tab.length;i++){
                            tab[i]=i;
                    }

                    tab[1]=0;

                    int dernierpremier=1;

                    // Fin des initialisations.

                    // Boucle principale

                    while(true){
                           
                            // Recherche du dernier premier :
                            if(dernierpremier==dernierpremier(tab,dernierpremier)){
                                    break;
                            }
                            else{
                                    dernierpremier=dernierpremier(tab,dernierpremier);
                            }

                            if(dernierpremier==-1){
                                    break;
                            }

                            // On enleve les multiples :
                            tab=enlevermultiples(tab,dernierpremier);
                    }

                    // Enregistrement du resultat :
                    enregistrer(tab,nomFichier);
                   
                    // Temps de calcul :
                    double duree=System.currentTimeMillis()-debut;
                   
                    System.out.println("Terminé - "+duree+" ms");
                    System.out.println("Enregistré sous : "+nomFichier);
            }

            public static int dernierpremier(int[] tab,int anciendernierpremier){
                    for(int i=anciendernierpremier+1;i<tab.length;i++){
                            if(tab[i]!=0){
                                    return tab[i];
                            }
                    }
                    return -1;
            }

            public static int[] enlevermultiples(int[] tab,int dernierpremier){
                    int[] result=tab;

                    for(int i=2*dernierpremier;i<=tab.length-1;i+=dernierpremier){
                            result[i]=0;
                    }

                    return result;
            }
           
            public static void enregistrer(int[] tab,String nomFichier) throws IOException{
                   
                    // Ouverture du fichier
                    utils.Fichier f1=new utils.Fichier();
                    f1.ouvrir(nomFichier,"w");
                   
                    // Ecriture des nombres
                    for(int i=0;i<tab.length;i++){
                            if(tab[i]!=0){
                                    f1.ecrire(""+tab[i]);
                            }
                    }
                   
                    // Fermeture du fichier, ecriture terminee
                    f1.fermer();   
            }
    }

    • Partager sur Facebook
    • Partager sur Twitter
      3 décembre 2006 à 22:49:29

      tu as une outofmemory car tu initialise un tableau de un milliard de int !!!!!!!!!!!!!!!!!!!!!!!!!!!!
      soit quelques Gigaoctets de RAM...
      • Partager sur Facebook
      • Partager sur Twitter
        4 décembre 2006 à 0:33:18

        Ça viens juste de ça ? Dans ce cas, je part acheter quelques barrettes !!!
        • Partager sur Facebook
        • Partager sur Twitter
          4 décembre 2006 à 12:50:34

          il faut voir la configuration de la machine virtuelle également, je ne sais pas sous quel systeme tu es mais il faut l'autoriser à dépasser une quantité de mémoire utilisable.

          PS : tu souhaite vraiment utiliser cette méthode du crible pour trouver es nombres premiers ?
          • Partager sur Facebook
          • Partager sur Twitter
            4 décembre 2006 à 18:43:43

            Ok, je vais chercher à modifier les paramètres de la VM.
            Je suis sous Linux (Ubuntu).
            Cette méthode pour trouver tous les nombres premiers est la plus rapide que je connaisse : le temps de calcul est proportionnel au log du nombre, avec un algo classique (test de toutes les divisions), le temps est proportionnel à n² !!!
            En effet, après calcul, un tableu de 1 milliards de int doit prendre 1 milliard * 4 octets= 4Go.
            PS: Pour trouver tous les nombres premiers de 0 à 100 millions, il ne lui faut que 1min et 20s sur mon PC !!!
            • Partager sur Facebook
            • Partager sur Twitter
              4 décembre 2006 à 18:47:47

              Tu peux diviser ton nombre de requète par deux.. En ne cherchant pas à calculer les multiples de deux...
              • Partager sur Facebook
              • Partager sur Twitter

              [java] Calcul de nombres premiers

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown