Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Begin adding fmpz_mod_poly #87

Merged
merged 36 commits into from
Oct 1, 2023
Merged
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
fea7def
Begin adding fmpz_mod_poly
GiacomoPope Sep 20, 2023
6b1611a
Modify methods for contexts
GiacomoPope Sep 20, 2023
6797150
Add conversion and comparison functions
GiacomoPope Sep 21, 2023
e6b28d4
Start work on factor; bug
GiacomoPope Sep 21, 2023
4e64490
Monic, Leading Coefficent and Factor
GiacomoPope Sep 21, 2023
36724e3
More progress, but badly unittested currently
GiacomoPope Sep 21, 2023
0a84867
Add additional bool to check if modulus is prime on init
GiacomoPope Sep 22, 2023
6122937
Continue adding functions and docstrings
GiacomoPope Sep 22, 2023
4827066
Address review, add random elements and further methods and docstrings
GiacomoPope Sep 22, 2023
00b87f5
Add more functions to fmpz_mod_poly, also add is_unit to fmpz_mod
GiacomoPope Sep 22, 2023
a3fec08
Add a few more functions, coverage currently at 22%
GiacomoPope Sep 26, 2023
586307a
include new types to docstring tests
GiacomoPope Sep 26, 2023
b2e2894
Ensure 100% coverage of fmpz_mod, fix docstring test bugs, fmpz_mod_p…
GiacomoPope Sep 26, 2023
b060b23
Add base class docstrings
GiacomoPope Sep 27, 2023
c30ad7a
Improve docstrings and get coverage to 100%
GiacomoPope Sep 27, 2023
a2a7c1f
Include fmpz_mod_poly into documentation:
GiacomoPope Sep 27, 2023
857ee26
Address first round of comments from the review
GiacomoPope Sep 27, 2023
9cabaa2
Add a custom, DomainError, Exception
GiacomoPope Sep 27, 2023
024a09c
Improve based off feedback and add additional functions
GiacomoPope Sep 27, 2023
9a01c5d
Begin adding Berlekamp-Massey algorithm
GiacomoPope Sep 27, 2023
87a77b7
Add minpoly, remove BM, problems with multipoint eval
GiacomoPope Sep 28, 2023
85f82a4
Fix stupid copy paste bug
GiacomoPope Sep 28, 2023
428bece
Add support for vec types
GiacomoPope Sep 29, 2023
bc85cd3
Clean up set_any function and improve memory management
GiacomoPope Sep 29, 2023
cb60fe7
Add tests
GiacomoPope Sep 29, 2023
e57a071
Merge branch 'master' into add_fmpz_mod_poly
GiacomoPope Sep 29, 2023
69b2e50
Address bug from merging in test. Rename shift and (in/de)flation fun…
GiacomoPope Sep 29, 2023
a793997
Include new type into generic test, but with some TODO
GiacomoPope Sep 29, 2023
8fd39d1
Address TODO in tests and modify how _div_ works
GiacomoPope Sep 29, 2023
3614a42
Hacky fix for memory?
GiacomoPope Sep 29, 2023
9dfd197
Simplify init function
GiacomoPope Sep 30, 2023
1945859
better handling of dealloc
GiacomoPope Sep 30, 2023
57b8346
Add new poly method to context
GiacomoPope Sep 30, 2023
6a3b447
Return to 100% coverage
GiacomoPope Sep 30, 2023
52dee64
Forgot to push test commit
GiacomoPope Sep 30, 2023
b2543b4
Fix docstring types and initalise int type
GiacomoPope Oct 1, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions doc/source/fmpz_mod_poly.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
**fmpz_mod_poly** -- polynomials over integers mod n
===============================================================================

.. autoclass :: flint.fmpz_mod_poly_ctx
:members:
:inherited-members:
:undoc-members:

.. autoclass :: flint.fmpz_mod_poly
:members:
:inherited-members:
:undoc-members:

