# Singular          ### 7.8.2 reduce (letterplace)

`Syntax:`
`reduce (` poly_expression`,` ideal_expression `)`
`reduce (` poly_expression`,` ideal_expression`,` int_expression `)`
`reduce (` vector_expression`,` ideal_expression `)`
`reduce (` vector_expression`,` ideal_expression`,` int_expression `)`
`reduce (` vector_expression`,` module_expression`,` int_expression `)`
`reduce (` ideal_expression`,` ideal_expression `)`
`reduce (` ideal_expression`,` ideal_expression`,` int_expression `)`
`Type:`
the type of the first argument
`Purpose:`
reduces a polynomial, vector, or ideal (the first argument) to its two-sided normal form with respect to the second argument, meant to be an ideal, represented by its two-sided Groebner basis (otherwise, the result may have no meaning).
returns 0 if and only if the polynomial (resp. vector, ideal) is an element (resp. subideal) of the ideal.
The third (optional) argument of type int modifies the behavior:
• 0 default
• 1 consider only the leading term and do no tail reduction.
• 2 tail reduction:n the local/mixed ordering case: reduce also with bad ecart
• 4 reduce without division, return possibly a non-zero constant multiple of the remainder
`Note:`
The commands `reduce` and `NF` are synonymous.
`Note:`
A two-sided Groebner presentation of a polynomial with respect to a two-sided ideal can be computed by the procedure lpDivision from freegb_lib.
`Example:`
 ```LIB "freegb.lib"; ring r = 0,(x,y),dp; def R = freeAlgebra(r,5); setring R; ideal I = x*x + y*y - 1; // 2D sphere ideal J = twostd(I); // computes a two-sided Groebner basis J; // it is finite and nice ==> J=x*x+y*y-1 ==> J=y*y*x-x*y*y poly g = x*y*y - y*y*x; reduce(g,J); // 0, hence g belongs to J ==> 0 poly h = x*y*y*x - y*x*x; reduce(h,J); // the rest of two-sided division of h by J ==> -y*y*y*y+y*y*y+y*y-y qring Q = J; // swith to K/J reduce(x*y*y - y*y*x,twostd(0)); //image of g above ==> 0 reduce(x*y*y*x - y*x*x,std(0)); //image of h above ==> -y*y*y*y+y*y*y+y*y-y ``` 