Code : Tout sélectionner
enlabs(E):={
//E=cste ou cste*abs(binôme) par ex -3 ou 5*i*abs(x+1)/4
local temp,sol,a;
sol:=solve(E);
si sol==[] ou sol==[x] alors
retourne E
sinon
a:=sol[0];
supposons(x>a);
temp:=eval(E);
purge(x);
retourne temp;//-3 ou 5*i*(x+1)/2
fsi;
}
:;
Ferrari(P):={//P polynôme de degré 4
local E,P2,u,F,L,delta,sol,k,v,S,E1,E2,T,a;
//E sous forme x^4+ax^2+bx+c
E:=normal(normal(subst(P,x=x-coeff(P,x,3)/(4*coeff(P,x,4))))/coeff(P,x,4));
P2:=poly2symb(tail(tail(coeff(-E))));
purge(u);
F:=op(reorder((x^2+u)^2,[x,u]));
F[0]:=P2;
F:=sum(F);
L:=coeff(F,x);
delta:=L[1]^2-4*L[0]*L[2];//polynôme de degré 3 en u
sol:=solve(delta,u);
afficher(sol);
//tester si sol contient un rationnel
si a:=member(DOM_RAT,apply(x->type(x),sol)) alors
v:=sol[a-1];
sinon
si a:=member(DOM_INT,apply(x->type(x),sol)) alors
v:=sol[a-1];
sinon
retourne round(csolve(P),4);
fsi;
fsi;
S:=evalc(sqrt(factor(subst(F,u=v))));
afficher(factor(subst(F,u=v)));//cste*(binôme)^2 ou cste
afficher(S);//avec valeur absolue éventuelle
S:=enlabs(S);//sans valeur absolue
afficher(S);//pour vérifier que S est sans valeur absolue
E1:=subst(x^2+u,u=v)-S;
E2:=subst(x^2+u,u=v)+S;
afficher(E1);afficher(E2);//pour vérifier les équations
retourne apply(t->t-coeff(P,x,3)/(4*coeff(P,x,4)),csolve(E1) union csolve(E2));//ne pas simplifier
//si nécessaire faire simplifier(ans()) ou evalc(ans()) dans le niveau du dessous
}
Ferrari(x^4-159x^2+840x-588)
j'obtiens en bleu x:recursive definition et le programme plante
Hier soir le programme renvoyait encore l'expression exacte des 4 solutions
J'ai lu quelque part qu'on pouvait lancer xcas à partir de gdb puis obtenir le backtrace
Malheureusement je suis bien incapable d'aller plus loin
Le bug vient vraisemblablement de mon programme mais comme c'est nouveau et que je n'ai pas le temps de le reprendre je vous le soumets
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7374b70 (LWP 2732)]
0x00389002 in giac_yylex(giac::gen*, void*) () from /usr/lib/libgiac.so.0
(gdb) bt
#0 0x00389002 in giac_yylex(giac::gen*, void*) () from /usr/lib/libgiac.so.0
#1 0x0060e8cc in giac::giac_yyparse(void*) () from /usr/lib/libgiac.so.0
#2 0x00bc8fd8 in ?? () from /usr/lib/libgiac.so.0
#3 0x00bca1b1 in giac::gen::gen(std::string const&, giac::context const*) ()
from /usr/lib/libgiac.so.0
#4 0x008a0dd7 in giac::ifactors(giac::gen const&) ()
from /usr/lib/libgiac.so.0
#5 0x00b04378 in giac::zint2simpldoublpos(giac::gen const&, giac::gen&, giac::gen&, bool&, giac::context const*) () from /usr/lib/libgiac.so.0
#6 0x003b62d9 in ?? () from /usr/lib/libgiac.so.0
#7 0x003a96aa in giac::sym2r(giac::gen const&, giac::dbgprint_vector<giac::gen> const&, giac::dbgprint_vector<giac::gen> const&, giac::dbgprint_vector<giac::gen> const&, giac::dbgprint_vector<giac::gen> const&, int, giac::gen&, giac::gen&, giac::context const*) () from /usr/lib/libgiac.so.0
#8 0x003aae24 in ?? () from /usr/lib/libgiac.so.0
#9 0x003ac38d in giac::sym2r(giac::gen const&, giac::dbgprint_vector<giac::gen> const&, int, giac::gen&, giac::gen&, giac::context const*) ()
from /usr/lib/libgiac.so.0
#10 0x003accdc in giac::sym2r(giac::gen const&, giac::dbgprint_vector<giac::gen> const&, giac::context const*) () from /usr/lib/libgiac.so.0
#11 0x003aceac in giac::e2r(giac::gen const&, giac::dbgprint_vector<giac::gen> const&, giac::context const*) () from /usr/lib/libgiac.so.0
#12 0x003bfa7c in giac::normal(giac::gen const&, bool, giac::context const*) ()