[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.14 and 1.18

version 1.14, 2000/12/08 02:39:05 version 1.18, 2001/01/12 09:03:33
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.13 2000/12/05 08:29:43 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.17 2000/12/11 02:00:40 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 105  DP_pairs criterion_M(DP_pairs);
Line 105  DP_pairs criterion_M(DP_pairs);
 DP_pairs criterion_B(DP_pairs,int);  DP_pairs criterion_B(DP_pairs,int);
 DP_pairs newpairs(NODE,int);  DP_pairs newpairs(NODE,int);
 DP_pairs updpairs(DP_pairs,NODE,int);  DP_pairs updpairs(DP_pairs,NODE,int);
 void _dp_nf(NODE,DP,DP *,int,int,DP *);  void _dp_nf(NODE,DP,DP *,int,DP *);
   void _dp_nf_ptozp(NODE,DP,DP *,int,int,DP *);
 NODE gb_mod(NODE,int);  NODE gb_mod(NODE,int);
 NODE gbd(NODE,int,NODE,NODE);  NODE gbd(NODE,int,NODE,NODE);
 NODE gb(NODE,int,NODE);  NODE gb(NODE,int,NODE);
Line 150  static P *psc;
Line 151  static P *psc;
   
 static int *pss;  static int *pss;
 static int psn,pslen;  static int psn,pslen;
 static int NVars,CNVars,PCoeffs;  static int NVars,CNVars;
 static VL VC;  static VL VC;
   
   int PCoeffs;
 int DP_Print = 0;  int DP_Print = 0;
 int DP_Multiple = 0;  int DP_Multiple = 0;
   int DP_NFStat = 0;
 LIST Dist = 0;  LIST Dist = 0;
 int NoGCD = 0;  int NoGCD = 0;
 int GenTrace = 0;  int GenTrace = 0;
 int OXCheck = -1;  int OXCheck = -1;
   
 static DP_NFStat = 0;  
 static int NoSugar = 0;  static int NoSugar = 0;
 static int NoCriB = 0;  static int NoCriB = 0;
 static int NoGC = 0;  static int NoGC = 0;
Line 353  LIST *rp;
Line 355  LIST *rp;
         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;
   
         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 390  LIST *rp;
Line 393  LIST *rp;
         if ( homo ) {          if ( homo ) {
                 initd(&ord1); CNVars = NVars+1;                  initd(&ord1); CNVars = NVars+1;
         }          }
   /* init_eg(&eg_red_mod); */
         x = gb_mod(s,m);          x = gb_mod(s,m);
   /* print_eg("Red_mod",&eg_red_mod); */
         if ( homo ) {          if ( homo ) {
                 reducebase_dehomo(x,&xx); x = xx;                  reducebase_dehomo(x,&xx); x = xx;
                 initd(ord); CNVars = NVars;                  initd(ord); CNVars = NVars;
Line 726  int m;
Line 731  int m;
                         for ( j = 0; j < spcol; j++ )                          for ( j = 0; j < spcol; j++ )
                                 if ( spmat[i][j] )                                  if ( spmat[i][j] )
                                         nonzero++;                                          nonzero++;
                 if ( DP_Print )                  if ( DP_Print && nsp )
                         fprintf(asir_out,"spmat : %d x %d (nonzero=%f%%)...",                          fprintf(asir_out,"spmat : %d x %d (nonzero=%f%%)...",
                                 nsp,spcol,((double)nonzero*100)/(nsp*spcol));                                  nsp,spcol,((double)nonzero*100)/(nsp*spcol));
                 rank = generic_gauss_elim_mod(spmat,nsp,spcol,m,colstat);                  if ( nsp )
                           rank = generic_gauss_elim_mod(spmat,nsp,spcol,m,colstat);
                   else
                           rank = 0;
                 get_eg(&tmp1); add_eg(&eg_elim2,&tmp0,&tmp1);                  get_eg(&tmp1); add_eg(&eg_elim2,&tmp0,&tmp1);
                 init_eg(&eg_split_elim2); add_eg(&eg_split_elim2,&tmp0,&tmp1);                  init_eg(&eg_split_elim2); add_eg(&eg_split_elim2,&tmp0,&tmp1);
   
Line 895  int m;
Line 902  int m;
         int i;          int i;
         NODE s,s0,f0;          NODE s,s0,f0;
   
   #if 1
         f0 = f = NODE_sortb(f,1);          f0 = f = NODE_sortb(f,1);
   #else
           f0 = f;
   #endif
         psn = length(f); pslen = 2*psn;          psn = length(f); pslen = 2*psn;
         ps = (DP *)MALLOC(pslen*sizeof(DP));          ps = (DP *)MALLOC(pslen*sizeof(DP));
         psh = (DL *)MALLOC(pslen*sizeof(DL));          psh = (DL *)MALLOC(pslen*sizeof(DL));
Line 1060  NODE *h;
Line 1071  NODE *h;
                         MKLIST(hist,node);                          MKLIST(hist,node);
                         MKNODE(TraceList,hist,0);                          MKNODE(TraceList,hist,0);
                 }                  }
                 _dp_nf(top,ps[w[i]],ps,1,PtozpRA?DP_Multiple:0,&g);                  _dp_nf(top,ps[w[i]],ps,1,&g);
                 prim_part(g,0,&g1);                  prim_part(g,0,&g1);
                 get_eg(&tmp1); add_eg(&eg_ra,&tmp0,&tmp1);                  get_eg(&tmp1); add_eg(&eg_ra,&tmp0,&tmp1);
                 if ( DP_Print || DP_PrintShort ) {                  if ( DP_Print || DP_PrintShort ) {
Line 1405  NODE subst;
Line 1416  NODE subst;
                                 new_sugar = h->sugar;                                  new_sugar = h->sugar;
                         get_eg(&tnf0);                          get_eg(&tnf0);
                         t_0 = get_rtime();                          t_0 = get_rtime();
                         _dp_nf(gall,h,ps,!Top,DP_Multiple,&nf);                          if ( PCoeffs || dp_fcoeffs )
                                   _dp_nf(gall,h,ps,!Top,&nf);
                           else
                                   _dp_nf_ptozp(gall,h,ps,!Top,DP_Multiple,&nf);
                         if ( DP_Print )                          if ( DP_Print )
                                 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);
Line 1803  NODE f;
Line 1817  NODE f;
         while ( d ) {          while ( d ) {
                 l = d; d = NEXT(d);                  l = d; d = NEXT(d);
                 get_eg(&tmp0);                  get_eg(&tmp0);
                 dp_load(l->dp1,&dp1); dp_load(l->dp2,&dp2); dp_sp(dp1,dp2,&h);                  dp_load(l->dp1,&dp1); dp_load(l->dp2,&dp2);
                 _dp_nf(gall,h,ps,1,0,&nf);                  dp_sp(dp1,dp2,&h);
   /* fprintf(stderr,"{%d,%d}",l->dp1,l->dp2); */
                   _dp_nf(gall,h,ps,1,&nf);
                 get_eg(&tmp1); add_eg(&eg_gc,&tmp0,&tmp1);                  get_eg(&tmp1); add_eg(&eg_gc,&tmp0,&tmp1);
                 if ( DP_Print || DP_PrintShort ) {                  if ( DP_Print || DP_PrintShort ) {
                         fprintf(asir_out,"."); fflush(asir_out);                          fprintf(asir_out,"."); fflush(asir_out);
Line 1830  NODE f,x;
Line 1846  NODE f,x;
         }          }
         for ( ; f; f = NEXT(f) ) {          for ( ; f; f = NEXT(f) ) {
                 get_eg(&tmp0);                  get_eg(&tmp0);
                 _dp_nf(x,(DP)BDY(f),ps,1,0,&g);                  _dp_nf(x,(DP)BDY(f),ps,1,&g);
                 get_eg(&tmp1); add_eg(&eg_mc,&tmp0,&tmp1);                  get_eg(&tmp1); add_eg(&eg_mc,&tmp0,&tmp1);
                 if ( DP_Print ) {                  if ( DP_Print ) {
                         print_split_eg(&tmp0,&tmp1); fflush(asir_out);                          print_split_eg(&tmp0,&tmp1); fflush(asir_out);
Line 2006  void print_stat() {
Line 2022  void print_stat() {
  *   *
  */   */
   
 #define SAFENM(q) ((q)?NM(q):0)  
   
 double pz_t_e, pz_t_d, pz_t_d1, pz_t_c, im_t_s, im_t_r;  double pz_t_e, pz_t_d, pz_t_d1, pz_t_c, im_t_s, im_t_r;
   
 extern int GenTrace;  extern int GenTrace;
 extern NODE TraceList;  extern NODE TraceList;
   extern int mpi_mag;
   
 void _dp_nf(b,g,ps,full,multiple,r)  void dp_mulc_d(p,c,r)
   DP p;
   P c;
   DP *r;
   {
           if ( Dist && BDY(Dist)
                   && HMAG(p) > mpi_mag
                   && p_mag((P)c) > mpi_mag ) {
                   if ( DP_NFStat ) fprintf(asir_out,"~");
                   dp_imul_d(p,(Q)c,r);
           } else {
                   if ( DP_NFStat ) fprintf(asir_out,"_");
                   muldc(CO,p,c,r);
           }
   }
   
   void _dp_nf(b,g,ps,full,rp)
 NODE b;  NODE b;
 DP g;  DP g;
 DP *ps;  DP *ps;
   int full;
   DP *rp;
   {
           DP u,p,d,s,t,mult;
           P coef;
           NODE l;
           MP m,mr;
           int sugar,psugar;
   
           if ( !g ) {
                   *rp = 0; return;
           }
           sugar = g->sugar;
           for ( d = 0; g; ) {
                   for ( u = 0, l = b; l; l = NEXT(l) ) {
                           if ( dl_redble(BDY(g)->dl,psh[(int)BDY(l)]) ) {
                                   dp_load((int)BDY(l),&p);
                                   /* t+u = coef*(d+g) - mult*p (t = coef*d) */
                                   dp_red(d,g,p,&t,&u,&coef,&mult);
                                   psugar = (BDY(g)->dl->td - BDY(p)->dl->td) + p->sugar;
                                   sugar = MAX(sugar,psugar);
                                   if ( GenTrace ) {
                                           LIST hist;
                                           Q cq;
                                           NODE node,node0;
   
                                           STOQ((int)BDY(l),cq);
                                           node0 = mknode(4,coef,cq,mult,ONE);
                                           MKLIST(hist,node0);
                                           MKNODE(node,hist,TraceList); TraceList = node;
                                   }
                                   if ( !u ) {
                                           if ( d )
                                                   d->sugar = sugar;
                                           *rp = d; return;
                                   }
                                   d = t;
                                   break;
                           }
                   }
                   if ( u )
                           g = u;
                   else if ( !full ) {
                           if ( g ) {
                                   MKDP(g->nv,BDY(g),t); t->sugar = sugar; g = t;
                           }
                           *rp = g; return;
                   } else {
                           m = BDY(g); NEWMP(mr); mr->dl = m->dl; mr->c = m->c;
                           NEXT(mr) = 0; MKDP(g->nv,mr,t); t->sugar = mr->dl->td;
                           addd(CO,d,t,&s); d = s;
                           dp_rest(g,&t); g = t;
                   }
           }
           if ( d )
                   d->sugar = sugar;
           *rp = d;
   }
   
   void _dp_nf_ptozp(b,g,ps,full,multiple,r)
   NODE b;
   DP g;
   DP *ps;
 int full,multiple;  int full,multiple;
 DP *r;  DP *r;
 {  {
Line 2029  DP *r;
Line 2123  DP *r;
         int sugar,psugar;          int sugar,psugar;
         NODE dist;          NODE dist;
         STRING imul;          STRING imul;
         int ndist;  
         int kara_bit;          int kara_bit;
         extern int mpi_mag;  
         double get_rtime();          double get_rtime();
         double t_0,t_00,tt,ttt,t_p,t_m,t_m1,t_m2,t_s,t_g,t_a;          double t_0,t_00,tt,ttt,t_p,t_m,t_g,t_a;
         LIST hist;          LIST hist;
         NODE node;          NODE node;
         Q rcred,mrcred;          Q rcred,mrcred;
Line 2042  DP *r;
Line 2134  DP *r;
                 *r = 0; return;                  *r = 0; return;
         }          }
         pz_t_e = pz_t_d = pz_t_d1 = pz_t_c = 0;          pz_t_e = pz_t_d = pz_t_d1 = pz_t_c = 0;
         t_p = t_m = t_m1 = t_m2 = t_s = t_g = t_a = 0;          t_p = t_m = t_g = t_a = 0;
   
         denom = Denominator?Denominator:1;          denom = Denominator?Denominator:1;
         hmag = multiple*HMAG(g)/denom;          hmag = multiple*HMAG(g)/denom;
         if ( Dist ) {  
                 dist = BDY(Dist);  
                 ndist = length(dist);  
         }  
         sugar = g->sugar;          sugar = g->sugar;
   
         dc = 0; dp = 0; rc = ONE; rp = g;          dc = 0; dp = 0; rc = ONE; rp = g;
Line 2062  DP *r;
Line 2150  DP *r;
                                 t_0 = get_rtime();                                  t_0 = get_rtime();
                                 dp_load((int)BDY(l),&red);                                  dp_load((int)BDY(l),&red);
                                 hr = (Q)BDY(rp)->c; hred = (Q)BDY(red)->c;                                  hr = (Q)BDY(rp)->c; hred = (Q)BDY(red)->c;
                                 /*  
                                  * hr = HC(rp), hred = HC(red)  
                                  * cred = hr/GCD(hr,hred), cr = hred/GCD(hr,hred)  
                                  */  
                                 igcd_cofactor((Q)BDY(rp)->c,(Q)BDY(red)->c,&gcd,&cred,&cr);                                  igcd_cofactor((Q)BDY(rp)->c,(Q)BDY(red)->c,&gcd,&cred,&cr);
                                 tt = get_rtime()-t_0; t_p += tt;                                  tt = get_rtime(); t_p += tt-t_0;
   
                                 t_0 = get_rtime();  
                                 dp_subd(rp,red,&shift);                                  dp_subd(rp,red,&shift);
                                   dp_mulc_d(rp,cr,&t);
                                 t_00 = get_rtime();  
                                 if ( Dist && ndist  
                                         && HMAG(red) > mpi_mag  
                                         && p_mag((P)cr) > mpi_mag ) {  
                                         if ( DP_NFStat ) fprintf(asir_out,"~");  
                                         dp_imul_d(rp,cr,&t);  
                                 } else {  
                                         if ( DP_NFStat ) fprintf(asir_out,"_");  
                                         muldc(CO,rp,(P)cr,&t);  
                                 }  
                                 ttt = get_rtime()-t_00; t_m1 += ttt/dp_nt(rp);  
   
                                 t_00 = get_rtime();  
                                 chsgnp((P)cred,(P *)&mcred);                                  chsgnp((P)cred,(P *)&mcred);
                                 if ( Dist && ndist                                  dp_mulc_d(red,mcred,&t1);
                                         && HMAG(red) > mpi_mag                                  muld(CO,shift,t1,&t1);
                                         && p_mag((P)mcred) > mpi_mag ) {                                  addd(CO,t,t1,&u);
                                         if ( DP_NFStat ) fprintf(asir_out,"=");                                  t_m += get_rtime()-tt;
                                         dp_imul_d(red,mcred,&t1);  
                                 } else {  
                                         if ( DP_NFStat ) fprintf(asir_out,"_");  
                                         muldc(CO,red,(P)mcred,&t1);  
                                 }  
                                 ttt = get_rtime()-t_00; t_m2 += ttt/dp_nt(red);  
   
                                 t_00 = get_rtime();  
                                 muld(CO,shift,t1,&t2);  
                                 addd(CO,t,t2,&u);  
                                 tt = get_rtime(); t_m += tt-t_0;  
                                 ttt = get_rtime(); t_s += ttt-t_00;  
   
                                 psugar = (BDY(rp)->dl->td - BDY(red)->dl->td) + red->sugar;                                  psugar = (BDY(rp)->dl->td - BDY(red)->dl->td) + red->sugar;
                                 sugar = MAX(sugar,psugar);                                  sugar = MAX(sugar,psugar);
   
                                 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);
Line 2114  DP *r;
Line 2173  DP *r;
                                         muldc(CO,shift,(P)mrcred,(DP *)&ARG2(node));                                          muldc(CO,shift,(P)mrcred,(DP *)&ARG2(node));
                                         MKLIST(hist,node);                                          MKLIST(hist,node);
                                 }                                  }
   
                                 if ( !u ) {                                  if ( !u ) {
                                         if ( dp )                                          if ( dp )
                                                 dp->sugar = sugar;                                                  dp->sugar = sugar;
Line 2130  DP *r;
Line 2190  DP *r;
                 if ( u ) {                  if ( u ) {
                         if ( multiple && HMAG(u) > hmag ) {                          if ( multiple && HMAG(u) > hmag ) {
                                 t_0 = get_rtime();                                  t_0 = get_rtime();
                                 if ( Dist && HMAG(u) > mpi_mag ) {                                  dp_ptozp_d(u,&rp);
                                         if ( DP_NFStat )                                  tt = get_rtime(); t_g += tt-t_0;
                                                 fprintf(asir_out,"D");  
                                         dp_ptozp_d(dist,ndist,u,&t);                                  divsq((Q)BDY(u)->c,(Q)BDY(rp)->c,&cont);
                                 } else {  
                                         if ( DP_NFStat )  
                                                 fprintf(asir_out,"L");  
                                         dp_ptozp_d(0,0,u,&t);  
                                 }  
                                 tt = get_rtime()-t_0; t_g += tt;  
                                 t_0 = get_rtime();  
                                 divsn(NM((Q)BDY(u)->c),NM((Q)BDY(t)->c),&cn); NTOQ(cn,1,cont);  
                                 if ( !dp_fcoeffs && DP_NFStat ) {                                  if ( !dp_fcoeffs && DP_NFStat ) {
                                         fprintf(asir_out,"(%d)",p_mag((P)cont)*100/p_mag((P)BDY(u)->c));                                          fprintf(asir_out,
                                                   "(%d)",p_mag((P)cont)*100/p_mag((P)BDY(u)->c));
                                         fflush(asir_out);                                          fflush(asir_out);
                                 }                                  }
                                 mulq(cr,dc,&dcq);                                  mulq(cr,dc,&dcq); mulq(cont,rc,&rcq);
                                 mulq(cont,rc,&rcq);  
                                 igcd_cofactor(dcq,rcq,&gcd,&dc,&rc);                                  igcd_cofactor(dcq,rcq,&gcd,&dc,&rc);
                                 tt = get_rtime()-t_0; t_a += tt;                                  t_a = get_rtime()-tt;
                                 rp = t;  
                                 hmag = multiple*HMAG(rp)/denom;                                  hmag = multiple*HMAG(rp)/denom;
                                 if ( GenTrace ) {                                  if ( GenTrace ) {
                                         ARG3(BDY(hist)) = (pointer)gcd;                                          ARG3(BDY(hist)) = (pointer)gcd;
                                         MKNODE(node,hist,TraceList); TraceList = node;                                          MKNODE(node,hist,TraceList); TraceList = node;
                                 }                                  }
                         } else {                          } else {
                                 t_0 = get_rtime();  
                                 mulq(cr,dc,&dcq); dc = dcq;  
                                 tt = get_rtime()-t_0; t_a += tt;  
                                 rp = u;                                  rp = u;
                                   t_0 = get_rtime();
                                   mulq(cr,dc,&dc);
                                   t_a += get_rtime()-t_0;
                                 if ( GenTrace ) {                                  if ( GenTrace ) {
                                         ARG3(BDY(hist)) = (pointer)ONE;                                          ARG3(BDY(hist)) = (pointer)ONE;
                                         MKNODE(node,hist,TraceList); TraceList = node;                                          MKNODE(node,hist,TraceList); TraceList = node;
Line 2175  DP *r;
Line 2227  DP *r;
                 } else {                  } else {
                         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,&gcd,&dcq,&cq);                          igcd_cofactor(dc,c,&dc,&dcq,&cq);
                         muldc(CO,dp,(P)dcq,&t1);                          muldc(CO,dp,(P)dcq,&t);
                         m = BDY(rp); NEWMP(mr); mr->dl = m->dl; mr->c = (P)cq;                          dp_hm(rp,&t1); BDY(t1)->c = (P)cq;  addd(CO,t,t1,&dp);
                         NEXT(mr) = 0; MKDP(rp->nv,mr,t); t->sugar = mr->dl->td;                          dp_rest(rp,&rp);
                         addd(CO,t,t1,&dp);                          t_a += get_rtime()-t_0;
                         dc = gcd;  
   
                         dp_rest(rp,&t); rp = t;  
                         tt = get_rtime()-t_0; t_a += tt;  
                 }                  }
         }          }
         if ( GenTrace ) {          if ( GenTrace ) {
Line 2195  DP *r;
Line 2243  DP *r;
         *r = dp;          *r = dp;
 final:  final:
         if ( DP_NFStat )          if ( DP_NFStat )
                 fprintf(asir_out,"(%.3g %.3g %.3g %.3g %.3g %.3g %.3g %.3g %.3g %.3g %.3g)",                  fprintf(asir_out,
                         t_p,t_m,t_m1,t_m2,t_s,                          "(%.3g %.3g %.3g %.3g %.3g %.3g %.3g %.3g)",
                         t_g,t_a,                          t_p,t_m,t_g,t_a,
                         pz_t_e, pz_t_d, pz_t_d1, pz_t_c);                          pz_t_e, pz_t_d, pz_t_d1, pz_t_c);
 }  }
   
Line 2218  DP *rp;
Line 2266  DP *rp;
         NODE tn,dist,n0,n1,n2;          NODE tn,dist,n0,n1,n2;
         Obj dmy;          Obj dmy;
         STRING imul;          STRING imul;
   
         extern LIST Dist;          extern LIST Dist;
   
         if ( !p || !q ) {          if ( !p || !q ) {

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.18

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