-
-
Notifications
You must be signed in to change notification settings - Fork 698
Description
There are 6 different definitions of is_unit for polynomials over commutative rings in sage/rings/polynomial/:
infinite_polynomial_element.py:428: def is_unit(self):
multi_polynomial_element.py:914: def is_unit(self):
multi_polynomial_libsingular.pyx:3092: def is_unit(self):
pbori.pyx:3593: def is_unit(BooleanPolynomial self):
polynomial_element_generic.py:962: def is_unit(self):
polynomial_element.pyx:5041: def is_unit(self):
Of these, pbori.pyx, polynomial_element_generic.py and polynomial_element.pyx correctly apply the following fact:
EXERCISE (Atiyah-McDonald, Ch 1): Let A[x] be a polynomial ring in one variable. Then f=\sum a_i x^i \in A[x] is a unit if and only if a_0 is a unit and a_1,\ldots, a_n are nilpotent.
(This fact is also noted in Dummit and Foote, "Abstract Algebra", 1991, Section 7.3 Exercise 33).
infinite_polynomial_element.py, multi_polynomial_element.py, multi_polynomial_libsingular.pyx have incorrect implementations and can give incorrect results:
sage: _.<x> = InfinitePolynomialRing(Zmod(4))
sage: p = (1 + 2*x[0])
sage: p*p
1
sage: p.is_unit()
False
sage: p.is_unit.__module__
'sage.rings.polynomial.infinite_polynomial_element'
sage: _.<x,y> = Zmod(4)[]
sage: p = 1+2*x
sage: p*p
1
sage: p.is_unit()
False
sage: type(p)
<type 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
sage: p.is_unit
<built-in method is_unit of sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular object at 0x7fde1d743780>
Component: algebra
Author: Mark Saaltink
Branch: 4c2f792
Reviewer: Travis Scrimshaw
Issue created by migration from https://trac.sagemath.org/ticket/22454