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

## Synopsis

• Usage:
quotient(I,J,Strategy=>b)
• Inputs:
• b, , one of Iterate, Linear, Quotient

## 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 Gröbner 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 0.380551 seconds o7 : Ideal of S``` ```i8 : time quotient(i2^3,j2^2,Strategy=>Quotient); -- used 0.773891 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.0178127 seconds o16 : Ideal of S``` ```i17 : time quotient(j5,j3,Strategy=>Quotient); -- used 0.00761383 seconds o17 : Ideal of S```

## Further information

• Default value: Iterate
• Function: quotient -- quotient or division
• Option name: Strategy -- name for an optional argument