CALCUL LIST DE NOMBRES PREMIERS

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 9 juin 2010 à 17:52
 nj@y@@ - 12 janv. 2018 à 15:09
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51872-calcul-list-de-nombres-premiers

si nombre == 1 la fonction nb(nombre) retourne true. Or 1 n'est pas un nombre premier

j'ai ajouté deux lignes de codes pour gérer ce cas

def nb(nombre):

if(nombre == 1):
return false

nb=True;
i=2;
while(i<(nombre-1) and i<(nombre/2)):
if(nombre%i==0):
nb=False;
i=i+1;
return nb;
xeolin Messages postés 336 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 8 novembre 2011 2
18 juil. 2010 à 00:49
''Mais à préciser que cet algo ne donne que la probabilité qu'un nombre soit premier ; il ne dit pas s'il est réellement premier.''

L'erreur est d'une probabilité de moins de 2^-80. Donc pratiquement nulle. J'irai même dire qu'il y a plus de chance (pour de grand nombre) qu'avec son algorithme un erreur survienne au niveau du CPU/RAM, que mon algo se trompe (on parle de l'ordre de 2^500 et plus)...

La raison que son code est nul, c'est a cause du comportement de celui qui l'a poster : il l'a lâché ici et puis rien, aucune réaction de sa part a nos conseils... Et sinon, tu es peut être impressionné par cet algo mais je travaille sur le "Atkin–Morain elliptic curve primality test"(ECPP), plus efficace :)

Xeolin
svear Messages postés 3 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 17 juillet 2010
17 juil. 2010 à 19:32
Bonsoir

Ca fait bien longtemps que je n'étais pas revenu ici. Mais bon, vieux motard quoi...

Donc mes commentaires: déjà, appeler un flag booléen "nb" n'est pas interdit... mais autant l'appeler "flag". Enfin c'est histoire d'avoir des noms de variables en concordance avec leur rôle quoi. Dans la même optique, appeler une fonction qui vérifie si un nombre est premier "nb" n'est pas des plus fins.
De plus, tant qu'à introduire des instructions break qui feront hurler les puristes de la programmation structurée, autant y aller alors à fond
def isPremier(nombre):
## Fonction qui determine si un nombre est premier ou non.
i=2
while(i<(nombre-1) and i<(nombre/2)):
if(nombre%i==0): return False
i=i+1
# while
return True
# isPremier()

Accessoirement, je ne vois pas trop l'utilité des point-virgules à chaque instruction. Un souvenir issu du C sans-doute ;)

Sinon ben quoi dire de plus ? White541 vient de découvrir Python. Il a aussi découvert un algo pour calculer les nombres premiers ben il le poste quoi. Un peu naïf mais pas méchant. Et certainement pas "nul" comme l'a dit cet illustre inconnu.
Peut-être un peu précipité car s'il avait réfléchi un peu plus il aurait, j'espère, trouvé tout seul qu'on peut s'arrêter dès que le résultat de la division devient plus petit que le diviseur...

Voilà. Sinon j'ai été impressionné par l'algo de Rabin-Miller implémenté par Xeolin. Mais à préciser que cet algo ne donne que la probabilité qu'un nombre soit premier ; il ne dit pas s'il est réellement premier. Ce point peut parfois être important...
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 juin 2010 à 19:11
Aucune réaction de l'auteur, ca ne sert à rien de poster des mauvais codes si on ne cherche pas à les améliorer.
xeolin Messages postés 336 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 8 novembre 2011 2
16 juin 2010 à 16:53
vive l'indentation qui marche pas !

et on reessaye :

def nb(nombre):
## Fonction qui determine si un nombre est premier ou non.
nb=True;
i=2;
while(i<(nombre-1) and i<(nombre/2)):
if(nombre%i==0):
nb=False;
break
i=i+1;
return nb;

Sinon Mr PlugAndPlay

Les attaques personnelles et gratuites non-merci...

Et pourquoi n'a t'on aucun commentaire de l'auteur ?
xeolin Messages postés 336 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 8 novembre 2011 2
16 juin 2010 à 16:39
Tiens on parle de moi..

