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

Adding Fmpz mpoly #59

Merged
merged 29 commits into from
Jul 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
357e435
Make it work with flint 3.0
deinst Aug 11, 2023
e973105
Change from distutils to setuptools
deinst Aug 11, 2023
74c5f85
Change include paths for flint 3.0
deinst Aug 16, 2023
c24b2ff
Starting attack at fmpz_mpoly
deinst Aug 17, 2023
0489152
Made the tests pass.
deinst Aug 17, 2023
518c0a7
Merge remote-tracking branch 'upstream/master' into fmpz_mpoly
deinst Aug 17, 2023
89d567c
Back out changes for flint3 and setuptools
deinst Aug 17, 2023
7176fe7
add prototype for fmpz_mpoly_sort_terms.
deinst Aug 18, 2023
3dbc6ae
Moved generic pieces of fmpz_mpoly_context to base class.
deinst Aug 18, 2023
dc7be11
doctests for fmpz_mpoly_context object
deinst Aug 19, 2023
b5d0e91
Merge branch 'master' into fmpz_mpoly
deinst Aug 21, 2023
843b9f3
Added ability to construct an fmpz_mpoly from a dictionary.
deinst Aug 23, 2023
f346904
Added create_fmpz_mpoly to remove blocks of redundant code.
deinst Aug 25, 2023
3407bce
Initial steps towards fmpz_mpoly.
deinst Aug 28, 2023
96178ce
Merge branch 'master' into fmpz_mpoly
deinst Sep 9, 2023
0f2fceb
Small advances in fmpz_mpoly.
deinst Sep 12, 2023
fe614c5
Merge branch 'master' into fmpz_mpoly
deinst Sep 14, 2023
fbe31b7
Added fmpz_mpoly_factor and fmpq_mpoly.
deinst Sep 22, 2023
7f9c193
Added fmpq_mpoly to setup.py
deinst Sep 22, 2023
70b23be
Merge branch 'master' into fmpz_mpoly
deinst Sep 22, 2023
692c3e7
Merge branch 'master' into fmpz_mpoly
deinst Sep 23, 2023
ab7e114
Added factoring to fmpq_mpoly
deinst Sep 24, 2023
2ebf15d
Framing of fmpz_mpoly_q laid out.
deinst Sep 24, 2023
ca4391d
Fixed small bugs in fmpz_mpoly and fmpq_mpoly
deinst Sep 24, 2023
b156482
Merge branch 'master' into fmpz_mpoly
deinst Sep 28, 2023
1313637
Added printing of fmpz_mpoly_q
deinst Sep 30, 2023
5249c19
Merge branch 'master' into fmpz_mpoly
deinst Sep 30, 2023
80b1325
Added operations on fmpz_mpoly that return fmpq_mpoly of fmpz_mpoly_q
deinst Oct 9, 2023
e3c81d8
Added tests, checks for division by zero to fmpz_mpoly
deinst Oct 10, 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
2 changes: 2 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@
("flint.types.acb_mat", ["src/flint/types/acb_mat.pyx"]),
("flint.types.acb_series", ["src/flint/types/acb_series.pyx"]),
("flint.types.fmpz_mpoly", ["src/flint/types/fmpz_mpoly.pyx"]),
("flint.types.fmpq_mpoly", ["src/flint/types/fmpq_mpoly.pyx"]),
("flint.types.fmpz_mpoly_q", ["src/flint/types/fmpz_mpoly_q.pyx"]),
("flint.types.fmpz_mod", ["src/flint/types/fmpz_mod.pyx"]),
("flint.types.dirichlet", ["src/flint/types/dirichlet.pyx"]),
("flint.flint_base.flint_base", ["src/flint/flint_base/flint_base.pyx"]),
Expand Down
2 changes: 2 additions & 0 deletions src/flint/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
from .types.acb_mat import *
from .types.acb_series import *
from .types.fmpz_mpoly import *
from .types.fmpq_mpoly import *
from .types.fmpz_mod import *
from .types.fmpz_mpoly_q import *
from .types.dirichlet import *
from .functions.showgood import showgood

Expand Down
8 changes: 8 additions & 0 deletions src/flint/flint_base/flint_base.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ cdef class flint_scalar(flint_elem):
cdef class flint_poly(flint_elem):
pass

cdef class flint_mpoly_context(flint_elem):
cdef public object py_names
cdef char ** c_names
cdef bint _init

cdef class flint_mpoly(flint_elem):
pass

Expand All @@ -15,3 +20,6 @@ cdef class flint_mat(flint_elem):

cdef class flint_series(flint_elem):
pass

cdef class flint_rational_function(flint_elem):
pass
51 changes: 50 additions & 1 deletion src/flint/flint_base/flint_base.pyx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from flint.flint_base.flint_context cimport thectx
cimport libc.stdlib

