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

Diff for /OpenXM_contrib2/asir2000/builtin/gr.c between version 1.48 and 1.51

version 1.48, 2003/06/05 09:40:39 version 1.51, 2003/07/09 07:11:07
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/gr.c,v 1.47 2003/05/30 06:03:28 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.50 2003/07/01 08:12:38 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 123  void Pox_pop_local(NODE,Obj *);
Line 123  void Pox_pop_local(NODE,Obj *);
 INLINE int eqdl(int nv,DL dl1,DL dl2)  INLINE int eqdl(int nv,DL dl1,DL dl2)
 {  {
         int i;          int i;
         int *b1,*b2;          int *p1,*p2;
   
         if ( dl1->td != dl2->td )          if ( dl1->td != dl2->td )
                 return 0;                  return 0;
         for ( i = 0, b1 = dl1->d, b2 = dl2->d; i < nv; i++ )          i = nv-1;
                 if ( b1[i] != b2[i] )          p1 = dl1->d;
                         break;          p2 = dl2->d;
         if ( i == nv )          while ( i >= 7 ) {
                 return 1;                  if ( *p1++ != *p2++ ) return 0;
         else                  if ( *p1++ != *p2++ ) return 0;
                 return 0;                  if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   if ( *p1++ != *p2++ ) return 0;
                   i -= 8;
           }
           switch ( i ) {
                   case 6:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 5:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 4:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 3:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 2:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 1:
                           if ( *p1++ != *p2++ ) return 0;
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   case 0:
                           if ( *p1++ != *p2++ ) return 0;
                           return 1;
                   default:
                           return 1;
           }
 }  }
   
 /* b[] should be cleared */  /* b[] should be cleared */
