[BACK]Return to gr.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Diff for /OpenXM_contrib2/asir2000/builtin/gr.c between version 1.51 and 1.73

version 1.51, 2003/07/09 07:11:07 version 1.73, 2017/08/31 02:36:20
Line 45 
Line 45 
  * 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.50 2003/07/01 08:12:38 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"
Line 53 
Line 53 
 #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 69  double get_rtime(); 
Line 69  double get_rtime(); 
   
 struct oEGT eg_nf,eg_nfm;  struct oEGT eg_nf,eg_nfm;
 struct oEGT eg_znfm,eg_pz,eg_np,eg_ra,eg_mc,eg_gc;  struct oEGT eg_znfm,eg_pz,eg_np,eg_ra,eg_mc,eg_gc;
 int TP,NBP,NMP,NFP,NDP,ZR,NZR;  int TP,N_BP,NMP,NFP,NDP,ZR,NZR;
   
 extern int (*cmpdl)();  extern int (*cmpdl)();
 extern int do_weyl;  extern int do_weyl;
Line 95  int DP_NFStat = 0;
Line 95  int DP_NFStat = 0;
 LIST Dist = 0;  LIST Dist = 0;
 int NoGCD = 0;  int NoGCD = 0;
 int GenTrace = 0;  int GenTrace = 0;
   int GenSyz = 0;
 int OXCheck = -1;  int OXCheck = -1;
   int OneZeroHomo = 0;
   int MaxDeg = 0;
   
 static int NoSugar = 0;  int NoSugar = 0;
 static int NoCriB = 0;  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 ShowMag = 0;  static int ShowMag = 0;
 static int Stat = 0;  static int Stat = 0;
 static int Denominator = 1;  int Denominator = 1;
 static int Top = 0;  int Top = 0;
 static int Reverse = 0;  int Reverse = 0;
 static int Max_mag = 0;  static int Max_mag = 0;
 static int Max_coef = 0;  static int Max_coef = 0;
 static char *Demand = 0;  char *Demand = 0;
 static int PtozpRA = 0;  static int PtozpRA = 0;
   
 int doing_f4;  int doing_f4;
Line 298  void pdl(NODE f)
Line 301  void pdl(NODE f)
 void dp_gr_main(LIST f,LIST v,Num homo,int modular,int field,struct order_spec *ord,LIST *rp)  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int field,struct order_spec *ord,LIST *rp)
 {  {
         int i,mindex,m,nochk;          int i,mindex,m,nochk;
         struct order_spec ord1;          struct order_spec *ord1;
         Q q;          Q q;
         VL fv,vv,vc;          VL fv,vv,vc;
         NODE fd,fd0,fi,fi0,r,r0,t,subst,x,s,xx;          NODE fd,fd0,fi,fi0,r,r0,t,subst,x,s,xx;
         NODE ind,ind0;          NODE ind,ind0;
         LIST trace,gbindex;          LIST trace,gbindex;
           int input_is_dp = 0;
   
         mindex = 0; nochk = 0; dp_fcoeffs = field;          mindex = 0; nochk = 0; dp_fcoeffs = field;
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
Line 316  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 320  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
                 homogenize_order(ord,NVars,&ord1);                  homogenize_order(ord,NVars,&ord1);
                 for ( fd0 = fi0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = fi0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         NEXTNODE(fd0,fd); NEXTNODE(fi0,fi);                          NEXTNODE(fd0,fd); NEXTNODE(fi0,fi);
                         ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fi)); dp_homo((DP)BDY(fi),(DP *)&BDY(fd));                          if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                                   dp_sort((DP)BDY(t),(DP *)&BDY(fi)); input_is_dp = 1;
                           } else
                                   ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fi));
                           dp_homo((DP)BDY(fi),(DP *)&BDY(fd));
                 }                  }
                 if ( fd0 ) NEXT(fd) = 0;                  if ( fd0 ) NEXT(fd) = 0;
                 if ( fi0 ) NEXT(fi) = 0;                  if ( fi0 ) NEXT(fi) = 0;
                 initd(&ord1);                  initd(ord1);
         } else {          } else {
                 for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         NEXTNODE(fd0,fd); ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd));                          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;                  if ( fd0 ) NEXT(fd) = 0;
                 fi0 = fd0;                  fi0 = fd0;
