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

Diff for /OpenXM_contrib2/asir2000/engine/nd.c between version 1.119 and 1.127

version 1.119, 2004/12/06 09:29:34 version 1.127, 2005/08/03 05:01:01
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.118 2004/12/04 09:39:27 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.126 2005/02/09 14:30:47 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 8  NM _nm_free_list;
Line 8  NM _nm_free_list;
 ND _nd_free_list;  ND _nd_free_list;
 ND_pairs _ndp_free_list;  ND_pairs _ndp_free_list;
   
   static int nd_ntrans;
 static int nd_nalg;  static int nd_nalg;
 #if 0  #if 0
 static int ndv_alloc;  static int ndv_alloc;
Line 1536  ND normalize_pbucket(int mod,PGeoBucket g)
Line 1537  ND normalize_pbucket(int mod,PGeoBucket g)
         return r;          return r;
 }  }
   
 void do_diagonalize(int sugar,int m)  int do_diagonalize(int sugar,int m)
 {  {
         int i,nh,stat;          int i,nh,stat;
         NODE r,g,t;          NODE r,g,t;
Line 1552  void do_diagonalize(int sugar,int m)
Line 1553  void do_diagonalize(int sugar,int m)
                         nfv = nd_ps[i];                          nfv = nd_ps[i];
                 s = ndvtond(m,nfv);                  s = ndvtond(m,nfv);
                 s = nd_separate_head(s,&head);                  s = nd_separate_head(s,&head);
                 nd_nf(m,s,nd_ps,1,&dn,&nf);                  stat = nd_nf(m,s,nd_ps,1,&dn,&nf);
                   if ( !stat ) return 0;
                 if ( !m ) {                  if ( !m ) {
                         NTOQ(NM(dn.z),SGN(dn.z),num);                          NTOQ(NM(dn.z),SGN(dn.z),num);
                         mulq(HCQ(head),num,&q); HCQ(head) = q;                          mulq(HCQ(head),num,&q); HCQ(head) = q;
Line 1573  void do_diagonalize(int sugar,int m)
Line 1575  void do_diagonalize(int sugar,int m)
                 } else                  } else
                         nd_ps[i] = nfv;                          nd_ps[i] = nfv;
         }          }
           return 1;
 }  }
   
 /* return value = 0 => input is not a GB */  /* return value = 0 => input is not a GB */
Line 1598  NODE nd_gb(int m,int ishomo,int checkonly)
Line 1601  NODE nd_gb(int m,int ishomo,int checkonly)
 again:  again:
                 l = nd_minp(d,&d);                  l = nd_minp(d,&d);
                 if ( SG(l) != sugar ) {                  if ( SG(l) != sugar ) {
                         if ( ishomo ) do_diagonalize(sugar,m);                          if ( ishomo ) {
                                   stat = do_diagonalize(sugar,m);
                                   if ( !stat ) {
                                           NEXT(l) = d; d = l;
                                           d = nd_reconstruct(0,d);
                                           goto again;
                                   }
                           }
                         sugar = SG(l);                          sugar = SG(l);
                         if ( DP_Print ) fprintf(asir_out,"%d",sugar);                          if ( DP_Print ) fprintf(asir_out,"%d",sugar);
                 }                  }
