=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/poly4.c,v retrieving revision 1.11 retrieving revision 1.13 diff -u -p -r1.11 -r1.13 --- OpenXM/src/kan96xx/Kan/poly4.c 2003/08/23 02:28:38 1.11 +++ OpenXM/src/kan96xx/Kan/poly4.c 2004/06/12 07:29:46 1.13 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.10 2003/08/22 11:47:03 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.12 2003/08/24 05:19:42 takayama Exp $ */ #include #include "datatype.h" #include "stackm.h" @@ -9,8 +9,9 @@ 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; @@ -306,8 +307,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); @@ -375,7 +380,54 @@ 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); flag = 0; + maxdg = dDegree(f); + 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; { @@ -388,6 +440,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; @@ -700,9 +765,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; @@ -754,7 +821,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); */