Skip to content

Commit f9f7a6a

Browse files
committed
feat: add gr poly, mpoly and series types
1 parent b84af00 commit f9f7a6a

File tree

2 files changed

+204
-5
lines changed

2 files changed

+204
-5
lines changed

src/flint/types/_gr.pxd

Lines changed: 102 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ from flint.flintlib.types.fmpz cimport (
1111
from flint.flintlib.types.fmpq cimport (
1212
fmpq_poly_t,
1313
)
14+
from flint.flintlib.types.mpoly cimport (
15+
ordering_t,
16+
)
1417
from flint.flintlib.functions.ulong_extras cimport (
1518
n_is_prime,
1619
)
@@ -26,6 +29,7 @@ from flint.flintlib.functions.fmpq_poly cimport (
2629
fmpq_poly_set,
2730
)
2831

32+
2933
from flint.flintlib.types.gr cimport (
3034
truth_t,
3135
T_TRUE,
@@ -44,6 +48,7 @@ from flint.flintlib.functions.gr_domains cimport (
4448
gr_ctx_init_fmpz,
4549
gr_ctx_init_fmpq,
4650
gr_ctx_init_fmpzi,
51+
gr_ctx_init_fexpr,
4752

4853
gr_ctx_init_nmod,
4954
gr_ctx_init_fmpz_mod,
@@ -71,8 +76,12 @@ from flint.flintlib.functions.gr_domains cimport (
7176

7277
gr_ctx_init_real_arb,
7378
gr_ctx_init_complex_acb,
74-
gr_ctx_init_fexpr,
7579

80+
gr_ctx_init_gr_poly,
81+
gr_ctx_init_gr_mpoly,
82+
gr_ctx_init_fmpz_mpoly_q,
83+
# gr_ctx_init_series_mod_gr_poly,
84+
gr_ctx_init_gr_series,
7685
)
7786
from flint.flintlib.functions.gr cimport (
7887
gr_heap_init,
@@ -150,7 +159,12 @@ from flint.flintlib.functions.gr_vec cimport (
150159
gr_vec_entry_ptr,
151160
)
152161

153-
from flint.flint_base.flint_base cimport flint_ctx, flint_scalar
162+
from flint.flint_base.flint_base cimport (
163+
flint_ctx,
164+
flint_scalar,
165+
Ordering,
166+
ordering_py_to_c,
167+
)
154168

155169
from flint.types.fmpz cimport fmpz
156170
from flint.types.fmpz_poly cimport fmpz_poly
@@ -314,7 +328,7 @@ cdef class gr_ctx(flint_ctx):
314328
return res
315329

316330
@cython.final
317-
cdef inline _gens(self):
331+
cdef inline list _gens(self):
318332
cdef int err
319333
cdef gr g
320334
cdef gr_vec_t gens
@@ -334,7 +348,7 @@ cdef class gr_ctx(flint_ctx):
334348
return py_gens
335349

336350
@cython.final
337-
cdef inline gr _gens_recursive(self):
351+
cdef inline list _gens_recursive(self):
338352
cdef int err
339353
cdef gr g
340354
cdef gr_vec_t gens
@@ -749,6 +763,90 @@ cdef class gr_complex_acb_ctx(gr_scalar_ctx):
749763
# cdef _gr_gr_poly_ctx _new()
750764

751765

766+
@cython.no_gc
767+
cdef class gr_gr_poly_ctx(gr_poly_ctx):
768+
cdef gr_ctx base_ctx
769+
770+
@staticmethod
771+
cdef inline gr_gr_poly_ctx _new(gr_ctx base_ctx):
772+
cdef gr_gr_poly_ctx ctx
773+
ctx = gr_gr_poly_ctx.__new__(gr_gr_poly_ctx)
774+
gr_ctx_init_gr_poly(ctx.ctx_t, base_ctx.ctx_t)
775+
ctx._init = True
776+
ctx.base_ctx = base_ctx
777+
return ctx
778+
779+
780+
@cython.no_gc
781+
cdef class gr_gr_mpoly_ctx(gr_mpoly_ctx):
782+
cdef gr_ctx base_ctx
783+
cdef ordering_t _order
784+
cdef slong _nvars
785+
786+
@staticmethod
787+
cdef inline gr_gr_mpoly_ctx _new(gr_ctx base_ctx, slong nvars, Ordering order):
788+
cdef gr_gr_mpoly_ctx ctx
789+
cdef ordering_t ord_c
790+
ord_c = ordering_py_to_c(order)
791+
ctx = gr_gr_mpoly_ctx.__new__(gr_gr_mpoly_ctx)
792+
gr_ctx_init_gr_mpoly(ctx.ctx_t, base_ctx.ctx_t, nvars, ord_c)
793+
ctx._init = True
794+
ctx.base_ctx = base_ctx
795+
ctx._order = ord_c
796+
ctx._nvars = nvars
797+
return ctx
798+
799+
800+
# @cython.no_gc
801+
# cdef class gr_fmpz_mpoly_q_ctx(gr_mpoly_ctx):
802+
# cdef ordering_t _order
803+
# cdef slong _nvars
804+
#
805+
# @staticmethod
806+
# cdef inline gr_fmpz_mpoly_q_ctx _new(slong nvars, Ordering order):
807+
# cdef gr_fmpz_mpoly_q_ctx ctx
808+
# cdef ordering_t ord_c
809+
# ord_c = ordering_py_to_c(order)
810+
# ctx = gr_fmpz_mpoly_q_ctx.__new__(gr_fmpz_mpoly_q_ctx)
811+
# gr_ctx_init_fmpz_mpoly_q(ctx.ctx_t, nvars, ord_c)
812+
# ctx._init = True
813+
# ctx._order = ord_c
814+
# ctx._nvars = nvars
815+
# return ctx
816+
817+
818+
# @cython.no_gc
819+
# cdef class gr_series_mod_gr_poly_ctx(gr_ctx):
820+
# cdef gr_ctx base_ctx
821+
# cdef slong _n
822+
#
823+
# @staticmethod
824+
# cdef inline gr_series_mod_gr_poly_ctx _new(gr_ctx base_ctx, slong n):
825+
# cdef gr_series_mod_gr_poly_ctx ctx
826+
# ctx = gr_series_mod_gr_poly_ctx.__new__(gr_series_mod_gr_poly_ctx)
827+
# gr_ctx_init_series_mod_gr_poly(ctx.ctx_t, base_ctx.ctx_t, n)
828+
# ctx._init = True
829+
# ctx.base_ctx = base_ctx
830+
# ctx._n = n
831+
# return ctx
832+
833+
834+
@cython.no_gc
835+
cdef class gr_series_ctx(gr_ctx):
836+
cdef gr_ctx base_ctx
837+
cdef slong _prec
838+
839+
@staticmethod
840+
cdef inline gr_series_ctx _new(gr_ctx base_ctx, slong prec):
841+
cdef gr_series_ctx ctx
842+
ctx = gr_series_ctx.__new__(gr_series_ctx)
843+
gr_ctx_init_gr_series(ctx.ctx_t, base_ctx.ctx_t, prec)
844+
ctx._init = True
845+
ctx.base_ctx = base_ctx
846+
ctx._prec = prec
847+
return ctx
848+
849+
752850
@cython.no_gc
753851
cdef class gr(flint_scalar):
754852
cdef gr_ptr pval

src/flint/types/_gr.pyx

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ from flint.flintlib.functions.gr_domains cimport (
2727
gr_ctx_get_real_prec,
2828
)
2929

30+
from flint.flint_base.flint_base cimport Ordering, ordering_c_to_py
31+
3032

3133
@cython.no_gc
3234
cdef class gr_ctx(flint_ctx):
@@ -517,6 +519,105 @@ cdef class gr_complex_acb_ctx(gr_scalar_ctx):
517519
return f"gr_complex_acb_ctx({self.prec})"
518520

519521

522+
@cython.no_gc
523+
cdef class gr_gr_poly_ctx(gr_poly_ctx):
524+
525+
@staticmethod
526+
def new(base_ring) -> gr_gr_poly_ctx:
527+
return gr_gr_poly_ctx._new(base_ring)
528+
529+
def __repr__(self):
530+
return f"gr_gr_poly_ctx({self.base_ring})"
531+
532+
@property
533+
def base_ring(self):
534+
return self.base_ctx
535+
536+
537+
@cython.no_gc
538+
cdef class gr_gr_mpoly_ctx(gr_mpoly_ctx):
539+
540+
@staticmethod
541+
def new(base_ring, nvars, order=None) -> gr_gr_mpoly_ctx:
542+
if order is None:
543+
order = Ordering.lex
544+
return gr_gr_mpoly_ctx._new(base_ring, nvars, order)
545+
546+
def __repr__(self):
547+
return f"gr_gr_mpoly_ctx({self.base_ring}, {self.nvars}, {self.order})"
548+
549+
@property
550+
def base_ring(self):
551+
return self.base_ctx
552+
553+
@property
554+
def nvars(self):
555+
return self._nvars
556+
557+
@property
558+
def order(self):
559+
return ordering_c_to_py(self._order)
560+
561+
562+
# @cython.no_gc
563+
# cdef class gr_mpoly_q_ctx(gr_mpoly_ctx):
564+
#
565+
# @staticmethod
566+
# def new(nvars, order=None) -> gr_gr_mpoly_q_ctx:
567+
# if order is None:
568+
# order = Ordering.lex
569+
# return gr_mpoly_q_ctx._new(nvars, order)
570+
#
571+
# def __repr__(self):
572+
# return f"gr_mpoly_q_ctx({self.nvars}, {self.order})"
573+
#
574+
# @property
575+
# def nvars(self):
576+
# return self._nvars
577+
#
578+
# @property
579+
# def order(self):
580+
# return ordering_c_to_py(self._order)
581+
582+
583+
# @cython.no_gc
584+
# cdef class gr_series_mod_gr_poly_ctx(gr_ctx):
585+
#
586+
# @staticmethod
587+
# def new(base_ring, n) -> gr_series_mod_gr_poly_ctx:
588+
# return gr_series_mod_gr_poly_ctx._new(base_ring, n)
589+
#
590+
# def __repr__(self):
591+
# return f"gr_series_mod_gr_poly_ctx({self.base_ring}, {self.nvars})"
592+
#
593+
# @property
594+
# def base_ring(self):
595+
# return self.base_ctx
596+
#
597+
# @property
598+
# def n(self):
599+
# return self._n
600+
601+
602+
@cython.no_gc
603+
cdef class gr_series_ctx(gr_ctx):
604+
605+
@staticmethod
606+
def new(base_ring, prec) -> gr_series_ctx:
607+
return gr_series_ctx._new(base_ring, prec)
608+
609+
def __repr__(self):
610+
return f"gr_series_mod_gr_poly_ctx({self.base_ring}, {self.prec})"
611+
612+
@property
613+
def base_ring(self):
614+
return self.base_ctx
615+
616+
@property
617+
def prec(self):
618+
return self._prec
619+
620+
520621
@cython.no_gc
521622
cdef class gr(flint_scalar):
522623

@@ -636,7 +737,7 @@ cdef class gr(flint_scalar):
636737
cdef gr other_gr
637738
if isinstance(other, gr):
638739
other_gr = other
639-
if self.ctx != other._grctx:
740+
if self.ctx != other_gr.ctx:
640741
raise ValueError("Cannot multiply elements from different contexts")
641742
return self._mul(other_gr)
642743
elif isinstance(other, int):

0 commit comments

Comments
 (0)