#define PLURAL_INTERNAL_DECLARATIONS
#include "kernel/mod2.h"
#include "misc/options.h"
#include "polys/simpleideals.h"
#include "polys/prCopy.h"
#include "polys/nc/sca.h"
#include "polys/nc/gb_hack.h"
#include "kernel/polys.h"
#include "kernel/ideals.h"
#include "kernel/GBEngine/kstd1.h"
#include "kernel/GBEngine/kutil.h"
#include "kernel/GBEngine/nc.h"
/// nc_gr_initBba is needed for sca_gr_bba and gr_bba.
void nc_gr_initBba(ideal F, kStrategy strat); // from gr_kstd2.cc!
void addLObject(LObject& h, kStrategy& strat)
{
if(h.IsNull()) return;
strat->initEcart(&h);
h.sev=0; // pGetShortExpVector(h.p);
// add h into S and L
int pos=posInS(strat, strat->sl, h.p, h.ecart);
if ( (pos <= strat->sl) && (p_ComparePolys(h.p, strat->S[pos], currRing)) )
{
if (TEST_OPT_PROT)
PrintS("d\n");
}
else
{
if (TEST_OPT_INTSTRATEGY)
{
p_Cleardenom(h.p, currRing);
}
else
{
pNorm(h.p);
}
if ((strat->syzComp==0)||(!strat->homog))
{
h.p = redtailBba(h.p,pos-1,strat);
if (TEST_OPT_INTSTRATEGY)
{
p_Cleardenom(h.p,currRing);
}
else
{
pNorm(h.p);
}
}
if(h.IsNull()) return;
// statistic
if (TEST_OPT_PROT)
{
PrintS("s\n");
}
#ifdef KDEBUG
if (TEST_OPT_DEBUG)
{
PrintS("new s:");
wrp(h.p);
PrintLn();
}
#endif
enterpairs(h.p, strat->sl, h.ecart, 0, strat);
pos=0;
if (strat->sl!=-1) pos = posInS(strat, strat->sl, h.p, h.ecart);
strat->enterS(h, pos, strat, -1);
// enterT(h, strat); // ?!
kDeleteLcm(&h);
}
}
ideal k_sca_gr_bba(const ideal F, const ideal Q, const intvec *, const intvec *, kStrategy strat, const ring _currRing)
{
const ring save = currRing;
if( currRing != _currRing ) rChangeCurrRing(_currRing);
assume( currRing == _currRing );
#if MYTEST
PrintS("\n");
#endif
assume(rIsSCA(currRing));
#ifndef SING_NDEBUG
idTest(F);
idTest(Q);
#endif
#ifdef HAVE_PLURAL
#if MYTEST
PrintS("currRing: \n");
rWrite(currRing);
#ifdef RDEBUG
rDebugPrint(currRing);
#endif
PrintS("F: \n");
idPrint(F);
PrintS("Q: \n");
idPrint(Q);
#endif
#endif
const unsigned int m_iFirstAltVar = scaFirstAltVar(currRing);
const unsigned int m_iLastAltVar = scaLastAltVar(currRing);
ideal tempF = id_KillSquares(F, m_iFirstAltVar, m_iLastAltVar, currRing);
ideal tempQ = Q;
if(Q == currRing->qideal)
tempQ = SCAQuotient(currRing);
strat->z2homog = id_IsSCAHomogeneous(tempF, NULL, NULL, currRing); // wCx == wCy == NULL!
// redo: no_prod_crit
const BOOLEAN bIsSCA = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit
strat->no_prod_crit = ! bIsSCA;
// strat->homog = strat->homog && strat->z2homog; // ?
#if MYTEST
{
PrintS("ideal tempF: \n");
idPrint(tempF);
PrintS("ideal tempQ: \n");
idPrint(tempQ);
}
#endif
int olddeg, reduc;
int red_result = 1;
// int hilbeledeg = 1, minimcnt = 0;
int hilbcount = 0;
initBuchMoraCrit(strat); // set Gebauer, honey, sugarCrit
nc_gr_initBba(tempF,strat); // set enterS, red, initEcart, initEcartPair
initBuchMoraPos(strat);
// ?? set spSpolyShort, reduce ???
initBuchMora(tempF, tempQ, strat); // SCAQuotient(currRing) instead of Q == squares!!!!!!!
strat->posInT=posInT110; // !!!
reduc = olddeg = 0;
// compute-------------------------------------------------------
for(; strat->Ll >= 0;
#ifdef KDEBUG
strat->P.lcm = NULL,
#endif
kTest(strat)
)
{
#ifdef KDEBUG
if (TEST_OPT_DEBUG) messageSets(strat);
#endif
if (strat->Ll== 0) strat->interpt=TRUE;
if (TEST_OPT_DEGBOUND
&& ((strat->honey
&& (strat->L[strat->Ll].ecart+ currRing->pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))
|| ((!strat->honey) && (currRing->pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))))
{
// stops computation if
// 24 IN test and the degree +ecart of L[strat->Ll] is bigger then
// a predefined number Kstd1_deg
while (strat->Ll >= 0) deleteInL(strat->L,&strat->Ll,strat->Ll,strat);
break;
}
// picks the last element from the lazyset L
strat->P = strat->L[strat->Ll];
strat->Ll--;
//kTest(strat);
// assume(pNext(strat->P.p) != strat->tail); // !???
if(strat->P.IsNull()) continue;
if( pNext(strat->P.p) == strat->tail )
{
// deletes the int spoly and computes SPoly
pLmFree(strat->P.p); // ???
strat->P.p = nc_CreateSpoly(strat->P.p1, strat->P.p2, currRing);
}
if(strat->P.IsNull()) continue;
// poly save = NULL;
//
// if(pNext(strat->P.p) != NULL)
// save = p_Copy(strat->P.p, currRing);
strat->initEcart(&strat->P); // remove it?
if (TEST_OPT_PROT)
message((strat->honey ? strat->P.ecart : 0) + strat->P.pFDeg(), &olddeg,&reduc,strat, red_result);
// reduction of the element chosen from L wrt S
strat->red(&strat->P,strat);
if(strat->P.IsNull()) continue;
addLObject(strat->P, strat);
const poly save = strat->P.p;
#ifdef PDEBUG
p_Test(save, currRing);
#endif
assume( save != NULL );
// SCA Specials:
{
const poly p_next = pNext(save);
if( p_next != NULL )
for( unsigned int i = m_iFirstAltVar; i <= m_iLastAltVar; i++ )
if( p_GetExp(save, i, currRing) != 0 )
{
assume(p_GetExp(save, i, currRing) == 1);
const poly tt = sca_pp_Mult_xi_pp(i, p_next, currRing);
#ifdef PDEBUG
p_Test(tt, currRing);
#endif
if( tt == NULL) continue;
LObject h(tt); // h = x_i * P
if (TEST_OPT_INTSTRATEGY)
{
h.pCleardenom(); // also removes Content
}
else
{
h.pNorm();
}
strat->initEcart(&h);
// if (pOrdSgn==-1)
// {
// cancelunit(&h); // tries to cancel a unit
// deleteHC(&h, strat);
// }
// if(h.IsNull()) continue;
// if (TEST_OPT_PROT)
// message((strat->honey ? h.ecart : 0) + h.pFDeg(), &olddeg, &reduc, strat, red_result);
// strat->red(&h, strat); // wrt S
// if(h.IsNull()) continue;
// poly save = p_Copy(h.p, currRing);
int pos;
if (strat->Ll==-1)
pos =0;
else
pos = strat->posInL(strat->L,strat->Ll,&h,strat);
h.sev = pGetShortExpVector(h.p);
enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos);
// h.p = save;
// addLObject(h, strat);
}
// p_Delete( &save, currRing );
}
} // for(;;)
#ifdef KDEBUG
if (TEST_OPT_DEBUG) messageSets(strat);
#endif
if (TEST_OPT_REDSB){
completeReduce(strat); // ???
}
// release temp data--------------------------------
exitBuchMora(strat);
// if (TEST_OPT_WEIGHTM)
// {
// pRestoreDegProcs(currRing,pFDegOld, pLDegOld);
// if (ecartWeights)
// {
// omFreeSize((ADDRESS)ecartWeights,(rVar(currRing)+1)*sizeof(int));
// ecartWeights=NULL;
// }
// }
if (TEST_OPT_PROT) messageStat(hilbcount,strat);
if (tempQ!=NULL) updateResult(strat->Shdl,tempQ,strat);
id_Delete(&tempF, currRing);
// complete reduction of the standard basis---------
if (TEST_OPT_REDSB){
ideal I = strat->Shdl;
ideal erg = kInterRedOld(I,tempQ);
assume(I!=erg);
id_Delete(&I, currRing);
strat->Shdl = erg;
}
#if MYTEST
// PrintS("\n");
#endif
if( currRing != save ) rChangeCurrRing(save);
return (strat->Shdl);
}
///////////////////////////////////////////////////////////////////////////////////////
//************* SCA BBA *************************************************************//
///////////////////////////////////////////////////////////////////////////////////////
// Under development!!!
ideal k_sca_bba (const ideal F, const ideal Q, const intvec */*w*/, const intvec * /*hilb*/, kStrategy strat, const ring _currRing)
{
const ring save = currRing;
if( currRing != _currRing ) rChangeCurrRing(_currRing);
assume( currRing == _currRing );
#if MYTEST
PrintS("\n\n\n\n");
#endif
assume(rIsSCA(currRing));
#ifndef SING_NDEBUG
idTest(F);
idTest(Q);
#endif
#if MYTEST
PrintS("\ncurrRing: \n");
rWrite(currRing);
#ifdef RDEBUG
// rDebugPrint(currRing);
#endif
PrintS("\n\nF: \n");
idPrint(F);
PrintS("\n\nQ: \n");
idPrint(Q);
PrintLn();
#endif
const unsigned int m_iFirstAltVar = scaFirstAltVar(currRing);
const unsigned int m_iLastAltVar = scaLastAltVar(currRing);
ideal tempF = id_KillSquares(F, m_iFirstAltVar, m_iLastAltVar, currRing);
ideal tempQ = Q;
if(Q == currRing->qideal)
tempQ = SCAQuotient(currRing);
// Q or tempQ will not be used below :(((
#if MYTEST
PrintS("tempF: \n");
idPrint(tempF);
PrintS("tempQ: \n");
idPrint(tempQ);
#endif
strat->z2homog = id_IsSCAHomogeneous(tempF, NULL, NULL, currRing); // wCx == wCy == NULL!
// redo no_prod_crit:
const BOOLEAN bIsSCA = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit
strat->no_prod_crit = ! bIsSCA;
// strat->homog = strat->homog && strat->z2homog; // ?
int red_result = 1;
int olddeg, reduc;
// int hilbeledeg = 1, minimcnt = 0;
int hilbcount = 0;
BOOLEAN withT = FALSE;
initBuchMoraCrit(strat); // sets Gebauer, honey, sugarCrit // sca - ok???
initBuchMoraPos(strat); // sets strat->posInL, strat->posInT // check!! (Plural's: )
// initHilbCrit(F, Q, &hilb, strat);
// nc_gr_initBba(F,strat);
initBba(strat); // set enterS, red, initEcart, initEcartPair
// set enterS, spSpolyShort, reduce, red, initEcart, initEcartPair
// ?? set spSpolyShort, reduce ???
initBuchMora(tempF, tempQ, strat); // tempQ = Q without squares!!!
// if (strat->minim>0) strat->M = idInit(IDELEMS(F),F->rank);
reduc = olddeg = 0;
#define NO_BUCKETS
#ifndef NO_BUCKETS
if (!TEST_OPT_NOT_BUCKETS)
strat->use_buckets = 1;
#endif
// redtailBBa against T for inhomogeneous input
if (!TEST_OPT_OLDSTD)
withT = ! strat->homog;
// strat->posInT = posInT_pLength;
kTest_TS(strat);
#undef HAVE_TAIL_RING
#ifdef HAVE_TAIL_RING
if(!idIs0(F) &&(!rField_is_Ring())) // create strong gcd poly computes with tailring and S[i] ->to be fixed
kStratInitChangeTailRing(strat);
#endif
if (BVERBOSE(23))
{
if (test_PosInT!=NULL) strat->posInT=test_PosInT;
if (test_PosInL!=NULL) strat->posInL=test_PosInL;
kDebugPrint(strat);
}
///////////////////////////////////////////////////////////////
// SCA:
// due to std( SB, p).
// Note that after initBuchMora :: initSSpecial all these additional
// elements are in S and T (and some pairs are in L, which also has no initial
// elements!!!)
if(TEST_OPT_SB_1)
{
// For all additional elements...
for (int iNewElement = strat->newIdeal; iNewElement < IDELEMS(tempF); iNewElement++)
{
const poly pSave = tempF->m[iNewElement];
if( pSave != NULL )
{
// tempF->m[iNewElement] = NULL;
const poly p_next = pNext(pSave);
if(p_next != NULL)
for( unsigned int i = m_iFirstAltVar; i <= m_iLastAltVar; i++ )
if( p_GetExp(pSave, i, currRing) != 0 )
{
assume(p_GetExp(pSave, i, currRing) == 1);
const poly p_new = sca_pp_Mult_xi_pp(i, p_next, currRing);
#ifdef PDEBUG
p_Test(p_new, currRing);
#endif
if( p_new == NULL) continue;
LObject h(p_new); // h = x_i * strat->P
h.is_special = TRUE;
if (TEST_OPT_INTSTRATEGY)
h.pCleardenom(); // also removes Content
else
h.pNorm();
strat->initEcart(&h);
h.sev = pGetShortExpVector(h.p);
int pos = 0;
if (strat->Ll != -1)
pos = strat->posInL(strat->L,strat->Ll,&h,strat);
enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos);
}
}
}
}
// compute-------------------------------------------------------
while (strat->Ll >= 0)
{
#ifdef KDEBUG
if (TEST_OPT_DEBUG) messageSets(strat);
#endif
if (strat->Ll== 0) strat->interpt=TRUE;
if (TEST_OPT_DEGBOUND
&& ((strat->honey && (strat->L[strat->Ll].ecart+currRing->pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))
|| ((!strat->honey) && (currRing->pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))))
{
#ifdef KDEBUG
// if (TEST_OPT_DEBUG){PrintS("^^^^?");}
#endif
// *stops computation if
// * 24 IN test and the degree +ecart of L[strat->Ll] is bigger then
// *a predefined number Kstd1_deg
while ((strat->Ll >= 0)
&& ( (strat->homog==isHomog) || strat->L[strat->Ll].is_special || ((strat->L[strat->Ll].p1!=NULL) && (strat->L[strat->Ll].p2!=NULL)) )
&& ((strat->honey && (strat->L[strat->Ll].ecart+currRing->pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg))
|| ((!strat->honey) && (currRing->pFDeg(strat->L[strat->Ll].p,currRing)>Kstd1_deg)))
)
{
#ifdef KDEBUG
// if (TEST_OPT_DEBUG){PrintS("^^^^^^^^^^^^!!!!");}
#endif
deleteInL(strat->L,&strat->Ll,strat->Ll,strat);
// if (TEST_OPT_PROT) PrintS("^!");
}
if (strat->Ll<0) break;
else strat->noClearS=TRUE;
}
// picks the last element from the lazyset L
strat->P = strat->L[strat->Ll];
strat->Ll--;
// assume(pNext(strat->P.p) != strat->tail);
if(strat->P.IsNull()) continue;
if (pNext(strat->P.p) == strat->tail)
{
// deletes the short spoly
pLmFree(strat->P.p);
strat->P.p = nc_CreateSpoly(strat->P.p1, strat->P.p2, currRing);
if (strat->P.p!=NULL) strat->initEcart(&strat->P);
}// else
if(strat->P.IsNull()) continue;
if (strat->P.p1 == NULL)
{
// if (strat->minim > 0)
// strat->P.p2=p_Copy(strat->P.p, currRing, strat->tailRing);
// for input polys, prepare reduction
strat->P.PrepareRed(strat->use_buckets);
}
if (TEST_OPT_PROT)
message((strat->honey ? strat->P.ecart : 0) + strat->P.pFDeg(),
&olddeg,&reduc,strat, red_result);
// reduction of the element chosen from L
red_result = strat->red(&strat->P,strat);
// reduction to non-zero new poly
if (red_result == 1)
{
// statistic
if (TEST_OPT_PROT) PrintS("s");
// get the polynomial (canonicalize bucket, make sure P.p is set)
strat->P.GetP(strat->lmBin);
int pos = posInS(strat,strat->sl,strat->P.p,strat->P.ecart);
// reduce the tail and normalize poly
if (TEST_OPT_INTSTRATEGY)
{
strat->P.pCleardenom();
if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
{
strat->P.p = redtailBba(&(strat->P),pos-1,strat, withT); // !!!
strat->P.pCleardenom();
}
}
else
{
strat->P.pNorm();
if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
strat->P.p = redtailBba(&(strat->P),pos-1,strat, withT);
}
strat->P.is_normalized=nIsOne(pGetCoeff(strat->P.p));
#ifdef KDEBUG
if (TEST_OPT_DEBUG){PrintS(" ns:");p_wrp(strat->P.p,currRing);PrintLn();}
#endif
// // min_std stuff
// if ((strat->P.p1==NULL) && (strat->minim>0))
// {
// if (strat->minim==1)
// {
// strat->M->m[minimcnt]=p_Copy(strat->P.p,currRing,strat->tailRing);
// p_Delete(&strat->P.p2, currRing, strat->tailRing);
// }
// else
// {
// strat->M->m[minimcnt]=strat->P.p2;
// strat->P.p2=NULL;
// }
// if (strat->tailRing!=currRing && pNext(strat->M->m[minimcnt])!=NULL)
// pNext(strat->M->m[minimcnt])
// = strat->p_shallow_copy_delete(pNext(strat->M->m[minimcnt]),
// strat->tailRing, currRing,
// currRing->PolyBin);
// minimcnt++;
// }
// enter into S, L, and T
//if(withT)
{
strat->P.SetpFDeg();
enterT(strat->P, strat);
}
// L
enterpairs(strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl);
// posInS only depends on the leading term
strat->enterS(strat->P, pos, strat, strat->tl);
// if (hilb!=NULL) khCheck(Q,w,hilb,hilbeledeg,hilbcount,strat);
// Print("[%d]",hilbeledeg);
kDeleteLcm(&strat->P);
// //////////////////////////////////////////////////////////
// SCA:
const poly pSave = strat->P.p;
const poly p_next = pNext(pSave);
// if(0)
if( p_next != NULL )
for( unsigned int i = m_iFirstAltVar; i <= m_iLastAltVar; i++ )
if( p_GetExp(pSave, i, currRing) != 0 )
{
assume(p_GetExp(pSave, i, currRing) == 1);
const poly p_new = sca_pp_Mult_xi_pp(i, p_next, currRing);
#ifdef PDEBUG
p_Test(p_new, currRing);
#endif
if( p_new == NULL) continue;
LObject h(p_new); // h = x_i * strat->P
h.is_special = TRUE;
if (TEST_OPT_INTSTRATEGY)
{
h.pCleardenom(); // also removes Content
}
else
{
h.pNorm();
}
strat->initEcart(&h);
h.sev = pGetShortExpVector(h.p);
int pos = 0;
if (strat->Ll != -1)
pos = strat->posInL(strat->L,strat->Ll,&h,strat);
enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos);
#if 0
h.sev = pGetShortExpVector(h.p);
strat->initEcart(&h);
h.PrepareRed(strat->use_buckets);
// reduction of the element chosen from L(?)
red_result = strat->red(&h,strat);
// reduction to non-zero new poly
if (red_result != 1) continue;
int pos = posInS(strat,strat->sl,h.p,h.ecart);
// reduce the tail and normalize poly
if (TEST_OPT_INTSTRATEGY)
{
h.pCleardenom();
if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
{
h.p = redtailBba(&(h),pos-1,strat, withT); // !!!
h.pCleardenom();
}
}
else
{
h.pNorm();
if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL))
h.p = redtailBba(&(h),pos-1,strat, withT);
}
#ifdef KDEBUG
if (TEST_OPT_DEBUG){PrintS(" N:");h.wrp();PrintLn();}
#endif
// h.PrepareRed(strat->use_buckets); // ???
h.sev = pGetShortExpVector(h.p);
strat->initEcart(&h);
if (strat->Ll==-1)
pos = 0;
else
pos = strat->posInL(strat->L,strat->Ll,&h,strat);
enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos);
// the end of "#if 0" (comment)
#endif
} // for all x_i \in Ann(lm(P))
} // if red(P) != NULL
// else if (strat->P.p1 == NULL && strat->minim > 0)
// {
// p_Delete(&strat->P.p2, currRing, strat->tailRing);
// }
#ifdef KDEBUG
// memset(&(strat->P), 0, sizeof(strat->P));
#endif
kTest_TS(strat); // even of T is not used!
// Print("\n$\n");
}
#ifdef KDEBUG
if (TEST_OPT_DEBUG) messageSets(strat);
#endif
// complete reduction of the standard basis---------
if (TEST_OPT_REDSB)
{
completeReduce(strat);
}
//release temp data--------------------------------
exitBuchMora(strat); // cleanT!
id_Delete(&tempF, currRing);
// if (TEST_OPT_WEIGHTM)
// {
// pRestoreDegProcs(currRing, pFDegOld, pLDegOld);
// if (ecartWeights)
// {
// omFreeSize((ADDRESS)ecartWeights,(rVar(currRing)+1)*sizeof(short));
// ecartWeights=NULL;
// }
// }
if (TEST_OPT_PROT) messageStat(hilbcount,strat);
if (tempQ!=NULL) updateResult(strat->Shdl,tempQ,strat);
if (TEST_OPT_REDSB) // ???
{
// must be at the very end (after exitBuchMora) as it changes the S set!!!
ideal I = strat->Shdl;
ideal erg = kInterRedOld(I,tempQ);
assume(I!=erg);
id_Delete(&I, currRing);
strat->Shdl = erg;
}
#if MYTEST
PrintS("\n\n\n\n");
#endif
if( currRing != save ) rChangeCurrRing(save);
return (strat->Shdl);
}
// //////////////////////////////////////////////////////////////////////////////
// sca mora...
// returns TRUE if mora should use buckets, false otherwise
#ifdef MORA_USE_BUCKETS
static BOOLEAN kMoraUseBucket(kStrategy strat)
#else
static BOOLEAN kMoraUseBucket(kStrategy)
#endif
{
#ifdef MORA_USE_BUCKETS
if (TEST_OPT_NOT_BUCKETS)
return FALSE;
if (strat->red == redFirst)
{
#ifdef NO_LDEG
if (!strat->syzComp)
return TRUE;
#else
if ((strat->homog || strat->honey) && !strat->syzComp)
return TRUE;
#endif
}
else
{
assume(strat->red == redEcart);
if (strat->honey && !strat->syzComp)
return TRUE;
}
#endif
return FALSE;
}
// ideal sca_mora (ideal F, ideal Q, intvec *w, intvec *, kStrategy strat)
ideal k_sca_mora(const ideal F, const ideal Q, const intvec */*w*/, const intvec *, kStrategy strat, const ring _currRing)
{
const ring save = currRing;
if( currRing != _currRing ) rChangeCurrRing(_currRing);
assume( currRing == _currRing );
assume(rIsSCA(currRing));
const unsigned int m_iFirstAltVar = scaFirstAltVar(currRing);
const unsigned int m_iLastAltVar = scaLastAltVar(currRing);
ideal tempF = id_KillSquares(F, m_iFirstAltVar, m_iLastAltVar, currRing);
ideal tempQ = Q;
if(Q == currRing->qideal)
tempQ = SCAQuotient(currRing);
bool bIdHomog = id_IsSCAHomogeneous(tempF, NULL, NULL, currRing); // wCx == wCy == NULL!
assume( !bIdHomog || strat->homog ); // bIdHomog =====[implies]>>>>> strat->homog
strat->homog = strat->homog && bIdHomog;
#ifdef PDEBUG
assume( strat->homog == bIdHomog );
#endif
strat->update = TRUE;
//- setting global variables ------------------- -
initBuchMoraCrit(strat);
// initHilbCrit(F,NULL,&hilb,strat); // no Q!
initMora(tempF, strat);
initBuchMoraPos(strat);
//Shdl=
initBuchMora(tempF, tempQ, strat); // temp Q, F!
// if (TEST_OPT_FASTHC) missingAxis(&strat->lastAxis,strat);
// updateS in initBuchMora has Hecketest
// * and could have put strat->kHEdgdeFound FALSE
#if 0
if (ppNoether!=NULL)
{
strat->kHEdgeFound = TRUE;
}
if (strat->kHEdgeFound && strat->update)
{
firstUpdate(strat);
updateLHC(strat);
reorderL(strat);
}
if (TEST_OPT_FASTHC && (strat->lastAxis) && strat->posInLOldFlag)
{
strat->posInLOld = strat->posInL;
strat->posInLOldFlag = FALSE;
strat->posInL = posInL10;
updateL(strat);
reorderL(strat);
}
#endif
strat->use_buckets = kMoraUseBucket(strat);
kTest_TS(strat);
int olddeg = 0;
int reduc = 0;
int red_result = 1;
// int hilbeledeg=1;
int hilbcount=0;
//- compute-------------------------------------------
#undef HAVE_TAIL_RING
#ifdef HAVE_TAIL_RING
// if (strat->homog && strat->red == redFirst)
// kStratInitChangeTailRing(strat);
#endif
// due to std( SB, p)
if(TEST_OPT_SB_1)
{
for (int iNewElement = strat->newIdeal; iNewElement < IDELEMS(tempF); iNewElement++)
{
const poly pSave = tempF->m[iNewElement];
if( pSave != NULL )
{
// tempF->m[iNewElement] = NULL;
const poly p_next = pNext(pSave);
if(p_next != NULL)
for( unsigned int i = m_iFirstAltVar; i <= m_iLastAltVar; i++ )
if( p_GetExp(pSave, i, currRing) != 0 )
{
assume(p_GetExp(pSave, i, currRing) == 1);
const poly p_new = sca_pp_Mult_xi_pp(i, p_next, currRing);
#ifdef PDEBUG
p_Test(p_new, currRing);
#endif
if( p_new == NULL) continue;
LObject h(p_new); // h = x_i * strat->P
if (TEST_OPT_INTSTRATEGY)
h.pCleardenom(); // also removes Content
else
h.pNorm();
strat->initEcart(&h);
h.sev = pGetShortExpVector(h.p);
int pos = 0;
if (strat->Ll != -1)
pos = strat->posInL(strat->L,strat->Ll,&h,strat);
enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos);
}
}
}
}
while (strat->Ll >= 0)
{
//test_int_std(strat->kIdeal);
#ifdef KDEBUG
if (TEST_OPT_DEBUG) messageSets(strat);
#endif
if (TEST_OPT_DEGBOUND
&& (strat->L[strat->Ll].ecart+strat->L[strat->Ll].GetpFDeg()> Kstd1_deg))
{
// * stops computation if
// * - 24 (degBound)
// * && upper degree is bigger than Kstd1_deg
while ((strat->Ll >= 0)
&& (strat->L[strat->Ll].p1!=NULL) && (strat->L[strat->Ll].p2!=NULL)
&& (strat->L[strat->Ll].ecart+strat->L[strat->Ll].GetpFDeg()> Kstd1_deg)
)
{
deleteInL(strat->L,&strat->Ll,strat->Ll,strat);
//if (TEST_OPT_PROT)
//{
// PrintS("D"); mflush();
//}
}
if (strat->Ll<0) break;
else strat->noClearS=TRUE;
}
strat->P = strat->L[strat->Ll];// - picks the last element from the lazyset L -
if (strat->Ll==0) strat->interpt=TRUE;
strat->Ll--;
// create the real Spoly
// assume(pNext(strat->P.p) != strat->tail);
if(strat->P.IsNull()) continue;
if( pNext(strat->P.p) == strat->tail )
{
// deletes the int spoly and computes SPoly
pLmFree(strat->P.p); // ???
strat->P.p = nc_CreateSpoly(strat->P.p1, strat->P.p2, currRing);
}
if (strat->P.p1 == NULL)
{
// for input polys, prepare reduction (buckets !)
strat->P.SetLength(strat->length_pLength);
strat->P.PrepareRed(strat->use_buckets);
}
if (!strat->P.IsNull())
{
// might be NULL from noether !!!
if (TEST_OPT_PROT)
message(strat->P.ecart+strat->P.GetpFDeg(),&olddeg,&reduc,strat, red_result);
// reduce
red_result = strat->red(&strat->P,strat);
}
if (! strat->P.IsNull())
{
strat->P.GetP();
// statistics
if (TEST_OPT_PROT) PrintS("s");
// normalization
if (!TEST_OPT_INTSTRATEGY)
strat->P.pNorm();
// tailreduction
strat->P.p = redtail(&(strat->P),strat->sl,strat);
// set ecart -- might have changed because of tail reductions
if ((!strat->noTailReduction) && (!strat->honey))
strat->initEcart(&strat->P);
// cancel unit
cancelunit(&strat->P);
// for char 0, clear denominators
if (TEST_OPT_INTSTRATEGY)
strat->P.pCleardenom();
// put in T
enterT(strat->P,strat);
// build new pairs
enterpairs(strat->P.p,strat->sl,strat->P.ecart,0,strat, strat->tl);
// put in S
strat->enterS(strat->P,
posInS(strat,strat->sl,strat->P.p, strat->P.ecart),
strat, strat->tl);
// clear strat->P
kDeleteLcm(&strat->P);
// //////////////////////////////////////////////////////////
// SCA:
const poly pSave = strat->P.p;
const poly p_next = pNext(pSave);
if(p_next != NULL)
for( unsigned int i = m_iFirstAltVar; i <= m_iLastAltVar; i++ )
if( p_GetExp(pSave, i, currRing) != 0 )
{
assume(p_GetExp(pSave, i, currRing) == 1);
const poly p_new = sca_pp_Mult_xi_pp(i, p_next, currRing);
#ifdef PDEBUG
p_Test(p_new, currRing);
#endif
if( p_new == NULL) continue;
LObject h(p_new); // h = x_i * strat->P
if (TEST_OPT_INTSTRATEGY)
h.pCleardenom(); // also removes Content
else
h.pNorm();
strat->initEcart(&h);
h.sev = pGetShortExpVector(h.p);
int pos = 0;
if (strat->Ll != -1)
pos = strat->posInL(strat->L,strat->Ll,&h,strat);
enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos);
}
#ifdef KDEBUG
// make sure kTest_TS does not complain about strat->P
memset(&strat->P,0,sizeof(strat->P));
#endif
}
#if 0
if (strat->kHEdgeFound)
{
if ((TEST_OPT_FINDET)
|| ((TEST_OPT_MULTBOUND) && (scMult0Int((strat->Shdl)) < mu)))
{
// obachman: is this still used ???
// * stops computation if strat->kHEdgeFound and
// * - 27 (finiteDeterminacyTest)
// * or
// * - 23
// * (multBound)
// * && multiplicity of the ideal is smaller then a predefined number mu
while (strat->Ll >= 0) deleteInL(strat->L,&strat->Ll,strat->Ll,strat);
}
}
#endif
kTest_TS(strat);
}
// - complete reduction of the standard basis------------------------ -
if (TEST_OPT_REDSB) completeReduce(strat);
// - release temp data------------------------------- -
exitBuchMora(strat);
// - polynomials used for HECKE: HC, noether -
if (TEST_OPT_FINDET)
{
if (strat->kNoether!=NULL)
Kstd1_mu=currRing->pFDeg(strat->kNoether,currRing);
else
Kstd1_mu=-1;
}
if(strat->kNoether!=NULL) pLmFree(&strat->kNoether);
strat->update = TRUE; //???
strat->lastAxis = 0; //???
omFreeSize((ADDRESS)strat->NotUsedAxis,(rVar(currRing)+1)*sizeof(BOOLEAN));
if (TEST_OPT_PROT) messageStat(hilbcount,strat);
// if (TEST_OPT_WEIGHTM)
// {
// pRestoreDegProcs(currRing, pFDegOld, pLDegOld);
// if (ecartWeights)
// {
// omFreeSize((ADDRESS)ecartWeights,(rVar(currRing)+1)*sizeof(short));
// ecartWeights=NULL;
// }
// }
if (tempQ!=NULL) updateResult(strat->Shdl,tempQ,strat);
idTest(strat->Shdl);
id_Delete( &tempF, currRing);
if( currRing != save ) rChangeCurrRing(save);
return (strat->Shdl);
}