[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.12 and 1.13

version 1.12, 2001/02/21 07:10:17 version 1.13, 2001/09/04 08:48:18
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.11 2000/12/13 05:37:29 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.12 2001/02/21 07:10:17 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 658  DP *rp;
Line 658  DP *rp;
   
 /*  /*
  * m-reduction   * m-reduction
    * do content reduction over Z or Q(x,...)
    * do nothing over finite fields
  *   *
  */   */
   
Line 699  DP *multp;
Line 701  DP *multp;
         *head = h; *rest = r; *dnp = (P)c2;          *head = h; *rest = r; *dnp = (P)c2;
 }  }
   
   /* m-reduction over a field */
   
   void dp_red_f(p1,p2,rest)
   DP p1,p2;
   DP *rest;
   {
           int i,n;
           DL d1,d2,d;
           MP m;
           DP t,s,r,h;
           Obj a,b;
   
           n = p1->nv;
           d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
   
           NEWDL(d,n); d->td = d1->td - d2->td;
           for ( i = 0; i < n; i++ )
                   d->d[i] = d1->d[i]-d2->d[i];
   
           NEWMP(m); m->dl = d;
           divr(CO,(Obj)BDY(p1)->c,(Obj)BDY(p2)->c,&a); chsgnr(a,&b);
           C(m) = (P)b;
           NEXT(m) = 0; MKDP(n,m,s); s->sugar = d->td;
   
           muld(CO,s,p2,&t); addd(CO,p1,t,rest);
   }
   
 void dp_red_mod(p0,p1,p2,mod,head,rest,dnp)  void dp_red_mod(p0,p1,p2,mod,head,rest,dnp)
 DP p0,p1,p2;  DP p0,p1,p2;
 int mod;  int mod;
Line 824  P *dnp;
Line 853  P *dnp;
         *rp = d; *dnp = dn;          *rp = d; *dnp = dn;
 }  }
   
 void dp_nf_ptozp(b,g,ps,full,multiple,rp)  /* nf computation over Z */
   
   void dp_nf_z(b,g,ps,full,multiple,rp)
 NODE b;  NODE b;
 DP g;  DP g;
 DP *ps;  DP *ps;
