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

version 1.5, 2002/10/23 07:54:58 version 1.6, 2002/10/25 02:43:40
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.4 2002/09/30 06:13:07 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 11  void pthrootsf(P f,Q m,P *r);
Line 11  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);  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 493  void mfctrsf(VL vl, P f, DCP *dcp)
Line 496  void mfctrsf(VL vl, P f, DCP *dcp)
   
 void mfctrsfmain(VL vl, P f, DCP *dcp)  void mfctrsfmain(VL vl, P f, DCP *dcp)
 {  {
         VL tvl,nvl;          VL tvl,nvl,rvl;
         DCP dc,dc0,dc1,dc2,dct;          DCP dc,dc0,dc1,dc2,dct,lcfdc;
         int imin,inext,i,n;          int imin,inext,i,n,k,np;
         int *da;          int *da;
         V vx,vy;          V vx,vy;
         V *va;          V *va;
         P gcd,g,df,dfmin;          P gcd,g,df,dfmin;
         P pa[2];          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;          clctv(vl,f,&tvl); vl = tvl;
         if ( !vl )          if ( !vl )
Line 563  void mfctrsfmain(VL vl, P f, DCP *dcp)
Line 570  void mfctrsfmain(VL vl, P f, DCP *dcp)
         reorderp(nvl,vl,f,&g);          reorderp(nvl,vl,f,&g);
         vx = nvl->v;          vx = nvl->v;
         vy = NEXT(nvl)->v;          vy = NEXT(nvl)->v;
         if ( !NEXT(NEXT(nvl)) ) {          MKV(vx,x);
           MKV(vy,y);
           /* remaining variables */
           rvl = NEXT(NEXT(nvl));
           if ( !rvl ) {
                 /* bivariate */                  /* bivariate */
                 sfbfctr(g,vx,vy,getdeg(vx,g),&dc1);                  sfbfctr(g,vx,vy,getdeg(vx,g),&dc1);
                 for ( dc0 = 0; dc1; dc1 = NEXT(dc1) ) {                  for ( dc0 = 0; dc1; dc1 = NEXT(dc1) ) {
Line 575  void mfctrsfmain(VL vl, P f, DCP *dcp)
Line 586  void mfctrsfmain(VL vl, P f, DCP *dcp)
                 *dcp = dc0;                  *dcp = dc0;
                 return;                  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.5  
changed lines
  Added in v.1.6

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