Skip to content

Commit

Permalink
gh-37201: Fix univariate polynomial reverse
Browse files Browse the repository at this point in the history
    
For univariate polynomials over "non-prime" finite fields, the reverse
method had an issue when specifying `degree=0`: it raised an error
saying that this optional argument should be... nonnegative (which 0
is).

Example:
```
sage: ring.<x> = GF(9)[]
sage: pol = ring(1)
sage: pol.reverse(degree=2)
x^2
sage: pol.reverse()
1
sage: pol.reverse(degree=0)
------------------------------------------------------------------------
---
ValueError                                Traceback (most recent call
last)
Cell In[5], line 1
----> 1 pol.reverse(degree=Integer(0))

File ~/repositories/software/sage/src/sage/rings/polynomial/polynomial_z
z_pex.pyx:537, in
sage.rings.polynomial.polynomial_zz_pex.Polynomial_ZZ_pEX.reverse()
    535 if degree is not None:
    536     if degree <= 0:
--> 537         raise ValueError("degree argument must be a non-negative
integer, got %s" % (degree))
    538     try:
    539         d = degree

ValueError: degree argument must be a non-negative integer, got 0
```

This is fixed in this PR, along with fixes in similar code where the
error message was not the expected one ("cannot convert to long",
instead of "degree must be nonnegative").
    
URL: #37201
Reported by: Vincent Neiger
Reviewer(s): Xavier Caruso
  • Loading branch information
Release Manager committed Feb 1, 2024
2 parents 3212df1 + 9f15f69 commit c01ed87
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/sage/matrix/matrix_polynomial_dense.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ cdef class Matrix_polynomial_dense(Matrix_generic_dense):
sage: M.reverse([2,3,-1])
Traceback (most recent call last):
...
OverflowError: can't convert negative value to unsigned long
ValueError: degree argument must be a non-negative integer, got -1
.. SEEALSO::
Expand Down
4 changes: 3 additions & 1 deletion src/sage/rings/polynomial/polynomial_element.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -7672,9 +7672,11 @@ cdef class Polynomial(CommutativePolynomial):

cdef unsigned long d
if degree is not None:
if degree < 0:
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
d = degree
if d != degree:
raise ValueError("degree argument must be a non-negative integer, got %s"%(degree))
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
if len(v) < degree+1:
v.reverse()
v = [self.base_ring().zero()]*(degree+1-len(v)) + v
Expand Down
4 changes: 3 additions & 1 deletion src/sage/rings/polynomial/polynomial_integer_dense_flint.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1827,9 +1827,11 @@ cdef class Polynomial_integer_dense_flint(Polynomial):
cdef Polynomial_integer_dense_flint res = self._new()
cdef unsigned long d
if degree is not None:
if degree < 0:
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
d = degree
if d != degree:
raise ValueError("degree argument must be a non-negative integer, got %s" % degree)
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
# FLINT expects length
fmpz_poly_reverse(res._poly, self._poly, d+1)
else:
Expand Down
4 changes: 3 additions & 1 deletion src/sage/rings/polynomial/polynomial_zmod_flint.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -815,9 +815,11 @@ cdef class Polynomial_zmod_flint(Polynomial_template):
cdef Polynomial_zmod_flint res = self._new()
cdef unsigned long d
if degree is not None:
if degree < 0:
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
d = degree
if d != degree:
raise ValueError("degree argument must be a non-negative integer, got %s"%(degree))
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
nmod_poly_reverse(&res.x, &self.x, d+1) # FLINT expects length
else:
nmod_poly_reverse(&res.x, &self.x, nmod_poly_length(&self.x))
Expand Down
18 changes: 11 additions & 7 deletions src/sage/rings/polynomial/polynomial_zz_pex.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -513,13 +513,18 @@ cdef class Polynomial_ZZ_pEX(Polynomial_template):
sage: f.reverse(degree=200)
2*x^200 + 3*x^199 + 5*x^198 + 7*x^197 + 11*x^196 + 13*x^195 + 17*x^194 + 19*x^193
sage: f.reverse(degree=0)
Traceback (most recent call last):
...
ValueError: degree argument must be a non-negative integer, got 0
2
sage: f.reverse(degree=-5)
Traceback (most recent call last):
...
ValueError: degree argument must be a non-negative integer, got -5
Check that this implementation is compatible with the generic one::
sage: p = R([0,1,0,2])
sage: all(p.reverse(d) == Polynomial.reverse(p, d)
....: for d in [None, 0, 1, 2, 3, 4])
True
"""
self._parent._modulus.restore()

Expand All @@ -533,11 +538,10 @@ cdef class Polynomial_ZZ_pEX(Polynomial_template):
# When a degree has been supplied, ensure it is a valid input
cdef unsigned long d
if degree is not None:
if degree <= 0:
if degree < 0:
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
try:
d = degree
except ValueError:
d = degree
if d != degree:
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
ZZ_pEX_reverse_hi(r.x, (<Polynomial_ZZ_pEX> self).x, d)
else:
Expand Down

0 comments on commit c01ed87

Please sign in to comment.