[BACK]Return to dp-supp.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Diff for /OpenXM_contrib2/asir2000/builtin/dp-supp.c between version 1.24 and 1.26

version 1.24, 2003/01/15 04:53:03 version 1.26, 2003/11/27 07:53:53
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.23 2003/01/04 09:06:15 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.25 2003/01/18 02:38:56 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 387  int have_sf_coef(P p)
Line 387  int have_sf_coef(P p)
         }          }
 }  }
   
   void head_coef(P p,Num *c)
   {
           if ( !p )
                   *c = 0;
           else if ( NUM(p) )
                   *c = (Num)p;
           else
                   head_coef(COEF(DC(p)),c);
   }
   
   void dp_monic_sf(DP p,DP *rp)
   {
           Num c;
   
           if ( !p )
                   *rp = 0;
           else {
                   head_coef(BDY(p)->c,&c);
                   divsdc(CO,p,(P)c,rp);
           }
   }
   
 void dp_prim(DP p,DP *rp)  void dp_prim(DP p,DP *rp)
 {  {
         P t,g;          P t,g;
Line 403  void dp_prim(DP p,DP *rp)
Line 425  void dp_prim(DP p,DP *rp)
                 for ( m = BDY(p); m; m = NEXT(m) )                  for ( m = BDY(p); m; m = NEXT(m) )
                         if ( OID(m->c) == O_N ) {                          if ( OID(m->c) == O_N ) {
                                 /* GCD of coeffs = 1 */                                  /* GCD of coeffs = 1 */
                                 *rp = p;                                  dp_monic_sf(p,rp);
                                 return;                                  return;
                         } else break;                          } else break;
                 /* compute GCD over the finite fieid */                  /* compute GCD over the finite fieid */
Line 413  void dp_prim(DP p,DP *rp)
Line 435  void dp_prim(DP p,DP *rp)
                         w[i] = m->c;                          w[i] = m->c;
                 gcdsf(CO,w,n,&g);                  gcdsf(CO,w,n,&g);
                 if ( NUM(g) )                  if ( NUM(g) )
                         *rp = p;                          dp_monic_sf(p,rp);
                 else {                  else {
                         for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {                          for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                                 NEXTMP(mr0,mr); divsp(CO,m->c,g,&mr->c); mr->dl = m->dl;                                  NEXTMP(mr0,mr); divsp(CO,m->c,g,&mr->c); mr->dl = m->dl;
                         }                          }
                         NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar;                          NEXT(mr) = 0; MKDP(p->nv,mr0,p1); p1->sugar = p->sugar;
                           dp_monic_sf(p1,rp);
                 }                  }
                 return;                  return;
         } else if ( dp_fcoeffs )          } else if ( dp_fcoeffs )
Line 1673  void _print_mp(int nv,MP m)
Line 1696  void _print_mp(int nv,MP m)
         }          }
         fprintf(stderr,"\n");          fprintf(stderr,"\n");
 }  }
   
   static int cmp_mp_nvar;
   
   int comp_mp(MP *a,MP *b)
   {
           return -(*cmpdl)(cmp_mp_nvar,(*a)->dl,(*b)->dl);
   }
   
   void dp_sort(DP p,DP *rp)
   {
           MP t,mp,mp0;
           int i,n;
           DP r;
           MP *w;
   
           if ( !p ) {
                   *rp = 0;
                   return;
           }
           for ( t = BDY(p), n = 0; t; t = NEXT(t), n++ );
           w = (MP *)ALLOCA(n*sizeof(MP));
           for ( t = BDY(p), i = 0; i < n; t = NEXT(t), i++ )
                   w[i] = t;
           cmp_mp_nvar = NV(p);
           qsort(w,n,sizeof(MP),(int (*)(const void *,const void *))comp_mp);
           mp0 = 0;
           for ( i = n-1; i >= 0; i-- ) {
                   NEWMP(mp); mp->dl = w[i]->dl; C(mp) = C(w[i]);
                   NEXT(mp) = mp0; mp0 = mp;
           }
           MKDP(p->nv,mp0,r);
           r->sugar = p->sugar;
           *rp = r;
   }
   

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.26

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