π
<-
Chat plein-écran
[^]

Déterminer le nième nombre premier.

:32tins: :32tinsktpb: :32tinsktpn: :32tinscas: :32tinstpkc: :32tinstpktpb: :32tinstp: :32tinscastp: :32tinscmc: :32tinscx: :32tinscxcas:

Déterminer le nième nombre premier.

Message non lude ggauny@live.fr » 07 Mar 2021, 15:58

PourTi.JPG
PourTi.JPG (26.26 Kio) Vu 1883 fois
Bonjour,

Cherchant à "maîtriser" ma Ti_Nspire CX II T CAS, j'étudie le livret Ti-codes et je rencontre un problème :
au lieu de trouver 17573 comme indiqué sur l'exercice, j'obtiens 17161. Je n'ai aucune erreur dans la recopie du code Ti donné en exemple.
Si quelqu'un peut m'aider... merci d'avance.
Avatar de l’utilisateur
ggauny@live.frPremium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Prochain niv.: 43.4%
 
Messages: 283
Inscription: 11 Mar 2015, 20:43
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Déterminer le nième nombre premier.

Message non lude Afyu » 07 Mar 2021, 16:11

Bonjour,

À la ligne 5, la borne floor(sqrt(n)) n'est pas suffisante et doit être remplacée par floor(sqrt(n))+1 afin que la boucle for prenne les valeurs jusqu'à floor(sqrt(n)) inclus !

En insérant la ligne print(N,ep(N)) dans la boucle while, on constate que tous les entiers compris entre 3 et 9 inclus sont considérés comme premiers avant correction de l'erreur.

D'ailleurs, étant donné que l'on commence avec l'initialisation N=2, les lignes 3 et 4 if n<=1:return 0 deviennent inutiles. On ne vérifie la primalité qu'à partir de 3, finalement, puisque la boucle while commence par un N+=1 qui passe la valeur stockée dans la variable N à 3 et le premier test ep(N) est alors effectué avec N=3.
Dernière édition par Afyu le 07 Mar 2021, 16:25, édité 1 fois.
Avatar de l’utilisateur
AfyuVIP++
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 90.8%
 
Messages: 350
Images: 18
Inscription: 30 Oct 2019, 19:17
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: plutôt, oui :)

Re: Déterminer le nième nombre premier.

Message non lude critor » 07 Mar 2021, 16:23

Merci @Afyu. :)

Cela n'a pas l'air de déclencher de problème ici, mais le for k in range(2,floor(sqrt(n))) me semble également très maladroit.

La valeur retour de sqrt(n) est un flottant et donc une valeur pas forcément exacte, et le test d'arrêt de la boucle est donc une comparaison d'un entier à la partie entière d'un flottant possiblement approché.
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 42.3%
 
Messages: 41494
Images: 14632
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Déterminer le nième nombre premier.

Message non lude Afyu » 07 Mar 2021, 16:28

critor a écrit:Merci @Afyu. :)

Cela n'a pas l'air de déclencher de problème ici, mais le for k in range(2,floor(sqrt(n))) me semble également très maladroit.

La valeur retour de sqrt(n) est un flottant et donc une valeur pas forcément exacte, et le test d'arrêt de la boucle est donc une comparaison d'un entier à la partie entière d'un flottant possiblement approché.

Tu veux dire, par exemple, que si la racine carrée de 9 est évaluée à 2.9999999996 alors comme la partie entière de cette estimation est 2, le dernier test effectué sera la division euclidienne de 9 par 2, qui donne un reste différent de 0. Le test de la division euclidienne de 9 par 3 (qui donne un reste nul, et indique donc que 9 n'est pas premier) n'étant pas effectué, le nombre 9 sera estimé comme étant premier, alors qu'il ne l'est pas.

On pourrait alors remplacer par for k in range(2,floor(sqrt(n))+2) afin d'être sûr de ne pas oublier une valeur à tester. Que proposes-tu, sinon ?
Dernière édition par Afyu le 07 Mar 2021, 16:32, édité 1 fois.
Avatar de l’utilisateur
AfyuVIP++
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 90.8%
 
Messages: 350
Images: 18
Inscription: 30 Oct 2019, 19:17
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: plutôt, oui :)

Re: Déterminer le nième nombre premier.

Message non lude ggauny@live.fr » 07 Mar 2021, 16:32

Je trouve 17497 au lieu des 17573 qui est le 2020ème nombre premier.
Pourtant j'ai bien corrigé comme vous me le dites.

Merci aussi Critor, je vais essayer +2.

