# Type spaces of newforms#

Let $$f$$ be a new modular eigenform of level $$\Gamma_1(N)$$, and $$p$$ a prime dividing $$N$$, with $$N = Mp^r$$ ($$M$$ coprime to $$p$$). Suppose the power of $$p$$ dividing the conductor of the character of $$f$$ is $$p^c$$ (so $$c \le r$$).

Then there is an integer $$u$$, which is $$\operatorname{min}([r/2], r-c)$$, such that any twist of $$f$$ by a character mod $$p^u$$ also has level $$N$$. The type space of $$f$$ is the span of the modular eigensymbols corresponding to all of these twists, which lie in a space of modular symbols for a suitable $$\Gamma_H$$ subgroup. This space is the key to computing the isomorphism class of the local component of the newform at $$p$$.

class sage.modular.local_comp.type_space.TypeSpace(f, p, base_extend=True)[source]#

Bases: SageObject

The modular symbol type space associated to a newform, at a prime dividing the level.

character_conductor()[source]#

Exponent of $$p$$ dividing the conductor of the character of the form.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().character_conductor()
0

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().character_conductor()
0

conductor()[source]#

Exponent of $$p$$ dividing the level of the form.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().conductor()
2

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().conductor()
2

eigensymbol_subspace()[source]#

Return the subspace of self corresponding to the plus eigensymbols of $$f$$ and its Galois conjugates (as a subspace of the vector space returned by free_module()).

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: T = example_type_space(); T.eigensymbol_subspace()
Vector space of degree 6 and dimension 1 over Number Field in a1 with defining polynomial ...
Basis matrix:
[...]
sage: T.eigensymbol_subspace().is_submodule(T.free_module())
True

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> T = example_type_space(); T.eigensymbol_subspace()
Vector space of degree 6 and dimension 1 over Number Field in a1 with defining polynomial ...
Basis matrix:
[...]
>>> T.eigensymbol_subspace().is_submodule(T.free_module())
True

form()[source]#

The newform of which this is the type space.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().form()
q + ... + O(q^6)

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().form()
q + ... + O(q^6)

free_module()[source]#

Return the underlying vector space of this type space.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().free_module()
Vector space of dimension 6 over Number Field in a1 with defining polynomial ...

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().free_module()
Vector space of dimension 6 over Number Field in a1 with defining polynomial ...

group()[source]#

Return a $$\Gamma_H$$ group which is the level of all of the relevant twists of $$f$$.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().group()
Congruence Subgroup Gamma_H(98) with H generated by [15, 29, 43]

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().group()
Congruence Subgroup Gamma_H(98) with H generated by [15, 29, 43]

is_minimal()[source]#

Return True if there exists a newform $$g$$ of level strictly smaller than $$N$$, and a Dirichlet character $$\chi$$ of $$p$$-power conductor, such that $$f = g \otimes \chi$$ where $$f$$ is the form of which this is the type space. To find such a form, use minimal_twist().

The result is cached.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().is_minimal()
True
sage: example_type_space(1).is_minimal()
False

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().is_minimal()
True
>>> example_type_space(Integer(1)).is_minimal()
False

minimal_twist()[source]#

Return a newform (not necessarily unique) which is a twist of the original form $$f$$ by a Dirichlet character of $$p$$-power conductor, and which has minimal level among such twists of $$f$$.

An error will be raised if $$f$$ is already minimal.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import TypeSpace, example_type_space
sage: T = example_type_space(1)
sage: T.form().q_expansion(12)
q - q^2 + 2*q^3 + q^4 - 2*q^6 - q^8 + q^9 + O(q^12)
sage: g = T.minimal_twist()
sage: g.q_expansion(12)
q - q^2 - 2*q^3 + q^4 + 2*q^6 + q^7 - q^8 + q^9 + O(q^12)
sage: g.level()
14
sage: TypeSpace(g, 7).is_minimal()
True

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import TypeSpace, example_type_space
>>> T = example_type_space(Integer(1))
>>> T.form().q_expansion(Integer(12))
q - q^2 + 2*q^3 + q^4 - 2*q^6 - q^8 + q^9 + O(q^12)
>>> g = T.minimal_twist()
>>> g.q_expansion(Integer(12))
q - q^2 - 2*q^3 + q^4 + 2*q^6 + q^7 - q^8 + q^9 + O(q^12)
>>> g.level()
14
>>> TypeSpace(g, Integer(7)).is_minimal()
True


Test that Issue #13158 is fixed:

