=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/poly4.c,v retrieving revision 1.8 retrieving revision 1.15 diff -u -p -r1.8 -r1.15 --- OpenXM/src/kan96xx/Kan/poly4.c 2003/08/19 08:02:10 1.8 +++ OpenXM/src/kan96xx/Kan/poly4.c 2005/06/16 05:07:23 1.15 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.7 2003/07/19 06:03:57 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.14 2004/07/29 08:13:42 takayama Exp $ */ #include #include "datatype.h" #include "stackm.h" @@ -8,8 +8,10 @@ static void shell(int v[],int n); static int degreeOfPrincipalPart(POLY f); static int degreeOfInitW(POLY f,int w[]); +static int degreeOfInitWS(POLY f,int w[],int s[]); +static int dDegree(POLY f); +static POLY dHomogenize(POLY f); - static void shell(v,n) int v[]; int n; @@ -39,7 +41,7 @@ struct matrixOfPOLY *parts(f,v) int *ev; struct object *evList; struct object *list; - struct object ob; + struct object ob = OINIT; POLY ans; POLY h; extern struct ring *CurrentRingp; @@ -126,11 +128,13 @@ struct object parts2(f,v) int *ev; struct object *evList; struct object *list; - struct object ob; + struct object ob = OINIT; POLY ans; POLY h; POLY ft; - struct object ob1,ob2,rob; + struct object ob1 = OINIT; + struct object ob2 = OINIT; + struct object rob = OINIT; if (f ISZERO || v ISZERO) { @@ -305,8 +309,12 @@ POLY homogenize(f) POLY t; int maxg; int flag,d; + extern int Homogenize; if (f == ZERO) return(f); + if (Homogenize == 3) { /* double homogenization Dx x = x Dx + h H */ + return dHomogenize(f); + } t = f; maxg = (*grade)(f); flag = 0; while (t != POLYNULL) { d = (*grade)(t); @@ -374,7 +382,73 @@ int isHomogenized_vec(f) return(1); } +static POLY dHomogenize(f) +POLY f; +{ + POLY t; + int maxg, maxdg; + int flag,d,dd,neg; + if (f == ZERO) return(f); + + t = f; + maxg = (*grade)(f); + while (t != POLYNULL) { + dd = (*grade)(t); + if (maxg < dd) maxg = dd; + t = t->next; + } + /* fprintf(stderr,"maxg=%d\n",maxg); */ + + t = f; + maxdg = dDegree(f); + while (t != POLYNULL) { + dd = dDegree(t); + if (maxdg < dd) maxdg = dd; + t = t->next; + } + /* fprintf(stderr,"maxdg=%d\n",maxdg); */ + + t = f; + flag = 0; + while (t != POLYNULL) { + d = (*grade)(t); + if (d != maxg) flag = 1; + if (d > maxg) { + maxg = d; + } + d = dDegree(f); + if (d > maxdg) { + maxdg = d; + } + t = t->next; + } + if (flag == 0) return(f); + + t = f; neg = 0; + while (t != POLYNULL) { + d = (*grade)(t); + dd = dDegree(t); + if (maxg-d-(maxdg-dd) < neg) { + neg = maxg-d-(maxdg-dd); + } + t = t->next; + } + neg = -neg; + + f = pmCopy(f); /* You can rewrite the monomial parts */ + t = f; + while (t != POLYNULL) { + d = (*grade)(t); + dd = dDegree(t); + t->m->e[0].D += maxdg-dd; /* h */ + t->m->e[0].x += maxg-d-(maxdg-dd)+neg; /* Multiply H */ + /* example Dx^2+Dx+x */ + t = t->next; + } + return(f); +} + static int degreeOfPrincipalPart(f) POLY f; { @@ -387,6 +461,19 @@ static int degreeOfPrincipalPart(f) } return(dd); } + +static int dDegree(f) + POLY f; +{ + int nn,i,dd,m; + if (f ISZERO) return(0); + nn = f->m->ringp->nn; dd = 0; + m = f->m->ringp->m; + for (i=m; im->e[i].D; + } + return(dd); +} POLY POLYToPrincipalPart(f) POLY f; @@ -437,17 +524,16 @@ POLY POLYToInitW(f,w) POLY f; int w[]; /* weight vector */ { - POLY node; - struct listPoly nod; POLY h; POLY g; int maxd; int dd; - node = &nod; node->next = POLYNULL; h = node; + h = POLYNULL; + /*printf("1:%s\n",POLYToString(f,'*',1));*/ if (f ISZERO) return(f); maxd = degreeOfInitW(f,w); - g = pCopy(f); /* shallow copy */ + g = f; while (!(f ISZERO)) { dd = degreeOfInitW(f,w); if (dd > maxd) maxd = dd; @@ -456,16 +542,83 @@ POLY POLYToInitW(f,w) while (!(g ISZERO)) { dd = degreeOfInitW(g,w); if (dd == maxd) { - h->next = g; - h = h->next; + h = ppAdd(h,newCell(g->coeffp,g->m)); /* it might be slow. */ } g = g->next; } - h->next = POLYNULL; - return(node->next); + /*printf("2:%s\n",POLYToString(h,'*',1));*/ + return(h); } +static int degreeOfInitWS(f,w,s) + POLY f; + int w[]; + int s[]; +{ + int n,i,dd; + if (f ISZERO) { + errorPoly("degreeOfInitWS(0,w) "); + } + if (s == (int *) NULL) return degreeOfInitW(f,w); + n = f->m->ringp->n; dd = 0; + for (i=0; im->e[i].D)*w[n+i]; + dd += (f->m->e[i].x)*w[i]; + } + dd += s[(f->m->e[n-1].x)]; + return(dd); +} +POLY POLYToInitWS(f,w,s) + POLY f; + int w[]; /* weight vector */ + int s[]; /* shift vector */ +{ + POLY h; + POLY g; + int maxd; + int dd; + h = POLYNULL; + + /*printf("1s:%s\n",POLYToString(f,'*',1));*/ + if (f ISZERO) return(f); + maxd = degreeOfInitWS(f,w,s); + g = f; + while (!(f ISZERO)) { + dd = degreeOfInitWS(f,w,s); + if (dd > maxd) maxd = dd; + f = f->next; + } + while (!(g ISZERO)) { + dd = degreeOfInitWS(g,w,s); + if (dd == maxd) { + h = ppAdd(h,newCell(g->coeffp,g->m)); /* it might be slow. */ + } + g = g->next; + } + /*printf("2s:%s\n",POLYToString(h,'*',1));*/ + return(h); +} + +int ordWsAll(f,w,s) + POLY f; + int w[]; /* weight vector */ + int s[]; /* shift vector */ +{ + int maxd; + int dd; + + if (f ISZERO) errorPoly("ordWsAll(0,w,s) "); + maxd = degreeOfInitWS(f,w,s); + while (!(f ISZERO)) { + dd = degreeOfInitWS(f,w,s); + if (dd > maxd) maxd = dd; + f = f->next; + } + return maxd; +} + + /* 1.The substitution "ringp->multiplication = ...." is allowed only in KsetUpRing(), so the check in KswitchFunction is not necessary. @@ -539,6 +692,39 @@ int isTheSameRing(struct ring *rstack[],int rp, struct /* s->1 */ POLY goDeHomogenizeS(POLY f) { + POLY lRule[1]; + POLY rRule[1]; + struct ring *rp; + POLY ans; + /* printf("1:[%s]\n",POLYToString(f,'*',1)); */ + if (f == POLYNULL) return f; + rp = f->m->ringp; + if (rp->next == NULL) { + lRule[0] = cxx(1,0,1,rp); + rRule[0] = cxx(1,0,0,rp); + ans=replace(f,lRule,rRule,1); + }else{ + struct coeff *cp; + POLY t; + POLY nc; + ans = POLYNULL; + while (f != POLYNULL) { + cp = f->coeffp; + if (cp->tag == POLY_COEFF) { + t = goDeHomogenizeS((cp->val).f); + nc = newCell(polyToCoeff(t,f->m->ringp),monomialCopy(f->m)); + ans = ppAddv(ans,nc); + f = f->next; + }else{ + ans = f; break; + } + } + } + /* printf("2:[%s]\n",POLYToString(ans,'*',1)); */ + return ans; +} + +POLY goDeHomogenizeS_buggy(POLY f) { POLY node; POLY lastf; struct listPoly nod; @@ -546,6 +732,7 @@ POLY goDeHomogenizeS(POLY f) { POLY tf; int gt,first; + printf("1:[%s]\n",POLYToString(f,'*',1)); if (f == POLYNULL) return(POLYNULL); node = &nod; node->next = POLYNULL; @@ -575,6 +762,7 @@ POLY goDeHomogenizeS(POLY f) { } f = f->next; } + printf("2:[%s]\n",POLYToString(node->next,'*',1)); return (node->next); } @@ -598,9 +786,11 @@ POLY goHomogenize(POLY f,int u[],int v[],int ds[],int message = 1; if (f == POLYNULL) return(POLYNULL); rp = f->m->ringp; + /* if ((rp->degreeShiftSize == 0) && (dssize > 0)) { warningPoly("You are trying to homogenize a polynomial with degree shift. However, the polynomial belongs to the ring without degreeShift option. It may cause a trouble in comparison in free module.\n"); } + */ node = &nod; node->next = POLYNULL; lastf = POLYNULL; @@ -652,7 +842,7 @@ POLY goHomogenize(POLY f,int u[],int v[],int ds[],int h = node->next; /*go-debug printf("m=%d, mp=%d\n",m,mp); */ while (h != POLYNULL) { - /*go-debug printf("Old: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x); */ + /*go-debug printf("Old: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x); */ if (!onlyS) h->m->e[0].D += m; /* h */ h->m->e[0].x += -mp; /* H, s*/ /*go-debug printf("New: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x); */