Skip to content

Commit f196c3a

Browse files
committed
Fix point coercion bug for elliptic curves.
1 parent 3876f76 commit f196c3a

File tree

2 files changed

+43
-13
lines changed

2 files changed

+43
-13
lines changed

src/sage/schemes/elliptic_curves/ell_generic.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,10 @@ def _symbolic_(self, SR):
286286
def __cmp__(self, other):
287287
if not isinstance(other, EllipticCurve_generic):
288288
return -1
289-
return misc.generic_cmp(self.ainvs(), other.ainvs())
289+
t = cmp(self.base_ring(), other.base_ring())
290+
if t:
291+
return t
292+
return cmp(self.ainvs(), other.ainvs())
290293

291294
def __contains__(self, P):
292295
"""
@@ -373,10 +376,23 @@ def __call__(self, *args, **kwds):
373376
(a : 0 : 1)
374377
sage: P+P
375378
(0 : 1 : 0)
379+
380+
Another example involving p-adics:
381+
sage: E = EllipticCurve('37a1')
382+
sage: P = E([0,0]); P
383+
(0 : 0 : 1)
384+
sage: R = pAdicField(3,20)
385+
sage: Ep = E.base_extend(R); Ep
386+
Elliptic Curve defined by y^2 + (1+O(3^20))*y = x^3 + (2+2*3+2*3^2+2*3^3+2*3^4+2*3^5+2*3^6+2*3^7+2*3^8+2*3^9+2*3^10+2*3^11+2*3^12+2*3^13+2*3^14+2*3^15+2*3^16+2*3^17+2*3^18+2*3^19+O(3^20))*x over 3-adic Field with capped relative precision 20
387+
sage: Ep(P)
388+
(0 : 0 : 1 + O(3^20))
376389
"""
377390
if len(args) == 1 and args[0] == 0:
378391
R = self.base_ring()
379392
return self.point([R(0),R(1),R(0)], check=False)
393+
if isinstance(args[0],
394+
(ell_point.EllipticCurvePoint_field, ell_point.EllipticCurvePoint)):
395+
args = tuple(args[0])
380396
return plane_curve.ProjectiveCurve_generic.__call__(self, *args, **kwds)
381397

382398
def lift_x(self, x):

src/sage/schemes/elliptic_curves/ell_rational_field.py

+26-12
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@
8383
next_prime = arith.next_prime
8484

8585
Q = RationalField()
86-
Z = IntegerRing()
8786
C = ComplexField()
8887
R = RealField()
8988

@@ -113,15 +112,15 @@ def __init__(self, ainvs, extra=None):
113112
raise TypeError, "Base field (=%s) must be the Rational Field."%self.base_ring()
114113

115114
def _set_rank(self, r):
116-
self.__rank = r
115+
self.__rank = Integer(r)
117116
def _set_torsion_order(self, t):
118-
self.__torsion_order = t
117+
self.__torsion_order = Integer(t)
119118
def _set_cremona_label(self, L):
120119
self.__cremona_label = L
121120
def _set_conductor(self, N):
122-
self.__conductor_pari = Z(N)
121+
self.__conductor_pari = Integer(N)
123122
def _set_modular_degree(self, deg):
124-
self.__modular_degree = deg
123+
self.__modular_degree = Integer(deg)
125124

126125
def _set_gens(self, gens):
127126
self.__gens = [self.point(x, check=True) for x in gens]
@@ -132,7 +131,7 @@ def is_integral(self):
132131
try:
133132
return self.__is_integral
134133
except AttributeError:
135-
one = Z(1)
134+
one = Integer(1)
136135
self.__is_integral = bool(misc.mul([x.denominator() == 1 for x in self.ainvs()]))
137136
return self.__is_integral
138137

@@ -194,24 +193,24 @@ def conductor(self, algorithm="pari"):
194193
try:
195194
return self.__conductor_pari
196195
except AttributeError:
197-
self.__conductor_pari = Z(self.pari_mincurve().ellglobalred()[0])
196+
self.__conductor_pari = Integer(self.pari_mincurve().ellglobalred()[0])
198197
return self.__conductor_pari
199198

200199
elif algorithm == "gp":
201200
try:
202201
return self.__conductor_gp
203202
except AttributeError:
204-
self.__conductor_gp = Z(gp.eval('ellglobalred(ellinit(%s,0))[1]'%self.a_invariants()))
203+
self.__conductor_gp = Integer(gp.eval('ellglobalred(ellinit(%s,0))[1]'%self.a_invariants()))
205204
return self.__conductor_gp
206205

207206
elif algorithm == "mwrank":
208207
try:
209208
return self.__conductor_mwrank
210209
except AttributeError:
211210
if self.is_integral():
212-
self.__conductor_mwrank = Z(self.mwrank_curve().conductor())
211+
self.__conductor_mwrank = Integer(self.mwrank_curve().conductor())
213212
else:
214-
self.__conductor_mwrank = Z(self.minimal_model().mwrank_curve().conductor())
213+
self.__conductor_mwrank = Integer(self.minimal_model().mwrank_curve().conductor())
215214
return self.__conductor_mwrank
216215

217216
elif algorithm == "all":
@@ -2297,11 +2296,26 @@ def cremona_label(self, space=False):
22972296
return self.cremona_label(space)
22982297

22992298
def label(self):
2299+
r"""
2300+
Exactly the same as the \code{cremona_label()} command.
2301+
"""
23002302
return self.cremona_label()
23012303

23022304
def torsion_order(self):
23032305
"""
23042306
Return the order of the torsion subgroup.
2307+
2308+
EXAMPLES:
2309+
sage: e = EllipticCurve('11a')
2310+
sage: e.torsion_order()
2311+
5
2312+
sage: type(e.torsion_order())
2313+
<type 'sage.rings.integer.Integer'>
2314+
sage: e = EllipticCurve([1,2,3,4,5])
2315+
sage: e.torsion_order()
2316+
1
2317+
sage: type(e.torsion_order())
2318+
<type 'sage.rings.integer.Integer'>
23052319
"""
23062320
try:
23072321
return self.__torsion_order
@@ -3036,7 +3050,7 @@ def sha_an(self, use_database=False):
30363050
T = E.torsion_subgroup().order()
30373051
Sha = (L1_over_omega * T * T) / Q(E.tamagawa_product())
30383052
try:
3039-
Sha = Z(Sha)
3053+
Sha = Integer(Sha)
30403054
except ValueError:
30413055
raise RuntimeError, \
30423056
"There is a bug in sha_an, since the computed conjectural order of Sha is %s, which is not an integer."%Sha
@@ -3060,7 +3074,7 @@ def sha_an(self, use_database=False):
30603074
omega = E.omega()
30613075
Sha = int(round ( (L1 * T * T) / (E.tamagawa_product() * regulator * omega) ))
30623076
try:
3063-
Sha = Z(Sha)
3077+
Sha = Integer(Sha)
30643078
except ValueError:
30653079
raise RuntimeError, \
30663080
"There is a bug in sha_an, since the computed conjectural order of Sha is %s, which is not an integer."%Sha

0 commit comments

Comments
 (0)