[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.21 and 1.27

version 1.21, 2001/11/19 00:57:11 version 1.27, 2002/11/01 05:43:35
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.20 2001/10/30 10:24:35 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/Hgfs.c,v 1.26 2002/10/25 02:43:40 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
   #include "inline.h"
   
 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 15  int comp_dum(DUM a,DUM b)
Line 16  int comp_dum(DUM a,DUM b)
                 return 0;                  return 0;
 }  }
   
 void fctrsf(P p,DCP *dcp)  void ufctrsf(P p,DCP *dcp)
 {  {
         int n,i,j,k;          int n,i,j,k;
         DCP dc,dc0;          DCP dc,dc0;
Line 649  int sfberle(VL vl,P f,int count,GFS *ev,DCP *dcp)
Line 650  int sfberle(VL vl,P f,int count,GFS *ev,DCP *dcp)
         V x,y;          V x,y;
         P lc,lc0,f0;          P lc,lc0,f0;
         Obj obj;          Obj obj;
         int j,q1,index,i;          int j,q,index,i;
   
         clctv(vl,f,&nvl); vl = nvl;          clctv(vl,f,&nvl); vl = nvl;
         x = vl->v; y = vl->next->v;          x = vl->v; y = vl->next->v;
Line 657  int sfberle(VL vl,P f,int count,GFS *ev,DCP *dcp)
Line 658  int sfberle(VL vl,P f,int count,GFS *ev,DCP *dcp)
         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);
         wfs = W_UMALLOC(n); gcd = W_UMALLOC(n);          wfs = W_UMALLOC(n); gcd = W_UMALLOC(n);
         q1 = field_order_sf()-1;          q = field_order_sf();
         lc = DC(f)->c;          lc = DC(f)->c;
         for ( j = 0, fn = n + 1, index = 0;          for ( j = 0, fn = n + 1, index = 0;
                 index < q1 && j < count && fn > 1; index++ ) {                  index < q && j < count && fn > 1; index++ ) {
                 MKGFS(index,m);                  indextogfs(index,&m);
                 substp(vl,lc,y,(P)m,&lc0);                  substp(vl,lc,y,(P)m,&lc0);
                 if ( lc0 ) {                  if ( lc0 ) {
                         substp(vl,f,y,(P)m,&f0);                          substp(vl,f,y,(P)m,&f0);
                         ptosfum(f0,wf); cpyum(wf,wf1);                          ptosfum(f0,wf); cpyum(wf,wf1);
                         diffsfum(wf1,wf2); gcdsfum(wf1,wf2,gcd);                          diffsfum(wf1,wf2); gcdsfum(wf1,wf2,gcd);
                         if ( DEG(gcd) == 0 ) {                          if ( DEG(gcd) == 0 ) {
                                 fctrsf(f0,&dc);                                  ufctrsf(f0,&dc);
                                 for ( dct = NEXT(dc), i = 0; dct; dct = NEXT(dct), i++ );                                  for ( dct = NEXT(dc), i = 0; dct; dct = NEXT(dct), i++ );
                                 if ( i < fn ) {                                  if ( i < fn ) {
                                         dc0 = dc; fn = i; fm = m;                                          dc0 = dc; fn = i; fm = m;
Line 677  int sfberle(VL vl,P f,int count,GFS *ev,DCP *dcp)
Line 678  int sfberle(VL vl,P f,int count,GFS *ev,DCP *dcp)
                         }                          }
                 }                  }
         }          }
         if ( index == q1 )          if ( index == q )
                 return 0;                  return 0;
         else if ( fn == 1 )          else if ( fn == 1 )
                 return 1;                  return 1;
Line 820  void sfhenmain2(BM f,UM g0,UM h0,int dy,BM *gp)
Line 821  void sfhenmain2(BM f,UM g0,UM h0,int dy,BM *gp)
                 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;
   
           fprintf(stderr,"dy=%d\n",dy);
           for ( k = 1; k <= dy; k++ ) {
                   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]);
           }
           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 864  void sfbmtop(BM f,V x,V y,P *fp)
Line 952  void sfbmtop(BM f,V x,V y,P *fp)
                         if ( DEG(c[j]) >= i && (a = COEF(c[j])[i]) ) {                          if ( DEG(c[j]) >= i && (a = COEF(c[j])[i]) ) {
                                 NEWDC(dct);                                  NEWDC(dct);
                                 STOQ(j,DEG(dct));                                  STOQ(j,DEG(dct));
                                 MKGFS(IFTOF(a),b);                                  iftogfs(a,&b);
                                 COEF(dct) = (P)b;                                  COEF(dct) = (P)b;
                                 NEXT(dct) = dc;                                  NEXT(dct) = dc;
                                 dc = dct;                                  dc = dct;
Line 897  void sfsqfr(P f,DCP *dcp)
Line 985  void sfsqfr(P f,DCP *dcp)
                 NEWDC(dc); DEG(dc) = ONE; COEF(dc) = f; NEXT(dc) = 0; *dcp = dc;                  NEWDC(dc); DEG(dc) = ONE; COEF(dc) = f; NEXT(dc) = 0; *dcp = dc;
         } else if ( !NEXT(vl) )          } else if ( !NEXT(vl) )
                 sfusqfr(f,dcp);                  sfusqfr(f,dcp);
 #if 0  
         else if ( !NEXT(NEXT(vl)) )  
                 sfbsqfr(f,vl->v,NEXT(vl)->v,dcp);  
 #endif  
         else          else
                 error("sfsqfr : not implemented yet");                  sqfrsf(f,dcp);
 }  }
   
 void sfusqfr(P f,DCP *dcp)  void sfusqfr(P f,DCP *dcp)
