|
| 1 | +cimport cython |
1 | 2 | from cpython.list cimport PyList_GET_SIZE |
2 | 3 | from flint.flint_base.flint_base cimport flint_poly |
3 | 4 |
|
@@ -243,6 +244,55 @@ cdef class fq_default_poly_ctx: |
243 | 244 | return fq_default_poly(val, self) |
244 | 245 |
|
245 | 246 |
|
| 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 | + |
246 | 296 | cdef class fq_default_poly(flint_poly): |
247 | 297 | """ |
248 | 298 | The *fq_default_poly* type represents univariate polynomials |
@@ -1502,6 +1552,9 @@ cdef class fq_default_poly(flint_poly): |
1502 | 1552 | fq_default_poly_factor_get_poly(u.val, fac, i, self.ctx.field.val) |
1503 | 1553 | exp = fq_default_poly_factor_exp(fac, i, self.ctx.field.val) |
1504 | 1554 | res[i] = (u, exp) |
| 1555 | + |
| 1556 | + res.sort(key=_fq_default_poly_sort_key) |
| 1557 | + |
1505 | 1558 | return self.leading_coefficient(), res |
1506 | 1559 |
|
1507 | 1560 | def factor(self): |
@@ -1536,6 +1589,9 @@ cdef class fq_default_poly(flint_poly): |
1536 | 1589 | fq_default_poly_factor_get_poly(u.val, fac, i, self.ctx.field.val) |
1537 | 1590 | exp = fq_default_poly_factor_exp(fac, i, self.ctx.field.val) |
1538 | 1591 | res[i] = (u, exp) |
| 1592 | + |
| 1593 | + res.sort(key=_fq_default_poly_sort_key) |
| 1594 | + |
1539 | 1595 | return self.leading_coefficient(), res |
1540 | 1596 |
|
1541 | 1597 | def roots(self, multiplicities=True): |
|
0 commit comments