11cdef fmpq_series_coerce_operands(x, y):
2- if typecheck(x, fmpq_series):
3- if isinstance (y, (int , long , fmpz, fmpz_poly, fmpz_series, fmpq, fmpq_poly)):
4- return x, fmpq_series(y)
5- # if isinstance(y, (nmod, nmod_poly, nmod_series)):
6- # return nmod_series(x), nmod_series(y)
7- if isinstance (y, (float , arb, arb_poly, arb_series)):
8- return arb_series(x), arb_series(y)
9- if isinstance (y, (complex , acb, acb_poly, acb_series)):
10- return acb_series(x), acb_series(y)
11- else :
12- if isinstance (x,(int , long , fmpz, fmpz_poly, fmpz_series, fmpq, fmpq_poly)):
13- return fmpq_series(x), y
14- # if isinstance(x, (nmod, nmod_poly, nmod_series)):
15- # return nmod_series(x), nmod_series(y)
16- if isinstance (x, (float , arb, arb_poly, arb_series)):
17- return arb_series(x), arb_series(y)
18- if isinstance (x, (complex , acb, acb_poly, acb_series)):
19- return acb_series(x), acb_series(y)
2+ if isinstance (y, (int , long , fmpz, fmpz_poly, fmpz_series, fmpq, fmpq_poly)):
3+ return x, fmpq_series(y)
4+ # if isinstance(y, (nmod, nmod_poly, nmod_series)):
5+ # return nmod_series(x), nmod_series(y)
6+ if isinstance (y, (float , arb, arb_poly, arb_series)):
7+ return arb_series(x), arb_series(y)
8+ if isinstance (y, (complex , acb, acb_poly, acb_series)):
9+ return acb_series(x), acb_series(y)
2010 return NotImplemented , NotImplemented
2111
2212cdef class fmpq_series(flint_series):
@@ -133,54 +123,72 @@ cdef class fmpq_series(flint_series):
133123 return u
134124
135125 def __add__ (s , t ):
126+ if not isinstance (t, fmpq_series):
127+ s, t = fmpq_series_coerce_operands(s, t)
128+ if s is NotImplemented :
129+ return s
130+ return s + t
136131 cdef long cap
137- if type (s) is type (t):
138- u = fmpq_series.__new__ (fmpq_series)
139- cap = getcap()
140- cap = min (cap, (< fmpq_series> s).prec)
141- cap = min (cap, (< fmpq_series> t).prec)
142- if cap > 0 :
143- fmpq_poly_add((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
144- fmpq_poly_truncate((< fmpq_series> u).val, cap)
145- (< fmpq_series> u).prec = cap
146- return u
132+ u = fmpq_series.__new__ (fmpq_series)
133+ cap = getcap()
134+ cap = min (cap, (< fmpq_series> s).prec)
135+ cap = min (cap, (< fmpq_series> t).prec)
136+ if cap > 0 :
137+ fmpq_poly_add((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
138+ fmpq_poly_truncate((< fmpq_series> u).val, cap)
139+ (< fmpq_series> u).prec = cap
140+ return u
141+
142+ def __radd__ (s , t ):
147143 s, t = fmpq_series_coerce_operands(s, t)
148144 if s is NotImplemented :
149145 return s
150- return s + t
146+ return t + s
151147
152148 def __sub__ (s , t ):
149+ if not isinstance (t, fmpq_series):
150+ s, t = fmpq_series_coerce_operands(s, t)
151+ if s is NotImplemented :
152+ return s
153+ return s - t
153154 cdef long cap
154- if type (s) is type (t):
155- u = fmpq_series.__new__ (fmpq_series)
156- cap = getcap()
157- cap = min (cap, (< fmpq_series> s).prec)
158- cap = min (cap, (< fmpq_series> t).prec)
159- if cap > 0 :
160- fmpq_poly_sub((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
161- fmpq_poly_truncate((< fmpq_series> u).val, cap)
162- (< fmpq_series> u).prec = cap
163- return u
155+ u = fmpq_series.__new__ (fmpq_series)
156+ cap = getcap()
157+ cap = min (cap, (< fmpq_series> s).prec)
158+ cap = min (cap, (< fmpq_series> t).prec)
159+ if cap > 0 :
160+ fmpq_poly_sub((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
161+ fmpq_poly_truncate((< fmpq_series> u).val, cap)
162+ (< fmpq_series> u).prec = cap
163+ return u
164+
165+ def __rsub__ (s , t ):
164166 s, t = fmpq_series_coerce_operands(s, t)
165167 if s is NotImplemented :
166168 return s
167- return s - t
169+ return t - s
168170
169171 def __mul__ (s , t ):
172+ if not isinstance (t, fmpq_series):
173+ s, t = fmpq_series_coerce_operands(s, t)
174+ if s is NotImplemented :
175+ return s
176+ return s * t
170177 cdef long cap
171- if type (s) is type (t):
172- u = fmpq_series.__new__ (fmpq_series)
173- cap = getcap()
174- cap = min (cap, (< fmpq_series> s).prec)
175- cap = min (cap, (< fmpq_series> t).prec)
176- if cap > 0 :
177- fmpq_poly_mullow((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
178- (< fmpq_series> u).prec = cap
179- return u
178+ u = fmpq_series.__new__ (fmpq_series)
179+ cap = getcap()
180+ cap = min (cap, (< fmpq_series> s).prec)
181+ cap = min (cap, (< fmpq_series> t).prec)
182+ if cap > 0 :
183+ fmpq_poly_mullow((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
184+ (< fmpq_series> u).prec = cap
185+ return u
186+
187+ def __rmul__ (s , t ):
180188 s, t = fmpq_series_coerce_operands(s, t)
181189 if s is NotImplemented :
182190 return s
183- return s * t
191+ return t * s
184192
185193 cpdef valuation(self ):
186194 cdef long i
@@ -195,54 +203,56 @@ cdef class fmpq_series(flint_series):
195203 def _div_ (s , t ):
196204 cdef long cap, sval, tval
197205 cdef fmpq_poly_t stmp, ttmp
198- if type (s) is type (t):
199- cap = getcap()
200- cap = min (cap, (< fmpq_series> s).prec)
201- cap = min (cap, (< fmpq_series> t).prec)
202-
203- if fmpq_poly_is_zero((< fmpq_series> t).val):
204- raise ZeroDivisionError (" power series division" )
206+ cap = getcap()
207+ cap = min (cap, (< fmpq_series> s).prec)
208+ cap = min (cap, (< fmpq_series> t).prec)
205209
206- u = fmpq_series.__new__ (fmpq_series)
210+ if fmpq_poly_is_zero((< fmpq_series> t).val):
211+ raise ZeroDivisionError (" power series division" )
207212
208- if fmpq_poly_is_zero((< fmpq_series> s).val):
209- (< fmpq_series> u).prec = cap
210- return u
213+ u = fmpq_series.__new__ (fmpq_series)
211214
212- sval = (< fmpq_series> s).valuation()
213- tval = (< fmpq_series> t).valuation()
215+ if fmpq_poly_is_zero((< fmpq_series> s).val):
216+ (< fmpq_series> u).prec = cap
217+ return u
214218
215- if sval < tval:
216- raise ValueError ( " quotient would not be a power series " )
219+ sval = ( < fmpq_series > s).valuation()
220+ tval = ( < fmpq_series > t).valuation( )
217221
218- if fmpz_is_zero( & (( < fmpq_series > t).val.coeffs[ tval])) :
219- raise ValueError (" leading term in denominator is not a unit " )
222+ if sval < tval:
223+ raise ValueError (" quotient would not be a power series " )
220224
221- if tval == 0 :
222- fmpq_poly_div_series((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
223- else :
224- fmpq_poly_init(stmp)
225- fmpq_poly_init(ttmp)
226- fmpq_poly_shift_right(stmp, (< fmpq_series> s).val, tval)
227- fmpq_poly_shift_right(ttmp, (< fmpq_series> t).val, tval)
228- cap -= tval
229- fmpq_poly_div_series((< fmpq_series> u).val, stmp, ttmp, cap)
230- fmpq_poly_clear(stmp)
231- fmpq_poly_clear(ttmp)
225+ if fmpz_is_zero(& ((< fmpq_series> t).val.coeffs[tval])):
226+ raise ValueError (" leading term in denominator is not a unit" )
232227
233- (< fmpq_series> u).prec = cap
234- return u
228+ if tval == 0 :
229+ fmpq_poly_div_series((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
230+ else :
231+ fmpq_poly_init(stmp)
232+ fmpq_poly_init(ttmp)
233+ fmpq_poly_shift_right(stmp, (< fmpq_series> s).val, tval)
234+ fmpq_poly_shift_right(ttmp, (< fmpq_series> t).val, tval)
235+ cap -= tval
236+ fmpq_poly_div_series((< fmpq_series> u).val, stmp, ttmp, cap)
237+ fmpq_poly_clear(stmp)
238+ fmpq_poly_clear(ttmp)
235239
236- s, t = fmpq_series_coerce_operands(s, t)
237- if s is NotImplemented :
238- return s
239- return s / t
240+ (< fmpq_series> u).prec = cap
241+ return u
240242
241243 def __truediv__ (s , t ):
244+ if not isinstance (t, fmpq_series):
245+ s, t = fmpq_series_coerce_operands(s, t)
246+ if s is NotImplemented :
247+ return s
248+ return s / t
242249 return fmpq_series._div_(s, t)
243250
244- def __div__ (s , t ):
245- return fmpq_series._div_(s, t)
251+ def __rtruediv__ (s , t ):
252+ s, t = fmpq_series_coerce_operands(s, t)
253+ if s is NotImplemented :
254+ return s
255+ return t / s
246256
247257 # generic exponentiation (fallback code)
248258 # XXX: use fmpq_poly_pow_trunc instead?
0 commit comments