My Project
Data Structures | Macros | Functions
kbuckets.h File Reference
#include "polys/monomials/ring.h"
#include "polys/templates/p_Procs.h"

Go to the source code of this file.

Data Structures

class  kBucket
 

Macros

#define MAX_BUCKET   14
 Bucket definition (should be no one elses business, though) More...
 

Functions

kBucket_pt kBucketCreate (const ring r)
 Creation/Destruction of buckets. More...
 
void kBucketDestroy (kBucket_pt *bucket)
 
void kBucketDeleteAndDestroy (kBucket_pt *bucket)
 
void kBucketInit (kBucket_pt bucket, poly p, int length)
 
void kBucketClear (kBucket_pt bucket, poly *p, int *length)
 
poly kBucketClear (kBucket_pt bucket)
 
int kBucketCanonicalize (kBucket_pt bucket)
 Canonicalizes Bpoly, i.e. converts polys of buckets into one poly in one bucket: Returns number of bucket into which it is canonicalized. More...
 
void kBucketNormalize (kBucket_pt bucket)
 apply n_Normalize to all coefficients More...
 
poly kBucketExtractLm (kBucket_pt bucket)
 
void kBucketSetLm (kBucket_pt bucket, poly lm)
 
void kBucketAdjust (kBucket_pt bucket, int i)
 Bucket number i from bucket is out of length sync, resync. More...
 
number kBucketPolyRed (kBucket_pt bucket, poly p, int l, poly spNoether)
 
void kBucketTakeOutComp (kBucket_pt bucket, long comp, poly *p, int *l)
 
void kBucket_Mult_n (kBucket_pt bucket, number n)
 Multiply Bucket by number ,i.e. Bpoly == n*Bpoly. More...
 
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 monomial of append. More...
 
void kBucket_Add_q (kBucket_pt bucket, poly q, int *lq)
 Add to Bucket a poly ,i.e. Bpoly == Bpoly + q. More...
 
poly kBucket_ExtractLarger_Add_q (kBucket_pt bucket, poly append, poly q, int *lq)
 
void kBucket_Minus_m_Mult_p (kBucket_pt bucket, poly m, poly p, int *l, poly spNother=NULL)
 Bpoly == Bpoly - m*p; where m is a monom Does not destroy p and m (TODO: rename into kBucket_Minus_mm_Mult_pp!?) assume (*l <= 0 || pLength(p) == *l) More...
 
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) More...
 
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. More...
 
BOOLEAN kbTest (kBucket_pt bucket)
 Tests. More...
 
poly kBucketGetLm (kBucket_pt bucket, p_kBucketSetLm_Proc_Ptr _p_kBucketSetLm)
 
poly kBucketGetLm (kBucket_pt bucket)
 
poly kBucketExtractLmOfBucket (kBucket_pt bucket, int i)
 
void kBucketSimpleContent (kBucket_pt bucket)
 
BOOLEAN kBucketIsCleared (kBucket_pt bucket)
 
int ksCheckCoeff (number *a, number *b, const coeffs r)
 

Data Structure Documentation

◆ kBucket

class kBucket

Definition at line 178 of file kbuckets.h.

Data Fields
ring bucket_ring
int l
poly p

Macro Definition Documentation

◆ MAX_BUCKET

#define MAX_BUCKET   14

Bucket definition (should be no one elses business, though)

Definition at line 175 of file kbuckets.h.

Function Documentation

◆ kbTest()

BOOLEAN kbTest ( kBucket_pt  bucket)

Tests.

Definition at line 197 of file kbuckets.cc.

198{
199 return TRUE;
200}
#define TRUE
Definition: auxiliary.h:100

◆ kBucket_Add_q()

void kBucket_Add_q ( kBucket_pt  bucket,
poly  q,
int *  l 
)

Add to Bucket a poly ,i.e. Bpoly == Bpoly + q.

Add to Bucket a poly ,i.e. Bpoly == Bpoly + q.

Definition at line 660 of file kbuckets.cc.

661{
662 if (q == NULL) return;
663 assume(*l <= 0 || pLength(q) == *l);
664
665 int i, l1;
666 ring r = bucket->bucket_ring;
667
668 if (*l <= 0)
669 {
670 l1 = pLength(q);
671 *l = l1;
672 }
673 else
674 l1 = *l;
675
676 kBucketMergeLm(bucket);
677 kbTest(bucket);
678 i = pLogLength(l1);
679
680 while (bucket->buckets[i] != NULL)
681 {
682 //MULTIPLY_BUCKET(bucket,i);
683 #ifdef USE_COEF_BUCKETS
684 if (bucket->coef[i]!=NULL)
685 {
686 q = p_Plus_mm_Mult_qq(q, bucket->coef[i], bucket->buckets[i],
687 l1, bucket->buckets_length[i], r);
688 p_Delete(&bucket->coef[i],r);
689 p_Delete(&bucket->buckets[i],r);
690 }
691 else
692 q = p_Add_q(q, bucket->buckets[i],
693 l1, bucket->buckets_length[i], r);
694 #else
695 q = p_Add_q(q, bucket->buckets[i],
696 l1, bucket->buckets_length[i], r);
697 #endif
698 bucket->buckets[i] = NULL;
699 bucket->buckets_length[i] = 0;
700 i = pLogLength(l1);
702 assume(bucket->buckets_used<= MAX_BUCKET);
703 }
704
705 kbTest(bucket);
706 bucket->buckets[i] = q;
707 bucket->buckets_length[i]=l1;
708 if (i >= bucket->buckets_used)
709 bucket->buckets_used = i;
710 else
711 kBucketAdjustBucketsUsed(bucket);
712 kbTest(bucket);
713}
int l
Definition: cfEzgcd.cc:100
int i
Definition: cfEzgcd.cc:132
BOOLEAN kbTest(kBucket_pt bucket)
Tests.
Definition: kbuckets.cc:197
static unsigned int pLogLength(unsigned int l)
Definition: kbuckets.cc:71
ring bucket_ring
Definition: kbuckets.h:192
#define MAX_BUCKET
Bucket definition (should be no one elses business, though)
Definition: kbuckets.h:175
#define assume(x)
Definition: mod2.h:387
#define NULL
Definition: omList.c:12
static poly p_Add_q(poly p, poly q, const ring r)
Definition: p_polys.h:936
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:901
static unsigned pLength(poly a)
Definition: p_polys.h:191
static poly p_Plus_mm_Mult_qq(poly p, poly m, poly q, int &lp, int lq, const ring r)
Definition: p_polys.h:1183

