version 1.20, 2001/10/09 01:36:05 |
version 1.24, 2003/01/15 04:53:03 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* 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.23 2003/01/04 09:06:15 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "base.h" |
#include "base.h" |
Line 162 void dp_mbase(NODE hlist,NODE *mbase) |
|
Line 162 void dp_mbase(NODE hlist,NODE *mbase) |
|
while ( 1 ) { |
while ( 1 ) { |
insert_to_node(d,mbase,nvar); |
insert_to_node(d,mbase,nvar); |
for ( i = nvar-1; i >= 0; ) { |
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++ ) { |
for ( j = 0; j < n; j++ ) { |
if ( _dl_redble(dl[j],d,nvar) ) |
if ( _dl_redble(dl[j],d,nvar) ) |
break; |
break; |
Line 171 void dp_mbase(NODE hlist,NODE *mbase) |
|
Line 172 void dp_mbase(NODE hlist,NODE *mbase) |
|
for ( j = nvar-1; j >= i; j-- ) |
for ( j = nvar-1; j >= i; j-- ) |
d->d[j] = 0; |
d->d[j] = 0; |
for ( j = 0, td = 0; j < i; j++ ) |
for ( j = 0, td = 0; j < i; j++ ) |
td += d->d[j]; |
td += MUL_WEIGHT(d->d[j],j); |
d->td = td; |
d->td = td; |
i--; |
i--; |
} else |
} else |
Line 370 void dp_ptozp2_d(DP p0,DP p1,DP *hp,DP *rp) |
|
Line 371 void dp_ptozp2_d(DP p0,DP p1,DP *hp,DP *rp) |
|
*hp = h; *rp = r; |
*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) |
void dp_prim(DP p,DP *rp) |
{ |
{ |
P t,g; |
P t,g; |
Line 382 void dp_prim(DP p,DP *rp) |
|
Line 399 void dp_prim(DP p,DP *rp) |
|
|
|
if ( !p ) |
if ( !p ) |
*rp = 0; |
*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; |
*rp = p; |
else if ( NoGCD ) |
else if ( NoGCD ) |
dp_ptozp(p,rp); |
dp_ptozp(p,rp); |
Line 500 void dp_sp(DP p1,DP p2,DP *rp) |
|
Line 539 void dp_sp(DP p1,DP p2,DP *rp) |
|
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
w = (int *)ALLOCA(n*sizeof(int)); |
w = (int *)ALLOCA(n*sizeof(int)); |
for ( i = 0, td = 0; i < n; i++ ) { |
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; |
NEWDL(d,n); d->td = td - d1->td; |
Line 553 void _dp_sp_dup(DP p1,DP p2,DP *rp) |
|
Line 592 void _dp_sp_dup(DP p1,DP p2,DP *rp) |
|
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
w = (int *)ALLOCA(n*sizeof(int)); |
w = (int *)ALLOCA(n*sizeof(int)); |
for ( i = 0, td = 0; i < n; i++ ) { |
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; |
_NEWDL(d,n); d->td = td - d1->td; |
Line 604 void dp_sp_mod(DP p1,DP p2,int mod,DP *rp) |
|
Line 643 void dp_sp_mod(DP p1,DP p2,int mod,DP *rp) |
|
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
w = (int *)ALLOCA(n*sizeof(int)); |
w = (int *)ALLOCA(n*sizeof(int)); |
for ( i = 0, td = 0; i < n; i++ ) { |
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; |
NEWDL_NOINIT(d,n); d->td = td - d1->td; |
for ( i = 0; i < n; i++ ) |
for ( i = 0; i < n; i++ ) |
Line 630 void _dp_sp_mod_dup(DP p1,DP p2,int mod,DP *rp) |
|
Line 669 void _dp_sp_mod_dup(DP p1,DP p2,int mod,DP *rp) |
|
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
w = (int *)ALLOCA(n*sizeof(int)); |
w = (int *)ALLOCA(n*sizeof(int)); |
for ( i = 0, td = 0; i < n; i++ ) { |
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; |
_NEWDL(d,n); d->td = td - d1->td; |
for ( i = 0; i < n; i++ ) |
for ( i = 0; i < n; i++ ) |
Line 656 void _dp_sp_mod(DP p1,DP p2,int mod,DP *rp) |
|
Line 695 void _dp_sp_mod(DP p1,DP p2,int mod,DP *rp) |
|
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
w = (int *)ALLOCA(n*sizeof(int)); |
w = (int *)ALLOCA(n*sizeof(int)); |
for ( i = 0, td = 0; i < n; i++ ) { |
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; |
NEWDL(d,n); d->td = td - d1->td; |
for ( i = 0; i < n; i++ ) |
for ( i = 0; i < n; i++ ) |
Line 687 void dp_red(DP p0,DP p1,DP p2,DP *head,DP *rest,P *dnp |
|
Line 726 void dp_red(DP p0,DP p1,DP p2,DP *head,DP *rest,P *dnp |
|
Q c,c1,c2; |
Q c,c1,c2; |
N gn,tn; |
N gn,tn; |
P g,a; |
P g,a; |
|
P p[2]; |
|
|
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; |
NEWDL(d,n); d->td = d1->td - d2->td; |
NEWDL(d,n); d->td = d1->td - d2->td; |
for ( i = 0; i < n; i++ ) |
for ( i = 0; i < n; i++ ) |
d->d[i] = d1->d[i]-d2->d[i]; |
d->d[i] = d1->d[i]-d2->d[i]; |
c1 = (Q)BDY(p1)->c; c2 = (Q)BDY(p2)->c; |
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 */ |
/* do nothing */ |
} else if ( INT(c1) && INT(c2) ) { |
} else if ( INT(c1) && INT(c2) ) { |
gcdn(NM(c1),NM(c2),&gn); |
gcdn(NM(c1),NM(c2),&gn); |
Line 1221 void dp_nf_tab_mod(DP p,LIST *tab,int mod,DP *rp) |
|
Line 1265 void dp_nf_tab_mod(DP p,LIST *tab,int mod,DP *rp) |
|
*rp = s; |
*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 |
* setting flags |
* |
* |
Line 1537 void dp_rest(DP p,DP *rp) |
|
Line 1602 void dp_rest(DP p,DP *rp) |
|
|
|
DL lcm_of_DL(int nv,DL dl1,DL dl2,DL dl) |
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); |
if ( !dl ) NEWDL(dl,nv); |
d = dl->d, d1 = dl1->d, d2 = dl2->d; |
d = dl->d, d1 = dl1->d, d2 = dl2->d; |
for ( td = 0, n = nv; --n >= 0; d1++, d2++, d++ ) |
for ( td = 0, i = 0; i < nv; d1++, d2++, d++, i++ ) { |
td += (*d = *d1 > *d2 ? *d1 : *d2 ); |
*d = *d1 > *d2 ? *d1 : *d2; |
|
td += MUL_WEIGHT(*d,i); |
|
} |
dl->td = td; |
dl->td = td; |
return dl; |
return dl; |
} |
} |