=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/dp-supp.c,v retrieving revision 1.20 retrieving revision 1.25 diff -u -p -r1.20 -r1.25 --- OpenXM_contrib2/asir2000/builtin/dp-supp.c 2001/10/09 01:36:05 1.20 +++ OpenXM_contrib2/asir2000/builtin/dp-supp.c 2003/01/18 02:38:56 1.25 @@ -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.24 2003/01/15 04:53:03 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,44 @@ 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 head_coef(P p,Num *c) +{ + if ( !p ) + *c = 0; + else if ( NUM(p) ) + *c = (Num)p; + else + head_coef(COEF(DC(p)),c); +} + +void dp_monic_sf(DP p,DP *rp) +{ + Num c; + + if ( !p ) + *rp = 0; + else { + head_coef(BDY(p)->c,&c); + divsdc(CO,p,(P)c,rp); + } +} + void dp_prim(DP p,DP *rp) { P t,g; @@ -382,7 +421,30 @@ 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 */ + dp_monic_sf(p,rp); + 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) ) + dp_monic_sf(p,rp); + 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,p1); p1->sugar = p->sugar; + dp_monic_sf(p1,rp); + } + return; + } else if ( dp_fcoeffs ) *rp = p; else if ( NoGCD ) dp_ptozp(p,rp); @@ -500,7 +562,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 +615,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 +666,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 +692,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 +718,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 +749,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); @@ -1221,6 +1288,27 @@ void dp_nf_tab_mod(DP p,LIST *tab,int mod,DP *rp) *rp = s; } +void dp_nf_tab_f(DP p,LIST *tab,DP *rp) +{ + DP s,t,u; + MP m; + DL h; + int i,n; + + if ( !p ) { + *rp = p; return; + } + n = p->nv; + for ( s = 0, i = 0, m = BDY(p); m; m = NEXT(m) ) { + h = m->dl; + while ( !dl_equal(n,h,BDY((DP)BDY(BDY(tab[i])))->dl ) ) + i++; + muldc(CO,(DP)BDY(NEXT(BDY(tab[i]))),m->c,&t); + addd(CO,s,t,&u); s = u; + } + *rp = s; +} + /* * setting flags * @@ -1537,12 +1625,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; }