version 1.12, 2002/11/26 07:09:45 |
version 1.17, 2003/01/13 06:40:41 |
|
|
/* $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.16 2003/01/06 09:23:27 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
|
|
Line 25 void gfsn_poly_to_poly_main(P f,V v,P *r); |
|
Line 25 void gfsn_poly_to_poly_main(P f,V v,P *r); |
|
void gfsn_univariate_to_sfbm(P f,int dy,BM *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 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) |
void lex_lc(P f,P *c) |
{ |
{ |
if ( !f || NUM(f) ) |
if ( !f || NUM(f) ) |
Line 50 void sqfrsf(VL vl, P f, DCP *dcp) |
|
Line 73 void sqfrsf(VL vl, P f, DCP *dcp) |
|
{ |
{ |
DCP dc,dct; |
DCP dc,dct; |
Obj obj; |
Obj obj; |
P t,s,c; |
P t,s,c,cont; |
VL tvl,nvl; |
VL tvl,onevl; |
|
|
simp_ff((Obj)f,&obj); f = (P)obj; |
simp_ff((Obj)f,&obj); f = (P)obj; |
lex_lc(f,&c); divsp(vl,f,c,&t); f = t; |
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; |
clctv(vl,f,&tvl); vl = tvl; |
|
NEWVL(onevl); NEXT(onevl)=0; |
if ( !vl ) |
if ( !vl ) |
; |
; |
else if ( !NEXT(vl) ) { |
else if ( !NEXT(vl) ) { |
Line 65 void sqfrsf(VL vl, P f, DCP *dcp) |
|
Line 89 void sqfrsf(VL vl, P f, DCP *dcp) |
|
} else { |
} else { |
t = f; |
t = f; |
for ( tvl = vl; tvl; tvl = NEXT(tvl) ) { |
for ( tvl = vl; tvl; tvl = NEXT(tvl) ) { |
reordvar(vl,tvl->v,&nvl); |
onevl->v = tvl->v; |
cont_pp_mv_sf(vl,NEXT(nvl),t,&c,&s); t = s; |
cont_pp_mv_sf(vl,onevl,t,&cont,&s); t = s; |
sqfrsf(vl,c,&dct); |
sqfrsf(vl,cont,&dct); |
dc = append_dc(dc,NEXT(dct)); |
dc = append_dc(dc,NEXT(dct)); |
} |
} |
sqfrsfmain(vl,t,&dct); |
sqfrsfmain(vl,t,&dct); |
Line 473 void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp) |
|
Line 497 void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp) |
|
MP t; |
MP t; |
int i,m; |
int i,m; |
P *ps; |
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); |
ptod(vl,rvl,p,&dp); |
for ( t = BDY(dp), m = 0; t; t = NEXT(t), m++ ); |
for ( t = BDY(dp), m = 0; t; t = NEXT(t), m++ ); |
ps = (P *)ALLOCA(m*sizeof(P)); |
ps = (P *)ALLOCA(m*sizeof(P)); |
Line 481 void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp) |
|
Line 510 void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp) |
|
ps[i] = C(t); |
ps[i] = C(t); |
gcdsf(vl,ps,m,c); |
gcdsf(vl,ps,m,c); |
divsp(vl,p,*c,pp); |
divsp(vl,p,*c,pp); |
|
initd(¤tspec); |
} |
} |
|
|
void mfctrsf(VL vl, P f, DCP *dcp) |
void mfctrsf(VL vl, P f, DCP *dcp) |
Line 822 void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P |
|
Line 852 void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P |
|
P *cu,*cv; |
P *cu,*cv; |
GFSN inv; |
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)+... */ |
/* 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)+... */ |
/* 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,lcu,u0,mev,&u); |
adjust_coef_sf(vl,rvl,lcv,v0,mev,&v); |
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) */ |
/* f <- f(X+mev), u <- u(X+mev), v <- v(X+mev) */ |
fin = f; |
fin = f; |