version 1.20, 2003/09/21 02:19:43 |
version 1.23, 2020/10/06 11:33:46 |
|
|
/* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.19 2003/09/20 09:57:29 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.22 2005/07/03 11:08:53 ohara Exp $ */ |
#include <stdio.h> |
#include <stdio.h> |
|
#include <stdlib.h> |
#include "datatype.h" |
#include "datatype.h" |
|
// #include "extern.h" |
#include "extern2.h" |
#include "extern2.h" |
#include "gradedset.h" |
#include "gradedset.h" |
|
|
#define outofmemory(a) if (a == NULL) {fprintf(stderr,"ecart.c: out of memory.\n"); exit(10);} |
#define outofmemory(a) if (a == NULL) {fprintf(stderr,"ecart.c: out of memory.\n"); exit(10);} |
|
|
|
int errorKan1(char *s,char *m); /* defined in extern.h */ |
|
|
/* Local structures */ |
/* Local structures */ |
struct ecartReducer { |
struct ecartReducer { |
int ell; /* s^\ell */ |
int ell; /* s^\ell */ |
Line 26 static int ecartCheckPoly(POLY f); /* check if it doe |
|
Line 31 static int ecartCheckPoly(POLY f); /* check if it doe |
|
static int ecartCheckEnv(); /* check if the environment is OK for ecart div*/ |
static int ecartCheckEnv(); /* check if the environment is OK for ecart div*/ |
static struct ecartPolyArray *ecartPutPolyInG(POLY g,struct ecartPolyArray *eparray,POLY cf, POLY syz); |
static struct ecartPolyArray *ecartPutPolyInG(POLY g,struct ecartPolyArray *eparray,POLY cf, POLY syz); |
static int ecartGetEll(POLY r,POLY g); |
static int ecartGetEll(POLY r,POLY g); |
|
static int ecartGetEllPartial(POLY r,POLY g); |
static POLY ecartDivideSv(POLY r,int *d); |
static POLY ecartDivideSv(POLY r,int *d); |
/* No automatic homogenization and s is used as a standart var. */ |
/* No automatic homogenization and s is used as a standart var. */ |
static POLY reduction_ecart0(POLY r,struct gradedPolySet *gset, |
static POLY reduction_ecart0(POLY r,struct gradedPolySet *gset, |
Line 42 static void ecartCheckSyz0_printinfo(POLY cf,POLY r_0 |
|
Line 48 static void ecartCheckSyz0_printinfo(POLY cf,POLY r_0 |
|
extern int DebugReductionRed; |
extern int DebugReductionRed; |
extern int TraceLift; |
extern int TraceLift; |
struct ring *TraceLift_ringmod; |
struct ring *TraceLift_ringmod; |
extern DoCancel; |
extern int DoCancel; |
int DebugReductionEcart = 0; |
int DebugReductionEcart = 0; |
extern DebugContentReduction; |
extern int DebugContentReduction; |
extern int Sugar; |
extern int Sugar; |
|
|
/* This is used for goHomogenization */ |
/* This is used for goHomogenization */ |
Line 117 static int ecartGetEll(POLY f,POLY g) { |
|
Line 123 static int ecartGetEll(POLY f,POLY g) { |
|
else return(-p); |
else return(-p); |
} |
} |
|
|
|
static int ecartGetEllPartial(POLY f,POLY g) { |
|
int n,i,p; |
|
MONOMIAL tf; |
|
MONOMIAL tg; |
|
int nglob; int *glob; int k; |
|
|
|
if (f ISZERO) return(-1); |
|
if (g ISZERO) return(-1); |
|
|
|
checkRingIsR(f,g); |
|
|
|
if (!isSameComponent_x(f,g)) return(-1); |
|
tf = f->m; tg = g->m; n = tf->ringp->n; |
|
for (i=1; i<n; i++) { |
|
if (tf->e[i].x < tg->e[i].x) return(-1); |
|
if (tf->e[i].D < tg->e[i].D) return(-1); |
|
} |
|
if (tf->e[0].D < tg->e[0].D) return(-1); /* h */ |
|
|
|
/* Find u and ell s.t. s^\ell f = u g. |
|
When u contains variables in glob (index x var), then returns -1. |
|
x' = glob, x'' = complement of glob. Division in Q(x'')[x']. |
|
*/ |
|
nglob = tf->ringp->partialEcart; |
|
glob = tf->ringp->partialEcartGlobalVarX; |
|
for (i=0; i<nglob; i++) { |
|
k = glob[i]; |
|
if (tf->e[k].x > tg->e[k].x) return(-1); |
|
} |
|
|
|
p = tf->e[0].x - tg->e[0].x; /* H, s */ |
|
if (p >=0 ) return 0; |
|
else return(-p); |
|
} |
|
|
|
|
#define EP_SIZE 10 |
#define EP_SIZE 10 |
static struct ecartPolyArray *ecartPutPolyInG(POLY g,struct ecartPolyArray *eparray,POLY cf,POLY syz) |
static struct ecartPolyArray *ecartPutPolyInG(POLY g,struct ecartPolyArray *eparray,POLY cf,POLY syz) |
{ |
{ |
Line 203 static struct ecartReducer ecartFindReducer(POLY r,str |
|
Line 244 static struct ecartReducer ecartFindReducer(POLY r,str |
|
if (epa != NULL) { |
if (epa != NULL) { |
/* Try to find in the second group. */ |
/* Try to find in the second group. */ |
for (i=0; i< epa->size; i++) { |
for (i=0; i< epa->size; i++) { |
ell = ecartGetEll(r,(epa->pa)[i]); |
ell = ecartGetEllPartial(r,(epa->pa)[i]); |
if ((ell>=0) && (ell < ell2)) { |
if ((ell>=0) && (ell < ell2)) { |
ell2 = ell; |
ell2 = ell; |
minGgi = i; |
minGgi = i; |
Line 522 static POLY reduction_ecart1(r,gset,needSyz,syzp) |
|
Line 563 static POLY reduction_ecart1(r,gset,needSyz,syzp) |
|
ells = ecartFindReducer(r,gset,gg); |
ells = ecartFindReducer(r,gset,gg); |
ell = ells.ell; |
ell = ells.ell; |
if (ell > 0) { |
if (ell > 0) { |
if (DebugReductionEcart & 2) printf("%"); |
if (DebugReductionEcart & 2) printf("%%"); |
if (needSyz) { |
if (needSyz) { |
gg = ecartPutPolyInG(r,gg,cf,syz); |
gg = ecartPutPolyInG(r,gg,cf,syz); |
}else{ |
}else{ |
Line 701 static struct ecartReducer ecartFindReducer_mod(POLY r |
|
Line 742 static struct ecartReducer ecartFindReducer_mod(POLY r |
|
if (epa != NULL) { |
if (epa != NULL) { |
/* Try to find in the second group. */ |
/* Try to find in the second group. */ |
for (i=0; i< epa->size; i++) { |
for (i=0; i< epa->size; i++) { |
ell = ecartGetEll(r,(epa->pa)[i]); |
ell = ecartGetEllPartial(r,(epa->pa)[i]); |
if ((ell>=0) && (ell < ell2)) { |
if ((ell>=0) && (ell < ell2)) { |
ell2 = ell; |
ell2 = ell; |
minGgi = i; |
minGgi = i; |
Line 777 static POLY reduction_ecart1_mod(r,gset) |
|
Line 818 static POLY reduction_ecart1_mod(r,gset) |
|
ells = ecartFindReducer_mod(r,gset,gg); |
ells = ecartFindReducer_mod(r,gset,gg); |
ell = ells.ell; |
ell = ells.ell; |
if (ell > 0) { |
if (ell > 0) { |
if (DebugReductionEcart & 2) printf("%"); |
if (DebugReductionEcart & 2) printf("%%"); |
gg = ecartPutPolyInG(r,gg,POLYNULL,POLYNULL); |
gg = ecartPutPolyInG(r,gg,POLYNULL,POLYNULL); |
} |
} |
if (ell >= 0) { |
if (ell >= 0) { |