[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.21 and 1.27

version 1.21, 2002/01/28 00:54:41 version 1.27, 2004/02/03 23:31:57
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.20 2001/10/09 01:36:05 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.26 2003/11/27 07:53:53 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 371  void dp_ptozp2_d(DP p0,DP p1,DP *hp,DP *rp)
Line 371  void dp_ptozp2_d(DP p0,DP p1,DP *hp,DP *rp)
         *hp = h; *rp = r;          *hp = h; *rp = r;
 }  }
   
   int have_sf_coef(P p)
   {
           DCP dc;
   
           if ( !p )
                   return 0;
           else if ( NUM(p) )
                   return NID((Num)p) == N_GFS ? 1 : 0;
           else {
                   for ( dc = DC(p); dc; dc = NEXT(dc) )
                           if ( have_sf_coef(COEF(dc)) )
                                   return 1;
                   return 0;
           }
   }
   
   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 383  void dp_prim(DP p,DP *rp)
Line 421  void dp_prim(DP p,DP *rp)
   
         if ( !p )          if ( !p )
                 *rp = 0;                  *rp = 0;
         else if ( dp_fcoeffs )          else if ( dp_fcoeffs == N_GFS ) {
                   for ( m = BDY(p); m; m = NEXT(m) )
                           if ( OID(m->c) == O_N ) {
                                   /* GCD of coeffs = 1 */
                                   dp_monic_sf(p,rp);
                                   return;
                           } else break;
                   /* compute GCD over the finite fieid */
                   for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ );
                   w = (P *)ALLOCA(n*sizeof(P));
                   for ( m = BDY(p), i = 0; i < n; m = NEXT(m), i++ )
                           w[i] = m->c;
                   gcdsf(CO,w,n,&g);
                   if ( NUM(g) )
                           dp_monic_sf(p,rp);
                   else {
                           for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                                   NEXTMP(mr0,mr); divsp(CO,m->c,g,&mr->c); mr->dl = m->dl;
                           }
                           NEXT(mr) = 0; MKDP(p->nv,mr0,p1); p1->sugar = p->sugar;
                           dp_monic_sf(p1,rp);
                   }
                   return;
           } else if ( dp_fcoeffs )
                 *rp = p;                  *rp = p;
         else if ( NoGCD )          else if ( NoGCD )
                 dp_ptozp(p,rp);                  dp_ptozp(p,rp);
