[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.1 and 1.2

version 1.1, 2002/09/26 04:33:16 version 1.2, 2002/09/26 09:07:42
Line 1 
Line 1 
 /* $OpenXM$ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/Fgfs.c,v 1.1 2002/09/26 04:33:16 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
   
Line 108  void ugcdsf(P *pa,int m,P *r)
Line 108  void ugcdsf(P *pa,int m,P *r)
   
 void gcdsf_main(VL vl,P *pa,int m,P *r)  void gcdsf_main(VL vl,P *pa,int m,P *r)
 {  {
           int nv,i,i0,imin,d,d0,d1,d2;
           V v0,vmin;
           VL tvl,nvl,rvl,nvl0,rvl0;
           P *pc, *ps, *ph;
   
         for ( nv = 0, tvl = vl; tvl; tvl = NEXT(tvl), nv++);          for ( nv = 0, tvl = vl; tvl; tvl = NEXT(tvl), nv++);
         if ( nv == 1 ) {          if ( nv == 1 ) {
                 ugcdsf(pa,m,r);                  ugcdsf(pa,m,r);
Line 139  void gcdsf_main(VL vl,P *pa,int m,P *r)
Line 144  void gcdsf_main(VL vl,P *pa,int m,P *r)
         NEXT(rvl) = 0;          NEXT(rvl) = 0;
         /* nvl = ...,vmin */          /* nvl = ...,vmin */
         NEXTVL(nvl0,nvl); nvl->v = vmin; NEXT(nvl) = 0;          NEXTVL(nvl0,nvl); nvl->v = vmin; NEXT(nvl) = 0;
           MKV(vmin,x);
   
         /* for content and primitive part */          /* for content and primitive part */
         pc = (P *)ALLOCA(m*sizeof(P));          pc = (P *)ALLOCA(m*sizeof(P));
Line 181  void gcdsf_main(VL vl,P *pa,int m,P *r)
Line 187  void gcdsf_main(VL vl,P *pa,int m,P *r)
                         }                          }
                         divgfs(hge,ce,&t); mulp(nvl,t,ge,&u); ge = u;                          divgfs(hge,ce,&t); mulp(nvl,t,ge,&u); ge = u;
                         divsp(nvl,ph[imin],ge,&t); mulp(nvl,hge,t,&cof1e);                          divsp(nvl,ph[imin],ge,&t); mulp(nvl,hge,t,&cof1e);
                           /* hm=0 : reset; he==hm : lucky */
                         if ( !hm || !cmpp(he,hm) ) {                          if ( !hm || !cmpp(he,hm) ) {
                                   substp(nvl,mod,vmin,s,&mode); divsp(nvl,mod,mode,&mod1);
                                   /* adj = mod/(mod|x=s)*(ge-g|x=s) */
                                   substp(nvl,g,vmin,s,&t);
                                   subp(nvl,ge,t,&u); mulp(nvl,mod1,u,&adj);
                                   /* coadj = mod/(mod|vmin=s)*(cof1e-cof1e|vmin=s) */
                                   substp(nvl,cof1,vmin,s,&t);
                                   subp(nvl,cof1,t,&u); mulp(nvl,mod1,u,&coadj);
                                   if ( !adj ) {
                                           /* adj == gcd ? */
                                           for ( i = 0; i < m; i++ )
                                                   if ( !divtp(nvl,lps[i],adj,&t) )
                                                           break;
                                           if ( i == m ) {
                                                   cont_pp_mv_sf(nvl,rvl,adj,&t,&u);
                                                   mulp(nvl,cont,u,&t);
                                                   reorderp(nvl,vl,t,r);
                                                   return;
                                           }
                                   } else if ( !coadj ) {
                                           /* ps[vmin]/coadj == gcd ? */
                                           if ( divtp(nvl,lps[vmin],coadj,&q) ) {
                                                   for ( i = 0; i < m; i++ )
                                                           if ( !divtp(nvl,lps[i],q,&t) )
                                                                   break;
                                                   if ( i == m ) {
                                                           cont_pp_mv_sf(nvl,rvl,q,&t,&u);
                                                           mulp(nvl,cont,u,&t);
                                                           reorderp(nvl,vl,t,r);
                                                           return;
                                                   }
                                           }
                                   }
                                   addp(nvl,g,adj,&t); g = t;
                                   addp(nvl,cof1,coadj,&t); cof1 = t;
                                   subp(nvl,x,s,&t); mulp(nvl,mod,t,&u); mod = u;
                                   hm = he;
                           } else {
                                   d1 = homdeg(hm); d2 = homdeg(he);
                                   if ( d1 < d2 ) /* we use current hm */
                                           continue;
                                   else if ( d1 > d2 ) {
                                           /* use he */
                                           g = ge;
                                           cof1 = cof1e;
                                           hm = he;
                                           subp(nvl,x,s,&mod);
                                   } else {
                                           /* d1==d2, but hm!=he => both are unlucky */
                                           g = 0;
                                           cof1 = 0;
                                           MKGFS(0,mod);
                                   }
                         }                          }
                 }                  }
         }          }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

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