Poster un nouveau sujet Poster une réponse
PPCM seul.
Auteur Message
monsaibert
Invité
Posté le : Sam 04 Fév 2012, 19:18   Citer 

bonsoir,

PPCM directement par decomposition en facteurs premiers.Pour simplifier, dans un premier temps on fera uniquement avec les facteurs premiers 2 et 3.
1ère phase decomposer un nombre A en facteurs premiers.

Imput A
0 -> s
While PartDec(A/2)=0
A/2-> A
S+1-> S
0-> P
While PartDec(A/3)=0
A/3-> A
P+1->P
end
end
S,P

si on demande P seul ou S seul ça marche si on demande S et P on n'obtient qu'un seul (puissance du facteur prem ier).

Rq: Test sur un "bloc" pas de problème.

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Sam 04 Fév 2012, 19:38   Citer 

Pourquoi pas mais le problème est qu'il faudra écrire ces boucles pour tous les diviseurs premiers.
Tu es proche de la méthode classique de décomposition mais il te manque encore l'usage d'une boucle autour de tout ça qui commanderait quel diviseur tester.

Des programmes de décomposition en facteurs premiers et détermination de diviseurs, il y en a beaucoup dont tu peux t'inspirer pour t'améliorer le plus possible.
Tu pourras parmi eux trouver les miens dont je suis assez fier. (via des sujets ou via ma signature)

----
Je pense qu'il trop lourdingue d'utiliser une décomposition pour déterminer un ppcm. On peut même le calculer à partir du pgcd qui, lui, est facile à trouver.
Et sinon les fonctions pgcd et ppcm sont prévues par les TI dès la 82stat.

edit:
Code
Prompt A,B
AB->C
While B
A-ent(A/B)*B->R
B->A
R->B
End
Disp C/A

Cela calcule le pgcd puis en déduit le ppcm.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsalbert
Invité
Posté le : Mar 07 Fév 2012, 17:57   Citer 

Mon but est de pouvoir calcculer le PPCM sans avoir le PGCD. Bien sûr ce programme ne m'interesse que sur son principe. J'y propose que 2 facteurs premiers 2 et 3. La suite serait identique et sans fin..De toute façons on serait obligé de les passer dans l'ordre croissant.
La 2ème methode avec le PGCD,vu ce qu'on a fait sur le sujet (et ce code que tu proposes ) ne pose pas de difficulté.

Aussi dans le code que j'affiche comment se fait-il qu'on n'obtienne pas les 2 puissances mais seulement la 1ère (celle de 2)?

Rq ; où se trouvent tes programmes dont tu parles

  Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Mar 07 Fév 2012, 17:59   Citer 


Citer : monsalbert
Mon but est de pouvoir calcculer le PPCM sans avoir le PGCD. Bien sûr ce programme ne m'interesse que sur son principe. J'y propose que 2 facteurs premiers 2 et 3. La suite serait identique et sans fin..De toute façons on serait obligé de les passer dans l'ordre croissant.
La 2ème methode avec le PGCD,vu ce qu'on a fait sur le sujet (et ce code que tu proposes ) ne pose pas de difficulté.

Aussi dans le code que j'affiche comment se fait-il qu'on n'obtienne pas les 2 puissances mais seulement la 1ère (celle de 2)?

Rq ; où se trouvent tes programmes dont tu parles



  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mar 07 Fév 2012, 23:05   Citer 

Mon programme DECOMPO est périmé dans les sujets où je l'ai posté voire même dans sa version à telécharger...
Parfois j'ai même abandonné certaines options.

DIV ne concerne pas directement ton problème.

Je poste une version simplifiée de decompo afin que tu comprennes mieux la manoeuvre qu'avec la version optimisée.
EDIT : il y a une erreur dans la simplification. Le code ne trouve pas toujours le dernier facteur. Voir prochain message pour une autre simplification et une correction.

