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

version 1.4, 2002/09/30 06:13:07 version 1.5, 2002/10/23 07:54:58
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.4 2002/09/30 06:13:07 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);
   
 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 469  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;
           DCP dc,dc0,dc1,dc2,dct;
           int imin,inext,i,n;
           int *da;
           V vx,vy;
           V *va;
           P gcd,g,df,dfmin;
           P pa[2];
   
           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;
           if ( !NEXT(NEXT(nvl)) ) {
                   /* 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;
           }
 }  }

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

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