Skip to content

Commit c01ed87

Browse files
author
Release Manager
committed
gh-37201: Fix univariate polynomial reverse 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
2 parents 3212df1 + 9f15f69 commit c01ed87

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed

src/sage/matrix/matrix_polynomial_dense.pyx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ cdef class Matrix_polynomial_dense(Matrix_generic_dense):
675675
sage: M.reverse([2,3,-1])
676676
Traceback (most recent call last):
677677
...
678-
OverflowError: can't convert negative value to unsigned long
678+
ValueError: degree argument must be a non-negative integer, got -1
679679
680680
.. SEEALSO::
681681

src/sage/rings/polynomial/polynomial_element.pyx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7672,9 +7672,11 @@ cdef class Polynomial(CommutativePolynomial):
76727672

76737673
cdef unsigned long d
76747674
if degree is not None:
7675+
if degree < 0:
7676+
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
76757677
d = degree
76767678
if d != degree:
7677-
raise ValueError("degree argument must be a non-negative integer, got %s"%(degree))
7679+
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
76787680
if len(v) < degree+1:
76797681
v.reverse()
76807682
v = [self.base_ring().zero()]*(degree+1-len(v)) + v

src/sage/rings/polynomial/polynomial_integer_dense_flint.pyx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1827,9 +1827,11 @@ cdef class Polynomial_integer_dense_flint(Polynomial):
18271827
cdef Polynomial_integer_dense_flint res = self._new()
18281828
cdef unsigned long d
18291829
if degree is not None:
1830+
if degree < 0:
1831+
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
18301832
d = degree
18311833
if d != degree:
1832-
raise ValueError("degree argument must be a non-negative integer, got %s" % degree)
1834+
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
18331835
# FLINT expects length
18341836
fmpz_poly_reverse(res._poly, self._poly, d+1)
18351837
else:

src/sage/rings/polynomial/polynomial_zmod_flint.pyx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,9 +815,11 @@ cdef class Polynomial_zmod_flint(Polynomial_template):
815815
cdef Polynomial_zmod_flint res = self._new()
816816
cdef unsigned long d
817817
if degree is not None:
818+
if degree < 0:
819+
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
818820
d = degree
819821
if d != degree:
820-
raise ValueError("degree argument must be a non-negative integer, got %s"%(degree))
822+
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
821823
nmod_poly_reverse(&res.x, &self.x, d+1) # FLINT expects length
822824
else:
823825
nmod_poly_reverse(&res.x, &self.x, nmod_poly_length(&self.x))

src/sage/rings/polynomial/polynomial_zz_pex.pyx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -513,13 +513,18 @@ cdef class Polynomial_ZZ_pEX(Polynomial_template):
513513
sage: f.reverse(degree=200)
514514
2*x^200 + 3*x^199 + 5*x^198 + 7*x^197 + 11*x^196 + 13*x^195 + 17*x^194 + 19*x^193
515515
sage: f.reverse(degree=0)
516-
Traceback (most recent call last):
517-
...
518-
ValueError: degree argument must be a non-negative integer, got 0
516+
2
519517
sage: f.reverse(degree=-5)
520518
Traceback (most recent call last):
521519
...
522520
ValueError: degree argument must be a non-negative integer, got -5
521+
522+
Check that this implementation is compatible with the generic one::
523+
524+
sage: p = R([0,1,0,2])
525+
sage: all(p.reverse(d) == Polynomial.reverse(p, d)
526+
....: for d in [None, 0, 1, 2, 3, 4])
527+
True
523528
"""
524529
self._parent._modulus.restore()
525530

@@ -533,11 +538,10 @@ cdef class Polynomial_ZZ_pEX(Polynomial_template):
533538
# When a degree has been supplied, ensure it is a valid input
534539
cdef unsigned long d
535540
if degree is not None:
536-
if degree <= 0:
541+
if degree < 0:
537542
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
538-
try:
539-
d = degree
540-
except ValueError:
543+
d = degree
544+
if d != degree:
541545
raise ValueError("degree argument must be a non-negative integer, got %s" % (degree))
542546
ZZ_pEX_reverse_hi(r.x, (<Polynomial_ZZ_pEX> self).x, d)
543547
else:

0 commit comments

Comments
 (0)