Skip to content

Commit 98c2883

Browse files
Merge pull request #87 from GiacomoPope/add_fmpz_mod_poly
Begin adding fmpz_mod_poly
2 parents 86f74c6 + b2543b4 commit 98c2883

19 files changed

+2706
-66
lines changed

doc/source/fmpz_mod_poly.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
**fmpz_mod_poly** -- polynomials over integers mod n
2+
===============================================================================
3+
4+
.. autoclass :: flint.fmpz_mod_poly_ctx
5+
:members:
6+
:inherited-members:
7+
:undoc-members:
8+
9+
.. autoclass :: flint.fmpz_mod_poly
10+
:members:
11+
:inherited-members:
12+
:undoc-members:
13+

doc/source/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ Polynomial types
7070
fmpz_poly.rst
7171
fmpq_poly.rst
7272
nmod_poly.rst
73+
fmpz_mod_poly.rst
7374
arb_poly.rst
7475
acb_poly.rst
7576

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
("flint.types.acb_series", ["src/flint/types/acb_series.pyx"]),
9696
("flint.types.fmpz_mpoly", ["src/flint/types/fmpz_mpoly.pyx"]),
9797
("flint.types.fmpz_mod", ["src/flint/types/fmpz_mod.pyx"]),
98+
("flint.types.fmpz_mod_poly", ["src/flint/types/fmpz_mod_poly.pyx"]),
9899
("flint.types.dirichlet", ["src/flint/types/dirichlet.pyx"]),
99100
("flint.flint_base.flint_base", ["src/flint/flint_base/flint_base.pyx"]),
100101
("flint.flint_base.flint_context", ["src/flint/flint_base/flint_context.pyx"]),

src/flint/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from .types.acb_series import *
2323
from .types.fmpz_mpoly import *
2424
from .types.fmpz_mod import *
25+
from .types.fmpz_mod_poly import *
2526
from .types.dirichlet import *
2627
from .functions.showgood import showgood
2728

src/flint/flint_base/flint_base.pyx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ cdef class flint_poly(flint_elem):
2727
yield self[i]
2828

2929
def coeffs(self):
30+
"""
31+
Returns the coefficients of ``self`` as a list
32+
33+
>>> from flint import fmpz_poly
34+
>>> f = fmpz_poly([1,2,3,4,5])
35+
>>> f.coeffs()
36+
[1, 2, 3, 4, 5]
37+
"""
3038
return list(self)
3139

3240
def str(self, bint ascending=False):

src/flint/flintlib/fmpz_mod_poly.pxd

Lines changed: 339 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from flint.flintlib.flint cimport fmpz_struct, slong, flint_rand_t
2+
from flint.flintlib.fmpz cimport fmpz_t
3+
from flint.flintlib.fmpz_mod cimport fmpz_mod_ctx_t
4+
from flint.flintlib.fmpz_factor cimport fmpz_factor_t
5+
from flint.flintlib.fmpz_mod_poly cimport fmpz_mod_poly_struct, fmpz_mod_poly_t
6+
7+
# unimported types {'fmpz_mod_poly_factor_t', 'void', 'fmpz_mod_poly_t'}
8+
9+
cdef extern from "flint/fmpz_mod_poly_factor.h":
10+
ctypedef struct fmpz_mod_poly_factor_struct:
11+
fmpz_mod_poly_struct * poly
12+
slong *exp
13+
slong num
14+
slong alloc
15+
ctypedef fmpz_mod_poly_factor_struct fmpz_mod_poly_factor_t[1]
16+
17+
# Parsed from here
18+
void fmpz_mod_poly_factor_init(fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
19+
void fmpz_mod_poly_factor_clear(fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
20+
void fmpz_mod_poly_factor_realloc(fmpz_mod_poly_factor_t fac, slong alloc, const fmpz_mod_ctx_t ctx)
21+
void fmpz_mod_poly_factor_fit_length(fmpz_mod_poly_factor_t fac, slong len, const fmpz_mod_ctx_t ctx)
22+
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)
23+
void fmpz_mod_poly_factor_print(const fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx)
24+
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)
25+
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)
26+
void fmpz_mod_poly_factor_pow(fmpz_mod_poly_factor_t fac, slong exp, const fmpz_mod_ctx_t ctx)
27+
int fmpz_mod_poly_is_irreducible(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
28+
int fmpz_mod_poly_is_irreducible_ddf(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
29+
int fmpz_mod_poly_is_irreducible_rabin(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
30+
int fmpz_mod_poly_is_irreducible_rabin_f(fmpz_t r, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
31+
int _fmpz_mod_poly_is_squarefree(const fmpz_struct * f, slong len, const fmpz_mod_ctx_t ctx)
32+
int _fmpz_mod_poly_is_squarefree_f(fmpz_t fac, const fmpz_struct * f, slong len, const fmpz_mod_ctx_t ctx)
33+
int fmpz_mod_poly_is_squarefree(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
34+
int fmpz_mod_poly_is_squarefree_f(fmpz_t fac, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
35+
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)
36+
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)
37+
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)
38+
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)
39+
void fmpz_mod_poly_factor_squarefree(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
40+
void fmpz_mod_poly_factor(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
41+
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)
42+
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)
43+
void fmpz_mod_poly_factor_berlekamp(fmpz_mod_poly_factor_t factors, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx)
44+
void _fmpz_mod_poly_interval_poly_worker(void* arg_ptr)
45+
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)
46+
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)