"À quoi ça sert de poster un code de 10 lignes fait au moins 15 fois en beaucoup mieux sur ce site."

He bien, moi j'en connais au moins une (surtout que c'est moi qui l'est fait), mon code pour faire des clef RSA incorpore l'argorithme de Rabin-Miller qui permet de savoir si un nombre est premier ou pas. En tout cas sur un intel core solo a 1.6 GHz j'arrive en quelque seconde a verifier la primalite, d'un nombre de l'ordre de la dixaine de millier de chiffre.

Mais bon apres il y ceux qui savent utiliser wikipedia et d'autre pas...

En tout cas fait une petite recherche sur les alforithme non-deterministes.

(et il y a aussi ceux qui on un clavier sans accents, vive les claviers US !)

Nate ?:

NB :

fait moi le plaisir de faire ce petit changement !

def nb(nombre):
## Fonction qui determine si un nombre est premier ou non.
nb=True;
i=2;
while(i<(nombre-1) and i<(nombre/2)):
if(nombre%i==0):
nb=False;
break
i=i+1;
return nb;
aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 18
15 juin 2010 à 20:04
Je ne suis pas tout à fait d'accord avec la remarque de Julien.
Je pense que lorsqu'une source est mauvaise comme c'est le cas ici, il ne faut pas tourner autour du pot et le dire clairement. Ici je pense que le mot "nul" est bien approprier à la situation, car la source est mauvaise en beaucoup de points qui me semble tout de même essentiels.
Je suis parfois déçus qu’il y ai peu de monde qui dépose des sources sur Python France, mais il faut bien admettre que je préfère ne pas en voire plutôt que ces pseudo code. À quoi ça sert de poster un code de 10 lignes fait au moins 15 fois en beaucoup mieux sur ce site.
Cela dis que pense que même si on descend ce code, cela ne veux pas dire que la personne elle est irrémédiablement nul. C’est à elle de progresser c'est-à-dire de corriger son code dans un premier temps et nous montrer ensuite un code digne de ce nom dans la prochaine source. Et la il a droit aux commentaires bien gentil de tout le monde.

En résumé, ce code est nul, donc toi tu dois :
- Corriger ton code (= s’arrêter à racine du nombre + enlever ces foutu ";")
- Nous proposer un code plus consistant la fois prochaine

Voila je pense que tous est dit.


Joker – coups de fil à un amis :
form math import *
print sqrt(25)

_____
Aéra


"Vous êtes la merde de ce monde prêt à servir à tout ..." - Tyler
PlugnPlay666 Messages postés 30 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 17 septembre 2010
14 juin 2010 à 19:35
Oh non ne t'inquiète pas, je ne l'ai pas mal pris, c'est plutôt lui qui peux mal le prendre quoique ta remarque soit justifiée.
(Je ne suis pas comme Xeolin =P)
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
14 juin 2010 à 18:51
ne me fais pas dire ce que je n'ai pas dit.

Je ne mets pas en doute les capacités de personne. Mais je pense que quand on n'a encore poté aucune source, on évite les commentaires destructeurs du genre "c'est nul". C'est juste ce que je voulais dire.

J'espère que tu ne l'a pas mal pris. Surtout en Python qui est assez intuitif, on peut apprendre à coder à tout age, d'ailleurs je ne suis pas spécialiste du tout de ce langage et il est possible que tu en connaisses plus que moi en python.
PlugnPlay666 Messages postés 30 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 17 septembre 2010
14 juin 2010 à 18:40
Bah . . . Personnellement je suis en troisième et j'ai étudié les nombres premiers en tout début d'année, après cette notion n'a peut-être pas été assez approfondie par tes profs, ou alors tu n'as pas écouté en cours =P

@Julien: "Petite remarque en passant pour quelqu'un qui est en seconde"
Je ne pense pas que les capacités d'un programmeur est un quelconque rapport avec son âge, même si quelqu'un de plus âgé a accumulé un certain nombre de connaissance le plus jeune peut toujours rattraper ce manque par un travail et un entrainement suffisant.
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
14 juin 2010 à 17:58
Ha oui, là ca change tout je pense. Tu n'as pas eu de cours sur les nombres premiers et donc, tu ne pouvais pas savoir tout ca.

