Skip to content

Commit b93a5c5

Browse files
committed
Sort factors in fq_default_poly.factor
1 parent aaf3ab6 commit b93a5c5

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

src/flint/types/fq_default_poly.pxd

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from flint.flintlib.functions.fq_default_poly cimport *
22
from flint.flintlib.functions.fq_default_poly_factor cimport *
3-
from flint.flintlib.functions.fq_default cimport fq_default_neg
3+
from flint.flintlib.functions.fq_default cimport (
4+
fq_default_neg,
5+
fq_default_get_coeff_fmpz,
6+
)
47

58
from flint.flint_base.flint_base cimport flint_poly
69
from flint.types.fq_default cimport fq_default_ctx

src/flint/types/fq_default_poly.pyx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
cimport cython
12
from cpython.list cimport PyList_GET_SIZE
23
from flint.flint_base.flint_base cimport flint_poly
34

@@ -243,6 +244,55 @@ cdef class fq_default_poly_ctx:
243244
return fq_default_poly(val, self)
244245

245246

247+
@cython.final
248+
@cython.no_gc
249+
cdef class _fq_default_poly_sort_key:
250+
cdef fq_default_poly p
251+
cdef ulong mult
252+
cdef slong len
253+
254+
def __init__(self, tuple fac_m):
255+
self.p = fac_m[0]
256+
self.len = fq_default_poly_length(self.p.val, self.p.ctx.field.val)
257+
self.mult = fac_m[1]
258+
259+
def __lt__(k1, _fq_default_poly_sort_key k2):
260+
cdef slong i, j, d
261+
cdef fq_default c1, c2
262+
cdef fmpz z1, z2
263+
cdef fq_default_ctx field
264+
265+
if k1.len != k2.len:
266+
return k1.len < k2.len
267+
elif k1.mult != k2.mult:
268+
return k1.mult < k2.mult
269+
270+
field = k1.p.ctx.field
271+
d = field.degree()
272+
z1 = fmpz()
273+
z2 = fmpz()
274+
c1 = field.zero()
275+
c2 = field.zero()
276+
277+
i = k1.len
278+
while i >= 0:
279+
i -= 1
280+
fq_default_poly_get_coeff(c1.val, k1.p.val, i, field.val)
281+
fq_default_poly_get_coeff(c2.val, k2.p.val, i, field.val)
282+
if c1 != c2:
283+
j = d
284+
while j >= 0:
285+
j -= 1
286+
fq_default_get_coeff_fmpz(z1.val, c1.val, j, field.val)
287+
fq_default_get_coeff_fmpz(z2.val, c2.val, j, field.val)
288+
if z1 != z2:
289+
return z1 < z2
290+
else:
291+
raise RuntimeError("Bad cmp in _fq_default_poly_sort_key!")
292+
else:
293+
raise RuntimeError("Bad cmp in _fq_default_poly_sort_key!")
294+
295+
246296
cdef class fq_default_poly(flint_poly):
247297
"""
248298
The *fq_default_poly* type represents univariate polynomials
@@ -1502,6 +1552,9 @@ cdef class fq_default_poly(flint_poly):
15021552
fq_default_poly_factor_get_poly(u.val, fac, i, self.ctx.field.val)
15031553
exp = fq_default_poly_factor_exp(fac, i, self.ctx.field.val)
15041554
res[i] = (u, exp)
1555+
1556+
res.sort(key=_fq_default_poly_sort_key)
1557+
15051558
return self.leading_coefficient(), res
15061559

15071560
def factor(self):
@@ -1536,6 +1589,9 @@ cdef class fq_default_poly(flint_poly):
15361589
fq_default_poly_factor_get_poly(u.val, fac, i, self.ctx.field.val)
15371590
exp = fq_default_poly_factor_exp(fac, i, self.ctx.field.val)
15381591
res[i] = (u, exp)
1592+
1593+
res.sort(key=_fq_default_poly_sort_key)
1594+
15391595
return self.leading_coefficient(), res
15401596

15411597
def roots(self, multiplicities=True):

0 commit comments

Comments
 (0)