Poster un nouveau sujet Poster une réponse
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   Citer 

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
 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 : Ven 10 Jui 2011, 19:19   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Ven 10 Jui 2011, 19:23   Citer 

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
 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 : Ven 10 Jui 2011, 19:30   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Ven 10 Jui 2011, 19:59   Citer 

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
 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 : Ven 10 Jui 2011, 20:12   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Ven 10 Jui 2011, 20:17   Citer 

Autant! ahh.gif
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
 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 Jui 2011, 20:20   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Ven 10 Jui 2011, 20:21   Citer 

rac( , c'est racine carrée...?

----------------------
Ti-Connect 64bits
PROTECT
 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 : Ven 10 Jui 2011, 20:21   Citer 

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
 Adresse email Haut de page Bas de page 
 
Sangohan38



Autorisation : Membre
Nb de messages : 3293
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Ven 10 Jui 2011, 20:21   Citer 

Oui, c'est sa.

Sangohan38

 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 : Ven 10 Jui 2011, 20:50   Citer 

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
 Adresse email Haut de page Bas de page 
 
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   Citer 

Pas mal comme idée! Mais plus complexe...
Sango n'a pas floodé, il répondait a mon message ^^

----------------------
Ti-Connect 64bits
PROTECT
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Sam 11 Jui 2011, 18:34   Citer 

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
 Adresse email Haut de page Bas de page 
 
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   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Sam 11 Jui 2011, 19:12   Citer 

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
 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 : Sam 11 Jui 2011, 19:35   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Sam 11 Jui 2011, 19:52   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Jeu 16 Jui 2011, 19:30   Citer 

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
 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 16 Jui 2011, 20:25   Citer 

C'est moi, pas sango qui ai fourni la méthode où on décompose d'abord 2. winkle.gif
Mais ça fait plaisir de voir que cela a plu à quelqu'un. bigmouth.gif


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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Jeu 16 Jui 2011, 20:33   Citer 

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
 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 16 Jui 2011, 20:40   Citer 

: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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Jeu 16 Jui 2011, 20:44   Citer 

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
 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 16 Jui 2011, 23:39   Citer 

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
 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 : Ven 17 Jui 2011, 8:52   Citer 

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
 Adresse email Haut de page Bas de page 
 
azerty1



Autorisation : Membre
Nb de messages : 438
Inscrit le : Dim 12 Déc 2010, 20:44
Posté le : Ven 17 Jui 2011, 11:05   Citer 

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
 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 : Ven 17 Jui 2011, 21:50   Citer 

FINI ? crazy.gif ? crazy.gif ? crazy.gif avec 6 octés de perdu angry.gif

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
 Adresse email Haut de page Bas de page 
 
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   Citer 

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. winkle.gif

---
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
 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





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