Accueil > > > RECHERCHE DE NOMBRES PREMIERS PAR LE CRIBLE D'ERATOSTHENE
RECHERCHE DE NOMBRES PREMIERS PAR LE CRIBLE D'ERATOSTHENE
Information sur la source
Description
Affiche tous les nombres premiers de 0 à n sur la sortie standard d'après le crible d'Eratosthène.
Source
- /*
- * PREMIER.C - Affiche tous les nombres premiers de 0 à n sur la
- * sortie standard, par le crible d'Eratosthène.
- * Testé sur un Pentium 4, l'obtention de la liste de tout les nombres
- * premiers de 0 à 1 000 000 000 (552 807 324 octets) né‚cessite 1mn 18s.
- *
- * Développé par Michel Blancard.
- * Version 2.2
- * Dernière modification le 06/07/2006.
- */
-
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- #include <conio.h>
-
- void main(int argc, char **argv)
- {
- unsigned char *tableau;
- unsigned long i, j;
- unsigned long taille;
- unsigned long nbr_max;
-
- if(argc < 2)
- {
- cprintf("Syntaxe incorrecte.\n\r");
- cprintf("Syntaxe correcte : \"premier nbr_max [> *.*]\".\n\r");
- cprintf("nbr_max - maximum pour la recherche");
- return;
- }
- if((argv[1][0] < '0')&&(argv[1][0] > '9'))
- {
- cprintf("Syntaxe incorrecte.\n\r");
- cprintf("Syntaxe correcte : \"premier nbr_max [> *.*]\".\n\r");
- cprintf("nbr_max - maximum pour la recherche\n\r");
- return;
- }
-
- nbr_max = atol(argv[1]) + 1;
- taille = (nbr_max + 14) >> 4; // On ne stocke que les nombres impaires.
- if((tableau = malloc(taille)) == NULL)
- {
- cprintf("Memoire disponible insuffisante.\n\r");
- return;
- }
-
- for(i=1; i<taille; i++)
- {
- tableau[i] = 255; // Initialise les bits … 1 sauf le premier
- } // (nombre 1 non premier de toute fa‡on)
- tableau[0]=254; // 252 <=> 11111110
-
- /*
- * Raye tout les nombres non premiers (environ 40 % du temps d'execution).
- */
- for(i = 1; i <= (unsigned long)sqrt((double)nbr_max) / 2; i++)
- {
- if(tableau[i >> 3] & (unsigned char)(1 << (i & 7)))
- // si c'est un nombre premier
- { // alors on ‚limine tout ses multiples
- for(j = (4 * i * i) + (4 * i) + 1; j < nbr_max; j += (i * 4) + 2)
- {
- tableau[j >> 4] = tableau[j >> 4] & (unsigned char)(~(unsigned char)(1 << (((j - 1) / 2) & 7)));
- }
- }
- }
-
- /*
- * Affiche les nombres premiers (environ 60 % du temps d'execution).
- */
- if(nbr_max > 2)
- {
- printf("2\n"); // le nombre 2 n'est pas dans la liste
- }
- for(i=1; i<nbr_max / 2; i++)
- {
- if((tableau[i >> 3] & (unsigned char)(1 << (i & 7))) > 0)
- {
- printf("%lu\n", (i * 2) + 1);
- }
- }
-
- free(tableau);
- }
/*
* PREMIER.C - Affiche tous les nombres premiers de 0 à n sur la
* sortie standard, par le crible d'Eratosthène.
* Testé sur un Pentium 4, l'obtention de la liste de tout les nombres
* premiers de 0 à 1 000 000 000 (552 807 324 octets) né‚cessite 1mn 18s.
*
* Développé par Michel Blancard.
* Version 2.2
* Dernière modification le 06/07/2006.
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
void main(int argc, char **argv)
{
unsigned char *tableau;
unsigned long i, j;
unsigned long taille;
unsigned long nbr_max;
if(argc < 2)
{
cprintf("Syntaxe incorrecte.\n\r");
cprintf("Syntaxe correcte : \"premier nbr_max [> *.*]\".\n\r");
cprintf("nbr_max - maximum pour la recherche");
return;
}
if((argv[1][0] < '0')&&(argv[1][0] > '9'))
{
cprintf("Syntaxe incorrecte.\n\r");
cprintf("Syntaxe correcte : \"premier nbr_max [> *.*]\".\n\r");
cprintf("nbr_max - maximum pour la recherche\n\r");
return;
}
nbr_max = atol(argv[1]) + 1;
taille = (nbr_max + 14) >> 4; // On ne stocke que les nombres impaires.
if((tableau = malloc(taille)) == NULL)
{
cprintf("Memoire disponible insuffisante.\n\r");
return;
}
for(i=1; i<taille; i++)
{
tableau[i] = 255; // Initialise les bits … 1 sauf le premier
} // (nombre 1 non premier de toute fa‡on)
tableau[0]=254; // 252 <=> 11111110
/*
* Raye tout les nombres non premiers (environ 40 % du temps d'execution).
*/
for(i = 1; i <= (unsigned long)sqrt((double)nbr_max) / 2; i++)
{
if(tableau[i >> 3] & (unsigned char)(1 << (i & 7)))
// si c'est un nombre premier
{ // alors on ‚limine tout ses multiples
for(j = (4 * i * i) + (4 * i) + 1; j < nbr_max; j += (i * 4) + 2)
{
tableau[j >> 4] = tableau[j >> 4] & (unsigned char)(~(unsigned char)(1 << (((j - 1) / 2) & 7)));
}
}
}
/*
* Affiche les nombres premiers (environ 60 % du temps d'execution).
*/
if(nbr_max > 2)
{
printf("2\n"); // le nombre 2 n'est pas dans la liste
}
for(i=1; i<nbr_max / 2; i++)
{
if((tableau[i >> 3] & (unsigned char)(1 << (i & 7))) > 0)
{
printf("%lu\n", (i * 2) + 1);
}
}
free(tableau);
}
Conclusion
Pour plus d'informations sur le fonctionnement, regardez sur internet -> Eratosthène.
En gros, un bit est alloué à chaque nombre impaires, les nombres pairs ne sont pas premiers de toute façon (à part 2). Au début, tout les bit valent 1 (on considère tout premier).
En suite, pour chaque nombre premier trouvé (dont le bit vaut 1), on élimine (on met les bits à 0) tout ses multiples impaires jusqu'à n(maximum).
Finalement, on affiche tout les nombres qui n'ont pas été éliminés.
Concrètement, sur une suite de 0 à 15 :
0 et 1 ne sont pas premiers par définition.
2 est premier par définition.
4, 6, 8, 10, 12, 14 ne sont pas stockés(pairs).
3 est premier.
->Il élinine ses multiples impaires (9 et 15).
5 est premier.
->10 est pair et 15 est déjà éliminé par 3, il n'élimine donc rien.
7 est premier.
->Idem pour 14.
9 est multiple du nombre premier 3.
11 est premier.
->Il n'a aucun multiple dans la suite.
13 est premier.
->Idem.
15 est multiple du nombre premier 3.
Les nombres premiers sont donc : 2, 3, 5, 7, 11, 13.
Historique
- 28 juin 2006 14:34:57 :
- Cette version est beaucoup plus performante, le temps d'execution passe de 7 secondes à un quart, et ne prend que 1 cinquième de plus de mémoire !
- 28 juin 2006 14:41:16 :
- Cette version est beaucoup plus performante, le temps d'execution passe de 7 secondes à un quart, et ne prend que 1 cinquième de plus de mémoire !
- 28 juin 2006 14:46:22 :
- Cette version est beaucoup plus performante, le temps d'execution passe de 7 secondes à un quart, et ne prend que 1 cinquième de plus de mémoire !
Remodification pour cause de fautes d'orthorgraphe.
- 07 juillet 2006 11:50:48 :
- Maintenant, mon code tient à peu près la route. Tout les calculs inconpréhensibles ont pour but de ne stocker que les nombres impaires.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Nombres premiers en C Urgent [ par maxfrancky ]
il me faut réaliser un programme permettant de lister les n premier nombres premier n utilisnat une liste chainée de structure contenant le nombre pre
Nombres premiers... corrigez moi svp =3 [ par nisso13 ]
Salut, voila je m'explique, je voudrais faire un programme qui me liste les nombres premiers inferieurs à 1000... je l'ai fait mais il a une erreur qu
nombre premier [ par igor941 ]
bonjour je suis etudiant et j'ai un tp à réaliser j'aurai besoin d'une petite aide de la part de quelqu'un se debrouillant en C puisque je debute en C
Problème pour mettre une Dialog Modale au premier plan [ par ZMJUVENTINO ]
Salut, je travaille sur Visual C++ 6Je voudrais à partir de mon application afficher une CDialog modale et qu'elle s'affiche absolument au premier pla
comment cliquer sur un bouton virtuellement [ par Billyjijel ]
salut ; je pense que ma question est simple relativement; donc j'ai deux boutons, je veux qaud je clique sur le premier j'execute le contenu de deux
createfile [ par thegame88 ]
Bonjour a tous,Voila j'ai fait un ti prog qui utilise la fonction createfile, mais le premier argument de createfile doit être le chemin du fichier du
Recupérer le nom du premier noeud d'un treeview [ par kitcarflo ]
J'aimerai pouvoir récupérer dans une variable le mot inscrit dans un treeview. par exemple mon treeview commence par "toto", en enfant de toto on tro
rectangle en premier plan [ par minetgrostiti ]
Bonjour En c#: J'ai une pictureBox incluant une image le tout dans Form1 Je crée un rectangle (DrawRectangle) pour délimiter une zone de contrôle sur
programme nombres premiers [ par I0o0I ]
Bonjour, j ai une question pour un programme plutot math mais la question est pas math du tout... c est surement très facile a résoudre. En gros j a
factorial factors [ par brahimhakkou ]
svp aidez moi c urgentin this problem we want to determine the maximum number of integer terms (excluding1) that can be used to express n! par exemple
|
Derniers Blogs
[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
WIN APIWIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|