Automorphisms on Modular Symbols

Provides functions for computing automorphisms of modular curves using modular symbols. The main focus is on automorphisms that are not yet implemented in Sage. This includes automorphisms of X_0(N) beyond Atkin-Lehner operators, and the extra automorphism V_5 on X_0(25M)/w_25.

mdsage.automorphisms_modsym.V5_invariant_modular_symbols(N)

Constructs the cuspidal modular symbols space associated to the quotient of X_0(25N)/w_25 by the automorphism V_5.

EXAMPLES:

sage: from mdsage import *
sage: S = V5_invariant_modular_symbols(7)
sage: S.dimension()
4
mdsage.automorphisms_modsym.V5_operator(S, check=True)

Constructs the automorphism V_5 on X_0(25M)/w_25, where S is the modular symbols space associated to X_0(25M)/w_25.

EXAMPLES:

sage: from mdsage import *
sage: M = ModularSymbols(5**2*7)
sage: S = M.cuspidal_subspace()
sage: S_25 = invariant_subspace(S, [S.atkin_lehner_operator(25)])
sage: V5 = V5_operator(S_25)
sage: V5.matrix().charpoly().factor()
(x - 1)^4 * (x^2 + x + 1)^6

Note: The eigenvalues of V_5 are 1 and the primitive cube roots of unity, which is consistent with V_5 being an automorphism of order 3. The eigenspace for eigenvalue 1 has dimension 4, which is twice the genus of (X_0(25*7)/w_25).V_5, as expected.

mdsage.automorphisms_modsym.apply(m, g, ambient=False)

Applies the automorphism g to the modular symbol m.

The automorphism g should be given as a Möbius transformation, represented either as a 2x2 matrix or as a tuple of four integers. The modular symbol m should be an element of a modular symbols space. The function returns the result of applying g to m, as an element of the same modular symbols space (or its ambient space if ambient=True).

Note: This function does not check whether g is actually an automorphism of the modular curve associated to m, so it is the caller’s responsibility to ensure that g is a valid automorphism.

EXAMPLES:

sage: from mdsage.automorphisms_modsym import *
sage: M = ModularSymbols(37)
sage: g = matrix(2,2,[0,-1,37,0])
sage: all([apply(m,g) == M.atkin_lehner_operator(37)(m) for m in M.basis()])
True
sage: all([apply(m,[0,-1,37,0]) == M.atkin_lehner_operator(37)(m) for m in M.basis()])
True
mdsage.automorphisms_modsym.b_j(N)

Helper function that creates a matrix used in the definition of the automorphism V_5 on X_0(25M)/w_25.

mdsage.automorphisms_modsym.invariant_subspace(S, autormorphisms)

Computes the subspace of S that is invariant under the given automorphisms.

EXAMPLES:

sage: from mdsage import *
sage: M = ModularSymbols(5**2*7)
sage: S = M.cuspidal_subspace()
sage: S_25 = invariant_subspace(S, [S.atkin_lehner_operator(25)])
sage: S_25.dimension()
16
sage: V5 = V5_operator(S_25)
sage: invariant_subspace(S_25, [V5]).dimension()
4
mdsage.automorphisms_modsym.modsym_frobenius_polynomial(S, p)

Computes the Frobenius polynomial as acting on the modular symbols space S.

EXAMPLES:

sage: from mdsage import *
sage: S = V5_invariant_modular_symbols(7)
sage: f = modsym_frobenius_polynomial(S, 2); f
x^4 - x^3 + 3*x^2 - 2*x + 4
sage: f.is_weil_polynomial()
True
mdsage.automorphisms_modsym.modsym_point_count(S, p, n=1)

This function assumes that S is the weight 2 modular symbols space associated to a (quotient) modular curve X. It counts the number of points on X of this quotient over the finite field with p^n elements. The answer is computed using the Frobenius polynomial as acting on S, which is the characteristic polynomial of Frobenius on the Jacobian of X, and applying the Weil conjectures. If S is not corresponding to a modular curve, the result may not be meaningful and potentially negative.

EXAMPLES:

sage: from mdsage import *
sage: S = V5_invariant_modular_symbols(6)
sage: modsym_point_count(S, 7)
6
sage: modsym_point_count(S, 7, n=2)
80
mdsage.automorphisms_modsym.upsilon(N)

Helper function that creates a matrix used in the definition of the automorphism V_5 on X_0(25M)/w_25.