[BACK]Return to dalg.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Diff for /OpenXM_contrib2/asir2000/engine/dalg.c between version 1.8 and 1.10

version 1.8, 2005/01/23 14:03:47 version 1.10, 2005/08/02 07:16:42
Line 1 
Line 1 
 /*  /*
  * $OpenXM: OpenXM_contrib2/asir2000/engine/dalg.c,v 1.7 2004/12/10 02:45:02 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/engine/dalg.c,v 1.9 2005/07/11 00:24:02 noro Exp $
 */  */
   
 #include "ca.h"  #include "ca.h"
Line 65  void setfield_dalg(NODE alist)
Line 65  void setfield_dalg(NODE alist)
                 mb[dim-i-1] = (DP)BDY(t);                  mb[dim-i-1] = (DP)BDY(t);
 }  }
   
   void setfield_gb(NODE gb,VL vl,struct order_spec *spec)
   {
           NumberField nf;
           VL vl1,vl2;
           int n,i,dim;
           Alg *gen;
           P *defpoly;
           P p;
           Q c,iq,two;
           DP *ps,*mb;
           DP one;
           NODE t,b,b1,b2,hlist,mblist;
           struct order_spec *current_spec;
   
           nf = (NumberField)MALLOC(sizeof(struct oNumberField));
           current_numberfield = nf;
           for ( vl1 = vl, n = 0; vl1; vl1 = NEXT(vl1), n++ );
           nf->n = n;
           nf->psn = length(gb);
           nf->vl = vl;
           nf->defpoly = defpoly = (P *)MALLOC(nf->psn*sizeof(P));
           nf->ps = ps = (DP *)MALLOC(nf->psn*sizeof(DP));
           current_spec = dp_current_spec;
           nf->spec = spec;
           initd(nf->spec);
           for ( b = hlist = 0, i = 0, t = gb; i < nf->psn; t = NEXT(t), i++ ) {
                   ptozp((P)BDY(t),1,&c,&defpoly[i]);
                   ptod(CO,vl,defpoly[i],&ps[i]);
                   STOQ(i,iq); MKNODE(b1,(pointer)iq,b); b = b1;
                   MKNODE(b2,(pointer)ps[i],hlist); hlist = b2;
           }
           ptod(ALG,vl,(P)ONE,&one);
           MKDAlg(one,ONE,nf->one);
           nf->ind = b;
           dp_mbase(hlist,&mblist);
           initd(current_spec);
           nf->dim = dim = length(mblist);
           nf->mb = mb = (DP *)MALLOC(dim*sizeof(DP));
           for ( i = 0, t = mblist; t; t = NEXT(t), i++ )
                   mb[dim-i-1] = (DP)BDY(t);
   }
   
 void qtodalg(Q q,DAlg *r)  void qtodalg(Q q,DAlg *r)
 {  {
         NumberField nf;          NumberField nf;
Line 294  void algtodalg(Alg a,DAlg *r)
Line 336  void algtodalg(Alg a,DAlg *r)
                                 NTOQ(NM(c),SGN(c),c1);                                  NTOQ(NM(c),SGN(c),c1);
                                 NTOQ(DN(c),1,d1);                                  NTOQ(DN(c),1,d1);
                                 muldc(CO,nf->one->nm,(P)c1,&dp);                                  muldc(CO,nf->one->nm,(P)c1,&dp);
                                 MKDAlg(dp,c1,*r);                                  MKDAlg(dp,d1,*r);
                         }                          }
                         break;                          break;
                 case N_A:                  case N_A:
Line 358  void simpdalg(DAlg da,DAlg *r)
Line 400  void simpdalg(DAlg da,DAlg *r)
         }          }
         current_spec = dp_current_spec; initd(nf->spec);          current_spec = dp_current_spec; initd(nf->spec);
         dp_true_nf(nf->ind,da->nm,nf->ps,1,&nm,&dn);          dp_true_nf(nf->ind,da->nm,nf->ps,1,&nm,&dn);
         initd(current_spec);          if ( !nm ) *r = 0;
         mulq(da->dn,dn,&dn1);          else {
         MKDAlg(nm,dn1,d);                  initd(current_spec);
         rmcontdalg(d,r);                  mulq(da->dn,dn,&dn1);
                   MKDAlg(nm,dn1,d);
                   rmcontdalg(d,r);
           }
 }  }
   
 void adddalg(DAlg a,DAlg b,DAlg *c)  void adddalg(DAlg a,DAlg b,DAlg *c)
Line 775  int cmpdalg(DAlg a,DAlg b)
Line 820  int cmpdalg(DAlg a,DAlg b)
         else          else
                 return SGN((Q)BDY(c->nm)->c);                  return SGN((Q)BDY(c->nm)->c);
 }  }
   
   /* convert da to a univariate poly; return the position of variable */
   
   int dalgtoup(DAlg da,P *up,Q *dn)
   {
           int nv,i,hi,current_d;
           DCP dc0,dc;
           MP h,mp0,mp,t;
           DL hd,d;
           DP c;
           DAlg cc;
           P v;
   
           nv = da->nm->nv;
           h = BDY(da->nm);
           *dn = da->dn;
           hd = h->dl;
           for ( i = 0; i < nv; i++ )
                   if ( hd->d[i] ) break;
           hi = i;
           current_d = hd->d[i];
           dc0 = 0;
           mp0 = 0;
           for ( t = h; t; t = NEXT(t) ) {
                   NEWDL(d,nv);
                   for ( i = 0; i <= hi; i++ ) d->d[i] = 0;
                   for ( ; i < nv; i++ ) d->d[i] = t->dl->d[i];
                   d->td = t->dl->td - t->dl->d[hi];
                   if ( t->dl->d[hi] != current_d ) {
                           NEXT(mp) = 0; MKDP(nv,mp0,c); MKDAlg(c,ONE,cc);
                           NEXTDC(dc0,dc); STOQ(current_d,DEG(dc)); COEF(dc) = (P)cc;
                           current_d = t->dl->d[hi];
                           mp0 = 0;
                   }
                   NEXTMP(mp0,mp);
                   mp->c = t->c; mp->dl = d;
           }
           NEXT(mp) = 0; MKDP(nv,mp0,c); MKDAlg(c,ONE,cc);
           NEXTDC(dc0,dc); STOQ(current_d,DEG(dc)); COEF(dc) = (P)cc;
           NEXT(dc) = 0;
           makevar("x",&v);
           MKP(VR(v),dc0,*up);
           return hi;
   }
   

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.10

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