version 1.14, 2001/07/03 01:41:25 |
version 1.17, 2001/09/03 07:01:06 |
|
|
/* $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" |
#include "ca.h" |
|
|
|
|
/* f(x,y) -> f(x,y+ev) */ |
/* f(x,y) -> f(x,y+ev) */ |
fl = BMALLOC(dx,dy); |
fl = BMALLOC(dx,dy); |
ptosfbm(dy,f,fl); |
ptosfbm(dy,f,fl); |
shiftsfbm(fl,FTOIF(CONT(ev))); |
if ( ev ) shiftsfbm(fl,FTOIF(CONT(ev))); |
|
|
/* sf = f(x+ev) */ |
/* sf = f(x+ev) */ |
sfbmtop(fl,x,y,&sf); |
sfbmtop(fl,x,y,&sf); |
|
|
return; |
return; |
} |
} |
sfdtest(sf,list,x,y,&dc); |
sfdtest(sf,list,x,y,&dc); |
dx = getdeg(x,sf); |
if ( ev ) { |
dy = getdeg(y,sf); |
dx = getdeg(x,sf); |
W_BMALLOC(dx,dy,fl); |
dy = getdeg(y,sf); |
for ( dct = dc; dct; dct = NEXT(dct) ) { |
W_BMALLOC(dx,dy,fl); |
ptosfbm(dy,COEF(dct),fl); |
for ( dct = dc; dct; dct = NEXT(dct) ) { |
shiftsfbm(fl,_chsgnsf(FTOIF(CONT(ev)))); |
ptosfbm(dy,COEF(dct),fl); |
sfbmtop(fl,x,y,&COEF(dct)); |
shiftsfbm(fl,_chsgnsf(FTOIF(CONT(ev)))); |
|
sfbmtop(fl,x,y,&COEF(dct)); |
|
} |
} |
} |
*dcp = dc; |
*dcp = dc; |
} |
} |
|
|
if ( j >= 0 ) |
if ( j >= 0 ) |
return 0; |
return 0; |
sfbmtop(ql,x,y,qp); |
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; |
|
} |
} |
} |