# Local components of modular forms¶

If $$f$$ is a (new, cuspidal, normalised) modular eigenform, then one can associate to $$f$$ an automorphic representation $$\pi_f$$ of the group $$\operatorname{GL}_2(\mathbf{A})$$ (where $$\mathbf{A}$$ is the adele ring of $$\QQ$$). This object factors as a restricted tensor product of components $$\pi_{f, v}$$ for each place of $$\QQ$$. These are infinite-dimensional representations, but they are specified by a finite amount of data, and this module provides functions which determine a description of the local factor $$\pi_{f, p}$$ at a finite prime $$p$$.

The functions in this module are based on the algorithms described in [LW2012].

AUTHORS:

• David Loeffler
• Jared Weinstein
sage.modular.local_comp.local_comp.LocalComponent(f, p, twist_factor=None)

Calculate the local component at the prime $$p$$ of the automorphic representation attached to the newform $$f$$.

INPUT:

• f (Newform) a newform of weight $$k \ge 2$$
• p (integer) a prime
• twist_factor (integer) an integer congruent to $$k$$ modulo 2 (default: $$k - 2$$)

Note

The argument twist_factor determines the choice of normalisation: if it is set to $$j \in \ZZ$$, then the central character of $$\pi_{f, \ell}$$ maps $$\ell$$ to $$\ell^j \varepsilon(\ell)$$ for almost all $$\ell$$, where $$\varepsilon$$ is the Nebentypus character of $$f$$.

In the analytic theory it is conventional to take $$j = 0$$ (the “Langlands normalisation”), so the representation $$\pi_f$$ is unitary; however, this is inconvenient for $$k$$ odd, since in this case one needs to choose a square root of $$p$$ and thus the map $$f \to \pi_{f}$$ is not Galois-equivariant. Hence we use, by default, the “Hecke normalisation” given by $$j = k - 2$$. This is also the most natural normalisation from the perspective of modular symbols.

We also adopt a slightly unusual definition of the principal series: we define $$\pi(\chi_1, \chi_2)$$ to be the induction from the Borel subgroup of the character of the maximal torus $$\begin{pmatrix} x & \\ & y \end{pmatrix} \mapsto \chi_1(a) \chi_2(b) |b|$$, so its central character is $$z \mapsto \chi_1(z) \chi_2(z) |z|$$. Thus $$\chi_1 \chi_2$$ is the restriction to $$\QQ_p^\times$$ of the unique character of the id’ele class group mapping $$\ell$$ to $$\ell^{k-1} \varepsilon(\ell)$$ for almost all $$\ell$$. This has the property that the set $$\{\chi_1, \chi_2\}$$ also depends Galois-equivariantly on $$f$$.

EXAMPLES:

sage: Pi = LocalComponent(Newform('49a'), 7); Pi
Smooth representation of GL_2(Q_7) with conductor 7^2
sage: Pi.central_character()
Character of Q_7*, of level 0, mapping 7 |--> 1
sage: Pi.species()
'Supercuspidal'
sage: Pi.characters()
[
Character of unramified extension Q_7(s)* (s^2 + 6*s + 3 = 0), of level 1, mapping s |--> d, 7 |--> 1,
Character of unramified extension Q_7(s)* (s^2 + 6*s + 3 = 0), of level 1, mapping s |--> -d, 7 |--> 1
]

class sage.modular.local_comp.local_comp.LocalComponentBase(newform, prime, twist_factor)

Base class for local components of newforms. Not to be directly instantiated; use the LocalComponent() constructor function.

central_character()

Return the central character of this representation. This is the restriction to $$\QQ_p^\times$$ of the unique smooth character $$\omega$$ of $$\mathbf{A}^\times / \QQ^\times$$ such that $$\omega(\varpi_\ell) = \ell^j \varepsilon(\ell)$$ for all primes $$\ell \nmid Np$$, where $$\varpi_\ell$$ is a uniformiser at $$\ell$$, $$\varepsilon$$ is the Nebentypus character of the newform $$f$$, and $$j$$ is the twist factor (see the documentation for LocalComponent()).

EXAMPLES:

sage: LocalComponent(Newform('27a'), 3).central_character()
Character of Q_3*, of level 0, mapping 3 |--> 1

sage: LocalComponent(Newforms(Gamma1(5), 5, names='c'), 5).central_character()
Character of Q_5*, of level 1, mapping 2 |--> c0 + 1, 5 |--> 125

sage: LocalComponent(Newforms(DirichletGroup(24)([1, -1,-1]), 3, names='a'), 2).central_character()
Character of Q_2*, of level 3, mapping 7 |--> 1, 5 |--> -1, 2 |--> -2

