autrefois simplifier(a/b*ln(k)) avec a,b,k entiers renvoyait toujours ln(k^a)/b avec k^a evalue
Y-t-il actuellement en combinant eventuellement plusieurs fonctions un moyen d'obtenir ce resultat ? (sans decomposer l'expression)
par exemple lncollect(4/5*ln(123)) renvoie ln(228886641)/5 mais lncollect(7/5*ln(123)) renvoie 7*ln(123)/5
lncollect
Modérateur : xcasadmin
Re: lncollect
Il y a une limite sur la taille de l'exposant (<MAX_ALG_EXT_ORDER_SIZE), qu'on peut gerer depuis C++ mais pas depuis Xcas. La valeur est de 6. Je pourrais ajouter une commande pour gerer depuis Xcas, mais le probleme sera seulement repousse.
Re: lncollect
non ce n'est pas utile, l'interet serait anecdotique.
A l'epoque (peut etre il y a 6/7 ans, la taille maximale de l'exposant aurait change ?) j'avais ecrit un programme pour que mes eleves pussent verifier leur developpement d'une somme de ln
Voici le programme (excuse l'amateurisme ! )
en tapant
E:=8/5*ln(125/289)-2/3*ln(1024/81);DecomposerLn(E);
on obtenait
(-16/5)*ln(17)-20/3*ln(2)-(-8/3)*ln(3)-(-24/5)*ln(5)
Aujourd'hui j'obtiens
2*ln(81)/3+8*ln(125)/5-8*ln(289)/5-2*ln(1024)/3
cad le resultat de lnexpand(E)
A l'epoque (peut etre il y a 6/7 ans, la taille maximale de l'exposant aurait change ?) j'avais ecrit un programme pour que mes eleves pussent verifier leur developpement d'une somme de ln
Voici le programme (excuse l'amateurisme ! )
Code : Tout sélectionner
/**************************************************************
********** Décomposer une combinaison linéaire de ln **********
****************** à coefficients rationnels ******************
**************************************************************/
// Aprés compilation taper DecomposerLn(expression)
// par exemple E:=8/5*ln(125/289)-2/3*ln(1024/81);DecomposerLn(E);
Ln_entier(N):={
local L,s,k;
L:=ifactors(N);
s:=size(L);
retourne somme(L[2k+1]*ln(L[2k]),k,0,s/2-1);
}
:;
Ln(N):={
si type(N)==DOM_INT alors
retourne Ln_entier(N)
sinon
si type(N)==DOM_RAT alors
retourne Ln_entier(numer(N))-Ln_entier(denom(N))
sinon
retourne ln(N)
fsi;
fsi;
}
:;
DecomposerLn(E):={ //simplifier une combinaison linéaire de ln à coeff rat
local s,L,k;
si type(E)==DOM_INT ou type(E)==DOM_RAT alors
retourne E
fsi
L:=100+E;//pour que L soit une somme d'au moins deux termes
L:=expand(lnexpand(L));
L:=simplifier(op(L));
s:=size(L);
pour k de 0 jusque s-1 faire
si L[k]!=100 alors
si sommet(L[k])=='ln' alors
L[k]=<Ln(op(L[k])) //pour ln(A)
sinon
si sommet(op(L[k]))=='ln' alors
L[k]=<-Ln(op(op(L[k]))) //pour -ln(A)
sinon
si sommet(op(L[k])[0])=='ln' alors
L[k]=<op(L[k])[1]*Ln(op(op(L[k])[0])) //pour ln(A)/B
sinon
si sommet(op(op(L[k]))[0])=='ln' alors
L[k]=<-op(op(L[k]))[1]*Ln(op(op(op(L[k]))[0])) //pour -ln(A)/B
fsi;
fsi
fsi
fsi
fsi
fpour;
retourne tsimplify(sum(lnexpand(L[k]),k,0,s-1)-100);//remplace tsimplify(sum(L[k],k,0,s-1)-100);
}
:;
E:=8/5*ln(125/289)-2/3*ln(1024/81);DecomposerLn(E);
on obtenait
(-16/5)*ln(17)-20/3*ln(2)-(-8/3)*ln(3)-(-24/5)*ln(5)
Aujourd'hui j'obtiens
2*ln(81)/3+8*ln(125)/5-8*ln(289)/5-2*ln(1024)/3
cad le resultat de lnexpand(E)
Re: lncollect
La taille n'a pas change, mais j'ai modifie le code de lncollect (malheureusement sans commenter pourquoi).
Je rajoute une commande max_alg_ext_order_size(), ca ne coute pas cher. Il devrait suffire de la mettre au minimum avant et de la retablir apres.
Je rajoute une commande max_alg_ext_order_size(), ca ne coute pas cher. Il devrait suffire de la mettre au minimum avant et de la retablir apres.
Re: lncollect
comment utiliser concretement cette commande dans le programme ?
Re: lncollect
Avec une variable de sauvegarde et un truc du genre:
Code : Tout sélectionner
in_le_programme(arguments):={
...
}:;
le_programme(arguments):={
local s,res;
s:=max_alg_ext_order_size();
max_alg_ext_order_size(1);
res:=in_le_programme(arguments);
max_alg_ext_order_size(s);
return res;
}:;