Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OBTENIR TOUTES LES NOMBRES PREMIERS DANS UNE GRANDE RANGÉE AU MOINS DE 10 MS!


Information sur la source

Catégorie :Maths & Algorithmes Classé sous : premiers, sieve Niveau : Expert Date de création : 19/04/2007 Date de mise à jour : 19/04/2007 17:55:42 Vu / téléchargé: 3 858 / 161

Note :
Aucune note

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
salut
c'est comme vous avez compris du titre
c'est une implementation de l'algorithme sieve pour trouver les nombres premier.
détail dans le zip
merci pour votre visite!
:)
 

Source

  • #include<stdio.h>
  • void sieve(int L,int U) {
  • int i,j,d;
  • d=U-L+1;
  • char flag[d];
  • for (i=0;i<d;i++) flag[i]=1; /* par défaut tout est marqué comme premier */
  • for (i=(L%2!=0);i<d;i+=2) flag[i]=0;
  • /*on élimine les multiples des nombres premiers de 3 jusqua sqrt(U) */
  • for (i=3;i*i<=U;i+=2) {
  • if (i>L && !flag[i-L])
  • continue;
  • /* On choisit le facteur qu'on va éliminer ses multiples */
  • j=L/i*i;
  • if (j<L) j+=i;
  • if (j==i) j+=i; /* il faut que j soit différent de i */
  • j-=L; /* On décale les indices */
  • for (;j<d;j+=i) flag[j]=0;
  • }
  • if (L<=1) flag[1-L]=0;
  • if (L<=2) flag[2-L]=1;
  • for (i=0;i<d;i++)
  • if (flag[i])
  • printf("%d\n",L+i);
  • }
  • int main(){
  • int m,n;
  • while(scanf("%d%d",&m,&n) == 2){
  • sieve(m,n);
  • printf("\n");
  • }
  • return 0;
  • }
#include<stdio.h>

    void sieve(int L,int U) {
      int i,j,d;
      d=U-L+1; 
      char flag[d];
      for (i=0;i<d;i++) flag[i]=1; /* par défaut tout est marqué comme premier */
      for (i=(L%2!=0);i<d;i+=2) flag[i]=0;
   /*on  élimine les multiples des nombres premiers de 3 jusqua sqrt(U) */
      for (i=3;i*i<=U;i+=2) {
         if (i>L && !flag[i-L]) 
            continue;
      /* On choisit le facteur qu'on va éliminer ses multiples */
         j=L/i*i; 
         if (j<L) j+=i;
         if (j==i) j+=i; /* il faut que j soit différent de i */
         j-=L; /* On décale les indices */
         for (;j<d;j+=i) flag[j]=0;
      }
      if (L<=1) flag[1-L]=0;
      if (L<=2) flag[2-L]=1;
      for (i=0;i<d;i++) 
         if (flag[i])
            printf("%d\n",L+i); 
   
   }
    int main(){
      int m,n;
      while(scanf("%d%d",&m,&n) == 2){
         sieve(m,n);
         printf("\n");
      } 
      return 0;
   }

Conclusion

j'espère qu il sera utile pour vous!
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Sieve
    • Eratosthenes' sieve..pdfTélécharger ce fichier [Réservé aux membres club]28 847 octets
    • sieve.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier939 octets
    • sieve.JPGTélécharger ce fichier [Réservé aux membres club]Voir ce fichier63 747 octets

Télécharger le zip

Historique

19 avril 2007 17:55:42 :
ajout du code source pour vous :)

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 19/04/2007 18:55:20 administrateur CS

d=U-L+1;
char flag[d];  ça compile ???

signaler à un administrateur
Commentaire de 6co le 19/04/2007 19:28:31

ça compile sans problème chez moi (avec GCC)

signaler à un administrateur
Commentaire de BruNews le 19/04/2007 19:35:40 administrateur CS

Ben ça s'arrange pas, tu n'as aucun controle du moment de la desalloc.

signaler à un administrateur
Commentaire de 6co le 19/04/2007 19:54:50

excuse moi, je ne saisis pas ce que tu veux dire...

signaler à un administrateur
Commentaire de elkasimi2007 le 19/04/2007 20:01:21

salut,
vraiment c'est formidable on ressent vraiment que le monde est vivant
avec 4 commentaires,merci pour votre soutien les gars.
je vous promis toujours mon meilleur possible!

