Module of supersingular points

The module of divisors on the modular curve \(X_0(N)\) over \(F_p\) supported at supersingular points.

EXAMPLES:

sage: x = SupersingularModule(389)
sage: m = x.T(2).matrix()
sage: a = m.change_ring(GF(97))
sage: D = a.decomposition()
sage: D[:3]
[
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
Basis matrix:
[ 0  0  0  1 96 96  1  0 95  1  1  1  1 95  2 96  0  0 96  0 96  0 96  2 96 96  0  1  0  2  1 95  0], True),
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
Basis matrix:
[ 0  1 96 16 75 22 81  0  0 17 17 80 80  0  0 74 40  1 16 57 23 96 81  0 74 23  0 24  0  0 73  0  0], True),
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
Basis matrix:
[ 0  1 96 90 90  7  7  0  0 91  6  6 91  0  0 91  0 13  7  0  6 84 90  0  6 91  0 90  0  0  7  0  0], True)
]
sage: len(D)
9
>>> from sage.all import *
>>> x = SupersingularModule(Integer(389))
>>> m = x.T(Integer(2)).matrix()
>>> a = m.change_ring(GF(Integer(97)))
>>> D = a.decomposition()
>>> D[:Integer(3)]
[
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
Basis matrix:
[ 0  0  0  1 96 96  1  0 95  1  1  1  1 95  2 96  0  0 96  0 96  0 96  2 96 96  0  1  0  2  1 95  0], True),
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
Basis matrix:
[ 0  1 96 16 75 22 81  0  0 17 17 80 80  0  0 74 40  1 16 57 23 96 81  0 74 23  0 24  0  0 73  0  0], True),
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
Basis matrix:
[ 0  1 96 90 90  7  7  0  0 91  6  6 91  0  0 91  0 13  7  0  6 84 90  0  6 91  0 90  0  0  7  0  0], True)
]
>>> len(D)
9
x = SupersingularModule(389)
m = x.T(2).matrix()
a = m.change_ring(GF(97))
D = a.decomposition()
D[:3]
len(D)

We compute a Hecke operator on a space of huge dimension!:

sage: X = SupersingularModule(next_prime(10000))
sage: t = X.T(2).matrix()            # long time (21s on sage.math, 2011)
sage: t.nrows()                      # long time
835
>>> from sage.all import *
>>> X = SupersingularModule(next_prime(Integer(10000)))
>>> t = X.T(Integer(2)).matrix()            # long time (21s on sage.math, 2011)
>>> t.nrows()                      # long time
835
X = SupersingularModule(next_prime(10000))
t = X.T(2).matrix()            # long time (21s on sage.math, 2011)
t.nrows()                      # long time

AUTHORS:

  • William Stein

  • David Kohel

  • Iftikhar Burhanuddin

sage.modular.ssmod.ssmod.Phi2_quad(J3, ssJ1, ssJ2)[source]

Return a certain quadratic polynomial over a finite field in indeterminate J3.

The roots of the polynomial along with ssJ1 are the neighboring/2-isogenous supersingular j-invariants of ssJ2.

INPUT:

  • J3 – indeterminate of a univariate polynomial ring defined over a finite field with p^2 elements where p is a prime number

  • ssJ2, ssJ2 – supersingular j-invariants over the finite field

OUTPUT: polynomial; defined over the finite field

EXAMPLES:

The following code snippet produces a factor of the modular polynomial \(\Phi_{2}(x,j_{in})\), where \(j_{in}\) is a supersingular j-invariant defined over the finite field with \(37^2\) elements:

sage: F = GF(37^2, 'a')
sage: X = PolynomialRing(F, 'x').gen()
sage: j_in = supersingular_j(F)
sage: poly = sage.modular.ssmod.ssmod.Phi_polys(2,X,j_in)
sage: poly.roots()
[(8, 1), (27*a + 23, 1), (10*a + 20, 1)]
sage: sage.modular.ssmod.ssmod.Phi2_quad(X, F(8), j_in)
x^2 + 31*x + 31
>>> from sage.all import *
>>> F = GF(Integer(37)**Integer(2), 'a')
>>> X = PolynomialRing(F, 'x').gen()
>>> j_in = supersingular_j(F)
>>> poly = sage.modular.ssmod.ssmod.Phi_polys(Integer(2),X,j_in)
>>> poly.roots()
[(8, 1), (27*a + 23, 1), (10*a + 20, 1)]
>>> sage.modular.ssmod.ssmod.Phi2_quad(X, F(Integer(8)), j_in)
x^2 + 31*x + 31
F = GF(37^2, 'a')
X = PolynomialRing(F, 'x').gen()
j_in = supersingular_j(F)
poly = sage.modular.ssmod.ssmod.Phi_polys(2,X,j_in)
poly.roots()
sage.modular.ssmod.ssmod.Phi2_quad(X, F(8), j_in)

