1+ cimport cython
2+
3+ from flint.flintlib.types.flint cimport ulong
4+
15from flint.flint_base.flint_base cimport (
26 flint_mpoly,
37 flint_mpoly_context,
@@ -874,9 +878,9 @@ cdef class fmpz_mpoly(flint_mpoly):
874878 >>> p1 = Zm("2*x + 4", ctx)
875879 >>> p2 = Zm("3*x*z + 3*x + 3*z + 3", ctx)
876880 >>> (p1 * p2).factor()
877- (6, [(z + 1, 1), (x + 2 , 1), (x + 1 , 1)])
881+ (6, [(z + 1, 1), (x + 1 , 1), (x + 2 , 1)])
878882 >>> (p2 * p1 * p2).factor()
879- (18, [(z + 1, 2 ), (x + 2, 1 ), (x + 1, 2)])
883+ (18, [(x + 2, 1 ), (z + 1, 2 ), (x + 1, 2)])
880884 """
881885 cdef:
882886 fmpz_mpoly_factor_t fac
@@ -900,6 +904,9 @@ cdef class fmpz_mpoly(flint_mpoly):
900904 c = fmpz.__new__ (fmpz)
901905 fmpz_set((< fmpz> c).val, fac.constant)
902906 fmpz_mpoly_factor_clear(fac, self .ctx.val)
907+
908+ res.sort(key = _fmpz_mpoly_sort_key)
909+
903910 return c, res
904911
905912 def factor_squarefree (self ):
@@ -1191,6 +1198,35 @@ cdef class fmpz_mpoly(flint_mpoly):
11911198 return list(stride ), list(shift )
11921199
11931200
1201+ @cython.final
1202+ @cython.no_gc
1203+ cdef class _fmpz_mpoly_sort_key:
1204+ cdef fmpz_mpoly p
1205+ cdef ulong mult
1206+
1207+ def __init__(self , tuple fac_m ):
1208+ self .p = fac_m[0 ]
1209+ self .mult = fac_m[1 ]
1210+
1211+ def __lt__ (k1 , _fmpz_mpoly_sort_key k2 ):
1212+ cdef slong nterms
1213+ cdef tuple monom1, monom2
1214+ cdef int coeff1, coeff2
1215+ if k1.mult != k2.mult:
1216+ return k1.mult < k2.mult
1217+ nterms = min (k1.p.val.length, k2.p.val.length)
1218+ for i in range (nterms):
1219+ monom1 = k1.p.monomial(i)
1220+ monom2 = k2.p.monomial(i)
1221+ if monom1 != monom2:
1222+ return monom1 < monom2
1223+ coeff1 = int (k1.p.coefficient(i))
1224+ coeff2 = int (k2.p.coefficient(i))
1225+ if coeff1 != coeff2:
1226+ return coeff1 < coeff2
1227+ return k1.p.val.length < k2.p.val.length
1228+
1229+
11941230cdef class fmpz_mpoly_vec:
11951231 """
11961232 A class representing a vector of fmpz_mpolys.
0 commit comments