Line 1645  again:
Line 1654  again:
         return g;          return g;
 }  }
   
 void do_diagonalize_trace(int sugar,int m)  int do_diagonalize_trace(int sugar,int m)
 {  {
         int i,nh,stat;          int i,nh,stat;
         NODE r,g,t;          NODE r,g,t;
Line 1658  void do_diagonalize_trace(int sugar,int m)
Line 1667  void do_diagonalize_trace(int sugar,int m)
                 /* for nd_ps */                  /* for nd_ps */
                 s = ndvtond(m,nd_ps[i]);                  s = ndvtond(m,nd_ps[i]);
                 s = nd_separate_head(s,&head);                  s = nd_separate_head(s,&head);
                 nd_nf_pbucket(m,s,nd_ps,1,&nf);                  stat = nd_nf_pbucket(m,s,nd_ps,1,&nf);
                   if ( !stat ) return 0;
                 nf = nd_add(m,head,nf);                  nf = nd_add(m,head,nf);
                 ndv_free(nd_ps[i]);                  ndv_free(nd_ps[i]);
                 nd_ps[i] = ndtondv(m,nf);                  nd_ps[i] = ndtondv(m,nf);
Line 1671  void do_diagonalize_trace(int sugar,int m)
Line 1681  void do_diagonalize_trace(int sugar,int m)
                         nfv = nd_ps_trace[i];                          nfv = nd_ps_trace[i];
                 s = ndvtond(0,nfv);                  s = ndvtond(0,nfv);
                 s = nd_separate_head(s,&head);                  s = nd_separate_head(s,&head);
                 nd_nf(0,s,nd_ps_trace,1,&dn,&nf);                  stat = nd_nf(0,s,nd_ps_trace,1,&dn,&nf);
                   if ( !stat ) return 0;
                 NTOQ(NM(dn.z),SGN(dn.z),num);                  NTOQ(NM(dn.z),SGN(dn.z),num);
                 mulq(HCQ(head),num,&q); HCQ(head) = q;                  mulq(HCQ(head),num,&q); HCQ(head) = q;
                 if ( DN(dn.z) ) {                  if ( DN(dn.z) ) {
Line 1690  void do_diagonalize_trace(int sugar,int m)
Line 1701  void do_diagonalize_trace(int sugar,int m)
                 } else                  } else
                         nd_ps_trace[i] = nfv;                          nd_ps_trace[i] = nfv;
         }          }
           return 1;
 }  }
   
 static struct oEGT eg_invdalg;  static struct oEGT eg_invdalg;
Line 1720  NODE nd_gb_trace(int m,int ishomo)
Line 1732  NODE nd_gb_trace(int m,int ishomo)
 again:  again:
                 l = nd_minp(d,&d);                  l = nd_minp(d,&d);
                 if ( SG(l) != sugar ) {                  if ( SG(l) != sugar ) {
                         if ( ishomo ) do_diagonalize_trace(sugar,m);                          if ( ishomo ) {
                                   stat = do_diagonalize_trace(sugar,m);
                                   if ( !stat ) {
                                           NEXT(l) = d; d = l;
                                           d = nd_reconstruct(1,d);
                                           goto again;
                                   }
                           }
                         sugar = SG(l);                          sugar = SG(l);
                         if ( DP_Print ) fprintf(asir_out,"%d",sugar);                          if ( DP_Print ) fprintf(asir_out,"%d",sugar);
                 }                  }