Note

Given a root (j1,j2) to the polynomial \(Phi_2(J1,J2)\), the pairs (j2,j3) not equal to (j2,j1) which solve \(Phi_2(j2,j3)\) are roots of the quadratic equation:

J3^2 + (-j2^2 + 1488*j2 + (j1 - 162000))*J3 + (-j1 + 1488)*j2^2 + (1488*j1 + 40773375)*j2 + j1^2 - 162000*j1 + 8748000000

This will be of use to extend the 2-isogeny graph, once the initial three roots are determined for \(Phi_2(J1,J2)\).

AUTHORS:

sage.modular.ssmod.ssmod.Phi_polys(L, x, j)[source]

Return a certain polynomial of degree \(L+1\) in the indeterminate x over a finite field.

The roots of the modular polynomial \(\Phi(L, x, j)\) are the \(L\)-isogenous supersingular j-invariants of j.

INPUT:

  • L – integer

  • x – indeterminate of a univariate polynomial ring defined over a finite field with p^2 elements, where p is a prime number

  • j – supersingular j-invariant over the finite field

OUTPUT: polynomial; defined over the finite field

EXAMPLES:

The following code snippet produces the modular polynomial \(\Phi_{L}(x,j_{in})\), where \(j_{in}\) is a supersingular j-invariant defined over the finite field with \(7^2\) elements:

sage: F = GF(7^2, 'a')
sage: X = PolynomialRing(F, 'x').gen()
sage: j_in = supersingular_j(F)
sage: sage.modular.ssmod.ssmod.Phi_polys(2,X,j_in)
x^3 + 3*x^2 + 3*x + 1
sage: sage.modular.ssmod.ssmod.Phi_polys(3,X,j_in)
x^4 + 4*x^3 + 6*x^2 + 4*x + 1
sage: sage.modular.ssmod.ssmod.Phi_polys(5,X,j_in)
x^6 + 6*x^5 + x^4 + 6*x^3 + x^2 + 6*x + 1
sage: sage.modular.ssmod.ssmod.Phi_polys(7,X,j_in)
x^8 + x^7 + x + 1
sage: sage.modular.ssmod.ssmod.Phi_polys(11,X,j_in)
x^12 + 5*x^11 + 3*x^10 + 3*x^9 + 5*x^8 + x^7 + x^5 + 5*x^4 + 3*x^3 + 3*x^2 + 5*x + 1
sage: sage.modular.ssmod.ssmod.Phi_polys(13,X,j_in)
x^14 + 2*x^7 + 1
>>> from sage.all import *
>>> F = GF(Integer(7)**Integer(2), 'a')
>>> X = PolynomialRing(F, 'x').gen()
>>> j_in = supersingular_j(F)
>>> sage.modular.ssmod.ssmod.Phi_polys(Integer(2),X,j_in)
x^3 + 3*x^2 + 3*x + 1
>>> sage.modular.ssmod.ssmod.Phi_polys(Integer(3),X,j_in)
x^4 + 4*x^3 + 6*x^2 + 4*x + 1
>>> sage.modular.ssmod.ssmod.Phi_polys(Integer(5),X,j_in)
x^6 + 6*x^5 + x^4 + 6*x^3 + x^2 + 6*x + 1
>>> sage.modular.ssmod.ssmod.Phi_polys(Integer(7),X,j_in)
x^8 + x^7 + x + 1
>>> sage.modular.ssmod.ssmod.Phi_polys(Integer(11),X,j_in)
x^12 + 5*x^11 + 3*x^10 + 3*x^9 + 5*x^8 + x^7 + x^5 + 5*x^4 + 3*x^3 + 3*x^2 + 5*x + 1
>>> sage.modular.ssmod.ssmod.Phi_polys(Integer(13),X,j_in)
x^14 + 2*x^7 + 1
F = GF(7^2, 'a')
X = PolynomialRing(F, 'x').gen()
j_in = supersingular_j(F)
sage.modular.ssmod.ssmod.Phi_polys(2,X,j_in)
sage.modular.ssmod.ssmod.Phi_polys(3,X,j_in)
sage.modular.ssmod.ssmod.Phi_polys(5,X,j_in)
sage.modular.ssmod.ssmod.Phi_polys(7,X,j_in)
sage.modular.ssmod.ssmod.Phi_polys(11,X,j_in)
sage.modular.ssmod.ssmod.Phi_polys(13,X,j_in)
class sage.modular.ssmod.ssmod.SupersingularModule(prime=2, level=1, base_ring=Integer Ring)[source]

