Crible d’Ératosthène
dans Arithmétique
Bonsoir,
Etant novice en python, je ne comprends rien au code suivant.
Surtout les lignes 1,2,3 et 7.
Ça veut dire quoi
Etant novice en python, je ne comprends rien au code suivant.
Surtout les lignes 1,2,3 et 7.
Ça veut dire quoi
premier=n * Truepuis
premiers[0]=False?
Réponses
-
si n = 5,
premiers = n * [True]
Alorspremiers = [True, True, True, True, True]
etpremiers[0] = False
donne alors après[False, True, True, True, True]
-
Bonjour,
Déjà, il faudrait recopier correctement:
"premier=n * True" n'est pas "premiers=n * [True]".
Cette ligne fabrique un tableau de n booléens égaux à True.
"premiers[0]=False" met False dans la première case du tableau.
Cordialement,
Rescassol -
Merci ! On
Mais je ne comprends pas la suite :if premiers[p] : print(p) :
Puis je ne comprends pas non plusfor i in range(p*p,n,p) : premiers[ i]=False
[Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD] -
Bonjour,
Ce n'est pas ce qui est écrit.
1) Il n'y a pas de ":" après le print(p)
2)Tu as oublié l'indentation.
3) Il manque "[ i]"
4) Si tu ne connais pas du tout le langage Python, on ne peut pas te l'apprendre en 3 messages, il faut te procurer un cours.
Cordialement,
Rescassol
Edit: Des typos .............. -
Juste... Est-ce que tu as au moins testé le code pour voir ce que faisaient ces commandes?
-
C'est un programme simple, y a-t-il besoin d'apprendre Python de A à Z pour le comprendre ?
J'ai fait de la programmation en C, des choses bien plus compliquées.
Le programme j'ai testé il n'affiche rien. -
Bonjour
Si tu as fait du C, tu devrais comprendre qu'écrire une fonction ne suffit pas, il faut l'appeler.
Crois-tu que fabriquer une bêche va suffire pour creuser un trou ? Il faut en plus t'en servir.
Cordialement,
Rescassol -
Tu dois connaitre les bases au moins. Et si tu faisais des choses si compliquées que ça en C, tu te demanderais pas ce que signifie la ligne
premiers[0] = True
qui est une commande de base de la programation, tous langages confondus
D'autant plus que tu es si fort en programmation en C que tu as oublié que pour afficher le résultat d'une fonction il faut appeler la fonction avant...Mais bon. -
Ca ne marche toujours pas
def Eratosthène(n) : premiers=n*[True] premiers[0]=False premiers[1]=False for p in range (2,n): if premiers[p]: print (p) for i in range (p*p,n,p): premiers [ i]=False Eratosthène(100)
[Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD] -
Je ne comprends pas la fin du programme à partir du if.
-
"premiers =False"
Ce n'est pas ce qui est marqué... faut tout te corriger -
Bonjour,
Et d'autre part, l'indentation doit être de $4$ espaces.
Cordialement,
Rescassol -
Je n'ai pas compris quelle indentation choisir pour appeler la fonction.
Le programme tourne toujours à vide -
1) Utilise ta touche tab pour faire une indentation (shift + tab pour l'enlever)
2) Erathostene(100) doit être écrit en dehors de la fonction donc en enlevant l'indentation.Sois propre, saute une ligne après la fonction et écris ton Erathostene(100) sans indentation -
Bonjour,
Les indentations sont toujours de $4$ espaces !!!
Par contre, si tu indentes l'appel, il est dans la fonction, et même pire ici, dans la boucle interne,ce qui n'est pas ce que tu veux.
Donc détente complètement l'appel.pour qu'il soit le programme principal.
Cordialement,
Rescassol -
Merci pour vos réponses ça marche enfin.
Par contre comme je n'ai pas trop compris le programme, quand je veux afficher le résultat en m'arrêtant à print(p) ça n'affiche rien. Est-ce normal ? -
Je ne comprends pas ce que tu veux dire
-
tu as oublié la fin pour ("appeler ta fonction Eratosthène") écrire les nombres premiers P, exemple pour n = 300
n = 300
P = Eratosthène(n)
ce qui donne :def Eratosthène(n): premiers = n*[True] premiers[0] = False premiers[1] = False for p in range(2,n): if premiers[p]: print(p) for i in range(p*p,n,p): premiers[ i] = False n = int(input("donner la valeur de n : ")) P = Eratosthène(n)
résultat :
2
3
5
7
11
13
17
19
23
29
31
37
41
.
...etc
.
.
241
251
257
263
269
271
277
281
283
293
>>> -
Ecrire "P = Eratosthène(n)" au lieu de "Eratosthène(n)" ne change rien vu que la fonction n'a pas de return elle ne fait que printer un résultat à l'écran !
-
LEG oui le programme tourne bien. Je ne comprends pas la partie rouge du code. J'ai essayé d'exécuter le programme jusqu'à "print(p)" mais ça n'affiche rien. Pourtant print veut bien dire afficher non ?
def Eratosthène(n): premiers = n*[True] premiers[0] = False premiers[1] = False [b][color=#FF0000]for p in range(2,n): if premiers[p]:[/color][/b] [b][color=#FF0000]print(p) for i in range(p*p,n,p): premiers[ i] = False[/color][/b]
-
Normalement si tu exécutes la fonction jusqu'à print(p) tu printes tous les nombres de 2 à n-1. Pas très intéressant...
def Eratosthène(n): premiers = n*[True] premiers[0] = False premiers[1] = False for p in range(2,n): if premiers[p]: print(p)
-
Bonjour,
Ce que tu viens de dire n'a pas de sens.
Que veut dire s'arrêter à print(p) ?
C'est l'appel du programme principal qui fait s'exécuter les choses.
Cordialement,
Rescassol -
Ok merci Rescassol
Ça veut dire quoipremiers [p]
? Je n'ai pas compris cette commande. -
Mais OSHINE on t'a dit 1000 fois qu'il faut appeler la fonction après l'avoir définie, tu es bouché ou quoi?
Tu as fait de la programmation ou pas?
Accessoirement, premiers[p] est un booléen qui vaut True ou False, si True tu rentres dans la condition, sinon tu n'y rentres pas -
Bonjour,
premiers[p] n'est pas une commande, c'est la case numéro p du tableau premiers, exactement comme en en C.
Cordement,
Rescassol -
Ok merci oui désolé je suis rouillé :-(
Je vais réfléchir aux dernières ligne du programme. -
pour imprimer tes nombres premiers il faut l'instruction
print (p) à la condition que p soit définis par exemple P = premiers :
et non pas dans le programme sous la fonction:
if premier [P]: # ça veut dire si le nombre est premiers [P]
print(p) # il doit l'écrire en mémoire
là, je suppose, qu'il écrit en mémoire les nombres premiers [True] qu'il a trouvé , pour ensuite les restituer à la demande
# à l'appel de la fonction #:
P = Eratosthène(n) # là on appelle les nombres premiers [True = vraie]pour les imprimer; le programme est fini...
Je ne suis pas du tout programmeur, je n'y connais même rien... en général. Sauf un peu sur les crible d'Ératosthène... parce que j'en ai construit et fait programmer. Donc il me fallait bien savoir ce que font les différentes parties du programme et leur fonction.... -
premiers est un tableau, avec plein de valeurs. premiers[p] est la valeur de rang p ( Attention : le 1er élément porte ne n° 0 )
premiers est un tableau, et les valeurs qu'on peut avoir dans ce tableau, c'est True ou False ( Vrai ou Faux). C'est donc un tableau de booléens.
L'instruction if premiers[p] : peut paraître bizarre. En principe, dans une instruction, il y a un verbe, et ici, il n'y a pas de verbe. Habituellement , on dit : si Paul est plus grand que Pierre alors , ou encore si x est égal à 3 alors
Et ici, on dit un truc du genre : si x alors ( le symbole deux-points peut être traduit par alors )
C'est un raccourci ; la phrase complète est : si x=Vrai alors ou encore : if premiers[p]=True :
Donc à chaque fois que tu vois un IF sans symbole < ni > ni = sur la ligne, tu peux considérer qu'il faut ajouter =True pour compléter la ligne.
Il y a une logique derrière ça, c'est tout à fait normal que ce raccourci soit accepté... mais on ne va pas entrer dans cette discussion.Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. Benjamin Franklin -
Bonjour,
Le même programme légèrement modifié, tu n'as qu'à copier/coller:def Eratosthene(n): Tab=[] premiers=n*[True] premiers[0]=premiers[1]=False for p in range(2,n): if premiers[p]: Tab.append(p) for i in range(p*p,n,p): premiers[ i]=False return Tab T=Eratosthene(1000) print(T)
Cordialement,
Rescassol -
@Rescassol.
En effet, votre programme donne quelque chose de plus joli.
Après je vais m'acheter un bouquin de Python pour connaitre les commandes j'essaie juste d'avancer un peu sur le programme car le CAPES arrive bientôt. -
J'ai une question.
Le livre dit que si $p^2 \geq n$ on peut arrêter l'algorithme.
Mais il faut ajouter quoi comme commande pour l'arrêter ? -
Bah tu peux arrêter ta boucle à la partie entière de $\sqrt n$ au lieu de $n$.
-
D'accord merci.
-
Je reviens sur ce sujet, je pense ne pas avoir compris la commande
for i in range(p*p,n,p)
Par exemple, si $n=20$ et $p=2$ que fait cette commande ? -
range(4,20,2)
est la liste des entiers obtenue en partant de 4, en allant de 2 en 2, et en continuant tant que l'entier est <20. C'est donc :>>> range(4,20,2) [4, 6, 8, 10, 12, 14, 16, 18]
Si on le met dans une boucle, cela fait parcourir à i toutes les valeurs de la liste précédente et exécuter pour chaque valeur la ou les instructions qui suivent. La syntaxe complète est :for i in range(p*p,n,p): < une instruction ou un bloc d'instructions où i intervient sans doute >
-
Merci ! Je viens de comprendre la logique.
En effet, si $p$ est premier on doit barrer tous les multiples stricts de $p$.
Pour $p=2$ les multiples sont $2 \times 3=6 = 2^2+2$ puis $2 \times 4 =8=2^2+2+2$ puis $2 \times 5 =10=2^2+2+2+2$ -
C'est vrai, mais tu as pris comme exemple p=2. Or p=2 est très mal choisi, il ne permet pas de voir toute la subtilité du truc.
Prenons comme exemple p=13, et prenons n=500 pour avoir un peu plus de données.
la boucle for i in range(p*p,n,p) va donner :
i=169 , puis i=182 , 195, 208 etc etc et on va dire pour tous ces nombres : ces nombres ne sont pas premiers.
On commence à 13*13=169 ; inutile de commencer par 13*2 ou 13*3 ou 13*4 ou ... . Pourquoi ? Parce qu'on a l'assurance que tous les multiples de 2 ou 3 ou 4 ont déjà tous le flag 'Faux'
Et dans ta liste des multiples de 2 qui sont traités, tu n'as pas parlé du 1er d'entre eux : 2²Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. Benjamin Franklin -
Bien vu Lourran en effet !
Connectez-vous ou Inscrivez-vous pour répondre.
Bonjour!
Catégories
- 163.2K Toutes les catégories
- 9 Collège/Lycée
- 21.9K Algèbre
- 37.1K Analyse
- 6.2K Arithmétique
- 53 Catégories et structures
- 1K Combinatoire et Graphes
- 11 Sciences des données
- 5K Concours et Examens
- 11 CultureMath
- 47 Enseignement à distance
- 2.9K Fondements et Logique
- 10.3K Géométrie
- 65 Géométrie différentielle
- 1.1K Histoire des Mathématiques
- 68 Informatique théorique
- 3.8K LaTeX
- 39K Les-mathématiques
- 3.5K Livres, articles, revues, (...)
- 2.7K Logiciels pour les mathématiques
- 24 Mathématiques et finance
- 314 Mathématiques et Physique
- 4.9K Mathématiques et Société
- 3.3K Pédagogie, enseignement, orientation
- 10K Probabilités, théorie de la mesure
- 773 Shtam
- 4.2K Statistiques
- 3.7K Topologie
- 1.4K Vie du Forum et de ses membres