sage: f = Newforms(256,names='a')[0]
sage: T = TypeSpace(f,2)                            # long time
sage: g = T.minimal_twist()                         # long time
sage: g[0:3]                                        # long time
[0, 1, 0]
sage: str(g[3]) in ('a', '-a', '-1/2*a', '1/2*a')   # long time
True
sage: g[4:]                                         # long time
[]
sage: g.level()                                     # long time
64

>>> from sage.all import *
>>> f = Newforms(Integer(256),names='a')[Integer(0)]
>>> T = TypeSpace(f,Integer(2))                            # long time
>>> g = T.minimal_twist()                         # long time
>>> g[Integer(0):Integer(3)]                                        # long time
[0, 1, 0]
>>> str(g[Integer(3)]) in ('a', '-a', '-1/2*a', '1/2*a')   # long time
True
>>> g[Integer(4):]                                         # long time
[]
>>> g.level()                                     # long time
64

prime()[source]#

Return the prime $$p$$.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().prime()
7

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().prime()
7

rho(g)[source]#

Calculate the action of the group element $$g$$ on the type space.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: T = example_type_space(2)
sage: m = T.rho([2,0,0,1]); m
[-1  1  0 -1]
[ 0  0 -1  1]
[ 0 -1 -1  1]
[ 1 -1 -2  2]
sage: v = T.eigensymbol_subspace().basis()[0]
sage: m * v == v
True

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> T = example_type_space(Integer(2))
>>> m = T.rho([Integer(2),Integer(0),Integer(0),Integer(1)]); m
[-1  1  0 -1]
[ 0  0 -1  1]
[ 0 -1 -1  1]
[ 1 -1 -2  2]
>>> v = T.eigensymbol_subspace().basis()[Integer(0)]
>>> m * v == v
True


We test that it is a left action:

sage: T = example_type_space(0)
sage: a = [0,5,4,3]; b = [0,2,3,5]; ab = [1,4,2,2]
sage: T.rho(ab) == T.rho(a) * T.rho(b)
True

>>> from sage.all import *
>>> T = example_type_space(Integer(0))
>>> a = [Integer(0),Integer(5),Integer(4),Integer(3)]; b = [Integer(0),Integer(2),Integer(3),Integer(5)]; ab = [Integer(1),Integer(4),Integer(2),Integer(2)]
>>> T.rho(ab) == T.rho(a) * T.rho(b)
True


An odd level example:

sage: from sage.modular.local_comp.type_space import TypeSpace
sage: T = TypeSpace(Newform('54a'), 3)
sage: a = [0,1,3,0]; b = [2,1,0,1]; ab = [0,1,6,3]
sage: T.rho(ab) == T.rho(a) * T.rho(b)
True

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import TypeSpace
>>> T = TypeSpace(Newform('54a'), Integer(3))
>>> a = [Integer(0),Integer(1),Integer(3),Integer(0)]; b = [Integer(2),Integer(1),Integer(0),Integer(1)]; ab = [Integer(0),Integer(1),Integer(6),Integer(3)]
>>> T.rho(ab) == T.rho(a) * T.rho(b)
True

tame_level()[source]#

The level away from $$p$$.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().tame_level()
2

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().tame_level()
2

u()[source]#

Largest integer $$u$$ such that level of $$f_\chi$$ = level of $$f$$ for all Dirichlet characters $$\chi$$ modulo $$p^u$$.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space().u()
1
sage: from sage.modular.local_comp.type_space import TypeSpace
sage: f = Newforms(Gamma1(5), 5, names='a')[0]
sage: TypeSpace(f, 5).u()
0

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space().u()
1
>>> from sage.modular.local_comp.type_space import TypeSpace
>>> f = Newforms(Gamma1(Integer(5)), Integer(5), names='a')[Integer(0)]
>>> TypeSpace(f, Integer(5)).u()
0

sage.modular.local_comp.type_space.example_type_space()[source]#

Quickly return an example of a type space. Used mainly to speed up doctesting.

EXAMPLES:

sage: from sage.modular.local_comp.type_space import example_type_space
sage: example_type_space()  # takes a while but caches stuff (21s on sage.math, 2012)
6-dimensional type space at prime 7 of form q + ... + O(q^6)

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import example_type_space
>>> example_type_space()  # takes a while but caches stuff (21s on sage.math, 2012)
6-dimensional type space at prime 7 of form q + ... + O(q^6)


The above test takes a long time, but it precomputes and caches various things such that subsequent doctests can be very quick. So we don’t want to mark it # long time.

sage.modular.local_comp.type_space.find_in_space(f, A, base_extend=False)[source]#

Given a Newform object $$f$$, and a space $$A$$ of modular symbols of the same weight and level, find the subspace of $$A$$ which corresponds to the Hecke eigenvalues of $$f$$.

If base_extend = True, this will return a 2-dimensional space generated by the plus and minus eigensymbols of $$f$$. If base_extend = False it will return a larger space spanned by the eigensymbols of $$f$$ and its Galois conjugates.

(NB: “Galois conjugates” needs to be interpreted carefully – see the last example below.)

$$A$$ should be an ambient space (because non-ambient spaces don’t implement base_extend).

EXAMPLES:

sage: from sage.modular.local_comp.type_space import find_in_space

>>> from sage.all import *
>>> from sage.modular.local_comp.type_space import find_in_space


Easy case ($$f$$ has rational coefficients):

sage: f = Newform('99a'); f
q - q^2 - q^4 - 4*q^5 + O(q^6)
sage: A = ModularSymbols(GammaH(99, [13]))
sage: find_in_space(f, A)
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 25 for Congruence Subgroup Gamma_H(99) with H generated by [13] of weight 2 with sign 0 over Rational Field

>>> from sage.all import *
>>> f = Newform('99a'); f
q - q^2 - q^4 - 4*q^5 + O(q^6)
>>> A = ModularSymbols(GammaH(Integer(99), [Integer(13)]))
>>> find_in_space(f, A)
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 25 for Congruence Subgroup Gamma_H(99) with H generated by [13] of weight 2 with sign 0 over Rational Field


Harder case:

sage: f = Newforms(23, names='a')[0]
sage: A = ModularSymbols(Gamma1(23))
sage: find_in_space(f, A, base_extend=True)
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 45 for Gamma_1(23) of weight 2 with sign 0 over Number Field in a0 with defining polynomial x^2 + x - 1
sage: find_in_space(f, A, base_extend=False)
Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 45 for Gamma_1(23) of weight 2 with sign 0 over Rational Field

>>> from sage.all import *
>>> f = Newforms(Integer(23), names='a')[Integer(0)]
>>> A = ModularSymbols(Gamma1(Integer(23)))
>>> find_in_space(f, A, base_extend=True)
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 45 for Gamma_1(23) of weight 2 with sign 0 over Number Field in a0 with defining polynomial x^2 + x - 1
>>> find_in_space(f, A, base_extend=False)
Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 45 for Gamma_1(23) of weight 2 with sign 0 over Rational Field


An example with character, indicating the rather subtle behaviour of base_extend:

sage: chi = DirichletGroup(5).0
sage: f = Newforms(chi, 7, names='c')[0]; f  # long time (4s on sage.math, 2012)
q + c0*q^2 + (zeta4*c0 - 5*zeta4 + 5)*q^3 + ((-5*zeta4 - 5)*c0 + 24*zeta4)*q^4 + ((10*zeta4 - 5)*c0 - 40*zeta4 - 55)*q^5 + O(q^6)
sage: find_in_space(f, ModularSymbols(Gamma1(5), 7), base_extend=True)  # long time
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 12 for Gamma_1(5) of weight 7 with sign 0 over Number Field in c0 with defining polynomial x^2 + (5*zeta4 + 5)*x - 88*zeta4 over its base field
sage: find_in_space(f, ModularSymbols(Gamma1(5), 7), base_extend=False)  # long time (27s on sage.math, 2012)
Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 12 for Gamma_1(5) of weight 7 with sign 0 over Cyclotomic Field of order 4 and degree 2

>>> from sage.all import *
>>> chi = DirichletGroup(Integer(5)).gen(0)
>>> f = Newforms(chi, Integer(7), names='c')[Integer(0)]; f  # long time (4s on sage.math, 2012)
q + c0*q^2 + (zeta4*c0 - 5*zeta4 + 5)*q^3 + ((-5*zeta4 - 5)*c0 + 24*zeta4)*q^4 + ((10*zeta4 - 5)*c0 - 40*zeta4 - 55)*q^5 + O(q^6)
>>> find_in_space(f, ModularSymbols(Gamma1(Integer(5)), Integer(7)), base_extend=True)  # long time
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 12 for Gamma_1(5) of weight 7 with sign 0 over Number Field in c0 with defining polynomial x^2 + (5*zeta4 + 5)*x - 88*zeta4 over its base field
>>> find_in_space(f, ModularSymbols(Gamma1(Integer(5)), Integer(7)), base_extend=False)  # long time (27s on sage.math, 2012)
Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 12 for Gamma_1(5) of weight 7 with sign 0 over Cyclotomic Field of order 4 and degree 2


Note that the base ring in the second example is $$\QQ(\zeta_4)$$ (the base ring of the character of $$f$$), not $$\QQ$$.