Optimisation d’un crible d’Erathostene en C

Grifix - 17 oct. 2024 à 18:32
 PierrotLeFou - 18 oct. 2024 à 01:41

Bonjour,

J’aimerais optimiser mon code svp?

Avez vous une idée,  merci!

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>

int main()
 { 
     int val; 
printf ( "\n (Programme Grifix  programme de recherche des Nombres premiers optimisé avec amelioration gestion memoire sur des bits) \n Insérez la valeur sup de vos nombres : " ) ; 
scanf("%d", &val);
unsigned char *Tab = (unsigned char *)malloc((val + 7) / 8); // On alloue le nombre de bits nécessaires
    if (Tab == NULL)
    {
        printf("Erreur d'allocation de mémoire\n");
    }
                         int X= 3  ;
                         int compteur=1;
                         int nombre_de_premiers=0;
                         time_t debut = time(NULL);
                         while ( compteur>0)
                           {
                              for (int n =0 ;  X*(X+2*n)< val ; n++)
                               {
                                 if (!(Tab[X / 8] & (1 << (X % 8))))
                                {                         
                                      Tab[X*(X +2*n) / 8] |=(1 << (X*(X +2*n) % 8));
                                     compteur = n ;
                                }
                       else   
                                {            
                                      //      printf("\n saut pour X= %d", X);  
                                            goto suite;  
                                 }                                         
                              }           
 

suite:                          X=X+2; compteur --;
                       } 
        time_t fin = time(NULL); 
        printf ("\nTemps de recherche : %d secondes \n ", fin- debut);
        for (int i =3; i < val; i = i+2)
             { if ((Tab[i / 8] & (1 << (i % 8))) ==0)
                   {  
                      nombre_de_premiers ++; 
                   //   printf ("   %d", i);
                    }
               } 
         printf(" On a trouvé %d nombres premiers", nombre_de_premiers);
          free(Tab); // Libération de la mémoire allouée
          return 0;
     }
 
 

Android / Chrome 129.0.0.0

A voir également:

2 réponses

yg_be Messages postés 23259 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 octobre 2024 Ambassadeur 1 541
17 oct. 2024 à 21:00

bonjour,

je me demande pourquoi tu as mis ce IF à l'intérieur du FOR:

                             for (int n =0 ;  X*(X+2*n)< val ; n++)
                               {
                                 if (!(Tab[X / 8] & (1 << (X % 8))))
0

Tu pourrais essayer de remplacer les divisions par 8 par un décalage de 3 (x >> 3) et les modulo 8 par un masque (x & 7)

Le truc pour sauver de la mémoire est bon, mais ton algo est loin d'être le meilleur.

Tu en trouveras de meilleurs en cherchant sur Internet.

0