Forum

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

FACTEURS avec du RECURSIF

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
sandro le 19/11/2011 à 22:12
ça a l'air pas mal, mais :
-pourrais-tu expliquer ce qu'il faut mettre pour A et B?
-c'est que pour des entiers ou aussi des réels?

Sandro
linkakro le 19/11/2011 à 22:47
F est un entier positif compris entre A et B.
Généralement on pose A=2 et B=X
(message précédent corrigé)

D'autre part je tenterai peut-être de commenter ce code comme la v2.2 mais j'hésite vu la complexité actuelle... et l'âge de certaines bribes de mon code.
sandro le 19/11/2011 à 22:55
Merci, je teste
Polymorph le 20/11/2011 à 13:06
Salut,

J'ai lu un peu le programme et le sujet précédent, mais n'ai pas compris clairement :
- Qu'est-ce que la récursivité?
- En quoi est-ce si puissant?
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
Polymorph le 20/11/2011 à 18:00
Hum, intéressant.

Et à part à faire une prouesse mathématique, ça sert à quoi de trouver le produit de N facteurs successifs qui te donnent X?
Persalteas le 20/11/2011 à 18:56
Attends d'en avoir besoin et tu sauras.

Moi ça m'a servi plusieurs fois a des moments ou je m'y attendais pas.

Linkakro, tu es un Dieu des Maths. ou presque.