Bases: HeckeModule_free_module

The module of supersingular points in a given characteristic, with given level structure.

The characteristic must not divide the level.

Note

Currently, only level 1 is implemented.

EXAMPLES:

sage: S = SupersingularModule(17)
sage: S
Module of supersingular points on X_0(1)/F_17 over Integer Ring
sage: S = SupersingularModule(16)
Traceback (most recent call last):
...
ValueError: the argument prime must be a prime number
sage: S = SupersingularModule(prime=17, level=34)
Traceback (most recent call last):
...
ValueError: the argument level must be coprime to the argument prime
sage: S = SupersingularModule(prime=17, level=5)
Traceback (most recent call last):
...
NotImplementedError: supersingular modules of level > 1 not yet implemented
>>> from sage.all import *
>>> S = SupersingularModule(Integer(17))
>>> S
Module of supersingular points on X_0(1)/F_17 over Integer Ring
>>> S = SupersingularModule(Integer(16))
Traceback (most recent call last):
...
ValueError: the argument prime must be a prime number
>>> S = SupersingularModule(prime=Integer(17), level=Integer(34))
Traceback (most recent call last):
...
ValueError: the argument level must be coprime to the argument prime
>>> S = SupersingularModule(prime=Integer(17), level=Integer(5))
Traceback (most recent call last):
...
NotImplementedError: supersingular modules of level > 1 not yet implemented
S = SupersingularModule(17)
S
S = SupersingularModule(16)
S = SupersingularModule(prime=17, level=34)
S = SupersingularModule(prime=17, level=5)
dimension()[source]

Return the dimension of the space of modular forms of weight 2 and level equal to the level associated to self.

INPUT:

  • self – SupersingularModule object

OUTPUT: integer; dimension, nonnegative

EXAMPLES:

sage: S = SupersingularModule(7)
sage: S.dimension()
1

sage: S = SupersingularModule(15073)
sage: S.dimension()
1256

sage: S = SupersingularModule(83401)
sage: S.dimension()
6950
>>> from sage.all import *
>>> S = SupersingularModule(Integer(7))
>>> S.dimension()
1

>>> S = SupersingularModule(Integer(15073))
>>> S.dimension()
1256

>>> S = SupersingularModule(Integer(83401))
>>> S.dimension()
6950
S = SupersingularModule(7)
S.dimension()
S = SupersingularModule(15073)
S.dimension()
S = SupersingularModule(83401)
S.dimension()

Note

The case of level > 1 has not yet been implemented.

AUTHORS:

free_module()[source]

EXAMPLES:

sage: X = SupersingularModule(37)
sage: X.free_module()
Ambient free module of rank 3 over the principal ideal domain Integer Ring
>>> from sage.all import *
>>> X = SupersingularModule(Integer(37))
>>> X.free_module()
Ambient free module of rank 3 over the principal ideal domain Integer Ring
X = SupersingularModule(37)
X.free_module()

This illustrates the fix at Issue #4306:

sage: X = SupersingularModule(389)
sage: X.basis()
((1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1))
>>> from sage.all import *
>>> X = SupersingularModule(Integer(389))
>>> X.basis()
((1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0),
 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1))
X = SupersingularModule(389)
X.basis()
hecke_matrix(L)[source]

Return the \(L^{\text{th}}\) Hecke matrix.

INPUT:

  • self – SupersingularModule object

  • L – integer; positive

OUTPUT: matrix; sparse integer matrix

EXAMPLES:

This example computes the action of the Hecke operator \(T_2\) on the module of supersingular points on \(X_0(1)/F_{37}\):

