version 1.2, 2000/01/16 07:55:40 |
version 1.4, 2002/09/08 10:49:50 |
|
|
/* $OpenXM$ */ |
/* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.3 2001/05/04 01:06:25 takayama Exp $ */ |
#include <stdio.h> |
#include <stdio.h> |
#include "datatype.h" |
#include "datatype.h" |
#include "stackm.h" |
#include "stackm.h" |
Line 11 static int degreeOfInitW(POLY f,int w[]); |
|
Line 11 static int degreeOfInitW(POLY f,int w[]); |
|
|
|
|
|
static void shell(v,n) |
static void shell(v,n) |
int v[]; |
int v[]; |
int n; |
int n; |
{ |
{ |
int gap,i,j,temp; |
int gap,i,j,temp; |
|
|
for (gap = n/2; gap > 0; gap /= 2) { |
for (gap = n/2; gap > 0; gap /= 2) { |
for (i = gap; i<n; i++) { |
for (i = gap; i<n; i++) { |
for (j=i-gap ; j>=0 && v[j]<v[j+gap]; j -= gap) { |
for (j=i-gap ; j>=0 && v[j]<v[j+gap]; j -= gap) { |
temp = v[j]; |
temp = v[j]; |
v[j] = v[j+gap]; |
v[j] = v[j+gap]; |
v[j+gap] = temp; |
v[j+gap] = temp; |
} |
} |
} |
} |
} |
} |
|
|
|
|
|
|
struct matrixOfPOLY *parts(f,v) |
struct matrixOfPOLY *parts(f,v) |
POLY f; |
POLY f; |
POLY v; /* v must be a single variable, e.g. x */ |
POLY v; /* v must be a single variable, e.g. x */ |
{ |
{ |
struct matrixOfPOLY *evPoly; |
struct matrixOfPOLY *evPoly; |
int vi = 0; /* index of v */ |
int vi = 0; /* index of v */ |
Line 96 POLY v; /* v must be a single variable, e.g. x */ |
|
Line 96 POLY v; /* v must be a single variable, e.g. x */ |
|
ft = f; |
ft = f; |
while (ft != POLYNULL) { |
while (ft != POLYNULL) { |
if (vx) { |
if (vx) { |
if (ft->m->e[vi].x == ev[i]) { |
if (ft->m->e[vi].x == ev[i]) { |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
xset0(h,vi); /* touch monomial part, so you need to copy it above. */ |
xset0(h,vi); /* touch monomial part, so you need to copy it above. */ |
ans = ppAdd(ans,h); |
ans = ppAdd(ans,h); |
} |
} |
}else{ |
}else{ |
if (ft->m->e[vi].D == ev[i]) { |
if (ft->m->e[vi].D == ev[i]) { |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
dset0(h,vi); |
dset0(h,vi); |
ans = ppAdd(ans,h); |
ans = ppAdd(ans,h); |
} |
} |
} |
} |
ft = ft->next; |
ft = ft->next; |
} |
} |
Line 114 POLY v; /* v must be a single variable, e.g. x */ |
|
Line 114 POLY v; /* v must be a single variable, e.g. x */ |
|
} |
} |
return(evPoly); |
return(evPoly); |
} |
} |
|
|
struct object parts2(f,v) |
struct object parts2(f,v) |
POLY f; |
POLY f; |
POLY v; /* v must be a single variable, e.g. x */ |
POLY v; /* v must be a single variable, e.g. x */ |
{ |
{ |
struct matrixOfPOLY *evPoly; |
struct matrixOfPOLY *evPoly; |
int vi = 0; /* index of v */ |
int vi = 0; /* index of v */ |
Line 190 POLY v; /* v must be a single variable, e.g. x */ |
|
Line 190 POLY v; /* v must be a single variable, e.g. x */ |
|
ft = f; |
ft = f; |
while (ft != POLYNULL) { |
while (ft != POLYNULL) { |
if (vx) { |
if (vx) { |
if (ft->m->e[vi].x == ev[i]) { |
if (ft->m->e[vi].x == ev[i]) { |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
xset0(h,vi); /* touch monomial part, so you need to copy it above. */ |
xset0(h,vi); /* touch monomial part, so you need to copy it above. */ |
ans = ppAdd(ans,h); |
ans = ppAdd(ans,h); |
} |
} |
}else{ |
}else{ |
if (ft->m->e[vi].D == ev[i]) { |
if (ft->m->e[vi].D == ev[i]) { |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
h = newCell(ft->coeffp,monomialCopy(ft->m)); |
dset0(h,vi); |
dset0(h,vi); |
ans = ppAdd(ans,h); |
ans = ppAdd(ans,h); |
} |
} |
} |
} |
ft = ft->next; |
ft = ft->next; |
} |
} |
Line 216 POLY v; /* v must be a single variable, e.g. x */ |
|
Line 216 POLY v; /* v must be a single variable, e.g. x */ |
|
putoa(rob,0,ob1); putoa(rob,1,ob2); |
putoa(rob,0,ob1); putoa(rob,1,ob2); |
return(rob); |
return(rob); |
} |
} |
|
|
int pDegreeWrtV(f,v) |
int pDegreeWrtV(f,v) |
POLY f; |
POLY f; |
POLY v; |
POLY v; |
{ |
{ |
int vx = 1; |
int vx = 1; |
int vi = 0; |
int vi = 0; |
Line 299 int containVectorVariable(POLY f) |
|
Line 299 int containVectorVariable(POLY f) |
|
} |
} |
|
|
POLY homogenize(f) |
POLY homogenize(f) |
POLY f; |
POLY f; |
/* homogenize by using (*grade)(f) */ |
/* homogenize by using (*grade)(f) */ |
{ |
{ |
POLY t; |
POLY t; |
int maxg; |
int maxg; |
|
|
} |
} |
|
|
int isHomogenized(f) |
int isHomogenized(f) |
POLY f; |
POLY f; |
{ |
{ |
POLY t; |
POLY t; |
extern int Homogenize_vec; |
extern int Homogenize_vec; |
int maxg; |
int maxg; |
if (!Homogenize_vec) return(isHomogenized_vec(f)); |
if (!Homogenize_vec) return(isHomogenized_vec(f)); |
if (f == ZERO) return(1); |
if (f == ZERO) return(1); |
|
if (f->m->ringp->weightedHomogenization) { |
|
return 1; /* BUG: do not chech in case of one-zero homogenization */ |
|
} |
maxg = (*grade)(f); |
maxg = (*grade)(f); |
t = f; |
t = f; |
while (t != POLYNULL) { |
while (t != POLYNULL) { |
|
|
} |
} |
|
|
int isHomogenized_vec(f) |
int isHomogenized_vec(f) |
POLY f; |
POLY f; |
{ |
{ |
/* This is not efficient version. *grade should be grade_module1v(). */ |
/* This is not efficient version. *grade should be grade_module1v(). */ |
POLY t; |
POLY t; |
int ggg; |
int ggg; |
if (f == ZERO) return(1); |
if (f == ZERO) return(1); |
|
if (f->m->ringp->weightedHomogenization) { |
|
return 1; /* BUG: do not chech in case of one-zero homogenization */ |
|
} |
while (f != POLYNULL) { |
while (f != POLYNULL) { |
t = f; |
t = f; |
ggg = (*grade)(f); |
ggg = (*grade)(f); |
while (t != POLYNULL) { |
while (t != POLYNULL) { |
if ((*isSameComponent)(f,t)) { |
if ((*isSameComponent)(f,t)) { |
if (ggg != (*grade)(t)) return(0); |
if (ggg != (*grade)(t)) return(0); |
} |
} |
t = t->next; |
t = t->next; |
} |
} |
|
|
|
|
|
|
static int degreeOfPrincipalPart(f) |
static int degreeOfPrincipalPart(f) |
POLY f; |
POLY f; |
{ |
{ |
int n,i,dd; |
int n,i,dd; |
if (f ISZERO) return(0); |
if (f ISZERO) return(0); |
|
|
} |
} |
|
|
POLY POLYToPrincipalPart(f) |
POLY POLYToPrincipalPart(f) |
POLY f; |
POLY f; |
{ |
{ |
POLY node; |
POLY node; |
struct listPoly nod; |
struct listPoly nod; |
|
|
} |
} |
|
|
static int degreeOfInitW(f,w) |
static int degreeOfInitW(f,w) |
POLY f; |
POLY f; |
int w[]; |
int w[]; |
{ |
{ |
int n,i,dd; |
int n,i,dd; |
if (f ISZERO) { |
if (f ISZERO) { |
|
|
} |
} |
|
|
POLY POLYToInitW(f,w) |
POLY POLYToInitW(f,w) |
POLY f; |
POLY f; |
int w[]; /* weight vector */ |
int w[]; /* weight vector */ |
{ |
{ |
POLY node; |
POLY node; |
struct listPoly nod; |
struct listPoly nod; |
Line 493 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
Line 499 int isTheSameRing(struct ring *rstack[],int rp, struct |
|
if (rrr->orderMatrixSize != newRingp->orderMatrixSize) { a=12; goto bbb ; } |
if (rrr->orderMatrixSize != newRingp->orderMatrixSize) { a=12; goto bbb ; } |
for (i=0; i<rrr->orderMatrixSize; i++) { |
for (i=0; i<rrr->orderMatrixSize; i++) { |
for (j=0; j<2*(rrr->n); j++) { |
for (j=0; j<2*(rrr->n); j++) { |
if (rrr->order[i*2*(rrr->n)+j] != newRingp->order[i*2*(rrr->n)+j]) |
if (rrr->order[i*2*(rrr->n)+j] != newRingp->order[i*2*(rrr->n)+j]) |
{ a=13; goto bbb ; } |
{ a=13; goto bbb ; } |
} |
} |
} |
} |
if (rrr->next != newRingp->next) { a=14; goto bbb ; } |
if (rrr->next != newRingp->next) { a=14; goto bbb ; } |
if (rrr->multiplication != newRingp->multiplication) { a=15; goto bbb ; } |
if (rrr->multiplication != newRingp->multiplication) { a=15; goto bbb ; } |
/* 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; } |
/* The following fields are ignored. |
/* The following fields are ignored. |
void *gbListTower; |
void *gbListTower; |
int *outputOrder; |
int *outputOrder; |