Skip to content

Commit d5f0a61

Browse files
committed
fix: add __rdunder__ methods fmpz_series, fmpq_series
1 parent 9f74e62 commit d5f0a61

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):
@@ -124,54 +114,72 @@ cdef class fmpq_series(flint_series):
124114
return u
125115

126116
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
127122
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):
138134
s, t = fmpq_series_coerce_operands(s, t)
139135
if s is NotImplemented:
140136
return s
141-
return s + t
137+
return t + s
142138

143139
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
144145
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):
155157
s, t = fmpq_series_coerce_operands(s, t)
156158
if s is NotImplemented:
157159
return s
158-
return s - t
160+
return t - s
159161

160162
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
161168
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):
171179
s, t = fmpq_series_coerce_operands(s, t)
172180
if s is NotImplemented:
173181
return s
174-
return s * t
182+
return t * s
175183

176184
cpdef valuation(self):
177185
cdef long i
@@ -186,54 +194,56 @@ cdef class fmpq_series(flint_series):
186194
def _div_(s, t):
187195
cdef long cap, sval, tval
188196
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)
196200

197-
u = fmpq_series.__new__(fmpq_series)
201+
if fmpq_poly_is_zero((<fmpq_series>t).val):
202+
raise ZeroDivisionError("power series division")
198203

199-
if fmpq_poly_is_zero((<fmpq_series>s).val):
200-
u.cap = cap
201-
return u
204+
u = fmpq_series.__new__(fmpq_series)
202205

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
205209

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()
208212

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")
211215

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")
223218

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)
226230

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
231233

232234
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
233240
return fmpq_series._div_(s, t)
234241

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
237247

238248
# generic exponentiation (fallback code)
239249
def __pow__(s, ulong exp, mod):

0 commit comments

Comments
 (0)