version 1.1, 1999/10/08 02:12:02 |
version 1.4, 2001/05/04 01:06:25 |
|
|
|
/* $OpenXM: OpenXM/src/kan96xx/Kan/red.c,v 1.3 2000/02/24 00:27:12 takayama Exp $ */ |
#include <stdio.h> |
#include <stdio.h> |
#include "datatype.h" |
#include "datatype.h" |
#include "extern2.h" |
#include "extern2.h" |
Line 9 int DebugReductionRed = 0; |
|
Line 10 int DebugReductionRed = 0; |
|
extern int Sugar; |
extern int Sugar; |
|
|
struct spValue sp_gen(f,g) |
struct spValue sp_gen(f,g) |
POLY f; |
POLY f; |
POLY g; |
POLY g; |
/* the results may be rewritten. */ |
/* the results may be rewritten. */ |
{ |
{ |
struct spValue r; |
struct spValue r; |
POLY a; |
POLY a; |
|
|
if (ell-c > 0) { /* q-case */ |
if (ell-c > 0) { /* q-case */ |
amodify = 0; |
amodify = 0; |
for (i=c; i<ell; i++) { |
for (i=c; i<ell; i++) { |
amodify += (tb->e[i].D)*(tg->e[i].x); |
amodify += (tb->e[i].D)*(tg->e[i].x); |
} |
} |
bmodify = 0; |
bmodify = 0; |
for (i=c; i<ell; i++) { |
for (i=c; i<ell; i++) { |
bmodify += (ta->e[i].D)*(tf->e[i].x); |
bmodify += (ta->e[i].D)*(tf->e[i].x); |
} |
} |
if (amodify > bmodify) { |
if (amodify > bmodify) { |
amodify = amodify-bmodify; |
amodify = amodify-bmodify; |
bmodify = 0; |
bmodify = 0; |
}else{ |
}else{ |
bmodify = bmodify - amodify; |
bmodify = bmodify - amodify; |
amodify = 0; |
amodify = 0; |
} |
} |
} |
} |
if (amodify) { |
if (amodify) { |
|
|
|
|
|
|
POLY reduction1_gen_debug(f,g,needSyz,c,h) |
POLY reduction1_gen_debug(f,g,needSyz,c,h) |
POLY f; |
POLY f; |
POLY g; |
POLY g; |
int needSyz; |
int needSyz; |
POLY *c; /* set */ |
POLY *c; /* set */ |
POLY *h; /* set */ |
POLY *h; /* set */ |
/* f must be reducible by g. r = c*f + h*g */ |
/* f must be reducible by g. r = c*f + h*g */ |
{ |
{ |
extern struct ring *CurrentRingp; |
extern struct ring *CurrentRingp; |
struct ring *rp; |
struct ring *rp; |
Line 146 POLY *h; /* set */ |
|
Line 147 POLY *h; /* set */ |
|
printf("error in reduction1."); |
printf("error in reduction1."); |
printf("f=%s --> f2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
printf("f=%s --> f2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
printf("f2 = (%s)*f+(%s)*(%s)\n",POLYToString(sv.a,'*',1), |
printf("f2 = (%s)*f+(%s)*(%s)\n",POLYToString(sv.a,'*',1), |
POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); |
POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); |
getchar(); |
getchar(); |
getchar(); |
getchar(); |
} |
} |
Line 170 POLY *h; /* set */ |
|
Line 171 POLY *h; /* set */ |
|
if (!isOrdered(f)) { |
if (!isOrdered(f)) { |
printf("\nf is not ordered polynomial."); |
printf("\nf is not ordered polynomial."); |
}else if (!isOrdered(f)) { |
}else if (!isOrdered(f)) { |
printf("\nf2 is not ordered polynomial."); |
printf("\nf2 is not ordered polynomial."); |
} |
} |
printf("f=%s,\nf2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
printf("f=%s,\nf2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
getchar(); |
getchar(); |
Line 181 POLY *h; /* set */ |
|
Line 182 POLY *h; /* set */ |
|
printf("error in reduction1."); |
printf("error in reduction1."); |
printf("f=%s --> f2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
printf("f=%s --> f2=%s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
printf("f2 = (%s)*f+(%s)*(%s)\n",POLYToString(sv.a,'*',1), |
printf("f2 = (%s)*f+(%s)*(%s)\n",POLYToString(sv.a,'*',1), |
POLYToString(sv.b,'*',1), |
POLYToString(sv.b,'*',1), |
POLYToString(g,'*',1)); |
POLYToString(g,'*',1)); |
getchar(); |
getchar(); |
getchar(); |
getchar(); |
} |
} |
Line 196 POLY *h; /* set */ |
|
Line 197 POLY *h; /* set */ |
|
} |
} |
|
|
POLY reduction1_gen(f,g,needSyz,c,h) |
POLY reduction1_gen(f,g,needSyz,c,h) |
POLY f; |
POLY f; |
POLY g; |
POLY g; |
int needSyz; |
int needSyz; |
POLY *c; /* set */ |
POLY *c; /* set */ |
POLY *h; /* set */ |
POLY *h; /* set */ |
/* f must be reducible by g. r = c*f + h*g */ |
/* f must be reducible by g. r = c*f + h*g */ |
{ |
{ |
extern struct ring *CurrentRingp; |
extern struct ring *CurrentRingp; |
struct ring *rp; |
struct ring *rp; |
Line 219 POLY *h; /* set */ |
|
Line 220 POLY *h; /* set */ |
|
f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g)); |
f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g)); |
if (DebugReductionRed) { |
if (DebugReductionRed) { |
printf("c=%s, d=%s, g=%s: f --> c*f + d*g.\n", |
printf("c=%s, d=%s, g=%s: f --> c*f + d*g.\n", |
POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); |
POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); |
printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
} |
} |
f = f2; |
f = f2; |
Line 233 POLY *h; /* set */ |
|
Line 234 POLY *h; /* set */ |
|
f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g)); |
f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g)); |
if (DebugReductionRed) { |
if (DebugReductionRed) { |
printf("! c=%s, d=%s, g=%s: f --> c*f + d*g.\n", |
printf("! c=%s, d=%s, g=%s: f --> c*f + d*g.\n", |
POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); |
POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1)); |
printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1)); |
} |
} |
f = f2; |
f = f2; |
Line 246 POLY *h; /* set */ |
|
Line 247 POLY *h; /* set */ |
|
} |
} |
|
|
POLY reduction1Cdr_gen(f,fs,g,needSyz,c,h) |
POLY reduction1Cdr_gen(f,fs,g,needSyz,c,h) |
POLY f; |
POLY f; |
POLY fs; |
POLY fs; |
POLY g; |
POLY g; |
int needSyz; |
int needSyz; |
POLY *c; /* set */ |
POLY *c; /* set */ |
POLY *h; /* set */ |
POLY *h; /* set */ |
/* f must be reducible by g. r = c*f + h*g */ |
/* f must be reducible by g. r = c*f + h*g */ |
{ |
{ |
extern struct ring *CurrentRingp; |
extern struct ring *CurrentRingp; |
struct ring *rp; |
struct ring *rp; |
Line 296 POLY *h; /* set */ |
|
Line 297 POLY *h; /* set */ |
|
|
|
/* for debug */ |
/* for debug */ |
int isOrdered(f) |
int isOrdered(f) |
POLY f; |
POLY f; |
{ POLY g; |
{ POLY g; |
if (f ISZERO) return(1); |
if (f ISZERO) return(1); |
g = f->next; |
g = f->next; |
while (g != POLYNULL) { |
while (g != POLYNULL) { |
if ((*mmLarger)(g,f)>=1) return(0); |
if ((*mmLarger)(g,f)>=1) return(0); |
f = g; |
f = g; |
g = f->next; |
g = f->next; |
} |
} |
return(1); |
return(1); |
} |
} |
|
|
|
|
POLY reduction_gen(f,gset,needSyz,syzp) |
POLY reduction_gen(f,gset,needSyz,syzp) |
POLY f; |
POLY f; |
struct gradedPolySet *gset; |
struct gradedPolySet *gset; |
int needSyz; |
int needSyz; |
struct syz0 *syzp; /* set */ |
struct syz0 *syzp; /* set */ |
{ |
{ |
int reduced,reduced1,reduced2; |
int reduced,reduced1,reduced2; |
int grd; |
int grd; |
Line 337 struct syz0 *syzp; /* set */ |
|
Line 338 struct syz0 *syzp; /* set */ |
|
grd = 0; |
grd = 0; |
while (grd < gset->maxGrade) { |
while (grd < gset->maxGrade) { |
if (!Sugar) { |
if (!Sugar) { |
if (grd > (*grade)(f)) break; |
if (grd > (*grade)(f)) break; |
} |
} |
set = gset->polys[grd]; |
set = gset->polys[grd]; |
do { |
do { |
reduced2 = 0; /* no */ |
reduced2 = 0; /* no */ |
for (i=0; i<set->size; i++) { |
for (i=0; i<set->size; i++) { |
if (f ISZERO) goto ss; |
if (f ISZERO) goto ss; |
if ((*isReducible)(f,set->g[i])) { |
if ((*isReducible)(f,set->g[i])) { |
f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); |
f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); |
if (needSyz) { |
if (needSyz) { |
cf = ppMult(cc,cf); |
cf = ppMult(cc,cf); |
syz = cpMult(toSyzCoeff(cc),syz); |
syz = cpMult(toSyzCoeff(cc),syz); |
syz = ppAddv(syz,toSyzPoly(cg,grd,i)); |
syz = ppAddv(syz,toSyzPoly(cg,grd,i)); |
} |
} |
reduced = reduced1 = reduced2 = 1; /* yes */ |
reduced = reduced1 = reduced2 = 1; /* yes */ |
} |
} |
} |
} |
} while (reduced2 != 0); |
} while (reduced2 != 0); |
grd++; |
grd++; |
} |
} |
}while (reduced1 != 0); |
}while (reduced1 != 0); |
|
|
ss: ; |
ss: ; |
if (needSyz) { |
if (needSyz) { |
syzp->cf = cf; /* cf is in the CurrentRingp */ |
syzp->cf = cf; /* cf is in the CurrentRingp */ |
syzp->syz = syz; /* syz is in the SyzRingp */ |
syzp->syz = syz; /* syz is in the SyzRingp */ |
Line 368 struct syz0 *syzp; /* set */ |
|
Line 369 struct syz0 *syzp; /* set */ |
|
} |
} |
|
|
POLY reduction_gen_rev(f,gset,needSyz,syzp) |
POLY reduction_gen_rev(f,gset,needSyz,syzp) |
POLY f; |
POLY f; |
struct gradedPolySet *gset; |
struct gradedPolySet *gset; |
int needSyz; |
int needSyz; |
struct syz0 *syzp; /* set */ |
struct syz0 *syzp; /* set */ |
{ |
{ |
int reduced,reduced1,reduced2; |
int reduced,reduced1,reduced2; |
int grd; |
int grd; |
Line 396 struct syz0 *syzp; /* set */ |
|
Line 397 struct syz0 *syzp; /* set */ |
|
while (grd >= 0) { /* reverse order for reduction */ |
while (grd >= 0) { /* reverse order for reduction */ |
set = gset->polys[grd]; |
set = gset->polys[grd]; |
do { |
do { |
reduced2 = 0; /* no */ |
reduced2 = 0; /* no */ |
for (i=0; i<set->size; i++) { |
for (i=0; i<set->size; i++) { |
if (f ISZERO) goto ss; |
if (f ISZERO) goto ss; |
if ((*isReducible)(f,set->g[i])) { |
if ((*isReducible)(f,set->g[i])) { |
f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); |
f = (*reduction1)(f,set->g[i],needSyz,&cc,&cg); |
if (needSyz) { |
if (needSyz) { |
cf = ppMult(cc,cf); |
cf = ppMult(cc,cf); |
syz = cpMult(toSyzCoeff(cc),syz); |
syz = cpMult(toSyzCoeff(cc),syz); |
syz = ppAddv(syz,toSyzPoly(cg,grd,i)); |
syz = ppAddv(syz,toSyzPoly(cg,grd,i)); |
} |
} |
reduced = reduced1 = reduced2 = 1; /* yes */ |
reduced = reduced1 = reduced2 = 1; /* yes */ |
} |
} |
} |
} |
} while (reduced2 != 0); |
} while (reduced2 != 0); |
grd--; |
grd--; |
} |
} |
}while (reduced1 != 0); |
}while (reduced1 != 0); |
|
|
ss: ; |
ss: ; |
if (needSyz) { |
if (needSyz) { |
syzp->cf = cf; /* cf is in the CurrentRingp */ |
syzp->cf = cf; /* cf is in the CurrentRingp */ |
syzp->syz = syz; /* syz is in the SyzRingp */ |
syzp->syz = syz; /* syz is in the SyzRingp */ |
Line 423 struct syz0 *syzp; /* set */ |
|
Line 424 struct syz0 *syzp; /* set */ |
|
} |
} |
|
|
POLY reductionCdr_gen(f,gset,needSyz,syzp) |
POLY reductionCdr_gen(f,gset,needSyz,syzp) |
POLY f; |
POLY f; |
struct gradedPolySet *gset; |
struct gradedPolySet *gset; |
int needSyz; |
int needSyz; |
struct syz0 *syzp; /* set */ |
struct syz0 *syzp; /* set */ |
{ |
{ |
int reduced,reduced1,reduced2; |
int reduced,reduced1,reduced2; |
int grd; |
int grd; |
Line 451 struct syz0 *syzp; /* set */ |
|
Line 452 struct syz0 *syzp; /* set */ |
|
grd = 0; |
grd = 0; |
while (grd < gset->maxGrade) { |
while (grd < gset->maxGrade) { |
if (!Sugar) { |
if (!Sugar) { |
if (grd > (*grade)(f)) break; |
if (grd > (*grade)(f)) break; |
} |
} |
set = gset->polys[grd]; |
set = gset->polys[grd]; |
do { |
do { |
reduced2 = 0; /* no */ |
reduced2 = 0; /* no */ |
for (i=0; i<set->size; i++) { |
for (i=0; i<set->size; i++) { |
if (f ISZERO) goto ss; |
if (f ISZERO) goto ss; |
if ((fs =(*isCdrReducible)(f,set->g[i])) != ZERO) { |
if ((fs =(*isCdrReducible)(f,set->g[i])) != ZERO) { |
f = (*reduction1Cdr)(f,fs,set->g[i],needSyz,&cc,&cg); |
f = (*reduction1Cdr)(f,fs,set->g[i],needSyz,&cc,&cg); |
if (needSyz) { |
if (needSyz) { |
cf = ppMult(cc,cf); |
cf = ppMult(cc,cf); |
syz = cpMult(toSyzCoeff(cc),syz); |
syz = cpMult(toSyzCoeff(cc),syz); |
syz = ppAddv(syz,toSyzPoly(cg,grd,i)); |
syz = ppAddv(syz,toSyzPoly(cg,grd,i)); |
} |
} |
reduced = reduced1 = reduced2 = 1; /* yes */ |
reduced = reduced1 = reduced2 = 1; /* yes */ |
} |
} |
} |
} |
} while (reduced2 != 0); |
} while (reduced2 != 0); |
grd++; |
grd++; |
} |
} |
}while (reduced1 != 0); |
}while (reduced1 != 0); |
|
|
ss: ; |
ss: ; |
if (needSyz) { |
if (needSyz) { |
syzp->cf = cf; |
syzp->cf = cf; |
syzp->syz = syz; |
syzp->syz = syz; |
Line 482 struct syz0 *syzp; /* set */ |
|
Line 483 struct syz0 *syzp; /* set */ |
|
} |
} |
|
|
int isReducible_gen(f,g) |
int isReducible_gen(f,g) |
POLY f; |
POLY f; |
POLY g; |
POLY g; |
{ |
{ |
int n,i; |
int n,i; |
MONOMIAL tf; |
MONOMIAL tf; |
|
|
} |
} |
|
|
POLY isCdrReducible_gen(f,g) |
POLY isCdrReducible_gen(f,g) |
POLY f; |
POLY f; |
POLY g; |
POLY g; |
{ |
{ |
while (f != POLYNULL) { |
while (f != POLYNULL) { |
if ((*isReducible)(f,g)) { |
if ((*isReducible)(f,g)) { |
|
|
} |
} |
|
|
POLY lcm_gen(f,g) |
POLY lcm_gen(f,g) |
POLY f; |
POLY f; |
POLY g; |
POLY g; |
{ |
{ |
MONOMIAL tf,tg; |
MONOMIAL tf,tg; |
MONOMIAL lcm; |
MONOMIAL lcm; |
|
|
} |
} |
|
|
int grade_gen(f) |
int grade_gen(f) |
POLY f; |
POLY f; |
{ |
{ |
int r; |
int r; |
int i,n; |
int i,n; |
|
|
|
|
/* constructors */ |
/* constructors */ |
POLY toSyzPoly(cg,grd,index) |
POLY toSyzPoly(cg,grd,index) |
POLY cg; |
POLY cg; |
int grd; |
int grd; |
int index; |
int index; |
/* the result is read only. */ |
/* the result is read only. */ |
{ |
{ |
extern struct ring *SyzRingp; |
extern struct ring *SyzRingp; |
POLY r; |
POLY r; |
|
|
} |
} |
|
|
struct coeff *toSyzCoeff(f) |
struct coeff *toSyzCoeff(f) |
POLY f; |
POLY f; |
{ |
{ |
extern struct ring *SyzRingp; |
extern struct ring *SyzRingp; |
struct coeff *c; |
struct coeff *c; |
Line 612 void initSyzRingp() { |
|
Line 613 void initSyzRingp() { |
|
SyzRingp->name = ringName; |
SyzRingp->name = ringName; |
} |
} |
|
|
|
POLY reductionCdr_except_grd_i(POLY f,struct gradedPolySet *gset, |
|
int needSyz,struct syz0 *syzp, |
|
int skipGrd,int skipi, int *reducedp) |
|
{ |
|
int reduced,reduced1,reduced2; |
|
int grd; |
|
struct polySet *set; |
|
POLY cf,syz; |
|
int i; |
|
POLY cc,cg; |
|
POLY fs; |
|
|
|
extern struct ring *CurrentRingp; |
|
struct ring *rp; |
|
|
|
*reducedp = 0; |
|
if (needSyz) { |
|
if (f ISZERO) { rp = CurrentRingp; } else {rp = f->m->ringp; } |
|
cf = cxx(1,0,0,rp); |
|
syz = ZERO; |
|
} |
|
|
|
reduced = 0; /* no */ |
|
do { |
|
reduced1 = 0; /* no */ |
|
grd = 0; |
|
while (grd < gset->maxGrade) { |
|
/* |
|
if (!Sugar) { |
|
if (grd > (*grade)(f)) break; |
|
} |
|
*/ |
|
set = gset->polys[grd]; |
|
do { |
|
reduced2 = 0; /* no */ |
|
for (i=0; i<set->size; i++) { |
|
if (f ISZERO) goto ss; |
|
if ((!((grd == skipGrd) && (i == skipi))) && (set->del[i]==0)) { |
|
/* Do not use deleted element.*/ |
|
if ((fs =(*isCdrReducible)(f,set->g[i])) != ZERO) { |
|
f = (*reduction1Cdr)(f,fs,set->g[i],needSyz,&cc,&cg); |
|
/* What is cg? */ |
|
if (needSyz) { |
|
cf = ppMult(cc,cf); |
|
syz = cpMult(toSyzCoeff(cc),syz); |
|
syz = ppAddv(syz,toSyzPoly(cg,grd,i)); |
|
} |
|
*reducedp = reduced = reduced1 = reduced2 = 1; /* yes */ |
|
} |
|
} |
|
} |
|
} while (reduced2 != 0); |
|
grd++; |
|
} |
|
}while (reduced1 != 0); |
|
|
|
ss: ; |
|
if (needSyz) { |
|
syzp->cf = cf; |
|
syzp->syz = syz; |
|
} |
|
return(f); |
|
} |