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

Diff for /OpenXM_contrib2/asir2000/engine/Fgfs.c between version 1.7 and 1.9

version 1.7, 2002/10/30 08:07:11 version 1.9, 2002/11/01 06:47:41
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.6 2002/10/25 02:43:40 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.8 2002/11/01 05:43:35 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
   
Line 17  void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P
Line 17  void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P
 void substvp_sf(VL vl,VL rvl,P f,int *mev,P *r);  void substvp_sf(VL vl,VL rvl,P f,int *mev,P *r);
 void shift_sf(VL vl, VL rvl, P f, int *mev, int sgn, P *r);  void shift_sf(VL vl, VL rvl, P f, int *mev, int sgn, P *r);
 void adjust_coef_sf(VL vl,VL rvl,P lcu,P u0,P *r);  void adjust_coef_sf(VL vl,VL rvl,P lcu,P u0,P *r);
 void extended_gcd_modyk(P u0,P v0,P *cu,P *cv);  void extended_gcd_modyk(P u0,P v0,V x,V y,int dy,P *cu,P *cv);
 void poly_to_gfsn_poly(VL vl,P f,V v,P *r);  void poly_to_gfsn_poly(VL vl,P f,V v,P *r);
 void gfsn_poly_to_poly(VL vl,P f,V v,P *r);  void gfsn_poly_to_poly(VL vl,P f,V v,P *r);
   void poly_to_gfsn_poly_main(P f,V v,P *r);
   void gfsn_poly_to_poly_main(P f,V v,P *r);
   void gfsn_univariate_to_sfbm(P f,int dy,BM *r);
   void sfbm_to_gfsn_univariate(BM f,V x,V y,P *r);
   
 void lex_lc(P f,P *c)  void lex_lc(P f,P *c)
 {  {
Line 839  void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P
Line 843  void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P
         cv = (P *)ALLOCA((n+1)*sizeof(P));          cv = (P *)ALLOCA((n+1)*sizeof(P));
   
         /* ydy = y^dy */          /* ydy = y^dy */
         ydy = C_UMALLOC(dy); COEF(ydy)[dy] = 1;          ydy = C_UMALLOC(dy); DEG(ydy) = dy; COEF(ydy)[dy] = 1;
         setmod_gfsn(ydy);          setmod_gfsn(ydy);
   
         /* (R[y]/(y^dy))[x,X] */          /* (R[y]/(y^dy))[x,X] */
Line 850  void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P
Line 854  void mfctrsf_hensel(VL vl,VL rvl,P f,P pp0,P u0,P v0,P
         substvp_sf(vl,rvl,v,0,&v0);          substvp_sf(vl,rvl,v,0,&v0);
   
         /* compute a(x,y), b(x,y) s.t. a*u0+b*v0 = 1 mod y^dy */          /* compute a(x,y), b(x,y) s.t. a*u0+b*v0 = 1 mod y^dy */
         extended_gcd_modyk(u0,v0,&cu[0],&cv[0]);          extended_gcd_modyk(u0,v0,vx,vy,dy,&cu[0],&cv[0]);
   
         /* du0 = LC(u0)^(-1)*u0 mod y^dy */          /* du0 = LC(u0)^(-1)*u0 mod y^dy */
         /* dv0 = LC(v0)^(-1)*v0 mod y^dy */          /* dv0 = LC(v0)^(-1)*v0 mod y^dy */
Line 946  void adjust_coef_sf(VL vl,VL rvl,P lcu,P u0,P *r)
Line 950  void adjust_coef_sf(VL vl,VL rvl,P lcu,P u0,P *r)
         MKP(VR(u0),dc0,*r);          MKP(VR(u0),dc0,*r);
 }  }
   
 void extended_gcd_modyk(P u0,P v0,P *cu,P *cv)  void extended_gcd_modyk(P u0,P v0,V x,V y,int dy,P *cu,P *cv)
 {  {
           BM g,h,a,b;
   
           gfsn_univariate_to_sfbm(u0,dy,&g);
           gfsn_univariate_to_sfbm(v0,dy,&h);
           sfexgcd_by_hensel(g,h,dy,&a,&b);
           sfbm_to_gfsn_univariate(a,x,y,cu);
           sfbm_to_gfsn_univariate(b,x,y,cv);
 }  }
   
   /* (F[y])[x] -> F[x][y] */
   
   void gfsn_univariate_to_sfbm(P f,int dy,BM *r)
   {
           int dx,d,i;
           BM b;
           UM cy;
           DCP dc;
   
           dx = getdeg(VR(f),f);
           b = BMALLOC(dx,dy);
           DEG(b) = dy;
           for ( dc = DC(f); dc; dc = NEXT(dc) ) {
                   /* d : degree in x, cy : poly in y */
                   d = QTOS(DEG(dc));
                   cy = BDY((GFSN)COEF(dc));
                   for ( i = DEG(cy); i >= 0; i-- )
                           COEF(COEF(b)[i])[d] = COEF(cy)[i];
           }
           for ( i = 0; i <= dy; i++ )
                   degum(COEF(b)[i],dx);
           *r = b;
   }
   
   void sfbm_to_gfsn_univariate(BM f,V x,V y,P *r)
   {
           P g;
           VL vl;
   
           sfbmtop(f,x,y,&g);
           NEWVL(vl); vl->v = x;
           NEWVL(NEXT(vl)); NEXT(vl)->v = y;
           NEXT(NEXT(vl)) = 0;
           poly_to_gfsn_poly(vl,g,y,r);
   }
   
 void poly_to_gfsn_poly(VL vl,P f,V v,P *r)  void poly_to_gfsn_poly(VL vl,P f,V v,P *r)
 {  {
           VL tvl,nvl0,nvl;
           P g;
   
           /* (x,y,...,v,...) -> (x,y,...,v) */
           for ( nvl0 = 0, tvl = vl; tvl; tvl = NEXT(tvl) ) {
                   if ( tvl->v != v ) {
                           NEXTVL(nvl0,nvl);
                           nvl->v = tvl->v;
                   }
           }
           NEXTVL(nvl0,nvl);
           nvl->v = v;
           NEXT(nvl) = 0;
           reorderp(nvl0,vl,f,&g);
           poly_to_gfsn_poly_main(g,v,r);
 }  }
   
   void poly_to_gfsn_poly_main(P f,V v,P *r)
   {
           int d;
           UM u;
           GFSN g;
           DCP dc,dct,dc0;
   
           if ( !f )
                   *r = f;
           else if ( NUM(f) || VR(f) == v ) {
                   d = getdeg(v,f);
                   u = UMALLOC(d);
                   ptosfum(f,u);
                   MKGFSN(u,g);
                   *r = (P)g;
           } else {
                   for ( dc0 = 0, dct = DC(f); dct; dct = NEXT(dct) ) {
                           NEXTDC(dc0,dc);
                           DEG(dc) = DEG(dct);
                           poly_to_gfsn_poly_main(COEF(dct),v,&COEF(dc));
                   }
                   NEXT(dc) = 0;
                   MKP(VR(f),dc0,*r);
           }
   }
   
 void gfsn_poly_to_poly(VL vl,P f,V v,P *r)  void gfsn_poly_to_poly(VL vl,P f,V v,P *r)
 {  {
           VL tvl,nvl0,nvl;
           P g;
   
           gfsn_poly_to_poly_main(f,v,&g);
           /* (x,y,...,v,...) -> (x,y,...,v) */
           for ( nvl0 = 0, tvl = vl; tvl; tvl = NEXT(tvl) ) {
                   if ( tvl->v != v ) {
                           NEXTVL(nvl0,nvl);
                           nvl->v = tvl->v;
                   }
           }
           NEXTVL(nvl0,nvl);
           nvl->v = v;
           NEXT(nvl) = 0;
           reorderp(vl,nvl0,g,r);
 }  }
   
   void gfsn_poly_to_poly_main(P f,V v,P *r)
   {
           DCP dc,dc0,dct;
   
           if ( !f )
                   *r = f;
           else if ( NUM(f) ) {
                   if ( NID((Num)f) == N_GFSN )
                           sfumtop(v,BDY((GFSN)f),r);
                   else
                           *r = f;
           } else {
                   for ( dc0 = 0, dct = DC(f); dct; dct = NEXT(dct) ) {
                           NEXTDC(dc0,dc);
                           DEG(dc) = DEG(dct);
                           gfsn_poly_to_poly_main(COEF(dct),v,&COEF(dc));
                   }
                   NEXT(dc) = 0;
                   MKP(VR(f),dc0,*r);
           }
   }
   
   void printsfum(UM f)
   {
           int i;
   
           for ( i = DEG(f); i >= 0; i-- ) {
                   printf("+(");
                   printf("%d",IFTOF(COEF(f)[i]));
                   printf(")*y^%d",i);
           }
   }
   
   void printsfbm(BM f)
   {
           int i;
   
           for ( i = DEG(f); i >= 0; i-- ) {
                   printf("+(");
                   printsfum(COEF(f)[i]);
                   printf(")*y^%d",i);
           }
   }
   

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.9

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