My Project
Loading...
Searching...
No Matches
ideals.h File Reference

Go to the source code of this file.

Macros

#define idDelete(H)
 delete an ideal
#define idMaxIdeal(D)
 initialise the maximal ideal (at 0)
#define idPosConstant(I)
 index of generator with leading term in ground ring (if any); otherwise -1
#define idIsConstant(I)
#define idSimpleAdd(A, B)
#define idPrint(id)
#define idTest(id)

Typedefs

typedef ideal * resolvente

Enumerations

enum  GbVariant {
  GbDefault =0 , GbStd , GbSlimgb , GbSba ,
  GbGroebner , GbModstd , GbFfmod , GbNfmod ,
  GbStdSat , GbSingmatic
}

Functions

static ideal idCopyFirstK (const ideal ide, const int k)
void idKeepFirstK (ideal ide, const int k)
 keeps the first k (>= 1) entries of the given ideal (Note that the kept polynomials may be zero.)
void idDelEquals (ideal id)
ideal id_Copy (ideal h1, const ring r)
 copy an ideal
ideal idCopy (ideal A)
ideal idAdd (ideal h1, ideal h2)
 h1 + h2
BOOLEAN idInsertPoly (ideal h1, poly h2)
 insert h2 into h1 (if h2 is not the zero polynomial) return TRUE iff h2 was indeed inserted
BOOLEAN idInsertPolyOnPos (ideal I, poly p, int pos)
 insert p into I on position pos
BOOLEAN idInsertPolyWithTests (ideal h1, const int validEntries, const poly h2, const bool zeroOk, const bool duplicateOk)
static ideal idMult (ideal h1, ideal h2)
 hh := h1 * h2
BOOLEAN idIs0 (ideal h)
 returns true if h is the zero ideal
static BOOLEAN idHomIdeal (ideal id, ideal Q=NULL)
static BOOLEAN idHomModule (ideal m, ideal Q, intvec **w)
BOOLEAN idTestHomModule (ideal m, ideal Q, intvec *w)
ideal idMinBase (ideal h1, ideal *SB=NULL)
void idInitChoise (int r, int beg, int end, BOOLEAN *endch, int *choise)
void idGetNextChoise (int r, int end, BOOLEAN *endch, int *choise)
int idGetNumberOfChoise (int t, int d, int begin, int end, int *choise)
int binom (int n, int r)
ideal idFreeModule (int i)
ideal idSect (ideal h1, ideal h2, GbVariant a=GbDefault)
ideal idMultSect (resolvente arg, int length, GbVariant a=GbDefault)
ideal idSyzygies (ideal h1, tHomog h, intvec **w, BOOLEAN setSyzComp=TRUE, BOOLEAN setRegularity=FALSE, int *deg=NULL, GbVariant a=GbDefault)
ideal idLiftStd (ideal h1, matrix *m, tHomog h=testHomog, ideal *syz=NULL, GbVariant a=GbDefault, ideal h11=NULL)
ideal idLift (ideal mod, ideal submod, ideal *rest=NULL, BOOLEAN goodShape=FALSE, BOOLEAN isSB=TRUE, BOOLEAN divide=FALSE, matrix *unit=NULL, GbVariant a=GbDefault)
 represents the generators of submod in terms of the generators of mod (Matrix(SM)*U-Matrix(rest)) = Matrix(M)*Matrix(result) goodShape: maximal non-zero index in generators of SM <= that of M isSB: generators of M form a Groebner basis divide: allow SM not to be a submodule of M U is an diagonal matrix of units (non-constant only in local rings) rest is: 0 if SM in M, SM if not divide, NF(SM,std(M)) if divide
void idLiftW (ideal P, ideal Q, int n, matrix &T, ideal &R, int *w=NULL)
ideal idQuot (ideal h1, ideal h2, BOOLEAN h1IsStb=FALSE, BOOLEAN resultIsIdeal=FALSE)
ideal idElimination (ideal h1, poly delVar, intvec *hilb=NULL, GbVariant a=GbDefault)
ideal idElimination2 (ideal h1, poly delVar, bigintmat *hilb=NULL, GbVariant a=GbDefault)
ideal idMinors (matrix a, int ar, ideal R=NULL)
 compute all ar-minors of the matrix a the caller of mpRecMin the elements of the result are not in R (if R!=NULL)
ideal idMinEmbedding (ideal arg, BOOLEAN inPlace=FALSE, intvec **w=NULL)
ideal idMinEmbedding_with_map (ideal arg, intvec **w, ideal &trans)
ideal idMinEmbedding_with_map_v (ideal arg, intvec **w, ideal &trans, int *red_comp)
ideal idHead (ideal h)
BOOLEAN idIsSubModule (ideal id1, ideal id2)
static ideal idVec2Ideal (poly vec)
ideal idSeries (int n, ideal M, matrix U=NULL, intvec *w=NULL)
static BOOLEAN idIsZeroDim (ideal i)
matrix idDiff (matrix i, int k)
matrix idDiffOp (ideal I, ideal J, BOOLEAN multiply=TRUE)
static intvecidSort (ideal id, BOOLEAN nolex=TRUE)
ideal idModulo (ideal h1, ideal h2, tHomog h=testHomog, intvec **w=NULL, matrix *T=NULL, GbVariant a=GbDefault)
matrix idCoeffOfKBase (ideal arg, ideal kbase, poly how)
poly id_GCD (poly f, poly g, const ring r)
ideal id_Farey (ideal x, number N, const ring r)
ideal id_TensorModuleMult (const int m, const ideal M, const ring rRing)
ideal id_Satstd (const ideal I, ideal J, const ring r)
ideal id_Sat_principal (const ideal I, ideal J, const ring r)
ideal idSaturate_intern (ideal I, ideal J, int &ki, BOOLEAN isIdeal, BOOLEAN isSB)
ideal idSaturate (ideal I, ideal J, int &ki, BOOLEAN isIdeal=TRUE)
ideal idSaturateGB (ideal I, ideal J, int &ki, BOOLEAN isIdeal=TRUE)
ideal id_Homogenize (ideal I, int var_num, const ring r)
ideal id_HomogenizeW (ideal I, int var_num, intvec *w, const ring r)
GbVariant syGetAlgorithm (char *n, const ring r, const ideal M)

Macro Definition Documentation

◆ idDelete

#define idDelete ( H)
Value:
CanonicalForm H
Definition facAbsFact.cc:60
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition polys.cc:13
void id_Delete(ideal *h, ring r)
deletes an ideal/module/matrix

delete an ideal

Definition at line 29 of file ideals.h.

◆ idIsConstant

#define idIsConstant ( I)
Value:
BOOLEAN id_IsConstant(ideal id, const ring r)
test if the ideal has only constant polynomials NOTE: zero ideal/module is also constant

Definition at line 40 of file ideals.h.

◆ idMaxIdeal

#define idMaxIdeal ( D)
Value:
#define D(A)
Definition gentable.cc:128
ideal id_MaxIdeal(const ring r)
initialise the maximal ideal (at 0)

initialise the maximal ideal (at 0)

Definition at line 33 of file ideals.h.

◆ idPosConstant

#define idPosConstant ( I)
Value:
int id_PosConstant(ideal id, const ring r)
index of generator with leading term in ground ring (if any); otherwise -1

index of generator with leading term in ground ring (if any); otherwise -1

Definition at line 37 of file ideals.h.

◆ idPrint

#define idPrint ( id)
Value:
#define id_Print(id, lR, tR)

Definition at line 46 of file ideals.h.

◆ idSimpleAdd

#define idSimpleAdd ( A,
B )
Value:
b *CanonicalForm B
Definition facBivar.cc:52
ideal id_SimpleAdd(ideal h1, ideal h2, const ring R)
concat the lists h1 and h2 without zeros
#define A
Definition sirandom.c:24

Definition at line 42 of file ideals.h.

◆ idTest

#define idTest ( id)
Value:
#define id_Test(A, lR)

Definition at line 47 of file ideals.h.

Typedef Documentation

◆ resolvente

typedef ideal* resolvente

Definition at line 18 of file ideals.h.

Enumeration Type Documentation

◆ GbVariant

enum GbVariant
Enumerator
GbDefault 
GbStd 
GbSlimgb 
GbSba 
GbGroebner 
GbModstd 
GbFfmod 
GbNfmod 
GbStdSat 
GbSingmatic 

Definition at line 118 of file ideals.h.

119{
120 GbDefault=0,
121 // internal variants:
122 GbStd,
123 GbSlimgb,
124 GbSba,
125 // and the library functions:
127 GbModstd,
128 GbFfmod,
129 GbNfmod,
130 GbStdSat,
132 // and test variants
133};
@ GbGroebner
Definition ideals.h:126
@ GbModstd
Definition ideals.h:127
@ GbStdSat
Definition ideals.h:130
@ GbSlimgb
Definition ideals.h:123
@ GbFfmod
Definition ideals.h:128
@ GbNfmod
Definition ideals.h:129
@ GbDefault
Definition ideals.h:120
@ GbStd
Definition ideals.h:122
@ GbSingmatic
Definition ideals.h:131
@ GbSba
Definition ideals.h:124

Function Documentation

◆ binom()

int binom ( int n,
int r )

Definition at line 1212 of file simpleideals.cc.

1213{
1214 int i;
1215 int64 result;
1216
1217 if (r==0) return 1;
1218 if (n-r<r) return binom(n,n-r);
1219 result = n-r+1;
1220 for (i=2;i<=r;i++)
1221 {
1222 result *= n-r+i;
1223 result /= i;
1224 }
1225 if (result>MAX_INT_VAL)
1226 {
1227 WarnS("overflow in binomials");
1228 result=0;
1229 }
1230 return (int)result;
1231}
long int64
Definition auxiliary.h:68
int i
Definition cfEzgcd.cc:132
#define WarnS
Definition emacs.cc:78
return result
const int MAX_INT_VAL
Definition mylimits.h:12
int binom(int n, int r)

◆ id_Copy()

ideal id_Copy ( ideal h1,
const ring r )

copy an ideal

Definition at line 542 of file simpleideals.cc.

543{
544 id_Test(h1, r);
545
546 ideal h2 = idInit(IDELEMS(h1), h1->rank);
547 for (int i=IDELEMS(h1)-1; i>=0; i--)
548 h2->m[i] = p_Copy(h1->m[i],r);
549 return h2;
550}
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition p_polys.h:848
ideal idInit(int idsize, int rank)
initialise an ideal / module
#define IDELEMS(i)

◆ id_Farey()

ideal id_Farey ( ideal x,
number N,
const ring r )

Definition at line 3103 of file ideals.cc.

3104{
3105 int cnt=IDELEMS(x)*x->nrows;
3106 ideal result=idInit(cnt,x->rank);
3107 result->nrows=x->nrows; // for lifting matrices
3108 result->ncols=x->ncols; // for lifting matrices
3109
3110 int i;
3111 for(i=cnt-1;i>=0;i--)
3112 {
3113 result->m[i]=p_Farey(x->m[i],N,r);
3114 }
3115 return result;
3116}
const CanonicalForm CFMap CFMap & N
Definition cfEzgcd.cc:56
Variable x
Definition cfModGcd.cc:4090
poly p_Farey(poly p, number N, const ring r)
Definition p_polys.cc:54

◆ id_GCD()

poly id_GCD ( poly f,
poly g,
const ring r )

Definition at line 3000 of file ideals.cc.

3001{
3002 ideal I=idInit(2,1); I->m[0]=f; I->m[1]=g;
3003 intvec *w = NULL;
3004
3005 ring save_r = currRing;
3006 rChangeCurrRing(r);
3007 ideal S=idSyzygies(I,testHomog,&w);
3008 rChangeCurrRing(save_r);
3009
3010 if (w!=NULL) delete w;
3011 poly gg=p_TakeOutComp(&(S->m[0]), 2, r);
3012 id_Delete(&S, r);
3013 poly gcd_p=singclap_pdivide(f,gg, r);
3014 p_Delete(&gg, r);
3015
3016 return gcd_p;
3017}
g
Definition cfModGcd.cc:4098
FILE * f
Definition checklibs.c:9
poly singclap_pdivide(poly f, poly g, const ring r)
Definition clapsing.cc:649
const CanonicalForm & w
Definition facAbsFact.cc:51
ideal idSyzygies(ideal h1, tHomog h, intvec **w, BOOLEAN setSyzComp, BOOLEAN setRegularity, int *deg, GbVariant alg)
Definition ideals.cc:836
void p_TakeOutComp(poly *p, long comp, poly *q, int *lq, const ring r)
Definition p_polys.cc:3620
#define NULL
Definition omList.c:12
static void p_Delete(poly *p, const ring r)
Definition p_polys.h:903
void rChangeCurrRing(ring r)
Definition polys.cc:16
@ testHomog
Definition structs.h:34

◆ id_Homogenize()

ideal id_Homogenize ( ideal I,
int var_num,
const ring r )

Definition at line 3608 of file ideals.cc.

3609{
3610 ideal II=id_Copy(I,r);
3611 if (var_num==1)
3612 {
3613 ring tmpR=rAssure_Dp_C(r);
3614 if (tmpR!=r)
3615 {
3616 rChangeCurrRing(tmpR);
3617 II=idrMoveR(II,r,tmpR);
3618 }
3619 ideal III=id_Homogen(II,1,tmpR);
3620 id_Delete(&II,tmpR);
3621 intvec *ww=NULL;
3622 II=kStd2(III,currRing->qideal,(tHomog)TRUE,&ww,(bigintmat*)NULL);
3623 if (ww!=NULL) delete ww;
3624 id_Delete(&III,tmpR);
3625 if (tmpR!=r)
3626 {
3627 rChangeCurrRing(r);
3628 II=idrMoveR(II,tmpR,r);
3629 }
3630 return II;
3631 }
3632 ideal III=idInit(IDELEMS(II),1);
3633 int *perm=(int*)omAlloc0((rVar(r)+1)*sizeof(int));
3634 for(int i=rVar(r)-1; i>0; i--) perm[i]=i;
3635 perm[var_num]=1;
3636 perm[1]=var_num;
3637 for(int i=IDELEMS(II)-1; i>=0;i--)
3638 {
3639 III->m[i]=p_PermPoly(II->m[i],perm,r,r,ndCopyMap,NULL,0,FALSE);
3640 }
3641 id_Delete(&II,r);
3642 II=id_Homogenize(III,1,r);
3643 id_Delete(&III,r);
3644 III=idInit(IDELEMS(II),1);
3645 for(int i=IDELEMS(II)-1; i>=0;i--)
3646 {
3647 III->m[i]=p_PermPoly(II->m[i],perm,r,r,ndCopyMap,NULL,0,FALSE);
3648 }
3649 id_Delete(&II,r);
3650 return III;
3651}
#define TRUE
Definition auxiliary.h:101
#define FALSE
Definition auxiliary.h:97
Matrices of numbers.
Definition bigintmat.h:51
number ndCopyMap(number a, const coeffs src, const coeffs dst)
Definition numbers.cc:293
ideal id_Homogenize(ideal I, int var_num, const ring r)
Definition ideals.cc:3608
ideal id_Copy(ideal h1, const ring r)
copy an ideal
ideal kStd2(ideal F, ideal Q, tHomog h, intvec **w, bigintmat *hilb, int syzComp, int newIdeal, intvec *vw, s_poly_proc_t sp)
generic interface to GB/SB computations, large hilbert vectors
Definition kstd1.cc:2607
#define omAlloc0(size)
poly p_PermPoly(poly p, const int *perm, const ring oldRing, const ring dst, nMapFunc nMap, const int *par_perm, int OldPar, BOOLEAN use_mult)
Definition p_polys.cc:4256
ideal idrMoveR(ideal &id, ring src_r, ring dest_r)
Definition prCopy.cc:248
ring rAssure_Dp_C(const ring r)
Definition ring.cc:5124
static short rVar(const ring r)
define rVar(r) (r->N)
Definition ring.h:598
ideal id_Homogen(ideal h, int varnum, const ring r)
tHomog
Definition structs.h:31

