1

bonjour,
j'aimerais créer un programme pr TI-84+ qui permette de dire si un nombre est premier ou non, et si la réponse est non, de donner un diviseur (autre que 1 et lui-même).
je pense voir ce qu'il faut demander à la calculatrice: d'abord, lui rentrer le nombre à tester A, puis lui faire diviser ce nombre par tous les nombres premiers n tels que n²<A. l'idée est de lui faire regarder si A/n moins la partie entière de A/n est égal à 0. Dans ce cas, elle devrait afficher "nombre non premier, diviseur: n". sinon, elle doit continuer à tester, et si elle arrive jusqu'à n tel que n²<A, afficher "nombre non premier". Evidemment, elle ne pourra pas tester de façon infinie. je pense rentrer les 100 premiers nombres premiers dans une liste. si elle n'arrive à aucun résultat avec ces 100 n différents, il faudrait qu'elle affiche quelque chose comme "nombre à tester trop grand".
Déjà, est-ce que ce raisonnement est juste?
Et... comment l'exprimer dans un programme (c'est une des premières fois que j'en fais, et celui-là ne me semble pas tout facile car plutôt fastidieux...).
Merci à celles et ceux m'aideront!
chimiepower

2

Le raisonnement est tout à fait juste. Cependant, comme on ne peut pas rentrer un nombre infini, tu n'est pas obligé de limiter le nombre de tests.



Avec un légère modif sur le "n²<A", voilà la traduction en programme de calculette:

:ClrHome ## "Nettoyer l'écran"
:input "Nombre:",A ## Demande un nombre et le rentre dans A.
_ _
:For(N,2,√A +1) ## Pour un nombre N, de 2 à √A + 1, faire:
:if Int(A/N)=0 ## Si la partie entière de A/N vaut 0,
:Then ## Alors
:Print "Diviseur",N ## Afficher que N est diviseur
: Stop ## Terminer le programme
:End ## Fin du Si: le code qui suit est exécuté dans tous les cas (en temps normal), mais comme là on a terminé le programme dans le cas ou la condition est vraie, ce code n'est exécuté que si la condition est fausse.
:End ## Fin du For.
:Print "C'est un nombre premier."

3

Merci gon33!
en changeant la 4ème ligne en (A/N)-int(A/N), ça marche très bien!

4

Oui, c'est vrai qu'il y avait une erreur^^
C'était avec plaisir...
Continue de programmer!

5

maia (./1) :
tous les nombres premiers n tels que n² < A

C'est n² <= A
maia (./1) :
et si elle arrive jusqu'à n tel que n²<A

là c'est n² >A, mais je crois que c'est ce que tu voulais dire.


gon33> ta méthode est très bourine, ça ne sert à rien de tester les nombre non-premiers..
Une bonne méthode si l'on veut un peu plus d'information est de remplir progressivement un tableau des premiers nombres premiers, et en prime t'a toute la liste pour un meilleur temps.

Sinon on peut sauter les non-premiers évident (pair >2 pour commencer), ça fait déjà gagner bcp..
«Les gens exigent la liberté d’expression pour compenser la liberté de pensée qu’ils préfèrent éviter.» - Sören Kierkegaard

La République, c’est comme la syphilis : quand on l’a attrapée, soit on se fait sauter le caisson, soit on essaie de vivre avec.

6

Ce serait quel genre, ton algo? (je suis déjà au courrant pr les entiers pairs, mais là le but c'était de faire simple...)

7

tu peux pas modifier à l'infini le pas donc faut arriver à faire des tests de divisibilités.
si t'a bien implémenté ces test, ça va beaucoup plus vite que de faire la grosse division. Bon en ti-basic ça doit pouvoir se discuter..

Sinon l'autre méthode c'est le crible d'érathosthène quoi, mais bon c'est utile que si tu veux plus de choses

Enfin une bonne mothode de tricheur c'est de tabuler les quelques premiers nombres premiers, ça gagne bcp..

edit: fr..
«Les gens exigent la liberté d’expression pour compenser la liberté de pensée qu’ils préfèrent éviter.» - Sören Kierkegaard

La République, c’est comme la syphilis : quand on l’a attrapée, soit on se fait sauter le caisson, soit on essaie de vivre avec.

8

(Eratosthène)
Ouais, ça a l'air sympas et je connaissait pas...

9

Bon d'après un rapide calcul pifomètrique faut dans les n/log(n) divisions pour ératosthène alors que la méthode diviser par chaque nombre est au pire en sqrt(n).

mais bon si tu code bien ératosthène (ie t'a un tableau ou l'indice représente le nombre et tu check avec 0/1 la primalité en faisant à chaque fois des multiplications -- tu fais t[j*i] = 0; --, pas des divisions ) ça doit limite être plus performant pour des nombres qui vont bien ( pas trop petit, et pas trop grand). Sans compter tout ce que t'a en plus.
«Les gens exigent la liberté d’expression pour compenser la liberté de pensée qu’ils préfèrent éviter.» - Sören Kierkegaard

La République, c’est comme la syphilis : quand on l’a attrapée, soit on se fait sauter le caisson, soit on essaie de vivre avec.