18#define PLURAL_INTERNAL_DECLARATIONS 1
21#define STDZ_EXHANGE_DURING_REDUCTION 0
39#define SBA_INTERRED_START 0
41#define SBA_PRODUCT_CRITERION 0
42#define SBA_PRINT_ZERO_REDUCTIONS 0
43#define SBA_PRINT_REDUCTION_STEPS 0
44#define SBA_PRINT_OPERATIONS 0
45#define SBA_PRINT_SIZE_G 0
46#define SBA_PRINT_SIZE_SYZ 0
47#define SBA_PRINT_PRODUCT_CRITERION 0
50#if SBA_PRINT_REDUCTION_STEPS
51VAR long sba_reduction_steps;
52VAR long sba_interreduction_steps;
54#if SBA_PRINT_OPERATIONS
55VAR long sba_operations;
56VAR long sba_interreduction_operations;
88 unsigned long not_sev = ~L->sev;
93 const unsigned long* sevT=strat->
sevT;
105 if (
j > strat->
tl)
return o;
126 if (
j > strat->
tl)
return o;
147 unsigned long not_sev = ~L->sev;
148 const unsigned long sevT0 = strat->
sevT[0];
149 number rest, orest,
mult;
152 const poly T0p = strat->
T[0].p;
159#if defined(PDEBUG) || defined(PDIV_DEBUG)
181 const poly T0p = strat->
T[0].t_p;
183 const poly
p = L->t_p;
185#if defined(PDEBUG) || defined(PDIV_DEBUG)
211 unsigned long not_sev = ~L->sev;
216 const unsigned long* sevT=strat->
sevT;
217 number rest, orest,
mult;
228 if (
j > strat->
tl)
return o;
229#if defined(PDEBUG) || defined(PDIV_DEBUG)
260 if (
j > strat->
tl)
return o;
261#if defined(PDEBUG) || defined(PDIV_DEBUG)
292 unsigned long not_sev = ~L->sev;
296 const unsigned long* sevT=strat->
sevT;
309 if (
j > strat->
tl)
return -1;
310#if defined(PDEBUG) || defined(PDIV_DEBUG)
318 if (!(sevT[
j] & not_sev)
333 if (
j > strat->
tl)
return -1;
334#if defined(PDEBUG) || defined(PDIV_DEBUG)
341 if (!(sevT[
j] & not_sev)
360 if (
j > strat->
tl)
return -1;
361#if defined(PDEBUG) || defined(PDIV_DEBUG)
369 if (!(sevT[
j] & not_sev) &&
383 if (
j > strat->
tl)
return -1;
384#if defined(PDEBUG) || defined(PDIV_DEBUG)
391 if (!(sevT[
j] & not_sev) &&
406 unsigned long not_sev = ~L->sev;
407 poly
p = L->GetLmCurrRing();
421 ende=
posInS(strat,*max_ind,
p,0)+1;
422 if (ende>(*max_ind)) ende=(*max_ind);
431 if (
j > ende)
return -1;
432#if defined(PDEBUG) || defined(PDIV_DEBUG)
440 if ( !(strat->
sevS[
j] & not_sev) &&
454 if (
j > ende)
return -1;
455#if defined(PDEBUG) || defined(PDIV_DEBUG)
462 if ( !(strat->
sevS[
j] & not_sev) &&
475 unsigned long not_sev = ~L->sev;
476 poly
p = L->GetLmCurrRing();
489 if (
j > ende)
return -1;
490#if defined(PDEBUG) || defined(PDIV_DEBUG)
498 if ( !(strat->
sevS[
j] & not_sev) &&
512 if (
j > ende)
return -1;
513#if defined(PDEBUG) || defined(PDIV_DEBUG)
520 if ( !(strat->
sevS[
j] & not_sev) &&
534 if (arg <= 0)
return 0;
546 if (arg <= 0)
return 0;
548 if (arg%2 == 1) { arg--; }
566 poly zeroPoly =
NULL;
567 unsigned long a = (
unsigned long)
pGetCoeff(
p);
570 int a_ind2 =
ind2(a);
574 for (
int i = 1;
i <= leadRing->N;
i++)
583 poly lead_mult =
p_ISet(1, tailRing);
584 if (
n_GetChar(leadRing->cf) <= k_ind2 + a_ind2)
586 int too_much = k_ind2 + a_ind2 -
n_GetChar(leadRing->cf);
588 zeroPoly =
p_ISet(a, tailRing);
589 for (
int i = 1;
i <= leadRing->N;
i++)
596 while ( (0 <
ind2(s_exp)) && (
ind2(s_exp) <= too_much) )
598 too_much = too_much -
ind2(s_exp);
602 for (
int j = 1;
j <= s_exp;
j++)
619 p_Setm(lead_mult, tailRing);
620 zeroPoly =
p_Mult_mm(zeroPoly, lead_mult, tailRing);
622 for (
int i = 1;
i <= leadRing->N;
i++)
675 if (
h->IsNull())
return 0;
676 if (strat->
tl<0)
return 1;
686 long reddeg =
h->GetpFDeg();
688 h->SetShortExpVector();
695#if STDZ_EXCHANGE_DURING_REDUCTION
723 if (
h->GetLmTailRing() ==
NULL)
752#if STDZ_EXCHANGE_DURING_REDUCTION
777 if (
h->GetLmTailRing() ==
NULL)
786 h->SetShortExpVector();
791 (strat->
Ll >= 0) && ((d > reddeg) || (pass > strat->
LazyPass)))
796 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
811 if (
h->pTotalDeg() >= (
long)strat->
tailRing->bitmask)
816 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
833 if (strat->
tl<0)
return 1;
834 if (
h->IsNull())
return 0;
845 long reddeg =
h->GetpFDeg();
847 h->SetShortExpVector();
869 if (
h->GetLmTailRing() ==
NULL)
882 if (
h->GetLmTailRing() ==
NULL)
888 h->SetShortExpVector();
893 (strat->
Ll >= 0) && ((d > reddeg) || (pass > strat->
LazyPass)))
898 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
913 if (
h->pTotalDeg() >= (
long)strat->
tailRing->bitmask)
918 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
940 if (strat->
tl<0)
return 1;
945 int i,
j,at,pass,cnt,ii;
953 h->SetShortExpVector();
954 h_p =
h->GetLmTailRing();
961 li = strat->
T[
j].pLength;
971 if (li<=0) li=strat->
T[
j].GetpLength();
974 unsigned long not_sev = ~ h->sev;
981 if ((strat->
T[
i].pLength < li)
989 li = strat->
T[
i].pLength;
990 if (li<=0) li=strat->
T[
i].GetpLength();
1014#if SBA_PRINT_REDUCTION_STEPS
1015 sba_interreduction_steps++;
1017#if SBA_PRINT_OPERATIONS
1018 sba_interreduction_operations +=
pLength(strat->
T[ii].p);
1030 h_p =
h->GetLmTailRing();
1046 else if (
h->t_p!=
NULL)
1065 else if (
h->t_p!=
NULL)
1074 h->SetShortExpVector();
1086 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
1087 if (at <= strat->Ll)
1098 int dummy=strat->
sl;
1105 Print(
" lazy: -> L%d\n",at);
1124 assume(PR->GetLmCurrRing() != PW->GetLmCurrRing());
1126 Red->HeadNormalize();
1160 if (strat->
tl<0)
return 1;
1166 PrintS(
"------- IN REDSIG -------\n");
1173 PrintS(
"---------------------------\n");
1176 int i,
j,at,pass, ii;
1179 unsigned long not_sev;
1186 h->SetShortExpVector();
1187 h_p =
h->GetLmTailRing();
1197 li = strat->
T[
j].pLength;
1198 if (li<=0) li=strat->
T[
j].GetpLength();
1206 if (test_opt_length)
1215 if ((strat->
T[
i].pLength < li)
1223 li = strat->
T[
i].pLength;
1224 if (li<=0) li=strat->
T[
i].GetpLength();
1246 Print(
"BEFORE REDUCTION WITH %d:\n",ii);
1247 PrintS(
"--------------------------------\n");
1254 PrintS(
"--------------------------------\n");
1255 printf(
"INDEX OF REDUCER T: %d\n",ii);
1258#if SBA_PRINT_REDUCTION_STEPS
1260 sba_reduction_steps++;
1262#if SBA_PRINT_OPERATIONS
1264 sba_operations +=
pLength(strat->
T[ii].p);
1271 Print(
"SigSAFE: %d\n",sigSafe);
1286 h_p =
h->GetLmTailRing();
1292 h->SetShortExpVector();
1304 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
1305 if (at <= strat->Ll)
1307 int dummy=strat->
sl;
1315 Print(
" lazy: -> L%d\n",at);
1339 beforeredsig =
pCopy(
h->sig);
1341 if (strat->
tl<0)
return 1;
1347 Print(
"------- IN REDSIG -------\n");
1354 Print(
"---------------------------\n");
1357 int i,
j,at,pass, ii;
1360 unsigned long not_sev;
1367 h->SetShortExpVector();
1368 h_p =
h->GetLmTailRing();
1390 h->i_r1 = strat->
tl;
1393 if (
h->GetLmTailRing() ==
NULL)
1400 if(
pLtCmp(beforeredsig,
h->sig) == 1)
1423 li = strat->
T[
j].pLength;
1424 if (li<=0) li=strat->
T[
j].GetpLength();
1431 if (test_opt_length)
1440 if ((strat->
T[
i].pLength < li)
1448 li = strat->
T[
i].pLength;
1449 if (li<=0) li=strat->
T[
i].GetpLength();
1471 Print(
"BEFORE REDUCTION WITH %d:\n",ii);
1472 Print(
"--------------------------------\n");
1479 Print(
"--------------------------------\n");
1480 printf(
"INDEX OF REDUCER T: %d\n",ii);
1508#if SBA_PRINT_REDUCTION_STEPS
1510 sba_reduction_steps++;
1512#if SBA_PRINT_OPERATIONS
1514 sba_operations +=
pLength(strat->
T[ii].p);
1521 Print(
"SigSAFE: %d\n",sigSafe);
1536 h_p =
h->GetLmTailRing();
1542 h->SetShortExpVector();
1554 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
1555 if (at <= strat->Ll)
1557 int dummy=strat->
sl;
1565 Print(
" lazy: -> L%d\n",at);
1581 p =
h = L->GetLmTailRing();
1583 return L->GetLmCurrRing();
1591 Ln.sevSig = L->sevSig;
1592 Ln.pLength = L->GetpLength() - 1;
1607 Ln.SetShortExpVector();
1613 With = &(strat->
T[
j]);
1618 if (With ==
NULL)
break;
1642#if SBA_PRINT_REDUCTION_STEPS
1644 sba_reduction_steps++;
1646#if SBA_PRINT_OPERATIONS
1648 sba_operations +=
pLength(With->p);
1658 pNext(
h) = Ln.LmExtractAndIter();
1661 }
while (!Ln.IsNull());
1664 if (Ln.IsNull())
goto all_done;
1665 if (! withT) With_s.Init(
currRing);
1672 pNext(
h) = Ln.LmExtractAndIter();
1689 return L->GetLmCurrRing();
1698 if (strat->
tl<0)
return 1;
1704 long reddeg =
h->GetpFDeg();
1708 h->SetShortExpVector();
1709 poly h_p =
h->GetLmTailRing();
1714 if (
j < 0)
return 1;
1716 li = strat->
T[
j].pLength;
1725 if (test_opt_length)
1727 if (li<=0) li=strat->
T[
j].GetpLength();
1730 unsigned long not_sev = ~ h->sev;
1737 if ((strat->
T[
i].pLength < li)
1745 li = strat->
T[
i].pLength;
1746 if (li<=0) li=strat->
T[
i].GetpLength();
1771#if SBA_PRINT_REDUCTION_STEPS
1772 sba_interreduction_steps++;
1774#if SBA_PRINT_OPERATIONS
1775 sba_interreduction_operations +=
pLength(strat->
T[ii].p);
1787 h_p=
h->GetLmTailRing();
1804 else if (
h->t_p!=
NULL)
1823 else if (
h->t_p!=
NULL)
1832 h->SetShortExpVector();
1838 (strat->
Ll >= 0) && ((d > reddeg) || (pass > strat->
LazyPass)))
1841 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
1842 if (at <= strat->Ll)
1854 int dummy=strat->
sl;
1867 else if (d != reddeg)
1871 if (
h->pTotalDeg() >= (
long)strat->
tailRing->bitmask)
1876 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
1903 if (strat->
tl<0)
return 1;
1907 int i,
j,at,pass,ei, ii, h_d;
1913 d = reddeg =
h->GetpFDeg() +
h->ecart;
1914 h->SetShortExpVector();
1915 h_p =
h->GetLmTailRing();
1921 if (
j < 0)
return 1;
1923 ei = strat->
T[
j].ecart;
1924 li = strat->
T[
j].pLength;
1931 if (test_opt_length)
1933 if (li<=0) li=strat->
T[
j].GetpLength();
1936 unsigned long not_sev = ~ h->sev;
1941 if (
i > strat->
tl)
break;
1942 if (ei <= h->ecart)
break;
1946 strat->
T[
i].GetpLength();
1947 if (((strat->
T[
i].ecart < ei) && (ei>
h->ecart))
1948 || ((strat->
T[
i].ecart <=
h->ecart) && (strat->
T[
i].pLength < li)))
1953 ei = strat->
T[
i].ecart;
1954 li = strat->
T[
i].pLength;
1957 if (ei<=h->ecart)
break;
1978 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
1996 Print(
"\nwith T[%d]:",ii);
2003#if SBA_PRINT_REDUCTION_STEPS
2004 sba_interreduction_steps++;
2006#if SBA_PRINT_OPERATIONS
2007 sba_interreduction_operations += strat->
T[ii].pLength;
2033 else if (
h->t_p!=
NULL)
2051 else if (
h->t_p!=
NULL)
2059 h->SetShortExpVector();
2060 h_d =
h->SetpFDeg();
2065 h->ecart = d-h_d+ei-
h->ecart;
2077 && ((d > reddeg) || (pass > strat->
LazyPass))))
2081 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
2082 if (at <= strat->Ll)
2093 int dummy=strat->
sl;
2100 Print(
" degree jumped: -> L%d\n",at);
2106 else if (d > reddeg)
2110 if (
h->pTotalDeg()+
h->ecart >= (
long)strat->
tailRing->bitmask)
2115 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
2147 P.SetShortExpVector();
2240 P.SetShortExpVector();
2276 P.SetShortExpVector();
2346 P.SetShortExpVector();
2361 P.SetShortExpVector();
2387 int hilbeledeg=1,hilbcount=0,minimcnt=0;
2410 withT = ! strat->
homog;
2415#ifdef HAVE_TAIL_RING
2431 while (strat->
Ll >= 0)
2438 while (strat->
Ll >= 0)
2451 while ((strat->
Ll >= 0)
2452 && (strat->
L[strat->
Ll].p1!=
NULL) && (strat->
L[strat->
Ll].p2!=
NULL)
2457 if (strat->
Ll<0)
break;
2462 strat->
P = strat->
L[strat->
Ll];
2492 else if (strat->
P.p1 ==
NULL)
2494 if (strat->
minim > 0)
2500 if ((strat->
P.p ==
NULL) && (strat->
P.t_p ==
NULL))
2508 &olddeg,&reduc,strat, red_result);
2511 red_result = strat->
red(&strat->
P,strat);
2521 if (red_result == 1)
2524 strat->
P.GetP(strat->
lmBin);
2533 int pos=
posInS(strat,strat->
sl,strat->
P.p,strat->
P.ecart);
2548 strat->
P.pCleardenom();
2552 strat->
P.pCleardenom();
2561 strat->
P.p =
redtailBba(&(strat->
P),pos-1,strat, withT);
2573 if (strat->
minim==1)
2580 strat->
M->m[minimcnt]=strat->
P.p2;
2584 pNext(strat->
M->m[minimcnt])
2595 strat->
P.SetShortExpVector();
2602 strat->
enterS(strat->
P, pos, strat, strat->
tl);
2617 if (hilb!=
NULL)
khCheck(
Q,
w,hilb,hilbeledeg,hilbcount,strat);
2625 if (strat->
s_poly(strat))
2630 int pos=
posInS(strat,strat->
sl,strat->
P.p,strat->
P.ecart);
2636 strat->
enterS(strat->
P, pos, strat, strat->
tl);
2640 else if (strat->
P.p1 ==
NULL && strat->
minim > 0)
2646 memset(&(strat->
P), 0,
sizeof(strat->
P));
2682#ifdef HAVE_TAIL_RING
2704 for(
int i = 0;
i<=strat->
sl;
i++)
2739 return (strat->
Shdl);
2751#if SBA_PRINT_ZERO_REDUCTIONS
2752 long zeroreductions = 0;
2754#if SBA_PRINT_PRODUCT_CRITERION
2755 long product_criterion = 0;
2759 int size_g_non_red = 0;
2761#if SBA_PRINT_SIZE_SYZ
2765#if SBA_PRINT_REDUCTION_STEPS
2766 sba_reduction_steps = 0;
2767 sba_interreduction_steps = 0;
2769#if SBA_PRINT_OPERATIONS
2771 sba_interreduction_operations = 0;
2775 ring sRing, currRingOld;
2780 if (sRing!=currRingOld)
2799 dummy =
pCopy(F->m[0]);
2801 F->m[
i] = F->m[
i+1];
2822 dummy =
pCopy(F->m[0]);
2824 F->m[
i] = F->m[
i+1];
2842 for (
int i=0;
i<
sort->length();++
i)
2843 F->m[
i] = F1->m[(*
sort)[
i]-1];
2857 F->m[
j] = F->m[
j-1];
2871#if SBA_INTERRED_START
2875 printf(
"SBA COMPUTATIONS DONE IN THE FOLLOWING RING:\n");
2877 printf(
"ordSgn = %d\n",
currRing->OrdSgn);
2880 int srmax,lrmax, red_result = 1;
2882 int hilbeledeg=1,hilbcount=0,minimcnt=0;
2896 reduc = olddeg = lrmax = 0;
2909#ifdef HAVE_TAIL_RING
2927 strat->
enterS(strat->
L[strat->
Ll-(
i)], strat->
sl+1, strat, strat->
tl);
2937 while (strat->
Ll >= 0)
2939 if (strat->
Ll > lrmax) lrmax =strat->
Ll;
2969 f5c ( strat, olddeg, minimcnt, hilbeledeg, hilbcount, srmax,
2970 lrmax, reduc,
Q,
w, hilb );
2980 strat->
P = strat->
L[strat->
Ll];
2986 if (!strat->
rewCrit2(strat->
P.sig, ~strat->
P.sevSig, strat->
P.GetLmCurrRing(), strat, strat->
P.checked+1))
2990 PrintS(
"SIG OF NEXT PAIR TO HANDLE IN SIG-BASED ALGORITHM\n");
2991 PrintS(
"-------------------------------------------------\n");
2996 PrintS(
"-------------------------------------------------\n");
3031 else if (strat->
P.p1 ==
NULL)
3033 if (strat->
minim > 0)
3039 if (strat->
P.p ==
NULL && strat->
P.t_p ==
NULL)
3047 PrintS(
"Poly before red: ");
3051#if SBA_PRODUCT_CRITERION
3052 if (strat->
P.prod_crit)
3054#if SBA_PRINT_PRODUCT_CRITERION
3055 product_criterion++;
3057 int pos =
posInSyz(strat, strat->
P.sig);
3064 red_result = strat->
red(&strat->
P,strat);
3067 red_result = strat->
red(&strat->
P,strat);
3083 strat->
P.p =
pNeg(strat->
P.p);
3084 strat->
P.sig =
pNeg(strat->
P.sig);
3087 if(strat->
P.sig !=
NULL)
3089 if(strat->
P.p !=
NULL)
3096 red_result =
redRing(&strat->
P,strat);
3101 strat->
P.sig =
NULL;
3105 strat->
enterS(strat->
P, 0, strat, strat->
tl);
3121 if (red_result != 0)
3123 PrintS(
"Poly after red: ");
3125 pWrite(strat->
P.GetLmCurrRing());
3127 printf(
"%d\n",red_result);
3132 if(strat->
P.p !=
NULL)
3134 &olddeg,&reduc,strat, red_result);
3137 &olddeg,&reduc,strat, red_result);
3145 if (red_result == 1)
3148 strat->
P.GetP(strat->
lmBin);
3152 (strat->
P).FDeg = (strat->
P).pFDeg();
3164 int pos = strat->
sl+1;
3171 beforetailred =
pCopy(strat->
P.sig);
3177 strat->
P.p =
redtailSba(&(strat->
P),pos-1,strat, withT);
3185 strat->
P.pCleardenom();
3188 strat->
P.p =
redtailSba(&(strat->
P),pos-1,strat, withT);
3189 strat->
P.pCleardenom();
3196 strat->
P.p =
redtailSba(&(strat->
P),pos-1,strat, withT);
3205 strat->
enterS(strat->
P, 0, strat, strat->
tl);
3211 if(strat->
P.sig ==
NULL ||
pLtCmp(beforetailred,strat->
P.sig) == 1)
3215 red_result =
redRing(&strat->
P,strat);
3224 strat->
enterS(strat->
P, 0, strat, strat->
tl);
3230 if(strat->
P.p ==
NULL)
3231 goto case_when_red_result_changed;
3237 for (
int jj = 0; jj<strat->
tl+1; jj++)
3241 strat->
T[jj].is_sigsafe =
FALSE;
3247 for (
int jj = 0; jj<strat->
tl+1; jj++)
3249 strat->
T[jj].is_sigsafe =
FALSE;
3259 if (strat->
minim==1)
3266 strat->
M->m[minimcnt]=strat->
P.p2;
3270 pNext(strat->
M->m[minimcnt])
3280 strat->
T[strat->
tl].is_sigsafe =
FALSE;
3294 strat->
enterS(strat->
P, pos, strat, strat->
tl);
3298 for (
int tk=0; tk<strat->
sl+1; tk++)
3319 for(
int ps=0;ps<strat->
sl+1;ps++)
3327 (strat->
syzmax)*
sizeof(
unsigned long),
3329 *
sizeof(
unsigned long));
3361 unsigned max_cmp =
IDELEMS(F);
3371 for (
int i=0;
i<strat->
sl; ++
i)
3388 for (
unsigned i=cmp+1;
i<=max_cmp; ++
i)
3391 for (
int j=0;
j<strat->
sl; ++
j)
3429 printf(
"---------------------------\n");
3430 Print(
" %d. ELEMENT ADDED TO GCURR:\n",strat->
sl+1);
3453 if (hilb!=
NULL)
khCheck(
Q,
w,hilb,hilbeledeg,hilbcount,strat);
3456 if (strat->
sl>srmax) srmax = strat->
sl;
3460 case_when_red_result_changed:
3468#if SBA_PRINT_ZERO_REDUCTIONS
3477 int pos =
posInSyz(strat, strat->
P.sig);
3481 Print(
"ADDING STUFF TO SYZ : ");
3494 memset(&(strat->
P), 0,
sizeof(strat->
P));
3500 printf(
"\nSigDrop!\n");
3502 printf(
"\nEnded with no SigDrop\n");
3508 if(strat->
P.sig !=
NULL)
3512 memset(&(strat->
P), 0,
sizeof(strat->
P));
3547#ifdef HAVE_TAIL_RING
3563#if SBA_PRINT_SIZE_SYZ
3565 size_syz = strat->
syzl;
3593 for(;
k>=0 && (strat->
L[
k].p1 !=
NULL || strat->
L[
k].p2 !=
NULL);
k--)
3603 for(;
k>=0 && strat->
L[
k].p1 ==
NULL && strat->
L[
k].p2 ==
NULL;
k--)
3606 strat->
enterS(strat->
L[
k], strat->
sl+1, strat, strat->
tl);
3614 for(
k=strat->
sl;
k>=0;
k--)
3651 printf(
"SIZE OF SHDL: %d\n",
IDELEMS(strat->
Shdl));
3655 printf(
" %d. ",oo+1);
3660#if SBA_PRINT_ZERO_REDUCTIONS
3661 printf(
"----------------------------------------------------------\n");
3662 printf(
"ZERO REDUCTIONS: %ld\n",zeroreductions);
3665#if SBA_PRINT_REDUCTION_STEPS
3666 printf(
"----------------------------------------------------------\n");
3667 printf(
"S-REDUCTIONS: %ld\n",sba_reduction_steps);
3669#if SBA_PRINT_OPERATIONS
3670 printf(
"OPERATIONS: %ld\n",sba_operations);
3672#if SBA_PRINT_REDUCTION_STEPS
3673 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3674 printf(
"INTERREDUCTIONS: %ld\n",sba_interreduction_steps);
3676#if SBA_PRINT_OPERATIONS
3677 printf(
"INTERREDUCTION OPERATIONS: %ld\n",sba_interreduction_operations);
3679#if SBA_PRINT_REDUCTION_STEPS
3680 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3681 printf(
"ALL REDUCTIONS: %ld\n",sba_reduction_steps+sba_interreduction_steps);
3682 sba_interreduction_steps = 0;
3683 sba_reduction_steps = 0;
3685#if SBA_PRINT_OPERATIONS
3686 printf(
"ALL OPERATIONS: %ld\n",sba_operations+sba_interreduction_operations);
3687 sba_interreduction_operations = 0;
3691 printf(
"----------------------------------------------------------\n");
3692 printf(
"SIZE OF G: %d / %d\n",size_g,size_g_non_red);
3696#if SBA_PRINT_SIZE_SYZ
3697 printf(
"SIZE OF SYZ: %ld\n",size_syz);
3698 printf(
"----------------------------------------------------------\n");
3701#if SBA_PRINT_PRODUCT_CRITERION
3702 printf(
"PRODUCT CRITERIA: %ld\n",product_criterion);
3703 product_criterion = 0;
3705 return (strat->
Shdl);
4040 int& hilbcount,
int& srmax,
int& lrmax,
int& reduc, ideal
Q,
4043 int Ll_old, red_result = 1;
4049 reduc = olddeg = lrmax = 0;
4054 while (strat->
tl >= 0)
4056 if(!strat->
T[strat->
tl].is_redundant)
4059 h.p = strat->
T[strat->
tl].p;
4060 h.tailRing = strat->
T[strat->
tl].tailRing;
4061 h.t_p = strat->
T[strat->
tl].t_p;
4100 while (strat->
Ll>Ll_old)
4102 strat->
P = strat->
L[strat->
Ll];
4106 PrintS(
"NEXT PAIR TO HANDLE IN INTERRED ALGORITHM\n");
4107 PrintS(
"-------------------------------------------------\n");
4111 printf(
"%d\n",strat->
tl);
4112 PrintS(
"-------------------------------------------------\n");
4145 else if (strat->
P.p1 ==
NULL)
4147 if (strat->
minim > 0)
4154 if (strat->
P.p ==
NULL && strat->
P.t_p ==
NULL)
4162 &olddeg,&reduc,strat, red_result);
4165 PrintS(
"Poly before red: ");
4169 red_result = strat->
red2(&strat->
P,strat);
4179 if (red_result == 1)
4182 strat->
P.GetP(strat->
lmBin);
4193 pos =
posInS(strat,strat->
sl,strat->
P.p,strat->
P.ecart);
4197 pos =
posInS(strat,strat->
sl,strat->
P.p,strat->
P.ecart);
4205 strat->
P.pCleardenom();
4208 strat->
P.p =
redtailBba(&(strat->
P),pos-1,strat, withT);
4209 strat->
P.pCleardenom();
4216 strat->
P.p =
redtailBba(&(strat->
P),pos-1,strat, withT);
4226 if (strat->
minim==1)
4233 strat->
M->m[minimcnt]=strat->
P.p2;
4237 pNext(strat->
M->m[minimcnt])
4250 strat->
enterS(strat->
P, pos, strat, strat->
tl);
4253 PrintS(
"ELEMENT ADDED TO GCURR DURING INTERRED: ");
4257 if (hilb!=
NULL)
khCheck(
Q,
w,hilb,hilbeledeg,hilbcount,strat);
4261 if (strat->
sl>srmax) srmax = strat->
sl;
4277 memset(&(strat->
P), 0,
sizeof(strat->
P));
4281 while (cc<strat->tl+1)
4283 strat->
T[cc].sig =
pOne();
4286 strat->
sig[cc] = strat->
T[cc].sig;
4287 strat->
sevSig[cc] = strat->
T[cc].sevSig;
4288 strat->
T[cc].is_sigsafe =
TRUE;
4296 for (
int cd=strat->
Ll;
cd>=0;
cd--)
4304 printf(
"\nAfter f5c sorting\n");
4305 for(
int i=0;
i<=strat->
sl;
i++)
4311 PrintS(
"------------------- STRAT S ---------------------\n");
4313 while (cc<strat->tl+1)
4317 printf(
"- - - - - -\n");
4320 PrintS(
"-------------------------------------------------\n");
4321 PrintS(
"------------------- STRAT T ---------------------\n");
4323 while (cc<strat->tl+1)
4327 printf(
"- - - - - -\n");
4330 PrintS(
"-------------------------------------------------\n");
4331 PrintS(
"------------------- STRAT L ---------------------\n");
4333 while (cc<strat->Ll+1)
4339 printf(
"- - - - - -\n");
4342 PrintS(
"-------------------------------------------------\n");
4343 printf(
"F5C DONE\nSTRAT SL: %d -- %d\n",strat->
sl, strat->
currIdx);
4355 int hilbeledeg=1,hilbcount=0,minimcnt=0;
4383#ifdef HAVE_TAIL_RING
4399 while (strat->
Ll >= 0)
4406 while (strat->
Ll >= 0)
4419 while ((strat->
Ll >= 0)
4420 && (strat->
L[strat->
Ll].p1!=
NULL) && (strat->
L[strat->
Ll].p2!=
NULL)
4425 if (strat->
Ll<0)
break;
4430 strat->
P = strat->
L[strat->
Ll];
4460 else if (strat->
P.p1 ==
NULL)
4462 if (strat->
minim > 0)
4468 if ((strat->
P.p ==
NULL) && (strat->
P.t_p ==
NULL))
4476 &olddeg,&reduc,strat, red_result);
4479 red_result = strat->
red(&strat->
P,strat);
4489 if (red_result == 1)
4492 strat->
P.GetP(strat->
lmBin);
4501 int pos=
posInS(strat,strat->
sl,strat->
P.p,strat->
P.ecart);
4516 strat->
P.pCleardenom();
4520 strat->
P.pCleardenom();
4533 strat->
P.p =
redtailBba(&(strat->
P),pos-1,strat, withT);
4549 if (strat->
minim==1)
4556 strat->
M->m[minimcnt]=strat->
P.p2;
4560 pNext(strat->
M->m[minimcnt])
4574 strat->
enterS(strat->
P, pos, strat, strat->
tl);
4579 if (hilb!=
NULL)
khCheck(
Q,
w,hilb,hilbeledeg,hilbcount,strat);
4587 if (strat->
s_poly(strat))
4592 int pos=
posInS(strat,strat->
sl,strat->
P.p,strat->
P.ecart);
4595 strat->
enterS(strat->
P, pos, strat, strat->
tl);
4601 else if (strat->
P.p1 ==
NULL && strat->
minim > 0)
4606 memset(&(strat->
P), 0,
sizeof(strat->
P));
4618 for (
int k = 0;
k <= strat->
sl; ++
k)
4621 for (
int j = 0;
j<=strat->
tl; ++
j)
4651#ifdef HAVE_TAIL_RING
4658 WarnS(
"reduction with S is not yet supported by Letterplace");
4675 for(
int i = 0;
i<=strat->
sl;
i++)
4710 return (strat->
Shdl);
4733 if (
h->IsNull())
return 0;
4741 d =
h->GetpFDeg() +
h->ecart;
4744 h->SetShortExpVector();
4750 h->SetDegStuffReturnLDeg(strat->
LDegLast);
4755 strat->
T[
j].pNorm();
4781 h->SetShortExpVector();
4794 h->SetDegStuffReturnLDeg(strat->
LDegLast);
4804 if (strat->
T[
j].ecart <=
h->ecart)
4805 h->ecart = d -
h->GetpFDeg();
4807 h->ecart = d -
h->GetpFDeg() + strat->
T[
j].ecart -
h->ecart;
4809 d =
h->GetpFDeg() +
h->ecart;
4812 d =
h->SetDegStuffReturnLDeg(strat->
LDegLast);
4821 && ((d >= reddeg) || (pass > strat->
LazyPass)))
4826 at = strat->
posInL(strat->
L,strat->
Ll,
h,strat);
4827 if (at <= strat->Ll)
static int si_max(const int a, const int b)
CanonicalForm cd(bCommonDen(FF))
static CanonicalForm bound(const CFMatrix &M)
KINLINE poly kNoetherTail()
int(* red2)(LObject *L, kStrategy strat)
int(* posInL)(const LSet set, const int length, LObject *L, const kStrategy strat)
pShallowCopyDeleteProc p_shallow_copy_delete
void(* enterS)(LObject &h, int pos, kStrategy strat, int atR)
char completeReduce_retry
void(* initEcart)(TObject *L)
int(* posInT)(const TSet T, const int tl, LObject &h)
int(* red)(LObject *L, kStrategy strat)
BOOLEAN(* rewCrit2)(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int start)
char posInLDependsOnLength
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 number n_EucNorm(number a, const coeffs r)
static FORCE_INLINE number n_QuotRem(number a, number b, number *q, const coeffs r)
static FORCE_INLINE BOOLEAN n_Greater(number a, number b, const coeffs r)
ordered fields: TRUE iff 'a' is larger than 'b'; in Z/pZ: TRUE iff la > lb, where la and lb are the l...
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
static FORCE_INLINE int n_GetChar(const coeffs r)
Return the characteristic of the coeff. domain.
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
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 BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
void sort(CFArray &A, int l=0)
quick sort A
void WerrorS(const char *s)
#define idDelete(H)
delete an ideal
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
BOOLEAN idInsertPolyOnPos(ideal I, poly p, int pos)
insert p into I on position pos
static intvec * idSort(ideal id, BOOLEAN nolex=TRUE)
static BOOLEAN length(leftv result, leftv arg)
KINLINE poly redtailBba_Ring(poly p, int pos, kStrategy strat)
KINLINE poly redtailBba(poly p, int pos, kStrategy strat, BOOLEAN normalize)
KINLINE poly redtailBbaBound(poly p, int pos, kStrategy strat, int bound, BOOLEAN normalize)
KINLINE void clearS(poly p, unsigned long p_sev, int *at, int *k, kStrategy strat)
KINLINE poly redtailBba_Z(poly p, int pos, kStrategy strat)
void kBucketClear(kBucket_pt bucket, poly *p, int *length)
BOOLEAN kbTest(kBucket_pt bucket)
Tests.
void kBucketDestroy(kBucket_pt *bucket_pt)
void kBucketInit(kBucket_pt bucket, poly lm, int length)
kBucket_pt kBucketCreate(const ring bucket_ring)
Creation/Destruction of buckets.
number kBucketPolyRed(kBucket_pt bucket, poly p1, int l1, poly spNoether)
const poly kBucketGetLm(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 bu...
void khCheck(ideal Q, intvec *w, intvec *hilb, int &eledeg, int &count, kStrategy strat)
int ksReducePolyLC(LObject *PR, TObject *PW, poly spNoether, number *coef, kStrategy strat)
void ksCreateSpoly(LObject *Pair, poly spNoether, int use_buckets, ring tailRing, poly m1, poly m2, TObject **R)
int ksReducePoly(LObject *PR, TObject *PW, poly spNoether, number *coef, poly *mon, kStrategy strat)
int ksReducePolySig(LObject *PR, TObject *PW, long, poly spNoether, number *coef, kStrategy strat)
int ksReducePolySigRing(LObject *PR, TObject *PW, long, poly spNoether, number *coef, kStrategy strat)
int ksReducePolyZ(LObject *PR, TObject *PW, poly spNoether, number *coef, kStrategy strat)
int ksReducePolyGCD(LObject *PR, TObject *PW, poly spNoether, number *coef, kStrategy strat)
ideal kStdShift(ideal F, ideal Q, tHomog h, intvec **w, intvec *hilb, int syzComp, int newIdeal, intvec *vw, BOOLEAN rightGB)
ideal kInterRed(ideal F, ideal Q)
void initBba(kStrategy strat)
void initSba(ideal F, kStrategy strat)
int redRing_Z(LObject *h, kStrategy strat)
poly kFindZeroPoly(poly input_p, ring leadRing, ring tailRing)
int redFirstShift(LObject *h, kStrategy strat)
int kFindSameLMInT_Z(const kStrategy strat, const LObject *L, const int start)
int kFindDivisibleByInT_Z(const kStrategy strat, const LObject *L, const int start)
int kFindDivisibleByInS(const kStrategy strat, int *max_ind, LObject *L)
return -1 if no divisor is found number of first divisor in S, otherwise
int kTestDivisibleByT0_Z(const kStrategy strat, const LObject *L)
tests if T[0] divides the leading monomial of L, returns -1 if not
poly redNFBound(poly h, int &max_ind, int nonorm, kStrategy strat, int bound)
poly kNF2(ideal F, ideal Q, poly q, kStrategy strat, int lazyReduce)
VAR int(* test_PosInL)(const LSet set, const int length, LObject *L, const kStrategy strat)
int redHoney(LObject *h, kStrategy strat)
int kFindNextDivisibleByInS(const kStrategy strat, int start, int max_ind, LObject *L)
static long ind_fact_2(long arg)
int redHomog(LObject *h, kStrategy strat)
ideal sba(ideal F0, ideal Q, intvec *w, intvec *hilb, kStrategy strat)
ideal bba(ideal F, ideal Q, intvec *w, intvec *hilb, kStrategy strat)
int redLazy(LObject *h, kStrategy strat)
int redSigRing(LObject *h, kStrategy strat)
poly redtailSba(LObject *L, int pos, kStrategy strat, BOOLEAN withT, BOOLEAN normalize)
KINLINE int ksReducePolyTailSig(LObject *PR, TObject *PW, LObject *Red, kStrategy strat)
poly redNF(poly h, int &max_ind, int nonorm, kStrategy strat)
int redSig(LObject *h, kStrategy strat)
static long ind2(long arg)
void kDebugPrint(kStrategy strat)
void f5c(kStrategy strat, int &olddeg, int &minimcnt, int &hilbeledeg, int &hilbcount, int &srmax, int &lrmax, int &reduc, ideal Q, intvec *w, intvec *hilb)
VAR int(* test_PosInT)(const TSet T, const int tl, LObject &h)
poly kNF2Bound(ideal F, ideal Q, poly q, int bound, kStrategy strat, int lazyReduce)
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
ideal bbaShift(ideal F, ideal Q, intvec *w, intvec *hilb, kStrategy strat)
ideal rightgb(ideal F, ideal Q)
void initSbaPos(kStrategy strat)
void message(int i, int *reduc, int *olddeg, kStrategy strat, int red_result)
void initBuchMora(ideal F, ideal Q, kStrategy strat)
void enterSyz(LObject &p, kStrategy strat, int atT)
void enterT(LObject &p, kStrategy strat, int atT)
void enterTShift(LObject p, kStrategy strat, int atT)
BOOLEAN kTest(kStrategy strat)
TObject * kFindDivisibleByInS_T(kStrategy strat, int end_pos, LObject *L, TObject *T, long ecart)
BOOLEAN kTest_TS(kStrategy strat)
void enterpairsSig(poly h, poly hSig, int hFrom, int k, int ecart, int pos, kStrategy strat, int atR)
void enterL(LSet *set, int *length, int *LSetmax, LObject p, int at)
void enterpairs(poly h, int k, int ecart, int pos, kStrategy strat, int atR)
void redtailBbaAlsoLC_Z(LObject *L, int end_pos, kStrategy strat)
void initHilbCrit(ideal, ideal, intvec **hilb, kStrategy strat)
int posInSMonFirst(const kStrategy strat, const int length, const poly p)
void superenterpairsSig(poly h, poly hSig, int hFrom, int k, int ecart, int pos, kStrategy strat, int atR)
void initBuchMoraPos(kStrategy strat)
void initS(ideal F, ideal Q, kStrategy strat)
BOOLEAN kStratChangeTailRing(kStrategy strat, LObject *L, TObject *T, unsigned long expbound)
ring sbaRing(kStrategy strat, const ring r, BOOLEAN, int)
void postReduceByMon(LObject *h, kStrategy strat)
used for GB over ZZ: intermediate reduction by monomial elements background: any known constant eleme...
void enterpairsShift(poly h, int k, int ecart, int pos, kStrategy strat, int atR)
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)
int posInS(const kStrategy strat, const int length, const poly p, const int ecart_p)
void initSyzRules(kStrategy strat)
void initSbaBuchMora(ideal F, ideal Q, kStrategy strat)
BOOLEAN kCheckSpolyCreation(LObject *L, kStrategy strat, poly &m1, poly &m2)
void cleanT(kStrategy strat)
int posInSyz(const kStrategy strat, poly sig)
void replaceInLAndSAndT(LObject &p, int tj, 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)
void exitSba(kStrategy strat)
void deleteInL(LSet set, int *length, int j, kStrategy strat)
void kStratInitChangeTailRing(kStrategy strat)
void initBuchMoraCrit(kStrategy strat)
void completeReduce(kStrategy strat, BOOLEAN withT)
void initBuchMoraPosRing(kStrategy strat)
void postReduceByMonSig(LObject *h, kStrategy strat)
void messageSets(kStrategy strat)
void deleteInS(int i, kStrategy strat)
BOOLEAN sbaCheckGcdPair(LObject *h, kStrategy strat)
int posInLF5CRing(const LSet set, int start, const int length, LObject *p, const kStrategy)
void initEcartBBA(TObject *h)
void enterSBbaShift(LObject &p, int atS, kStrategy strat, int atR)
void messageStat(int hilbcount, 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)
void cancelunit(LObject *L, BOOLEAN inNF)
#define REDNF_CANONICALIZE
static void kDeleteLcm(LObject *P)
#define REDTAIL_CANONICALIZE
static void nc_kBucketPolyRed_NF(kBucket_pt b, poly p, number *c)
void mult(unsigned long *result, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
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 omRealloc0Size(addr, o_size, size)
#define TEST_OPT_INTSTRATEGY
#define SI_RESTORE_OPT1(A)
#define TEST_OPT_DEGBOUND
#define TEST_OPT_REDTHROUGH
#define TEST_OPT_REDTAIL_SYZ
#define TEST_OPT_CONTENTSB
#define TEST_OPT_NOT_BUCKETS
poly p_ISet(long i, const ring r)
returns the poly representing the integer i
unsigned long p_GetShortExpVector(const poly p, const ring r)
poly p_NSet(number n, const ring r)
returns the poly representing the number n, destroys n
void pEnlargeSet(poly **p, int l, int increment)
long p_Deg(poly a, const ring r)
static poly p_Add_q(poly p, poly q, const ring r)
static poly p_Mult_q(poly p, poly q, const ring r)
static void p_ExpVectorAdd(poly p1, poly p2, const ring r)
#define p_LmEqual(p1, p2, r)
static void p_SetExpV(poly p, int *ev, const ring r)
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent @Note: VarOffset encodes the position in p->exp
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
static void p_Setm(poly p, const 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:
static BOOLEAN p_LmDivisibleBy(poly a, poly b, const ring r)
static void p_Delete(poly *p, const ring r)
static unsigned pLength(poly a)
static void p_GetExpV(poly p, int *ev, const ring r)
static poly p_Mult_mm(poly p, poly m, const ring r)
static poly p_LmDeleteAndNext(poly p, const ring r)
static poly p_Copy(poly p, const ring r)
returns a copy of p
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 pHead(p)
returns newly allocated copy of Lm(p), coef is copied, next=NULL, p might be NULL
#define pGetComp(p)
Component.
#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 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....
static void pLmFree(poly p)
frees the space of the monomial m, assumes m != NULL coef is not freed, m is not advanced
#define pLmCmp(p, q)
returns 0|1|-1 if p=q|p>q|p<q w.r.t monomial ordering
#define pCopy(p)
return a copy of the poly
ideal idrMoveR(ideal &id, ring src_r, ring dest_r)
ideal idrMoveR_NoSort(ideal &id, ring src_r, ring dest_r)
void PrintS(const char *s)
void Werror(const char *fmt,...)
void rWrite(ring r, BOOLEAN details)
void rDelete(ring r)
unconditionally deletes fields in r
static BOOLEAN rField_is_Z(const ring r)
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
static BOOLEAN rField_is_Zn(const ring r)
static BOOLEAN rIsLPRing(const ring r)
BOOLEAN rHasLocalOrMixedOrdering(const ring r)
#define rField_is_Ring(R)
ideal idInit(int idsize, int rank)
initialise an ideal / module
void id_DelDiv(ideal id, const ring r)
delete id[j], if LT(j) == coeff*mon*LT(i) and vice versa, i.e., delete id[i], if LT(i) == coeff*mon*L...
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)