sage: S = SupersingularModule(37)
sage: M = S.hecke_matrix(2)
sage: M
[1 1 1]
[1 0 2]
[1 2 0]
>>> from sage.all import *
>>> S = SupersingularModule(Integer(37))
>>> M = S.hecke_matrix(Integer(2))
>>> M
[1 1 1]
[1 0 2]
[1 2 0]
S = SupersingularModule(37)
M = S.hecke_matrix(2)
M

This example computes the action of the Hecke operator \(T_3\) on the module of supersingular points on \(X_0(1)/F_{67}\):

sage: S = SupersingularModule(67)
sage: M = S.hecke_matrix(3)
sage: M
[0 0 0 0 2 2]
[0 0 1 1 1 1]
[0 1 0 2 0 1]
[0 1 2 0 1 0]
[1 1 0 1 0 1]
[1 1 1 0 1 0]
>>> from sage.all import *
>>> S = SupersingularModule(Integer(67))
>>> M = S.hecke_matrix(Integer(3))
>>> M
[0 0 0 0 2 2]
[0 0 1 1 1 1]
[0 1 0 2 0 1]
[0 1 2 0 1 0]
[1 1 0 1 0 1]
[1 1 1 0 1 0]
S = SupersingularModule(67)
M = S.hecke_matrix(3)
M

Note

The first list — list_j — returned by the supersingular_points function are the rows and column indexes of the above hecke matrices and its ordering should be kept in mind when interpreting these matrices.

AUTHORS:

level()[source]

This function returns the level associated to self.

INPUT:

  • self – SupersingularModule object

OUTPUT: integer; the level, positive

EXAMPLES:

sage: S = SupersingularModule(15073)
sage: S.level()
1
>>> from sage.all import *
>>> S = SupersingularModule(Integer(15073))
>>> S.level()
1
S = SupersingularModule(15073)
S.level()

AUTHORS:

prime()[source]

Return the characteristic of the finite field associated to self.

INPUT:

  • self – SupersingularModule object

OUTPUT: integer; characteristic, positive

EXAMPLES:

sage: S = SupersingularModule(19)
sage: S.prime()
19
>>> from sage.all import *
>>> S = SupersingularModule(Integer(19))
>>> S.prime()
19
S = SupersingularModule(19)
S.prime()

AUTHORS:

rank()[source]

Return the dimension of the space of modular forms of weight 2 and level equal to the level associated to self.

INPUT:

  • self – SupersingularModule object

OUTPUT: integer; dimension, nonnegative

EXAMPLES:

sage: S = SupersingularModule(7)
sage: S.dimension()
1

sage: S = SupersingularModule(15073)
sage: S.dimension()
1256

sage: S = SupersingularModule(83401)
sage: S.dimension()
6950
>>> from sage.all import *
>>> S = SupersingularModule(Integer(7))
>>> S.dimension()
1

>>> S = SupersingularModule(Integer(15073))
>>> S.dimension()
1256

>>> S = SupersingularModule(Integer(83401))
>>> S.dimension()
6950
S = SupersingularModule(7)
S.dimension()
S = SupersingularModule(15073)
S.dimension()
S = SupersingularModule(83401)
S.dimension()

Note

The case of level > 1 has not yet been implemented.

AUTHORS:

supersingular_points()[source]

Compute the supersingular j-invariants over the finite field associated to self.

INPUT:

  • self – SupersingularModule object

OUTPUT:

  • list_j, dict_j – list_j is the list of supersingular

    j-invariants, dict_j is a dictionary with these j-invariants as keys and their indexes as values. The latter is used to speed up j-invariant look-up. The indexes are based on the order of their discovery.

EXAMPLES:

The following examples calculate supersingular j-invariants over finite fields with characteristic 7, 11 and 37:

sage: S = SupersingularModule(7)
sage: S.supersingular_points()
([6], {6: 0})

sage: S = SupersingularModule(11)
sage: S.supersingular_points()[0]
[1, 0]

sage: S = SupersingularModule(37)
sage: S.supersingular_points()[0]
[8, 27*a + 23, 10*a + 20]
>>> from sage.all import *
>>> S = SupersingularModule(Integer(7))
>>> S.supersingular_points()
([6], {6: 0})

>>> S = SupersingularModule(Integer(11))
>>> S.supersingular_points()[Integer(0)]
[1, 0]

>>> S = SupersingularModule(Integer(37))
>>> S.supersingular_points()[Integer(0)]
[8, 27*a + 23, 10*a + 20]
S = SupersingularModule(7)
S.supersingular_points()
S = SupersingularModule(11)
S.supersingular_points()[0]
S = SupersingularModule(37)
S.supersingular_points()[0]

