=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/Fgfs.c,v retrieving revision 1.12 retrieving revision 1.16 diff -u -p -r1.12 -r1.16 --- OpenXM_contrib2/asir2000/engine/Fgfs.c 2002/11/26 07:09:45 1.12 +++ OpenXM_contrib2/asir2000/engine/Fgfs.c 2003/01/06 09:23:27 1.16 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.11 2002/11/22 08:44:57 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.15 2003/01/04 09:06:17 noro Exp $ */ #include "ca.h" @@ -50,13 +50,14 @@ void sqfrsf(VL vl, P f, DCP *dcp) { DCP dc,dct; Obj obj; - P t,s,c; - VL tvl,nvl; + P t,s,c,cont; + VL tvl,onevl; simp_ff((Obj)f,&obj); f = (P)obj; lex_lc(f,&c); divsp(vl,f,c,&t); f = t; monomialfctr(vl,f,&t,&dc); f = t; clctv(vl,f,&tvl); vl = tvl; + NEWVL(onevl); NEXT(onevl)=0; if ( !vl ) ; else if ( !NEXT(vl) ) { @@ -65,9 +66,9 @@ void sqfrsf(VL vl, P f, DCP *dcp) } else { t = f; for ( tvl = vl; tvl; tvl = NEXT(tvl) ) { - reordvar(vl,tvl->v,&nvl); - cont_pp_mv_sf(vl,NEXT(nvl),t,&c,&s); t = s; - sqfrsf(vl,c,&dct); + onevl->v = tvl->v; + cont_pp_mv_sf(vl,onevl,t,&cont,&s); t = s; + sqfrsf(vl,cont,&dct); dc = append_dc(dc,NEXT(dct)); } sqfrsfmain(vl,t,&dct); @@ -473,7 +474,12 @@ void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp) MP t; int i,m; P *ps; + struct order_spec spec, currentspec; + extern struct order_spec dp_current_spec; + currentspec = dp_current_spec; + create_order_spec(0,&spec); + initd(&spec); ptod(vl,rvl,p,&dp); for ( t = BDY(dp), m = 0; t; t = NEXT(t), m++ ); ps = (P *)ALLOCA(m*sizeof(P)); @@ -481,6 +487,7 @@ void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp) ps[i] = C(t); gcdsf(vl,ps,m,c); divsp(vl,p,*c,pp); + initd(¤tspec); } void mfctrsf(VL vl, P f, DCP *dcp) @@ -822,13 +829,17 @@ void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P P *cu,*cv; GFSN inv; - /* adjust coeffs */ + /* check the validity of lc's and adjust coeffs */ + /* f -> lcu*lcv*x^(m+l)+... */ + mulp(vl,lcu,lcv,&t); + if ( !divtp(vl,t,LC(f),&m) ) { + *up = 0; return; + } + mulp(vl,m,f,&t); f = t; /* u0 = am x^m+ ... -> lcu*x^m + a(m-1)*(lcu(mev)/am)*x^(m-1)+... */ /* v0 = bm x^l+ ... -> lcv*x^l + b(l-1)*(lcv(mev)/bl)*x^(l-1)+... */ - /* f -> lcu*lcv*x^(m+l)+... */ adjust_coef_sf(vl,rvl,lcu,u0,mev,&u); adjust_coef_sf(vl,rvl,lcv,v0,mev,&v); - mulp(vl,lcu,lcv,&t); divsp(vl,t,LC(f),&m); mulp(vl,m,f,&t); f = t; /* f <- f(X+mev), u <- u(X+mev), v <- v(X+mev) */ fin = f;