cdef class flint_elem:
def __repr__(self):
Expand Down Expand Up @@ -95,16 +96,60 @@ cdef class flint_poly(flint_elem):
v = - fac[0]
roots.append((v, m))
return roots

def complex_roots(self):
raise AttributeError("Complex roots are not supported for this polynomial")


cdef class flint_mpoly_context(flint_elem):
"""
Base class for multivariate ring contexts
"""

def __cinit__(self):
self._init = False

def __init__(self, long nvars, names):
assert nvars >= 1
assert len(names) == nvars
self.py_names = tuple(bytes(name, 'utf-8') for name in names)
self.c_names = <char**>libc.stdlib.malloc(nvars * sizeof(char *))
self._init = True
for i in range(nvars):
self.c_names[i] = self.py_names[i]

def __dealloc__(self):
if self._init:
libc.stdlib.free(self.c_names)
self._init = False

def name(self, long i):
assert i >= 0 and i < len(self.py_names)
return self.py_names[i].decode('utf-8')

def gens(self):
return tuple(self.gen(i) for i in range(self.nvars()))



cdef class flint_mpoly(flint_elem):
"""
Base class for multivariate polynomials.
"""

def leading_coefficient(self):
return self.coefficient(0)

def __hash__(self):
s = repr(self)
return hash(s)

def to_dict(self):
d = {}
for i in range(len(self)):
d[self.exponent_tuple(i)] = self.coefficient(i)
return d


