Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/modular/abvar/morphism.py
4057 views
1
r"""
2
Morphisms between modular abelian varieties, including Hecke operators acting on modular abelian varieties
3
4
Sage can compute with Hecke operators on modular abelian varieties.
5
A Hecke operator is defined by given a modular abelian variety and
6
an index. Given a Hecke operator, Sage can compute the
7
characteristic polynomial, and the action of the Hecke operator on
8
various homology groups.
9
10
AUTHORS:
11
12
- William Stein (2007-03)
13
14
- Craig Citro (2008-03)
15
16
EXAMPLES::
17
18
sage: A = J0(54)
19
sage: t5 = A.hecke_operator(5); t5
20
Hecke operator T_5 on Abelian variety J0(54) of dimension 4
21
sage: t5.charpoly().factor()
22
(x - 3) * (x + 3) * x^2
23
sage: B = A.new_subvariety(); B
24
Abelian subvariety of dimension 2 of J0(54)
25
sage: t5 = B.hecke_operator(5); t5
26
Hecke operator T_5 on Abelian subvariety of dimension 2 of J0(54)
27
sage: t5.charpoly().factor()
28
(x - 3) * (x + 3)
29
sage: t5.action_on_homology().matrix()
30
[ 0 3 3 -3]
31
[-3 3 3 0]
32
[ 3 3 0 -3]
33
[-3 6 3 -3]
34
"""
35
36
###########################################################################
37
# Copyright (C) 2007 William Stein <[email protected]> #
38
# Distributed under the terms of the GNU General Public License (GPL) #
39
# http://www.gnu.org/licenses/ #
40
###########################################################################
41
42
from sage.categories.morphism import Morphism as base_Morphism
43
from sage.rings.all import ZZ, QQ
44
import abvar as abelian_variety
45
import sage.modules.matrix_morphism
46
import sage.matrix.matrix_space as matrix_space
47
48
from finite_subgroup import TorsionPoint
49
50
class Morphism_abstract(sage.modules.matrix_morphism.MatrixMorphism_abstract):
51
"""
52
A morphism between modular abelian varieties. EXAMPLES::
53
54
sage: t = J0(11).hecke_operator(2)
55
sage: from sage.modular.abvar.morphism import Morphism
56
sage: isinstance(t, Morphism)
57
True
58
"""
59
60
def _repr_(self):
61
r"""
62
Return string representation of this morphism.
63
64
EXAMPLES::
65
66
sage: t = J0(11).hecke_operator(2)
67
sage: sage.modular.abvar.morphism.Morphism_abstract._repr_(t)
68
'Abelian variety endomorphism of Abelian variety J0(11) of dimension 1'
69
sage: J0(42).projection(J0(42)[0])._repr_()
70
'Abelian variety morphism:\n From: Abelian variety J0(42) of dimension 5\n To: Simple abelian subvariety 14a(1,42) of dimension 1 of J0(42)'
71
"""
72
return base_Morphism._repr_(self)
73
74
def _repr_type(self):
75
"""
76
Return type of morphism.
77
78
EXAMPLES::
79
80
sage: t = J0(11).hecke_operator(2)
81
sage: sage.modular.abvar.morphism.Morphism_abstract._repr_type(t)
82
'Abelian variety'
83
"""
84
return "Abelian variety"
85
86
def complementary_isogeny(self):
87
"""
88
Returns the complementary isogeny of self.
89
90
EXAMPLES::
91
92
sage: J = J0(43)
93
sage: A = J[1]
94
sage: T5 = A.hecke_operator(5)
95
sage: T5.is_isogeny()
96
True
97
sage: T5.complementary_isogeny()
98
Abelian variety endomorphism of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
99
sage: (T5.complementary_isogeny() * T5).matrix()
100
[2 0 0 0]
101
[0 2 0 0]
102
[0 0 2 0]
103
[0 0 0 2]
104
"""
105
if not self.is_isogeny():
106
raise ValueError, "self is not an isogeny"
107
M = self.matrix()
108
try:
109
iM, denom = M._invert_iml()
110
except AttributeError:
111
iM = M.matrix_over_field().invert()
112
iM, denom = iM._clear_denom()
113
return Morphism(self.parent().reversed(), iM)
114
115
def is_isogeny(self):
116
"""
117
Return True if this morphism is an isogeny of abelian varieties.
118
119
EXAMPLES::
120
121
sage: J = J0(39)
122
sage: Id = J.hecke_operator(1)
123
sage: Id.is_isogeny()
124
True
125
sage: J.hecke_operator(19).is_isogeny()
126
False
127
"""
128
M = self.matrix()
129
return M.nrows() == M.ncols() == M.rank()
130
131
def cokernel(self):
132
"""
133
Return the cokernel of self.
134
135
OUTPUT:
136
137
138
- ``A`` - an abelian variety (the cokernel)
139
140
- ``phi`` - a quotient map from self.codomain() to the
141
cokernel of self
142
143
144
EXAMPLES::
145
146
sage: t = J0(33).hecke_operator(2)
147
sage: (t-1).cokernel()
148
(Abelian subvariety of dimension 1 of J0(33),
149
Abelian variety morphism:
150
From: Abelian variety J0(33) of dimension 3
151
To: Abelian subvariety of dimension 1 of J0(33))
152
153
Projection will always have cokernel zero.
154
155
::
156
157
sage: J0(37).projection(J0(37)[0]).cokernel()
158
(Simple abelian subvariety of dimension 0 of J0(37),
159
Abelian variety morphism:
160
From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
161
To: Simple abelian subvariety of dimension 0 of J0(37))
162
163
Here we have a nontrivial cokernel of a Hecke operator, as the
164
T_2-eigenvalue for the newform 37b is 0.
165
166
::
167
168
sage: J0(37).hecke_operator(2).cokernel()
169
(Abelian subvariety of dimension 1 of J0(37),
170
Abelian variety morphism:
171
From: Abelian variety J0(37) of dimension 2
172
To: Abelian subvariety of dimension 1 of J0(37))
173
sage: AbelianVariety('37b').newform().q_expansion(5)
174
q + q^3 - 2*q^4 + O(q^5)
175
"""
176
try:
177
return self.__cokernel
178
except AttributeError:
179
I = self.image()
180
C = self.codomain().quotient(I)
181
self.__cokernel = C
182
return C
183
184
185
def kernel(self):
186
"""
187
Return the kernel of this morphism.
188
189
OUTPUT:
190
191
192
- ``G`` - a finite group
193
194
- ``A`` - an abelian variety (identity component of
195
the kernel)
196
197
198
EXAMPLES: We compute the kernel of a projection map. Notice that
199
the kernel has a nontrivial abelian variety part.
200
201
::
202
203
sage: A, B, C = J0(33)
204
sage: pi = J0(33).projection(B)
205
sage: pi.kernel()
206
(Finite subgroup with invariants [20] over QQbar of Abelian variety J0(33) of dimension 3,
207
Abelian subvariety of dimension 2 of J0(33))
208
209
We compute the kernels of some Hecke operators::
210
211
sage: t2 = J0(33).hecke_operator(2)
212
sage: t2
213
Hecke operator T_2 on Abelian variety J0(33) of dimension 3
214
sage: t2.kernel()
215
(Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3,
216
Abelian subvariety of dimension 0 of J0(33))
217
sage: t3 = J0(33).hecke_operator(3)
218
sage: t3.kernel()
219
(Finite subgroup with invariants [3, 3] over QQ of Abelian variety J0(33) of dimension 3,
220
Abelian subvariety of dimension 0 of J0(33))
221
"""
222
A = self.matrix()
223
L = A.image().change_ring(ZZ)
224
# Saturate the image of the matrix corresponding to self.
225
Lsat = L.saturation()
226
# Now find a matrix whose rows map exactly onto the
227
# saturation of L.
228
X = A.solve_left(Lsat.basis_matrix())
229
D = self.domain()
230
V = (A.kernel().basis_matrix() * D.vector_space().basis_matrix()).row_module()
231
Lambda = V.intersection(D._ambient_lattice())
232
from abvar import ModularAbelianVariety
233
abvar = ModularAbelianVariety(D.groups(), Lambda, D.base_ring())
234
235
if Lambda.rank() == 0:
236
field_of_definition = QQ
237
else:
238
field_of_definition = None
239
240
lattice = (X * self.domain().lattice().basis_matrix()).row_module(ZZ)
241
242
K = D.finite_subgroup(lattice, field_of_definition=field_of_definition)
243
244
return K, abvar
245
246
247
def factor_out_component_group(self):
248
r"""
249
View self as a morphism `f:A \to B`. Then `\ker(f)`
250
is an extension of an abelian variety `C` by a finite
251
component group `G`. This function constructs a morphism
252
`g` with domain `A` and codomain Q isogenous to
253
`C` such that `\ker(g)` is equal to `C`.
254
255
OUTPUT: a morphism
256
257
EXAMPLES::
258
259
sage: A,B,C = J0(33)
260
sage: pi = J0(33).projection(A)
261
sage: pi.kernel()
262
(Finite subgroup with invariants [5] over QQbar of Abelian variety J0(33) of dimension 3,
263
Abelian subvariety of dimension 2 of J0(33))
264
sage: psi = pi.factor_out_component_group()
265
sage: psi.kernel()
266
(Finite subgroup with invariants [] over QQbar of Abelian variety J0(33) of dimension 3,
267
Abelian subvariety of dimension 2 of J0(33))
268
269
ALGORITHM: We compute a subgroup `G` of `B` so that
270
the composition `h: A\to B \to B/G` has kernel that
271
contains `A[n]` and component group isomorphic to
272
`(\ZZ/n\ZZ)^{2d}`, where `d` is the
273
dimension of `A`. Then `h` factors through
274
multiplication by `n`, so there is a morphism
275
`g: A\to B/G` such that `g \circ [n] = h`. Then
276
`g` is the desired morphism. We give more details below
277
about how to transform this into linear algebra.
278
"""
279
try:
280
return self.__factor_out
281
except AttributeError:
282
A = self.matrix()
283
L = A.image()
284
# Saturate the image of the matrix corresponding to self.
285
Lsat = L.saturation()
286
if L == Lsat: # easy case
287
self.__factor_out = self
288
return self
289
# Now find a matrix whose rows map exactly onto the
290
# saturation of L.
291
X = A.solve_left(Lsat.basis_matrix())
292
293
# Find an integer n such that 1/n times the lattice Lambda of A
294
# contains the row span of X.
295
n = X.denominator()
296
297
# Let M be the lattice of the codomain B of self.
298
# Now 1/n * Lambda contains Lambda and maps
299
# via the matrix of self to a lattice L' that
300
# contains Lsat. Consider the lattice
301
# R = M + L'.
302
# This is a lattice that contains the lattice M of B.
303
# Also 1/n*Lambda maps exactly to L' in R.
304
# We have
305
# R/L' = (M+L')/L' = M/(L'/\M) = M/Lsat
306
# which is torsion free!
307
308
Q = self.codomain()
309
M = Q.lattice()
310
one_over_n = ZZ(1)/n
311
Lprime = (one_over_n * self.matrix() * M.basis_matrix()).row_module(ZZ)
312
313
# This R is a lattice in the ambient space for B.
314
R = Lprime + M
315
316
from abvar import ModularAbelianVariety
317
C = ModularAbelianVariety(Q.groups(), R, Q.base_field())
318
319
# We have to change the basis of the representation of A
320
# to the basis for R instead of the basis for M. Each row
321
# of A is written in terms of M, but needs to be in terms
322
# of R's basis, which contains M with finite index.
323
change_basis_from_M_to_R = R.basis_matrix().solve_left(M.basis_matrix())
324
matrix = one_over_n * A * change_basis_from_M_to_R
325
326
# Finally
327
g = Morphism(self.domain().Hom(C), matrix)
328
self.__factor_out = g
329
return g
330
331
def image(self):
332
"""
333
Return the image of this morphism.
334
335
OUTPUT: an abelian variety
336
337
EXAMPLES: We compute the image of projection onto a factor of
338
`J_0(33)`::
339
340
sage: A,B,C = J0(33)
341
sage: A
342
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
343
sage: f = J0(33).projection(A)
344
sage: f.image()
345
Abelian subvariety of dimension 1 of J0(33)
346
sage: f.image() == A
347
True
348
349
We compute the image of a Hecke operator::
350
351
sage: t2 = J0(33).hecke_operator(2); t2.fcp()
352
(x - 1) * (x + 2)^2
353
sage: phi = t2 + 2
354
sage: phi.image()
355
Abelian subvariety of dimension 1 of J0(33)
356
357
The sum of the image and the kernel is the whole space::
358
359
sage: phi.kernel()[1] + phi.image() == J0(33)
360
True
361
"""
362
return self(self.domain())
363
364
def __call__(self, X):
365
"""
366
INPUT:
367
368
369
- ``X`` - abelian variety, finite group, or torsion
370
element
371
372
373
OUTPUT: abelian variety, finite group, torsion element
374
375
EXAMPLES: We apply morphisms to elements::
376
377
sage: t2 = J0(33).hecke_operator(2)
378
sage: G = J0(33).torsion_subgroup(2); G
379
Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
380
sage: t2(G.0)
381
[(-1/2, 0, 1/2, -1/2, 1/2, -1/2)]
382
sage: t2(G.0) in G
383
True
384
sage: t2(G.1)
385
[(0, -1, 1/2, 0, 1/2, -1/2)]
386
sage: t2(G.2)
387
[(0, 0, 0, 0, 0, 0)]
388
sage: K = t2.kernel()[0]; K
389
Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
390
sage: t2(K.0)
391
[(0, 0, 0, 0, 0, 0)]
392
393
We apply morphisms to subgroups::
394
395
sage: t2 = J0(33).hecke_operator(2)
396
sage: G = J0(33).torsion_subgroup(2); G
397
Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
398
sage: t2(G)
399
Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
400
sage: t2.fcp()
401
(x - 1) * (x + 2)^2
402
403
We apply morphisms to abelian subvarieties::
404
405
sage: E11a0, E11a1, B = J0(33)
406
sage: t2 = J0(33).hecke_operator(2)
407
sage: t3 = J0(33).hecke_operator(3)
408
sage: E11a0
409
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
410
sage: t3(E11a0)
411
Abelian subvariety of dimension 1 of J0(33)
412
sage: t3(E11a0).decomposition()
413
[
414
Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)
415
]
416
sage: t3(E11a0) == E11a1
417
True
418
sage: t2(E11a0) == E11a0
419
True
420
sage: t3(E11a0) == E11a0
421
False
422
sage: t3(E11a0 + E11a1) == E11a0 + E11a1
423
True
424
425
We apply some Hecke operators to the cuspidal subgroup and split it
426
up::
427
428
sage: C = J0(33).cuspidal_subgroup(); C
429
Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3
430
sage: t2 = J0(33).hecke_operator(2); t2.fcp()
431
(x - 1) * (x + 2)^2
432
sage: (t2 - 1)(C)
433
Finite subgroup with invariants [5, 5] over QQ of Abelian variety J0(33) of dimension 3
434
sage: (t2 + 2)(C)
435
Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
436
437
Same but on a simple new factor::
438
439
sage: C = J0(33)[2].cuspidal_subgroup(); C
440
Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
441
sage: t2 = J0(33)[2].hecke_operator(2); t2.fcp()
442
x - 1
443
sage: t2(C)
444
Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
445
"""
446
from abvar import is_ModularAbelianVariety
447
from finite_subgroup import FiniteSubgroup
448
if isinstance(X, TorsionPoint):
449
return self._image_of_element(X)
450
elif is_ModularAbelianVariety(X):
451
return self._image_of_abvar(X)
452
elif isinstance(X, FiniteSubgroup):
453
return self._image_of_finite_subgroup(X)
454
else:
455
raise TypeError, "X must be an abelian variety or finite subgroup"
456
457
def _image_of_element(self, x):
458
"""
459
Return the image of the torsion point `x` under this
460
morphism.
461
462
The parent of the image element is always the group of all torsion
463
elements of the abelian variety.
464
465
INPUT:
466
467
468
- ``x`` - a torsion point on an abelian variety
469
470
471
OUTPUT: a torsion point
472
473
EXAMPLES::
474
475
sage: A = J0(11); t = A.hecke_operator(2)
476
sage: t.matrix()
477
[-2 0]
478
[ 0 -2]
479
sage: P = A.cuspidal_subgroup().0; P
480
[(0, 1/5)]
481
sage: t._image_of_element(P)
482
[(0, -2/5)]
483
sage: -2*P
484
[(0, -2/5)]
485
486
::
487
488
sage: J = J0(37) ; phi = J._isogeny_to_product_of_simples()
489
sage: phi._image_of_element(J.torsion_subgroup(5).gens()[0])
490
[(1/5, -1/5, -1/5, 1/5, 1/5, 1/5, 1/5, -1/5)]
491
492
::
493
494
sage: K = J[0].intersection(J[1])[0]
495
sage: K.list()
496
[[(0, 0, 0, 0)],
497
[(1/2, -1/2, 1/2, 0)],
498
[(0, 0, 1, -1/2)],
499
[(1/2, -1/2, 3/2, -1/2)]]
500
sage: [ phi.restrict_domain(J[0])._image_of_element(k) for k in K ]
501
[[(0, 0, 0, 0, 0, 0, 0, 0)],
502
[(0, 0, 0, 0, 0, 0, 0, 0)],
503
[(0, 0, 0, 0, 0, 0, 0, 0)],
504
[(0, 0, 0, 0, 0, 0, 0, 0)]]
505
"""
506
v = x._relative_element() * self.matrix() * self.codomain().lattice().basis_matrix()
507
T = self.codomain().qbar_torsion_subgroup()
508
return T(v)
509
510
def _image_of_finite_subgroup(self, G):
511
"""
512
Return the image of the finite group `G` under this
513
morphism.
514
515
INPUT:
516
517
518
- ``G`` - a finite subgroup of the domain of this
519
morphism
520
521
522
OUTPUT: a finite subgroup of the codomain
523
524
EXAMPLES::
525
526
sage: J = J0(33); A = J[0]; B = J[1]
527
sage: C = A.intersection(B)[0] ; C
528
Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
529
sage: t = J.hecke_operator(3)
530
sage: D = t(C); D
531
Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3
532
sage: D == C
533
True
534
535
Or we directly test this function::
536
537
sage: D = t._image_of_finite_subgroup(C); D
538
Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3
539
sage: phi = J0(11).degeneracy_map(22,2)
540
sage: J0(11).rational_torsion_subgroup().order()
541
5
542
sage: phi._image_of_finite_subgroup(J0(11).rational_torsion_subgroup())
543
Finite subgroup with invariants [5] over QQ of Abelian variety J0(22) of dimension 2
544
"""
545
B = G._relative_basis_matrix() * self.restrict_domain(G.abelian_variety()).matrix() * self.codomain().lattice().basis_matrix()
546
lattice = B.row_module(ZZ)
547
return self.codomain().finite_subgroup(lattice,
548
field_of_definition = G.field_of_definition())
549
550
def _image_of_abvar(self, A):
551
"""
552
Compute the image of the abelian variety `A` under this
553
morphism.
554
555
INPUT:
556
557
558
- ``A`` - an abelian variety
559
560
561
OUTPUT an abelian variety
562
563
EXAMPLES::
564
565
sage: t = J0(33).hecke_operator(2)
566
sage: t._image_of_abvar(J0(33).new_subvariety())
567
Abelian subvariety of dimension 1 of J0(33)
568
569
::
570
571
sage: t = J0(33).hecke_operator(3)
572
sage: A = J0(33)[0]
573
sage: B = t._image_of_abvar(A); B
574
Abelian subvariety of dimension 1 of J0(33)
575
sage: B == A
576
False
577
sage: A + B == J0(33).old_subvariety()
578
True
579
580
::
581
582
sage: J = J0(37) ; A, B = J.decomposition()
583
sage: J.projection(A)._image_of_abvar(A)
584
Abelian subvariety of dimension 1 of J0(37)
585
sage: J.projection(A)._image_of_abvar(B)
586
Abelian subvariety of dimension 0 of J0(37)
587
sage: J.projection(B)._image_of_abvar(A)
588
Abelian subvariety of dimension 0 of J0(37)
589
sage: J.projection(B)._image_of_abvar(B)
590
Abelian subvariety of dimension 1 of J0(37)
591
sage: J.projection(B)._image_of_abvar(J)
592
Abelian subvariety of dimension 1 of J0(37)
593
"""
594
D = self.domain()
595
C = self.codomain()
596
if A is D:
597
B = self.matrix()
598
else:
599
if not A.is_subvariety(D):
600
raise ValueError, "A must be an abelian subvariety of self."
601
# Write the vector space corresponding to A in terms of self's
602
# vector space, then take the image under self.
603
B = D.vector_space().coordinate_module(A.vector_space()).basis_matrix() * self.matrix()
604
605
V = (B * C.vector_space().basis_matrix()).row_module(QQ)
606
607
lattice = V.intersection(C.lattice())
608
base_field = C.base_field()
609
return abelian_variety.ModularAbelianVariety(C.groups(), lattice, base_field)
610
611
612
class Morphism(Morphism_abstract, sage.modules.matrix_morphism.MatrixMorphism):
613
614
def restrict_domain(self, sub):
615
"""
616
Restrict self to the subvariety sub of self.domain().
617
618
EXAMPLES::
619
620
sage: J = J0(37) ; A, B = J.decomposition()
621
sage: A.lattice().matrix()
622
[ 1 -1 1 0]
623
[ 0 0 2 -1]
624
sage: B.lattice().matrix()
625
[1 1 1 0]
626
[0 0 0 1]
627
sage: T = J.hecke_operator(2) ; T.matrix()
628
[-1 1 1 -1]
629
[ 1 -1 1 0]
630
[ 0 0 -2 1]
631
[ 0 0 0 0]
632
sage: T.restrict_domain(A)
633
Abelian variety morphism:
634
From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
635
To: Abelian variety J0(37) of dimension 2
636
sage: T.restrict_domain(A).matrix()
637
[-2 2 -2 0]
638
[ 0 0 -4 2]
639
sage: T.restrict_domain(B)
640
Abelian variety morphism:
641
From: Simple abelian subvariety 37b(1,37) of dimension 1 of J0(37)
642
To: Abelian variety J0(37) of dimension 2
643
sage: T.restrict_domain(B).matrix()
644
[0 0 0 0]
645
[0 0 0 0]
646
"""
647
if not sub.is_subvariety(self.domain()):
648
raise ValueError, "sub must be a subvariety of self.domain()"
649
650
if sub == self.domain():
651
return self
652
653
L = self.domain().lattice()
654
B = sub.lattice().basis()
655
ims = sum([ (L(b)*self.matrix()).list() for b in B], [])
656
MS = matrix_space.MatrixSpace(self.base_ring(), len(B), self.codomain().rank())
657
H = sub.Hom(self.codomain(), self.category_for())
658
return H(MS(ims))
659
660
class DegeneracyMap(Morphism):
661
def __init__(self, parent, A, t):
662
"""
663
Create the degeneracy map of index t in parent defined by the
664
matrix A.
665
666
INPUT:
667
668
669
- ``parent`` - a space of homomorphisms of abelian
670
varieties
671
672
- ``A`` - a matrix defining self
673
674
- ``t`` - a list of indices defining the degeneracy
675
map
676
677
678
EXAMPLES::
679
680
sage: J0(44).degeneracy_map(11,2)
681
Degeneracy map from Abelian variety J0(44) of dimension 4 to Abelian variety J0(11) of dimension 1 defined by [2]
682
sage: J0(44)[0].degeneracy_map(88,2)
683
Degeneracy map from Simple abelian subvariety 11a(1,44) of dimension 1 of J0(44) to Abelian variety J0(88) of dimension 9 defined by [2]
684
"""
685
if not isinstance(t, list):
686
t = [t]
687
self._t = t
688
Morphism.__init__(self, parent, A)
689
690
def t(self):
691
"""
692
Return the list of indices defining self.
693
694
EXAMPLES::
695
696
sage: J0(22).degeneracy_map(44).t()
697
[1]
698
sage: J = J0(22) * J0(11)
699
sage: J.degeneracy_map([44,44], [2,1])
700
Degeneracy map from Abelian variety J0(22) x J0(11) of dimension 3 to Abelian variety J0(44) x J0(44) of dimension 8 defined by [2, 1]
701
sage: J.degeneracy_map([44,44], [2,1]).t()
702
[2, 1]
703
"""
704
return self._t
705
706
def _repr_(self):
707
"""
708
Return the string representation of self.
709
710
EXAMPLES::
711
712
sage: J0(22).degeneracy_map(44)._repr_()
713
'Degeneracy map from Abelian variety J0(22) of dimension 2 to Abelian variety J0(44) of dimension 4 defined by [1]'
714
"""
715
return "Degeneracy map from %s to %s defined by %s"%(self.domain(), self.codomain(), self._t)
716
717
class HeckeOperator(Morphism):
718
"""
719
A Hecke operator acting on a modular abelian variety.
720
"""
721
def __init__(self, abvar, n):
722
"""
723
Create the Hecke operator of index `n` acting on the
724
abelian variety abvar.
725
726
INPUT:
727
728
729
- ``abvar`` - a modular abelian variety
730
731
- ``n`` - a positive integer
732
733
734
EXAMPLES::
735
736
sage: J = J0(37)
737
sage: T2 = J.hecke_operator(2); T2
738
Hecke operator T_2 on Abelian variety J0(37) of dimension 2
739
sage: T2.parent()
740
Endomorphism ring of Abelian variety J0(37) of dimension 2
741
"""
742
n = ZZ(n)
743
if n <= 0:
744
raise ValueError, "n must be positive"
745
if not abelian_variety.is_ModularAbelianVariety(abvar):
746
raise TypeError, "abvar must be a modular abelian variety"
747
self.__abvar = abvar
748
self.__n = n
749
sage.modules.matrix_morphism.MatrixMorphism_abstract.__init__(self, abvar.Hom(abvar))
750
751
def _repr_(self):
752
"""
753
String representation of this Hecke operator.
754
755
EXAMPLES::
756
757
sage: J = J0(37)
758
sage: J.hecke_operator(2)._repr_()
759
'Hecke operator T_2 on Abelian variety J0(37) of dimension 2'
760
"""
761
return "Hecke operator T_%s on %s"%(self.__n, self.__abvar)
762
763
def index(self):
764
"""
765
Return the index of this Hecke operator. (For example, if this is
766
the operator `T_n`, then the index is the integer
767
`n`.)
768
769
OUTPUT:
770
771
772
- ``n`` - a (Sage) Integer
773
774
775
EXAMPLES::
776
777
sage: J = J0(15)
778
sage: t = J.hecke_operator(53)
779
sage: t
780
Hecke operator T_53 on Abelian variety J0(15) of dimension 1
781
sage: t.index()
782
53
783
sage: t = J.hecke_operator(54)
784
sage: t
785
Hecke operator T_54 on Abelian variety J0(15) of dimension 1
786
sage: t.index()
787
54
788
789
::
790
791
sage: J = J1(12345)
792
sage: t = J.hecke_operator(997) ; t
793
Hecke operator T_997 on Abelian variety J1(12345) of dimension 5405473
794
sage: t.index()
795
997
796
sage: type(t.index())
797
<type 'sage.rings.integer.Integer'>
798
"""
799
return self.__n
800
801
def n(self):
802
r"""
803
Alias for ``self.index()``.
804
805
EXAMPLES::
806
807
sage: J = J0(17)
808
sage: J.hecke_operator(5).n()
809
5
810
"""
811
return self.index()
812
813
def characteristic_polynomial(self, var='x'):
814
"""
815
Return the characteristic polynomial of this Hecke operator in the
816
given variable.
817
818
INPUT:
819
820
821
- ``var`` - a string (default: 'x')
822
823
824
OUTPUT: a polynomial in var over the rational numbers.
825
826
EXAMPLES::
827
828
sage: A = J0(43)[1]; A
829
Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
830
sage: t2 = A.hecke_operator(2); t2
831
Hecke operator T_2 on Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
832
sage: f = t2.characteristic_polynomial(); f
833
x^2 - 2
834
sage: f.parent()
835
Univariate Polynomial Ring in x over Integer Ring
836
sage: f.factor()
837
x^2 - 2
838
sage: t2.characteristic_polynomial('y')
839
y^2 - 2
840
"""
841
return self.__abvar.rational_homology().hecke_polynomial(self.__n, var).change_ring(ZZ)
842
843
def charpoly(self, var='x'):
844
r"""
845
Synonym for ``self.characteristic_polynomial(var)``.
846
847
INPUT:
848
849
850
- ``var`` - string (default: 'x')
851
852
853
EXAMPLES::
854
855
sage: A = J1(13)
856
sage: t2 = A.hecke_operator(2); t2
857
Hecke operator T_2 on Abelian variety J1(13) of dimension 2
858
sage: f = t2.charpoly(); f
859
x^2 + 3*x + 3
860
sage: f.factor()
861
x^2 + 3*x + 3
862
sage: t2.charpoly('y')
863
y^2 + 3*y + 3
864
"""
865
return self.characteristic_polynomial(var)
866
867
def action_on_homology(self, R=ZZ):
868
r"""
869
Return the action of this Hecke operator on the homology
870
`H_1(A; R)` of this abelian variety with coefficients in
871
`R`.
872
873
EXAMPLES::
874
875
sage: A = J0(43)
876
sage: t2 = A.hecke_operator(2); t2
877
Hecke operator T_2 on Abelian variety J0(43) of dimension 3
878
sage: h2 = t2.action_on_homology(); h2
879
Hecke operator T_2 on Integral Homology of Abelian variety J0(43) of dimension 3
880
sage: h2.matrix()
881
[-2 1 0 0 0 0]
882
[-1 1 1 0 -1 0]
883
[-1 0 -1 2 -1 1]
884
[-1 0 1 1 -1 1]
885
[ 0 -2 0 2 -2 1]
886
[ 0 -1 0 1 0 -1]
887
sage: h2 = t2.action_on_homology(GF(2)); h2
888
Hecke operator T_2 on Homology with coefficients in Finite Field of size 2 of Abelian variety J0(43) of dimension 3
889
sage: h2.matrix()
890
[0 1 0 0 0 0]
891
[1 1 1 0 1 0]
892
[1 0 1 0 1 1]
893
[1 0 1 1 1 1]
894
[0 0 0 0 0 1]
895
[0 1 0 1 0 1]
896
"""
897
return self.__abvar.homology(R).hecke_operator(self.index())
898
899
def matrix(self):
900
"""
901
Return the matrix of self acting on the homology
902
`H_1(A, ZZ)` of this abelian variety with coefficients in
903
`\ZZ`.
904
905
EXAMPLES::
906
907
sage: J0(47).hecke_operator(3).matrix()
908
[ 0 0 1 -2 1 0 -1 0]
909
[ 0 0 1 0 -1 0 0 0]
910
[-1 2 0 0 2 -2 1 -1]
911
[-2 1 1 -1 3 -1 -1 0]
912
[-1 -1 1 0 1 0 -1 1]
913
[-1 0 0 -1 2 0 -1 0]
914
[-1 -1 2 -2 2 0 -1 0]
915
[ 0 -1 0 0 1 0 -1 1]
916
917
::
918
919
sage: J0(11).hecke_operator(7).matrix()
920
[-2 0]
921
[ 0 -2]
922
sage: (J0(11) * J0(33)).hecke_operator(7).matrix()
923
[-2 0 0 0 0 0 0 0]
924
[ 0 -2 0 0 0 0 0 0]
925
[ 0 0 0 0 2 -2 2 -2]
926
[ 0 0 0 -2 2 0 2 -2]
927
[ 0 0 0 0 2 0 4 -4]
928
[ 0 0 -4 0 2 2 2 -2]
929
[ 0 0 -2 0 2 2 0 -2]
930
[ 0 0 -2 0 0 2 0 -2]
931
932
::
933
934
sage: J0(23).hecke_operator(2).matrix()
935
[ 0 1 -1 0]
936
[ 0 1 -1 1]
937
[-1 2 -2 1]
938
[-1 1 0 -1]
939
"""
940
try:
941
return self._matrix
942
except AttributeError:
943
pass
944
self._matrix = self.action_on_homology().matrix()
945
return self._matrix
946
947