version 1.11, 2000/12/13 05:37:29 |
version 1.13, 2001/09/04 08:48:18 |
|
|
* 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.10 2000/12/11 02:00:40 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.12 2001/02/21 07:10:17 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "base.h" |
#include "base.h" |
|
|
|
|
/* |
/* |
* m-reduction |
* m-reduction |
|
* do content reduction over Z or Q(x,...) |
|
* do nothing over finite fields |
* |
* |
*/ |
*/ |
|
|
|
|
*head = h; *rest = r; *dnp = (P)c2; |
*head = h; *rest = r; *dnp = (P)c2; |
} |
} |
|
|
|
/* m-reduction over a field */ |
|
|
|
void dp_red_f(p1,p2,rest) |
|
DP p1,p2; |
|
DP *rest; |
|
{ |
|
int i,n; |
|
DL d1,d2,d; |
|
MP m; |
|
DP t,s,r,h; |
|
Obj a,b; |
|
|
|
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]; |
|
|
|
NEWMP(m); m->dl = d; |
|
divr(CO,(Obj)BDY(p1)->c,(Obj)BDY(p2)->c,&a); chsgnr(a,&b); |
|
C(m) = (P)b; |
|
NEXT(m) = 0; MKDP(n,m,s); s->sugar = d->td; |
|
|
|
muld(CO,s,p2,&t); addd(CO,p1,t,rest); |
|
} |
|
|
void dp_red_mod(p0,p1,p2,mod,head,rest,dnp) |
void dp_red_mod(p0,p1,p2,mod,head,rest,dnp) |
DP p0,p1,p2; |
DP p0,p1,p2; |
int mod; |
int mod; |
|
|
*rp = d; *dnp = dn; |
*rp = d; *dnp = dn; |
} |
} |
|
|
void dp_nf_ptozp(b,g,ps,full,multiple,rp) |
/* nf computation over Z */ |
|
|
|
void dp_nf_z(b,g,ps,full,multiple,rp) |
NODE b; |
NODE b; |
DP g; |
DP g; |
DP *ps; |
DP *ps; |
|
|
wb = (int *)ALLOCA(n*sizeof(int)); |
wb = (int *)ALLOCA(n*sizeof(int)); |
for ( i = 0, l = b; i < n; l = NEXT(l), i++ ) |
for ( i = 0, l = b; i < n; l = NEXT(l), i++ ) |
wb[i] = QTOS((Q)BDY(l)); |
wb[i] = QTOS((Q)BDY(l)); |
|
|
hmag = multiple*HMAG(g); |
hmag = multiple*HMAG(g); |
sugar = g->sugar; |
sugar = g->sugar; |
|
|
for ( d = 0; g; ) { |
for ( d = 0; g; ) { |
for ( u = 0, i = 0; i < n; i++ ) { |
for ( u = 0, i = 0; i < n; i++ ) { |
if ( dp_redble(g,p = ps[wb[i]]) ) { |
if ( dp_redble(g,p = ps[wb[i]]) ) { |
|
|
*rp = d; |
*rp = d; |
} |
} |
|
|
|
/* nf computation over a field */ |
|
|
|
void dp_nf_f(b,g,ps,full,rp) |
|
NODE b; |
|
DP g; |
|
DP *ps; |
|
int full; |
|
DP *rp; |
|
{ |
|
DP u,p,d,s,t; |
|
P dmy; |
|
NODE l; |
|
MP m,mr; |
|
int i,n; |
|
int *wb; |
|
int sugar,psugar; |
|
|
|
if ( !g ) { |
|
*rp = 0; return; |
|
} |
|
for ( n = 0, l = b; l; l = NEXT(l), n++ ); |
|
wb = (int *)ALLOCA(n*sizeof(int)); |
|
for ( i = 0, l = b; i < n; l = NEXT(l), i++ ) |
|
wb[i] = QTOS((Q)BDY(l)); |
|
|
|
sugar = g->sugar; |
|
for ( d = 0; g; ) { |
|
for ( u = 0, i = 0; i < n; i++ ) { |
|
if ( dp_redble(g,p = ps[wb[i]]) ) { |
|
dp_red_f(g,p,&u); |
|
psugar = (BDY(g)->dl->td - BDY(p)->dl->td) + p->sugar; |
|
sugar = MAX(sugar,psugar); |
|
if ( !u ) { |
|
if ( d ) |
|
d->sugar = sugar; |
|
*rp = d; return; |
|
} |
|
break; |
|
} |
|
} |
|
if ( u ) |
|
g = u; |
|
else if ( !full ) { |
|
if ( g ) { |
|
MKDP(g->nv,BDY(g),t); t->sugar = sugar; g = t; |
|
} |
|
*rp = g; return; |
|
} else { |
|
m = BDY(g); NEWMP(mr); mr->dl = m->dl; mr->c = m->c; |
|
NEXT(mr) = 0; MKDP(g->nv,mr,t); t->sugar = mr->dl->td; |
|
addd(CO,d,t,&s); d = s; |
|
dp_rest(g,&t); g = t; |
|
} |
|
} |
|
if ( d ) |
|
d->sugar = sugar; |
|
*rp = d; |
|
} |
|
|
|
/* nf computation over GF(mod) (only for internal use) */ |
|
|
void dp_nf_mod(b,g,ps,mod,full,rp) |
void dp_nf_mod(b,g,ps,mod,full,rp) |
NODE b; |
NODE b; |
DP g; |
DP g; |
|
|
d->sugar = sugar; |
d->sugar = sugar; |
_dptodp(d,rp); _free_dp(d); |
_dptodp(d,rp); _free_dp(d); |
} |
} |
|
|
|
/* reduction by linear base over a field */ |
|
|
|
void dp_lnf_f(p1,p2,g,r1p,r2p) |
|
DP p1,p2; |
|
NODE g; |
|
DP *r1p,*r2p; |
|
{ |
|
DP r1,r2,b1,b2,t,s; |
|
Obj c,c1,c2; |
|
NODE l,b; |
|
int n; |
|
|
|
if ( !p1 ) { |
|
*r1p = p1; *r2p = p2; return; |
|
} |
|
n = p1->nv; |
|
for ( l = g, r1 = p1, r2 = p2; l; l = NEXT(l) ) { |
|
if ( !r1 ) { |
|
*r1p = r1; *r2p = r2; return; |
|
} |
|
b = BDY((LIST)BDY(l)); b1 = (DP)BDY(b); |
|
if ( dl_equal(n,BDY(r1)->dl,BDY(b1)->dl) ) { |
|
b2 = (DP)BDY(NEXT(b)); |
|
divr(CO,(Obj)ONE,(Obj)BDY(b1)->c,&c1); |
|
mulr(CO,c1,(Obj)BDY(r1)->c,&c2); chsgnr(c2,&c); |
|
muldc(CO,b1,(P)c,&t); addd(CO,r1,t,&s); r1 = s; |
|
muldc(CO,b2,(P)c,&t); addd(CO,r2,t,&s); r2 = s; |
|
} |
|
} |
|
*r1p = r1; *r2p = r2; |
|
} |
|
|
|
/* reduction by linear base over GF(mod) */ |
|
|
void dp_lnf_mod(p1,p2,g,mod,r1p,r2p) |
void dp_lnf_mod(p1,p2,g,mod,r1p,r2p) |
DP p1,p2; |
DP p1,p2; |