[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.50 and 1.51

version 1.50, 2003/07/01 08:12:38 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.49 2003/06/21 02:09:15 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;
           GeoBucket bucket;
           DL head;
         struct oEGT tmp0,tmp1,eg_split_symb,eg_split_conv,eg_split_elim1,eg_split_elim2;          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;          extern struct oEGT eg_symb,eg_conv,eg_elim1,eg_elim2;
   
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);                  get_eg(&tmp1); add_eg(&eg_symb,&tmp0,&tmp1);
                 init_eg(&eg_split_symb); add_eg(&eg_split_symb,&tmp0,&tmp1);                  init_eg(&eg_split_symb); add_eg(&eg_split_symb,&tmp0,&tmp1);

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

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