Line 2214  void ndv_setup(int mod,int trace,NODE f)
Line 2233  void ndv_setup(int mod,int trace,NODE f)
 struct order_spec *append_block(struct order_spec *spec,  struct order_spec *append_block(struct order_spec *spec,
     int nv,int nalg,int ord);      int nv,int nalg,int ord);
   
   extern VECT current_dl_weight_vector_obj;
   static VECT prev_weight_vector_obj;
   
   void preprocess_algcoef(VL vv,VL av,struct order_spec *ord,LIST f,
           struct order_spec **ord1p,LIST *f1p,NODE *alistp)
   {
           NODE alist,t,s,r0,r,arg;
           VL tv;
           P poly;
           DP d;
           Alg alpha,dp;
           DAlg inv,da,hc;
           MP m;
           int i,nvar,nalg,n;
           NumberField nf;
           LIST f1,f2;
           struct order_spec *current_spec;
           VECT obj,obj0;
           Obj tmp;
   
           for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++);
           for ( nalg = 0, tv = av; tv; tv = NEXT(tv), nalg++);
   
           for ( alist = 0, tv = av; tv; tv = NEXT(tv) ) {
                   NEXTNODE(alist,t); MKV(tv->v,poly);
                   MKAlg(poly,alpha); BDY(t) = (pointer)alpha;
                   tv->v = tv->v->priv;
           }
           NEXT(t) = 0;
   
           /* simplification, makeing polynomials monic */
           setfield_dalg(alist);
           obj_algtodalg(f,&f1);
           for ( t = BDY(f); t; t = NEXT(t) ) {
                   initd(ord); ptod(vv,vv,(P)BDY(t),&d);
                   hc = (DAlg)BDY(d)->c;
                   if ( NID(hc) == N_DA ) {
                           invdalg(hc,&inv);
                           for ( m = BDY(d); m; m = NEXT(m) ) {
                                   muldalg(inv,(DAlg)m->c,&da); m->c = (P)da;
                           }
                   }
                   initd(ord); dtop(vv,vv,d,&poly); BDY(f) = (pointer)poly;
           }
           obj_dalgtoalg(f1,&f);
   
           /* append alg vars to the var list */
           for ( tv = vv; NEXT(tv); tv = NEXT(tv) );
           NEXT(tv) = av;
   
           /* append a block to ord */
           *ord1p = append_block(ord,nvar,nalg,2);
   
           /* create generator list */
           nf = get_numberfield();
           for ( i = nalg-1, t = BDY(f); i >= 0; i-- ) {
                   MKAlg(nf->defpoly[i],dp);
                   MKNODE(s,dp,t); t = s;
           }
           MKLIST(f1,t);
           *alistp = alist;
           algobjtorat(f1,f1p);
   
           /* creating a new weight vector */
           prev_weight_vector_obj = obj0 = current_dl_weight_vector_obj;
           n = nvar+nalg+1;
           MKVECT(obj,n);
           if ( obj0 && obj0->len == nvar )
                   for ( i = 0; i < nvar; i++ ) BDY(obj)[i] = BDY(obj0)[i];
           else
                   for ( i = 0; i < nvar; i++ ) BDY(obj)[i] = (pointer)ONE;
           for ( i = 0; i < nalg; i++ ) BDY(obj)[i+nvar] = 0;
           BDY(obj)[n-1] = (pointer)ONE;
           arg = mknode(1,obj);
           Pdp_set_weight(arg,&tmp);
   }
   
   NODE postprocess_algcoef(VL av,NODE alist,NODE r)
   {
           NODE s,t,u0,u;
           P p;
           VL tv;
           Obj obj,tmp;
           NODE arg;
   
           u0 = 0;
           for ( t = r; t; t = NEXT(t) ) {
                   p = (P)BDY(t);
                   for ( tv = av, s = alist; tv; tv = NEXT(tv), s = NEXT(s) ) {
                           substr(CO,0,(Obj)p,tv->v,(Obj)BDY(s),&obj); p = (P)obj;
                   }
                   if ( OID(p) == O_P || (OID(p) == O_N && NID((Num)p) != N_A) ) {
                           NEXTNODE(u0,u);
                           BDY(u) = (pointer)p;
                   }
           }
           arg = mknode(1,prev_weight_vector_obj);
           Pdp_set_weight(arg,&tmp);
   
           return u0;
   }
   
 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spec *ord,LIST *rp)  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spec *ord,LIST *rp)
 {  {
         VL tv,fv,vv,vc,av;          VL tv,fv,vv,vc,av;
Line 2226  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2347  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
         LIST f1,f2;          LIST f1,f2;
         Obj obj;          Obj obj;
         NumberField nf;          NumberField nf;
           struct order_spec *ord1;
   
         if ( !m && Demand ) nd_demand = 1;          if ( !m && Demand ) nd_demand = 1;
         else nd_demand = 0;          else nd_demand = 0;
Line 2244  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2366  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
                         break;                          break;
         }          }
         nd_nalg = 0;          nd_nalg = 0;
           av = 0;
         if ( !m ) {          if ( !m ) {
                 get_algtree((Obj)f,&av);                  get_algtree((Obj)f,&av);
                 for ( nalg = 0, tv = av; tv; tv = NEXT(tv), nalg++ );                  for ( nalg = 0, tv = av; tv; tv = NEXT(tv), nalg++ );
                   nd_ntrans = nvar;
                 nd_nalg = nalg;                  nd_nalg = nalg;
                 /* #i -> t#i */                  /* #i -> t#i */
                 if ( nalg ) {                  if ( nalg ) {
                         for ( alist = 0, tv = av; tv; tv = NEXT(tv) ) {                          preprocess_algcoef(vv,av,ord,f,&ord1,&f1,&alist);
                                 NEXTNODE(alist,t); MKV(tv->v,p);                          ord = ord1;
                                 MKAlg(p,alpha); BDY(t) = (pointer)alpha;                          f = f1;
                                 tv->v = tv->v->priv;  
                         }  
                         NEXT(t) = 0;  
                         for ( tv = vv; NEXT(tv); tv = NEXT(tv) );  
                         NEXT(tv) = av;  
                         ord = append_block(ord,nvar,nalg,2);  
                         nvar += nalg;  
                         setfield_dalg(alist);  
                         nf = get_numberfield();  
                         for ( i = nalg-1, t = BDY(f); i >= 0; i-- ) {  
                                 MKAlg(nf->defpoly[i],dp);  
                                 MKNODE(s,dp,t); t = s;  
                         }  
                         MKLIST(f1,t);  
                         algobjtorat(f1,&f2); f = f2;  
                 }                  }
                   nvar += nalg;
         }          }
         nd_init_ord(ord);          nd_init_ord(ord);
         for ( t = BDY(f), max = 0; t; t = NEXT(t) )          for ( t = BDY(f), max = 0; t; t = NEXT(t) )
