[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.20 and 1.24

version 1.20, 2001/10/09 01:36:05 version 1.24, 2003/01/15 04:53:03
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.19 2001/09/19 09:10:34 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.23 2003/01/04 09:06:15 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 162  void dp_mbase(NODE hlist,NODE *mbase)
Line 162  void dp_mbase(NODE hlist,NODE *mbase)
         while ( 1 ) {          while ( 1 ) {
                 insert_to_node(d,mbase,nvar);                  insert_to_node(d,mbase,nvar);
                 for ( i = nvar-1; i >= 0; ) {                  for ( i = nvar-1; i >= 0; ) {
                         d->d[i]++; d->td++;                          d->d[i]++;
                           d->td += MUL_WEIGHT(1,i);
                         for ( j = 0; j < n; j++ ) {                          for ( j = 0; j < n; j++ ) {
                                 if ( _dl_redble(dl[j],d,nvar) )                                  if ( _dl_redble(dl[j],d,nvar) )
                                         break;                                          break;
Line 171  void dp_mbase(NODE hlist,NODE *mbase)
Line 172  void dp_mbase(NODE hlist,NODE *mbase)
                                 for ( j = nvar-1; j >= i; j-- )                                  for ( j = nvar-1; j >= i; j-- )
                                         d->d[j] = 0;                                          d->d[j] = 0;
                                 for ( j = 0, td = 0; j < i; j++ )                                  for ( j = 0, td = 0; j < i; j++ )
                                         td += d->d[j];                                          td += MUL_WEIGHT(d->d[j],j);
                                 d->td = td;                                  d->td = td;
                                 i--;                                  i--;
                         } else                          } else
Line 370  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 dp_prim(DP p,DP *rp)  void dp_prim(DP p,DP *rp)
 {  {
         P t,g;          P t,g;
Line 382  void dp_prim(DP p,DP *rp)
Line 399  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 */
                                   *rp = p;
                                   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) )
                           *rp = p;
                   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,*rp); (*rp)->sugar = p->sugar;
                   }
                   return;
           } else if ( dp_fcoeffs )
                 *rp = p;                  *rp = p;
         else if ( NoGCD )          else if ( NoGCD )
                 dp_ptozp(p,rp);                  dp_ptozp(p,rp);
Line 500  void dp_sp(DP p1,DP p2,DP *rp)
Line 539  void dp_sp(DP p1,DP p2,DP *rp)
         n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;          n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, td = 0; i < n; i++ ) {          for ( i = 0, td = 0; i < n; i++ ) {
                 w[i] = MAX(d1->d[i],d2->d[i]); td += w[i];                  w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i);
         }          }
   
         NEWDL(d,n); d->td = td - d1->td;          NEWDL(d,n); d->td = td - d1->td;
Line 553  void _dp_sp_dup(DP p1,DP p2,DP *rp)
Line 592  void _dp_sp_dup(DP p1,DP p2,DP *rp)
         n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;          n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, td = 0; i < n; i++ ) {          for ( i = 0, td = 0; i < n; i++ ) {
                 w[i] = MAX(d1->d[i],d2->d[i]); td += w[i];                  w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i);
         }          }
   
         _NEWDL(d,n); d->td = td - d1->td;          _NEWDL(d,n); d->td = td - d1->td;
Line 604  void dp_sp_mod(DP p1,DP p2,int mod,DP *rp)
Line 643  void dp_sp_mod(DP p1,DP p2,int mod,DP *rp)
         n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;          n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, td = 0; i < n; i++ ) {          for ( i = 0, td = 0; i < n; i++ ) {
                 w[i] = MAX(d1->d[i],d2->d[i]); td += w[i];                  w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i);
         }          }
         NEWDL_NOINIT(d,n); d->td = td - d1->td;          NEWDL_NOINIT(d,n); d->td = td - d1->td;
         for ( i = 0; i < n; i++ )          for ( i = 0; i < n; i++ )
Line 630  void _dp_sp_mod_dup(DP p1,DP p2,int mod,DP *rp)
Line 669  void _dp_sp_mod_dup(DP p1,DP p2,int mod,DP *rp)
         n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;          n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, td = 0; i < n; i++ ) {          for ( i = 0, td = 0; i < n; i++ ) {
                 w[i] = MAX(d1->d[i],d2->d[i]); td += w[i];                  w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i);
         }          }
         _NEWDL(d,n); d->td = td - d1->td;          _NEWDL(d,n); d->td = td - d1->td;
         for ( i = 0; i < n; i++ )          for ( i = 0; i < n; i++ )
Line 656  void _dp_sp_mod(DP p1,DP p2,int mod,DP *rp)
Line 695  void _dp_sp_mod(DP p1,DP p2,int mod,DP *rp)
         n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;          n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, td = 0; i < n; i++ ) {          for ( i = 0, td = 0; i < n; i++ ) {
                 w[i] = MAX(d1->d[i],d2->d[i]); td += w[i];                  w[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(w[i],i);
         }          }
         NEWDL(d,n); d->td = td - d1->td;          NEWDL(d,n); d->td = td - d1->td;
         for ( i = 0; i < n; i++ )          for ( i = 0; i < n; i++ )
Line 687  void dp_red(DP p0,DP p1,DP p2,DP *head,DP *rest,P *dnp
Line 726  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 1221  void dp_nf_tab_mod(DP p,LIST *tab,int mod,DP *rp)
Line 1265  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
  *   *
Line 1537  void dp_rest(DP p,DP *rp)
Line 1602  void dp_rest(DP p,DP *rp)
   
 DL lcm_of_DL(int nv,DL dl1,DL dl2,DL dl)  DL lcm_of_DL(int nv,DL dl1,DL dl2,DL dl)
 {  {
         register int n, *d1, *d2, *d, td;          register int i, *d1, *d2, *d, td;
   
         if ( !dl ) NEWDL(dl,nv);          if ( !dl ) NEWDL(dl,nv);
         d = dl->d,  d1 = dl1->d,  d2 = dl2->d;          d = dl->d,  d1 = dl1->d,  d2 = dl2->d;
         for ( td = 0, n = nv; --n >= 0; d1++, d2++, d++ )          for ( td = 0, i = 0; i < nv; d1++, d2++, d++, i++ ) {
                 td += (*d = *d1 > *d2 ? *d1 : *d2 );                  *d = *d1 > *d2 ? *d1 : *d2;
                   td += MUL_WEIGHT(*d,i);
           }
         dl->td = td;          dl->td = td;
         return dl;          return dl;
 }  }

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

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