Line 601  NODE gb_f4(NODE f)
Line 654  NODE gb_f4(NODE f)
 /* initial bases are monic */  /* initial bases are monic */
   
 unsigned int **psca;  unsigned int **psca;
   GeoBucket create_bucket();
   DL remove_head_bucket(GeoBucket,int);
   
 NODE gb_f4_mod(NODE f,int m)  NODE gb_f4_mod(NODE f,int m)
 {  {
Line 619  NODE gb_f4_mod(NODE f,int m)
Line 674  NODE gb_f4_mod(NODE f,int m)
         int *indred,*isred;          int *indred,*isred;
         CDP ri;          CDP ri;
         int pscalen;          int pscalen;
         struct oEGT tmp0,tmp1,eg_split_symb,eg_split_elim1,eg_split_elim2;          GeoBucket bucket;
         extern struct oEGT eg_symb,eg_elim1,eg_elim2;          DL head;
           struct oEGT tmp0,tmp1,eg_split_symb,eg_split_conv,eg_split_elim1,eg_split_elim2;
           extern struct oEGT eg_symb,eg_conv,eg_elim1,eg_elim2;
   
         /* initialize coeffcient array list of ps[] */          /* initialize coeffcient array list of ps[] */
         pscalen = pslen;          pscalen = pslen;
         psca = (unsigned int **)MALLOC(pscalen*sizeof(unsigned int *));          psca = (unsigned int **)MALLOC(pscalen*sizeof(unsigned int *));
   
         init_eg(&eg_symb); init_eg(&eg_elim1); init_eg(&eg_elim2);          init_eg(&eg_symb); init_eg(&eg_conv); init_eg(&eg_elim1); init_eg(&eg_elim2);
         for ( gall = g = 0, d = 0, r = f; r; r = NEXT(r) ) {          for ( gall = g = 0, d = 0, r = f; r; r = NEXT(r) ) {
                 i = (int)BDY(r);                  i = (int)BDY(r);
                 d = updpairs(d,g,i);                  d = updpairs(d,g,i);
Line 641  NODE gb_f4_mod(NODE f,int m)
Line 698  NODE gb_f4_mod(NODE f,int m)
                 minsugar(d,&dm,&dr); d = dr;                  minsugar(d,&dm,&dr); d = dr;
                 if ( DP_Print )                  if ( DP_Print )
                         fprintf(asir_out,"sugar=%d\n",dm->sugar);                          fprintf(asir_out,"sugar=%d\n",dm->sugar);
                 blist = 0; s0 = 0;                  blist = 0;
                   bucket = create_bucket();
                 /* asph : sum of all head terms of spoly */                  /* asph : sum of all head terms of spoly */
                 for ( t = dm; t; t = NEXT(t) ) {                  for ( t = dm; t; t = NEXT(t) ) {
                         _dp_sp_mod(ps[t->dp1],ps[t->dp2],m,&sp);                          _dp_sp_mod(ps[t->dp1],ps[t->dp2],m,&sp);
 /*                      fprintf(stderr,"splen=%d-",dp_nt(sp)); */  /*                      fprintf(stderr,"splen=%d-",dp_nt(sp)); */
                         if ( sp ) {                          if ( sp ) {
                                 MKNODE(bt,sp,blist); blist = bt;                                  MKNODE(bt,sp,blist); blist = bt;
                                 s0 = symb_merge(s0,dp_dllist(sp),nv);                                  add_bucket(bucket,dp_dllist(sp),nv);
 /*                              fprintf(stderr,"%d-",length(s0)); */  /*                              fprintf(stderr,"%d-",length(s0)); */
                         }                          }
                 }                  }
   #if 0
                 if ( DP_Print )                  if ( DP_Print )
                         fprintf(asir_out,"initial spmat : %d x %d ",length(blist),length(s0));                          fprintf(asir_out,"initial spmat : %d x %d ",length(blist),length(s0));
   #endif
                 /* s0 : all the terms appeared in symbolic reduction */                  /* s0 : all the terms appeared in symbolic reduction */
                 for ( s = s0, nred = 0; s; s = NEXT(s) ) {                  nred = 0;
                   s0 = 0;
                   while ( 1 ) {
                           head = remove_head_bucket(bucket,nv);
                           if ( !head ) break;
                           else {
                                   NEXTNODE(s0,s);
                                   BDY(s) = (pointer)head;
                           }
                         for ( r = gall; r; r = NEXT(r) )                          for ( r = gall; r; r = NEXT(r) )
                                 if ( _dl_redble(BDY(ps[(int)BDY(r)])->dl,BDY(s),nv) )                                  if ( _dl_redble(BDY(ps[(int)BDY(r)])->dl,head,nv) )
                                         break;                                          break;
                         if ( r ) {                          if ( r ) {
                                 dltod(BDY(s),nv,&tdp);                                  dltod(head,nv,&tdp);
                                 dp_subd(tdp,ps[(int)BDY(r)],&sd);                                  dp_subd(tdp,ps[(int)BDY(r)],&sd);
                                 dt = mul_dllist(BDY(sd)->dl,ps[(int)BDY(r)]);                                  dt = mul_dllist(BDY(sd)->dl,ps[(int)BDY(r)]);
                                   add_bucket(bucket,NEXT(dt),nv);
 /*                              fprintf(stderr,"[%d]",length(dt)); */  /*                              fprintf(stderr,"[%d]",length(dt)); */
                                 /* list of [t,f] */                                  /* list of [t,f] */
                                 bt1 = mknode(2,BDY(sd)->dl,BDY(r));                                  bt1 = mknode(2,BDY(sd)->dl,BDY(r));
                                 MKNODE(bt,bt1,blist); blist = bt;                                  MKNODE(bt,bt1,blist); blist = bt;
                                 symb_merge(s,dt,nv);  
 /*                              fprintf(stderr,"%d-",length(s0));  */  /*                              fprintf(stderr,"%d-",length(s0));  */
                                 nred++;                                  nred++;
                         }                          }
                 }                  }
                   if ( s0 ) NEXT(s) = 0;
 /*              fprintf(stderr,"\n"); */  /*              fprintf(stderr,"\n"); */
                   get_eg(&tmp1); add_eg(&eg_symb,&tmp0,&tmp1);
                   init_eg(&eg_split_symb); add_eg(&eg_split_symb,&tmp0,&tmp1);
   
                 if ( DP_Print )                  if ( DP_Print )
                         fprintf(asir_out,"number of reducers : %d\n",nred);                          fprintf(asir_out,"number of reducers : %d\n",nred);
   
                   get_eg(&tmp0);
                 /* the first nred polys in blist are reducers */                  /* the first nred polys in blist are reducers */
                 /* row = the number of all the polys */                  /* row = the number of all the polys */
                 for ( r = blist, row = 0; r; r = NEXT(r), row++ );                  for ( r = blist, row = 0; r; r = NEXT(r), row++ );
Line 714  NODE gb_f4_mod(NODE f,int m)
Line 787  NODE gb_f4_mod(NODE f,int m)
                 for ( j = 0, k = 0; j < col; j++ )                  for ( j = 0, k = 0; j < col; j++ )
                         if ( !isred[j] )                          if ( !isred[j] )
                                 st[k++] = at[j];                                  st[k++] = at[j];
                 get_eg(&tmp1); add_eg(&eg_symb,&tmp0,&tmp1);                  get_eg(&tmp1); add_eg(&eg_conv,&tmp0,&tmp1);
                 init_eg(&eg_split_symb); add_eg(&eg_split_symb,&tmp0,&tmp1);                  init_eg(&eg_split_conv); add_eg(&eg_split_conv,&tmp0,&tmp1);
   
                 get_eg(&tmp1);                  get_eg(&tmp1);
                 /* spoly matrix; stored in reduced form; terms in ht[] are omitted */                  /* spoly matrix; stored in reduced form; terms in ht[] are omitted */
Line 772  NODE gb_f4_mod(NODE f,int m)
Line 845  NODE gb_f4_mod(NODE f,int m)
                 if ( DP_Print ) {                  if ( DP_Print ) {
                         fprintf(asir_out,"done rank = %d\n",rank,row,col);                          fprintf(asir_out,"done rank = %d\n",rank,row,col);
                         print_eg("Symb",&eg_split_symb);                          print_eg("Symb",&eg_split_symb);
                           print_eg("Conv",&eg_split_conv);
                         print_eg("Elim1",&eg_split_elim1);                          print_eg("Elim1",&eg_split_elim1);
                         print_eg("Elim2",&eg_split_elim2);                          print_eg("Elim2",&eg_split_elim2);
                         fprintf(asir_out,"\n");                          fprintf(asir_out,"\n");
Line 814  NODE gb_f4_mod(NODE f,int m)
Line 888  NODE gb_f4_mod(NODE f,int m)
         }          }
         if ( DP_Print ) {          if ( DP_Print ) {
                 print_eg("Symb",&eg_symb);                  print_eg("Symb",&eg_symb);
                   print_eg("Conv",&eg_conv);
                 print_eg("Elim1",&eg_elim1);                  print_eg("Elim1",&eg_elim1);
                 print_eg("Elim2",&eg_elim2);                  print_eg("Elim2",&eg_elim2);
                 fflush(asir_out);                  fflush(asir_out);
Line 1159  void prim_part(DP f,int m,DP *r)
Line 1234  void prim_part(DP f,int m,DP *r)
                 if ( PCoeffs )                  if ( PCoeffs )
                         dp_prim_mod(f,m,r);                          dp_prim_mod(f,m,r);
                 else                  else
                         *r = f;                          _dp_monic(f,m,r);
         } else {          } else {
                 if ( dp_fcoeffs || PCoeffs )                  if ( dp_fcoeffs || PCoeffs )
                         dp_prim(f,r);                          dp_prim(f,r);
Line 1602  NODE gb(NODE f,int m,NODE subst)
Line 1677  NODE gb(NODE f,int m,NODE subst)
                                 _dp_nf(gall,h,ps,!Top,&nf);                                  _dp_nf(gall,h,ps,!Top,&nf);
                         else                          else
                                 _dp_nf_z(gall,h,ps,!Top,DP_Multiple,&nf);                                  _dp_nf_z(gall,h,ps,!Top,DP_Multiple,&nf);
                         if ( DP_Print )                          if ( DP_Print && nf )
                                 fprintf(asir_out,"(%.3g)",get_rtime()-t_0);                                  fprintf(asir_out,"(%.3g)",get_rtime()-t_0);
                         get_eg(&tnf1); add_eg(&eg_nf,&tnf0,&tnf1);                          get_eg(&tnf1); add_eg(&eg_nf,&tnf0,&tnf1);
                 } else                  } else

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.51

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