@@ -767,17 +767,37 @@ cdef class gr_ctx(flint_ctx):
767767 # ##
768768 # Factorization
769769
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
781801
782802 # ##
783803 # Fractions
0 commit comments