Isogeny class of elliptic curves over number fields¶
AUTHORS:
- David Roe (2012-03-29) – initial version.
- John Cremona (2014-08) – extend to number fields.
-
class
sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_EC(E, label=None, empty=False)¶ Bases:
sage.structure.sage_object.SageObjectIsogeny class of an elliptic curve.
Note
The current implementation chooses a curve from each isomorphism class in the isogeny class. Over
this is a unique reduced
minimal model in each isomorphism class. Over number fields the
model chosen may change in future.-
graph()¶ Returns a graph whose vertices correspond to curves in this class, and whose edges correspond to prime degree isogenies.
EXAMPLES:
sage: isocls = EllipticCurve('15a3').isogeny_class() sage: G = isocls.graph() sage: sorted(G._pos.items()) [(1, [-0.8660254, 0.5]), (2, [-0.8660254, 1.5]), (3, [-1.7320508, 0]), (4, [0, 0]), (5, [0, -1]), (6, [0.8660254, 0.5]), (7, [0.8660254, 1.5]), (8, [1.7320508, 0])]
REFERENCES:
[M78] B. Mazur. Rational Isogenies of Prime Degree. Inventiones mathematicae 44,129-162 (1978).
-
index(C)¶ Returns the index of a curve in this class.
INPUT:
C– an elliptic curve in this isogeny class.
OUTPUT:
i– an integer so that theith curve in the class is isomorphic toC
EXAMPLES:
sage: E = EllipticCurve('990j1') sage: iso = E.isogeny_class(order="lmfdb") # orders lexicographically on a-invariants sage: iso.index(E.short_weierstrass_model()) 2
-
isogenies(fill=False)¶ Returns a list of lists of isogenies and 0s, corresponding to the entries of
matrix()INPUT:
fill– boolean (default False). Whether to only return prime degree isogenies. Currently only implemented forfill=False.
OUTPUT:
- a list of lists, where the
jth entry of theith list is either zero or a prime degree isogeny from theith curve in this class to thejth curve.
Warning
The domains and codomains of the isogenies will have the same Weierstrass equation as the curves in this class, but they may not be identical python objects in the current implementation.
EXAMPLES:
sage: isocls = EllipticCurve('15a3').isogeny_class() sage: f = isocls.isogenies()[0][1]; f Isogeny of degree 2 from Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 5*x + 2 over Rational Field to Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 80*x + 242 over Rational Field sage: f.domain() == isocls.curves[0] and f.codomain() == isocls.curves[1] True
-
matrix(fill=True)¶ Returns the matrix whose entries give the minimal degrees of isogenies between curves in this class.
INPUT:
fill– boolean (default True). If False then the matrix will contain only zeros and prime entries; if True it will fill in the other degrees.
EXAMPLES:
sage: isocls = EllipticCurve('15a3').isogeny_class() sage: isocls.matrix() [ 1 2 2 2 4 4 8 8] [ 2 1 4 4 8 8 16 16] [ 2 4 1 4 8 8 16 16] [ 2 4 4 1 2 2 4 4] [ 4 8 8 2 1 4 8 8] [ 4 8 8 2 4 1 2 2] [ 8 16 16 4 8 2 1 4] [ 8 16 16 4 8 2 4 1] sage: isocls.matrix(fill=False) [0 2 2 2 0 0 0 0] [2 0 0 0 0 0 0 0] [2 0 0 0 0 0 0 0] [2 0 0 0 2 2 0 0] [0 0 0 2 0 0 0 0] [0 0 0 2 0 0 2 2] [0 0 0 0 0 2 0 0] [0 0 0 0 0 2 0 0]
-
qf_matrix()¶ Returns the array whose entries are quadratic forms representing the degrees of isogenies between curves in this class (CM case only).
OUTPUT:
a
array (list of lists) of list, each of the form [2] or
[2,1,3] representing the coefficients of an integral quadratic
form in 1 or 2 variables whose values are the possible isogeny
degrees between the i’th and j’th curve in the class.EXAMPLES:
sage: pol = PolynomialRing(QQ,'x')([1,0,3,0,1]) sage: K.<c> = NumberField(pol) sage: j = 1480640+565760*c^2 sage: E = EllipticCurve(j=j) sage: C = E.isogeny_class() sage: C.qf_matrix() [[[1], [2, 2, 3]], [[2, 2, 3], [1]]]
-
reorder(order)¶ Return a new isogeny class with the curves reordered.
INPUT:
order– None, a string or an iterable over all curves in this class. Seesage.schemes.elliptic_curves.ell_rational_field.EllipticCurve_rational_field.isogeny_class()for more details.
OUTPUT:
- Another
IsogenyClass_ECwith the curves reordered (and matrices and maps changed as appropriate)
EXAMPLES:
sage: isocls = EllipticCurve('15a1').isogeny_class() sage: print("\n".join([repr(C) for C in isocls.curves])) Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 10*x - 10 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 5*x + 2 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 + 35*x - 28 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 135*x - 660 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 80*x + 242 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 110*x - 880 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 2160*x - 39540 over Rational Field sage: isocls2 = isocls.reorder('lmfdb') sage: print("\n".join([repr(C) for C in isocls2.curves])) Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 2160*x - 39540 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 135*x - 660 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 110*x - 880 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 80*x + 242 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 10*x - 10 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 - 5*x + 2 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 over Rational Field Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 + 35*x - 28 over Rational Field
-
-
class
sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_EC_NumberField(E)¶ Bases:
sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_ECIsogeny classes for elliptic curves over number fields.
-
copy()¶ Returns a copy (mostly used in reordering).
EXAMPLES:
sage: K.<i> = QuadraticField(-1) sage: E = EllipticCurve(K, [0,0,0,0,1]) sage: C = E.isogeny_class() sage: C2 = C.copy() sage: C is C2 False sage: C == C2 True
-
-
class
sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_EC_Rational(E, algorithm='sage', label=None, empty=False)¶ Bases:
sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_EC_NumberFieldIsogeny classes for elliptic curves over
.-
copy()¶ Returns a copy (mostly used in reordering).
EXAMPLES:
sage: E = EllipticCurve('11a1') sage: C = E.isogeny_class() sage: C2 = C.copy() sage: C is C2 False sage: C == C2 True
-
-
sage.schemes.elliptic_curves.isogeny_class.possible_isogeny_degrees(E, verbose=False)¶ Return a list of primes
sufficient to generate the
isogeny class of
.INPUT:
E– An elliptic curve defined over a number field.
OUTPUT:
A finite list of primes
such that every curve isogenous to
this curve can be obtained by a finite sequence of isogenies of
degree one of the primes in the list.ALGORITHM:
For curves without CM, the set may be taken to be the finite set of primes at which the Galois representation is not surjective, since the existence of an
-isogeny is equivalent to the
image of the mod-
Galois representation being contained in a
Borel subgroup.For curves with CM by the order
of discriminant
, the
Galois representation is always non-surjective and the curve will
admit
-isogenies for infinitely many primes
, but
there are (of course) only finitely many codomains
. The
primes can be divided according to the discriminant
of the CM
order
associated to
: either
, or one contains the
other with index
, since
and vice versa.Case (1):
. The degrees of all isogenies between
and
are precisely the integers represented by one of the classes
of binary quadratic forms
of discriminant
. Hence to
obtain all possible isomorphism classes of codomain
, we need
only use one prime
represented by each such class
. It
would in fact suffice to use primes represented by forms which
generate the class group. Here we simply omit the principal class
and one from each pair of inverse classes, and include a prime
represented by each of the remaining forms.Case (2):
: so
. We include all prime
divisors of
.Case (3):
: we may assume that
does not divide
as we have already included these, so
either splits or
is inert in
; the class numbers satisfy
accordingly. We include all primes
such that
divides the degree
.For curves with only potential CM we proceed as in the CM case, using
instead of
.EXAMPLES:
For curves without CM we determine the primes at which the mod
Galois representation is reducible, i.e. contained in a Borel
subgroup:sage: from sage.schemes.elliptic_curves.isogeny_class import possible_isogeny_degrees sage: E = EllipticCurve('11a1') sage: possible_isogeny_degrees(E) [5]
We check that in this case
really does have rational
-isogenies:sage: [phi.degree() for phi in E.isogenies_prime_degree()] [5, 5]
Over an extension field:
sage: E3 = E.change_ring(CyclotomicField(3)) sage: possible_isogeny_degrees(E3) [5] sage: [phi.degree() for phi in E3.isogenies_prime_degree()] [5, 5]
For curves with CM by a quadratic order of class number greater than
, we use the structure of the class group to only give one
prime in each ideal class:sage: pol = PolynomialRing(QQ,'x')([1,-3,5,-5,5,-3,1]) sage: L.<a> = NumberField(pol) sage: j = hilbert_class_polynomial(-23).roots(L,multiplicities=False)[0] sage: E = EllipticCurve(j=j) sage: from sage.schemes.elliptic_curves.isogeny_class import possible_isogeny_degrees sage: possible_isogeny_degrees(E, verbose=True) CM case, discriminant = -23 initial primes: {2} upward primes: {} downward ramified primes: {} downward split primes: {2, 3} downward inert primes: {5} primes generating the class group: [2] Complete set of primes: {2, 3, 5} [2, 3, 5]
