From f375de9fb734d370ca149b7871855d80ea5bd6ae Mon Sep 17 00:00:00 2001 From: Oscar Benjamin Date: Sat, 27 Jun 2026 13:47:09 +0100 Subject: [PATCH 1/3] nit: fix new cython-lint (0.21.0) complaints --- src/flint/types/acb.pyx | 2 +- src/flint/types/acb_mat.pyx | 2 +- src/flint/types/acb_poly.pyx | 4 ++-- src/flint/types/arb_poly.pyx | 2 +- src/flint/types/fmpz_mod_mpoly.pyx | 4 ++-- src/flint/types/fmpz_mpoly.pyx | 4 ++-- src/flint/types/nmod_mpoly.pyx | 4 ++-- src/flint/types/nmod_poly.pyx | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/flint/types/acb.pyx b/src/flint/types/acb.pyx index 3a9758fb..9f54b207 100644 --- a/src/flint/types/acb.pyx +++ b/src/flint/types/acb.pyx @@ -2603,7 +2603,7 @@ cdef class acb(flint_scalar): n = fmpz(n) if n < 1 or num < 0: raise ValueError("require n >= 1 and num >= 0") - v = [acb() for i in range(num)] + v = [acb() for _ in range(num)] w = libc.stdlib.malloc(num * cython.sizeof(acb_struct)) for i in range(num): w[i] = ((v[i])).val[0] diff --git a/src/flint/types/acb_mat.pyx b/src/flint/types/acb_mat.pyx index ae65fe71..84fe4fb8 100644 --- a/src/flint/types/acb_mat.pyx +++ b/src/flint/types/acb_mat.pyx @@ -810,7 +810,7 @@ cdef class acb_mat(flint_mat): raise ValueError("failed to isolate eigenvalues (try higher prec, multiple=True for multiple eigenvalues, or nonstop=True to avoid the exception)") if tol is not None: mag_clear(tolm) - Elist = [acb() for i in range(n)] + Elist = [acb() for _ in range(n)] for i in range(n): acb_swap(((Elist [i])).val, acb_mat_entry(E.val, 0, i)) if not left and not right: diff --git a/src/flint/types/acb_poly.pyx b/src/flint/types/acb_poly.pyx index dc4a87a2..dbd78939 100644 --- a/src/flint/types/acb_poly.pyx +++ b/src/flint/types/acb_poly.pyx @@ -140,7 +140,7 @@ cdef class acb_poly(flint_poly): n = len(xs) if n == 0: return [] - ys = [acb.__new__(acb) for i in range(n)] + ys = [acb.__new__(acb) for _ in range(n)] xsv = libc.stdlib.malloc(sizeof(acb_struct) * n) ysv = libc.stdlib.malloc(sizeof(acb_struct) * n) for i in range(n): @@ -492,7 +492,7 @@ cdef class acb_poly(flint_poly): raise ValueError("roots() failed to converge: insufficient precision, or squareful input") _acb_vec_sort_pretty(roots, deg) - pyroots = [acb.__new__(acb) for i in range(deg)] + pyroots = [acb.__new__(acb) for _ in range(deg)] for i in range(deg): acb_set(((pyroots[i])).val, &roots[i]) diff --git a/src/flint/types/arb_poly.pyx b/src/flint/types/arb_poly.pyx index de94f1ff..2c26ba6b 100644 --- a/src/flint/types/arb_poly.pyx +++ b/src/flint/types/arb_poly.pyx @@ -138,7 +138,7 @@ cdef class arb_poly(flint_poly): n = len(xs) if n == 0: return [] - ys = [arb.__new__(arb) for i in range(n)] + ys = [arb.__new__(arb) for _ in range(n)] xsv = libc.stdlib.malloc(sizeof(arb_struct) * n) ysv = libc.stdlib.malloc(sizeof(arb_struct) * n) for i in range(n): diff --git a/src/flint/types/fmpz_mod_mpoly.pyx b/src/flint/types/fmpz_mod_mpoly.pyx index 913028ce..54c55267 100644 --- a/src/flint/types/fmpz_mod_mpoly.pyx +++ b/src/flint/types/fmpz_mod_mpoly.pyx @@ -206,7 +206,7 @@ cdef class fmpz_mod_mpoly_ctx(flint_mod_mpoly_context): """ cdef: fmpz_vec exp_vec - slong i, nvars = self.nvars() + slong nvars = self.nvars() fmpz_mod_mpoly res if not isinstance(d, dict): @@ -214,7 +214,7 @@ cdef class fmpz_mod_mpoly_ctx(flint_mod_mpoly_context): res = create_fmpz_mod_mpoly(self) - for i, (exps, coeff) in enumerate(d.items()): + for exps, coeff in d.items(): if len(exps) != nvars: raise ValueError(f"expected {nvars} exponents, got {len(exps)}") elif not coeff: diff --git a/src/flint/types/fmpz_mpoly.pyx b/src/flint/types/fmpz_mpoly.pyx index a4f11308..5ed6b5a0 100644 --- a/src/flint/types/fmpz_mpoly.pyx +++ b/src/flint/types/fmpz_mpoly.pyx @@ -187,7 +187,7 @@ cdef class fmpz_mpoly_ctx(flint_mpoly_context): """ cdef: fmpz_vec exp_vec - slong i, nvars = self.nvars() + slong nvars = self.nvars() fmpz_mpoly res if not isinstance(d, dict): @@ -195,7 +195,7 @@ cdef class fmpz_mpoly_ctx(flint_mpoly_context): res = create_fmpz_mpoly(self) - for i, (k, v) in enumerate(d.items()): + for k, v in d.items(): o = any_as_fmpz(v) if o is NotImplemented: raise TypeError(f"cannot coerce coefficient '{v}' to fmpz") diff --git a/src/flint/types/nmod_mpoly.pyx b/src/flint/types/nmod_mpoly.pyx index 8abbc5c4..e4633dd2 100644 --- a/src/flint/types/nmod_mpoly.pyx +++ b/src/flint/types/nmod_mpoly.pyx @@ -194,7 +194,7 @@ cdef class nmod_mpoly_ctx(flint_mod_mpoly_context): """ cdef: fmpz_vec exp_vec - slong i, nvars = self.nvars() + slong nvars = self.nvars() nmod_mpoly res if not isinstance(d, dict): @@ -202,7 +202,7 @@ cdef class nmod_mpoly_ctx(flint_mod_mpoly_context): res = create_nmod_mpoly(self) - for i, (exps, coeff) in enumerate(d.items()): + for exps, coeff in d.items(): if len(exps) != nvars: raise ValueError(f"expected {nvars} exponents, got {len(exps)}") elif not coeff: diff --git a/src/flint/types/nmod_poly.pyx b/src/flint/types/nmod_poly.pyx index 9fc9bd1e..d76f7593 100644 --- a/src/flint/types/nmod_poly.pyx +++ b/src/flint/types/nmod_poly.pyx @@ -187,7 +187,7 @@ cdef class nmod_poly(flint_poly): cdef mp_limb_t m n = self.length() m = self.modulus() - L = [nmod(0, m) for i in range(n)] # XXX: speed up + L = [nmod(0, m) for _ in range(n)] # XXX: speed up for i from 0 <= i < n: ((L[i])).val = nmod_poly_get_coeff_ui(self.val, i) return L From a648a451647affda280a820bf9ccc91f1370ca97 Mon Sep 17 00:00:00 2001 From: Oscar Benjamin Date: Sat, 27 Jun 2026 15:02:40 +0100 Subject: [PATCH 2/3] Fix mpoly deflation methods to return list[int] Previously they returned list[fmpz] which was inconsistent with the stated type annotations. --- src/flint/test/test_fmpz_vec.py | 9 +++++++++ src/flint/types/fmpq_mpoly.pyx | 6 +++--- src/flint/types/fmpz_mod_mpoly.pyx | 6 +++--- src/flint/types/fmpz_mpoly.pyx | 6 +++--- src/flint/types/fmpz_vec.pyi | 1 + src/flint/types/fmpz_vec.pyx | 8 +++++++- src/flint/types/nmod_mpoly.pyx | 6 +++--- 7 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/flint/test/test_fmpz_vec.py b/src/flint/test/test_fmpz_vec.py index c64f8784..d9b73740 100644 --- a/src/flint/test/test_fmpz_vec.py +++ b/src/flint/test/test_fmpz_vec.py @@ -28,6 +28,15 @@ def test_fmpz_vec_construct_int_and_iter() -> None: assert repr(w) == "fmpz_vec(['4', '5', '6'], 3)" +def test_fmpz_vec_to_list_int() -> None: + assert fmpz_vec(0).to_list_int() == [] + + v = fmpz_vec([1, fmpz(2), -3, 2**80]) + values = v.to_list_int() + assert values == [1, 2, -3, 2**80] + assert all(type(x) is int for x in values) + + def test_fmpz_vec_double_indirect_and_errors() -> None: v = fmpz_vec(2, double_indirect=True) v[0] = 10 diff --git a/src/flint/types/fmpq_mpoly.pyx b/src/flint/types/fmpq_mpoly.pyx index 099189af..c00160b8 100644 --- a/src/flint/types/fmpq_mpoly.pyx +++ b/src/flint/types/fmpq_mpoly.pyx @@ -1058,7 +1058,7 @@ cdef class fmpq_mpoly(flint_mpoly): fmpz_mpoly_deflate(res.val.zpoly, self.val.zpoly, shift.val, stride.val, self.ctx.val.zctx) fmpq_set(res.val.content, self.val.content) - return res, list(stride) + return res, stride.to_list_int() def deflation_monom(self) -> tuple[fmpq_mpoly, list[int], fmpq_mpoly]: """ @@ -1087,7 +1087,7 @@ cdef class fmpq_mpoly(flint_mpoly): fmpz_mpoly_deflate(res.val.zpoly, self.val.zpoly, shift.val, stride.val, self.ctx.val.zctx) fmpq_set(res.val.content, self.val.content) - return res, list(stride), monom + return res, stride.to_list_int(), monom def deflation_index(self) -> tuple[list[int], list[int]]: """ @@ -1118,7 +1118,7 @@ cdef class fmpq_mpoly(flint_mpoly): fmpz_vec stride = fmpz_vec(nvars) fmpz_mpoly_deflation(shift.val, stride.val, self.val.zpoly, self.ctx.val.zctx) - return list(stride), list(shift) + return stride.to_list_int(), shift.to_list_int() cdef _compose_gens_(self, ctx, slong *mapping): cdef fmpq_mpoly res = create_fmpq_mpoly(ctx) diff --git a/src/flint/types/fmpz_mod_mpoly.pyx b/src/flint/types/fmpz_mod_mpoly.pyx index 54c55267..a66dd219 100644 --- a/src/flint/types/fmpz_mod_mpoly.pyx +++ b/src/flint/types/fmpz_mod_mpoly.pyx @@ -1054,7 +1054,7 @@ cdef class fmpz_mod_mpoly(flint_mpoly): fmpz_mod_mpoly_deflate(res.val, self.val, shift.val, stride.val, self.ctx.val) - return res, list(stride) + return res, stride.to_list_int() def deflation_monom(self) -> tuple[fmpz_mod_mpoly, list[int], fmpz_mod_mpoly]: """ @@ -1082,7 +1082,7 @@ cdef class fmpz_mod_mpoly(flint_mpoly): fmpz_mod_mpoly_push_term_ui_ffmpz(monom.val, 1, fmpz_vec(shift).val, self.ctx.val) fmpz_mod_mpoly_deflate(res.val, self.val, shift.val, stride.val, self.ctx.val) - return res, list(stride), monom + return res, stride.to_list_int(), monom def deflation_index(self) -> tuple[list[int], list[int]]: """ @@ -1113,7 +1113,7 @@ cdef class fmpz_mod_mpoly(flint_mpoly): fmpz_vec stride = fmpz_vec(nvars) fmpz_mod_mpoly_deflation(shift.val, stride.val, self.val, self.ctx.val) - return list(stride), list(shift) + return stride.to_list_int(), shift.to_list_int() cdef _compose_gens_(self, ctx, slong *mapping): # FIXME: Remove this when FLINT < 3.2 is dropped diff --git a/src/flint/types/fmpz_mpoly.pyx b/src/flint/types/fmpz_mpoly.pyx index 5ed6b5a0..4e797fa8 100644 --- a/src/flint/types/fmpz_mpoly.pyx +++ b/src/flint/types/fmpz_mpoly.pyx @@ -1136,7 +1136,7 @@ cdef class fmpz_mpoly(flint_mpoly): fmpz_mpoly_deflate(res.val, self.val, shift.val, stride.val, self.ctx.val) - return res, list(stride) + return res, stride.to_list_int() def deflation_monom(self) -> tuple[fmpz_mpoly, list[int], fmpz_mpoly]: """ @@ -1164,7 +1164,7 @@ cdef class fmpz_mpoly(flint_mpoly): fmpz_mpoly_push_term_ui_ffmpz(monom.val, 1, fmpz_vec(shift).val, self.ctx.val) fmpz_mpoly_deflate(res.val, self.val, shift.val, stride.val, self.ctx.val) - return res, list(stride), monom + return res, stride.to_list_int(), monom def deflation_index(self) -> tuple[list[int], list[int]]: """ @@ -1195,7 +1195,7 @@ cdef class fmpz_mpoly(flint_mpoly): fmpz_vec stride = fmpz_vec(nvars) fmpz_mpoly_deflation(shift.val, stride.val, self.val, self.ctx.val) - return list(stride), list(shift) + return stride.to_list_int(), shift.to_list_int() @cython.final diff --git a/src/flint/types/fmpz_vec.pyi b/src/flint/types/fmpz_vec.pyi index e76b3f78..66b5c945 100644 --- a/src/flint/types/fmpz_vec.pyi +++ b/src/flint/types/fmpz_vec.pyi @@ -15,6 +15,7 @@ class fmpz_vec: def __len__(self) -> int: ... def __iter__(self) -> Iterator[fmpz]: ... + def to_list_int(self) -> list[int]: ... def str(self, *args: object) -> _str: ... def repr(self, *args: object) -> _str: ... diff --git a/src/flint/types/fmpz_vec.pyx b/src/flint/types/fmpz_vec.pyx index b7167061..cfb2a29b 100644 --- a/src/flint/types/fmpz_vec.pyx +++ b/src/flint/types/fmpz_vec.pyx @@ -2,7 +2,7 @@ from flint.flintlib.functions.fmpz cimport fmpz_struct, fmpz_set, fmpz_init_set from flint.flintlib.functions.fmpz_vec cimport _fmpz_vec_init, _fmpz_vec_clear from libc.stdint cimport SIZE_MAX -from flint.types.fmpz cimport fmpz, any_as_fmpz +from flint.types.fmpz cimport fmpz, any_as_fmpz, fmpz_get_intlong cimport libc.stdlib @@ -81,6 +81,12 @@ cdef class fmpz_vec: fmpz_init_set(z.val, &self.val[i]) yield z + def to_list_int(self): + cdef list res = [None] * self.length + for i in range(self.length): + res[i] = fmpz_get_intlong(&self.val[i]) + return res + def str(self, *args): s = [None] * self.length for i in range(self.length): diff --git a/src/flint/types/nmod_mpoly.pyx b/src/flint/types/nmod_mpoly.pyx index e4633dd2..9857d7a5 100644 --- a/src/flint/types/nmod_mpoly.pyx +++ b/src/flint/types/nmod_mpoly.pyx @@ -1019,7 +1019,7 @@ cdef class nmod_mpoly(flint_mpoly): nmod_mpoly_deflate(res.val, self.val, shift.val, stride.val, self.ctx.val) - return res, list(stride) + return res, stride.to_list_int() def deflation_monom(self) -> tuple[nmod_mpoly, list[int], nmod_mpoly]: """ @@ -1047,7 +1047,7 @@ cdef class nmod_mpoly(flint_mpoly): nmod_mpoly_push_term_ui_ffmpz(monom.val, 1, fmpz_vec(shift).val, self.ctx.val) nmod_mpoly_deflate(res.val, self.val, shift.val, stride.val, self.ctx.val) - return res, list(stride), monom + return res, stride.to_list_int(), monom def deflation_index(self) -> tuple[list[int], list[int]]: """ @@ -1078,7 +1078,7 @@ cdef class nmod_mpoly(flint_mpoly): fmpz_vec stride = fmpz_vec(nvars) nmod_mpoly_deflation(shift.val, stride.val, self.val, self.ctx.val) - return list(stride), list(shift) + return stride.to_list_int(), shift.to_list_int() cdef _compose_gens_(self, ctx, slong *mapping): cdef nmod_mpoly res = create_nmod_mpoly(ctx) From 1496e52fed1672f0c61a81a774eeb08945d7bb2e Mon Sep 17 00:00:00 2001 From: Oscar Benjamin Date: Sat, 27 Jun 2026 15:06:42 +0100 Subject: [PATCH 3/3] acb: skip flakey doctest --- src/flint/types/acb.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flint/types/acb.pyx b/src/flint/types/acb.pyx index 9f54b207..3507137a 100644 --- a/src/flint/types/acb.pyx +++ b/src/flint/types/acb.pyx @@ -1975,7 +1975,7 @@ cdef class acb(flint_scalar): iterable *vec*. The output is a list of *acb* entries. If *inverse* is True, computes the inverse transform instead. - >>> for c in acb.dft(acb.dft(range(1,12)), inverse=True): + >>> for c in acb.dft(acb.dft(range(1,12)), inverse=True): # doctest: +SKIP ... print(c) ... [1.000000000000 +/- 1.06e-13] + [+/- 8.66e-14]j