=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/dp-supp.c,v retrieving revision 1.20 retrieving revision 1.23 diff -u -p -r1.20 -r1.23 --- OpenXM_contrib2/asir2000/builtin/dp-supp.c 2001/10/09 01:36:05 1.20 +++ OpenXM_contrib2/asir2000/builtin/dp-supp.c 2003/01/04 09:06:15 1.23 @@ -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/builtin/dp-supp.c,v 1.19 2001/09/19 09:10:34 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.22 2002/12/27 07:37:57 noro Exp $ */ #include "ca.h" #include "base.h" @@ -162,7 +162,8 @@ void dp_mbase(NODE hlist,NODE *mbase) while ( 1 ) { insert_to_node(d,mbase,nvar); for ( i = nvar-1; i >= 0; ) { - d->d[i]++; d->td++; + d->d[i]++; + d->td += MUL_WEIGHT(1,i); for ( j = 0; j < n; j++ ) { if ( _dl_redble(dl[j],d,nvar) ) break; @@ -171,7 +172,7 @@ void dp_mbase(NODE hlist,NODE *mbase) for ( j = nvar-1; j >= i; j-- ) d->d[j] = 0; for ( j = 0, td = 0; j < i; j++ ) - td += d->d[j]; + td += MUL_WEIGHT(d->d[j],j); d->td = td; i--; } else @@ -370,6 +371,22 @@ void dp_ptozp2_d(DP p0,DP p1,DP *hp,DP *rp) *hp = h; *rp = r; } +int have_sf_coef(P p) +{ + DCP dc; + + if ( !p ) + return 0; + else if ( NUM(p) ) + return NID((Num)p) == N_GFS ? 1 : 0; + else { + for ( dc = DC(p); dc; dc = NEXT(dc) ) + if ( have_sf_coef(COEF(dc)) ) + return 1; + return 0; + } +} + void dp_prim(DP p,DP *rp) { P t,g; @@ -382,7 +399,29 @@ void dp_prim(DP p,DP *rp) if ( !p ) *rp = 0; - else if ( dp_fcoeffs ) + else if ( dp_fcoeffs == N_GFS ) { + for ( m = BDY(p); m; m = NEXT(m) ) + if ( OID(m->c) == O_N ) { + /* GCD of coeffs = 1 */ + *rp = p; + return; + } else break; + /* compute GCD over the finite fieid */ + for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ ); + w = (P *)ALLOCA(n*sizeof(P)); + for ( m = BDY(p), i = 0; i < n; m = NEXT(m), i++ ) + w[i] = m->c; + gcdsf(CO,w,n,&g); + if ( NUM(g) ) + *rp = p; + else { + for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) { + NEXTMP(mr0,mr); divsp(CO,m->c,g,&mr->c); mr->dl = m->dl; + } + NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar; + } + return; + } else if ( dp_fcoeffs ) *rp = p; else if ( NoGCD ) dp_ptozp(p,rp); @@ -500,7 +539,7 @@ void dp_sp(DP p1,DP p2,DP *rp) n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; w = (int *)ALLOCA(n*sizeof(int)); for ( i = 0, td = 0; i < n; i++ ) { - w[i] = MAX(d1->d[i],d2->d[i]); td += w[i]; + w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i); } NEWDL(d,n); d->td = td - d1->td; @@ -553,7 +592,7 @@ void _dp_sp_dup(DP p1,DP p2,DP *rp) n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; w = (int *)ALLOCA(n*sizeof(int)); for ( i = 0, td = 0; i < n; i++ ) { - w[i] = MAX(d1->d[i],d2->d[i]); td += w[i]; + w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i); } _NEWDL(d,n); d->td = td - d1->td; @@ -604,7 +643,7 @@ void dp_sp_mod(DP p1,DP p2,int mod,DP *rp) n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; w = (int *)ALLOCA(n*sizeof(int)); for ( i = 0, td = 0; i < n; i++ ) { - w[i] = MAX(d1->d[i],d2->d[i]); td += w[i]; + w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i); } NEWDL_NOINIT(d,n); d->td = td - d1->td; for ( i = 0; i < n; i++ ) @@ -630,7 +669,7 @@ void _dp_sp_mod_dup(DP p1,DP p2,int mod,DP *rp) n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; w = (int *)ALLOCA(n*sizeof(int)); for ( i = 0, td = 0; i < n; i++ ) { - w[i] = MAX(d1->d[i],d2->d[i]); td += w[i]; + w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i); } _NEWDL(d,n); d->td = td - d1->td; for ( i = 0; i < n; i++ ) @@ -656,7 +695,7 @@ void _dp_sp_mod(DP p1,DP p2,int mod,DP *rp) n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; w = (int *)ALLOCA(n*sizeof(int)); for ( i = 0, td = 0; i < n; i++ ) { - w[i] = MAX(d1->d[i],d2->d[i]); td += w[i]; + w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i); } NEWDL(d,n); d->td = td - d1->td; for ( i = 0; i < n; i++ ) @@ -687,13 +726,18 @@ void dp_red(DP p0,DP p1,DP p2,DP *head,DP *rest,P *dnp Q c,c1,c2; N gn,tn; P g,a; + P p[2]; n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; NEWDL(d,n); d->td = d1->td - d2->td; for ( i = 0; i < n; i++ ) d->d[i] = d1->d[i]-d2->d[i]; c1 = (Q)BDY(p1)->c; c2 = (Q)BDY(p2)->c; - if ( dp_fcoeffs ) { + if ( dp_fcoeffs == N_GFS ) { + p[0] = (P)c1; p[1] = (P)c2; + gcdsf(CO,p,2,&g); + divsp(CO,(P)c1,g,&a); c1 = (Q)a; divsp(CO,(P)c2,g,&a); c2 = (Q)a; + } else if ( dp_fcoeffs ) { /* do nothing */ } else if ( INT(c1) && INT(c2) ) { gcdn(NM(c1),NM(c2),&gn); @@ -1537,12 +1581,14 @@ void dp_rest(DP p,DP *rp) DL lcm_of_DL(int nv,DL dl1,DL dl2,DL dl) { - register int n, *d1, *d2, *d, td; + register int i, *d1, *d2, *d, td; if ( !dl ) NEWDL(dl,nv); d = dl->d, d1 = dl1->d, d2 = dl2->d; - for ( td = 0, n = nv; --n >= 0; d1++, d2++, d++ ) - td += (*d = *d1 > *d2 ? *d1 : *d2 ); + for ( td = 0, i = 0; i < nv; d1++, d2++, d++, i++ ) { + *d = *d1 > *d2 ? *d1 : *d2; + td += MUL_WEIGHT(*d,i); + } dl->td = td; return dl; }