2260 #if SBA_PRINT_ZERO_REDUCTIONS 2261 long zeroreductions = 0;
2263 #if SBA_PRINT_PRODUCT_CRITERION 2264 long product_criterion = 0;
2266 #if SBA_PRINT_SIZE_G 2268 int size_g_non_red = 0;
2270 #if SBA_PRINT_SIZE_SYZ 2274 #if SBA_PRINT_REDUCTION_STEPS 2275 sba_reduction_steps = 0;
2276 sba_interreduction_steps = 0;
2278 #if SBA_PRINT_OPERATIONS 2280 sba_interreduction_operations = 0;
2284 ring sRing, currRingOld;
2289 if (sRing!=currRingOld)
2308 dummy =
pCopy(F->m[0]);
2310 F->m[
i] = F->m[
i+1];
2331 dummy =
pCopy(F->m[0]);
2333 F->m[
i] = F->m[
i+1];
2351 for (
int i=0;
i<
sort->length();++
i)
2352 F->m[
i] = F1->m[(*
sort)[
i]-1];
2366 F->m[
j] = F->m[
j-1];
2384 printf(
"SBA COMPUTATIONS DONE IN THE FOLLOWING RING:\n");
2386 printf(
"ordSgn = %d\n",
currRing->OrdSgn);
2389 int srmax,lrmax, red_result = 1;
2391 int hilbeledeg=1,hilbcount=0,minimcnt=0;
2405 reduc = olddeg = lrmax = 0;
2418 #ifdef HAVE_TAIL_RING 2436 strat->
enterS(strat->
L[strat->
Ll-(
i)], strat->
sl+1, strat, strat->
tl);
2446 while (strat->
Ll >= 0)
2448 if (strat->
Ll > lrmax) lrmax =strat->
Ll;
2478 f5c ( strat, olddeg, minimcnt, hilbeledeg, hilbcount, srmax,
2479 lrmax, reduc,
Q,
w, hilb );
2489 strat->
P = strat->
L[strat->
Ll];
2495 if (!strat->
rewCrit2(strat->
P.sig, ~strat->
P.sevSig, strat->
P.GetLmCurrRing(), strat, strat->
P.checked+1))
2499 PrintS(
"SIG OF NEXT PAIR TO HANDLE IN SIG-BASED ALGORITHM\n");
2500 PrintS(
"-------------------------------------------------\n");
2505 PrintS(
"-------------------------------------------------\n");
2540 else if (strat->
P.p1 ==
NULL)
2542 if (strat->
minim > 0)
2548 if (strat->
P.p ==
NULL && strat->
P.t_p ==
NULL)
2556 PrintS(
"Poly before red: ");
2560 #if SBA_PRODUCT_CRITERION 2561 if (strat->
P.prod_crit)
2563 #if SBA_PRINT_PRODUCT_CRITERION 2564 product_criterion++;
2566 int pos =
posInSyz(strat, strat->
P.sig);
2573 red_result = strat->
red(&strat->
P,strat);
2576 red_result = strat->
red(&strat->
P,strat);
2592 strat->
P.p =
pNeg(strat->
P.p);
2593 strat->
P.sig =
pNeg(strat->
P.sig);
2596 if(strat->
P.sig !=
NULL)
2598 if(strat->
P.p !=
NULL)
2605 red_result =
redRing(&strat->
P,strat);
2610 strat->
P.sig =
NULL;
2614 strat->
enterS(strat->
P, 0, strat, strat->
tl);
2630 if (red_result != 0)
2632 PrintS(
"Poly after red: ");
2634 pWrite(strat->
P.GetLmCurrRing());
2636 printf(
"%d\n",red_result);
2641 if(strat->
P.p !=
NULL)
2643 &olddeg,&reduc,strat, red_result);
2645 message((strat->honey ? strat->P.ecart : 0),
2646 &olddeg,&reduc,strat, red_result);
2649 if (strat->overflow)
2654 if (red_result == 1)
2657 strat->P.GetP(strat->lmBin);
2661 (strat->P).FDeg = (strat->P).pFDeg();
2665 if (strat->homog) strat->initEcart(&(strat->P));
2673 int pos = strat->sl+1;
2681 beforetailred =
pCopy(strat->P.sig);
2687 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2691 if (strat->sbaOrder != 2)
2695 strat->P.pCleardenom();
2698 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2699 strat->P.pCleardenom();
2706 strat->P.p =
redtailSba(&(strat->P),pos-1,strat, withT);
2715 strat->enterS(strat->P, 0, strat, strat->tl);
2721 if(strat->P.sig ==
NULL ||
pLtCmp(beforetailred,strat->P.sig) == 1)
2723 strat->sigdrop =
TRUE;
2725 red_result =
redRing(&strat->P,strat);
2729 strat->sigdrop =
FALSE;
2734 strat->enterS(strat->P, 0, strat, strat->tl);
2740 if(strat->P.p ==
NULL)
2741 goto case_when_red_result_changed;
2745 if (strat->sbaOrder == 1)
2747 for (
int jj = 0; jj<strat->tl+1; jj++)
2749 if (
pGetComp(strat->T[jj].sig) == strat->currIdx)
2751 strat->T[jj].is_sigsafe =
FALSE;
2757 for (
int jj = 0; jj<strat->tl+1; jj++)
2759 strat->T[jj].is_sigsafe =
FALSE;
2767 if ((strat->P.p1==
NULL) && (strat->minim>0))
2769 if (strat->minim==1)
2771 strat->M->m[minimcnt]=
p_Copy(strat->P.p,
currRing,strat->tailRing);
2776 strat->M->m[minimcnt]=strat->P.p2;
2780 pNext(strat->M->m[minimcnt])
2781 = strat->p_shallow_copy_delete(
pNext(strat->M->m[minimcnt]),
2790 strat->T[strat->tl].is_sigsafe =
FALSE;
2797 superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
2799 enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl);
2804 strat->enterS(strat->P, pos, strat, strat->tl);
2805 if(strat->sbaOrder != 1)
2808 for (
int tk=0; tk<strat->sl+1; tk++)
2829 for(
int ps=0;ps<strat->sl+1;ps++)
2833 if (strat->syzl == strat->syzmax)
2837 (strat->syzmax)*
sizeof(
unsigned long),
2839 *
sizeof(
unsigned long));
2842 Q.sig =
pCopy(strat->P.sig);
2845 if (strat->sbaOrder == 0)
2868 if(strat->sbaOrder == 0 || strat->sbaOrder == 3)
2871 unsigned max_cmp =
IDELEMS(F);
2879 if (strat->currIdx < idx)
2881 for (
int i=0;
i<strat->sl; ++
i)
2892 strat->currIdx = idx;
2898 for (
unsigned i=cmp+1;
i<=max_cmp; ++
i)
2901 for (
int j=0;
j<strat->sl; ++
j)
2919 if (strat->sbaOrder == 0)
2939 printf(
"---------------------------\n");
2940 Print(
" %d. ELEMENT ADDED TO GCURR:\n",strat->sl+1);
2963 if (hilb!=
NULL)
khCheck(
Q,
w,hilb,hilbeledeg,hilbcount,strat);
2966 if (strat->sl>srmax) srmax = strat->sl;
2970 case_when_red_result_changed:
2978 #if SBA_PRINT_ZERO_REDUCTIONS 2987 int pos =
posInSyz(strat, strat->P.sig);
2991 Print(
"ADDING STUFF TO SYZ : ");
2997 if (strat->P.p1 ==
NULL && strat->minim > 0)
3004 memset(&(strat->P), 0,
sizeof(strat->P));
3010 printf(
"\nSigDrop!\n");
3012 printf(
"\nEnded with no SigDrop\n");
3018 if(strat->P.sig !=
NULL)
3019 strat->sbaEnterS =
pGetComp(strat->P.sig)-1;
3022 memset(&(strat->P), 0,
sizeof(strat->P));
3041 clearS(strat->S[
j],strat->sevS[
j],&
k,&
j,strat);
3052 if (strat->completeReduce_retry)
3057 #ifdef HAVE_TAIL_RING 3058 if(
currRing->bitmask>strat->tailRing->bitmask)
3060 strat->completeReduce_retry=
FALSE;
3063 for(
i=strat->sl;
i>=0;
i--) strat->S_2_R[
i]=-1;
3066 if (strat->completeReduce_retry)
3073 #if SBA_PRINT_SIZE_SYZ 3075 size_syz = strat->syzl;
3088 #if SBA_PRINT_SIZE_G 3089 size_g_non_red =
IDELEMS(strat->Shdl);
3103 for(;
k>=0 && (strat->L[
k].p1 !=
NULL || strat->L[
k].p2 !=
NULL);
k--)
3113 for(;
k>=0 && strat->L[
k].p1 ==
NULL && strat->L[
k].p2 ==
NULL;
k--)
3116 strat->enterS(strat->L[
k], strat->sl+1, strat, strat->tl);
3124 for(
k=strat->sl;
k>=0;
k--)
3126 printf(
"\nsig[%i] = ",
i);
pWrite(strat->sig[
k]);
3127 if(strat->sig[
k] ==
NULL)
3128 strat->sig[
k] =
pCopy(strat->sig[
k-1]);
3137 if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld)
3146 if(strat->tailRing == sRing)
3157 #if SBA_PRINT_SIZE_G 3158 size_g =
IDELEMS(strat->Shdl);
3161 printf(
"SIZE OF SHDL: %d\n",
IDELEMS(strat->Shdl));
3163 while (oo<
IDELEMS(strat->Shdl))
3165 printf(
" %d. ",oo+1);
3170 #if SBA_PRINT_ZERO_REDUCTIONS 3171 printf(
"----------------------------------------------------------\n");
3172 printf(
"ZERO REDUCTIONS: %ld\n",zeroreductions);
3175 #if SBA_PRINT_REDUCTION_STEPS 3176 printf(
"----------------------------------------------------------\n");
3177 printf(
"S-REDUCTIONS: %ld\n",sba_reduction_steps);
3179 #if SBA_PRINT_OPERATIONS 3180 printf(
"OPERATIONS: %ld\n",sba_operations);
3182 #if SBA_PRINT_REDUCTION_STEPS 3183 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3184 printf(
"INTERREDUCTIONS: %ld\n",sba_interreduction_steps);
3186 #if SBA_PRINT_OPERATIONS 3187 printf(
"INTERREDUCTION OPERATIONS: %ld\n",sba_interreduction_operations);
3189 #if SBA_PRINT_REDUCTION_STEPS 3190 printf(
"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
3191 printf(
"ALL REDUCTIONS: %ld\n",sba_reduction_steps+sba_interreduction_steps);
3192 sba_interreduction_steps = 0;
3193 sba_reduction_steps = 0;
3195 #if SBA_PRINT_OPERATIONS 3196 printf(
"ALL OPERATIONS: %ld\n",sba_operations+sba_interreduction_operations);
3197 sba_interreduction_operations = 0;
3200 #if SBA_PRINT_SIZE_G 3201 printf(
"----------------------------------------------------------\n");
3202 printf(
"SIZE OF G: %d / %d\n",size_g,size_g_non_red);
3206 #if SBA_PRINT_SIZE_SYZ 3207 printf(
"SIZE OF SYZ: %ld\n",size_syz);
3208 printf(
"----------------------------------------------------------\n");
3211 #if SBA_PRINT_PRODUCT_CRITERION 3212 printf(
"PRODUCT CRITERIA: %ld\n",product_criterion);
3213 product_criterion = 0;
3215 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)
static void kDeleteLcm(LObject *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....
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)
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