◆ kBucket_ExtractLarger()

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 monomial of append.

Definition at line 1010 of file kbuckets.cc.

1011{
1012 if (q == NULL) return append;
1013 poly lm;
1014 loop
1015 {
1016 lm = kBucketGetLm(bucket);
1017 if (lm == NULL) return append;
1018 if (p_LmCmp(lm, q, bucket->bucket_ring) == 1)
1019 {
1020 lm = kBucketExtractLm(bucket);
1021 pNext(append) = lm;
1022 pIter(append);
1023 }
1024 else
1025 {
1026 return append;
1027 }
1028 }
1029}
CFFList append(const CFFList &Inputlist, const CFFactor &TheFactor)
poly kBucketExtractLm(kBucket_pt bucket)
Definition: kbuckets.cc:511
const poly kBucketGetLm(kBucket_pt bucket)
Definition: kbuckets.cc:506
#define pIter(p)
Definition: monomials.h:37
#define pNext(p)
Definition: monomials.h:36
static int p_LmCmp(poly p, poly q, const ring r)
Definition: p_polys.h:1580
#define loop
Definition: structs.h:75

◆ kBucket_ExtractLarger_Add_q()

poly kBucket_ExtractLarger_Add_q ( kBucket_pt  bucket,
poly  append,
poly  q,
int *  lq 
)
inline

Definition at line 122 of file kbuckets.h.

123{
124 append = kBucket_ExtractLarger(bucket, q, append);
125 kBucket_Add_q(bucket, q, lq);
126 return append;
127}
void kBucket_Add_q(kBucket_pt bucket, poly q, int *lq)
Add to Bucket a poly ,i.e. Bpoly == Bpoly + q.
Definition: kbuckets.cc:660
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...
Definition: kbuckets.cc:1010
Definition: lq.h:40

◆ kBucket_Minus_m_Mult_p()

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 (TODO: rename into kBucket_Minus_mm_Mult_pp!?) assume (*l <= 0 || pLength(p) == *l)

Bpoly == Bpoly - m*p; where m is a monom Does not destroy p and m (TODO: rename into kBucket_Minus_mm_Mult_pp!?) assume (*l <= 0 || pLength(p) == *l)

Definition at line 722 of file kbuckets.cc.

724{
725 assume(*l <= 0 || pLength(p) == *l);
726 int i, l1;
727 poly p1 = p;
728 ring r = bucket->bucket_ring;
729
730 if (*l <= 0)
731 {
732 l1 = pLength(p1);
733 *l = l1;
734 }
735 else
736 l1 = *l;
737
738 if (m == NULL || p == NULL) return;
739
740#ifndef HAVE_PSEUDO_BUCKETS
741 kBucketMergeLm(bucket);
742 kbTest(bucket);
743 i = pLogLength(l1);
744
745#if defined(HAVE_PLURAL)
746 if ((rField_is_Ring(r) && !(rField_is_Domain(r)))
747 ||(rIsPluralRing(r)))
748 {
749 pSetCoeff0(m, n_InpNeg(pGetCoeff(m),r->cf));
750 p1=r->p_Procs->pp_mm_Mult(p,m,r);
751 pSetCoeff0(m, n_InpNeg(pGetCoeff(m),r->cf));
752 l1=pLength(p1);
753 i = pLogLength(l1);
754 }
755 else
756#endif
757 {
758 if ((i <= bucket->buckets_used) && (bucket->buckets[i] != NULL))
759 {
760 assume(pLength(bucket->buckets[i])==(unsigned)bucket->buckets_length[i]);
761//#ifdef USE_COEF_BUCKETS
762// if(bucket->coef[i]!=NULL)
763// {
764// poly mult=p_Mult_mm(bucket->coef[i],m,r);
765// bucket->coef[i]=NULL;
766// p1 = p_Minus_mm_Mult_qq(bucket->buckets[i], mult, p1,
767// bucket->buckets_length[i], l1,
768// spNoether, r);
769// }
770// else
771//#endif
772 MULTIPLY_BUCKET(bucket,i);
773 p1 = p_Minus_mm_Mult_qq(bucket->buckets[i], m, p1,
774 bucket->buckets_length[i], l1,
775 spNoether, r);
776 l1 = bucket->buckets_length[i];
777 bucket->buckets[i] = NULL;
778 bucket->buckets_length[i] = 0;
779 i = pLogLength(l1);
780 }
781 else
782 {
783 pSetCoeff0(m, n_InpNeg(pGetCoeff(m),r->cf));
784 if (spNoether != NULL)
785 {
786 l1 = -1;
787 p1 = r->p_Procs->pp_Mult_mm_Noether(p1, m, spNoether, l1, r);
788 i = pLogLength(l1);
789 }
790 else
791 {
792 p1 = r->p_Procs->pp_mm_Mult(p1, m, r);
793 }
794 pSetCoeff0(m, n_InpNeg(pGetCoeff(m),r->cf));
795 }
796 }
797
798 while (bucket->buckets[i] != NULL)
799 {
800 //kbTest(bucket);
801 MULTIPLY_BUCKET(bucket,i);
802 p1 = p_Add_q(p1, bucket->buckets[i],
803 l1, bucket->buckets_length[i], r);
804 bucket->buckets[i] = NULL;
805 bucket->buckets_length[i] = 0;
806 i = pLogLength(l1);
807 }
808
809 bucket->buckets[i] = p1;
810 bucket->buckets_length[i]=l1;
811 if (i >= bucket->buckets_used)
812 bucket->buckets_used = i;
813 else
814 kBucketAdjustBucketsUsed(bucket);
815#else // HAVE_PSEUDO_BUCKETS
816 bucket->p = p_Minus_mm_Mult_qq(bucket->p, m, p,
817 bucket->l, l1,
818 spNoether, r);
819#endif
820}
int m
Definition: cfEzgcd.cc:128
int p
Definition: cfModGcd.cc:4078
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)
Definition: coeffs.h:557
#define MULTIPLY_BUCKET(B, I)
Definition: kbuckets.cc:43
int l
Definition: kbuckets.h:183
poly p
Definition: kbuckets.h:182
#define pSetCoeff0(p, n)
Definition: monomials.h:59
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
Definition: monomials.h:44
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)
Definition: p_polys.h:1070
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
Definition: ring.h:400
static BOOLEAN rField_is_Domain(const ring r)
Definition: ring.h:488
#define rField_is_Ring(R)
Definition: ring.h:486

