| version 1.5, 2003/07/10 08:20:04 |
version 1.7, 2003/07/19 06:03:57 |
|
|
| /* $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 <stdio.h> |
#include <stdio.h> |
| #include "datatype.h" |
#include "datatype.h" |
| #include "stackm.h" |
#include "stackm.h" |
| Line 508 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
| Line 508 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
| /* if (rrr->schreyer != newRingp->schreyer) { a=16; goto bbb ; }*/ |
/* if (rrr->schreyer != newRingp->schreyer) { a=16; goto bbb ; }*/ |
| if (newRingp->schreyer == 1) { a=16; goto bbb; } |
if (newRingp->schreyer == 1) { a=16; goto bbb; } |
| if (rrr->weightedHomogenization != newRingp->weightedHomogenization) { 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. |
/* The following fields are ignored. |
| void *gbListTower; |
void *gbListTower; |
| int *outputOrder; |
int *outputOrder; |
| Line 521 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
| Line 536 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
| } |
} |
| return(-1); |
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. |
/* Granger-Oaku's homogenization for the ecart tangent cone. |
| Note: 2003.07.10. |
Note: 2003.07.10. |
| ds[] is the degree shift. |
ds[] is the degree shift. |
| ei ( element index ). If it is < 0, then e[n-1]->x will be used, |
ei ( element index ). If it is < 0, then e[n-1]->x will be used, |
| else ei is 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 node; |
| POLY lastf; |
POLY lastf; |
| Line 536 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| Line 593 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| POLY h; |
POLY h; |
| POLY tf; |
POLY tf; |
| int gt,first,m,mp,t,tp,dsIdx,message; |
int gt,first,m,mp,t,tp,dsIdx,message; |
| |
struct ring *rp; |
| |
|
| message = 1; |
message = 1; |
| if (f == POLYNULL) return(POLYNULL); |
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 = &nod; |
| node->next = POLYNULL; |
node->next = POLYNULL; |
| lastf = POLYNULL; |
lastf = POLYNULL; |
| Line 560 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| Line 622 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| /*go-debug fprintf(stderr,"Automatic dehomogenize and homogenize.\n"); */ |
/*go-debug fprintf(stderr,"Automatic dehomogenize and homogenize.\n"); */ |
| message = 0; |
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. */ |
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); */ |
/*go-debug printf("t(h)=%d, tp(uv+ds)=%d\n",t,tp); */ |
| if (first) { |
if (first) { |
| Line 589 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| Line 653 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| /*go-debug printf("m=%d, mp=%d\n",m,mp); */ |
/*go-debug printf("m=%d, mp=%d\n",m,mp); */ |
| while (h != POLYNULL) { |
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); */ |
| h->m->e[0].D += m; /* h */ |
if (!onlyS) h->m->e[0].D += m; /* h */ |
| h->m->e[0].x += -mp; /* H, s*/ |
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); */ |
/*go-debug printf("New: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x); */ |
| h = h->next; |
h = h->next; |
| Line 598 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| Line 662 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| } |
} |
| |
|
| /* u[] = -1, v[] = 1 */ |
/* 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 r; |
| int i,t,n,m,nn; |
int i,t,n,m,nn; |
| Line 622 POLY goHomogenize11(POLY f,int ds[],int dssize,int ei) |
|
| Line 686 POLY goHomogenize11(POLY f,int ds[],int dssize,int ei) |
|
| u[i] = -1; v[i] = 1; |
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; |
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; |
if (f == POLYNULL) return POLYNULL; |
| } |
} |