Oui cela fonctionne, j'ai bien 17573. Il faudrait le dire à Ti peut-être ?
Dernière édition par ggauny@live.fr le 07 Mar 2021, 16:36, édité 1 fois.
Avatar de l’utilisateur
ggauny@live.frPremium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Prochain niv.: 43.4%
 
Messages: 283
Inscription: 11 Mar 2015, 20:43
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Déterminer le nième nombre premier.

Message non lude critor » 07 Mar 2021, 16:33

Afyu a écrit:
critor a écrit:Merci @Afyu. :)

Cela n'a pas l'air de déclencher de problème ici, mais le for k in range(2,floor(sqrt(n))) me semble également très maladroit.

La valeur retour de sqrt(n) est un flottant et donc une valeur pas forcément exacte, et le test d'arrêt de la boucle est donc une comparaison d'un entier à la partie entière d'un flottant possiblement approché.

Tu veux dire, par exemple, que si la racine carrée de 9 est évaluée à 2.9999999996 alors comme la partie entière de cette estimation est 2, le dernier test effectué sera la division euclidienne de 9 par 2, qui donne un reste différent de 0. Le test de la division euclidienne de 9 par 3 (qui donne un reste nul, et indique donc que 9 n'est pas premier) n'étant pas effectué, le nombre 9 sera estimé comme étant premier, alors qu'il ne l'est pas.

On pourrait alors remplacer par for k in range(2,floor(sqrt(n))+2) afin d'être sûr de ne pas oublier une valeur à tester. Que proposes-tu, sinon ?

Merci, oui c'est ce que je crains. Ta correction évite en effet le problème, mais aurait l'inconvénient de faire une itération supplémentaire bien souvent inutile.

Personnellement, je proposerais de rester sur des entiers et donc de passer à une boucle Tant que :
while(k**2 <= n):
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 42.3%
 
Messages: 41494
Images: 14632
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Déterminer le nième nombre premier.

Message non lude Bisam » 07 Mar 2021, 16:40

Une boucle "while" permet de rester dans les nombres entiers.
Deux possibilités :
Code: Tout sélectionner
def ep(n):
    if n <= 1:
        return 0
    k = 2
    while k*k < n:
        if n%k == 0:
            return 0
        k += 1
    return 1

Cette possibilité oblige à calculer le carré de de k à chaque itération.
On peut remplacer cela par une addition de la façon suivante :
Code: Tout sélectionner
def ep(n):
    if n <= 1:
        return 0
    k = 2
    k2 = 4
    while k2 < n:
        if n%k == 0:
            return 0
        k += 1
        k2 += 2*k + 1
    return 1


[EDIT] J'ai modifié les codes précédents suite à la remarque de Parisse un peu plus bas.
Avatar de l’utilisateur
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 69.6%
 
Messages: 5665
Inscription: 11 Mar 2008, 00:00
Localisation: Lyon
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Déterminer le nième nombre premier.

Message non lude Afyu » 07 Mar 2021, 16:46

Bisam a écrit:On peut remplacer cela par une addition de la façon suivante :
Code: Tout sélectionner
def ep(n):
    if n <= 1:
        return 0
    k = 2
    k2 = 4
    n2 = n*n # pour le calculer une seule fois
    while k2 < n2:
        if n%k == 0:
            return 0
        k += 1
        k2 += 2*k + 1
    return 1

Les lignes 10 et 11 doivent être interverties, non ?
Avatar de l’utilisateur
AfyuVIP++
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 90.8%
 
Messages: 350
Images: 18
Inscription: 30 Oct 2019, 19:17
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: plutôt, oui :)

Re: Déterminer le nième nombre premier.

Message non lude critor » 07 Mar 2021, 16:50

Merci beaucoup @Bisam pour cette nouvelle amélioration. :)
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 42.3%
 
Messages: 41494
Images: 14632
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Déterminer le nième nombre premier.

Message non lude Bisam » 07 Mar 2021, 17:46

Bonne remarque d'Afyu. Il faut soit intervertir les lignes 10 et 11, soit mettre un 2*k - 1 à la place du 2*k + 1.
Un peu trop de précipitation de ma part.
Avatar de l’utilisateur
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 69.6%
 
Messages: 5665
Inscription: 11 Mar 2008, 00:00
Localisation: Lyon
Genre: Homme
Calculatrice(s):
MyCalcs profile

Suivante

Retourner vers Problèmes divers / Aide débutants

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 29 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1504 utilisateurs:
>1467 invités
>32 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)