cdef class flint_series(flint_elem):
"""
Expand Down Expand Up @@ -173,3 +218,7 @@ cdef class flint_mat(flint_elem):

# supports mpmath conversions
tolist = table


cdef class flint_rational_function(flint_elem):
pass
2 changes: 1 addition & 1 deletion src/flint/flint_base/flint_context.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ cdef class FlintContext:
self.threads = 1
self.cap = 10

@property
@property
def prec(self):
return self._prec

Expand Down
1 change: 1 addition & 0 deletions src/flint/flintlib/fmpq.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ cdef extern from "flint/fmpq.h":
ctypedef struct fmpq_struct:
fmpz_struct num
fmpz_struct den

ctypedef fmpq_struct fmpq_t[1]
fmpz_struct * fmpq_numref(fmpq_t x)
fmpz_struct * fmpq_denref(fmpq_t x)
Expand Down
170 changes: 170 additions & 0 deletions src/flint/flintlib/fmpq_mpoly.pxd

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions src/flint/flintlib/fmpq_mpoly_factor.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from flint.flintlib.fmpq cimport fmpq_t
from flint.flintlib.fmpz cimport fmpz_t
from flint.flintlib.fmpq_mpoly cimport fmpq_mpoly_ctx_t, fmpq_mpoly_t, fmpq_mpoly_struct
from flint.flintlib.flint cimport slong, fmpz_struct

cdef extern from "flint/fmpq_mpoly_factor.h":
ctypedef struct fmpq_mpoly_factor_struct:
fmpq_t constant
fmpq_mpoly_struct * poly
fmpz_struct * exp
slong num
slong alloc
ctypedef fmpq_mpoly_factor_struct fmpq_mpoly_factor_t[1]

void fmpq_mpoly_factor_init(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx)
void fmpq_mpoly_factor_clear(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx)
void fmpq_mpoly_factor_swap(fmpq_mpoly_factor_t f, fmpq_mpoly_factor_t g, const fmpq_mpoly_ctx_t ctx)
slong fmpq_mpoly_factor_length(const fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx)
void fmpq_mpoly_factor_get_constant_fmpq(fmpq_t c, const fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx)
void fmpq_mpoly_factor_get_base(fmpq_mpoly_t B, const fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx)
void fmpq_mpoly_factor_swap_base(fmpq_mpoly_t B, fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx)
slong fmpq_mpoly_factor_get_exp_si(fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx)
void fmpq_mpoly_factor_sort(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx)
int fmpq_mpoly_factor_make_monic(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx)
int fmpq_mpoly_factor_make_integral(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx)
int fmpq_mpoly_factor_squarefree(fmpq_mpoly_factor_t f, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
int fmpq_mpoly_factor(fmpq_mpoly_factor_t f, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
4 changes: 4 additions & 0 deletions src/flint/flintlib/fmpz_mpoly.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -196,3 +196,7 @@ cdef extern from "flint/fmpz_mpoly.h":
void fmpz_mpoly_quasidivrem_heap(fmpz_t scale, fmpz_mpoly_t q, fmpz_mpoly_t r, const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3, const fmpz_mpoly_ctx_t ctx)
slong _fmpz_mpoly_divrem_ideal_monagan_pearce(fmpz_mpoly_struct ** polyq, fmpz_struct ** polyr, ulong ** expr, slong * allocr, const fmpz_struct * poly2, const ulong * exp2, slong len2, fmpz_mpoly_struct * const * poly3, ulong * const * exp3, slong len, slong N, slong bits, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_divrem_ideal_monagan_pearce(fmpz_mpoly_struct ** q, fmpz_mpoly_t r, const fmpz_mpoly_t poly2, fmpz_mpoly_struct * const * poly3, slong len, const fmpz_mpoly_ctx_t ctx)
# undocumented functions
void _fmpz_mpoly_push_exp_ffmpz(fmpz_mpoly_t A, const fmpz_struct * exp, const fmpz_mpoly_ctx_t ctx);
void _fmpz_mpoly_push_exp_pfmpz(fmpz_mpoly_t A, fmpz_struct * const * exp, const fmpz_mpoly_ctx_t ctx);
void _fmpz_mpoly_push_exp_ui(fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
32 changes: 32 additions & 0 deletions src/flint/flintlib/fmpz_mpoly_factor.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from flint.flintlib.fmpz_mpoly cimport fmpz_mpoly_t, fmpz_mpoly_ctx_t, fmpz_mpoly_struct
from flint.flintlib.fmpz cimport fmpz_t
from flint.flintlib.flint cimport slong, fmpz_struct
from flint.flintlib.fmpq cimport fmpq_t


# unimported types set()

cdef extern from "flint/fmpz_mpoly_factor.h":

ctypedef struct fmpz_mpoly_factor_struct:
fmpz_t constant
fmpz_t constant_den
fmpz_mpoly_struct * poly
fmpz_struct * exp
slong num
slong alloc

ctypedef fmpz_mpoly_factor_struct fmpz_mpoly_factor_t[1];

void fmpz_mpoly_factor_init(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_factor_clear(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_factor_swap(fmpz_mpoly_factor_t f, fmpz_mpoly_factor_t g, const fmpz_mpoly_ctx_t ctx)
slong fmpz_mpoly_factor_length(const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_factor_get_constant_fmpz(fmpz_t c, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_factor_get_constant_fmpq(fmpq_t c, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_factor_get_base(fmpz_mpoly_t B, const fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_factor_swap_base(fmpz_mpoly_t B, fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx)
slong fmpz_mpoly_factor_get_exp_si(fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_factor_sort(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx)
int fmpz_mpoly_factor_squarefree(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx)
int fmpz_mpoly_factor(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx)
53 changes: 53 additions & 0 deletions src/flint/flintlib/fmpz_mpoly_q.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from flint.flintlib.flint cimport mp_limb_t, flint_rand_t, slong
from flint.flintlib.fmpq cimport fmpq_t
from flint.flintlib.fmpz cimport fmpz_t
from flint.flintlib.fmpz_mpoly cimport fmpz_mpoly_ctx_t, fmpz_mpoly_t, fmpz_mpoly_struct

cdef extern from "flint/fmpz_mpoly_q.h":
ctypedef struct fmpz_mpoly_q_struct:
fmpz_mpoly_struct num
fmpz_mpoly_struct den
ctypedef fmpz_mpoly_q_struct fmpz_mpoly_q_t[1]

fmpz_mpoly_struct * fmpz_mpoly_q_numref(fmpz_mpoly_q_t x)
fmpz_mpoly_struct * fmpz_mpoly_q_denref(fmpz_mpoly_q_t x)
void fmpz_mpoly_q_init(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_clear(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_swap(fmpz_mpoly_q_t x, fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_set(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_set_fmpq(fmpz_mpoly_q_t res, const fmpq_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_set_fmpz(fmpz_mpoly_q_t res, const fmpz_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_set_si(fmpz_mpoly_q_t res, slong x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_canonicalise(fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
int fmpz_mpoly_q_is_canonical(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
int fmpz_mpoly_q_is_zero(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
int fmpz_mpoly_q_is_one(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_used_vars(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_used_vars_num(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_used_vars_den(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_zero(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_one(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_gen(fmpz_mpoly_q_t res, slong i, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_print_pretty(const fmpz_mpoly_q_t f, const char ** x, fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_randtest(fmpz_mpoly_q_t res, flint_rand_t state, slong length, mp_limb_t coeff_bits, slong exp_bound, const fmpz_mpoly_ctx_t ctx)
int fmpz_mpoly_q_equal(const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_neg(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_add(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_add_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_add_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_add_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_sub(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_sub_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_sub_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_sub_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_mul(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_mul_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_mul_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_mul_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_div(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_div_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_div_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_div_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong y, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_inv(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
void _fmpz_mpoly_q_content(fmpz_t num, fmpz_t den, const fmpz_mpoly_t xnum, const fmpz_mpoly_t xden, const fmpz_mpoly_ctx_t ctx)
void fmpz_mpoly_q_content(fmpq_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
Loading