Suppose that
I is the image of a free module
FI in a quotient module
G, and
J is the image of the free module
FJ in
G.
The default is
Strategy=>Quotient, which works as follows:
compute the first components of the syzygies of
map R++((dual FJ)**FI --> (dual FJ) ** G.
If
Strategy=>Iterate then quotient first computes the quotient
I1 by the first generator of
J. It then checks whether this quotient already annihilates the second generator of
J mod
I. If so, it goes on to the third generator; else it intersects
I1 with the quotient of
I by the second generator to produce a new
I1. It then iterates this process, working through the generators one at a time.
To use
Strategy=>Linear the argument
J must be a principal ideal, generated by a linear form. A change of variables is made so that this linear form becomes the last variable. Then a reverse lex Groebner basis is used, and the quotient of the initial ideal by the last variable is computed combinatorially. This set of monomial is then lifted back to a set of generators for the quotient.
For further information see for example Exercise 15.41 in Eisenbud's Commutative Algebra with a View Towards Algebraic Geometry.
The following examples show timings for the different strategies.
Strategy=>Iterate is sometimes faster for ideals with a small number of generators:
i1 : n = 6
o1 = 6
|
i2 : S = ZZ/101[vars(0..n-1)];
|
i3 : i1 = monomialCurveIdeal(S, 1..n-1)
2 2
o3 = ideal (e - d*f, d*e - c*f, c*e - b*f, b*e - a*f, d - b*f, c*d - a*f,
------------------------------------------------------------------------
2 2
b*d - a*e, c - a*e, b*c - a*d, b - a*c)
o3 : Ideal of S
|
i4 : i2 = monomialCurveIdeal(S, 1..n-1)
2 2
o4 = ideal (e - d*f, d*e - c*f, c*e - b*f, b*e - a*f, d - b*f, c*d - a*f,
------------------------------------------------------------------------
2 2
b*d - a*e, c - a*e, b*c - a*d, b - a*c)
o4 : Ideal of S
|
i5 : j1 = ideal(map(S^1,S^n, (p,q)->S_q^5))
5 5 5 5 5 5
o5 = ideal (a , b , c , d , e , f )
o5 : Ideal of S
|
i6 : j2 = ideal(map(S^1,S^n, (p,q)->S_q^5))
5 5 5 5 5 5
o6 = ideal (a , b , c , d , e , f )
o6 : Ideal of S
|
i7 : time quotient(i1^3,j1^2,Strategy=>Iterate);
-- used 1.38009 seconds
o7 : Ideal of S
|
i8 : time quotient(i2^3,j2^2,Strategy=>Quotient);
-- used 2.33615 seconds
o8 : Ideal of S
|
Strategy=>Quotient is faster in other cases:
i9 : S =ZZ/101[vars(0..4)];
|
i10 : i =ideal vars S;
o10 : Ideal of S
|
i11 : j =ideal vars S;
o11 : Ideal of S
|
i12 : i3 = i^3; i5 = i^5;
o12 : Ideal of S
o13 : Ideal of S
|
i14 : j3 = j^3; j5 = j^5;
o14 : Ideal of S
o15 : Ideal of S
|
i16 : time quotient(i5,i3,Strategy=>Iterate);
-- used 0.076005 seconds
o16 : Ideal of S
|
i17 : time quotient(j5,j3,Strategy=>Quotient);
-- used 0.020001 seconds
o17 : Ideal of S
|