Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 9241
Réponses : 17
Type : discussion
Etat : réponses autorisées

Spé Maths: décomposition en facteurs premiers

Métalocif le 09/10/2011 à 13:17
Un programme pratique et rapide pour les Terminales S. glasses.gif
Voila le code:
Code
ClrHome
Input"Votre Nombre?",X
2->Y
While 1
If X/Y=iPart(X/Y)
Then
If Y=2 or Y=3 or Y=5 or Y=7 or Y=11 or Y=13 or Y=17 or Y=19 or Y=23 or Y=27 or Y=29 or Y=31 or Y=37 or Y=41
Then
Disp Y
X/Y->X
Pause
End
Else
Y+1->Y
End
If Y>41 or Y=1
Then
If X[différent de]1
Disp X
Output(1,1,""
Stop
End
End


Voilà! Je l'ai mis dans une compilation de programmes de maths donc je ne sais pas quel est son poids,mais il n'est pas bien lourd...
Il peut sans doute être amélioré,donc n'hésitez pas à me faire part de vos idées.
Métalocif
azerty1 le 09/10/2011 à 13:30
Sympa happy.gif
J'en avais fait un aussi, mais pas de la même manière, regarde ce topic, on en avait discuté, mais ta méthode est intéressante aussi happy.gif
sandro le 09/10/2011 à 17:47
ça à l'air pas mal mis à part que ça ne prend pas vraiment en compte es nombres premiers suppérieurs à 41.

Sandro
azerty1 le 09/10/2011 à 18:15
Oui, c'est l'inconvénient pour les grands nombres... C'est pour ça, la méthode utilisées dans l'autre topic, est je pense, plus efficace...
sandro le 09/10/2011 à 18:21
Oui, ou alors il faut prolonger la liste des nombres premiers.

Sandro

PS : si certains voudrait bien aller sur [url=espace TI]http://espace-ti.forumactif.com/[/url], on essaye de battre le record de personnes sur le forum (invités et membres confondus)
Métalocif le 10/10/2011 à 12:28
Ouais,mais comme le programme décompose le nombre en partant des plus petits nombres premiers,le temps qu'il arrive jusqu'à 41, le seul facteur premier restant est affiché par le programme puisque c'est le dividende!
En plus cette méthode rend le programme très rapide.
Métalocif
Persalteas le 10/10/2011 à 13:40
41 c'est le max ... qu'est-ce qui pourrait atteindre ou dépasser "le" 42...
godgrace.gif
sandro le 10/10/2011 à 18:34
C'zte vrai que la plupart du temps la méthode est efficace, sauf si l'on a deux facteurs premiers suppérieurs à 41.

Sandro
tonio 2 le 01/11/2011 à 23:45
Sinon j'ai crée un autre programme qui donne rigouresement pour chaque nombre ( sauf 1 mais venez pas m'embetter avec ca svp :p ) dont les facteurs ne sont pas trop grand ( sinon problème de mémoire cry.gif ) chacun de ses facteurs

Code

EffEcr
EffListe L1
Input "NBR A FACTORISER",N
2->A
0->F
Lbl 1
If partDec (N/A)=0
Then
F+1->F
A->L1(F
N/A->N
If N=1
Goto 2
Goto 1
Else
A+1->A
Goto 1
End
Lbl 2
If F=1
Then
Disp "PREMIER"
Else
Disp L2
End


bon fait à l'arrache avant d'aller me coucher si on peut optimiser, dites le happy.gif
The K le 02/11/2011 à 10:25
Huhu sinon ... il y a moyen de raccourcir encore ...
Ce programme n'est pas de moi (source : http://www.siteduzero.com/tuto[...]composeur.html, tutoriel de mdr1 sur le ti-basic ), mais il marche parfaitement winkle.gif


Code

:{1→L1
:1→C
:Input "dec ",A
:For(B,2,√(A
:While not(fPart(A/B
:B→L1(C
:C+1→C
:A/B→A
:End
:End
:If A≠1:A→L1(C
:L1 
sandro le 02/11/2011 à 19:27
on peut même l'améliorer encore un petit peu (en tout cas en place, peut-être pas en vitesse) :
Code
:{1 -> L1
:1 -> C
:Input "dec ",A
:For(B,2,rac(A
:While not(fPart(B[^-1]A
:B -> L1(dim(L1
:B[^-1]A -> A
:End
:End
:If A-1
:A -> L1(dim(L1
:L1


Sandro
The K le 02/11/2011 à 19:31
Ouais ... Mouais ... Tu chipotes un peu la winkle.gif
Et puis même t'es sur d'économiser au moins seul octet ? godgrace.gif
sandro le 02/11/2011 à 19:36
pardon, j'avais simplement ... oublié l'optimisation (j'avais juste remplacé les carractères spéciaux : maintenant c'est 4 octés en moins)

J'ai édité

Sandro
The K le 02/11/2011 à 20:04
Va pour 4 octets en moins winkle.gif

(tu m'impressionnes la quand même t'sais eyeonly.gif )
tonio 2 le 03/11/2011 à 08:57
J'aime bien ton optimisation sandro mais je sais pas pk la calto aime moins ( surtout le A[^-1] winkle.gif

Voila la version finale que j'en ai retenu, un peu plus lourde mais beaucoup plus rapide pour certains nombres
Code

:EffListe L1
:EffEcr
:1 -> C
:Input "dec ",A
:For(B,2,rac(A
:While not(fPart(A/B
:B -> L1(C
:A/B->A
:C+1->C
:If A=1:Goto 1                // gain de vitesse si A=1 avant B=racine de A
:End
:End
:If A-1
:A -> L1(C
:Lbl 1                       // gain de vitesse si A=1 avant B=racine de A
:L1
The K le 03/11/2011 à 18:52
Bon. Conséquence : ne pas toujours optimiser godgrace.gif
Hein Sandro winkle.gif
sandro le 03/11/2011 à 18:58
J'ai vraiment foiré sur ce message (j'ai oublié de changer A et B de place, maintenant ça devrait être bon (j'ai remplacé encore un diviser par un [^-1]).

Sandro
Persalteas le 04/11/2011 à 08:46
+1 the K ... happy.gif

Pas grave Sandro, on t'en veut pas. Rappelle toi que le mieux est l'ennemi du bien . bigmouth.gif