=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/gr.c,v retrieving revision 1.60 retrieving revision 1.64 diff -u -p -r1.60 -r1.64 --- OpenXM_contrib2/asir2000/builtin/gr.c 2005/11/16 23:42:53 1.60 +++ OpenXM_contrib2/asir2000/builtin/gr.c 2007/09/19 05:56:01 1.64 @@ -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/gr.c,v 1.59 2005/02/17 06:27:35 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.63 2007/09/19 05:42:59 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -104,7 +104,7 @@ static int NoMC = 0; static int NoRA = 0; static int ShowMag = 0; static int Stat = 0; -static int Denominator = 1; +int Denominator = 1; int Top = 0; int Reverse = 0; static int Max_mag = 0; @@ -407,6 +407,52 @@ void dp_gr_main(LIST f,LIST v,Num homo,int modular,int fprintf(asir_out,"\nMax_mag=%d, Max_coef=%d\n",Max_mag, Max_coef); } +void dp_interreduce(LIST f,LIST v,int field,struct order_spec *ord,LIST *rp) +{ + int i,mindex,m,nochk; + struct order_spec *ord1; + Q q; + VL fv,vv,vc; + NODE fd,fd0,fi,fi0,r,r0,t,subst,x,s,xx; + NODE ind,ind0; + LIST trace,gbindex; + int input_is_dp = 0; + + mindex = 0; nochk = 0; dp_fcoeffs = field; + get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc); + NVars = length((NODE)vv); PCoeffs = vc ? 1 : 0; VC = vc; + CNVars = NVars; + if ( ord->id && NVars != ord->nv ) + error("dp_interreduce : invalid order specification"); + initd(ord); + for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { + NEXTNODE(fd0,fd); + if ( BDY(t) && OID(BDY(t)) == O_DP ) { + dp_sort((DP)BDY(t),(DP *)&BDY(fd)); input_is_dp = 1; + } else + ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd)); + } + if ( fd0 ) NEXT(fd) = 0; + fi0 = fd0; + setup_arrays(fd0,0,&s); + init_stat(); + x = s; + reduceall(x,&xx); x = xx; + for ( r0 = 0, ind0 = 0; x; x = NEXT(x) ) { + NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]); + if ( input_is_dp ) + BDY(r) = (pointer)ps[(int)BDY(x)]; + else + dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); + NEXTNODE(ind0,ind); + STOQ((int)BDY(x),q); BDY(ind) = q; + } + if ( r0 ) NEXT(r) = 0; + if ( ind0 ) NEXT(ind) = 0; + MKLIST(*rp,r0); + MKLIST(gbindex,ind0); +} + void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp) { struct order_spec *ord1; @@ -1700,6 +1746,7 @@ NODE gb(NODE f,int m,NODE subst) Max_coef = 0; prev = 1; doing_f4 = 0; + init_denomlist(); if ( m ) { psm = (DP *)MALLOC(pslen*sizeof(DP)); for ( i = 0; i < psn; i++ ) @@ -1760,6 +1807,7 @@ skip_nf: get_eg(&tpz0); prim_part(nf,0,&h); get_eg(&tpz1); add_eg(&eg_pz,&tpz0,&tpz1); + add_denomlist(BDY(h)->c); get_eg(&tnp0); if ( Demand && skip_nf_flag ) nh = newps_nosave(h,m,subst);