=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/Hgfs.c,v retrieving revision 1.14 retrieving revision 1.17 diff -u -p -r1.14 -r1.17 --- OpenXM_contrib2/asir2000/engine/Hgfs.c 2001/07/03 01:41:25 1.14 +++ OpenXM_contrib2/asir2000/engine/Hgfs.c 2001/09/03 07:01:06 1.17 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.13 2001/06/29 09:08:53 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.16 2001/09/03 01:04:26 noro Exp $ */ #include "ca.h" @@ -614,7 +614,7 @@ ML *listp; /* f(x,y) -> f(x,y+ev) */ fl = BMALLOC(dx,dy); ptosfbm(dy,f,fl); - shiftsfbm(fl,FTOIF(CONT(ev))); + if ( ev ) shiftsfbm(fl,FTOIF(CONT(ev))); /* sf = f(x+ev) */ sfbmtop(fl,x,y,&sf); @@ -1028,13 +1028,15 @@ DCP *dcp; return; } sfdtest(sf,list,x,y,&dc); - dx = getdeg(x,sf); - dy = getdeg(y,sf); - W_BMALLOC(dx,dy,fl); - for ( dct = dc; dct; dct = NEXT(dct) ) { - ptosfbm(dy,COEF(dct),fl); - shiftsfbm(fl,_chsgnsf(FTOIF(CONT(ev)))); - sfbmtop(fl,x,y,&COEF(dct)); + if ( ev ) { + dx = getdeg(x,sf); + dy = getdeg(y,sf); + W_BMALLOC(dx,dy,fl); + for ( dct = dc; dct; dct = NEXT(dct) ) { + ptosfbm(dy,COEF(dct),fl); + shiftsfbm(fl,_chsgnsf(FTOIF(CONT(ev)))); + sfbmtop(fl,x,y,&COEF(dct)); + } } *dcp = dc; } @@ -1367,4 +1369,51 @@ P *qp; if ( j >= 0 ) return 0; sfbmtop(ql,x,y,qp); +} + +/* XXX generate an irreducible poly of degree n */ + +extern int current_gfs_q1; + +void generate_defpoly_sfum(n,dp) +int n; +UM *dp; +{ + UM r,dr,t,g; + UM *f; + int *c,*w; + int max,i,j; + + *dp = r = UMALLOC(n); + DEG(r) = n; + c = COEF(r); + c[n] = _onesf(); + max = current_gfs_q1; + w = (int *)ALLOCA(n*sizeof(int)); + bzero(w,n*sizeof(int)); + + dr = W_UMALLOC(n); t = W_UMALLOC(n); g = W_UMALLOC(n); + f = (UM *)ALLOCA((n+1)*sizeof(UM)); + while ( 1 ) { + for ( i = 0; i < n && w[i] == max; i++ ); + if ( i == n ) { + /* XXX cannot happen */ + error("generate_defpoly_sfum : cannot happen"); + } + for ( j = 0; j < i; j++ ) + w[j] = 0; + w[i]++; + for ( i = 0; i < n; i++ ) + c[i] = w[i]?FTOIF(w[i]-1):0; + if ( !c[0] ) + continue; + diffsfum(r,dr); cpyum(r,t); gcdsfum(t,dr,g); + if ( DEG(g) > 0 ) + continue; + + czsfum(r,f); + for ( i = 0; f[i]; i++ ); + if ( i == 1 ) + return; + } }