I ran into an unexpected error in EllipticCurve_from_cubic, with the following cubic and rational point:
R.<x,y,z> = QQ[] cubic = -3*x^2*y + 3*x*y^2 + 4*x^2*z + 4*y^2*z - 3*x*z^2 + 3*y*z^2 - 8*z^3 EllipticCurve_from_cubic(cubic, (-4/5, 4/5, 3/5)) Note that it works as expected using instead the different rational point (1, 1, 0). On investigation, I found there is a case that isn’t handled correctly. The code computes P2 = chord_and_tangent(F, P) and if P2 is projectively equivalent to P then it uses a different algorithm. If they’re different, it then computes P3 = chord_and_tangent(F, P2) and uses an algorithm that fails if P3 is equivalent to P2. I think the attached patch fixes this problem. At least, with this patch it now works for my examples. Best wishes, Robin -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at https://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.
diff --git a/src/sage/schemes/elliptic_curves/constructor.py b/src/sage/schemes/elliptic_curves/constructor.py index ec2d59c..d28dda3 100644 --- a/src/sage/schemes/elliptic_curves/constructor.py +++ b/src/sage/schemes/elliptic_curves/constructor.py @@ -873,6 +873,16 @@ def EllipticCurve_from_cubic(F, P, morphism=True): sage: cubic = x^2*y + 4*x*y^2 + x^2*z + 8*x*y*z + 4*y^2*z + 9*x*z^2 + 9*y*z^2 sage: EllipticCurve_from_cubic(cubic, [1,-1,1], morphism=False) Elliptic Curve defined by y^2 - 882*x*y - 2560000*y = x^3 - 127281*x^2 over Rational Field + + sage: R.<x,y,z> = QQ[] + sage: cubic = -3*x^2*y + 3*x*y^2 + 4*x^2*z + 4*y^2*z - 3*x*z^2 + 3*y*z^2 - 8*z^3 + sage: EllipticCurve_from_cubic(cubic, (-4/5, 4/5, 3/5) ) + Scheme morphism: + From: Closed subscheme of Projective Space of dimension 2 over Rational Field defined by: + -3*x^2*y + 3*x*y^2 + 4*x^2*z + 4*y^2*z - 3*x*z^2 + 3*y*z^2 - 8*z^3 + To: Elliptic Curve defined by y^2 + 10*x*y + 112*y = x^3 + 46*x^2 + 336*x over Rational Field + Defn: Defined on coordinates by sending (x : y : z) to + (1/3*z : y - 1/3*z : 1/112*x - 1/112*y - 1/42*z) """ import sage.matrix.all as matrix @@ -895,9 +905,18 @@ def EllipticCurve_from_cubic(F, P, morphism=True): raise TypeError('%s is not a projective point'%P) x, y, z = R.gens() - # First case: if P = P2 then P is a flex + # First case: if P = P2 then P is a flex, or if P2 = P3 then P2 is a flex P2 = chord_and_tangent(F, P) + flex_point = None if are_projectively_equivalent(P, P2, base_ring=K): + flex_point = P + else: + P3 = chord_and_tangent(F, P2) + if are_projectively_equivalent(P2, P3, base_ring=K): + flex_point = P2 + + if flex_point is not None: + P = flex_point # find the tangent to F in P dx = K(F.derivative(x)(P)) dy = K(F.derivative(y)(P)) @@ -934,9 +953,8 @@ def EllipticCurve_from_cubic(F, P, morphism=True): fwd_defining_poly = [trans_x, trans_y, -b*trans_z] fwd_post = -a - # Second case: P is not a flex, then P, P2, P3 are different + # Second case: P, P2, P3 are different else: - P3 = chord_and_tangent(F, P2) # send P, P2, P3 to (1:0:0), (0:1:0), (0:0:1) respectively M = matrix.matrix(K, [P, P2, P3]).transpose() F2 = M.act_on_polynomial(F)