Skip to content

Commit 72ae2bc

Browse files
committed
add support for term orders and doctests
1 parent 4f0410c commit 72ae2bc

File tree

2 files changed

+145
-3
lines changed

2 files changed

+145
-3
lines changed

src/sage/categories/modules_with_basis.py

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,6 +1860,18 @@ def leading_item(self, *args, **kwds):
18601860
sage: f = 2*s[1] + 3*s[2,1] - 5*s[3] # needs sage.combinat sage.modules
18611861
sage: f.leading_item() # needs sage.combinat sage.modules
18621862
([3], -5)
1863+
1864+
The term ordering of polynomial rings is taken into account::
1865+
1866+
sage: R.<x,y,z> = QQ[]
1867+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_item()
1868+
((0, 4, 0), 1)
1869+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
1870+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_item()
1871+
((1, 2, 0), 3)
1872+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
1873+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_item()
1874+
((0, 1, 3), 2)
18631875
"""
18641876
k = self.leading_support(*args, **kwds)
18651877
return k, self[k]
@@ -1890,6 +1902,18 @@ def leading_monomial(self, *args, **kwds):
18901902
sage: f = 2*s[1] + 3*s[2,1] - 5*s[3] # needs sage.combinat sage.modules
18911903
sage: f.leading_monomial() # needs sage.combinat sage.modules
18921904
s[3]
1905+
1906+
The term ordering of polynomial rings is taken into account::
1907+
1908+
sage: R.<x,y,z> = QQ[]
1909+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_monomial()
1910+
y^4
1911+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
1912+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_monomial()
1913+
x*y^2
1914+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
1915+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_monomial()
1916+
y*z^3
18931917
"""
18941918
return self.parent().monomial(self.leading_support(*args, **kwds))
18951919

@@ -1920,9 +1944,17 @@ def leading_coefficient(self, *args, **kwds):
19201944
sage: f.leading_coefficient() # needs sage.combinat sage.modules
19211945
-5
19221946
1923-
sage: P.<x,y> = QQ[]
1924-
sage: (3*x^2*y + y^2*x).leading_coefficient()
1947+
The term ordering of polynomial rings is taken into account::
1948+
1949+
sage: R.<x,y,z> = QQ[]
1950+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_coefficient()
1951+
1
1952+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
1953+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_coefficient()
19251954
3
1955+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
1956+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_coefficient()
1957+
2
19261958
"""
19271959
return self.leading_item(*args, **kwds)[1]
19281960

@@ -1952,6 +1984,18 @@ def leading_term(self, *args, **kwds):
19521984
sage: f = 2*s[1] + 3*s[2,1] - 5*s[3] # needs sage.combinat sage.modules
19531985
sage: f.leading_term() # needs sage.combinat sage.modules
19541986
-5*s[3]
1987+
1988+
The term ordering of polynomial rings is taken into account::
1989+
1990+
sage: R.<x,y,z> = QQ[]
1991+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_term()
1992+
y^4
1993+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
1994+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_term()
1995+
3*x*y^2
1996+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
1997+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_term()
1998+
2*y*z^3
19551999
"""
19562000
return self.parent().term(*self.leading_item(*args, **kwds))
19572001

@@ -2009,6 +2053,18 @@ def trailing_item(self, *args, **kwds):
20092053
sage: f = 2*s[1] + 3*s[2,1] - 5*s[3] # needs sage.combinat sage.modules
20102054
sage: f.trailing_item() # needs sage.combinat sage.modules
20112055
([1], 2)
2056+
2057+
The term ordering of polynomial rings is taken into account::
2058+
2059+
sage: R.<x,y,z> = QQ[]
2060+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_item()
2061+
((1, 1, 1), 4)
2062+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
2063+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_item()
2064+
((0, 1, 3), 2)
2065+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
2066+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_item()
2067+
((1, 2, 0), 3)
20122068
"""
20132069
k = self.trailing_support(*args, **kwds)
20142070
return k, self[k]
@@ -2039,6 +2095,18 @@ def trailing_monomial(self, *args, **kwds):
20392095
sage: f = 2*s[1] + 3*s[2,1] - 5*s[3] # needs sage.combinat sage.modules
20402096
sage: f.trailing_monomial() # needs sage.combinat sage.modules
20412097
s[1]
2098+
2099+
The term ordering of polynomial rings is taken into account::
2100+
2101+
sage: R.<x,y,z> = QQ[]
2102+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_monomial()
2103+
x*y*z
2104+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
2105+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_monomial()
2106+
y*z^3
2107+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
2108+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_monomial()
2109+
x*y^2
20422110
"""
20432111
return self.parent().monomial(self.trailing_support(*args, **kwds))
20442112

