version 1.8, 2003/08/19 08:02:10 |
version 1.10, 2003/08/22 11:47:03 |
|
|
/* $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.9 2003/08/21 12:28:58 takayama Exp $ */ |
#include <stdio.h> |
#include <stdio.h> |
#include "datatype.h" |
#include "datatype.h" |
#include "stackm.h" |
#include "stackm.h" |
|
|
static void shell(int v[],int n); |
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 void shell(v,n) |
static void shell(v,n) |
Line 465 POLY POLYToInitW(f,w) |
|
Line 466 POLY POLYToInitW(f,w) |
|
return(node->next); |
return(node->next); |
} |
} |
|
|
|
static int degreeOfInitWS(f,w,s) |
|
POLY f; |
|
int w[]; |
|
int s[]; |
|
{ |
|
int n,i,dd; |
|
if (f ISZERO) { |
|
errorPoly("degreeOfInitWS(0,w) "); |
|
} |
|
n = f->m->ringp->n; dd = 0; |
|
for (i=0; i<n-1; i++) { |
|
dd += (f->m->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 node; |
|
struct listPoly nod; |
|
POLY h; |
|
POLY g; |
|
int maxd; |
|
int dd; |
|
node = &nod; node->next = POLYNULL; h = node; |
|
|
|
if (f ISZERO) return(f); |
|
maxd = degreeOfInitWS(f,w,s); |
|
g = pCopy(f); /* shallow copy */ |
|
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->next = g; |
|
h = h->next; |
|
} |
|
g = g->next; |
|
} |
|
h->next = POLYNULL; |
|
return(node->next); |
|
} |
|
|
|
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 |
1.The substitution "ringp->multiplication = ...." is allowed only in |
KsetUpRing(), so the check in KswitchFunction is not necessary. |
KsetUpRing(), so the check in KswitchFunction is not necessary. |
Line 539 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
Line 609 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
|
|
/* s->1 */ |
/* s->1 */ |
POLY goDeHomogenizeS(POLY f) { |
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),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 node; |
POLY lastf; |
POLY lastf; |
struct listPoly nod; |
struct listPoly nod; |
Line 546 POLY goDeHomogenizeS(POLY f) { |
|
Line 649 POLY goDeHomogenizeS(POLY f) { |
|
POLY tf; |
POLY tf; |
int gt,first; |
int gt,first; |
|
|
|
printf("1:[%s]\n",POLYToString(f,'*',1)); |
if (f == POLYNULL) return(POLYNULL); |
if (f == POLYNULL) return(POLYNULL); |
node = &nod; |
node = &nod; |
node->next = POLYNULL; |
node->next = POLYNULL; |
Line 575 POLY goDeHomogenizeS(POLY f) { |
|
Line 679 POLY goDeHomogenizeS(POLY f) { |
|
} |
} |
f = f->next; |
f = f->next; |
} |
} |
|
printf("2:[%s]\n",POLYToString(node->next,'*',1)); |
return (node->next); |
return (node->next); |
} |
} |
|
|