Line 2294  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2404  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
         for ( r0 = 0, t = x; t; t = NEXT(t) ) {          for ( r0 = 0, t = x; t; t = NEXT(t) ) {
                 NEXTNODE(r0,r);                  NEXTNODE(r0,r);
                 BDY(r) = ndvtop(m,CO,vv,BDY(t));                  BDY(r) = ndvtop(m,CO,vv,BDY(t));
                 if ( nalg ) {  
                         p = BDY(r);  
                         for ( tv = av, s = alist; tv; tv = NEXT(tv), s = NEXT(s) ) {  
                                 substr(CO,0,(Obj)p,tv->v,(Obj)BDY(s),&obj); p = (P)obj;  
                         }  
                         BDY(r) = p;  
                 }  
         }          }
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
           if ( nalg )
                   r0 = postprocess_algcoef(av,alist,r0);
         MKLIST(*rp,r0);          MKLIST(*rp,r0);
 #if 0  #if 0
         fprintf(asir_out,"ndv_alloc=%d\n",ndv_alloc);          fprintf(asir_out,"ndv_alloc=%d\n",ndv_alloc);
 #endif  #endif
 }  }
   
 void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp)  void nd_gr_postproc(LIST f,LIST v,int m,struct order_spec *ord,int do_check,LIST *rp)
 {  {
           VL tv,fv,vv,vc,av;
           NODE fd,fd0,r,r0,t,x,s,xx,alist;
           int e,max,nvar,i;
           NDV b;
           int ishomo,nalg;
           Alg alpha,dp;
           P p;
           LIST f1,f2;
           Obj obj;
           NumberField nf;
         struct order_spec *ord1;          struct order_spec *ord1;
   
           get_vars((Obj)f,&fv); pltovl(v,&vv);
           for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ );
           switch ( ord->id ) {
                   case 1:
                           if ( ord->nv != nvar )
                                   error("nd_check : invalid order specification");
                           break;
                   default:
                           break;
           }
           nd_nalg = 0;
           av = 0;
           if ( !m ) {
                   get_algtree((Obj)f,&av);
                   for ( nalg = 0, tv = av; tv; tv = NEXT(tv), nalg++ );
                   nd_ntrans = nvar;
                   nd_nalg = nalg;
                   /* #i -> t#i */
                   if ( nalg ) {
                           preprocess_algcoef(vv,av,ord,f,&ord1,&f1,&alist);
                           ord = ord1;
                           f = f1;
                   }
                   nvar += nalg;
           }
           nd_init_ord(ord);
           for ( t = BDY(f), max = 0; t; t = NEXT(t) )
                   for ( tv = vv; tv; tv = NEXT(tv) ) {
                           e = getdeg(tv->v,(P)BDY(t));
                           max = MAX(e,max);
                   }
           nd_setup_parameters(nvar,max);
           ishomo = 1;
           for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                   b = (pointer)ptondv(CO,vv,(P)BDY(t));
                   if ( ishomo )
                           ishomo = ishomo && ndv_ishomo(b);
                   if ( m ) ndv_mod(m,b);
                   if ( b ) { NEXTNODE(fd0,fd); BDY(fd) = (pointer)b; }
           }
           if ( fd0 ) NEXT(fd) = 0;
           ndv_setup(m,0,fd0);
           for ( x = 0, i = 0; i < nd_psn; i++ )
                   x = update_base(x,i);
           if ( do_check ) {
                   x = nd_gb(m,ishomo,1);
                   if ( !x ) {
                           *rp = 0;
                           return;
                   }
           } else {
                   for ( t = x; t; t = NEXT(t) )
                           BDY(t) = (pointer)nd_ps[(int)BDY(t)];
           }
           x = ndv_reducebase(x);
           x = ndv_reduceall(m,x);
           for ( r0 = 0, t = x; t; t = NEXT(t) ) {
                   NEXTNODE(r0,r);
                   BDY(r) = ndvtop(m,CO,vv,BDY(t));
           }
           if ( r0 ) NEXT(r) = 0;
           if ( nalg )
                   r0 = postprocess_algcoef(av,alist,r0);
           MKLIST(*rp,r0);
   }
   
   void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp)
   {
         VL tv,fv,vv,vc,av;          VL tv,fv,vv,vc,av;
         NODE fd,fd0,in0,in,r,r0,t,s,cand,alist;          NODE fd,fd0,in0,in,r,r0,t,s,cand,alist;
         int m,nocheck,nvar,mindex,e,max;          int m,nocheck,nvar,mindex,e,max;
Line 2325  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
Line 2509  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
         LIST f1,f2;          LIST f1,f2;
         Obj obj;          Obj obj;
         NumberField nf;          NumberField nf;
           struct order_spec *ord1;
   
         get_vars((Obj)f,&fv); pltovl(v,&vv);          get_vars((Obj)f,&fv); pltovl(v,&vv);
         for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ );          for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ );
