| Décomposition |
| Auteur |
Message |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Ven 10 Jui 2011, 15:04
|
|
|
Bonjour à tous, vous connaissez peut être l'énigme de l'age du capitaine:Le Xème jour du Yème mois de l’année 1900 + Z, un bateau ayant U hélices, V cheminées et W hommes d’équipage est lancé.
Sachant que le produit UVWXYZ augmenté de la racine cubique de l’âge du capitaine (qui est grand-père) est égal à 4002331, trouver l’âge du capitaine ainsi que toutes les caractéristiques du bateau.
Bien, et bien ce problème m'as été poser par mon profs de maths ce matin, et je me suis dis qu'un petit programme ne serait pas de refus, voici donc un programme qui décompose un nombre en plusieurs facteurs, un tel programme existe surement, mais voilà le mien fais en 2mn... :
| Code | :EffListe L1
:100->dim(L1
:1->I
:EffEcr
:Input "Nombre? ",N
:partEnt((RACINE CARREE](N->[THETA]
:For(A,2,[THETA]
:While parDéc(N/A)=0
:N/A->N
:A->L1(I
:I+1->I
:End
:End
:1->W
:Repeat L1(W)=0
:W+1->W
:End
:W-1->dim(L1
:L1 |
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
sandro
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
|
Posté le : Ven 10 Jui 2011, 19:19
|
|
|
Tu peu simplifier en :
| Code | :{1 -> L1
:1->I
:EffEcr
:Input "Nombre? ",N
:partEnt((RACINE CARREE](N->[THETA]
:For(A,2,[THETA]
:While non(parDéc(A[^-1]N
:A[^-1]N->N
:A->L1(I
:I+1->I
:End
:End
:L1 |
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Ven 10 Jui 2011, 19:23
|
|
|
Tu ne risque pas d'avoir un probleme de dimension de liste avec ça? P
ar exemple, sit u mets:
:{1->L1
:3->L1(4)
Et bien tu vas avoir une erreur non?...
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
sandro
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
|
Posté le : Ven 10 Jui 2011, 19:30
|
|
|
Oui sauf que I est initialisé à 1 et augmente de 1 en 1 à chaque fois qu'un terme est rajouté, on devrais donc avoir :
X1 -> L(1
X2 -> L(2
X3 -> L(3
X4 -> L(4
X5 -> L(5
Sinon, si jamais ça ne marche pas, essaye ce code-ci :
| Code | :{1 -> L1
:EffEcr
:Input "Nombre? ",N
:partEnt((RACINE CARREE](N->[THETA]
:For(A,2,[THETA]
:While non(parDéc(A[^-1]N
:A[^-1]N->N
:A->L1(1+dim(L1
:End
:End
:L1 |
Ce programme-ci à par contre le petit inconvéniant d'avoir un 1 en début de liste
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Ven 10 Jui 2011, 19:59
|
|
|
Sinon tu définis directement une dimension importante, que tu réduis à la finb en fonction du nombre de termes, comme j'avais fais...?
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
sandro
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
|
Posté le : Ven 10 Jui 2011, 20:12
|
|
|
l'inconvéniant c'est la place prise durant l'execution du programme : sauf erreur de ma part, chaque therme d'une liste prend 9 octés, donc si on prend dim=100, on à 900 octés, si on prend dim=200, on en est déjà à 1800 octés, ...
Donc, cette méthode correspond bien si la TI ne contient que peu de programmes, mais si la RAM est presque pleine , ERR:MEMOIRE.
Sandro
PS : et en plus ça racouris et accélère le code.
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Ven 10 Jui 2011, 20:17
|
|
|
Autant! 
Sinon il faudrait faire qqch comme:
| Code | :dim(L1)+1->dim(L1)
:A->L1(Z)
:Z+1-Z |
Un peu comme tu avais fais quoi...
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
linkakro
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
|
Posté le : Ven 10 Jui 2011, 20:20
|
|
|
Plus lourd mais bien plus puissant sur certaines combinaisons de grands nombres.
| Code | //DECOMP
Prompt A
EffVar I
EffListe L1
2->W
prgmDECOMP2
For(W,3,A,2
If W>rac(A
A->W
prgmDECOMP2
If A-1
End
Pause L1 |
| Code | //DECOMP2
While non(partDéc(A/W
A/W->A
I+1->I
W->L1(I
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 |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Ven 10 Jui 2011, 20:21
|
|
|
rac( , c'est racine carrée...?
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
sandro
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
|
Posté le : Ven 10 Jui 2011, 20:21
|
|
|
Pas la peine, du peu direct mettre (toujour si dim(L1) ne vaut pas 0),
| Code | | X -> L1(1+dim(L1 // rajoute X à la fin de L1 |
ATTENTION, si tu prend un nombre supérieur à 1, tu aura une erreur.
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes |
 |
|
| |
Sangohan38
Autorisation : Membre
Nb de messages : 3293
Inscrit le : Sam 31 Déc 2005, 19:48
|
Posté le : Ven 10 Jui 2011, 20:21
|
|
|
Oui, c'est sa.
Sangohan38
|
 |
|
| |
Google_AdSense
|
Publicité
|
|
|
|
| |
sandro
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
|
Posté le : Ven 10 Jui 2011, 20:50
|
|
|
Sinon, pour faire encore plus rapide que le prog de Linkakro, il faudrait utiliser une liste contenant tous les nombres premiers (enfin dans la limite du raisonnable).
| Code | :{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 -> L2
:Prompt A
:EffListe L1
:1 -> W
:While A [différend de] 1 et W [inférienr ou égal] dim(L2) et L2(W)<racine(A //remplacer dim(L2) par ça dimension
:While non(partDéc(A/L2(W
:A/L2(W->A
:L2(W->L1(I
:End
:W+1 -> W
:End
:pause L1
:EffListe L1,L2 |
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes |
 |
|
| |
Google_AdSense
|
Publicité
|
|
|
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Ven 10 Jui 2011, 20:54
|
|
|
Pas mal comme idée! Mais plus complexe...
Sango n'a pas floodé, il répondait a mon message ^^
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Sam 11 Jui 2011, 18:34
|
|
|
Désolé pour le double post, mais vous ne l'auriez pas vu...
Avec mon programme de base, j'ai remarqué un certains nombre de bug...P
ar exemple lorsque je demande de décomposer 76, j'obtiens {2 2} alors que je devrais obtenir {2 2 19}, ou encore, en décomposant 2608, j'obtiens {2 2 2 2} au lieu de {2 2 2 2 163}... avez vous une idée d'où cela peut-il venir...
Rappel du code de base:
| Code | :EffListe L1
:100->dim(L1
:1->I
:EffEcr
:Input "Nombre? ",N
:partEnt((RACINE CARREE](N->[THETA]
:For(A,2,[THETA]
:While parDéc(N/A)=0
:N/A->N
:A->L1(I
:I+1->I
:End
:End
:1->W
:Repeat L1(W)=0
:W+1->W
:End
:W-1->dim(L1
:L1 |
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
Google_AdSense
|
Publicité
|
|
|
|
| |
linkakro
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
|
Posté le : Sam 11 Jui 2011, 19:02
|
|
|
La racine carrée de 2608 est inférieure à 163.
Donc le programme s'arrête avant de tester 163.
Le test de la racine indique si un nombre est premier mais un de ses facteurs premiers peut être suppérieur à la 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 |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Sam 11 Jui 2011, 19:12
|
|
|
Dopnc si je veux arranger cela, je ne test plus jusqu'a la racine carré, mais jusqu'au nombre lui meme c'est ça?
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
linkakro
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
|
Posté le : Sam 11 Jui 2011, 19:35
|
|
|
Oui.
Mais puisqu'on ne peut pas utiliser la racine comme arrêt, il faut au moins N0(N saisi au début), ce qui peut être vraiment très grand...
Il faut un autre test d'arrêt. (tester si N=1 par exemple)
On peut même ajoûter quelque chose de super mais plus dur à gérer :
Tester la racine de N à chaque boucle. Si A>rac(N) alors N est un nombre premier et donc on connaît le dernier facteur premier de N0
(c'est ce que j'ai employé dans mon programme en plus du test "=1")
---------------------- 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 |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Sam 11 Jui 2011, 19:52
|
|
|
Je crois avoir compris... Mais c'est sur c'est bien plus compliquer, mais je pense qu'on doit gagner en efficacité...!
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Jeu 16 Jui 2011, 19:30
|
|
|
Bon, voilà, après quelques petits test de vitesse et d'efficacité, voilà la version finale, je me suis également inspiré de la version de sango. linkakro
Le voilà:
[code]:EffListe L1
:1->I
:EffEcr
:Input "NOMBRE? ",N
:N->Z
:While partDéc(N/2)=0
:2->L1(I
:N/2->N
:I+1->I
:End
:For(A,3,N/2,2
:If prod(L1)=Z
:Goto Z
:While partDéc(N/A)=0
:N/A->N
:A->L1(I
:I+1->I
:End
:End
:Lbl Z
:Pause L1
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
linkakro
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
|
Posté le : Jeu 16 Jui 2011, 20:25
|
|
|
C'est moi, pas sango qui ai fourni la méthode où on décompose d'abord 2. 
Mais ça fait plaisir de voir que cela a plu à quelqu'un.
Je ne suis pas convaincu du N/2 en arrêt, mais c'est pas important.
Le prod(L1)=Z est correct, mais c'est logiquement plus lent que "If A-1" de mon prog.
Après, avoir mis le while direct dedans occupe plus de mémoire mais est peut-être effectivement plus rapide que le prog à part.
---------------------- 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 |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Jeu 16 Jui 2011, 20:33
|
|
|
Oups, désolé, c'est rectifié... Oui, j'ai trouvé interessant le pas de 2 surtout =)
Comment ça le N/2 en arrêt??
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
linkakro
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
|
Posté le : Jeu 16 Jui 2011, 20:40
|
|
|
:For(A,3,N/2,2
C'est bien l'arrêt à N/2 ?
Sinon le Pas à 2 m'a été inspiré il y a longtemps par le programme du site. Tout le reste est brodé à ma façon.
---------------------- 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 |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Jeu 16 Jui 2011, 20:44
|
|
|
Ok, pour le pas de 2 =)
Oui, parce que, si on a déja comme facteur 2, et bien le plus grand possible, sera la moitié du nombre, il me semble... Mais je devrais peut être changer en
For(A,3,Z/2,2 ???
| Code | :EffListe L1
:1->I
:EffEcr
:Input "NOMBRE? ",N
:N->Z
:While partDéc(N/2)=0
:2->L1(I
:N/2->N
:I+1->I
:End
:For(A,3,Z/2,2
:If prod(L1)=Z
:Goto Z
:While partDéc(N/A)=0
:N/A->N
:A->L1(I
:I+1->I
:End
:End
:Lbl Z
:Pause L1 |
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
linkakro
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
|
Posté le : Jeu 16 Jui 2011, 23:39
|
|
|
Cet élément du For n'a pas d'importance car N/2 est calculé une seule fois au début.
Pour 226, il s'arrête au facteur 2.
Soit il faut enlever la limite à N/2, soit il faut mettre un test sur la racine comme dans mon prog.
Le produit de L1 plante si N n'est pas multiple de 2. Deux solutions :
-utiliser autre chose (comme If N-1:End)
-initialiser L1 avec {0}->L1 pour qu'elle ait une dimmension
---------------------- 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 |
 |
|
| |
sandro
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
|
Posté le : Ven 17 Jui 2011, 8:52
|
|
|
Le plus simple,vue que de toute façon on à une liste contenant les facteurs, on l'initialise avec {1} -> L1 et en test avec N/produit(L1) ou même avec .5N/produit(L1) mais dans le 2nd cas il ne faut pas oublier de rajouter le "reste" à la fin de la liste après la fin de la boucle.
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes |
 |
|
| |
azerty1
Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
|
Posté le : Ven 17 Jui 2011, 11:05
|
|
|
Oui, je trouve ton idée interessante, mais tu es obligé d'utiliser 2 listes, apres, c'est pas forcément grave bien sur...
Sinon voilà le programme fini je pense, bon il ressemble quand même beaucoup au tien linkakro... Merci à toi =)
| Code | :EffEcr
:{0->L1
:1->I
:Input "NB? ",N
:N->Z
:While partDéc(N/2)=0
:2->L1(I
:N/2->N
:I+1->I
:End
:For(A,3,N,2
:If A>rac(N)
:N->A
:If prod(L1)=Z
:Goto Z
:While partDéc(N/A)=0
:N/A->N
:A->L1(I
:I+1->I
:End
:End
:Lbl Z
:Pause L1 |
---------------------- Ti-Connect 64bits
PROTECT |
 |
|
| |
sandro
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
|
Posté le : Ven 17 Jui 2011, 21:50
|
|
|
FINI ? ? ? avec 6 octés de perdu
| Code | :EffEcr
:{0->L1
:1->I
:Input "NB? ",N
:N->Z
:While non(partDéc(N/2 //ici 2 octés
:2->L1(I
:.5N->N //ici (autant de mémoire mais plus rapide apparament)
:I+1->I
:End
:For(A,3,N,2
:If A>rac(N //ici 1 octé
:N->A
:If Z=prod(L1 //ici 1 octé
:Goto Z
:While non(partDéc(N/A //ici 2 octés
:N/A->N
:A->L1(I
:I+1->I
:End
:End
:Lbl Z
:Pause L1 |
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes |
 |
|
| |
Google_AdSense
|
Publicité
|
|
|
|
| |
linkakro
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
|
Posté le : Ven 17 Jui 2011, 22:53
|
|
|
Chacun sait comment éliminer les parenthèses et peut les enlever au moment du recopiage, alors pas besoin de multiplier les messages chaque fois que des parenthèses se balladent.
Cependant beaucoup de débutants ne lisent pas les articles qui expiquent comment le faire, alors tes remarques peuvent se justifier...
Puisqu'être tatillon et économe est ta nature, je ne peux rien y changer. 
---
C'est vrai que .5N est plus rapide que N/2.
Je ne suis pas adepte du produit de L1, je préfère mettre "If A-1" avant le dernier End. Cela permet d'enlever des lignes un peu partout.
---------------------- 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 |
 |
|
| |