next | previous | forward | backward | up | top | index | toc | home

quotient(..., Strategy => ...) -- Possible strategies are: Iterate, Linear, and Quotient

Synopsis

Description

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

Further information