Skip to content

Commit 978696a

Browse files
committed
fix: add __rdunder__ methods for fmpq and nmod
1 parent 3bacb07 commit 978696a

2 files changed

Lines changed: 66 additions & 30 deletions

File tree

src/flint/fmpq.pyx

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -143,40 +143,58 @@ cdef class fmpq(flint_scalar):
143143

144144
def __add__(s, t):
145145
cdef fmpq r
146-
s = any_as_fmpq(s)
147-
if s is NotImplemented:
148-
return s
149146
t = any_as_fmpq(t)
150147
if t is NotImplemented:
151148
return t
152149
r = fmpq.__new__(fmpq)
153150
fmpq_add(r.val, (<fmpq>s).val, (<fmpq>t).val)
154151
return r
155152

153+
def __radd__(s, t):
154+
cdef fmpq r
155+
t = any_as_fmpq(t)
156+
if t is NotImplemented:
157+
return t
158+
r = fmpq.__new__(fmpq)
159+
fmpq_add(r.val, (<fmpq>t).val, (<fmpq>s).val)
160+
return r
161+
156162
def __sub__(s, t):
157163
cdef fmpq r
158-
s = any_as_fmpq(s)
159-
if s is NotImplemented:
160-
return s
161164
t = any_as_fmpq(t)
162165
if t is NotImplemented:
163166
return t
164167
r = fmpq.__new__(fmpq)
165168
fmpq_sub(r.val, (<fmpq>s).val, (<fmpq>t).val)
166169
return r
167170

171+
def __rsub__(s, t):
172+
cdef fmpq r
173+
t = any_as_fmpq(t)
174+
if t is NotImplemented:
175+
return t
176+
r = fmpq.__new__(fmpq)
177+
fmpq_sub(r.val, (<fmpq>t).val, (<fmpq>s).val)
178+
return r
179+
168180
def __mul__(s, t):
169181
cdef fmpq r
170-
s = any_as_fmpq(s)
171-
if s is NotImplemented:
172-
return s
173182
t = any_as_fmpq(t)
174183
if t is NotImplemented:
175184
return t
176185
r = fmpq.__new__(fmpq)
177186
fmpq_mul(r.val, (<fmpq>s).val, (<fmpq>t).val)
178187
return r
179188

189+
def __rmul__(s, t):
190+
cdef fmpq r
191+
t = any_as_fmpq(t)
192+
if t is NotImplemented:
193+
return t
194+
r = fmpq.__new__(fmpq)
195+
fmpq_mul(r.val, (<fmpq>t).val, (<fmpq>s).val)
196+
return r
197+
180198
@staticmethod
181199
def _div_(s, t):
182200
cdef fmpq r
@@ -195,8 +213,8 @@ cdef class fmpq(flint_scalar):
195213
def __truediv__(s, t):
196214
return fmpq._div_(s, t)
197215

198-
def __div__(s, t):
199-
return fmpq._div_(s, t)
216+
def __rtruediv__(s, t):
217+
return fmpq._div_(t, s)
200218

201219
def next(s, bint signed=True, bint minimal=True):
202220
"""

src/flint/nmod.pyx

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -85,44 +85,63 @@ cdef class nmod(flint_scalar):
8585
def __add__(s, t):
8686
cdef nmod r
8787
cdef mp_limb_t val
88-
if not typecheck(s, nmod):
89-
s, t = t, s
9088
if any_as_nmod(&val, t, (<nmod>s).mod):
9189
r = nmod.__new__(nmod)
9290
r.mod = (<nmod>s).mod
9391
r.val = nmod_add(val, (<nmod>s).val, r.mod)
9492
return r
9593
return NotImplemented
9694

95+
def __radd__(s, t):
96+
cdef nmod r
97+
cdef mp_limb_t val
98+
if any_as_nmod(&val, t, (<nmod>s).mod):
99+
r = nmod.__new__(nmod)
100+
r.mod = (<nmod>s).mod
101+
r.val = nmod_add((<nmod>s).val, val, r.mod)
102+
return r
103+
return NotImplemented
104+
97105
def __sub__(s, t):
98106
cdef nmod r
99107
cdef mp_limb_t val
100-
if typecheck(s, nmod):
101-
if any_as_nmod(&val, t, (<nmod>s).mod):
102-
r = nmod.__new__(nmod)
103-
r.mod = (<nmod>s).mod
104-
r.val = nmod_sub((<nmod>s).val, val, r.mod)
105-
return r
106-
else:
107-
if any_as_nmod(&val, s, (<nmod>t).mod):
108-
r = nmod.__new__(nmod)
109-
r.mod = (<nmod>t).mod
110-
r.val = nmod_sub(val, (<nmod>t).val, r.mod)
111-
return r
108+
if any_as_nmod(&val, t, (<nmod>s).mod):
109+
r = nmod.__new__(nmod)
110+
r.mod = (<nmod>s).mod
111+
r.val = nmod_sub((<nmod>s).val, val, r.mod)
112+
return r
113+
return NotImplemented
114+
115+
def __rsub__(s, t):
116+
cdef nmod r
117+
cdef mp_limb_t val
118+
if any_as_nmod(&val, t, (<nmod>s).mod):
119+
r = nmod.__new__(nmod)
120+
r.mod = (<nmod>s).mod
121+
r.val = nmod_sub(val, (<nmod>s).val, r.mod)
122+
return r
112123
return NotImplemented
113124

114125
def __mul__(s, t):
115126
cdef nmod r
116127
cdef mp_limb_t val
117-
if not typecheck(s, nmod):
118-
s, t = t, s
119128
if any_as_nmod(&val, t, (<nmod>s).mod):
120129
r = nmod.__new__(nmod)
121130
r.mod = (<nmod>s).mod
122131
r.val = nmod_mul(val, (<nmod>s).val, r.mod)
123132
return r
124133
return NotImplemented
125134

135+
def __rmul__(s, t):
136+
cdef nmod r
137+
cdef mp_limb_t val
138+
if any_as_nmod(&val, t, (<nmod>s).mod):
139+
r = nmod.__new__(nmod)
140+
r.mod = (<nmod>s).mod
141+
r.val = nmod_mul((<nmod>s).val, val, r.mod)
142+
return r
143+
return NotImplemented
144+
126145
@staticmethod
127146
def _div_(s, t):
128147
cdef nmod r
@@ -152,9 +171,8 @@ cdef class nmod(flint_scalar):
152171
def __truediv__(s, t):
153172
return nmod._div_(s, t)
154173

155-
def __div__(s, t):
156-
return nmod._div_(s, t)
174+
def __rtruediv__(s, t):
175+
return nmod._div_(t, s)
157176

158177
def __invert__(self):
159178
return (1 / self) # XXX: speed up
160-

0 commit comments

Comments
 (0)