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\). Ifbase_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\).