=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/ecart.c,v retrieving revision 1.5 retrieving revision 1.20 diff -u -p -r1.5 -r1.20 --- OpenXM/src/kan96xx/Kan/ecart.c 2003/07/19 06:03:57 1.5 +++ OpenXM/src/kan96xx/Kan/ecart.c 2003/09/21 02:19:43 1.20 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.4 2003/07/17 23:47:44 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.19 2003/09/20 09:57:29 takayama Exp $ */ #include #include "datatype.h" #include "extern2.h" @@ -21,6 +21,7 @@ struct ecartPolyArray { }; static struct ecartReducer ecartFindReducer(POLY r,struct gradedPolySet *gset,struct ecartPolyArray *epa); +static struct ecartReducer ecartFindReducer_mod(POLY r,struct gradedPolySet *gset,struct ecartPolyArray *epa); static int ecartCheckPoly(POLY f); /* check if it does not contain s-variables */ 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); @@ -32,14 +33,24 @@ static POLY reduction_ecart0(POLY r,struct gradedPolyS /* Automatic homogenization and s->1 */ static POLY reduction_ecart1(POLY r,struct gradedPolySet *gset, int needSyz, struct syz0 *syzp); +static POLY reduction_ecart1_mod(POLY r,struct gradedPolySet *gset); static POLY ecartCheckSyz0(POLY cf,POLY r_0,POLY syz, struct gradedPolySet *gg,POLY r); +static void ecartCheckSyz0_printinfo(POLY cf,POLY r_0,POLY syz, + struct gradedPolySet *gg,POLY r); -extern int DebugReductionRed; +extern int DebugReductionRed; +extern int TraceLift; +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 */ @@ -60,8 +71,20 @@ static POLY ecartDivideSv(POLY r,int *d) { } r = r->next; } + if (k > 0) { *d = k; + return ppMult(cxx(1,0,-k,f->m->ringp),f); + }else{ + return f; + } + + /* Do not do the below. It caused a bug. cf. misc-2003/07/ecart/b4.sm1 test2. + Note. 2003.8.26 + */ + /* + if (k > 0) { + *d = k; f = r; while (r != POLYNULL) { r->m->e[0].x -= k; @@ -69,6 +92,7 @@ static POLY ecartDivideSv(POLY r,int *d) { } } return f; + */ } static int ecartGetEll(POLY f,POLY g) { @@ -141,6 +165,7 @@ static struct ecartPolyArray *ecartPutPolyInG(POLY g,s return eparray; } +#ifndef EXPERIMENT static struct ecartReducer ecartFindReducer(POLY r,struct gradedPolySet *gset, struct ecartPolyArray *epa) { @@ -186,9 +211,10 @@ static struct ecartReducer ecartFindReducer(POLY r,str } } - if (DebugReductionRed) { + 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; @@ -207,6 +233,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) @@ -233,17 +260,65 @@ static POLY ecartCheckSyz0(POLY cf,POLY r_0,POLY syz, return f; } +static void ecartCheckSyz0_printinfo(POLY cf,POLY r_0,POLY syz, + struct gradedPolySet *gg,POLY r) +{ + POLY f; + int grd,i; + POLY q; + struct coeff *c; + fprintf(stderr,"cf=%s\n",POLYToString(cf,'*',1)); + fprintf(stderr,"r_0=%s\n",POLYToString(r_0,'*',1)); + fprintf(stderr,"syz=%s\n",POLYToString(syz,'*',1)); + fprintf(stderr,"r=%s\n",POLYToString(r,'*',1)); + f = ppMult(cf,r_0); + while (syz != POLYNULL) { + grd = syz->m->e[0].x; + i = syz->m->e[0].D; + c = syz->coeffp; + if (c->tag == POLY_COEFF) { + q = c->val.f; + }else{ + q = POLYNULL; + } + fprintf(stderr,"[grd,idx]=[%d,%d], %s\n",grd,i, + POLYToString(((gg->polys[grd])->g)[i],'*',1)); + /* f = ppAdd(f,ppMult(q,((gg->polys[grd])->g)[i])); */ + syz = syz->next; + } + /* f = ppSub(f,r); */ +} + POLY reduction_ecart(r,gset,needSyz,syzp) POLY r; struct gradedPolySet *gset; int needSyz; struct syz0 *syzp; /* set */ { - if (EcartAutomaticHomogenization) { - return reduction_ecart1(r,gset,needSyz,syzp); + POLY rn; + if (TraceLift && needSyz) { + warningGradedSet("TraceLift cannot be used to get syzygy. TraceLift is turned off.\n"); + TraceLift = 0; + } + if (TraceLift) { + if (EcartAutomaticHomogenization) { + if (TraceLift_ringmod == NULL) { + warningPoly("reduction_ecart: TraceLift_ringmod is not set.\n"); + return reduction_ecart1(r,gset,needSyz,syzp); + } + rn = reduction_ecart1_mod(r,gset); + if (rn == POLYNULL) return rn; + else return reduction_ecart1(r,gset,needSyz,syzp); + }else{ + return reduction_ecart0(r,gset,needSyz,syzp); + } }else{ - return reduction_ecart0(r,gset,needSyz,syzp); + if (EcartAutomaticHomogenization) { + return reduction_ecart1(r,gset,needSyz,syzp); + }else{ + return reduction_ecart0(r,gset,needSyz,syzp); + } } } @@ -271,6 +346,8 @@ static POLY reduction_ecart0(r,gset,needSyz,syzp) POLY cf_o; POLY syz_o; POLY r_0; + int se; + struct coeff *cont; extern struct ring *CurrentRingp; struct ring *rp; @@ -290,11 +367,16 @@ static POLY reduction_ecart0(r,gset,needSyz,syzp) } } + if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1); + + 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; if (ell > 0) { + if (DebugReductionEcart & 2) printf("*"); if (needSyz) { gg = ecartPutPolyInG(r,gg,cf,syz); }else{ @@ -305,10 +387,21 @@ static POLY reduction_ecart0(r,gset,needSyz,syzp) if (ells.first) { pp = ((gset->polys[ells.grade])->gh)[ells.gseti]; }else{ + if (DebugReductionEcart & 4) printf("#"); pp = (gg->pa)[ells.ggi]; } - if (ell > 0) r = mpMult(cxx(1,0,ell,rp),r); /* r = s^ell r */ + if (ell > 0) r = ppMult(cxx(1,0,ell,rp),r); /* r = s^ell r */ r = (*reduction1)(r,pp,needSyz,&cc,&cg); + + if (DoCancel && (r != POLYNULL)) { + if (shouldReduceContent(r,0)) { + r = reduceContentOfPoly(r,&cont); + shouldReduceContent(r,1); + if (DebugReductionEcart || DebugReductionRed || DebugContentReduction) printf("CONT=%s ",coeffToString(cont)); + } + } + + if (needSyz) { if (ells.first) { if (ell >0) cc = ppMult(cc,cxx(1,0,ell,rp)); @@ -323,31 +416,48 @@ static POLY reduction_ecart0(r,gset,needSyz,syzp) cf = ppAdd(cf,ppMult(cg,cf_o)); syz = cpMult(toSyzCoeff(cc),syz); syz = ppAdd(syz,cpMult(toSyzCoeff(cg),syz_o)); - /* Note. 2003.07.19 */ + /* Note. 2003.07.19 */ } - if (DebugReductionRed) { - POLY tp; - tp = ecartCheckSyz0(cf,r_0,syz,gset,r); - if (tp != POLYNULL) { - fprintf(stderr,"reduction_ecart0(): sygyzy is broken. Return the Current values.\n"); - fprintf(stderr,"%s\n",POLYToString(tp,'*',1)); - syzp->cf = cf; - syzp->syz = syz; - return r; - } + if (DebugReductionRed && needSyz) { + POLY tp; + tp = ecartCheckSyz0(cf,r_0,syz,gset,r); + if (tp != POLYNULL) { + fprintf(stderr,"reduction_ecart0(): sygyzy is broken. Return the Current values.\n"); + fprintf(stderr,"tp=%s\n",POLYToString(tp,'*',1)); + ecartCheckSyz0_printinfo(cf,r_0,syz,gset,r); + syzp->cf = cf; + syzp->syz = syz; + return r; + } } } if (r ISZERO) goto ss; - /*r = ecartDivideSv(r,&se); r = r/s^? Don't do this. */ + + /* r = r/s^? Don't do this?? */ + r = ecartDivideSv(r,&se); + if (needSyz && (se > 0)) { + POLY tt; + tt = cxx(1,0,-se,rp); + cf = ppMult(tt,cf); + syz = cpMult(toSyzCoeff(tt),syz); + } + } }while (ell >= 0); ss: ; if (needSyz) { - syzp->cf = cf; /* cf is in the CurrentRingp */ - syzp->syz = syz; /* syz is in the SyzRingp */ + syzp->cf = cf; /* cf is in the ring of r */ + syzp->syz = syz; /* syz is in the syzRing of r */ } + if (DoCancel && (r != POLYNULL)) { + if (r->m->ringp->p == 0) { + r = reduceContentOfPoly(r,&cont); + if (DebugReductionEcart || DebugReductionRed || DebugContentReduction) printf("cont=%s ",coeffToString(cont)); + } + } + return(r); } @@ -374,11 +484,18 @@ static POLY reduction_ecart1(r,gset,needSyz,syzp) struct ecartPolyArray *gg; POLY pp; int ell; + POLY cf_o; + POLY syz_o; + POLY r_0; + POLY r0; int se; + struct coeff *cont; extern struct ring *CurrentRingp; struct ring *rp; + extern struct ring *SmallRingp; + r_0 = r; gg = NULL; if (needSyz) { if (r ISZERO) { rp = CurrentRingp; } else { rp = r->m->ringp; } @@ -395,48 +512,493 @@ static POLY reduction_ecart1(r,gset,needSyz,syzp) r = goHomogenize11(r,DegreeShifto_vec,DegreeShifto_size,-1,1); /* 1 means homogenize only s */ + if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1); + if (DebugReductionEcart&1) printf("reduction_ecart1=======================================\n"); do { - if (DebugReductionRed) printf("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); ell = ells.ell; if (ell > 0) { - gg = ecartPutPolyInG(r,gg,POLYNULL,POLYNULL); + if (DebugReductionEcart & 2) printf("%"); + if (needSyz) { + gg = ecartPutPolyInG(r,gg,cf,syz); + }else{ + gg = ecartPutPolyInG(r,gg,POLYNULL,POLYNULL); + } } if (ell >= 0) { if (ells.first) { pp = ((gset->polys[ells.grade])->gh)[ells.gseti]; }else{ + if (DebugReductionEcart & 4) {printf("+"); fflush(NULL);} pp = (gg->pa)[ells.ggi]; } - if (ell > 0) r = mpMult(cxx(1,0,ell,rp),r); /* r = s^ell r */ + 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)) { + r = reduceContentOfPoly(r,&cont); + shouldReduceContent(r,1); + if (DebugReductionEcart || DebugReductionRed || DebugContentReduction) printf("CONT=%s ",coeffToString(cont)); + } + } + if (needSyz) { if (ells.first) { + if (ell > 0) cc = ppMult(cc,cxx(1,0,ell,rp)); cf = ppMult(cc,cf); syz = cpMult(toSyzCoeff(cc),syz); - syz = ppAddv(syz,toSyzPoly(cg,ells.grade,ells.gseti)); + syz = ppAdd(syz,toSyzPoly(cg,ells.grade,ells.gseti)); }else{ - fprintf(stderr,"It has not yet implemented.\n"); - exit(10); - /* BUG: not yet */ + if (ell >0) cc = ppMult(cc,cxx(1,0,ell,rp)); + cf_o = (gg->cf)[ells.ggi]; + syz_o = (gg->syz)[ells.ggi]; + cf = ppMult(cc,cf); + cf = ppAdd(cf,ppMult(cg,cf_o)); + syz = cpMult(toSyzCoeff(cc),syz); + syz = ppAdd(syz,cpMult(toSyzCoeff(cg),syz_o)); + /* Note. 2003.07.19 */ } } + + if (DebugReductionRed && needSyz) { + POLY tp; + tp = ecartCheckSyz0(cf,r_0,syz,gset,r); + tp = goDeHomogenizeS(tp); + if (tp != POLYNULL) { + fprintf(stderr,"Error: reduction_ecart1(): sygyzy is broken. Return the Current values.\n"); + fprintf(stderr,"%s\n",POLYToString(tp,'*',1)); + syzp->cf = cf; + syzp->syz = syz; + return r; + } + } + if (r ISZERO) goto ss1; r = ecartDivideSv(r,&se); /* r = r/s^? */ + + if (needSyz && (se > 0)) { /* It may not necessary because of dehomo*/ + POLY tt; + /*printf("!1/H!"); fflush(NULL);*/ /* misc-2003/ecart/t1.sm1 foo4 */ + tt = cxx(1,0,-se,rp); + cf = ppMult(tt,cf); + syz = cpMult(toSyzCoeff(tt),syz); + } + + /* For debug */ + if (DebugReductionRed && needSyz) { + POLY tp; + tp = ecartCheckSyz0(cf,r_0,syz,gset,r); + tp = goDeHomogenizeS(tp); + if (tp != POLYNULL) { + fprintf(stderr,"Error: reduction_ecart1() after divide: sygyzy is broken. Return the Current values.\n"); + fprintf(stderr,"%s\n",POLYToString(tp,'*',1)); + syzp->cf = cf; + syzp->syz = syz; + return r; + } + } + } }while (ell >= 0); ss1: ; if (needSyz) { + /* dehomogenize the syzygy. BUG, this may be inefficient. */ + cf = goDeHomogenizeS(cf); + syz = goDeHomogenizeS(syz); + /*printf("cf=%s\n",POLYToString(cf,'*',1)); + printf("syz=%s\n",POLYToString(syz,'*',1));*/ syzp->cf = cf; /* cf is in the CurrentRingp */ syzp->syz = syz; /* syz is in the SyzRingp */ - /* BUG: dehomogenize the syzygy */ - fprintf(stderr,"It has not yet implemented.\n"); - exit(10); } r = goDeHomogenizeS(r); + if (DoCancel && (r != POLYNULL)) { + if (r->m->ringp->p == 0) { + r = reduceContentOfPoly(r,&cont); + if (DebugReductionEcart || DebugReductionRed || DebugContentReduction) printf("cont=%s ",coeffToString(cont)); + } + } + /* For debug */ + if (DebugReductionRed && needSyz) { + POLY tp; + tp = ecartCheckSyz0(cf,r_0,syz,gset,r); + tp = goDeHomogenizeS(tp); + if (tp != POLYNULL) { + fprintf(stderr,"Error: reduction_ecart1() last step: sygyzy is broken. Return the Current values.\n"); + fprintf(stderr,"%s\n",POLYToString(tp,'*',1)); + syzp->cf = cf; + syzp->syz = syz; + return r; + } + } + return(r); } + +/* Functions for trace lift */ +static struct ecartReducer ecartFindReducer_mod(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; + /* 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]; + } + } + if (TraceLift && (set->gmod[i] == POLYNULL)) { + set->gmod[i] = modulop(set->gh[i],TraceLift_ringmod); + } + if (TraceLift) { + ell = ecartGetEll(r,set->gmod[i]); + }else{ + 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_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) { + if (ell1 == LARGE) { + er.ell = -1; + return er; + }else{ + 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; + } +} + +static POLY reduction_ecart1_mod(r,gset) + POLY r; + struct gradedPolySet *gset; +{ + int reduced,reduced1,reduced2; + int grd; + struct polySet *set; + int i; + POLY cc,cg; + struct ecartReducer ells; + struct ecartPolyArray *gg; + POLY pp; + POLY r0; + int ell; + int se; + + extern struct ring *CurrentRingp; + struct ring *rp; + + gg = NULL; + + if (r != POLYNULL) { + rp = r->m->ringp; + if (! rp->weightedHomogenization) { + errorKan1("%s\n","ecart.c: the given ring must be declared with [(weightedHomogenization) 1]"); + } + } + + r = goHomogenize11(r,DegreeShifto_vec,DegreeShifto_size,-1,1); + /* 1 means homogenize only s */ + /*printf("r=%s (mod 0)\n",POLYToString(head(r),'*',1)); + KshowRing(TraceLift_ringmod); **/ + + r = modulop(r,TraceLift_ringmod); + 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 & 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); + ell = ells.ell; + if (ell > 0) { + if (DebugReductionEcart & 2) printf("%"); + gg = ecartPutPolyInG(r,gg,POLYNULL,POLYNULL); + } + if (ell >= 0) { + if (ells.first) { + pp = ((gset->polys[ells.grade])->gmod)[ells.gseti]; + }else{ + if (DebugReductionEcart & 4) {printf("+"); fflush(NULL);} + 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^? */ + } + }while (ell >= 0); + + ss1: ; + + r = goDeHomogenizeS(r); + + 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 +