| version 1.37, 2001/10/09 01:36:06 | version 1.50, 2003/07/01 08:12:38 | 
|  |  | 
| * 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.36 2001/10/01 01:58:02 noro Exp $ | * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.49 2003/06/21 02:09:15 noro Exp $ | 
| */ | */ | 
| #include "ca.h" | #include "ca.h" | 
| #include "parse.h" | #include "parse.h" | 
|  |  | 
|  |  | 
| int PCoeffs; | int PCoeffs; | 
| int DP_Print = 0; | int DP_Print = 0; | 
|  | int DP_PrintShort = 0; | 
| int DP_Multiple = 0; | int DP_Multiple = 0; | 
| int DP_NFStat = 0; | int DP_NFStat = 0; | 
| LIST Dist = 0; | LIST Dist = 0; | 
| 
| Line 101  static int NoCriB = 0; |  | 
| Line 102  static int NoCriB = 0; |  | 
| static int NoGC = 0; | static int NoGC = 0; | 
| static int NoMC = 0; | static int NoMC = 0; | 
| static int NoRA = 0; | static int NoRA = 0; | 
| static int DP_PrintShort = 0; |  | 
| static int ShowMag = 0; | static int ShowMag = 0; | 
| static int Stat = 0; | static int Stat = 0; | 
| static int Denominator = 1; | static int Denominator = 1; | 
| static int Top = 0; | static int Top = 0; | 
| static int Reverse = 0; | static int Reverse = 0; | 
| static int Max_mag = 0; | static int Max_mag = 0; | 
|  | static int Max_coef = 0; | 
| static char *Demand = 0; | static char *Demand = 0; | 
| static int PtozpRA = 0; | static int PtozpRA = 0; | 
|  |  | 
| 
| Line 338  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int |  | 
| Line 339  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int |  | 
| } | } | 
| print_stat(); | print_stat(); | 
| if ( ShowMag ) | if ( ShowMag ) | 
| fprintf(asir_out,"\nMax_mag=%d\n",Max_mag); | fprintf(asir_out,"\nMax_mag=%d, Max_coef=%d\n",Max_mag, Max_coef); | 
| } | } | 
|  |  | 
| void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp) | void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp) | 
| 
| Line 618  NODE gb_f4_mod(NODE f,int m) |  | 
| Line 619  NODE gb_f4_mod(NODE f,int m) |  | 
| int *indred,*isred; | int *indred,*isred; | 
| CDP ri; | CDP ri; | 
| int pscalen; | int pscalen; | 
| struct oEGT tmp0,tmp1,eg_split_symb,eg_split_elim1,eg_split_elim2; | struct oEGT tmp0,tmp1,eg_split_symb,eg_split_conv,eg_split_elim1,eg_split_elim2; | 
| extern struct oEGT eg_symb,eg_elim1,eg_elim2; | extern struct oEGT eg_symb,eg_conv,eg_elim1,eg_elim2; | 
|  |  | 
| /* initialize coeffcient array list of ps[] */ | /* initialize coeffcient array list of ps[] */ | 
| pscalen = pslen; | pscalen = pslen; | 
| psca = (unsigned int **)MALLOC(pscalen*sizeof(unsigned int *)); | psca = (unsigned int **)MALLOC(pscalen*sizeof(unsigned int *)); | 
|  |  | 
| init_eg(&eg_symb); init_eg(&eg_elim1); init_eg(&eg_elim2); | init_eg(&eg_symb); init_eg(&eg_conv); init_eg(&eg_elim1); init_eg(&eg_elim2); | 
| for ( gall = g = 0, d = 0, r = f; r; r = NEXT(r) ) { | for ( gall = g = 0, d = 0, r = f; r; r = NEXT(r) ) { | 
| i = (int)BDY(r); | i = (int)BDY(r); | 
| d = updpairs(d,g,i); | d = updpairs(d,g,i); | 
| 
| Line 667  NODE gb_f4_mod(NODE f,int m) |  | 
| Line 668  NODE gb_f4_mod(NODE f,int m) |  | 
| bt1 = mknode(2,BDY(sd)->dl,BDY(r)); | bt1 = mknode(2,BDY(sd)->dl,BDY(r)); | 
| MKNODE(bt,bt1,blist); blist = bt; | MKNODE(bt,bt1,blist); blist = bt; | 
| symb_merge(s,dt,nv); | symb_merge(s,dt,nv); | 
| /*                              fprintf(stderr,"%d-",length(s)); */ | /*                              fprintf(stderr,"%d-",length(s0));  */ | 
| nred++; | nred++; | 
| } | } | 
| } | } | 
| /*              fprintf(stderr,"\n"); */ | /*              fprintf(stderr,"\n"); */ | 
|  | get_eg(&tmp1); add_eg(&eg_symb,&tmp0,&tmp1); | 
|  | init_eg(&eg_split_symb); add_eg(&eg_split_symb,&tmp0,&tmp1); | 
|  |  | 
| if ( DP_Print ) | if ( DP_Print ) | 
| fprintf(asir_out,"number of reducers : %d\n",nred); | fprintf(asir_out,"number of reducers : %d\n",nred); | 
|  |  | 
|  | get_eg(&tmp0); | 
| /* the first nred polys in blist are reducers */ | /* the first nred polys in blist are reducers */ | 
| /* row = the number of all the polys */ | /* row = the number of all the polys */ | 
| for ( r = blist, row = 0; r; r = NEXT(r), row++ ); | for ( r = blist, row = 0; r; r = NEXT(r), row++ ); | 
| 
| Line 713  NODE gb_f4_mod(NODE f,int m) |  | 
| Line 718  NODE gb_f4_mod(NODE f,int m) |  | 
| for ( j = 0, k = 0; j < col; j++ ) | for ( j = 0, k = 0; j < col; j++ ) | 
| if ( !isred[j] ) | if ( !isred[j] ) | 
| st[k++] = at[j]; | st[k++] = at[j]; | 
| get_eg(&tmp1); add_eg(&eg_symb,&tmp0,&tmp1); | get_eg(&tmp1); add_eg(&eg_conv,&tmp0,&tmp1); | 
| init_eg(&eg_split_symb); add_eg(&eg_split_symb,&tmp0,&tmp1); | init_eg(&eg_split_conv); add_eg(&eg_split_conv,&tmp0,&tmp1); | 
|  |  | 
| get_eg(&tmp1); | get_eg(&tmp1); | 
| /* spoly matrix; stored in reduced form; terms in ht[] are omitted */ | /* spoly matrix; stored in reduced form; terms in ht[] are omitted */ | 
| 
| Line 771  NODE gb_f4_mod(NODE f,int m) |  | 
| Line 776  NODE gb_f4_mod(NODE f,int m) |  | 
| if ( DP_Print ) { | if ( DP_Print ) { | 
| fprintf(asir_out,"done rank = %d\n",rank,row,col); | fprintf(asir_out,"done rank = %d\n",rank,row,col); | 
| print_eg("Symb",&eg_split_symb); | print_eg("Symb",&eg_split_symb); | 
|  | print_eg("Conv",&eg_split_conv); | 
| print_eg("Elim1",&eg_split_elim1); | print_eg("Elim1",&eg_split_elim1); | 
| print_eg("Elim2",&eg_split_elim2); | print_eg("Elim2",&eg_split_elim2); | 
| fprintf(asir_out,"\n"); | fprintf(asir_out,"\n"); | 
| 
| Line 813  NODE gb_f4_mod(NODE f,int m) |  | 
| Line 819  NODE gb_f4_mod(NODE f,int m) |  | 
| } | } | 
| if ( DP_Print ) { | if ( DP_Print ) { | 
| print_eg("Symb",&eg_symb); | print_eg("Symb",&eg_symb); | 
|  | print_eg("Conv",&eg_conv); | 
| print_eg("Elim1",&eg_elim1); | print_eg("Elim1",&eg_elim1); | 
| print_eg("Elim2",&eg_elim2); | print_eg("Elim2",&eg_elim2); | 
| fflush(asir_out); | fflush(asir_out); | 
| 
| Line 1158  void prim_part(DP f,int m,DP *r) |  | 
| Line 1165  void prim_part(DP f,int m,DP *r) |  | 
| if ( PCoeffs ) | if ( PCoeffs ) | 
| dp_prim_mod(f,m,r); | dp_prim_mod(f,m,r); | 
| else | else | 
| *r = f; | _dp_monic(f,m,r); | 
| } else { | } else { | 
| if ( dp_fcoeffs ) | if ( dp_fcoeffs || PCoeffs ) | 
| *r = f; |  | 
| else if ( PCoeffs ) |  | 
| dp_prim(f,r); | dp_prim(f,r); | 
| else | else | 
| dp_ptozp(f,r); | dp_ptozp(f,r); | 
| 
| Line 1537  void minsugar(DP_pairs d,DP_pairs *dm,DP_pairs *dr) |  | 
| Line 1542  void minsugar(DP_pairs d,DP_pairs *dm,DP_pairs *dr) |  | 
|  |  | 
| NODE gb(NODE f,int m,NODE subst) | NODE gb(NODE f,int m,NODE subst) | 
| { | { | 
| int i,nh,prev,mag; | int i,nh,prev,mag,mag0,magt; | 
| NODE r,g,gall; | NODE r,g,gall; | 
| DP_pairs d; | DP_pairs d; | 
| DP_pairs l; | DP_pairs l; | 
| 
| Line 1551  NODE gb(NODE f,int m,NODE subst) |  | 
| Line 1556  NODE gb(NODE f,int m,NODE subst) |  | 
| static prev_sugar = -1; | static prev_sugar = -1; | 
|  |  | 
| Max_mag = 0; | Max_mag = 0; | 
|  | Max_coef = 0; | 
| prev = 1; | prev = 1; | 
| doing_f4 = 0; | doing_f4 = 0; | 
| if ( m ) { | if ( m ) { | 
| 
| Line 1602  NODE gb(NODE f,int m,NODE subst) |  | 
| Line 1608  NODE gb(NODE f,int m,NODE subst) |  | 
| _dp_nf(gall,h,ps,!Top,&nf); | _dp_nf(gall,h,ps,!Top,&nf); | 
| else | else | 
| _dp_nf_z(gall,h,ps,!Top,DP_Multiple,&nf); | _dp_nf_z(gall,h,ps,!Top,DP_Multiple,&nf); | 
| if ( DP_Print ) | if ( DP_Print && nf ) | 
| fprintf(asir_out,"(%.3g)",get_rtime()-t_0); | fprintf(asir_out,"(%.3g)",get_rtime()-t_0); | 
| get_eg(&tnf1); add_eg(&eg_nf,&tnf0,&tnf1); | get_eg(&tnf1); add_eg(&eg_nf,&tnf0,&tnf1); | 
| } else | } else | 
|  |  | 
| g = updbase(g,nh); | g = updbase(g,nh); | 
| gall = append_one(gall,nh); | gall = append_one(gall,nh); | 
| if ( !dp_fcoeffs && ShowMag ) { | if ( !dp_fcoeffs && ShowMag ) { | 
| for ( mag = 0, mp = BDY(h); mp; mp = NEXT(mp) ) | for ( mag = 0, mag0 = 0, mp = BDY(h); mp; mp = NEXT(mp) ) { | 
| mag += p_mag((P)mp->c); | magt = p_mag((P)mp->c); | 
|  | mag0 = MAX(mag0,magt); | 
|  | mag += magt; | 
|  | } | 
|  | Max_coef = MAX(Max_coef,mag0); | 
| Max_mag = MAX(Max_mag,mag); | Max_mag = MAX(Max_mag,mag); | 
| } | } | 
| if ( DP_Print ) { | if ( DP_Print ) { | 
|  |  | 
| l->dp1,l->dp2,length(g),length(gall),DPPlength(d), | l->dp1,l->dp2,length(g),length(gall),DPPlength(d), | 
| pss[nh]); | pss[nh]); | 
| if ( ShowMag ) | if ( ShowMag ) | 
| fprintf(asir_out,",mag=%d",mag); | fprintf(asir_out,",mag=(%d,%d)",mag,mag0); | 
| fprintf(asir_out,"\n"); fflush(asir_out); | fprintf(asir_out,"\n"); fflush(asir_out); | 
| } else if ( DP_PrintShort ) { | } else if ( DP_PrintShort ) { | 
| fprintf(asir_out,"+"); fflush(asir_out); | fprintf(asir_out,"+"); fflush(asir_out); | 
| 
| Line 1779  DP_pairs newpairs( NODE /* of index */ g, int t ) |  | 
| Line 1789  DP_pairs newpairs( NODE /* of index */ g, int t ) |  | 
| p->lcm = lcm_of_DL(CNVars, dl = psh[dp], tdl, (DL)0 ); | p->lcm = lcm_of_DL(CNVars, dl = psh[dp], tdl, (DL)0 ); | 
| #if 0 | #if 0 | 
| if ( do_weyl ) | if ( do_weyl ) | 
| p->sugar = dl_weight(p->lcm); | p->sugar = dl_weyl_weight(p->lcm); | 
| else | else | 
| #endif | #endif | 
| p->sugar = (ts > (s = pss[dp] - dl->td) ? ts : s) + p->lcm->td; | p->sugar = (ts > (s = pss[dp] - dl->td) ? ts : s) + p->lcm->td; | 
| 
| Line 1946  int dl_redble(DL dl1,DL dl2) |  | 
| Line 1956  int dl_redble(DL dl1,DL dl2) |  | 
| return 1; | return 1; | 
| } | } | 
|  |  | 
| int dl_weight(DL dl) | #if 0 | 
|  | int dl_weyl_weight(DL dl) | 
| { | { | 
| int n,w,i; | int n,w,i; | 
|  |  | 
| 
| Line 1955  int dl_weight(DL dl) |  | 
| Line 1966  int dl_weight(DL dl) |  | 
| w += (-dl->d[i]+dl->d[n+i]); | w += (-dl->d[i]+dl->d[n+i]); | 
| return w; | return w; | 
| } | } | 
|  | #endif | 
|  |  | 
| int gbcheck(NODE f) | int gbcheck(NODE f) | 
| { | { | 
| 
| Line 1994  int gbcheck(NODE f) |  | 
| Line 2006  int gbcheck(NODE f) |  | 
| return 1; | return 1; | 
| } | } | 
|  |  | 
|  | void gbcheck_list(NODE f,int n,VECT *gp,LIST *pp) | 
|  | { | 
|  | int i; | 
|  | NODE r,g,gall,u,u0,t; | 
|  | VECT vect; | 
|  | LIST pair; | 
|  | DP_pairs d,l; | 
|  | Q q1,q2; | 
|  |  | 
|  | /* we need the following settings */ | 
|  | NVars = CNVars = n; | 
|  | setup_arrays(f,0,&r); | 
|  | for ( gall = g = 0, d = 0; r; r = NEXT(r) ) { | 
|  | i = (int)BDY(r); | 
|  | d = updpairs(d,g,i); | 
|  | g = updbase(g,i); | 
|  | gall = append_one(gall,i); | 
|  | } | 
|  | NEWVECT(vect); vect->len = psn; vect->body = (pointer)ps; | 
|  | *gp = vect; | 
|  |  | 
|  | for ( u0 = 0, l = d; l; l = NEXT(l) ) { | 
|  | NEXTNODE(u0,u); | 
|  | STOQ(l->dp1,q1); | 
|  | STOQ(l->dp2,q2); | 
|  | t = mknode(2,q1,q2); | 
|  | MKLIST(pair,t); | 
|  | BDY(u) = (pointer)pair; | 
|  | } | 
|  | if ( u0 ) | 
|  | NEXT(u) = 0; | 
|  | MKLIST(*pp,u0); | 
|  | } | 
|  |  | 
| int membercheck(NODE f,NODE x) | int membercheck(NODE f,NODE x) | 
| { | { | 
| DP g; | DP g; | 
| 
| Line 2025  void dp_set_flag(Obj name,Obj value) |  | 
| Line 2071  void dp_set_flag(Obj name,Obj value) |  | 
| { | { | 
| char *n; | char *n; | 
| int v; | int v; | 
|  | Q ratio; | 
|  |  | 
| if ( OID(name) != O_STR ) | if ( OID(name) != O_STR ) | 
| return; | return; | 
| 
| Line 2035  void dp_set_flag(Obj name,Obj value) |  | 
| Line 2082  void dp_set_flag(Obj name,Obj value) |  | 
| if ( !strcmp(n,"Dist") ) { | if ( !strcmp(n,"Dist") ) { | 
| Dist = (LIST)value; return; | Dist = (LIST)value; return; | 
| } | } | 
|  | if ( !strcmp(n,"Content") ) { | 
|  | ratio = (Q)value; | 
|  | if ( ratio ) { | 
|  | DP_Multiple = BD(NM(ratio))[0]; | 
|  | Denominator = INT(ratio) ? 1 : BD(DN(ratio))[0]; | 
|  | } else { | 
|  | DP_Multiple = 0; | 
|  | Denominator = 1; | 
|  | } | 
|  | } | 
| if ( value && OID(value) != O_N ) | if ( value && OID(value) != O_N ) | 
| return; | return; | 
| v = QTOS((Q)value); | v = QTOS((Q)value); | 
| 
| Line 2078  void dp_set_flag(Obj name,Obj value) |  | 
| Line 2135  void dp_set_flag(Obj name,Obj value) |  | 
|  |  | 
| void dp_make_flaglist(LIST *list) | void dp_make_flaglist(LIST *list) | 
| { | { | 
| Q v; | Q v,nm,dn; | 
| STRING name,path; | STRING name,path; | 
| NODE n,n1; | NODE n,n1; | 
|  |  | 
|  | #if 0 | 
| STOQ(DP_Multiple,v); MKNODE(n,v,0); MKSTR(name,"DP_Multiple"); MKNODE(n1,name,n); n = n1; | STOQ(DP_Multiple,v); MKNODE(n,v,0); MKSTR(name,"DP_Multiple"); MKNODE(n1,name,n); n = n1; | 
| STOQ(Denominator,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Denominator"); MKNODE(n1,name,n); n = n1; | STOQ(Denominator,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Denominator"); MKNODE(n1,name,n); n = n1; | 
|  | #else | 
|  | if ( DP_Multiple ) { | 
|  | STOQ(DP_Multiple,nm); STOQ(Denominator,dn); divq(nm,dn,&v); | 
|  | } else | 
|  | v = 0; | 
|  | MKNODE(n,v,0); MKSTR(name,"Content"); MKNODE(n1,name,n); n = n1; | 
|  | #endif | 
| MKNODE(n1,Dist,n); n = n1; MKSTR(name,"Dist"); MKNODE(n1,name,n); n = n1; | MKNODE(n1,Dist,n); n = n1; MKSTR(name,"Dist"); MKNODE(n1,name,n); n = n1; | 
| STOQ(Reverse,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Reverse"); MKNODE(n1,name,n); n = n1; | STOQ(Reverse,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Reverse"); MKNODE(n1,name,n); n = n1; | 
| STOQ(Stat,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Stat"); MKNODE(n1,name,n); n = n1; | STOQ(Stat,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Stat"); MKNODE(n1,name,n); n = n1; | 
| 
| Line 2136  void dp_load(int index,DP *p) |  | 
| Line 2201  void dp_load(int index,DP *p) |  | 
| sprintf(path,"%s%c%d",Demand,DELIM,index); | sprintf(path,"%s%c%d",Demand,DELIM,index); | 
| if ( !(fp = fopen(path,"rb") ) ) | if ( !(fp = fopen(path,"rb") ) ) | 
| error("dp_load : cannot open a file"); | error("dp_load : cannot open a file"); | 
| skipvl(fp); loadobj(fp,(Obj *)p); fclose(fp); | if ( PCoeffs ) | 
|  | loadvl(fp); | 
|  | else | 
|  | skipvl(fp); | 
|  | loadobj(fp,(Obj *)p); fclose(fp); | 
| } | } | 
| } | } | 
|  |  | 
| 
| Line 2149  int dp_load_t(int index,DP *p) |  | 
| Line 2218  int dp_load_t(int index,DP *p) |  | 
| if ( !(fp = fopen(path,"rb") ) ) | if ( !(fp = fopen(path,"rb") ) ) | 
| return 0; | return 0; | 
| else { | else { | 
| skipvl(fp); loadobj(fp,(Obj *)p); fclose(fp); return 1; | if ( PCoeffs ) | 
|  | loadvl(fp); | 
|  | else | 
|  | skipvl(fp); | 
|  | loadobj(fp,(Obj *)p); fclose(fp); return 1; | 
| } | } | 
| } | } | 
|  |  |