Line 340  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 352  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
         init_stat();          init_stat();
         while ( 1 ) {          while ( 1 ) {
                 if ( homo ) {                  if ( homo ) {
                         initd(&ord1); CNVars = NVars+1;                          initd(ord1); CNVars = NVars+1;
                 }                  }
                 if ( DP_Print && modular ) {                  if ( DP_Print && modular ) {
                         fprintf(asir_out,"mod= %d, eval = ",m); printsubst(subst);                          fprintf(asir_out,"mod= %d, eval = ",m); printsubst(subst);
Line 371  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 383  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
         }          }
         for ( r0 = 0, ind0 = 0; x; x = NEXT(x) ) {          for ( r0 = 0, ind0 = 0; x; x = NEXT(x) ) {
                 NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);                  NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);
                 dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                  if ( input_is_dp )
                           BDY(r) = (pointer)ps[(int)BDY(x)];
                   else
                           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 395  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 410  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);                  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)],(Obj *)&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)  void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp)
 {  {
         struct order_spec ord1;          struct order_spec *ord1;
         VL fv,vv,vc;          VL fv,vv,vc;
         NODE fd,fd0,r,r0,t,x,s,xx;          NODE fd,fd0,r,r0,t,x,s,xx;
         DP a,b,c;          DP a,b,c;
 extern struct oEGT eg_red_mod;          extern struct oEGT eg_red_mod;
           int input_is_dp = 0;
   
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
         NVars = length((NODE)vv); PCoeffs = vc ? 1 : 0; VC = vc;          NVars = length((NODE)vv); PCoeffs = vc ? 1 : 0; VC = vc;
Line 411  extern struct oEGT eg_red_mod;
Line 473  extern struct oEGT eg_red_mod;
         initd(ord);          initd(ord);
         if ( homo ) {          if ( homo ) {
                 for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         ptod(CO,vv,(P)BDY(t),&a); dp_homo(a,&b);                          if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                                   dp_sort((DP)BDY(t),&a); input_is_dp = 1;
                           } else
                                   ptod(CO,vv,(P)BDY(t),&a);
                           dp_homo(a,&b);
                         if ( PCoeffs )                          if ( PCoeffs )
                                 dp_mod(b,m,0,&c);                                  dp_mod(b,m,0,&c);
                         else                          else
Line 420  extern struct oEGT eg_red_mod;
Line 486  extern struct oEGT eg_red_mod;
                                 NEXTNODE(fd0,fd); BDY(fd) = (pointer)c;                                  NEXTNODE(fd0,fd); BDY(fd) = (pointer)c;
                         }                          }
                 }                  }
                 homogenize_order(ord,NVars,&ord1); initd(&ord1);                  homogenize_order(ord,NVars,&ord1); initd(ord1);
         } else {          } else {
                 for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         ptod(CO,vv,(P)BDY(t),&b);                          if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                                   dp_sort((DP)BDY(t),&b); input_is_dp = 1;
                           } else
                                   ptod(CO,vv,(P)BDY(t),&b);
                         if ( PCoeffs )                          if ( PCoeffs )
                                 dp_mod(b,m,0,&c);                                  dp_mod(b,m,0,&c);
                         else                          else
Line 437  extern struct oEGT eg_red_mod;
Line 506  extern struct oEGT eg_red_mod;
         setup_arrays(fd0,m,&s);          setup_arrays(fd0,m,&s);
         init_stat();          init_stat();
         if ( homo ) {          if ( homo ) {
                 initd(&ord1); CNVars = NVars+1;                  initd(ord1); CNVars = NVars+1;
         }          }
 /* init_eg(&eg_red_mod); */  /* init_eg(&eg_red_mod); */
         x = gb_mod(s,m);          x = gb_mod(s,m);
Line 449  extern struct oEGT eg_red_mod;
Line 518  extern struct oEGT eg_red_mod;
         reduceall_mod(x,m,&xx); x = xx;          reduceall_mod(x,m,&xx); x = xx;
         if ( PCoeffs )          if ( PCoeffs )
                 for ( r0 = 0; x; x = NEXT(x) ) {                  for ( r0 = 0; x; x = NEXT(x) ) {
                         NEXTNODE(r0,r); mdtop(CO,m,vv,ps[(int)BDY(x)],(P *)&BDY(r));                          NEXTNODE(r0,r);
                           if ( input_is_dp )
                                   mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r));
                           else
                                   mdtop(CO,m,vv,ps[(int)BDY(x)],(P *)&BDY(r));
                 }                  }
         else          else
                 for ( r0 = 0; x; x = NEXT(x) ) {                  for ( r0 = 0; x; x = NEXT(x) ) {
                         NEXTNODE(r0,r); _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                          NEXTNODE(r0,r);
                           if ( input_is_dp )
                                   _mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r));
                           else
                                   _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));
                 }                  }
         print_stat();          print_stat();
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
Line 465  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 542  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
         int homogen;          int homogen;
         VL fv,vv,vc;          VL fv,vv,vc;
         NODE fd,fd0,r,r0,t,x,s,xx;          NODE fd,fd0,r,r0,t,x,s,xx;
           int input_is_dp = 0;
   
         dp_fcoeffs = 0;          dp_fcoeffs = 0;
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
Line 474  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 552  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
                 error("dp_f4_main : invalid order specification");                  error("dp_f4_main : invalid order specification");
         initd(ord);          initd(ord);
         for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {          for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {
                 NEXTNODE(fd0,fd); ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd));                  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 ( homogen )                  if ( homogen )
                         homogen = dp_homogeneous(BDY(fd));                          homogen = dp_homogeneous(BDY(fd));
         }          }
