Skip to content

Commit 4d9175b

Browse files
committed
fix: add __rdunder__ methods fmpz_series, fmpq_series
1 parent 19d7526 commit 4d9175b

File tree

2 files changed

+192
-174
lines changed

2 files changed

+192
-174
lines changed

src/flint/fmpq_series.pyx

Lines changed: 96 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
11
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)
2010
return NotImplemented, NotImplemented
2111

2212
cdef 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

Comments
 (0)