src/flint/flintlib/fmpz_mod_vec.pxd

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from flint.flintlib.flint cimport slong, fmpz_struct
2+
from flint.flintlib.fmpz_mod cimport fmpz_mod_ctx_t
3+
from flint.flintlib.fmpz cimport fmpz_t
4+
5+
cdef extern from "flint/fmpz_mod_vec.h":
6+
void _fmpz_mod_vec_set_fmpz_vec(fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_mod_ctx_t ctx)
7+
void _fmpz_mod_vec_neg(fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_mod_ctx_t ctx)
8+
void _fmpz_mod_vec_add(fmpz_struct * a, const fmpz_struct * b, const fmpz_struct * c, slong n, const fmpz_mod_ctx_t ctx)
9+
void _fmpz_mod_vec_sub(fmpz_struct * a, const fmpz_struct * b, const fmpz_struct * c, slong n, const fmpz_mod_ctx_t ctx)
10+
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)
11+
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)
12+
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)
13+
void _fmpz_mod_vec_dot(fmpz_t d, const fmpz_struct * A, const fmpz_struct * B, slong len, const fmpz_mod_ctx_t ctx)
14+
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)
15+
void _fmpz_mod_vec_mul(fmpz_struct * A, const fmpz_struct * B, const fmpz_struct * C, slong len, const fmpz_mod_ctx_t ctx)