Line 2339  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
Line 2524  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
   
         get_algtree((Obj)f,&av);          get_algtree((Obj)f,&av);
         for ( nalg = 0, tv = av; tv; tv = NEXT(tv), nalg++ );          for ( nalg = 0, tv = av; tv; tv = NEXT(tv), nalg++ );
           nd_ntrans = nvar;
         nd_nalg = nalg;          nd_nalg = nalg;
         /* #i -> t#i */          /* #i -> t#i */
         if ( nalg ) {          if ( nalg ) {
                 for ( alist = 0, tv = av; tv; tv = NEXT(tv) ) {                  preprocess_algcoef(vv,av,ord,f,&ord1,&f1,&alist);
                         NEXTNODE(alist,t); MKV(tv->v,poly);                  ord = ord1;
                         MKAlg(poly,alpha); BDY(t) = (pointer)alpha;                  f = f1;
                         tv->v = tv->v->priv;  
                 }  
                 NEXT(t) = 0;  
                 for ( tv = vv; NEXT(tv); tv = NEXT(tv) );  
                 NEXT(tv) = av;  
                 ord = append_block(ord,nvar,nalg,2);  
                 nvar += nalg;  
                 setfield_dalg(alist);  
                 nf = get_numberfield();  
                 for ( i = nalg-1, t = BDY(f); i >= 0; i-- ) {  
                         MKAlg(nf->defpoly[i],dp);  
                         MKNODE(s,dp,t); t = s;  
                 }  
                 MKLIST(f1,t);  
                 algobjtorat(f1,&f2); f = f2;  
         }          }
           nvar += nalg;
   
         nocheck = 0;          nocheck = 0;
         mindex = 0;          mindex = 0;