◆ id_HomogenizeW()

ideal id_HomogenizeW ( ideal I,
int var_num,
intvec * w,
const ring r )

Definition at line 3653 of file ideals.cc.

3654{
3655 ideal II=id_Copy(I,r);
3656 if (var_num==1)
3657 {
3658 ring tmpR=rAssure_Wp_C(r,w);
3659 if (tmpR!=r)
3660 {
3661 rChangeCurrRing(tmpR);
3662 II=idrMoveR(II,r,tmpR);
3663 }
3664 ideal III=id_Homogen(II,1,tmpR);
3665 id_Delete(&II,tmpR);
3666 intvec *ww=NULL;
3667 II=kStd2(III,currRing->qideal,(tHomog)TRUE,&ww,(bigintmat*)NULL);
3668 if (ww!=NULL) delete ww;
3669 id_Delete(&III,tmpR);
3670 if (tmpR!=r)
3671 {
3672 rChangeCurrRing(r);
3673 II=idrMoveR(II,tmpR,r);
3674 }
3675 return II;
3676 }
3677 ideal III=idInit(IDELEMS(II),1);
3678 int *perm=(int*)omAlloc0((rVar(r)+1)*sizeof(int));
3679 for(int i=rVar(r)-1; i>0; i--) perm[i]=i;
3680 perm[var_num]=1;
3681 perm[1]=var_num;
3682 for(int i=IDELEMS(II)-1; i>=0;i--)
3683 {
3684 III->m[i]=p_PermPoly(II->m[i],perm,r,r,ndCopyMap,NULL,0,FALSE);
3685 }
3686 id_Delete(&II,r);
3687 II=id_HomogenizeW(III,1,w,r);
3688 id_Delete(&III,r);
3689 III=idInit(IDELEMS(II),1);
3690 for(int i=IDELEMS(II)-1; i>=0;i--)
3691 {
3692 III->m[i]=p_PermPoly(II->m[i],perm,r,r,ndCopyMap,NULL,0,FALSE);
3693 }
3694 id_Delete(&II,r);
3695 return III;
3696}
ideal id_HomogenizeW(ideal I, int var_num, intvec *w, const ring r)
Definition ideals.cc:3653
ring rAssure_Wp_C(const ring r, intvec *w)
Definition ring.cc:4942

◆ id_Sat_principal()

ideal id_Sat_principal ( const ideal I,
ideal J,
const ring r )

Definition at line 3415 of file ideals.cc.

