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

Diff for /OpenXM_contrib2/asir2000/engine/Hgfs.c between version 1.25 and 1.31

version 1.25, 2002/10/23 07:54:58 version 1.31, 2015/03/16 00:08:32
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.24 2002/09/30 06:13:07 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.30 2003/01/15 10:21:17 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "inline.h"  #include "inline.h"
   
   int debug_sfbfctr;
   
 void lnfsf(int n,UM p0,UM p1,struct p_pair *list,UM np0,UM np1);  void lnfsf(int n,UM p0,UM p1,struct p_pair *list,UM np0,UM np1);
 void extractcoefbm(BM f,int dx,UM r);  void extractcoefbm(BM f,int dx,UM r);
   
Line 79  void gensqfrsfum(UM p,struct oDUM *dc)
Line 81  void gensqfrsfum(UM p,struct oDUM *dc)
 {  {
         int n,i,j,d,mod;          int n,i,j,d,mod;
         UM t,s,g,f,f1,b;          UM t,s,g,f,f1,b;
           GFS u,v;
   
         if ( (n = DEG(p)) == 1 ) {          if ( (n = DEG(p)) == 1 ) {
                 dc[0].f = UMALLOC(DEG(p)); cpyum(p,dc[0].f); dc[0].n = 1;                  dc[0].f = UMALLOC(DEG(p)); cpyum(p,dc[0].f); dc[0].n = 1;
Line 117  void gensqfrsfum(UM p,struct oDUM *dc)
Line 120  void gensqfrsfum(UM p,struct oDUM *dc)
                                 break;                                  break;
                         else {                          else {
                                 DEG(s) = DEG(t)/mod;                                  DEG(s) = DEG(t)/mod;
                                 for ( j = 0; j <= DEG(t); j++ )                                  for ( j = 0; j <= DEG(t); j++ ) {
                                         COEF(s)[j] = COEF(t)[j*mod];                                          iftogfs(COEF(t)[j*mod],&u);
                                           pthrootgfs(u,&v);
                                           COEF(s)[j] = v?FTOIF(CONT(v)):0;
                                   }
                                 cpyum(s,b); d *= mod;                                  cpyum(s,b); d *= mod;
                         }                          }
                 }                  }
Line 506  void canzassf(UM f,int d,UM *r)
Line 512  void canzassf(UM f,int d,UM *r)
   
 /* Hensel related functions */  /* Hensel related functions */
   
 int sfberle(VL,P,int,GFS *,DCP *);  int sfberle(V,V,P,int,GFS *,DCP *);
 void sfgcdgen(P,ML,ML *);  void sfgcdgen(P,ML,ML *);
 void sfhenmain2(BM,UM,UM,int,BM *);  void sfhenmain2(BM,UM,UM,int,BM *);
 void ptosfbm(int,P,BM);  void ptosfbm(int,P,BM);
   void sfhensel(int count,P f,V x,V y,int degbound,GFS *evp,P *sfp,ML *listp);
   
 /* f = f(x,y) */  /* f = f(x,y) */
   
 void sfhensel(int count,P f,V x,int degbound,GFS *evp,P *sfp,ML *listp)  void sfhensel(int count,P f,V x,V y,int degbound,GFS *evp,P *sfp,ML *listp)
 {  {
         int i;          int i;
         int fn;          int fn;
         ML rlist;          ML rlist;
         BM fl;          BM fl;
         VL vl,nvl;          VL vl,nvl;
         V y;  
         int dx,dy,bound;          int dx,dy,bound;
         GFS ev;          GFS ev;
         P f1,t,c,sf;          P f1,t,c,sf;
Line 534  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
Line 540  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
                 reordvar(vl,x,&nvl); reorderp(nvl,vl,f,&f1);                  reordvar(vl,x,&nvl); reorderp(nvl,vl,f,&f1);
                 vl = nvl; f = f1;                  vl = nvl; f = f1;
         }          }
         y = vl->next->v;          if ( vl->next )
                   y = vl->next->v;
         dx = getdeg(x,f);          dx = getdeg(x,f);
         dy = getdeg(y,f);          dy = getdeg(y,f);
         if ( dx == 1 ) {          if ( dx == 1 ) {
                 *listp = rlist = MLALLOC(1); rlist->n = 1; rlist->c[0] = 0;                  *listp = rlist = MLALLOC(1); rlist->n = 1; rlist->c[0] = 0;
                 return;                  return;
         }          }
         fn = sfberle(vl,f,count,&ev,&dc);          fn = sfberle(x,y,f,count,&ev,&dc);
         if ( fn <= 1 ) {          if ( fn <= 1 ) {
                 /* fn == 0 => short of evaluation points */                  /* fn == 0 => short of evaluation points */
                 *listp = rlist = MLALLOC(1); rlist->n = fn; rlist->c[0] = 0;                  *listp = rlist = MLALLOC(1); rlist->n = fn; rlist->c[0] = 0;
Line 604  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
Line 611  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
   
         q = W_UMALLOC(dx);          q = W_UMALLOC(dx);
         rlist = MLALLOC(fn); rlist->n = fn; rlist->bound = bound;          rlist = MLALLOC(fn); rlist->n = fn; rlist->bound = bound;
         fprintf(asir_out,"%d candidates\n",fn);          if ( debug_sfbfctr )
                   fprintf(asir_out,"%d candidates\n",fn);
         init_eg(&eg_hensel);          init_eg(&eg_hensel);
         for ( i = 0; i < fn-1; i++ ) {          for ( i = 0; i < fn-1; i++ ) {
                 fprintf(asir_out,"deg(fm) = %d, deg(gm[%d]) = %d\n",                  if ( debug_sfbfctr )
                           fprintf(asir_out,"deg(fm) = %d, deg(gm[%d]) = %d\n",
                         DEG(fm),i,DEG(gm[i]));                          DEG(fm),i,DEG(gm[i]));
                 init_eg(&eg_hensel_t);                  init_eg(&eg_hensel_t);
                 get_eg(&tmp0);                  get_eg(&tmp0);
Line 619  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
Line 628  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
                 cpyum(hm,fm);                  cpyum(hm,fm);
                 get_eg(&tmp1); add_eg(&eg_hensel_t,&tmp0,&tmp1);                  get_eg(&tmp1); add_eg(&eg_hensel_t,&tmp0,&tmp1);
                 add_eg(&eg_hensel,&tmp0,&tmp1);                  add_eg(&eg_hensel,&tmp0,&tmp1);
                 print_eg("Hensel",&eg_hensel_t);                  if ( debug_sfbfctr) {
                           print_eg("Hensel",&eg_hensel_t);
                           fprintf(asir_out,"\n");
                   }
           }
           if ( debug_sfbfctr) {
                   print_eg("Hensel total",&eg_hensel);
                 fprintf(asir_out,"\n");                  fprintf(asir_out,"\n");
         }          }
         print_eg("Hensel total",&eg_hensel);  
         fprintf(asir_out,"\n");  
         /* finally, fl must be the lift of gm[fn-1] */          /* finally, fl must be the lift of gm[fn-1] */
         rlist->c[i] = fl;          rlist->c[i] = fl;
   
Line 640  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
Line 653  void sfhensel(int count,P f,V x,int degbound,GFS *evp,
   
 /* main variable of f = x */  /* main variable of f = x */
   
 int sfberle(VL vl,P f,int count,GFS *ev,DCP *dcp)  int sfberle(V x,V y,P f,int count,GFS *ev,DCP *dcp)
 {  {
         UM wf,wf1,wf2,wfs,gcd;          UM wf,wf1,wf2,wfs,gcd;
         int fn,n;          int fn,n;
         GFS m,fm;          GFS m,fm;
         DCP dc,dct,dc0;          DCP dc,dct,dc0;
         VL nvl;          VL vl;
         V x,y;  
         P lc,lc0,f0;          P lc,lc0,f0;
         Obj obj;          Obj obj;
         int j,q,index,i;          int j,q,index,i;
   
         clctv(vl,f,&nvl); vl = nvl;          NEWVL(vl); vl->v = x;
         x = vl->v; y = vl->next->v;          NEWVL(NEXT(vl)); NEXT(vl)->v = y;
           NEXT(NEXT(vl)) =0;
         simp_ff((Obj)f,&obj); f = (P)obj;          simp_ff((Obj)f,&obj); f = (P)obj;
         n = QTOS(DEG(DC(f)));          n = QTOS(DEG(DC(f)));
         wf = W_UMALLOC(n); wf1 = W_UMALLOC(n); wf2 = W_UMALLOC(n);          wf = W_UMALLOC(n); wf1 = W_UMALLOC(n); wf2 = W_UMALLOC(n);
Line 756  void sfhenmain2(BM f,UM g0,UM h0,int dy,BM *gp)
Line 769  void sfhenmain2(BM f,UM g0,UM h0,int dy,BM *gp)
         wa = W_UMALLOC(2*dx); wb = W_UMALLOC(2*dx);  /* XXX */          wa = W_UMALLOC(2*dx); wb = W_UMALLOC(2*dx);  /* XXX */
         eucsfum(w1,w2,wa,wb);          eucsfum(w1,w2,wa,wb);
   
         fprintf(stderr,"dy=%d\n",dy);          if ( debug_sfbfctr)
                   fprintf(stderr,"dy=%d\n",dy);
         for ( k = 1; k <= dy; k++ ) {          for ( k = 1; k <= dy; k++ ) {
                 fprintf(stderr,".");                  if ( debug_sfbfctr)
                           fprintf(stderr,".");
   
                 /* at this point, f = gk*hk mod y^k */                  /* at this point, f = gk*hk mod y^k */
   
Line 814  void sfhenmain2(BM f,UM g0,UM h0,int dy,BM *gp)
Line 829  void sfhenmain2(BM f,UM g0,UM h0,int dy,BM *gp)
                 cpyum(wg1,COEF(gk)[k]);                  cpyum(wg1,COEF(gk)[k]);
                 cpyum(wh1,COEF(hk)[k]);                  cpyum(wh1,COEF(hk)[k]);
         }          }
         fprintf(stderr,"\n");          if ( debug_sfbfctr)
                   fprintf(stderr,"\n");
         *gp = gk;          *gp = gk;
         DEG(f) = dy;          DEG(f) = dy;
         for ( i = 0; i <= dy; i++ )          for ( i = 0; i <= dy; i++ )
                 cpyum(COEF(hk)[i],COEF(f)[i]);                  cpyum(COEF(hk)[i],COEF(f)[i]);
 }  }
   
   /* a0*g+b0*h = 1 mod y -> a*g+b*h = 1 mod y^(dy+1) */
   
   void sfexgcd_by_hensel(BM g,BM h,int dy,BM *ap,BM *bp)
   {
           int i,k;
           int dx;
           UM wt,wa,wb,q,w1,w2,ws;
           UM wc,wd,we,wz,wa1,wb1;
           BM wz0,wz1;
           int dg,dh;
           BM a,b,c;
   
           dg = degbm(g);
           dh = degbm(h);
           dx = dg+dh;
   
           a = BMALLOC(dh,dy);
           b = BMALLOC(dg,dy);
           /* c holds a*g+b*h-1 */
           c = BMALLOC(dg+dh,dy);
   
           W_BMALLOC(dx,dy,wz0); W_BMALLOC(dx,dy,wz1);
   
           wt = W_UMALLOC(dx); ws = W_UMALLOC(dx); q = W_UMALLOC(2*dx);
           wa1 = W_UMALLOC(2*dx); wb1 = W_UMALLOC(2*dx);
           wc = W_UMALLOC(2*dx); wd = W_UMALLOC(2*dx);
           we = W_UMALLOC(2*dx); wz = W_UMALLOC(2*dx);
   
           /* compute wa,wb s.t. wa*g0+wb*h0 = 1 mod y */
           w1 = W_UMALLOC(dg); cpyum(COEF(g)[0],w1);
           w2 = W_UMALLOC(dh); cpyum(COEF(h)[0],w2);
           wa = W_UMALLOC(2*dx); wb = W_UMALLOC(2*dx);  /* XXX */
           eucsfum(w1,w2,wa,wb);
           cpyum(wa,COEF(a)[0]); cpyum(wb,COEF(b)[0]);
   
           /* initialize c to a*g+b*h-1 */
           mulsfbm(a,g,c); mulsfbm(b,h,wz0); addtosfbm(wz0,c);
           COEF(COEF(c)[0])[0] = 0;
   
           if ( debug_sfbfctr)
                   fprintf(stderr,"dy=%d\n",dy);
           for ( k = 1; k <= dy; k++ ) {
                   if ( debug_sfbfctr)
                           fprintf(stderr,".");
   
                   /* at this point, a*g+b*h = 1 mod y^k, c = a*g+b*h-1 */
   
                   /* wt = -((a*g+b*h-1)/y^k) */
                   cpyum(COEF(c)[k],wt);
                   for ( i = DEG(wt); i >= 0; i-- )
                           COEF(wt)[i] = _chsgnsf(COEF(wt)[i]);
   
                   /* compute wa1,wb1 s.t. wa1*g0+wb1*h0 = wt */
                   mulsfum(wa,wt,wa1); DEG(wa1) = divsfum(wa1,COEF(h)[0],q);
                   mulsfum(wa1,COEF(g)[0],wc); subsfum(wt,wc,wd);
                   DEG(wd) = divsfum(wd,COEF(h)[0],wb1);
   
                   /* c += ((wa1*g+wb1*h)*y^k mod y^(dy+1) */
                   /* wz0 = wa1*y^k */
                   clearbm(dx,wz0);
                   cpyum(wa1,COEF(wz0)[k]);
   
                   /* wz1 = wz0*g mod y^(dy+1) */
                   clearbm(dx,wz1);
                   mulsfbm(g,wz0,wz1);
                   /* c += wz1 */
                   addtosfbm(wz1,c);
   
                   /* wz0 = wb1*y^k */
                   clearbm(dx,wz0);
                   cpyum(wb1,COEF(wz0)[k]);
   
                   /* wz1 = wz0*h mod y^(dy+1) */
                   clearbm(dx,wz1);
                   mulsfbm(h,wz0,wz1);
                   /* c += wz1 */
                   addtosfbm(wz1,c);
   
                   /* a += wa1*y^k, b += wb1*y^k */
                   cpyum(wa1,COEF(a)[k]);
                   cpyum(wb1,COEF(b)[k]);
           }
           if ( debug_sfbfctr)
                   fprintf(stderr,"\n");
           DEG(a) = dy;
           DEG(b) = dy;
           *ap = a;
           *bp = b;
   }
   
 /* fl->c[i] = coef_y(f,i) */  /* fl->c[i] = coef_y(f,i) */
   
 void ptosfbm(int dy,P f,BM fl)  void ptosfbm(int dy,P f,BM fl)
Line 899  void sfsqfr(P f,DCP *dcp)
Line 1005  void sfsqfr(P f,DCP *dcp)
         } else if ( !NEXT(vl) )          } else if ( !NEXT(vl) )
                 sfusqfr(f,dcp);                  sfusqfr(f,dcp);
         else          else
                 sqfrsf(f,dcp);                  sqfrsf(vl,f,dcp);
 }  }
   
 void sfusqfr(P f,DCP *dcp)  void sfusqfr(P f,DCP *dcp)
Line 990  void sfbfctr(P f,V x,V y,int degbound,DCP *dcp)
Line 1096  void sfbfctr(P f,V x,V y,int degbound,DCP *dcp)
         int dx,dy;          int dx,dy;
   
         /* sf(x) = f(x+ev) = list->c[0]*list->c[1]*... */          /* sf(x) = f(x+ev) = list->c[0]*list->c[1]*... */
         sfhensel(5,f,x,degbound,&ev,&sf,&list);          sfhensel(5,f,x,y,degbound,&ev,&sf,&list);
         if ( list->n == 0 )          if ( list->n == 0 )
                 error("sfbfctr : short of evaluation points");                  error("sfbfctr : short of evaluation points");
         else if ( list->n == 1 ) {          else if ( list->n == 1 ) {
Line 1013  void sfbfctr(P f,V x,V y,int degbound,DCP *dcp)
Line 1119  void sfbfctr(P f,V x,V y,int degbound,DCP *dcp)
         *dcp = dc;          *dcp = dc;
 }  }
   
   /* returns shifted f, shifted factors and the eval pt */
   
   void sfbfctr_shift(P f,V x,V y,int degbound,GFS *evp,P *sfp,DCP *dcp)
   {
           ML list;
           P sf;
           GFS ev;
           DCP dc,dct;
           int dx,dy;
   
           /* sf(x) = f(x+ev) = list->c[0]*list->c[1]*... */
           sfhensel(5,f,x,y,degbound,&ev,&sf,&list);
           if ( list->n == 0 )
                   error("sfbfctr_shift : short of evaluation points");
           else if ( list->n == 1 ) {
                   /* f is irreducible */
                   NEWDC(dc); DEG(dc) = ONE; COEF(dc) = f; NEXT(dc) = 0;
                   *evp = 0;
                   *sfp = f;
                   *dcp = dc;
           } else {
                   sfdtest(sf,list,x,y,dcp);
                   *evp = ev;
                   *sfp = sf;
           }
   }
   
 /* f = f(x,y) = list->c[0]*list->c[1]*... mod y^(list->bound+1) */  /* f = f(x,y) = list->c[0]*list->c[1]*... mod y^(list->bound+1) */
   
 void sfdtest(P f,ML list,V x,V y,DCP *dcp)  void sfdtest(P f,ML list,V x,V y,DCP *dcp)
Line 1085  void sfdtest(P f,ML list,V x,V y,DCP *dcp)
Line 1218  void sfdtest(P f,ML list,V x,V y,DCP *dcp)
                 }                  }
         }          }
   
         fprintf(stderr,"np = %d\n",np);          if ( debug_sfbfctr)
                   fprintf(stderr,"np = %d\n",np);
         dtok = 0;          dtok = 0;
         for ( g = f, k = 1, dcf = dcf0 = 0, win[0] = 1, --np, z = 0; ; z++ ) {          for ( g = f, k = 1, dcf = dcf0 = 0, win[0] = 1, --np, z = 0; ; z++ ) {
                 if ( !(z % 1000) ) fprintf(stderr,".");                  if ( debug_sfbfctr && !(z % 1000) ) fprintf(stderr,".");
                 dt = sfdegtest(dy,bound,d1c,k,win);                  dt = sfdegtest(dy,bound,d1c,k,win);
                 if ( dt )                  if ( dt )
                         dtok++;                          dtok++;
Line 1153  void sfdtest(P f,ML list,V x,V y,DCP *dcp)
Line 1287  void sfdtest(P f,ML list,V x,V y,DCP *dcp)
                                 for ( i = 0, ++k; i < k; i++ )                                  for ( i = 0, ++k; i < k; i++ )
                                         win[i] = i + 1;                                          win[i] = i + 1;
         }          }
         fprintf(stderr,"total %d, omitted by degtest %d\n",z,z-dtok);          if ( debug_sfbfctr )
                   fprintf(stderr,"total %d, omitted by degtest %d\n",z,z-dtok);
         NEXTDC(dcf0,dcf); COEF(dcf) = g;          NEXTDC(dcf0,dcf); COEF(dcf) = g;
         DEG(dcf) = ONE; NEXT(dcf) = 0; *dcp = dcf0;          DEG(dcf) = ONE; NEXT(dcf) = 0; *dcp = dcf0;
 }  }

Legend:
Removed from v.1.25  
changed lines
  Added in v.1.31

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