=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/poly2.c,v retrieving revision 1.4 retrieving revision 1.7 diff -u -p -r1.4 -r1.7 --- OpenXM/src/kan96xx/Kan/poly2.c 2003/08/20 01:39:17 1.4 +++ OpenXM/src/kan96xx/Kan/poly2.c 2005/07/03 11:08:54 1.7 @@ -1,5 +1,6 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/poly2.c,v 1.3 2001/05/04 01:06:25 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/poly2.c,v 1.6 2005/06/16 05:07:23 takayama Exp $ */ #include +#include #include "datatype.h" #include "stackm.h" #include "extern.h" @@ -694,7 +695,7 @@ POLY modulo0(f,ringp) struct object test(ob) /* test3 */ struct object ob; { - struct object rob; + struct object rob = OINIT; int k; static POLY f0; static POLY f1; @@ -953,6 +954,7 @@ POLY reduceContentOfPoly(POLY f,struct coeff **contp) struct coeff *cOne = NULL; extern struct ring *SmallRingp; if (cOne == NULL) cOne = intToCoeff(1,SmallRingp); + *contp = cOne; if (f == POLYNULL) return f; if (f->m->ringp->p != 0) return f; @@ -990,7 +992,7 @@ struct coeff *gcdOfCoeff(POLY f) { cOne = newMP_INT(); mpz_set_si(cOne,(long) 1); } - if (f == POLYNULL) return 0; + if (f == POLYNULL) return intToCoeff(0,SmallRingp); if (f->m->ringp->p != 0) return intToCoeff(0,SmallRingp); if (f->coeffp->tag != MP_INTEGER) return intToCoeff(0,SmallRingp); tmp = f->coeffp->val.bigp; @@ -1003,4 +1005,25 @@ struct coeff *gcdOfCoeff(POLY f) { } return mpintToCoeff(tmp,SmallRingp); +} + +int shouldReduceContent(POLY f,int ss) { + extern DoCancel; + static int prevSize = 1; + int size; + if (f == POLYNULL) return 0; + if (f->m->ringp->p != 0) return 0; + if (f->coeffp->tag != MP_INTEGER) return 0; + if (DoCancel & 2) return 1; + /* Apply the Noro strategy to reduce content. */ + size = mpz_size(f->coeffp->val.bigp); + if (ss > 0) { + prevSize = size; + return 0; + } + if (size > 2*prevSize) { + return 1; + }else{ + return 0; + } }