@@ -1058,25 +1058,31 @@ cdef class fmpq_mpoly(flint_mpoly):
10581058 >>> from flint import Ordering
10591059 >>> ctx = fmpq_mpoly_ctx.get_context(2 , Ordering.lex, nametup = (' x' , ' y' ))
10601060 >>> x , y = ctx.gens()
1061- >>> f = x** 3 * y + x * y ** 4 + x * y
1061+ >>> f = x** 2 * y** 2 + x * y** 2
10621062 >>> q , N = f.deflation()
10631063 >>> q , N
1064- (x + y + 1, [2, 3])
1064+ (x^2*y + x*y , [1, 2])
1065+ >>> q.inflate(N ) == f
1066+ True
10651067 """
10661068 cdef:
1067- fmpz_vec _shift = fmpz_vec(self .ctx.nvars())
1068- fmpz_vec stride = fmpz_vec(self .ctx.nvars())
1069+ slong nvars = self .ctx.nvars()
1070+ fmpz_vec shift = fmpz_vec(nvars)
1071+ fmpz_vec stride = fmpz_vec(nvars)
10691072 fmpq_mpoly res = create_fmpq_mpoly(self .ctx)
10701073
1071- fmpz_mpoly_deflation(_shift.val , stride.val , self.val.zpoly , self.ctx.val.zctx )
1074+ fmpz_mpoly_deflation(shift.val , stride.val , self.val.zpoly , self.ctx.val.zctx )
1075+
1076+ for i in range(nvars ):
1077+ stride[i] = shift[i].gcd(stride[i])
1078+ shift[i] = 0
10721079
1073- cdef fmpz_vec zero_shift = fmpz_vec(self .ctx.nvars())
1074- fmpz_mpoly_deflate(res.val.zpoly , self.val.zpoly , zero_shift.val , stride.val , self.ctx.val.zctx )
1080+ fmpz_mpoly_deflate(res.val.zpoly, self .val.zpoly, shift.val, stride.val, self .ctx.val.zctx)
10751081 fmpq_set(res.val.content, self .val.content)
10761082
10771083 return res, list (stride)
10781084
1079- def deflation_monom(self ) -> tuple[list[int], fmpq_mpoly]:
1085+ def deflation_monom (self ) -> tuple[fmpq_mpoly , list[int], fmpq_mpoly]:
10801086 """
10811087 Compute the exponent vector ``N`` and monomial ``m`` such that ``p(X^(1/N ))
10821088 = m * q(X^N )`` for maximal N. Importantly the deflation itself is not computed
@@ -1086,21 +1092,25 @@ cdef class fmpq_mpoly(flint_mpoly):
10861092 >>> ctx = fmpq_mpoly_ctx.get_context(2 , Ordering.lex, nametup = (' x' , ' y' ))
10871093 >>> x , y = ctx.gens()
10881094 >>> f = x** 3 * y + x * y** 4 + x * y
1089- >>> N , m = f.deflation_monom()
1090- >>> N , m
1091- ([2, 3], x*y )
1092- >>> f_deflated = f.deflate(N)
1093- >>> f_deflated
1094- x + y + 1
1095- >>> m * f_deflated.inflate(N )
1095+ >>> fd , N , m = f.deflation_monom()
1096+ >>> fd , N , m
1097+ (x + y + 1, [2, 3], x*y )
1098+ >>> m * fd.inflate(N )
10961099 x^3*y + x*y^4 + x*y
10971100 """
1098- cdef fmpq_mpoly monom = create_fmpq_mpoly(self .ctx)
1101+ cdef:
1102+ slong nvars = self .ctx.nvars()
1103+ fmpq_mpoly res = create_fmpq_mpoly(self .ctx)
1104+ fmpq_mpoly monom = create_fmpq_mpoly(self .ctx)
1105+ fmpz_vec shift = fmpz_vec(nvars)
1106+ fmpz_vec stride = fmpz_vec(nvars)
10991107
1100- stride , _shift = self .deflation_index()
1108+ fmpz_mpoly_deflation(shift.val , stride.val , self.val.zpoly , self.ctx.val.zctx )
1109+ fmpq_mpoly_push_term_ui_ffmpz(monom.val , 1, fmpz_vec(shift ).val , self.ctx.val )
1110+ fmpz_mpoly_deflate(res.val.zpoly , self.val.zpoly , shift.val , stride.val , self.ctx.val.zctx )
1111+ fmpq_set(res.val.content , self.val.content )
11011112
1102- fmpq_mpoly_push_term_ui_ffmpz(monom.val , 1, fmpz_vec(_shift ).val , self.ctx.val )
1103- return list(stride ), monom
1113+ return res , list(stride ), monom
11041114
11051115 def deflation_index(self ) -> tuple[list[int], list[int]]:
11061116 """
0 commit comments