En fait pour t'expliquer en gros, si un nombre n admet un diviseur p qui n'est différent de 1 et de n alors, n=p*q. Le premier cas c'est p<racine(n) et si p est plus grand que racine(n) alors forcément q lui est plus petit que racine (n) en effet si p et q sont supérieurs à racine(n) alors p*q>racine(n) or p*q = n.
Donc tout nombre non premier admet un diviseur plus petit que ca racine.

Un truc pas mal aussi c'est de tester pour 2 et puis de ne pas tester pour les multiples de 2 en gros, tu teste que pour les nombres qui s'écrivent 2*i+1.

Petite remarque en passant pour quelqu'un qui est en seconde, qui n'a jamais posté une source ni aucun autre commentaire sur ce site ou un autre site code source, je te trouve bien sûr de toi quand tu dis "c'est nul". La critique est aisée...
sithoueb Messages postés 3 Date d'inscription jeudi 1 janvier 2009 Statut Membre Dernière intervention 21 juin 2010
14 juin 2010 à 17:31
J'suis qu'en seconde aussi ...
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
14 juin 2010 à 17:28
Le coup de s'arrêter à la moitié c'est une idée mais pas la meilleure, il faut s'arrêter à la racine du nombre en question pour avoir les meilleurs performances.
sithoueb Messages postés 3 Date d'inscription jeudi 1 janvier 2009 Statut Membre Dernière intervention 21 juin 2010
14 juin 2010 à 14:46
J'ai fait un programme (sur ma calculette et j'ai la flemme de le mettre sur PC) pour calculer les nombre premiers.
Et plutot que de vérifier avec TOUT les nombres, je vérifie si il est divisible avec les précédents, inférieur à sa moitié (Un nombre n'est pas divisible par un autre nombre supérieur à sa moitiée) !

Sérieux, ce code est assez nul (sans vouloir te vexer) ...
PlugnPlay666 Messages postés 30 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 17 septembre 2010
10 juin 2010 à 21:45
Oh ! En lisant le commentaire d'Aera, j'ai vu un truc affreux !!
Une docstring ne se fait pas avec des dièses !! Sinon quand on fait help(fonction) rien ne s'affiche et ta pseudo-docstring ne sert à rien . . .

Pour écrire une docstring tu la met entre trois guillemets.

def nb(nombre):
"""Fonction qui détermine si un nombre est premier ou non."""

def list(x):
"""Fonction qui liste les nombres premiers jusqu'à X."""
aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 18
10 juin 2010 à 19:49
"Une issue de secours à 9 000 mètres d'altitude… L'illusion de la sécurité." - Tyler

Bon, je pense que Julien39 à bien résumé la situation, j'ai beaucoup de mal à concevoir que l'on puisse déposé sur ce site un si petit code et surtout aussi mal optimisé.
De plus, il est souhaitable de ne pas mettre de ";" à la fin des lignes en Python, c'est assez contradictoire avec la volonté d'utiliser un langage de programmation aussi intuitif que Python ...

Voila je pense que 1 est une note largement suffisante. Tache de corriger ton code, et de déposé des programme un peu plus complexe.
PlugnPlay666 Messages postés 30 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 17 septembre 2010
10 juin 2010 à 19:15
Julien n'a pas tout à fait tort . . . Même si c'est un script écrit à la va vite, tu aurais pu l'optimiser un minimum avant de le poster ici.

Juste un petit truc que j'ai remarqué 8 et 17, tu écris :

i=i+1

tu pourrais le remplacer par i+=1
M'enfin ça c'est juste plus beau à regarder, ça change pas grand chose . . .
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 juin 2010 à 17:52
Ce code n'est vraiment pas formidable, aucune optimisation, tu teste tous les nombres, les pairs compris et tu t'arrêtes bien trop tard. en effet, si un nombre n'est pas premier alors il admet un diviseur plus petit que sa racine carrée.

En faisant une optimisation vraiment minime, on arrive déjà à diviser par plus de 4 le nombre de test réalisés !!!
Rejoignez-nous