Elliptic-curve morphisms¶
This class serves as a common parent for various specializations of morphisms between elliptic curves, with the aim of providing a common interface regardless of implementation details.
Current implementations of elliptic-curve morphisms (child classes):
AUTHORS:
See authors of
EllipticCurveIsogeny
. Some of the code in this class was lifted from there.Lorenz Panny (2021): Refactor isogenies and isomorphisms into the common
EllipticCurveHom
interface.
- class sage.schemes.elliptic_curves.hom.EllipticCurveHom¶
Bases:
sage.categories.morphism.Morphism
Base class for elliptic-curve morphisms.
- degree()¶
Return the degree of this elliptic-curve morphism.
Implemented by child classes. For examples, see:
- dual()¶
Return the dual of this elliptic-curve morphism.
Implemented by child classes. For examples, see:
- formal(prec=20)¶
Return the formal isogeny associated to this elliptic-curve morphism as a power series in the variable \(t=-x/y\) on the domain curve.
INPUT:
prec
– (default: 20), the precision with which the computations in the formal group are carried out.
EXAMPLES:
sage: E = EllipticCurve(GF(13),[1,7]) sage: phi = E.isogeny(E(10,4)) sage: phi.formal() t + 12*t^13 + 2*t^17 + 8*t^19 + 2*t^21 + O(t^23)
sage: E = EllipticCurve([0,1]) sage: phi = E.isogeny(E(2,3)) sage: phi.formal(prec=10) t + 54*t^5 + 255*t^7 + 2430*t^9 + 19278*t^11 + O(t^13)
sage: E = EllipticCurve('11a2') sage: R.<x> = QQ[] sage: phi = E.isogeny(x^2 + 101*x + 12751/5) sage: phi.formal(prec=7) t - 2724/5*t^5 + 209046/5*t^7 - 4767/5*t^8 + 29200946/5*t^9 + O(t^10)
- is_injective()¶
Determine whether or not this morphism has trivial kernel.
EXAMPLES:
sage: E = EllipticCurve('11a1') sage: R.<x> = QQ[] sage: f = x^2 + x - 29/5 sage: phi = EllipticCurveIsogeny(E, f) sage: phi.is_injective() False sage: phi = EllipticCurveIsogeny(E, R(1)) sage: phi.is_injective() True
sage: F = GF(7) sage: E = EllipticCurve(j=F(0)) sage: phi = EllipticCurveIsogeny(E, [ E((0,-1)), E((0,1))]) sage: phi.is_injective() False sage: phi = EllipticCurveIsogeny(E, E(0)) sage: phi.is_injective() True
- is_normalized()¶
Determine whether this morphism is a normalized isogeny.
Note
An isogeny \(\varphi\colon E_1\to E_2\) between two given Weierstrass equations is said to be normalized if the \(\varphi^*(\omega_2) = \omega_1\), where \(\omega_1\) and \(\omega_2\) are the invariant differentials on \(E_1\) and \(E_2\) corresponding to the given equation.
ALGORITHM:
The method checks if the leading term of the formal series associated to this isogeny equals \(1\).
EXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import WeierstrassIsomorphism sage: E = EllipticCurve(GF(7), [0,0,0,1,0]) sage: R.<x> = GF(7)[] sage: phi = EllipticCurveIsogeny(E, x) sage: phi.is_normalized() True sage: isom = WeierstrassIsomorphism(phi.codomain(), (3, 0, 0, 0)) sage: phi = isom * phi sage: phi.is_normalized() False sage: isom = WeierstrassIsomorphism(phi.codomain(), (5, 0, 0, 0)) sage: phi = isom * phi sage: phi.is_normalized() True sage: isom = WeierstrassIsomorphism(phi.codomain(), (1, 1, 1, 1)) sage: phi = isom * phi sage: phi.is_normalized() True
sage: F = GF(2^5, 'alpha'); alpha = F.gen() sage: E = EllipticCurve(F, [1,0,1,1,1]) sage: R.<x> = F[] sage: phi = EllipticCurveIsogeny(E, x+1) sage: isom = WeierstrassIsomorphism(phi.codomain(), (alpha, 0, 0, 0)) sage: phi.is_normalized() True sage: phi = isom * phi sage: phi.is_normalized() False sage: isom = WeierstrassIsomorphism(phi.codomain(), (1/alpha, 0, 0, 0)) sage: phi = isom * phi sage: phi.is_normalized() True sage: isom = WeierstrassIsomorphism(phi.codomain(), (1, 1, 1, 1)) sage: phi = isom * phi sage: phi.is_normalized() True
sage: E = EllipticCurve('11a1') sage: R.<x> = QQ[] sage: f = x^3 - x^2 - 10*x - 79/4 sage: phi = EllipticCurveIsogeny(E, f) sage: isom = WeierstrassIsomorphism(phi.codomain(), (2, 0, 0, 0)) sage: phi.is_normalized() True sage: phi = isom * phi sage: phi.is_normalized() False sage: isom = WeierstrassIsomorphism(phi.codomain(), (1/2, 0, 0, 0)) sage: phi = isom * phi sage: phi.is_normalized() True sage: isom = WeierstrassIsomorphism(phi.codomain(), (1, 1, 1, 1)) sage: phi = isom * phi sage: phi.is_normalized() True
- is_separable()¶
Determine whether or not this morphism is separable.
Note
This method currently always returns
True
as Sage does not yet implement inseparable isogenies. This will probably change in the future.EXAMPLES:
sage: E = EllipticCurve(GF(17), [0,0,0,3,0]) sage: phi = EllipticCurveIsogeny(E, E((0,0))) sage: phi.is_separable() True
sage: E = EllipticCurve('11a1') sage: phi = EllipticCurveIsogeny(E, E.torsion_points()) sage: phi.is_separable() True
- is_surjective()¶
Determine whether or not this morphism is surjective.
Note
This method currently always returns
True
, since a non-constant map of algebraic curves must be surjective, and Sage does not yet implement the constant zero map. This will probably change in the future.EXAMPLES:
sage: E = EllipticCurve('11a1') sage: R.<x> = QQ[] sage: f = x^2 + x - 29/5 sage: phi = EllipticCurveIsogeny(E, f) sage: phi.is_surjective() True
sage: E = EllipticCurve(GF(7), [0,0,0,1,0]) sage: phi = EllipticCurveIsogeny(E, E((0,0))) sage: phi.is_surjective() True
sage: F = GF(2^5, 'omega') sage: E = EllipticCurve(j=F(0)) sage: R.<x> = F[] sage: phi = EllipticCurveIsogeny(E, x) sage: phi.is_surjective() True
- is_zero()¶
Check whether this elliptic-curve morphism is the zero map.
Note
This function currently always returns
True
as Sage does not yet implement the constant zero morphism. This will probably change in the future.EXAMPLES:
sage: E = EllipticCurve(j=GF(7)(0)) sage: phi = EllipticCurveIsogeny(E, [E(0,1), E(0,-1)]) sage: phi.is_zero() False
- kernel_polynomial()¶
Return the kernel polynomial of this elliptic-curve morphism.
Implemented by child classes. For examples, see:
- rational_maps()¶
Return the pair of explicit rational maps defining this elliptic-curve morphism as fractions of bivariate polynomials in \(x\) and \(y\).
Implemented by child classes. For examples, see:
- x_rational_map()¶
Return the \(x\)-coordinate rational map of this elliptic-curve morphism as a univariate rational expression in \(x\).
Implemented by child classes. For examples, see: