Sums of morphisms of elliptic curves

The set Hom(E,E) of morphisms between two elliptic curves forms an abelian group under pointwise addition. An important special case is the endomorphism ring End(E)=Hom(E,E). However, it is not immediately obvious how to compute some properties of the sum φ+ψ of two isogenies, even when both are given explicitly. This class provides functionality for representing sums of elliptic-curve morphisms (in particular, isogenies and endomorphisms) formally, and explicitly computing important properties (such as the degree or the kernel polynomial) from the formal representation.

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: phi + phi
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
  Via:  (Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101)
sage: phi + phi == phi * E.scalar_multiplication(2)
True
sage: phi + phi + phi == phi * E.scalar_multiplication(3)
True
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> phi + phi
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
  Via:  (Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101)
>>> phi + phi == phi * E.scalar_multiplication(Integer(2))
True
>>> phi + phi + phi == phi * E.scalar_multiplication(Integer(3))
True
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
phi + phi
phi + phi == phi * E.scalar_multiplication(2)
phi + phi + phi == phi * E.scalar_multiplication(3)

An example of computing with a supersingular endomorphism ring:

sage: E = EllipticCurve(GF(419^2), [1,0])
sage: i = E.automorphisms()[-1]
sage: j = E.frobenius_isogeny()
sage: i * j == - j * i                          # i,j anticommute
True
sage: (i + j) * i == i^2 - i*j                  # distributive law
True
sage: (j - E.scalar_multiplication(1)).degree() # point counting!
420
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(419)**Integer(2)), [Integer(1),Integer(0)])
>>> i = E.automorphisms()[-Integer(1)]
>>> j = E.frobenius_isogeny()
>>> i * j == - j * i                          # i,j anticommute
True
>>> (i + j) * i == i**Integer(2) - i*j                  # distributive law
True
>>> (j - E.scalar_multiplication(Integer(1))).degree() # point counting!
420
E = EllipticCurve(GF(419^2), [1,0])
i = E.automorphisms()[-1]
j = E.frobenius_isogeny()
i * j == - j * i                          # i,j anticommute
(i + j) * i == i^2 - i*j                  # distributive law
(j - E.scalar_multiplication(1)).degree() # point counting!

AUTHORS:

  • Lorenz Panny (2023)

class sage.schemes.elliptic_curves.hom_sum.EllipticCurveHom_sum(phis, domain=None, codomain=None)[source]

Bases: EllipticCurveHom

Construct a sum morphism of elliptic curves from its summands. (For empty sums, the domain and codomain curves must be given.)

EXAMPLES:

sage: from sage.schemes.elliptic_curves.hom_sum import EllipticCurveHom_sum
sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: EllipticCurveHom_sum([phi, phi])
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
  Via:  (Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101)
>>> from sage.all import *
>>> from sage.schemes.elliptic_curves.hom_sum import EllipticCurveHom_sum
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> EllipticCurveHom_sum([phi, phi])
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
  Via:  (Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101)
from sage.schemes.elliptic_curves.hom_sum import EllipticCurveHom_sum
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
EllipticCurveHom_sum([phi, phi])

The zero morphism can be constructed even between non-isogenous curves:

sage: E1 = EllipticCurve(GF(101), [5,5])
sage: E2 = EllipticCurve(GF(101), [7,7])
sage: E1.is_isogenous(E2)
False
sage: EllipticCurveHom_sum([], E1, E2)
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 7*x + 7 over Finite Field of size 101
  Via:  ()
>>> from sage.all import *
>>> E1 = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> E2 = EllipticCurve(GF(Integer(101)), [Integer(7),Integer(7)])
>>> E1.is_isogenous(E2)
False
>>> EllipticCurveHom_sum([], E1, E2)
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 7*x + 7 over Finite Field of size 101
  Via:  ()
E1 = EllipticCurve(GF(101), [5,5])
E2 = EllipticCurve(GF(101), [7,7])
E1.is_isogenous(E2)
EllipticCurveHom_sum([], E1, E2)
degree()[source]

Return the degree of this sum morphism.

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: (phi + phi).degree()
28
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> (phi + phi).degree()
28
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
(phi + phi).degree()

This method yields a simple toy point-counting algorithm:

sage: E = EllipticCurve(GF(101), [5,5])
sage: m1 = E.scalar_multiplication(1)
sage: pi = E.frobenius_endomorphism()
sage: (pi - m1).degree()
119
sage: E.count_points()
119
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> m1 = E.scalar_multiplication(Integer(1))
>>> pi = E.frobenius_endomorphism()
>>> (pi - m1).degree()
119
>>> E.count_points()
119
E = EllipticCurve(GF(101), [5,5])
m1 = E.scalar_multiplication(1)
pi = E.frobenius_endomorphism()
(pi - m1).degree()
E.count_points()

