=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/F.c,v retrieving revision 1.4 retrieving revision 1.6 diff -u -p -r1.4 -r1.6 --- OpenXM_contrib2/asir2000/engine/F.c 2000/08/22 05:04:04 1.4 +++ OpenXM_contrib2/asir2000/engine/F.c 2001/04/20 02:34:21 1.6 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/F.c,v 1.3 2000/08/21 08:31:24 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/F.c,v 1.5 2001/04/19 04:52:41 noro Exp $ */ #include "ca.h" #include @@ -273,13 +273,14 @@ VL vl; P p; DCP *dcp; { - int i,j,k,*win,np; + int i,j,k,*win,np,x; VL nvl,tvl; VN vn,vnt,vn1; P p0,f,g,f0,g0,s,t,lp,m; P *fp0,*fpt,*l,*tl; DCP dc,dc0,dcl; int count,nv; + int *nonzero; if ( !cmpq(DEG(DC(p)),ONE) ) { NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0; @@ -289,9 +290,56 @@ DCP *dcp; for ( nv = 0, tvl = nvl; tvl; tvl = NEXT(tvl), nv++); W_CALLOC(nv,struct oVN,vn); W_CALLOC(nv,struct oVN,vnt); W_CALLOC(nv,struct oVN,vn1); + W_CALLOC(nv,int,nonzero); + for ( i = 0, tvl = NEXT(nvl); tvl; tvl = NEXT(tvl), i++ ) vn1[i].v = vn[i].v = tvl->v; vn1[i].v = vn[i].v = 0; + + /* determine a heuristic bound of deg(GCD(p,p')) */ + while ( 1 ) { + for ( i = 0; vn1[i].v; i++ ) + vn1[i].n = ((unsigned int)random())%256+1; + substvp(nvl,LC(p),vn1,&p0); + if ( p0 ) { + substvp(nvl,p,vn1,&p0); + if ( sqfrchk(p0) ) { + ufctr(p0,1,&dc0); + if ( NEXT(NEXT(dc0)) == 0 ) { + NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0; + *dcp = dc; + return; + } else { + for ( dc0 = NEXT(dc0), np = 0; dc0; dc0 = NEXT(dc0), np++ ); + break; + } + } + } + } + + /* determine the position of variables which is not allowed to + be set to 0 */ + for ( i = 0; vn1[i].v; i++ ) { + x = vn1[i].n; vn1[i].n = 0; + substvp(nvl,LC(p),vn1,&p0); + if ( !p0 ) + vn1[i].n = x; + else { + substvp(nvl,p,vn1,&p0); + if ( !sqfrchk(p0) ) + vn1[i].n = x; + else { + ufctr(p0,1,&dc0); + for ( dc0 = NEXT(dc0), j = 0; dc0; dc0 = NEXT(dc0), j++ ); + if ( j > np ) + vn1[i].n = x; + } + } + } + for ( i = 0; vn1[i].v; i++ ) + if (vn1[i].n ) + nonzero[i] = 1; + count = 0; while ( 1 ) { while ( 1 ) { @@ -315,14 +363,26 @@ DCP *dcp; NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0; *dcp = dc; return; - } else - goto MAIN; - } + } else { + for ( dc = NEXT(dc0), i = 0; dc; dc = NEXT(dc), i++ ); + if ( i <= np ) + goto MAIN; + if ( i < np ) + np = i; + } + } } if ( nextbin(vnt,j) ) break; } - next(vn); + while ( 1 ) { + next(vn); + for ( i = 0; vn[i].v; i++ ) + if ( nonzero[i] && !vn[i].n ) + break; + if ( !vn[i].v ) + break; + } } MAIN : #if 0 @@ -777,7 +837,33 @@ DCP *dcp; vn1[i].v = vn[i].v = tvl->v; vn1[i].v = vn[i].v = 0; - for ( dcr0 = 0, g = p, d = deg(VR(g),g), found = 0; ; ) { + /* determine a heuristic bound of deg(GCD(p,p')) */ + while ( 1 ) { + for ( i = 0; vn1[i].v; i++ ) + vn1[i].n = ((unsigned int)random())%256+1; + substvp(nvl,LC(p),vn1,&tmp); + if ( tmp ) { + substvp(nvl,p,vn1,&p0); + usqp(p0,&dc0); + for ( d1 = 0, dc = dc0; dc; dc = NEXT(dc) ) + if ( DEG(dc) ) + d1 += (QTOS(DEG(dc))-1)*UDEG(COEF(dc)); + if ( d1 == 0 ) { + /* p is squarefree */ + NEWDC(dc); DEG(dc) = ONE; COEF(dc) = p; NEXT(dc) = 0; + *dcp = dc; + return; + } else { + d = d1; + found = 1; + sp0 = p0; sdc0 = dc0; + bcopy((char *)vn1,(char *)svn1,(int)(sizeof(struct oVN)*nv)); + break; + } + } + } + + for ( dcr0 = 0, g = p; ; ) { while ( 1 ) { for ( i = 0, j = 0; vn[i].v; i++ ) if ( vn[i].n ) vnt[j++].v = (V)i;