1 change: 1 addition & 0 deletions doc/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ Polynomial types
fmpz_poly.rst
fmpq_poly.rst
nmod_poly.rst
fmpz_mod_poly.rst
arb_poly.rst
acb_poly.rst

Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
("flint.types.acb_series", ["src/flint/types/acb_series.pyx"]),
("flint.types.fmpz_mpoly", ["src/flint/types/fmpz_mpoly.pyx"]),
("flint.types.fmpz_mod", ["src/flint/types/fmpz_mod.pyx"]),
("flint.types.fmpz_mod_poly", ["src/flint/types/fmpz_mod_poly.pyx"]),
("flint.types.dirichlet", ["src/flint/types/dirichlet.pyx"]),
("flint.flint_base.flint_base", ["src/flint/flint_base/flint_base.pyx"]),
("flint.flint_base.flint_context", ["src/flint/flint_base/flint_context.pyx"]),
Expand Down
1 change: 1 addition & 0 deletions src/flint/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from .types.acb_series import *
from .types.fmpz_mpoly import *
from .types.fmpz_mod import *
from .types.fmpz_mod_poly import *
from .types.dirichlet import *
from .functions.showgood import showgood

Expand Down
8 changes: 8 additions & 0 deletions src/flint/flint_base/flint_base.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ cdef class flint_poly(flint_elem):
yield self[i]

def coeffs(self):
"""
Returns the coefficients of ``self`` as a list

>>> from flint import fmpz_poly
>>> f = fmpz_poly([1,2,3,4,5])
>>> f.coeffs()
[1, 2, 3, 4, 5]
"""
return list(self)

def str(self, bint ascending=False):
Expand Down
339 changes: 339 additions & 0 deletions src/flint/flintlib/fmpz_mod_poly.pxd

Large diffs are not rendered by default.

46 changes: 46 additions & 0 deletions src/flint/flintlib/fmpz_mod_poly_factor.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from flint.flintlib.flint cimport fmpz_struct, slong, flint_rand_t
from flint.flintlib.fmpz cimport fmpz_t
from flint.flintlib.fmpz_mod cimport fmpz_mod_ctx_t
from flint.flintlib.fmpz_factor cimport fmpz_factor_t
from flint.flintlib.fmpz_mod_poly cimport fmpz_mod_poly_struct, fmpz_mod_poly_t

# unimported types {'fmpz_mod_poly_factor_t', 'void', 'fmpz_mod_poly_t'}

cdef extern from "flint/fmpz_mod_poly_factor.h":
ctypedef struct fmpz_mod_poly_factor_struct:
fmpz_mod_poly_struct * poly
slong *exp
slong num
slong alloc
ctypedef fmpz_mod_poly_factor_struct fmpz_mod_poly_factor_t[1]

