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 infinitedimensional 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 primetwist_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 Galoisequivariant. 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^{k1} \varepsilon(\ell)\) for almost all \(\ell\). This has the property that the set \(\{\chi_1, \chi_2\}\) also depends Galoisequivariantly 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)¶ Bases:
sage.structure.sage_object.SageObject
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')[0], 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')[0], 2).central_character() Character of Q_2*, of level 3, mapping 7 > 1, 5 > 1, 2 > 2

check_tempered
()¶ Check that this representation is quasitempered, 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)[0], 3).coefficient_field() Rational Field sage: LocalComponent(Newforms(Gamma1(10), 3, base_ring=QQbar)[0], 5).coefficient_field() Algebraic Field sage: LocalComponent(Newforms(DirichletGroup(5).0, 7,names='c')[0], 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)[0], 3).twist_factor() 0 sage: LocalComponent(Newforms(50)[0], 3, twist_factor=173).twist_factor() 173


class
sage.modular.local_comp.local_comp.
PrimitivePrincipalSeries
(newform, prime, twist_factor)¶ Bases:
sage.modular.local_comp.local_comp.PrincipalSeries
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')[0], 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')[0], 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)¶ Bases:
sage.modular.local_comp.local_comp.LocalComponentBase
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 nonsplit 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')[0], 7); Pi.characters() [Character of Q_7*, of level 0, mapping 7 > 1/2*j0^2  7/2] sage: Pi.characters()[0] ^2 == Pi.central_character() True
An example using a nonstandard twist factor:
sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([1, 1]), 3, names='j')[0], 7, twist_factor=3); Pi.characters() [Character of Q_7*, of level 0, mapping 7 > 7/2*j0^2  49/2] sage: Pi.characters()[0]^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')[0], 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)¶ Bases:
sage.modular.local_comp.local_comp.LocalComponentBase
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[0].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[0] == chars[1]**5 True
A more complicated example (higher weight and nontrivial central character):
sage: f = Newforms(GammaH(25, [6]), 3, names='j')[0]; 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()[0].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 oddconductor 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'


class
sage.modular.local_comp.local_comp.
PrincipalSeries
(newform, prime, twist_factor)¶ Bases:
sage.modular.local_comp.local_comp.LocalComponentBase
A principal series representation. This is an abstract base class, not to be instantiated directly; see the subclasses
UnramifiedPrincipalSeries
andPrimitivePrincipalSeries
.
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)¶ Bases:
sage.modular.local_comp.local_comp.PrincipalSeries
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')[1], 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