signaler à un administrateur
Commentaire de BruNews le 19/04/2007 20:02:07 administrateur CS

Je pense tout simplement qu'il y a des langages interprétés pour ce genre de connerie, gabage collector et autres bidules.

signaler à un administrateur
Commentaire de Cyberboy2054 le 19/04/2007 20:27:05

Moi aussi j'ai du mal à comprendre comment ce genre de syntaxe peut etre géré efficacement dans un programme de plus grande échelle. D'ailleurs tu devrais etre content Brunews, mais apparement ce genre d'ecriture ferait partie des futures normes du c++ (selon un pote en iut info, qui le tient d'un de ses profs). On leur apprend même a utiliser l'ecriture ci dessus O_o

A remplacer bien evidemment par un char *flag = (char*)malloc (d*sizeof(char)) puis free (flag) en fin de programme, pour rester dans du C propre et portable. D'ailleurs ca ne compile pas sous visual C++ 6.

signaler à un administrateur
Commentaire de BruNews le 19/04/2007 20:39:42 administrateur CS

Je n'ai pas envie d'essayer sur VC 2005, je tiens à controler les allocs et desallocs moi meme sinon je vais faire du VB.

signaler à un administrateur
Commentaire de acx01b le 19/04/2007 20:56:56

salut

http://mx.isti.cnr.it/cgi-bin/conan?key=CC~Language_topics~Builtin_Functions~__ALLOCA&title=VMS%20Help&referer=


avec gcc -S sous cygwin:

void alala() {
int d = 50;
char c[d];
}

       .globl _alala
       _alala:
pushl %ebp
movl %esp, %ebp

subl $8, %esp
movl %esp, %edx
movl $50, -4(%ebp)
movl -4(%ebp), %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
call __alloca
movl %edx, %esp
leave
ret

en clair ça veut dire que c'est équivalent à:
void alala() {
int d = 50;
char *c = __alloca(50);
}

signaler à un administrateur
Commentaire de acx01b le 19/04/2007 20:59:35

j'ai vérifié en rajoutant

void alala() {
int d = 50;
char *c = __alloca(50);
c[0] = 48;
}

la zone est bien dans la pile
je trouve ça utile, à part le fait d'appeler __alloca
(pourquoi pas un
sub $50, %esp
directement au lieu d'appeler __alloca ??)

signaler à un administrateur
Commentaire de BruNews le 19/04/2007 21:13:03 administrateur CS

dans le cas de:
d=U-L+1;
char flag[d];
le compilo ne pourrait pas présumer que ça va tenir sur stack.

signaler à un administrateur
Commentaire de Ombitious_Developper le 19/04/2007 22:20:09

Salut tous:

Brunews >> crois moi le garbge collector n'est pas une connerie.

signaler à un administrateur
Commentaire de BruNews le 19/04/2007 23:06:45 administrateur CS

Le nescafé non plus, sauf que ça n'a plus rien à voir avec du café.

signaler à un administrateur
Commentaire de Ombitious_Developper le 19/04/2007 23:44:46

Il y a des gens qui disent que "Java est une réligion".
Pas moi, mais je comprends ce qu'ils veulent dire. C'est le goût et l'extase de la programmation.
Personnellement, Je déteste le café et tout ses dérivées

signaler à un administrateur
Commentaire de Kirua le 20/04/2007 11:09:04

+1 pour brunews, autant pour le café que pour le garbage collector :) et j'adore le café.

C'est une question d'habitude on va dire, garbge collector ou pas ... Mais je me sens terriblement impuissant quand je programme avec un GC personnellement :/. La gestion de la mémoire est vrmnt un souci central quand on programme. C'est déjà compliqué de savoir quand l'argument est passé par valeur ou par référence en Java O_o.

Du reste, le petit détail de syntaxe qui vous occupe est une extension GCC je crois. Suffit de ne pas l'utiliser.

Au fait: le screenshot est peut-être pas super utile, et bon ... "grande rangée", ça reste à voir. Pour les nombres premiers, couvrir tous les nombres représentables avec un int est assez standard, donc ne nous emballons pas ;).

signaler à un administrateur
Commentaire de DeAtHCrAsH le 20/04/2007 11:51:18

