[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.4 and 1.6

version 1.4, 2002/09/30 06:13:07 version 1.6, 2002/10/25 02:43:40
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.3 2002/09/27 08:40:48 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.5 2002/10/23 07:54:58 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
   
Line 10  void sqfrsfmain(VL vl,P f,DCP *dcp);
Line 10  void sqfrsfmain(VL vl,P f,DCP *dcp);
 void pthrootsf(P f,Q m,P *r);  void pthrootsf(P f,Q m,P *r);
 void partial_sqfrsf(VL vl,V v,P f,P *r,DCP *dcp);  void partial_sqfrsf(VL vl,V v,P f,P *r,DCP *dcp);
 void gcdsf(VL vl,P *pa,int k,P *r);  void gcdsf(VL vl,P *pa,int k,P *r);
   void mfctrsfmain(VL vl, P f, DCP *dcp);
   int next_evaluation_point(int *mev,int n);
   void estimatelc_sf(VL vl,P c,DCP dc,int *mev,P *lcp);
   void mfctrsf_hensel(VL vl,int *mev,P f,P pp0,P u0,P v0,P lcu,P lcv,P *up);
   
 void lex_lc(P f,P *c)  void lex_lc(P f,P *c)
 {  {
Line 468  void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp)
Line 472  void cont_pp_mv_sf(VL vl,VL rvl,P p,P *c,P *pp)
                 ps[i] = C(t);                  ps[i] = C(t);
         ugcdsf(ps,m,c);          ugcdsf(ps,m,c);
         divsp(vl,p,*c,pp);          divsp(vl,p,*c,pp);
   }
   
   void mfctrsf(VL vl, P f, DCP *dcp)
   {
           DCP dc0,dc,dct,dcs,dcr;
           Obj obj;
   
           simp_ff((Obj)f,&obj); f = (P)obj;
           sqfrsf(vl,f,&dct);
           dc = dc0 = dct; dct = NEXT(dct); NEXT(dc) = 0;
           for ( ; dct; dct = NEXT(dct) ) {
                   mfctrsfmain(vl,COEF(dct),&dcs);
                   for ( dcr = dcs; dcr; dcr = NEXT(dcr) )
                           DEG(dcr) = DEG(dct);
                   for ( ; NEXT(dc); dc = NEXT(dc) );
                   NEXT(dc) = dcs;
           }
           *dcp = dc0;
   }
   
   /* f : sqfr, non const */
   
   void mfctrsfmain(VL vl, P f, DCP *dcp)
   {
           VL tvl,nvl,rvl;
           DCP dc,dc0,dc1,dc2,dct,lcfdc;
           int imin,inext,i,n,k,np;
           int *da;
           V vx,vy;
           V *va;
           P gcd,g,df,dfmin;
           P pa[2];
           P g0,pp0,spp0,c,c0,x,y,u,v,lcf,lcu,lcv,u0,v0,t,s;
           GFS ev,evy;
           P *fp0;
           int *mev,*win;
   
           clctv(vl,f,&tvl); vl = tvl;
           if ( !vl )
                   error("mfctrsfmain : cannot happen");
           if ( !NEXT(vl) ) {
                   /* univariate */
                   ufctrsf(f,&dc);
                   /* remove lc */
                   *dcp = NEXT(dc);
                   return;
           }
           for ( n = 0, tvl = vl; tvl; tvl = NEXT(tvl), n++ );
           va = (V *)ALLOCA(n*sizeof(int));
           da = (int *)ALLOCA(n*sizeof(int));
           /* find v s.t. diff(f,v) is nonzero and deg(f,v) is minimal */
           imin = -1;
           for ( i = 0, tvl = vl; i < n; tvl = NEXT(tvl), i++ ) {
                   va[i] = tvl->v;
                   da[i] = getdeg(va[i],f);
                   diffp(vl,f,va[i],&df);
                   if ( !df )
                           continue;
                   if ( imin < 0 || da[i] < da[imin] ) {
                           dfmin = df;
                           imin = i;
                   }
           }
           /* find v1 neq v s.t. deg(f,v) is minimal */
           inext = -1;
           for ( i = 0; i < n; i++ ) {
                   if ( i == imin )
                           continue;
                   if ( inext < 0 || da[i] < da[inext] )
                           inext = i;
           }
           pa[0] = f;
           pa[1] = dfmin;
           gcdsf_main(vl,pa,2,&gcd);
           if ( !NUM(gcd) ) {
                   /* f = gcd * f/gcd */
                   mfctrsfmain(vl,gcd,&dc1);
                   divsp(vl,f,gcd,&g);
                   mfctrsfmain(vl,g,&dc2);
                   for ( dct = dc1; NEXT(dct); dct = NEXT(dct) );
                   NEXT(dct) = dc2;
                   *dcp = dc1;
                   return;
           }
           /* create vl s.t. vl[0] = va[imin], vl[1] = va[inext] */
           nvl = 0;
           NEXTVL(nvl,tvl); tvl->v = va[imin];
           NEXTVL(nvl,tvl); tvl->v = va[inext];
           for ( i = 0; i < n; i++ ) {
                   if ( i == imin || i == inext )
                           continue;
                   NEXTVL(nvl,tvl); tvl->v = va[i];
           }
           NEXT(tvl) = 0;
   
           reorderp(nvl,vl,f,&g);
           vx = nvl->v;
           vy = NEXT(nvl)->v;
           MKV(vx,x);
           MKV(vy,y);
           /* remaining variables */
           rvl = NEXT(NEXT(nvl));
           if ( !rvl ) {
                   /* bivariate */
                   sfbfctr(g,vx,vy,getdeg(vx,g),&dc1);
                   for ( dc0 = 0; dc1; dc1 = NEXT(dc1) ) {
                           NEXTDC(dc0,dc);
                           DEG(dc) = ONE;
                           reorderp(vl,nvl,COEF(dc1),&COEF(dc));
                   }
                   NEXT(dc) = 0;
                   *dcp = dc0;
                   return;
           }
           /* n >= 3;  nvl = (vx,vy,X) */
           /* find good evaluation pt for X */
           mev = (int *)CALLOC(n-2,sizeof(int));
           while ( 1 ) {
                   for ( g0 = g, tvl = rvl, i = 0; tvl; tvl = NEXT(tvl), i++ ) {
                           indextogfs(mev[i],&ev);
                           substp(nvl,g0,tvl->v,(P)ev,&t); g0 = t;
                   }
                   pa[0] = g0;
                   diffp(nvl,g0,vx,&pa[1]);
                   if ( pa[1] ) {
                           gcdsf(nvl,pa,2,&gcd);
                           /* XXX maybe we have to accept the case where gcd is a poly of y */
                           if ( NUM(gcd) )
                                   break;
                   }
                   if ( next_evaluation_point(mev,n-2) )
                           error("mfctrsfhmain : short of evaluation points");
           }
           /* g0 = g(x,y,mev) */
           /* separate content; g0 may have the content wrt x */
           cont_pp_sfp(nvl,g0,&c0,&pp0);
   
           /* factorize pp0; spp0 = pp0(x,y+evy) = prod dc */
           sfbfctr_shift(pp0,vx,vy,getdeg(vx,pp0),&evy,&spp0,&dc);
   
           if ( !NEXT(dc) ) {
                   /* f is irreducible */
                   NEWDC(dc); DEG(dc) = ONE; COEF(dc) = f; NEXT(dc) = 0;
                   *dcp = dc;
                   return;
           }
           /* shift c0; c0 <- c0(y+evy) */
           addp(nvl,y,(P)evy,&t);
           substp(nvl,c0,vy,t,&s);
           c0 = s;
   
           /* now f(x,y+ev,mev) = c0 * prod dc */
           /* factorize lc_x(f) */
           lcf = COEF(DC(f));
           mfctrsf(nvl,lcf,&lcfdc); lcfdc = NEXT(lcfdc);
   
           /* np = number of bivariate factors */
           for ( np = 0, dct = dc; dct; dct = NEXT(dct), np++ );
           fp0 = (P *)ALLOCA((np+1)*sizeof(P));
           for ( i = 0, dct = dc; i < np; dct = NEXT(dct), i++ )
                   fp0[i] = COEF(dct);
           fp0[np] = 0;
           win = W_ALLOC(np+1);
           for ( k = 1, win[0] = 1, --np; ; ) {
                   itogfs(1,&u0);
                   /* u0 = product of selected factors */
                   for ( i = 0; i < k; i++ ) {
                           mulp(nvl,u0,fp0[win[i]],&t); u0 = t;
                   }
                   /* we have to consider the content */
                   /* g0(y+yev) = c0*u0*v0 */
                   mulp(nvl,LC(u0),c0,&c); estimatelc_sf(nvl,c,dc,mev,&lcu);
                   divsp(nvl,pp0,u0,&v0);
                   mulp(nvl,LC(v0),c0,&c); estimatelc_sf(nvl,c,dc,mev,&lcv);
                   mfctrsf_hensel(nvl,mev,f,pp0,u0,v0,lcu,lcv,&u);
           }
   }
   
   int next_evaluation_point(int *mev,int n)
   {
   }
   
   void estimatelc_sf(VL vl,P c,DCP dc,int *mev,P *lcp)
   {
   }
   
   void mfctrsf_hensel(VL vl,int *mev,P f,P pp0,P u0,P v0,P lcu,P lcv,P *up)
   {
 }  }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.6

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