AUTHORS:
Bases: sage.structure.sage_object.SageObject
Isogeny 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.
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). |
Returns the index of a curve in this class.
INPUT:
OUTPUT:
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
Returns a list of lists of isogenies and 0s, corresponding to the entries of matrix()
INPUT:
OUTPUT:
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
Returns the matrix whose entries give the minimal degrees of isogenies between curves in this class.
INPUT:
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]
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]]]
Return a new isogeny class with the curves reordered.
INPUT:
OUTPUT:
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
Bases: sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_EC
Isogeny classes for elliptic curves over number fields.
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
Bases: sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_EC_NumberField
Isogeny classes for elliptic curves over .
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
Return a list of primes sufficient to generate the
isogeny class of
.
INPUT:
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]