_invert_ for ring which is not integral

asked 2021-07-16 09:52:41 +0200

philipp7 gravatar image

Suppose I have implemented my own ring MyRing which derives (among others) from CommutativeRing. MyRing is not an integral domain, so MyRing.is_integral_domain() will return False. The element class is called MyRingElement and is derived from CommutativeRingElement. All arithmetic operations on MyRingElement, like _add_, _mult_, etc., work well. Some of the elements are invertible and for those, _invert_ will return the inverse (or raise an error if no inverse exists). What is the Sage-way to call _invert_?

R = MyRing()
el = R.an_element()
~el # or 1/el or el.inverse_of_unit()

yields an error as MyRing is not an integral domain:

~/sage-9.2/local/lib/python3.8/site-packages/sage/structure/element.pyx in sage.structure.element.RingElement.__invert__ (build/cythonized/sage/structure/element.c:19405)() 2738 2739 def __invert__(self): -> 2740 return self._parent.one() / self 2741
2742 def additive_order(self):

~/sage-9.2/local/lib/python3.8/site-packages/sage/structure/element.pyx in sage.structure.element.Element.__truediv__ (build/cythonized/sage/structure/element.c:13147)() 1733 cdef int cl = classify_elements(left, right) 1734 if HAVE_SAME_PARENT(cl): -> 1735 return (<element>left)._div_(right) 1736
if BOTH_ARE_ELEMENT(cl): 1737
return coercion_model.bin_op(left, right, truediv)

~/sage-9.2/local/lib/python3.8/site-packages/sage/structure/element.pyx in sage.structure.element.RingElement._div_ (build/cythonized/sage/structure/element.c:19149)() 2732 """ 2733 try: -> 2734 frac = self._parent.fraction_field() 2735 except AttributeError: 2736
raise bin_op_exception('/', self, other)

~/sage-9.2/local/lib/python3.8/site-packages/sage/rings/ring.pyx in sage.rings.ring.CommutativeRing.fraction_field (build/cythonized/sage/rings/ring.c:12126)() 1328 1329 if not self.is_integral_domain(): -> 1330 raise TypeError("self must be an integral domain.") 1331 1332 if self.__fraction_field is not None:

TypeError: self must be an integral domain.

edit retag flag offensive close merge delete



The __invert__ method needs to be defined with double underscores instead of single underscores. If you implement it, then ~el and probably el.inverse_of_unit() should work.

1/el will not work unless you implement division, but I think the convention in Sage is that this should first be coerced to a larger parent in which division is possible, but in your case such a parent does not exist.

mwageringel gravatar imagemwageringel ( 2021-07-16 21:12:49 +0200 )edit

Thank you very much! This works well!

philipp7 gravatar imagephilipp7 ( 2021-07-19 10:02:37 +0200 )edit