1
1
cdef 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)
20
10
return NotImplemented , NotImplemented
21
11
22
12
cdef class fmpq_series(flint_series):
@@ -124,54 +114,72 @@ cdef class fmpq_series(flint_series):
124
114
return u
125
115
126
116
def __add__ (s , t ):
117
+ if not isinstance (t, fmpq_series):
118
+ s, t = fmpq_series_coerce_operands(s, t)
119
+ if s is NotImplemented :
120
+ return s
121
+ return s + t
127
122
cdef long cap
128
- if type (s) is type (t):
129
- u = fmpq_series.__new__ (fmpq_series)
130
- cap = getcap()
131
- cap = min (cap, (< fmpq_series> s).prec)
132
- cap = min (cap, (< fmpq_series> t).prec)
133
- if cap > 0 :
134
- fmpq_poly_add((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
135
- fmpq_poly_truncate((< fmpq_series> u).val, cap)
136
- (< fmpq_series> u).prec = cap
137
- return u
123
+ u = fmpq_series.__new__ (fmpq_series)
124
+ cap = getcap()
125
+ cap = min (cap, (< fmpq_series> s).prec)
126
+ cap = min (cap, (< fmpq_series> t).prec)
127
+ if cap > 0 :
128
+ fmpq_poly_add((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
129
+ fmpq_poly_truncate((< fmpq_series> u).val, cap)
130
+ (< fmpq_series> u).prec = cap
131
+ return u
132
+
133
+ def __radd__ (s , t ):
138
134
s, t = fmpq_series_coerce_operands(s, t)
139
135
if s is NotImplemented :
140
136
return s
141
- return s + t
137
+ return t + s
142
138
143
139
def __sub__ (s , t ):
140
+ if not isinstance (t, fmpq_series):
141
+ s, t = fmpq_series_coerce_operands(s, t)
142
+ if s is NotImplemented :
143
+ return s
144
+ return s - t
144
145
cdef long cap
145
- if type (s) is type (t):
146
- u = fmpq_series.__new__ (fmpq_series)
147
- cap = getcap()
148
- cap = min (cap, (< fmpq_series> s).prec)
149
- cap = min (cap, (< fmpq_series> t).prec)
150
- if cap > 0 :
151
- fmpq_poly_sub((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
152
- fmpq_poly_truncate((< fmpq_series> u).val, cap)
153
- (< fmpq_series> u).prec = cap
154
- return u
146
+ u = fmpq_series.__new__ (fmpq_series)
147
+ cap = getcap()
148
+ cap = min (cap, (< fmpq_series> s).prec)
149
+ cap = min (cap, (< fmpq_series> t).prec)
150
+ if cap > 0 :
151
+ fmpq_poly_sub((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val)
152
+ fmpq_poly_truncate((< fmpq_series> u).val, cap)
153
+ (< fmpq_series> u).prec = cap
154
+ return u
155
+
156
+ def __rsub__ (s , t ):
155
157
s, t = fmpq_series_coerce_operands(s, t)
156
158
if s is NotImplemented :
157
159
return s
158
- return s - t
160
+ return t - s
159
161
160
162
def __mul__ (s , t ):
163
+ if not isinstance (t, fmpq_series):
164
+ s, t = fmpq_series_coerce_operands(s, t)
165
+ if s is NotImplemented :
166
+ return s
167
+ return s * t
161
168
cdef long cap
162
- if type (s) is type (t):
163
- u = fmpq_series.__new__ (fmpq_series)
164
- cap = getcap()
165
- cap = min (cap, (< fmpq_series> s).prec)
166
- cap = min (cap, (< fmpq_series> t).prec)
167
- if cap > 0 :
168
- fmpq_poly_mullow((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
169
- (< fmpq_series> u).prec = cap
170
- return u
169
+ u = fmpq_series.__new__ (fmpq_series)
170
+ cap = getcap()
171
+ cap = min (cap, (< fmpq_series> s).prec)
172
+ cap = min (cap, (< fmpq_series> t).prec)
173
+ if cap > 0 :
174
+ fmpq_poly_mullow((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
175
+ (< fmpq_series> u).prec = cap
176
+ return u
177
+
178
+ def __rmul__ (s , t ):
171
179
s, t = fmpq_series_coerce_operands(s, t)
172
180
if s is NotImplemented :
173
181
return s
174
- return s * t
182
+ return t * s
175
183
176
184
cpdef valuation(self ):
177
185
cdef long i
@@ -186,54 +194,56 @@ cdef class fmpq_series(flint_series):
186
194
def _div_ (s , t ):
187
195
cdef long cap, sval, tval
188
196
cdef fmpq_poly_t stmp, ttmp
189
- if type (s) is type (t):
190
- cap = getcap()
191
- cap = min (cap, (< fmpq_series> s).prec)
192
- cap = min (cap, (< fmpq_series> t).prec)
193
-
194
- if fmpq_poly_is_zero((< fmpq_series> t).val):
195
- raise ZeroDivisionError (" power series division" )
197
+ cap = getcap()
198
+ cap = min (cap, (< fmpq_series> s).prec)
199
+ cap = min (cap, (< fmpq_series> t).prec)
196
200
197
- u = fmpq_series.__new__ (fmpq_series)
201
+ if fmpq_poly_is_zero((< fmpq_series> t).val):
202
+ raise ZeroDivisionError (" power series division" )
198
203
199
- if fmpq_poly_is_zero((< fmpq_series> s).val):
200
- u.cap = cap
201
- return u
204
+ u = fmpq_series.__new__ (fmpq_series)
202
205
203
- sval = (< fmpq_series> s).valuation()
204
- tval = (< fmpq_series> t).valuation()
206
+ if fmpq_poly_is_zero((< fmpq_series> s).val):
207
+ u.cap = cap
208
+ return u
205
209
206
- if sval < tval:
207
- raise ValueError ( " quotient would not be a power series " )
210
+ sval = ( < fmpq_series > s).valuation()
211
+ tval = ( < fmpq_series > t).valuation( )
208
212
209
- if fmpz_is_zero( & (( < fmpq_series > t).val.coeffs[ tval])) :
210
- raise ValueError (" leading term in denominator is not a unit " )
213
+ if sval < tval:
214
+ raise ValueError (" quotient would not be a power series " )
211
215
212
- if tval == 0 :
213
- fmpq_poly_div_series((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
214
- else :
215
- fmpq_poly_init(stmp)
216
- fmpq_poly_init(ttmp)
217
- fmpq_poly_shift_right(stmp, (< fmpq_series> s).val, tval)
218
- fmpq_poly_shift_right(ttmp, (< fmpq_series> t).val, tval)
219
- cap -= tval
220
- fmpq_poly_div_series((< fmpq_series> u).val, stmp, ttmp, cap)
221
- fmpq_poly_clear(stmp)
222
- fmpq_poly_clear(ttmp)
216
+ if fmpz_is_zero(& ((< fmpq_series> t).val.coeffs[tval])):
217
+ raise ValueError (" leading term in denominator is not a unit" )
223
218
224
- (< fmpq_series> u).prec = cap
225
- return u
219
+ if tval == 0 :
220
+ fmpq_poly_div_series((< fmpq_series> u).val, (< fmpq_series> s).val, (< fmpq_series> t).val, cap)
221
+ else :
222
+ fmpq_poly_init(stmp)
223
+ fmpq_poly_init(ttmp)
224
+ fmpq_poly_shift_right(stmp, (< fmpq_series> s).val, tval)
225
+ fmpq_poly_shift_right(ttmp, (< fmpq_series> t).val, tval)
226
+ cap -= tval
227
+ fmpq_poly_div_series((< fmpq_series> u).val, stmp, ttmp, cap)
228
+ fmpq_poly_clear(stmp)
229
+ fmpq_poly_clear(ttmp)
226
230
227
- s, t = fmpq_series_coerce_operands(s, t)
228
- if s is NotImplemented :
229
- return s
230
- return s / t
231
+ (< fmpq_series> u).prec = cap
232
+ return u
231
233
232
234
def __truediv__ (s , t ):
235
+ if not isinstance (t, fmpq_series):
236
+ s, t = fmpq_series_coerce_operands(s, t)
237
+ if s is NotImplemented :
238
+ return s
239
+ return s / t
233
240
return fmpq_series._div_(s, t)
234
241
235
- def __div__ (s , t ):
236
- return fmpq_series._div_(s, t)
242
+ def __rtruediv__ (s , t ):
243
+ s, t = fmpq_series_coerce_operands(s, t)
244
+ if s is NotImplemented :
245
+ return s
246
+ return t / s
237
247
238
248
# generic exponentiation (fallback code)
239
249
def __pow__ (s , ulong exp , mod ):
0 commit comments