AUTHORS:

upper_bound_on_elliptic_factors(p=None, ellmax=2)[source]

Return an upper bound (provably correct) on the number of elliptic curves of conductor equal to the level of this supersingular module.

INPUT:

  • p – (default: 997) prime to work modulo

ALGORITHM: Currently we only use \(T_2\). Function will be extended to use more Hecke operators later.

The prime p is replaced by the smallest prime that does not divide the level.

EXAMPLES:

sage: SupersingularModule(37).upper_bound_on_elliptic_factors()
2
>>> from sage.all import *
>>> SupersingularModule(Integer(37)).upper_bound_on_elliptic_factors()
2
SupersingularModule(37).upper_bound_on_elliptic_factors()

(There are 4 elliptic curves of conductor 37, but only 2 isogeny classes.)

weight()[source]

Return the weight associated to self.

INPUT:

  • self – SupersingularModule object

OUTPUT: integer; weight, positive

EXAMPLES:

sage: S = SupersingularModule(19)
sage: S.weight()
2
>>> from sage.all import *
>>> S = SupersingularModule(Integer(19))
>>> S.weight()
2
S = SupersingularModule(19)
S.weight()

AUTHORS:

sage.modular.ssmod.ssmod.dimension_supersingular_module(prime, level=1)[source]

Return the dimension of the Supersingular module, which is equal to the dimension of the space of modular forms of weight \(2\) and conductor equal to prime times level.

INPUT:

  • prime – integer; prime

  • level – integer; positive

OUTPUT: dimension; integer, nonnegative

EXAMPLES:

The code below computes the dimensions of Supersingular modules with level=1 and prime = 7, 15073 and 83401:

sage: dimension_supersingular_module(7)
1

sage: dimension_supersingular_module(15073)
1256

sage: dimension_supersingular_module(83401)
6950
>>> from sage.all import *
>>> dimension_supersingular_module(Integer(7))
1

>>> dimension_supersingular_module(Integer(15073))
1256

>>> dimension_supersingular_module(Integer(83401))
6950
dimension_supersingular_module(7)
dimension_supersingular_module(15073)
dimension_supersingular_module(83401)

Note

The case of level > 1 has not been implemented yet.

AUTHORS:

sage.modular.ssmod.ssmod.supersingular_D(prime)[source]

Return a fundamental discriminant \(D\) of an imaginary quadratic field, where the given prime does not split.

See Silverman’s Advanced Topics in the Arithmetic of Elliptic Curves, page 184, exercise 2.30(d).

INPUT:

  • prime – integer, prime

OUTPUT: d; integer, negative

EXAMPLES:

These examples return supersingular discriminants for 7, 15073 and 83401:

sage: supersingular_D(7)
-4

sage: supersingular_D(15073)
-15

sage: supersingular_D(83401)
-7
>>> from sage.all import *
>>> supersingular_D(Integer(7))
-4

>>> supersingular_D(Integer(15073))
-15

>>> supersingular_D(Integer(83401))
-7
supersingular_D(7)
supersingular_D(15073)
supersingular_D(83401)

AUTHORS:

sage.modular.ssmod.ssmod.supersingular_j(FF)[source]

Return a supersingular j-invariant over the finite field FF.

INPUT:

  • FF – finite field with p^2 elements, where p is a prime number

OUTPUT:

  • finite field element – a supersingular j-invariant defined over the finite field FF

EXAMPLES:

The following examples calculate supersingular j-invariants for a few finite fields:

sage: supersingular_j(GF(7^2, 'a'))
6
>>> from sage.all import *
>>> supersingular_j(GF(Integer(7)**Integer(2), 'a'))
6
supersingular_j(GF(7^2, 'a'))

Observe that in this example the j-invariant is not defined over the prime field:

sage: supersingular_j(GF(15073^2, 'a'))
4443*a + 13964
sage: supersingular_j(GF(83401^2, 'a'))
67977
>>> from sage.all import *
>>> supersingular_j(GF(Integer(15073)**Integer(2), 'a'))
4443*a + 13964
>>> supersingular_j(GF(Integer(83401)**Integer(2), 'a'))
67977
supersingular_j(GF(15073^2, 'a'))
supersingular_j(GF(83401^2, 'a'))

AUTHORS: