π
<-
Chat plein-écran
[^]

Déterminer le nième nombre premier.

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

Déterminer le nième nombre premier.

Unread postby ggauny@live.fr » 07 Mar 2021, 15:58

PourTi.JPG
PourTi.JPG (26.26 KiB) Viewed 545 times
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.
User avatar
ggauny@live.frPremium
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 15.6%
 
Posts: 110
Joined: 11 Mar 2015, 20:43
Gender: Not specified

Online

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

Unread postby 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.
Last edited by Afyu on 07 Mar 2021, 16:25, edited 1 time in total.
User avatar
AfyuVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 63.3%
 
Posts: 225
Images: 17
Joined: 30 Oct 2019, 19:17
Gender: Male
Calculator(s):
Class: plutôt, oui :)

Online

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

Unread postby 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
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 13.6%
 
Posts: 37170
Images: 10320
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti
GitHub: critor

Online

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

Unread postby Afyu » 07 Mar 2021, 16:28

critor wrote: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 ?
Last edited by Afyu on 07 Mar 2021, 16:32, edited 1 time in total.
User avatar
AfyuVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 63.3%
 
Posts: 225
Images: 17
Joined: 30 Oct 2019, 19:17
Gender: Male
Calculator(s):
Class: plutôt, oui :)

Online

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

Unread postby 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 ?
Last edited by ggauny@live.fr on 07 Mar 2021, 16:36, edited 1 time in total.
User avatar
ggauny@live.frPremium
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 15.6%
 
Posts: 110
Joined: 11 Mar 2015, 20:43
Gender: Not specified

Online

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

Unread postby critor » 07 Mar 2021, 16:33

Afyu wrote:
critor wrote: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
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 13.6%
 
Posts: 37170
Images: 10320
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti
GitHub: critor

Online

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

Unread postby Bisam » 07 Mar 2021, 16:40

Une boucle "while" permet de rester dans les nombres entiers.
Deux possibilités :
Code: Select all
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: Select all
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.
User avatar
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 52.1%
 
Posts: 5562
Joined: 11 Mar 2008, 00:00
Location: Lyon
Gender: Male
Calculator(s):

Online

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

Unread postby Afyu » 07 Mar 2021, 16:46

Bisam wrote:On peut remplacer cela par une addition de la façon suivante :
Code: Select all
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 ?
User avatar
AfyuVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 63.3%
 
Posts: 225
Images: 17
Joined: 30 Oct 2019, 19:17
Gender: Male
Calculator(s):
Class: plutôt, oui :)

Online

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

Unread postby critor » 07 Mar 2021, 16:50

Merci beaucoup @Bisam pour cette nouvelle amélioration. :)
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 13.6%
 
Posts: 37170
Images: 10320
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti
GitHub: critor

Online

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

Unread postby 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.
User avatar
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 52.1%
 
Posts: 5562
Joined: 11 Mar 2008, 00:00
Location: Lyon
Gender: Male
Calculator(s):

Next

Return to Problèmes divers / Aide débutants

Who is online

Users browsing this forum: No registered users and 15 guests

-
Search
-
Social
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Découvre les nouvelles fonctionnalités en Python de l'OS 5.2 pour les Nspire CX II
Découvre les nouvelles fonctionnalités en Python de l'OS 5.5 pour la 83PCE/84+C-T Python Edition
Omega, le fork étendant les capacités de ta NumWorks, même en mode examen !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
467 utilisateurs:
>442 invités
>19 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)

-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)