Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/modular/local_comp/local_comp.py
4054 views
1
r"""
2
Local components of modular forms
3
4
If `f` is a (new, cuspidal, normalised) modular eigenform, then one can
5
associate to `f` an *automorphic representation* `\pi_f` of the group
6
`\operatorname{GL}_2(\mathbf{A})` (where `\mathbf{A}` is the adele ring of
7
`\QQ`). This object factors as a restricted tensor product of components
8
`\pi_{f, v}` for each place of `\QQ`. These are infinite-dimensional
9
representations, but they are specified by a finite amount of data, and this
10
module provides functions which determine a description of the local factor
11
`\pi_{f, p}` at a finite prime `p`.
12
13
The functions in this module are based on the algorithms described in:
14
15
.. [LW11] David Loeffler and Jared Weinstein, *On the computation of local components of a newform*,
16
Mathematics of Computation (to appear), 2011. `Online version
17
<http://dx.doi.org/10.1090/S0025-5718-2011-02530-5>`_.
18
19
AUTHORS:
20
21
- David Loeffler
22
- Jared Weinstein
23
"""
24
25
import operator
26
from sage.structure.sage_object import SageObject
27
from sage.rings.all import QQ, ZZ, Zmod, QQbar, PolynomialRing, polygen
28
from sage.modular.modform.element import Newform
29
from sage.modular.dirichlet import DirichletGroup
30
from sage.misc.cachefunc import cached_method
31
from sage.misc.abstract_method import abstract_method
32
from sage.structure.sequence import Sequence
33
34
from type_space import TypeSpace
35
from smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupUnramifiedQuadratic, SmoothCharacterGroupRamifiedQuadratic
36
37
def LocalComponent(f, p, twist_factor=None):
38
r"""
39
Calculate the local component at the prime `p` of the automorphic
40
representation attached to the newform `f`.
41
42
INPUT:
43
44
- ``f`` (:class:`~sage.modular.modform.element.Newform`) a newform of weight `k \ge 2`
45
- ``p`` (integer) a prime
46
- ``twist_factor`` (integer) an integer congruent to `k` modulo 2 (default: `k - 2`)
47
48
.. note::
49
50
The argument ``twist_factor`` determines the choice of normalisation: if it is
51
set to `j \in \ZZ`, then the central character of `\pi_{f, \ell}` maps `\ell`
52
to `\ell^j \varepsilon(\ell)` for almost all `\ell`, where `\varepsilon` is the
53
Nebentypus character of `f`.
54
55
In the analytic theory it is conventional to take `j = 0` (the "Langlands
56
normalisation"), so the representation `\pi_f` is unitary; however, this is
57
inconvenient for `k` odd, since in this case one needs to choose a square root of `p`
58
and thus the map `f \to \pi_{f}` is not Galois-equivariant. Hence we use, by default, the
59
"Hecke normalisation" given by `j = k - 2`. This is also the most natural normalisation
60
from the perspective of modular symbols.
61
62
We also adopt a slightly unusual definition of the principal series: we
63
define `\pi(\chi_1, \chi_2)` to be the induction from the Borel subgroup of
64
the character of the maximal torus `\begin{pmatrix} x & \\ & y
65
\end{pmatrix} \mapsto \chi_1(a) \chi_2(b) |b|`, so its central character is
66
`z \mapsto \chi_1(z) \chi_2(z) |z|`. Thus `\chi_1 \chi_2` is the
67
restriction to `\QQ_p^\times` of the unique character of the id\'ele class
68
group mapping `\ell` to `\ell^{k-1} \varepsilon(\ell)` for almost all `\ell`.
69
This has the property that the *set* `\{\chi_1, \chi_2\}` also depends
70
Galois-equivariantly on `f`.
71
72
EXAMPLE::
73
74
sage: Pi = LocalComponent(Newform('49a'), 7); Pi
75
Smooth representation of GL_2(Q_7) with conductor 7^2
76
sage: Pi.central_character()
77
Character of Q_7*, of level 0, mapping 7 |--> 1
78
sage: Pi.species()
79
'Supercuspidal'
80
sage: Pi.characters()
81
[
82
Character of unramified extension Q_7(s)* (s^2 + 6*s + 3 = 0), of level 1, mapping s |--> d, 7 |--> 1,
83
Character of unramified extension Q_7(s)* (s^2 + 6*s + 3 = 0), of level 1, mapping s |--> -d, 7 |--> 1
84
]
85
"""
86
p = ZZ(p)
87
if not p.is_prime():
88
raise ValueError( "p must be prime" )
89
if not isinstance(f, Newform):
90
raise TypeError( "f (=%s of type %s) should be a Newform object" % (f, type(f)) )
91
92
r = f.level().valuation(p)
93
if twist_factor is None:
94
twist_factor = ZZ(f.weight() - 2)
95
else:
96
twist_factor = ZZ(twist_factor)
97
if r == 0:
98
return UnramifiedPrincipalSeries(f, p, twist_factor)
99
c = ZZ(f.character().conductor()).valuation(p)
100
if f[p] != 0:
101
if c == r:
102
return PrimitivePrincipalSeries(f, p, twist_factor)
103
if c == 0 and r == 1:
104
return PrimitiveSpecial(f, p, twist_factor)
105
Xf = TypeSpace(f, p)
106
if Xf.is_minimal():
107
return PrimitiveSupercuspidal(f, p, twist_factor)
108
else:
109
raise NotImplementedError( "Form %s is not %s-primitive" % (f, p) )
110
111
class LocalComponentBase(SageObject):
112
r"""
113
Base class for local components of newforms. Not to be directly instantiated; use the :func:`~LocalComponent` constructor function.
114
"""
115
116
def __init__(self, newform, prime, twist_factor):
117
r"""
118
Standard initialisation function.
119
120
EXAMPLE::
121
122
sage: LocalComponent(Newform('49a'), 7) # indirect doctest
123
Smooth representation of GL_2(Q_7) with conductor 7^2
124
"""
125
self._p = prime
126
self._f = newform
127
self._twist_factor = twist_factor
128
129
@abstract_method
130
def species(self):
131
r"""
132
The species of this local component, which is either 'Principal
133
Series', 'Special' or 'Supercuspidal'.
134
135
EXAMPLE::
136
137
sage: from sage.modular.local_comp.local_comp import LocalComponentBase
138
sage: LocalComponentBase(Newform('50a'), 3, 0).species()
139
Traceback (most recent call last):
140
...
141
NotImplementedError: <abstract method species at ...>
142
"""
143
pass
144
145
@abstract_method
146
def check_tempered(self):
147
r"""
148
Check that this representation is quasi-tempered, i.e. `\pi \otimes
149
|\det|^{j/2}` is tempered. It is well known that local components of
150
modular forms are *always* tempered, so this serves as a useful check
151
on our computations.
152
153
EXAMPLE::
154
155
sage: from sage.modular.local_comp.local_comp import LocalComponentBase
156
sage: LocalComponentBase(Newform('50a'), 3, 0).check_tempered()
157
Traceback (most recent call last):
158
...
159
NotImplementedError: <abstract method check_tempered at ...>
160
"""
161
pass
162
163
def _repr_(self):
164
r"""
165
String representation of self.
166
167
EXAMPLE::
168
169
sage: LocalComponent(Newform('50a'), 5)._repr_()
170
'Smooth representation of GL_2(Q_5) with conductor 5^2'
171
"""
172
return "Smooth representation of GL_2(Q_%s) with conductor %s^%s" % (self.prime(), self.prime(), self.conductor())
173
174
def newform(self):
175
r"""
176
The newform of which this is a local component.
177
178
EXAMPLE::
179
180
sage: LocalComponent(Newform('50a'), 5).newform()
181
q - q^2 + q^3 + q^4 + O(q^6)
182
"""
183
return self._f
184
185
def prime(self):
186
r"""
187
The prime at which this is a local component.
188
189
EXAMPLE::
190
191
sage: LocalComponent(Newform('50a'), 5).prime()
192
5
193
"""
194
return self._p
195
196
def conductor(self):
197
r"""
198
The smallest `r` such that this representation has a nonzero vector fixed by the subgroup
199
`\begin{pmatrix} * & * \\ 0 & 1\end{pmatrix} \pmod{p^r}`. This is equal to the power of `p` dividing the level of the corresponding newform.
200
201
EXAMPLE::
202
203
sage: LocalComponent(Newform('50a'), 5).conductor()
204
2
205
"""
206
return self.newform().level().valuation(self.prime())
207
208
def coefficient_field(self):
209
r"""
210
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).
211
212
EXAMPLE::
213
214
sage: LocalComponent(Newforms(50)[0], 3).coefficient_field()
215
Rational Field
216
sage: LocalComponent(Newforms(Gamma1(10), 3, base_ring=QQbar)[0], 5).coefficient_field()
217
Algebraic Field
218
sage: LocalComponent(Newforms(DirichletGroup(5).0, 7,names='c')[0], 5).coefficient_field()
219
Number Field in c0 with defining polynomial x^2 + (5*zeta4 + 5)*x - 88*zeta4 over its base field
220
"""
221
return self.newform().hecke_eigenvalue_field()
222
223
def twist_factor(self):
224
r"""
225
The unique `j` such that `\begin{pmatrix} p & 0 \\ 0 & p\end{pmatrix}`
226
acts as multiplication by `p^j` times a root of unity.
227
228
There are various conventions for this; see the documentation of the
229
:func:`~LocalComponent` constructor function for more information.
230
231
The twist factor should have the same parity as the weight of the form,
232
since otherwise the map sending `f` to its local component won't be
233
Galois equivariant.
234
235
EXAMPLE::
236
237
sage: LocalComponent(Newforms(50)[0], 3).twist_factor()
238
0
239
sage: LocalComponent(Newforms(50)[0], 3, twist_factor=173).twist_factor()
240
173
241
"""
242
return self._twist_factor
243
244
def central_character(self):
245
r"""
246
Return the central character of this representation. This is the
247
restriction to `\QQ_p^\times` of the unique smooth character `\omega`
248
of `\mathbf{A}^\times / \QQ^\times` such that `\omega(\varpi_\ell) =
249
\ell^j \varepsilon(\ell)` for all primes `\ell \nmid Np`, where
250
`\varpi_\ell` is a uniformiser at `\ell`, `\varepsilon` is the
251
Nebentypus character of the newform `f`, and `j` is the twist factor
252
(see the documentation for :func:`~LocalComponent`).
253
254
EXAMPLES::
255
256
sage: LocalComponent(Newform('27a'), 3).central_character()
257
Character of Q_3*, of level 0, mapping 3 |--> 1
258
259
sage: LocalComponent(Newforms(Gamma1(5), 5, names='c')[0], 5).central_character()
260
Character of Q_5*, of level 1, mapping 2 |--> c0 + 1, 5 |--> 125
261
262
sage: LocalComponent(Newforms(DirichletGroup(24)([1, -1,-1]), 3, names='a')[0], 2).central_character()
263
Character of Q_2*, of level 3, mapping 7 |--> 1, 5 |--> -1, 2 |--> -2
264
"""
265
from sage.rings.arith import crt
266
chi = self.newform().character()
267
f = self.prime() ** self.conductor()
268
N = self.newform().level() // f
269
G = DirichletGroup(f, self.coefficient_field())
270
chip = G([chi(crt(ZZ(x), 1, f, N)) for x in G.unit_gens()]).primitive_character()
271
a = crt(1, self.prime(), f, N)
272
273
if chip.conductor() == 1:
274
return SmoothCharacterGroupQp(self.prime(), self.coefficient_field()).character(0, [chi(a) * self.prime()**self.twist_factor()])
275
else:
276
return SmoothCharacterGroupQp(self.prime(), self.coefficient_field()).character(chip.conductor().valuation(self.prime()), list((~chip).values_on_gens()) + [chi(a) * self.prime()**self.twist_factor()])
277
278
def __cmp__(self, other):
279
r"""
280
Comparison function.
281
282
EXAMPLE::
283
284
sage: Pi = LocalComponent(Newform("50a"), 5)
285
sage: Pi == LocalComponent(Newform("50a"), 3)
286
False
287
sage: Pi == LocalComponent(Newform("50b"), 5)
288
False
289
sage: Pi == QQ
290
False
291
sage: Pi == None
292
False
293
sage: Pi == loads(dumps(Pi))
294
True
295
"""
296
return (cmp(type(self), type(other))
297
or cmp(self.prime(), other.prime())
298
or cmp(self.newform(), other.newform())
299
or cmp(self.twist_factor(), other.twist_factor()))
300
301
class PrincipalSeries(LocalComponentBase):
302
r"""
303
A principal series representation. This is an abstract base class, not to
304
be instantiated directly; see the subclasses
305
:class:`~UnramifiedPrincipalSeries` and :class:`~PrimitivePrincipalSeries`.
306
"""
307
308
def species(self):
309
r"""
310
The species of this local component, which is either 'Principal
311
Series', 'Special' or 'Supercuspidal'.
312
313
EXAMPLE::
314
315
sage: LocalComponent(Newform('50a'), 3).species()
316
'Principal Series'
317
"""
318
return "Principal Series"
319
320
def check_tempered(self):
321
r"""
322
Check that this representation is tempered (after twisting by
323
`|\det|^{j/2}`), i.e. that `|\chi_1(p)| = |\chi_2(p)| = p^{(j + 1)/2}`.
324
This follows from the Ramanujan--Petersson conjecture, as proved by
325
Deligne.
326
327
EXAMPLE::
328
329
sage: LocalComponent(Newform('49a'), 3).check_tempered()
330
"""
331
c1, c2 = self.characters()
332
K = c1.base_ring()
333
p = self.prime()
334
w = QQbar(p)**((1 + self.twist_factor()) / 2)
335
for sigma in K.embeddings(QQbar):
336
assert sigma(c1(p)).abs() == sigma(c2(p)).abs() == w
337
338
@abstract_method
339
def characters(self):
340
r"""
341
Return the two characters `(\chi_1, \chi_2)` such this representation
342
`\pi_{f, p}` is equal to the principal series `\pi(\chi_1, \chi_2)`.
343
344
EXAMPLE::
345
346
sage: from sage.modular.local_comp.local_comp import PrincipalSeries
347
sage: PrincipalSeries(Newform('50a'), 3, 0).characters()
348
Traceback (most recent call last):
349
...
350
NotImplementedError: <abstract method characters at ...>
351
"""
352
pass
353
354
class UnramifiedPrincipalSeries(PrincipalSeries):
355
r"""
356
An unramified principal series representation of `{\rm GL}_2(\QQ_p)`
357
(corresponding to a form whose level is not divisible by `p`).
358
359
EXAMPLE::
360
361
sage: Pi = LocalComponent(Newform('50a'), 3)
362
sage: Pi.conductor()
363
0
364
sage: type(Pi)
365
<class 'sage.modular.local_comp.local_comp.UnramifiedPrincipalSeries'>
366
sage: TestSuite(Pi).run()
367
"""
368
369
def satake_polynomial(self):
370
r"""
371
Return the Satake polynomial of this representation, i.e.~the polynomial whose roots are `\chi_1(p), \chi_2(p)`
372
where this representation is `\pi(\chi_1, \chi_2)`. Concretely, this is the polynomial
373
374
.. math::
375
376
X^2 - p^{(j - k + 2)/2} a_p(f) X + p^{j + 1} \varepsilon(p)`.
377
378
An error will be raised if `j \ne k \bmod 2`.
379
380
EXAMPLES::
381
382
sage: LocalComponent(Newform('11a'), 17).satake_polynomial()
383
X^2 + 2*X + 17
384
sage: LocalComponent(Newform('11a'), 17, twist_factor = -2).satake_polynomial()
385
X^2 + 2/17*X + 1/17
386
"""
387
p = self.prime()
388
return PolynomialRing(self.coefficient_field(), 'X')([
389
self.central_character()(p)*p,
390
-self.newform()[p] * p**((self.twist_factor() - self.newform().weight() + 2)/2),
391
1
392
])
393
394
def characters(self):
395
r"""
396
Return the two characters `(\chi_1, \chi_2)` such this representation
397
`\pi_{f, p}` is equal to the principal series `\pi(\chi_1, \chi_2)`.
398
These are the unramified characters mapping `p` to the roots of the Satake polynomial,
399
so in most cases (but not always) they will be defined over an
400
extension of the coefficient field of self.
401
402
EXAMPLES::
403
404
sage: LocalComponent(Newform('11a'), 17).characters()
405
[
406
Character of Q_17*, of level 0, mapping 17 |--> d,
407
Character of Q_17*, of level 0, mapping 17 |--> -d - 2
408
]
409
sage: LocalComponent(Newforms(Gamma1(5), 6, names='a')[1], 3).characters()
410
[
411
Character of Q_3*, of level 0, mapping 3 |--> -3/2*a1 + 12,
412
Character of Q_3*, of level 0, mapping 3 |--> -3/2*a1 - 12
413
]
414
"""
415
f = self.satake_polynomial()
416
if not f.is_irreducible():
417
# This can happen; see the second example above
418
d = f.roots()[0][0]
419
else:
420
d = self.coefficient_field().extension(f, 'd').gen()
421
G = SmoothCharacterGroupQp(self.prime(), d.parent())
422
return Sequence([G.character(0, [d]), G.character(0, [self.newform()[self.prime()] - d])], cr=True, universe=G)
423
424
class PrimitivePrincipalSeries(PrincipalSeries):
425
r"""
426
A ramified principal series of the form `\pi(\chi_1, \chi_2)`
427
where `\chi_1` is unramified but `\chi_2` is not.
428
429
EXAMPLE::
430
431
sage: Pi = LocalComponent(Newforms(Gamma1(13), 2, names='a')[0], 13)
432
sage: type(Pi)
433
<class 'sage.modular.local_comp.local_comp.PrimitivePrincipalSeries'>
434
sage: TestSuite(Pi).run()
435
"""
436
437
def characters(self):
438
r"""
439
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.
440
441
EXAMPLE::
442
443
sage: LocalComponent(Newforms(Gamma1(13), 2, names='a')[0], 13).characters()
444
[
445
Character of Q_13*, of level 0, mapping 13 |--> 3*a0 + 2,
446
Character of Q_13*, of level 1, mapping 2 |--> a0 + 2, 13 |--> -3*a0 - 7
447
]
448
"""
449
G = SmoothCharacterGroupQp(self.prime(), self.coefficient_field())
450
chi1 = G.character(0, [self.newform()[self.prime()]])
451
chi2 = G.character(0, [self.prime()]) * self.central_character() / chi1
452
return Sequence([chi1, chi2], cr=True, universe=G)
453
454
class PrimitiveSpecial(LocalComponentBase):
455
r"""
456
A primitive special representation: that is, the Steinberg representation
457
twisted by an unramified character. All such representations have conductor
458
1.
459
460
EXAMPLES::
461
462
sage: Pi = LocalComponent(Newform('37a'), 37)
463
sage: Pi.species()
464
'Special'
465
sage: Pi.conductor()
466
1
467
sage: type(Pi)
468
<class 'sage.modular.local_comp.local_comp.PrimitiveSpecial'>
469
sage: TestSuite(Pi).run()
470
"""
471
472
def species(self):
473
r"""
474
The species of this local component, which is either 'Principal
475
Series', 'Special' or 'Supercuspidal'.
476
477
EXAMPLE::
478
479
sage: LocalComponent(Newform('37a'), 37).species()
480
'Special'
481
"""
482
return "Special"
483
484
def characters(self):
485
r"""
486
Return the defining characters of this representation. In this case, it
487
will return the unique unramified character `\chi` of `\QQ_p^\times`
488
such that this representation is equal to `\mathrm{St} \otimes \chi`,
489
where `\mathrm{St}` is the Steinberg representation (defined as the
490
quotient of the parabolic induction of the trivial character by its
491
trivial subrepresentation).
492
493
EXAMPLES:
494
495
Our first example is the newform corresponding to an elliptic curve of
496
conductor `37`. This is the nontrivial quadratic twist of Steinberg,
497
corresponding to the fact that the elliptic curve has non-split
498
multiplicative reduction at 37::
499
500
sage: LocalComponent(Newform('37a'), 37).characters()
501
[Character of Q_37*, of level 0, mapping 37 |--> -1]
502
503
We try an example in odd weight, where the central character isn't
504
trivial::
505
506
sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j')[0], 7); Pi.characters()
507
[Character of Q_7*, of level 0, mapping 7 |--> -1/2*j0^2 - 7/2]
508
sage: Pi.characters()[0] ^2 == Pi.central_character()
509
True
510
511
An example using a non-standard twist factor::
512
513
sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j')[0], 7, twist_factor=3); Pi.characters()
514
[Character of Q_7*, of level 0, mapping 7 |--> -7/2*j0^2 - 49/2]
515
sage: Pi.characters()[0]^2 == Pi.central_character()
516
True
517
"""
518
519
return [SmoothCharacterGroupQp(self.prime(), self.coefficient_field()).character(0, [self.newform()[self.prime()] * self.prime() ** ((self.twist_factor() - self.newform().weight() + 2)/2)])]
520
521
def check_tempered(self):
522
r"""
523
Check that this representation is tempered (after twisting by
524
`|\det|^{j/2}` where `j` is the twist factor). Since local components
525
of modular forms are always tempered, this is a useful check on our
526
calculations.
527
528
EXAMPLE::
529
530
sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j')[0], 7)
531
sage: Pi.check_tempered()
532
"""
533
c1 = self.characters()[0]
534
K = c1.base_ring()
535
p = self.prime()
536
w = QQbar(p)**(self.twist_factor() / ZZ(2))
537
for sigma in K.embeddings(QQbar):
538
assert sigma(c1(p)).abs() == w
539
540
class PrimitiveSupercuspidal(LocalComponentBase):
541
r"""
542
A primitive supercuspidal representation. Except for some excpetional cases
543
when `p = 2` which we do not implement here, such representations are
544
parametrized by smooth characters of tamely ramified quadratic extensions
545
of `\QQ_p`.
546
547
EXAMPLES::
548
549
sage: f = Newform("50a")
550
sage: Pi = LocalComponent(f, 5)
551
sage: type(Pi)
552
<class 'sage.modular.local_comp.local_comp.PrimitiveSupercuspidal'>
553
sage: Pi.species()
554
'Supercuspidal'
555
sage: TestSuite(Pi).run()
556
"""
557
558
def species(self):
559
r"""
560
The species of this local component, which is either 'Principal
561
Series', 'Special' or 'Supercuspidal'.
562
563
EXAMPLE::
564
565
sage: LocalComponent(Newform('49a'), 7).species()
566
'Supercuspidal'
567
"""
568
return "Supercuspidal"
569
570
@cached_method
571
def type_space(self):
572
r"""
573
Return a :class:`~sage.modular.local_comp.type_space.TypeSpace` object
574
describing the (homological) type space of this newform, which we know
575
is dual to the type space of the local component.
576
577
EXAMPLE::
578
579
sage: LocalComponent(Newform('49a'), 7).type_space()
580
6-dimensional type space at prime 7 of form q + q^2 - q^4 + O(q^6)
581
"""
582
return TypeSpace(self.newform(), self.prime())
583
584
def characters(self):
585
r"""
586
Return the two conjugate characters of `K^\times`, where `K` is some
587
quadratic extension of `\QQ_p`, defining this representation. This is
588
fully implemented only in the case where the power of `p` dividing the
589
level of the form is even, in which case `K` is the unique unramified
590
quadratic extension of `\QQ_p`.
591
592
EXAMPLES:
593
594
The first example from _[LW11]::
595
596
sage: f = Newform('50a')
597
sage: Pi = LocalComponent(f, 5)
598
sage: chars = Pi.characters(); chars
599
[
600
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> d, 5 |--> 1,
601
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -d - 1, 5 |--> 1
602
]
603
sage: chars[0].base_ring()
604
Number Field in d with defining polynomial x^2 + x + 1
605
606
These characters are interchanged by the Frobenius automorphism of `\mathbb{F}_{25}`::
607
608
sage: chars[0] == chars[1]**5
609
True
610
611
A more complicated example (higher weight and nontrivial central character)::
612
613
sage: f = Newforms(GammaH(25, [6]), 3, names='j')[0]; f
614
q + j0*q^2 + 1/3*j0^3*q^3 - 1/3*j0^2*q^4 + O(q^6)
615
sage: Pi = LocalComponent(f, 5)
616
sage: Pi.characters()
617
[
618
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> d, 5 |--> 5,
619
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
620
]
621
sage: Pi.characters()[0].base_ring()
622
Number Field in d with defining polynomial x^2 + 1/3*j0^3*x - 1/3*j0^2 over its base field
623
624
.. warning::
625
626
The above output isn't actually the same as in Example 2 of
627
_[LW11], due to an error in the published paper (correction
628
pending) -- the published paper has the inverses of the above
629
characters.
630
631
A higher level example::
632
633
sage: f = Newform('81a', names='j'); f
634
q + j0*q^2 + q^4 - j0*q^5 + O(q^6)
635
sage: LocalComponent(f, 3).characters() # long time (12s on sage.math, 2012)
636
[
637
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,
638
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
639
]
640
641
In the ramified case, it's not fully implemented, and just returns a
642
string indicating which ramified extension is being considered::
643
644
sage: Pi = LocalComponent(Newform('27a'), 3)
645
sage: Pi.characters()
646
'Character of Q_3(sqrt(-3))'
647
sage: Pi = LocalComponent(Newform('54a'), 3)
648
sage: Pi.characters()
649
'Character of Q_3(sqrt(3))'
650
"""
651
T = self.type_space()
652
if self.conductor() % 2 == 0:
653
654
G = SmoothCharacterGroupUnramifiedQuadratic(self.prime(), self.coefficient_field())
655
n = self.conductor() // 2
656
g = G.quotient_gen(n)
657
m = g.matrix().change_ring(ZZ).list()
658
tr = (~T.rho(m)).trace()
659
660
# The inverse is needed here because T is the *homological* type space,
661
# which is dual to the cohomological one that defines the local component.
662
663
X = polygen(self.coefficient_field())
664
theta_poly = X**2 - (-1)**n*tr*X + self.central_character()(g.norm())
665
if theta_poly.is_irreducible():
666
F = self.coefficient_field().extension(theta_poly, "d")
667
G = G.base_extend(F)
668
chi1, chi2 = [G.extend_character(n, self.central_character(), x[0]) for x in theta_poly.roots(G.base_ring())]
669
670
# Consistency checks
671
assert chi1.restrict_to_Qp() == chi2.restrict_to_Qp() == self.central_character()
672
assert chi1*chi2 == chi1.parent().compose_with_norm(self.central_character())
673
674
return Sequence([chi1, chi2], check=False, cr=True)
675
676
else:
677
# The ramified case.
678
679
p = self.prime()
680
681
if p == 2:
682
# The ramified 2-adic representations aren't classified by admissible pairs. Die.
683
raise NotImplementedError( "Computation with ramified 2-adic representations not implemented" )
684
685
if p % 4 == 3:
686
a = ZZ(-1)
687
else:
688
a = ZZ(Zmod(self.prime()).quadratic_nonresidue())
689
690
tr1 = (~T.rho([0,1,a*p, 0])).trace()
691
tr2 = (~T.rho([0,1,p,0])).trace()
692
693
if tr1 == tr2 == 0:
694
# This *can* happen. E.g. if the central character satisfies
695
# chi(-1) = -1, then we have theta(pi) + theta(-pi) = theta(pi)
696
# * (1 + -1) = 0. In this case, one can presumably identify
697
# the character and the extension by some more subtle argument
698
# but I don't know of a good way to automate the process.
699
raise NotImplementedError( "Can't identify ramified quadratic extension -- both traces zero" )
700
elif tr1 == 0:
701
return "Character of Q_%s(sqrt(%s))" % (p, p)
702
703
elif tr2 == 0:
704
return "Character of Q_%s(sqrt(%s))" % (p, a*p)
705
706
else:
707
# At least one of the traces is *always* 0, since the type
708
# space has to be isomorphic to its twist by the (ramified
709
# quadratic) character corresponding to the quadratic
710
# extension.
711
raise RuntimeError( "Can't get here!" )
712
713
def check_tempered(self):
714
r"""
715
Check that this representation is tempered (after twisting by
716
`|\det|^{j/2}` where `j` is the twist factor). Since local components
717
of modular forms are always tempered, this is a useful check on our
718
calculations.
719
720
Since the computation of the characters attached to this representation
721
is not implemented in the odd-conductor case, a NotImplementedError
722
will be raised for such representations.
723
724
EXAMPLE::
725
726
sage: LocalComponent(Newform("50a"), 5).check_tempered()
727
sage: LocalComponent(Newform("27a"), 3).check_tempered() # not tested
728
"""
729
if self.conductor() % 2:
730
raise NotImplementedError
731
c1, c2 = self.characters()
732
K = c1.base_ring()
733
p = self.prime()
734
w = QQbar(p)**(self.twist_factor() / ZZ(2))
735
for sigma in K.embeddings(QQbar):
736
assert c1(p).abs() == c2(p).abs() == w
737
738