29 int* Components,
long* ShiftedComponents);
55 (*so).isNotMinimal =
NULL;
74 (*so).isNotMinimal =
NULL;
94 (*argso).isNotMinimal =
NULL;
96 (*argso).reference = -1;
108 while (
k+kk<sPlength)
136 while (
k+kk<*sPlength)
165static int syzcomp2dpc_test(poly p1, poly p2)
167 long c1, c2, cc1, cc2, ccc1, ccc2, ec1, ec2;
174 ec1 = p1->exp[
currRing->typ[1].data.syzcomp.place];
175 ec2 = p2->exp[
currRing->typ[1].data.syzcomp.place];
179 Warn(
"Shifted comp of p1 out of sync. should %d, is %d", ccc1, ec1);
184 Warn(
"Shifted comp of p2 out of sync. should %d, is %d", ccc2, ec2);
202 if (o1 > o2)
return 1;
203 if (o1 < o2)
return -1;
219 if (o1==o2)
return 0;
278 if ((
j<0) || ((*iv)[
i]<
j))
306 (resPairs[0])[
i].syz = (arg->m[(*iv)[
i]-1]);
307 arg->m[(*iv)[
i]-1] =
NULL;
322 (resPairs[0])[
i].syz = arg->m[
j];
324 (resPairs[0])[
i].order = (*iv)[
j];
328 if (iv!=
NULL)
delete iv;
338 long new_comps = 0, new_space,
max;
343 if (sc[
i-1] + 1 < sc[
i]) holes++;
361 assume(new_space < SYZ_SHIFT_BASE && new_space >= 4);
363 long* tc = (
long*)
omAlloc(n*
sizeof(
long));
368 if (sc[
i-1] + 1 < sc[
i])
370 tc[
i] = tc[
i-1] + new_space;
388 memcpy(sc, tc, n*
sizeof(
long));
438 int till=(*syzstr->
Tl)[
index-1];
441 if (Pairs[
i].syz!=
NULL)
479 if (realcomp==0) realcomp=1;
492 if (trind1[orc]>tc+1)
break;
493 else if (trind1[orc] == tc+1)
506 WerrorS(
"orderedRes to small");
517 if ((LONG_MAX - same_comp) <= shind[ie-1])
520 assume((LONG_MAX - same_comp) > shind[ie-1]);
526 assume(ie == 1 || shind[ie-1] > 0);
527 shind[ie] = shind[ie-1] + same_comp;
539 if ((same_comp && prev + 2 >=
next) || (!same_comp &&
next - prev < 4))
544 assume((same_comp && prev + 2 <
next) || (!same_comp &&
next - prev >= 4));
550 for (
k=ie;
k >
j+1;
k--) shind[
k] = shind[
k-1];
555 shind[
j+1] = prev + 1;
556 assume(shind[
j+1] + 1 < shind[
j+2]);
562 shind[
j+1] = prev + ((
next - prev) >> 1);
563 assume (shind[
j] + 1 < shind[
j+1] && shind[
j+1] + 1 < shind[
j+2]);
591 trind[
k] = trind[
k-1];
592 trind[realcomp] =
j+1;
599 int howmuch,
int index)
601 int i=howmuch-1,i1=0,
l,ll;
620 while ((
l<ll) && (!isDivisible))
624 isDivisible = isDivisible ||
640 spSpolyCreate(tso.p2, tso.p1,
NULL,spSpolyLoop_General);
650 int howmuch,
int index)
652 int i=howmuch-1,i1=0,i2,i3,
l,ll;
671 while ((
l<ll) && (!isDivisible))
675 isDivisible = isDivisible ||
701 for (i1=0;i1<howmuch;i1++)
712 if (((*spl)[i1]>=0) && ((*spl)[i1]<(*spl)[i2]))
720 (*result)[i3] = i2+1;
769 int howmuch,
int index)
787 if ((nextPairs==
NULL) || (howmuch==0))
return;
789 while ((ks>0) && (syzstr->
res[
index+1]->m[ks-1]==
NULL)) ks--;
795 tso = nextPairs[(*spl1)[
i]-1];
796 if ((tso.p1!=
NULL) && (tso.p2!=
NULL))
802 tso.syz =
pHead(tso.lcm);
877 tso.isNotMinimal =
p;
892 syzstr->
res[
index+1]->m[ks] = tso.syz;
903 nextPairs[(*spl1)[
i]-1] = tso;
922 while ((
i<(*syzstr->
Tl)[
index-1]) && (((sPairs)[
i].syz==
NULL) ||
923 ((sPairs)[
i].order<deg)))
925 if ((
i>=(*syzstr->
Tl)[
index-1]) || ((sPairs)[
i].order>deg))
return;
926 while ((
i<(*syzstr->
Tl)[
index-1]) && (((sPairs)[
i].syz==
NULL) ||
927 ((sPairs)[
i].order==deg)))
929 if ((sPairs)[
i].syz!=
NULL)
933 ((sPairs)[
i].syz!=
NULL))
947 if ((sPairs)[
i].syz !=
NULL)
956 if ((sPairs)[
i].isNotMinimal==
NULL)
966 (sPairs)[
i].syzind =
k;
976 (sPairs)[
i].syzind = -1;
987 int ll,
k,no=(*so).order,sP=*sPlength,
i;
989 if ((sP==0) || (sPairs[sP-1].order<=no))
1000 if ((sPairs[an].order<=no) && (sPairs[an+1].order>no))
1005 else if ((sPairs[en].order<=no) && (sPairs[en+1].order>no))
1010 else if (sPairs[an].order>no)
1017 PrintS(
"Hier ist was faul!\n");
1023 if (sPairs[
i].order <= no)
1029 for (
k=(*sPlength);
k>ll;
k--)
1040 if (*sPlength>=(*syzstr->
Tl)[
index])
1043 for (ll=0;ll<(*syzstr->
Tl)[
index];ll++)
1054 temp[ll].isNotMinimal = (syzstr->
resPairs[
index])[ll].isNotMinimal;
1056 temp[ll].reference = (syzstr->
resPairs[
index])[ll].reference;
1075 int first,pos,jj,j1;
1081 while ((
k>0) && (rs[
k-1]==
NULL))
k--;
1082 if (newEl>=
k)
return;
1090 for (
j=newEl;
j<
k;
j++)
1095 for (
i=first;
i<pos;
i++)
1128 for (
i=first;
i<pos;
i++)
1136 for (ll=0;ll<(*syzstr->
Tl)[
index];ll++)
1147 temp[ll].isNotMinimal = (syzstr->
resPairs[
index])[ll].isNotMinimal;
1154 tso.lcm =
p = nPm[ii];
1165 tso.order += (*syzstr->
cw)[jj-1];
1172 tso.isNotMinimal =
NULL;
1183 int *howmuch,
int * actdeg,
int an,
int en)
1185 int newdeg=*actdeg,newindex=-1,
i,t,sldeg;
1195 sldeg = (*actdeg)+*
index;
1203 if ((resPairs[*
index])[
i].order == sldeg)
1209 && ((resPairs[*
index])[
i].order == sldeg))
1226 if ((resPairs[*
index])[
i].order == sldeg)
1232 && ((resPairs[*
index])[
i].order == *actdeg))
1259 if ((resPairs[*
index])[
i].order > t)
1260 t = (resPairs[*
index])[
i].order;
1262 if ((t>*actdeg+*
index) && ((newdeg==*actdeg) || (t<newdeg+*
index)))
1305 int *howmuch,
int * actdeg,
int mindeg)
1437 Print(
"In module %d: \n",
j);
1450 Print(
"%d elements of degree %ld\n",
i,deg);
1471 for (
int i=0;
i<init;
i++)
1482 syzstr->
sev[
index] = (
unsigned long*)
omAlloc0(init*
sizeof(
unsigned long));
1546 for (
j=0;
j<(*syzstr->
Tl)[
i];
j++)
1622 delete syzstr->
betti;
1648 ring origR=syzstr->
syRing;
1661 ri1 = totake[
i-1]->m;
1734 fullres[
i-1] =
res[
i];
1770 if ((*weights)[
i]!=(*(syzstr->
weights[0]))[
i])
1788 if ((fullres==
NULL) && (minres==
NULL))
1840 WerrorS(
"No resolution found");
1844 while ((
i>0) && (r[
i-1]==
NULL))
i--;
1859 while ((
l>0) && (rP[
l-1]==
NULL))
l--;
1860 if (
l==0)
return -1;
1865 while ((
i<(*syzstr->
Tl)[
l]) &&
1867 (rP[
l][
i].isNotMinimal!=
NULL))
1871 if ((
i<(*syzstr->
Tl)[
l]) &&
1873 (rP[
l][
i].isNotMinimal==
NULL))
1943 PrintS(
"No resolution defined\n");
1949 if (resolution==
NULL)
1956 (*resolution)[0] = syzstr->
res[1]->rank;
1961 while ((
j<(*syzstr->
Tl)[
k]) &&
1964 if (rP[
k][
j].isNotMinimal==
NULL)
1965 ((*resolution)[
k+1])++;
1985 (*resolution)[
k+1] =
idElem(rr[
k]);
1996 if ((
k>=resolution->
length()) || ((*resolution)[
k]==0))
1998 Print(
"%d",(*resolution)[
k]);
2006 if ((
k>=resolution->
length()) || ((*resolution)[
k]==0))
2009 if (((
k+1)>=resolution->
length()) || ((*resolution)[(
k+1)]==0))
2019 if ((
k>=resolution->
length()) || ((*resolution)[
k]==0))
2029 PrintS(
"resolution not minimized yet\n");
2041static poly syStripOut(poly
p,
intvec * toStrip)
2043 if (toStrip==
NULL)
return p;
2101 poly tempStripped=
NULL;
2105 while ((ii<ordn->
length()) && ((*ordn)[ii]!=-1) &&
2106 (sPairs[(*ordn)[ii]].syzind!=toMin))
2113 if (sPairs[
i].isNotMinimal!=
NULL)
2117 pisN = sPairs[
i].isNotMinimal;
2155 int ii=0,
i,tc,lp,ltS=-1;
2158 poly tempStripped=
NULL;
2162 while ((ii<ordn->
length()) && ((*ordn)[ii]!=-1) &&
2163 (sPairs[(*ordn)[ii]].syzind!=toMin))
2170 if (sPairs[
i].isNotMinimal!=
NULL)
2213 changes =
new intvec(rj+1,1,-1);
2214 while ((rj>0) && (ri->m[rj-1]==
NULL)) rj--;
2220 ri->m[
j] = ri->m[
j+
k];
2221 (*changes)[
j+
k+1] =
j+1;
2229 for (jj=
j;jj<rj;jj++)
2260 for (
int i=(*syzstr->
Tl)[
index-1]-1;
i>=0;
i--)
2278 int i,
j=0,
k=-1,
l,ii;
2285 if (sPairs[
i].syzind>
k)
2289 l = sPairs[
i].syzind;
2294 if (sPairs[
i].syzind<
l)
2296 l = sPairs[
i].syzind;
2323 tres[0] = syzstr->
res[1];
2351 if ((sPairs[
i].isNotMinimal==
NULL) && (sPairs[
i].
lcm!=
NULL))
2353 l = sPairs[
i].syzind;
2370 for (
i=(*syzstr->
Tl)[0]-1;
i>=0;
i--)
2372 if (sPairs[
i].syzind>=0)
2374 tres[1]->m[sPairs[
i].syzind] =
pCopy(syzstr->
res[1]->m[sPairs[
i].syzind]);
2463 for (
i=0;
i<=arg->rank;
i++)
2475 if (temp->m[
i]!=
NULL)
2478 if (
j<actdeg) actdeg =
j;
2502 while (nextPairs!=
NULL)
2535 if (origR != syzstr->
syRing)
2587 syzstr->
length = maxlength;
2600 for (
i=0;
i<=arg->rank;
i++)
2607 syzstr->
Tl =
new intvec(maxlength);
2612 if (temp->m[
i]!=
NULL)
2615 if (
j<actdeg) actdeg =
j;
2635 syzstr->
sev = (
unsigned long **)
omAlloc0((maxlength+1)*
sizeof(
unsigned long *));
2645 while (nextPairs!=
NULL)
2667 if (
index<(maxlength-1))
2677 if (origR != syzstr->
syRing)
static int si_max(const int a, const int b)
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
static int max(int a, int b)
void WerrorS(const char *s)
BOOLEAN idTestHomModule(ideal m, ideal Q, intvec *w)
#define idDelete(H)
delete an ideal
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
static BOOLEAN idHomModule(ideal m, ideal Q, intvec **w)
static intvec * idSort(ideal id, BOOLEAN nolex=TRUE)
static BOOLEAN length(leftv result, leftv arg)
intvec * ivCopy(const intvec *o)
KINLINE poly ksOldCreateSpoly(poly p1, poly p2, poly spNoether, ring r)
KINLINE poly ksOldSpolyRed(poly p1, poly p2, poly spNoether)
void kBucketClear(kBucket_pt bucket, poly *p, int *length)
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...
void kBucketTakeOutComp(kBucket_pt bucket, long comp, poly *r_p, int *l)
void kBucketDestroy(kBucket_pt *bucket_pt)
void kBucketInit(kBucket_pt bucket, poly lm, int length)
kBucket_pt kBucketCreate(const ring bucket_ring)
Creation/Destruction of buckets.
number kBucketPolyRed(kBucket_pt bucket, poly p1, int l1, poly spNoether)
const poly kBucketGetLm(kBucket_pt bucket)
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
#define omFreeSize(addr, size)
#define omRealloc0Size(addr, o_size, size)
#define TEST_OPT_NO_SYZ_MINIM
static int index(p_Length length, p_Ord ord)
void pEnlargeSet(poly **p, int l, int increment)
static int pLength(poly a)
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent @Note: the integer VarOffset encodes:
static void p_Delete(poly *p, const ring r)
void rChangeCurrRing(ring r)
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Compatibility layer for legacy polynomial operations (over currRing).
static long pTotaldegree(poly p)
#define pHead(p)
returns newly allocated copy of Lm(p), coef is copied, next=NULL, p might be NULL
#define pGetComp(p)
Component.
#define pSetCoeff(p, n)
deletes old coeff before setting the new one
#define pLmDelete(p)
assume p != NULL, deletes Lm(p)->coef and Lm(p)
#define pGetOrder(p)
Order.
#define pLmDivisibleBy(a, b)
like pDivisibleBy, except that it is assumed that a!=NULL, b!=NULL
#define pGetExp(p, i)
Exponent.
#define pInit()
allocates a new monomial and initializes everything to 0
void pTakeOutComp(poly *p, long comp, poly *q, int *lq, const ring R=currRing)
Splits *p into two polys: *q which consists of all monoms with component == comp and *p of all other ...
#define pCopy(p)
return a copy of the poly
#define pSortCompCorrect(p)
Assume: If considered only as poly in any component of p (say, monomials of other components of p are...
#define pLmDivisibleByNoComp(a, b)
like pLmDivisibleBy, does not check components
poly prMoveR(poly &p, ring src_r, ring dest_r)
poly prHeadR(poly p, ring src_r, ring dest_r, prCopyProc_t prproc)
poly prCopyR(poly p, ring src_r, ring dest_r)
void PrintS(const char *s)
void rGetSComps(int **currComponents, long **currShiftedComponents, int *length, ring r)
void rChangeSComps(int *currComponents, long *currShiftedComponents, int length, ring r)
void rDelete(ring r)
unconditionally deletes fields in r
ring rAssure_dp_S(const ring r)
void sBucketClearMerge(sBucket_pt bucket, poly *p, int *length)
void sBucketDestroy(sBucket_pt *bucket)
void sBucket_Add_m(sBucket_pt bucket, poly p)
sBucket_pt sBucketCreate(const ring r)
ideal idInit(int idsize, int rank)
initialise an ideal / module
void id_Delete(ideal *h, ring r)
deletes an ideal/module/matrix
long id_RankFreeModule(ideal s, ring lmRing, ring tailRing)
return the maximal component number found in any polynomial in s
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size
static int idElem(const ideal F)
number of non-zero polys in F
EXTERN_VAR omBin char_ptr_bin
static SSet syChosePairsPutIn(syStrategy syzstr, int *index, int *howmuch, int *actdeg, int an, int en)
poly syRedtail(poly p, syStrategy syzstr, int index)
void syCopyPair(SObject *argso, SObject *imso)
void syPrint(syStrategy syzstr, const char *sn)
void syEnterPair(SSet sPairs, SObject *so, int *sPlength, int)
void syKillComputation(syStrategy syzstr, ring r)
SRes syInitRes(ideal arg, int *length, intvec *Tl, intvec *cw)
static void syCreateNewPairs(syStrategy syzstr, int index, int newEl)
static poly syStripOutCopy(poly p, intvec *toStrip)
intvec * syBettiOfComputation(syStrategy syzstr, BOOLEAN minim, int *row_shift, intvec *weights)
static intvec * syOrdPairs(SSet sPairs, int length)
static poly syMinimizeP1(int toMin, syStrategy syzstr, intvec *ordn, int index, intvec *toStrip)
int syDim(syStrategy syzstr)
syStrategy syMinimize(syStrategy syzstr)
syStrategy syCopy(syStrategy syzstr)
static long syReorderShiftedComponents(long *sc, size_t n)
void syCompactifyPairSet(SSet sPairs, int sPlength, int first)
int sySize(syStrategy syzstr)
resolvente syReorder(resolvente res, int length, syStrategy syzstr, BOOLEAN toCopy, resolvente totake)
static void syRedGenerOfCurrDeg(syStrategy syzstr, int deg, int index)
void syCompactify1(SSet sPairs, int *sPlength, int first)
int syInitSyzMod(syStrategy syzstr, int index, int init)
void syKillEmptyEntres(resolvente res, int length)
static int syLengthInt(int i)
static void syPrintEmptySpaces1(int i)
void syEnlargeFields(syStrategy syzstr, int index)
void p_Setm_Syz(poly p, ring r, int *Components, long *ShiftedComponents)
static void pResetSetm(poly p)
void syInitializePair(SObject *so)
static intvec * syToStrip(syStrategy syzstr, int index)
static int syChMin(intvec *iv)
static void syRedNextPairs(SSet nextPairs, syStrategy syzstr, int howmuch, int index)
static BOOLEAN syOrder(poly p, syStrategy syzstr, int index, int realcomp)
SSet syChosePairs(syStrategy syzstr, int *index, int *howmuch, int *actdeg)
void syDeletePair(SObject *so)
static intvec * syLinStrat(SSet nextPairs, syStrategy syzstr, int howmuch, int index)
syStrategy syLaScala(ideal arg, int &maxlength, intvec *weights)
static resolvente syReadOutMinimalRes(syStrategy syzstr, BOOLEAN computeStd=FALSE)
void syResetShiftedComponents(syStrategy syzstr, int index, int hilb)
syStrategy syLaScala3(ideal arg, int *length)
static void syPrintEmptySpaces(int i)
intvec * syBetti(resolvente res, int length, int *regularity, intvec *weights, BOOLEAN tomin, int *row_shift)
void syMinimizeResolvente(resolvente res, int length, int first)
EXTERN_VAR long * currShiftedComponents
EXTERN_VAR int * currcomponents
#define SYZ_SHIFT_MAX_NEW_COMP_ESTIMATE
long ** ShiftedComponents
int F1(int a1, int &r1)
F1.