Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 15-03-2019 14: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 14:22:32

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : diviseur d'un entier sous Python

Re,

Nelcar a écrit :

pour moi (mais j'ai un gros doute) a est le nombre que l'on veut diviser

Pourquoi tant de pessimisme ?
C'est vrai !

Nelcar a écrit :

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 14: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 15: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 15:49:08

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

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 16: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 16:47:20

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

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 22: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 07:41:01

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

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

def nbpremier(a):
   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...

def nbpremier(a):
    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" :

def nbpremier(a):
    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 10: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 11: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 14: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 19:26:01

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

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 13: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 14:23:59

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

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 15: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 15: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 17:07:20

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

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

from math import sqrt

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 >>> :

>>> 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 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.

>>> nbpremier(1040409)
'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 21: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 16: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 18:00:32

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

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 18:32:25)


Arx Tarpeia Capitoli proxima...

Hors ligne

Pied de page des forums