2342 #if SBA_PRINT_ZERO_REDUCTIONS 2343 long zeroreductions = 0;
2345 #if SBA_PRINT_PRODUCT_CRITERION 2346 long product_criterion = 0;
2348 #if SBA_PRINT_SIZE_G 2350 int size_g_non_red = 0;
2352 #if SBA_PRINT_SIZE_SYZ 2356 #if SBA_PRINT_REDUCTION_STEPS 2357 sba_reduction_steps = 0;
2358 sba_interreduction_steps = 0;
2360 #if SBA_PRINT_OPERATIONS 2362 sba_interreduction_operations = 0;
2366 ring sRing, currRingOld;
2371 if (sRing!=currRingOld)
2390 dummy =
pCopy(F->m[0]);
2392 F->m[
i] = F->m[
i+1];
2413 dummy =
pCopy(F->m[0]);
2415 F->m[
i] = F->m[
i+1];
2434 F->m[
i] = F1->m[(*sort)[
i]-1];
2448 F->m[
j] = F->m[
j-1];
2466 printf(
"SBA COMPUTATIONS DONE IN THE FOLLOWING RING:\n");
2468 printf(
"ordSgn = %d\n",
currRing->OrdSgn);
2471 int srmax,lrmax, red_result = 1;
2473 int hilbeledeg=1,hilbcount=0,minimcnt=0;
2487 reduc = olddeg = lrmax = 0;
2500 #ifdef HAVE_TAIL_RING 2518 strat->
enterS(strat->
L[strat->
Ll-(
i)], strat->
sl+1, strat, strat->
tl);
2528 while (strat->
Ll >= 0)
2531 printf(
"\n ------------------------NEW LOOP\n");
2532 printf(
"\nShdl = \n");
2536 for(
int ii = 0; ii<=strat->
sl;ii++)
2543 for(
int iii = 0; iii< strat->
syzl; iii++)
2545 printf(
"\nsyz[%i]:\n",iii);
2550 for(
int iii = 0; iii<= strat->
tl; iii++)
2552 printf(
"\nT[%i]:\n",iii);
2556 printf(
"\n list L\n");
2559 for(iii = 0; iii<= strat->
Ll; iii++)
2561 printf(
"\nL[%i]:\n",iii);
2569 printf(
"L[%i]:",strat->
Ll);
2578 if (strat->
Ll > lrmax) lrmax =strat->
Ll;
2608 f5c ( strat, olddeg, minimcnt, hilbeledeg, hilbcount, srmax,
2609 lrmax, reduc,
Q, w, hilb );
2619 strat->
P = strat->
L[strat->
Ll];
2626 printf(
"\n-------------------------\nThis is the current element P\n");
2633 if (!strat->
rewCrit2(strat->
P.sig, ~strat->
P.sevSig, strat->
P.GetLmCurrRing(),
strat, strat->
P.checked+1)) {
2636 PrintS(
"SIG OF NEXT PAIR TO HANDLE IN SIG-BASED ALGORITHM\n");
2637 PrintS(
"-------------------------------------------------\n");
2642 PrintS(
"-------------------------------------------------\n");
2677 else if (strat->
P.p1 ==
NULL)
2679 if (strat->
minim > 0)
2685 if (strat->
P.p ==
NULL && strat->
P.t_p ==
NULL)
2693 PrintS(
"Poly before red: ");
2697 #if SBA_PRODUCT_CRITERION 2698 if (strat->
P.prod_crit) {
2699 #if SBA_PRINT_PRODUCT_CRITERION 2700 product_criterion++;
2702 int pos =
posInSyz(strat, strat->
P.sig);
2704 if (strat->
P.lcm!=
NULL)
2708 red_result = strat->
red(&strat->
P,strat);
2711 red_result = strat->
red(&strat->
P,strat);
2725 strat->
P.p =
pNeg(strat->
P.p);
2726 strat->
P.sig =
pNeg(strat->
P.sig);
2729 if(strat->
P.sig !=
NULL)
2731 if(strat->
P.p !=
NULL)
2735 printf(
"\nAfter reduce (redresult=%i): \n",red_result);
pWrite(strat->
P.p);
pWrite(strat->
P.sig);
2742 printf(
"\nSigdrop in the reduce. Trying redring\n");
2744 red_result =
redRing(&strat->
P,strat);
2748 printf(
"\nSigdrop cancelled since redRing reduced to 0\n");
2752 strat->
P.sig =
NULL;
2757 printf(
"\nStill Sigdrop - redRing reduced to:\n");
pWrite(strat->
P.p);
2759 strat->
enterS(strat->
P, 0, strat, strat->
tl);
2768 printf(
"\nToo many blocked reductions\n");
2778 if (red_result != 0) {
2779 PrintS(
"Poly after red: ");
2781 pWrite(strat->
P.GetLmCurrRing());
2783 printf(
"%d\n",red_result);
2788 if(strat->
P.p !=
NULL)
2790 &olddeg,&reduc,
strat, red_result);
2792 message((strat->honey ? strat->P.ecart : 0),
2793 &olddeg,&reduc,strat, red_result);
2796 if (strat->overflow)
2801 if (red_result == 1)
2804 strat->P.GetP(strat->lmBin);
2808 (strat->P).FDeg = (strat->P).pFDeg();
2812 if (strat->homog) strat->initEcart(&(strat->P));
2820 int pos = strat->sl+1;
2828 beforetailred =
pCopy(strat->P.sig);
2834 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2838 if (strat->sbaOrder != 2) {
2841 strat->P.pCleardenom();
2844 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2845 strat->P.pCleardenom();
2852 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2862 printf(
"\n Still sigdrop after redtailSba - it reduced to \n");
pWrite(strat->P.p);
2864 strat->enterS(strat->P, 0, strat, strat->tl);
2870 if(strat->P.sig ==
NULL ||
pLtCmp(beforetailred,strat->P.sig) == 1)
2873 printf(
"\nSigDrop after TAILred\n");
pWrite(beforetailred);
pWrite(strat->P.sig);
2875 strat->sigdrop =
TRUE;
2877 red_result =
redRing(&strat->P,strat);
2882 printf(
"\nReduced to 0 via redRing. Cancel sigdrop\n");
2884 strat->sigdrop =
FALSE;
2890 printf(
"\nReduced to this via redRing.SIGDROP\n");
pWrite(strat->P.p);
2892 strat->enterS(strat->P, 0, strat, strat->tl);
2898 if(strat->P.p ==
NULL)
2899 goto case_when_red_result_changed;
2902 printf(
"\nNach redTailSba: \n");
2907 if (strat->sbaOrder == 1)
2909 for (
int jj = 0; jj<strat->tl+1; jj++)
2911 if (
pGetComp(strat->T[jj].sig) == strat->currIdx)
2913 strat->T[jj].is_sigsafe =
FALSE;
2919 for (
int jj = 0; jj<strat->tl+1; jj++)
2921 strat->T[jj].is_sigsafe =
FALSE;
2929 if ((strat->P.p1==
NULL) && (strat->minim>0))
2931 if (strat->minim==1)
2933 strat->M->m[minimcnt]=
p_Copy(strat->P.p,
currRing,strat->tailRing);
2938 strat->M->m[minimcnt]=strat->P.p2;
2942 pNext(strat->M->m[minimcnt])
2943 = strat->p_shallow_copy_delete(
pNext(strat->M->m[minimcnt]),
2952 strat->T[strat->tl].is_sigsafe =
FALSE;
2959 superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
2961 enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
2963 printf(
"\nThis element is added to S\n");
2964 p_Write(strat->P.p, strat->tailRing);
p_Write(strat->P.p1, strat->tailRing);
p_Write(strat->P.p2, strat->tailRing);
pWrite(strat->P.sig);
2971 strat->enterS(strat->P, pos, strat, strat->tl);
2972 if(strat->sbaOrder != 1)
2975 for (
int tk=0; tk<strat->sl+1; tk++)
2996 for(
int ps=0;ps<strat->sl+1;ps++)
3000 if (strat->syzl == strat->syzmax)
3004 (strat->syzmax)*
sizeof(
unsigned long),
3006 *
sizeof(
unsigned long));
3009 Q.sig =
pCopy(strat->P.sig);
3012 if (strat->sbaOrder == 0)
3035 if(strat->sbaOrder == 0 || strat->sbaOrder == 3)
3046 if (strat->currIdx < idx) {
3047 for (
int i=0; i<strat->sl; ++
i) {
3057 strat->currIdx = idx;
3061 for (
int i=cmp+1; i<=max_cmp; ++
i) {
3063 for (
int j=0;
j<strat->sl; ++
j) {
3078 if (strat->sbaOrder == 0) {
3094 printf(
"---------------------------\n");
3095 Print(
" %d. ELEMENT ADDED TO GCURR:\n",strat->sl+1);
3118 if (hilb!=
NULL)
khCheck(Q,w,hilb,hilbeledeg,hilbcount,strat);
3120 if (strat->P.lcm!=
NULL)
3126 if (strat->sl>srmax) srmax = strat->sl;
3130 case_when_red_result_changed:
3136 if (red_result!=2) {
3137 #if SBA_PRINT_ZERO_REDUCTIONS 3146 int pos =
posInSyz(strat, strat->P.sig);
3150 Print(
"ADDING STUFF TO SYZ : ");
3156 if (strat->P.p1 ==
NULL && strat->minim > 0)
3163 memset(&(strat->P), 0,
sizeof(strat->P));
3169 printf(
"\nSigDrop!\n");
3171 printf(
"\nEnded with no SigDrop\n");
3177 if(strat->P.sig !=
NULL)
3178 strat->sbaEnterS =
pGetComp(strat->P.sig)-1;
3181 memset(&(strat->P), 0,
sizeof(strat->P));
3200 clearS(strat->S[j],strat->sevS[j],&k,&j,strat);
3211 if (strat->completeReduce_retry)
3216 #ifdef HAVE_TAIL_RING 3217 if(
currRing->bitmask>strat->tailRing->bitmask)
3219 strat->completeReduce_retry=
FALSE;
3222 for(i=strat->sl;i>=0;i--) strat->S_2_R[
i]=-1;
3225 if (strat->completeReduce_retry)
3232 #if SBA_PRINT_SIZE_SYZ 3234 size_syz = strat->syzl;
3247 #if SBA_PRINT_SIZE_G 3248 size_g_non_red =
IDELEMS(strat->Shdl);
3262 for(;k>=0 && (strat->L[
k].p1 !=
NULL || strat->L[
k].p2 !=
NULL);k--)
3272 for(;k>=0 && strat->L[
k].p1 ==
NULL && strat->L[
k].p2 ==
NULL;k--)
3275 strat->enterS(strat->L[k], strat->sl+1, strat, strat->tl);
3283 for(k=strat->sl;k>=0;k--)
3285 printf(
"\nsig[%i] = ",i);
pWrite(strat->sig[k]);
3286 if(strat->sig[k] ==
NULL)
3287 strat->sig[
k] =
pCopy(strat->sig[k-1]);
3296 if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld)
3305 if(strat->tailRing == sRing)
3316 #if SBA_PRINT_SIZE_G 3317 size_g =
IDELEMS(strat->Shdl);
3320 printf(
"SIZE OF SHDL: %d\n",
IDELEMS(strat->Shdl));
3322 while (oo<
IDELEMS(strat->Shdl))
3324 printf(
" %d. ",oo+1);
3329 #if SBA_PRINT_ZERO_REDUCTIONS 3330 printf(
"----------------------------------------------------------\n");
3331 printf(
"ZERO REDUCTIONS: %ld\n",zeroreductions);
3334 #if SBA_PRINT_REDUCTION_STEPS 3335 printf(
"----------------------------------------------------------\n");
3336 printf(
"S-REDUCTIONS: %ld\n",sba_reduction_steps);
3338 #if SBA_PRINT_OPERATIONS 3339 printf(
"OPERATIONS: %ld\n",sba_operations);
3341 #if SBA_PRINT_REDUCTION_STEPS 3342 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3343 printf(
"INTERREDUCTIONS: %ld\n",sba_interreduction_steps);
3345 #if SBA_PRINT_OPERATIONS 3346 printf(
"INTERREDUCTION OPERATIONS: %ld\n",sba_interreduction_operations);
3348 #if SBA_PRINT_REDUCTION_STEPS 3349 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3350 printf(
"ALL REDUCTIONS: %ld\n",sba_reduction_steps+sba_interreduction_steps);
3351 sba_interreduction_steps = 0;
3352 sba_reduction_steps = 0;
3354 #if SBA_PRINT_OPERATIONS 3355 printf(
"ALL OPERATIONS: %ld\n",sba_operations+sba_interreduction_operations);
3356 sba_interreduction_operations = 0;
3359 #if SBA_PRINT_SIZE_G 3360 printf(
"----------------------------------------------------------\n");
3361 printf(
"SIZE OF G: %d / %d\n",size_g,size_g_non_red);
3365 #if SBA_PRINT_SIZE_SYZ 3366 printf(
"SIZE OF SYZ: %ld\n",size_syz);
3367 printf(
"----------------------------------------------------------\n");
3370 #if SBA_PRINT_PRODUCT_CRITERION 3371 printf(
"PRODUCT CRITERIA: %ld\n",product_criterion);
3372 product_criterion = 0;
3374 return (strat->Shdl);
#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)
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)
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
#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)
#define pGetExpV(p, e)
Gets a copy of (resp. set) the exponent vector, where e is assumed to point to (r->N +1)*sizeof(long)...
void completeReduce(kStrategy strat, BOOLEAN withT)
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
void p_Write(poly p, ring lmRing, ring tailRing)
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