Je suis preneur de toute remarque ou exemple qui invaliderait ce programme d'amateur.
Un exemple qui marche:
E:=-2/3*ln(2010/58)-2*ln(154/256)-ln(145)+ln(123)+5*ln(45)+1/2*ln(289/125);
Simplog(E);
c'est parfois un peu plus réduit que tsimplify(E);
Code : Tout sélectionner
Ln_entier(N):={
local L,s;
L:=ifactors(N);
s:=size(L);
return sum(L[2k+1]*ln(L[2k]),k,0,s/2-1);
}
:;
Ln(N):={
si type(N)==DOM_INT alors return Ln_entier(N) sinon
si type(N)==DOM_RAT alors return Ln_entier(numer(N))-Ln_entier(denom(N)) sinon
return ln(N)
fsi;
fsi;
}
:;
Simplog(E):={ //simplifier une combinaison linéaire de ln à coeff rat
local s,L;
si sommet(E)=='+' alors
L:=simplifier(op(E));
s:=size(L);
pour k de 0 jusque s-1 faire
si sommet(L[k])=='ln' alors L[k]=<Ln(op(L[k])) sinon //pour ln(A)
si sommet(op(L[k]))=='ln' alors L[k]=<-Ln(op(op(L[k]))) sinon //pour -ln(A)
si sommet(op(L[k])[0])=='ln' alors L[k]=<op(L[k])[1]*Ln(op(op(L[k])[0])) sinon //pour ln(A)/B
si sommet(op(op(L[k])[0]))=='ln' alors L[k]=<-op(L[k])[1]*Ln(op(op(op(L[k])[0]))) //pour -ln(A)/B
fsi;
fsi;
fsi;
fsi;
fpour;
return tsimplify(sum(L[k],k,0,s-1));
fsi;
L:=simplifier(E); //si un seul terme dans la somme
si sommet(L)=='ln' alors return Ln(op(L)) sinon //pour ln(A)
si sommet(L)==neg alors return -Ln(op(op(L))) sinon //pour -ln(A)
si sommet(L)=='*' alors return expand(op(L)[1]*Ln(op(op(L)[0]))) sinon //pour ln(A)/B
return "la simplification n'a pas été réalisée"
fsi;
fsi;
fsi;
}
:;