Line 2395  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
Line 2567  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
         if ( in0 ) NEXT(in) = 0;          if ( in0 ) NEXT(in) = 0;
         if ( fd0 ) NEXT(fd) = 0;          if ( fd0 ) NEXT(fd) = 0;
         if ( !ishomo && homo ) {          if ( !ishomo && homo ) {
                 for ( t = in0, wmax = 0; t; t = NEXT(t) ) {                  for ( t = in0, wmax = max; t; t = NEXT(t) ) {
                         c = (NDV)BDY(t); len = LEN(c);                          c = (NDV)BDY(t); len = LEN(c);
                         for ( a = BDY(c), i = 0; i < len; i++, NMV_ADV(a) )                          for ( a = BDY(c), i = 0; i < len; i++, NMV_ADV(a) )
                                 wmax = MAX(TD(DL(a)),wmax);                                  wmax = MAX(TD(DL(a)),wmax);
Line 2451  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
Line 2623  void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru
         /* dp->p */          /* dp->p */
         nd_bpe = cbpe;          nd_bpe = cbpe;
         nd_setup_parameters(nd_nvar,0);          nd_setup_parameters(nd_nvar,0);
         for ( r = cand; r; r = NEXT(r) ) {          for ( r = cand; r; r = NEXT(r) )
                 BDY(r) = (pointer)ndvtop(0,CO,vv,BDY(r));                  BDY(r) = (pointer)ndvtop(0,CO,vv,BDY(r));
                 if ( nalg ) {          if ( nalg )
                         poly = BDY(r);                  cand = postprocess_algcoef(av,alist,cand);
                         for ( tv = av, s = alist; tv; tv = NEXT(tv), s = NEXT(s) ) {  
                                 substr(CO,0,(Obj)poly,tv->v,(Obj)BDY(s),&obj); poly = (P)obj;  
                         }  
                         BDY(r) = poly;  
                 }  
         }  
         MKLIST(*rp,cand);          MKLIST(*rp,cand);
 }  }
   
Line 3329  ND nd_quo(int mod,PGeoBucket bucket,NDV d)
Line 3495  ND nd_quo(int mod,PGeoBucket bucket,NDV d)
         ND p,t,r;          ND p,t,r;
         N tnm;          N tnm;
   
         if ( !p ) return 0;          if ( bucket->m < 0 ) return 0;
         else {          else {
                 nv = NV(d);                  nv = NV(d);
                 mq0 = 0;                  mq0 = 0;
Line 3450  ND nd_dup(ND p)
Line 3616  ND nd_dup(ND p)
 void ndv_mod(int mod,NDV p)  void ndv_mod(int mod,NDV p)
 {  {
         NMV t,d;          NMV t,d;
         int r;          int r,s,u;
         int i,len,dlen;          int i,len,dlen;
         Obj gfs;          Obj gfs;
   
Line 3472  void ndv_mod(int mod,NDV p)
Line 3638  void ndv_mod(int mod,NDV p)
                         if ( r ) {                          if ( r ) {
                                 if ( SGN(CQ(t)) < 0 )                                  if ( SGN(CQ(t)) < 0 )
                                         r = mod-r;                                          r = mod-r;
                                   if ( DN(CQ(t)) ) {
                                           s = rem(DN(CQ(t)),mod);
                                           if ( !s )
                                                   error("ndv_mod : division by 0");
                                           s = invm(s,mod);
                                           DMAR(r,s,0,mod,u); r = u;
                                   }
                                 CM(d) = r;                                  CM(d) = r;
                                 ndl_copy(DL(t),DL(d));                                  ndl_copy(DL(t),DL(d));
                                 NMV_ADV(d);                                  NMV_ADV(d);
Line 5004  void nd_det(int mod,MAT f,P *rp)
Line 5177  void nd_det(int mod,MAT f,P *rp)
         int n,i,j,max,e,nvar,sgn,k0,l0,len0,len,k,l,a;          int n,i,j,max,e,nvar,sgn,k0,l0,len0,len,k,l,a;
         pointer **m;          pointer **m;
         Q mone;          Q mone;
           P **w;
           P mp,r;
         NDV **dm;          NDV **dm;
         NDV *t,*mi,*mj;          NDV *t,*mi,*mj;
         NDV d,s,mij,mjj;          NDV d,s,mij,mjj;
Line 5012  void nd_det(int mod,MAT f,P *rp)
Line 5187  void nd_det(int mod,MAT f,P *rp)
         UINT *bound;          UINT *bound;
         PGeoBucket bucket;          PGeoBucket bucket;
         struct order_spec *ord;          struct order_spec *ord;
           Q dq,dt,ds;
           N gn,qn,dn0,nm,dn;
   
         create_order_spec(0,0,&ord);          create_order_spec(0,0,&ord);
         nd_init_ord(ord);          nd_init_ord(ord);
Line 5019  void nd_det(int mod,MAT f,P *rp)
Line 5196  void nd_det(int mod,MAT f,P *rp)
         if ( f->row != f->col )          if ( f->row != f->col )
                 error("nd_det : non-square matrix");                  error("nd_det : non-square matrix");
         n = f->row;          n = f->row;
         for ( nvar = 0, tv = fv; tv; tv = NEXT(tv), nvar++ );  
         m = f->body;          m = f->body;
           for ( nvar = 0, tv = fv; tv; tv = NEXT(tv), nvar++ );
   
           if ( !nvar ) {
                   if ( !mod )
                           detp(CO,(P **)m,n,rp);
                   else {
                           w = (P **)almat_pointer(n,n);
                           for ( i = 0; i < n; i++ )
                                   for ( j = 0; j < n; j++ )
                                           ptomp(mod,(P)m[i][j],&w[i][j]);
                           detmp(CO,mod,w,n,&mp);
                           mptop(mp,rp);
                   }
                   return;
           }
   
           if ( !mod ) {
                   w = (P **)almat_pointer(n,n);
                   dq = ONE;
                   for ( i = 0; i < n; i++ ) {
                           dn0 = ONEN;
                           for ( j = 0; j < n; j++ ) {
                                   if ( !m[i][j] ) continue;
                                   lgp(m[i][j],&nm,&dn);
                                   gcdn(dn0,dn,&gn); divsn(dn0,gn,&qn); muln(qn,dn,&dn0);
                           }
                           if ( !UNIN(dn0) ) {
                                   NTOQ(dn0,1,ds);
                                   for ( j = 0; j < n; j++ )
                                           mulp(CO,(P)m[i][j],(P)ds,&w[i][j]);
                                   mulq(dq,ds,&dt); dq = dt;
                           } else
                                   for ( j = 0; j < n; j++ )
                                           w[i][j] = (P)m[i][j];
                   }
                   m = (pointer **)w;
           }
   
         for ( i = 0, max = 0; i < n; i++ )          for ( i = 0, max = 0; i < n; i++ )
                 for ( j = 0; j < n; j++ )                  for ( j = 0; j < n; j++ )
                         for ( tv = fv; tv; tv = NEXT(tv) ) {                          for ( tv = fv; tv; tv = NEXT(tv) ) {
Line 5039  void nd_det(int mod,MAT f,P *rp)
Line 5253  void nd_det(int mod,MAT f,P *rp)
         if ( mod ) ndv_mod(mod,d);          if ( mod ) ndv_mod(mod,d);
         chsgnq(ONE,&mone);          chsgnq(ONE,&mone);
         for ( j = 0, sgn = 1; j < n; j++ ) {          for ( j = 0, sgn = 1; j < n; j++ ) {
                 if ( DP_Print ) fprintf(stderr,"j=%d\n",j);                  if ( DP_Print ) fprintf(stderr,".",j);
                 for ( i = j; i < n && !dm[i][j]; i++ );                  for ( i = j; i < n && !dm[i][j]; i++ );
                 if ( i == n ) {                  if ( i == n ) {
                         *rp = 0;                          *rp = 0;
Line 5096  void nd_det(int mod,MAT f,P *rp)
Line 5310  void nd_det(int mod,MAT f,P *rp)
                 }                  }
                 d = mjj;                  d = mjj;
         }          }
           if ( DP_Print ) fprintf(stderr,"\n",k);
         if ( sgn < 0 )          if ( sgn < 0 )
                 if ( mod )                  if ( mod )
                         ndv_mul_c(mod,d,mod-1);                          ndv_mul_c(mod,d,mod-1);
                 else                  else
                         ndv_mul_c_q(d,mone);                          ndv_mul_c_q(d,mone);
         *rp = ndvtop(mod,CO,fv,d);          r = ndvtop(mod,CO,fv,d);
           if ( !mod && !UNIQ(dq) )
                   divsp(CO,r,(P)dq,rp);
           else
                   *rp = r;
 }  }
   
 ND ndv_mul_nmv_trunc(int mod,NMV m0,NDV p,UINT *d)  ND ndv_mul_nmv_trunc(int mod,NMV m0,NDV p,UINT *d)
Line 5209  UINT *nd_det_compute_bound(NDV **dm,int n,int j)
Line 5428  UINT *nd_det_compute_bound(NDV **dm,int n,int j)
   
 DL nd_separate_d(UINT *d,UINT *trans)  DL nd_separate_d(UINT *d,UINT *trans)
 {  {
         int n,ntrans,td,i,e;          int n,td,i,e,j;
         DL a;          DL a;
   
         n = nd_nvar; ntrans = n-nd_nalg;  
         ndl_zero(trans);          ndl_zero(trans);
         td = 0;          td = 0;
         for ( i = 0; i < ntrans; i++ ) {          for ( i = 0; i < nd_ntrans; i++ ) {
                 e = GET_EXP(d,i);                  e = GET_EXP(d,i);
                 PUT_EXP(trans,i,e);                  PUT_EXP(trans,i,e);
                 td += MUL_WEIGHT(e,i);                  td += MUL_WEIGHT(e,i);
         }          }
           if ( nd_ntrans+nd_nalg < nd_nvar ) {
                   /* homogenized */
                   i = nd_nvar-1;
                   e = GET_EXP(d,i);
                   PUT_EXP(trans,i,e);
                   td += MUL_WEIGHT(e,i);
           }
         TD(trans) = td;          TD(trans) = td;
         if ( nd_blockmask) ndl_weight_mask(trans);          if ( nd_blockmask) ndl_weight_mask(trans);
         NEWDL(a,nd_nalg);          NEWDL(a,nd_nalg);
         td = 0;          td = 0;
         for ( ; i < n; i++ ) {          for ( i = 0; i < nd_nalg; i++ ) {
                 e = GET_EXP(d,i);                  j = nd_ntrans+i;
                 a->d[i-ntrans] = e;                  e = GET_EXP(d,j);
                   a->d[i] = e;
                 td += e;                  td += e;
         }          }
         a->td = td;          a->td = td;
Line 5254  int nd_monic(int mod,ND *p)
Line 5480  int nd_monic(int mod,ND *p)
         if ( !(nf = get_numberfield()) )          if ( !(nf = get_numberfield()) )
                 error("nd_monic : current_numberfield is not set");                  error("nd_monic : current_numberfield is not set");
   
         n = nd_nvar; ntrans = n-nd_nalg;  
         /* Q coef -> DAlg coef */          /* Q coef -> DAlg coef */
         NEWNM(ma0); ma = ma0;          NEWNM(ma0); ma = ma0;
         m = BDY(*p);          m = BDY(*p);
Line 5308  int nd_monic(int mod,ND *p)
Line 5533  int nd_monic(int mod,ND *p)
                         dl = mp->dl;                          dl = mp->dl;
                         td = TD(DL(m));                          td = TD(DL(m));
                         ndl_copy(DL(m),DL(mr));                          ndl_copy(DL(m),DL(mr));
                         for ( i = ntrans; i < n; i++ ) {                          for ( i = 0; i < nd_nalg; i++ ) {
                                 e = dl->d[i-ntrans];                                  e = dl->d[i];
                                 PUT_EXP(DL(mr),i,e);                                  PUT_EXP(DL(mr),i+nd_ntrans,e);
                                 td += MUL_WEIGHT(e,i);                                  td += MUL_WEIGHT(e,i+nd_ntrans);
                         }                          }
                         TD(DL(mr)) = td;                          TD(DL(mr)) = td;
                         if ( nd_blockmask) ndl_weight_mask(DL(mr));                          if ( nd_blockmask) ndl_weight_mask(DL(mr));

Legend:
Removed from v.1.119  
changed lines
  Added in v.1.127

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