version 1.1, 2018/09/19 05:45:07 |
version 1.2, 2018/09/28 08:20:28 |
|
|
/* |
/* |
* $OpenXM$ |
* $OpenXM: OpenXM_contrib2/asir2018/engine/dalg.c,v 1.1 2018/09/19 05:45:07 noro Exp $ |
*/ |
*/ |
|
|
#include "ca.h" |
#include "ca.h" |
Line 46 void setfield_dalg(NODE alist) |
|
Line 46 void setfield_dalg(NODE alist) |
|
nf->defpoly = defpoly = (P *)MALLOC(n*sizeof(P)); |
nf->defpoly = defpoly = (P *)MALLOC(n*sizeof(P)); |
nf->ps = ps = (DP *)MALLOC(n*sizeof(DP)); |
nf->ps = ps = (DP *)MALLOC(n*sizeof(DP)); |
current_spec = dp_current_spec; |
current_spec = dp_current_spec; |
STOQ(2,two); |
STOZ(2,two); |
create_order_spec(0,(Obj)two,&nf->spec); |
create_order_spec(0,(Obj)two,&nf->spec); |
initd(nf->spec); |
initd(nf->spec); |
for ( b = hlist = 0, i = 0, vl1 = vl; i < n; vl1 = NEXT(vl1), i++ ) { |
for ( b = hlist = 0, i = 0, vl1 = vl; i < n; vl1 = NEXT(vl1), i++ ) { |
ptozp(vl1->v->attr,1,&c,&defpoly[i]); |
ptozp(vl1->v->attr,1,&c,&defpoly[i]); |
ptod(ALG,vl,defpoly[i],&ps[i]); |
ptod(ALG,vl,defpoly[i],&ps[i]); |
STOQ(i,iq); MKNODE(b1,(pointer)iq,b); b = b1; |
STOZ(i,iq); MKNODE(b1,(pointer)iq,b); b = b1; |
MKNODE(b2,(pointer)ps[i],hlist); hlist = b2; |
MKNODE(b2,(pointer)ps[i],hlist); hlist = b2; |
} |
} |
ptod(ALG,vl,(P)ONE,&one); |
ptod(ALG,vl,(P)ONE,&one); |
Line 95 void setfield_gb(NODE gb,VL vl,struct order_spec *spec |
|
Line 95 void setfield_gb(NODE gb,VL vl,struct order_spec *spec |
|
for ( b = hlist = 0, i = 0, t = gb; i < nf->psn; t = NEXT(t), i++ ) { |
for ( b = hlist = 0, i = 0, t = gb; i < nf->psn; t = NEXT(t), i++ ) { |
ptozp((P)BDY(t),1,&c,&defpoly[i]); |
ptozp((P)BDY(t),1,&c,&defpoly[i]); |
ptod(CO,vl,defpoly[i],&ps[i]); |
ptod(CO,vl,defpoly[i],&ps[i]); |
STOQ(i,iq); MKNODE(b1,(pointer)iq,b); b = b1; |
STOZ(i,iq); MKNODE(b1,(pointer)iq,b); b = b1; |
MKNODE(b2,(pointer)ps[i],hlist); hlist = b2; |
MKNODE(b2,(pointer)ps[i],hlist); hlist = b2; |
} |
} |
ptod(ALG,vl,(P)ONE,&one); |
ptod(ALG,vl,(P)ONE,&one); |
Line 434 void adddalg(DAlg a,DAlg b,DAlg *c) |
|
Line 434 void adddalg(DAlg a,DAlg b,DAlg *c) |
|
dna = a->dn; |
dna = a->dn; |
dnb = b->dn; |
dnb = b->dn; |
gcdz(dna,dnb,&gn); |
gcdz(dna,dnb,&gn); |
divz(dna,gn,&a1); divz(dnb,gn,&b1); |
divsz(dna,gn,&a1); divsz(dnb,gn,&b1); |
/* nma/dna+nmb/dnb = (nma*b1+nmb*a1)/(dna*b1) */ |
/* nma/dna+nmb/dnb = (nma*b1+nmb*a1)/(dna*b1) */ |
muldc(CO,a->nm,(Obj)b1,&ta); muldc(CO,b->nm,(Obj)a1,&tb); |
muldc(CO,a->nm,(Obj)b1,&ta); muldc(CO,b->nm,(Obj)a1,&tb); |
current_spec = dp_current_spec; initd(nf->spec); |
current_spec = dp_current_spec; initd(nf->spec); |
Line 468 void subdalg(DAlg a,DAlg b,DAlg *c) |
|
Line 468 void subdalg(DAlg a,DAlg b,DAlg *c) |
|
dna = a->dn; |
dna = a->dn; |
dnb = b->dn; |
dnb = b->dn; |
gcdz(dna,dnb,&gn); |
gcdz(dna,dnb,&gn); |
divz(dna,gn,&a1); divz(dnb,gn,&b1); |
divsz(dna,gn,&a1); divsz(dnb,gn,&b1); |
/* nma/dna-nmb/dnb = (nma*b1-nmb*a1)/(dna*b1) */ |
/* nma/dna-nmb/dnb = (nma*b1-nmb*a1)/(dna*b1) */ |
muldc(CO,a->nm,(Obj)b1,&ta); muldc(CO,b->nm,(Obj)a1,&tb); |
muldc(CO,a->nm,(Obj)b1,&ta); muldc(CO,b->nm,(Obj)a1,&tb); |
current_spec = dp_current_spec; initd(nf->spec); |
current_spec = dp_current_spec; initd(nf->spec); |
Line 537 void rmcontdalg(DAlg a, DAlg *r) |
|
Line 537 void rmcontdalg(DAlg a, DAlg *r) |
|
*r = a; |
*r = a; |
else { |
else { |
dp_ptozp(a->nm,&u); |
dp_ptozp(a->nm,&u); |
divz((Z)BDY(a->nm)->c,(Z)BDY(u)->c,&cont); |
divsz((Z)BDY(a->nm)->c,(Z)BDY(u)->c,&cont); |
gcdz(cont,a->dn,&gn); |
gcdz(cont,a->dn,&gn); |
divsz(cont,gn,&c); |
divsz(cont,gn,&c); |
divsz(a->dn,gn,&d); |
divsz(a->dn,gn,&d); |
Line 596 int invdalg(DAlg a,DAlg *c) |
|
Line 596 int invdalg(DAlg a,DAlg *c) |
|
MKDAlg(m,ONE,t); |
MKDAlg(m,ONE,t); |
muldalg(t,a0,&simp[i]); |
muldalg(t,a0,&simp[i]); |
} |
} |
gcdz(simp[i]->dn,ln,&gn); divz(ln,gn,&qn); |
gcdz(simp[i]->dn,ln,&gn); divsz(ln,gn,&qn); |
mulz(simp[i]->dn,qn,&ln); |
mulz(simp[i]->dn,qn,&ln); |
} |
} |
initd(current_spec); |
initd(current_spec); |
Line 667 NODE inv_or_split_dalg(DAlg a,DAlg *c) |
|
Line 667 NODE inv_or_split_dalg(DAlg a,DAlg *c) |
|
mb = nf->mb; |
mb = nf->mb; |
n = nf->n; |
n = nf->n; |
ln = ONE; |
ln = ONE; |
dp_ptozp(a->nm,&u); divz((Z)BDY(a->nm)->c,(Z)BDY(u)->c,&nmc); |
dp_ptozp(a->nm,&u); divsz((Z)BDY(a->nm)->c,(Z)BDY(u)->c,&nmc); |
MKDAlg(u,ONE,a0); |
MKDAlg(u,ONE,a0); |
simp = (DAlg *)MALLOC(dim*sizeof(DAlg)); |
simp = (DAlg *)MALLOC(dim*sizeof(DAlg)); |
current_spec = dp_current_spec; initd(nf->spec); |
current_spec = dp_current_spec; initd(nf->spec); |
Line 690 NODE inv_or_split_dalg(DAlg a,DAlg *c) |
|
Line 690 NODE inv_or_split_dalg(DAlg a,DAlg *c) |
|
muldalg(t,a0,&simp[i]); |
muldalg(t,a0,&simp[i]); |
} |
} |
if ( simp[i] ) { |
if ( simp[i] ) { |
gcdz(simp[i]->dn,ln,&gn); divz(ln,gn,&qn); |
gcdz(simp[i]->dn,ln,&gn); divsz(ln,gn,&qn); |
mulz(simp[i]->dn,qn,&ln); |
mulz(simp[i]->dn,qn,&ln); |
} |
} |
} |
} |
Line 783 NODE dp_inv_or_split(NODE gb,DP f,struct order_spec *s |
|
Line 783 NODE dp_inv_or_split(NODE gb,DP f,struct order_spec *s |
|
for ( ind = 0, i = 0, t = gb; i < n; i++, t = NEXT(t) ) { |
for ( ind = 0, i = 0, t = gb; i < n; i++, t = NEXT(t) ) { |
ps[i] = (DP)BDY(t); |
ps[i] = (DP)BDY(t); |
NEXTNODE(ind,indt); |
NEXTNODE(ind,indt); |
STOQ(i,iq); BDY(indt) = iq; |
STOZ(i,iq); BDY(indt) = iq; |
} |
} |
if ( ind ) NEXT(indt) = 0; |
if ( ind ) NEXT(indt) = 0; |
dp_true_nf(ind,f,ps,1,&nm,(P *)&dn); |
dp_true_nf(ind,f,ps,1,&nm,(P *)&dn); |
Line 818 NODE dp_inv_or_split(NODE gb,DP f,struct order_spec *s |
|
Line 818 NODE dp_inv_or_split(NODE gb,DP f,struct order_spec *s |
|
MKDAlg(nm,dn,simp[i]); |
MKDAlg(nm,dn,simp[i]); |
} |
} |
if ( simp[i] ) { |
if ( simp[i] ) { |
gcdz(simp[i]->dn,ln,&gn); divz(ln,gn,&qn); |
gcdz(simp[i]->dn,ln,&gn); divsz(ln,gn,&qn); |
mulz(simp[i]->dn,qn,&ln); |
mulz(simp[i]->dn,qn,&ln); |
} |
} |
} |
} |
Line 922 void pwrdalg(DAlg a,Z e,DAlg *c) |
|
Line 922 void pwrdalg(DAlg a,Z e,DAlg *c) |
|
absz(e,&en); |
absz(e,&en); |
y = nf->one; |
y = nf->one; |
z = a; |
z = a; |
STOQ(2,two); |
STOZ(2,two); |
while ( 1 ) { |
while ( 1 ) { |
divqrz(en,two,&qn,&rn); en = qn; |
divqrz(en,two,&qn,&rn); en = qn; |
if ( rn ) { |
if ( rn ) { |
Line 976 int dalgtoup(DAlg da,P *up,Z *dn) |
|
Line 976 int dalgtoup(DAlg da,P *up,Z *dn) |
|
d->td = t->dl->td - t->dl->d[hi]; |
d->td = t->dl->td - t->dl->d[hi]; |
if ( t->dl->d[hi] != current_d ) { |
if ( t->dl->d[hi] != current_d ) { |
NEXT(mp) = 0; MKDP(nv,mp0,c); MKDAlg(c,ONE,cc); |
NEXT(mp) = 0; MKDP(nv,mp0,c); MKDAlg(c,ONE,cc); |
NEXTDC(dc0,dc); STOQ(current_d,DEG(dc)); COEF(dc) = (P)cc; |
NEXTDC(dc0,dc); STOZ(current_d,DEG(dc)); COEF(dc) = (P)cc; |
current_d = t->dl->d[hi]; |
current_d = t->dl->d[hi]; |
mp0 = 0; |
mp0 = 0; |
} |
} |
Line 984 int dalgtoup(DAlg da,P *up,Z *dn) |
|
Line 984 int dalgtoup(DAlg da,P *up,Z *dn) |
|
mp->c = t->c; mp->dl = d; |
mp->c = t->c; mp->dl = d; |
} |
} |
NEXT(mp) = 0; MKDP(nv,mp0,c); MKDAlg(c,ONE,cc); |
NEXT(mp) = 0; MKDP(nv,mp0,c); MKDAlg(c,ONE,cc); |
NEXTDC(dc0,dc); STOQ(current_d,DEG(dc)); COEF(dc) = (P)cc; |
NEXTDC(dc0,dc); STOZ(current_d,DEG(dc)); COEF(dc) = (P)cc; |
NEXT(dc) = 0; |
NEXT(dc) = 0; |
makevar("x",&v); |
makevar("x",&v); |
MKP(VR(v),dc0,*up); |
MKP(VR(v),dc0,*up); |