=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/poly4.c,v retrieving revision 1.5 retrieving revision 1.7 diff -u -p -r1.5 -r1.7 --- OpenXM/src/kan96xx/Kan/poly4.c 2003/07/10 08:20:04 1.5 +++ OpenXM/src/kan96xx/Kan/poly4.c 2003/07/19 06:03:57 1.7 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.4 2002/09/08 10:49:50 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.6 2003/07/17 07:33:03 takayama Exp $ */ #include #include "datatype.h" #include "stackm.h" @@ -508,6 +508,21 @@ int isTheSameRing(struct ring *rstack[],int rp, struct /* if (rrr->schreyer != newRingp->schreyer) { a=16; goto bbb ; }*/ if (newRingp->schreyer == 1) { a=16; goto bbb; } if (rrr->weightedHomogenization != newRingp->weightedHomogenization) { a=16; goto bbb; } + if (rrr->degreeShiftSize != newRingp->degreeShiftSize) { + a = 17; goto bbb; + } + if (rrr->degreeShiftN != newRingp->degreeShiftN) { + a = 17; goto bbb; + } + for (i=0; i < rrr->degreeShiftSize; i++) { + for (j=0; j< rrr->degreeShiftN; j++) { + if (rrr->degreeShift[i*(rrr->degreeShiftN)+j] != + newRingp->degreeShift[i*(rrr->degreeShiftN)+j]) { + a = 17; goto bbb; + } + } + } + /* The following fields are ignored. void *gbListTower; int *outputOrder; @@ -521,14 +536,56 @@ int isTheSameRing(struct ring *rstack[],int rp, struct } return(-1); } - + +/* s->1 */ +POLY goDeHomogenizeS(POLY f) { + POLY node; + POLY lastf; + struct listPoly nod; + POLY h; + POLY tf; + int gt,first; + + if (f == POLYNULL) return(POLYNULL); + node = &nod; + node->next = POLYNULL; + lastf = POLYNULL; + first = 1; + while (f != POLYNULL) { + tf = newCell(f->coeffp,monomialCopy(f->m)); + tf->m->e[0].x = 0; /* H, s variable in the G-O paper. */ + if (first) { + node->next = tf; + lastf = tf; + first = 0; + }else{ + gt = (*mmLarger)(lastf,tf); + if (gt == 1) { + lastf->next = tf; + lastf = tf; + }else{ + h = node->next; + h = ppAddv(h,tf); + node->next = h; + lastf = h; + while (lastf->next != POLYNULL) { + lastf = lastf->next; + } + } + } + f = f->next; + } + return (node->next); +} + /* Granger-Oaku's homogenization for the ecart tangent cone. Note: 2003.07.10. ds[] is the degree shift. ei ( element index ). If it is < 0, then e[n-1]->x will be used, else ei is used. + if onlyS is set to 1, then input is assumed to be (u,v)-h-homogeneous. */ -POLY goHomogenize(POLY f,int u[],int v[],int ds[],int dssize,int ei) +POLY goHomogenize(POLY f,int u[],int v[],int ds[],int dssize,int ei,int onlyS) { POLY node; POLY lastf; @@ -536,9 +593,14 @@ POLY goHomogenize(POLY f,int u[],int v[],int ds[],int POLY h; POLY tf; int gt,first,m,mp,t,tp,dsIdx,message; + struct ring *rp; 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; @@ -560,7 +622,9 @@ POLY goHomogenize(POLY f,int u[],int v[],int ds[],int /*go-debug fprintf(stderr,"Automatic dehomogenize and homogenize.\n"); */ message = 0; } - tf->m->e[0].D = -t; /* h */ + if (!onlyS) { + tf->m->e[0].D = -t; /* h */ + } tf->m->e[0].x = tp; /* H, s variable in the G-O paper. */ /*go-debug printf("t(h)=%d, tp(uv+ds)=%d\n",t,tp); */ if (first) { @@ -589,7 +653,7 @@ POLY goHomogenize(POLY f,int u[],int v[],int ds[],int /*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); */ - h->m->e[0].D += m; /* h */ + 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); */ h = h->next; @@ -598,7 +662,7 @@ POLY goHomogenize(POLY f,int u[],int v[],int ds[],int } /* u[] = -1, v[] = 1 */ -POLY goHomogenize11(POLY f,int ds[],int dssize,int ei) +POLY goHomogenize11(POLY f,int ds[],int dssize,int ei,int onlyS) { int r; int i,t,n,m,nn; @@ -622,14 +686,14 @@ POLY goHomogenize11(POLY f,int ds[],int dssize,int ei) u[i] = -1; v[i] = 1; } } - return(goHomogenize(f,u,v,ds,dssize,ei)); + return(goHomogenize(f,u,v,ds,dssize,ei,onlyS)); } -POLY goHomogenize_dsIdx(POLY f,int u[],int v[],int dsIdx,int ei) +POLY goHomogenize_dsIdx(POLY f,int u[],int v[],int dsIdx,int ei,int onlyS) { if (f == POLYNULL) return POLYNULL; } -POLY goHomogenize11_dsIdx(POLY f,int ds[],int dsIdx,int ei) +POLY goHomogenize11_dsIdx(POLY f,int ds[],int dsIdx,int ei,int onlyS) { if (f == POLYNULL) return POLYNULL; }