Line 688  void dp_red(DP p0,DP p1,DP p2,DP *head,DP *rest,P *dnp
Line 749  void dp_red(DP p0,DP p1,DP p2,DP *head,DP *rest,P *dnp
         Q c,c1,c2;          Q c,c1,c2;
         N gn,tn;          N gn,tn;
         P g,a;          P g,a;
           P p[2];
   
         n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;          n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
         NEWDL(d,n); d->td = d1->td - d2->td;          NEWDL(d,n); d->td = d1->td - d2->td;
         for ( i = 0; i < n; i++ )          for ( i = 0; i < n; i++ )
                 d->d[i] = d1->d[i]-d2->d[i];                  d->d[i] = d1->d[i]-d2->d[i];
         c1 = (Q)BDY(p1)->c; c2 = (Q)BDY(p2)->c;          c1 = (Q)BDY(p1)->c; c2 = (Q)BDY(p2)->c;
         if ( dp_fcoeffs ) {          if ( dp_fcoeffs == N_GFS ) {
                   p[0] = (P)c1; p[1] = (P)c2;
                   gcdsf(CO,p,2,&g);
                   divsp(CO,(P)c1,g,&a); c1 = (Q)a; divsp(CO,(P)c2,g,&a); c2 = (Q)a;
           } else if ( dp_fcoeffs ) {
                 /* do nothing */                  /* do nothing */
         } else if ( INT(c1) && INT(c2) ) {          } else if ( INT(c1) && INT(c2) ) {
                 gcdn(NM(c1),NM(c2),&gn);                  gcdn(NM(c1),NM(c2),&gn);
Line 1222  void dp_nf_tab_mod(DP p,LIST *tab,int mod,DP *rp)
Line 1288  void dp_nf_tab_mod(DP p,LIST *tab,int mod,DP *rp)
         *rp = s;          *rp = s;
 }  }
   
   void dp_nf_tab_f(DP p,LIST *tab,DP *rp)
   {
           DP s,t,u;
           MP m;
           DL h;
           int i,n;
   
           if ( !p ) {
                   *rp = p; return;
           }
           n = p->nv;
           for ( s = 0, i = 0, m = BDY(p); m; m = NEXT(m) ) {
                   h = m->dl;
                   while ( !dl_equal(n,h,BDY((DP)BDY(BDY(tab[i])))->dl ) )
                           i++;
                   muldc(CO,(DP)BDY(NEXT(BDY(tab[i]))),m->c,&t);
                   addd(CO,s,t,&u); s = u;
           }
           *rp = s;
   }
   
 /*  /*
  * setting flags   * setting flags
  *   *
  */   */
   
 int create_order_spec(Obj obj,struct order_spec *spec)  int create_order_spec(VL vl,Obj obj,struct order_spec **specp)
 {  {
         int i,j,n,s,row,col;          int i,j,n,s,row,col;
           struct order_spec *spec;
         struct order_pair *l;          struct order_pair *l;
         NODE node,t,tn;          NODE node,t,tn;
         MAT m;          MAT m;
         pointer **b;          pointer **b;
         int **w;          int **w;
   
           if ( vl && obj && OID(obj) == O_LIST )
                   return create_composite_order_spec(vl,(LIST)obj,specp);
   
           *specp = spec = (struct order_spec *)MALLOC(sizeof(struct order_spec));
         if ( !obj || NUM(obj) ) {          if ( !obj || NUM(obj) ) {
                 spec->id = 0; spec->obj = obj;                  spec->id = 0; spec->obj = obj;
                 spec->ord.simple = QTOS((Q)obj);                  spec->ord.simple = QTOS((Q)obj);
Line 1267  int create_order_spec(Obj obj,struct order_spec *spec)
Line 1359  int create_order_spec(Obj obj,struct order_spec *spec)
                 return 0;                  return 0;
 }  }
   
   /* order = [w_or_b, w_or_b, ... ] */
   /* w_or_b = w or b                */
   /* w = [1,2,...] or [x,1,y,2,...] */
   /* b = [@lex,x,y,...,z] etc       */
   
   int create_composite_order_spec(VL vl,LIST order,struct order_spec **specp)
   {
           NODE wb,t,p;
           struct order_spec *spec;
           VL tvl;
           int n,i,j,k,l,len;
           int *dw;
           struct sparse_weight *sw;
           struct weight_or_block *w_or_b;
           Obj a0;
           NODE a;
           V v;
   
           /* l = number of vars in vl */
           for ( l = 0, tvl = vl; tvl; tvl = NEXT(tvl), l++ );
           /* n = number of primitives in order */
           wb = BDY(order);
           n = length(wb);
           *specp = spec = (struct order_spec *)MALLOC(sizeof(struct order_spec));
           spec->id = 3;
           spec->obj = (Obj)order;
           spec->nv = l;
           spec->ord.composite.length = n;
           spec->ord.composite.w_or_b = (struct weight_or_block *)
                   MALLOC(sizeof(struct weight_or_block)*n);
           for ( t = wb, i = 0; t; t = NEXT(t) ) {
                   a = BDY((LIST)BDY(wb));
                   len = length(a);
                   a0 = (Obj)BDY(a);
                   if ( !a0 || OID(a0) == O_N ) {
                           /* a is dense weight */
                           dw = (int *)MALLOC(sizeof(int)*len);
                           for ( j = 0, p = a; j < len; p = NEXT(p), j++ )
                                   dw[j] = QTOS((Q)BDY(p));
                           w_or_b[i].type = IS_DENSE_WEIGHT;
                           w_or_b[i].length = len;
                           w_or_b[i].body.dense_weight = dw;
                   } else if ( OID(a0) == O_P ) {
                           sw = (struct sparse_weight *)
                                   MALLOC(sizeof(struct sparse_weight)*len);
                           for ( j = 0, p = a; j < len; j++ ) {
                                   v = VR((P)BDY(a)); a = NEXT(a);
                                   for ( tvl = vl, k = 0; tvl && tvl->v != v;
                                           k++, tvl = NEXT(tvl) );
                                   if ( !tvl )
                                           error("invalid variable name");
                                   sw[j].pos = k;
                                   sw[j].value = QTOS((Q)BDY(a));
                           }
                           w_or_b[i].type = IS_SPARSE_WEIGHT;
                           w_or_b[i].length = len;
                           w_or_b[i].body.sparse_weight = sw;
                   } else {
                           error("not implemented yet");
                   }
           }
   }
   
 /*  /*
  * converters   * converters
  *   *
Line 1364  void dp_rat(DP p,DP *rp)
Line 1519  void dp_rat(DP p,DP *rp)
 }  }
   
   
 void homogenize_order(struct order_spec *old,int n,struct order_spec *new)  void homogenize_order(struct order_spec *old,int n,struct order_spec **newp)
 {  {
         struct order_pair *l;          struct order_pair *l;
         int length,nv,row,i,j;          int length,nv,row,i,j;
         int **newm,**oldm;          int **newm,**oldm;
           struct order_spec *new;
   
           *newp = new = (struct order_spec *)MALLOC(sizeof(struct order_spec));
         switch ( old->id ) {          switch ( old->id ) {
                 case 0:                  case 0:
                         switch ( old->ord.simple ) {                          switch ( old->ord.simple ) {
Line 1609  void _print_mp(int nv,MP m)
Line 1766  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.21  
changed lines
  Added in v.1.27

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