Local components of modular forms - Modular Forms

Skip to content
Back to top
View this page
Edit this page

# 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

class sage.modular.local_comp.local_comp.ImprimitiveLocalComponent(newform, prime, twist_factor, min_twist, chi)

  Bases: `LocalComponentBase`

  A smooth representation which is not of minimal level among its character twists. Internally, this is stored as a pair consisting of a minimal local component and a character to twist by.

  characters()

    Return the pair of characters (either of \(\QQ_p^*\) or of some quadratic extension) corresponding to this representation.

    EXAMPLES:

    Sage

        sage: f = [f for f in Newforms(63, 4, names='a') if f[2] == 1][0]
        sage: f.local_component(3).characters()
        [Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> d,
         Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> -d - 2]

    Python

        >>> from sage.all import *
        >>> f = [f for f in Newforms(Integer(63), Integer(4), names='a') if f[Integer(2)] == Integer(1)][Integer(0)]
        >>> f.local_component(Integer(3)).characters()
        [Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> d,
         Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> -d - 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

        sage: f = [f for f in Newforms(63, 4, names='a') if f[2] == 1][0]
        sage: f.local_component(3).check_tempered()

    Python

        >>> from sage.all import *
        >>> f = [f for f in Newforms(Integer(63), Integer(4), names='a') if f[Integer(2)] == Integer(1)][Integer(0)]
        >>> f.local_component(Integer(3)).check_tempered()

  is_primitive()

    Return `True` if this local component is primitive (has minimal level among its character twists).

    EXAMPLES:

    Sage

        sage: Newform("45a").local_component(3).is_primitive()
        False

    Python

        >>> from sage.all import *
        >>> Newform("45a").local_component(Integer(3)).is_primitive()
        False

  minimal_twist()

    Return a twist of this local component which has the minimal possible conductor.

    EXAMPLES:

    Sage

        sage: Pi = Newform("75b").local_component(5)
        sage: Pi.minimal_twist()
        Smooth representation of GL_2(Q_5) with conductor 5^1

    Python

        >>> from sage.all import *
        >>> Pi = Newform("75b").local_component(Integer(5))
        >>> Pi.minimal_twist()
        Smooth representation of GL_2(Q_5) with conductor 5^1

  species()

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

    EXAMPLES:

    Sage

        sage: Pi = Newform("45a").local_component(3)
        sage: Pi.species()
        'Special'

    Python

        >>> from sage.all import *
        >>> Pi = Newform("45a").local_component(Integer(3))
        >>> Pi.species()
        'Special'

  twisting_character()

    Return the character giving the minimal twist of this representation.

    EXAMPLES:

    Sage

        sage: Pi = Newform("45a").local_component(3)
        sage: Pi.twisting_character()
        Dirichlet character modulo 3 of conductor 3 mapping 2 |--> -1

    Python

        >>> from sage.all import *
        >>> Pi = Newform("45a").local_component(Integer(3))
        >>> Pi.twisting_character()
        Dirichlet character modulo 3 of conductor 3 mapping 2 |--> -1

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; prime

  - `twist_factor` – 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) |a|\), 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

      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]

  Python

      >>> from sage.all import *
      >>> Pi = LocalComponent(Newform('49a'), Integer(7)); Pi
      Smooth representation of GL_2(Q_7) with conductor 7^2
      >>> Pi.central_character()
      Character of Q_7*, of level 0, mapping 7 |--> 1
      >>> Pi.species()
      'Supercuspidal'
      >>> 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: `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

        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

    Python

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

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

        >>> LocalComponent(Newforms(DirichletGroup(Integer(24))([Integer(1), -Integer(1),-Integer(1)]), Integer(3), names='a')[Integer(0)], Integer(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

        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 ...>

    Python

        >>> from sage.all import *
        >>> from sage.modular.local_comp.local_comp import LocalComponentBase
        >>> LocalComponentBase(Newform('50a'), Integer(3), Integer(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

        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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newforms(Integer(50))[Integer(0)], Integer(3)).coefficient_field()
        Rational Field
        >>> LocalComponent(Newforms(Gamma1(Integer(10)), Integer(3), base_ring=QQbar)[Integer(0)], Integer(5)).coefficient_field()
        Algebraic Field
        >>> LocalComponent(Newforms(DirichletGroup(Integer(5)).gen(0), Integer(7),names='c')[Integer(0)], Integer(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

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('50a'), Integer(5)).conductor()
        2

  newform()

    The newform of which this is a local component.

    EXAMPLES:

    Sage

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('50a'), Integer(5)).newform()
        q - q^2 + q^3 + q^4 + O(q^6)

  prime()

    The prime at which this is a local component.

    EXAMPLES:

    Sage

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('50a'), Integer(5)).prime()
        5

  species()

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

    EXAMPLES:

    Sage

        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 ...>

    Python

        >>> from sage.all import *
        >>> from sage.modular.local_comp.local_comp import LocalComponentBase
        >>> LocalComponentBase(Newform('50a'), Integer(3), Integer(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

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newforms(Integer(50))[Integer(0)], Integer(3)).twist_factor()
        0
        >>> LocalComponent(Newforms(Integer(50))[Integer(0)], Integer(3), twist_factor=Integer(173)).twist_factor()
        173

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

  Bases: `LocalComponentBase`

  Base class for primitive (twist-minimal) local components.

  is_primitive()

    Return `True` if this local component is primitive (has minimal level among its character twists).

    EXAMPLES:

    Sage

        sage: Newform("50a").local_component(5).is_primitive()
        True

    Python

        >>> from sage.all import *
        >>> Newform("50a").local_component(Integer(5)).is_primitive()
        True

  minimal_twist()

    Return a twist of this local component which has the minimal possible conductor.

    EXAMPLES:

    Sage

        sage: Pi = Newform("50a").local_component(5)
        sage: Pi.minimal_twist() == Pi
        True

    Python

        >>> from sage.all import *
        >>> Pi = Newform("50a").local_component(Integer(5))
        >>> Pi.minimal_twist() == Pi
        True

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

  Bases: `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

      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()

  Python

      >>> from sage.all import *
      >>> Pi = LocalComponent(Newforms(Gamma1(Integer(13)), Integer(2), names='a')[Integer(0)], Integer(13))
      >>> type(Pi)
      <class 'sage.modular.local_comp.local_comp.PrimitivePrincipalSeries'>
      >>> 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

        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]

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newforms(Gamma1(Integer(13)), Integer(2), names='a')[Integer(0)], Integer(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: `PrimitiveLocalComponent`

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

  EXAMPLES:

  Sage

      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()

  Python

      >>> from sage.all import *
      >>> Pi = LocalComponent(Newform('37a'), Integer(37))
      >>> Pi.species()
      'Special'
      >>> Pi.conductor()
      1
      >>> type(Pi)
      <class 'sage.modular.local_comp.local_comp.PrimitiveSpecial'>
      >>> 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

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('37a'), Integer(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

        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

    [Python]

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

    An example using a non-standard twist factor:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> Pi = LocalComponent(Newforms(DirichletGroup(Integer(21))([-Integer(1), Integer(1)]), Integer(3), names='j')[Integer(0)], Integer(7), twist_factor=Integer(3)); Pi.characters()
        [Character of Q_7*, of level 0, mapping 7 |--> -7/2*j0^2 - 49/2]
        >>> Pi.characters()[Integer(0)]**Integer(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

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

    Python

        >>> from sage.all import *
        >>> Pi = LocalComponent(Newforms(DirichletGroup(Integer(21))([-Integer(1), Integer(1)]), Integer(3), names='j')[Integer(0)], Integer(7))
        >>> Pi.check_tempered()

  species()

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

    EXAMPLES:

    Sage

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('37a'), Integer(37)).species()
        'Special'

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

  Bases: `PrimitiveLocalComponent`

  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

      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()

  Python

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

  characters()

    Return the two conjugate characters of \(K^\times\), where \(K\) is some quadratic extension of \(\QQ_p\), defining this representation. An error will be raised in some 2-adic cases, since not all 2-adic supercuspidal representations arise in this way.

    EXAMPLES:

    The first example from [LW2012]:

    Sage

        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 - 1, 5 |--> 1,
         Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> d, 5 |--> 1]
        sage: chars[0].base_ring()
        Number Field in d with defining polynomial x^2 + x + 1

    Python

        >>> from sage.all import *
        >>> f = Newform('50a')
        >>> Pi = LocalComponent(f, Integer(5))
        >>> chars = Pi.characters(); chars
        [Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -d - 1, 5 |--> 1,
         Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> d, 5 |--> 1]
        >>> chars[Integer(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

        sage: chars[0] == chars[1]**5
        True

    [Python]

        >>> from sage.all import *
        >>> chars[Integer(0)] == chars[Integer(1)]**Integer(5)
        True

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

    Sage

        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 |--> 1/3*j0^2*d - 1/3*j0^3, 5 |--> 5,
         Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -1/3*j0^2*d, 5 |--> 5]
        sage: Pi.characters()[0].base_ring()
        Number Field in d with defining polynomial x^2 - j0*x + 1/3*j0^2 over its base field

    Python

        >>> from sage.all import *
        >>> f = Newforms(GammaH(Integer(25), [Integer(6)]), Integer(3), names='j')[Integer(0)]; f
        q + j0*q^2 + 1/3*j0^3*q^3 - 1/3*j0^2*q^4 + O(q^6)
        >>> Pi = LocalComponent(f, Integer(5))
        >>> Pi.characters()
        [Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> 1/3*j0^2*d - 1/3*j0^3, 5 |--> 5,
         Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -1/3*j0^2*d, 5 |--> 5]
        >>> Pi.characters()[Integer(0)].base_ring()
        Number Field in d with defining polynomial x^2 - j0*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

        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 + 1, 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 - 2, 3 |--> 1]

    [Python]

        >>> from sage.all import *
        >>> f = Newform('81a', names='j'); f
        q + j0*q^2 + q^4 - j0*q^5 + O(q^6)
        >>> LocalComponent(f, Integer(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 + 1, 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 - 2, 3 |--> 1]

    Some ramified examples:

    Sage

        sage: Newform('27a').local_component(3).characters()
        [Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> -d, s |--> -1,
         Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> d - 1, s |--> -1]
        sage: LocalComponent(Newform('54a'), 3, twist_factor=4).characters()
        [Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> -1/9*d, s |--> -9,
         Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> 1/9*d - 1, s |--> -9]

    Python

        >>> from sage.all import *
        >>> Newform('27a').local_component(Integer(3)).characters()
        [Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> -d, s |--> -1,
         Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> d - 1, s |--> -1]
        >>> LocalComponent(Newform('54a'), Integer(3), twist_factor=Integer(4)).characters()
        [Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> -1/9*d, s |--> -9,
         Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> 1/9*d - 1, s |--> -9]

    A 2-adic non-example:

    Sage

        sage: Newform('24a').local_component(2).characters()
        Traceback (most recent call last):
        ...
        ValueError: Totally ramified 2-adic representations are not classified by characters

    [Python]

        >>> from sage.all import *
        >>> Newform('24a').local_component(Integer(2)).characters()
        Traceback (most recent call last):
        ...
        ValueError: Totally ramified 2-adic representations are not classified by characters

    Examples where \(K^\times / \QQ_p^\times\) is not topologically cyclic (which complicates the computations greatly):

    Sage

        sage: Newforms(DirichletGroup(64, QQ).1, 2, names='a')[0].local_component(2).characters() # long time, random
        [
        Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 3,
          mapping s |--> 1, 2*s + 1 |--> 1/2*a0, 4*s + 1 |--> 1, -1 |--> 1, 2 |--> 1,
        Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 3,
          mapping s |--> 1, 2*s + 1 |--> 1/2*a0, 4*s + 1 |--> -1, -1 |--> 1, 2 |--> 1
        ]
        sage: Newform('243a',names='a').local_component(3).characters() # long time
        [Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 4, mapping -2*s - 1 |--> -d - 1, 4 |--> 1, 3*s + 1 |--> -d - 1, s |--> 1,
         Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 4, mapping -2*s - 1 |--> d, 4 |--> 1, 3*s + 1 |--> d, s |--> 1]

    Python

        >>> from sage.all import *
        >>> Newforms(DirichletGroup(Integer(64), QQ).gen(1), Integer(2), names='a')[Integer(0)].local_component(Integer(2)).characters() # long time, random
        [
        Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 3,
          mapping s |--> 1, 2*s + 1 |--> 1/2*a0, 4*s + 1 |--> 1, -1 |--> 1, 2 |--> 1,
        Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 3,
          mapping s |--> 1, 2*s + 1 |--> 1/2*a0, 4*s + 1 |--> -1, -1 |--> 1, 2 |--> 1
        ]
        >>> Newform('243a',names='a').local_component(Integer(3)).characters() # long time
        [Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 4, mapping -2*s - 1 |--> -d - 1, 4 |--> 1, 3*s + 1 |--> -d - 1, s |--> 1,
         Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 4, mapping -2*s - 1 |--> d, 4 |--> 1, 3*s + 1 |--> d, s |--> 1]

  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

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform("50a"), Integer(5)).check_tempered()
        >>> LocalComponent(Newform("27a"), Integer(3)).check_tempered()

  species()

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

    EXAMPLES:

    Sage

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('49a'), Integer(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

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('49a'), Integer(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)

  Bases: `PrimitiveLocalComponent`

  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

        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 ...>

    Python

        >>> from sage.all import *
        >>> from sage.modular.local_comp.local_comp import PrincipalSeries
        >>> PrincipalSeries(Newform('50a'), Integer(3), Integer(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

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('49a'), Integer(3)).check_tempered()

  species()

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

    EXAMPLES:

    Sage

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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('50a'), Integer(3)).species()
        'Principal Series'

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

  Bases: `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

      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()

  Python

      >>> from sage.all import *
      >>> Pi = LocalComponent(Newform('50a'), Integer(3))
      >>> Pi.conductor()
      0
      >>> type(Pi)
      <class 'sage.modular.local_comp.local_comp.UnramifiedPrincipalSeries'>
      >>> 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

        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]

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('11a'), Integer(17)).characters()
        [Character of Q_17*, of level 0, mapping 17 |--> d,
         Character of Q_17*, of level 0, mapping 17 |--> -d - 2]
        >>> LocalComponent(Newforms(Gamma1(Integer(5)), Integer(6), names='a')[Integer(1)], Integer(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

        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

    Python

        >>> from sage.all import *
        >>> LocalComponent(Newform('11a'), Integer(17)).satake_polynomial()
        X^2 + 2*X + 17
        >>> LocalComponent(Newform('11a'), Integer(17), twist_factor = -Integer(2)).satake_polynomial()
        X^2 + 2/17*X + 1/17