Line 486  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 568  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
         }          }
         for ( r0 = 0; x; x = NEXT(x) ) {          for ( r0 = 0; x; x = NEXT(x) ) {
                 NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);                  NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);
                 dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                  if ( input_is_dp )
                           BDY(r) = (pointer)ps[(int)BDY(x)];
                   else
                           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 498  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 583  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
         VL fv,vv,vc;          VL fv,vv,vc;
         DP b,c,c1;          DP b,c,c1;
         NODE fd,fd0,r,r0,t,x,s,xx;          NODE fd,fd0,r,r0,t,x,s,xx;
           int input_is_dp = 0;
   
         dp_fcoeffs = 0;          dp_fcoeffs = 0;
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
Line 507  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 593  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
                 error("dp_f4_mod_main : invalid order specification");                  error("dp_f4_mod_main : invalid order specification");
         initd(ord);          initd(ord);
         for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {          for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {
                 ptod(CO,vv,(P)BDY(t),&b);                  if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                           dp_sort((DP)BDY(t),&b); input_is_dp = 1;
                   } else
                           ptod(CO,vv,(P)BDY(t),&b);
                 if ( homogen )                  if ( homogen )
                         homogen = dp_homogeneous(b);                          homogen = dp_homogeneous(b);
                 _dp_mod(b,m,0,&c);                  _dp_mod(b,m,0,&c);
Line 527  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 616  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
                 reduceall_mod(x,m,&xx); x = xx;                  reduceall_mod(x,m,&xx); x = xx;
         }          }
         for ( r0 = 0; x; x = NEXT(x) ) {          for ( r0 = 0; x; x = NEXT(x) ) {
                 NEXTNODE(r0,r); _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                  NEXTNODE(r0,r);
                   if ( input_is_dp )
                           _mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r));
                   else
                           _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));
         }          }
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
         MKLIST(*rp,r0);          MKLIST(*rp,r0);