◆ kBucket_Mult_n()

void kBucket_Mult_n ( kBucket_pt  bucket,
number  n 
)

Multiply Bucket by number ,i.e. Bpoly == n*Bpoly.

Definition at line 598 of file kbuckets.cc.

599{
600#ifndef HAVE_PSEUDO_BUCKETS
601 kbTest(bucket);
602 ring r=bucket->bucket_ring;
603 int i;
604
605 for (i=0; i<= bucket->buckets_used; i++)
606 {
607 if (bucket->buckets[i] != NULL)
608 {
609#ifdef USE_COEF_BUCKETS
610 if (i<coef_start)
611 bucket->buckets[i] = __p_Mult_nn(bucket->buckets[i], n, r);
612 /* Frank Seelisch on March 11, 2010:
613 This looks a bit strange: The following "if" is indented
614 like the previous line of code. But coded as it is,
615 it should actually be two spaces less indented.
616 Question: Should the following "if" also only be
617 performed when "(i<coef_start)" is true?
618 For the time being, I leave it as it is. */
619 if (rField_is_Ring(r) && !(rField_is_Domain(r)))
620 {
621 bucket->buckets_length[i] = pLength(bucket->buckets[i]);
622 kBucketAdjust(bucket, i);
623 }
624 else
625 if (bucket->coef[i]!=NULL)
626 {
627 bucket->coef[i] = __p_Mult_nn(bucket->coef[i],n,r);
628 }
629 else
630 {
631 bucket->coef[i] = p_NSet(n_Copy(n,r),r);
632 }
633#else
634 bucket->buckets[i] = __p_Mult_nn(bucket->buckets[i], n, r);
635#endif
636 }
637 }
638 if (rField_is_Ring(r) && !(rField_is_Domain(r)))
639 {
640 for (i=0; i<= bucket->buckets_used; i++)
641 {
642 if (bucket->buckets[i] != NULL)
643 {
644 bucket->buckets_length[i] = pLength(bucket->buckets[i]);
645 kBucketAdjust(bucket, i);
646 }
647 }
648 }
649 kbTest(bucket);
650#else
651 bucket->p = __p_Mult_nn(bucket->p, n, bucket->bucket_ring);
652#endif
653}
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
Definition: coeffs.h:451
void kBucketAdjust(kBucket_pt bucket, int i)
Bucket number i from bucket is out of length sync, resync.
Definition: kbuckets.cc:565
poly p_NSet(number n, const ring r)
returns the poly representing the number n, destroys n
Definition: p_polys.cc:1469
#define __p_Mult_nn(p, n, r)
Definition: p_polys.h:971

◆ kBucket_Plus_mm_Mult_pp()

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)

Definition at line 827 of file kbuckets.cc.