src/flint/flintlib/fmpz_vec.pxd

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from flint.flintlib.flint cimport mp_srcptr, flint_bitcnt_t, flint_rand_t, mp_ptr, slong, fmpz_struct, mp_limb_t, ulong
2+
from flint.flintlib.fmpz cimport fmpz_t
3+
from flint.flintlib.nmod cimport nmod_t
4+
5+
cdef extern from "flint/fmpz_vec.h":
6+
fmpz_struct * _fmpz_vec_init(slong len)
7+
void _fmpz_vec_clear(fmpz_struct * vec, slong len)
8+
void _fmpz_vec_randtest(fmpz_struct * f, flint_rand_t state, slong len, flint_bitcnt_t bits)
9+
void _fmpz_vec_randtest_unsigned(fmpz_struct * f, flint_rand_t state, slong len, flint_bitcnt_t bits)
10+
slong _fmpz_vec_max_bits(const fmpz_struct * vec, slong len)
11+
slong _fmpz_vec_max_bits_ref(const fmpz_struct * vec, slong len)
12+
void _fmpz_vec_sum_max_bits(slong * sumabs, slong * maxabs, const fmpz_struct * vec, slong len)
13+
ulong _fmpz_vec_max_limbs(const fmpz_struct * vec, slong len)
14+
void _fmpz_vec_height(fmpz_t height, const fmpz_struct * vec, slong len)
15+
slong _fmpz_vec_height_index(const fmpz_struct * vec, slong len)
16+
# int _fmpz_vec_fread(FILE * file, fmpz_struct ** vec, slong * len)
17+
int _fmpz_vec_read(fmpz_struct ** vec, slong * len)
18+
# int _fmpz_vec_fprint(FILE * file, const fmpz_struct * vec, slong len)
19+
int _fmpz_vec_print(const fmpz_struct * vec, slong len)
20+
void _fmpz_vec_get_nmod_vec(mp_ptr res, const fmpz_struct * poly, slong len, nmod_t mod)
21+
void _fmpz_vec_set_nmod_vec(fmpz_struct * res, mp_srcptr poly, slong len, nmod_t mod)
22+
void _fmpz_vec_get_fft(mp_limb_t ** coeffs_f, const fmpz_struct * coeffs_m, slong l, slong length)
23+
void _fmpz_vec_set_fft(fmpz_struct * coeffs_m, slong length, const mp_ptr * coeffs_f, slong limbs, slong sign)
24+
slong _fmpz_vec_get_d_vec_2exp(double * appv, const fmpz_struct * vec, slong len)
25+
void _fmpz_vec_set(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
26+
void _fmpz_vec_swap(fmpz_struct * vec1, fmpz_struct * vec2, slong len2)
27+
void _fmpz_vec_zero(fmpz_struct * vec, slong len)
28+
void _fmpz_vec_neg(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
29+
void _fmpz_vec_scalar_abs(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
30+
int _fmpz_vec_equal(const fmpz_struct * vec1, const fmpz_struct * vec2, slong len)
31+
int _fmpz_vec_is_zero(const fmpz_struct * vec, slong len)
32+
void _fmpz_vec_max(fmpz_struct * vec1, const fmpz_struct * vec2, const fmpz_struct * vec3, slong len)
33+
void _fmpz_vec_max_inplace(fmpz_struct * vec1, const fmpz_struct * vec2, slong len)
34+
void _fmpz_vec_sort(fmpz_struct * vec, slong len)
35+
void _fmpz_vec_add(fmpz_struct * res, const fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
36+
void _fmpz_vec_sub(fmpz_struct * res, const fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
37+
void _fmpz_vec_scalar_mul_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t x)
38+
void _fmpz_vec_scalar_mul_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
39+
void _fmpz_vec_scalar_mul_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
40+
void _fmpz_vec_scalar_mul_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
41+
void _fmpz_vec_scalar_divexact_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t x)
42+
void _fmpz_vec_scalar_divexact_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
43+
void _fmpz_vec_scalar_divexact_ui(fmpz_struct * vec1, const fmpz_struct * vec2, ulong len2, ulong c)
44+
void _fmpz_vec_scalar_fdiv_q_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t c)
45+
void _fmpz_vec_scalar_fdiv_q_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
46+
void _fmpz_vec_scalar_fdiv_q_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
47+
void _fmpz_vec_scalar_fdiv_q_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
48+
void _fmpz_vec_scalar_fdiv_r_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
49+
void _fmpz_vec_scalar_tdiv_q_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t c)
50+
void _fmpz_vec_scalar_tdiv_q_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
51+
void _fmpz_vec_scalar_tdiv_q_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
52+
void _fmpz_vec_scalar_tdiv_q_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong exp)
53+
void _fmpz_vec_scalar_addmul_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
54+
void _fmpz_vec_scalar_addmul_ui(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, ulong c)
55+
void _fmpz_vec_scalar_addmul_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t c)
56+
void _fmpz_vec_scalar_addmul_si_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c, ulong exp)
57+
void _fmpz_vec_scalar_submul_fmpz(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, const fmpz_t x)
58+
void _fmpz_vec_scalar_submul_si(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c)
59+
void _fmpz_vec_scalar_submul_si_2exp(fmpz_struct * vec1, const fmpz_struct * vec2, slong len2, slong c, ulong e)
60+
void _fmpz_vec_sum(fmpz_t res, const fmpz_struct * vec, slong len)
61+
void _fmpz_vec_prod(fmpz_t res, const fmpz_struct * vec, slong len)
62+
void _fmpz_vec_scalar_mod_fmpz(fmpz_struct *res, const fmpz_struct *vec, slong len, const fmpz_t p)
63+
void _fmpz_vec_scalar_smod_fmpz(fmpz_struct *res, const fmpz_struct *vec, slong len, const fmpz_t p)
64+
void _fmpz_vec_content(fmpz_t res, const fmpz_struct * vec, slong len)
65+
void _fmpz_vec_content_chained(fmpz_t res, const fmpz_struct * vec, slong len, const fmpz_t input)
66+
void _fmpz_vec_lcm(fmpz_t res, const fmpz_struct * vec, slong len)
67+
void _fmpz_vec_dot(fmpz_t res, const fmpz_struct * vec1, const fmpz_struct * vec2, slong len2)
68+
void _fmpz_vec_dot_ptr(fmpz_t res, const fmpz_struct * vec1, fmpz_struct ** const vec2, slong offset, slong len)

src/flint/test/__main__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,14 @@ def run_doctests(verbose=None):
5252
"""Run the python-flint doctests"""
5353
# Here verbose=True shows a lot of output.
5454
modules = [flint.pyflint,
55+
flint.flint_base.flint_base,
56+
flint.flint_base.flint_context,
5557
flint.types.fmpz,
5658
flint.types.fmpz_poly,
5759
flint.types.fmpz_mat,
5860
flint.types.fmpz_series,
61+
flint.types.fmpz_mod,
62+
flint.types.fmpz_mod_poly,
5963
flint.types.fmpq,
6064
flint.types.fmpq_poly,
6165
flint.types.fmpq_mat,

0 commit comments

Comments
 (0)