Line 933  void sfusqfr(P f,DCP *dcp)
Line 1017  void sfusqfr(P f,DCP *dcp)
         *dcp = dct;          *dcp = dct;
 }  }
   
   #if 0
 void sfbsqfrmain(P f,V x,V y,DCP *dcp)  void sfbsqfrmain(P f,V x,V y,DCP *dcp)
 {  {
         /* XXX*/          /* XXX*/
Line 976  void sfbsqfr(P f,V x,V y,DCP *dcp)
Line 1061  void sfbsqfr(P f,V x,V y,DCP *dcp)
                 *dcp = dcx;                  *dcp = dcx;
         }          }
 }  }
   #endif
   
 void sfdtest(P,ML,V,V,DCP *);  void sfdtest(P,ML,V,V,DCP *);
   
Line 1014  void sfbfctr(P f,V x,V y,int degbound,DCP *dcp)
Line 1100  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,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 1321  void cont_pp_sfp(VL vl,P f,P *cp,P *fp)
Line 1434  void cont_pp_sfp(VL vl,P f,P *cp,P *fp)
         y = vl->next->v;          y = vl->next->v;
         d = getdeg(y,f);          d = getdeg(y,f);
         if ( d == 0 ) {          if ( d == 0 ) {
                 MKGFS(0,g);                  itogfs(1,&g);
                 *cp = (P)g;                  *cp = (P)g;
                 *fp = f;  /* XXX */                  *fp = f;  /* XXX */
         } else {          } else {
Line 1387  int divtp_by_sfbm(VL vl,P f,P g,P *qp)
Line 1500  int divtp_by_sfbm(VL vl,P f,P g,P *qp)
 /* XXX generate an irreducible poly of degree n */  /* XXX generate an irreducible poly of degree n */
   
 extern int current_gfs_q1;  extern int current_gfs_q1;
   extern int *current_gfs_ntoi;
   
 void generate_defpoly_sfum(int n,UM *dp)  void generate_defpoly_sfum(int n,UM *dp)
 {  {
Line 1414  void generate_defpoly_sfum(int n,UM *dp)
Line 1528  void generate_defpoly_sfum(int n,UM *dp)
                 for ( j = 0; j < i; j++ )                  for ( j = 0; j < i; j++ )
                         w[j] = 0;                          w[j] = 0;
                 w[i]++;                  w[i]++;
                 for ( i = 0; i < n; i++ )                  if ( !current_gfs_ntoi )
                         c[i] = w[i]?FTOIF(w[i]-1):0;                          for ( i = 0; i < n; i++ )
                                   c[i] = w[i]?FTOIF(w[i]):0;
                   else
                           for ( i = 0; i < n; i++ )
                                   c[i] = w[i]?FTOIF(w[i]-1):0;
                 if ( !c[0] )                  if ( !c[0] )
                         continue;                          continue;
                 diffsfum(r,dr); cpyum(r,t); gcdsfum(t,dr,g);                  diffsfum(r,dr); cpyum(r,t); gcdsfum(t,dr,g);

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.27

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