828{
830 assume(l <= 0 || pLength(p) == (unsigned)l);
831 int i, l1;
832 poly p1 = p;
833 ring r = bucket->bucket_ring;
834
835 if (m == NULL || p == NULL) return;
836
837 if (l <= 0)
838 {
839 l1 = pLength(p1);
840 l = l1;
841 }
842 else
843 l1 = l;
844
845 kBucketMergeLm(bucket);
846 kbTest(bucket);
847 i = pLogLength(l1);
848 #ifdef USE_COEF_BUCKETS
849 number n=n_Init(1,r->cf);
850 #endif
851 if (i <= bucket->buckets_used && bucket->buckets[i] != NULL)
852 {
853 //if (FALSE){
854 #ifdef USE_COEF_BUCKETS
855 if ((bucket->coef[i]!=NULL) &&(i>=coef_start))
856 {
857 number orig_coef=p_GetCoeff(bucket->coef[i],r);
858 //we take ownership:
859 p_SetCoeff0(bucket->coef[i],n_Init(0,r),r);
860 number add_coef=n_Copy(p_GetCoeff(m,r),r);
861 number gcd=n_Gcd(add_coef, orig_coef,r);
862
863 if (!(n_IsOne(gcd,r)))
864 {
865 number orig_coef2=n_ExactDiv(orig_coef,gcd,r);
866 number add_coef2=n_ExactDiv(add_coef, gcd,r);
867 n_Delete(&orig_coef,r);
868 n_Delete(&add_coef,r);
869 orig_coef=orig_coef2;
870 add_coef=add_coef2;
871
872 //p_Mult_nn(bucket->buckets[i], orig_coef,r);
873 n_Delete(&n,r);
874 n=gcd;
875 }
876
877 //assume(n_IsOne(n,r));
878 number backup=p_GetCoeff(m,r);
879
880 p_SetCoeff0(m,add_coef,r);
881 bucket->buckets[i]=__p_Mult_nn(bucket->buckets[i],orig_coef,r);
882
883 n_Delete(&orig_coef,r);
884 p_Delete(&bucket->coef[i],r);
885
886 p1 = p_Plus_mm_Mult_qq(bucket->buckets[i], m, p1,
887 bucket->buckets_length[i], l1, r);
888 l1=bucket->buckets_length[i];
889 bucket->buckets[i]=NULL;
890 bucket->buckets_length[i] = 0;
891 i = pLogLength(l1);
892 assume(l1==pLength(p1));
893
894 p_SetCoeff(m,backup,r); //deletes add_coef
895 }
896 else
897 #endif
898 {
899 MULTIPLY_BUCKET(bucket,i);
900 p1 = p_Plus_mm_Mult_qq(bucket->buckets[i], m, p1,
901 bucket->buckets_length[i], l1, r);
902 l1 = bucket->buckets_length[i];
903 bucket->buckets[i] = NULL;
904 bucket->buckets_length[i] = 0;
905 i = pLogLength(l1);
906 }
907 }
908 else
909 {
910 #ifdef USE_COEF_BUCKETS
911 number swap_n=p_GetCoeff(m,r);
912
913 assume(n_IsOne(n,r));
914 p_SetCoeff0(m,n,r);
915 n=swap_n;
916 //p_SetCoeff0(n, swap_n, r);
917 //p_GetCoeff0(n, swap_n,r);
918 #endif
919 p1 = r->p_Procs->pp_Mult_mm(p1, m, r);
920 #ifdef USE_COEF_BUCKETS
921 //m may not be changed
922 p_SetCoeff(m,n_Copy(n,r),r);
923 #endif
924 }
925
926 while ((bucket->buckets[i] != NULL) && (p1!=NULL))
927 {
928 assume(i!=0);
929 #ifdef USE_COEF_BUCKETS
930 if ((bucket->coef[i]!=NULL) &&(i>=coef_start))
931 {
932 number orig_coef=p_GetCoeff(bucket->coef[i],r);
933 //we take ownership:
934 p_SetCoeff0(bucket->coef[i],n_Init(0,r),r);
935 number add_coef=n_Copy(n,r);
936 number gcd=n_Gcd(add_coef, orig_coef,r);
937
938 if (!(n_IsOne(gcd,r)))
939 {
940 number orig_coef2=n_ExactDiv(orig_coef,gcd,r);
941 number add_coef2=n_ExactDiv(add_coef, gcd,r);
942 n_Delete(&orig_coef,r);
943 n_Delete(&n,r);
944 n_Delete(&add_coef,r);
945 orig_coef=orig_coef2;
946 add_coef=add_coef2;
947 //p_Mult_nn(bucket->buckets[i], orig_coef,r);
948 n=gcd;
949 }
950 //assume(n_IsOne(n,r));
951 bucket->buckets[i]=__p_Mult_nn(bucket->buckets[i],orig_coef,r);
952 p1=__p_Mult_nn(p1,add_coef,r);
953
954 p1 = p_Add_q(p1, bucket->buckets[i],r);
955 l1=pLength(p1);
956
957 bucket->buckets[i]=NULL;
958 n_Delete(&orig_coef,r);
959 p_Delete(&bucket->coef[i],r);
960 //l1=bucket->buckets_length[i];
961 assume(l1==pLength(p1));
962 }
963 else
964 #endif
965 {
966 //don't do that, pull out gcd
967 #ifdef USE_COEF_BUCKETS
968 if(!(n_IsOne(n,r)))
969 {
970 p1=__p_Mult_nn(p1, n, r);
971 n_Delete(&n,r);
972 n=n_Init(1,r);
973 }
974 #endif
975 MULTIPLY_BUCKET(bucket,i);
976 p1 = p_Add_q(p1, bucket->buckets[i],
977 l1, bucket->buckets_length[i], r);
978 bucket->buckets[i] = NULL;
979 bucket->buckets_length[i] = 0;
980 }
981 i = pLogLength(l1);
982 }
983
984 bucket->buckets[i] = p1;
985#ifdef USE_COEF_BUCKETS
986 assume(bucket->coef[i]==NULL);
987
988 if (!(n_IsOne(n,r)))
989 {
990 bucket->coef[i]=p_NSet(n,r);
991 }
992 else
993 {
994 bucket->coef[i]=NULL;
995 n_Delete(&n,r);
996 }
997
998 if (p1==NULL)
999 p_Delete(&bucket->coef[i],r);
1000#endif
1001 bucket->buckets_length[i]=l1;
1002 if (i > bucket->buckets_used)
1003 bucket->buckets_used = i;
1004 else
1005 kBucketAdjustBucketsUsed(bucket);
1006
1007 kbTest(bucket);
1008}
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,...
Definition: coeffs.h:664
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 ...
Definition: coeffs.h:622
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:455
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
Definition: coeffs.h:538
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition: coeffs.h:468
#define p_SetCoeff0(p, n, r)
Definition: monomials.h:60
#define p_GetCoeff(p, r)
Definition: monomials.h:50
static number p_SetCoeff(poly p, number n, ring r)
Definition: p_polys.h:412
static BOOLEAN p_IsConstant(const poly p, const ring r)
Definition: p_polys.h:2011
int gcd(int a, int b)
Definition: walkSupport.cc:836