Line 839  DP *rp;
Line 870  DP *rp;
         int *wb;          int *wb;
         int hmag;          int hmag;
         int sugar,psugar;          int sugar,psugar;
         int fcoef;  
   
         if ( !g ) {          if ( !g ) {
                 *rp = 0; return;                  *rp = 0; return;
Line 849  DP *rp;
Line 879  DP *rp;
         for ( i = 0, l = b; i < n; l = NEXT(l), i++ )          for ( i = 0, l = b; i < n; l = NEXT(l), i++ )
                 wb[i] = QTOS((Q)BDY(l));                  wb[i] = QTOS((Q)BDY(l));
   
         /* check whether polys have coeffs in finite fields */          hmag = multiple*HMAG(g);
         fcoef = 0;  
         for ( i = 0; i < n; i++ )  
                 if ( has_fcoef(ps[wb[i]]) ) {  
                         fcoef = 1;  
                         break;  
                 }  
         if ( has_fcoef(g) )  
                 fcoef = 1;  
   
         if ( !fcoef )  
                 hmag = multiple*HMAG(g);  
         sugar = g->sugar;          sugar = g->sugar;
   
         for ( d = 0; g; ) {          for ( d = 0; g; ) {
Line 881  DP *rp;
Line 900  DP *rp;
                 if ( u ) {                  if ( u ) {
                         g = u;                          g = u;
                         if ( d ) {                          if ( d ) {
                                 if ( !fcoef && multiple && HMAG(d) > hmag ) {                                  if ( multiple && HMAG(d) > hmag ) {
                                         dp_ptozp2(d,g,&t,&u); d = t; g = u;                                          dp_ptozp2(d,g,&t,&u); d = t; g = u;
                                         hmag = multiple*HMAG(d);                                          hmag = multiple*HMAG(d);
                                 }                                  }
                         } else {                          } else {
                                 if ( !fcoef && multiple && HMAG(g) > hmag ) {                                  if ( multiple && HMAG(g) > hmag ) {
                                         dp_ptozp(g,&t); g = t;                                          dp_ptozp(g,&t); g = t;
                                         hmag = multiple*HMAG(g);                                          hmag = multiple*HMAG(g);
                                 }                                  }
Line 910  DP *rp;
Line 929  DP *rp;
         *rp = d;          *rp = d;
 }  }
   
   /* nf computation over a field */
   
   void dp_nf_f(b,g,ps,full,rp)
   NODE b;
   DP g;
   DP *ps;
   int full;
   DP *rp;
   {
           DP u,p,d,s,t;
           P dmy;
           NODE l;
           MP m,mr;
           int i,n;
           int *wb;
           int sugar,psugar;
   
           if ( !g ) {
                   *rp = 0; return;
           }
           for ( n = 0, l = b; l; l = NEXT(l), n++ );
           wb = (int *)ALLOCA(n*sizeof(int));
           for ( i = 0, l = b; i < n; l = NEXT(l), i++ )
                   wb[i] = QTOS((Q)BDY(l));
   
           sugar = g->sugar;
           for ( d = 0; g; ) {
                   for ( u = 0, i = 0; i < n; i++ ) {
                           if ( dp_redble(g,p = ps[wb[i]]) ) {
                                   dp_red_f(g,p,&u);
                                   psugar = (BDY(g)->dl->td - BDY(p)->dl->td) + p->sugar;
                                   sugar = MAX(sugar,psugar);
                                   if ( !u ) {
                                           if ( d )
                                                   d->sugar = sugar;
                                           *rp = d; return;
                                   }
                                   break;
                           }
                   }
                   if ( u )
                           g = u;
                   else if ( !full ) {
                           if ( g ) {
                                   MKDP(g->nv,BDY(g),t); t->sugar = sugar; g = t;
                           }
                           *rp = g; return;
                   } else {
                           m = BDY(g); NEWMP(mr); mr->dl = m->dl; mr->c = m->c;
                           NEXT(mr) = 0; MKDP(g->nv,mr,t); t->sugar = mr->dl->td;
                           addd(CO,d,t,&s); d = s;
                           dp_rest(g,&t); g = t;
                   }
           }
           if ( d )
                   d->sugar = sugar;
           *rp = d;
   }
   
   /* nf computation over GF(mod) (only for internal use) */
   
 void dp_nf_mod(b,g,ps,mod,full,rp)  void dp_nf_mod(b,g,ps,mod,full,rp)
 NODE b;  NODE b;
 DP g;  DP g;
Line 1080  DP *rp;
Line 1160  DP *rp;
                 d->sugar = sugar;                  d->sugar = sugar;
         _dptodp(d,rp); _free_dp(d);          _dptodp(d,rp); _free_dp(d);
 }  }
   
   /* reduction by linear base over a field */
   
   void dp_lnf_f(p1,p2,g,r1p,r2p)
   DP p1,p2;
   NODE g;
   DP *r1p,*r2p;
   {
           DP r1,r2,b1,b2,t,s;
           Obj c,c1,c2;
           NODE l,b;
           int n;
   
           if ( !p1 ) {
                   *r1p = p1; *r2p = p2; return;
           }
           n = p1->nv;
           for ( l = g, r1 = p1, r2 = p2; l; l = NEXT(l) ) {
                           if ( !r1 ) {
                                   *r1p = r1; *r2p = r2; return;
                           }
                           b = BDY((LIST)BDY(l)); b1 = (DP)BDY(b);
                           if ( dl_equal(n,BDY(r1)->dl,BDY(b1)->dl) ) {
                                   b2 = (DP)BDY(NEXT(b));
                                   divr(CO,(Obj)ONE,(Obj)BDY(b1)->c,&c1);
                                   mulr(CO,c1,(Obj)BDY(r1)->c,&c2); chsgnr(c2,&c);
                                   muldc(CO,b1,(P)c,&t); addd(CO,r1,t,&s); r1 = s;
                                   muldc(CO,b2,(P)c,&t); addd(CO,r2,t,&s); r2 = s;
                           }
           }
           *r1p = r1; *r2p = r2;
   }
   
   /* reduction by linear base over GF(mod) */
   
 void dp_lnf_mod(p1,p2,g,mod,r1p,r2p)  void dp_lnf_mod(p1,p2,g,mod,r1p,r2p)
 DP p1,p2;  DP p1,p2;

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13

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