check_tempered()

Check that this representation is quasi-tempered, i.e. $$\pi \otimes |\det|^{j/2}$$ is tempered. It is well known that local components of modular forms are always tempered, so this serves as a useful check on our computations.

EXAMPLES:

sage: from sage.modular.local_comp.local_comp import LocalComponentBase
sage: LocalComponentBase(Newform('50a'), 3, 0).check_tempered()
Traceback (most recent call last):
...
NotImplementedError: <abstract method check_tempered at ...>

coefficient_field()

The field $$K$$ over which this representation is defined. This is the field generated by the Hecke eigenvalues of the corresponding newform (over whatever base ring the newform is created).

EXAMPLES:

sage: LocalComponent(Newforms(50), 3).coefficient_field()
Rational Field
sage: LocalComponent(Newforms(Gamma1(10), 3, base_ring=QQbar), 5).coefficient_field()
Algebraic Field
sage: LocalComponent(Newforms(DirichletGroup(5).0, 7,names='c'), 5).coefficient_field()
Number Field in c0 with defining polynomial x^2 + (5*zeta4 + 5)*x - 88*zeta4 over its base field

conductor()

The smallest $$r$$ such that this representation has a nonzero vector fixed by the subgroup $$\begin{pmatrix} * & * \\ 0 & 1\end{pmatrix} \pmod{p^r}$$. This is equal to the power of $$p$$ dividing the level of the corresponding newform.

EXAMPLES:

sage: LocalComponent(Newform('50a'), 5).conductor()
2

newform()

The newform of which this is a local component.

EXAMPLES:

sage: LocalComponent(Newform('50a'), 5).newform()
q - q^2 + q^3 + q^4 + O(q^6)

prime()

The prime at which this is a local component.

EXAMPLES:

sage: LocalComponent(Newform('50a'), 5).prime()
5

species()

The species of this local component, which is either ‘Principal Series’, ‘Special’ or ‘Supercuspidal’.

EXAMPLES:

sage: from sage.modular.local_comp.local_comp import LocalComponentBase
sage: LocalComponentBase(Newform('50a'), 3, 0).species()
Traceback (most recent call last):
...
NotImplementedError: <abstract method species at ...>

twist_factor()

The unique $$j$$ such that $$\begin{pmatrix} p & 0 \\ 0 & p\end{pmatrix}$$ acts as multiplication by $$p^j$$ times a root of unity.

There are various conventions for this; see the documentation of the LocalComponent() constructor function for more information.

The twist factor should have the same parity as the weight of the form, since otherwise the map sending $$f$$ to its local component won’t be Galois equivariant.

EXAMPLES:

sage: LocalComponent(Newforms(50), 3).twist_factor()
0
sage: LocalComponent(Newforms(50), 3, twist_factor=173).twist_factor()
173

class sage.modular.local_comp.local_comp.PrimitivePrincipalSeries(newform, prime, twist_factor)

A ramified principal series of the form $$\pi(\chi_1, \chi_2)$$ where $$\chi_1$$ is unramified but $$\chi_2$$ is not.

EXAMPLES:

sage: Pi = LocalComponent(Newforms(Gamma1(13), 2, names='a'), 13)
sage: type(Pi)
<class 'sage.modular.local_comp.local_comp.PrimitivePrincipalSeries'>
sage: TestSuite(Pi).run()

characters()

Return the two characters $$(\chi_1, \chi_2)$$ such that the local component $$\pi_{f, p}$$ is the induction of the character $$\chi_1 \times \chi_2$$ of the Borel subgroup.

EXAMPLES:

sage: LocalComponent(Newforms(Gamma1(13), 2, names='a'), 13).characters()
[
Character of Q_13*, of level 0, mapping 13 |--> 3*a0 + 2,
Character of Q_13*, of level 1, mapping 2 |--> a0 + 2, 13 |--> -3*a0 - 7
]

class sage.modular.local_comp.local_comp.PrimitiveSpecial(newform, prime, twist_factor)

A primitive special representation: that is, the Steinberg representation twisted by an unramified character. All such representations have conductor 1.

EXAMPLES:

sage: Pi = LocalComponent(Newform('37a'), 37)
sage: Pi.species()
'Special'
sage: Pi.conductor()
1
sage: type(Pi)
<class 'sage.modular.local_comp.local_comp.PrimitiveSpecial'>
sage: TestSuite(Pi).run()

characters()

Return the defining characters of this representation. In this case, it will return the unique unramified character $$\chi$$ of $$\QQ_p^\times$$ such that this representation is equal to $$\mathrm{St} \otimes \chi$$, where $$\mathrm{St}$$ is the Steinberg representation (defined as the quotient of the parabolic induction of the trivial character by its trivial subrepresentation).

EXAMPLES:

Our first example is the newform corresponding to an elliptic curve of conductor $$37$$. This is the nontrivial quadratic twist of Steinberg, corresponding to the fact that the elliptic curve has non-split multiplicative reduction at 37:

sage: LocalComponent(Newform('37a'), 37).characters()
[Character of Q_37*, of level 0, mapping 37 |--> -1]


We try an example in odd weight, where the central character isn’t trivial:

sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j'), 7); Pi.characters()
[Character of Q_7*, of level 0, mapping 7 |--> -1/2*j0^2 - 7/2]
sage: Pi.characters() ^2 == Pi.central_character()
True


An example using a non-standard twist factor:

sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j'), 7, twist_factor=3); Pi.characters()
[Character of Q_7*, of level 0, mapping 7 |--> -7/2*j0^2 - 49/2]
sage: Pi.characters()^2 == Pi.central_character()
True

check_tempered()

Check that this representation is tempered (after twisting by $$|\det|^{j/2}$$ where $$j$$ is the twist factor). Since local components of modular forms are always tempered, this is a useful check on our calculations.

EXAMPLES:

sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j'), 7)
sage: Pi.check_tempered()

species()

The species of this local component, which is either ‘Principal Series’, ‘Special’ or ‘Supercuspidal’.

EXAMPLES:

sage: LocalComponent(Newform('37a'), 37).species()
'Special'

class sage.modular.local_comp.local_comp.PrimitiveSupercuspidal(newform, prime, twist_factor)

A primitive supercuspidal representation.

Except for some exceptional cases when $$p = 2$$ which we do not implement here, such representations are parametrized by smooth characters of tamely ramified quadratic extensions of $$\QQ_p$$.

EXAMPLES:

sage: f = Newform("50a")
sage: Pi = LocalComponent(f, 5)
sage: type(Pi)
<class 'sage.modular.local_comp.local_comp.PrimitiveSupercuspidal'>
sage: Pi.species()
'Supercuspidal'
sage: TestSuite(Pi).run()

characters()

Return the two conjugate characters of $$K^\times$$, where $$K$$ is some quadratic extension of $$\QQ_p$$, defining this representation. This is fully implemented only in the case where the power of $$p$$ dividing the level of the form is even, in which case $$K$$ is the unique unramified quadratic extension of $$\QQ_p$$.

EXAMPLES:

The first example from [LW2012]:

sage: f = Newform('50a')
sage: Pi = LocalComponent(f, 5)
sage: chars = Pi.characters(); chars
[
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> d, 5 |--> 1,
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -d - 1, 5 |--> 1
]
sage: chars.base_ring()
Number Field in d with defining polynomial x^2 + x + 1


These characters are interchanged by the Frobenius automorphism of $$\GF{25}$$:

sage: chars == chars**5
True


A more complicated example (higher weight and nontrivial central character):

sage: f = Newforms(GammaH(25, ), 3, names='j'); f
q + j0*q^2 + 1/3*j0^3*q^3 - 1/3*j0^2*q^4 + O(q^6)
sage: Pi = LocalComponent(f, 5)
sage: Pi.characters()
[
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> d, 5 |--> 5,
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -d - 1/3*j0^3, 5 |--> 5
]
sage: Pi.characters().base_ring()
Number Field in d with defining polynomial x^2 + 1/3*j0^3*x - 1/3*j0^2 over its base field


Warning

The above output isn’t actually the same as in Example 2 of [LW2012], due to an error in the published paper (correction pending) – the published paper has the inverses of the above characters.

A higher level example:

sage: f = Newform('81a', names='j'); f
q + j0*q^2 + q^4 - j0*q^5 + O(q^6)
sage: LocalComponent(f, 3).characters()  # long time (12s on sage.math, 2012)
[
Character of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0), of level 2, mapping -2*s |--> -2*d - j0, 4 |--> 1, 3*s + 1 |--> -j0*d - 2, 3 |--> 1,
Character of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0), of level 2, mapping -2*s |--> 2*d + j0, 4 |--> 1, 3*s + 1 |--> j0*d + 1, 3 |--> 1
]


In the ramified case, it’s not fully implemented, and just returns a string indicating which ramified extension is being considered:

sage: Pi = LocalComponent(Newform('27a'), 3)
sage: Pi.characters()
'Character of Q_3(sqrt(-3))'
sage: Pi = LocalComponent(Newform('54a'), 3)
sage: Pi.characters()
'Character of Q_3(sqrt(3))'

check_tempered()

Check that this representation is tempered (after twisting by $$|\det|^{j/2}$$ where $$j$$ is the twist factor). Since local components of modular forms are always tempered, this is a useful check on our calculations.

Since the computation of the characters attached to this representation is not implemented in the odd-conductor case, a NotImplementedError will be raised for such representations.

EXAMPLES:

sage: LocalComponent(Newform("50a"), 5).check_tempered()
sage: LocalComponent(Newform("27a"), 3).check_tempered() # not tested

species()

The species of this local component, which is either ‘Principal Series’, ‘Special’ or ‘Supercuspidal’.

EXAMPLES:

sage: LocalComponent(Newform('49a'), 7).species()
'Supercuspidal'

type_space()

Return a TypeSpace object describing the (homological) type space of this newform, which we know is dual to the type space of the local component.

EXAMPLES:

sage: LocalComponent(Newform('49a'), 7).type_space()
6-dimensional type space at prime 7 of form q + q^2 - q^4 + O(q^6)

class sage.modular.local_comp.local_comp.PrincipalSeries(newform, prime, twist_factor)

A principal series representation. This is an abstract base class, not to be instantiated directly; see the subclasses UnramifiedPrincipalSeries and PrimitivePrincipalSeries.

characters()

Return the two characters $$(\chi_1, \chi_2)$$ such this representation $$\pi_{f, p}$$ is equal to the principal series $$\pi(\chi_1, \chi_2)$$.

EXAMPLES:

sage: from sage.modular.local_comp.local_comp import PrincipalSeries
sage: PrincipalSeries(Newform('50a'), 3, 0).characters()
Traceback (most recent call last):
...
NotImplementedError: <abstract method characters at ...>

check_tempered()

Check that this representation is tempered (after twisting by $$|\det|^{j/2}$$), i.e. that $$|\chi_1(p)| = |\chi_2(p)| = p^{(j + 1)/2}$$. This follows from the Ramanujan–Petersson conjecture, as proved by Deligne.

EXAMPLES:

sage: LocalComponent(Newform('49a'), 3).check_tempered()

species()

The species of this local component, which is either ‘Principal Series’, ‘Special’ or ‘Supercuspidal’.

EXAMPLES:

sage: LocalComponent(Newform('50a'), 3).species()
'Principal Series'

class sage.modular.local_comp.local_comp.UnramifiedPrincipalSeries(newform, prime, twist_factor)

An unramified principal series representation of $${\rm GL}_2(\QQ_p)$$ (corresponding to a form whose level is not divisible by $$p$$).

EXAMPLES:

sage: Pi = LocalComponent(Newform('50a'), 3)
sage: Pi.conductor()
0
sage: type(Pi)
<class 'sage.modular.local_comp.local_comp.UnramifiedPrincipalSeries'>
sage: TestSuite(Pi).run()

characters()

Return the two characters $$(\chi_1, \chi_2)$$ such this representation $$\pi_{f, p}$$ is equal to the principal series $$\pi(\chi_1, \chi_2)$$. These are the unramified characters mapping $$p$$ to the roots of the Satake polynomial, so in most cases (but not always) they will be defined over an extension of the coefficient field of self.

EXAMPLES:

sage: LocalComponent(Newform('11a'), 17).characters()
[
Character of Q_17*, of level 0, mapping 17 |--> d,
Character of Q_17*, of level 0, mapping 17 |--> -d - 2
]
sage: LocalComponent(Newforms(Gamma1(5), 6, names='a'), 3).characters()
[
Character of Q_3*, of level 0, mapping 3 |--> -3/2*a1 + 12,
Character of Q_3*, of level 0, mapping 3 |--> -3/2*a1 - 12
]

satake_polynomial()

Return the Satake polynomial of this representation, i.e.~the polynomial whose roots are $$\chi_1(p), \chi_2(p)$$ where this representation is $$\pi(\chi_1, \chi_2)$$. Concretely, this is the polynomial

$X^2 - p^{(j - k + 2)/2} a_p(f) X + p^{j + 1} \varepsilon(p).$

An error will be raised if $$j \ne k \bmod 2$$.

EXAMPLES:

sage: LocalComponent(Newform('11a'), 17).satake_polynomial()
X^2 + 2*X + 17
sage: LocalComponent(Newform('11a'), 17, twist_factor = -2).satake_polynomial()
X^2 + 2/17*X + 1/17
`