version 1.20, 2001/10/30 10:24:35 |
version 1.21, 2001/11/19 00:57:11 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.19 2001/10/30 07:25:58 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.20 2001/10/30 10:24:35 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
|
|
Line 27 void fctrsf(P p,DCP *dcp) |
|
Line 27 void fctrsf(P p,DCP *dcp) |
|
|
|
simp_ff((Obj)p,&obj); p = (P)obj; |
simp_ff((Obj)p,&obj); p = (P)obj; |
if ( !p ) { |
if ( !p ) { |
*dcp = 0; return; |
NEWDC(dc); COEF(dc) = 0; DEG(dc) = ONE; |
|
NEXT(dc) = 0; *dcp = dc; |
|
return; |
} |
} |
mp = W_UMALLOC(UDEG(p)); |
mp = W_UMALLOC(UDEG(p)); |
ptosfum(p,mp); |
ptosfum(p,mp); |
Line 510 void ptosfbm(int,P,BM); |
|
Line 512 void ptosfbm(int,P,BM); |
|
|
|
/* f = f(x,y) */ |
/* f = f(x,y) */ |
|
|
void sfhensel(int count,P f,V x,GFS *evp,P *sfp,ML *listp) |
void sfhensel(int count,P f,V x,int degbound,GFS *evp,P *sfp,ML *listp) |
{ |
{ |
int i; |
int i; |
int fn; |
int fn; |
Line 521 void sfhensel(int count,P f,V x,GFS *evp,P *sfp,ML *li |
|
Line 523 void sfhensel(int count,P f,V x,GFS *evp,P *sfp,ML *li |
|
int dx,dy,bound; |
int dx,dy,bound; |
GFS ev; |
GFS ev; |
P f1,t,c,sf; |
P f1,t,c,sf; |
DCP dc; |
DCP dc,dct,dc0; |
UM q,fm,hm; |
UM q,fm,hm; |
UM *gm; |
UM *gm; |
struct oEGT tmp0,tmp1,eg_hensel,eg_hensel_t; |
struct oEGT tmp0,tmp1,eg_hensel,eg_hensel_t; |
Line 544 void sfhensel(int count,P f,V x,GFS *evp,P *sfp,ML *li |
|
Line 546 void sfhensel(int count,P f,V x,GFS *evp,P *sfp,ML *li |
|
*listp = rlist = MLALLOC(1); rlist->n = fn; rlist->c[0] = 0; |
*listp = rlist = MLALLOC(1); rlist->n = fn; rlist->c[0] = 0; |
return; |
return; |
} |
} |
/* pass the the leading coeff. to the first element */ |
if ( degbound >= 0 ) { |
c = dc->c; dc = NEXT(dc); |
/* |
mulp(vl,dc->c,c,&t); dc->c = t; |
* reconstruct dc so that |
|
* dc[1],... : factors satisfy degree bound |
|
* dc[0] : product of others |
|
*/ |
|
c = dc->c; dc = NEXT(dc); |
|
dc0 = 0; |
|
fn = 0; |
|
while ( dc ) { |
|
if ( getdeg(x,COEF(dc)) <= degbound ) { |
|
dct = NEXT(dc); NEXT(dc) = dc0; dc0 = dc; dc = dct; |
|
fn++; |
|
} else { |
|
mulp(vl,COEF(dc),c,&t); c = t; |
|
dc = NEXT(dc); |
|
} |
|
} |
|
if ( OID(c) == O_P ) { |
|
NEWDC(dc); COEF(dc) = c; DEG(dc) = ONE; NEXT(dc) = dc0; |
|
fn++; |
|
} else { |
|
mulp(vl,dc0->c,c,&t); dc0->c = t; dc = dc0; |
|
} |
|
} else { |
|
/* pass the the leading coeff. to the first element */ |
|
c = dc->c; dc = NEXT(dc); |
|
mulp(vl,dc->c,c,&t); dc->c = t; |
|
} |
|
|
/* convert mod y-a factors into UM */ |
/* convert mod y-a factors into UM */ |
gm = (UM *)ALLOCA(fn*sizeof(UM)); |
gm = (UM *)ALLOCA(fn*sizeof(UM)); |
Line 869 void sfsqfr(P f,DCP *dcp) |
|
Line 897 void sfsqfr(P f,DCP *dcp) |
|
NEWDC(dc); DEG(dc) = ONE; COEF(dc) = f; NEXT(dc) = 0; *dcp = dc; |
NEWDC(dc); DEG(dc) = ONE; COEF(dc) = f; NEXT(dc) = 0; *dcp = dc; |
} else if ( !NEXT(vl) ) |
} else if ( !NEXT(vl) ) |
sfusqfr(f,dcp); |
sfusqfr(f,dcp); |
|
#if 0 |
else if ( !NEXT(NEXT(vl)) ) |
else if ( !NEXT(NEXT(vl)) ) |
sfbsqfr(f,vl->v,NEXT(vl)->v,dcp); |
sfbsqfr(f,vl->v,NEXT(vl)->v,dcp); |
|
#endif |
else |
else |
error("sfsqfr : not implemented yet"); |
error("sfsqfr : not implemented yet"); |
} |
} |
Line 903 void sfusqfr(P f,DCP *dcp) |
|
Line 933 void sfusqfr(P f,DCP *dcp) |
|
*dcp = dct; |
*dcp = dct; |
} |
} |
|
|
|
void sfbsqfrmain(P f,V x,V y,DCP *dcp) |
|
{ |
|
/* XXX*/ |
|
} |
|
|
|
/* f is bivariate */ |
|
|
void sfbsqfr(P f,V x,V y,DCP *dcp) |
void sfbsqfr(P f,V x,V y,DCP *dcp) |
{ |
{ |
P t,rf,cx,cy; |
P t,rf,cx,cy; |
VL vl,rvl; |
VL vl,rvl; |
DCP dcx,dcy; |
DCP dcx,dcy,dct,dc; |
struct oVL vl0,vl1; |
struct oVL vl0,vl1; |
|
|
/* vl = [x,y] */ |
/* cy(y) = cont(f,x), f /= cy */ |
vl0.v = x; vl0.next = &vl1; vl1.v = y; vl1.next = 0; vl = &vl0; |
|
/* cy(y) = cont(f,x), f /= cx */ |
|
cont_pp_sfp(vl,f,&cy,&t); f = t; |
cont_pp_sfp(vl,f,&cy,&t); f = t; |
/* rvl = [y,x] */ |
/* rvl = [y,x] */ |
reordvar(vl,y,&rvl); reorderp(rvl,vl,f,&rf); |
reordvar(vl,y,&rvl); reorderp(rvl,vl,f,&rf); |
Line 921 void sfbsqfr(P f,V x,V y,DCP *dcp) |
|
Line 956 void sfbsqfr(P f,V x,V y,DCP *dcp) |
|
reorderp(vl,rvl,rf,&f); |
reorderp(vl,rvl,rf,&f); |
|
|
/* f -> cx*cy*f */ |
/* f -> cx*cy*f */ |
sfusqfr(cx,&dcx); |
sfsqfr(cx,&dcx); dcx = NEXT(dcx); |
sfusqfr(cy,&dcy); |
sfsqfr(cy,&dcy); dcy = NEXT(dcy); |
|
if ( dcx ) { |
|
for ( dct = dcx; NEXT(dct); dct = NEXT(dct) ); |
|
NEXT(dct) = dcy; |
|
} else |
|
dcx = dcy; |
|
if ( OID(f) == O_N ) |
|
*dcp = dcx; |
|
else { |
|
/* f must be bivariate */ |
|
sfbsqfrmain(f,x,y,&dc); |
|
if ( dcx ) { |
|
for ( dct = dcx; NEXT(dct); dct = NEXT(dct) ); |
|
NEXT(dct) = dc; |
|
} else |
|
dcx = dc; |
|
*dcp = dcx; |
|
} |
} |
} |
|
|
void sfdtest(P,ML,V,V,DCP *); |
void sfdtest(P,ML,V,V,DCP *); |
|
|
void sfbfctr(P f,V x,V y,DCP *dcp) |
/* if degbound >= 0 find factor s.t. deg_x(factor) <= degbound */ |
|
|
|
void sfbfctr(P f,V x,V y,int degbound,DCP *dcp) |
{ |
{ |
ML list; |
ML list; |
P sf; |
P sf; |
Line 937 void sfbfctr(P f,V x,V y,DCP *dcp) |
|
Line 991 void sfbfctr(P f,V x,V y,DCP *dcp) |
|
int dx,dy; |
int dx,dy; |
|
|
/* sf(x) = f(x+ev) = list->c[0]*list->c[1]*... */ |
/* sf(x) = f(x+ev) = list->c[0]*list->c[1]*... */ |
sfhensel(5,f,x,&ev,&sf,&list); |
sfhensel(5,f,x,degbound,&ev,&sf,&list); |
if ( list->n == 0 ) |
if ( list->n == 0 ) |
error("sfbfctr : short of evaluation points"); |
error("sfbfctr : short of evaluation points"); |
else if ( list->n == 1 ) { |
else if ( list->n == 1 ) { |