Cremona’s tables of elliptic curves¶
Sage includes John Cremona’s tables of elliptic curves in an easy-to-use format. An 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 in John Cremona’s tables. 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 via the optional database_cremona_ellcurve package, run the following command in the shell
sage -i database_cremona_ellcurve
This causes the latest version of the database to be downloaded from the internet.
Both the mini and full versions of John Cremona’s tables are stored in SAGE_SHARE/cremona as SQLite databases. The mini version has the layout:
CREATE TABLE t_class(conductor INTEGER, class TEXT PRIMARY KEY, rank INTEGER);
CREATE TABLE t_curve(class TEXT, curve TEXT PRIMARY KEY, eqn TEXT UNIQUE, tors INTEGER);
CREATE INDEX i_t_class_conductor ON t_class(conductor);
CREATE INDEX i_t_curve_class ON t_curve(class);
while the full version has the layout:
CREATE TABLE t_class(conductor INTEGER, class TEXT PRIMARY KEY, rank INTEGER, L REAL, deg INTEGER);
CREATE TABLE t_curve(class TEXT, curve TEXT PRIMARY KEY, eqn TEXT UNIQUE, gens TEXT, tors INTEGER, cp INTEGER, om REAL, reg REAL, sha);
CREATE INDEX i_t_class_conductor ON t_class(conductor);
CREATE INDEX i_t_curve_class ON t_curve(class);
- sage.databases.cremona.CremonaDatabase(name=None, mini=None, set_global=None)[source]¶
Initialize the Cremona database with name
name
. Ifname
isNone
it instead initializes large Cremona database (named ‘cremona’), if available or default mini Cremona database (named ‘cremona mini’).If the Cremona database in question is in the format of the mini database, you must set
mini=True
, otherwise it must be set toFalse
.
- class sage.databases.cremona.LargeCremonaDatabase(name, read_only=True, build=False)[source]¶
Bases:
MiniCremonaDatabase
The Cremona database of elliptic curves.
EXAMPLES:
sage: c = CremonaDatabase('cremona') # optional - database_cremona_ellcurve sage: c.allcurves(11) # optional - database_cremona_ellcurve {'a1': [[0, -1, 1, -10, -20], 0, 5], 'a2': [[0, -1, 1, -7820, -263580], 0, 1], 'a3': [[0, -1, 1, 0, 0], 0, 5]}
>>> from sage.all import * >>> c = CremonaDatabase('cremona') # optional - database_cremona_ellcurve >>> c.allcurves(Integer(11)) # optional - database_cremona_ellcurve {'a1': [[0, -1, 1, -10, -20], 0, 5], 'a2': [[0, -1, 1, -7820, -263580], 0, 1], 'a3': [[0, -1, 1, 0, 0], 0, 5]}
- allbsd(N)[source]¶
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 \(L^r(E,1)/r!\), where E has rank r.
INPUT:
N
– integer; the conductor
OUTPUT: dictionary containing the allbsd table for each isogeny class in conductor N
EXAMPLES:
sage: c = CremonaDatabase() sage: c.allbsd(12) # optional - database_cremona_ellcurve {} sage: c.allbsd(19)['a3'] # optional - database_cremona_ellcurve [1, 4.07927920046493, 0.453253244496104, 1.0, 1] sage: c.allbsd(12001)['a1'] # optional - database_cremona_ellcurve [2, 3.27608135248722, 1.54910143090506, 0.236425971187952, 1.0]
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.allbsd(Integer(12)) # optional - database_cremona_ellcurve {} >>> c.allbsd(Integer(19))['a3'] # optional - database_cremona_ellcurve [1, 4.07927920046493, 0.453253244496104, 1.0, 1] >>> c.allbsd(Integer(12001))['a1'] # optional - database_cremona_ellcurve [2, 3.27608135248722, 1.54910143090506, 0.236425971187952, 1.0]
- allgens(N)[source]¶
Return the allgens table for conductor N.
INPUT:
N
– integer; the conductor
OUTPUT: dictionary; id:[points, …], …
EXAMPLES:
sage: c = CremonaDatabase() sage: c.allgens(12) # optional - database_cremona_ellcurve {} sage: c.allgens(1001)['a1'] # optional - database_cremona_ellcurve [[61, 181, 1]] sage: c.allgens(12001)['a1'] # optional - database_cremona_ellcurve [[7, 2, 1]]
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.allgens(Integer(12)) # optional - database_cremona_ellcurve {} >>> c.allgens(Integer(1001))['a1'] # optional - database_cremona_ellcurve [[61, 181, 1]] >>> c.allgens(Integer(12001))['a1'] # optional - database_cremona_ellcurve [[7, 2, 1]]
- degphi(N)[source]¶
Return the degphi table for conductor N.
INPUT:
N
– integer; the conductor
OUTPUT: dictionary; id:degphi, …
EXAMPLES:
sage: c = CremonaDatabase() sage: c.degphi(11) # optional - database_cremona_ellcurve {'a1': 1} sage: c.degphi(12001)['c1'] # optional - database_cremona_ellcurve 1640
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.degphi(Integer(11)) # optional - database_cremona_ellcurve {'a1': 1} >>> c.degphi(Integer(12001))['c1'] # optional - database_cremona_ellcurve 1640
- class sage.databases.cremona.MiniCremonaDatabase(name, read_only=True, build=False)[source]¶
Bases:
SQLDatabase
The Cremona database of elliptic curves.
EXAMPLES:
sage: c = CremonaDatabase() sage: c.allcurves(11) {'a1': [[0, -1, 1, -10, -20], 0, 5], 'a2': [[0, -1, 1, -7820, -263580], 0, 1], 'a3': [[0, -1, 1, 0, 0], 0, 5]}
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.allcurves(Integer(11)) {'a1': [[0, -1, 1, -10, -20], 0, 5], 'a2': [[0, -1, 1, -7820, -263580], 0, 1], 'a3': [[0, -1, 1, 0, 0], 0, 5]}
- allcurves(N)[source]¶
Return the allcurves table of curves of conductor N.
INPUT:
N
– integer; the conductor
OUTPUT: dictionary; id:[ainvs, rank, tor], …
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]
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.allcurves(Integer(11))['a3'] [[0, -1, 1, 0, 0], 0, 5] >>> c.allcurves(Integer(12)) {} >>> c.allcurves(Integer(12001))['a1'] # optional - database_cremona_ellcurve [[1, 0, 0, -101, 382], 1, 1]
- coefficients_and_data(label)[source]¶
Return the Weierstrass coefficients and other data for the curve with given label.
EXAMPLES:
sage: c, d = CremonaDatabase().coefficients_and_data('144b1') sage: c [0, 0, 0, 6, 7] sage: d['conductor'] 144 sage: d['cremona_label'] '144b1' sage: d['rank'] 0 sage: d['torsion_order'] 2
>>> from sage.all import * >>> c, d = CremonaDatabase().coefficients_and_data('144b1') >>> c [0, 0, 0, 6, 7] >>> d['conductor'] 144 >>> d['cremona_label'] '144b1' >>> d['rank'] 0 >>> d['torsion_order'] 2
Check that Issue #17904 is fixed:
sage: 'gens' in CremonaDatabase().coefficients_and_data('100467a2')[1] # optional - database_cremona_ellcurve True
>>> from sage.all import * >>> 'gens' in CremonaDatabase().coefficients_and_data('100467a2')[Integer(1)] # optional - database_cremona_ellcurve True
- conductor_range()[source]¶
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: c = CremonaDatabase('cremona mini') sage: c.conductor_range() (1, 10000)
>>> from sage.all import * >>> c = CremonaDatabase('cremona mini') >>> c.conductor_range() (1, 10000)
- curves(N)[source]¶
Return the curves table of all optimal curves of conductor N.
INPUT:
N
– integer; the conductor
OUTPUT: dictionary; id:[ainvs, rank, tor], …
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]}
>>> from sage.all import * >>> CremonaDatabase().curves(Integer(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: sorted(CremonaDatabase().curves(990)) ['a1', 'b1', 'c1', 'd1', 'e1', 'f1', 'g1', 'h3', 'i1', 'j1', 'k1', 'l1']
>>> from sage.all import * >>> sorted(CremonaDatabase().curves(Integer(990))) ['a1', 'b1', 'c1', 'd1', 'e1', 'f1', 'g1', 'h3', 'i1', 'j1', 'k1', 'l1']
- data_from_coefficients(ainvs)[source]¶
Return elliptic curve data for the curve with given Weierstrass coefficients.
EXAMPLES:
sage: d = CremonaDatabase().data_from_coefficients([1, -1, 1, 31, 128]) sage: d['conductor'] 1953 sage: d['cremona_label'] '1953c1' sage: d['rank'] 1 sage: d['torsion_order'] 2
>>> from sage.all import * >>> d = CremonaDatabase().data_from_coefficients([Integer(1), -Integer(1), Integer(1), Integer(31), Integer(128)]) >>> d['conductor'] 1953 >>> d['cremona_label'] '1953c1' >>> d['rank'] 1 >>> d['torsion_order'] 2
Check that Issue #17904 is fixed:
sage: ai = EllipticCurve('100467a2').ainvs() # optional - database_cremona_ellcurve sage: 'gens' in CremonaDatabase().data_from_coefficients(ai) # optional - database_cremona_ellcurve True
>>> from sage.all import * >>> ai = EllipticCurve('100467a2').ainvs() # optional - database_cremona_ellcurve >>> 'gens' in CremonaDatabase().data_from_coefficients(ai) # optional - database_cremona_ellcurve True
- elliptic_curve(label)[source]¶
Return an elliptic curve with given label with some data about it from the database pre-filled in.
INPUT:
label
– string (Cremona or LMFDB label)
OUTPUT: an
sage.schemes.elliptic_curves.ell_rational_field.EllipticCurve_rational_field
Note
For more details on LMFDB labels see
parse_lmfdb_label()
.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 sage: c.elliptic_curve('48c1') Traceback (most recent call last): ... ValueError: There is no elliptic curve with label 48c1 in the database
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.elliptic_curve('11a1') Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field >>> c.elliptic_curve('12001a1') # optional - database_cremona_ellcurve Elliptic Curve defined by y^2 + x*y = x^3 - 101*x + 382 over Rational Field >>> c.elliptic_curve('48c1') Traceback (most recent call last): ... ValueError: There is no elliptic curve with label 48c1 in the database
You can also use LMFDB labels:
sage: c.elliptic_curve('462.f3') Elliptic Curve defined by y^2 + x*y = x^3 - 363*x + 1305 over Rational Field
>>> from sage.all import * >>> c.elliptic_curve('462.f3') Elliptic Curve defined by y^2 + x*y = x^3 - 363*x + 1305 over Rational Field
- elliptic_curve_from_ainvs(ainvs)[source]¶
Return the elliptic curve in the database of with minimal
ainvs
if it exists.This raises a
RuntimeError
exception otherwise.INPUT:
ainvs
– list (5-tuple of int’s); the minimal Weierstrass model for an elliptic curve
OUTPUT: EllipticCurve
EXAMPLES:
sage: c = CremonaDatabase() sage: c.elliptic_curve_from_ainvs([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([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
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.elliptic_curve_from_ainvs([Integer(0), -Integer(1), Integer(1), -Integer(10), -Integer(20)]) Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field >>> c.elliptic_curve_from_ainvs([Integer(1), Integer(0), Integer(0), -Integer(101), Integer(382)]) # optional - database_cremona_ellcurve Elliptic Curve defined by y^2 + x*y = x^3 - 101*x + 382 over Rational Field
Old (pre-2006) Cremona labels are also allowed:
sage: c.elliptic_curve('9450KKKK1') Elliptic Curve defined by y^2 + x*y + y = x^3 - x^2 - 5*x + 7 over Rational Field
>>> from sage.all import * >>> c.elliptic_curve('9450KKKK1') Elliptic Curve defined by y^2 + x*y + y = x^3 - x^2 - 5*x + 7 over Rational Field
Make sure Issue #12565 is fixed:
sage: c.elliptic_curve('10a1') Traceback (most recent call last): ... ValueError: There is no elliptic curve with label 10a1 in the database
>>> from sage.all import * >>> c.elliptic_curve('10a1') Traceback (most recent call last): ... ValueError: There is no elliptic curve with label 10a1 in the database
- isogeny_class(label)[source]¶
Return the isogeny class of elliptic curves that are isogenous to the curve with given Cremona label.
INPUT:
label
– string
OUTPUT: list of EllipticCurve objects
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 - 7820*x - 263580 over Rational Field, Elliptic Curve defined by y^2 + y = x^3 - x^2 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]
>>> from sage.all import * >>> c = CremonaDatabase() >>> 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 - 7820*x - 263580 over Rational Field, Elliptic Curve defined by y^2 + y = x^3 - x^2 over Rational Field] >>> c.isogeny_class('12001a1') # optional - database_cremona_ellcurve [Elliptic Curve defined by y^2 + x*y = x^3 - 101*x + 382 over Rational Field]
- isogeny_classes(conductor)[source]¶
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]]]
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.isogeny_classes(Integer(11)) [[[[0, -1, 1, -10, -20], 0, 5], [[0, -1, 1, -7820, -263580], 0, 1], [[0, -1, 1, 0, 0], 0, 5]]] >>> c.isogeny_classes(Integer(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]]]
- iter(conductors)[source]¶
Return an iterator through all curves in the database with given conductors.
INPUT:
conductors
– list or generator of ints
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']
>>> from sage.all import * >>> [e.cremona_label() for e in CremonaDatabase().iter((ellipsis_range(Integer(11),Ellipsis,Integer(15))))] ['11a1', '11a2', '11a3', '14a1', '14a2', '14a3', '14a4', '14a5', '14a6', '15a1', '15a2', '15a3', '15a4', '15a5', '15a6', '15a7', '15a8']
- iter_optimal(conductors)[source]¶
Return an iterator through all optimal curves in the database with given conductors.
INPUT:
conductors
– list or generator of ints
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']
>>> from sage.all import * >>> [e.cremona_label() for e in CremonaDatabase().iter_optimal((ellipsis_range(Integer(11),Ellipsis,Integer(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']
>>> from sage.all import * >>> [e.cremona_label() for e in CremonaDatabase().iter_optimal([Integer(990)])] ['990a1', '990b1', '990c1', '990d1', '990e1', '990f1', '990g1', '990h3', '990i1', '990j1', '990k1', '990l1']
- largest_conductor()[source]¶
The largest conductor for which the database is complete.
OUTPUT: integer; largest conductor
EXAMPLES:
sage: c = CremonaDatabase('cremona mini') sage: c.largest_conductor() 9999
>>> from sage.all import * >>> c = CremonaDatabase('cremona mini') >>> c.largest_conductor() 9999
- list(conductors)[source]¶
Return a list of all curves with given conductors.
INPUT:
conductors
– list or generator of ints
OUTPUT: list of EllipticCurve objects
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]
>>> from sage.all import * >>> CremonaDatabase().list([Integer(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]
- list_optimal(conductors)[source]¶
Return a list of all optimal curves with given conductors.
INPUT:
conductors
– list or generator of ints 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]
>>> from sage.all import * >>> CremonaDatabase().list_optimal([Integer(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]
- number_of_curves(N=0, i=0)[source]¶
Return 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:
N
– integeri
– integer or string
OUTPUT: integer
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()
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.number_of_curves(Integer(11)) 3 >>> c.number_of_curves(Integer(37)) 4 >>> c.number_of_curves(Integer(990)) 42 >>> num = c.number_of_curves()
- number_of_isogeny_classes(N=0)[source]¶
Return 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:
N
– integer
OUTPUT: integer
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()
>>> from sage.all import * >>> c = CremonaDatabase() >>> c.number_of_isogeny_classes(Integer(11)) 1 >>> c.number_of_isogeny_classes(Integer(37)) 2 >>> num = c.number_of_isogeny_classes()
- random()[source]¶
Return 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
>>> from sage.all import * >>> 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
- smallest_conductor()[source]¶
The smallest conductor for which the database is complete: always 1.
OUTPUT: integer; smallest conductor
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
>>> from sage.all import * >>> CremonaDatabase().smallest_conductor() 1
- sage.databases.cremona.build(name, data_tgz, largest_conductor=0, mini=False, decompress=True)[source]¶
Build the CremonaDatabase with given name from scratch using the data_tgz tarball.
Note
For data up to level 350000, this function takes about 3m40s. The resulting database occupies 426MB disk space.
To create the large Cremona database from Cremona’s data_tgz tarball, obtainable from http://homepages.warwick.ac.uk/staff/J.E.Cremona/ftp/data/, run the following command:
sage: d = sage.databases.cremona.build('cremona','ecdata.tgz') # not tested
>>> from sage.all import * >>> d = sage.databases.cremona.build('cremona','ecdata.tgz') # not tested
- sage.databases.cremona.class_to_int(k)[source]¶
Convert 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'
>>> from sage.all import * >>> import sage.databases.cremona as cremona >>> cremona.class_to_int('ba') 26 >>> cremona.class_to_int('cremona') 821863562 >>> cremona.cremona_letter_code(Integer(821863562)) 'cremona'
- sage.databases.cremona.cremona_letter_code(n)[source]¶
Return 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:
n
– nonnegative integer
OUTPUT: string
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'
>>> from sage.all import * >>> from sage.databases.cremona import cremona_letter_code >>> cremona_letter_code(Integer(0)) 'a' >>> cremona_letter_code(Integer(26)) 'ba' >>> cremona_letter_code(Integer(27)) 'bb' >>> cremona_letter_code(Integer(521)) 'ub' >>> cremona_letter_code(Integer(53)) 'cb' >>> cremona_letter_code(Integer(2005)) 'czd'
- sage.databases.cremona.cremona_to_lmfdb(cremona_label, CDB=None)[source]¶
Convert a Cremona label into an LMFDB label.
See
parse_lmfdb_label()
for an explanation of LMFDB labels.INPUT:
cremona_label
– string, the Cremona label of a curve; this can be the label of a curve (e.g. ‘990j1’) or of an isogeny class (e.g. ‘990j’)CDB
– the Cremona database in which to look up the isogeny classes of the same conductor
OUTPUT:
lmfdb_label
; string, the corresponding LMFDB labelEXAMPLES:
sage: from sage.databases.cremona import cremona_to_lmfdb, lmfdb_to_cremona sage: cremona_to_lmfdb('990j1') '990.h3' sage: lmfdb_to_cremona('990.h3') '990j1'
>>> from sage.all import * >>> from sage.databases.cremona import cremona_to_lmfdb, lmfdb_to_cremona >>> cremona_to_lmfdb('990j1') '990.h3' >>> lmfdb_to_cremona('990.h3') '990j1'
- sage.databases.cremona.is_optimal_id(id)[source]¶
Return
True
if the Cremona id refers to an optimal curve, andFalse
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:
id
– string of form letter code followed by an integer, e.g., a3, bb5, etc.
OUTPUT: boolean
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
>>> from sage.all import * >>> from sage.databases.cremona import is_optimal_id >>> is_optimal_id('b1') True >>> is_optimal_id('bb1') True >>> is_optimal_id('c1') True >>> is_optimal_id('c2') False
- sage.databases.cremona.lmfdb_to_cremona(lmfdb_label, CDB=None)[source]¶
Convert an LMFDB label into a Cremona label.
See
parse_lmfdb_label()
for an explanation of LMFDB labels.INPUT:
lmfdb_label
– string, the LMFDB label of a curve; this can be the label of a curve (e.g. ‘990.j1’) or of an isogeny class (e.g. ‘990.j’)CDB
– the Cremona database in which to look up the isogeny classes of the same conductor
OUTPUT:
cremona_label
; a string, the corresponding Cremona labelEXAMPLES:
sage: from sage.databases.cremona import cremona_to_lmfdb, lmfdb_to_cremona sage: lmfdb_to_cremona('990.h3') '990j1' sage: cremona_to_lmfdb('990j1') '990.h3'
>>> from sage.all import * >>> from sage.databases.cremona import cremona_to_lmfdb, lmfdb_to_cremona >>> lmfdb_to_cremona('990.h3') '990j1' >>> cremona_to_lmfdb('990j1') '990.h3'
- sage.databases.cremona.old_cremona_letter_code(n)[source]¶
Return the old Cremona letter code corresponding to an integer.
For example:
1 --> A 26 --> Z 27 --> AA 52 --> ZZ 53 --> AAA etc.
INPUT:
n
– integer
OUTPUT: string
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'
>>> from sage.all import * >>> from sage.databases.cremona import old_cremona_letter_code >>> old_cremona_letter_code(Integer(1)) 'A' >>> old_cremona_letter_code(Integer(26)) 'Z' >>> old_cremona_letter_code(Integer(27)) 'AA' >>> old_cremona_letter_code(Integer(521)) 'AAAAAAAAAAAAAAAAAAAAA' >>> old_cremona_letter_code(Integer(53)) 'AAA' >>> old_cremona_letter_code(Integer(2005)) 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'
- sage.databases.cremona.parse_cremona_label(label, numerical_class_code=False)[source]¶
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.
For this function, the curve number may be omitted, in which case it defaults to 1. If the curve number and isogeny class are both omitted (label is just a string representing a conductor), then the isogeny class defaults to ‘a’ and the number to 1. Valid labels consist of one or more digits, followed by zero or more letters (either all in upper case for an old Cremona label, or all in lower case), followed by zero or more digits.
INPUT:
label
– string; a valid Cremona elliptic curve labelnumerical_class_code
– boolean (default:False
); ifTrue
, convert the isogeny class label from a letter code in base 26 to an integer. This is useful for sorting.
OUTPUT:
integer; the conductor
string or integer; the isogeny class label
integer; the number
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) sage: parse_cremona_label('11a') (11, 'a', 1) sage: parse_cremona_label('11') (11, 'a', 1)
>>> from sage.all import * >>> from sage.databases.cremona import parse_cremona_label >>> parse_cremona_label('37a2') (37, 'a', 2) >>> parse_cremona_label('37b1') (37, 'b', 1) >>> parse_cremona_label('10bb2') (10, 'bb', 2) >>> parse_cremona_label('11a') (11, 'a', 1) >>> parse_cremona_label('11') (11, 'a', 1)
Valid old Cremona labels are allowed:
sage: parse_cremona_label('17CCCC') (17, 'dc', 1) sage: parse_cremona_label('5AB2') Traceback (most recent call last): ... ValueError: 5AB2 is not a valid Cremona label
>>> from sage.all import * >>> parse_cremona_label('17CCCC') (17, 'dc', 1) >>> parse_cremona_label('5AB2') Traceback (most recent call last): ... ValueError: 5AB2 is not a valid Cremona label
When
numerical_class_code
isTrue
, the output is a triple of integers:sage: from sage.databases.cremona import parse_cremona_label sage: parse_cremona_label('100800hj2') (100800, 'hj', 2) sage: parse_cremona_label('100800hj2', numerical_class_code=True) (100800, 191, 2)
>>> from sage.all import * >>> from sage.databases.cremona import parse_cremona_label >>> parse_cremona_label('100800hj2') (100800, 'hj', 2) >>> parse_cremona_label('100800hj2', numerical_class_code=True) (100800, 191, 2)
- sage.databases.cremona.parse_lmfdb_label(label, numerical_class_code=False)[source]¶
Given an LMFDB label that defines an elliptic curve, e.g., 11.a1 or 37.b3, parse the label and return the conductor, isogeny class label, and number.
The LMFDB label (named after the \(L\)-functions and modular forms database), is determined by the following two orders:
Isogeny classes with the same conductor are ordered lexicographically by the coefficients in the \(q\)-expansion of the associated modular form.
Curves within the same isogeny class are ordered lexicographically by the a-invariants of the minimal model.
The format is <conductor>.<iso><curve>, where the isogeny class is encoded using the same base-26 encoding into letters used in Cremona’s labels. For example, 990.h3 is the same as Cremona’s 990j1
For this function, the curve number may be omitted, in which case it defaults to 1. If the curve number and isogeny class are both omitted (label is just a string representing a conductor), then the isogeny class defaults to ‘a’ and the number to 1.
INPUT:
label
– strnumerical_class_code
– boolean (default:False
); ifTrue
, convert the isogeny class label from a letter code in base 26 to an integer. This is useful for sorting.
OUTPUT:
int
– the conductorstr
orint
– the isogeny class labelint
– the number
EXAMPLES:
sage: from sage.databases.cremona import parse_lmfdb_label sage: parse_lmfdb_label('37.a2') (37, 'a', 2) sage: parse_lmfdb_label('37.b') (37, 'b', 1) sage: parse_lmfdb_label('10.bb2') (10, 'bb', 2)
>>> from sage.all import * >>> from sage.databases.cremona import parse_lmfdb_label >>> parse_lmfdb_label('37.a2') (37, 'a', 2) >>> parse_lmfdb_label('37.b') (37, 'b', 1) >>> parse_lmfdb_label('10.bb2') (10, 'bb', 2)
When
numerical_class_code
isTrue
, the output is a triple of integers:sage: from sage.databases.cremona import parse_lmfdb_label sage: parse_lmfdb_label('100800.bg4') (100800, 'bg', 4) sage: parse_lmfdb_label('100800.bg4', numerical_class_code=True) (100800, 32, 4)
>>> from sage.all import * >>> from sage.databases.cremona import parse_lmfdb_label >>> parse_lmfdb_label('100800.bg4') (100800, 'bg', 4) >>> parse_lmfdb_label('100800.bg4', numerical_class_code=True) (100800, 32, 4)
- sage.databases.cremona.sort_key(key1)[source]¶
Comparison key for curve id strings.
Note
Not the same as standard lexicographic order!
EXAMPLES:
sage: from sage.databases.cremona import sort_key sage: l = ['ba1', 'z1'] sage: sorted(l, key=sort_key) ['z1', 'ba1']
>>> from sage.all import * >>> from sage.databases.cremona import sort_key >>> l = ['ba1', 'z1'] >>> sorted(l, key=sort_key) ['z1', 'ba1']
- sage.databases.cremona.split_code(key)[source]¶
Split class + curve id string into its two parts.
EXAMPLES:
sage: import sage.databases.cremona as cremona sage: cremona.split_code('ba2') ('ba', '2') sage: cremona.split_code('42') Traceback (most recent call last): ... ValueError: invalid curve ID: '42'
>>> from sage.all import * >>> import sage.databases.cremona as cremona >>> cremona.split_code('ba2') ('ba', '2') >>> cremona.split_code('42') Traceback (most recent call last): ... ValueError: invalid curve ID: '42'