ALGORITHM: Essentially Schoof’s algorithm; see _compute_degree().

dual()[source]

Return the dual of this sum morphism.

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: (phi + phi).dual()
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  Via:  (Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101)
sage: (phi + phi).dual() == phi.dual() + phi.dual()
True
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> (phi + phi).dual()
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  Via:  (Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101 to Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101)
>>> (phi + phi).dual() == phi.dual() + phi.dual()
True
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
(phi + phi).dual()
(phi + phi).dual() == phi.dual() + phi.dual()

sage: E = EllipticCurve(GF(431^2), [1,0])
sage: iota = E.automorphisms()[2]
sage: m2 = E.scalar_multiplication(2)
sage: endo = m2 + iota
sage: endo.dual()
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2
  To:   Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2
  Via:  (Scalar-multiplication endomorphism [2] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2, Elliptic-curve endomorphism of Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2
  Via:  (u,r,s,t) = (8*z2 + 427, 0, 0, 0))
sage: endo.dual() == (m2 - iota)
True
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(431)**Integer(2)), [Integer(1),Integer(0)])
>>> iota = E.automorphisms()[Integer(2)]
>>> m2 = E.scalar_multiplication(Integer(2))
>>> endo = m2 + iota
>>> endo.dual()
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2
  To:   Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2
  Via:  (Scalar-multiplication endomorphism [2] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2, Elliptic-curve endomorphism of Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 431^2
  Via:  (u,r,s,t) = (8*z2 + 427, 0, 0, 0))
>>> endo.dual() == (m2 - iota)
True
E = EllipticCurve(GF(431^2), [1,0])
iota = E.automorphisms()[2]
m2 = E.scalar_multiplication(2)
endo = m2 + iota
endo.dual()
endo.dual() == (m2 - iota)

ALGORITHM: Taking the dual distributes over addition.

inseparable_degree()[source]

Compute the inseparable degree of this sum morphism.

EXAMPLES:

sage: E = EllipticCurve(GF(7), [0,1])
sage: m3 = E.scalar_multiplication(3)
sage: m3.inseparable_degree()
1
sage: m4 = E.scalar_multiplication(4)
sage: m7 = m3 + m4; m7
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7
  To:   Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7
  Via:  (Scalar-multiplication endomorphism [3] of Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7, Scalar-multiplication endomorphism [4] of Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7)
sage: m7.degree()
49
sage: m7.inseparable_degree()
7
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(7)), [Integer(0),Integer(1)])
>>> m3 = E.scalar_multiplication(Integer(3))
>>> m3.inseparable_degree()
1
>>> m4 = E.scalar_multiplication(Integer(4))
>>> m7 = m3 + m4; m7
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7
  To:   Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7
  Via:  (Scalar-multiplication endomorphism [3] of Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7, Scalar-multiplication endomorphism [4] of Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7)
>>> m7.degree()
49
>>> m7.inseparable_degree()
7
E = EllipticCurve(GF(7), [0,1])
m3 = E.scalar_multiplication(3)
m3.inseparable_degree()
m4 = E.scalar_multiplication(4)
m7 = m3 + m4; m7
m7.degree()
m7.inseparable_degree()

A supersingular example:

sage: E = EllipticCurve(GF(7), [1,0])
sage: m3 = E.scalar_multiplication(3)
sage: m3.inseparable_degree()
1
sage: m4 = E.scalar_multiplication(4)
sage: m7 = m3 + m4; m7
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
  To:   Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
  Via:  (Scalar-multiplication endomorphism [3] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7, Scalar-multiplication endomorphism [4] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7)
sage: m7.inseparable_degree()
49
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(7)), [Integer(1),Integer(0)])
>>> m3 = E.scalar_multiplication(Integer(3))
>>> m3.inseparable_degree()
1
>>> m4 = E.scalar_multiplication(Integer(4))
>>> m7 = m3 + m4; m7
Sum morphism:
  From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
  To:   Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
  Via:  (Scalar-multiplication endomorphism [3] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7, Scalar-multiplication endomorphism [4] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7)
>>> m7.inseparable_degree()
49
E = EllipticCurve(GF(7), [1,0])
m3 = E.scalar_multiplication(3)
m3.inseparable_degree()
m4 = E.scalar_multiplication(4)
m7 = m3 + m4; m7
m7.inseparable_degree()
kernel_polynomial()[source]

Return the kernel polynomial of this sum morphism.

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: (phi + phi).kernel_polynomial()
x^15 + 75*x^14 + 16*x^13 + 59*x^12 + 28*x^11 + 60*x^10 + 69*x^9 + 79*x^8 + 79*x^7 + 52*x^6 + 35*x^5 + 11*x^4 + 37*x^3 + 69*x^2 + 66*x + 63
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> (phi + phi).kernel_polynomial()
x^15 + 75*x^14 + 16*x^13 + 59*x^12 + 28*x^11 + 60*x^10 + 69*x^9 + 79*x^8 + 79*x^7 + 52*x^6 + 35*x^5 + 11*x^4 + 37*x^3 + 69*x^2 + 66*x + 63
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
(phi + phi).kernel_polynomial()

sage: E = EllipticCurve(GF(11), [5,5])
sage: pi = E.frobenius_endomorphism()
sage: m1 = E.scalar_multiplication(1)
sage: (pi - m1).kernel_polynomial()
x^9 + 7*x^8 + 2*x^7 + 4*x^6 + 10*x^4 + 4*x^3 + 9*x^2 + 7*x
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(11)), [Integer(5),Integer(5)])
>>> pi = E.frobenius_endomorphism()
>>> m1 = E.scalar_multiplication(Integer(1))
>>> (pi - m1).kernel_polynomial()
x^9 + 7*x^8 + 2*x^7 + 4*x^6 + 10*x^4 + 4*x^3 + 9*x^2 + 7*x
E = EllipticCurve(GF(11), [5,5])
pi = E.frobenius_endomorphism()
m1 = E.scalar_multiplication(1)
(pi - m1).kernel_polynomial()

ALGORITHM: to_isogeny_chain().

rational_maps()[source]

Return the rational maps of this sum morphism.

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: (phi + phi).rational_maps()
((5*x^28 + 43*x^27 + 26*x^26 - ... + 7*x^2 - 23*x + 38)/(23*x^27 + 16*x^26 + 9*x^25 + ... - 43*x^2 - 22*x + 37),
 (42*x^42*y - 44*x^41*y - 22*x^40*y + ... - 26*x^2*y - 50*x*y - 18*y)/(-24*x^42 - 47*x^41 - 12*x^40 + ... + 18*x^2 - 48*x + 18))
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> (phi + phi).rational_maps()
((5*x^28 + 43*x^27 + 26*x^26 - ... + 7*x^2 - 23*x + 38)/(23*x^27 + 16*x^26 + 9*x^25 + ... - 43*x^2 - 22*x + 37),
 (42*x^42*y - 44*x^41*y - 22*x^40*y + ... - 26*x^2*y - 50*x*y - 18*y)/(-24*x^42 - 47*x^41 - 12*x^40 + ... + 18*x^2 - 48*x + 18))
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
(phi + phi).rational_maps()

ALGORITHM: to_isogeny_chain().

scaling_factor()[source]

Return the Weierstrass scaling factor associated to this sum morphism.

The scaling factor is the constant u (in the base field) such that φω2=uω1, where φ:E1E2 is this morphism and ωi are the standard Weierstrass differentials on Ei defined by dx/(2y+a1x+a3).

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: phi.scaling_factor()
84
sage: (phi + phi).scaling_factor()
67
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> phi.scaling_factor()
84
>>> (phi + phi).scaling_factor()
67
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
phi.scaling_factor()
(phi + phi).scaling_factor()

ALGORITHM: The scaling factor is additive under addition of elliptic-curve morphisms, so we simply add together the scaling factors of the summands().

summands()[source]

Return the individual summands making up this sum morphism.

EXAMPLES:

sage: E = EllipticCurve(j=5)
sage: m2 = E.scalar_multiplication(2)
sage: m3 = E.scalar_multiplication(3)
sage: m2 + m3
Sum morphism:
  From: Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
  To:   Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
  Via:  (Scalar-multiplication endomorphism [2] of Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field, Scalar-multiplication endomorphism [3] of Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field)
>>> from sage.all import *
>>> E = EllipticCurve(j=Integer(5))
>>> m2 = E.scalar_multiplication(Integer(2))
>>> m3 = E.scalar_multiplication(Integer(3))
>>> m2 + m3
Sum morphism:
  From: Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
  To:   Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
  Via:  (Scalar-multiplication endomorphism [2] of Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field, Scalar-multiplication endomorphism [3] of Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field)
