| version 1.11, 2003/08/23 02:28:38 |
version 1.14, 2004/07/29 08:13:42 |
|
|
| /* $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.13 2004/06/12 07:29:46 takayama Exp $ */ |
| #include <stdio.h> |
#include <stdio.h> |
| #include "datatype.h" |
#include "datatype.h" |
| #include "stackm.h" |
#include "stackm.h" |
| Line 9 static void shell(int v[],int n); |
|
| Line 9 static void shell(int v[],int n); |
|
| static int degreeOfPrincipalPart(POLY f); |
static int degreeOfPrincipalPart(POLY f); |
| static int degreeOfInitW(POLY f,int w[]); |
static int degreeOfInitW(POLY f,int w[]); |
| static int degreeOfInitWS(POLY f,int w[],int s[]); |
static int degreeOfInitWS(POLY f,int w[],int s[]); |
| |
static int dDegree(POLY f); |
| |
static POLY dHomogenize(POLY f); |
| |
|
| |
|
| static void shell(v,n) |
static void shell(v,n) |
| int v[]; |
int v[]; |
| int n; |
int n; |
| Line 306 POLY homogenize(f) |
|
| Line 307 POLY homogenize(f) |
|
| POLY t; |
POLY t; |
| int maxg; |
int maxg; |
| int flag,d; |
int flag,d; |
| |
extern int Homogenize; |
| |
|
| if (f == ZERO) return(f); |
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; |
t = f; maxg = (*grade)(f); flag = 0; |
| while (t != POLYNULL) { |
while (t != POLYNULL) { |
| d = (*grade)(t); |
d = (*grade)(t); |
| Line 375 int isHomogenized_vec(f) |
|
| Line 380 int isHomogenized_vec(f) |
|
| return(1); |
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) |
static int degreeOfPrincipalPart(f) |
| POLY f; |
POLY f; |
| { |
{ |
| Line 388 static int degreeOfPrincipalPart(f) |
|
| Line 459 static int degreeOfPrincipalPart(f) |
|
| } |
} |
| return(dd); |
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; i<nn; i++) { |
| |
dd += f->m->e[i].D; |
| |
} |
| |
return(dd); |
| |
} |
| |
|
| POLY POLYToPrincipalPart(f) |
POLY POLYToPrincipalPart(f) |
| POLY f; |
POLY f; |
| Line 700 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| Line 784 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| message = 1; |
message = 1; |
| if (f == POLYNULL) return(POLYNULL); |
if (f == POLYNULL) return(POLYNULL); |
| rp = f->m->ringp; |
rp = f->m->ringp; |
| |
/* |
| if ((rp->degreeShiftSize == 0) && (dssize > 0)) { |
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"); |
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 754 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| Line 840 POLY goHomogenize(POLY f,int u[],int v[],int ds[],int |
|
| h = node->next; |
h = node->next; |
| /*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); */ |
| if (!onlyS) 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); */ |