15 #ifdef HAVE_COEF_BUCKETS 16 #define USE_COEF_BUCKETS 19 #ifdef USE_COEF_BUCKETS 21 #define MULTIPLY_BUCKET(B,I) do \ 22 { if (B->coef[I]!=NULL) \ 24 assume(p_IsConstant(B->Coef[i],B->bucket->ring)); \ 25 B->buckets[I]=p_Mult_q(B->buckets[I],B->coef[I],B->bucket_ring); \ 29 if (rField_is_Ring(B->bucket_ring)) B->buckets_length[i] = pLength(B->buckets[i]); 31 #define MULTIPLY_BUCKET(B,I) do \ 32 { if (B->coef[I]!=NULL) \ 34 B->buckets[I]=p_Mult_q(B->buckets[I],B->coef[I],B->bucket_ring); \ 40 #define MULTIPLY_BUCKET(B,I) 43 #ifdef USE_COEF_BUCKETS 44 static int coef_start=1;
52 #ifndef BUCKET_TWO_BASE 55 const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
56 const unsigned int S[] = {1, 2, 4, 8, 16};
59 if (
v &
b[4]) {
v >>= S[4]; r |= S[3]; }
60 if (
v &
b[3]) {
v >>= S[3]; r |= S[2]; }
61 if (
v &
b[2]) {
v >>= S[2]; r |= S[1]; }
62 if (
v &
b[1]) {
v >>= S[1]; r |= S[0]; }
74 #ifdef BUCKET_TWO_BASE 90 #ifndef HAVE_PSEUDO_BUCKETS 93 #ifdef USE_COEF_BUCKETS 95 if ((bucket->coef[
i]!=
NULL) && (bucket->buckets[
i]==
NULL))
99 if (bucket->coef[
i]!=
NULL)
106 if ((
unsigned)bucket->buckets_length[
i] !=
pLength(bucket->buckets[
i]))
108 dReportError(
"Bucket %d lengths difference should:%d has:%d",
109 i, bucket->buckets_length[
i],
pLength(bucket->buckets[
i]));
111 else if (
i > 0 && (
int)
pLogLength(bucket->buckets_length[
i]) >
i)
114 i, bucket->buckets_length[
i]);
116 if (
i==0 && bucket->buckets_length[0] > 1)
126 #ifdef HAVE_COEF_BUCKETS 130 poly lm = bucket->buckets[0];
134 if (! kbTest_i(bucket, 0))
return FALSE;
135 for (
i=1;
i<= (int) bucket->buckets_used;
i++)
137 if (!kbTest_i(bucket,
i))
return FALSE;
138 if (lm !=
NULL && bucket->buckets[
i] !=
NULL 155 if (bucket->buckets[
i] !=
NULL || bucket->buckets_length[
i] != 0)
163 if (bucket->buckets[
i]!=
NULL)
168 if (bucket->buckets[
j]==bucket->buckets[
i])
175 #ifdef HAVE_COEF_BUCKETS 176 if (bucket->coef[
i]!=
NULL)
181 if (bucket->coef[
j]==bucket->coef[
i])
193 #else // HAVE_PSEUDO_BUCKETS 198 #endif // ! HAVE_PSEUDO_BUCKETS 225 for (
i=0;
i<= bucket->buckets_used;
i++)
228 #ifdef USE_COEF_BUCKETS 239 #ifndef HAVE_PSEUDO_BUCKETS 244 if (bucket->buckets[0] !=
NULL)
246 poly lm = bucket->buckets[0];
248 #ifdef BUCKET_TWO_BASE 250 while ( bucket->buckets_length[
i] >=
l)
257 while ( bucket->buckets_length[
i] >=
l)
263 #ifndef USE_COEF_BUCKETS 265 pNext(lm) = bucket->buckets[
i];
266 bucket->buckets[
i] = lm;
267 bucket->buckets_length[
i]++;
268 assume(i <= bucket->buckets_used+1);
269 if (
i > bucket->buckets_used) bucket->buckets_used =
i;
270 bucket->buckets[0] =
NULL;
271 bucket->buckets_length[0] = 0;
274 if (
i > bucket->buckets_used) bucket->buckets_used =
i;
276 if (bucket->buckets[
i]!=
NULL)
279 pNext(lm) = bucket->buckets[
i];
280 bucket->buckets[
i] = lm;
281 bucket->buckets_length[
i]++;
282 assume(i <= bucket->buckets_used+1);
294 bucket->buckets[
i]=lm;
295 bucket->buckets_length[
i]=1;
298 bucket->buckets[
i]=lm;
299 bucket->buckets_length[
i]=1;
302 pNext(lm) = bucket->buckets[
i];
303 bucket->buckets[
i] = lm;
304 bucket->buckets_length[
i]++;
305 assume(i <= bucket->buckets_used+1);
308 bucket->buckets[0]=
NULL;
309 bucket->buckets_length[0] = 0;
310 bucket->coef[0]=
NULL;
324 #ifdef HAVE_COEF_BUCKETS 327 if (bucket->buckets_length[
i] != 0)
return FALSE;
339 if (lm ==
NULL)
return;
344 bucket->buckets[0] = lm;
345 #ifdef HAVE_COEF_BUCKETS 348 #ifdef USE_COEF_BUCKETS 349 bucket->coef[0]=
NULL;
352 bucket->buckets_length[0] = 1;
354 bucket->buckets_length[0]= 0;
358 bucket->buckets[
i] =
pNext(lm);
360 bucket->buckets_length[
i] =
length-1;
361 bucket->buckets_used =
i;
365 bucket->buckets_used = 0;
371 #ifndef HAVE_PSEUDO_BUCKETS 375 poly
p = bucket->buckets[1];
377 int pl = bucket->buckets_length[1];
379 bucket->buckets[1] =
NULL;
380 bucket->buckets_length[1] = 0;
381 #ifdef USE_COEF_BUCKETS 387 for (
i=1;
i<=bucket->buckets_used;
i++)
389 #ifdef USE_COEF_BUCKETS 390 if (bucket->coef[
i]!=
NULL)
394 pl, bucket->buckets_length[
i], r);
400 pl, bucket->buckets_length[
i], r);
403 pl, bucket->buckets_length[
i], r);
406 bucket->buckets[
i] =
NULL;
407 bucket->buckets_length[
i] = 0;
409 #ifdef HAVE_COEF_BUCKETS 412 lm = bucket->buckets[0];
418 bucket->buckets[0] =
NULL;
419 bucket->buckets_length[0] = 0;
424 bucket->buckets[
i] =
p;
425 bucket->buckets_length[
i] = pl;
431 bucket->buckets_used =
i;
433 #ifdef USE_COEF_BUCKETS 446 #ifdef HAVE_PSEUDO_BUCKETS 450 for (
int i=0;
i<=bucket->buckets_used;
i++)
462 #ifdef USE_COEF_BUCKETS 466 *
p = bucket->buckets[
i];
467 *
length = bucket->buckets_length[
i];
468 bucket->buckets[
i] =
NULL;
469 bucket->buckets_length[
i] = 0;
470 bucket->buckets_used = 0;
482 kBucketMergeLm(bucket);
484 bucket->buckets[0] = lm;
485 bucket->buckets_length[0] = 1;
488 #else // HAVE_PSEUDO_BUCKETS 527 #endif // ! HAVE_PSEUDO_BUCKETS 533 ring new_tailRing,
omBin new_tailBin,
536 #ifndef HAVE_PSEUDO_BUCKETS 540 for (
i=0;
i<= bucket->buckets_used;
i++)
541 if (bucket->buckets[
i] !=
NULL)
544 bucket->buckets[
i] = p_shallow_copy_delete(bucket->buckets[
i],
550 bucket->
p = p_shallow_copy_delete(
p,
566 int l1 = bucket->buckets_length[
i];
567 poly p1 = bucket->buckets[
i];
568 bucket->buckets[
i] =
NULL;
569 bucket->buckets_length[
i] = 0;
572 while (bucket->buckets[
i] !=
NULL)
576 p1 =
p_Add_q(p1, bucket->buckets[
i],
578 bucket->buckets[
i] =
NULL;
579 bucket->buckets_length[
i] = 0;
583 bucket->buckets[
i] = p1;
584 bucket->buckets_length[
i]=l1;
585 if (
i >= bucket->buckets_used)
586 bucket->buckets_used =
i;
588 kBucketAdjustBucketsUsed(bucket);
597 #ifndef HAVE_PSEUDO_BUCKETS 602 for (
i=0;
i<= bucket->buckets_used;
i++)
604 if (bucket->buckets[
i] !=
NULL)
606 #ifdef USE_COEF_BUCKETS 618 bucket->buckets_length[
i] =
pLength(bucket->buckets[
i]);
622 if (bucket->coef[
i]!=
NULL)
634 bucket->buckets_length[
i] =
pLength(bucket->buckets[
i]);
653 if (q ==
NULL)
return;
667 kBucketMergeLm(bucket);
671 while (bucket->buckets[
i] !=
NULL)
674 #ifdef USE_COEF_BUCKETS 675 if (bucket->coef[
i]!=
NULL)
678 l1, bucket->buckets_length[
i], r);
684 l1, bucket->buckets_length[
i], r);
687 l1, bucket->buckets_length[
i], r);
689 bucket->buckets[
i] =
NULL;
690 bucket->buckets_length[
i] = 0;
697 bucket->buckets[
i] = q;
698 bucket->buckets_length[
i]=l1;
699 if (
i >= bucket->buckets_used)
700 bucket->buckets_used =
i;
702 kBucketAdjustBucketsUsed(bucket);
731 #ifndef HAVE_PSEUDO_BUCKETS 732 kBucketMergeLm(bucket);
736 #if defined(HAVE_PLURAL) 749 if ((i <= bucket->buckets_used) && (bucket->buckets[
i] !=
NULL))
751 assume(
pLength(bucket->buckets[
i])==(
unsigned)bucket->buckets_length[
i]);
765 bucket->buckets_length[
i], l1,
767 l1 = bucket->buckets_length[
i];
768 bucket->buckets[
i] =
NULL;
769 bucket->buckets_length[
i] = 0;
775 if (spNoether !=
NULL)
778 p1 = r->p_Procs->pp_Mult_mm_Noether(p1,
m, spNoether, l1, r);
783 p1 = r->p_Procs->pp_Mult_mm(p1,
m, r);
789 while (bucket->buckets[
i] !=
NULL)
793 p1 =
p_Add_q(p1, bucket->buckets[
i],
794 l1, bucket->buckets_length[
i], r);
795 bucket->buckets[
i] =
NULL;
796 bucket->buckets_length[
i] = 0;
800 bucket->buckets[
i] = p1;
801 bucket->buckets_length[
i]=l1;
802 if (
i >= bucket->buckets_used)
803 bucket->buckets_used =
i;
805 kBucketAdjustBucketsUsed(bucket);
806 #else // HAVE_PSEUDO_BUCKETS 836 kBucketMergeLm(bucket);
839 #ifdef USE_COEF_BUCKETS 842 if (i <= bucket->buckets_used && bucket->buckets[
i] !=
NULL)
845 #ifdef USE_COEF_BUCKETS 846 if ((bucket->coef[
i]!=
NULL) &&(
i>=coef_start))
852 number
gcd=
n_Gcd(add_coef, orig_coef,r);
860 orig_coef=orig_coef2;
872 bucket->buckets[
i]=
__p_Mult_nn(bucket->buckets[
i],orig_coef,r);
878 bucket->buckets_length[
i], l1, r);
879 l1=bucket->buckets_length[
i];
880 bucket->buckets[
i]=
NULL;
881 bucket->buckets_length[
i] = 0;
892 bucket->buckets_length[
i], l1, r);
893 l1 = bucket->buckets_length[
i];
894 bucket->buckets[
i] =
NULL;
895 bucket->buckets_length[
i] = 0;
901 #ifdef USE_COEF_BUCKETS 910 p1 = r->p_Procs->pp_Mult_mm(p1,
m, r);
911 #ifdef USE_COEF_BUCKETS 917 while ((bucket->buckets[
i] !=
NULL) && (p1!=
NULL))
920 #ifdef USE_COEF_BUCKETS 921 if ((bucket->coef[
i]!=
NULL) &&(
i>=coef_start))
926 number add_coef=
n_Copy(n,r);
927 number
gcd=
n_Gcd(add_coef, orig_coef,r);
936 orig_coef=orig_coef2;
942 bucket->buckets[
i]=
__p_Mult_nn(bucket->buckets[
i],orig_coef,r);
945 p1 =
p_Add_q(p1, bucket->buckets[
i],r);
948 bucket->buckets[
i]=
NULL;
958 #ifdef USE_COEF_BUCKETS 967 p1 =
p_Add_q(p1, bucket->buckets[
i],
968 l1, bucket->buckets_length[
i], r);
969 bucket->buckets[
i] =
NULL;
970 bucket->buckets_length[
i] = 0;
975 bucket->buckets[
i] = p1;
976 #ifdef USE_COEF_BUCKETS 985 bucket->coef[
i]=
NULL;
992 bucket->buckets_length[
i]=l1;
993 if (
i > bucket->buckets_used)
994 bucket->buckets_used =
i;
996 kBucketAdjustBucketsUsed(bucket);
1042 #ifndef HAVE_PSEUDO_BUCKETS 1043 kBucketMergeLm(bucket);
1044 for (
i=1;
i<=bucket->buckets_used;
i++)
1046 if (bucket->buckets[
i] !=
NULL)
1053 bucket->buckets_length[
i] -=
lq;
1054 assume(
pLength(bucket->buckets[
i]) == (
unsigned)bucket->buckets_length[
i]);
1059 kBucketAdjustBucketsUsed(bucket);
1111 if ((ct == 0) || (ct == 2))
1176 #ifndef USE_COEF_BUCKETS 1179 if (bucket->buckets[0]==
NULL)
return;
1185 if (
cf->cfSubringGcd==
ndGcd)
return;
1187 number nn=
pGetCoeff(bucket->buckets[0]);
1201 for (
int i=1;
i<=bucket->buckets_used;
i++)
1203 if (bucket->buckets[
i]!=
NULL)
1220 for (
int i=0;
i<=bucket->buckets_used;
i++)
1222 if (bucket->buckets[
i]!=
NULL)
1224 poly
p=bucket->buckets[
i];
1240 for (
int i=bucket->buckets_used;
i>=0;
i--)
1242 if (bucket->buckets[
i]!=
NULL)
1244 poly
p=bucket->buckets[
i];
1256 static BOOLEAN nIsPseudoUnit(number n, ring r)
1263 return (
n_Size(n,r->cf)==1);
1282 if ((bucket->buckets[
i]!=
NULL) && (bucket->coef[
i]==
NULL))
1293 if ((bucket->buckets[
i]!=
NULL)
1294 && (nIsPseudoUnit(
p_GetCoeff(bucket->coef[
i],r),r)))
1309 if (bucket->buckets[
i]!=
NULL)
1318 if (nIsPseudoUnit(coef,r))
1335 if (bucket->buckets[
i]!=
NULL)
1353 poly
p=bucket->buckets[
i];
1354 bucket->buckets_length[
i]--;
1355 #ifdef USE_COEF_BUCKETS 1357 if (bucket->coef[
i]!=
NULL)
1363 p=bucket->buckets[
i];
1364 bucket->buckets[
i]=
NULL;
1369 bucket->buckets[
i]=
next;
1380 bucket->buckets[
i]=
pNext(bucket->buckets[
i]);
1401 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.
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)
number ndGcd(number, number, const coeffs r)
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 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 int LOG4(int v)
Some internal stuff.
static FORCE_INLINE void n_Normalize(number &n, const coeffs r)
inplace-normalization of n; produces some canonical representation of n;
void kBucketNormalize(kBucket_pt bucket)
apply n_Normalize to all coefficients
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 number p_SetCoeff(poly p, number n, ring r)
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 rIsPluralRing(const ring r)
we must always have this test!
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)
#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)
static unsigned pLength(poly a)
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.
number p_InitContent(poly ph, const ring r)
static BOOLEAN rField_is_Zp(const ring r)
void p_Normalize(poly p, const ring r)
static void p_Delete(poly *p, const ring r)
#define omGetSpecBin(size)
#define p_LmEqual(p1, p2, r)
const Variable & v
< [in] a sqrfree bivariate poly
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...
#define __p_Mult_nn(p, n, r)
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 BOOLEAN length(leftv result, leftv arg)
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 unsigned int pLogLength(unsigned int l)
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 int SI_LOG2(int v)
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)
kBucket_pt kBucketCreate(const ring bucket_ring)
Creation/Destruction of buckets.
int kBucketCanonicalize(kBucket_pt bucket)
Canonicalizes Bpoly, i.e. converts polys of buckets into one poly in one bucket: Returns number of bu...
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)
void kBucketSimpleContent(kBucket_pt bucket)
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.