linkakro le 19/11/2011 à 21:57
Ce sujet est l'aboutissement de celui-ci :
https://tout82.pages-perso.fre[...]age=35205#35205
Merci à
chr4 qui a posé la question à l'origine de mon travail.
FACT_4.83p
FACTZ_4.2.83p dépendant de FACT_4
Ces programmes permettent ensemble de trouver tous les facteurs entiers positifs quelconques dont le produit vaut un nombre fixé.
(Cela peut servir à craquer certains codes...)
X= F1*F2*...*FN
A <= F <=B
Vous choisissez X et N sachant que F est toujours différent de 1.
A et B désigneront l'intervalle de recherche.
Le choix de N est tout l'intérêt de mon programme.
Sinon vous aurez besoin :
- d'alternatives à n'en plus finir
- des boucles à n'en plus finir
EDIT 23/01/2014 : ou bien une autre technique bien plus tordue à élaborer
https://tout82.pages-perso.fre[...].php?sujet=3890
Ils sont
TRES PUISSANTS. Bien plus que tout autre programme crible en Ti-Basic. Le secret de cette puissance tient dans la
RECURSIVITE !!!
-version 2.0 : fonctionne tout simplement
-version 2.2 : quelques astuces
-version 4.1 : gain de temps exponentiel avec une table de diviseurs. Réglé quelques semaines après v2.2 mais timidement gardée vu l'intérêt de l'époque.
-version 4.2 : ommet les combinaisons équivalentes du genre 2*3=3*2. Réglé Hier avec une idée soudaine et pourtant simple.
La récursivité ne vous inspire peut-être rien mais je vous assure que c'est génialissime.
Comparez donc avec le programme de chr4 dans le sujet énoncé au tout début.
Si un jour j'y trouve un autre usage je ferai peut-être un tutoriel spécialisé pour TI.
==== codes :
Code
FACT_4
----
Prompt X,N,A,B
max(A,2->A
min(B,X->B
{0->L2
DelVar C
For(I,1,rac(X
If not(fPart(X/I
Then
C+2->C
I->L2(C-1
X/I->L2(C
End
End
SortA(L2
1+sum(L2<A->A
sum(L2<=B->B
DelVar J
ClrList L1
prgmFACTZ
Code
FACTZ_4.2
----
J+1->J
For(W,A,min(B,sum(L2<=X
J=N->Q
If Q
min(B,sum(L2<=X->W
L2(W->L1(J
fPart(X/L2(W->R
If Qnot(R
Then
L1->L3
SortA(L3
If prod(L1=L3
Pause L1
End
If not(Q+R
Then
X/L2(W->X
prgmFACTZ
J-1->J
sum(L2<=L1(J->W
XL1(J->X
End
End
linkakro le 20/11/2011 à 15:57
Sans la récursivité, il te faut un programme par valeur de N.
Sans elle, il faut imbriquer des boucles dans des boucles et encore dans des boucles...
La récursivité fait la même chose avec un seul programme et une seule boucle.
Code
// 4 facteurs
Prompt X
For(A,2,X
For(B,2,X
For(C,2,X
For(D,2,X
If ABCD=X
Pause {A,B,C,D}
End
End
End
End
Code
// 25 facteurs
Prompt X
For(A,2,X
For(B,2,X
For(C,2,X
For(D,2,X
...
For(Z,2,X
If ABCD ... Z=X
Disp {A,B,C,D, ... ,Z}
End
...
End
End
End
End
Code
// N facteurs , récursif
J+1->J
For(W,2,X
W->L1(J
If J=/=N et ...
prgmFACT // appelle le programme lui-même
If "FINI"
Pause L1
End
Return