3416{
3417 rRingOrder_t *ord;
3418 int *block0,*block1;
3419 int **wv;
3420
3421 // construction extension ring
3422 ord=(rRingOrder_t*)omAlloc0(4*sizeof(rRingOrder_t));
3423 block0=(int*)omAlloc0(4*sizeof(int));
3424 block1=(int*)omAlloc0(4*sizeof(int));
3425 wv=(int**) omAlloc0(4*sizeof(int**));
3426 wv[0]=(int*)omAlloc0((rVar(origR) + 2)*sizeof(int));
3427 block0[0] = block0[1] = 1;
3428 block1[0] = block1[1] = rVar(origR)+1;
3429 // use this special ordering: like ringorder_a, except that pFDeg, pWeights
3430 // ignore it
3431 ord[0] = ringorder_aa;
3432 wv[0][rVar(origR)]=1;
3433 BOOLEAN wp=FALSE;
3434 for (int j=0;j<rVar(origR);j++)
3435 if (p_Weight(j+1,origR)!=1) { wp=TRUE;break; }
3436 if (wp)
3437 {
3438 wv[1]=(int*)omAlloc0((rVar(origR) + 1)*sizeof(int));
3439 for (int j=0;j<rVar(origR);j++)
3440 wv[1][j]=p_Weight(j+1,origR);
3441 ord[1] = ringorder_wp;
3442 }
3443 else
3444 ord[1] = ringorder_dp;
3445 ord[2] = ringorder_C;
3446 ord[3] = (rRingOrder_t)0;
3447 char **names=(char**)omAlloc0((origR->N+1) * sizeof(char *));
3448 for (int j=0;j<rVar(origR);j++)
3449 names[j]=origR->names[j];
3450 names[rVar(origR)]=(char*)"@";
3451 ring tmpR=rDefault(nCopyCoeff(origR->cf),rVar(origR)+1,names,4,ord,block0,block1,wv);
3452 omFree(names);
3453 rComplete(tmpR, 1);
3454 rChangeCurrRing(tmpR);
3455 // map I
3456 ideal II=idrCopyR(I,origR,tmpR);
3457 // map J
3458 ideal JJ=idrCopyR(J,origR,tmpR);
3459 // J[1]*t-1
3460 poly t=pOne();
3461 p_SetExp(t,rVar(tmpR),1,tmpR);
3462 p_Setm(t,tmpR);
3463 poly p=JJ->m[0];
3464 p_Norm(p,currRing);
3465 p=p_Mult_q(p,t,tmpR);
3466 p=p_Sub(p,pOne(),tmpR);
3467 JJ->m[0]=p;
3468 ideal T=id_SimpleAdd(II,JJ,tmpR);
3469 idTest(T);
3470 id_Delete(&II,tmpR);
3471 id_Delete(&JJ,tmpR);
3472 // elimination
3473 t=pOne();
3474 p_SetExp(t,rVar(tmpR),1,tmpR);
3475 p_Setm(t,tmpR);
3476 ideal TT=idGroebner(T,0,GbStd);
3477 p_Delete(&t,tmpR);
3478 for(int j=0;j<IDELEMS(TT);j++)
3479 {
3480 if ((TT->m[j]!=NULL)
3481 && (p_GetExp(TT->m[j],rVar(tmpR),tmpR)>0))
3482 {
3483 p_Delete(&TT->m[j],tmpR);
3484 }
3485 }
3486 // map back
3487 ideal TTT=idrCopyR(TT,tmpR,origR);
3488 id_Delete(&TT,tmpR);
3489 rChangeCurrRing(origR);
3490 rDelete(tmpR);
3491 idSkipZeroes(TTT);
3492 return TTT;
3493}
int BOOLEAN
Definition auxiliary.h:88
int p
Definition cfModGcd.cc:4086
static FORCE_INLINE coeffs nCopyCoeff(const coeffs r)
"copy" coeffs, i.e. increment ref
Definition coeffs.h:439
int j
Definition facHensel.cc:110
static ideal idGroebner(ideal temp, int syzComp, GbVariant alg, bigintmat *hilb=NULL, intvec *w=NULL, tHomog hom=testHomog)
Definition ideals.cc:200
#define idTest(id)
Definition ideals.h:47
STATIC_VAR jList * T
Definition janet.cc:30
#define omFree(addr)
int p_Weight(int i, const ring r)
Definition p_polys.cc:706
void p_Norm(poly p1, const ring r)
Definition p_polys.cc:3844
poly p_Sub(poly p1, poly p2, const ring r)
Definition p_polys.cc:1994
static poly p_Mult_q(poly p, poly q, const ring r)
Definition p_polys.h:1125
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent @Note: VarOffset encodes the position in p->exp
Definition p_polys.h:490
static void p_Setm(poly p, const ring r)
Definition p_polys.h:235
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent @Note: the integer VarOffset encodes:
Definition p_polys.h:471
#define pOne()
Definition polys.h:316
ideal idrCopyR(ideal id, ring src_r, ring dest_r)
Definition prCopy.cc:192
BOOLEAN rComplete(ring r, int force)
this needs to be called whenever a new ring is created: new fields in ring are created (like VarOffse...
Definition ring.cc:3527
void rDelete(ring r)
unconditionally deletes fields in r
Definition ring.cc:454
ring rDefault(const coeffs cf, int N, char **n, int ord_size, rRingOrder_t *ord, int *block0, int *block1, int **wvhdl, unsigned long bitmask)
Definition ring.cc:103
rRingOrder_t
order stuff
Definition ring.h:69
@ ringorder_C
Definition ring.h:74
@ ringorder_dp
Definition ring.h:79
@ ringorder_aa
for idElimination, like a, except pFDeg, pWeigths ignore it
Definition ring.h:93
@ ringorder_wp
Definition ring.h:82
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size

◆ id_Satstd()

ideal id_Satstd ( const ideal I,
ideal J,
const ring r )

Definition at line 3363 of file ideals.cc.

3364{
3365 ring save=currRing;
3366 if (currRing!=r) rChangeCurrRing(r);
3367 idSkipZeroes(J);
3368 id_satstdSaturatingVariables=(int*)omAlloc0((1+rVar(currRing))*sizeof(int));
3369 int k=IDELEMS(J);
3370 if (k>1)
3371 {
3372 for (int i=0; i<k; i++)
3373 {
3374 poly x = J->m[i];
3375 int li = p_Var(x,r);
3376 if (li>0)
3378 else
3379 {
3380 if (currRing!=save) rChangeCurrRing(save);
3381 WerrorS("ideal generators must be variables");
3382 return NULL;
3383 }
3384 }
3385 }
3386 else
3387 {
3388 poly x = J->m[0];
3389 if (pNext(x)!=NULL)
3390 {
3391 Werror("generator must be a monomial");
3392 if (currRing!=save) rChangeCurrRing(save);
3393 return NULL;
3394 }
3395 for (int i=1; i<=r->N; i++)
3396 {
3397 int li = p_GetExp(x,i,r);
3398 if (li==1)
3400 else if (li>1)
3401 {
3402 if (currRing!=save) rChangeCurrRing(save);
3403 Werror("exponent(x(%d)^%d) must be 0 or 1",i,li);
3404 return NULL;
3405 }
3406 }
3407 }
3408 ideal res=kStd2(I,r->qideal,testHomog,NULL,(bigintmat*)NULL,0,0,NULL,id_sat_vars_sp);
3411 if (currRing!=save) rChangeCurrRing(save);
3412 return res;
3413}
int k
Definition cfEzgcd.cc:99
CanonicalForm res
Definition facAbsFact.cc:60
void WerrorS(const char *s)
Definition feFopen.cc:24
STATIC_VAR int * id_satstdSaturatingVariables
Definition ideals.cc:3248
static BOOLEAN id_sat_vars_sp(kStrategy strat)
Definition ideals.cc:3250
#define pNext(p)
Definition monomials.h:36
#define omFreeSize(addr, size)
int p_Var(poly m, const ring r)
Definition p_polys.cc:4810
void Werror(const char *fmt,...)
Definition reporter.cc:189

◆ id_TensorModuleMult()

ideal id_TensorModuleMult ( const int m,
const ideal M,
const ring rRing )

Definition at line 2067 of file simpleideals.cc.

2068{
2069// #ifdef DEBU
2070// WarnS("tensorModuleMult!!!!");
2071
2072 assume(m > 0);
2073 assume(M != NULL);
2074
2075 const int n = rRing->N;
2076
2077 assume(M->rank <= m * n);
2078
2079 const int k = IDELEMS(M);
2080
2081 ideal idTemp = idInit(k,m); // = {f_1, ..., f_k }
2082
2083 for( int i = 0; i < k; i++ ) // for every w \in M
2084 {
2085 poly pTempSum = NULL;
2086
2087 poly w = M->m[i];
2088
2089 while(w != NULL) // for each term of w...
2090 {
2091 poly h = p_Head(w, rRing);
2092
2093 const int gen = __p_GetComp(h, rRing); // 1 ...
2094
2095 assume(gen > 0);
2096 assume(gen <= n*m);
2097
2098 // TODO: write a formula with %, / instead of while!
2099 /*
2100 int c = gen;
2101 int v = 1;
2102 while(c > m)
2103 {
2104 c -= m;
2105 v++;
2106 }
2107 */
2108
2109 int cc = gen % m;
2110 if( cc == 0) cc = m;
2111 int vv = 1 + (gen - cc) / m;
2112
2113// assume( cc == c );
2114// assume( vv == v );
2115
2116 // 1<= c <= m
2117 assume( cc > 0 );
2118 assume( cc <= m );
2119
2120 assume( vv > 0 );
2121 assume( vv <= n );
2122
2123 assume( (cc + (vv-1)*m) == gen );
2124
2125 p_IncrExp(h, vv, rRing); // h *= var(j) && // p_AddExp(h, vv, 1, rRing);
2126 p_SetComp(h, cc, rRing);
2127
2128 p_Setm(h, rRing); // adjust degree after the previous steps!
2129
2130 pTempSum = p_Add_q(pTempSum, h, rRing); // it is slow since h will be usually put to the back of pTempSum!!!
2131
2132 pIter(w);
2133 }
2134
2135 idTemp->m[i] = pTempSum;
2136 }
2137
2138 // simplify idTemp???
2139
2140 ideal idResult = id_Transp(idTemp, rRing);
2141
2142 id_Delete(&idTemp, rRing);
2143
2144 return(idResult);
2145}
int m
Definition cfEzgcd.cc:128
STATIC_VAR Poly * h
Definition janet.cc:971
#define assume(x)
Definition mod2.h:389
#define pIter(p)
Definition monomials.h:37
#define __p_GetComp(p, r)
Definition monomials.h:63
static poly p_Add_q(poly p, poly q, const ring r)
Definition p_polys.h:938
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
Definition p_polys.h:249
static long p_IncrExp(poly p, int v, ring r)
Definition p_polys.h:593
static poly p_Head(const poly p, const ring r)
copy the (leading) term of p
Definition p_polys.h:862
ideal id_Transp(ideal a, const ring rRing)
transpose a module
#define M
Definition sirandom.c:25

◆ idAdd()

ideal idAdd ( ideal h1,
ideal h2 )
inline

h1 + h2

Definition at line 68 of file ideals.h.

69{
70 return id_Add(h1, h2, currRing);
71}
ideal id_Add(ideal h1, ideal h2, const ring r)
h1 + h2

◆ idCoeffOfKBase()

matrix idCoeffOfKBase ( ideal arg,
ideal kbase,
poly how )

Definition at line 2668 of file ideals.cc.

2669{
2670 matrix result;
2671 ideal tempKbase;
2672 poly p,q;
2673 intvec * convert;
2674 int i=IDELEMS(kbase),j=IDELEMS(arg),k,pos;
2675#if 0
2676 while ((i>0) && (kbase->m[i-1]==NULL)) i--;
2677 if (idIs0(arg))
2678 return mpNew(i,1);
2679 while ((j>0) && (arg->m[j-1]==NULL)) j--;
2680 result = mpNew(i,j);
2681#else
2682 result = mpNew(i, j);
2683 while ((j>0) && (arg->m[j-1]==NULL)) j--;
2684#endif
2685
2686 tempKbase = idCreateSpecialKbase(kbase,&convert);
2687 for (k=0;k<j;k++)
2688 {
2689 p = arg->m[k];
2690 while (p!=NULL)
2691 {
2692 q = idDecompose(p,how,tempKbase,&pos);
2693 if (pos>=0)
2694 {
2695 MATELEM(result,(*convert)[pos],k+1) =
2696 pAdd(MATELEM(result,(*convert)[pos],k+1),q);
2697 }
2698 else
2699 p_Delete(&q,currRing);
2700 pIter(p);
2701 }
2702 }
2703 idDelete(&tempKbase);
2704 return result;
2705}
ideal idCreateSpecialKbase(ideal kBase, intvec **convert)
Definition ideals.cc:2582
poly idDecompose(poly monom, poly how, ideal kbase, int *pos)
Definition ideals.cc:2636
#define idDelete(H)
delete an ideal
Definition ideals.h:29
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
matrix mpNew(int r, int c)
create a r x c zero-matrix
Definition matpol.cc:37
#define MATELEM(mat, i, j)
1-based access to matrix
Definition matpol.h:29
ip_smatrix * matrix
Definition matpol.h:43
#define pAdd(p, q)
Definition polys.h:204

◆ idCopy()

ideal idCopy ( ideal A)
inline

Definition at line 60 of file ideals.h.

61{
62 return id_Copy(A, currRing);
63}

◆ idCopyFirstK()

ideal idCopyFirstK ( const ideal ide,
const int k )
inlinestatic

Definition at line 20 of file ideals.h.

21{
22 return id_CopyFirstK(ide, k, currRing);
23}
ideal id_CopyFirstK(const ideal ide, const int k, const ring r)
copies the first k (>= 1) entries of the given ideal/module and returns these as a new ideal/module (...

◆ idDelEquals()

void idDelEquals ( ideal id)

Definition at line 3211 of file ideals.cc.

3212{
3213 int idsize = IDELEMS(id);
3214 poly_sort *id_sort = (poly_sort *)omAlloc0(idsize*sizeof(poly_sort));
3215 for (int i = 0; i < idsize; i++)
3216 {
3217 id_sort[i].p = id->m[i];
3218 id_sort[i].index = i;
3219 }
3220 idSort_qsort(id_sort, idsize);
3221 int index, index_i, index_j;
3222 int i = 0;
3223 for (int j = 1; j < idsize; j++)
3224 {
3225 if (id_sort[i].p != NULL && pEqualPolys(id_sort[i].p, id_sort[j].p))
3226 {
3227 index_i = id_sort[i].index;
3228 index_j = id_sort[j].index;
3229 if (index_j > index_i)
3230 {
3231 index = index_j;
3232 }
3233 else
3234 {
3235 index = index_i;
3236 i = j;
3237 }
3238 pDelete(&id->m[index]);
3239 }
3240 else
3241 {
3242 i = j;
3243 }
3244 }
3245 omFreeSize((ADDRESS)(id_sort), idsize*sizeof(poly_sort));
3246}
void * ADDRESS
Definition auxiliary.h:120
int index
Definition ideals.cc:3194
void idSort_qsort(poly_sort *id_sort, int idsize)
Definition ideals.cc:3202
static int index(p_Length length, p_Ord ord)
#define pDelete(p_ptr)
Definition polys.h:187
#define pEqualPolys(p1, p2)
Definition polys.h:400

◆ idDiff()

matrix idDiff ( matrix i,
int k )

Definition at line 2189 of file ideals.cc.

2190{
2191 int e=MATCOLS(i)*MATROWS(i);
2193 r->rank=i->rank;
2194 int j;
2195 for(j=0; j<e; j++)
2196 {
2197 r->m[j]=pDiff(i->m[j],k);
2198 }
2199 return r;
2200}
long rank
Definition matpol.h:19
poly * m
Definition matpol.h:18
#define MATROWS(i)
Definition matpol.h:26
#define MATCOLS(i)
Definition matpol.h:27
#define pDiff(a, b)
Definition polys.h:297

◆ idDiffOp()

matrix idDiffOp ( ideal I,
ideal J,
BOOLEAN multiply = TRUE )

Definition at line 2202 of file ideals.cc.

2203{
2204 matrix r=mpNew(IDELEMS(I),IDELEMS(J));
2205 int i,j;
2206 for(i=0; i<IDELEMS(I); i++)
2207 {
2208 for(j=0; j<IDELEMS(J); j++)
2209 {
2210 MATELEM(r,i+1,j+1)=pDiffOp(I->m[i],J->m[j],multiply);
2211 }
2212 }
2213 return r;
2214}
#define pDiffOp(a, b, m)
Definition polys.h:298

◆ idElimination()

ideal idElimination ( ideal h1,
poly delVar,
intvec * hilb = NULL,
GbVariant a = GbDefault )

Definition at line 1884 of file ideals.cc.

1885{
1886 bigintmat *hh=iv2biv(hilb,coeffs_BIGINT);
1887 ideal res=idElimination2(h1,delVar,hh,alg);
1888 if (hh!=NULL) delete hh;
1889 return res;
1890}
ideal idElimination2(ideal h1, poly delVar, bigintmat *hilb, GbVariant alg)
Definition ideals.cc:1640
bigintmat * iv2biv(intvec *hilb, const coeffs cf)
Definition intvec.cc:851
VAR coeffs coeffs_BIGINT
Definition polys.cc:14

◆ idElimination2()

ideal idElimination2 ( ideal h1,
poly delVar,
bigintmat * hilb = NULL,
GbVariant a = GbDefault )

Definition at line 1640 of file ideals.cc.

1641{
1642 int i,j=0,k,l;
1643 ideal h,hh, h3;
1644 rRingOrder_t *ord;
1645 int *block0,*block1;
1646 int ordersize=2;
1647 int **wv;
1648 tHomog hom;
1649 intvec * w;
1650 ring tmpR;
1651 ring origR = currRing;
1652
1653 if (delVar==NULL)
1654 {
1655 return idCopy(h1);
1656 }
1657 if ((currRing->qideal!=NULL) && rIsPluralRing(origR))
1658 {
1659 WerrorS("cannot eliminate in a qring");
1660 return NULL;
1661 }
1662 if (idIs0(h1)) return idInit(1,h1->rank);
1663#ifdef HAVE_PLURAL
1664 if (rIsPluralRing(origR))
1665 /* in the NC case, we have to check the admissibility of */
1666 /* the subalgebra to be intersected with */
1667 {
1668 if ((ncRingType(origR) != nc_skew) && (ncRingType(origR) != nc_exterior)) /* in (quasi)-commutative algebras every subalgebra is admissible */
1669 {
1670 if (nc_CheckSubalgebra(delVar,origR))
1671 {
1672 WerrorS("no elimination is possible: subalgebra is not admissible");
1673 return NULL;
1674 }
1675 }
1676 }
1677#endif
1678 hom=(tHomog)idHomModule(h1,NULL,&w); //sets w to weight vector or NULL
1679 h3=idInit(16,h1->rank);
1680 ordersize=rBlocks(origR)+1;
1681#if 0
1682 if (rIsPluralRing(origR)) // we have too keep the ordering: it may be needed
1683 // for G-algebra
1684 {
1685 for (k=0;k<ordersize-1; k++)
1686 {
1687 block0[k+1] = origR->block0[k];
1688 block1[k+1] = origR->block1[k];
1689 ord[k+1] = origR->order[k];
1690 if (origR->wvhdl[k]!=NULL) wv[k+1] = (int*) omMemDup(origR->wvhdl[k]);
1691 }
1692 }
1693 else
1694 {
1695 block0[1] = 1;
1696 block1[1] = (currRing->N);
1697 if (origR->OrdSgn==1) ord[1] = ringorder_wp;
1698 else ord[1] = ringorder_ws;
1699 wv[1]=(int*)omAlloc0((currRing->N)*sizeof(int));
1700 double wNsqr = (double)2.0 / (double)(currRing->N);
1702 int *x= (int * )omAlloc(2 * ((currRing->N) + 1) * sizeof(int));
1703 int sl=IDELEMS(h1) - 1;
1704 wCall(h1->m, sl, x, wNsqr);
1705 for (sl = (currRing->N); sl!=0; sl--)
1706 wv[1][sl-1] = x[sl + (currRing->N) + 1];
1707 omFreeSize((ADDRESS)x, 2 * ((currRing->N) + 1) * sizeof(int));
1708
1709 ord[2]=ringorder_C;
1710 ord[3]=0;
1711 }
1712#else
1713#endif
1714 if ((hom==TRUE) && (origR->OrdSgn==1) && (!rIsPluralRing(origR)))
1715 {
1716 #if 1
1717 // we change to an ordering:
1718 // aa(1,1,1,...,0,0,0),wp(...),C
1719 // this seems to be better than version 2 below,
1720 // according to Tst/../elimiate_[3568].tat (- 17 %)
1721 ord=(rRingOrder_t*)omAlloc0(4*sizeof(rRingOrder_t));
1722 block0=(int*)omAlloc0(4*sizeof(int));
1723 block1=(int*)omAlloc0(4*sizeof(int));
1724 wv=(int**) omAlloc0(4*sizeof(int**));
1725 block0[0] = block0[1] = 1;
1726 block1[0] = block1[1] = rVar(origR);
1727 wv[0]=(int*)omAlloc0((rVar(origR) + 1)*sizeof(int));
1728 // use this special ordering: like ringorder_a, except that pFDeg, pWeights
1729 // ignore it
1730 ord[0] = ringorder_aa;
1731 for (j=0;j<rVar(origR);j++)
1732 if (pGetExp(delVar,j+1)!=0) wv[0][j]=1;
1733 BOOLEAN wp=FALSE;
1734 for (j=0;j<rVar(origR);j++)
1735 if (p_Weight(j+1,origR)!=1) { wp=TRUE;break; }
1736 if (wp)
1737 {
1738 wv[1]=(int*)omAlloc0((rVar(origR) + 1)*sizeof(int));
1739 for (j=0;j<rVar(origR);j++)
1740 wv[1][j]=p_Weight(j+1,origR);
1741 ord[1] = ringorder_wp;
1742 }
1743 else
1744 ord[1] = ringorder_dp;
1745 #else
1746 // we change to an ordering:
1747 // a(w1,...wn),wp(1,...0.....),C
1748 ord=(int*)omAlloc0(4*sizeof(int));
1749 block0=(int*)omAlloc0(4*sizeof(int));
1750 block1=(int*)omAlloc0(4*sizeof(int));
1751 wv=(int**) omAlloc0(4*sizeof(int**));
1752 block0[0] = block0[1] = 1;
1753 block1[0] = block1[1] = rVar(origR);
1754 wv[0]=(int*)omAlloc0((rVar(origR) + 1)*sizeof(int));
1755 wv[1]=(int*)omAlloc0((rVar(origR) + 1)*sizeof(int));
1756 ord[0] = ringorder_a;
1757 for (j=0;j<rVar(origR);j++)
1758 wv[0][j]=pWeight(j+1,origR);
1759 ord[1] = ringorder_wp;
1760 for (j=0;j<rVar(origR);j++)
1761 if (pGetExp(delVar,j+1)!=0) wv[1][j]=1;
1762 #endif
1763 ord[2] = ringorder_C;
1764 ord[3] = (rRingOrder_t)0;
1765 }
1766 else
1767 {
1768 // we change to an ordering:
1769 // aa(....),orig_ordering
1770 ord=(rRingOrder_t*)omAlloc0(ordersize*sizeof(rRingOrder_t));
1771 block0=(int*)omAlloc0(ordersize*sizeof(int));
1772 block1=(int*)omAlloc0(ordersize*sizeof(int));
1773 wv=(int**) omAlloc0(ordersize*sizeof(int**));
1774 for (k=0;k<ordersize-1; k++)
1775 {
1776 block0[k+1] = origR->block0[k];
1777 block1[k+1] = origR->block1[k];
1778 ord[k+1] = origR->order[k];
1779 if (origR->wvhdl[k]!=NULL)
1780 #ifdef HAVE_OMALLOC
1781 wv[k+1] = (int*) omMemDup(origR->wvhdl[k]);
1782 #else
1783 {
1784 int l=(origR->block1[k]-origR->block0[k]+1)*sizeof(int);
1785 if (origR->order[k]==ringorder_a64) l*=2;
1786 wv[k+1]=(int*)omalloc(l);
1787 memcpy(wv[k+1],origR->wvhdl[k],l);
1788 }
1789 #endif
1790 }
1791 block0[0] = 1;
1792 block1[0] = rVar(origR);
1793 wv[0]=(int*)omAlloc0((rVar(origR) + 1)*sizeof(int));
1794 for (j=0;j<rVar(origR);j++)
1795 if (pGetExp(delVar,j+1)!=0) wv[0][j]=1;
1796 // use this special ordering: like ringorder_a, except that pFDeg, pWeights
1797 // ignore it
1798 ord[0] = ringorder_aa;
1799 }
1800 // fill in tmp ring to get back the data later on
1801 tmpR = rCopy0(origR,FALSE,FALSE); // qring==NULL
1802 //rUnComplete(tmpR);
1803 tmpR->p_Procs=NULL;
1804 tmpR->order = ord;
1805 tmpR->block0 = block0;
1806 tmpR->block1 = block1;
1807 tmpR->wvhdl = wv;
1808 rComplete(tmpR, 1);
1809
1810#ifdef HAVE_PLURAL
1811 /* update nc structure on tmpR */
1812 if (rIsPluralRing(origR))
1813 {
1814 if ( nc_rComplete(origR, tmpR, false) ) // no quotient ideal!
1815 {
1816 WerrorS("no elimination is possible: ordering condition is violated");
1817 // cleanup
1818 rDelete(tmpR);
1819 if (w!=NULL)
1820 delete w;
1821 return NULL;
1822 }
1823 }
1824#endif
1825 // change into the new ring
1826 //pChangeRing((currRing->N),currRing->OrdSgn,ord,block0,block1,wv);
1827 rChangeCurrRing(tmpR);
1828
1829 //h = idInit(IDELEMS(h1),h1->rank);
1830 // fetch data from the old ring
1831 //for (k=0;k<IDELEMS(h1);k++) h->m[k] = prCopyR( h1->m[k], origR);
1832 h=idrCopyR(h1,origR,currRing);
1833 if (origR->qideal!=NULL)
1834 {
1835 WarnS("eliminate in q-ring: experimental");
1836 ideal q=idrCopyR(origR->qideal,origR,currRing);
1837 ideal s=idSimpleAdd(h,q);
1838 idDelete(&h);
1839 idDelete(&q);
1840 h=s;
1841 }
1842 // compute GB
1843 if ((alg!=GbDefault)
1844 && (alg!=GbGroebner)
1845 && (alg!=GbModstd)
1846 && (alg!=GbSlimgb)
1847 && (alg!=GbSba)
1848 && (alg!=GbStd))
1849 {
1850 WarnS("wrong algorithm for GB");
1851 alg=GbDefault;
1852 }
1853 hh=idGroebner(h,0,alg,hilb);
1854 // go back to the original ring
1855 rChangeCurrRing(origR);
1856 i = IDELEMS(hh)-1;
1857 while ((i >= 0) && (hh->m[i] == NULL)) i--;
1858 j = -1;
1859 // fetch data from temp ring
1860 for (k=0; k<=i; k++)
1861 {
1862 l=(currRing->N);
1863 while ((l>0) && (p_GetExp( hh->m[k],l,tmpR)*pGetExp(delVar,l)==0)) l--;
1864 if (l==0)
1865 {
1866 j++;
1867 if (j >= IDELEMS(h3))
1868 {
1869 pEnlargeSet(&(h3->m),IDELEMS(h3),16);
1870 IDELEMS(h3) += 16;
1871 }
1872 h3->m[j] = prMoveR( hh->m[k], tmpR,origR);
1873 hh->m[k] = NULL;
1874 }
1875 }
1876 id_Delete(&hh, tmpR);
1877 idSkipZeroes(h3);
1878 rDelete(tmpR);
1879 if (w!=NULL)
1880 delete w;
1881 return h3;
1882}
int l
Definition cfEzgcd.cc:100
const CanonicalForm int s
Definition facAbsFact.cc:51
#define idSimpleAdd(A, B)
Definition ideals.h:42
static BOOLEAN idHomModule(ideal m, ideal Q, intvec **w)
Definition ideals.h:96
ideal idCopy(ideal A)
Definition ideals.h:60
@ nc_skew
Definition nc.h:16
@ nc_exterior
Definition nc.h:21
static nc_type & ncRingType(nc_struct *p)
Definition nc.h:159
BOOLEAN nc_CheckSubalgebra(poly PolyVar, ring r)
#define omAlloc(size)
#define omalloc(size)
#define omMemDup(s)
void pEnlargeSet(poly **p, int l, int increment)
Definition p_polys.cc:3821
#define pWeight(i)
Definition polys.h:281
#define pGetExp(p, i)
Exponent.
Definition polys.h:42
poly prMoveR(poly &p, ring src_r, ring dest_r)
Definition prCopy.cc:90
BOOLEAN nc_rComplete(const ring src, ring dest, bool bSetupQuotient)
Definition ring.cc:5833
ring rCopy0(const ring r, BOOLEAN copy_qideal, BOOLEAN copy_ordering)
Definition ring.cc:1427
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
Definition ring.h:406
static int rBlocks(const ring r)
Definition ring.h:574
@ ringorder_a
Definition ring.h:71
@ ringorder_a64
for int64 weights
Definition ring.h:72
@ ringorder_ws
Definition ring.h:88
THREAD_VAR double(* wFunctional)(int *degw, int *lpol, int npol, double *rel, double wx, double wNsqr)
Definition weight.cc:20
void wCall(poly *s, int sl, int *x, double wNsqr, const ring R)
Definition weight.cc:108
double wFunctionalBuch(int *degw, int *lpol, int npol, double *rel, double wx, double wNsqr)
Definition weight0.cc:78

◆ idFreeModule()

ideal idFreeModule ( int i)
inline

Definition at line 111 of file ideals.h.

112{
113 return id_FreeModule (i, currRing);
114}
ideal id_FreeModule(int i, const ring r)
the free module of rank i

◆ idGetNextChoise()

void idGetNextChoise ( int r,
int end,
BOOLEAN * endch,
int * choise )

Definition at line 1154 of file simpleideals.cc.

1155{
1156 int i = r-1,j;
1157 while ((i >= 0) && (choise[i] == end))
1158 {
1159 i--;
1160 end--;
1161 }
1162 if (i == -1)
1163 *endch = TRUE;
1164 else
1165 {
1166 choise[i]++;
1167 for (j=i+1; j<r; j++)
1168 {
1169 choise[j] = choise[i]+j-i;
1170 }
1171 *endch = FALSE;
1172 }
1173}

◆ idGetNumberOfChoise()

int idGetNumberOfChoise ( int t,
int d,
int begin,
int end,
int * choise )

Definition at line 1180 of file simpleideals.cc.

1181{
1182 int * localchoise,i,result=0;
1183 BOOLEAN b=FALSE;
1184
1185 if (d<=1) return 1;
1186 localchoise=(int*)omAlloc((d-1)*sizeof(int));
1187 idInitChoise(d-1,begin,end,&b,localchoise);
1188 while (!b)
1189 {
1190 result++;
1191 i = 0;
1192 while ((i<t) && (localchoise[i]==choise[i])) i++;
1193 if (i>=t)
1194 {
1195 i = t+1;
1196 while ((i<d) && (localchoise[i-1]==choise[i])) i++;
1197 if (i>=d)
1198 {
1199 omFreeSize((ADDRESS)localchoise,(d-1)*sizeof(int));
1200 return result;
1201 }
1202 }
1203 idGetNextChoise(d-1,end,&b,localchoise);
1204 }
1205 omFreeSize((ADDRESS)localchoise,(d-1)*sizeof(int));
1206 return 0;
1207}
CanonicalForm b
Definition cfModGcd.cc:4111
void idGetNextChoise(int r, int end, BOOLEAN *endch, int *choise)
void idInitChoise(int r, int beg, int end, BOOLEAN *endch, int *choise)

◆ idHead()

ideal idHead ( ideal h)

◆ idHomIdeal()

BOOLEAN idHomIdeal ( ideal id,
ideal Q = NULL )
inlinestatic

Definition at line 91 of file ideals.h.

92{
93 return id_HomIdeal(id, Q, currRing);
94}
BOOLEAN id_HomIdeal(ideal id, ideal Q, const ring r)
#define Q
Definition sirandom.c:26

◆ idHomModule()

BOOLEAN idHomModule ( ideal m,
ideal Q,
intvec ** w )
inlinestatic

Definition at line 96 of file ideals.h.

97{
98 return id_HomModule(m, Q, w, currRing);
99}
BOOLEAN id_HomModule(ideal m, ideal Q, intvec **w, const ring R)

◆ idInitChoise()

void idInitChoise ( int r,
int beg,
int end,
BOOLEAN * endch,
int * choise )

Definition at line 1132 of file simpleideals.cc.

1133{
1134 /*returns the first choise of r numbers between beg and end*/
1135 int i;
1136 for (i=0; i<r; i++)
1137 {
1138 choise[i] = 0;
1139 }
1140 if (r <= end-beg+1)
1141 for (i=0; i<r; i++)
1142 {
1143 choise[i] = beg+i;
1144 }
1145 if (r > end-beg+1)
1146 *endch = TRUE;
1147 else
1148 *endch = FALSE;
1149}

◆ idInsertPoly()

BOOLEAN idInsertPoly ( ideal h1,
poly h2 )

insert h2 into h1 (if h2 is not the zero polynomial) return TRUE iff h2 was indeed inserted

Definition at line 832 of file simpleideals.cc.

833{
834 if (h2==NULL) return FALSE;
835 assume (h1 != NULL);
836
837 int j = IDELEMS(h1) - 1;
838
839 while ((j >= 0) && (h1->m[j] == NULL)) j--;
840 j++;
841 if (j==IDELEMS(h1))
842 {
843 pEnlargeSet(&(h1->m),IDELEMS(h1),16);
844 IDELEMS(h1)+=16;
845 }
846 h1->m[j]=h2;
847 return TRUE;
848}

◆ idInsertPolyOnPos()

BOOLEAN idInsertPolyOnPos ( ideal I,
poly p,
int pos )

insert p into I on position pos

Definition at line 851 of file simpleideals.cc.

852{
853 if (p==NULL) return FALSE;
854 assume (I != NULL);
855
856 int j = IDELEMS(I) - 1;
857
858 while ((j >= 0) && (I->m[j] == NULL)) j--;
859 j++;
860 if (j==IDELEMS(I))
861 {
862 pEnlargeSet(&(I->m),IDELEMS(I),IDELEMS(I)+1);
863 IDELEMS(I)+=1;
864 }
865 for(j = IDELEMS(I)-1;j>pos;j--)
866 I->m[j] = I->m[j-1];
867 I->m[pos]=p;
868 return TRUE;
869}

◆ idInsertPolyWithTests()

BOOLEAN idInsertPolyWithTests ( ideal h1,
const int validEntries,
const poly h2,
const bool zeroOk,
const bool duplicateOk )
inline

Definition at line 75 of file ideals.h.

76{
77 return id_InsertPolyWithTests (h1, validEntries, h2, zeroOk, duplicateOk, currRing);
78}
BOOLEAN id_InsertPolyWithTests(ideal h1, const int validEntries, const poly h2, const bool zeroOk, const bool duplicateOk, const ring r)
insert h2 into h1 depending on the two boolean parameters:

◆ idIs0()

BOOLEAN idIs0 ( ideal h)

returns true if h is the zero ideal

Definition at line 960 of file simpleideals.cc.

961{
962 if ((h!=NULL) && (h->m!=NULL))
963 {
964 for( int i = IDELEMS(h)-1; i >= 0; i-- )
965 if(h->m[i] != NULL)
966 return FALSE;
967 }
968 return TRUE;
969}

◆ idIsSubModule()

BOOLEAN idIsSubModule ( ideal id1,
ideal id2 )

Definition at line 2099 of file ideals.cc.

2100{
2101 int i;
2102 poly p;
2103
2104 if (idIs0(id1)) return TRUE;
2105 for (i=0;i<IDELEMS(id1);i++)
2106 {
2107 if (id1->m[i] != NULL)
2108 {
2109 p = kNF(id2,currRing->qideal,id1->m[i]);
2110 if (p != NULL)
2111 {
2113 return FALSE;
2114 }
2115 }
2116 }
2117 return TRUE;
2118}
poly kNF(ideal F, ideal Q, poly p, int syzComp, int lazyReduce)
Definition kstd1.cc:3229

◆ idIsZeroDim()

BOOLEAN idIsZeroDim ( ideal i)
inlinestatic

Definition at line 180 of file ideals.h.

181{
182 return id_IsZeroDim(i, currRing);
183}
BOOLEAN id_IsZeroDim(ideal I, const ring r)

◆ idKeepFirstK()

void idKeepFirstK ( ideal ide,
const int k )

keeps the first k (>= 1) entries of the given ideal (Note that the kept polynomials may be zero.)

Definition at line 3179 of file ideals.cc.

3180{
3181 for (int i = IDELEMS(id)-1; i >= k; i--)
3182 {
3183 if (id->m[i] != NULL) pDelete(&id->m[i]);
3184 }
3185 int kk=k;
3186 if (k==0) kk=1; /* ideals must have at least one element(0)*/
3187 pEnlargeSet(&(id->m), IDELEMS(id), kk-IDELEMS(id));
3188 IDELEMS(id) = kk;
3189}

◆ idLift()

ideal idLift ( ideal mod,
ideal submod,
ideal * rest = NULL,
BOOLEAN goodShape = FALSE,
BOOLEAN isSB = TRUE,
BOOLEAN divide = FALSE,
matrix * unit = NULL,
GbVariant a = GbDefault )

represents the generators of submod in terms of the generators of mod (Matrix(SM)*U-Matrix(rest)) = Matrix(M)*Matrix(result) goodShape: maximal non-zero index in generators of SM <= that of M isSB: generators of M form a Groebner basis divide: allow SM not to be a submodule of M U is an diagonal matrix of units (non-constant only in local rings) rest is: 0 if SM in M, SM if not divide, NF(SM,std(M)) if divide

Definition at line 1111 of file ideals.cc.

1113{
1114 int lsmod =id_RankFreeModule(submod,currRing), j, k;
1115 int comps_to_add=0;
1116 int idelems_mod=IDELEMS(mod);
1117 int idelems_submod=IDELEMS(submod);
1118 poly p;
1119
1120 if (idIs0(submod))
1121 {
1122 if (rest!=NULL)
1123 {
1124 *rest=idInit(1,mod->rank);
1125 }
1126 idLift_setUnit(idelems_submod,unit);
1127 return idInit(1,idelems_mod);
1128 }
1129 if (idIs0(mod)) /* and not idIs0(submod) */
1130 {
1131 if (rest!=NULL)
1132 {
1133 *rest=idCopy(submod);
1134 idLift_setUnit(idelems_submod,unit);
1135 return idInit(1,idelems_mod);
1136 }
1137 else
1138 {
1139 WerrorS("2nd module does not lie in the first");
1140 return NULL;
1141 }
1142 }
1143 if (unit!=NULL)
1144 {
1145 comps_to_add = idelems_submod;
1146 while ((comps_to_add>0) && (submod->m[comps_to_add-1]==NULL))
1147 comps_to_add--;
1148 }
1150 if ((k!=0) && (lsmod==0)) lsmod=1;
1151 k=si_max(k,(int)mod->rank);
1152 if (k<submod->rank) { WarnS("rk(submod) > rk(mod) ?");k=submod->rank; }
1153
1154 ring orig_ring=currRing;
1155 ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
1156 rSetSyzComp(k,syz_ring);
1157 rChangeCurrRing(syz_ring);
1158
1159 ideal s_mod, s_temp;
1160 if (orig_ring != syz_ring)
1161 {
1162 s_mod = idrCopyR_NoSort(mod,orig_ring,syz_ring);
1163 s_temp = idrCopyR_NoSort(submod,orig_ring,syz_ring);
1164 }
1165 else
1166 {
1167 s_mod = idCopy(mod);
1168 s_temp = idCopy(submod);
1169 }
1170 BITSET save2;
1171 SI_SAVE_OPT2(save2);
1172
1173 if ((rest==NULL)
1175 && (!rIsNCRing(currRing))
1176 && (!TEST_OPT_RETURN_SB))
1178 else
1180 ideal s_h3;
1181 if (isSB && !TEST_OPT_IDLIFT)
1182 {
1183 s_h3 = idCopy(s_mod);
1184 idPrepareStd(s_h3, k+comps_to_add);
1185 }
1186 else
1187 {
1188 s_h3 = idPrepare(s_mod,NULL,(tHomog)FALSE,k+comps_to_add,NULL,alg);
1189 }
1190 SI_RESTORE_OPT2(save2);
1191 if (errorreported)
1192 {
1193 rChangeCurrRing(orig_ring);
1194 return NULL;
1195 }
1196
1197 if (!goodShape)
1198 {
1199 for (j=0;j<IDELEMS(s_h3);j++)
1200 {
1201 if ((s_h3->m[j] != NULL) && (pMinComp(s_h3->m[j]) > k))
1202 p_Delete(&(s_h3->m[j]),currRing);
1203 }
1204 }
1205 idSkipZeroes(s_h3);
1206 if (lsmod==0)
1207 {
1208 id_Shift(s_temp,1,currRing);
1209 }
1210 if (unit!=NULL)
1211 {
1212 for(j = 0;j<comps_to_add;j++)
1213 {
1214 p = s_temp->m[j];
1215 if (p!=NULL)
1216 {
1217 while (pNext(p)!=NULL) pIter(p);
1218 pNext(p) = pOne();
1219 pIter(p);
1220 pSetComp(p,1+j+k);
1221 pSetmComp(p);
1222 p = pNeg(p);
1223 }
1224 }
1225 s_temp->rank += (k+comps_to_add);
1226 }
1227 ideal s_result = kNF(s_h3,currRing->qideal,s_temp,k);
1228 s_result->rank = s_h3->rank;
1229 ideal s_rest = idInit(IDELEMS(s_result),k);
1230 idDelete(&s_h3);
1231 idDelete(&s_temp);
1232
1233 for (j=0;j<IDELEMS(s_result);j++)
1234 {
1235 if (s_result->m[j]!=NULL)
1236 {
1237 if (pGetComp(s_result->m[j])<=k)
1238 {
1239 if (!divide)
1240 {
1241 if (rest==NULL)
1242 {
1243 if (isSB)
1244 {
1245 WarnS("first module not a standardbasis\n"
1246 "// ** or second not a proper submodule");
1247 }
1248 else
1249 WerrorS("2nd module does not lie in the first");
1250 }
1251 idDelete(&s_result);
1252 idDelete(&s_rest);
1253 if(syz_ring!=orig_ring)
1254 {
1255 idDelete(&s_mod);
1256 rChangeCurrRing(orig_ring);
1257 rDelete(syz_ring);
1258 }
1259 if (unit!=NULL)
1260 {
1261 idLift_setUnit(idelems_submod,unit);
1262 }
1263 if (rest!=NULL) *rest=idCopy(submod);
1264 s_result=idInit(idelems_submod,idelems_mod);
1265 return s_result;
1266 }
1267 else
1268 {
1269 p = s_rest->m[j] = s_result->m[j];
1270 while ((pNext(p)!=NULL) && (pGetComp(pNext(p))<=k)) pIter(p);
1271 s_result->m[j] = pNext(p);
1272 pNext(p) = NULL;
1273 }
1274 }
1275 p_Shift(&(s_result->m[j]),-k,currRing);
1276 pNeg(s_result->m[j]);
1277 }
1278 }
1279 if ((lsmod==0) && (s_rest!=NULL))
1280 {
1281 for (j=IDELEMS(s_rest);j>0;j--)
1282 {
1283 if (s_rest->m[j-1]!=NULL)
1284 {
1285 p_Shift(&(s_rest->m[j-1]),-1,currRing);
1286 }
1287 }
1288 }
1289 if(syz_ring!=orig_ring)
1290 {
1291 idDelete(&s_mod);
1292 rChangeCurrRing(orig_ring);
1293 s_result = idrMoveR_NoSort(s_result, syz_ring, orig_ring);
1294 s_rest = idrMoveR_NoSort(s_rest, syz_ring, orig_ring);
1295 rDelete(syz_ring);
1296 }
1297 if (rest!=NULL)
1298 {
1299 s_rest->rank=mod->rank;
1300 *rest = s_rest;
1301 }
1302 else
1303 idDelete(&s_rest);
1304 if (unit!=NULL)
1305 {
1306 *unit=mpNew(idelems_submod,idelems_submod);
1307 int i;
1308 for(i=0;i<IDELEMS(s_result);i++)
1309 {
1310 poly p=s_result->m[i];
1311 poly q=NULL;
1312 while(p!=NULL)
1313 {
1314 if(pGetComp(p)<=comps_to_add)
1315 {
1316 pSetComp(p,0);
1317 if (q!=NULL)
1318 {
1319 pNext(q)=pNext(p);
1320 }
1321 else
1322 {
1323 pIter(s_result->m[i]);
1324 }
1325 pNext(p)=NULL;
1326 MATELEM(*unit,i+1,i+1)=pAdd(MATELEM(*unit,i+1,i+1),p);
1327 if(q!=NULL) p=pNext(q);
1328 else p=s_result->m[i];
1329 }
1330 else
1331 {
1332 q=p;
1333 pIter(p);
1334 }
1335 }
1336 p_Shift(&s_result->m[i],-comps_to_add,currRing);
1337 }
1338 }
1339 s_result->rank=idelems_mod;
1340 return s_result;
1341}
#define BITSET
Definition auxiliary.h:85
static int si_max(const int a, const int b)
Definition auxiliary.h:125
CF_NO_INLINE FACTORY_PUBLIC CanonicalForm mod(const CanonicalForm &, const CanonicalForm &)
CanonicalForm divide(const CanonicalForm &ff, const CanonicalForm &f, const CFList &as)
VAR short errorreported
Definition feFopen.cc:23
static void idPrepareStd(ideal s_temp, int k)
Definition ideals.cc:1047
static void idLift_setUnit(int e_mod, matrix *unit)
Definition ideals.cc:1088
static ideal idPrepare(ideal h1, ideal h11, tHomog hom, int syzcomp, intvec **w, GbVariant alg)
Definition ideals.cc:613
VAR unsigned si_opt_2
Definition options.c:6
#define TEST_OPT_IDLIFT
Definition options.h:131
#define SI_SAVE_OPT2(A)
Definition options.h:22
#define SI_RESTORE_OPT2(A)
Definition options.h:25
#define Sy_bit(x)
Definition options.h:31
#define TEST_OPT_RETURN_SB
Definition options.h:114
#define V_IDLIFT
Definition options.h:63
void p_Shift(poly *p, int i, const ring r)
shifts components of the vector p by i
Definition p_polys.cc:4860
#define pNeg(p)
Definition polys.h:199
#define pGetComp(p)
Component.
Definition polys.h:38
#define pSetComp(p, v)
Definition polys.h:39
#define pSetmComp(p)
TODO:
Definition polys.h:274
#define pMinComp(p)
Definition polys.h:301
ideal idrMoveR_NoSort(ideal &id, ring src_r, ring dest_r)
Definition prCopy.cc:261
ideal idrCopyR_NoSort(ideal id, ring src_r, ring dest_r)
Definition prCopy.cc:205
ring rAssure_SyzOrder(const ring r, BOOLEAN complete)
Definition ring.cc:4522
void rSetSyzComp(int k, const ring r)
Definition ring.cc:5230
static BOOLEAN rIsNCRing(const ring r)
Definition ring.h:427
#define rField_is_Ring(R)
Definition ring.h:491
long id_RankFreeModule(ideal s, ring lmRing, ring tailRing)
return the maximal component number found in any polynomial in s
void id_Shift(ideal M, int s, const ring r)

◆ idLiftStd()

ideal idLiftStd ( ideal h1,
matrix * m,
tHomog h = testHomog,
ideal * syz = NULL,
GbVariant a = GbDefault,
ideal h11 = NULL )

Definition at line 982 of file ideals.cc.

984{
985 int inputIsIdeal=id_RankFreeModule(h1,currRing);
986 long k;
987 intvec *w=NULL;
988
989 idDelete((ideal*)T);
990 BOOLEAN lift3=FALSE;
991 if (S!=NULL) { lift3=TRUE; idDelete(S); }
992 if (idIs0(h1))
993 {
994 *T=mpNew(1,IDELEMS(h1));
995 if (lift3)
996 {
997 *S=idFreeModule(IDELEMS(h1));
998 }
999 return idInit(1,h1->rank);
1000 }
1001
1002 BITSET saveOpt1,saveOpt2;
1003 SI_SAVE_OPT(saveOpt1,saveOpt2);
1005 k=si_max(1,inputIsIdeal);
1006
1007 if ((!lift3)&&(!TEST_OPT_RETURN_SB)) si_opt_2 |=Sy_bit(V_IDLIFT);
1008
1009 ring orig_ring = currRing;
1010 ring syz_ring = rAssure_SyzOrder(orig_ring,TRUE);
1011 rSetSyzComp(k,syz_ring);
1012 rChangeCurrRing(syz_ring);
1013
1014 ideal s_h1;
1015
1016 if (orig_ring != syz_ring)
1017 s_h1 = idrCopyR_NoSort(h1,orig_ring,syz_ring);
1018 else
1019 s_h1 = h1;
1020 ideal s_h11=NULL;
1021 if (h11!=NULL)
1022 {
1023 s_h11=idrCopyR_NoSort(h11,orig_ring,syz_ring);
1024 }
1025
1026
1027 ideal s_h3=idPrepare(s_h1,s_h11,hi,k,&w,alg); // main (syz) GB computation
1028
1029
1030 if (w!=NULL) delete w;
1031 if (syz_ring!=orig_ring)
1032 {
1033 idDelete(&s_h1);
1034 if (s_h11!=NULL) idDelete(&s_h11);
1035 }
1036
1037 if (S!=NULL) (*S)=idInit(IDELEMS(s_h3),IDELEMS(h1));
1038
1039 s_h3=idExtractG_T_S(s_h3,T,S,k,IDELEMS(h1),inputIsIdeal,orig_ring,syz_ring);
1040
1041 if (syz_ring!=orig_ring) rDelete(syz_ring);
1042 s_h3->rank=h1->rank;
1043 SI_RESTORE_OPT(saveOpt1,saveOpt2);
1044 return s_h3;
1045}
ideal idExtractG_T_S(ideal s_h3, matrix *T, ideal *S, long syzComp, int h1_size, BOOLEAN inputIsIdeal, const ring oring, const ring sring)
Definition ideals.cc:715
ideal idFreeModule(int i)
Definition ideals.h:111
#define SI_SAVE_OPT(A, B)
Definition options.h:20
#define V_PURE_GB
Definition options.h:71
#define SI_RESTORE_OPT(A, B)
Definition options.h:23

◆ idLiftW()

void idLiftW ( ideal P,
ideal Q,
int n,
matrix & T,
ideal & R,
int * w = NULL )

Definition at line 1347 of file ideals.cc.

1348{
1349 long N=0;
1350 int i;
1351 for(i=IDELEMS(Q)-1;i>=0;i--)
1352 if(w==NULL)
1353 N=si_max(N,p_Deg(Q->m[i],currRing));
1354 else
1355 N=si_max(N,p_DegW(Q->m[i],w,currRing));
1356 N+=n;
1357
1358 T=mpNew(IDELEMS(Q),IDELEMS(P));
1359 R=idInit(IDELEMS(P),P->rank);
1360
1361 for(i=IDELEMS(P)-1;i>=0;i--)
1362 {
1363 poly p;
1364 if(w==NULL)
1365 p=ppJet(P->m[i],N);
1366 else
1367 p=ppJetW(P->m[i],N,w);
1368
1369 int j=IDELEMS(Q)-1;
1370 while(p!=NULL)
1371 {
1372 if(pDivisibleBy(Q->m[j],p))
1373 {
1374 poly p0=p_DivideM(pHead(p),pHead(Q->m[j]),currRing);
1375 if(w==NULL)
1376 p=pJet(pSub(p,ppMult_mm(Q->m[j],p0)),N);
1377 else
1378 p=pJetW(pSub(p,ppMult_mm(Q->m[j],p0)),N,w);
1379 pNormalize(p);
1380 if(((w==NULL)&&(p_Deg(p0,currRing)>n))||((w!=NULL)&&(p_DegW(p0,w,currRing)>n)))
1381 p_Delete(&p0,currRing);
1382 else
1383 MATELEM(T,j+1,i+1)=pAdd(MATELEM(T,j+1,i+1),p0);
1384 j=IDELEMS(Q)-1;
1385 }
1386 else
1387 {
1388 if(j==0)
1389 {
1390 poly p0=p;
1391 pIter(p);
1392 pNext(p0)=NULL;
1393 if(((w==NULL)&&(p_Deg(p0,currRing)>n))
1394 ||((w!=NULL)&&(p_DegW(p0,w,currRing)>n)))
1395 p_Delete(&p0,currRing);
1396 else
1397 R->m[i]=pAdd(R->m[i],p0);
1398 j=IDELEMS(Q)-1;
1399 }
1400 else
1401 j--;
1402 }
1403 }
1404 }
1405}
poly p_DivideM(poly a, poly b, const ring r)
Definition p_polys.cc:1582
long p_DegW(poly p, const int *w, const ring R)
Definition p_polys.cc:691
long p_Deg(poly a, const ring r)
Definition p_polys.cc:586
#define ppJet(p, m)
Definition polys.h:367
#define pHead(p)
returns newly allocated copy of Lm(p), coef is copied, next=NULL, p might be NULL
Definition polys.h:68
#define ppMult_mm(p, m)
Definition polys.h:202
#define pJet(p, m)
Definition polys.h:368
#define pSub(a, b)
Definition polys.h:288
#define ppJetW(p, m, iv)
Definition polys.h:369
#define pJetW(p, m, iv)
Definition polys.h:370
#define pNormalize(p)
Definition polys.h:318
#define pDivisibleBy(a, b)
returns TRUE, if leading monom of a divides leading monom of b i.e., if there exists a expvector c > ...
Definition polys.h:139
#define R
Definition sirandom.c:27

◆ idMinBase()

ideal idMinBase ( ideal h1,
ideal * SB = NULL )

Definition at line 51 of file ideals.cc.

52{
53 ideal h2, h3,h4,e;
54 int j,k;
55 int i,l,ll;
56 intvec * wth;
57 BOOLEAN homog;
59 {
60 WarnS("minbase applies only to the local or homogeneous case over coefficient fields");
61 e=idCopy(h1);
62 return e;
63 }
64 homog = idHomModule(h1,currRing->qideal,&wth);
66 {
67 if(!homog)
68 {
69 WarnS("minbase applies only to the local or homogeneous case over coefficient fields");
70 e=idCopy(h1);
71 return e;
72 }
73 else
74 {
75 ideal re=kMin_std2(h1,currRing->qideal,(tHomog)homog,&wth,h2,(bigintmat*)NULL,0,3);
76 idDelete(&re);
77 return h2;
78 }
79 }
80 e=idInit(1,h1->rank);
81 if (idIs0(h1))
82 {
83 return e;
84 }
85 h2 = kStd2(h1,currRing->qideal,isNotHomog,NULL,(bigintmat*)NULL);
86 if (SB!=NULL) *SB=h2;
87 h3 = idMaxIdeal(1);
88 h4=idMult(h2,h3);
89 idDelete(&h3);
90 h3=kStd2(h4,currRing->qideal,isNotHomog,NULL,(bigintmat*)NULL);
91 k = IDELEMS(h3);
92 while ((k > 0) && (h3->m[k-1] == NULL)) k--;
93 j = -1;
94 l = IDELEMS(h2);
95 while ((l > 0) && (h2->m[l-1] == NULL)) l--;
96 for (i=l-1; i>=0; i--)
97 {
98 if (h2->m[i] != NULL)
99 {
100 ll = 0;
101 while ((ll < k) && ((h3->m[ll] == NULL)
102 || !pDivisibleBy(h3->m[ll],h2->m[i])))
103 ll++;
104 if (ll >= k)
105 {
106 j++;
107 if (j > IDELEMS(e)-1)
108 {
109 pEnlargeSet(&(e->m),IDELEMS(e),16);
110 IDELEMS(e) += 16;
111 }
112 e->m[j] = pCopy(h2->m[i]);
113 }
114 }
115 }
116 if (SB==NULL) idDelete(&h2);
117 idDelete(&h3);
118 idDelete(&h4);
119 if (currRing->qideal!=NULL)
120 {
121 h3=idInit(1,e->rank);
122 h2=kNF(h3,currRing->qideal,e);
123 idDelete(&h3);
124 idDelete(&e);
125 e=h2;
126 }
127 idSkipZeroes(e);
128 return e;
129}
static ideal idMult(ideal h1, ideal h2)
hh := h1 * h2
Definition ideals.h:84
#define idMaxIdeal(D)
initialise the maximal ideal (at 0)
Definition ideals.h:33
ideal kMin_std2(ideal F, ideal Q, tHomog h, intvec **w, ideal &M, bigintmat *hilb, int syzComp, int reduced)
Definition kstd1.cc:3069
#define pCopy(p)
return a copy of the poly
Definition polys.h:186
static BOOLEAN rHasGlobalOrdering(const ring r)
Definition ring.h:768
@ isNotHomog
Definition structs.h:32

◆ idMinEmbedding()

ideal idMinEmbedding ( ideal arg,
BOOLEAN inPlace = FALSE,
intvec ** w = NULL )

Definition at line 2853 of file ideals.cc.

2854{
2855 int *red_comp=(int*)omAlloc((arg->rank+1)*sizeof(int));
2856 int del=0;
2857 ideal res=idMinEmbedding1(arg,inPlace,w,red_comp,del);
2858 idDeleteComps(res,red_comp,del);
2859 omFree(red_comp);
2860 return res;
2861}
static ideal idMinEmbedding1(ideal arg, BOOLEAN inPlace, intvec **w, int *red_comp, int &del)
Definition ideals.cc:2817
static void idDeleteComps(ideal arg, int *red_comp, int del)
Definition ideals.cc:2707

◆ idMinEmbedding_with_map()

ideal idMinEmbedding_with_map ( ideal arg,
intvec ** w,
ideal & trans )

Definition at line 2863 of file ideals.cc.

2864{
2865 int *red_comp=(int*)omAlloc((arg->rank+1)*sizeof(int));
2866 int del=0;
2867 ideal res=idMinEmbedding1(arg,FALSE,w,red_comp,del);
2868 trans=idLift(arg,res,NULL,TRUE,FALSE,FALSE,NULL);
2869 //idDeleteComps(res,red_comp,del);
2870 omFree(red_comp);
2871 return res;
2872}
ideal idLift(ideal mod, ideal submod, ideal *rest, BOOLEAN goodShape, BOOLEAN isSB, BOOLEAN divide, matrix *unit, GbVariant alg)
represents the generators of submod in terms of the generators of mod (Matrix(SM)*U-Matrix(rest)) = M...
Definition ideals.cc:1111

◆ idMinEmbedding_with_map_v()

ideal idMinEmbedding_with_map_v ( ideal arg,
intvec ** w,
ideal & trans,
int * red_comp )

Definition at line 2874 of file ideals.cc.

2875{
2876 if (idIs0(arg))
2877 {
2878 trans=idFreeModule(arg->rank);
2879 if (g!=NULL)
2880 {
2881 for(int i=0;i<arg->rank;i++) g[i]=i+1;
2882 }
2883 return arg;
2884 }
2885 int *red_comp=(int*)omAlloc((arg->rank+1)*sizeof(int));
2886 int del=0;
2887 ideal res=idMinEmbedding1(arg,FALSE,w,red_comp,del);
2888 trans=idLift(arg,res,NULL,TRUE,FALSE,FALSE,NULL);
2889 for(int i=1;i<=arg->rank;i++)
2890 {
2891 g[i-1]=red_comp[i];
2892 }
2893 idDeleteComps(res,red_comp,del);
2894 return res;
2895}

◆ idMinors()

ideal idMinors ( matrix a,
int ar,
ideal R = NULL )

compute all ar-minors of the matrix a the caller of mpRecMin the elements of the result are not in R (if R!=NULL)

Definition at line 2031 of file ideals.cc.

2032{
2033
2034 const ring origR=currRing;
2035 id_Test((ideal)a, origR);
2036
2037 const int r = a->nrows;
2038 const int c = a->ncols;
2039
2040 if((ar<=0) || (ar>r) || (ar>c))
2041 {
2042 Werror("%d-th minor, matrix is %dx%d",ar,r,c);
2043 return NULL;
2044 }
2045
2046 ideal h = id_Matrix2Module(mp_Copy(a,origR),origR);
2047 long bound = sm_ExpBound(h,c,r,ar,origR);
2048 id_Delete(&h, origR);
2049
2050 ring tmpR = sm_RingChange(origR,bound);
2051
2052 matrix b = mpNew(r,c);
2053
2054 for (int i=r*c-1;i>=0;i--)
2055 if (a->m[i] != NULL)
2056 b->m[i] = prCopyR(a->m[i],origR,tmpR);
2057
2058 id_Test( (ideal)b, tmpR);
2059
2060 if (R!=NULL)
2061 {
2062 R = idrCopyR(R,origR,tmpR); // TODO: overwrites R? memory leak?
2063 //if (ar>1) // otherwise done in mpMinorToResult
2064 //{
2065 // matrix bb=(matrix)kNF(R,currRing->qideal,(ideal)b);
2066 // bb->rank=b->rank; bb->nrows=b->nrows; bb->ncols=b->ncols;
2067 // idDelete((ideal*)&b); b=bb;
2068 //}
2069 id_Test( R, tmpR);
2070 }
2071
2072 int size=binom(r,ar)*binom(c,ar);
2073 ideal result = idInit(size,1);
2074
2075 int elems = 0;
2076
2077 if(ar>1)
2078 mp_RecMin(ar-1,result,elems,b,r,c,NULL,R,tmpR);
2079 else
2080 mp_MinorToResult(result,elems,b,r,c,R,tmpR);
2081
2082 id_Test( (ideal)b, tmpR);
2083
2084 id_Delete((ideal *)&b, tmpR);
2085
2086 if (R!=NULL) id_Delete(&R,tmpR);
2087
2088 rChangeCurrRing(origR);
2089 result = idrMoveR(result,tmpR,origR);
2090 sm_KillModifiedRing(tmpR);
2091 idTest(result);
2092 return result;
2093}
int size(const CanonicalForm &f, const Variable &v)
int size ( const CanonicalForm & f, const Variable & v )
Definition cf_ops.cc:600
static CanonicalForm bound(const CFMatrix &M)
Definition cf_linsys.cc:460
int nrows
Definition matpol.h:20
int ncols
Definition matpol.h:21
int binom(int n, int r)
matrix mp_Copy(matrix a, const ring r)
copies matrix a (from ring r to r)
Definition matpol.cc:57
void mp_MinorToResult(ideal result, int &elems, matrix a, int r, int c, ideal R, const ring)
entries of a are minors and go to result (only if not in R)
Definition matpol.cc:1501
void mp_RecMin(int ar, ideal result, int &elems, matrix a, int lr, int lc, poly barDiv, ideal R, const ring r)
produces recursively the ideal of all arxar-minors of a
Definition matpol.cc:1597
poly prCopyR(poly p, ring src_r, ring dest_r)
Definition prCopy.cc:34
ideal id_Matrix2Module(matrix mat, const ring R)
converts mat to module, destroys mat
long sm_ExpBound(ideal m, int di, int ra, int t, const ring currRing)
Definition sparsmat.cc:188
ring sm_RingChange(const ring origR, long bound)
Definition sparsmat.cc:258
void sm_KillModifiedRing(ring r)
Definition sparsmat.cc:289

◆ idModulo()

ideal idModulo ( ideal h1,
ideal h2,
tHomog h = testHomog,
intvec ** w = NULL,
matrix * T = NULL,
GbVariant a = GbDefault )

Definition at line 2463 of file ideals.cc.

2464{
2465#ifdef HAVE_SHIFTBBA
2466 if (rIsLPRing(currRing))
2467 return idModuloLP(h2,h1,hom,w,T,alg);
2468#endif
2469 intvec *wtmp=NULL;
2470 if (T!=NULL) idDelete((ideal*)T);
2471
2472 int i,flength=0,slength,length;
2473
2474 if (idIs0(h2))
2475 return idFreeModule(si_max(1,h2->ncols));
2476 if (!idIs0(h1))
2477 flength = id_RankFreeModule(h1,currRing);
2478 slength = id_RankFreeModule(h2,currRing);
2479 length = si_max(flength,slength);
2480 BOOLEAN inputIsIdeal=FALSE;
2481 if (length==0)
2482 {
2483 length = 1;
2484 inputIsIdeal=TRUE;
2485 }
2486 if ((w!=NULL)&&((*w)!=NULL))
2487 {
2488 //Print("input weights:");(*w)->show(1);PrintLn();
2489 int d;
2490 int k;
2491 wtmp=new intvec(length+IDELEMS(h2));
2492 for (i=0;i<length;i++)
2493 ((*wtmp)[i])=(**w)[i];
2494 for (i=0;i<IDELEMS(h2);i++)
2495 {
2496 poly p=h2->m[i];
2497 if (p!=NULL)
2498 {
2499 d = p_Deg(p,currRing);
2500 k= pGetComp(p);
2501 if (slength>0) k--;
2502 d +=((**w)[k]);
2503 ((*wtmp)[i+length]) = d;
2504 }
2505 }
2506 //Print("weights:");wtmp->show(1);PrintLn();
2507 }
2508 ideal s_temp1;
2509 ring orig_ring=currRing;
2510 ring syz_ring=rAssure_SyzOrder(orig_ring, TRUE);
2511 rSetSyzComp(length,syz_ring);
2512 {
2513 rChangeCurrRing(syz_ring);
2514 ideal s1,s2;
2515
2516 if (syz_ring != orig_ring)
2517 {
2518 s1 = idrCopyR_NoSort(h1, orig_ring, syz_ring);
2519 s2 = idrCopyR_NoSort(h2, orig_ring, syz_ring);
2520 }
2521 else
2522 {
2523 s1=idCopy(h1);
2524 s2=idCopy(h2);
2525 }
2526
2527 BITSET save_opt,save_opt2;
2528 SI_SAVE_OPT(save_opt,save_opt2);
2529 if (T==NULL) si_opt_1 |= Sy_bit(OPT_REDTAIL);
2531 s_temp1 = idPrepare(s2,s1,testHomog,length,w,alg);
2532 SI_RESTORE_OPT(save_opt,save_opt2);
2533 }
2534
2535 //if (wtmp!=NULL) Print("output weights:");wtmp->show(1);PrintLn();
2536 if ((w!=NULL) && (*w !=NULL) && (wtmp!=NULL))
2537 {
2538 delete *w;
2539 *w=new intvec(IDELEMS(h2));
2540 for (i=0;i<IDELEMS(h2);i++)
2541 ((**w)[i])=(*wtmp)[i+length];
2542 }
2543 if (wtmp!=NULL) delete wtmp;
2544
2545 ideal result=idInit(IDELEMS(s_temp1),IDELEMS(h2));
2546 s_temp1=idExtractG_T_S(s_temp1,T,&result,length,IDELEMS(h2),inputIsIdeal,orig_ring,syz_ring);
2547
2548 idDelete(&s_temp1);
2549 if (syz_ring!=orig_ring)
2550 {
2551 rDelete(syz_ring);
2552 }
2553 idTest(h2);
2554 idTest(h1);
2555 idTest(result);
2556 if (T!=NULL) idTest((ideal)*T);
2557 return result;
2558}
ideal idModuloLP(ideal h2, ideal h1, tHomog, intvec **w, matrix *T, GbVariant alg)
Definition ideals.cc:2272
static BOOLEAN length(leftv result, leftv arg)
Definition interval.cc:257
VAR unsigned si_opt_1
Definition options.c:5
#define OPT_REDTAIL_SYZ
Definition options.h:88
#define OPT_REDTAIL
Definition options.h:92
static BOOLEAN rIsLPRing(const ring r)
Definition ring.h:417

◆ idMult()

ideal idMult ( ideal h1,
ideal h2 )
inlinestatic

hh := h1 * h2

Definition at line 84 of file ideals.h.

85{
86 return id_Mult(h1, h2, currRing);
87}
ideal id_Mult(ideal h1, ideal h2, const ring R)
h1 * h2 one h_i must be an ideal (with at least one column) the other h_i may be a module (with no co...

◆ idMultSect()

ideal idMultSect ( resolvente arg,
int length,
GbVariant a = GbDefault )

Definition at line 472 of file ideals.cc.

473{
474 int i,j=0,k=0,l,maxrk=-1,realrki;
475 unsigned syzComp;
476 ideal bigmat,tempstd,result;
477 poly p;
478 int isIdeal=0;
479
480 /* find 0-ideals and max rank -----------------------------------*/
481 for (i=0;i<length;i++)
482 {
483 if (!idIs0(arg[i]))
484 {
485 realrki=id_RankFreeModule(arg[i],currRing);
486 k++;
487 j += IDELEMS(arg[i]);
488 if (realrki>maxrk) maxrk = realrki;
489 }
490 else
491 {
492 if (arg[i]!=NULL)
493 {
494 return idInit(1,arg[i]->rank);
495 }
496 }
497 }
498 if (maxrk == 0)
499 {
500 isIdeal = 1;
501 maxrk = 1;
502 }
503 /* init -----------------------------------------------------------*/
504 j += maxrk;
505 syzComp = k*maxrk;
506
507 BITSET save_opt;
508 SI_SAVE_OPT1(save_opt);
510
511 ring orig_ring=currRing;
512 ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
513 rSetSyzComp(syzComp,syz_ring);
514 rChangeCurrRing(syz_ring);
515
516 bigmat = idInit(j,(k+1)*maxrk);
517 /* create unit matrices ------------------------------------------*/
518 for (i=0;i<maxrk;i++)
519 {
520 for (j=0;j<=k;j++)
521 {
522 p = pOne();
523 pSetComp(p,i+1+j*maxrk);
524 pSetmComp(p);
525 bigmat->m[i] = pAdd(bigmat->m[i],p);
526 }
527 }
528 /* enter given ideals ------------------------------------------*/
529 i = maxrk;
530 k = 0;
531 for (j=0;j<length;j++)
532 {
533 if (arg[j]!=NULL)
534 {
535 for (l=0;l<IDELEMS(arg[j]);l++)
536 {
537 if (arg[j]->m[l]!=NULL)
538 {
539 if (syz_ring==orig_ring)
540 bigmat->m[i] = pCopy(arg[j]->m[l]);
541 else
542 bigmat->m[i] = prCopyR(arg[j]->m[l], orig_ring,currRing);
543 p_Shift(&(bigmat->m[i]),k*maxrk+isIdeal,currRing);
544 i++;
545 }
546 }
547 k++;
548 }
549 }
550 /* std computation --------------------------------------------*/
551 if ((alg!=GbDefault)
552 && (alg!=GbGroebner)
553 && (alg!=GbModstd)
554 && (alg!=GbSlimgb)
555 && (alg!=GbStd))
556 {
557 WarnS("wrong algorithm for GB");
558 alg=GbDefault;
559 }
560 tempstd=idGroebner(bigmat,syzComp,alg);
561
562 if(syz_ring!=orig_ring)
563 rChangeCurrRing(orig_ring);
564
565 /* interpret result ----------------------------------------*/
566 result = idInit(IDELEMS(tempstd),maxrk);
567 k = 0;
568 for (j=0;j<IDELEMS(tempstd);j++)
569 {
570 if ((tempstd->m[j]!=NULL) && (__p_GetComp(tempstd->m[j],syz_ring)>syzComp))
571 {
572 if (syz_ring==orig_ring)
573 p = pCopy(tempstd->m[j]);
574 else
575 p = prCopyR(tempstd->m[j], syz_ring,currRing);
576 p_Shift(&p,-syzComp-isIdeal,currRing);
577 result->m[k] = p;
578 k++;
579 }
580 }
581 /* clean up ----------------------------------------------------*/
582 if(syz_ring!=orig_ring)
583 rChangeCurrRing(syz_ring);
584 idDelete(&tempstd);
585 if(syz_ring!=orig_ring)
586 {
587 rChangeCurrRing(orig_ring);
588 rDelete(syz_ring);
589 }
590 SI_RESTORE_OPT1(save_opt);
592 return result;
593}
#define SI_SAVE_OPT1(A)
Definition options.h:21
#define SI_RESTORE_OPT1(A)
Definition options.h:24

◆ idQuot()

ideal idQuot ( ideal h1,
ideal h2,
BOOLEAN h1IsStb = FALSE,
BOOLEAN resultIsIdeal = FALSE )

Definition at line 1539 of file ideals.cc.

1540{
1541 // first check for special case h1:(0)
1542 if (idIs0(h2))
1543 {
1544 ideal res;
1545 if (resultIsIdeal)
1546 {
1547 res = idInit(1,1);
1548 res->m[0] = pOne();
1549 }
1550 else
1551 res = idFreeModule(h1->rank);
1552 return res;
1553 }
1554 int i, kmax;
1555 BOOLEAN addOnlyOne=TRUE;
1556 tHomog hom=isNotHomog;
1557 intvec * weights1;
1558
1559 ideal s_h4 = idInitializeQuot (h1,h2,h1IsStb,&addOnlyOne,&kmax);
1560
1561 hom = (tHomog)idHomModule(s_h4,currRing->qideal,&weights1);
1562
1563 ring orig_ring=currRing;
1564 ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
1565 rSetSyzComp(kmax-1,syz_ring);
1566 rChangeCurrRing(syz_ring);
1567 if (orig_ring!=syz_ring)
1568 // s_h4 = idrMoveR_NoSort(s_h4,orig_ring, syz_ring);
1569 s_h4 = idrMoveR(s_h4,orig_ring, syz_ring);
1570 idTest(s_h4);
1571
1572 #if 0
1573 matrix m=idModule2Matrix(idCopy(s_h4));
1574 PrintS("start:\n");
1575 ipPrint_MA0(m,"Q");
1576 idDelete((ideal *)&m);
1577 PrintS("last elem:");wrp(s_h4->m[IDELEMS(s_h4)-1]);PrintLn();
1578 #endif
1579
1580 ideal s_h3;
1581 BITSET old_test1;
1582 SI_SAVE_OPT1(old_test1);
1584 if (addOnlyOne)
1585 {
1587 s_h3 = kStd2(s_h4,currRing->qideal,hom,&weights1,(bigintmat*)NULL,0/*kmax-1*/,IDELEMS(s_h4)-1);
1588 }
1589 else
1590 {
1591 //s_h3 = kStd2(s_h4,currRing->qideal,hom,&weights1,(bigintmat*)NULL,kmax-1);
1592 // qideal added in idInitializeQuotient
1593 s_h3 = kStd2(s_h4,NULL,hom,&weights1,(bigintmat*)NULL,kmax-1);
1594 }
1595 SI_RESTORE_OPT1(old_test1);
1596
1597 #if 0
1598 // only together with the above debug stuff
1599 idSkipZeroes(s_h3);
1600 m=idModule2Matrix(idCopy(s_h3));
1601 Print("result, kmax=%d:\n",kmax);
1602 ipPrint_MA0(m,"S");
1603 idDelete((ideal *)&m);
1604 #endif
1605
1606 idTest(s_h3);
1607 if (weights1!=NULL) delete weights1;
1608 idDelete(&s_h4);
1609
1610 for (i=0;i<IDELEMS(s_h3);i++)
1611 {
1612 if ((s_h3->m[i]!=NULL) && (pGetComp(s_h3->m[i])>=kmax))
1613 {
1614 if (resultIsIdeal)
1615 p_Shift(&s_h3->m[i],-kmax,currRing);
1616 else
1617 p_Shift(&s_h3->m[i],-kmax+1,currRing);
1618 }
1619 else
1620 p_Delete(&s_h3->m[i],currRing);
1621 }
1622 if (resultIsIdeal)
1623 s_h3->rank = 1;
1624 else
1625 s_h3->rank = h1->rank;
1626 if(syz_ring!=orig_ring)
1627 {
1628 rChangeCurrRing(orig_ring);
1629 s_h3 = idrMoveR_NoSort(s_h3, syz_ring, orig_ring);
1630 rDelete(syz_ring);
1631 }
1632 idSkipZeroes(s_h3);
1633 idTest(s_h3);
1634 return s_h3;
1635}
#define Print
Definition emacs.cc:80
void ipPrint_MA0(matrix m, const char *name)
Definition ipprint.cc:57
static ideal idInitializeQuot(ideal h1, ideal h2, BOOLEAN h1IsStb, BOOLEAN *addOnlyOne, int *kkmax)
Definition ideals.cc:1412
#define OPT_SB_1
Definition options.h:96
void wrp(poly p)
Definition polys.h:311
void PrintS(const char *s)
Definition reporter.cc:288
void PrintLn()
Definition reporter.cc:314

◆ idSaturate()

ideal idSaturate ( ideal I,
ideal J,
int & ki,
BOOLEAN isIdeal = TRUE )

Definition at line 3599 of file ideals.cc.

3600{
3601 return idSaturate_intern(I,J,k,isIdeal,FALSE);
3602}
ideal idSaturate_intern(ideal I, ideal J, int &k, BOOLEAN isIdeal, BOOLEAN isSB)
Definition ideals.cc:3495

◆ idSaturate_intern()

ideal idSaturate_intern ( ideal I,
ideal J,
int & ki,
BOOLEAN isIdeal,
BOOLEAN isSB )

Definition at line 3495 of file ideals.cc.

3496{
3497 if(idIs0(J))
3498 {
3499 ideal res;
3500 if(isIdeal)
3501 {
3502 res=idInit(1,1);
3503 res->m[0]=pOne();
3504 }
3505 else
3506 {
3507 res=idFreeModule(I->rank);
3508 }
3509 k=1;
3510 return(res);
3511 }
3512 BITSET save_opt;SI_SAVE_OPT2(save_opt);
3513 //if (idElem(J)==1)
3514 //{
3515 // idSkipZeroes(J);
3516 // return id_Sat_principal(I,J,currRing);
3517 //}
3518 //---------------------------------------------------
3520 {
3521 BOOLEAN only_vars=TRUE; // enabled for I:x_i
3522 if (idElem(J)==1)
3523 {
3524 for(int j=IDELEMS(J)-1;j>=0;j--)
3525 {
3526 poly p=J->m[j];
3527 if (p!=NULL)
3528 {
3529 if (pVar(p)==0)
3530 {
3531 only_vars=FALSE;
3532 break;
3533 }
3534 }
3535 }
3536 }
3537 if (only_vars && isIdeal && rOrd_is_Totaldegree_Ordering(currRing)
3538 && (idElem(J)==1))
3539 {
3540 ideal Iquot,Istd;
3541 intvec *w=NULL;
3542 Istd=id_Satstd(I,J,currRing);
3544 k=0;
3545 loop
3546 {
3547 k++;
3548 Iquot=idQuot(Istd,J,TRUE,isIdeal);
3549 ideal tmp=kNF(Istd,currRing->qideal,Iquot,5);
3550 int elem=idElem(tmp);
3551 id_Delete(&tmp,currRing);
3552 id_Delete(&Istd,currRing);
3553 Istd=Iquot;
3554 w=NULL;
3555 Istd=kStd2(Iquot,currRing->qideal,testHomog,&w,(bigintmat*)NULL);
3556 if (w!=NULL) delete w;
3557 id_Delete(&Iquot,currRing);
3558 if (elem==0) break;
3559 }
3560 k--;
3561 idSkipZeroes(Istd);
3562 //PrintS("\nSatstd:\n");
3563 //iiWriteMatrix((matrix)I,"I",1,currRing,0); PrintLn();
3564 //iiWriteMatrix((matrix)J,"J",1,currRing,0); PrintLn();
3565 //iiWriteMatrix((matrix)Istd,"res",1,currRing,0);PrintLn();
3566 //id_Delete(&Istd,currRing);
3567 SI_RESTORE_OPT2(save_opt);
3568 return Istd;
3569 }
3570 }
3571 //--------------------------------------------------
3572 ideal Iquot,Istd;
3573 intvec *w=NULL;
3574 Istd=idCopy(I);
3575 k=0;
3576 loop
3577 {
3578 k++;
3579 Iquot=idQuot(Istd,J,isSB,isIdeal);
3580 isSB=FALSE;
3581 si_opt_2|=Sy_bit(V_PURE_GB); // used from 2nd loop on
3582 ideal tmp=kNF(Istd,currRing->qideal,Iquot,5);
3583 int elem=idElem(tmp);
3584 id_Delete(&tmp,currRing);
3585 id_Delete(&Istd,currRing);
3586 Istd=Iquot;
3587 if (elem==0) break;
3588 }
3589 k--;
3590 Istd=kStd2(Iquot,currRing->qideal,testHomog,&w,(bigintmat*)NULL);
3591 idSkipZeroes(Istd);
3592 SI_RESTORE_OPT2(save_opt);
3593 //if (only_vars)
3594 //{
3595 // iiWriteMatrix((matrix)Istd,"org",1,currRing,0);
3596 //}
3597 return Istd;
3598}
ideal idQuot(ideal h1, ideal h2, BOOLEAN h1IsStb, BOOLEAN resultIsIdeal)
Definition ideals.cc:1539
ideal id_Satstd(const ideal I, ideal J, const ring r)
Definition ideals.cc:3363
#define pVar(m)
Definition polys.h:381
BOOLEAN rOrd_is_Totaldegree_Ordering(const ring r)
Definition ring.cc:2043
static int idElem(const ideal F)
number of non-zero polys in F
#define loop
Definition structs.h:71

◆ idSaturateGB()

ideal idSaturateGB ( ideal I,
ideal J,
int & ki,
BOOLEAN isIdeal = TRUE )

Definition at line 3603 of file ideals.cc.

3604{
3605 return idSaturate_intern(I,J,k,isIdeal,TRUE);
3606}

◆ idSect()

ideal idSect ( ideal h1,
ideal h2,
GbVariant a = GbDefault )

Definition at line 315 of file ideals.cc.

316{
317 int i,j,k;
318 unsigned length;
319 int flength = id_RankFreeModule(h1,currRing);
320 int slength = id_RankFreeModule(h2,currRing);
321 int rank=si_max(h1->rank,h2->rank);
322 if ((idIs0(h1)) || (idIs0(h2))) return idInit(1,rank);
323
324 BITSET save_opt;
325 SI_SAVE_OPT1(save_opt);
327
328 ideal first,second,temp,temp1,result;
329 poly p,q;
330
331 if (IDELEMS(h1)<IDELEMS(h2))
332 {
333 first = h1;
334 second = h2;
335 }
336 else
337 {
338 first = h2;
339 second = h1;
340 int t=flength; flength=slength; slength=t;
341 }
342 length = si_max(flength,slength);
343 if (length==0)
344 {
345 if ((currRing->qideal==NULL)
346 && (currRing->OrdSgn==1)
349 return idSectWithElim(first,second,alg);
350 else length = 1;
351 }
352 if (TEST_OPT_PROT) PrintS("intersect by syzygy methods\n");
353 j = IDELEMS(first);
354
355 ring orig_ring=currRing;
356 ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
357 rSetSyzComp(length,syz_ring);
358 rChangeCurrRing(syz_ring);
360
361 while ((j>0) && (first->m[j-1]==NULL)) j--;
362 temp = idInit(j /*IDELEMS(first)*/+IDELEMS(second),length+j);
363 k = 0;
364 for (i=0;i<j;i++)
365 {
366 if (first->m[i]!=NULL)
367 {
368 if (syz_ring==orig_ring)
369 temp->m[k] = pCopy(first->m[i]);
370 else
371 temp->m[k] = prCopyR(first->m[i], orig_ring, syz_ring);
372 q = pOne();
373 pSetComp(q,i+1+length);
374 pSetmComp(q);
375 if (flength==0) p_Shift(&(temp->m[k]),1,currRing);
376 p = temp->m[k];
377 while (pNext(p)!=NULL) pIter(p);
378 pNext(p) = q;
379 k++;
380 }
381 }
382 for (i=0;i<IDELEMS(second);i++)
383 {
384 if (second->m[i]!=NULL)
385 {
386 if (syz_ring==orig_ring)
387 temp->m[k] = pCopy(second->m[i]);
388 else
389 temp->m[k] = prCopyR(second->m[i], orig_ring,currRing);
390 if (slength==0) p_Shift(&(temp->m[k]),1,currRing);
391 k++;
392 }
393 }
394 intvec *w=NULL;
395
396 if ((alg!=GbDefault)
397 && (alg!=GbGroebner)
398 && (alg!=GbModstd)
399 && (alg!=GbSlimgb)
400 && (alg!=GbStd))
401 {
402 WarnS("wrong algorithm for GB");
403 alg=GbDefault;
404 }
405 temp1=idGroebner(temp,length,alg);
406
407 if(syz_ring!=orig_ring)
408 rChangeCurrRing(orig_ring);
409
410 result = idInit(IDELEMS(temp1),rank);
411 j = 0;
412 for (i=0;i<IDELEMS(temp1);i++)
413 {
414 if ((temp1->m[i]!=NULL)
415 && (__p_GetComp(temp1->m[i],syz_ring)>length))
416 {
417 if(syz_ring==orig_ring)
418 {
419 p = temp1->m[i];
420 }
421 else
422 {
423 p = prMoveR(temp1->m[i], syz_ring,orig_ring);
424 }
425 temp1->m[i]=NULL;
426 while (p!=NULL)
427 {
428 q = pNext(p);
429 pNext(p) = NULL;
430 k = pGetComp(p)-1-length;
431 pSetComp(p,0);
432 pSetmComp(p);
433 /* Warning! multiply only from the left! it's very important for Plural */
434 result->m[j] = pAdd(result->m[j],pMult(p,pCopy(first->m[k])));
435 p = q;
436 }
437 j++;
438 }
439 }
440 if(syz_ring!=orig_ring)
441 {
442 rChangeCurrRing(syz_ring);
443 idDelete(&temp1);
444 rChangeCurrRing(orig_ring);
445 rDelete(syz_ring);
446 }
447 else
448 {
449 idDelete(&temp1);
450 }
451
453 SI_RESTORE_OPT1(save_opt);
455 {
456 w=NULL;
457 temp1=kStd2(result,currRing->qideal,testHomog,&w,(bigintmat*)NULL);
458 if (w!=NULL) delete w;
460 idSkipZeroes(temp1);
461 return temp1;
462 }
463 //else
464 // temp1=kInterRed(result,currRing->qideal);
465 return result;
466}
static ideal idSectWithElim(ideal h1, ideal h2, GbVariant alg)
Definition ideals.cc:132
#define TEST_V_INTERSECT_ELIM
Definition options.h:146
#define TEST_V_INTERSECT_SYZ
Definition options.h:147
#define TEST_OPT_PROT
Definition options.h:105
#define pMult(p, q)
Definition polys.h:208

◆ idSeries()

ideal idSeries ( int n,
ideal M,
matrix U = NULL,
intvec * w = NULL )

Definition at line 2172 of file ideals.cc.

2173{
2174 for(int i=IDELEMS(M)-1;i>=0;i--)
2175 {
2176 if(U==NULL)
2177 M->m[i]=pSeries(n,M->m[i],NULL,w);
2178 else
2179 {
2180 M->m[i]=pSeries(n,M->m[i],MATELEM(U,i+1,i+1),w);
2181 MATELEM(U,i+1,i+1)=NULL;
2182 }
2183 }
2184 if(U!=NULL)
2185 idDelete((ideal*)&U);
2186 return M;
2187}
#define pSeries(n, p, u, w)
Definition polys.h:372

◆ idSort()

intvec * idSort ( ideal id,
BOOLEAN nolex = TRUE )
inlinestatic

Definition at line 188 of file ideals.h.

189{
190 return id_Sort(id, nolex, currRing);
191}
intvec * id_Sort(const ideal id, const BOOLEAN nolex, const ring r)
sorts the ideal w.r.t. the actual ringordering uses lex-ordering when nolex = FALSE

◆ idSyzygies()

ideal idSyzygies ( ideal h1,
tHomog h,
intvec ** w,
BOOLEAN setSyzComp = TRUE,
BOOLEAN setRegularity = FALSE,
int * deg = NULL,
GbVariant a = GbDefault )

Definition at line 836 of file ideals.cc.

838{
839 ideal s_h1;
840 int j, k, length=0,reg;
841 BOOLEAN isMonomial=TRUE;
842 int ii, idElemens_h1;
843
844 assume(h1 != NULL);
845
846 idElemens_h1=IDELEMS(h1);
847#ifdef PDEBUG
848 for(ii=0;ii<idElemens_h1 /*IDELEMS(h1)*/;ii++) pTest(h1->m[ii]);
849#endif
850 if (idIs0(h1))
851 {
852 ideal result=idFreeModule(idElemens_h1/*IDELEMS(h1)*/);
853 return result;
854 }
855 int slength=(int)id_RankFreeModule(h1,currRing);
856 k=si_max(1,slength /*id_RankFreeModule(h1)*/);
857
858 assume(currRing != NULL);
859 ring orig_ring=currRing;
860 ring syz_ring=rAssure_SyzComp(orig_ring,TRUE);
861 if (setSyzComp) rSetSyzComp(k,syz_ring);
862
863 if (orig_ring != syz_ring)
864 {
865 rChangeCurrRing(syz_ring);
866 s_h1=idrCopyR_NoSort(h1,orig_ring,syz_ring);
867 }
868 else
869 {
870 s_h1 = h1;
871 }
872
873 idTest(s_h1);
874
875 BITSET save_opt;
876 SI_SAVE_OPT1(save_opt);
878
879 ideal s_h3=idPrepare(s_h1,NULL,h,k,w,alg); // main (syz) GB computation
880
881 SI_RESTORE_OPT1(save_opt);
882
883 if (orig_ring != syz_ring)
884 {
885 idDelete(&s_h1);
886 for (j=0; j<IDELEMS(s_h3); j++)
887 {
888 if (s_h3->m[j] != NULL)
889 {
890 if (p_MinComp(s_h3->m[j],syz_ring) > k)
891 p_Shift(&s_h3->m[j], -k,syz_ring);
892 else
893 p_Delete(&s_h3->m[j],syz_ring);
894 }
895 }
896 idSkipZeroes(s_h3);
897 s_h3->rank -= k;
898 rChangeCurrRing(orig_ring);
899 s_h3 = idrMoveR_NoSort(s_h3, syz_ring, orig_ring);
900 rDelete(syz_ring);
901 #ifdef HAVE_PLURAL
902 if (rIsPluralRing(orig_ring))
903 {
904 id_DelMultiples(s_h3,orig_ring);
905 idSkipZeroes(s_h3);
906 }
907 #endif
908 idTest(s_h3);
909 return s_h3;
910 }
911
912 ideal e = idInit(IDELEMS(s_h3), s_h3->rank);
913
914 for (j=IDELEMS(s_h3)-1; j>=0; j--)
915 {
916 if (s_h3->m[j] != NULL)
917 {
918 if (p_MinComp(s_h3->m[j],syz_ring) <= k)
919 {
920 e->m[j] = s_h3->m[j];
921 isMonomial=isMonomial && (pNext(s_h3->m[j])==NULL);
922 p_Delete(&pNext(s_h3->m[j]),syz_ring);
923 s_h3->m[j] = NULL;
924 }
925 }
926 }
927
928 idSkipZeroes(s_h3);
929 idSkipZeroes(e);
930
931 if ((deg != NULL)
932 && (!isMonomial)
934 && (setRegularity)
935 && (h==isHomog)
938 )
939 {
940 assume(orig_ring==syz_ring);
941 ring dp_C_ring = rAssure_dp_C(syz_ring); // will do rChangeCurrRing later
942 if (dp_C_ring != syz_ring)
943 {
944 rChangeCurrRing(dp_C_ring);
945 e = idrMoveR_NoSort(e, syz_ring, dp_C_ring);
946 }
948 intvec * dummy = syBetti(res,length,&reg, *w);
949 *deg = reg+2;
950 delete dummy;
951 for (j=0;j<length;j++)
952 {
953 if (res[j]!=NULL) idDelete(&(res[j]));
954 }
955 omFreeSize((ADDRESS)res,length*sizeof(ideal));
956 idDelete(&e);
957 if (dp_C_ring != orig_ring)
958 {
959 rChangeCurrRing(orig_ring);
960 rDelete(dp_C_ring);
961 }
962 }
963 else
964 {
965 idDelete(&e);
966 }
967 assume(orig_ring==currRing);
968 idTest(s_h3);
969 if (currRing->qideal != NULL)
970 {
971 ideal ts_h3=kStd2(s_h3,currRing->qideal,h,w,(bigintmat*)NULL);
972 idDelete(&s_h3);
973 s_h3 = ts_h3;
974 }
975 return s_h3;
976}
ideal * resolvente
Definition ideals.h:18
#define TEST_OPT_NOTREGULARITY
Definition options.h:122
static long p_MinComp(poly p, ring lmRing, ring tailRing)
Definition p_polys.h:315
#define pTest(p)
Definition polys.h:415
ring rAssure_SyzComp(const ring r, BOOLEAN complete)
Definition ring.cc:4527
ring rAssure_dp_C(const ring r)
Definition ring.cc:5119
void id_DelMultiples(ideal id, const ring r)
ideal id = (id[i]), c any unit if id[i] = c*id[j] then id[j] is deleted for j > i
@ isHomog
Definition structs.h:33
intvec * syBetti(resolvente res, int length, int *regularity, intvec *weights, BOOLEAN tomin, int *row_shift)
Definition syz.cc:787
resolvente sySchreyerResolvente(ideal arg, int maxlength, int *length, BOOLEAN isMonomial=FALSE, BOOLEAN notReplace=FALSE)
Definition syz0.cc:855

◆ idTestHomModule()

BOOLEAN idTestHomModule ( ideal m,
ideal Q,
intvec * w )

Definition at line 2120 of file ideals.cc.

2121{
2122 if ((Q!=NULL) && (!idHomIdeal(Q,NULL))) { PrintS(" Q not hom\n"); return FALSE;}
2123 if (idIs0(m)) return TRUE;
2124
2125 int cmax=-1;
2126 int i;
2127 poly p=NULL;
2128 int length=IDELEMS(m);
2129 polyset P=m->m;
2130 for (i=length-1;i>=0;i--)
2131 {
2132 p=P[i];
2133 if (p!=NULL) cmax=si_max(cmax,(int)pMaxComp(p)+1);
2134 }
2135 if (w != NULL)
2136 if (w->length()+1 < cmax)
2137 {
2138 // Print("length: %d - %d \n", w->length(),cmax);
2139 return FALSE;
2140 }
2141
2142 if(w!=NULL)
2144
2145 for (i=length-1;i>=0;i--)
2146 {
2147 p=P[i];
2148 if (p!=NULL)
2149 {
2150 int d=currRing->pFDeg(p,currRing);
2151 loop
2152 {
2153 pIter(p);
2154 if (p==NULL) break;
2155 if (d!=currRing->pFDeg(p,currRing))
2156 {
2157 //pWrite(q); wrp(p); Print(" -> %d - %d\n",d,pFDeg(p,currRing));
2158 if(w!=NULL)
2160 return FALSE;
2161 }
2162 }
2163 }
2164 }
2165
2166 if(w!=NULL)
2168
2169 return TRUE;
2170}
static BOOLEAN idHomIdeal(ideal id, ideal Q=NULL)
Definition ideals.h:91
void p_SetModDeg(intvec *w, ring r)
Definition p_polys.cc:3798
#define pMaxComp(p)
Definition polys.h:300
poly * polyset
Definition polys.h:260

◆ idVec2Ideal()

ideal idVec2Ideal ( poly vec)
inlinestatic

Definition at line 173 of file ideals.h.

174{
175 return id_Vec2Ideal(vec, currRing);
176}
fq_nmod_poly_t * vec
Definition facHensel.cc:108
ideal id_Vec2Ideal(poly vec, const ring R)

◆ syGetAlgorithm()

GbVariant syGetAlgorithm ( char * n,
const ring r,
const ideal M )

Definition at line 3698 of file ideals.cc.

3699{
3700 GbVariant alg=GbDefault;
3701 if (strcmp(n,"default")==0) alg=GbDefault;
3702 else if (strcmp(n,"slimgb")==0) alg=GbSlimgb;
3703 else if (strcmp(n,"std")==0) alg=GbStd;
3704 else if (strcmp(n,"sba")==0) alg=GbSba;
3705 else if (strcmp(n,"singmatic")==0) alg=GbSingmatic;
3706 else if (strcmp(n,"groebner")==0) alg=GbGroebner;
3707 else if (strcmp(n,"modstd")==0) alg=GbModstd;
3708 else if (strcmp(n,"ffmod")==0) alg=GbFfmod;
3709 else if (strcmp(n,"nfmod")==0) alg=GbNfmod;
3710 else if (strcmp(n,"std:sat")==0) alg=GbStdSat;
3711 else Warn(">>%s<< is an unknown algorithm",n);
3712
3713 if (alg==GbSlimgb) // test conditions for slimgb
3714 {
3715 if(rHasGlobalOrdering(r)
3716 &&(!rIsNCRing(r))
3717 &&(r->qideal==NULL)
3718 &&(!rField_is_Ring(r)))
3719 {
3720 return GbSlimgb;
3721 }
3722 if (TEST_OPT_PROT)
3723 WarnS("requires: coef:field, commutative, global ordering, not qring");
3724 }
3725 else if (alg==GbSba) // cond. for sba
3726 {
3727 if(rField_is_Domain(r)
3728 &&(!rIsNCRing(r))
3729 &&(rHasGlobalOrdering(r)))
3730 {
3731 return GbSba;
3732 }
3733 if (TEST_OPT_PROT)
3734 WarnS("requires: coef:domain, commutative, global ordering");
3735 }
3736 else if (alg==GbGroebner) // cond. for groebner
3737 {
3738 return GbGroebner;
3739 }
3740 else if(alg==GbModstd) // cond for modstd: Q or Q(a)
3741 {
3742 if(ggetid("modStd")==NULL)
3743 {
3744 WarnS(">>modStd<< not found");
3745 }
3746 else if(rField_is_Q(r)
3747 &&(!rIsNCRing(r))
3748 &&(rHasGlobalOrdering(r)))
3749 {
3750 return GbModstd;
3751 }
3752 if (TEST_OPT_PROT)
3753 WarnS("requires: coef:QQ, commutative, global ordering");
3754 }
3755 else if(alg==GbStdSat) // cond for std:sat: 2 blocks of variables
3756 {
3757 if(ggetid("satstd")==NULL)
3758 {
3759 WarnS(">>satstd<< not found");
3760 }
3761 else
3762 {
3763 return GbStdSat;
3764 }
3765 }
3766
3767 return GbStd; // no conditions for std
3768}
#define Warn
Definition emacs.cc:77
GbVariant
Definition ideals.h:119
idhdl ggetid(const char *n)
Definition ipid.cc:581
static BOOLEAN rField_is_Domain(const ring r)
Definition ring.h:493
static BOOLEAN rField_is_Q(const ring r)
Definition ring.h:512