Line 626  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 819  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 860  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 883  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 1040  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 1095  void pltovl(LIST l,VL *vl)
Line 1188  void pltovl(LIST l,VL *vl)
         *vl = r0;          *vl = r0;
 }  }
   
   void vltopl(VL vl,LIST *l)
   {
           VL n;
           NODE r,r0;
           P p;
   
           n = vl;
           for ( r0 = 0; n; n = NEXT(n) ) {
                   NEXTNODE(r0,r); MKV(n->v,p); BDY(r) = (pointer)p;
           }
           if ( r0 ) NEXT(r) = 0;
           MKLIST(*l,r0);
   }
   
 void makesubst(VL v,NODE *s)  void makesubst(VL v,NODE *s)
 {  {
         NODE r,r0;          NODE r,r0;
Line 1194  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 1243  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 1325  void reduceall(NODE in,NODE *h)
Line 1432  void reduceall(NODE in,NODE *h)
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, t = r; i < n; i++, t = NEXT(t) )          for ( i = 0, t = r; i < n; i++, t = NEXT(t) )
                 w[i] = (int)BDY(t);                  w[i] = (int)BDY(t);
           /* w[i] < 0 : reduced to 0 */
         for ( i = 0; i < n; i++ ) {          for ( i = 0; i < n; i++ ) {
                 for ( top = 0, j = n-1; j >= 0; j-- )                  for ( top = 0, j = n-1; j >= 0; j-- )
                         if ( j != i ) {                          if ( w[j] >= 0 && j != i ) {
                                 MKNODE(t,(pointer)w[j],top); top = t;                                  MKNODE(t,(pointer)w[j],top); top = t;
                         }                          }
                 get_eg(&tmp0);                  get_eg(&tmp0);
Line 1349  void reduceall(NODE in,NODE *h)
Line 1457  void reduceall(NODE in,NODE *h)
                 if ( DP_Print || DP_PrintShort ) {                  if ( DP_Print || DP_PrintShort ) {
                         fprintf(asir_out,"."); fflush(asir_out);                          fprintf(asir_out,"."); fflush(asir_out);
                 }                  }
                 w[i] = newps(g1,0,(NODE)0);                  if ( g1 ) {
                           w[i] = newps(g1,0,(NODE)0);
                   } else {
                           w[i] = -1;
                   }
         }          }
         for ( top = 0, j = n-1; j >= 0; j-- ) {          for ( top = 0, j = n-1; j >= 0; j-- ) {
                 MKNODE(t,(pointer)w[j],top); top = t;                  if ( w[j] >= 0 ) {
                           MKNODE(t,(pointer)w[j],top); top = t;
                   }
         }          }
         *h = top;          *h = top;
         if ( DP_Print || DP_PrintShort )          if ( DP_Print || DP_PrintShort )
Line 1378  void reduceall_mod(NODE in,int m,NODE *h)
Line 1492  void reduceall_mod(NODE in,int m,NODE *h)
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, t = r; i < n; i++, t = NEXT(t) )          for ( i = 0, t = r; i < n; i++, t = NEXT(t) )
                 w[i] = (int)BDY(t);                  w[i] = (int)BDY(t);
           /* w[i] < 0 : reduced to 0 */
         for ( i = 0; i < n; i++ ) {          for ( i = 0; i < n; i++ ) {
                 for ( top = 0, j = n-1; j >= 0; j-- )                  for ( top = 0, j = n-1; j >= 0; j-- )
                         if ( j != i ) {                          if ( w[j] >= 0 && j != i ) {
                                 MKNODE(t,(pointer)w[j],top); top = t;                                  MKNODE(t,(pointer)w[j],top); top = t;
                         }                          }
                 get_eg(&tmp0);                  get_eg(&tmp0);
Line 1394  void reduceall_mod(NODE in,int m,NODE *h)
Line 1509  void reduceall_mod(NODE in,int m,NODE *h)
                 if ( DP_Print || DP_PrintShort ) {                  if ( DP_Print || DP_PrintShort ) {
                         fprintf(asir_out,"."); fflush(asir_out);                          fprintf(asir_out,"."); fflush(asir_out);
                 }                  }
                 w[i] = newps_mod(g,m);                  if ( g ) {
                           w[i] = newps_mod(g,m);
                   } else {
                           w[i] = -1;
                   }
         }          }
         for ( top = 0, j = n-1; j >= 0; j-- ) {          for ( top = 0, j = n-1; j >= 0; j-- ) {
                 MKNODE(t,(pointer)w[j],top); top = t;                  if ( w[j] >= 0 ) {
                           MKNODE(t,(pointer)w[j],top); top = t;
                   }
         }          }
         *h = top;          *h = top;
         if ( DP_Print || DP_PrintShort )          if ( DP_Print || DP_PrintShort )
Line 1406  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 1427  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 1465  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 1479  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++;
Line 1536  void reducebase_dehomo(NODE f,NODE *g)
Line 1657  void reducebase_dehomo(NODE f,NODE *g)
                                 NODE node;                                  NODE node;
   
                                 STOQ(r[i],q);                                  STOQ(r[i],q);
                                 node = mknode(4,0,q,0,0);                                  node = mknode(4,NULLP,q,NULLP,NULLP);
                                 MKLIST(hist,node);                                  MKLIST(hist,node);
                                 MKNODE(TraceList,hist,0);                                  MKNODE(TraceList,hist,0);
                         }                          }
