2281 #if SBA_PRINT_ZERO_REDUCTIONS 2282 long zeroreductions = 0;
2284 #if SBA_PRINT_PRODUCT_CRITERION 2285 long product_criterion = 0;
2287 #if SBA_PRINT_SIZE_G 2289 int size_g_non_red = 0;
2291 #if SBA_PRINT_SIZE_SYZ 2295 #if SBA_PRINT_REDUCTION_STEPS 2296 sba_reduction_steps = 0;
2297 sba_interreduction_steps = 0;
2299 #if SBA_PRINT_OPERATIONS 2301 sba_interreduction_operations = 0;
2305 ring sRing, currRingOld;
2310 if (sRing!=currRingOld)
2329 dummy =
pCopy(F->m[0]);
2331 F->m[
i] = F->m[
i+1];
2352 dummy =
pCopy(F->m[0]);
2354 F->m[
i] = F->m[
i+1];
2373 F->m[
i] = F1->m[(*sort)[
i]-1];
2387 F->m[
j] = F->m[
j-1];
2405 printf(
"SBA COMPUTATIONS DONE IN THE FOLLOWING RING:\n");
2407 printf(
"ordSgn = %d\n",
currRing->OrdSgn);
2410 int srmax,lrmax, red_result = 1;
2412 int hilbeledeg=1,hilbcount=0,minimcnt=0;
2426 reduc = olddeg = lrmax = 0;
2439 #ifdef HAVE_TAIL_RING 2457 strat->
enterS(strat->
L[strat->
Ll-(
i)], strat->
sl+1, strat, strat->
tl);
2467 while (strat->
Ll >= 0)
2469 if (strat->
Ll > lrmax) lrmax =strat->
Ll;
2499 f5c ( strat, olddeg, minimcnt, hilbeledeg, hilbcount, srmax,
2500 lrmax, reduc,
Q, w, hilb );
2510 strat->
P = strat->
L[strat->
Ll];
2516 if (!strat->
rewCrit2(strat->
P.sig, ~strat->
P.sevSig, strat->
P.GetLmCurrRing(), strat, strat->
P.checked+1))
2520 PrintS(
"SIG OF NEXT PAIR TO HANDLE IN SIG-BASED ALGORITHM\n");
2521 PrintS(
"-------------------------------------------------\n");
2526 PrintS(
"-------------------------------------------------\n");
2561 else if (strat->
P.p1 ==
NULL)
2563 if (strat->
minim > 0)
2569 if (strat->
P.p ==
NULL && strat->
P.t_p ==
NULL)
2577 PrintS(
"Poly before red: ");
2581 #if SBA_PRODUCT_CRITERION 2582 if (strat->
P.prod_crit)
2584 #if SBA_PRINT_PRODUCT_CRITERION 2585 product_criterion++;
2587 int pos =
posInSyz(strat, strat->
P.sig);
2589 if (strat->
P.lcm!=
NULL)
2595 red_result = strat->
red(&strat->
P,strat);
2598 red_result = strat->
red(&strat->
P,strat);
2614 strat->
P.p =
pNeg(strat->
P.p);
2615 strat->
P.sig =
pNeg(strat->
P.sig);
2618 if(strat->
P.sig !=
NULL)
2620 if(strat->
P.p !=
NULL)
2627 red_result =
redRing(&strat->
P,strat);
2632 strat->
P.sig =
NULL;
2636 strat->
enterS(strat->
P, 0, strat, strat->
tl);
2652 if (red_result != 0)
2654 PrintS(
"Poly after red: ");
2656 pWrite(strat->
P.GetLmCurrRing());
2658 printf(
"%d\n",red_result);
2663 if(strat->
P.p !=
NULL)
2665 &olddeg,&reduc,strat, red_result);
2667 message((strat->honey ? strat->P.ecart : 0),
2668 &olddeg,&reduc,strat, red_result);
2671 if (strat->overflow)
2676 if (red_result == 1)
2679 strat->P.GetP(strat->lmBin);
2683 (strat->P).FDeg = (strat->P).pFDeg();
2687 if (strat->homog) strat->initEcart(&(strat->P));
2695 int pos = strat->sl+1;
2703 beforetailred =
pCopy(strat->P.sig);
2709 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2713 if (strat->sbaOrder != 2)
2717 strat->P.pCleardenom();
2720 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2721 strat->P.pCleardenom();
2728 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2737 strat->enterS(strat->P, 0, strat, strat->tl);
2743 if(strat->P.sig ==
NULL ||
pLtCmp(beforetailred,strat->P.sig) == 1)
2745 strat->sigdrop =
TRUE;
2747 red_result =
redRing(&strat->P,strat);
2751 strat->sigdrop =
FALSE;
2756 strat->enterS(strat->P, 0, strat, strat->tl);
2762 if(strat->P.p ==
NULL)
2763 goto case_when_red_result_changed;
2767 if (strat->sbaOrder == 1)
2769 for (
int jj = 0; jj<strat->tl+1; jj++)
2771 if (
pGetComp(strat->T[jj].sig) == strat->currIdx)
2773 strat->T[jj].is_sigsafe =
FALSE;
2779 for (
int jj = 0; jj<strat->tl+1; jj++)
2781 strat->T[jj].is_sigsafe =
FALSE;
2789 if ((strat->P.p1==
NULL) && (strat->minim>0))
2791 if (strat->minim==1)
2793 strat->M->m[minimcnt]=
p_Copy(strat->P.p,
currRing,strat->tailRing);
2798 strat->M->m[minimcnt]=strat->P.p2;
2802 pNext(strat->M->m[minimcnt])
2803 = strat->p_shallow_copy_delete(
pNext(strat->M->m[minimcnt]),
2812 strat->T[strat->tl].is_sigsafe =
FALSE;
2819 superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
2821 enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
2826 strat->enterS(strat->P, pos, strat, strat->tl);
2827 if(strat->sbaOrder != 1)
2830 for (
int tk=0; tk<strat->sl+1; tk++)
2851 for(
int ps=0;ps<strat->sl+1;ps++)
2855 if (strat->syzl == strat->syzmax)
2859 (strat->syzmax)*
sizeof(
unsigned long),
2861 *
sizeof(
unsigned long));
2864 Q.sig =
pCopy(strat->P.sig);
2867 if (strat->sbaOrder == 0)
2890 if(strat->sbaOrder == 0 || strat->sbaOrder == 3)
2901 if (strat->currIdx < idx)
2903 for (
int i=0; i<strat->sl; ++
i)
2914 strat->currIdx = idx;
2920 for (
int i=cmp+1; i<=max_cmp; ++
i)
2923 for (
int j=0;
j<strat->sl; ++
j)
2941 if (strat->sbaOrder == 0)
2961 printf(
"---------------------------\n");
2962 Print(
" %d. ELEMENT ADDED TO GCURR:\n",strat->sl+1);
2985 if (hilb!=
NULL)
khCheck(Q,w,hilb,hilbeledeg,hilbcount,strat);
2987 if (strat->P.lcm!=
NULL)
2993 if (strat->sl>srmax) srmax = strat->sl;
2997 case_when_red_result_changed:
3005 #if SBA_PRINT_ZERO_REDUCTIONS 3014 int pos =
posInSyz(strat, strat->P.sig);
3018 Print(
"ADDING STUFF TO SYZ : ");
3024 if (strat->P.p1 ==
NULL && strat->minim > 0)
3031 memset(&(strat->P), 0,
sizeof(strat->P));
3037 printf(
"\nSigDrop!\n");
3039 printf(
"\nEnded with no SigDrop\n");
3045 if(strat->P.sig !=
NULL)
3046 strat->sbaEnterS =
pGetComp(strat->P.sig)-1;
3049 memset(&(strat->P), 0,
sizeof(strat->P));
3068 clearS(strat->S[j],strat->sevS[j],&k,&j,strat);
3079 if (strat->completeReduce_retry)
3084 #ifdef HAVE_TAIL_RING 3085 if(
currRing->bitmask>strat->tailRing->bitmask)
3087 strat->completeReduce_retry=
FALSE;
3090 for(i=strat->sl;i>=0;i--) strat->S_2_R[
i]=-1;
3093 if (strat->completeReduce_retry)
3100 #if SBA_PRINT_SIZE_SYZ 3102 size_syz = strat->syzl;
3115 #if SBA_PRINT_SIZE_G 3116 size_g_non_red =
IDELEMS(strat->Shdl);
3130 for(;k>=0 && (strat->L[
k].p1 !=
NULL || strat->L[
k].p2 !=
NULL);k--)
3140 for(;k>=0 && strat->L[
k].p1 ==
NULL && strat->L[
k].p2 ==
NULL;k--)
3143 strat->enterS(strat->L[k], strat->sl+1, strat, strat->tl);
3151 for(k=strat->sl;k>=0;k--)
3153 printf(
"\nsig[%i] = ",i);
pWrite(strat->sig[k]);
3154 if(strat->sig[k] ==
NULL)
3155 strat->sig[
k] =
pCopy(strat->sig[k-1]);
3164 if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld)
3173 if(strat->tailRing == sRing)
3184 #if SBA_PRINT_SIZE_G 3185 size_g =
IDELEMS(strat->Shdl);
3188 printf(
"SIZE OF SHDL: %d\n",
IDELEMS(strat->Shdl));
3190 while (oo<
IDELEMS(strat->Shdl))
3192 printf(
" %d. ",oo+1);
3197 #if SBA_PRINT_ZERO_REDUCTIONS 3198 printf(
"----------------------------------------------------------\n");
3199 printf(
"ZERO REDUCTIONS: %ld\n",zeroreductions);
3202 #if SBA_PRINT_REDUCTION_STEPS 3203 printf(
"----------------------------------------------------------\n");
3204 printf(
"S-REDUCTIONS: %ld\n",sba_reduction_steps);
3206 #if SBA_PRINT_OPERATIONS 3207 printf(
"OPERATIONS: %ld\n",sba_operations);
3209 #if SBA_PRINT_REDUCTION_STEPS 3210 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3211 printf(
"INTERREDUCTIONS: %ld\n",sba_interreduction_steps);
3213 #if SBA_PRINT_OPERATIONS 3214 printf(
"INTERREDUCTION OPERATIONS: %ld\n",sba_interreduction_operations);
3216 #if SBA_PRINT_REDUCTION_STEPS 3217 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3218 printf(
"ALL REDUCTIONS: %ld\n",sba_reduction_steps+sba_interreduction_steps);
3219 sba_interreduction_steps = 0;
3220 sba_reduction_steps = 0;
3222 #if SBA_PRINT_OPERATIONS 3223 printf(
"ALL OPERATIONS: %ld\n",sba_operations+sba_interreduction_operations);
3224 sba_interreduction_operations = 0;
3227 #if SBA_PRINT_SIZE_G 3228 printf(
"----------------------------------------------------------\n");
3229 printf(
"SIZE OF G: %d / %d\n",size_g,size_g_non_red);
3233 #if SBA_PRINT_SIZE_SYZ 3234 printf(
"SIZE OF SYZ: %ld\n",size_syz);
3235 printf(
"----------------------------------------------------------\n");
3238 #if SBA_PRINT_PRODUCT_CRITERION 3239 printf(
"PRODUCT CRITERIA: %ld\n",product_criterion);
3240 product_criterion = 0;
3242 return (strat->Shdl);
#define __p_GetComp(p, r)
#define omRealloc0Size(addr, o_size, size)
int(* posInL)(const LSet set, const int length, LObject *L, const kStrategy strat)
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 initSbaPos(kStrategy strat)
int redRing(LObject *h, kStrategy strat)
void message(int i, int *reduc, int *olddeg, kStrategy strat, int red_result)
BOOLEAN idInsertPolyOnPos(ideal I, poly p, int pos)
insert p into I on position pos
int posInIdealMonFirst(const ideal F, const poly p, int start, int end)
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
static void p_GetExpV(poly p, int *ev, const ring r)
BOOLEAN(* rewCrit2)(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int start)
void initSba(ideal F, kStrategy strat)
void initSyzRules(kStrategy strat)
#define pLmDelete(p)
assume p != NULL, deletes Lm(p)->coef and Lm(p)
ring sbaRing(kStrategy strat, const ring r, BOOLEAN, int)
void WerrorS(const char *s)
void initSbaBuchMora(ideal F, ideal Q, kStrategy strat)
static intvec * idSort(ideal id, BOOLEAN nolex=TRUE)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy ...
int(* red)(LObject *L, kStrategy strat)
int(* posInT)(const TSet T, const int tl, LObject &h)
void enterpairsSig(poly h, poly hSig, int hFrom, int k, int ecart, int pos, kStrategy strat, int atR)
#define pGetComp(p)
Component.
static void p_SetExpV(poly p, int *ev, const ring r)
static poly p_Copy(poly p, const ring r)
returns a copy of p
void kStratInitChangeTailRing(kStrategy strat)
#define TEST_OPT_NOT_BUCKETS
void enterT(LObject &p, kStrategy strat, int atT)
void deleteInL(LSet set, int *length, int j, kStrategy strat)
#define TEST_OPT_INTSTRATEGY
void initHilbCrit(ideal, ideal, intvec **hilb, kStrategy strat)
void messageStatSBA(int hilbcount, kStrategy strat)
#define pGetShortExpVector(a)
returns the "Short Exponent Vector" – used to speed up divisibility tests (see polys-impl.cc )
void(* enterS)(LObject &h, int pos, kStrategy strat, int atR)
void ksCreateSpoly(LObject *Pair, poly spNoether, int use_buckets, ring tailRing, poly m1, poly m2, TObject **R)
ideal kInterRed(ideal F, ideal Q)
ideal idrMoveR(ideal &id, ring src_r, ring dest_r)
static int p_LmCmp(poly p, poly q, const ring r)
BOOLEAN kStratChangeTailRing(kStrategy strat, LObject *L, TObject *T, unsigned long expbound)
void exitSba(kStrategy strat)
void PrintS(const char *s)
void superenterpairsSig(poly h, poly hSig, int hFrom, int k, int ecart, int pos, kStrategy strat, int atR)
static void p_ExpVectorAdd(poly p1, poly p2, const ring r)
void f5c(kStrategy strat, int &olddeg, int &minimcnt, int &hilbeledeg, int &hilbcount, int &srmax, int &lrmax, int &reduc, ideal Q, intvec *w, intvec *hilb)
void rWrite(ring r, BOOLEAN details)
static unsigned pLength(poly a)
#define pHead(p)
returns newly allocated copy of Lm(p), coef is copied, next=NULL, p might be NULL ...
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size
void rChangeCurrRing(ring r)
BOOLEAN kCheckSpolyCreation(LObject *L, kStrategy strat, poly &m1, poly &m2)
static void p_Delete(poly *p, const ring r)
void khCheck(ideal Q, intvec *w, intvec *hilb, int &eledeg, int &count, kStrategy strat)
unsigned long p_GetShortExpVector(const poly p, const ring r)
ideal idInit(int idsize, int rank)
initialise an ideal / module
static BOOLEAN rField_is_Ring(const ring r)
void cleanT(kStrategy strat)
#define SBA_INTERRED_START
void pEnlargeSet(poly **p, int l, int increment)
void rDelete(ring r)
unconditionally deletes fields in r
int posInSyz(const kStrategy strat, poly sig)
void initSbaCrit(kStrategy strat)
void completeReduce(kStrategy strat, BOOLEAN withT)
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
void updateResult(ideal r, ideal Q, kStrategy strat)
static void pLmFree(poly p)
frees the space of the monomial m, assumes m != NULL coef is not freed, m is not advanced ...
KINLINE void clearS(poly p, unsigned long p_sev, int *at, int *k, kStrategy strat)
int(* test_PosInT)(const TSet T, const int tl, LObject &h)
void sort(CFArray &A, int l=0)
quick sort A
int(* test_PosInL)(const LSet set, const int length, LObject *L, const kStrategy strat)
static poly p_Add_q(poly p, poly q, const ring r)
poly redtailSba(LObject *L, int pos, kStrategy strat, BOOLEAN withT, BOOLEAN normalize)
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
void Werror(const char *fmt,...)
void kDebugPrint(kStrategy strat)
void enterSyz(LObject &p, kStrategy strat, int atT)
ideal idrMoveR_NoSort(ideal &id, ring src_r, ring dest_r)
#define pCopy(p)
return a copy of the poly