=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/red.c,v retrieving revision 1.1 retrieving revision 1.6 diff -u -p -r1.1 -r1.6 --- OpenXM/src/kan96xx/Kan/red.c 1999/10/08 02:12:02 1.1 +++ OpenXM/src/kan96xx/Kan/red.c 2003/08/21 02:30:23 1.6 @@ -1,3 +1,4 @@ +/* $OpenXM: OpenXM/src/kan96xx/Kan/red.c,v 1.5 2003/07/30 09:00:52 takayama Exp $ */ #include #include "datatype.h" #include "extern2.h" @@ -6,12 +7,13 @@ #define mymax(p,q) (p>q?p:q) int DebugReductionRed = 0; +int DebugContentReduction = 0; extern int Sugar; struct spValue sp_gen(f,g) -POLY f; -POLY g; -/* the results may be rewritten. */ + POLY f; + POLY g; + /* the results may be rewritten. */ { struct spValue r; POLY a; @@ -67,18 +69,18 @@ POLY g; if (ell-c > 0) { /* q-case */ amodify = 0; for (i=c; ie[i].D)*(tg->e[i].x); + amodify += (tb->e[i].D)*(tg->e[i].x); } bmodify = 0; for (i=c; ie[i].D)*(tf->e[i].x); + bmodify += (ta->e[i].D)*(tf->e[i].x); } if (amodify > bmodify) { - amodify = amodify-bmodify; - bmodify = 0; + amodify = amodify-bmodify; + bmodify = 0; }else{ - bmodify = bmodify - amodify; - amodify = 0; + bmodify = bmodify - amodify; + amodify = 0; } } if (amodify) { @@ -108,12 +110,12 @@ POLY g; POLY reduction1_gen_debug(f,g,needSyz,c,h) -POLY f; -POLY g; -int needSyz; -POLY *c; /* set */ -POLY *h; /* set */ -/* f must be reducible by g. r = c*f + h*g */ + POLY f; + POLY g; + int needSyz; + POLY *c; /* set */ + POLY *h; /* set */ + /* f must be reducible by g. r = c*f + h*g */ { extern struct ring *CurrentRingp; struct ring *rp; @@ -146,7 +148,7 @@ POLY *h; /* set */ printf("error in reduction1."); printf("f=%s --> f2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); printf("f2 = (%s)*f+(%s)*(%s)\n",POLYToString(sv.a,'*',1), - POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); + POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); getchar(); getchar(); } @@ -170,7 +172,7 @@ POLY *h; /* set */ if (!isOrdered(f)) { printf("\nf is not ordered polynomial."); }else if (!isOrdered(f)) { - printf("\nf2 is not ordered polynomial."); + printf("\nf2 is not ordered polynomial."); } printf("f=%s,\nf2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); getchar(); @@ -181,8 +183,8 @@ POLY *h; /* set */ printf("error in reduction1."); printf("f=%s --> f2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); printf("f2 = (%s)*f+(%s)*(%s)\n",POLYToString(sv.a,'*',1), - POLYToString(sv.b,'*',1), - POLYToString(g,'*',1)); + POLYToString(sv.b,'*',1), + POLYToString(g,'*',1)); getchar(); getchar(); } @@ -196,12 +198,12 @@ POLY *h; /* set */ } POLY reduction1_gen(f,g,needSyz,c,h) -POLY f; -POLY g; -int needSyz; -POLY *c; /* set */ -POLY *h; /* set */ -/* f must be reducible by g. r = c*f + h*g */ + POLY f; + POLY g; + int needSyz; + POLY *c; /* set */ + POLY *h; /* set */ + /* f must be reducible by g. r = c*f + h*g */ { extern struct ring *CurrentRingp; struct ring *rp; @@ -219,7 +221,7 @@ POLY *h; /* set */ f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g)); if (DebugReductionRed) { printf("c=%s, d=%s, g=%s: f --> c*f + d*g.\n", - POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); + POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); } f = f2; @@ -233,7 +235,7 @@ POLY *h; /* set */ f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g)); if (DebugReductionRed) { printf("! c=%s, d=%s, g=%s: f --> c*f + d*g.\n", - POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); + POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); } f = f2; @@ -246,13 +248,13 @@ POLY *h; /* set */ } POLY reduction1Cdr_gen(f,fs,g,needSyz,c,h) -POLY f; -POLY fs; -POLY g; -int needSyz; -POLY *c; /* set */ -POLY *h; /* set */ -/* f must be reducible by g. r = c*f + h*g */ + POLY f; + POLY fs; + POLY g; + int needSyz; + POLY *c; /* set */ + POLY *h; /* set */ + /* f must be reducible by g. r = c*f + h*g */ { extern struct ring *CurrentRingp; struct ring *rp; @@ -296,24 +298,24 @@ POLY *h; /* set */ /* for debug */ int isOrdered(f) -POLY f; + POLY f; { POLY g; - if (f ISZERO) return(1); - g = f->next; - while (g != POLYNULL) { - if ((*mmLarger)(g,f)>=1) return(0); - f = g; - g = f->next; - } - return(1); + if (f ISZERO) return(1); + g = f->next; + while (g != POLYNULL) { + if ((*mmLarger)(g,f)>=1) return(0); + f = g; + g = f->next; + } + return(1); } POLY reduction_gen(f,gset,needSyz,syzp) -POLY f; -struct gradedPolySet *gset; -int needSyz; -struct syz0 *syzp; /* set */ + POLY f; + struct gradedPolySet *gset; + int needSyz; + struct syz0 *syzp; /* set */ { int reduced,reduced1,reduced2; int grd; @@ -324,12 +326,18 @@ struct syz0 *syzp; /* set */ extern struct ring *CurrentRingp; struct ring *rp; + extern DoCancel; if (needSyz) { if (f ISZERO) { rp = CurrentRingp; } else { rp = f->m->ringp; } cf = cxx(1,0,0,rp); syz = ZERO; } + if (needSyz && DoCancel) { + warningGradedSet("needSyz is not supported when DoCancel is turned on. DoCancel is set to 0.\n"); + DoCancel = 0; + } + if (DoCancel && (f != POLYNULL)) shouldReduceContent(f,1); reduced = 0; /* no */ do { @@ -337,41 +345,60 @@ struct syz0 *syzp; /* set */ grd = 0; while (grd < gset->maxGrade) { if (!Sugar) { - if (grd > (*grade)(f)) break; + if (grd > (*grade)(f)) break; } set = gset->polys[grd]; do { - reduced2 = 0; /* no */ - for (i=0; isize; i++) { - if (f ISZERO) goto ss; - if ((*isReducible)(f,set->g[i])) { - f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); - if (needSyz) { - cf = ppMult(cc,cf); - syz = cpMult(toSyzCoeff(cc),syz); - syz = ppAddv(syz,toSyzPoly(cg,grd,i)); - } - reduced = reduced1 = reduced2 = 1; /* yes */ - } - } + reduced2 = 0; /* no */ + for (i=0; isize; i++) { + if (f ISZERO) goto ss; + if ((*isReducible)(f,set->g[i])) { + f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); + + if (DoCancel && (f != POLYNULL)) { + if (shouldReduceContent(f,0)) { + struct coeff *cont; + f = reduceContentOfPoly(f,&cont); + shouldReduceContent(f,1); + if (DebugContentReduction) printf("CONT=%s ",coeffToString(cont)); + } + } + + if (needSyz) { + cf = ppMult(cc,cf); + syz = cpMult(toSyzCoeff(cc),syz); + syz = ppAddv(syz,toSyzPoly(cg,grd,i)); + } + reduced = reduced1 = reduced2 = 1; /* yes */ + } + } } while (reduced2 != 0); grd++; } }while (reduced1 != 0); - ss: ; + ss: ; if (needSyz) { syzp->cf = cf; /* cf is in the CurrentRingp */ syzp->syz = syz; /* syz is in the SyzRingp */ } + + if (DoCancel && (f != POLYNULL)) { + if (f->m->ringp->p == 0) { + struct coeff *cont; + f = reduceContentOfPoly(f,&cont); + if (DebugContentReduction) printf("cont=%s ",coeffToString(cont)); + } + } + return(f); } POLY reduction_gen_rev(f,gset,needSyz,syzp) -POLY f; -struct gradedPolySet *gset; -int needSyz; -struct syz0 *syzp; /* set */ + POLY f; + struct gradedPolySet *gset; + int needSyz; + struct syz0 *syzp; /* set */ { int reduced,reduced1,reduced2; int grd; @@ -396,25 +423,25 @@ struct syz0 *syzp; /* set */ while (grd >= 0) { /* reverse order for reduction */ set = gset->polys[grd]; do { - reduced2 = 0; /* no */ - for (i=0; isize; i++) { - if (f ISZERO) goto ss; - if ((*isReducible)(f,set->g[i])) { - f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); - if (needSyz) { - cf = ppMult(cc,cf); - syz = cpMult(toSyzCoeff(cc),syz); - syz = ppAddv(syz,toSyzPoly(cg,grd,i)); - } - reduced = reduced1 = reduced2 = 1; /* yes */ - } - } + reduced2 = 0; /* no */ + for (i=0; isize; i++) { + if (f ISZERO) goto ss; + if ((*isReducible)(f,set->g[i])) { + f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); + if (needSyz) { + cf = ppMult(cc,cf); + syz = cpMult(toSyzCoeff(cc),syz); + syz = ppAddv(syz,toSyzPoly(cg,grd,i)); + } + reduced = reduced1 = reduced2 = 1; /* yes */ + } + } } while (reduced2 != 0); grd--; } }while (reduced1 != 0); - ss: ; + ss: ; if (needSyz) { syzp->cf = cf; /* cf is in the CurrentRingp */ syzp->syz = syz; /* syz is in the SyzRingp */ @@ -423,10 +450,10 @@ struct syz0 *syzp; /* set */ } POLY reductionCdr_gen(f,gset,needSyz,syzp) -POLY f; -struct gradedPolySet *gset; -int needSyz; -struct syz0 *syzp; /* set */ + POLY f; + struct gradedPolySet *gset; + int needSyz; + struct syz0 *syzp; /* set */ { int reduced,reduced1,reduced2; int grd; @@ -451,29 +478,29 @@ struct syz0 *syzp; /* set */ grd = 0; while (grd < gset->maxGrade) { if (!Sugar) { - if (grd > (*grade)(f)) break; + if (grd > (*grade)(f)) break; } set = gset->polys[grd]; do { - reduced2 = 0; /* no */ - for (i=0; isize; i++) { - if (f ISZERO) goto ss; - if ((fs =(*isCdrReducible)(f,set->g[i])) != ZERO) { - f = (*reduction1Cdr)(f,fs,set->g[i],needSyz,&cc,&cg); - if (needSyz) { - cf = ppMult(cc,cf); - syz = cpMult(toSyzCoeff(cc),syz); - syz = ppAddv(syz,toSyzPoly(cg,grd,i)); - } - reduced = reduced1 = reduced2 = 1; /* yes */ - } - } + reduced2 = 0; /* no */ + for (i=0; isize; i++) { + if (f ISZERO) goto ss; + if ((fs =(*isCdrReducible)(f,set->g[i])) != ZERO) { + f = (*reduction1Cdr)(f,fs,set->g[i],needSyz,&cc,&cg); + if (needSyz) { + cf = ppMult(cc,cf); + syz = cpMult(toSyzCoeff(cc),syz); + syz = ppAddv(syz,toSyzPoly(cg,grd,i)); + } + reduced = reduced1 = reduced2 = 1; /* yes */ + } + } } while (reduced2 != 0); grd++; } }while (reduced1 != 0); - ss: ; + ss: ; if (needSyz) { syzp->cf = cf; syzp->syz = syz; @@ -482,8 +509,8 @@ struct syz0 *syzp; /* set */ } int isReducible_gen(f,g) -POLY f; -POLY g; + POLY f; + POLY g; { int n,i; MONOMIAL tf; @@ -504,8 +531,8 @@ POLY g; } POLY isCdrReducible_gen(f,g) -POLY f; -POLY g; + POLY f; + POLY g; { while (f != POLYNULL) { if ((*isReducible)(f,g)) { @@ -517,8 +544,8 @@ POLY g; } POLY lcm_gen(f,g) -POLY f; -POLY g; + POLY f; + POLY g; { MONOMIAL tf,tg; MONOMIAL lcm; @@ -536,7 +563,7 @@ POLY g; } int grade_gen(f) -POLY f; + POLY f; { int r; int i,n; @@ -554,10 +581,10 @@ POLY f; /* constructors */ POLY toSyzPoly(cg,grd,index) -POLY cg; -int grd; -int index; -/* the result is read only. */ + POLY cg; + int grd; + int index; + /* the result is read only. */ { extern struct ring *SyzRingp; POLY r; @@ -568,7 +595,7 @@ int index; } struct coeff *toSyzCoeff(f) -POLY f; + POLY f; { extern struct ring *SyzRingp; struct coeff *c; @@ -612,3 +639,66 @@ void initSyzRingp() { SyzRingp->name = ringName; } +POLY reductionCdr_except_grd_i(POLY f,struct gradedPolySet *gset, + int needSyz,struct syz0 *syzp, + int skipGrd,int skipi, int *reducedp) +{ + int reduced,reduced1,reduced2; + int grd; + struct polySet *set; + POLY cf,syz; + int i; + POLY cc,cg; + POLY fs; + + extern struct ring *CurrentRingp; + struct ring *rp; + + *reducedp = 0; + if (needSyz) { + if (f ISZERO) { rp = CurrentRingp; } else {rp = f->m->ringp; } + cf = cxx(1,0,0,rp); + syz = ZERO; + } + + reduced = 0; /* no */ + do { + reduced1 = 0; /* no */ + grd = 0; + while (grd < gset->maxGrade) { + /* + if (!Sugar) { + if (grd > (*grade)(f)) break; + } + */ + set = gset->polys[grd]; + do { + reduced2 = 0; /* no */ + for (i=0; isize; i++) { + if (f ISZERO) goto ss; + if ((!((grd == skipGrd) && (i == skipi))) && (set->del[i]==0)) { + /* Do not use deleted element.*/ + if ((fs =(*isCdrReducible)(f,set->g[i])) != ZERO) { + f = (*reduction1Cdr)(f,fs,set->g[i],needSyz,&cc,&cg); + /* What is cg? */ + if (needSyz) { + cf = ppMult(cc,cf); + syz = cpMult(toSyzCoeff(cc),syz); + syz = ppAddv(syz,toSyzPoly(cg,grd,i)); + } + *reducedp = reduced = reduced1 = reduced2 = 1; /* yes */ + } + } + } + } while (reduced2 != 0); + grd++; + } + }while (reduced1 != 0); + + ss: ; + if (needSyz) { + syzp->cf = cf; + syzp->syz = syz; + } + return(f); +}