Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermée
#1 15-03-2019 15:01:36
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
diviseur d'un entier sous Python
Bonjour,
mon exercice est :
première partie :
1à à l'aide d'une calculatrice, on a programmé en langage Python la fonction nbdv dont l'argument est un entier nautrel a non nul. (rappel : a%i donne le reste de la division de a par i)
def nbdv(a):
n=0
for i in range(1,a+1):
if a%i==0:
n=n+1
return(n)
dans la console Python j'ai mis
>>> nbdv(7)
2
questions :
a) que signifie l'instruction a%i==0?
je dirai qu'il n'y a pas de reste dans la division de a par i
b) que renvoie nbdv(6)?
dans la console j'ai mis nbdv(6) et j'ai un résultat de 4
>>> nbdv(6)
4
>>>
pour moi (mais j'ai un gros doute) a est le nombre que l'on veut diviser mais je ne comprends pas pourquoi un reste de 4
c) que renvoie cette fonction pour un entier a non nul ?
je ne comprends pas (je dirai le reste de la division)
Merci de m'éclaircir pour cette première partie avant d'aller plus loin.
Hors ligne
#2 15-03-2019 15:22:32
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Re,
pour moi (mais j'ai un gros doute) a est le nombre que l'on veut diviser
Pourquoi tant de pessimisme ?
C'est vrai !
je ne comprends pas pourquoi un reste de 4
C'est normal, n n'est pas le reste...
C'est ceci que tu interprètes mal :
if a%i==0:
n=n+1
Encore une fois, je te renvoie
1. A la lecture de ton post #1, je cite :
rappel : a%i donne le reste de la division de a par i
2. A une traduction en français de :
if a%i==0:
n=n+1
qui pourrait être
si le reste de la division du nombre a par le nombre i est égal à 0 alors :
ajoute 1 au nombre contenu dans n
"Si le reste de la division du nombre a par le nombre i est égal à 0" : comment peux-tu dire ça en français de manière plus "courte" ?
Donc, que représente n ?
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#3 15-03-2019 15:59:38
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Re,
OK pour n qui n'est pas le reste de la division mais je pense est le diviseur de l'entier naturel a non nul.
non je ne sais plus car a est bien le dividende et i le diviseur et a%i le reste , alors le quotient...... je ne sais plus
si a/i =0
je suis encore une fois perdue
MERCI
Hors ligne
#4 15-03-2019 16:34:15
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Re,
en faisant pas mal de calcul je crois que j'ai compris n est le nombre de fois que l'on va trouvé en faisant a/i avec un résultat de O
c'est bien ça
MERCI
Hors ligne
#5 15-03-2019 16:49:08
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Re,
alors le quotient.
Personne ne te le demande !
n est le nombre de fois que l'on va trouvé en faisant a/i avec un résultat de 0
Oui, mais soyons précis : avec un reste de 0.
Et si le reste de la division de a par i est 0, que représente i pour a ?
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#6 15-03-2019 17:27:31
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Re,
le i est le diviseur et le a le dividende , le résultat quotient puis le reste ici 0
donc ici n est le nombre de fois que le a/i a un reste O
MERCI
Hors ligne
#7 15-03-2019 17:47:20
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Re,
Il faut vraiment que je te force la main...
oui mais j'attendais
si a%i==0, i est un diviseur de a : ta fonction s'appelle nbdiv, ce n'est pas un hasard (nb, est mis pour nombre et div..).
51%17 = 0
Donc 17 est un diviseur de 51 (= un nombre qui le divise avec un reste de 0). Tu peux aussi dire que 51 est un multiple de 17.
Ensemble des diviseurs de 7 :
[tex]\mathcal D(7)=\{1,7\}[/tex]
[Hors sujet]
N-B : 7 n'a que deux diviseurs, c'est un nombre premier...
[/Hors sujet]
Arx Tarpeia Capitoli proxima...
Hors ligne
#8 15-03-2019 23:10:19
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Re,
merci pour tes explications claires.
Justement tu as parlé de nombres premiers c'est la deuxième partie de mon exercice qui est :
Ecrire le programme d'une fonction nbpremier d'argument un entier naturel n non nul qui retourne le nombre de nombres premiers inférieurs ou égaux à n. On pourra utiliser la fonction nbdv de la question 1. On rappelle d'un entier naturel a est dit premier si et si seulement s'il a exactement deux diviseurs positifs.
Donc je fais
def nbpremier(n)
n=0
for i in range(2,a+1):
if aù1==0 and i==1 or i==n:
n=n+1
return(n)
je n'y arrive pas sur python.
ja sais que le diviseur 1 doit être égal à 1 ou au nombre avec un reste de 0 mais comment le mettre dans le programme c'est autre chose.
MERCI
Hors ligne
#9 16-03-2019 08:41:01
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Bonjour,
Je ne vais pas être très disponible aujourd'hui : j'aide ma fille à déménager, alors je m'y prends plus tôt...
je n'y arrive pas sur python.
Normal, ceci n'a pas de sens :
if a%1==0 and i==1 or i==n:
n=n+1
Déjà, cette condition if a%1==0 , crois-tu qu'il y ait une chance sur 1 milliard pour qu'elle ne soit pas vérifiée...
Je traduis en français :
si le reste de la division de a par i est égal à 0...
Connais-tu un seul nombre qui ne se divise pas par 1 ?????
Le prof t'a dit : on pourra utiliser la fonction nbdv de la question 1...
Que faisait cette fonction ?
Réponse : elle cherchait le nombre n de diviseurs d'un nombre a...
Et justement, que dit l'énoncé à ce sujet ?
Ça :
On rappelle d'un entier naturel a est dit premier si et si seulement il a exactement deux diviseurs positifs.
Donc
n=0
for i in range(2,a+1):
Et maintenant tu calcules le nombre de diviseurs n du nombre a, comme à la première question :
Sauf que la division par 1 est inutile : 1 est toujours un diviseur...
Donc, on commence la boucle à 2, mais avant on écrit n=1, sinon, il te manquera à la fin un diviseur...
n=1
for i in range(2,a+1):
if a%i==0:
n=n+1
Maintenant, quand tu sors de la boucle, c'est à dire que tu vas être à la verticale de la lettre f de for (même indentation), n contient déjà le nombre de diviseurs...
Tu n'as plus qu'à tester à cet endroit-là le nombre de diviseurs...
Si n==2, la réponse est vraie sinon elle est fausse...
Comme, il y a bcp plus de réponse : FAUX, que de réponse : VRAI, on va, avant la boucle ajouter une variable REPONSE :
REPONSE ="FAUX" :
n=1
REPONSE="FAUX"
for i in range(2,a+1):
if a%i==0:
n=n+1
if....
return (REPONSE)
Qu'y a-t-il après le if ?
Mais, le test pour savoir si n vaut exactement 2 et dans ce cas tu ajoutes : REPONSE="VRAI"
Donc, REPONSE contient "VRAI" si et seulement si n==2, dans le cas contraire, elle continue à valoir "FAUX"...
Traduction en francais :
fonction nbpremier(a);
n=1
REPONSE ="FAUX"
POUR i VARIANT DE 2 A a+1:
Si i est un diviseur de a alors:
ajouter 1 à n
Si n vaut 2 :
REPONSE="VRAI"
renvoie-moi (REPONSE)
>>> nbpremier(19)
'VRAI'
>>> nbpremier(37)
'VRAI'
>>> nbpremier(1679)
'FAUX'
>>>
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#10 16-03-2019 11:34:04
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Bonjour,
Merci pour ta réponse, surtout ce n'est pas pour lundi donc tu as le temps de me répondre. Fais ton déménagement avec ta fille qui est normal.
J'ai essayé de faire ce que tu m'as dit mais moi dans ma console ça me met le nombre de diviseurs avec un reste 0
j'ai fait :
def nbpremier(a):
n=1
REPONSE="FAUX"
for i in range(2,a+1):
if a%i==0:
n=n+1
if n==2:
REPONSE="VRAI"
return(n)
et dans la console j'ai
>>> nbpremier(2052)
24
MERCI ET BON DÉMÉNAGEMENT.
Hors ligne
#11 16-03-2019 12:27:57
- freddy
- Membre chevronné
- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : diviseur d'un entier sous Python
Salut,
c'est normal, il te renvoie la valeur de la variable qui figure dans la commande return (attends yoshi, je ne suis pas compétent en python).
Tu devrais lui demander de renvoyer la "reponse".
Fais attention, il faut que tu fasses défiler $i$ de $2$ à $a$ seulement.
De la considération des obstacles vient l’échec, des moyens, la réussite.
Hors ligne
#12 16-03-2019 15:48:00
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Merci Freddy
oui j'attends Yoshi qui est super doué en Python
mais ce n'est pas urgent, il déménage sa fille ce jour,
on verra un peu plus tard
MERCI ENCORE
Hors ligne
#13 16-03-2019 20:26:01
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Re,
Non, je ne suis pas super doué en Python, j'essaie simplement d'être logique et attentif à ce qu'on me raconte..
Ton return te dit que 2052 a 24 diviseurs...
Ce qui est vrai :
2502 se divise par 1, 2, 3, 4, 6, 9, 12, 18, 19, 27, 36, 38, 54, 76, 108, 114, 171, 228, 342, 513, 684, 1026, 2052
Est ce que c'est ça que tu attends ?
Il me semblait que tu voulais savoir si 2052 était premier...
24 est-il la réponse à ta question ?
Non, tu attends "VRAI" ou "FAUX"...
(Ici, tu dois obtenir : "FAUX")
Quelle est donc la variable qui contient, soit "VRAI", soit "Faux" selon le nombre introduit ?
Alors?
Corrige et tu es au bout de tes peines...
@freddy, non si tu vas si tu prends comme fin, a, dans une boucle Python s'arrête à a-1...
Choquant, pas du tout...
Dans de nombreux langages, la boucle s'arrête bien à a, mais parce que la boucle s'arrête lorsque i = a+1
Par exemple :
for i = 1 to 5 (en BASIC
Exécute une action
next i
Et là, si par curiosité, tu testes la valeur de i, en sortie de boucle, tu obtiens 6.
On s'arrête à 5, parce que la boucle passe à i = 6 et comme 6>5, la boucle s'arrête...
En python, tu fixes la borne d'arrêt à 6, et la boucle s'arrête à 6-1=5...
Note bien que ce ne serait pas faux de choisir comme fin de boucle a et s'arrêter à a-1 au lieu de tester la division par a-1...
Le petit script que le prof leur demande d'écrire est vraiment naïf (et c'est bien normal) parce que je n'ai jamais vu en dehors de a = 2, a-1, diviser a...
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#14 18-03-2019 14:35:39
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Bonjour Yoshi,
je viens de regarder mais je n'y arrive toujours pas
j'ai fait :
def nbpremier(a):
n=1
print("faux")
for i in range(2,a+1):
if a%i==0:
n=n+1
if n==2:
print("VRAI")
return(n)
ça ne fonctionne pas
Merci de ta réponse
Hors ligne
#15 18-03-2019 15:23:59
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Re,
Tu as tout démoli...
Ca, c'était presque correct :
def nbpremier(a):
n=1
REPONSE="FAUX"
for i in range(2,a+1):
if a%i==0:
n=n+1
if n==2:
REPONSE="VRAI"
return(n)
sauf ce que je t'ai mis en rouge...
Là, je suis obligé de te dire que tu manques sérieusement de logique...
Puisque tu ne veux pas que cela te retourne le nombre de diviseurs, alors pourquoi return(n) ? (n contient le nombre de diviseurs !)...
Je te l'ai dit, freddy te l'a dit : tu ne retournes pas la bonne variable !
Tu veux que s'affiche "VRAI" ou "FAUX" ? Alors il faut retourner la variable qui contient "VRAI" ou "FAUX" et pas une autre...
Tu vois pourquoi je te dis que ce n'est pas logique et ce n'est pas un problème d'informatique...
En plus, je lui ai choisi un nom très "parlant" ^_^
Respire un bon coup, écoute 10 min de musique, puis reviens, relis ce que je viens d'écrire et le petit programme et corrige
Alors ?
Arx Tarpeia Capitoli proxima...
Hors ligne
#16 18-03-2019 16:07:11
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Re,
Oui j'ai fait du grand n'importe quoi,
en effet c'est réponse donc j'ai :
ef nbpremier(a):
n=1
REPONSE="FAUX3"
for i in range(2,a+1):
if a%i==0:
n=n+1
if n==2:
REPONSE="VRAI"
et dans la console
>>> nbpremier(5)
'VRAI'
>>> nbpremier(13)
'VRAI'
>>> nbpremier(55)
'FAUX3'
>>>
mais pourquoi à faux j'ai le nombre de diviseurs ?
MERCI ENCORE
return(REPONSE)
Hors ligne
#17 18-03-2019 16:14:11
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
re,
je viens de m'apercevoir le pourquoi
j'ai mis un 3 derrière FAUX
j'ai fait des essais c'est bon
excuses moi
et encore un Grand MERCI
Hors ligne
#18 18-03-2019 18:07:20
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Re,
Dis-toi bien une chose : il n'existe rien de plus idiot qu'un ordinateur ou programme informatique...
Mais ils ont une qualité énorme (qui confine justement à la "bêtise"') : c'est obéissant et discipliné...
Ça ne fait rien d'autre que ce que TU lui dit de faire !' Comme si tu disais à un humain : jette-toi au feu et qu'il le fasse !
Au fait tu comprends ce que fait le petit programme et en quoi, il s"inspire du précédent : nbdv ?...
Et je te le redis, si tu n'es pas sûre d'avoir absolument tout compris, questionne !
Ce petit programme est vraiment stupide (tu n'y peux rien) : as-tu déjà recherché "à la main" si un nb était premier ou pas ?
La première chose qu'on apprend sur ce travail est celle-ci :
si lorsque le quotient devient inférieur au diviseur et que le reste n'a jamais égal à 0, inutile de continuer les divisions votre nombre est premier...
Pourquoi ? Parce que si la division devait se terminer après, elle se serait déjà terminée avant...
Exemple 1819
1819 = 37*49+6
1819 = 41*44+15
1819 = 43*42+13
Supposons
1. Que ma division ne s'est jamais terminée jusqu'à maintenant
2. Que je continue quand même
Et j'arrive à 1819 = 107*17 Ah ! La division se termine quand même, comment se fait-il ? ...
Bin, parce qu'il ne faut pas faire d'erreurs de calculs !
Elle se termine après ? Donc, elle se terminait avant :
En effet, 1917=107 * 17 = 17 * 107. Donc si je prends 17 comme diviseur j'obtiens 107 comme quotient...
Amélioration du programme :
def nbpremier(a):
for i in range(2,a+1):
q=a//i
r=a-q*i
if a%i==0:
return("FAUX")
if q<i:
return("VRAI")
le // c'est le quotient entier (euclidien) : 27/4 =9,75 mais 27//4 = 6
Et ensuite on ajoute même que si q<d alors [tex]q<\sqrt a[/tex]
Nouvelle amélioration et simplification
def nbpremier(a):
fin=int(sqrt(a))+1
REPONSE="VRAI"
for i in range(2,fin):
if a%i==0:
REPONSE="FAUX"
return(REPONSE)
Je dois commencer par dire au programme que que je vais avoir besoin de la racine carrée : sqrt = sq(uare)+(r)oo(t)
root = racine, square = carré(e)
En mode programme enregistré pas de pb...
Si je fais tout en console, alors il faut commencer par
>>> from math import sqrt
puis on colle à partir du d de def une espace après >>> :
fin=int(sqrt(a))+1
REPONSE="VRAI"
for i in range(2,fin):
if a%i==0:
REPONSE="FAUX"
return(REPONSE)
Je calcule la valeur de fin dans la fonction avant la boucle (normal !)
La racine carrée d'un nombre n'est pas toujours un nombre entier, donc, je prends la partie entière (le int) de cette racine +1
(Rappel dans le range, on n'utilise que des entiers ou de variables contenant des entiers)
je dis que ma variable REPONSE vaut "VRAI" avant la boucle
Je rentre dans la boucle, je teste a%i et si a%i==0 alors je dis REPONSE = "FAUX"...
Pus en fin de boucle, je renvoie REPONSE.
'FAUX'
>>> nbpremier(1040411)
'VRAI'
>>>
Ce petit programme comporte encore (plus d') un défaut :
1040409 se divise par 3, donc dès la division par 3, il aurait fallu s'arrêter (le programme avait "trouvé" que ce n'était pas un nombre premier) : le reste des tests était inutile...
Bon et bin alors, il fallait lui dire Stop ! Arrête-toi ! C'est fini ! Dehors ! Sors de la boucle...
Tout ça en un seul mot : break...
Comme ça :
def nbpremier(a):
fin=int(sqrt(a))+1
REPONSE="VRAI"
for i in range(2,fin):
if a%i==0:
REPONSE="FAUX"
break
return(REPONSE)
Mais, il y a encore au moins un gros défaut...
Non ? Tu satures ?...
Bah oui, la programmation pour trouver ça passionnant, faut avoir une certaine forme d'esprit...
Mais alors qu'est-ce qu'on se sent fort et intelligent quand on a obligé le programme à faire (du premier coup, c'est rare) ce qu'on voulait !
Ça demande logique, patience, persévérance, rigueur...
Il y 30 ans, j'ai mis 3 mois pour trouver une "astuce" en 10 lignes de programme qui si on donne un verbe en "ir", n'importe lequel, alors s'affichera s'il est du 2e ou du 3e groupe...
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#19 18-03-2019 22:38:33
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Re,
merci beaucoup, je n'ai pas eu le temps d'y travailler car ce soir j'avais mon conseil de classe. J'ai vu la prof de maths et ma mamy qui était avec moi au conseil lui a parlé de PYTHON, elle lui a avoue qu'elle apprenait en même temps, qu'elle ne savait pas non plus.
Tu comprends pourquoi je galère aussi.
Merci encore, je vais essayer demain ou mercredi ce que tu m'as mis
Bonne soirée
ET UN GRAND MERCI
Hors ligne
#20 19-03-2019 17:35:04
- Nelcar
- Membre
- Inscription : 05-03-2019
- Messages : 159
Re : diviseur d'un entier sous Python
Bonjour,
là tu vas trop loin pour moi. Je n'ai pas compris pourquoi tu as noté 27/4=9,75
Pour ce qui est du programme que j'ai dû faire, je n'ai pas tout compris
je résume ce que j'ai compris
def nbpremier(a): je cherche si le nombre a est premier
n=1 le nombre de diviseur est 1
je met faux si il y a plus de deux diviseurs et le reste 0
si le nombre de diviseurs est 2 je mets VRAI
mais j'ai beaucoup de mal
Merci encore tu es SUPER
Hors ligne
#21 19-03-2019 19:00:32
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 988
Re : diviseur d'un entier sous Python
Re,
Faute de frappe de ma part :
27/4 =6.75 bien sûr.
Désolé...
n=1 le nombre de diviseur est 1
Ta boucle commence à 2...
Supposons que tu aies initialisé n à n=0
Tu testes a=37.
Quand tu arrives à i = 37, n vaut toujours 0
Puis on teste :
a%37 --> reste 0
ok, on fait n=n+1
On sort de la boucle, n vaut 1...
Et là on rencontre ;
if n==2:
REPONSE="VRAI"
Et bien justement n ne vaut pas 2, il vaut 1...
Et alors le programme te dira : "FAUX" au lieu de "VRAI", pourtant 37 est bien premier...
Qu'est-ce qui se passe ?
Il se passe que n'importe quel nombre se divise par i=1 : a%1 =0
Donc
Il y a toujours le 1 comme diviseur, donc si avant d'entrer ta boucle qui commence à i = 2, tu donnes à n non pas la valeur 0 mais 1, lorsque le programme va tester 37 on aura n=1+1 =2 et le nombre de diviseurs est bon...
je met faux si il y a plus de deux diviseurs et le reste 0
Là tu vas un peu vite, pourquoi "et" ?
1. Le but de la boucle est de compter le nombre de diviseurs de a...
2. Et pour savoir si le nombre i est un diviseur de a, il y a la ligne :
if a%i==0:
dont je te rappelle qu'elle se traduit par : si le reste de la division de a par i vaut 0, alors
On cherche le reste... S'il vaut 0, i est bien un diviseur de a et j'ajoute 1 au nombre de diviseurs
if a%i==0:
n=n+1
Et si le reste n'est pas 0, on n'augmente pas n, on saute le n=n+1...
@+
Dernière modification par yoshi (19-03-2019 19:32:25)
Arx Tarpeia Capitoli proxima...
Hors ligne
Pages : 1
Discussion fermée