[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.101 and 1.102

version 1.101, 2004/09/14 10:00:26 version 1.102, 2004/09/15 01:43:33
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.100 2004/09/14 09:25:48 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.101 2004/09/14 10:00:26 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 3196  ND ndv_mul_nm(int mod,NM m0,NDV p)
Line 3196  ND ndv_mul_nm(int mod,NM m0,NDV p)
         }          }
 }  }
   
 ND nd_quo(ND p,ND d)  ND nd_quo(int mod,ND p,NDV d)
 {  {
         NM mq0,mq;          NM mq0,mq;
           NMV tm;
         Q q;          Q q;
         int i,nv,sg;          int i,nv,sg,c,c1,c2;
         ND t,r;          ND t,r;
   
         if ( !p ) return 0;          if ( !p ) return 0;
Line 3208  ND nd_quo(ND p,ND d)
Line 3209  ND nd_quo(ND p,ND d)
                 nv = NV(p);                  nv = NV(p);
                 sg = SG(p);                  sg = SG(p);
                 mq0 = 0;                  mq0 = 0;
                   tm = (NMV)ALLOCA(nmv_adv);
                 while ( p ) {                  while ( p ) {
                         NEXTNM(mq0,mq);                          NEXTNM(mq0,mq);
                         ndl_sub(HDL(p),HDL(d),DL(mq));                          ndl_sub(HDL(p),HDL(d),DL(mq));
                         divq(HCQ(p),HCQ(d),&q);                          ndl_copy(DL(mq),DL(tm));
                         chsgnq(q,&CQ(mq));                          if ( mod ) {
                         t = nd_mul_nm_trunc(mq,d,HDL(d));                                  c1 = invm(HCM(d),mod); c2 = HCM(p);
                         CQ(mq) = q;                                  DMAR(c1,c2,0,mod,c); CM(mq) = c;
                         p = nd_add(0,p,t);                                  CM(tm) = mod-c;
                           } else {
                                   divq(HCQ(p),HCQ(d),&CQ(mq));
                                   chsgnq(CQ(mq),&CQ(tm));
                           }
                           t = ndv_mul_nmv_trunc(mod,tm,d,HDL(d));
                           p = nd_add(mod,p,t);
                 }                  }
                 NEXT(mq) = 0;                  NEXT(mq) = 0;
                 for ( i = 0, mq = mq0; mq; mq = NEXT(mq), i++ );                  for ( i = 0, mq = mq0; mq; mq = NEXT(mq), i++ );
Line 4647  NDV ndv_load(int index)
Line 4655  NDV ndv_load(int index)
         return d;          return d;
 }  }
   
 void nd_det(MAT f,P *rp)  void nd_det(int mod,MAT f,P *rp)
 {  {
         VL fv,tv;          VL fv,tv;
         int n,i,j,max,e,nvar,sgn,k0,l0,len0,len,k,l;          int n,i,j,max,e,nvar,sgn,k0,l0,len0,len,k,l,a;
         pointer **m;          pointer **m;
         Q mone;          Q mone;
         ND **dm;          NDV **dm;
         ND *t,*mi,*mj;          NDV *t,*mi,*mj;
         ND d,s,mij,mjj,m1,m2,u;          NDV d,s,mij,mjj;
         NDV dv;          ND u;
           NMV nmv;
         PGeoBucket bucket;          PGeoBucket bucket;
         NM nm;  
         struct order_spec *ord;          struct order_spec *ord;
   
         create_order_spec(0,0,&ord);          create_order_spec(0,0,&ord);
Line 4676  void nd_det(MAT f,P *rp)
Line 4684  void nd_det(MAT f,P *rp)
                                 max = MAX(e,max);                                  max = MAX(e,max);
                         }                          }
         nd_setup_parameters(nvar,1024);          nd_setup_parameters(nvar,1024);
         dm = (ND **)almat_pointer(n,n);          dm = (NDV **)almat_pointer(n,n);
         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++ ) {
                         dm[i][j] = ptond(CO,fv,m[i][j]);                          dm[i][j] = ptondv(CO,fv,m[i][j]);
         d = ptond(CO,fv,(P)ONE);                          if ( mod ) ndv_mod(mod,dm[i][j]);
                           if ( dm[i][j] && !LEN(dm[i][j]) ) dm[i][j] = 0;
                   }
           d = ptondv(CO,fv,(P)ONE);
           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++ ) {
                 for ( i = j; i < n && !dm[i][j]; i++ );                  for ( i = j; i < n && !dm[i][j]; i++ );
Line 4688  void nd_det(MAT f,P *rp)
Line 4700  void nd_det(MAT f,P *rp)
                         *rp = 0;                          *rp = 0;
                         return;                          return;
                 }                  }
                 k0 = i; l0 = j; len0 = nd_length(dm[k0][l0]);                  k0 = i; l0 = j; len0 = LEN(dm[k0][l0]);
                 for ( k = j; k < n; k++ )                  for ( k = j; k < n; k++ )
                         for ( l = j; l < n; l++ )                          for ( l = j; l < n; l++ )
                                 if ( dm[k][l] && (len = nd_length(dm[k][l])) < len0 ) {                                  if ( dm[k][l] && LEN(dm[k][l]) < len0 ) {
                                         k0 = k; l0 = l; len0 = len;                                          k0 = k; l0 = l; len0 = LEN(dm[k][l]);
                                 }                                  }
                 if ( k0 != j ) {                  if ( k0 != j ) {
                         t = dm[j]; dm[j] = dm[k0]; dm[k0] = t;                          t = dm[j]; dm[j] = dm[k0]; dm[k0] = t;
Line 4706  void nd_det(MAT f,P *rp)
Line 4718  void nd_det(MAT f,P *rp)
                 }                  }
                 for ( i = j+1, mj = dm[j], mjj = mj[j]; i < n; i++ ) {                  for ( i = j+1, mj = dm[j], mjj = mj[j]; i < n; i++ ) {
                         mi = dm[i]; mij = mi[j];                          mi = dm[i]; mij = mi[j];
                         nd_mul_c_q(mij,mone);                          if ( mod )
                                   ndv_mul_c(mod,mij,mod-1);
                           else
                                   ndv_mul_c_q(mij,mone);
                         for ( k = j+1; k < n; k++ ) {                          for ( k = j+1; k < n; k++ ) {
                                 bucket = create_pbucket();                                  bucket = create_pbucket();
                                 if ( mi[k] )                                  if ( mi[k] )
                                         for ( nm = BDY(mjj); nm; nm = NEXT(nm) ) {                                          nmv = BDY(mjj); len = LEN(mjj);
                                                 u = nd_mul_nm_trunc(nm,mi[k],DL(BDY(d)));                                          for ( a = 0; a < len; a++, NMV_ADV(nmv) ) {
                                                 add_pbucket(0,bucket,u);                                                  u = ndv_mul_nmv_trunc(mod,nmv,mi[k],DL(BDY(d)));
                                                   add_pbucket(mod,bucket,u);
                                         }                                          }
                                 if ( mj[k] && mij ) {                                  if ( mj[k] && mij ) {
                                         for ( nm = BDY(mij); nm; nm = NEXT(nm) ) {                                          nmv = BDY(mij); len = LEN(mij);
                                                 u = nd_mul_nm_trunc(nm,mj[k],DL(BDY(d)));                                          for ( a = 0; a < len; a++, NMV_ADV(nmv) ) {
                                                 add_pbucket(0,bucket,u);                                                  u = ndv_mul_nmv_trunc(mod,nmv,mj[k],DL(BDY(d)));
                                                   add_pbucket(mod,bucket,u);
                                         }                                          }
                                 }                                  }
                                 s = normalize_pbucket(0,bucket);                                  u = normalize_pbucket(mod,bucket);
                                 mi[k] = nd_quo(s,d);                                  u = nd_quo(mod,u,d);
                                   mi[k] = ndtondv(mod,u);
                         }                          }
                 }                  }
                 d = mjj;                  d = mjj;
         }          }
         if ( sgn < 0 )          if ( sgn < 0 )
                 nd_mul_c_q(d,mone);                  if ( mod )
         dv = ndtondv(0,d);                          ndv_mul_c(mod,d,mod-1);
         *rp = ndvtop(0,CO,fv,dv);                  else
                           ndv_mul_c_q(d,mone);
           *rp = ndvtop(mod,CO,fv,d);
 }  }
   
 ND nd_mul_nm_trunc(NM m0,ND p,UINT *d)  ND ndv_mul_nmv_trunc(int mod,NMV m0,NDV p,UINT *d)
 {  {
         NM mr,mr0;          NM mr,mr0;
         NM m,tnm;          NM tnm;
           NMV m;
         UINT *d0,*dt,*dm;          UINT *d0,*dt,*dm;
         int c,n,td,i,c1,c2,len;          int c,n,td,i,c1,c2,len;
         Q q;          Q q;
Line 4743  ND nd_mul_nm_trunc(NM m0,ND p,UINT *d)
Line 4764  ND nd_mul_nm_trunc(NM m0,ND p,UINT *d)
   
         if ( !p ) return 0;          if ( !p ) return 0;
         else {          else {
                 n = NV(p); m = BDY(p);                  n = NV(p); m = BDY(p); len = LEN(p);
                 d0 = DL(m0);                  d0 = DL(m0);
                 len = LEN(p);  
                 mr0 = 0;  
                 td = TD(d);                  td = TD(d);
                 q = CQ(m0);                  mr0 = 0;
                 NEWNM(tnm);                  NEWNM(tnm);
                 for ( ; m;m = NEXT(m) ) {                  if ( mod ) {
                         ndl_add(DL(m),d0,DL(tnm));                          c = CM(m0);
                         if ( ndl_reducible(DL(tnm),d) ) {                          for ( i = 0; i < len; i++, NMV_ADV(m) ) {
                                 NEXTNM(mr0,mr);                                  ndl_add(DL(m),d0,DL(tnm));
                                 mulq(CQ(m),q,&CQ(mr));                                  if ( ndl_reducible(DL(tnm),d) ) {
                                 ndl_add(DL(m),d0,DL(mr));                                          NEXTNM(mr0,mr);
                                           c1 = CM(m); DMAR(c1,c,0,mod,c2); CM(mr) = c2;
                                           ndl_add(DL(m),d0,DL(mr));
                                   }
                           }
                   } else {
                           q = CQ(m0);
                           for ( i = 0; i < len; i++, NMV_ADV(m) ) {
                                   ndl_add(DL(m),d0,DL(tnm));
                                   if ( ndl_reducible(DL(tnm),d) ) {
                                           NEXTNM(mr0,mr);
                                           mulq(CQ(m),q,&CQ(mr));
                                           ndl_add(DL(m),d0,DL(mr));
                                   }
                         }                          }
                 }                  }
                 if ( !mr0 )                  if ( !mr0 )

Legend:
Removed from v.1.101  
changed lines
  Added in v.1.102

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