version 1.67, 2011/06/16 08:17:14 |
version 1.73, 2017/08/31 02:36:20 |
|
|
* 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/gr.c,v 1.66 2010/01/31 03:25:54 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.72 2016/08/08 07:18:10 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
|
|
#include "ox.h" |
#include "ox.h" |
|
|
#if defined(__GNUC__) |
#if defined(__GNUC__) |
#define INLINE inline |
#define INLINE static inline |
#elif defined(VISUAL) |
#elif defined(VISUAL) || defined(__MINGW32__) |
#define INLINE __inline |
#define INLINE __inline |
#else |
#else |
#define INLINE |
#define INLINE |
#endif |
#endif |
|
|
#define HMAG(p) (p_mag(BDY(p)->c)) |
#define HMAG(p) (p_mag((P)BDY(p)->c)) |
|
|
#define NEWDP_pairs ((DP_pairs)MALLOC(sizeof(struct dp_pairs))) |
#define NEWDP_pairs ((DP_pairs)MALLOC(sizeof(struct dp_pairs))) |
|
|
Line 98 int GenTrace = 0; |
|
Line 98 int GenTrace = 0; |
|
int GenSyz = 0; |
int GenSyz = 0; |
int OXCheck = -1; |
int OXCheck = -1; |
int OneZeroHomo = 0; |
int OneZeroHomo = 0; |
|
int MaxDeg = 0; |
|
|
int NoSugar = 0; |
int NoSugar = 0; |
static int NoCriB = 0; |
static int NoCriB = 0; |
Line 385 void dp_gr_main(LIST f,LIST v,Num homo,int modular,int |
|
Line 386 void dp_gr_main(LIST f,LIST v,Num homo,int modular,int |
|
if ( input_is_dp ) |
if ( input_is_dp ) |
BDY(r) = (pointer)ps[(int)BDY(x)]; |
BDY(r) = (pointer)ps[(int)BDY(x)]; |
else |
else |
dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); |
dtop(CO,vv,ps[(int)BDY(x)],(Obj *)&BDY(r)); |
NEXTNODE(ind0,ind); |
NEXTNODE(ind0,ind); |
STOQ((int)BDY(x),q); BDY(ind) = q; |
STOQ((int)BDY(x),q); BDY(ind) = q; |
} |
} |
Line 445 void dp_interreduce(LIST f,LIST v,int field,struct ord |
|
Line 446 void dp_interreduce(LIST f,LIST v,int field,struct ord |
|
if ( input_is_dp ) |
if ( input_is_dp ) |
BDY(r) = (pointer)ps[(int)BDY(x)]; |
BDY(r) = (pointer)ps[(int)BDY(x)]; |
else |
else |
dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); |
dtop(CO,vv,ps[(int)BDY(x)],(Obj *)&BDY(r)); |
NEXTNODE(ind0,ind); |
NEXTNODE(ind0,ind); |
STOQ((int)BDY(x),q); BDY(ind) = q; |
STOQ((int)BDY(x),q); BDY(ind) = q; |
} |
} |
Line 570 void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L |
|
Line 571 void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L |
|
if ( input_is_dp ) |
if ( input_is_dp ) |
BDY(r) = (pointer)ps[(int)BDY(x)]; |
BDY(r) = (pointer)ps[(int)BDY(x)]; |
else |
else |
dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); |
dtop(CO,vv,ps[(int)BDY(x)],(Obj *)&BDY(r)); |
} |
} |
if ( r0 ) NEXT(r) = 0; |
if ( r0 ) NEXT(r) = 0; |
MKLIST(*rp,r0); |
MKLIST(*rp,r0); |
Line 718 NODE gb_f4(NODE f) |
|
Line 719 NODE gb_f4(NODE f) |
|
if ( k == nred ) { |
if ( k == nred ) { |
/* this is a new base */ |
/* this is a new base */ |
mp0 = 0; |
mp0 = 0; |
NEXTMP(mp0,mp); mp->dl = at[rind[i]]; mp->c = (P)dn; |
NEXTMP(mp0,mp); mp->dl = at[rind[i]]; mp->c = (Obj)dn; |
for ( k = 0; k < col-rank; k++ ) |
for ( k = 0; k < col-rank; k++ ) |
if ( nm->body[i][k] ) { |
if ( nm->body[i][k] ) { |
NEXTMP(mp0,mp); mp->dl = at[cind[k]]; |
NEXTMP(mp0,mp); mp->dl = at[cind[k]]; |
mp->c = (P)nm->body[i][k]; |
mp->c = (Obj)nm->body[i][k]; |
} |
} |
NEXT(mp) = 0; |
NEXT(mp) = 0; |
MKDP(nv,mp0,nf); nf->sugar = dm->sugar; |
MKDP(nv,mp0,nf); nf->sugar = dm->sugar; |
Line 911 NODE gb_f4_mod(NODE f,int m) |
|
Line 912 NODE gb_f4_mod(NODE f,int m) |
|
|
|
/* XXX free redmat explicitly */ |
/* XXX free redmat explicitly */ |
for ( k = 0; k < nred; k++ ) { |
for ( k = 0; k < nred; k++ ) { |
GC_free(BDY(redmat[k])); |
GCFREE(BDY(redmat[k])); |
GC_free(redmat[k]); |
GCFREE(redmat[k]); |
} |
} |
|
|
get_eg(&tmp0); add_eg(&eg_elim1,&tmp1,&tmp0); |
get_eg(&tmp0); add_eg(&eg_elim1,&tmp1,&tmp0); |
Line 952 NODE gb_f4_mod(NODE f,int m) |
|
Line 953 NODE gb_f4_mod(NODE f,int m) |
|
for ( j = 0, i = 0; j < spcol; j++ ) |
for ( j = 0, i = 0; j < spcol; j++ ) |
if ( colstat[j] ) { |
if ( colstat[j] ) { |
mp0 = 0; |
mp0 = 0; |
NEXTMP(mp0,mp); mp->dl = st[j]; mp->c = STOI(1); |
NEXTMP(mp0,mp); mp->dl = st[j]; mp->c = (Obj)STOI(1); |
for ( k = j+1; k < spcol; k++ ) |
for ( k = j+1; k < spcol; k++ ) |
if ( !colstat[k] && spmat[i][k] ) { |
if ( !colstat[k] && spmat[i][k] ) { |
NEXTMP(mp0,mp); mp->dl = st[k]; |
NEXTMP(mp0,mp); mp->dl = st[k]; |
mp->c = STOI(spmat[i][k]); |
mp->c = (Obj)STOI(spmat[i][k]); |
} |
} |
NEXT(mp) = 0; |
NEXT(mp) = 0; |
MKDP(nv,mp0,nf); nf->sugar = dm->sugar; |
MKDP(nv,mp0,nf); nf->sugar = dm->sugar; |
Line 975 NODE gb_f4_mod(NODE f,int m) |
|
Line 976 NODE gb_f4_mod(NODE f,int m) |
|
|
|
/* XXX free spmat[] explicitly */ |
/* XXX free spmat[] explicitly */ |
for ( j = 0; j < nsp; j++ ) { |
for ( j = 0; j < nsp; j++ ) { |
GC_free(spmat[j]); |
GCFREE(spmat[j]); |
} |
} |
} |
} |
if ( DP_Print ) { |
if ( DP_Print ) { |
Line 1132 NODE gb_f4_mod_old(NODE f,int m) |
|
Line 1133 NODE gb_f4_mod_old(NODE f,int m) |
|
for ( j = 0, i = 0; j < spcol; j++ ) |
for ( j = 0, i = 0; j < spcol; j++ ) |
if ( colstat[j] ) { |
if ( colstat[j] ) { |
mp0 = 0; |
mp0 = 0; |
NEXTMP(mp0,mp); mp->dl = st[j]; mp->c = STOI(1); |
NEXTMP(mp0,mp); mp->dl = st[j]; mp->c = (Obj)STOI(1); |
for ( k = j+1; k < spcol; k++ ) |
for ( k = j+1; k < spcol; k++ ) |
if ( !colstat[k] && spmat[i][k] ) { |
if ( !colstat[k] && spmat[i][k] ) { |
NEXTMP(mp0,mp); mp->dl = st[k]; |
NEXTMP(mp0,mp); mp->dl = st[k]; |
mp->c = STOI(spmat[i][k]); |
mp->c = (Obj)STOI(spmat[i][k]); |
} |
} |
NEXT(mp) = 0; |
NEXT(mp) = 0; |
MKDP(nv,mp0,nf); nf->sugar = dm->sugar; |
MKDP(nv,mp0,nf); nf->sugar = dm->sugar; |
Line 1300 void setup_arrays(NODE f,int m,NODE *r) |
|
Line 1301 void setup_arrays(NODE f,int m,NODE *r) |
|
dp_save(i,(Obj)ps[i],0); |
dp_save(i,(Obj)ps[i],0); |
psh[i] = BDY(ps[i])->dl; |
psh[i] = BDY(ps[i])->dl; |
pss[i] = ps[i]->sugar; |
pss[i] = ps[i]->sugar; |
psc[i] = BDY(ps[i])->c; |
psc[i] = (P)BDY(ps[i])->c; |
} |
} |
if ( GenTrace ) { |
if ( GenTrace ) { |
Q q; |
Q q; |
Line 1349 void prim_part(DP f,int m,DP *r) |
|
Line 1350 void prim_part(DP f,int m,DP *r) |
|
if ( GenTrace && TraceList ) { |
if ( GenTrace && TraceList ) { |
/* adust the denominator according to the final |
/* adust the denominator according to the final |
content reduction */ |
content reduction */ |
divsp(CO,BDY(f)->c,BDY(*r)->c,&d); |
divsp(CO,(P)BDY(f)->c,(P)BDY(*r)->c,&d); |
mulp(CO,(P)ARG3(BDY((LIST)BDY(TraceList))),d,&t); |
mulp(CO,(P)ARG3(BDY((LIST)BDY(TraceList))),d,&t); |
ARG3(BDY((LIST)BDY(TraceList))) = t; |
ARG3(BDY((LIST)BDY(TraceList))) = t; |
} |
} |
Line 1526 void reduceall_mod(NODE in,int m,NODE *h) |
|
Line 1527 void reduceall_mod(NODE in,int m,NODE *h) |
|
|
|
int newps(DP a,int m,NODE subst) |
int newps(DP a,int m,NODE subst) |
{ |
{ |
if ( m && !validhc(!a?0:BDY(a)->c,m,subst) ) |
if ( m && !validhc(!a?0:(P)BDY(a)->c,m,subst) ) |
return -1; |
return -1; |
if ( psn == pslen ) { |
if ( psn == pslen ) { |
pslen *= 2; |
pslen *= 2; |
Line 1547 int newps(DP a,int m,NODE subst) |
|
Line 1548 int newps(DP a,int m,NODE subst) |
|
ps[psn] = a; |
ps[psn] = a; |
psh[psn] = BDY(a)->dl; |
psh[psn] = BDY(a)->dl; |
pss[psn] = a->sugar; |
pss[psn] = a->sugar; |
psc[psn] = BDY(a)->c; |
psc[psn] = (P)BDY(a)->c; |
if ( m ) |
if ( m ) |
_dp_mod(a,m,subst,&psm[psn]); |
_dp_mod(a,m,subst,&psm[psn]); |
if ( GenTrace ) { |
if ( GenTrace ) { |
Line 1585 int newps(DP a,int m,NODE subst) |
|
Line 1586 int newps(DP a,int m,NODE subst) |
|
|
|
int newps_nosave(DP a,int m,NODE subst) |
int newps_nosave(DP a,int m,NODE subst) |
{ |
{ |
if ( m && !validhc(!a?0:BDY(a)->c,m,subst) ) |
if ( m && !validhc(!a?0:(P)BDY(a)->c,m,subst) ) |
return -1; |
return -1; |
if ( psn == pslen ) { |
if ( psn == pslen ) { |
pslen *= 2; |
pslen *= 2; |
Line 1599 int newps_nosave(DP a,int m,NODE subst) |
|
Line 1600 int newps_nosave(DP a,int m,NODE subst) |
|
ps[psn] = 0; |
ps[psn] = 0; |
psh[psn] = BDY(a)->dl; |
psh[psn] = BDY(a)->dl; |
pss[psn] = a->sugar; |
pss[psn] = a->sugar; |
psc[psn] = BDY(a)->c; |
psc[psn] = (P)BDY(a)->c; |
if ( m ) |
if ( m ) |
_dp_mod(a,m,subst,&psm[psn]); |
_dp_mod(a,m,subst,&psm[psn]); |
return psn++; |
return psn++; |
|
|
get_eg(&tpz0); |
get_eg(&tpz0); |
prim_part(nf,0,&h); |
prim_part(nf,0,&h); |
get_eg(&tpz1); add_eg(&eg_pz,&tpz0,&tpz1); |
get_eg(&tpz1); add_eg(&eg_pz,&tpz0,&tpz1); |
add_denomlist(BDY(h)->c); |
add_denomlist((P)BDY(h)->c); |
get_eg(&tnp0); |
get_eg(&tnp0); |
if ( Demand && skip_nf_flag ) |
if ( Demand && skip_nf_flag ) |
nh = newps_nosave(h,m,subst); |
nh = newps_nosave(h,m,subst); |
Line 2326 void dp_set_flag(Obj name,Obj value) |
|
Line 2327 void dp_set_flag(Obj name,Obj value) |
|
GenSyz = v; |
GenSyz = v; |
else if ( !strcmp(n,"OneZeroHomo") ) |
else if ( !strcmp(n,"OneZeroHomo") ) |
OneZeroHomo = v; |
OneZeroHomo = v; |
|
else if ( !strcmp(n,"MaxDeg") ) |
|
MaxDeg = v; |
} |
} |
|
|
void dp_make_flaglist(LIST *list) |
void dp_make_flaglist(LIST *list) |
Line 2353 void dp_make_flaglist(LIST *list) |
|
Line 2356 void dp_make_flaglist(LIST *list) |
|
STOQ(OXCheck,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"OXCheck"); MKNODE(n1,name,n); n = n1; |
STOQ(OXCheck,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"OXCheck"); MKNODE(n1,name,n); n = n1; |
STOQ(GenTrace,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"GenTrace"); MKNODE(n1,name,n); n = n1; |
STOQ(GenTrace,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"GenTrace"); MKNODE(n1,name,n); n = n1; |
STOQ(GenSyz,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"GenSyz"); MKNODE(n1,name,n); n = n1; |
STOQ(GenSyz,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"GenSyz"); MKNODE(n1,name,n); n = n1; |
|
STOQ(MaxDeg,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"MaxDeg"); MKNODE(n1,name,n); n = n1; |
|
STOQ(OneZeroHomo,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"OneZeroHomo"); MKNODE(n1,name,n); n = n1; |
STOQ(PtozpRA,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"PtozpRA"); MKNODE(n1,name,n); n = n1; |
STOQ(PtozpRA,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"PtozpRA"); MKNODE(n1,name,n); n = n1; |
STOQ(ShowMag,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"ShowMag"); MKNODE(n1,name,n); n = n1; |
STOQ(ShowMag,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"ShowMag"); MKNODE(n1,name,n); n = n1; |
STOQ(Top,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Top"); MKNODE(n1,name,n); n = n1; |
STOQ(Top,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Top"); MKNODE(n1,name,n); n = n1; |
Line 2458 void dp_mulc_d(DP p,P c,DP *r) |
|
Line 2463 void dp_mulc_d(DP p,P c,DP *r) |
|
dp_imul_d(p,(Q)c,r); |
dp_imul_d(p,(Q)c,r); |
} else { |
} else { |
if ( DP_NFStat ) fprintf(asir_out,"_"); |
if ( DP_NFStat ) fprintf(asir_out,"_"); |
muldc(CO,p,c,r); |
muldc(CO,p,(Obj)c,r); |
} |
} |
} |
} |
|
|
Line 2573 void _dp_nf_z(NODE b,DP g,DP *ps,int full,int multiple |
|
Line 2578 void _dp_nf_z(NODE b,DP g,DP *ps,int full,int multiple |
|
node = mknode(4,cr,cq,NULLP,NULLP); |
node = mknode(4,cr,cq,NULLP,NULLP); |
mulq(cred,rc,&rcred); |
mulq(cred,rc,&rcred); |
chsgnnum((Num)rcred,(Num *)&mrcred); |
chsgnnum((Num)rcred,(Num *)&mrcred); |
muldc(CO,shift,(P)mrcred,(DP *)&ARG2(node)); |
muldc(CO,shift,(Obj)mrcred,(DP *)&ARG2(node)); |
MKLIST(hist,node); |
MKLIST(hist,node); |
} |
} |
|
|
Line 2631 void _dp_nf_z(NODE b,DP g,DP *ps,int full,int multiple |
|
Line 2636 void _dp_nf_z(NODE b,DP g,DP *ps,int full,int multiple |
|
t_0 = get_rtime(); |
t_0 = get_rtime(); |
mulq((Q)BDY(rp)->c,rc,&c); |
mulq((Q)BDY(rp)->c,rc,&c); |
igcd_cofactor(dc,c,&dc,&dcq,&cq); |
igcd_cofactor(dc,c,&dc,&dcq,&cq); |
muldc(CO,dp,(P)dcq,&t); |
muldc(CO,dp,(Obj)dcq,&t); |
dp_hm(rp,&t1); BDY(t1)->c = (P)cq; addd(CO,t,t1,&dp); |
dp_hm(rp,&t1); BDY(t1)->c = (Obj)cq; addd(CO,t,t1,&dp); |
dp_rest(rp,&rp); |
dp_rest(rp,&rp); |
t_a += get_rtime()-t_0; |
t_a += get_rtime()-t_0; |
} |
} |
Line 2676 void dp_imul_d(DP p,Q q,DP *rp) |
|
Line 2681 void dp_imul_d(DP p,Q q,DP *rp) |
|
nsep = ndist + 1; |
nsep = ndist + 1; |
for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ ); |
for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ ); |
if ( n <= nsep ) { |
if ( n <= nsep ) { |
muldc(CO,p,(P)q,rp); return; |
muldc(CO,p,(Obj)q,rp); return; |
} |
} |
MKSTR(imul,"imulv"); |
MKSTR(imul,"imulv"); |
t0 = get_rtime(); |
t0 = get_rtime(); |