◆ kBucketAdjust()

void kBucketAdjust ( kBucket_pt  bucket,
int  i 
)

Bucket number i from bucket is out of length sync, resync.

Definition at line 565 of file kbuckets.cc.

565 {
566
567 MULTIPLY_BUCKET(bucket,i);
568
569 int l1 = bucket->buckets_length[i];
570 poly p1 = bucket->buckets[i];
571 bucket->buckets[i] = NULL;
572 bucket->buckets_length[i] = 0;
573 i = pLogLength(l1);
574
575 while (bucket->buckets[i] != NULL)
576 {
577 //kbTest(bucket);
578 MULTIPLY_BUCKET(bucket,i);
579 p1 = p_Add_q(p1, bucket->buckets[i],
580 l1, bucket->buckets_length[i], bucket->bucket_ring);
581 bucket->buckets[i] = NULL;
582 bucket->buckets_length[i] = 0;
583 i = pLogLength(l1);
584 }
585
586 bucket->buckets[i] = p1;
587 bucket->buckets_length[i]=l1;
588 if (i >= bucket->buckets_used)
589 bucket->buckets_used = i;
590 else
591 kBucketAdjustBucketsUsed(bucket);
592}

◆ kBucketCanonicalize()

int kBucketCanonicalize ( kBucket_pt  bucket)

Canonicalizes Bpoly, i.e. converts polys of buckets into one poly in one bucket: Returns number of bucket into which it is canonicalized.

◆ kBucketClear() [1/2]

poly kBucketClear ( kBucket_pt  bucket)
inline

Definition at line 42 of file kbuckets.h.

43{
44 int dummy;
45 poly p;
46 kBucketClear(bucket, &p, &dummy);
47 return p;
48}
void kBucketClear(kBucket_pt bucket, poly *p, int *length)
Definition: kbuckets.cc:521

◆ kBucketClear() [2/2]

void kBucketClear ( kBucket_pt  bucket,
poly *  p,
int *  length 
)

Definition at line 521 of file kbuckets.cc.

522{
523 assume(pLength(bucket->p) == bucket->l);
524 *p = bucket->p;
525 *length = bucket->l;
526 bucket->p = NULL;
527 bucket->l = 0;
528}
static BOOLEAN length(leftv result, leftv arg)
Definition: interval.cc:257

◆ kBucketCreate()

kBucket_pt kBucketCreate ( const ring  r)

Creation/Destruction of buckets.

Definition at line 209 of file kbuckets.cc.

210{
211 assume(bucket_ring != NULL);
213 bucket->bucket_ring = bucket_ring;
214 return bucket;
215}
STATIC_VAR omBin kBucket_bin
Definition: kbuckets.cc:45
#define omAlloc0Bin(bin)
Definition: omAllocDecl.h:206
kBucket * kBucket_pt
Definition: ring.h:24

◆ kBucketDeleteAndDestroy()

void kBucketDeleteAndDestroy ( kBucket_pt bucket)

Definition at line 223 of file kbuckets.cc.

224{
225 kBucket_pt bucket = *bucket_pt;
226 kbTest(bucket);
227 int i;
228 for (i=0; i<= bucket->buckets_used; i++)
229 {
230 p_Delete(&(bucket->buckets[i]), bucket->bucket_ring);
231#ifdef USE_COEF_BUCKETS
232 p_Delete(&(bucket->coef[i]), bucket->bucket_ring);
233#endif
234 }
235 omFreeBin(bucket, kBucket_bin);
236 *bucket_pt = NULL;
237}
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259

◆ kBucketDestroy()

void kBucketDestroy ( kBucket_pt bucket)

Definition at line 216 of file kbuckets.cc.

217{
218 omFreeBin(*bucket_pt, kBucket_bin);
219 *bucket_pt = NULL;
220}

◆ kBucketExtractLm()

poly kBucketExtractLm ( kBucket_pt  bucket)
inline

Definition at line 231 of file kbuckets.h.

232{
233 poly lm = kBucketGetLm(bucket);
234 #ifdef HAVE_COEF_BUCKETS
235 assume(bucket->coef[0]==NULL);
236 #endif
237 bucket->buckets[0] = NULL;
238 bucket->buckets_length[0] = 0;
239
240 return lm;
241}
poly kBucketGetLm(kBucket_pt bucket, p_kBucketSetLm_Proc_Ptr _p_kBucketSetLm)
Definition: kbuckets.h:208

◆ kBucketExtractLmOfBucket()

poly kBucketExtractLmOfBucket ( kBucket_pt  bucket,
int  i 
)

Definition at line 1382 of file kbuckets.cc.