# Parsed from here
void fmpz_mod_poly_factor_init(fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_clear(fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_realloc(fmpz_mod_poly_factor_t fac, slong alloc, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_fit_length(fmpz_mod_poly_factor_t fac, slong len, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_set(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_print(const fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_insert(fmpz_mod_poly_factor_t fac, const fmpz_mod_poly_t poly, slong exp, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_concat(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_pow(fmpz_mod_poly_factor_t fac, slong exp, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_is_irreducible(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_is_irreducible_ddf(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_is_irreducible_rabin(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_is_irreducible_rabin_f(fmpz_t r, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
int _fmpz_mod_poly_is_squarefree(const fmpz_struct * f, slong len, const fmpz_mod_ctx_t ctx)
int _fmpz_mod_poly_is_squarefree_f(fmpz_t fac, const fmpz_struct * f, slong len, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_is_squarefree(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_is_squarefree_f(fmpz_t fac, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_factor_equal_deg_prob(fmpz_mod_poly_t factor, flint_rand_t state, const fmpz_mod_poly_t pol, slong d, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_equal_deg(fmpz_mod_poly_factor_t factors, const fmpz_mod_poly_t pol, slong d, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_distinct_deg(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, slong * const *degs, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_distinct_deg_threaded(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, slong * const *degs, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_squarefree(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_cantor_zassenhaus(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_kaltofen_shoup(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx)
void fmpz_mod_poly_factor_berlekamp(fmpz_mod_poly_factor_t factors, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_poly_interval_poly_worker(void* arg_ptr)
void fmpz_mod_poly_roots(fmpz_mod_poly_factor_t r, const fmpz_mod_poly_t f, int with_multiplicity, const fmpz_mod_ctx_t ctx)
int fmpz_mod_poly_roots_factored(fmpz_mod_poly_factor_t r, const fmpz_mod_poly_t f, int with_multiplicity, const fmpz_factor_t n, const fmpz_mod_ctx_t ctx)
15 changes: 15 additions & 0 deletions src/flint/flintlib/fmpz_mod_vec.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from flint.flintlib.flint cimport slong, fmpz_struct
from flint.flintlib.fmpz_mod cimport fmpz_mod_ctx_t
from flint.flintlib.fmpz cimport fmpz_t

cdef extern from "flint/fmpz_mod_vec.h":
void _fmpz_mod_vec_set_fmpz_vec(fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_neg(fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_add(fmpz_struct * a, const fmpz_struct * b, const fmpz_struct * c, slong n, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_sub(fmpz_struct * a, const fmpz_struct * b, const fmpz_struct * c, slong n, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_scalar_mul_fmpz_mod(fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_t c, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_scalar_addmul_fmpz_mod(fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_t c, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_scalar_div_fmpz_mod(fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_t c, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_dot(fmpz_t d, const fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_dot_rev(fmpz_t d, const fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_mod_ctx_t ctx)
void _fmpz_mod_vec_mul(fmpz_struct * A, const fmpz_struct * B, const fmpz_struct * C, slong len, const fmpz_mod_ctx_t ctx)
68 changes: 68 additions & 0 deletions src/flint/flintlib/fmpz_vec.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
from flint.flintlib.flint cimport mp_srcptr, flint_bitcnt_t, flint_rand_t, mp_ptr, slong, fmpz_struct, mp_limb_t, ulong
from flint.flintlib.fmpz cimport fmpz_t
from flint.flintlib.nmod cimport nmod_t

cdef extern from "flint/fmpz_vec.h":
fmpz_struct * _fmpz_vec_init(slong len)
void _fmpz_vec_clear(fmpz_struct * vec, slong len)
void _fmpz_vec_randtest(fmpz_struct * f, flint_rand_t state, slong len, flint_bitcnt_t bits)
void _fmpz_vec_randtest_unsigned(fmpz_struct * f, flint_rand_t state, slong len, flint_bitcnt_t bits)
slong _fmpz_vec_max_bits(const fmpz_struct * vec, slong len)
slong _fmpz_vec_max_bits_ref(const fmpz_struct * vec, slong len)
void _fmpz_vec_sum_max_bits(slong * sumabs, slong * maxabs, const fmpz_struct * vec, slong len)
ulong _fmpz_vec_max_limbs(const fmpz_struct * vec, slong len)
void _fmpz_vec_height(fmpz_t height, const fmpz_struct * vec, slong len)
slong _fmpz_vec_height_index(const fmpz_struct * vec, slong len)
# int _fmpz_vec_fread(FILE * file, fmpz_struct ** vec, slong * len)
int _fmpz_vec_read(fmpz_struct ** vec, slong * len)
# int _fmpz_vec_fprint(FILE * file, const fmpz_struct * vec, slong len)
int _fmpz_vec_print(const fmpz_struct * vec, slong len)
void _fmpz_vec_get_nmod_vec(mp_ptr res, const fmpz_struct * poly, slong len, nmod_t mod)
void _fmpz_vec_set_nmod_vec(fmpz_struct * res, mp_srcptr poly, slong len, nmod_t mod)
void _fmpz_vec_get_fft(mp_limb_t ** coeffs_f, const fmpz_struct * coeffs_m, slong l, slong length)
void _fmpz_vec_set_fft(fmpz_struct * coeffs_m, slong length, const mp_ptr * coeffs_f, slong limbs, slong sign)
slong _fmpz_vec_get_d_vec_2exp(double * appv, const fmpz_struct * vec, slong len)
void _fmpz_vec_set(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
void _fmpz_vec_swap(fmpz_struct * vec1, fmpz_struct * vec2, slong len2)
void _fmpz_vec_zero(fmpz_struct * vec, slong len)
void _fmpz_vec_neg(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
void _fmpz_vec_scalar_abs(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
int _fmpz_vec_equal(const fmpz_struct * vec1, const fmpz_struct * vec2, slong len)
int _fmpz_vec_is_zero(const fmpz_struct * vec, slong len)
void _fmpz_vec_max(fmpz_struct * vec1, const fmpz_struct * vec2, const fmpz_struct * vec3, slong len)
void _fmpz_vec_max_inplace(fmpz_struct * vec1, const fmpz_struct * vec2, slong len)
void _fmpz_vec_sort(fmpz_struct * vec, slong len)
void _fmpz_vec_add(fmpz_struct * res, const fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
void _fmpz_vec_sub(fmpz_struct * res, const fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
void _fmpz_vec_scalar_mul_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t x)
void _fmpz_vec_scalar_mul_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
void _fmpz_vec_scalar_mul_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
void _fmpz_vec_scalar_mul_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
void _fmpz_vec_scalar_divexact_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t x)
void _fmpz_vec_scalar_divexact_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
void _fmpz_vec_scalar_divexact_ui(fmpz_struct * vec1, const fmpz_struct * vec2, ulong len2, ulong c)
void _fmpz_vec_scalar_fdiv_q_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t c)
void _fmpz_vec_scalar_fdiv_q_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
void _fmpz_vec_scalar_fdiv_q_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
void _fmpz_vec_scalar_fdiv_q_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
void _fmpz_vec_scalar_fdiv_r_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
void _fmpz_vec_scalar_tdiv_q_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t c)
void _fmpz_vec_scalar_tdiv_q_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
void _fmpz_vec_scalar_tdiv_q_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
void _fmpz_vec_scalar_tdiv_q_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
void _fmpz_vec_scalar_addmul_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
void _fmpz_vec_scalar_addmul_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
void _fmpz_vec_scalar_addmul_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t c)
void _fmpz_vec_scalar_addmul_si_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c, ulong exp)
void _fmpz_vec_scalar_submul_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t x)
void _fmpz_vec_scalar_submul_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
void _fmpz_vec_scalar_submul_si_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c, ulong e)
void _fmpz_vec_sum(fmpz_t res, const fmpz_struct * vec, slong len)
void _fmpz_vec_prod(fmpz_t res, const fmpz_struct * vec, slong len)
void _fmpz_vec_scalar_mod_fmpz(fmpz_struct *res, const fmpz_struct *vec, slong len, const fmpz_t p)
void _fmpz_vec_scalar_smod_fmpz(fmpz_struct *res, const fmpz_struct *vec, slong len, const fmpz_t p)
void _fmpz_vec_content(fmpz_t res, const fmpz_struct * vec, slong len)
void _fmpz_vec_content_chained(fmpz_t res, const fmpz_struct * vec, slong len, const fmpz_t input)
void _fmpz_vec_lcm(fmpz_t res, const fmpz_struct * vec, slong len)
void _fmpz_vec_dot(fmpz_t res, const fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
void _fmpz_vec_dot_ptr(fmpz_t res, const fmpz_struct * vec1, fmpz_struct ** const vec2, slong offset, slong len)
4 changes: 4 additions & 0 deletions src/flint/test/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,14 @@ def run_doctests(verbose=None):
"""Run the python-flint doctests"""
# Here verbose=True shows a lot of output.
modules = [flint.pyflint,
flint.flint_base.flint_base,
flint.flint_base.flint_context,
flint.types.fmpz,
flint.types.fmpz_poly,
flint.types.fmpz_mat,
flint.types.fmpz_series,
flint.types.fmpz_mod,
flint.types.fmpz_mod_poly,
flint.types.fmpq,
flint.types.fmpq_poly,
flint.types.fmpq_mat,
Expand Down
Loading