23 #ifdef HAVE_COEF_BUCKETS
24 #define USE_COEF_BUCKETS
27 #ifdef USE_COEF_BUCKETS
29 #define MULTIPLY_BUCKET(B,I) do \
30 { if (B->coef[I]!=NULL) \
32 assume(p_IsConstant(B->Coef[i],B->bucket->ring)); \
33 B->buckets[I]=p_Mult_q(B->buckets[I],B->coef[I],B->bucket_ring); \
37 if (rField_is_Ring(B->bucket_ring)) B->buckets_length[i] = pLength(B->buckets[i]);
39 #define MULTIPLY_BUCKET(B,I) do \
40 { if (B->coef[I]!=NULL) \
42 B->buckets[I]=p_Mult_q(B->buckets[I],B->coef[I],B->bucket_ring); \
48 #define MULTIPLY_BUCKET(B,I)
51 #ifdef USE_COEF_BUCKETS
52 static int coef_start=1;
66 #ifdef BUCKET_TWO_BASE
67 while ((l = (l >> 1))) i++;
69 while ((l = (l >> 2))) i++;
82 #ifndef HAVE_PSEUDO_BUCKETS
85 #ifdef USE_COEF_BUCKETS
87 if ((bucket->coef[i]!=
NULL) && (bucket->buckets[i]==
NULL))
91 if (bucket->coef[i]!=
NULL)
98 if (bucket->buckets_length[i] !=
pLength(bucket->buckets[i]))
100 dReportError(
"Bucket %d lengths difference should:%d has:%d",
101 i, bucket->buckets_length[i],
pLength(bucket->buckets[i]));
103 else if (i > 0 && (
int)
pLogLength(bucket->buckets_length[i]) > i)
106 i, bucket->buckets_length[i]);
108 if (i==0 && bucket->buckets_length[0] > 1)
118 #ifdef HAVE_COEF_BUCKETS
122 poly lm = bucket->buckets[0];
126 if (! kbTest_i(bucket, 0))
return FALSE;
127 for (i=1; i<= (
int) bucket->buckets_used; i++)
129 if (!kbTest_i(bucket, i))
return FALSE;
130 if (lm !=
NULL && bucket->buckets[i] !=
NULL
147 if (bucket->buckets[i] !=
NULL || bucket->buckets_length[i] != 0)
155 if (bucket->buckets[i]!=
NULL)
160 if (bucket->buckets[j]==bucket->buckets[i])
167 #ifdef HAVE_COEF_BUCKETS
168 if (bucket->coef[i]!=
NULL)
173 if (bucket->coef[j]==bucket->coef[i])
185 #else // HAVE_PSEUDO_BUCKETS
190 #endif // ! HAVE_PSEUDO_BUCKETS
217 for (i=0; i<= bucket->buckets_used; i++)
220 if (bucket->buckets[i] !=
NULL)
223 #ifdef USE_COEF_BUCKETS
224 if (bucket->coef[i]!=
NULL)
236 #ifndef HAVE_PSEUDO_BUCKETS
241 if (bucket->buckets[0] !=
NULL)
243 poly lm = bucket->buckets[0];
245 #ifdef BUCKET_TWO_BASE
247 while ( bucket->buckets_length[i] >= l)
254 while ( bucket->buckets_length[i] >= l)
260 #ifndef USE_COEF_BUCKETS
262 pNext(lm) = bucket->buckets[
i];
263 bucket->buckets[
i] = lm;
264 bucket->buckets_length[
i]++;
265 assume(i <= bucket->buckets_used+1);
266 if (i > bucket->buckets_used) bucket->buckets_used =
i;
267 bucket->buckets[0] =
NULL;
268 bucket->buckets_length[0] = 0;
271 if (i > bucket->buckets_used) bucket->buckets_used =
i;
273 if (bucket->buckets[i]!=
NULL)
276 pNext(lm) = bucket->buckets[
i];
277 bucket->buckets[
i] = lm;
278 bucket->buckets_length[
i]++;
279 assume(i <= bucket->buckets_used+1);
291 bucket->buckets[
i]=lm;
292 bucket->buckets_length[
i]=1;
295 bucket->buckets[
i]=lm;
296 bucket->buckets_length[
i]=1;
299 pNext(lm) = bucket->buckets[
i];
300 bucket->buckets[
i] = lm;
301 bucket->buckets_length[
i]++;
302 assume(i <= bucket->buckets_used+1);
305 bucket->buckets[0]=
NULL;
306 bucket->buckets_length[0] = 0;
307 bucket->coef[0]=
NULL;
320 if (bucket->buckets[i] !=
NULL)
return FALSE;
321 #ifdef HAVE_COEF_BUCKETS
322 if (bucket->coef[i] !=
NULL)
return FALSE;
324 if (bucket->buckets_length[i] != 0)
return FALSE;
336 if (lm ==
NULL)
return;
341 bucket->buckets[0] = lm;
342 #ifdef HAVE_COEF_BUCKETS
345 #ifdef USE_COEF_BUCKETS
346 bucket->coef[0]=
NULL;
349 bucket->buckets_length[0] = 1;
351 bucket->buckets_length[0]= 0;
355 bucket->buckets[
i] =
pNext(lm);
357 bucket->buckets_length[
i] = length-1;
358 bucket->buckets_used =
i;
362 bucket->buckets_used = 0;
371 poly p = bucket->buckets[1];
373 int pl = bucket->buckets_length[1];
375 bucket->buckets[1] =
NULL;
376 bucket->buckets_length[1] = 0;
377 #ifdef USE_COEF_BUCKETS
383 for (i=1; i<=bucket->buckets_used; i++)
385 #ifdef USE_COEF_BUCKETS
386 if (bucket->coef[i]!=
NULL)
390 pl, bucket->buckets_length[i], r);
395 p =
p_Add_q(p, bucket->buckets[i],
396 pl, bucket->buckets_length[i], r);
398 p =
p_Add_q(p, bucket->buckets[i],
399 pl, bucket->buckets_length[i], r);
402 bucket->buckets[
i] =
NULL;
403 bucket->buckets_length[
i] = 0;
405 #ifdef HAVE_COEF_BUCKETS
408 lm = bucket->buckets[0];
414 bucket->buckets[0] =
NULL;
415 bucket->buckets_length[0] = 0;
420 bucket->buckets[
i] =
p;
421 bucket->buckets_length[
i] = pl;
427 bucket->buckets_used =
i;
429 #ifdef USE_COEF_BUCKETS
444 #ifdef USE_COEF_BUCKETS
448 *p = bucket->buckets[
i];
449 *length = bucket->buckets_length[
i];
450 bucket->buckets[
i] =
NULL;
451 bucket->buckets_length[
i] = 0;
452 bucket->buckets_used = 0;
464 kBucketMergeLm(bucket);
466 bucket->buckets[0] = lm;
467 bucket->buckets_length[0] = 1;
470 #else // HAVE_PSEUDO_BUCKETS
480 if (length <= 0) bucket->
l =
pLength(lm);
481 else bucket->
l = length;
509 #endif // ! HAVE_PSEUDO_BUCKETS
515 ring new_tailRing,
omBin new_tailBin,
518 #ifndef HAVE_PSEUDO_BUCKETS
522 for (i=0; i<= bucket->buckets_used; i++)
523 if (bucket->buckets[i] !=
NULL)
526 bucket->buckets[
i] = p_shallow_copy_delete(bucket->buckets[i],
532 bucket->
p = p_shallow_copy_delete(p,
548 int l1 = bucket->buckets_length[
i];
549 poly p1 = bucket->buckets[
i];
550 bucket->buckets[
i] =
NULL;
551 bucket->buckets_length[
i] = 0;
554 while (bucket->buckets[i] !=
NULL)
558 p1 =
p_Add_q(p1, bucket->buckets[i],
559 l1, bucket->buckets_length[i], bucket->
bucket_ring);
560 bucket->buckets[
i] =
NULL;
561 bucket->buckets_length[
i] = 0;
565 bucket->buckets[
i] = p1;
566 bucket->buckets_length[
i]=l1;
567 if (i >= bucket->buckets_used)
568 bucket->buckets_used =
i;
570 kBucketAdjustBucketsUsed(bucket);
579 #ifndef HAVE_PSEUDO_BUCKETS
584 for (i=0; i<= bucket->buckets_used; i++)
586 if (bucket->buckets[i] !=
NULL)
588 #ifdef USE_COEF_BUCKETS
590 bucket->buckets[
i] =
p_Mult_nn(bucket->buckets[i], n, r);
601 bucket->buckets_length[
i] =
pLength(bucket->buckets[i]);
606 if (bucket->coef[i]!=
NULL)
608 bucket->coef[
i] =
p_Mult_nn(bucket->coef[i],n,r);
615 bucket->buckets[
i] =
p_Mult_nn(bucket->buckets[i], n, r);
619 bucket->buckets_length[
i] =
pLength(bucket->buckets[i]);
639 if (q ==
NULL)
return;
653 kBucketMergeLm(bucket);
657 while (bucket->buckets[i] !=
NULL)
660 #ifdef USE_COEF_BUCKETS
661 if (bucket->coef[i]!=
NULL)
664 l1, bucket->buckets_length[i], r);
669 q =
p_Add_q(q, bucket->buckets[i],
670 l1, bucket->buckets_length[i], r);
672 q =
p_Add_q(q, bucket->buckets[i],
673 l1, bucket->buckets_length[i], r);
675 bucket->buckets[
i] =
NULL;
676 bucket->buckets_length[
i] = 0;
683 bucket->buckets[
i] = q;
684 bucket->buckets_length[
i]=l1;
685 if (i >= bucket->buckets_used)
686 bucket->buckets_used =
i;
688 kBucketAdjustBucketsUsed(bucket);
717 #ifndef HAVE_PSEUDO_BUCKETS
718 kBucketMergeLm(bucket);
722 #if defined(HAVE_RINGS)||defined(HAVE_PLURAL)
735 if ((i <= bucket->buckets_used) && (bucket->buckets[i] !=
NULL))
737 assume(
pLength(bucket->buckets[i])==bucket->buckets_length[i]);
751 bucket->buckets_length[i], l1,
753 l1 = bucket->buckets_length[
i];
754 bucket->buckets[
i] =
NULL;
755 bucket->buckets_length[
i] = 0;
761 if (spNoether !=
NULL)
764 p1 = r->p_Procs->pp_Mult_mm_Noether(p1, m, spNoether, l1, r);
769 p1 = r->p_Procs->pp_Mult_mm(p1, m, r);
775 while (bucket->buckets[i] !=
NULL)
779 p1 =
p_Add_q(p1, bucket->buckets[i],
780 l1, bucket->buckets_length[i], r);
781 bucket->buckets[
i] =
NULL;
782 bucket->buckets_length[
i] = 0;
786 bucket->buckets[
i] = p1;
787 bucket->buckets_length[
i]=l1;
788 if (i >= bucket->buckets_used)
789 bucket->buckets_used =
i;
791 kBucketAdjustBucketsUsed(bucket);
792 #else // HAVE_PSEUDO_BUCKETS
822 kBucketMergeLm(bucket);
825 #ifdef USE_COEF_BUCKETS
828 if (i <= bucket->buckets_used && bucket->buckets[i] !=
NULL)
831 #ifdef USE_COEF_BUCKETS
832 if ((bucket->coef[i]!=
NULL) &&(i>=coef_start))
834 number orig_coef=
p_GetCoeff(bucket->coef[i],r);
838 number
gcd=
n_Gcd(add_coef, orig_coef,r);
842 number orig_coef2=
n_ExactDiv(orig_coef,gcd,r);
846 orig_coef=orig_coef2;
858 bucket->buckets[
i]=
p_Mult_nn(bucket->buckets[i],orig_coef,r);
864 bucket->buckets_length[i], l1, r);
865 l1=bucket->buckets_length[
i];
866 bucket->buckets[
i]=
NULL;
867 bucket->buckets_length[
i] = 0;
878 bucket->buckets_length[i], l1, r);
879 l1 = bucket->buckets_length[
i];
880 bucket->buckets[
i] =
NULL;
881 bucket->buckets_length[
i] = 0;
888 #ifdef USE_COEF_BUCKETS
897 p1 = r->p_Procs->pp_Mult_mm(p1, m, r);
898 #ifdef USE_COEF_BUCKETS
905 while ((bucket->buckets[i] !=
NULL) && (p1!=
NULL))
908 #ifdef USE_COEF_BUCKETS
909 if ((bucket->coef[i]!=
NULL) &&(i>=coef_start))
911 number orig_coef=
p_GetCoeff(bucket->coef[i],r);
914 number add_coef=
n_Copy(n,r);
915 number
gcd=
n_Gcd(add_coef, orig_coef,r);
919 number orig_coef2=
n_ExactDiv(orig_coef,gcd,r);
924 orig_coef=orig_coef2;
930 bucket->buckets[
i]=
p_Mult_nn(bucket->buckets[i],orig_coef,r);
933 p1 =
p_Add_q(p1, bucket->buckets[i],r);
936 bucket->buckets[
i]=
NULL;
946 #ifdef USE_COEF_BUCKETS
955 p1 =
p_Add_q(p1, bucket->buckets[i],
956 l1, bucket->buckets_length[i], r);
957 bucket->buckets[
i] =
NULL;
958 bucket->buckets_length[
i] = 0;
963 bucket->buckets[
i] = p1;
964 #ifdef USE_COEF_BUCKETS
973 bucket->coef[
i]=
NULL;
977 if ((p1==
NULL) && (bucket->coef[i]!=
NULL))
980 bucket->buckets_length[
i]=l1;
981 if (i >= bucket->buckets_used)
982 bucket->buckets_used =
i;
984 kBucketAdjustBucketsUsed(bucket);
1030 #ifndef HAVE_PSEUDO_BUCKETS
1031 kBucketMergeLm(bucket);
1032 for (i=1; i<=bucket->buckets_used; i++)
1034 if (bucket->buckets[i] !=
NULL)
1041 bucket->buckets_length[
i] -= lq;
1042 assume(
pLength(bucket->buckets[i]) == bucket->buckets_length[i]);
1047 kBucketAdjustBucketsUsed(bucket);
1099 if ((ct == 0) || (ct == 2))
1164 #ifndef USE_COEF_BUCKETS
1167 static BOOLEAN nIsPseudoUnit(number
n, ring r)
1174 return (
n_Size(n,r->cf)==1);
1193 if ((bucket->buckets[i]!=
NULL) && (bucket->coef[i]==
NULL))
1204 if ((bucket->buckets[i]!=
NULL)
1205 && (nIsPseudoUnit(
p_GetCoeff(bucket->coef[i],r),r)))
1220 if (bucket->buckets[i]!=
NULL)
1229 if (nIsPseudoUnit(coef,r))
1246 if (bucket->buckets[i]!=
NULL)
1264 poly p=bucket->buckets[
i];
1265 bucket->buckets_length[
i]--;
1266 #ifdef USE_COEF_BUCKETS
1268 if (bucket->coef[i]!=
NULL)
1274 p=bucket->buckets[
i];
1275 bucket->buckets[
i]=
NULL;
1280 bucket->buckets[
i]=
next;
1291 bucket->buckets[
i]=
pNext(bucket->buckets[i]);
1312 number an = *
a, bn = *
b;
void kBucketClear(kBucket_pt bucket, poly *p, int *length)
CFFList append(const CFFList &Inputlist, const CFFactor &TheFactor)
BOOLEAN kbTest(kBucket_pt bucket)
Tests.
const const intvec const intvec const ring _currRing const const intvec const intvec const ring _currRing int
static FORCE_INLINE number n_Gcd(number a, number b, const coeffs r)
in Z: return the gcd of 'a' and 'b' in Z/nZ, Z/2^kZ: computed as in the case Z in Z/pZ...
poly kBucketExtractLmOfBucket(kBucket_pt bucket, int i)
#define MULTIPLY_BUCKET(B, I)
void kBucketShallowCopyDelete(kBucket_pt bucket, ring new_tailRing, omBin new_tailBin, pShallowCopyDeleteProc p_shallow_copy_delete)
For changing the ring of the Bpoly to new_tailBin.
void kBucketInit(kBucket_pt bucket, poly lm, int length)
void p_TakeOutComp(poly *p, long comp, poly *q, int *lq, const ring r)
number kBucketPolyRed(kBucket_pt bucket, poly p1, int l1, poly spNoether)
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
poly p_NSet(number n, const ring r)
returns the poly representing the number n, destroys n
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
const CanonicalForm CFMap CFMap int &both_non_zero int n
const poly kBucketGetLm(kBucket_pt bucket)
int ksCheckCoeff(number *a, number *b)
#define MAX_BUCKET
Bucket definition (should be no one elses business, though)
static poly pp_Mult_mm(poly p, poly m, const ring r)
static BOOLEAN rField_is_Domain(const ring r)
static FORCE_INLINE void n_Normalize(number &n, const coeffs r)
inplace-normalization of n; produces some canonical representation of n;
static char const ** rParameter(const ring r)
(r->cf->parameter)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy ...
void kBucket_Mult_n(kBucket_pt bucket, number n)
Multiply Bucket by number ,i.e. Bpoly == n*Bpoly.
static bool rIsPluralRing(const ring r)
we must always have this test!
kBucket_pt kBucketCreate(ring bucket_ring)
Creation/Destruction of buckets.
static number p_SetCoeff(poly p, number n, ring r)
static int pLength(poly a)
poly kBucketExtractLm(kBucket_pt bucket)
int comp(const CanonicalForm &A, const CanonicalForm &B)
compare polynomials
#define pFalseReturn(cond)
poly kBucket_ExtractLarger(kBucket_pt bucket, poly q, poly append)
Extract all monomials of bucket which are larger than q Append those to append, and return last monom...
Coefficient rings, fields and other domains suitable for Singular polynomials.
void kBucketDestroy(kBucket_pt *bucket_pt)
static void p_SetCompP(poly p, int i, ring r)
static BOOLEAN p_IsConstant(const poly p, const ring r)
The main handler for Singular numbers which are suitable for Singular polynomials.
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
static BOOLEAN p_DivisibleBy(poly a, poly b, const ring r)
void kBucketSetLm(kBucket_pt bucket, poly lm)
static int p_LmCmp(poly p, poly q, const ring r)
static FORCE_INLINE number n_InpNeg(number n, const coeffs r)
in-place negation of n MUST BE USED: n = n_InpNeg(n) (no copy is returned)
void kBucketSimpleContent(kBucket_pt)
#define omCheckAddrBin(addr, bin)
void PrintS(const char *s)
static void p_ExpVectorSub(poly p1, poly p2, const ring r)
static poly p_Mult_nn(poly p, number n, const ring r)
void kBucket_Minus_m_Mult_p(kBucket_pt bucket, poly m, poly p, int *l, poly spNoether)
Bpoly == Bpoly - m*p; where m is a monom Does not destroy p and m assume (*l <= 0 || pLength(p) == *l...
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
void kBucketAdjust(kBucket_pt bucket, int i)
Bucket number i from bucket is out of length sync, resync.
static BOOLEAN rField_is_Zp(const ring r)
static void p_Delete(poly *p, const ring r)
#define omGetSpecBin(size)
#define p_LmEqual(p1, p2, r)
unsigned int pLogLength(unsigned int l)
Some internal stuff.
poly(* pShallowCopyDeleteProc)(poly s_p, ring source_r, ring dest_r, omBin dest_bin)
returns a poly from dest_r which is a ShallowCopy of s_p from source_r assumes that source_r->N == de...
static BOOLEAN rField_is_Ring(const ring r)
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
void kBucket_Plus_mm_Mult_pp(kBucket_pt bucket, poly m, poly p, int l)
Bpoly == Bpoly + m*p; where m is a monom Does not destroy p and m assume (l <= 0 || pLength(p) == l) ...
static FORCE_INLINE number n_Div(number a, number b, const coeffs r)
return the quotient of 'a' and 'b', i.e., a/b; raises an error if 'b' is not invertible in r exceptio...
static FORCE_INLINE number n_ExactDiv(number a, number b, const coeffs r)
assume that there is a canonical subring in cf and we know that division is possible for these a and ...
static void p_Setm(poly p, const ring r)
static poly p_Minus_mm_Mult_qq(poly p, const poly m, const poly q, int &lp, int lq, const poly spNoether, const ring r)
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
int dReportError(const char *fmt,...)
static void p_LmDelete(poly p, const ring r)
#define p_SetCoeff0(p, n, r)
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
static FORCE_INLINE BOOLEAN n_IsMOne(number n, const coeffs r)
TRUE iff 'n' represents the additive inverse of the one element, i.e. -1.
static poly p_Add_q(poly p, poly q, const ring r)
BOOLEAN kBucketIsCleared(kBucket_pt bucket)
#define omFreeBin(addr, bin)
int kBucketCanonicalize(kBucket_pt bucket)
static FORCE_INLINE int n_Size(number n, const coeffs r)
return a non-negative measure for the complexity of n; return 0 only when n represents zero; (used fo...
void kBucketDeleteAndDestroy(kBucket_pt *bucket_pt)
void kBucketTakeOutComp(kBucket_pt bucket, long comp, poly *r_p, int *l)
static poly p_Plus_mm_Mult_qq(poly p, poly m, poly q, int &lp, int lq, const ring r)
void kBucket_Add_q(kBucket_pt bucket, poly q, int *l)
Add to Bucket a poly ,i.e. Bpoly == q+Bpoly.