1383{
1384 assume(bucket->buckets[i]!=NULL);
1385
1386 poly p=bucket->buckets[i];
1387 bucket->buckets_length[i]--;
1388#ifdef USE_COEF_BUCKETS
1389 ring r=bucket->bucket_ring;
1390 if (bucket->coef[i]!=NULL)
1391 {
1392 poly next=pNext(p);
1393 if (next==NULL)
1394 {
1395 MULTIPLY_BUCKET(bucket,i);
1396 p=bucket->buckets[i];
1397 bucket->buckets[i]=NULL;
1398 return p;
1399 }
1400 else
1401 {
1402 bucket->buckets[i]=next;
1403 number c=p_GetCoeff(bucket->coef[i],r);
1404 pNext(p)=NULL;
1405 p=__p_Mult_nn(p,c,r);
1406 assume(p!=NULL);
1407 return p;
1408 }
1409 }
1410 else
1411#endif
1412 {
1413 bucket->buckets[i]=pNext(bucket->buckets[i]);
1414 pNext(p)=NULL;
1415 assume(p!=NULL);
1416 return p;
1417 }
1418}
ListNode * next
Definition: janet.h:31

◆ kBucketGetLm() [1/2]

poly kBucketGetLm ( kBucket_pt  bucket)
inline

Definition at line 226 of file kbuckets.h.

227{
228 return kBucketGetLm(bucket, bucket->bucket_ring->p_Procs->p_kBucketSetLm); // TODO: needs ring :(
229}

◆ kBucketGetLm() [2/2]

poly kBucketGetLm ( kBucket_pt  bucket,
p_kBucketSetLm_Proc_Ptr  _p_kBucketSetLm 
)
inline

Definition at line 208 of file kbuckets.h.

209{
210#ifdef HAVE_COEF_BUCKETS
211 assume(bucket->coef[0]==NULL);
212#endif
213
214 poly& lead = bucket->buckets[0];
215
216 if (lead == NULL)
217 _p_kBucketSetLm(bucket);
218
219#ifdef HAVE_COEF_BUCKETS
220 assume(bucket->coef[0]==NULL);
221#endif
222
223 return lead;
224}

◆ kBucketInit()

void kBucketInit ( kBucket_pt  bucket,
poly  p,
int  length 
)

Definition at line 493 of file kbuckets.cc.

494{
495 int i;
496
497 assume(bucket != NULL);
498 assume(length <= 0 || length == pLength(lm));
499
500 bucket->p = lm;
501 if (length <= 0) bucket->l = pLength(lm);
502 else bucket->l = length;
503
504}

◆ kBucketIsCleared()

BOOLEAN kBucketIsCleared ( kBucket_pt  bucket)

◆ kBucketNormalize()

void kBucketNormalize ( kBucket_pt  bucket)

apply n_Normalize to all coefficients

◆ kBucketPolyRed()

number kBucketPolyRed ( kBucket_pt  bucket,
poly  p,
int  l,
poly  spNoether 
)

Definition at line 1085 of file kbuckets.cc.

1088{
1089 ring r=bucket->bucket_ring;
1090 assume((!rIsPluralRing(r))||p_LmEqual(p1,kBucketGetLm(bucket), r));
1091 assume(p1 != NULL &&
1092 p_DivisibleBy(p1, kBucketGetLm(bucket), r));
1093 assume(pLength(p1) == (unsigned) l1);
1094
1095 poly a1 = pNext(p1), lm = kBucketExtractLm(bucket);
1096 BOOLEAN reset_vec=FALSE;
1097 number rn;
1098
1099 /* we shall reduce bucket=bn*lm+... by p1=an*t+a1 where t=lm(p1)
1100 and an,bn shall be defined further down only if lc(p1)!=1
1101 we already know: an|bn and t|lm */
1102 if(a1==NULL)
1103 {
1104 p_LmDelete(&lm, r);
1105 return n_Init(1,r->cf);
1106 }
1107
1108 if (! n_IsOne(pGetCoeff(p1),r->cf))
1109 {
1110 number an = pGetCoeff(p1), bn = pGetCoeff(lm);
1111//StringSetS("##### an = "); nWrite(an); PrintS(StringEndS("\n")); // NOTE/TODO: use StringAppendS("\n"); omFree(s);
1112//StringSetS("##### bn = "); nWrite(bn); PrintS(StringEndS("\n")); // NOTE/TODO: use StringAppendS("\n"); omFree(s);
1113 /* ksCheckCoeff: divide out gcd from an and bn: */
1114 int ct = ksCheckCoeff(&an, &bn,r->cf);
1115 /* the previous command returns ct=0 or ct=2 iff an!=1
1116 note: an is now 1 or -1 */
1117
1118 /* setup factor for p1 which cancels leading terms */
1119 p_SetCoeff(lm, bn, r);
1120 if ((ct == 0) || (ct == 2))
1121 {
1122 /* next line used to be here before but is WRONG:
1123 kBucket_Mult_n(bucket, an);
1124 its use would result in a wrong sign for the tail of bucket
1125 in the reduction */
1126
1127 /* correct factor for cancelation by changing sign if an=-1 */
1128 if (rField_is_Ring(r))
1129 lm = __p_Mult_nn(lm, an, r);
1130 else
1131 kBucket_Mult_n(bucket, an);
1132 }
1133 rn = an;
1134 }
1135 else
1136 {
1137 rn = n_Init(1,r->cf);
1138 }
1139
1140 if (p_GetComp(p1, r) != p_GetComp(lm, r))
1141 {
1142 p_SetCompP(a1, p_GetComp(lm, r), r);
1143 reset_vec = TRUE;
1144 p_SetComp(lm, p_GetComp(p1, r), r);
1145 p_Setm(lm, r);
1146 }
1147
1148 p_ExpVectorSub(lm, p1, r);
1149 l1--;
1150
1151 assume((unsigned)l1==pLength(a1));
1152
1153#ifdef HAVE_SHIFTBBA
1154 poly lmRight;
1155 poly lm_org;
1156 if (r->isLPring)
1157 {
1158 int firstBlock = p_mFirstVblock(p1, r);
1159 lm_org=lm;
1160 k_SplitFrame(lm, lmRight, si_max(firstBlock, 1), r);
1161 }
1162#endif
1163#if 0
1164 BOOLEAN backuped=FALSE;
1165 number coef;
1166 //@Viktor, don't ignore coefficients on monomials
1167 if(l1==1) {
1168
1169 //if (rField_is_Q(r)) {
1170 //avoid this for function fields, as gcds are expensive at the moment
1171
1172
1173 coef=p_GetCoeff(a1,r);
1174 lm=p_Mult_nn(lm, coef, r);
1175 p_SetCoeff0(a1, n_Init(1,r), r);
1176 backuped=TRUE;
1177 //WARNING: not thread_safe
1178 //deletes coef as side effect
1179 //}
1180 }
1181#endif
1182
1183#ifdef HAVE_SHIFTBBA
1184 if (r->isLPring)
1185 {
1186 poly tmp=r->p_Procs->pp_Mult_mm(a1, lmRight, r);
1187 kBucket_Minus_m_Mult_p(bucket, lm,tmp, &l1, spNoether);
1188 p_Delete(&tmp,r);
1189 p_LmDelete(&lmRight,r);
1190 p_LmDelete(lm_org,r);
1191 }
1192 else
1193#endif
1194 {
1195 kBucket_Minus_m_Mult_p(bucket, lm, a1, &l1, spNoether);
1196 }
1197
1198#if 0
1199 if (backuped)
1200 p_SetCoeff0(a1,coef,r);
1201#endif
1202
1203 p_LmDelete(&lm, r);
1204 if (reset_vec) p_SetCompP(a1, 0, r);
1205 kbTest(bucket);
1206 return rn;
1207}
static int si_max(const int a, const int b)
Definition: auxiliary.h:124
int BOOLEAN
Definition: auxiliary.h:87
#define FALSE
Definition: auxiliary.h:96
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...
Definition: kbuckets.cc:722
void kBucket_Mult_n(kBucket_pt bucket, number n)
Multiply Bucket by number ,i.e. Bpoly == n*Bpoly.
Definition: kbuckets.cc:598
int ksCheckCoeff(number *a, number *b)
#define p_GetComp(p, r)
Definition: monomials.h:64
static void p_LmDelete(poly p, const ring r)
Definition: p_polys.h:723
#define p_LmEqual(p1, p2, r)
Definition: p_polys.h:1731
static void p_SetCompP(poly p, int i, ring r)
Definition: p_polys.h:254
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
Definition: p_polys.h:247
static void p_ExpVectorSub(poly p1, poly p2, const ring r)
Definition: p_polys.h:1440
static void p_Setm(poly p, const ring r)
Definition: p_polys.h:233
static BOOLEAN p_DivisibleBy(poly a, poly b, const ring r)
Definition: p_polys.h:1912
static poly p_Mult_nn(poly p, number n, const ring r)
Definition: p_polys.h:958
int p_mFirstVblock(poly p, const ring ri)
Definition: shiftop.cc:478
void k_SplitFrame(poly &m1, poly &m2, int at, const ring r)
Definition: shiftop.cc:600

◆ kBucketSetLm()

void kBucketSetLm ( kBucket_pt  bucket,
poly  lm 
)

◆ kBucketShallowCopyDelete()

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.

Definition at line 535 of file kbuckets.cc.

538{
539#ifndef HAVE_PSEUDO_BUCKETS
540 int i;
541
542 kBucketCanonicalize(bucket);
543 for (i=0; i<= bucket->buckets_used; i++)
544 if (bucket->buckets[i] != NULL)
545 {
546 MULTIPLY_BUCKET(bucket,i);
547 bucket->buckets[i] = p_shallow_copy_delete(bucket->buckets[i],
548 bucket->bucket_ring,
549 new_tailRing,
550 new_tailBin);
551 }
552#else
553 bucket->p = p_shallow_copy_delete(p,
554 bucket_ring,
555 new_tailRing,
556 new_tailBin);
557#endif
558 bucket->bucket_ring = new_tailRing;
559}
int kBucketCanonicalize(kBucket_pt bucket)
Canonicalizes Bpoly, i.e. converts polys of buckets into one poly in one bucket: Returns number of bu...

◆ kBucketSimpleContent()

void kBucketSimpleContent ( kBucket_pt  bucket)

Definition at line 1210 of file kbuckets.cc.

