sagemath / sage

Main repository of SageMath. Now open for Issues and Pull Requests.
https://www.sagemath.org
Other
1.2k stars 413 forks source link

Ideal homogenize is a trap for the unwary #33614

Open 11d1fc49-71a1-44e1-869f-76be013245a0 opened 2 years ago

11d1fc49-71a1-44e1-869f-76be013245a0 commented 2 years ago

The usual definition of the "homogenization" of an ideal I is the ideal consisting of the homogenizations of the polynomials in I. However, the method I.homogenize() doesn't compute this; it computes the ideal generated by the homogenizations of the given generators of I, which is in general strictly smaller (and is not what one wants for most applications).

It would be good to change this method so it computes the mathematically interesting quantity which its name suggests, rather than the essentially useless object it currently computes. (This is not difficult to do -- if we compute a Groebner basis of I w.r.t. a degree-graded order, then the homogenizations of the Groebner basis are generators of the homogenized ideal.)

Example:

sage: R.<x,y,z> = QQ[]
sage: J = R.ideal(x + y + z^2 - 1, x + y^2 + z - 1, x*y - y*z, z - 1)
sage: K = J.homogenize('t')
sage: x in J
True
sage: x.homogenize('t') in K
False

(PS: The method projective_closure() of affine schemes makes a reasonable attempt at computing the mathematically correct notion of ideal homogenization using Groebner bases. Unfortunately it is wrong as well, but only if you go out of your way to break it by using non-default monomial term orders (it does not check that the term order is a graded one). See #33622. The correct solution seems (to me) to be to move the code currently in projective_closure() to homogenize() and add a check which raises an error if R.term_order().name()[:3] != 'deg'.

Component: commutative algebra

Issue created by migration from https://trac.sagemath.org/ticket/33614

11d1fc49-71a1-44e1-869f-76be013245a0 commented 2 years ago

Description changed:

--- 
+++ 
@@ -6,7 +6,7 @@

sage: R.<x,y,z> = QQ[] -sage: J = R.ideal(x + y + z^2 - 1, xz - yz, x + y^2 + z - 1, xy - yz, z - 1) +sage: J = R.ideal(x + y + z^2 - 1, x + y^2 + z - 1, xy - yz, z - 1) sage: K = J.homogenize('t') sage: x in J True

11d1fc49-71a1-44e1-869f-76be013245a0 commented 2 years ago

Description changed:

--- 
+++ 
@@ -13,3 +13,5 @@
 sage: x.homogenize('t') in K
 False

+ +(PS: The method projective_closure() of affine schemes makes a reasonable attempt at computing the mathematically correct notion of ideal homogenization. Unfortunately it is wrong as well, but only if you go out of your way to break it by using non-default monomial term orders. See #33622. The correct solution seems (to me) to be to move the code currently in projective_closure() to homogenize() and add a check which raises an error if R.term_order().name()[:3] != 'deg'.

11d1fc49-71a1-44e1-869f-76be013245a0 commented 2 years ago

Description changed:

--- 
+++ 
@@ -14,4 +14,4 @@
 False

-(PS: The method projective_closure() of affine schemes makes a reasonable attempt at computing the mathematically correct notion of ideal homogenization. Unfortunately it is wrong as well, but only if you go out of your way to break it by using non-default monomial term orders. See #33622. The correct solution seems (to me) to be to move the code currently in projective_closure() to homogenize() and add a check which raises an error if R.term_order().name()[:3] != 'deg'. +(PS: The method projective_closure() of affine schemes makes a reasonable attempt at computing the mathematically correct notion of ideal homogenization using Groebner bases. Unfortunately it is wrong as well, but only if you go out of your way to break it by using non-default monomial term orders (it does not check that the term order is a graded one). See #33622. The correct solution seems (to me) to be to move the code currently in projective_closure() to homogenize() and add a check which raises an error if R.term_order().name()[:3] != 'deg'.