[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.25 and 1.26

version 1.25, 2003/08/07 08:46:50 version 1.26, 2003/08/07 09:47:08
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.24 2003/08/05 08:06:21 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.25 2003/08/07 08:46:50 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "inline.h"  #include "inline.h"
Line 130  void ndv_mul_c_q(NDV p,Q mul);
Line 130  void ndv_mul_c_q(NDV p,Q mul);
 void nd_mul_c_q(ND p,Q mul);  void nd_mul_c_q(ND p,Q mul);
 ND normalize_pbucket(int mod,PGeoBucket g);  ND normalize_pbucket(int mod,PGeoBucket g);
 int head_pbucket(int mod,PGeoBucket g);  int head_pbucket(int mod,PGeoBucket g);
   int head_pbucket_q(PGeoBucket g);
 void add_pbucket(int mod,PGeoBucket g,ND d,int l);  void add_pbucket(int mod,PGeoBucket g,ND d,int l);
 void free_pbucket(PGeoBucket b);  void free_pbucket(PGeoBucket b);
   void mulq_pbucket(PGeoBucket g,Q c);
 PGeoBucket create_pbucket();  PGeoBucket create_pbucket();
 ND nd_remove_head(ND p);  ND nd_remove_head(ND p);
   
Line 1006  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1008  int nd_nf(int mod,ND g,int full,ND *rp)
         int sugar,psugar,n,h_reducible;          int sugar,psugar,n,h_reducible;
         PGeoBucket bucket;          PGeoBucket bucket;
         int c,c1,c2;          int c,c1,c2;
         Q cg,cred,gcd;          Q cg,cred,gcd,zzz;
         RHist h;          RHist h;
   
         if ( !g ) {          if ( !g ) {
Line 1020  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1022  int nd_nf(int mod,ND g,int full,ND *rp)
         d = 0;          d = 0;
         mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));          mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));
         while ( 1 ) {          while ( 1 ) {
                 hindex = head_pbucket(mod,bucket);                  hindex = mod?head_pbucket(mod,bucket):head_pbucket_q(bucket);
                 if ( hindex < 0 ) {                  if ( hindex < 0 ) {
                         if ( d )                          if ( d )
                                 SG(d) = sugar;                                  SG(d) = sugar;
Line 1034  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1036  int nd_nf(int mod,ND g,int full,ND *rp)
                         ndl_sub(HDL(g),DL(h),DL(mul));                          ndl_sub(HDL(g),DL(h),DL(mul));
                         TD(mul) = HTD(g)-TD(h);                          TD(mul) = HTD(g)-TD(h);
                         if ( ndl_check_bound2(index,DL(mul)) ) {                          if ( ndl_check_bound2(index,DL(mul)) ) {
                                 free_pbucket(bucket);  
                                 nd_free(d);                                  nd_free(d);
                                   free_pbucket(bucket);
                                 *rp = 0;                                  *rp = 0;
                                 return 0;                                  return 0;
                         }                          }
Line 1047  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1049  int nd_nf(int mod,ND g,int full,ND *rp)
                                 p = nd_psq[index];                                  p = nd_psq[index];
                                 igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred);                                  igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred);
                                 chsgnq(cg,&CQ(mul));                                  chsgnq(cg,&CQ(mul));
                                 nd_mul_c_q(d,cred); nd_mul_c_q(g,cred);                                  nd_mul_c_q(d,cred);
                                   mulq_pbucket(bucket,cred);
                                   g = bucket->body[hindex];
                         }                          }
                         red = ndv_mul_nm(mod,p,mul);                          red = ndv_mul_nm(mod,p,mul);
                         bucket->body[hindex] = nd_remove_head(g);                          bucket->body[hindex] = nd_remove_head(g);
                         red = nd_remove_head(red);                          red = nd_remove_head(red);
                         add_pbucket(mod,bucket,red,LEN(p));                          add_pbucket(mod,bucket,red,LEN(p)-1);
                         sugar = MAX(sugar,SG(p)+TD(mul));                          sugar = MAX(sugar,SG(p)+TD(mul));
                 } else if ( !full ) {                  } else if ( !full ) {
                         g = normalize_pbucket(mod,bucket);                          g = normalize_pbucket(mod,bucket);
Line 1182  PGeoBucket create_pbucket()
Line 1186  PGeoBucket create_pbucket()
 void free_pbucket(PGeoBucket b) {  void free_pbucket(PGeoBucket b) {
         int i;          int i;
   
         for ( i = 0; i < b->m; i++ )          for ( i = 0; i <= b->m; i++ )
                 if ( b->body[i] ) {                  if ( b->body[i] ) {
                         nd_free(b->body[i]);                          nd_free(b->body[i]);
                         b->body[i] = 0;                          b->body[i] = 0;
Line 1205  void add_pbucket(int mod,PGeoBucket g,ND d,int l)
Line 1209  void add_pbucket(int mod,PGeoBucket g,ND d,int l)
         g->m = MAX(g->m,k);          g->m = MAX(g->m,k);
 }  }
   
   void mulq_pbucket(PGeoBucket g,Q c)
   {
           int k;
   
           for ( k = 0; k <= g->m; k++ )
                   nd_mul_c_q(g->body[k],c);
   }
   
 /* XXX not completed */  /* XXX not completed */
 int head_pbucket(int mod,PGeoBucket g)  int head_pbucket(int mod,PGeoBucket g)
 {  {
Line 1253  int head_pbucket(int mod,PGeoBucket g)
Line 1265  int head_pbucket(int mod,PGeoBucket g)
                         return -1;                          return -1;
                 else if ( sum ) {                  else if ( sum ) {
                         HCM(gj) = sum;                          HCM(gj) = sum;
                           return j;
                   } else
                           g->body[j] = nd_remove_head(gj);
           }
   }
   
   int head_pbucket_q(PGeoBucket g)
   {
           int j,i,c,k,nv;
           Q sum,t;
           unsigned int *di,*dj;
           ND gi,gj;
   
           k = g->m;
           while ( 1 ) {
                   j = -1;
                   for ( i = 0; i <= k; i++ ) {
                           if ( !(gi = g->body[i]) )
                                   continue;
                           if ( j < 0 ) {
                                   j = i;
                                   gj = g->body[j];
                                   dj = HDL(gj);
                                   sum = HCQ(gj);
                           } else {
                                   di = HDL(gi);
                                   nv = NV(gi);
                                   if ( HTD(gi) > HTD(gj) )
                                           c = 1;
                                   else if ( HTD(gi) < HTD(gj) )
                                           c = -1;
                                   else
                                           c = ndl_compare(di,dj);
                                   if ( c > 0 ) {
                                           if ( sum )
                                                   HCQ(gj) = sum;
                                           else
                                                   g->body[j] = nd_remove_head(gj);
                                           j = i;
                                           gj = g->body[j];
                                           dj = HDL(gj);
                                           sum = HCQ(gj);
                                   } else if ( c == 0 ) {
                                           addq(sum,HCQ(gi),&t);
                                           sum = t;
                                           g->body[i] = nd_remove_head(gi);
                                   }
                           }
                   }
                   if ( j < 0 )
                           return -1;
                   else if ( sum ) {
                           HCQ(gj) = sum;
                         return j;                          return j;
                 } else                  } else
                         g->body[j] = nd_remove_head(gj);                          g->body[j] = nd_remove_head(gj);

Legend:
Removed from v.1.25  
changed lines
  Added in v.1.26

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