42 #define poly_write(p) wrp(p);PrintLn() 46 #define USE_HEURISTIC2 52 static int cons_pairs;
53 static int crit_fails;
72 int r1,r2=0,rr,
l=(*syzstr->
Tl)[
index];
85 while ((rr>=0) && ((syzstr->
resPairs[
index])[rr].order==actdeg)
117 while ((tcp!=
NULL) &&
118 ((tcp->first_poly!=
i)||(tcp->second_poly!=r1))) tcp = tcp->next;
160 tcp->second_poly =
i;
209 tso.lcm =
p = nP->m[
i];
220 tso.order += (*syzstr->
cw)[jj-1];
227 tso.isNotMinimal = (poly)1;
243 tso.syz =
pAdd(
pp,tso.syz);
247 Print(
"erzeuge Paar im Modul %d,%d mit: \n",
index,tso.order);
292 memset(&tso,0,
sizeof(tso));
304 tso.order += (*syzstr->
cw)[jj-1];
311 tso.isNotMinimal =
NULL;
314 tso.syz =
pHead(syz);
317 tso.lcm =
pHead(tso.syz);
321 Print(
"erzeuge Halbpaar im Module %d,%d mit: \n",
index,tso.order);
341 #ifndef USE_HEURISTIC2 344 (*result)[i1] = i1+1;
349 while ((ll>0) && (o_r->m[ll-1]==
NULL)) ll--;
355 while ((
l<ll) && (!isDivisible))
359 isDivisible = isDivisible ||
367 Print(
"streiche Paar im Modul %d,%d mit: \n",
index,nextPairs[
i].order);
375 if (*secondpairs==
NULL) *secondpairs =
new intvec(howmuch);
376 (**secondpairs)[i2] =
i+1;
406 if (redWith==
NULL)
return toRed;
410 while ((
j>0) && (redWith->m[
j-1]==
NULL))
j--;
411 if ((toRed==
NULL) || (
j==0))
return toRed;
429 if (toRed==
NULL)
break;
436 if ((
i>=
j) || (q==
NULL))
break;
453 if (q!=
NULL)
PrintS(
"Hier ist was schief gelaufen!\n");
457 #ifdef USE_HEURISTIC1 471 (*tempV)[
i] = (*arg)[
i+ii];
482 (*
result)[ii] = (*tempV)[ii];
494 int howmuch,
int index,
int actord,
int* toSub,
495 int *maxindex,
int *maxdeg)
508 #ifdef USE_HEURISTIC1 510 int there_are_superfluous=0;
516 if ((nextPairs==
NULL) || (howmuch==0))
return;
518 while ((ks>0) && (syzstr->
res[
index+1]->m[ks-1]==
NULL)) ks--;
521 ((redset[kres-1].
p==
NULL) || (redset[kres-1].order>actord))) kres--;
522 while ((kres<(*syzstr->
Tl)[
index]) &&
523 (redset[kres-1].order!=0) && (redset[kres-1].order<=actord)) kres++;
533 if (actord<temp1_hilb->
length())
535 toGo = (*temp1_hilb)[actord];
537 Print(
"\nStze toGo im Modul %d und Grad %d auf: %d\n",1,actord-1,toGo);
548 Print(
"\nStze toGo im Modul %d und Grad %d auf: %d\n",
index,actord-1,toGo);
572 nextPairs[kk].p = nextPairs[kk].syz = nextPairs[kk].lcm =
NULL;
575 #ifdef USE_HEURISTIC2 587 if (spl1!=
NULL)
delete spl1;
591 if ((tso.p1!=
NULL) && (tso.p2!=
NULL))
599 PrintS(
"reduziere Paar mit: \n");
614 && ((redset[
j].ind1!=tso.ind1) || (redset[
j].ind2!=tso.ind2)))
628 redset[
j].length,
NULL);
652 PrintS(
"erhalte Paar mit: \n");
660 Print(
" mit index %d, %d ",tso.ind1,tso.ind2);
693 if (actord-
index>*maxdeg) *maxdeg = actord-
index;
701 #ifdef USE_HEURISTIC1 702 if (there_are_superfluous>=0)
709 if (tso.ind2==nextPairs[jj].ind2)
713 for (j2=
j;j2<spl1->
length()-1;j2++)
715 (*spl1)[j2] = (*spl1)[j2+1];
725 if (there_are_superfluous==0) there_are_superfluous = 1;
737 tso.p = tso.syz = tso.lcm =
NULL;
747 Print(
"naechstes i ist: %d",
i);
750 #ifdef USE_HEURISTIC1 751 if ((kk<0) && (there_are_superfluous>0))
755 spl1 = ivStrip(spl2);
759 there_are_superfluous = -1;
764 #ifdef USE_HEURISTIC2 765 if ((kk<0) && (toGo>0))
780 if (spl3!=
NULL)
delete spl3;
803 if (actord+1<temp_hilb->
length())
806 Print(
"\nSetze fuer Modul %d im Grad %d die Wert: \n",
index+1,actord);
807 (temp_hilb)->
show(0,0);
810 for (
int j=
k;
j>actord;
j--)
821 Print(
"\nSubtrahiere im Modul %d im Grad %d den Wert: %d\n",
index,actord-1,toSub);
829 for (
int j=cont_hilb->
length()-1;
j>actord;
j--)
851 while ((
i<(*syzstr->
Tl)[0]) && (((sPairs)[
i].syz==
NULL) ||
852 ((sPairs)[
i].order<deg)))
854 if ((
i>=(*syzstr->
Tl)[0]) || ((sPairs)[
i].order>deg))
return;
855 while ((
i<(*syzstr->
Tl)[0]) && (((sPairs)[
i].syz==
NULL) ||
856 ((sPairs)[
i].order==deg)))
858 if ((sPairs)[
i].syz!=
NULL)
861 PrintS(
"reduziere Erzeuger: \n");
866 PrintS(
"erhalte Erzeuger: \n");
870 if ((sPairs)[
i].syz !=
NULL)
879 if ((sPairs)[
i].isNotMinimal==
NULL)
881 PrintS(
"\nminimal generator: ");
887 res->m[
k] = (sPairs)[
i].syz;
892 if (1>*maxindex) *maxindex = 1;
893 if (deg-1>*maxdeg) *maxdeg = deg-1;
911 (*syzstr->
betti)[0] = 1;
918 while ((
k>0) && (toreor->m[
k-1]==
NULL))
k--;
921 for (
int j=0;
j<
k;
j++)
924 reor->m[
j] = toreor->m[
j];
928 for (
int j=0;
j<togo;
j++)
933 while ((
l<
k) && (syzstr->
res[
i]->m[
j]!=reor->m[
l]))
l++;
936 toreor->m[
m] = reor->m[
l];
956 int maxindex=0,maxdeg=0;
991 if (origR != syzstr->
syRing)
994 temp->m[
i] =
pCopy( arg->m[
i]);
995 if (temp->m[
i]!=
NULL)
998 if (
j<actdeg) actdeg =
j;
1020 while (nextPairs!=
NULL)
1023 Print(
"compute %d Paare im Module %d im Grad %d \n",howmuch,
index,actdeg+
index);
1044 Print(
"Bilde neue Paare in Modul %d!\n",
index);
1050 Print(
"Bilde neue Paare in Modul %d!\n",
index+1);
1059 PrintS(
"minimal resolution:\n");
1060 for (
int ti=1;ti<=*
length;ti++)
1064 PrintS(
"full resolution:\n");
1065 for (
int ti=1;ti<=*
length;ti++)
1071 Print(
"Criterion %d times applied\n",crit);
1072 Print(
"Criterion1 %d times applied\n",crit1);
1073 Print(
"%d superfluous pairs\n",spfl);
1074 Print(
"%d pairs considered\n",cons_pairs);
1075 Print(
"Criterion fails %d times\n",crit_fails);
1085 if (origR != syzstr->
syRing)
void kBucketClear(kBucket_pt bucket, poly *p, int *length)
void resize(int new_length)
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
void kBucketInit(kBucket_pt bucket, poly lm, int length)
SRes syInitRes(ideal arg, int *length, intvec *Tl, intvec *cw=NULL)
poly prCopyR(poly p, ring src_r, ring dest_r)
#define idDelete(H)
delete an ideal
static void syOrder_Hilb(poly p, syStrategy syzstr, int index)
static int si_min(const int a, const int b)
Compatiblity layer for legacy polynomial operations (over currRing)
number kBucketPolyRed(kBucket_pt bucket, poly p1, int l1, poly spNoether)
void syCompactifyPairSet(SSet sPairs, int sPlength, int first)
static int show(unsigned long offset, char *close)
#define omFreeSize(addr, size)
const poly kBucketGetLm(kBucket_pt bucket)
KINLINE poly ksOldCreateSpoly(poly p1, poly p2, poly spNoether, ring r)
#define pLmDelete(p)
assume p != NULL, deletes Lm(p)->coef and Lm(p)
void sySPRedSyz(syStrategy syzstr, sSObject redWith, poly q=NULL)
SSet syChosePairs(syStrategy syzstr, int *index, int *howmuch, int *actdeg)
static void syReOrdResult_Hilb(syStrategy syzstr, int maxindex, int maxdeg)
long * currShiftedComponents
#define pLmDivisibleBy(a, b)
like pDivisibleBy, except that it is assumed that a!=NULL, b!=NULL
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
#define pGetComp(p)
Component.
intvec * hHstdSeries(ideal S, intvec *modulweight, intvec *wdegree, ideal Q, ring tailRing)
poly kBucketExtractLm(kBucket_pt bucket)
#define pGetExp(p, i)
Exponent.
static void syRedNextPairs_Hilb(SSet nextPairs, syStrategy syzstr, int howmuch, int index, int actord, int *toSub, int *maxindex, int *maxdeg)
void syEnterPair(syStrategy syzstr, SObject *so, int *sPlength, int index)
Coefficient rings, fields and other domains suitable for Singular polynomials.
void kBucketDestroy(kBucket_pt *bucket_pt)
int syInitSyzMod(syStrategy syzstr, int index, int init=17)
long id_RankFreeModule(ideal s, ring lmRing, ring tailRing)
return the maximal component number found in any polynomial in s
#define pLmDivisibleByNoComp(a, b)
like pLmDivisibleBy, does not check components
static long pTotaldegree(poly p)
ring rAssure_dp_C(const ring r)
static long p_FDeg(const poly p, const ring r)
void PrintS(const char *s)
static intvec * syLinStrat2(SSet nextPairs, syStrategy syzstr, int howmuch, int index, intvec **secondpairs)
static void syCreateNewPairs_Hilb(syStrategy syzstr, int index, int actdeg)
static poly syRed_Hilb(poly toRed, syStrategy syzstr, int index)
static unsigned pLength(poly a)
void kBucket_Minus_m_Mult_p(kBucket_pt bucket, poly m, poly p, int *l, poly spNoether)
Bpoly == Bpoly - m*p; where m is a monom Does not destroy p and m assume (*l <= 0 || pLength(p) == *l...
#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
static int index(p_Length length, p_Ord ord)
void rChangeCurrRing(ring r)
ideal idInit(int idsize, int rank)
initialise an ideal / module
#define __p_Mult_nn(p, n, r)
void syCompactify1(SSet sPairs, int *sPlength, int first)
long ** ShiftedComponents
void syEnlargeFields(syStrategy syzstr, int index)
void pNorm(poly p, const ring R=currRing)
void sySetNewHilb(syStrategy syzstr, int toSub, int index, int actord)
void show(int mat=0, int spaces=0) const
static BOOLEAN length(leftv result, leftv arg)
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
static void pLmFree(poly p)
frees the space of the monomial m, assumes m != NULL coef is not freed, m is not advanced
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
kBucket_pt kBucketCreate(const ring bucket_ring)
Creation/Destruction of buckets.
static void syRedGenerOfCurrDeg_Hilb(syStrategy syzstr, int deg, int *maxindex, int *maxdeg)
#define IMATELEM(M, I, J)
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
void syDeletePair(SObject *so)
syStrategy syHilb(ideal arg, int *length)
#define pCopy(p)
return a copy of the poly
static void syHalfPair(poly syz, int newEl, syStrategy syzstr, int index)