Algorithme nombres premiers

Algorithme nombres premiers - Algo - Programmation

Marsh Posté le 28-04-2005 à 11:13:31    

Bonjour,
j'aurai besoin qu'on m'aide a écrire un algorithme qui affiche les 10 premiers nombres premiers
 
Merci !

Reply

Marsh Posté le 28-04-2005 à 11:13:31   

Reply

Marsh Posté le 28-04-2005 à 11:59:33    

http://membres.lycos.fr/villeminge [...] troduc.htm
 
Edit:  en particulier http://membres.lycos.fr/villeminge [...] atoprg.htm


Message édité par Tamahome le 28-04-2005 à 12:00:28

---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 28-04-2005 à 12:18:40    

merci :)

Reply

Marsh Posté le 02-05-2005 à 10:34:22    

En fait je n'ai tjrs pas réussi
 
Je dois ecrire un programme qui affiche les 10 premiers nombres premiers parmis les nombres d'une liste, qui les trouve dans la liste
 
 :??:  
 
help.. :(

Reply

Marsh Posté le 02-05-2005 à 10:45:38    

atmakefka a écrit :

En fait je n'ai tjrs pas réussi
 
Je dois ecrire un programme qui affiche les 10 premiers nombres premiers parmis les nombres d'une liste, qui les trouve dans la liste
 
 :??:  
 
help.. :(


 
on est pas là pour faire tes devoirs.
Montre ce que tu as fait, on t'aidera à corriger.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-05-2005 à 10:56:29    

Nbpremier(x)  
 
   
  Si (x<2)  
  Retourne(FAUX)
  Fin Si
   
  Si (x == 2)  
  Retourne(VRAI)
  Fin si
 
 
  Si ((x % 2) == 0)  
  Retourne(FAUX)
  Fin si
 
 
  i = 3
  TantQue(i*i <= x)
 
 
    Si ((x % i) == 0) Retourne(FAUX);
 
 
    i += 2;
    fin si
 
 
 
  Retourne(VRAI)
 fin tant que

Reply

Marsh Posté le 02-05-2005 à 10:59:29    

Elle est où ta liste là? :??:


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-05-2005 à 17:47:36    

enfin par liste ya pas vrmt de liste, le programme doit juste trouver les 10 premiers nombres premiers (donc avec des tests si, tant que je crois)
personne veut m'aider :/

Reply

Marsh Posté le 02-05-2005 à 17:58:42    

j'ai essayé autre chose :
 
Fonction NombresPremiers(NP)
 début
    NP <-lire()
    Si (NP<2)
    Alors écrire("ce nombre n'est pas premier" )
    Fin si
 
..... je n'arrive pas a continuer :/


Message édité par atmakefka le 02-05-2005 à 17:59:14
Reply

Marsh Posté le 04-05-2005 à 16:25:45    

méthode la plus simple : suffit de coder comme la définition même d'un nombre premier : pour chaque nombre Y, tu prends son modulo avec tous les nombres X plus petits que lui même (à partir de 1). Si ce modulo vaut 0 lorsque X est différent de 1 et de Y alors, ce nombre n'est pas premier.
C'est aussi simple que cela : deux boucles imbriquées ;)


Message édité par Giz le 04-05-2005 à 16:26:20
Reply

Marsh Posté le 04-05-2005 à 16:25:45   

Reply

Marsh Posté le 04-05-2005 à 17:38:53    

Giz a écrit :

pour chaque nombre Y, tu prends son modulo avec tous les nombres X plus petits que lui même (à partir de 1).


 
 
Ce serait pas plus rapide de prendre 1 <= X <= Y/2 comme interval ?

Reply

Marsh Posté le 04-05-2005 à 17:41:25    

Elmoricq a écrit :

Ce serait pas plus rapide de prendre 1 <= X <= Y/2 comme interval ?


 
avec la racine carré de Y c'est encore mieux (et juste)

Reply

Marsh Posté le 04-05-2005 à 18:04:36    

C'est bon à savoir, juste je ne comprends pas comment la racine carrée permet le test. Va falloir que j'aille chercher la démonstration sur Google. :)
 
Par contre ça fait utiliser la lib m, c'est pas génant en soi mais faut pas oublier de l'inclure à la compilation. ;)

Reply

Marsh Posté le 04-05-2005 à 18:14:52    

Elmoricq a écrit :

Par contre ça fait utiliser la lib m, c'est pas génant en soi mais faut pas oublier de l'inclure à la compilation. ;)


 
Oui en C. Mais là il veut juste l'algo

Reply

Marsh Posté le 04-05-2005 à 19:21:25    

Elmoricq a écrit :

Ce serait pas plus rapide de prendre 1 <= X <= Y/2 comme interval ?


 
tu as raison, c'est plus performant. Mais bon, ma proposition c'était pour faire simple (les optimisations viennent après).

Reply

Marsh Posté le 04-05-2005 à 19:39:35    

Elmoricq a écrit :

C'est bon à savoir, juste je ne comprends pas comment la racine carrée permet le test. Va falloir que j'aille chercher la démonstration sur Google. :)


 
Tu ne comprends pas pourquoi il suffit de tester jusqu'à la racine carrée ? C'est trivial : suppose un diviseur p de n supérieur à sqrt(n), alors il existe un q tel que pq = n. Mais ce q est évidemment plus petit que sqrt(n) et a donc déjà été testé.