Code
Prompt A
ClrList L1
DelVar U
While 0=fPart(A/2  // teste 2
U+1->U
2->L1(U
A/2->A
Disp W
End

 // ce for teste les diviseurs impairs (deux fois plus rapide)
For(W,3,rac(A),2 // rac(A) pas recalculé donc pas de problème de mise à jour
While not(fPart(A/W  // correspond à tes while, W remplace 2,3,5...
U+1->U
W->L1(U)
A/W->A
Disp W
End
If A=1
Goto 1
End
Lbl 1
Pause L1



----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Ven 10 Fév 2012, 19:15   Citer 

bonsoir linka,

- c'est dur! pour l'instant c'est l'analyse - du mot à mot-. Il y a de nouveaux termes et de nouvelles procedures.

- j'ai remplacé
ClrList par EffListe
DelVar par Effacer
fPart par partDec

rac(A) ( dans For ) par le signe racine carrée ( à partir de seconde )

Quoiqu'il en soit la TI bloque sur For (W,3, rac de A,2. lors des essais.

Si tu pouvais expliquer un peu le chemin..

Rq: le Goto 1 il envoie à Lbl 1 ? Goto peut envoyer apres lui ? ( je ne connaissais pas ces 2 instructions )

  Haut de page Bas de page 
 
Cytropus



Autorisation : Membre
Nb de messages : 407
Inscrit le : Lun 07 Nov 2011, 12:09
Posté le : Ven 10 Fév 2012, 19:26   Citer 

La TI peut bloquer peut être parce que tu n'a pas refermé la parenthèse

Le Goto renvoi automatiquement au Lbl correspondant (ou Label) peut importe sa place dans le prog
Par contre cela ralentit les boucles comme While ou For

----------------------
Le nouveau site de tout82
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 10 Fév 2012, 21:10   Citer 

Goto envoie au Lbl du même nom. L'étiquette du Goto est un ou deux caractères alphanumériques.
Pour en savoir un peu plus sur le conflit boucle/goto, consultez mon article là-dessus.

Il faut effectivement refermer la parenthèse autour de A dans rac(A).

La TI peut bloquer si le nombre à décomposer a des facteurs trop grands.
Teste 60 pour voir.

Je veux bien t'expliquer le chemin. (mais vaut mieux pas tout en une seule fois)
Par contre je corrige un problème et effectue une autre simplification.

Code
Prompt A
ClrList L1
DelVar U  // U servira à stocker les facteurs premiers trouvés dans L1
 // ce for teste des diviseurs W
For(W,2,A  // défile tous les diviseurs W de 2 à A
While not(fPart(A/W  // correspond à tes while ; W remplace 2,3,5...
    // not(A) revient à A=0 dans les tests
U+1->U
W->L1(U // stocke le résultat
A/W->A  // stocke le résultat, cela sabre les diviseurs non-premiers plus tard
Disp W
End
If A=1
Goto 1
If W>rac(A  // ajoûté pour résoudre un manque
Then        // sert à éviter les diviseurs suppérieurs au dernier A
A->L1(U+1   // stocke aussi le dernier A (forcément premier)
Disp A
Goto 1
End
End
Lbl 1
Pause L1



----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Mar 14 Fév 2012, 19:15   Citer 

bonsoir linka,

Celà va beaucoup mieux! il y a quelques précisions à apporter.La parenthèse à rac(A) a changé les choses.
. Cependant les essais ( sur le code de mardi 07) donnent des resultats bizarres :
9180 donne bien [ 2^2*3^3*5*17]
17280 donne bien [2^7*3^3*5]
mais 60 affiche [2 2 3] oublie le 5!!..
48 affiche [2 2 2 2] oublie le 3...
ces résultats étant entre crochets et attribables à L1 (pause)
mais que dire des chiffres alignés verticalement à droite ( que j'attribue aux disp ) et qui me paraissent anarchiques ?..

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mar 14 Fév 2012, 20:43   Citer 

Les nombres affichés sur la droite sont les résultats intermédiaires.
Il permettent de s'assurer que le programme n'est pas planté.
Et si un des facteurs est long à trouver, on peut prendre en note quelques résultats en attendant la fin.

====

Quand j'ai posté le message du mardi 7, j'ai retiré des complications de ma version finale. Mais j'ai de toutes évidence commis une ou plusieurs erreurs de simplification.
C'est une astuce indispensable que j'ai voulu ajoûter dans le message du vendredi 10. (en plus d'un simplification supplémentaire)

Je commence à renoncer à certaines pseudo-simplifications. Autant utiliser tout.

remarque :
Cet algorithme fonctionne globalement comme le crible d'ératostène, et d'ailleurs comme le premier code de ce sujet.

propriétés :
- un nombre qui n'a pas de facteur premier suppérieur à sa racine carrée est premier
- un nombre possède un OU aucun facteur premier suppérieur à sa racine carrée.
- la première propriété s'applique aussi au nombre A intermédiaire de mon algorithme en cours de travail

conséquences :
- avoir atteind la racine carré ne signifie pas que les facteurs ont tous été trouvés (prop2) (problème classique que j'ai probablement généré mardi 7)
- prop3-> un W suppérieur à la racine du A intermédiaire prouve que cet intermédiaire est nécessairement premier, et donc est le dernier facteur premier.

aspect pratique :

J'ai tenté d'expliquer le bug du mardi 7 avec la première conséquence mais cela ne suffit pas :
Mon code du mardi 7 s'arrête à la racine carrée alors qu'un des facteurs premiers peut être plus grand que la racine.
Or 5 est plus petit que la racine de 60...

mardi 7 je voulais supprimmer l'usage le la prop3 mais j'ai aussi supprimmé l'usage de la prop2. (il semble)

====

Le code du vendredi 10 devrait être optimal. (testé)
Il utilise la propriété 3 (et 1) pour trouver le dernier facteur.
Si A initial est premier, on trouve bien A comme unique et dernier facteur premier.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsalbert
Invité
Posté le : Jeu 16 Fév 2012, 17:55   Citer 

une satisfaction le bug n'est pas une erreur de "bidouillage" mais un problème de fond et dans ce cas c'est bon ..celà oblige à aller voir "le crible d'ératostène"!..je te remercie : je ne connaissais pas..Par contre le premier jour ou j'ai vu les codes avec "racine de A" j'ai su que c'était un point névralegique. Perçons l'abcés :

"un nombre possède un OU aucun facteur premier suppérieur à sa racine carrée."
ET
"avoir atteind la racine carré ne signifie pas que les facteurs ont tous été trouvés (prop2) (problème classique que j'ai probablement généré mardi 7)"

les deux sont liés. Aurais-tu une doc. precisant cette affaire mathematique ?

On voudrait que le code marche dans tous les cas!

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 16 Fév 2012, 19:15   Citer 

Le code du vendredi 10 fonctionne dans tous les cas.
Je vais écrire un algorithme lisible traduisant clairement celui du vendredi 10.

Code
Saisir A // A initial
Pour W de 2 à A // A initial
Tant que A multiple de W
stocke W dans Liste1
A:=A/W
Afficher W
FinTantQue
Si A=1 // division terminée
Alors Goto 1 // aller à la fin
Si W>rac(A // la valeur actuelle de A est un nombre premier
Alors
Stocke A dans Liste1
Afficher A
Goto 1 //aller à la fin
FinSI
FinPour
Label 1
Afficher Liste1 puis attendre

Pour faciliter les considérations suivantes, j'appellerai A0 la première valeur de A saisie.

* Supposons que "Si W>rac(A" soit vrai
Si A=A0 alors A0 est premier et donc on a trouvé son unique facteur premier c'est-à-dire lui-même.
Si A=/=A0 alors A est premier et donc on a trouvé le dernier facteur premier de A0, c'est-à-dire A.
* Supposons que "Si W>rac(A" soit faux tout au long de l'exercice.
Cela arrive quand A0 est un carré parfait. (je n'en voit pas d'autre)
Si "A=1" est vrai, cela valide la situation de sortie et on a trouvé tous les facteurs premiers.

---
Le fait qu'un nombre qui n'ait pas de facteur premier inférieur à sa racine est démontré dans les cours de maths dès la première, peut-être avant.
(et rappelée en maths spé terminale)
---

J'ai démontré moi-même l'an dernier qu'un nombre ne peut avoir plus d'un facteur premier suppérieur à sa racine carrée. Je ne sais donc pas quelle référence te donner.
Le cas limite est quand son plus grand facteur premier est égal à la racine carrée et donc le multiple est un carré parfait d'un unique nombre premier.

Il y a une embrouille si A0 est un carrée parfait comme 36=2*2*3*3.
Sa racine carrée n'est pas un nombre premier, d'où la distinction des deux tests de sortie.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Ven 17 Fév 2012, 17:55   Citer 

- que W inferieur à rac(A) pas de problème.

- " J'ai démontré moi-même l'an dernier qu'un nombre ne peut avoir plus d'un facteur premier suppérieur à sa racine carrée."
c'est un point serieux. as-tu gardé le document ? Peux tu me le passer ?
Bien entendu celà sous-entend qu'il peut avoir un facteur premier de plus !!..
( le "W inferieur à racine de A" en prend un coup!

- je parle du code du mardi ( je n'ai pas essayé encore le dernier ) je ne vois pas pourquoi 60 et 17280 qui se termine de la même façon avec le même code l'un va jusqu'au bout (17280) et l'autre non (60)

60 /2___17280 /2
30 /2___ .........
15 /3___ 15 /3
5 /5 ___ 5 /5
1 ____ 1 la TI donne 2^7*3^3*5 pour 17280 et 2^2*3 pour 60

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 17 Fév 2012, 21:09   Citer 

Parmi toutes les choses que je n'ai pas su dire simplement précédemment, tu viens de comprendre la plus importante : la possibilité d'un facteur premier suppérieur à la racine et différent de A0.

Le plus délicat est le fait qu'il ne peut y avoir plus d'un facteur suppérieur à la racine.
Montrer qu'il existe des nombres à un facteur premier différent du multiple et suppérieur à leur racine, cela est en revanche facile. Par exemple 6=2*3 et 3>rac(6)=2.4

Je ne me souviens pas de la démonstration complète. Elle est rangée dans un cahier chez moi.
Je n'ai jamais eu de réelle confiramtion de ma démo, mais je n'ai jamais trouvé de contre-exemple.
Je vais tâcher de la retrouver. Elle contient un raisonnement par l'absurde.

=======
code du mardi 7 :

J'ai de nouveau testé mais sans la distinction paire/impaire, et je n'ai plus eu de problème avec le nombre 60. ahh.gif happy.gif

Une chose est sûre : 17280 et 60 n'ont pas la même racine carrée.
Ce n'est donc pas la terminaison qui pouvait provoquer le bug.
==>> En effet For(W,3,rac(A),2) ne calcule rac(A qu'une seule fois au début.
(démonstrations ICI, )

Grande négligence de ma part :
Quand la fonction For effectue le calcul rac(A), ce n'est pas rac(A0) mais rac(A/2^N) car on a déjà divisé A par ses facteurs 2.
Il aurait fallut stocker la racine de A0 dans une variable avant de diviser A0 par 2.

60=2*2*3*5
rac(60)=7.7
rac(3*5)=3.8 <5

Comme dans mes derniers tests je n'avais pas séparé la division par deux, il est logique que je n'ai pas eu de problème tout-à-l'heure avec 60 contrairement aux autres jours.

rappel : on parle bien du code du mardi 7

===

En conclusion, le programme du mardi 7 ne calculait pas une racine juste mais en plus il s'arrêtait à la racine (juste ou non).
(cela causait donc deux problèmes)

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Lun 20 Fév 2012, 18:14   Citer 

J'ai réécrit mes propos mathématique (concernant la propriété du nombre de facteurs suppérieurs à la racine carrée) soit de mémoire soit par recherche.
J'ai essayé d'être rigoureux et clair... ce qui n'est pas mon point fort.

Remarquons que cette propriété répond à une curiosité mais n'est pas exploitée dans la dernière version du programme présentée dans ce sujet.

Une fois cette page tournée nous pourrons exploiter la décomposition en facteurs premiers dans ton projet de départ : déterminer le ppcm sans le pgcd.
Tu signaleras quand tu seras prêt pour la suite.

=========

Soit A un entier naturel suppérieur à 1 qui se décompose en une série de nombres premiers P1,P2,..,Pn.
A=P{1}*P{2}*...*P{n}

Pour n donné, Je note :
R=P{n}
A=PR
Si n>2, Q=P{n-1}
A=PQR


Si n=1
Alors A est premier et n'a qu'un facteur premier suppérieur à sa racine : lui-même

Si n>1
{A=PR
{racA<R
<=> racA<A/P
<=> A<A^2/P^2
<=> AP^2<A^2
<=> P^2<A
<=> P<racA
Donc si un nombre a un facteur premier suppérieur à sa racine alors le produit P de ses autres facteurs est inférieur à sa racine.
Donc si n=2, P est premier et P<racA
Donc si n=2, Il ne peut y avoir qu'un seul facteur premier suppérieur à la racine.


(cette étape est la plus importante et la première que j'ai écrite l'an dernier)
Si n>2 :
A=PQR
Supposons que racA<Q<=R
A<Q^2<=R^2
P*Q*R < Q^2 <= R^2
P < Q^2 /QR <= R^2 /QR
P < Q/R <= R/Q
Or Q <= R donc Q/R <= 1
Donc P<=1
Ceci est absurde car P>1
Donc racA<Q<R est impossible.


Conclusion : un nombre NE peut PAS avoir plus d'un facteur premier suppérieur à sa racine.

-----

n>1
A=PR

0<racA<R
<=> A<R^2
<=> PR<R^2
<=> P<R
Ce qui est tout-à-fait possible mais pas systématique.
De plus cette relation est réciproque pour les entiers positifs.

Démo par l'exemple :
2*3=6
2<rac(6)=2.45<3

Conclusion :
Pour un nombre composé de deux facteurs ou plus, il peut y avoir ou non un facteur suppérieur à sa racine

---

Conclusion globale : un nombre (entier positif suppérieur à 1) a exactement UN OU AUCUN facteur premier suppérieur à sa racine carrée.

============

Autre démo dont je doûte franchement de la rigueure à la dernière équivalence :

{A=PR
{racA<R
<=> racA<A/P
<=> A<A^2/P^2
<=> AP^2<A^2
<=> P^2<A
<=> P<racA
<=> P{1}P{2}...P{n-1}<racA
<=> P{1}<racA et P{2}<racA et ... P{n-1}<racA
car tous les P sont des entiers suppérieurs à 1.

Conclusion : si un nombre a un facteur premier suppérieur à sa racine, alors tous les autres facteurs premiers (s'ils existent) sont inférieurs à la racine.
Donc un nombre ne peut pas avoir plus d'un facteur premier suppérieur à sa racine.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
monsalbert
Invité
Posté le : Mar 21 Fév 2012, 19:28   Citer 

bonsoir linka,
-je rentre de week-end , je n'ai pas bossé ton dernier message. Je te donne les derniers résultats :

concernant ton dernier code

Saisir A // A initial
Pour W de 2 à A // A initial
Tant que A multiple de W
stocke W dans Liste1
A:=A/W
Afficher W
FinTantQue

j'ai fait ( j'espère ne pas trahir ta pensée):

imput A
effliste L1
0-> U
For (W,2,A)
While non(partDec(A/W)
U+1-> U
A/W-> A
W-> L1(U)
end
end
Pause L1

pairs et impairs ensembles ( un peu surpris ) pas de condition (rac A) mais celà marche tès bien. On obtient tout dans les petites valeurs 60,48 , 15,12,10 et même 6,5,et 3 mais dans les nombres plus grands ex: 2160 il faut environ une minute.Pour des nombres plus grands !...

je n'ai pas compris la 2 ème partie de "Si A=1 // division terminée" à "Afficher Liste1 puis attendre " . J'ai essayé de l'introduire dans le code mais celà ne donnait rien.

-- par contre interessé par ton observation justifiée ne pas confondre A0 et A notamment quand on ellimine les nombres pairs le code devient

imput B
B->A
effliste L1
effVar
0-> U
While non(partDec(A/2)
U+1-> U
A/W-> A
W-> L1(U)
end
For(W, 3,rac(B),2)
While non(partDec(A/W)
U+1-> U
.......idem
Là il fonctionne bien mais pas dans les petits nombres
pour 12 il donne 2*2*3
pour 15 il donne 3
pour 10 il donne 2
pour 6 il donne 2
erreur pour 3 ou 5

  Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Mar 21 Fév 2012, 20:36   Citer 

ça a l'air intéressant, mais j'ai plusieuresremarques/questions:
1)
Citer
Soit A un entier naturel suppérieur à 1 qui se décompose en une série de nombres premiers P1,P2,..,Pn.
A=P{1}*P{2}*...*P{n}

Pour n donné, Je note :
R=P{n}
A=PR
Si n>2, Q=P{n-1}
A=PQR


Pourrais tu reexpliqué <e passage s'il te plais, je ne l'ai pas vraiment compris (quelle lettre et quelle notation corespond à quoi)?

2) coté rigueur :

Citer
0<racA<R
<=> A<R^2


Non équivalent : le "0<" n'étant pas gardée, la réciproque n'est pas démontrée vraie (même si elle l'est)

3)Pour la deuxième démo :
soit K le plus grand diviseur premier de A et P{1},P{2},...,P{n-1} les autres diviseurs premiers.
A=K*P{1}*P{2}*...*P{n-1}
Si K>rac(A)
alors A/K<rac(A)
donc rac(A)<P{1]*P{2}*...*P{n-1}
d'où K est le seul diviseur strictement suppérieur à la racine.

Bon, j'ai plus le temps de faire les autres cas.


Sandro

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mar 21 Fév 2012, 21:07   Citer 

monsalbert : tu pouvais recopier le programme du vendredi 10
Désolé de ne pas avoir rappelé que l'algorithme que tu as suivi traduisait lisiblement le code executable. minied.gif

=====

sandro :

1)
Par exemple pour A=2*3*5*7=6*5*7, P=6, Q=5, R=7.
60=2*2*3*5=4*3*5 , P=4 Q=3, R=5
300=2*2*3*5*5=12*5*5 , P=12, Q=5, R=5
375=3*5*5*5=15*5*5 , P=15, Q=5, R=5

Mais si j'ai moins de trois facteurs il serait incorrect de définir Q comme avant dernier facteur si je définit aussi P comme différent de 1.
Par exemple, A=2*3 avec P=2 et R=3.
Si A est premier la question ne se pose pas.

---
3)
C'est sympatique comme manière de faire. bigmouth.gif
Sauf que tu t'es trompé de sens pour la dernière inéquation de ton message. crazy.gif

Le passage d'un produit à un ensemble d'inéquations n'est pas plus montré dans ton message que dans le miens et c'est selon moi ce qui pêche. :S

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Mar 21 Fév 2012, 22:12   Citer 

Ok, sinon pour ma preuve de ta seconde version:
soit K le plus grand diviseur premier de A et P{1},P{2},...,P{n-1} les autres diviseurs premiers, classé par ordre croissant (si n<3, alors on rajoute des 1 en tant que facteurs pour optenir au moins 3 facteurs).
A=P{1}*P{2}*...*P{n-1}*K

Si K>rac(A)alors A/K<rac(A)
donc rac(A)>P{1}*P{2}*...*P{n-1}
d'où K est le seul diviseur strictement suppérieur à la racine (car chaque facteur est supérieur ou égal à 1).

Preuve de la dernière déduction
Supposons P{n-1} supérieur ou égal à rac(A)
on a donc P{n-1}*K > A (en multipliant terme à terme avec K>rac(A) (tout est positif))
or P{1}*P{2}*...*P{n-2} supérieur ou égal à 1
Donc P{1}*P{2}*...*P{n-2} * P{n-1}*K > A (multiplication membres à membres permise car tout est strictement positif)
or P{1}*P{2}*...*P{n-2} * P{n-1}*K=A
d'où A>A, ce qui est absurde
On a donc P{n-1}<rac(A)
pour tout p<n-1, P{p} inférieur ou égal P{n-1}
donc : pour tout p<n-1, P{p}<rac(A)



Si K=rac(A)alors
Donc chaque diviseur premier est inférieur ou égal à rac(A), K étant le plus grand facteur premier.

Si K<rac(A)alors tous les facteurs premiers sont strictement inférieurs à rac(A), K étant le plus grand facteur premier.

Bref, dans tous les cas, seul K peut être strictement suppérieur à rac(A).

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mer 22 Fév 2012, 0:27   Citer 

Quand tu as écris
rac(A)<P{1}*P{2}*...*P{n-1}
ce devait être un copier-coller de ton propre message précédent car il y a exactement la même erreur :
le sens de l'inégalité est inversé par rapport aux autres lignes de la démonstration et cette proposition est le contraire de l'objectif. crazy.gif

Le reste est vachement bien ficelé. bigmouth.gif
La formalisation est ton point fort.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Mer 22 Fév 2012, 20:09   Citer 

J'édite mon second message pour rectifier cette étourderie copiée-collée.

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Lun 27 Fév 2012, 20:09   Citer 

bonsoir linka, sandro

-le rectificatif :
Par exemple pour A=2*3*5*7=6*5*7, P=6, Q=5, R=7.
60=2*2*3*5=4*3*5 , P=4 Q=3, R=5
300=2*2*3*5*5=12*5*5 , P=12, Q=5, R=5
375=3*5*5*5=15*5*5 , P=15, Q=5, R=5... a été salutaire! tout est rentré dans l'ordre. sandro avait raison, c'était l'intro qui méritait précision

Faisons le point 2 codes sont en place
imput B
B->A
effliste L1
effVar U
0-> U
While non(partDec(A/2)
U+1-> U
A/2-> A
2-> L1(U)
end
For(W, 3,rac(B),2)
While non(partDec(A/W)
U+1-> U
W->L1(U)
A/W->A
If A=1
Goto 1
end
Lbl 1
Pause L1 RQ: B = A initial / on traite les W pairs puis W impairs / rac(B) dans For

RAPIDE mais coince sous 15

2 ème code ( le dernier)
imput B
effliste L1
B-> A
0-> U
For (W,2,B)
While non(partDec(A/W
U+1-> U
A/W-> A
W-> L1(U)
end
end
Pause L1

Marche bien sur toutes les valeurs mais ralenti ( our faire 540 met déja 15 secondes) au dessus de 1000 trop de temps!

Lequel choisir ? pour le PPCM il faudra faire 2 nombres et la synthèse.Le 1er est plus rapide mais peut-on trouver une astuce pour les valeurs basses?

  Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 27 Fév 2012, 20:30   Citer 

quand tu dis coince sous 15, tu veux dire que ça ne marche pas si on entre un nombre inférieur à 15?
Si c'est ça, combine les 2, ou alors prévoit les nombres sous 15 sous forme de liste.

Sandro

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mar 28 Fév 2012, 1:16   Citer 

For(W,3,rac(B),2)
Cela paraît logique mais ne remplit pas complètement son rôle.
En effet le For ne calcule cette racine qu'une seule fois au tout début.
Quelques exemples démonstratifs se trouvent dans ce sujet-là.
De plus il peut te manquer le dernier facteur si la sortie est opérée par le For.

Le second code de ton message précédent est la version la plus basique qui soit.

====

Maintenant que nous avons chacun une plutôt bonne maîtrise de la décomposition, je reposte une dernière fois un code avec toutes les astuces viables.
(amélioration supplémentaire par rapport au vendredi 10 )
Mais je commence à ne plus me souvenir des évolutions depuis le début.
Ce fût une erreur de vouloir simplifier dès début du sujet, j'ai juste provoqué des confusions.
Pour éviter la moindre confusion, voici le code final :

Code
// programme le plus récent en matière de décomposition

Prompt A
ClrList L1
DelVar U
While not(fPart(.5A
U+1->U
2->L1(U
.5A->A
Disp 2
End
rac(A->B
For(W,3,A,2
If W>B
A->W
While not(fPart(A/W
U+1->U
W->L1(U
A/W->A
Disp W
rac(A->B
End
If A-1
End
Pause L1

Les astuces retenues dans cette version sont :
-test de la racine carrée de la dernière valeur de A.
-ce test influe sur W mais c'est le reste du programme qui achève la recherche. C'est plus léger et ça évite un goto.
-Le End du For dépend d'un If afin d'éviter un Goto.
-l'arrêt possible par A=1 dans les cas où la racine est innefficace.
-l'usage d'une variable B pour la racine afin d'éviter des calculs récurrents.
-la division préliminaire par 2.
Remarque : l'argument A d'arrêt de For n'a pas d'importance

Ce dernier code est légèrement plus poussé encore que ma dernière version d'avant ce sujet de discussion.

---

Il y eût historiquement des versions dans lesquelles je séparais les while dans un code secondaire.
Cela semblait léger mais c'était peu pratique.
Une autre déclinaison stockait les puissances des facteurs dans une seconde liste. Mais ça ajoûte des trucs pas nets.
C'est la seule chose qu'il reste possible d'ajoûter.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsalbert
Invité
Posté le : Mar 28 Fév 2012, 19:12   Citer 

-> Pour les basses valeurs :

15 donne 3
10 donne 2
6 donne 2
5 donne erreur
3 donne erreur au dessus celà fonctionne bien

-> je vais essayer de refaire le code que tu signales (vendredi 10 ).

C'est vrai que rentrer les puissances de chaque W celà va alourdir.

  Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Mar 28 Fév 2012, 21:32   Citer 

pas forcément tant que ça. si tu fait une liste de 15 termes constitués de la manière suivante (1 pour chaque nombre inférieur ou égal à 15) de la manière suivante : 100000f+10000e+1000d+100c+10b+a avec W=13^f * 11^e * 7^d * 5^c * 3^b * 2^a
puis récupérer le nombre?

Je pense qu'on peut s'en sortir pour en tout cas moins de 150 octés. Après faut voir la différence de vitesse voire si ça vaut le coups par rapport au programme fonctionnant pour n'importe que entier.

Sandro

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mar 28 Fév 2012, 23:57   Citer 

Pour l'instant je juge impossible de déterminer un ppcm sans stocker les résultats de la décomposition avec des puissances.
La gestion des puissances est simple, mais cela nécessite quelques ajoûts.

Je reviens toujours à la détermination du pgcd même après la décomposition en facteurs premiers car la détermination du ppcm passe par la détermination des facteurs communs d'une part et des autres facteurs d'autre part.
Enfin il suffit d'effectuer le produit des nombres puis de diviser par le produit des facteurs communs.
(ce qui revient à la formule classique du ppcm selon le pgcd)


Code
// programme de détermination de ppcm

Prompt A,C
Disp lcm(A,C
AC->T
prgmZDECOMP
C->A
U->D
L1->L3
L2->L4
prgmZDECOMP
1->Z
For(X,1,U
For(Y,1,D
If L1(X)=L3(Y
ZL1(X)^min(L2(X),L4(Y->Z
End
End
Disp T/Z

//////////////////
// programme ZDECOMP

DelVar U
ClrList L1
{0->L2
While not(fPart(.5A
2->L1(1
.5A->A
1->U
1+L2(1->L2(1
End
rac(A->B
For(W,3,A,2
If W>B
A->W
If not(fPart(A/W
Then
U+1->U
0->L2(U
End
While not(fPart(A/W
A/W->A
rac(A->B
W->L1(U
1+L2(U->L2(U
End
If A-1
End

EDITE= suppression de DelVar V et V+1->V ainsi que d'une Then/End devenu innutile.
ancienne version :
If L1(X)=L3(Y
Then
V+1->V
ZL1(X)^min(L2(X),L4(Y->Z
End

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
monsaibert
Invité
Posté le : Mer 29 Fév 2012, 19:19   Citer 

S'il vous plait n'aller pas si vite:

mon message de Mar 28 Fév 2012 a 2 flèches
1ère / je reponds à sandro sur les manques d'un code pour les petites valeurs de A.
2 ème je réponds à linka

A sandro : ta proposition est une astuce pour que la machine marche bien même pour les petites valeurs que je signale dans le message? ( tu parles de 15...)
Quoiqu'il en en soit , je voudrais bien que tu m'expliques , pas trop vite!

A linka.

Helas j'ai lu ton dernier code et j'ai besoin d'éclaircicement, parfois aussi d'être rassuré.

Je retrouve certaine partie
du debut jusqu'à end : on va de A initial jusqu'à A/2^n

a - quel est le rôle de rac(A->B à la fin des nbres pairs? a t-il bien pour but de stopper si apres For, If trouve "ce fameux unique nbre premier superieur à rac A" ?

a - vient ensuite les impairs jusqu'au 2ème end
quel et le rôle de ce 2 ème rac(A->B avant end ?

c - normalement la TI fait Prompt A ->End puis reprend à Clrlist ->end ( n fois ) -> jusqu'à ce que le While dise " partie decimale - stop "-> va sur le fameux rac(A-> B et (ou) s'enclenche sur les impairs.
A la fin du 1er impair , elle affiche son W (Disp W) et aprés ? peux tu me preciser comment vont se faire les n tours?
que signifie If A-1 ?

je n'ai pas lu ton message , je le ferais après. Ne va pas trop vite.

Rq: n'a rien à voir
que signifie
E -> dim(L1) que signifie dim ? où la trouver?
où trouver EffList, ...je vais la prendre dans catalogue! c'est long..
merci

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mer 29 Fév 2012, 23:22   Citer 

La proposition de sandro concerne la détermination des puissances des nombres premiers, que tu jugeais trop compliqué à cause de mon affirmation pessimiste juste avant.

---

J'ai sauté les étapes en considérant qu'il était plus simple de reprendre à zéro avec un code complètement réécrit plutôt que de se prendre la tête avec des programmes foireux.

---

Les bugs que tu rencontres avec les nombres inférieurs à 15 ont trois causes :
-leur racine est inférieure à 4 donc la boucle quitte pratiquement aussitôt.
-s'arrêter à la racine carrée est bien joli, mais il faut intégrer le dernier facteur s'il existe à la liste
-la boucle For n'effectue son calcul de racine qu'une seule fois au début contrairement à ce qu'on pourrait croire. Ainsi on effectue le test de sortie sur la racine de A0/2 mais pas sur A. démo

Pour ces raisons il peut régulièrement te manquer un facteur, et l'arêt se produit avec du retard.

=====

ClrList=EffList se trouve dans le menu stat
dim() se trouve dans le menu list (2nde+stat)

If A-1 est un test.
Pour les calculatrices les tests donnent des résultats sous la forme de 1="vrai" et 0="faux".
Quand on donne un calcul au lieu d'un test, la valeur 0 est interprétée comme "faux" et toute autre valeur comme "vrai".
If A-1 revient donc à écrire If A-1=/=0 c'est-à-dire If A=/=1

Avoir placé le "End" final juste après le "If A-1" est une manière horrible mais efficace de contrôler la sortie du For par un test supplémentaire.
Ici le For n'est autorisé à recommencer que si A est différent de 1.

Nous nous sommes égarés parmi les propriétés mathématiques...
Le fait qu'il n'y ait qu'un seul nombre premier suppérieur à la racine est curieux mais n'a pas d'importance dans le programme.
En effet j'utilise déjà en continu la propriété principale : si W>rac(A) alors A est le dernier facteur premier.

Je veux effectuer des tests sur la racine de A mais pas calculer cette racine à chaque fois. (ainsi ça va plus vite)
Donc je stocke la racine de A dans B chaque fois que A est modifié, puis j'effectue le test d'arrêt sur B.

En algorithmique le résultat final de la décomposition en facteurs premiers se traduit par :

Code
Saisir A
Tant que A/2 est juste
stocker 2 dans L1
A/2->A
afficher 2
Fin_Tant_que

stocker la racine de A
Pour W de 3 à A par incrément de 2
Si W>rac(A
A->W        // le prochain diviseur testé sera A, justement le dernier facteur 
Tant que A/W est juste
stocker W dans L1
A/W->A
afficher W
stocker la racine de A
Fin_Tant_Que
Si A=1 alors ne pas executer la ligne du "Fin_Pour".
Fin_Pour
Afficher L1



----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsalbert
Invité
Posté le : Jeu 01 Mar 2012, 20:04   Citer 

Je revois toutes tes mises au point. j'ai jeté un coup d'oeil sur ton code posté mardi ( avec ZDECOMP ). Je ne comprends rien dans la premiere partie!
( dès la 1ère ligne, Icm c'est quoi ? )..

Rq: tu as oublié de dire à quoi sert dim(L1)( differents usages?)

  Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Jeu 01 Mar 2012, 21:09   Citer 

dim(L1 peut avoir deux usages : soit on fait "expréssion -> dim(L1 " dans quel cas la liste L1 fera désormais expréssion termes de long ; soit on l'utiliser dans un calcul, dans quel cas la fonction renvoie le nombre de termes de la liste.

Sandro

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 01 Mar 2012, 21:34   Citer 

Les choses essentielles devraient se situer dans mes trois derniers pavés.
Je ne passerai plus d'étape, je mettrai l'accent sur le ppcm quand tout sera au point pour la décomposition.

dim() permet de consulter ou de modifier la dimension d'une liste ou d'une matrice.
Saisir dim(L1) comme une variable exploite la dimension de L1 si elle n'est pas vide. (au moins un terme sinon ça plante)
2->dim(L1) donne à la liste L1 une dimension 2.
Quand on allonge ou raccourci une liste, les termes en trop sont perdus et les termes ajoûtés sont des 0.

---- ppcm

Le programme de détermination de ppcm est composé de deux programmes.
Le premier execute le second pour décomposer les nombres.
ZDECOMP ne manipule que les listes L1 et L2 quelques autres variables, donc le programme ppcm doit stocker les résultats dans d'autres variables entre les deux décompositions.
U et D pour la suite représentent les dimensions des listes.

Les boucles For de la fin permettent de passer en revue tous les facteurs.
Et quand deux facteurs sont communs, je consulte les puissances, le minimum indiquant combien de facteurs de la catégorie sont communs.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Sam 03 Mar 2012, 10:28   Citer 

- bilan sur l'important message de mercredi 29 0.2

a - bien sur les 3 causes de bug du code ( defaut dans les petites valeurs )
verifiés par des essais .
b - If A-1 revient à écrire A-1 est vrai., nous sommes d'accord ? donc si on ecrit If B revient à écrire si B existe (c.à.d. B est vrai ou a une certaine valeur numerique ( la 1ère fois qu'on voit celà, ça surprend!).
c - corrige si c'est faux : on a un For et un While donc 2 End. Dans ces situations le 1er End est à While / 2ème End à For.( Ordre toujours normal dans ces cas?)
pourquoi dis-tu horrible pour la sortie du For ?

Très bien tout celà, je souffre mais on avance.

Rq: si tu pouvais concocter un petit exo avec les utilisations de dim (L1)...pour voir.( Je garde celui sur While-Repeat)
ces jours je bosse prgmZDECOMP (la 1ère partie m'inquiète )

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Sam 03 Mar 2012, 12:26   Citer 

a et b : ok
( moi aussi j'ai été déconcerté par des trucs du genre If A la première fois.
En ce qui me concerne je m'interrogeait sur While 1 et Repeat 0.
Pour exploiter les tests au mieux, tu peux jeter un oeil à mon article sur les tests. Il a ses défauts mais il ouvre à pas mal de choses. )

c : Les boucles sont justes mais c'est d'avoir placé le If juste avant le End qui est horrible.
Ce genre de bidouille peut causer des bugs si on ne saît pas exactement ce qu'on fait. (voire même créer des erreurs de compilation dans d'autres languages)
Je t'envoie sur mon article et le tuto du sdz pour ce qui concerne les magouilles de End.

La fonction dim :
Code
EffListe L1  // liste vide
4->dim L1    // L1={0,0,0,0}
{1,3,3}->L1  // L1={1,3,3}
Disp dim(L1  // 3
4->dim(L1    // L1={1,3,3,0}
2->dim(L1    // L1={1,3}
EffListe L1
dim(L1       // ERREUR : dimension invalide car la liste est vide

3->dim(lPERSO   // création d'une liste personnalisée
                // si la liste n'existait pas, alors lPERSO={0,0,0}
                // le "l" se trouve dans le menu liste
EffListe lPERSO // la liste est vide mais existe toujours
{2,3->lPERSO
EffVar lPERSO   // liste détruite
EffListe lPERSO // ERREUR : indéfini car la liste n'existe pas
dim(lPERSO      // idem

EDIT : cas particulier

Code
{1,2->L1
2->L1(3)  //allonge la dimmension puis stocke
X->L1(N+1)  // fonctionne pour toute liste de dimmension N même si N=0



----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Lun 05 Mar 2012, 19:11   Citer 

J'ai vérifié le code de Mar 28 Fév 2012, 1:16 .
-impeccable : rapide et tous les facteurs passent.
Juste quelques précisions :

a - le rac(A->B en fin des nombres pairs - apres Disp 2 et le 1er End ( mais avant le For )il a bien surtout pour rôle d'arrêter tout de suite après ,les multiples de 2 ? En celà il peut faire gagner du temps? surtout si le For donne un W=3.

b - à propos du If A-1. Est-ce à cause de " For(W,3,A,2" que le For ne marche que si A =/=1 ? ou est-ce quelque chose à admètre parceque cette ligne dit "Vrai" (A=/=1)? D'ailleur pourquoi ne pas mettre If A-1 avant le End du While ?

J'ai revue la 1ère partie du code Posté le : Mar 28 Fév 2012, 23:57
Prompt A,C
Disp lcm(A,C
AC->T
prgmZDECOMP
C->A
U->D
L1->L3
L2->L4
prgmZDECOMP
DelVar V
1->Z
For(X,1,U
For(Y,1,D
If L1(X)=L3(Y
Then
V+1->V
ZL1(X)^min(L2(X),L4(Y->Z
End
End
End
Disp T/Z
Je dois t'avoué que je ne comprends pas grand choses : que signifie Icm ( 2ème ligne ) la variable C sert à quoi? T?. que signifie L1->L3 ?des variables sans valeurs U, D ?..

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 08 Mar 2012, 1:24   Citer 

a-
J'aurais pu supprimmer tous les rac(A->B et écrire If W>rac(A.
Mais je gagne de la vitesse d'execution en stockant le résultat avant de le réutiliser plus tard.
En effet c'est plus rapide de lire B que de calculer rac(A.
Or le test If W>B est effectué à chaque boucle même si A n'est pas modifié.
Alors je préfère consulter B à chaque boucle mais ne calculer la racine que si A est modifié.

Cela fonctionne que A initial soit paire ou non. Les facteurs 2 n'ont aucune importance.
Comme j'ai choisit de stocker la racine plutôt que de la calculer régulièrement, je le fais juste avant de rentrer dans le For car il est innutile de le faire plus tôt.

b-
Lorsque la calculatrice lit un End, elle execute la procédure liée à la dernière boucle qu'elle ait ouverte.
Si la dernière boucle ouverte était un Then, la boucle est juste refermée.
Si la dernière boucle ouverte était un For, W est incrémenté puis le test de sortie "W>A" est effectué.
Cela n'arrive jamais donc le For se poursuit.
Le "If A-1" empêche la calculatrice de lire le "End" qui devrait fermer le For lorsque A=1 (A-1=faux=0)
Donc si A=1, le For est interrompu.

Il est innutile de placer le "If A-1" avant le End du While car c'est le For qui doit être influencé par le test et non le While.

===== prog du Mar 28 Fév 2012, 23:57

lcm signifie ppcm en anglais.
menu math +droite+8
Je l'ai utilisé pour vérifier mes résultats.

Il s'agit de deux programmes distincts.
C'est pour ne pas écrire deux fois le même code de décomposition.

prgmZDECOMP permet d'executer un autre programme. Tu peux le saisir par prgm+gauche
Lorsque prgmZDECOMP est lu, le programme de ce nom est executé. Quand ce second programme est terminé, la calculatrice termine de lire le premier programme.

Appelle le premier comme tu veux et le second ZDECOMP.

Le second programme sert à effectuer une décomposition des données fournies par le premier programme.

A et C sont les nombres dont on cherche le ppcm.
T est le produit de A et C. Je le calcule au début pour le réutiliser à la fin.

L1 et L3 sont les listes des facteurs premiers. L2 et L4 sont les puissances de ces facteurs.

ZDECOMP décompose A et donne des résultats dans L1,L2 et U.
Je stocke ces résultat dans L3,L4 et D.
Puis je stocke C dans A pour que ZDECOMP décompose cette fois-ci C.
Les résultats sont dans les mêmes variables (L1,L2 et U)
Ainsi L1 est la liste des facteurs de C, L2 celle des puissances de C, L3 celle des facteurs de A, L4 celle des puissances de A, U la longueur de la liste L1 et D la longueur de la liste L3.

La fin du premier programme exploite les résultats pour déterminer les facteurs communs.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Jeu 08 Mar 2012, 19:23   Citer 

- beau travail! les deux codes en place les PPCM sortent impeccables. Je suis surpris, je ne m'attendais à cette vitesse.Bravo.
donc, on peut, d'un programme, utiliser un autre programme qui serait sur la TI! très interessant.

-il faut decrypter quelques passages dans ZDECOMPO.

a- dans les A pairs 2->L1(1 s'il ya plusieurs 2 ils se remplacent et à la fin dans L1 on aura un seul 2 ?
la variable U sert bien à numeroter les diviseurs et les puissances?
b - capital : 1+L2(1->L2(1 à chaque tour il monte la puissance du 2 d'une unité?

c-dans les impairs juste après le If :
U+1->U
0->L2 (U monte le rang d'un cran et on met un 0 pour preparer la place de la prochaine puissance

d - 1+L2(U->L2(U entasse les puissances?

e - il semble qu'en ce qui concerne les W>3 à cause de W->L1(U (après le While ) seront tous présent dans L1 (ex :3,3,3,5,5,11..) ?
corrige moi , merci.

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 09 Mar 2012, 2:04   Citer 

{0->L2
Cela permet de vider et donner une dimension à la liste en une seule commande

If not(fPart(A/W
Then
U+1->U
0->L2(U
End
Cela n'est executé qu'une seule fois pour chaque W valide.
Cela prépare la liste en augmentant la dimension de la liste et en incrémentant la variable U de position.
J'aurais pu écrire U->dim(L2) au lieu de 0->L2(U).

While not(fPart(A/W
A/W->A
rac(A->B
W->L1(U
1+L2(U->L2(U
End
Ceci est executé pour U constant.
Donc W est stocké à chaque fois au même endroit de L1 et L2(U), dont la position est constante, est incrémenté à chaque fois.
Cela revient donc à stocker le facteur W dans L1 et la puissance dans L2.
J'aurais pu placer W->L1(U) dans le Then/End précédent le while.


Si j'avais écrit quelque chose du genre X->L2(U), je n'aurais pas eu besoin de préparer la dimension de la liste juste avant.
En effet si la dimension est N, alors X->L2(N+1) fonctionne et modifie la dimension en plus de stocker.
Mais L2(U)+1->L2(U) consulte la liste avant de stocker.
Ainsi j'ai besoin de préparer la dimension de la liste à l'avance afin d'éviter un plantage.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Ven 09 Mar 2012, 20:46   Citer 

confirme :

U+1->U
0->L2(U
End ce End est une "soupape", il bloque le For le temps que le While tourne sur un W donné . A chaque tour de While, 1+L2(U->L2(U augmente la puissance de W d'un cran.
Si A-1 est vrai For(W,3,A,2 passe à un autre W.

Si c'est bon on a tout vu de ce code?

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Sam 10 Mar 2012, 1:00   Citer 

Non, ce End est la fin du If:Then.
Il y a un End pour fermer le If, un autre pour fermer le While, et le dernier pour fermer le For.
Le While est déjà une "soupape" en lui-même car la calculatrice ne fait qu'une chose à la fois.
Le "If not(fPart(A/W" permet d'effectuer une action une seule fois par W valide alors que While recommence les mêmes actions tant que la condition est valide.
Tu sembles avoir compris le reste. happy.gif

Souviens toi que If A-B signifie If A=/=B, ça suffit largement.

S'il n'y a rien d'autre à expliquer c'est une bonne nouvelle. bigmouth.gif
Cela fait du bien de savoir que j'ai réussi à t'expliquer tout ça au bout du compte. (ce fut long !)
J'espère que tu sauras réutiliser des choses parmi tout ce que j'ai écrit malgré mon manque de pédagogie.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsalbert
Invité
Posté le : Lun 12 Mar 2012, 19:55   Citer 

" S'il n'y a rien d'autre à expliquer c'est une bonne nouvelle."!....
une mauvaise nouvelle! mais c'est la fin!
Excuse moi mais il y a quelques petites choses encore à m'expliquer.


prgmZDECOMP
DelVar V
1->Z
For(X,1,U
For(Y,1,D
If L1(X)=L3(Y
Then
V+1->V
ZL1(X)^min(L2(X),L4(Y->Z
End
End
End
Disp T/Z

- j'ai limpression que V ne sert à rien? DelVar V ..V+1->V...?

- For(X,1,U
For(Y,1,D on passe en revue les puissances de A et C?

- on choisit les facteurs communs avec If L1(X)=L3(Y

- calcul du PGCD avec ZL1(X)^min(L2(X),L4(Y->Z
là on mutiple chaque terme - je pense COMMUN à A et C - par la plus petite puissance (min)?

comment fonctionne ZL1(X)^min(L2(X),L4(Y->Z : chaque terme commun ( grâce à If L1(X)=L3(Y ) de L1 à la puissance minimum
du facteur entre A et C ? If fait le TRI des facteurs communs?

merci

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Lun 12 Mar 2012, 23:22   Citer 

Effectivement le V ne sert à rien... J'ai cafouillé.
J'avais tenté de stocker les résultats avant de choisir de calculer le pgcd.
J'édite.


Le If sert à détecter une classe commune de facteurs. J'appelle classe les facteurs identiques.
Par exemple 24=2*2*2*3 et 20=2*2*5 donc classes 2,3 et 5, avec la classe 2 commune.
Mais le nombres de facteurs communs d'une classe est nécessairement le minimum des puissances de chaque classe.
Pour 24 et 20, la classe 2 est commune, mais 24 contient 2^3 et 20 contient 2^2. Donc ils ont 2 facteurs de classe 2 en commun.

Les puissances sont stockées dans les listes L2 et L4 donc j'en prend le minimum.
L1(X)=L3(Y) et ça me suffit associé à la puissance pour définir des diviseurs communs de A et C.

facteur ^ min( puiss_A , puiss_C )

Au début Z=1 puis je multiplie Z par les facteurs communs et je stocke chaque fois dans Z.
Au final Z représente le produit de tous les facteurs communs déterminés.
Le produit de ces facteurs est le pgcd car tous les facteurs de départ sont premiers.

Connaissant le produit de A et C ainsi que le pgcd, je calcule le ppcm.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
monsaibert
Invité
Posté le : Mar 13 Mar 2012, 18:57   Citer 

Linka je te remercie pour ce gros dossier où j'ai appris ou revu beaucoup de choses. Je vais reprendre doucement tout celà pour l'"incruster"!!.J'aurrai peut-être quelques remarques à faire plus tard.

  Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Page générée en 6 requêtes