Sage includes John Cremona’s tables of elliptic curves in an easy-to-use format. The unique instance of the class CremonaDatabase() gives access to the database.
If the optional full CremonaDatabase is not installed, a mini-version is included by default with Sage. It contains Weierstrass equations, rank, and torsion for curves up to conductor 10000.
The large database includes all curves of conductor up to 130,000. It also includes data related to the BSD conjecture and modular degrees for all of these curves, and generators for the Mordell-Weil groups. To install it type the following in Sage:
!sage -i database_cremona_ellcurve
This causes the latest version of the database to be downloaded from the internet. You can also install it from a local copy of the database spkg file, using a command of the form
!sage -i database_cremona_ellcurve-20071019.spkg
Initialize the large Cremona database, if available; otherwise initialize the default mini Cremona database.
TESTS:
sage: c = CremonaDatabase()
sage: from sage.databases.cremona import LargeCremonaDatabase
sage: c is LargeCremonaDatabase() # optional - database_cremona_ellcurve
True
Bases: sage.databases.db.Database
The Cremona database of elliptic curves.
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.allcurves(11)
{'a1': [[0, -1, 1, -10, -20], 0, 5], 'a3': [[0, -1, 1, 0, 0], 0, 5], 'a2': [[0, -1, 1, -7820, -263580], 0, 1]}
Return the allbsd table for conductor N. The entries are:
[id, tamagawa_product, Omega_E, L, Reg_E, Sha_an(E)],
where id is the isogeny class (letter) followed by a number, e.g.,
b3, and L is , where E has rank r.
INPUT:
OUTPUT: dict containing the allbsd table for each isogeny class in conductor N
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.allbsd(12)
{}
sage: c.allbsd(19)['a3'] # optional - database_cremona_ellcurve
['1', '4.0792792004649324322', '0.45325324449610360358', '1', '1']
sage: c.allbsd(12001)['a1'] # optional - database_cremona_ellcurve
['2', '3.2760813524872187381', '1.5491014309050596354', '0.23642597118795194508', '1']
Returns the allcurves table of curves of conductor N.
INPUT:
OUTPUT:
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.allcurves(11)['a3']
[[0, -1, 1, 0, 0], 0, 5]
sage: c.allcurves(12)
{}
sage: c.allcurves(12001)['a1'] # optional - database_cremona_ellcurve
[[1, 0, 0, -101, 382], 1, 1]
Return the allgens table for conductor N.
INPUT:
OUTPUT:
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.allgens(12)
{}
sage: c.allgens(1001)['a1'] # optional - database_cremona_ellcurve
[[61, 181, 1]]
sage: c.allgens(12001)['a1'] # optional - database_cremona_ellcurve
[[7, 2, 1]]
Return the range of conductors that are covered by the database.
OUTPUT: tuple of ints (N1,N2+1) where N1 is the smallest and N2 the largest conductor for which the database is complete.
EXAMPLES:
sage: from sage.databases.cremona import LargeCremonaDatabase # optional - database_cremona_ellcurve
sage: c = LargeCremonaDatabase() # optional - database_cremona_ellcurve
sage: c.conductor_range() # optional - database_cremona_ellcurve
(1, 130001)
Returns the curves table of all optimal curves of conductor N.
INPUT:
OUTPUT:
EXAMPLES:
Optimal curves of conductor 37:
sage: CremonaDatabase().curves(37)
{'a1': [[0, 0, 1, -1, 0], 1, 1], 'b1': [[0, 1, 1, -23, -50], 0, 3]}
Note the ‘h3’, which is the unique case in the tables where the optimal curve doesn’t have label ending in 1:
sage: list(sorted(CremonaDatabase().curves(990).keys()))
['a1', 'b1', 'c1', 'd1', 'e1', 'f1', 'g1', 'h3', 'i1', 'j1', 'k1', 'l1']
TESTS:
sage: c = CremonaDatabase()
sage: c.curves(12001)['a1'] # optional - database_cremona_ellcurve
[[1, 0, 0, -101, 382], 1, 1]
Return the degphi table for conductor N.
INPUT:
OUTPUT:
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.degphi(11) # optional - database_cremona_ellcurve
{'a1': 1}
sage: c.degphi(12001)['c1'] # optional - database_cremona_ellcurve
1640
Return an elliptic curve with given label with some data about it from the database pre-filled in.
INPUT:
OUTPUT: EllipticCurve
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.elliptic_curve('11a1')
Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
sage: c.elliptic_curve('12001a1') # optional - database_cremona_ellcurve
Elliptic Curve defined by y^2 + x*y = x^3 - 101*x + 382 over Rational Field
Returns the elliptic curve in the database of conductor N with minimal ainvs, if it exists, or raises a RuntimeError exception otherwise.
INPUT:
OUTPUT: EllipticCurve
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.elliptic_curve_from_ainvs(11, [0, -1, 1, -10, -20])
Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
sage: c.elliptic_curve_from_ainvs(12001, [1, 0, 0, -101, 382]) # optional - database_cremona_ellcurve
Elliptic Curve defined by y^2 + x*y = x^3 - 101*x + 382 over Rational Field
Returns the isogeny class of elliptic curves that are isogenous to the curve with given Cremona label.
INPUT:
OUTPUT:
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.isogeny_class('11a1')
[Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field,
Elliptic Curve defined by y^2 + y = x^3 - x^2 over Rational Field,
Elliptic Curve defined by y^2 + y = x^3 - x^2 - 7820*x - 263580 over Rational Field]
sage: c.isogeny_class('12001a1') # optional - database_cremona_ellcurve
[Elliptic Curve defined by y^2 + x*y = x^3 - 101*x + 382 over Rational Field]
Return the allcurves data (ainvariants, rank and torsion) for the elliptic curves in the database of given conductor as a list of lists, one for each isogeny class. The curve with number 1 is always listed first.
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.isogeny_classes(11)
[[[[0, -1, 1, -10, -20], 0, 5],
[[0, -1, 1, -7820, -263580], 0, 1],
[[0, -1, 1, 0, 0], 0, 5]]]
sage: c.isogeny_classes(12001) # optional - database_cremona_ellcurve
[[[[1, 0, 0, -101, 382], 1, 1]],
[[[0, 0, 1, -247, 1494], 1, 1]],
[[[0, 0, 1, -4, -18], 1, 1]],
[[[0, 1, 1, -10, 18], 1, 1]]]
Return an iterator through all curves in the database with given conductors.
INPUT:
OUTPUT: generator that iterates over EllipticCurve objects.
EXAMPLES:
sage: [e.cremona_label() for e in CremonaDatabase().iter([11..15])]
['11a1', '11a2', '11a3', '14a1', '14a2', '14a3', '14a4', '14a5',
'14a6', '15a1', '15a2', '15a3', '15a4', '15a5', '15a6', '15a7', '15a8']
Return an iterator through all optimal curves in the database with given conductors.
INPUT:
OUTPUT:
generator that iterates over EllipticCurve objects.
EXAMPLES:
We list optimal curves with conductor up to 20:
sage: [e.cremona_label() for e in CremonaDatabase().iter_optimal([11..20])]
['11a1', '14a1', '15a1', '17a1', '19a1', '20a1']
Note the unfortunate 990h3 special case:
sage: [e.cremona_label() for e in CremonaDatabase().iter_optimal([990])]
['990a1', '990b1', '990c1', '990d1', '990e1', '990f1', '990g1', '990h3', '990i1', '990j1', '990k1', '990l1']
The largest conductor for which the database is complete.
OUTPUT:
EXAMPLES:
sage: from sage.databases.cremona import LargeCremonaDatabase # optional - database_cremona_ellcurve
sage: c = LargeCremonaDatabase() # optional - database_cremona_ellcurve
sage: c.largest_conductor() # optional - database_cremona_ellcurve
130000
Returns a list of all curves with given conductors.
INPUT:
OUTPUT:
EXAMPLES:
sage: CremonaDatabase().list([37])
[Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field,
Elliptic Curve defined by y^2 + y = x^3 + x^2 - 23*x - 50 over Rational Field,
Elliptic Curve defined by y^2 + y = x^3 + x^2 - 1873*x - 31833 over Rational Field,
Elliptic Curve defined by y^2 + y = x^3 + x^2 - 3*x + 1 over Rational Field]
Returns a list of all optimal curves with given conductors.
INPUT:
list of EllipticCurve objects.
OUTPUT:
list of EllipticCurve objects.
EXAMPLES:
sage: CremonaDatabase().list_optimal([37])
[Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field,
Elliptic Curve defined by y^2 + y = x^3 + x^2 - 23*x - 50 over Rational Field]
Returns the number of curves stored in the database with conductor N. If N = 0, returns the total number of curves in the database.
If i is nonzero, returns the number of curves in the i-th isogeny class. If i is a Cremona letter code, e.g., ‘a’ or ‘bc’, it is converted to the corresponding number.
INPUT:
OUTPUT: int
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.number_of_curves(11)
3
sage: c.number_of_curves(37)
4
sage: c.number_of_curves(990)
42
sage: num = c.number_of_curves()
Returns the number of isogeny classes of curves in the database of conductor N. If N is 0, return the total number of isogeny classes of curves in the database.
INPUT:
OUTPUT: int
EXAMPLES:
sage: c = CremonaDatabase()
sage: c.number_of_isogeny_classes(11)
1
sage: c.number_of_isogeny_classes(37)
2
sage: num = c.number_of_isogeny_classes()
Returns a random curve from the database.
EXAMPLES:
sage: CremonaDatabase().random() # random -- depends on database installed
Elliptic Curve defined by y^2 + x*y = x^3 - x^2 - 224*x + 3072 over Rational Field
The smallest conductor for which the database is complete: always 1.
OUTPUT:
Note
This always returns the integer 1, since that is the smallest conductor for which the database is complete, although there are no elliptic curves of conductor 1. The smallest conductor of a curve in the database is 11.
EXAMPLES:
sage: CremonaDatabase().smallest_conductor()
1
Bases: sage.databases.cremona.LargeCremonaDatabase
A mini version of the Cremona database that contains only the Weierstrass equations, rank and torsion of elliptic curves of conductor up to 10000 and nothing else.
TESTS:
Many of the following only work if the large Cremona database is installed. Given only the mini version, we expect them to fail gracefully:
sage: from sage.databases.cremona import MiniCremonaDatabase
sage: c = MiniCremonaDatabase()
sage: c.allbsd(11)
{}
sage: c.allbsd(12001)
{}
sage: c.allcurves(12001)
{}
sage: c.allgens(11)
{}
sage: c.allgens(12001)
{}
sage: c.curves(12001)
{}
sage: c.degphi(11)
{}
sage: c.degphi(12001)
{}
sage: c.elliptic_curve('12001a1')
Traceback (most recent call last):
...
RuntimeError: There is no elliptic curve with label 12001a1 in the default database; try installing the optional package database_cremona_ellcurve-20071019 which contains all curves of conductor up to 130000
sage: c.elliptic_curve_from_ainvs(12001, [1, 0, 0, -101, 382])
Traceback (most recent call last):
...
RuntimeError: No elliptic curve of conductor N (=12001) and ainvs (=[1, 0, 0, -101, 382]) in the database.
sage: c.isogeny_class('12001a1')
[]
sage: c.isogeny_classes(12001)
[]
sage: c.number_of_curves(12001)
0
sage: c.number_of_isogeny_classes(12001)
0
Converts class id string into an integer. Note that this is the inverse of cremona_letter_code.
EXAMPLES:
sage: import sage.databases.cremona as cremona
sage: cremona.class_to_int('ba')
26
sage: cremona.class_to_int('cremona')
821863562
sage: cremona.cremona_letter_code(821863562)
'cremona'
Comparison function for curve id strings.
Note
Not the same as standard lexicographic order!
EXAMPLES:
sage: import sage.databases.cremona as cremona
sage: cremona.cmp_code('ba1','z1')
1
By contrast:
sage: cmp('ba1','z1')
-1
Returns the Cremona letter code corresponding to an integer. For example, 0 - a 25 - z 26 - ba 51 - bz 52 - ca 53 - cb etc.
Note
This is just the base 26 representation of n, where a=0, b=1, ..., z=25. This extends the old Cremona notation (counting from 0) for the first 26 classes, and is different for classes above 26.
INPUT:
OUTPUT: str
EXAMPLES:
sage: from sage.databases.cremona import cremona_letter_code
sage: cremona_letter_code(0)
'a'
sage: cremona_letter_code(26)
'ba'
sage: cremona_letter_code(27)
'bb'
sage: cremona_letter_code(521)
'ub'
sage: cremona_letter_code(53)
'cb'
sage: cremona_letter_code(2005)
'czd'
TESTS:
sage: cremona_letter_code(QQ)
Traceback (most recent call last):
...
ValueError: Cremona letter codes are only defined for non-negative integers
sage: cremona_letter_code(x)
Traceback (most recent call last):
...
ValueError: Cremona letter codes are only defined for non-negative integers
sage: cremona_letter_code(-1)
Traceback (most recent call last):
...
ValueError: Cremona letter codes are only defined for non-negative integers
sage: cremona_letter_code(3.14159)
Traceback (most recent call last):
...
ValueError: Cremona letter codes are only defined for non-negative integers
Returns true if the Cremona id refers to an optimal curve, and false otherwise. The curve is optimal if the id, which is of the form [letter code][number] has number 1.
Note
990h3 is the optimal curve in that class, so doesn’t obey this rule.
INPUT:
OUTPUT: bool
EXAMPLES:
sage: from sage.databases.cremona import is_optimal_id
sage: is_optimal_id('b1')
True
sage: is_optimal_id('bb1')
True
sage: is_optimal_id('c1')
True
sage: is_optimal_id('c2')
False
Returns the old Cremona letter code corresponding to an integer. integer.
For example:
1 --> A
26 --> Z
27 --> AA
52 --> ZZ
53 --> AAA
etc.
INPUT:
OUTPUT: str
EXAMPLES:
sage: from sage.databases.cremona import old_cremona_letter_code
sage: old_cremona_letter_code(1)
'A'
sage: old_cremona_letter_code(26)
'Z'
sage: old_cremona_letter_code(27)
'AA'
sage: old_cremona_letter_code(521)
'AAAAAAAAAAAAAAAAAAAAA'
sage: old_cremona_letter_code(53)
'AAA'
sage: old_cremona_letter_code(2005)
'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'
Given a Cremona label that defines an elliptic curve, e.g., 11A1 or 37B3, parse the label and return the conductor, isogeny class label, and number.
The isogeny number may be omitted, in which case it defaults to 1. If the isogeny number and letter are both omitted, so label is just a string representing a conductor, then the label defaults to ‘A’ and the number to 1.
INPUT:
OUTPUT:
EXAMPLES:
sage: from sage.databases.cremona import parse_cremona_label
sage: parse_cremona_label('37a2')
(37, 'a', 2)
sage: parse_cremona_label('37b1')
(37, 'b', 1)
sage: parse_cremona_label('10bb2')
(10, 'bb', 2)
Rebuild the LargeCremonaDatabase from scratch using the data_tgz tarball.
Splits class+curve id string into its two parts.
EXAMPLES:
sage: import sage.databases.cremona as cremona
sage: cremona.split_code('ba2')
('ba', '2')