Reply

Marsh Posté le 04-05-2005 à 19:40:13    

2 <= x <= sqr(y) :o
 
Personne pour le crible d'Eratosthène ? Ca n'a rien de compliqué.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 04-05-2005 à 19:47:28    


 
De fait, c'est trivial.
 
Me sens con, pour le coup.


Message édité par Elmoricq le 04-05-2005 à 19:49:13
Reply

Marsh Posté le 04-05-2005 à 19:56:02    

sircam a écrit :

2 <= x <= sqr(y) :o
 
Personne pour le crible d'Eratosthène ? Ca n'a rien de compliqué.


2 < x <= sqr(y) :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 04-05-2005 à 19:56:32    

euh non, finalement c'etait juste...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 04-05-2005 à 20:23:57    

[:jagstang]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 04-05-2005 à 20:43:26    

Reply

Marsh Posté le 04-05-2005 à 21:35:57    

Estil _vraiment_ nécessaire d'écrire ce programme sur une seule ligne ? :o
 
J'veux la version BrainFuck, je comprends pas bien le C.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 23-05-2005 à 18:45:25    

sircam a écrit :

2 <= x <= sqr(y) :o
 
Personne pour le crible d'Eratosthène ? Ca n'a rien de compliqué.


 
Bon, je m'y colle !
 
Le crible d'Érathosthène est un tableau des nombres entiers que l'on écrit bien rangé :
 

 1   2   3   4   5   6   7   8   9  10
11  12  13  14  15  16  17  18  19  20
21  22  23  24  25  26  27  28  29  30
...


 
C'est plus pratique quand c'est bien rangé, mais, c'est pas obligé ; d'ailleurs on peut aussi faire des lignes de n'importe quelle longueur et ça simplifie beaucoup si on choisit une longueur multiple de petits nombres premiers, 2, 3, 5. La dimension du tableau est limitée uniquement par le courage du réalisateur... On peut bien aller jusqu'à un milliard si l'on veut...
 
Le but du jeu est de barrer les nombres au fur et à mesure que l'on découvre qu'ils ne sont pas premiers. On fait une exception pour 1, qui, selon les auteurs, peut être considéré comme premier ou pas premier. On considère pour la suite qu'il n'est pas premier. Donc on commence en cherchant le plus petit nombre qui n'a pas encore été barré (exception pour le 1 : on suppose qu'il est barré). C'est donc 2. Et on barre tous les multiples de ce nombre : 2*2=4, 2*3=6, etc... Si le tableau est bien rangé, on s'aperçoit vite que les multiples de deux, forment des séries géométriquement faciles à repérer. Ici, ce sont cinq colonnes, les colonnes du 2 (sauf le 2, bien sûr), du 2, du 6, du 8 et du 10. D'un coup on a barré tous les multiples de 2.
 
Ensuite on cherche à nouveau le plus petit nombre qui n'a pas encore été utilisé et qui n'est pas barré, donc le 3. On veut barrer 2*3 ; mais c'est déjà barré puisque 2*3 est multiple de 2 aussi. On barre donc à partir de 3*3 ; puis 3*4, 3*5, 3*6, etc...
Et là on s'aperçoit, dans le cas ci-dessus, que les nombres barrés sont alignés sur des diagonales : 12 et 21, 6-15-24-33-42-51, 9-18-27-36-45-54-63-72-81, 30-39-48-57-66-75-84-93-102-111, etc...
 
Ensuite on cherche à nouveau le plus petit nombre qui n'a pas encore été utilisé et qui n'est pas barré, donc le 5. On veut barrer 2*5 ; mais c'est déjà barré puisque 2*5 est multiple de 2 aussi. On veut barrer 3*5 ; mais c'est déjà barré puisque 3*5 est multiple de 3 aussi. On barre donc à partir de 5*5 et là aussi, les multiples de cinq sont bien alignés en deux colonnes (dont l'une est déjà barrée comme multiple de 2).
 
Et ainsi de suite ; ce n'est pas un hasard que le premier nombre à barrer lorsque l'on prend 3, soit 3*3, que le premier nombre à barrer lorsque l'on prend 5 soit 5*5. C'est systématique : puisque, lorsque l'on veut barrer les multiples de p, on est censé avoir barré tous les multiples des nombres premiers inférieurs à p, il est évident que le premier nombre à barrer sera p*p. Et cette remarque permet d'arrêter le processus, lorsque l'on tombe sur un premier p tel que p*p est plus grand que le dernier nombre du crible. Tous les nombres restants sont premiers, et aucun autre ne l'est.

Reply

Marsh Posté le 26-05-2005 à 19:20:07    


bonne idée,
si la mémoire est limitée, y'a toujours ça :
 

Code :
  1. bool isPrime(unsigned int N)
  2. {
  3.     bool ok=N&&N-1;
  4.     for(int d=2;d*d<=N&&(ok&=N%d);d++);
  5.     return ok;
  6. }


 
tant qu'on y est, on peut afficher certains nombres premiers (comme Mersenne 42 et consorts) avec un programme beaucoup plus court que ça...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed