47#define ENTER_USE_MEMMOVE
87#ifdef ENTER_USE_MYMEMMOVE
88inline void _my_memmove_d_gt_s(
unsigned long* d,
unsigned long*
s,
long l)
90 REGISTER unsigned long* _dl = (
unsigned long*) d;
91 REGISTER unsigned long* _sl = (
unsigned long*)
s;
102inline void _my_memmove_d_lt_s(
unsigned long* d,
unsigned long*
s,
long l)
105 REGISTER unsigned long* _dl = (
unsigned long*) d;
106 REGISTER unsigned long* _sl = (
unsigned long*)
s;
117inline void _my_memmove(
void* d,
void*
s,
long l)
119 unsigned long _d = (
unsigned long) d;
120 unsigned long _s = (
unsigned long)
s;
121 unsigned long _l = ((
l) + SIZEOF_LONG - 1) >> LOG_SIZEOF_LONG;
123 if (_d > _s) _my_memmove_d_gt_s(_d, _s, _l);
124 else _my_memmove_d_lt_s(_d, _s, _l);
128#define memmove(d,s,l) _my_memmove(d, s, l)
135#define pDivComp_EQUAL 2
136#define pDivComp_LESS 1
137#define pDivComp_GREATER -1
138#define pDivComp_INCOMP 0
151 unsigned long la, lb;
152 unsigned long divmask =
currRing->divmask;
162 if (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask))
169 if (((la & divmask) ^ (lb & divmask)) != ((la - lb) & divmask))
200 unsigned long la, lb;
201 unsigned long divmask =
currRing->divmask;
211 if (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask))
218 if (((la & divmask) ^ (lb & divmask)) != ((la - lb) & divmask))
225 if (
b) {
return -1; }
253 && (L->bucket !=
NULL))
256 for (
int i=1;
i<= (int) L->bucket->buckets_used;
i++)
258 poly
p=L->bucket->buckets[
i];
263 L->bucket->buckets[
i]=
NULL;
264 L->bucket->buckets_length[
i]=0;
273 L->bucket->buckets_length[
i]=
pLength(L->bucket->buckets[
i]);
281 int i=L->bucket->buckets_used;
282 while ((
i>0)&&(L->bucket->buckets[
i]==
NULL))
285 L->bucket->buckets_used=
i;
300 poly
p = L->GetLmTailRing();
311 if (L->bucket !=
NULL)
343 L->ecart = L->pLDeg() - L->GetpFDeg();
350 if ((!fromNext) && cut)
353 L->ecart = L->pLDeg(strat->
LDegLast) - L->GetpFDeg();
378 ring r = L->tailRing;
379 poly
p = L->GetLmTailRing();
457 number eins=
nInit(1);
539inline static unsigned long*
initsevS (
const int maxnr)
541 return (
unsigned long*)
omAlloc0(maxnr*
sizeof(
unsigned long));
545 return (
int*)
omAlloc0(maxnr*
sizeof(
int));
549 int &
length,
const int incr)
561 (
length+incr)*
sizeof(
long*));
579 for (
j=0;
j<=strat->
tl;
j++)
583 if (strat->
T[
j].max_exp !=
NULL)
593 if (strat->
T[
j].t_p !=
NULL)
601 if (
currRing->isLPring && strat->
T[
j].shift > 0)
610 if (
p == strat->
S[
i])
612 if (strat->
T[
j].t_p !=
NULL)
614 if (p_shallow_copy_delete!=
NULL)
638 for (
j=0;
j<=strat->
tl;
j++)
642 if (strat->
T[
j].max_exp !=
NULL)
652 if (strat->
T[
j].t_p !=
NULL)
664 if (
p == strat->
S[
i])
666 if (strat->
T[
j].t_p !=
NULL)
713 if ((*
k) < 0)
return FALSE;
714 if (((p1 == (*p).p1) && (p2 == (*p).p2))
715 || ((p1 == (*p).p2) && (p2 == (*p).p1)))
734 if ((*
k) < 0)
return FALSE;
746 for (
i=0;
i<=tlength;
i++)
748 if (
T[
i].
p ==
p)
return i;
759 if (
i >= 0)
return i;
762 while (strat !=
NULL);
771 for (
i=0;
i<=tlength;
i++)
787 if (
i >= 0)
return i;
790 while (strat !=
NULL);
804#define kFalseReturn(x) do { if (!x) return FALSE;} while (0)
810 for (
i=1;
i<=tailRing->N;
i++)
813 return "Lm[i] different";
816 return "Lm[0] different";
818 return "Lm.next different";
820 return "Lm.coeff different";
827 ring tailRing =
T->tailRing;
828 ring strat_tailRing = strat->
tailRing;
829 if (strat_tailRing ==
NULL) strat_tailRing = tailRing;
830 r_assume(strat_tailRing == tailRing);
852 if (
T->t_p ==
NULL &&
i > 0)
869 if (
T->t_p !=
NULL &&
i >= 0 && TN ==
'T')
873 if (
T->max_exp !=
NULL)
874 return dReportError(
"%c[%d].max_exp is not NULL as it should be", TN,
i);
878 if (
T->max_exp ==
NULL)
890 p_Setm(test_max, tailRing);
902 if (
T->p ==
NULL &&
i > 0)
918 if ((
i >= 0) && (
T->pLength != 0)
923 return dReportError(
"%c[%d] pLength error: has %d, specified to have %d",
928 if (
i >= 0 && (TN ==
'T' || TN ==
'L'))
931 if (strat->
homog && (
T->FDeg !=
T->pFDeg()))
935 return dReportError(
"%c[%d] FDeg error: has %d, specified to have %d",
936 TN,
i ,
T->pFDeg(), d);
941 if (
i >= 0 && TN ==
'T')
953 ring strat_tailRing=strat->
tailRing;
978 if (L->bucket !=
NULL)
981 r_assume(L->bucket->bucket_ring == L->tailRing);
999 return dReportError(
"L[%d] wrong sev: has %lo, specified to have %lo",
1009 else if (tlength > 0 &&
T !=
NULL && (lpos >=0))
1042 -1, strat->
T, strat->
tl));
1045 if (strat->
T !=
NULL)
1047 for (
i=0;
i<=strat->
tl;
i++)
1056 if (strat->
L !=
NULL)
1058 for (
i=0;
i<=strat->
Ll;
i++)
1061 strat->
L[
i].Next() != strat->
tail,
i,
1062 strat->
T, strat->
tl));
1073 if (strat->
S !=
NULL)
1083 for (
i=0;
i<=strat->
sl;
i++)
1085 if (strat->
S[
i] !=
NULL &&
1088 return dReportError(
"S[%d] wrong sev: has %o, specified to have %o",
1104 for (
i=0;
i<=strat->
tl;
i++)
1106 if (strat->
T[
i].i_r < 0 || strat->
T[
i].i_r > strat->
tl)
1107 return dReportError(
"strat->T[%d].i_r == %d out of bounds",
i,
1109 if (strat->
R[strat->
T[
i].i_r] != &(strat->
T[
i]))
1113 if ((strat->
S !=
NULL)&&(strat->
tl>=0))
1115 for (
i=0;
i<=strat->
sl;
i++)
1120 if (strat->
S_2_R[
i] != strat->
T[
j].i_r)
1126 #ifdef HAVE_SHIFTBBA
1131 for (
i=0;
i<=strat->
Ll;
i++)
1133 if (strat->
L[
i].p1 !=
NULL && strat->
L[
i].p2)
1135 if (strat->
L[
i].i_r1 < 0 ||
1136 strat->
L[
i].i_r1 > strat->
tl ||
1137 strat->
L[
i].T_1(strat)->p != strat->
L[
i].p1)
1139 if (strat->
L[
i].i_r2 < 0 ||
1140 strat->
L[
i].i_r2 > strat->
tl ||
1141 strat->
L[
i].T_2(strat)->p != strat->
L[
i].p2)
1146 if (strat->
L[
i].i_r1 != -1)
1148 if (strat->
L[
i].i_r2 != -1)
1151 if (strat->
L[
i].i_r != -1)
1165#ifdef ENTER_USE_MEMMOVE
1166 memmove(&(strat->
S[
i]), &(strat->
S[
i+1]), (strat->
sl -
i)*
sizeof(poly));
1168 memmove(&(strat->
sevS[
i]),&(strat->
sevS[
i+1]),(strat->
sl -
i)*
sizeof(
unsigned long));
1169 memmove(&(strat->
S_2_R[
i]),&(strat->
S_2_R[
i+1]),(strat->
sl -
i)*
sizeof(
int));
1172 for (
j=
i;
j<strat->
sl;
j++)
1174 strat->
S[
j] = strat->
S[
j+1];
1182#ifdef ENTER_USE_MEMMOVE
1183 memmove(&(strat->
lenS[
i]),&(strat->
lenS[
i+1]),(strat->
sl -
i)*
sizeof(
int));
1190#ifdef ENTER_USE_MEMMOVE
1198#ifdef ENTER_USE_MEMMOVE
1199 memmove(&(strat->
fromQ[
i]),&(strat->
fromQ[
i+1]),(strat->
sl -
i)*
sizeof(
int));
1201 for (
j=
i;
j<strat->
sl;
j++)
1217#ifdef ENTER_USE_MEMMOVE
1218 memmove(&(strat->
S[
i]), &(strat->
S[
i+1]), (strat->
sl -
i)*
sizeof(poly));
1219 memmove(&(strat->
sig[
i]), &(strat->
sig[
i+1]), (strat->
sl -
i)*
sizeof(poly));
1221 memmove(&(strat->
sevS[
i]),&(strat->
sevS[
i+1]),(strat->
sl -
i)*
sizeof(
unsigned long));
1222 memmove(&(strat->
sevSig[
i]),&(strat->
sevSig[
i+1]),(strat->
sl -
i)*
sizeof(
unsigned long));
1223 memmove(&(strat->
S_2_R[
i]),&(strat->
S_2_R[
i+1]),(strat->
sl -
i)*
sizeof(
int));
1226 for (
j=
i;
j<strat->
sl;
j++)
1228 strat->
S[
j] = strat->
S[
j+1];
1238#ifdef ENTER_USE_MEMMOVE
1239 memmove(&(strat->
lenS[
i]),&(strat->
lenS[
i+1]),(strat->
sl -
i)*
sizeof(
int));
1246#ifdef ENTER_USE_MEMMOVE
1254#ifdef ENTER_USE_MEMMOVE
1255 memmove(&(strat->
fromQ[
i]),&(strat->
fromQ[
i+1]),(strat->
sl -
i)*
sizeof(
int));
1257 for (
j=
i;
j<strat->
sl;
j++)
1271 && (strat->
P.p1!=
NULL))
1277 for (
int i=lv;
i>0;
i--)
1301 if (set[
j].sig!=
NULL)
1333 #ifdef HAVE_SHIFTBBA
1343#ifdef ENTER_USE_MEMMOVE
1347 for (
i=
j;
i < (*length);
i++)
1369#ifdef ENTER_USE_MEMMOVE
1370 memmove(&((*set)[at+1]), &((*set)[at]), ((*
length)-at+1)*
sizeof(
LObject));
1372 for (
i=(*
length)+1;
i>=at+1;
i--) (*set)[
i] = (*set)[
i-1];
1386 h->FDeg =
h->pFDeg();
1387 h->ecart =
h->pLDeg() -
h->FDeg;
1394 h->FDeg =
h->pFDeg();
1401 Lp->FDeg = Lp->pFDeg();
1408 Lp->FDeg = Lp->pFDeg();
1409 (*Lp).ecart =
si_max(ecartF,ecartG);
1410 (*Lp).ecart = (*Lp).ecart- (Lp->FDeg -
p_FDeg((*Lp).lcm,
currRing));
1419 return (ecart1 <= ecart2);
1451 int j,compare,compareCoeff;
1455 h.ecart=0;
h.length=0;
1479 for(
j = strat->
Bl;
j>=0;
j--)
1600 h.i_r1 = -1;
h.i_r2 = -1;
1616 posx = strat->
posInL(strat->
B,strat->
Bl,&
h,strat);
1621 else strat->
P.sev=0L;
1635 poly m1, m2,
gcd,si;
1664 for (
int j = 0;
j < strat->
sl;
j++)
1670 && !(strat->
sevS[
j] & ~sev)
1713 PrintS(
"\n--- create strong gcd poly: ");
1716 Print(
"\n strat->S[%d]: ",
i);
1739 h.i_r1 = -1;
h.i_r2 = -1;
1745 h.p1 =
p;
h.p2 = strat->
S[
i];
1760 posx = strat->
posInL(strat->
L,strat->
Ll,&
h,strat);
1765 if(
h.IsNull())
return FALSE;
1782 if(strat->
sl < 0)
return FALSE;
1784 for(
i=0;
i<strat->
sl;
i++)
1820 h->i_r1 = -1;
h->i_r2 = -1;
1842 poly m1, m2,
gcd,si;
1890 PrintS(
"\n--- create strong gcd poly: ");
1893 Print(
"\n strat->S[%d]: ",
i);
1917 if(
pLmCmp(pSigMult,sSigMult) == 0)
1926 if(
pLtCmp(pSigMult,sSigMult)==1)
1945 h.i_r1 = -1;
h.i_r2 = -1;
1953 int red_result =
redRing(&
h,strat);
1963 strat->
enterS(strat->
P,strat->
sl+1,strat, strat->
tl+1);
1980 int red_result =
redRing(&
h,strat);
1990 strat->
enterS(strat->
P,strat->
sl+1,strat, strat->
tl+1);
2003 strat->
enterS(strat->
P,strat->
sl+1,strat, strat->
tl+1);
2007 h.p1 =
p;
h.p2 = strat->
S[
i];
2041 Lp.ecart=0; Lp.length=0;
2046#ifndef HAVE_RATGRING
2048#elif defined(HAVE_RATGRING)
2065 if((!((strat->
ecartS[
i]>0)&&(ecart>0)))
2158 for(
j = strat->
Bl;
j>=0;
j--)
2257 Lp.p1 = strat->
S[
i];
2271 Lp.i_r1 = strat->
S_2_R[
i];
2285 && (Lp.p->coef!=
NULL))
2289 l = strat->
posInL(strat->
B,strat->
Bl,&Lp,strat);
2329 Lp.ecart=0; Lp.length=0;
2336 if((!((strat->
ecartS[
i]>0)&&(ecart>0)))
2432 for(
j = strat->
Bl;
j>=0;
j--)
2488 Lp.p1 = strat->
S[
i];
2495 Lp.i_r1 = strat->
S_2_R[
i];
2509 && (Lp.p->coef!=
NULL))
2513 l = strat->
posInL(strat->
B,strat->
Bl,&Lp,strat);
2537 unsigned long pSigMultNegSev,sSigMultNegSev;
2541 Lp.ecart=0; Lp.length=0;
2546#ifndef HAVE_RATGRING
2548#elif defined(HAVE_RATGRING)
2572 pSigMultNegSev = ~p_GetShortExpVector(pSigMult,
currRing);
2574 sSigMultNegSev = ~p_GetShortExpVector(sSigMult,
currRing);
2578 PrintS(
"----------------\n");
2581 PrintS(
"----------------\n");
2587 Print(
"IN PAIR GENERATION - COMPARING SIGS: %d\n",sigCmp);
2608 if ( strat->
syzCrit(pSigMult,pSigMultNegSev,strat) ||
2609 strat->
syzCrit(sSigMult,sSigMultNegSev,strat)
2610 || strat->
rewCrit1(sSigMult,sSigMultNegSev,Lp.lcm,strat,
i+1)
2687 Lp.sevSig = ~pSigMultNegSev;
2694 Lp.sevSig = ~sSigMultNegSev;
2705 if (strat->
rewCrit3(Lp.sig,~Lp.sevSig,Lp.p,strat,strat->
sl+1))
2719 Lp.checked = strat->
sl+1;
2726 Lp.prod_crit =
TRUE;
2738 PrintS(
"SIGNATURE OF PAIR: ");
2742 Lp.p1 = strat->
S[
i];
2756 Lp.i_r1 = strat->
S_2_R[
i];
2770 && (Lp.p->coef!=
NULL))
2812 unsigned long pSigMultNegSev,sSigMultNegSev;
2816 Lp.ecart=0; Lp.length=0;
2821#ifndef HAVE_RATGRING
2823#elif defined(HAVE_RATGRING)
2859 if(pSigMult !=
NULL)
2860 pSigMultNegSev = ~p_GetShortExpVector(pSigMult,
currRing);
2862 if(sSigMult !=
NULL)
2863 sSigMultNegSev = ~p_GetShortExpVector(sSigMult,
currRing);
2866 Print(
"----------------\n");
2869 Print(
"----------------\n");
2873 if(pSigMult !=
NULL && sSigMult !=
NULL)
2882 if(pSigMult ==
NULL)
2884 if(sSigMult ==
NULL)
2894 Print(
"IN PAIR GENERATION - COMPARING SIGS: %d\n",sigCmp);
2916 int red_result =
redRing(&Lp,strat);
2926 strat->
enterS(strat->
P,strat->
sl+1,strat, strat->
tl+1);
2928 strat->
enterS(Lp,0,strat,strat->
tl);
2942 Lp.sig =
pCopy(pSigMult);
2971 if ( strat->
syzCrit(pSigMult,pSigMultNegSev,strat) ||
2972 strat->
syzCrit(sSigMult,sSigMultNegSev,strat)
3054 Lp.sig =
pNeg(Lp.sig);
3065 Lp.sevSig = ~pSigMultNegSev;
3072 Lp.sevSig = ~sSigMultNegSev;
3084 if (strat->
rewCrit3(Lp.sig,~Lp.sevSig,Lp.p,strat,strat->
sl+1))
3098 Lp.checked = strat->
sl+1;
3105 Lp.prod_crit =
TRUE;
3117 PrintS(
"SIGNATURE OF PAIR: ");
3121 Lp.p1 = strat->
S[
i];
3136 Lp.i_r1 = strat->
S_2_R[
i];
3150 && (Lp.p->coef!=
NULL))
3158 int red_result =
redRing(&Lp,strat);
3168 strat->
enterS(strat->
P,strat->
sl+1,strat, strat->
tl+1);
3171 strat->
enterS(Lp,0,strat, strat->
tl+1);
3223 Lp.p1 = strat->
S[
i];
3227 Lp.i_r1 = strat->
S_2_R[
i];
3242 && (Lp.p->coef!=
NULL))
3245 l = strat->
posInL(strat->
L,strat->
Ll,&Lp,strat);
3256 int j=strat->
Ll+strat->
Bl+1;
3264 for (
i=strat->
Bl;
i>=0;
i--)
3266 j = strat->
posInL(strat->
L,
j,&(strat->
B[
i]),strat);
3277 int j=strat->
Ll+strat->
Bl+1;
3285 for (
i=strat->
Bl;
i>=0;
i--)
3312 for (
j=0;
j<=strat->
sl;
j++)
3316 for (
i=strat->
Bl;
i>=0;
i--)
3331 for (
j=0;
j<=strat->
sl;
j++)
3335 for (
i=strat->
Bl;
i>=0;
i--)
3358 for (
j=strat->
Ll;
j>=0;
j--)
3364 if (strat->
L[
j].p == strat->
tail)
3410 for (
j=strat->
Ll;
j>=0;
j--)
3430 for(
i=
j-1;
i>=0;
i--)
3449 for (
j=strat->
Ll;
j>=0;
j--)
3451 #ifdef HAVE_SHIFTBBA
3452 if ((strat->
L[
j].p1!=
NULL) &&
3485 if (strat->
L[0].p2 == strat->
tail) strat->
L[0].p2 =
p;
3488 if (strat->
L[
j].p2 ==
p)
3494 if ((strat->
L[
i].p2 ==
p) &&
pLmEqual(strat->
L[
j].lcm,strat->
L[
i].lcm))
3508 strat->
L[
i].p2 = strat->
tail;
3525 else if (strat->
L[
j].p2 == strat->
tail)
3564 if (strat->
L[0].p2 == strat->
tail) strat->
L[0].p2 =
p;
3567 if (strat->
L[
j].p2 ==
p)
3573 if ((strat->
L[
i].p2 ==
p) &&
pLmEqual(strat->
L[
j].lcm,strat->
L[
i].lcm))
3587 strat->
L[
i].p2 = strat->
tail;
3604 else if (strat->
L[
j].p2 == strat->
tail)
3625 for (
j=0;
j<=strat->
sl;
j++)
3629 for (
i=strat->
Bl;
i>=0;
i--)
3637 Print(
"chain-crit-part: S[%d]=",
j);
3639 Print(
" divide B[%d].lcm=",
i);
3661 for (
j=strat->
Ll;
j>=0;
j--)
3667 if (strat->
L[
j].p == strat->
tail)
3671 PrintS(
"chain-crit-part: pCompareChainPart p=");
3673 Print(
" delete L[%d]",
j);
3702 Print(
"chain-crit-part: sugar B[%d].lcm=",
j);
3704 Print(
" delete B[%d]",
i);
3715 Print(
"chain-crit-part: sugar B[%d].lcm=",
i);
3717 Print(
" delete B[%d]",
j);
3737 for (
j=strat->
Ll;
j>=0;
j--)
3745 PrintS(
"chain-crit-part: sugar:pCompareChainPart p=");
3747 Print(
" delete L[%d]",
j);
3765 for(
i=
j-1;
i>=0;
i--)
3771 Print(
"chain-crit-part: equal lcm B[%d].lcm=",
j);
3773 Print(
" delete B[%d]\n",
i);
3790 for (
j=strat->
Ll;
j>=0;
j--)
3798 PrintS(
"chain-crit-part: pCompareChainPart p=");
3800 Print(
" delete L[%d]",
j);
3829 if (strat->
L[0].p2 == strat->
tail) strat->
L[0].p2 =
p;
3832 if (strat->
L[
j].p2 ==
p)
3838 if ((strat->
L[
i].p2 ==
p) &&
pLmEqual(strat->
L[
j].lcm,strat->
L[
i].lcm))
3855 strat->
L[
i].p2 = strat->
tail;
3862 PrintS(
"chain-crit-part: divisible_by p=");
3864 Print(
" delete L[%d]",
l);
3875 PrintS(
"chain-crit-part: divisible_by(2) p=");
3877 Print(
" delete L[%d]",
i);
3888 else if (strat->
L[
j].p2 == strat->
tail)
3916 for (
j=0;
j<=
k;
j++)
3929 for (
j=0;
j<=
k;
j++)
3938 for (
j=0;
j<=
k;
j++)
3951 #ifdef HAVE_RATGRING
3981 for (
j=0;
j<=
k;
j++)
3994 for (
j=0;
j<=
k;
j++)
4003 for (
j=0;
j<=
k;
j++)
4101 for (
j=0;
j<=strat->
sl;
j++)
4105 for (
i=strat->
Bl;
i>=0;
i--)
4112 PrintS(
"--- chain criterion func chainCritRing type 1\n");
4115 PrintS(
" strat->B[i].lcm:");
4120 wrp(strat->
B[
i].lcm);
4135 for (
j=strat->
Ll;
j>=0;
j--)
4148 PrintS(
"--- chain criterion func chainCritRing type 2\n");
4149 PrintS(
"strat->L[j].p:");
4180 if (strat->
L[0].p2 == strat->
tail) strat->
L[0].p2 =
p;
4183 if (strat->
L[
j].p2 ==
p)
4198 PrintS(
"--- chain criterion func chainCritRing type 3\n");
4199 PrintS(
"strat->L[j].lcm:");
4200 wrp(strat->
L[
j].lcm);
4201 PrintS(
" strat->L[i].lcm:");
4202 wrp(strat->
L[
i].lcm);
4216 strat->
L[
i].p2 = strat->
tail;
4233 else if (strat->
L[
j].p2 == strat->
tail)
4259 for (
j=0;
j<=
k;
j++)
4271 for (
j=0;
j<=
k;
j++)
4279 for (
j=0;
j<=
k;
j++)
4291 #ifdef HAVE_RATGRING
4316 && ((iCompH<=strat->syzComp)||(strat->
syzComp==0)))
4363 PrintS(
"--- create zero spoly: ");
4392 posx = strat->
posInL(strat->
L,strat->
Ll,&Lp,strat);
4445 PrintS(
"--- create zero spoly: ");
4473 int red_result =
redRing(&Lp,strat);
4483 strat->
enterS(strat->
P,strat->
sl+1,strat, strat->
tl+1);
4485 strat->
enterS(Lp,0,strat,strat->
tl);
4533 if ( (!strat->
fromT)
4593 if ( (!strat->
fromT)
4618 if ( (!strat->
fromT)
4643 for (
j=0;
j<=
k;
j++)
4646 if ((iCompH==iCompSj)
4657 for (
j=0;
j<=
k;
j++)
4660 if ((iCompH==iCompSj)
4712 int i,
j,at,ecart, s2r;
4716 int new_suc=strat->
sl+1;
4720 for (;
i<=strat->
sl;
i++)
4725 if (new_suc > at) new_suc = at;
4728 sev = strat->
sevS[
i];
4731 for (
j=
i;
j>=at+1;
j--)
4733 strat->
S[
j] = strat->
S[
j-1];
4739 strat->
ecartS[at] = ecart;
4740 strat->
sevS[at] = sev;
4741 strat->
S_2_R[at] = s2r;
4744 for (
j=
i;
j>=at+1;
j--)
4748 strat->
fromQ[at]=fq;
4752 if (new_suc <= strat->sl) *suc=new_suc;
4815 if (cmp == cmp_int)
return an;
4816 if (cmp == -cmp_int)
return en;
4822 if (cmp == cmp_int) en =
i;
4823 else if (cmp == -cmp_int) an =
i;
4839 if (
pLmCmp(set[an],
p) == cmp_int)
return an;
4840 if (
pLmCmp(set[an],
p) == -cmp_int)
return en;
4842 && ((strat->
ecartS[an])>ecart_p))
4848 else if (
pLmCmp(set[
i],
p) == -cmp_int) an=
i;
4852 &&((strat->
ecartS[
i])<ecart_p))
4880 || ((op == o) && (
pLtCmp(set[mon],
p) == -1)))
4891 || ((op == o) && (
pLtCmp(set[an],
p) == -1)))
4898 || ((op == o) && (
pLtCmp(set[
i],
p) == -1)))
4924 || ((op == o) && (
pLtCmp(set[an],
p) == -1)))
4931 || ((op == o) && (
pLtCmp(set[
i],
p) == -1)))
4943 if(end < 0 || end >=
IDELEMS(F))
4945 if (end<0)
return 0;
4952 for(
i=start;
i<end;
i++)
4966 || ((op == o) && (
pLtCmp(set[an],
p) == -1)))
4973 || ((op == o) && (
pLtCmp(set[
i],
p) == -1)))
4998 if (
length==-1)
return 0;
5026 if (
length==-1)
return 0;
5038 if (set[an].
length>
p.length)
return an;
5054 if (
length==-1)
return 0;
5056 int o =
p.GetpFDeg();
5057 int op = set[
length].GetpFDeg();
5071 op= set[an].GetpFDeg();
5078 op = set[
i].GetpFDeg();
5090 if (
length==-1)
return 0;
5092 int o =
p.GetpFDeg();
5093 int op = set[
length].GetpFDeg();
5107 op= set[an].GetpFDeg();
5114 op = set[
i].GetpFDeg();
5131 if (
length==-1)
return 0;
5132 int o =
p.GetpFDeg();
5133 int op = set[
length].GetpFDeg();
5145 op = set[an].GetpFDeg();
5146 if (op > o)
return an;
5147 if (op < 0)
return en;
5149 if (cmp == cmp_int)
return an;
5150 if (cmp == -cmp_int)
return en;
5155 op = set[
i].GetpFDeg();
5157 else if (op < o) an =
i;
5161 if (cmp == cmp_int) en =
i;
5162 else if (cmp == -cmp_int) an =
i;
5207 if (
length==-1)
return 0;
5210 int o =
p.GetpFDeg();
5211 int op = set[
length].GetpFDeg();
5215 || (( op == o) && (set[
length].length ==
p.length)
5226 op = set[an].GetpFDeg();
5228 || (( op == o) && (set[an].
length >
p.length))
5229 || (( op == o) && (set[an].length ==
p.length)
5235 op = set[
i].GetpFDeg();
5237 || (( op == o) && (set[
i].
length >
p.length))
5238 || (( op == o) && (set[
i].length ==
p.length)
5249 if (
length==-1)
return 0;
5252 int o =
p.GetpFDeg();
5253 int op = set[
length].GetpFDeg();
5257 || (( op == o) && (set[
length].length ==
p.length)
5268 op = set[an].GetpFDeg();
5270 || (( op == o) && (set[an].
length >
p.length))
5271 || (( op == o) && (set[an].length ==
p.length)
5277 op = set[
i].GetpFDeg();
5279 || (( op == o) && (set[
i].
length >
p.length))
5280 || (( op == o) && (set[
i].length ==
p.length)
5296 if (
length==-1)
return 0;
5298 int o =
p.GetpFDeg();
5300 if (set[
length].GetpFDeg() <= o)
5310 if (set[an].GetpFDeg() > o)
5315 if (set[
i].GetpFDeg() > o)
5325 if (
length==-1)
return 0;
5326 int ol =
p.GetpLength();
5328 int oo=set[
length].ecart;
5330 if ((oo < op) || ((oo==op) && (set[
length].
length <= ol)))
5340 int oo=set[an].ecart;
5342 || ((oo==op) && (set[an].
pLength > ol)))
5347 int oo=set[
i].ecart;
5349 || ((oo == op) && (set[
i].
pLength > ol)))
5381 if (
length==-1)
return 0;
5383 int o =
p.GetpFDeg() +
p.ecart;
5398 op = set[an].GetpFDeg()+set[an].ecart;
5405 op = set[
i].GetpFDeg()+set[
i].ecart;
5417 if (
length==-1)
return 0;
5419 int o =
p.GetpFDeg() +
p.ecart;
5434 op = set[an].GetpFDeg()+set[an].ecart;
5441 op = set[
i].GetpFDeg()+set[
i].ecart;
5478 if (
length==-1)
return 0;
5480 int o =
p.GetpFDeg() +
p.ecart;
5484 || (( op == o) && (set[
length].ecart >
p.ecart))
5485 || (( op == o) && (set[
length].ecart==
p.ecart)
5496 op = set[an].GetpFDeg()+set[an].ecart;
5498 || (( op == o) && (set[an].ecart <
p.ecart))
5499 || (( op == o) && (set[an].ecart==
p.ecart)
5505 op = set[
i].GetpFDeg()+set[
i].ecart;
5507 || (( op == o) && (set[
i].ecart <
p.ecart))
5508 || (( op == o) && (set[
i].ecart ==
p.ecart)
5519 if (
length==-1)
return 0;
5521 int o =
p.GetpFDeg() +
p.ecart;
5525 || (( op == o) && (set[
length].ecart >
p.ecart))
5526 || (( op == o) && (set[
length].ecart==
p.ecart)
5537 op = set[an].GetpFDeg()+set[an].ecart;
5539 || (( op == o) && (set[an].ecart <
p.ecart))
5540 || (( op == o) && (set[an].ecart==
p.ecart)
5546 op = set[
i].GetpFDeg()+set[
i].ecart;
5548 || (( op == o) && (set[
i].ecart <
p.ecart))
5549 || (( op == o) && (set[
i].ecart ==
p.ecart)
5565 if (
length==-1)
return 0;
5569 int o =
p.GetpFDeg() +
p.ecart;
5578 || ((op == o) && (set[
length].ecart >
p.ecart))
5579 || ((op == o) && (set[
length].ecart==
p.ecart)
5595 int op = set[an].GetpFDeg()+set[an].ecart;
5597 || ((op == o) && (set[an].ecart <
p.ecart))
5598 || ((op == o) && (set[an].ecart==
p.ecart)
5609 int op = set[
i].GetpFDeg()+set[
i].ecart;
5611 || ((op == o) && (set[
i].ecart <
p.ecart))
5612 || ((op == o) && (set[
i].ecart ==
p.ecart)
5626 if (
length==-1)
return 0;
5630 int o =
p.GetpFDeg() +
p.ecart;
5639 || ((op == o) && (set[
length].ecart >
p.ecart))
5640 || ((op == o) && (set[
length].ecart==
p.ecart)
5656 int op = set[an].GetpFDeg()+set[an].ecart;
5658 || ((op == o) && (set[an].ecart <
p.ecart))
5659 || ((op == o) && (set[an].ecart==
p.ecart)
5670 int op = set[
i].GetpFDeg()+set[
i].ecart;
5672 || ((op == o) && (set[
i].ecart <
p.ecart))
5673 || ((op == o) && (set[
i].ecart ==
p.ecart)
5693 if (
length==-1)
return 0;
5696 int op=
p.GetpFDeg();
5698 if (set[
length].ecart < o)
5700 if (set[
length].ecart == o)
5702 int oo=set[
length].GetpFDeg();
5703 if ((oo < op) || ((oo==op) && (set[
length].
length <
p.length)))
5714 if (set[an].ecart > o)
5716 if (set[an].ecart == o)
5718 int oo=set[an].GetpFDeg();
5720 || ((oo==op) && (set[an].
length >
p.length)))
5726 if (set[
i].ecart > o)
5728 else if (set[
i].ecart == o)
5730 int oo=set[
i].GetpFDeg();
5732 || ((oo == op) && (set[
i].
length >
p.length)))
5752 int d=
p->GetpFDeg();
5753 int op=set[
length].GetpFDeg();
5767 op=set[an].GetpFDeg();
5769 || ((op == d) && (
p->p1!=
NULL) && (set[an].p1==
NULL))
5775 op=set[
i].GetpFDeg();
5777 || ((op==d) && (
p->p1!=
NULL) && (set[
i].p1==
NULL))
5890 cmp =
pLtCmp(set[an].sig,
p->sig);
5897 if (set[an].FDeg >
p->FDeg)
5899 if (set[an].FDeg < p->FDeg)
5901 if (set[an].FDeg ==
p->FDeg)
5919 if (set[
i].FDeg >
p->FDeg)
5921 if (set[
i].FDeg < p->FDeg)
5923 if (set[
i].FDeg ==
p->FDeg)
5938 if (
length < 0)
return 0;
5939 if (set[
length].FDeg >
p->FDeg)
5941 if (set[
length].FDeg ==
p->FDeg)
5942 if(set[
length].GetpLength() >
p->GetpLength())
5953 if (set[an].FDeg >
p->FDeg)
5955 if(set[an].FDeg ==
p->FDeg)
5957 if(set[an].GetpLength() >
p->GetpLength())
5961 if(set[an].GetpLength() ==
p->GetpLength())
5978 if (set[
i].FDeg >
p->FDeg)
5982 if(set[
i].FDeg ==
p->FDeg)
5984 if(set[
i].GetpLength() >
p->GetpLength())
5988 if(set[
i].GetpLength() ==
p->GetpLength())
6010 if (strat->
syzl==0)
return 0;
6015 int en= strat->
syzl-1;
6053 int o =
p->GetpFDeg();
6054 int op = set[
length].GetpFDeg();
6066 op = set[an].GetpFDeg();
6073 op = set[
i].GetpFDeg();
6095 int o =
p->GetpFDeg();
6096 int op = set[
length].GetpFDeg();
6108 op = set[an].GetpFDeg();
6115 op = set[
i].GetpFDeg();
6129 int o =
p->GetpFDeg();
6130 int op = set[
length].GetpFDeg();
6142 op = set[an].GetpFDeg();
6149 op = set[
i].GetpFDeg();
6163 if (
length < 0)
return 0;
6173 if (set[an].FDeg >
p->FDeg)
6175 if (set[an].FDeg < p->FDeg)
6177 if (set[an].FDeg ==
p->FDeg)
6185 if (set[an].t_p!=
NULL)
6207 if (set[
i].FDeg >
p->FDeg)
6209 if (set[
i].FDeg < p->FDeg)
6211 if (set[
i].FDeg ==
p->FDeg)
6219 if (set[
i].t_p!=
NULL)
6251 if (coeff == 0)
return -1;
6254 while (tmp % 2 == 0)
6273 if (
length < 0)
return 0;
6275 int o =
p->GetpFDeg();
6276 int op = set[
length].GetpFDeg();
6287 op = set[an].GetpFDeg();
6288 if ((op > o) || ((op == o) && (
pLmCmp(set[an].
p,
p->p) != -
currRing->OrdSgn)))
6293 op = set[
i].GetpFDeg();
6351 int o =
p->GetpFDeg();
6352 int op = set[
length].GetpFDeg();
6356 || ((op == o) && (set[
length].length <=
p->length)
6366 op = set[an].GetpFDeg();
6368 || ((op == o) && (set[an].
length >
p->length))
6369 || ((op == o) && (set[an].length <=
p->length)
6375 op = set[
i].GetpFDeg();
6377 || ((op == o) && (set[
i].
length >
p->length))
6378 || ((op == o) && (set[
i].length <=
p->length)
6392 int o =
p->GetpFDeg();
6393 int op = set[
length].GetpFDeg();
6397 || ((op == o) && (set[
length].length <=
p->length)
6407 op = set[an].GetpFDeg();
6409 || ((op == o) && (set[an].
length >
p->length))
6410 || ((op == o) && (set[an].length <=
p->length)
6416 op = set[
i].GetpFDeg();
6418 || ((op == o) && (set[
i].
length >
p->length))
6419 || ((op == o) && (set[
i].length <=
p->length)
6439 int o =
p->GetpFDeg();
6441 if (set[
length].GetpFDeg() > o)
6451 if (set[an].GetpFDeg() >= o)
6456 if (set[
i].GetpFDeg() >= o)
6474 int o =
p->GetpFDeg() +
p->ecart;
6487 op = set[an].GetpFDeg() + set[an].ecart;
6494 op = set[
i].GetpFDeg() + set[
i].ecart;
6509 int o =
p->GetpFDeg() +
p->ecart;
6522 op = set[an].GetpFDeg() + set[an].ecart;
6529 op = set[
i].GetpFDeg() + set[
i].ecart;
6550 int o =
p->GetpFDeg() +
p->ecart;
6554 && (set[
length].ecart >
p->ecart))
6556 && (set[
length].ecart ==
p->ecart)
6566 if ((set[an].GetpFDeg() + set[an].ecart > o)
6567 || ((set[an].GetpFDeg() + set[an].ecart == o)
6568 && (set[an].ecart >
p->ecart))
6569 || ((set[an].GetpFDeg() + set[an].ecart == o)
6570 && (set[an].ecart ==
p->ecart)
6576 if ((set[
i].GetpFDeg() + set[
i].ecart > o)
6577 || ((set[
i].GetpFDeg() + set[
i].ecart == o)
6578 && (set[
i].ecart >
p->ecart))
6579 || ((set[
i].GetpFDeg() +set[
i].ecart == o)
6580 && (set[
i].ecart ==
p->ecart)
6594 int o =
p->GetpFDeg() +
p->ecart;
6598 && (set[
length].ecart >
p->ecart))
6600 && (set[
length].ecart ==
p->ecart)
6610 if ((set[an].GetpFDeg() + set[an].ecart > o)
6611 || ((set[an].GetpFDeg() + set[an].ecart == o)
6612 && (set[an].ecart >
p->ecart))
6613 || ((set[an].GetpFDeg() + set[an].ecart == o)
6614 && (set[an].ecart ==
p->ecart)
6620 if ((set[
i].GetpFDeg() + set[
i].ecart > o)
6621 || ((set[
i].GetpFDeg() + set[
i].ecart == o)
6622 && (set[
i].ecart >
p->ecart))
6623 || ((set[
i].GetpFDeg() +set[
i].ecart == o)
6624 && (set[
i].ecart ==
p->ecart)
6647 int o =
p->GetpFDeg() +
p->ecart;
6655 && (set[
length].ecart >
p->ecart))
6657 && (set[
length].ecart ==
p->ecart)
6672 if ((set[an].GetpFDeg() + set[an].ecart > o)
6673 || ((set[an].GetpFDeg() + set[an].ecart == o)
6674 && (set[an].ecart >
p->ecart))
6675 || ((set[an].GetpFDeg() + set[an].ecart == o)
6676 && (set[an].ecart ==
p->ecart)
6687 if ((set[
i].GetpFDeg() + set[
i].ecart > o)
6688 || ((set[
i].GetpFDeg() + set[
i].ecart == o)
6689 && (set[
i].ecart >
p->ecart))
6690 || ((set[
i].GetpFDeg() +set[
i].ecart == o)
6691 && (set[
i].ecart ==
p->ecart)
6711 int o =
p->GetpFDeg() +
p->ecart;
6719 && (set[
length].ecart >
p->ecart))
6721 && (set[
length].ecart ==
p->ecart)
6736 if ((set[an].GetpFDeg() + set[an].ecart > o)
6737 || ((set[an].GetpFDeg() + set[an].ecart == o)
6738 && (set[an].ecart >
p->ecart))
6739 || ((set[an].GetpFDeg() + set[an].ecart == o)
6740 && (set[an].ecart ==
p->ecart)
6751 if ((set[
i].GetpFDeg() + set[
i].ecart > o)
6752 || ((set[
i].GetpFDeg() + set[
i].ecart == o)
6753 && (set[
i].ecart >
p->ecart))
6754 || ((set[
i].GetpFDeg() +set[
i].ecart == o)
6755 && (set[
i].ecart ==
p->ecart)
6774 PrintS(
"syzygy criterion checks: ");
6777 for (
int k=0;
k<strat->
syzl;
k++)
6782 Print(
"checking with: %d / %d -- \n",
k,strat->
syzl);
6811 PrintS(
"--- syzygy criterion checks: ");
6836 Print(
"checking with: %d -- ",
k);
6861 PrintS(
"rewritten criterion checks: ");
6864 for(
int k = strat->
sl;
k>=start;
k--)
6868 PrintS(
"checking with: ");
6884 PrintS(
"ALL ELEMENTS OF S\n----------------------------------------\n");
6885 for(
int kk = 0; kk<strat->
sl+1; kk++)
6889 PrintS(
"------------------------------\n");
6919 for (
int ii=strat->
sl; ii>start; ii--)
6925 if (!(
pLmCmp(p1,p2) == 1))
6944 for (
int i=strat->
Bl;
i>-1;
i--)
6965 for (
int ii=strat->
sl; ii>-1; ii--)
6971 if (!(
pLmCmp(p1,p2) == 1))
6992 const unsigned long not_sev = ~L->sev;
6993 const unsigned long* sev = strat->
sevS;
7006 if (
j > end_pos)
return NULL;
7007 #if defined(PDEBUG) || defined(PDIV_DEBUG)
7009 (ecart== LONG_MAX || ecart>= strat->
ecartS[
j]))
7014 if (!(sev[
j] & not_sev) &&
7015 (ecart== LONG_MAX || ecart>= strat->
ecartS[
j]) &&
7029 if (
j > end_pos)
return NULL;
7030 #if defined(PDEBUG) || defined(PDIV_DEBUG)
7037 if (!(sev[
j] & not_sev) &&
7038 (ecart== LONG_MAX || ecart>= strat->
ecartS[
j]) &&
7049 if (strat->
tl < 0 || strat->
S_2_R[
j] == -1)
7070 if (
j > end_pos)
return NULL;
7072 #if defined(PDEBUG) || defined(PDIV_DEBUG)
7076 (ecart== LONG_MAX || ecart>= strat->
ecartS[
j]))
7082 if (! (sev[
j] & not_sev) && (ecart== LONG_MAX || ecart>= strat->
ecartS[
j]))
7085 assume(t !=
NULL && t->t_p !=
NULL && t->tailRing == r && t->p == strat->
S[
j]);
7101 if (
j > end_pos)
return NULL;
7103 #if defined(PDEBUG) || defined(PDIV_DEBUG)
7113 if (! (sev[
j] & not_sev) && (ecart== LONG_MAX || ecart>= strat->
ecartS[
j]))
7116 assume(t !=
NULL && t->t_p !=
NULL && t->tailRing == r && t->p == strat->
S[
j]);
7167 if (With ==
NULL)
break;
7177 return redtail(L, end_pos, strat);
7183 if (hn ==
NULL)
goto all_done;
7204 return redtail(&L, end_pos, strat);
7212 p =
h = L->GetLmTailRing();
7214 return L->GetLmCurrRing();
7249 Ln.SetShortExpVector();
7255 With = &(strat->
T[
j]);
7256 assume(With->GetpLength()==
pLength(With->p != __null ? With->p : With->t_p));
7261 if (With ==
NULL)
break;
7262 assume(With->GetpLength()==
pLength(With->p != __null ? With->p : With->t_p));
7289 pNext(
h) = Ln.LmExtractAndIter();
7292 }
while (!Ln.IsNull());
7295 if (Ln.IsNull())
goto all_done;
7296 if (! withT) With_s.Init(
currRing);
7298 pNext(
h) = Ln.LmExtractAndIter();
7317 return L->GetLmCurrRing();
7325 p =
h = L->GetLmTailRing();
7327 return L->GetLmCurrRing();
7334 Ln.pLength = L->GetpLength() - 1;
7358 Ln.SetShortExpVector();
7364 With = &(strat->
T[
j]);
7369 if (With ==
NULL)
break;
7396 pNext(
h) = Ln.LmExtractAndIter();
7399 }
while (!Ln.IsNull());
7411 if (! withT) With_s.Init(
currRing);
7413 pNext(
h) = Ln.LmExtractAndIter();
7432 return L->GetLmCurrRing();
7442 p =
h = L->GetLmTailRing();
7477 Ln.SetShortExpVector();
7490 With = &(strat->
T[
j]);
7491 assume(With->GetpLength()==
pLength(With->p != __null ? With->p : With->t_p));
7508 pNext(
h) = Ln.LmExtractAndIter();
7511 }
while (!Ln.IsNull());
7519 With = &(strat->
T[
j]);
7520 assume(With->GetpLength()==
pLength(With->p != __null ? With->p : With->t_p));
7537 pNext(
h) = Ln.LmExtractAndIter();
7540 }
while (!Ln.IsNull());
7544 if (Ln.IsNull())
goto all_done;
7546 pNext(
h) = Ln.LmExtractAndIter();
7571 p =
h = L->GetLmTailRing();
7573 return L->GetLmCurrRing();
7580 Ln.pLength = L->GetpLength() - 1;
7593 Ln.SetShortExpVector();
7595 if (With ==
NULL)
break;
7605 poly p_Ln=Ln.GetLmCurrRing();
7606 poly p_With=With->GetLmCurrRing();
7618 if (Ln.bucket!=
NULL)
7649 pNext(
h) = Ln.LmExtractAndIter();
7652 }
while (!Ln.IsNull());
7655 if (Ln.IsNull())
goto all_done;
7658 pNext(
h) = Ln.LmExtractAndIter();
7676 return L->GetLmCurrRing();
7685 p =
h = L->GetLmTailRing();
7687 return L->GetLmCurrRing();
7694 Ln.pLength = L->GetpLength() - 1;
7707 Ln.SetShortExpVector();
7710 if (With ==
NULL)
break;
7719 poly p_Ln=Ln.GetLmCurrRing();
7720 poly p_With=With->GetLmCurrRing();
7733 pNext(
h) = Ln.LmExtractAndIter();
7736 }
while (!Ln.IsNull());
7741 if (Ln.IsNull())
goto all_done;
7743 pNext(
h) = Ln.LmExtractAndIter();
7761 return L->GetLmCurrRing();
7777 if (strat->
Ll != *reduc)
7779 if (strat->
Ll != *reduc-1)
7791 if (red_result == 0)
7793 else if (red_result < 0)
7795 if ((red_result > 0) || ((strat->
Ll % 100)==99))
7797 if (strat->
Ll != *reduc && strat->
Ll > 0)
7814 Print(
"product criterion:%d chain criterion:%d\n",strat->
cp,strat->
c3);
7815 if (hilbcount!=0)
Print(
"hilbert series criterion:%d\n",hilbcount);
7816 #ifdef HAVE_SHIFTBBA
7818 if (strat->
cv!=0)
Print(
"shift V criterion:%d\n",strat->
cv);
7829 if (hilbcount!=0)
Print(
"hilbert series criterion:%d\n",hilbcount);
7830 #ifdef HAVE_SHIFTBBA
7832 if (strat->
cv!=0)
Print(
"shift V criterion:%d\n",strat->
cv);
7847 for (
i=0;
i<=strat->
sl;
i++)
7859 for (
i=0;
i<=strat->
tl;
i++)
7863 if (strat->
T[
i].length==0) strat->
T[
i].length=
pLength(strat->
T[
i].p);
7864 Print(
" o:%ld e:%d l:%d",
7865 strat->
T[
i].pFDeg(),strat->
T[
i].ecart,strat->
T[
i].length);
7870 for (
i=strat->
Ll;
i>=0;
i--)
7879 Print(
" o:%ld e:%d l:%d",
7880 strat->
L[
i].pFDeg(),strat->
L[
i].ecart,strat->
L[
i].length);
7902 strat->
S=strat->
Shdl->m;
7907 memset(strat->
fromQ,0,
i*
sizeof(
int));
7936 strat->
enterS(
h,pos,strat,-1);
7937 strat->
fromQ[pos]=1;
7970 strat->
enterS(
h,pos,strat,-1);
7996 strat->
S=strat->
Shdl->m;
8001 memset(strat->
fromQ,0,
i*
sizeof(
int));
8030 strat->
enterS(
h,pos,strat,-1);
8031 strat->
fromQ[pos]=1;
8063 pos = strat->
posInL(strat->
L,strat->
Ll,&
h,strat);
8093 strat->
S = strat->
Shdl->m;
8106 memset(strat->
fromQ,0,
i*
sizeof(
int));
8135 strat->
enterS(
h,pos,strat,-1);
8136 strat->
fromQ[pos]=1;
8246 for(
i=1;
i<=strat->
sl;
i++)
8258 strat->
syz = (poly *)
omAlloc(ps*
sizeof(poly));
8262#if defined(DEBUGF5) || defined(DEBUGF51)
8263 PrintS(
"------------- GENERATING SYZ RULES NEW ---------------\n");
8270 while (i <= strat->sl)
8300 for (
k = 0;
k<
i;
k++)
8344 for (
k = 0;
k<strat->
sl+1;
k++)
8365 PrintS(
"Principal syzygies:\n");
8368 Print(
"ps %d\n",ps);
8369 PrintS(
"--------------------------------\n");
8379 PrintS(
"--------------------------------\n");
8399 strat->
S=strat->
Shdl->m;
8405 memset(strat->
fromQ,0,
i*
sizeof(
int));
8434 strat->
enterS(
h,pos,strat, strat->
tl+1);
8436 strat->
fromQ[pos]=1;
8464 strat->
enterS(
h,pos,strat, strat->
tl+1);
8506 h.is_normalized = 0;
8513 strat->
enterS(
h,pos,strat, strat->
tl+1);
8543 strat->
S=strat->
Shdl->m;
8549 memset(strat->
fromQ,0,
i*
sizeof(
int));
8578 strat->
enterS(
h,pos,strat, strat->
tl+1);
8580 strat->
fromQ[pos]=1;
8608 strat->
enterS(
h,pos,strat, strat->
tl+1);
8650 h.is_normalized = 0;
8657 strat->
enterS(
h,pos,strat, strat->
tl+1);
8679 unsigned long not_sev = ~ pGetShortExpVector(
h);
8681 while (
j <= maxIndex)
8698 if (!
pIsVector((*p).p) && ((*p).ecart != 0))
8707 h1 = r =
pCopy((*p).p);
8759 unsigned long not_sev = ~ pGetShortExpVector(
h);
8760 while ((j <= strat->sl) && (
pGetComp(strat->
S[
j])!=0))
j++;
8762 while (j<=strat->sl)
8769 not_sev = ~ pGetShortExpVector(
h);
8784 unsigned long not_sev = ~ pGetShortExpVector(
h);
8786 while (
j <= maxIndex)
8793 not_sev = ~ pGetShortExpVector(
h);
8809 unsigned long not_sev = ~ pGetShortExpVector(
h);
8836 not_sev = ~ pGetShortExpVector(
h);
8840 while (
j <= maxIndex);
8870 while (i<=strat->sl)
8881 if (
pCmp(redSi,strat->
S[
i])!=0)
8938 if (any_change)
reorderS(&suc,strat);
8943 for (
i=0;
i<=strat->
sl;
i++)
8981 while (i<=strat->sl)
8993 else if (
pCmp((strat->
S)[
i],redSi)!=0)
9034 if (any_change)
reorderS(&suc,strat);
9035 else { suc=-1;
break; }
9046 for (
i=0;
i<=strat->
sl;
i++)
9074 if (suc!= -1)
updateS(toT,strat);
9094 *
sizeof(
unsigned long));
9121 strat->
Shdl->m=strat->
S;
9123 if (atS <= strat->sl)
9125#ifdef ENTER_USE_MEMMOVE
9126 memmove(&(strat->
S[atS+1]), &(strat->
S[atS]),
9127 (strat->
sl - atS + 1)*
sizeof(poly));
9128 memmove(&(strat->
ecartS[atS+1]), &(strat->
ecartS[atS]),
9129 (strat->
sl - atS + 1)*
sizeof(
int));
9130 memmove(&(strat->
sevS[atS+1]), &(strat->
sevS[atS]),
9131 (strat->
sl - atS + 1)*
sizeof(
unsigned long));
9132 memmove(&(strat->
S_2_R[atS+1]), &(strat->
S_2_R[atS]),
9133 (strat->
sl - atS + 1)*
sizeof(
int));
9135 memmove(&(strat->
lenS[atS+1]), &(strat->
lenS[atS]),
9136 (strat->
sl - atS + 1)*
sizeof(
int));
9138 memmove(&(strat->
lenSw[atS+1]), &(strat->
lenSw[atS]),
9141 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9143 strat->
S[
i] = strat->
S[
i-1];
9149 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9152 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9158#ifdef ENTER_USE_MEMMOVE
9159 memmove(&(strat->
fromQ[atS+1]), &(strat->
fromQ[atS]),
9160 (strat->
sl - atS + 1)*
sizeof(
int));
9162 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9167 strat->
fromQ[atS]=0;
9178 strat->
sevS[atS] =
p.sev;
9180 strat->
S_2_R[atS] = atR;
9190 for (
int i = maxPossibleShift;
i > 0;
i--)
9198 int atS =
posInS(strat, strat->
sl, qq.p, qq.ecart);
9217 *
sizeof(
unsigned long));
9221 *
sizeof(
unsigned long));
9249 strat->
Shdl->m=strat->
S;
9256 if (atS <= strat->sl)
9258#ifdef ENTER_USE_MEMMOVE
9259 memmove(&(strat->
S[atS+1]), &(strat->
S[atS]),
9260 (strat->
sl - atS + 1)*
sizeof(poly));
9261 memmove(&(strat->
sig[atS+1]), &(strat->
sig[atS]),
9262 (strat->
sl - atS + 1)*
sizeof(poly));
9263 memmove(&(strat->
sevSig[atS+1]), &(strat->
sevSig[atS]),
9264 (strat->
sl - atS + 1)*
sizeof(
unsigned long));
9265 memmove(&(strat->
ecartS[atS+1]), &(strat->
ecartS[atS]),
9266 (strat->
sl - atS + 1)*
sizeof(
int));
9267 memmove(&(strat->
sevS[atS+1]), &(strat->
sevS[atS]),
9268 (strat->
sl - atS + 1)*
sizeof(
unsigned long));
9269 memmove(&(strat->
S_2_R[atS+1]), &(strat->
S_2_R[atS]),
9270 (strat->
sl - atS + 1)*
sizeof(
int));
9272 memmove(&(strat->
lenS[atS+1]), &(strat->
lenS[atS]),
9273 (strat->
sl - atS + 1)*
sizeof(
int));
9275 memmove(&(strat->
lenSw[atS+1]), &(strat->
lenSw[atS]),
9278 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9280 strat->
S[
i] = strat->
S[
i-1];
9288 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9291 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9297#ifdef ENTER_USE_MEMMOVE
9298 memmove(&(strat->
fromQ[atS+1]), &(strat->
fromQ[atS]),
9299 (strat->
sl - atS + 1)*
sizeof(
int));
9301 for (
i=strat->
sl+1;
i>=atS+1;
i--)
9306 strat->
fromQ[atS]=0;
9310 strat->
S[atS] =
p.p;
9311 strat->
sig[atS] =
p.sig;
9317 strat->
sevS[atS] =
p.sev;
9327 strat->
sevSig[atS] =
p.sevSig;
9330 strat->
S_2_R[atS] = atR;
9334 Print(
"--- LIST S: %d ---\n",strat->
sl);
9335 for(
k=0;
k<=strat->
sl;
k++)
9339 PrintS(
"--- LIST S END ---\n");
9365 else strat->
P.sev=0;
9373 poly tp = strat->
T[tj].p;
9378 for (
j = 0;
j <= strat->
sl; ++
j)
9392 pos =
posInS(strat, strat->
sl,
p.p,
p.ecart);
9398 for (
i = 0;
i <= strat->
Ll; ++
i)
9422 strat->
enterS(
p, pos, strat, strat->
tl);
9461 for(
i=strat->
tl;
i>=0;
i--)
9463 if (
p.p==strat->
T[
i].p)
9465 printf(
"already in T at pos %d of %d, atT=%d\n",
i,strat->
tl,atT);
9471#ifdef HAVE_TAIL_RING
9474 p.t_p=
p.GetLmTailRing();
9480 if (strat->
tl == strat->
tmax-1)
9482 if (atT <= strat->tl)
9484#ifdef ENTER_USE_MEMMOVE
9485 memmove(&(strat->
T[atT+1]), &(strat->
T[atT]),
9487 memmove(&(strat->
sevT[atT+1]), &(strat->
sevT[atT]),
9488 (strat->
tl-atT+1)*
sizeof(
unsigned long));
9490 for (
i=strat->
tl+1;
i>=atT+1;
i--)
9492#ifndef ENTER_USE_MEMMOVE
9493 strat->
T[
i] = strat->
T[
i-1];
9496 strat->
R[strat->
T[
i].i_r] = &(strat->
T[
i]);
9504 if (!(
currRing->isLPring &&
p.shift > 0))
9520 strat->
T[atT].max_exp =
NULL;
9523 strat->
R[strat->
tl] = &(strat->
T[atT]);
9524 strat->
T[atT].i_r = strat->
tl;
9549 for(
i=strat->
tl;
i>=0;
i--)
9551 if (
p.p==strat->
T[
i].p)
9553 printf(
"already in T at pos %d of %d, atT=%d\n",
i,strat->
tl,atT);
9559#ifdef HAVE_TAIL_RING
9562 p.t_p=
p.GetLmTailRing();
9568 if (strat->
tl == strat->
tmax-1)
9570 if (atT <= strat->tl)
9572#ifdef ENTER_USE_MEMMOVE
9573 memmove(&(strat->
T[atT+1]), &(strat->
T[atT]),
9575 memmove(&(strat->
sevT[atT+1]), &(strat->
sevT[atT]),
9576 (strat->
tl-atT+1)*
sizeof(
unsigned long));
9578 for (
i=strat->
tl+1;
i>=atT+1;
i--)
9580#ifndef ENTER_USE_MEMMOVE
9581 strat->
T[
i] = strat->
T[
i-1];
9584 strat->
R[strat->
T[
i].i_r] = &(strat->
T[
i]);
9602 strat->
T[atT].max_exp =
NULL;
9605 strat->
R[strat->
tl] = &(strat->
T[atT]);
9606 strat->
T[atT].i_r = strat->
tl;
9613 for(
i=strat->
tl;
i>=0;
i--)
9644 (strat->
syzmax)*
sizeof(
unsigned long),
9646 *
sizeof(
unsigned long));
9649 if (atT < strat->syzl)
9651#ifdef ENTER_USE_MEMMOVE
9652 memmove(&(strat->
syz[atT+1]), &(strat->
syz[atT]),
9653 (strat->
syzl-atT+1)*
sizeof(poly));
9654 memmove(&(strat->
sevSyz[atT+1]), &(strat->
sevSyz[atT]),
9655 (strat->
syzl-atT+1)*
sizeof(
unsigned long));
9657 for (
i=strat->
syzl;
i>=atT+1;
i--)
9659#ifndef ENTER_USE_MEMMOVE
9672 strat->
syz[atT] =
p.sig;
9673 strat->
sevSyz[atT] =
p.sevSig;
9676 Print(
"element in strat->syz: %d--%d ",atT+1,strat->
syzmax);
9686 strat->
L[cc].sig, ~strat->
L[cc].sevSig,
currRing)
9700 PrintS(
"--- Syzygies ---\n");
9703 PrintS(
"--------------------------------\n");
9709 PrintS(
"--------------------------------\n");
9791 if (strat->
homog)
PrintS(
"ideal/module is homogeneous\n");
9792 else PrintS(
"ideal/module is not homogeneous\n");
9862 if (strat->
homog)
PrintS(
"ideal/module is homogeneous\n");
9863 else PrintS(
"ideal/module is not homogeneous\n");
10063#ifdef HAVE_SHIFTBBA
10132#ifdef HAVE_SHIFTBBA
10159#ifdef HAVE_SHIFTBBA
10403 if ((r->m[
l]!=
NULL)
10410 if ((
Q->m[q]!=
NULL)
10434 if ((r->m[
l]!=
NULL)
10441 if ((
Q->m[q]!=
NULL)
10485 reduction_found=
TRUE;
10516 reduction_found=
TRUE;
10530 if ( reduction_found)
10620 for (
i=strat->
sl;
i>=low;
i--)
10622 int end_pos=strat->
sl;
10624 if (strat->
ak==0) end_pos=
i-1;
10626 if ((T_j !=
NULL)&&(T_j->p==strat->
S[
i]))
10644 Print(
"to (tailR) S[%d]:",
i);
10656 T_j->max_exp =
NULL;
10659 T_j->pCleardenom();
10699 Print(
"to (-tailR) S[%d]:",
i);
10796 assume(L->i_r1 >= -1 && L->i_r1 <= strat->
tl);
10797 assume(L->i_r2 >= -1 && L->i_r2 <= strat->
tl);
10802 if ((L->i_r1 == -1) || (L->i_r2 == -1) )
10807 if ((L->i_r1>=0)&&(strat->
R[L->i_r1]!=
NULL)) p1_max = (strat->
R[L->i_r1])->max_exp;
10809 if ((L->i_r2>=0)&&(strat->
R[L->i_r2]!=
NULL)) p2_max = (strat->
R[L->i_r2])->max_exp;
10835 poly p1_max = (strat->
R[atR])->max_exp;
10836 poly p2_max = (strat->
R[strat->
S_2_R[atS]])->max_exp;
10857 ideal F =
idCopy(Forig);
10861 ideal monred =
idInit(1,1);
10868 if((posconst != -1) && (!
nIsZero(F->m[posconst]->coef)))
10878 for(
int i=0;
i<idelemQ;
i++)
10886 if((posconst != -1) && (!
nIsZero(monred->m[posconst]->coef)))
10888 pmon =
pCopy(monred->m[posconst]);
10903 II->m[
j++] =
prMapR(F->m[
i], nMap, origR, QQ_ring);
10905 II->m[
j++] =
prMapR(
Q->m[
i], nMap, origR, QQ_ring);
10912 if(II->m[
i] !=
NULL)
10913 II->m[
i+1] = II->m[
i];
10916 poly integer =
NULL;
10924 integer =
pHead(syz->m[
i]);
10931 pmon =
prMapR(integer, nMap2, QQ_ring, origR);
10945 poly mindegmon =
NULL;
10950 if(mindegmon ==
NULL)
10951 mindegmon =
pCopy(one->m[
i]);
10954 if(
p_Deg(one->m[
i], QQ_ring) <
p_Deg(mindegmon, QQ_ring))
10955 mindegmon =
pCopy(one->m[
i]);
10959 if(mindegmon !=
NULL)
10962 if(II->m[
i] !=
NULL)
10963 II->m[
i+1] = II->m[
i];
10964 II->m[0] =
pCopy(mindegmon);
10993 pmon =
prMapR(mindegmon, nMap2, QQ_ring, origR);
11024 poly pH =
h->GetP();
11028 for(
int i = 0;
i<=strat->
sl;
i++)
11038#ifdef HAVE_SHIFTBBA
11063#ifdef HAVE_SHIFTBBA
11091 h->SetLmCurrRing();
11092 if((deleted)&&(
h->p!=
NULL))
11100 poly hSig =
h->sig;
11101 poly pH =
h->GetP();
11105 for(
int i = 0;
i<=strat->
sl;
i++)
11116 if(sigMult!=
NULL &&
pLtCmp(hSig,sigMult) == 1)
11143 if(sigMult!=
NULL &&
pLtCmp(hSig,sigMult) == 1)
11174 h->SetLmCurrRing();
11284 if (expbound == 0) expbound = strat->
tailRing->bitmask << 1;
11301 new_tailRing->pFDeg =
currRing->pFDeg;
11302 new_tailRing->pLDeg =
currRing->pLDeg;
11306 Print(
"[%lu:%d", (
unsigned long) new_tailRing->bitmask, new_tailRing->ExpL_Size);
11315 for (
i=0;
i<=strat->
tl;
i++)
11317 strat->
T[
i].ShallowCopyDelete(new_tailRing, new_tailBin,
11318 p_shallow_copy_delete);
11320 for (
i=0;
i<=strat->
Ll;
i++)
11324 strat->
L[
i].ShallowCopyDelete(new_tailRing, p_shallow_copy_delete);
11326 if ((strat->
P.t_p !=
NULL) ||
11328 strat->
P.ShallowCopyDelete(new_tailRing, p_shallow_copy_delete);
11330 if ((L !=
NULL) && (L->tailRing != new_tailRing))
11333 L->ShallowCopyDelete(new_tailRing, p_shallow_copy_delete);
11339 L->tailRing = new_tailRing;
11342 L->max_exp = t_l->max_exp;
11346 if ((
T !=
NULL) && (
T->tailRing != new_tailRing &&
T->i_r < 0))
11347 T->ShallowCopyDelete(new_tailRing, new_tailBin, p_shallow_copy_delete);
11354 strat->
tailBin = new_tailBin;
11373 unsigned long l = 0;
11379 for (
i=0;
i<= strat->
Ll;
i++)
11383 for (
i=0;
i<=strat->
tl;
i++)
11411 res->block0 = (
int *)
omAlloc0((n+1)*
sizeof(int));
11412 res->block1 = (
int *)
omAlloc0((n+1)*
sizeof(int));
11413 int **wvhdl = (
int **)
omAlloc0((n+1)*
sizeof(
int*));
11414 res->wvhdl = wvhdl;
11415 for (
int i=1;
i<n;
i++)
11417 res->order[
i] = r->order[
i-1];
11418 res->block0[
i] = r->block0[
i-1];
11419 res->block1[
i] = r->block1[
i-1];
11420 res->wvhdl[
i] = r->wvhdl[
i-1];
11440 WarnS(
"error in nc_rComplete");
11459 res->block0 = (
int *)
omAlloc0((n+2)*
sizeof(int));
11460 res->block1 = (
int *)
omAlloc0((n+2)*
sizeof(int));
11461 int **wvhdl = (
int **)
omAlloc0((n+2)*
sizeof(
int*));
11462 res->wvhdl = wvhdl;
11463 for (
int i=2;
i<n+2;
i++)
11465 res->order[
i] = r->order[
i-2];
11466 res->block0[
i] = r->block0[
i-2];
11467 res->block1[
i] = r->block1[
i-2];
11468 res->wvhdl[
i] = r->wvhdl[
i-2];
11473 res->block0[0] = 1;
11475 for (
int i=0;
i<
res->N; ++
i)
11476 res->wvhdl[0][
i] = 1;
11496 WarnS(
"error in nc_rComplete");
11633#ifdef HAVE_TAIL_BIN
11658Timings
for the different possibilities of posInT:
11659 T15 EDL DL EL L 1-2-3
11660Gonnet 43.26 42.30 38.34 41.98 38.40 100.04
11661Hairer_2_1 1.11 1.15 1.04 1.22 1.08 4.7
11662Twomat3 1.62 1.69 1.70 1.65 1.54 11.32
11663ahml 4.48 4.03 4.03 4.38 4.96 26.50
11664c7 15.02 13.98 15.16 13.24 17.31 47.89
11665c8 505.09 407.46 852.76 413.21 499.19 n/a
11666f855 12.65 9.27 14.97 8.78 14.23 33.12
11667gametwo6 11.47 11.35 14.57 11.20 12.02 35.07
11668gerhard_3 2.73 2.83 2.93 2.64 3.12 6.24
11669ilias13 22.89 22.46 24.62 20.60 23.34 53.86
11670noon8 40.68 37.02 37.99 36.82 35.59 877.16
11671rcyclic_19 48.22 42.29 43.99 45.35 51.51 204.29
11672rkat9 82.37 79.46 77.20 77.63 82.54 267.92
11673schwarz_11 16.46 16.81 16.76 16.81 16.72 35.56
11674test016 16.39 14.17 14.40 13.50 14.26 34.07
11675test017 34.70 36.01 33.16 35.48 32.75 71.45
11676test042 10.76 10.99 10.27 11.57 10.45 23.04
11677test058 6.78 6.75 6.51 6.95 6.22 9.47
11678test066 10.71 10.94 10.76 10.61 10.56 19.06
11679test073 10.75 11.11 10.17 10.79 8.63 58.10
11680test086 12.23 11.81 12.88 12.24 13.37 66.68
11681test103 5.05 4.80 5.47 4.64 4.89 11.90
11682test154 12.96 11.64 13.51 12.46 14.61 36.35
11683test162 65.27 64.01 67.35 59.79 67.54 196.46
11684test164 7.50 6.50 7.68 6.70 7.96 17.13
11685virasoro 3.39 3.50 3.35 3.47 3.70 7.66
11695 if (
length==-1)
return 0;
11698 int op=
p.GetpFDeg();
11699 int ol =
p.GetpLength();
11701 if (set[
length].ecart < o)
11703 if (set[
length].ecart == o)
11705 int oo=set[
length].GetpFDeg();
11706 if ((oo < op) || ((oo==op) && (set[
length].
length < ol)))
11717 if (set[an].ecart > o)
11719 if (set[an].ecart == o)
11721 int oo=set[an].GetpFDeg();
11723 || ((oo==op) && (set[an].
pLength > ol)))
11729 if (set[
i].ecart > o)
11731 else if (set[
i].ecart == o)
11733 int oo=set[
i].GetpFDeg();
11735 || ((oo == op) && (set[
i].
pLength > ol)))
11749 if (
length==-1)
return 0;
11751 int op=
p.GetpFDeg();
11752 int ol =
p.GetpLength();
11754 int oo=set[
length].GetpFDeg();
11755 if ((oo < op) || ((oo==op) && (set[
length].
length < ol)))
11765 int oo=set[an].GetpFDeg();
11767 || ((oo==op) && (set[an].
pLength > ol)))
11772 int oo=set[
i].GetpFDeg();
11774 || ((oo == op) && (set[
i].
pLength > ol)))
11785 int ol =
p.GetpLength();
11799 if (set[an].
pLength>ol)
return an;
11826 else Print(
"%p\n",(
void*)strat->
red);
11845#ifdef HAVE_MORE_POS_IN_T
11883 PrintS(
"initEcartPair: ");
11887 Print(
"homog=%d, LazyDegree=%d, LazyPass=%d, ak=%d,\n",
11889 Print(
"honey=%d, sugarCrit=%d, Gebauer=%d, noTailReduction=%d, use_buckets=%d\n",
11895 Print(
"posInLDependsOnLength=%d\n",
11927 PrintS(
"currRing->pFDeg: ");
11942 PrintS(
"ecartWeights: ");
11954#ifdef HAVE_SHIFTBBA
11968#ifdef HAVE_SHIFTBBA
11985#ifdef HAVE_SHIFTBBA
12080#ifdef HAVE_SHIFTBBA
12085 assume(ifromS <= strat->sl);
12184 PrintS(
"\n--- create strong gcd poly: ");
12187 Print(
"\n q (strat->S[%d]): ", ifromS);
12193 pNext(
gcd) =
p_Add_q(
pp_Mult_mm(
pp_mm_Mult(
pNext(
p), m1, strat->
tailRing), m12, strat->
tailRing),
pp_Mult_mm(
pp_mm_Mult(
pNext(q), m2, strat->
tailRing), m22, strat->
tailRing), strat->
tailRing);
12215 h.i_r1 = -1;
h.i_r2 = -1;
12222 if (atR >= 0 && shiftcount == 0 && ifromS >= 0)
12235 posx = strat->
posInL(strat->
L,strat->
Ll,&
h,strat);
12249#ifdef HAVE_SHIFTBBA
12276 int j,compare,compareCoeff;
12280 h.ecart=0;
h.length=0;
12312 for(
j = strat->
Bl;
j>=0;
j--)
12321 if ((strat->
fromQ==
NULL) || (isFromQ==0) || (qisFromQ==0))
12336 if ((strat->
fromQ==
NULL) || (isFromQ==0) || (qisFromQ==0))
12349 if ((strat->
fromQ==
NULL) || (isFromQ==0) || (qisFromQ==0))
12453 h.i_r1 = -1;
h.i_r2 = -1;
12462 if (atR >= 0 && shiftcount == 0 && ifromS >= 0)
12477 posx = strat->
posInL(strat->
B,strat->
Bl,&
h,strat);
12492#ifdef HAVE_SHIFTBBA
12502#ifdef HAVE_SHIFTBBA
12507 assume(q_inS < 0 || strat->S[q_inS] == q);
12517 if (strat->
fromQ !=
NULL && q_inS >= 0)
12518 q_isFromQ = strat->
fromQ[q_inS];
12520 BOOLEAN (*enterPair)(poly, poly, int, int,
kStrategy, int, int, int, int, int);
12529 int neededShift = p_lastVblock - ((
pGetComp(
p) > 0 ||
pGetComp(q) > 0) ? 0 : 1);
12530 int maxPossibleShift =
degbound - q_lastVblock;
12531 int maxShift =
si_min(neededShift, maxPossibleShift);
12532 int firstShift = (q ==
p ? 1 : 0);
12534 for (
int j = firstShift;
j <= maxShift;
j++)
12537 if (enterPair(qq,
p, ecartp, p_isFromQ, strat, -1, ecartq, q_isFromQ,
j, q_inS))
12550 for (
int j = p_lastVblock;
j <= maxPossibleShift;
j++)
12556 enterPair(qq,
p, ecartp, p_isFromQ, strat, -1, ecartq, q_isFromQ, p_lastVblock, q_inS);
12562 return delete_pair;
12566#ifdef HAVE_SHIFTBBA
12572 assume(p_inS < 0 || strat->S[p_inS] ==
p);
12581 if (strat->
fromQ !=
NULL && p_inS >= 0)
12582 p_isFromQ = strat->
fromQ[p_inS];
12587 assume(q_shift <= p_lastVblock);
12594 return enterOnePairShift(q,
p, ecartp, p_isFromQ, strat, -1, ecartq, q_isFromQ, q_shift, -1);
12608#ifdef HAVE_SHIFTBBA
12611#ifdef CRITERION_DEBUG
12616 poly lmq =
pHead(q);
12637 int qfromQ = qisFromQ;
12646 Lp.ecart=0; Lp.length=0;
12656#ifdef CRITERION_DEBUG
12664 if((!((ecartq>0)&&(ecart>0)))
12683#ifdef CRITERION_DEBUG
12689 Lp.ecart =
si_max(ecart,ecartq);
12690 if (strat->
fromT && (ecartq>ecart))
12693#ifdef CRITERION_DEBUG
12715 if ((strat->
fromQ==
NULL) || (isFromQ==0) || (qfromQ==0))
12718#ifdef CRITERION_DEBUG
12721 Print(
"--- chain crit using B[%d].lcm=%s\n",
j,
pString(strat->
B[
j].lcm));
12732#ifdef CRITERION_DEBUG
12735 Print(
"--- chain crit using pair to remove B[%d].lcm=%s\n",
j,
pString(strat->
B[
j].lcm));
12768#ifdef CRITERION_DEBUG
12773 if (strat->
fromT && (ecartq>ecart))
12776#ifdef CRITERION_DEBUG
12788 for(
j = strat->
Bl;
j>=0;
j--)
12794 if ((strat->
fromQ==
NULL) || (isFromQ==0) || (qfromQ==0))
12797#ifdef CRITERION_DEBUG
12800 Print(
"--- chain crit using B[%d].lcm=%s\n",
j,
pString(strat->
B[
j].lcm));
12810#ifdef CRITERION_DEBUG
12813 Print(
"--- chain crit using pair to remove B[%d].lcm=%s\n",
j,
pString(strat->
B[
j].lcm));
12830#ifdef CRITERION_DEBUG
12835 if ((strat->
fromQ!=
NULL) && (isFromQ!=0) && (qfromQ!=0))
12838#ifdef CRITERION_DEBUG
12898#ifdef CRITERION_DEBUG
12915 if ( (atR >= 0) && (shiftcount==0) && (ifromS >=0) )
12932 && (Lp.p->coef!=
NULL))
12936 l = strat->
posInL(strat->
B,strat->
Bl,&Lp,strat);
12938#ifdef CRITERION_DEBUG
12951#ifdef HAVE_SHIFTBBA
12957 if (h_lastVblock == 0)
return;
12968 int maxShift =
degbound - h_lastVblock;
12977 for (
i=0;
i<=maxShift;
i++)
12981 for (
j=0;
j<=
k;
j++)
12986 poly
s = strat->
S[
j];
12997 for (
j=0;
j<=
k;
j++)
12999 poly
s = strat->
S[
j];
13014 else if ((isFromQ)&&(strat->
fromQ!=
NULL))
13017 for (
j=0;
j<=
k;
j++)
13022 poly
s = strat->
S[
j];
13029 for (
i=1;
i<=maxShift;
i++)
13033 for (
j=0;
j<=
k;
j++)
13037 poly
s = strat->
S[
j];
13039 if (
i < s_lastVblock || (
pGetComp(
s) > 0 &&
i == s_lastVblock))
13067 for (
j=0;
j<=
k;
j++)
13069 poly
s = strat->
S[
j];
13073 for (
i=1;
i<=maxShift;
i++)
13077 for (
j=0;
j<=
k;
j++)
13079 poly
s = strat->
S[
j];
13081 if (
i < s_lastVblock || (
pGetComp(
s) > 0 &&
i == s_lastVblock))
13098 if (
i < h_lastVblock)
13124 for (
j=0;
j<=
k;
j++)
13129 poly
s = strat->
S[
j];
13146 for (
j=0;
j<=
k;
j++)
13151 poly
s = strat->
S[
j];
13156 for (
i=1;
i<=maxShift;
i++)
13159 for (
j=0;
j<=
k;
j++)
13164 poly
s = strat->
S[
j];
13166 if (
i <= s_lastVblock)
13183 if (
i <= h_lastVblock)
13219#ifdef HAVE_SHIFTBBA
13225 if (h_lastVblock == 0)
return;
13236 int maxShift =
degbound - h_lastVblock;
13245 for (
i=0;
i<=maxShift;
i++)
13248 for (
j=0;
j<=
k;
j++)
13253 poly
s = strat->
S[
j];
13262 for (
j=0;
j<=
k;
j++)
13264 poly
s = strat->
S[
j];
13279 else if ((isFromQ)&&(strat->
fromQ!=
NULL))
13282 for (
j=0;
j<=
k;
j++)
13287 poly
s = strat->
S[
j];
13294 for (
i=1;
i<=maxShift;
i++)
13297 for (
j=0;
j<=
k;
j++)
13301 poly
s = strat->
S[
j];
13312 for (
j=0;
j<=
k;
j++)
13314 poly
s = strat->
S[
j];
13319 for (
i=1;
i<=maxShift;
i++)
13323 for (
j=0;
j<=
k;
j++)
13325 poly
s = strat->
S[
j];
13340 for (
j=0;
j<=
k;
j++)
13346 poly
s = strat->
S[
j];
13363 for (
j=0;
j<=
k;
j++)
13368 poly
s = strat->
S[
j];
13373 for (
i=1;
i<=maxShift;
i++)
13376 for (
j=0;
j<=
k;
j++)
13381 poly
s = strat->
S[
j];
13403#ifdef HAVE_SHIFTBBA
13412 if ( (!strat->
fromT)
13433#ifdef HAVE_SHIFTBBA
13444 for (
int i = 1;
i <= maxPossibleShift;
i++)
13456#ifdef HAVE_SHIFTBBA
13463 p =
h = L->GetLmTailRing();
13465 return L->GetLmCurrRing();
13472 Ln.pLength = L->GetpLength() - 1;
13480 while(!Ln.IsNull())
13484 Ln.SetShortExpVector();
13490 With = &(strat->
T[
j]);
13495 if (With ==
NULL)
break;
13511 pNext(
h) = Ln.LmExtractAndIter();
13514 }
while (!Ln.IsNull());
13517 if (Ln.IsNull())
goto all_done;
13518 if (! withT) With_s.Init(
currRing);
13520 pNext(
h) = Ln.LmExtractAndIter();
13535 return L->GetLmCurrRing();
static int si_max(const int a, const int b)
static int si_min(const int a, const int b)
static CanonicalForm bound(const CFMatrix &M)
KINLINE poly kNoetherTail()
void(* chainCrit)(poly p, int ecart, kStrategy strat)
pFDegProc pOrigFDeg_TailRing
BOOLEAN(* rewCrit1)(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int start)
BOOLEAN(* rewCrit3)(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int start)
int(* posInL)(const LSet set, const int length, LObject *L, const kStrategy strat)
KINLINE TObject * s_2_t(int i)
void(* initEcartPair)(LObject *h, poly f, poly g, int ecartF, int ecartG)
BOOLEAN(* syzCrit)(poly sig, unsigned long not_sevSig, kStrategy strat)
pShallowCopyDeleteProc p_shallow_copy_delete
void(* enterS)(LObject &h, int pos, kStrategy strat, int atR)
char completeReduce_retry
void(* initEcart)(TObject *L)
KINLINE TObject * S_2_T(int i)
void(* enterOnePair)(int i, poly p, int ecart, int isFromQ, kStrategy strat, int atR)
int(* posInT)(const TSet T, const int tl, LObject &h)
int(* red)(LObject *L, kStrategy strat)
char posInLDependsOnLength
int(* posInLSba)(const LSet set, const int length, LObject *L, const kStrategy strat)
pLDegProc pOrigLDeg_TailRing
static FORCE_INLINE BOOLEAN nCoeff_is_Z(const coeffs r)
@ n_Q
rational (GMP) numbers
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,...
static FORCE_INLINE BOOLEAN n_IsUnit(number n, const coeffs r)
TRUE iff n has a multiplicative inverse in the given coeff field/ring r.
static FORCE_INLINE number n_Ann(number a, const coeffs r)
if r is a ring with zero divisors, return an annihilator!=0 of b otherwise return NULL
static FORCE_INLINE nMapFunc n_SetMap(const coeffs src, const coeffs dst)
set the mapping function pointers for translating numbers from src to dst
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
static FORCE_INLINE number n_Lcm(number a, number b, const coeffs r)
in Z: return the lcm of 'a' and 'b' in Z/nZ, Z/2^kZ: computed as in the case Z in Z/pZ,...
static FORCE_INLINE number n_ExtGcd(number a, number b, number *s, number *t, const coeffs r)
beware that ExtGCD is only relevant for a few chosen coeff. domains and may perform something unexpec...
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
static FORCE_INLINE number n_IntMod(number a, number b, const coeffs r)
for r a field, return n_Init(0,r) always: n_Div(a,b,r)*b+n_IntMod(a,b,r)==a n_IntMod(a,...
static FORCE_INLINE BOOLEAN n_DivBy(number a, number b, const coeffs r)
test whether 'a' is divisible 'b'; for r encoding a field: TRUE iff 'b' does not represent zero in Z:...
static FORCE_INLINE int n_DivComp(number a, number b, const coeffs r)
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
void nKillChar(coeffs r)
undo all initialisations
const CanonicalForm int s
int comp(const CanonicalForm &A, const CanonicalForm &B)
compare polynomials
static int min(int a, int b)
static int max(int a, int b)
void scComputeHC(ideal S, ideal Q, int ak, poly &hEdge, ring tailRing)
ideal idSyzygies(ideal h1, tHomog h, intvec **w, BOOLEAN setSyzComp, BOOLEAN setRegularity, int *deg, GbVariant alg)
#define idDelete(H)
delete an ideal
BOOLEAN idInsertPoly(ideal h1, poly h2)
insert h2 into h1 (if h2 is not the zero polynomial) return TRUE iff h2 was indeed inserted
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
#define idPosConstant(I)
index of generator with leading term in ground ring (if any); otherwise -1
static BOOLEAN length(leftv result, leftv arg)
KINLINE poly k_LmInit_currRing_2_tailRing(poly p, ring tailRing, omBin tailBin)
KINLINE void k_GetStrongLeadTerms(const poly p1, const poly p2, const ring leadRing, poly &m1, poly &m2, poly &lcm, const ring tailRing)
KINLINE int ksReducePolyTailLC_Z(LObject *PR, TObject *PW, LObject *Red)
KINLINE poly ksOldSpolyRed(poly p1, poly p2, poly spNoether)
KINLINE TObject ** initR()
KINLINE int ksReducePolyTail(LObject *PR, TObject *PW, LObject *Red)
KINLINE poly ksOldSpolyRedNew(poly p1, poly p2, poly spNoether)
KINLINE void clearS(poly p, unsigned long p_sev, int *at, int *k, kStrategy strat)
KINLINE BOOLEAN k_GetLeadTerms(const poly p1, const poly p2, const ring p_r, poly &m1, poly &m2, const ring m_r)
KINLINE int ksReducePolyTail_Z(LObject *PR, TObject *PW, LObject *Red)
KINLINE unsigned long * initsevT()
int redLiftstd(LObject *h, kStrategy strat)
BOOLEAN kbTest(kBucket_pt bucket)
Tests.
void kBucketDestroy(kBucket_pt *bucket_pt)
void kBucket_Add_q(kBucket_pt bucket, poly q, int *l)
Add to Bucket a poly ,i.e. Bpoly == q+Bpoly.
int ksCheckCoeff(number *a, number *b)
BOOLEAN pCompareChainPart(poly p, poly p1, poly p2, poly lcm, const ring R)
BOOLEAN pCompareChain(poly p, poly p1, poly p2, poly lcm, const ring R)
Returns TRUE if.
poly ksCreateShortSpoly(poly p1, poly p2, ring tailRing)
int posInL10(const LSet set, const int length, LObject *p, const kStrategy strat)
long kHomModDeg(poly p, ring r)
poly kNF(ideal F, ideal Q, poly p, int syzComp, int lazyReduce)
ideal kStd(ideal F, ideal Q, tHomog h, intvec **w, intvec *hilb, int syzComp, int newIdeal, intvec *vw, s_poly_proc_t sp)
int kFindDivisibleByInT_Z(const kStrategy strat, const LObject *L, const int start)
int redHoney(LObject *h, kStrategy strat)
int redHomog(LObject *h, kStrategy strat)
int redLazy(LObject *h, kStrategy strat)
int redRing(LObject *h, kStrategy strat)
int kFindDivisibleByInT(const kStrategy strat, const LObject *L, const int start)
return -1 if no divisor is found number of first divisor in T, otherwise
void initSbaPos(kStrategy strat)
void message(int i, int *reduc, int *olddeg, kStrategy strat, int red_result)
poly redtail(LObject *L, int end_pos, kStrategy strat)
int posInL17Ring(const LSet set, const int length, LObject *p, const kStrategy)
int posInL17_cRing(const LSet set, const int length, LObject *p, const kStrategy)
int getIndexRng(long coeff)
int posInL110(const LSet set, const int length, LObject *p, const kStrategy)
int posInT17(const TSet set, const int length, LObject &p)
void initBuchMora(ideal F, ideal Q, kStrategy strat)
poly pMove2CurrTail(poly p, kStrategy strat)
int posInTrg0(const TSet set, const int length, LObject &p)
int redFirst(LObject *h, kStrategy strat)
void kMergeBintoL(kStrategy strat)
static void enlargeT(TSet &T, TObject **&R, unsigned long *&sevT, int &length, const int incr)
BOOLEAN arriRewCriterionPre(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int)
void enterSyz(LObject &p, kStrategy strat, int atT)
int posInL11Ring(const LSet set, const int length, LObject *p, const kStrategy)
int redEcart(LObject *h, kStrategy strat)
int posInT11(const TSet set, const int length, LObject &p)
void enterT(LObject &p, kStrategy strat, int atT)
int posInT1(const TSet set, const int length, LObject &p)
void enterTShift(LObject p, kStrategy strat, int atT)
int posInT110Ring(const TSet set, const int length, LObject &p)
BOOLEAN arriRewCriterion(poly, unsigned long, poly, kStrategy strat, int start=0)
void enterSSba(LObject &p, int atS, kStrategy strat, int atR)
BOOLEAN kTest(kStrategy strat)
void initenterpairsSigRing(poly h, poly hSig, int hFrom, int k, int ecart, int isFromQ, kStrategy strat, int atR=-1)
void enterSMoraNF(LObject &p, int atS, kStrategy strat, int atR=-1)
poly redtailBbaBound(LObject *L, int end_pos, kStrategy strat, int bound, BOOLEAN withT, BOOLEAN normalize)
int posInT_EcartpLength(const TSet set, const int length, LObject &p)
TObject * kFindDivisibleByInS_T(kStrategy strat, int end_pos, LObject *L, TObject *T, long ecart)
int posInT0(const TSet, const int length, LObject &)
poly pMoveCurrTail2poly(poly p, kStrategy strat)
BOOLEAN kTest_TS(kStrategy strat)
void enterOnePairNormal(int i, poly p, int ecart, int isFromQ, kStrategy strat, int atR=-1)
int kFindInT(poly p, TSet T, int tlength)
returns index of p in TSet, or -1 if not found
BOOLEAN kCheckStrongCreation(int atR, poly m1, int atS, poly m2, kStrategy strat)
void initenterstrongPairsShift(poly h, int k, int ecart, int isFromQ, kStrategy strat, int atR)
void enterpairsSig(poly h, poly hSig, int hFrom, int k, int ecart, int pos, kStrategy strat, int atR)
static void enterOnePairRingShift(poly q, poly p, int, int isFromQ, kStrategy strat, int atR, int, int qisFromQ, int shiftcount, int ifromS)
static const char * kTest_LmEqual(poly p, poly t_p, ring tailRing)
void enterL(LSet *set, int *length, int *LSetmax, LObject p, int at)
BOOLEAN faugereRewCriterion(poly sig, unsigned long not_sevSig, poly, kStrategy strat, int start=0)
static BOOLEAN enterOneStrongPolyAndEnterOnePairRingShift(poly q, poly p, int ecart, int isFromQ, kStrategy strat, int atR, int ecartq, int qisFromQ, int shiftcount, int ifromS)
void clearSbatch(poly h, int k, int pos, kStrategy strat)
static int pLPDivComp(poly p, poly q)
int posInT2(const TSet set, const int length, LObject &p)
int posInL13(const LSet set, const int length, LObject *p, const kStrategy)
int posInL110Ring(const LSet set, const int length, LObject *p, const kStrategy)
static BOOLEAN enterOnePairWithShifts(int q_inS, poly q, poly p, int ecartp, int p_isFromQ, kStrategy strat, int, int p_lastVblock, int q_lastVblock)
int posInT_pLength(const TSet set, const int length, LObject &p)
static intset initec(const int maxnr)
BOOLEAN kPosInLDependsOnLength(int(*pos_in_l)(const LSet set, const int length, LObject *L, const kStrategy strat))
void enterpairs(poly h, int k, int ecart, int pos, kStrategy strat, int atR)
int posInT13(const TSet set, const int length, LObject &p)
void redtailBbaAlsoLC_Z(LObject *L, int end_pos, kStrategy strat)
BOOLEAN syzCriterionInc(poly sig, unsigned long not_sevSig, kStrategy strat)
static void deleteHCBucket(LObject *L, kStrategy strat)
void initHilbCrit(ideal, ideal, intvec **hilb, kStrategy strat)
static BOOLEAN enterOnePairWithoutShifts(int p_inS, poly q, poly p, int ecartq, int q_isFromQ, kStrategy strat, int, int p_lastVblock, int q_shift)
void chainCritSig(poly p, int, kStrategy strat)
int posInSMonFirst(const kStrategy strat, const int length, const poly p)
void initEcartPairMora(LObject *Lp, poly, poly, int ecartF, int ecartG)
void initenterstrongPairs(poly h, int k, int ecart, int isFromQ, kStrategy strat, int atR=-1)
void superenterpairsSig(poly h, poly hSig, int hFrom, int k, int ecart, int pos, kStrategy strat, int atR)
static poly redMora(poly h, int maxIndex, kStrategy strat)
int posInL0Ring(const LSet set, const int length, LObject *p, const kStrategy)
static int pDivCompRing(poly p, poly q)
BOOLEAN isInPairsetB(poly q, int *k, kStrategy strat)
void initBuchMoraPos(kStrategy strat)
void initenterpairs(poly h, int k, int ecart, int isFromQ, kStrategy strat, int atR)
void initS(ideal F, ideal Q, kStrategy strat)
BOOLEAN kStratChangeTailRing(kStrategy strat, LObject *L, TObject *T, unsigned long expbound)
poly redtailBba(LObject *L, int end_pos, kStrategy strat, BOOLEAN withT, BOOLEAN normalize)
poly redtailBba_Z(LObject *L, int end_pos, kStrategy strat)
ring sbaRing(kStrategy strat, const ring r, BOOLEAN, int)
void initPairtest(kStrategy strat)
static BOOLEAN p_HasNotCF_Lift(poly p1, poly p2, const ring r)
p_HasNotCF for the IDLIFT case and syzComp==1: ignore component
int posInL0(const LSet set, const int length, LObject *p, const kStrategy)
void initSSpecial(ideal F, ideal Q, ideal P, kStrategy strat)
void chainCritOpt_1(poly, int, kStrategy strat)
int posInT11Ring(const TSet set, const int length, LObject &p)
static void enterOnePairRing(int i, poly p, int, int isFromQ, kStrategy strat, int atR)
static poly redBba(poly h, int maxIndex, kStrategy strat)
void cancelunit1(LObject *p, int *suc, int index, kStrategy strat)
poly pCopyL2p(LObject H, kStrategy strat)
void initenterpairsShift(poly h, int k, int ecart, int isFromQ, kStrategy strat, int atR)
static void initenterstrongPairsSig(poly h, poly hSig, int k, int ecart, int isFromQ, kStrategy strat, int atR=-1)
void initenterpairsSig(poly h, poly hSig, int hFrom, int k, int ecart, int isFromQ, kStrategy strat, int atR=-1)
int posInL15(const LSet set, const int length, LObject *p, const kStrategy)
static void enlargeL(LSet *L, int *length, const int incr)
int posInT17_c(const TSet set, const int length, LObject &p)
poly redtailBbaShift(LObject *L, int pos, kStrategy strat, BOOLEAN withT, BOOLEAN normalize)
int posInT_EcartFDegpLength(const TSet set, const int length, LObject &p)
int posInT15(const TSet set, const int length, LObject &p)
void enterT_strong(LObject &p, kStrategy strat, int atT)
void postReduceByMon(LObject *h, kStrategy strat)
used for GB over ZZ: intermediate reduction by monomial elements background: any known constant eleme...
BOOLEAN syzCriterion(poly sig, unsigned long not_sevSig, kStrategy strat)
void HEckeTest(poly pp, kStrategy strat)
int posInLSpecial(const LSet set, const int length, LObject *p, const kStrategy)
STATIC_VAR BOOLEAN sloppy_max
void enterExtendedSpolySig(poly h, poly hSig, kStrategy strat)
void enterpairsShift(poly h, int k, int ecart, int pos, kStrategy strat, int atR)
static void enterOnePairSig(int i, poly p, poly pSig, int, int ecart, int isFromQ, kStrategy strat, int atR=-1)
BOOLEAN kTest_L(LObject *L, kStrategy strat, BOOLEAN testp, int lpos, TSet T, int tlength)
void exitBuchMora(kStrategy strat)
void messageStatSBA(int hilbcount, kStrategy strat)
void initEcartNormal(TObject *h)
int posInS(const kStrategy strat, const int length, const poly p, const int ecart_p)
void updateS(BOOLEAN toT, kStrategy strat)
static BOOLEAN is_shifted_p1(const poly p, const kStrategy strat)
void initSLSba(ideal F, ideal Q, kStrategy strat)
int posInL11Ringls(const LSet set, const int length, LObject *p, const kStrategy)
void enterOnePairSpecial(int i, poly p, int ecart, kStrategy strat, int atR=-1)
static int * initS_2_R(const int maxnr)
int posInL17(const LSet set, const int length, LObject *p, const kStrategy)
void initSyzRules(kStrategy strat)
int posInLSig(const LSet set, const int length, LObject *p, const kStrategy)
void initSbaBuchMora(ideal F, ideal Q, kStrategy strat)
BOOLEAN kCheckSpolyCreation(LObject *L, kStrategy strat, poly &m1, poly &m2)
void cleanT(kStrategy strat)
static void enterOnePairLift(int i, poly p, int ecart, int isFromQ, kStrategy strat, int atR=-1)
int posInT110(const TSet set, const int length, LObject &p)
BOOLEAN kTest_S(kStrategy strat)
int posInSyz(const kStrategy strat, poly sig)
void replaceInLAndSAndT(LObject &p, int tj, kStrategy strat)
void reorderS(int *suc, kStrategy strat)
void enterExtendedSpoly(poly h, kStrategy strat)
int posInL15Ring(const LSet set, const int length, LObject *p, const kStrategy)
BOOLEAN kTest_T(TObject *T, kStrategy strat, int i, char TN)
void kMergeBintoLSba(kStrategy strat)
void deleteHC(LObject *L, kStrategy strat, BOOLEAN fromNext)
void updateResult(ideal r, ideal Q, kStrategy strat)
void superenterpairs(poly h, int k, int ecart, int pos, kStrategy strat, int atR)
static BOOLEAN sugarDivisibleBy(int ecart1, int ecart2)
int posInT19(const TSet set, const int length, LObject &p)
void exitSba(kStrategy strat)
int posInT15Ring(const TSet set, const int length, LObject &p)
int posInT17Ring(const TSet set, const int length, LObject &p)
static BOOLEAN enterOneStrongPoly(int i, poly p, int, int, kStrategy strat, int atR, bool enterTstrong)
BOOLEAN enterOnePairShift(poly q, poly p, int ecart, int isFromQ, kStrategy strat, int atR, int ecartq, int qisFromQ, int shiftcount, int ifromS)
void kDebugPrint(kStrategy strat)
Output some debug info about a given strategy.
int posInLrg0(const LSet set, const int length, LObject *p, const kStrategy)
void deleteInL(LSet set, int *length, int j, kStrategy strat)
void kStratInitChangeTailRing(kStrategy strat)
void chainCritPart(poly p, int ecart, kStrategy strat)
void enterSMora(LObject &p, int atS, kStrategy strat, int atR=-1)
void initBuchMoraCrit(kStrategy strat)
void cleanTSbaRing(kStrategy strat)
int posInT17_cRing(const TSet set, const int length, LObject &p)
void deleteInSSba(int i, kStrategy strat)
static int pDivComp(poly p, poly q)
void completeReduce(kStrategy strat, BOOLEAN withT)
int posInL17_c(const LSet set, const int length, LObject *p, const kStrategy)
void initBuchMoraPosRing(kStrategy strat)
int kFindInTShift(poly p, TSet T, int tlength)
void postReduceByMonSig(LObject *h, kStrategy strat)
static BOOLEAN enterOneStrongPolyShift(poly q, poly p, int, int, kStrategy strat, int atR, int, int, int shiftcount, int ifromS)
void messageSets(kStrategy strat)
void deleteInS(int i, kStrategy strat)
static poly redBba1(poly h, int maxIndex, kStrategy strat)
int posInT_FDegpLength(const TSet set, const int length, LObject &p)
int posInLSigRing(const LSet set, const int length, LObject *p, const kStrategy)
BOOLEAN isInPairsetL(int length, poly p1, poly p2, int *k, kStrategy strat)
BOOLEAN sbaCheckGcdPair(LObject *h, kStrategy strat)
int posInLF5CRing(const LSet set, int start, const int length, LObject *p, const kStrategy)
poly preIntegerCheck(const ideal Forig, const ideal Q)
used for GB over ZZ: look for constant and monomial elements in the ideal background: any known const...
static unsigned long * initsevS(const int maxnr)
void enterpairsSpecial(poly h, int k, int ecart, int pos, kStrategy strat, int atR=-1)
void chainCritNormal(poly p, int ecart, kStrategy strat)
void initEcartBBA(TObject *h)
VAR denominator_list DENOMINATOR_LIST
int posInLRing(const LSet set, const int length, LObject *p, const kStrategy)
static void enterOnePairSigRing(int i, poly p, poly pSig, int, int ecart, int isFromQ, kStrategy strat, int atR=-1)
void enterSBbaShift(LObject &p, int atS, kStrategy strat, int atR)
int posInL11(const LSet set, const int length, LObject *p, const kStrategy)
poly redtailBba_Ring(LObject *L, int end_pos, kStrategy strat)
int posInLF5C(const LSet, const int, LObject *, const kStrategy strat)
void initEcartPairBba(LObject *Lp, poly, poly, int, int)
void messageStat(int hilbcount, kStrategy strat)
static BOOLEAN enterOneStrongPolySig(int i, poly p, poly sig, int, int, kStrategy strat, int atR)
void chainCritRing(poly p, int, kStrategy strat)
void initSSpecialSba(ideal F, ideal Q, ideal P, kStrategy strat)
void initSL(ideal F, ideal Q, kStrategy strat)
int posInIdealMonFirst(const ideal F, const poly p, int start, int end)
void finalReduceByMon(kStrategy strat)
used for GB over ZZ: final reduction by constant elements background: any known constant element of i...
void enterSBba(LObject &p, int atS, kStrategy strat, int atR)
void initSbaCrit(kStrategy strat)
BOOLEAN newHEdge(kStrategy strat)
void cancelunit(LObject *L, BOOLEAN inNF)
denominator_list_s * denominator_list
static int kFindInL1(const poly p, const kStrategy strat)
static LSet initL(int nr=setmaxL)
static void kDeleteLcm(LObject *P)
#define ALLOW_PROD_CRIT(A)
#define REDTAIL_CANONICALIZE
static bool rIsSCA(const ring r)
poly nc_CreateShortSpoly(poly p1, poly p2, const ring r)
static nc_type & ncRingType(nc_struct *p)
poly nc_p_Bracket_qq(poly p, const poly q, const ring r)
returns [p,q], destroys p
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
int dReportError(const char *fmt,...)
#define pFalseReturn(cond)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
#define __p_GetComp(p, r)
#define rRing_has_Comp(r)
STATIC_VAR gmp_float * diff
#define omFreeSize(addr, size)
#define omCheckBinAddrSize(addr, size)
#define omReallocSize(addr, o_size, size)
#define omRealloc0Size(addr, o_size, size)
#define omSizeWOfBin(bin_ptr)
#define TEST_OPT_INTSTRATEGY
#define TEST_OPT_INFREDTAIL
#define TEST_OPT_SUGARCRIT
#define TEST_OPT_DEGBOUND
#define TEST_OPT_NOT_SUGAR
#define TEST_OPT_CANCELUNIT
#define TEST_OPT_CONTENTSB
pShallowCopyDeleteProc pGetShallowCopyDeleteProc(ring, ring)
static int index(p_Length length, p_Ord ord)
poly p_GetMaxExpP(poly p, const ring r)
return monomial r such that GetExp(r,i) is maximum of all monomials in p; coeff == 0,...
void p_Cleardenom_n(poly ph, const ring r, number &c)
long pLDegb(poly p, int *l, const ring r)
long pLDeg1_Totaldegree(poly p, int *l, const ring r)
long p_WFirstTotalDegree(poly p, const ring r)
long pLDeg1_WFirstTotalDegree(poly p, int *l, const ring r)
void pRestoreDegProcs(ring r, pFDegProc old_FDeg, pLDegProc old_lDeg)
long pLDeg1c_WFirstTotalDegree(poly p, int *l, const ring r)
static BOOLEAN p_ExpVectorEqual(poly p1, poly p2, const ring r1, const ring r2)
long pLDeg1c_Deg(poly p, int *l, const ring r)
long pLDeg1(poly p, int *l, const ring r)
unsigned long p_GetShortExpVector(const poly p, const ring r)
long pLDeg1_Deg(poly p, int *l, const ring r)
long p_WTotaldegree(poly p, const ring r)
BOOLEAN p_OneComp(poly p, const ring r)
return TRUE if all monoms have the same component
poly p_Cleardenom(poly p, const ring r)
long pLDeg1c(poly p, int *l, const ring r)
long pLDeg1c_Totaldegree(poly p, int *l, const ring r)
long pLDeg0c(poly p, int *l, const ring r)
unsigned long p_GetMaxExpL(poly p, const ring r, unsigned long l_max)
return the maximal exponent of p in form of the maximal long var
long pLDeg0(poly p, int *l, const ring r)
poly p_Sub(poly p1, poly p2, const ring r)
void pEnlargeSet(poly **p, int l, int increment)
long p_Deg(poly a, const ring r)
void p_Lcm(const poly a, const poly b, poly m, const ring r)
static poly p_Neg(poly p, const ring r)
static void p_ExpVectorSum(poly pr, poly p1, poly p2, const ring r)
static poly p_Add_q(poly p, poly q, const ring r)
static void p_LmDelete(poly p, const ring r)
static void p_ExpVectorAdd(poly p1, poly p2, const ring r)
BOOLEAN p_CheckIsFromRing(poly p, ring r)
static BOOLEAN _p_LmDivisibleByPart(poly a, const ring r_a, poly b, const ring r_b, const int start, const int end)
static long p_FDeg(const poly p, const ring r)
static unsigned long p_GetMaxExp(const unsigned long l, const ring r)
static void p_ExpVectorCopy(poly d_p, poly s_p, const ring r)
static void p_LmDelete0(poly p, const ring r)
static int p_Cmp(poly p1, poly p2, ring r)
#define __pp_Mult_nn(p, n, r)
static poly pp_mm_Mult(poly p, poly m, const ring r)
static poly pp_Mult_mm(poly p, poly m, const ring r)
static int p_LtCmpNoAbs(poly p, poly q, const ring r)
static void p_SetCompP(poly p, int i, ring r)
#define pp_Test(p, lmRing, tailRing)
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
static void p_Setm(poly p, const ring r)
static number p_SetCoeff(poly p, number n, ring r)
static int p_LmCmp(poly p, poly q, const ring r)
static BOOLEAN p_LmShortDivisibleBy(poly a, unsigned long sev_a, poly b, unsigned long not_sev_b, const ring r)
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent @Note: the integer VarOffset encodes:
BOOLEAN p_LmCheckIsFromRing(poly p, ring r)
static BOOLEAN p_LmDivisibleBy(poly a, poly b, const ring r)
static poly p_ShallowCopyDelete(poly p, const ring r, omBin bin)
static void p_Delete(poly *p, const ring r)
static unsigned pLength(poly a)
BOOLEAN p_CheckPolyRing(poly p, ring r)
static poly p_LmFreeAndNext(poly p, ring)
static poly p_Mult_mm(poly p, poly m, const ring r)
static void p_LmFree(poly p, ring)
static poly p_Copy(poly p, const ring r)
returns a copy of p
static long p_Totaldegree(poly p, const ring r)
static BOOLEAN p_LmExpVectorAddIsOk(const poly p1, const poly p2, const ring r)
void p_wrp(poly p, ring lmRing, ring tailRing)
void rChangeCurrRing(ring r)
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Compatiblity layer for legacy polynomial operations (over currRing)
#define pLtCmpOrdSgnDiffM(p, q)
#define pHead(p)
returns newly allocated copy of Lm(p), coef is copied, next=NULL, p might be NULL
#define pLmIsConstantComp(p)
like above, except that p must be != NULL
#define pIsConstant(p)
like above, except that Comp must be 0
#define pHasNotCF(p1, p2)
#define pLtCmpOrdSgnDiffP(p, q)
#define pGetComp(p)
Component.
#define pSetCoeff(p, n)
deletes old coeff before setting the new one
#define pLmShortDivisibleBy(a, sev_a, b, not_sev_b)
Divisibility tests based on Short Exponent vectors sev_a == pGetShortExpVector(a) not_sev_b == ~ pGet...
#define pCmp(p1, p2)
pCmp: args may be NULL returns: (p2==NULL ? 1 : (p1 == NULL ? -1 : p_LmCmp(p1, p2)))
#define pLmInit(p)
like pInit, except that expvector is initialized to that of p, p must be != NULL
#define pLmDelete(p)
assume p != NULL, deletes Lm(p)->coef and Lm(p)
#define pGetShortExpVector(a)
returns the "Short Exponent Vector" – used to speed up divisibility tests (see polys-impl....
#define pLmDivisibleBy(a, b)
like pDivisibleBy, except that it is assumed that a!=NULL, b!=NULL
static void pLmFree(poly p)
frees the space of the monomial m, assumes m != NULL coef is not freed, m is not advanced
#define pGetExp(p, i)
Exponent.
#define pSetmComp(p)
TODO:
#define pHasNotCFRing(p1, p2)
#define pInit()
allocates a new monomial and initializes everything to 0
#define pEqualPolys(p1, p2)
#define pDivisibleBy(a, b)
returns TRUE, if leading monom of a divides leading monom of b i.e., if there exists a expvector c > ...
#define pLmCmp(p, q)
returns 0|1|-1 if p=q|p>q|p<q w.r.t monomial ordering
#define pLtCmpOrdSgnEqP(p, q)
#define pCopy(p)
return a copy of the poly
poly prMoveR(poly &p, ring src_r, ring dest_r)
poly prMapR(poly src, nMapFunc nMap, ring src_r, ring dest_r)
void pLcmRat(poly a, poly b, poly m, int rat_shift)
void PrintS(const char *s)
BOOLEAN rComplete(ring r, int force)
this needs to be called whenever a new ring is created: new fields in ring are created (like VarOffse...
BOOLEAN nc_rComplete(const ring src, ring dest, bool bSetupQuotient)
void rKillModifiedRing(ring r)
ring rAssure_c_dp(const ring r)
ring rModifyRing(ring r, BOOLEAN omit_degree, BOOLEAN try_omit_comp, unsigned long exp_limit)
ring rCopy0(const ring r, BOOLEAN copy_qideal, BOOLEAN copy_ordering)
void rDebugPrint(const ring r)
void rDelete(ring r)
unconditionally deletes fields in r
static int rBlocks(ring r)
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
static int rGetCurrSyzLimit(const ring r)
static BOOLEAN rField_is_Domain(const ring r)
static BOOLEAN rIsRatGRing(const ring r)
static BOOLEAN rIsLPRing(const ring r)
BOOLEAN rHasMixedOrdering(const ring r)
static BOOLEAN rIsSyzIndexRing(const ring r)
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 short rVar(const ring r)
#define rVar(r) (r->N)
BOOLEAN rHasGlobalOrdering(const ring r)
BOOLEAN rHasLocalOrMixedOrdering(const ring r)
#define rField_is_Ring(R)
int p_mLPmaxPossibleShift(poly p, const ring r)
#define pLPCopyAndShiftLM(p, sh)
BOOLEAN _p_LPLmDivisibleByNoComp(poly a, poly b, const ring r)
int p_mFirstVblock(poly p, const ring ri)
void k_SplitFrame(poly &m1, poly &m2, int at, const ring r)
void p_mLPshift(poly m, int sh, const ring ri)
#define pLPDivisibleBy(a, b)
#define pLPLmDivisibleBy(a, b)
ideal idInit(int idsize, int rank)
initialise an ideal / module
void id_Delete(ideal *h, ring r)
deletes an ideal/module/matrix
int idElem(const ideal F)
count non-zero elements
long id_RankFreeModule(ideal s, ring lmRing, ring tailRing)
return the maximal component number found in any polynomial in s
ideal id_MaxIdeal(const ring r)
initialise the maximal ideal (at 0)
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size
static poly normalize(poly next_p, ideal add_generators, syStrategy syzstr, int *g_l, int *p_l, int crit_comp)
long totaldegreeWecart(poly p, ring r)
long maxdegreeWecart(poly p, int *l, ring r)
EXTERN_VAR short * ecartWeights
#define omGetStickyBinOfBin(B)
#define omMergeStickyBinIntoBin(A, B)