[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.48 and 1.65

version 1.48, 2003/06/05 09:40:39 version 1.65, 2009/02/09 10:21:29
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.47 2003/05/30 06:03:28 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.64 2007/09/19 05:56:01 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
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;
   
 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 123  void Pox_pop_local(NODE,Obj *);
Line 124  void Pox_pop_local(NODE,Obj *);
 INLINE int eqdl(int nv,DL dl1,DL dl2)  INLINE int eqdl(int nv,DL dl1,DL dl2)
 {  {
         int i;          int i;
         int *b1,*b2;          int *p1,*p2;
   
         if ( dl1->td != dl2->td )          if ( dl1->td != dl2->td )
                 return 0;                  return 0;
         for ( i = 0, b1 = dl1->d, b2 = dl2->d; i < nv; i++ )          i = nv-1;
                 if ( b1[i] != b2[i] )          p1 = dl1->d;
                         break;          p2 = dl2->d;
         if ( i == nv )          while ( i >= 7 ) {
                 return 1;                  if ( *p1++ != *p2++ ) return 0;
         else                  if ( *p1++ != *p2++ ) return 0;
                 return 0;                  if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   i -= 8;
           }
           switch ( i ) {
                   case 6:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 5:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 4:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 3:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 2:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 1:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 0:
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   default:
                           return 1;
           }
 }  }
   
 /* b[] should be cleared */  /* b[] should be cleared */
Line 245  void pdl(NODE f)
Line 299  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 263  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 318  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 287  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 350  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 318  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 381  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)],(P *)&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 342  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 408  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)],(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)  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 358  extern struct oEGT eg_red_mod;
Line 471  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 367  extern struct oEGT eg_red_mod;
Line 484  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 384  extern struct oEGT eg_red_mod;
Line 504  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 396  extern struct oEGT eg_red_mod;
Line 516  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 412  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 540  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 421  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 550  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 433  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 566  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)],(P *)&BDY(r));
         }          }
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
         MKLIST(*rp,r0);          MKLIST(*rp,r0);