1211{
1212 if (bucket->buckets[0]==NULL) return;
1213
1214 ring r=bucket->bucket_ring;
1215 if (rField_is_Ring(r)) return;
1216
1217 coeffs cf=r->cf;
1218 if (cf->cfSubringGcd==ndGcd) /* trivial gcd*/ return;
1219
1220 number nn=pGetCoeff(bucket->buckets[0]);
1221 //if ((bucket->buckets_used==0)
1222 //&&(!n_IsOne(nn,cf)))
1223 //{
1224 // if (TEST_OPT_PROT) PrintS("@");
1225 // p_SetCoeff(bucket->buckets[0],n_Init(1,cf),r);
1226 // return;
1227 //}
1228
1229 if (n_Size(nn,cf)<2) return;
1230
1231 //kBucketAdjustBucketsUsed(bucket);
1232 number coef=n_Copy(nn,cf);
1233 // find an initial guess of a gcd
1234 for (int i=1; i<=bucket->buckets_used;i++)
1235 {
1236 if (bucket->buckets[i]!=NULL)
1237 {
1238 number t=p_InitContent(bucket->buckets[i],r);
1239 if (n_Size(t,cf)<2)
1240 {
1241 n_Delete(&t,cf);
1242 n_Delete(&coef,cf);
1243 return;
1244 }
1245 number t2=n_SubringGcd(coef,t,cf);
1246 n_Delete(&t,cf);
1247 n_Delete(&coef,cf);
1248 coef=t2;
1249 if (n_Size(coef,cf)<2) { n_Delete(&coef,cf);return;}
1250 }
1251 }
1252 // find the gcd
1253 for (int i=0; i<=bucket->buckets_used;i++)
1254 {
1255 if (bucket->buckets[i]!=NULL)
1256 {
1257 poly p=bucket->buckets[i];
1258 while(p!=NULL)
1259 {
1260 number t=n_SubringGcd(coef,pGetCoeff(p),cf);
1261 if (n_Size(t,cf)<2)
1262 {
1263 n_Delete(&t,cf);
1264 n_Delete(&coef,cf);
1265 return;
1266 }
1267 pIter(p);
1268 }
1269 }
1270 }
1271 // divided by the gcd
1272 if (TEST_OPT_PROT) PrintS("@");
1273 for (int i=bucket->buckets_used;i>=0;i--)
1274 {
1275 if (bucket->buckets[i]!=NULL)
1276 {
1277 poly p=bucket->buckets[i];
1278 while(p!=NULL)
1279 {
1280 number d = n_ExactDiv(pGetCoeff(p),coef,cf);
1281 p_SetCoeff(p,d,r);
1282 pIter(p);
1283 }
1284 }
1285 }
1286 n_Delete(&coef,cf);
1287}
CanonicalForm cf
Definition: cfModGcd.cc:4083
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...
Definition: coeffs.h:570
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
Definition: coeffs.h:666
The main handler for Singular numbers which are suitable for Singular polynomials.
number ndGcd(number, number, const coeffs r)
Definition: numbers.cc:165
#define TEST_OPT_PROT
Definition: options.h:103
number p_InitContent(poly ph, const ring r)
Definition: p_polys.cc:2700
void PrintS(const char *s)
Definition: reporter.cc:284

◆ kBucketTakeOutComp()

void kBucketTakeOutComp ( kBucket_pt  bucket,
long  comp,
poly *  p,
int *  l 
)

Definition at line 1044 of file kbuckets.cc.

1047{
1048 poly p = NULL, q;
1049 int i, lp = 0, lq;
1050
1051#ifndef HAVE_PSEUDO_BUCKETS
1052 kBucketMergeLm(bucket);
1053 for (i=1; i<=bucket->buckets_used; i++)
1054 {
1055 if (bucket->buckets[i] != NULL)
1056 {
1057 MULTIPLY_BUCKET(bucket,i);
1058 p_TakeOutComp(&(bucket->buckets[i]), comp, &q, &lq, bucket->bucket_ring);
1059 if (q != NULL)
1060 {
1061 assume(pLength(q) == (unsigned)lq);
1062 bucket->buckets_length[i] -= lq;
1063 assume(pLength(bucket->buckets[i]) == (unsigned)bucket->buckets_length[i]);
1064 p = p_Add_q(p, q, lp, lq, bucket->bucket_ring);
1065 }
1066 }
1067 }
1068 kBucketAdjustBucketsUsed(bucket);
1069#else
1070 p_TakeOutComp(&(bucket->p), comp, &p, &lp,bucket->bucket_ring);
1071 (bucket->l) -= lp;
1072#endif
1073 *r_p = p;
1074 *l = lp;
1075
1076 kbTest(bucket);
1077}
int comp(const CanonicalForm &A, const CanonicalForm &B)
compare polynomials
void p_TakeOutComp(poly *p, long comp, poly *q, int *lq, const ring r)
Definition: p_polys.cc:3574

◆ ksCheckCoeff()

int ksCheckCoeff ( number *  a,
number *  b,
const coeffs  r 
)

Definition at line 1431 of file kbuckets.cc.

1432{
1433 int c = 0;
1434 number an = *a, bn = *b;
1435 n_Test(an,r);
1436 n_Test(bn,r);
1437
1438 number cn = n_SubringGcd(an, bn, r);
1439
1440 if(n_IsOne(cn, r))
1441 {
1442 an = n_Copy(an, r);
1443 bn = n_Copy(bn, r);
1444 }
1445 else
1446 {
1447 an = n_ExactDiv(an, cn, r);
1448 bn = n_ExactDiv(bn, cn, r);
1449 }
1450 n_Delete(&cn, r);
1451 if (n_IsOne(an, r))
1452 {
1453 c = 1;
1454 }
1455 if (n_IsOne(bn, r))
1456 {
1457 c += 2;
1458 }
1459 *a = an;
1460 *b = bn;
1461 return c;
1462}
CanonicalForm b
Definition: cfModGcd.cc:4103
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
Definition: coeffs.h:712