-
-
Notifications
You must be signed in to change notification settings - Fork 704
Description
There seems to be no way to test containment of ideals in the class MPolynomialIdeal in sage.rings.polynomial.multi_polynomial_ideal. One might expect the comparison operators (e.g. I<J ) to do this, but in fact what they do is to compare the Groebner bases as sequences of polynomials, which is counterintuitive. For example:
sage: R.<x,y> = PolynomialRing(QQ)
sage: I=(x*y)*R; J=(x,y)*R; I<J
False
sage: I=(y+1)*R; J=(x,y)*R; I<J
True
This is implemented in the __cmp__ method, which is not up to the task of doing subset comparison, since __cmp__ is only suitable for total orderings.
To do it right would seem to require implementing Python's "rich comparison" methods, __lt__, __gt__, etc.
For example:
from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal
def IsSubset(I,J):
for g in I.gens()
if not g in J: return False
return True
def IsSuperset(I,J):
return IsSubset(J,I)
def IsProperSubset(I,J):
return I!=J and IsSubset(I,J)
def IsProperSuperset(I,J):
return I!J and IsSuperset(I,J)
setattr(MPolynomialIdeal,'__le__',IsSubset)
setattr(MPolynomialIdeal,'__lt__',IsProperSubset)
setattr(MPolynomialIdeal,'__ge__',IsSuperset)
setattr(MPolynomialIdeal,'__gt__',IsProperSuperset)
With these we now get the expected behavior:
sage: R.<x,y> = PolynomialRing(QQ)
sage: I=(x*y)*R; J=(x,y)*R; I<J
True
sage: I=(y+1)*R; J=(x,y)*R; I<J
False
The patch supplied gives a solution via Groebner bases, and also fixes #12839.
Apply:
Component: commutative algebra
Keywords: sd40.5, groebner bases, ideals
Author: John Perry
Reviewer: Andrey Novoseltsev, Simon King
Merged: sage-5.4.rc0
Issue created by migration from https://trac.sagemath.org/ticket/12802