=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/ecart.c,v retrieving revision 1.16 retrieving revision 1.19 diff -u -p -r1.16 -r1.19 --- OpenXM/src/kan96xx/Kan/ecart.c 2003/08/27 03:11:12 1.16 +++ OpenXM/src/kan96xx/Kan/ecart.c 2003/09/20 09:57:29 1.19 @@ -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.18 2003/09/12 02:52:50 takayama Exp $ */ #include #include "datatype.h" #include "extern2.h" @@ -45,10 +45,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 */ @@ -208,9 +210,39 @@ 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 (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) { + 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; + } + } + if (ell1 <= ell2) { if (ell1 == LARGE) { er.ell = -1; @@ -366,7 +398,7 @@ static POLY reduction_ecart0(r,gset,needSyz,syzp) if (DebugReductionEcart&1) printf("--------------------------------------\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 +445,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 +514,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; @@ -510,7 +543,7 @@ static POLY reduction_ecart1(r,gset,needSyz,syzp) if (DebugReductionEcart&1) printf("=======================================\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 +564,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 +605,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); @@ -690,7 +736,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 +770,7 @@ static POLY reduction_ecart1_mod(r,gset) struct ecartReducer ells; struct ecartPolyArray *gg; POLY pp; + POLY r0; int ell; int se; @@ -745,13 +792,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 +815,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^? */ }