@@ -2068,6 +2136,18 @@ def trailing_coefficient(self, *args, **kwds):
20682136
sage: f = 2*s[1] + 3*s[2,1] - 5*s[3] # needs sage.combinat sage.modules
20692137
sage: f.trailing_coefficient() # needs sage.combinat sage.modules
20702138
2
2139+
2140+
The term ordering of polynomial rings is taken into account::
2141+
2142+
sage: R.<x,y,z> = QQ[]
2143+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_coefficient()
2144+
4
2145+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
2146+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_coefficient()
2147+
2
2148+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
2149+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_coefficient()
2150+
3
20712151
"""
20722152
return self.trailing_item(*args, **kwds)[1]
20732153

@@ -2097,6 +2177,18 @@ def trailing_term(self, *args, **kwds):
20972177
sage: f = 2*s[1] + 3*s[2,1] - 5*s[3] # needs sage.combinat sage.modules
20982178
sage: f.trailing_term() # needs sage.combinat sage.modules
20992179
2*s[1]
2180+
2181+
The term ordering of polynomial rings is taken into account::
2182+
2183+
sage: R.<x,y,z> = QQ[]
2184+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_term()
2185+
4*x*y*z
2186+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
2187+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_term()
2188+
2*y*z^3
2189+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
2190+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_term()
2191+
3*x*y^2
21002192
"""
21012193
return self.parent().term(*self.trailing_item(*args, **kwds))
21022194

src/sage/rings/polynomial/multi_polynomial.pyx

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,58 @@ cdef class MPolynomial(CommutativePolynomial):
208208
return R(self.polynomial(self._parent(var)))
209209
return R([self])
210210

211-
def coefficients(self):
211+
def leading_support(self, *args, **kwds):
212+
r"""
213+
Return the maximal element of the support of ``self``,
214+
according to the term order.
215+
216+
If the term ordering of the basis elements is not what is
217+
desired, a comparison key, ``key(x)``, can be provided.
218+
219+
EXAMPLES::
220+
221+
sage: R.<x,y,z> = PolynomialRing(QQ)
222+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_support()
223+
(0, 4, 0)
224+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
225+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_support()
226+
(1, 2, 0)
227+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
228+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).leading_support()
229+
(0, 1, 3)
230+
"""
231+
if 'key' in kwds:
232+
return max(self.support(), *args, **kwds)
233+
kwds['key'] = self._parent.term_order().sortkey
234+
return max(self.support(), *args, **kwds)
235+
236+
def trailing_support(self, *args, **kwds):
212237
r"""
238+
Return the minimal element of the support of ``self``,
239+
according to the term order.
240+
241+
If the term ordering of the basis elements is not what is
242+
desired, a comparison key, ``key(x)``, can be provided.
243+
244+
EXAMPLES::
245+
246+
sage: R.<x,y,z> = PolynomialRing(QQ)
247+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_support()
248+
(1, 1, 1)
249+
sage: R.<x,y,z> = PolynomialRing(QQ, order='lex')
250+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_support()
251+
(0, 1, 3)
252+
sage: R.<x,y,z> = PolynomialRing(QQ, order='invlex')
253+
sage: (3*x*y^2 + 2*y*z^3 + y^4 + 4*x*y*z).trailing_support()
254+
(1, 2, 0)
255+
"""
256+
if 'key' in kwds:
257+
return min(self.support(), *args, **kwds)
258+
kwds['key'] = self._parent.term_order().sortkey
259+
return min(self.support(), *args, **kwds)
260+
261+
def coefficients(self):
262+
"""
213263
Return the nonzero coefficients of this polynomial in a list.
214264
215265
The returned list is decreasingly ordered by the term ordering

0 commit comments

Comments
 (0)