/* $OpenXM: OpenXM/src/kan96xx/Kan/gbGM.c,v 1.5 2005/06/16 06:54:55 takayama Exp $ */ /* gbGM.c GM=Gebauer and Moller */ #include #include "datatype.h" #include "extern2.h" #include "matrix.h" #include "gradedset.h" /*#define DEBUG*/ /* Take statistics of mmLarger_matrix in orderT.c */ /* #define STATISTICS */ struct polySet_gm { POLY *g; int lim; int size; int *del; }; struct pair_gm { POLY lcm; int i; int j; }; struct pairSet { struct pair_gm *p; int lim; int size; int *del; }; /* prototypes */ struct polySet_gm newPolySet_gm(int n); struct pairSet newPairSet(int n); int pairSetSize(struct pairSet d); struct pairSet pairSetJoin(struct pairSet a,struct pairSet b); struct polySet_gm enlargePolySet_gm(struct polySet_gm g); struct pairSet deletePair_gm(struct pairSet d,int index); int minPair_gm(struct pairSet d); struct pairSet updatePair_gm(struct pairSet d,int t, struct polySet_gm g,POLY gt); struct polySet_gm markRedundant_gm(struct polySet_gm g,int j); /* struct gradedPolySet *groebner_gm(struct arrayOfPOLY f, int needBack, int needSyz, struct pair **grP); */ void outputPairSet(struct pairSet d); void outputPolySet_gm(struct polySet_gm g); void errorGBGM(char *s); POLY mReductionBySet(POLY f, POLY *s,int size); POLY mReductionCdrBySet(POLY f, POLY *s,int size); int criterion1(POLY f,POLY g,POLY lc); extern int UseCriterion1; extern int Verbose; #define GLIMIT 100 int Criterion1,Criterion2; /* for taking a statistics. */ int Spairs; extern int Criterion2B, Criterion2F, Criterion2M; extern int Statistics; #ifdef STATISTICS int CountE; int CountI[2*N0]; #endif struct polySet_gm newPolySet_gm(n) int n; { struct polySet_gm g; int i; g.g = (POLY *) sGC_malloc(sizeof(POLY)*(n+1)); g.del = (int *) sGC_malloc(sizeof(int)*(n+1)); if ((g.g == (POLY *)NULL) || (g.del == (int *)NULL)) errorGBGM("No more memory."); g.lim = n; g.size = 0; for (i=0; i= 2) { printf("\nupdatepair_gm(): "); printf("g.size=%d ",g.size); printf("d.size=%d; ",d.size); } /* make list (1,t), (2,t), .... ====> new ( D1 ) */ new = newPairSet(g.size); new.size = 0; for (i=0; i= 2) printf("B%d(%d,%d) ",t,i,j); Criterion2B++; } } } /* Then, d is D' */ /* Next, check M(i,t) and F(i,t) */ for (i=0; i= 2) printf("F%d(%d,%d) ",i,j,t); Criterion2F++; break; case 1: /* g[i] > g[j], M(i,t) */ if ((*isReducible)(it,jt)) { new.del[i] = 1; if (Verbose >=2) printf("M%d(%d,%d) ",j,i,t); Criterion2M++; } break; case 0: /* M(j,t) */ if ((*isReducible)(jt,it)) { new.del[j] = 1; if (Verbose >=2) printf("M%d(%d,%d) ",i,j,t); Criterion2M++; } break; } } } } /* Finally, check T(i) T(t) = T(i,t) */ if (UseCriterion1) { for (i=0; i=2) printf("1(%d,%d) ",i,t); Criterion1++; } } } } /* d <-- D' \cup new */ d = pairSetJoin(d,new); if (Verbose >=2) printf("new d.size = %d.\n",d.size); #ifdef DEBUG outputPairSet(d); #endif return(d); } struct polySet_gm markRedundant_gm(g,j) struct polySet_gm g; int j; /* compare only with g[j] */ { int i; for (i=0; in; g = newPolySet_gm(r + GLIMIT); d = newPairSet(1); g.size = 0; g.g[g.size] = getArrayOfPOLY(f,g.size); g.del[g.size] = 0; g.size ++; for (t=1; t 0) { tindex = minPair_gm(d); top = d.p[tindex]; if (Verbose) { printf("\nRemaining pairs = %d : ",d.size); } i = top.i; j = top.j; if (Verbose >=2) printf("sp(%d,%d) ",i,j); Spairs++; sv = (*sp)(g.g[i],g.g[j]); h = ppAddv(ppMult(sv.a,g.g[i]),ppMult(sv.b,g.g[j])); h = mReductionBySet(h,g.g,g.size); if (Verbose >=2) printf("->%s ",POLYToString(h,' ',0)); if (!Verbose) { printf(" <%d>",d.size); fflush(stdout); } if (!(h ISZERO)) { if (ReduceLowerTerms) { h = mReductionCdrBySet(h,g.g,g.size); } d = updatePair_gm(d,r,g,h); g.g[r] = h; g.del[r] = 0; r++; g.size++; g = markRedundant_gm(g,r-1); } d = deletePair_gm(d,tindex); #ifdef DEBUG outputPolySet_gm(g); #endif } if (Verbose || Statistics) { printf("\n\nThe number of s-pairs is %d.\n",Spairs); printf("Criterion1 is applied %d times.\n",Criterion1); printf("Criterions M,F and B are applied M=%d, F=%d, B=%d times.\n",Criterion2M,Criterion2F,Criterion2B); Criterion1 = Criterion2M = Criterion2F = Criterion2B = 0; Spairs = 0; } #ifdef STATISTICS printf("\n\nEqual : %d\n",CountE); for (i=0; i<2*N; i++) { printf("%d times of loop : %d\n",i,CountI[i]); } #endif ans = newGradedPolySet(1); ans->gb = 1; for (i=0; ilim; i++) { ans->polys[i] = newPolySet(1); } for (i=0; im; g = g0->m; lc = lc0->m; if (f->ringp != g->ringp) return(0); if (f->ringp != lc->ringp) return(0); n = f->ringp->n; for (i = 0; ie[i].x + g->e[i].x) != (lc->e[i].x)) return(0); } for (i = 0; ie[i].D + g->e[i].D) != (lc->e[i].D)) return(0); } return(1); } POLY mReductionBySet(f,s,size) POLY f; POLY *s; int size; { int reduced1; int i; POLY cc,cg; do { reduced1 = 0; for (i=0; i