@@ -767,17 +767,37 @@ cdef class gr_ctx(flint_ctx):
767
767
# ##
768
768
# Factorization
769
769
770
- # @cython.final
771
- # cdef inline tuple[gr, list[gr], list[fmpz]] _factor(self, gr x):
772
- # cdef int err
773
- # cdef gr c = self.new_gr()
774
- # cdef gr_vec_t factors
775
- # gr_vec_init(factors, 0, self.ctx_t)
776
- # cdef gr_vec_t exponents
777
- # gr_vec_init(exponents, 0, self.ctx_t)
778
- # err = gr_factor(c.pval, factors, exponents, x.pval, 0, self.ctx_t)
779
- # if err != GR_SUCCESS:
780
- # raise self._error(err, "Cannot factorize x in this context")
770
+ @cython.final
771
+ cdef inline tuple [gr, list [tuple [gr, int ]]] _factor(self , gr x):
772
+ cdef int err, i
773
+ cdef slong length, exp_s
774
+ cdef gr c, f
775
+ cdef gr_ptr fac_i, exp_i
776
+ cdef gr_vec_t factors, exponents
777
+ cdef int flags = 0 # XXX: What is flags?
778
+ c = self .new_gr()
779
+ gr_vec_init(factors, 0 , self .ctx_t)
780
+ gr_vec_init(exponents, 0 , gr_fmpz_ctx_c.ctx_t)
781
+ err = gr_factor(c.pval, factors, exponents, x.pval, flags, self .ctx_t)
782
+ if err != GR_SUCCESS:
783
+ raise self ._error(err, " Failed to factor gr object" )
784
+ length = gr_vec_length(factors, self .ctx_t)
785
+ py_factors = [None ] * length
786
+ for 0 <= i < length:
787
+ f = self .new_gr()
788
+ fac_i = gr_vec_entry_ptr(factors, i, self .ctx_t)
789
+ err = gr_set(f.pval, fac_i, self .ctx_t)
790
+ if err != GR_SUCCESS:
791
+ raise self ._error(err, " Failed to copy factor." )
792
+ exp_i = gr_vec_entry_ptr(exponents, i, gr_fmpz_ctx_c.ctx_t)
793
+ err = gr_get_si(& exp_s, exp_i, gr_fmpz_ctx_c.ctx_t)
794
+ if err != GR_SUCCESS:
795
+ raise self ._error(err, " Failed to get integer value of exponent." )
796
+ exp = exp_s
797
+ py_factors[i] = (f, exp)
798
+ gr_vec_clear(factors, self .ctx_t)
799
+ gr_vec_clear(exponents, gr_fmpz_ctx_c.ctx_t)
800
+ return c, py_factors
781
801
782
802
# ##
783
803
# Fractions
0 commit comments