E = EllipticCurve(j=5)
m2 = E.scalar_multiplication(2)
m3 = E.scalar_multiplication(3)
m2 + m3
to_isogeny_chain()[source]

Convert this formal sum of elliptic-curve morphisms into a EllipticCurveHom_composite object representing the same morphism.

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: (phi + phi).to_isogeny_chain()
Composite morphism of degree 28 = 4*1*7:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> (phi + phi).to_isogeny_chain()
Composite morphism of degree 28 = 4*1*7:
  From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
  To:   Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
(phi + phi).to_isogeny_chain()

sage: p = 419
sage: E = EllipticCurve(GF(p^2), [1,0])
sage: iota = E.automorphisms()[2]   # sqrt(-1)
sage: pi = E.frobenius_isogeny()    # sqrt(-p)
sage: endo = iota + pi
sage: endo.degree()
420
sage: endo.to_isogeny_chain()
Composite morphism of degree 420 = 4*1*3*5*7:
  From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 419^2
  To:   Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 419^2
>>> from sage.all import *
>>> p = Integer(419)
>>> E = EllipticCurve(GF(p**Integer(2)), [Integer(1),Integer(0)])
>>> iota = E.automorphisms()[Integer(2)]   # sqrt(-1)
>>> pi = E.frobenius_isogeny()    # sqrt(-p)
>>> endo = iota + pi
>>> endo.degree()
420
>>> endo.to_isogeny_chain()
Composite morphism of degree 420 = 4*1*3*5*7:
  From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 419^2
  To:   Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 419^2
p = 419
E = EllipticCurve(GF(p^2), [1,0])
iota = E.automorphisms()[2]   # sqrt(-1)
pi = E.frobenius_isogeny()    # sqrt(-p)
endo = iota + pi
endo.degree()
endo.to_isogeny_chain()

The decomposition is impossible for the constant zero map:

sage: endo = iota*pi + pi*iota
sage: endo.degree()
0
sage: endo.to_isogeny_chain()
Traceback (most recent call last):
...
ValueError: zero morphism cannot be written as a composition of isogenies
>>> from sage.all import *
>>> endo = iota*pi + pi*iota
>>> endo.degree()
0
>>> endo.to_isogeny_chain()
Traceback (most recent call last):
...
ValueError: zero morphism cannot be written as a composition of isogenies
endo = iota*pi + pi*iota
endo.degree()
endo.to_isogeny_chain()

Isomorphisms are supported as well:

sage: E = EllipticCurve(j=5); E
Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
sage: m2 = E.scalar_multiplication(2)
sage: m3 = E.scalar_multiplication(3)
sage: (m2 - m3).to_isogeny_chain()
Composite morphism of degree 1 = 1^2:
  From: Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
  To:   Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
sage: (m2 - m3).rational_maps()
(x, -x - y)
>>> from sage.all import *
>>> E = EllipticCurve(j=Integer(5)); E
Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
>>> m2 = E.scalar_multiplication(Integer(2))
>>> m3 = E.scalar_multiplication(Integer(3))
>>> (m2 - m3).to_isogeny_chain()
Composite morphism of degree 1 = 1^2:
  From: Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
  To:   Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 180*x + 17255 over Rational Field
>>> (m2 - m3).rational_maps()
(x, -x - y)
E = EllipticCurve(j=5); E
m2 = E.scalar_multiplication(2)
m3 = E.scalar_multiplication(3)
(m2 - m3).to_isogeny_chain()
(m2 - m3).rational_maps()
x_rational_map()[source]

Return the x-coordinate rational map of this sum morphism.

EXAMPLES:

sage: E = EllipticCurve(GF(101), [5,5])
sage: phi = E.isogenies_prime_degree(7)[0]
sage: (phi + phi).x_rational_map()
(9*x^28 + 37*x^27 + 67*x^26 + ... + 53*x^2 + 100*x + 28)/(x^27 + 49*x^26 + 97*x^25 + ... + 64*x^2 + 21*x + 6)
>>> from sage.all import *
>>> E = EllipticCurve(GF(Integer(101)), [Integer(5),Integer(5)])
>>> phi = E.isogenies_prime_degree(Integer(7))[Integer(0)]
>>> (phi + phi).x_rational_map()
(9*x^28 + 37*x^27 + 67*x^26 + ... + 53*x^2 + 100*x + 28)/(x^27 + 49*x^26 + 97*x^25 + ... + 64*x^2 + 21*x + 6)
E = EllipticCurve(GF(101), [5,5])
phi = E.isogenies_prime_degree(7)[0]
(phi + phi).x_rational_map()

ALGORITHM: to_isogeny_chain().