Line 445  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 581  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 454  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 591  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 474  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 614  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 601  NODE gb_f4(NODE f)
Line 745  NODE gb_f4(NODE f)
 /* initial bases are monic */  /* initial bases are monic */
   
 unsigned int **psca;  unsigned int **psca;
   GeoBucket create_bucket();
   DL remove_head_bucket(GeoBucket,int);
   
 NODE gb_f4_mod(NODE f,int m)  NODE gb_f4_mod(NODE f,int m)
 {  {
Line 619  NODE gb_f4_mod(NODE f,int m)
Line 765  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;          GeoBucket bucket;
         extern struct oEGT eg_symb,eg_elim1,eg_elim2;          DL head;
           struct oEGT tmp0,tmp1,eg_split_symb,eg_split_conv,eg_split_elim1,eg_split_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 641  NODE gb_f4_mod(NODE f,int m)
Line 789  NODE gb_f4_mod(NODE f,int m)
                 minsugar(d,&dm,&dr); d = dr;                  minsugar(d,&dm,&dr); d = dr;
                 if ( DP_Print )                  if ( DP_Print )
                         fprintf(asir_out,"sugar=%d\n",dm->sugar);                          fprintf(asir_out,"sugar=%d\n",dm->sugar);
                 blist = 0; s0 = 0;                  blist = 0;
                   bucket = create_bucket();
                 /* asph : sum of all head terms of spoly */                  /* asph : sum of all head terms of spoly */
                 for ( t = dm; t; t = NEXT(t) ) {                  for ( t = dm; t; t = NEXT(t) ) {
                         _dp_sp_mod(ps[t->dp1],ps[t->dp2],m,&sp);                          _dp_sp_mod(ps[t->dp1],ps[t->dp2],m,&sp);
 /*                      fprintf(stderr,"splen=%d-",dp_nt(sp)); */  /*                      fprintf(stderr,"splen=%d-",dp_nt(sp)); */
                         if ( sp ) {                          if ( sp ) {
                                 MKNODE(bt,sp,blist); blist = bt;                                  MKNODE(bt,sp,blist); blist = bt;
                                 s0 = symb_merge(s0,dp_dllist(sp),nv);                                  add_bucket(bucket,dp_dllist(sp),nv);
 /*                              fprintf(stderr,"%d-",length(s0)); */  /*                              fprintf(stderr,"%d-",length(s0)); */
                         }                          }
                 }                  }
   #if 0
                 if ( DP_Print )                  if ( DP_Print )
                         fprintf(asir_out,"initial spmat : %d x %d ",length(blist),length(s0));                          fprintf(asir_out,"initial spmat : %d x %d ",length(blist),length(s0));
   #endif
                 /* s0 : all the terms appeared in symbolic reduction */                  /* s0 : all the terms appeared in symbolic reduction */
                 for ( s = s0, nred = 0; s; s = NEXT(s) ) {                  nred = 0;
                   s0 = 0;
                   while ( 1 ) {
                           head = remove_head_bucket(bucket,nv);
                           if ( !head ) break;
                           else {
                                   NEXTNODE(s0,s);
                                   BDY(s) = (pointer)head;
                           }
                         for ( r = gall; r; r = NEXT(r) )                          for ( r = gall; r; r = NEXT(r) )
                                 if ( _dl_redble(BDY(ps[(int)BDY(r)])->dl,BDY(s),nv) )                                  if ( _dl_redble(BDY(ps[(int)BDY(r)])->dl,head,nv) )
                                         break;                                          break;
                         if ( r ) {                          if ( r ) {
                                 dltod(BDY(s),nv,&tdp);                                  dltod(head,nv,&tdp);
                                 dp_subd(tdp,ps[(int)BDY(r)],&sd);                                  dp_subd(tdp,ps[(int)BDY(r)],&sd);
                                 dt = mul_dllist(BDY(sd)->dl,ps[(int)BDY(r)]);                                  dt = mul_dllist(BDY(sd)->dl,ps[(int)BDY(r)]);
                                   add_bucket(bucket,NEXT(dt),nv);
 /*                              fprintf(stderr,"[%d]",length(dt)); */  /*                              fprintf(stderr,"[%d]",length(dt)); */
                                 /* list of [t,f] */                                  /* list of [t,f] */
                                 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);  
 /*                              fprintf(stderr,"%d-",length(s0));  */  /*                              fprintf(stderr,"%d-",length(s0));  */
                                 nred++;                                  nred++;
                         }                          }
                 }                  }
                   if ( s0 ) NEXT(s) = 0;
 /*              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 714  NODE gb_f4_mod(NODE f,int m)
Line 878  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 772  NODE gb_f4_mod(NODE f,int m)
Line 936  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 814  NODE gb_f4_mod(NODE f,int m)
Line 979  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 1020  void pltovl(LIST l,VL *vl)
Line 1186  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 1159  void prim_part(DP f,int m,DP *r)
Line 1339  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 || PCoeffs )                  if ( dp_fcoeffs || PCoeffs )
                         dp_prim(f,r);                          dp_prim(f,r);
Line 1250  void reduceall(NODE in,NODE *h)
Line 1430  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 1274  void reduceall(NODE in,NODE *h)
Line 1455  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 1303  void reduceall_mod(NODE in,int m,NODE *h)
Line 1490  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 1319  void reduceall_mod(NODE in,int m,NODE *h)
Line 1507  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 1553  NODE gb(NODE f,int m,NODE subst)
Line 1747  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 1602  NODE gb(NODE f,int m,NODE subst)
Line 1797  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
Line 1613  skip_nf:
Line 1808  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(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 1737  DP_pairs updpairs( DP_pairs d, NODE /* of index */ g, 
Line 1933  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 1899  DP_pairs criterion_F( DP_pairs d1 )
Line 2095  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 2125  void dp_set_flag(Obj name,Obj value)
Line 2321  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;
 }  }
   
 void dp_make_flaglist(LIST *list)  void dp_make_flaglist(LIST *list)
Line 2151  void dp_make_flaglist(LIST *list)
Line 2349  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(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 2224  void init_stat() {
Line 2423  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 2233  void print_stat() {
Line 2432  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);
 }  }
   
 /*  /*

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.65

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