Line 1628  NODE gb(NODE f,int m,NODE subst)
Line 1749  NODE gb(NODE f,int m,NODE subst)
         Max_coef = 0;          Max_coef = 0;
         prev = 1;          prev = 1;
         doing_f4 = 0;          doing_f4 = 0;
           init_denomlist();
         if ( m ) {          if ( m ) {
                 psm = (DP *)MALLOC(pslen*sizeof(DP));                  psm = (DP *)MALLOC(pslen*sizeof(DP));
                 for ( i = 0; i < psn; i++ )                  for ( i = 0; i < psn; i++ )
Line 1688  skip_nf:
Line 1810  skip_nf:
                         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((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 1812  DP_pairs updpairs( DP_pairs d, NODE /* of index */ g, 
Line 1935  DP_pairs updpairs( DP_pairs d, NODE /* of index */ g, 
         if ( !NoCriB && d ) {          if ( !NoCriB && d ) {
                 dl = DPPlength(d);                  dl = DPPlength(d);
                 d = criterion_B( d, t );                  d = criterion_B( d, t );
                 dl -= DPPlength(d); NBP += dl;                  dl -= DPPlength(d); N_BP += dl;
         }          }
         d1 = newpairs( g, t );          d1 = newpairs( g, t );
         if ( NEXT(d1) ) {          if ( NEXT(d1) ) {
Line 1974  DP_pairs criterion_F( DP_pairs d1 )
Line 2097  DP_pairs criterion_F( DP_pairs d1 )
         for ( head = last = 0, p = d1; NEXT(p); ) {          for ( head = last = 0, p = d1; NEXT(p); ) {
                 s = (r = w = collect_pairs_of_hdlcm( p, &rest ))->sugar;                  s = (r = w = collect_pairs_of_hdlcm( p, &rest ))->sugar;
                 while ( w = NEXT(w) )                  while ( w = NEXT(w) )
                         if ( criterion_2( w->dp1, w->dp2 ) ) {                          if ( !do_weyl && criterion_2( w->dp1, w->dp2 ) ) {
                                 r = w;                                  r = w;
                                 break;                                  break;
                         } else if ( w->sugar < s ) s = (r = w)->sugar;                          } else if ( w->sugar < s ) s = (r = w)->sugar;
Line 2200  void dp_set_flag(Obj name,Obj value)
Line 2323  void dp_set_flag(Obj name,Obj value)
                 GenTrace = v;                  GenTrace = v;
         else if ( !strcmp(n,"OXCheck") )          else if ( !strcmp(n,"OXCheck") )
                 OXCheck = v;                  OXCheck = v;
           else if ( !strcmp(n,"GenSyz") )
                   GenSyz = v;
           else if ( !strcmp(n,"OneZeroHomo") )
                   OneZeroHomo = v;
           else if ( !strcmp(n,"MaxDeg") )
                   MaxDeg = v;
 }  }
   
 void dp_make_flaglist(LIST *list)  void dp_make_flaglist(LIST *list)
Line 2226  void dp_make_flaglist(LIST *list)
Line 2355  void dp_make_flaglist(LIST *list)
         STOQ(DP_NFStat,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"NFStat"); MKNODE(n1,name,n); n = n1;          STOQ(DP_NFStat,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"NFStat"); 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(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(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 2299  void init_stat() {
Line 2431  void init_stat() {
         init_eg(&eg_nf); init_eg(&eg_nfm); init_eg(&eg_znfm);          init_eg(&eg_nf); init_eg(&eg_nfm); init_eg(&eg_znfm);
         init_eg(&eg_pz); init_eg(&eg_np);          init_eg(&eg_pz); init_eg(&eg_np);
         init_eg(&eg_ra); init_eg(&eg_mc); init_eg(&eg_gc);          init_eg(&eg_ra); init_eg(&eg_mc); init_eg(&eg_gc);
         ZR = NZR = TP = NMP = NBP = NFP = NDP = 0;          ZR = NZR = TP = NMP = N_BP = NFP = NDP = 0;
 }  }
   
 void print_stat() {  void print_stat() {
Line 2308  void print_stat() {
Line 2440  void print_stat() {
         print_eg("NF",&eg_nf); print_eg("NFM",&eg_nfm); print_eg("ZNFM",&eg_znfm);          print_eg("NF",&eg_nf); print_eg("NFM",&eg_nfm); print_eg("ZNFM",&eg_znfm);
         print_eg("PZ",&eg_pz); print_eg("NP",&eg_np);          print_eg("PZ",&eg_pz); print_eg("NP",&eg_np);
         print_eg("RA",&eg_ra); print_eg("MC",&eg_mc); print_eg("GC",&eg_gc);          print_eg("RA",&eg_ra); print_eg("MC",&eg_mc); print_eg("GC",&eg_gc);
         fprintf(asir_out,"T=%d,B=%d M=%d F=%d D=%d ZR=%d NZR=%d\n",TP,NBP,NMP,NFP,NDP,ZR,NZR);          fprintf(asir_out,"T=%d,B=%d M=%d F=%d D=%d ZR=%d NZR=%d\n",TP,N_BP,NMP,NFP,NDP,ZR,NZR);
 }  }
   
 /*  /*
Line 2331  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 2443  void _dp_nf_z(NODE b,DP g,DP *ps,int full,int multiple
Line 2575  void _dp_nf_z(NODE b,DP g,DP *ps,int full,int multiple
                                 if ( GenTrace ) {                                  if ( GenTrace ) {
                                         /* u = cr*rp + (-cred)*shift*red */                                          /* u = cr*rp + (-cred)*shift*red */
                                         STOQ((int)BDY(l),cq);                                          STOQ((int)BDY(l),cq);
                                         node = mknode(4,cr,cq,0,0);                                          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 2504  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 2549  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();

Legend:
Removed from v.1.51  
changed lines
  Added in v.1.73

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>