Grand merci ! Je regarde tout cela avec attention. Le 19 déc. 2015 12:26 PM, "couraud" <[email protected]> a écrit :
> La list de variables après le mot clé « block » est la façon de déclarer > des > variables locale au block dans le langage Maxima. (Voir la doc de ce mot > clé). > > > > La commande « map » est probablement optimisée mais c’est surtout les > nombreuses conversions > de nombres vers « string » et vise versa qui coûte dans vôtre version. > > Les quelques mesures que j’ai réalisées suggèrent que la version purement > numérique est > 150 fois plus rapide. > > Peut être qu’une version purement numérique mais utilisant « map » serais > un peut plus rapide. > > Elle pourrait sûrement être encore optimisé en particulier puisqu’elle > fait intervenir essentiellement des calculs numériques elle pourrait être > compilé. > (Voir la doc de « compile », « compfile » etc.). > > Il y aurait sûrement intérêt à ce que la liste de valeurs initiales ainsi > que la limite du multiple soit > des paramètres de la fonction. > > Enfin 10^19 est une limite vraiment optimiste. Si la boucle doit atteindre > cette valeur cela impliquera > des heures, voire des jours de calculs. > > > > PS : Si vous pouvez répondre à la liste plutôt que en privé. D’autre > personne peuvent apporté > de meilleurs solution voire même corriger mes dires (je ne suis pas un > expert). > > > > PPS : je me demande si il ne serait pas plus efficace de tester la parité > de la somme des digits > et ssi elle est impair alors calculer n, plutôt que d’extraire les digits > a partir de n. > > > > > > -----Message d'origine----- > *De :* Jean-François Ingenbleek [mailto:[email protected]] > *Envoyé :* samedi 19 décembre 2015 10:32 > *À :* couraud > *Objet :* Re: RE : [Maxima-lang-fr] programmation efficace > > > > Merci pour cette réponse rapide. > > Je n'avais pas pensé à cela: [q, r] : divide(q, 10) > > Par contre je ne comprends pas ceci:[n, sum_digit, k, q, r, stop, result : > []] > > Maladroitement sans doute j'ai voulu écrire en "style" maxima avec des > "map" ... > > Mais qu'elles sont les instructions qui coûte en temps d’exécution? je > pensais que précisément que "map" était optimisé... > > > > encore merci > > > > Le 19 décembre 2015 à 01:28, couraud <[email protected]> a écrit : > > Hi, > > > > The following version seems faster : > > > > odd_sum_digit() := block([n, sum_digit, k, q, r, stop, result : []], > > for n in [11, 101, 1001, 2002, 3003, 4004, 5005, 6006, 7007, 8008, > 9009] do ( > > stop : false, > > k : 1, > > while (k * n < 10 ^ 19) and not stop do ( > > sum_digit : 0, > > q : k * n, > > while q > 0 do ( > > [q, r] : divide(q, 10), > > sum_digit : sum_digit + r > > ), > > stop : oddp(sum_digit), > > if stop then ( > > result : cons([k, n], result) > > ), > > k : k + 1 > > ) > > ), > > result > > ); > > > > Hope this help. > > > > > > PS: Je vous réponds en anglais et je mets la mailing liste anglaise en > copie car c’est la plus active et c’est aussi là > > que ce trouvent les développeurs / experts de Maxima. > > > > Best regards. > > > > -----Message d'origine----- > *De :* Jean-François Ingenbleek [mailto:[email protected]] > *Envoyé :* vendredi 18 décembre 2015 17:42 > *À :* [email protected] > *Objet :* [Maxima-lang-fr] programmation efficace > > > > Il s'agit d'un problème de programme efficace ou inefficace dont voici les > lignes de code: > > lesfin:[]$for n in [11,101,1001,2002,3003,4004,5005,6006,7007,8008,9009] > do block( > arret:oddp(apply("+",map(eval_string,charlist(string(n))))), > for i:n step n thru 10^19 while not arret do block( > arret: oddp(apply("+",map(eval_string,charlist(string(i))))), > if arret then push([i/n-1,n],lesfin)))$ > elapsed_run_time(); > > Elles évaluent ceci: > * un nombre est digitalement paire si la somme de ces chiffres est paire > -> arret:oddp(apply("+",map(eval_string,charlist(string(n))))) > * on regarde les multiples successifs d'un nombre digitalement paire -> > for i:n step n thru 10^19 while not arret do block( avec thru 10^19 comme > test d'arrêt en parachute ventral... > * on détermine le nombre de ces multiples digitalement paire jusqu'au > premier non paire ->arret: > oddp(apply("+",map(eval_string,charlist(string(i))))), > * ce nombre est l'"ordre" -> push([i/n-1,n],lesfin))) > > Que vaut cet ordre? etc... > > J'explore quelque nombres pour voir: ->for n in > [11,101,1001,2002,3003,4004,5005,6006,7007,8008,9009] > > Voilà le contexte. > > Le problème c'est que tout cela me semble bien "lent" à l’exécution et > devient même de plus en plus lent quand je change la liste à explorer.... > > Y-a-t-il plus efficace que ces lignes? > > Merci à tous par avance > > >
------------------------------------------------------------------------------
_______________________________________________ Maxima-lang-fr mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr
