=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/ecart.c,v retrieving revision 1.16 retrieving revision 1.21 diff -u -p -r1.16 -r1.21 --- OpenXM/src/kan96xx/Kan/ecart.c 2003/08/27 03:11:12 1.16 +++ OpenXM/src/kan96xx/Kan/ecart.c 2004/09/13 11:24:11 1.21 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.15 2003/08/26 05:52:43 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.20 2003/09/21 02:19:43 takayama Exp $ */ #include #include "datatype.h" #include "extern2.h" @@ -26,6 +26,7 @@ static int ecartCheckPoly(POLY f); /* check if it doe static int ecartCheckEnv(); /* check if the environment is OK for ecart div*/ static struct ecartPolyArray *ecartPutPolyInG(POLY g,struct ecartPolyArray *eparray,POLY cf, POLY syz); static int ecartGetEll(POLY r,POLY g); +static int ecartGetEllPartial(POLY r,POLY g); static POLY ecartDivideSv(POLY r,int *d); /* No automatic homogenization and s is used as a standart var. */ static POLY reduction_ecart0(POLY r,struct gradedPolySet *gset, @@ -45,10 +46,12 @@ struct ring *TraceLift_ringmod; extern DoCancel; int DebugReductionEcart = 0; extern DebugContentReduction; +extern int Sugar; /* This is used for goHomogenization */ extern int DegreeShifto_size; extern int *DegreeShifto_vec; +int Ecart_sugarGrade; /* It is used reduction_ecart() and ecartFindReducer() to determine if we homogenize in this function */ @@ -115,7 +118,42 @@ static int ecartGetEll(POLY f,POLY g) { else return(-p); } +static int ecartGetEllPartial(POLY f,POLY g) { + int n,i,p; + MONOMIAL tf; + MONOMIAL tg; + int nglob; int *glob; int k; + + if (f ISZERO) return(-1); + if (g ISZERO) return(-1); + checkRingIsR(f,g); + + if (!isSameComponent_x(f,g)) return(-1); + tf = f->m; tg = g->m; n = tf->ringp->n; + for (i=1; ie[i].x < tg->e[i].x) return(-1); + if (tf->e[i].D < tg->e[i].D) return(-1); + } + if (tf->e[0].D < tg->e[0].D) return(-1); /* h */ + + /* Find u and ell s.t. s^\ell f = u g. + When u contains variables in glob (index x var), then returns -1. + x' = glob, x'' = complement of glob. Division in Q(x'')[x']. + */ + nglob = tf->ringp->partialEcart; + glob = tf->ringp->partialEcartGlobalVarX; + for (i=0; ie[k].x > tg->e[k].x) return(-1); + } + + p = tf->e[0].x - tg->e[0].x; /* H, s */ + if (p >=0 ) return 0; + else return(-p); +} + + #define EP_SIZE 10 static struct ecartPolyArray *ecartPutPolyInG(POLY g,struct ecartPolyArray *eparray,POLY cf,POLY syz) { @@ -163,6 +201,7 @@ static struct ecartPolyArray *ecartPutPolyInG(POLY g,s return eparray; } +#ifndef EXPERIMENT static struct ecartReducer ecartFindReducer(POLY r,struct gradedPolySet *gset, struct ecartPolyArray *epa) { @@ -200,7 +239,7 @@ static struct ecartReducer ecartFindReducer(POLY r,str if (epa != NULL) { /* Try to find in the second group. */ for (i=0; i< epa->size; i++) { - ell = ecartGetEll(r,(epa->pa)[i]); + ell = ecartGetEllPartial(r,(epa->pa)[i]); if ((ell>=0) && (ell < ell2)) { ell2 = ell; minGgi = i; @@ -208,9 +247,10 @@ static struct ecartReducer ecartFindReducer(POLY r,str } } - if (DebugReductionRed || (DebugReductionEcart&1)) { + if ((DebugReductionRed&1) || (DebugReductionEcart&1)) { printf("ecartFindReducer(): ell1=%d, ell2=%d, minGrade=%d, minGseti=%d, minGgi=%d\n",ell1,ell2,minGrade,minGseti,minGgi); } + if (ell1 <= ell2) { if (ell1 == LARGE) { er.ell = -1; @@ -229,6 +269,7 @@ static struct ecartReducer ecartFindReducer(POLY r,str return er; } } +#endif static POLY ecartCheckSyz0(POLY cf,POLY r_0,POLY syz, struct gradedPolySet *gg,POLY r) @@ -364,9 +405,9 @@ static POLY reduction_ecart0(r,gset,needSyz,syzp) if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1); - if (DebugReductionEcart&1) printf("--------------------------------------\n"); + if (DebugReductionEcart&1) printf("reduction_ecart0--------------------------------------\n"); do { - if (DebugReductionRed) printf("r=%s\n",POLYToString(r,'*',1)); + if (DebugReductionRed&1) printf("r=%s\n",POLYToString(r,'*',1)); if (DebugReductionEcart & 1) printf("r=%s+...\n",POLYToString(head(r),'*',1)); ells = ecartFindReducer(r,gset,gg); ell = ells.ell; @@ -413,7 +454,7 @@ static POLY reduction_ecart0(r,gset,needSyz,syzp) syz = ppAdd(syz,cpMult(toSyzCoeff(cg),syz_o)); /* Note. 2003.07.19 */ } - if (DebugReductionRed) { + if (DebugReductionRed && needSyz) { POLY tp; tp = ecartCheckSyz0(cf,r_0,syz,gset,r); if (tp != POLYNULL) { @@ -482,6 +523,7 @@ static POLY reduction_ecart1(r,gset,needSyz,syzp) POLY cf_o; POLY syz_o; POLY r_0; + POLY r0; int se; struct coeff *cont; @@ -508,9 +550,9 @@ static POLY reduction_ecart1(r,gset,needSyz,syzp) /* 1 means homogenize only s */ if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1); - if (DebugReductionEcart&1) printf("=======================================\n"); + if (DebugReductionEcart&1) printf("reduction_ecart1=======================================\n"); do { - if (DebugReductionRed) printf("(ecart1(d)) r=%s\n",POLYToString(r,'*',1)); + if (DebugReductionRed & 1) printf("(ecart1(d)) r=%s\n",POLYToString(r,'*',1)); if (DebugReductionEcart & 1) printf("r=%s+,,,\n",POLYToString(head(r),'*',1)); ells = ecartFindReducer(r,gset,gg); @@ -531,7 +573,20 @@ static POLY reduction_ecart1(r,gset,needSyz,syzp) pp = (gg->pa)[ells.ggi]; } if (ell > 0) r = ppMult(cxx(1,0,ell,rp),r); /* r = s^ell r */ + r0 = r; r = (*reduction1)(r,pp,needSyz,&cc,&cg); + if (DebugReductionEcart & 8) { + if (ell > 0) {printf("ell+ "); fflush(NULL); + }else { + printf("ell0 "); fflush(NULL); + if ((*mmLarger)(r,r0) >= 1) { + printf("error in reduction."); + printf(" r0=%s\n",POLYToString(r0,'*',1)); + printf("==>r=%s\n",POLYToString(r,'*',1)); + getchar(); getchar(); + } + } + } if (DoCancel && (r != POLYNULL)) { if (shouldReduceContent(r,0)) { @@ -559,7 +614,7 @@ static POLY reduction_ecart1(r,gset,needSyz,syzp) } } - if (DebugReductionRed) { + if (DebugReductionRed && needSyz) { POLY tp; tp = ecartCheckSyz0(cf,r_0,syz,gset,r); tp = goDeHomogenizeS(tp); @@ -682,7 +737,7 @@ static struct ecartReducer ecartFindReducer_mod(POLY r if (epa != NULL) { /* Try to find in the second group. */ for (i=0; i< epa->size; i++) { - ell = ecartGetEll(r,(epa->pa)[i]); + ell = ecartGetEllPartial(r,(epa->pa)[i]); if ((ell>=0) && (ell < ell2)) { ell2 = ell; minGgi = i; @@ -690,7 +745,7 @@ static struct ecartReducer ecartFindReducer_mod(POLY r } } - if (DebugReductionRed || (DebugReductionEcart&1)) { + if ((DebugReductionRed & 1)|| (DebugReductionEcart&1)) { printf("ecartFindReducer_mod(): ell1=%d, ell2=%d, minGrade=%d, minGseti=%d, minGgi=%d, p=%d\n",ell1,ell2,minGrade,minGseti,minGgi,TraceLift_ringmod->p); } if (ell1 <= ell2) { @@ -724,6 +779,7 @@ static POLY reduction_ecart1_mod(r,gset) struct ecartReducer ells; struct ecartPolyArray *gg; POLY pp; + POLY r0; int ell; int se; @@ -745,13 +801,13 @@ static POLY reduction_ecart1_mod(r,gset) KshowRing(TraceLift_ringmod); **/ r = modulop(r,TraceLift_ringmod); - rp = r->m->ringp; /* reset rp */ + if (r != POLYNULL) rp = r->m->ringp; /* reset rp */ /* printf("r=%s (mod p)\n",POLYToString(head(r),'*',1)); **/ if (DebugReductionEcart&1) printf("=====================================mod\n"); do { - if (DebugReductionRed) printf("(ecart1_mod(d)) r=%s\n",POLYToString(r,'*',1)); + if (DebugReductionRed & 1) printf("(ecart1_mod(d)) r=%s\n",POLYToString(r,'*',1)); if (DebugReductionEcart & 1) printf("r=%s+,,,\n",POLYToString(head(r),'*',1)); ells = ecartFindReducer_mod(r,gset,gg); @@ -768,7 +824,23 @@ static POLY reduction_ecart1_mod(r,gset) pp = (gg->pa)[ells.ggi]; } if (ell > 0) r = ppMult(cxx(1,0,ell,rp),r); /* r = s^ell r */ + + r0 = r; r = (*reduction1)(r,pp,0,&cc,&cg); + + if (DebugReductionEcart & 8) { + if (ell > 0) {printf("ell+ "); fflush(NULL); + }else { + printf("ell0 "); fflush(NULL); + if ((*mmLarger)(r,r0) >= 1) { + printf("error in reduction."); + printf(" r0=%s\n",POLYToString(r0,'*',1)); + printf("==>r=%s\n",POLYToString(r,'*',1)); + getchar(); getchar(); + } + } + } + if (r ISZERO) goto ss1; r = ecartDivideSv(r,&se); /* r = r/s^? */ } @@ -780,4 +852,189 @@ static POLY reduction_ecart1_mod(r,gset) return(r); } + +#ifdef EXPERIMENT +static struct ecartReducer ecartFindReducer(POLY r,struct gradedPolySet *gset, + struct ecartPolyArray *epa) +{ + int grd; + struct polySet *set; + int minGrade = 0; + int minGseti = 0; + int minGgi = 0; + int ell1 = LARGE; + int ell2 = LARGE; + int ell; + int i; + struct ecartReducer er; + int ellmin ; + ell1 = ell2 = ellmin = LARGE; + /* Try to find a reducer in gset; */ + grd = 0; + while (grd < gset->maxGrade) { + set = gset->polys[grd]; + for (i=0; isize; i++) { + if (set->gh[i] == POLYNULL) { + /* goHomogenize set->gh[i] */ + if (EcartAutomaticHomogenization) { + set->gh[i] = goHomogenize11(set->g[i],DegreeShifto_vec,DegreeShifto_size,-1,1); + }else{ + set->gh[i] = set->g[i]; + } + } + ell = ecartGetEll(r,set->gh[i]); + if ((ell>=0) && (ell < ell1)) { + ell1 = ell; + minGrade = grd; minGseti=i; + } + } + grd++; + } + if (epa != NULL) { + /* Try to find in the second group. */ + for (i=0; i< epa->size; i++) { + ell = ecartGetEll(r,(epa->pa)[i]); + if ((ell>=0) && (ell < ell2)) { + ell2 = ell; + minGgi = i; + } + } + } + + if ((DebugReductionRed&1) || (DebugReductionEcart&1)) { + printf("ecartFindReducer(): ell1=%d, ell2=%d, minGrade=%d, minGseti=%d, minGgi=%d\n",ell1,ell2,minGrade,minGseti,minGgi); + } + +#ifdef EXPERIMENTAL1 + if (Sugar) { /* experimental */ + if (ell1 <= ell2) { + if (ell1 == LARGE) { + er.ell = -1; + return er; + }else{ + int new_s; + er.ell = ell1; + er.first = 1; + er.grade = minGrade; + er.gseti = minGseti; + /* reduce if and only if Ecart_sugarGrade does not increase. */ + new_s = grade_gen(r)-grade_gen(gset->polys[minGrade]->gh[minGseti]); + if (new_s + minGrade <= Ecart_sugarGrade+1) { + return er; + }else{ + printf("new_s=%d, minGrade=%d, sugarGrade=%d\n",new_s,minGrade, + Ecart_sugarGrade); + er.ell = -1; + return er; + } + } + }else{ + er.ell = ell2; + er.first = 0; + er.ggi = minGgi; + return er; + } + } +#endif + + if ((ell1 == LARGE) && (ell2 == LARGE)) { + er.ell = -1; + return er; + } + + if (ell1 < ell2) { + ellmin = ell1; + }else{ + ellmin = ell2; + } + { +#define M 100 + int aminGrade[M]; + int aminGseti[M]; + int aminGgi[M]; + int sp1,sp2; + int i; + int gmin; + int gtmp; + sp1 = sp2 = 0; + + if (ell1 == ellmin) { + grd = 0; + while (grd < gset->maxGrade) { + set = gset->polys[grd]; + for (i=0; isize; i++) { + ell = ecartGetEll(r,set->gh[i]); + if (ell == ellmin) { + aminGrade[sp1] = grd; aminGseti[sp1]=i; + sp1++; + if (sp1 >= M) { + fprintf(stderr,"aminGrade, buffer overflow. sp1 is set to 1.\n"); + sp1 = 1; + } + } + } + grd++; + } + } + if (ell2 == ellmin) { + if (epa != NULL) { + for (i=0; i< epa->size; i++) { + ell = ecartGetEll(r,(epa->pa)[i]); + if (ell == ellmin) { + aminGgi[sp2] = i; + sp2++; + if (sp2 >= M) { + fprintf(stderr,"aminGgi, buffer overflow. sp2 is set to 1.\n"); + sp2 = 1; + } + } + } + } + } + /* print summary */ + printf("summary -----------------------\n"); + for (i=0; ipolys[aminGrade[i]]->gh[aminGseti[i]])); + } + gmin = LARGE; + for (i=0; ipa)[aminGgi[i]]); + printf("grade=%d\n",gtmp); + if (gtmp < gmin) { + gmin = gtmp; + minGgi = aminGgi[i]; + } + } + + if (ell1 <= ell2) { + er.ell = ell1; + er.first = 1; + er.grade = minGrade; + er.gseti = minGseti; + return er; + }else{ + er.ell = ell2; + er.first = 0; + er.ggi = minGgi; + return er; + } + + } + + if (ell1 <= ell2) { + er.ell = ell1; + er.first = 1; + er.grade = minGrade; + er.gseti = minGseti; + return er; + }else{ + er.ell = ell2; + er.first = 0; + er.ggi = minGgi; + return er; + } +} +#endif