=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/Fgfs.c,v retrieving revision 1.14 retrieving revision 1.20 diff -u -p -r1.14 -r1.20 --- OpenXM_contrib2/asir2000/engine/Fgfs.c 2002/12/18 06:15:40 1.14 +++ OpenXM_contrib2/asir2000/engine/Fgfs.c 2004/02/03 23:31:57 1.20 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.13 2002/11/26 08:21:49 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.19 2003/03/12 02:06:11 noro Exp $ */ #include "ca.h" @@ -25,6 +25,29 @@ void gfsn_poly_to_poly_main(P f,V v,P *r); void gfsn_univariate_to_sfbm(P f,int dy,BM *r); void sfbm_to_gfsn_univariate(BM f,V x,V y,P *r); +void monomialfctr_sf(VL vl,P p,P *pr,DCP *dcp) +{ + VL nvl,avl; + Q d; + P f,t,s; + DCP dc0,dc; + Obj obj; + + clctv(vl,p,&nvl); + for ( dc0 = 0, avl = nvl, f = p; avl; avl = NEXT(avl) ) { + getmindeg(avl->v,f,&d); + if ( d ) { + MKV(avl->v,t); + simp_ff((Obj)t,&obj); t = (P)obj; + NEXTDC(dc0,dc); DEG(dc) = d; COEF(dc) = t; + pwrp(vl,t,d,&s); divsp(vl,f,s,&t); f = t; + } + } + if ( dc0 ) + NEXT(dc) = 0; + *pr = f; *dcp = dc0; +} + void lex_lc(P f,P *c) { if ( !f || NUM(f) ) @@ -55,7 +78,7 @@ void sqfrsf(VL vl, P f, DCP *dcp) 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; + monomialfctr_sf(vl,f,&t,&dc); f = t; clctv(vl,f,&tvl); vl = tvl; NEWVL(onevl); NEXT(onevl)=0; if ( !vl ) @@ -474,7 +497,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,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)); @@ -482,6 +510,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(currentspec); } void mfctrsf(VL vl, P f, DCP *dcp) @@ -532,7 +561,7 @@ void mfctrsfmain(VL vl, P f, DCP *dcp) return; } for ( n = 0, tvl = vl; tvl; tvl = NEXT(tvl), n++ ); - va = (V *)ALLOCA(n*sizeof(int)); + va = (V *)ALLOCA(n*sizeof(V)); da = (int *)ALLOCA(n*sizeof(int)); /* find v s.t. diff(f,v) is nonzero and deg(f,v) is minimal */ imin = -1; @@ -950,6 +979,12 @@ void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P addp(vl,v,wv,&t); v = t; addp(vl,vh[j],wv,&t); vh[j] = t; } + gfsn_poly_to_poly(vl,u,vy,&t); + shift_sf(vl,rvl,t,mev,-1,&s); + if ( divtp(vl,fin,s,&q) ) + cont_pp_mv_sf(vl,onevl,s,&cont,up); + else + *up = 0; } void adjust_coef_sf(VL vl,VL rvl,P lcu,P u0,int *mev,P *r)