Pour ma part je pense que le GC a tout à fait sa place dans les langages managés qui se veulent rapide et sure en terme de développement.
Maintenant il est sure qu'un "vrai logiciel" (à mon sens) a tout interet à etre codé en C/C++/ASM tout court.

signaler à un administrateur
Commentaire de ThicAThic le 20/04/2007 15:49:29

Peux-tu me donner un lien vers un site qui expliquerait l'algorithme de sieve, SVP ? Je n'en ai pas trouvé sur BibMath ni d'autres algo donnant et/ou calculant la suite des nombres premiers. Et ça m'intéresse. Merci.

signaler à un administrateur
Commentaire de elkasimi2007 le 20/04/2007 16:41:38

salut,
je crois que le pdf qui est dans le zip explique l'algorithme de sieve.
merci pour vos commentaires.

signaler à un administrateur
Commentaire de Kirua le 20/04/2007 17:51:29

"Sieve", c'est pas juste le mot anglais pour "crible" (d'Eratosthène) ? Le coup classique qui marche bien si on a bcp de mémoire quoi :)

signaler à un administrateur
Commentaire de elkasimi2007 le 20/04/2007 23:34:51

exactement Kirva!
son seul inconvénient c'est la grande mémoire!dieu merci qu'on est dans l'époque des 1Go de RAM!
a bientot..

signaler à un administrateur
Commentaire de Yunchi le 20/07/2007 10:21:04

il n'y a pas une infinite de nombres premiers ?

signaler à un administrateur
Commentaire de Kirua le 20/07/2007 11:46:16

Ben si, et c'est même très facile à prouver (ce qui ajoute à l'élégance de la démonstration ^^). Mais on parle ici de trouver tous les nombres premiers dans un intervalle fini, et ça, il y en a un nombre fini.

signaler à un administrateur
Commentaire de _michel le 28/06/2008 15:17:00

"exactement Kirva!
son seul inconvénient c'est la grande mémoire!dieu merci qu'on est dans l'époque des 1Go de RAM!
a bientot.."
Justement pour la mémoire il y a une optimisation : on peut juste utiliser un bit par nombre impair, ça diminue par 16 l'espace mémoire requis. Comme ça on gagne 8 ans sur la technologie (loi de Moore). Pour la rapidité je ne sais pas si ça rend plus rapide ou moins (je dirais moins mais on ne sais pas car les opérateurs << et >> sont extremement rapides).

signaler à un administrateur
Commentaire de _michel le 28/06/2008 23:24:54

Pour bcc55, ça ne compile pas...

signaler à un administrateur
Commentaire de _michel le 28/06/2008 23:50:04

http://www.cppfrance.com/codes/RECHERCHE-NOMBRES-PREMIERS-CRIBLE-ERATOSTHENE_38335.aspx

Voila un exemple d'optimisation avec la mémoire. En plus avec les opérateurs basiques (&, |, <<, >>) on gagne beaucoup en vitesse.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

une aide pour écrire un algo et un prog sur le nbr premiers [ par Julius Caesar ] Bonjour, je n'arrive pas écrire l'algo et le prog de ce sujet:"Ecrivez un algo et un prog, qui affiche les nbrs premiers inferieurs à un entier n (ave Supprimer les n premiers octet d'un fichier [ par arc59 ] Bonjour, dans mon programme de modification des ID 3 tag, je voudrai permettre à l'utilisateur de supprimer les Id3tag de version 2. Ces tag sont plac Découpage de n premiers caractères d'une chaine [ par Guidelor ] BonjourJ'ai une chaine1 ="aaaaaaaaa123456"J'aimerais enlever "aaaaaaaaa"comment faire sachant que ce que je ve enlever est situé entre le 1er et le 10 Mes premiers pas sous linux sniff je suis ému [ par asmanur ] Alors voila je me suis mis à la prog sous linux et j'ai quelqes prob & questions - quand je tape g++ main.cpp il me met qu'il ne conait pas g++ -quan Premiers pas avec visual c++ express edition... [ par gdpasmini ] Hello ! je débute avec visual c++ express edition, ma question va peut etre sembler stupide. J'ai créé un nouveau projet "windows form application". 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 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 affichage 3 premiers caractere [ par OTHKREEN ] <td id="HB_Focus_Element" valign="top" width="100%" b Probleme de tri [ par bebeesther ] Si tu peux m'aider, je serai tres reconnaissant!!!!!!!!Merci d'avance. 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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.