passagemath-schemes 10.8.1a4__cp314-cp314t-macosx_13_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
  2. passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
  3. passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
  4. passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
  5. passagemath_schemes/__init__.py +3 -0
  6. passagemath_schemes-10.8.1a4.dist-info/METADATA +203 -0
  7. passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
  8. passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
  9. passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.8.1a4.dist-info/top_level.txt +3 -0
  11. sage/all__sagemath_schemes.py +23 -0
  12. sage/databases/all__sagemath_schemes.py +7 -0
  13. sage/databases/cremona.py +1723 -0
  14. sage/dynamics/all__sagemath_schemes.py +2 -0
  15. sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
  16. sage/dynamics/arithmetic_dynamics/all.py +14 -0
  17. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
  18. sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
  19. sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
  20. sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
  21. sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
  22. sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
  23. sage/dynamics/arithmetic_dynamics/projective_ds.py +9556 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +727 -0
  29. sage/lfunctions/pari.py +971 -0
  30. sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5132 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
  34. sage/modular/abvar/abvar_newform.py +246 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +187 -0
  37. sage/modular/abvar/cuspidal_subgroup.py +371 -0
  38. sage/modular/abvar/finite_subgroup.py +896 -0
  39. sage/modular/abvar/homology.py +721 -0
  40. sage/modular/abvar/homspace.py +989 -0
  41. sage/modular/abvar/lseries.py +415 -0
  42. sage/modular/abvar/morphism.py +935 -0
  43. sage/modular/abvar/torsion_point.py +274 -0
  44. sage/modular/abvar/torsion_subgroup.py +741 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1406 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +361 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +659 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1491 -0
  57. sage/modular/arithgroup/congroup_generic.py +630 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +266 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1067 -0
  61. sage/modular/arithgroup/tests.py +425 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3736 -0
  64. sage/modular/btquotients/pautomorphicform.py +2564 -0
  65. sage/modular/buzzard.py +100 -0
  66. sage/modular/congroup.py +29 -0
  67. sage/modular/congroup_element.py +13 -0
  68. sage/modular/cusps.py +1107 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +571 -0
  71. sage/modular/dirichlet.py +3310 -0
  72. sage/modular/drinfeld_modform/all.py +2 -0
  73. sage/modular/drinfeld_modform/element.py +446 -0
  74. sage/modular/drinfeld_modform/ring.py +773 -0
  75. sage/modular/drinfeld_modform/tutorial.py +236 -0
  76. sage/modular/etaproducts.py +1076 -0
  77. sage/modular/hecke/algebra.py +725 -0
  78. sage/modular/hecke/all.py +19 -0
  79. sage/modular/hecke/ambient_module.py +994 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +302 -0
  82. sage/modular/hecke/hecke_operator.py +736 -0
  83. sage/modular/hecke/homspace.py +185 -0
  84. sage/modular/hecke/module.py +1744 -0
  85. sage/modular/hecke/morphism.py +139 -0
  86. sage/modular/hecke/submodule.py +970 -0
  87. sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
  88. sage/modular/hypergeometric_misc.pxd +4 -0
  89. sage/modular/hypergeometric_misc.pyx +166 -0
  90. sage/modular/hypergeometric_motive.py +2020 -0
  91. sage/modular/local_comp/all.py +2 -0
  92. sage/modular/local_comp/liftings.py +292 -0
  93. sage/modular/local_comp/local_comp.py +1070 -0
  94. sage/modular/local_comp/smoothchar.py +1825 -0
  95. sage/modular/local_comp/type_space.py +748 -0
  96. sage/modular/modform/all.py +30 -0
  97. sage/modular/modform/ambient.py +817 -0
  98. sage/modular/modform/ambient_R.py +177 -0
  99. sage/modular/modform/ambient_eps.py +306 -0
  100. sage/modular/modform/ambient_g0.py +120 -0
  101. sage/modular/modform/ambient_g1.py +199 -0
  102. sage/modular/modform/constructor.py +545 -0
  103. sage/modular/modform/cuspidal_submodule.py +708 -0
  104. sage/modular/modform/defaults.py +14 -0
  105. sage/modular/modform/eis_series.py +487 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4105 -0
  108. sage/modular/modform/half_integral.py +154 -0
  109. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  110. sage/modular/modform/j_invariant.py +47 -0
  111. sage/modular/modform/l_series_gross_zagier.py +127 -0
  112. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  114. sage/modular/modform/notes.py +45 -0
  115. sage/modular/modform/numerical.py +514 -0
  116. sage/modular/modform/periods.py +14 -0
  117. sage/modular/modform/ring.py +1257 -0
  118. sage/modular/modform/space.py +1859 -0
  119. sage/modular/modform/submodule.py +118 -0
  120. sage/modular/modform/tests.py +64 -0
  121. sage/modular/modform/theta.py +110 -0
  122. sage/modular/modform/vm_basis.py +380 -0
  123. sage/modular/modform/weight1.py +221 -0
  124. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  125. sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
  126. sage/modular/modform_hecketriangle/all.py +30 -0
  127. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  128. sage/modular/modform_hecketriangle/constructor.py +416 -0
  129. sage/modular/modform_hecketriangle/element.py +351 -0
  130. sage/modular/modform_hecketriangle/functors.py +752 -0
  131. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  132. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  133. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
  135. sage/modular/modform_hecketriangle/readme.py +1214 -0
  136. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  137. sage/modular/modform_hecketriangle/space.py +1037 -0
  138. sage/modular/modform_hecketriangle/subspace.py +423 -0
  139. sage/modular/modsym/all.py +17 -0
  140. sage/modular/modsym/ambient.py +3844 -0
  141. sage/modular/modsym/boundary.py +1420 -0
  142. sage/modular/modsym/element.py +336 -0
  143. sage/modular/modsym/g1list.py +178 -0
  144. sage/modular/modsym/ghlist.py +182 -0
  145. sage/modular/modsym/hecke_operator.py +73 -0
  146. sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
  147. sage/modular/modsym/manin_symbol.pxd +5 -0
  148. sage/modular/modsym/manin_symbol.pyx +497 -0
  149. sage/modular/modsym/manin_symbol_list.py +1291 -0
  150. sage/modular/modsym/modsym.py +400 -0
  151. sage/modular/modsym/modular_symbols.py +384 -0
  152. sage/modular/modsym/p1list_nf.py +1241 -0
  153. sage/modular/modsym/relation_matrix.py +591 -0
  154. sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
  155. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  156. sage/modular/modsym/space.py +2468 -0
  157. sage/modular/modsym/subspace.py +455 -0
  158. sage/modular/modsym/tests.py +376 -0
  159. sage/modular/multiple_zeta.py +2635 -0
  160. sage/modular/multiple_zeta_F_algebra.py +789 -0
  161. sage/modular/overconvergent/all.py +6 -0
  162. sage/modular/overconvergent/genus0.py +1879 -0
  163. sage/modular/overconvergent/hecke_series.py +1187 -0
  164. sage/modular/overconvergent/weightspace.py +776 -0
  165. sage/modular/pollack_stevens/all.py +4 -0
  166. sage/modular/pollack_stevens/distributions.py +874 -0
  167. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  168. sage/modular/pollack_stevens/manin_map.py +856 -0
  169. sage/modular/pollack_stevens/modsym.py +1590 -0
  170. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  171. sage/modular/pollack_stevens/sigma0.py +534 -0
  172. sage/modular/pollack_stevens/space.py +1078 -0
  173. sage/modular/quasimodform/all.py +3 -0
  174. sage/modular/quasimodform/element.py +846 -0
  175. sage/modular/quasimodform/ring.py +826 -0
  176. sage/modular/quatalg/all.py +3 -0
  177. sage/modular/quatalg/brandt.py +1642 -0
  178. sage/modular/ssmod/all.py +8 -0
  179. sage/modular/ssmod/ssmod.py +827 -0
  180. sage/rings/all__sagemath_schemes.py +1 -0
  181. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  182. sage/rings/polynomial/binary_form_reduce.py +585 -0
  183. sage/schemes/all.py +41 -0
  184. sage/schemes/berkovich/all.py +6 -0
  185. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  186. sage/schemes/berkovich/berkovich_space.py +700 -0
  187. sage/schemes/curves/affine_curve.py +2924 -0
  188. sage/schemes/curves/all.py +33 -0
  189. sage/schemes/curves/closed_point.py +434 -0
  190. sage/schemes/curves/constructor.py +397 -0
  191. sage/schemes/curves/curve.py +542 -0
  192. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  193. sage/schemes/curves/point.py +463 -0
  194. sage/schemes/curves/projective_curve.py +3203 -0
  195. sage/schemes/curves/weighted_projective_curve.py +106 -0
  196. sage/schemes/curves/zariski_vankampen.py +1931 -0
  197. sage/schemes/cyclic_covers/all.py +2 -0
  198. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  199. sage/schemes/cyclic_covers/constructor.py +137 -0
  200. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  201. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  202. sage/schemes/elliptic_curves/BSD.py +991 -0
  203. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  204. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  205. sage/schemes/elliptic_curves/all.py +49 -0
  206. sage/schemes/elliptic_curves/cardinality.py +609 -0
  207. sage/schemes/elliptic_curves/cm.py +1103 -0
  208. sage/schemes/elliptic_curves/constructor.py +1530 -0
  209. sage/schemes/elliptic_curves/ec_database.py +175 -0
  210. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
  211. sage/schemes/elliptic_curves/ell_egros.py +457 -0
  212. sage/schemes/elliptic_curves/ell_field.py +2837 -0
  213. sage/schemes/elliptic_curves/ell_finite_field.py +3249 -0
  214. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  215. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  216. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  217. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  218. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  219. sage/schemes/elliptic_curves/ell_point.py +4944 -0
  220. sage/schemes/elliptic_curves/ell_rational_field.py +7184 -0
  221. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  222. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  223. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  224. sage/schemes/elliptic_curves/formal_group.py +760 -0
  225. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  226. sage/schemes/elliptic_curves/gal_reps_number_field.py +1663 -0
  227. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  228. sage/schemes/elliptic_curves/heegner.py +7328 -0
  229. sage/schemes/elliptic_curves/height.py +2108 -0
  230. sage/schemes/elliptic_curves/hom.py +1788 -0
  231. sage/schemes/elliptic_curves/hom_composite.py +1084 -0
  232. sage/schemes/elliptic_curves/hom_fractional.py +544 -0
  233. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  234. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  235. sage/schemes/elliptic_curves/hom_sum.py +681 -0
  236. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  237. sage/schemes/elliptic_curves/homset.py +271 -0
  238. sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
  239. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  240. sage/schemes/elliptic_curves/jacobian.py +247 -0
  241. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  242. sage/schemes/elliptic_curves/kraus.py +1014 -0
  243. sage/schemes/elliptic_curves/lseries_ell.py +915 -0
  244. sage/schemes/elliptic_curves/mod5family.py +105 -0
  245. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  246. sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
  247. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  248. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  249. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  250. sage/schemes/elliptic_curves/padics.py +1816 -0
  251. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  252. sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
  253. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  254. sage/schemes/elliptic_curves/saturation.py +716 -0
  255. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  256. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  257. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  258. sage/schemes/hyperelliptic_curves/all.py +6 -0
  259. sage/schemes/hyperelliptic_curves/constructor.py +369 -0
  260. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
  261. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  265. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  266. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
  267. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
  271. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  272. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  273. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
  274. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  275. sage/schemes/jacobians/all.py +2 -0
  276. sage/schemes/overview.py +161 -0
  277. sage/schemes/plane_conics/all.py +22 -0
  278. sage/schemes/plane_conics/con_field.py +1296 -0
  279. sage/schemes/plane_conics/con_finite_field.py +158 -0
  280. sage/schemes/plane_conics/con_number_field.py +456 -0
  281. sage/schemes/plane_conics/con_rational_field.py +406 -0
  282. sage/schemes/plane_conics/con_rational_function_field.py +581 -0
  283. sage/schemes/plane_conics/constructor.py +249 -0
  284. sage/schemes/plane_quartics/all.py +2 -0
  285. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  286. sage/schemes/plane_quartics/quartic_generic.py +53 -0
  287. sage/schemes/riemann_surfaces/all.py +1 -0
  288. sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
  289. sage_wheels/share/cremona/cremona_mini.db +0 -0
  290. sage_wheels/share/ellcurves/rank0 +30427 -0
  291. sage_wheels/share/ellcurves/rank1 +31871 -0
  292. sage_wheels/share/ellcurves/rank10 +6 -0
  293. sage_wheels/share/ellcurves/rank11 +6 -0
  294. sage_wheels/share/ellcurves/rank12 +1 -0
  295. sage_wheels/share/ellcurves/rank14 +1 -0
  296. sage_wheels/share/ellcurves/rank15 +1 -0
  297. sage_wheels/share/ellcurves/rank17 +1 -0
  298. sage_wheels/share/ellcurves/rank19 +1 -0
  299. sage_wheels/share/ellcurves/rank2 +2388 -0
  300. sage_wheels/share/ellcurves/rank20 +1 -0
  301. sage_wheels/share/ellcurves/rank21 +1 -0
  302. sage_wheels/share/ellcurves/rank22 +1 -0
  303. sage_wheels/share/ellcurves/rank23 +1 -0
  304. sage_wheels/share/ellcurves/rank24 +1 -0
  305. sage_wheels/share/ellcurves/rank28 +1 -0
  306. sage_wheels/share/ellcurves/rank3 +836 -0
  307. sage_wheels/share/ellcurves/rank4 +10 -0
  308. sage_wheels/share/ellcurves/rank5 +5 -0
  309. sage_wheels/share/ellcurves/rank6 +5 -0
  310. sage_wheels/share/ellcurves/rank7 +5 -0
  311. sage_wheels/share/ellcurves/rank8 +6 -0
  312. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,935 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.flint
3
+ r"""
4
+ Hecke operators and morphisms between modular abelian varieties
5
+
6
+ Sage can compute with Hecke operators on modular abelian varieties.
7
+ A Hecke operator is defined by given a modular abelian variety and
8
+ an index. Given a Hecke operator, Sage can compute the
9
+ characteristic polynomial, and the action of the Hecke operator on
10
+ various homology groups.
11
+
12
+ AUTHORS:
13
+
14
+ - William Stein (2007-03)
15
+
16
+ - Craig Citro (2008-03)
17
+
18
+ EXAMPLES::
19
+
20
+ sage: A = J0(54)
21
+ sage: t5 = A.hecke_operator(5); t5
22
+ Hecke operator T_5 on Abelian variety J0(54) of dimension 4
23
+ sage: t5.charpoly().factor()
24
+ (x - 3) * (x + 3) * x^2
25
+ sage: B = A.new_subvariety(); B
26
+ Abelian subvariety of dimension 2 of J0(54)
27
+ sage: t5 = B.hecke_operator(5); t5
28
+ Hecke operator T_5 on Abelian subvariety of dimension 2 of J0(54)
29
+ sage: t5.charpoly().factor()
30
+ (x - 3) * (x + 3)
31
+ sage: t5.action_on_homology().matrix()
32
+ [ 0 3 3 -3]
33
+ [-3 3 3 0]
34
+ [ 3 3 0 -3]
35
+ [-3 6 3 -3]
36
+ """
37
+
38
+ ###########################################################################
39
+ # Copyright (C) 2007 William Stein <wstein@gmail.com> #
40
+ # Distributed under the terms of the GNU General Public License (GPL) #
41
+ # http://www.gnu.org/licenses/ #
42
+ ###########################################################################
43
+
44
+ from sage.categories.morphism import Morphism as base_Morphism
45
+ from sage.rings.integer_ring import ZZ
46
+ from sage.rings.rational_field import QQ
47
+
48
+ import sage.modules.matrix_morphism
49
+ import sage.matrix.matrix_space as matrix_space
50
+
51
+ from .finite_subgroup import TorsionPoint
52
+
53
+
54
+ class Morphism_abstract(sage.modules.matrix_morphism.MatrixMorphism_abstract):
55
+ """
56
+ A morphism between modular abelian varieties.
57
+
58
+ EXAMPLES::
59
+
60
+ sage: t = J0(11).hecke_operator(2)
61
+ sage: from sage.modular.abvar.morphism import Morphism
62
+ sage: isinstance(t, Morphism)
63
+ True
64
+ """
65
+
66
+ def _repr_(self):
67
+ r"""
68
+ Return string representation of this morphism.
69
+
70
+ EXAMPLES::
71
+
72
+ sage: t = J0(11).hecke_operator(2)
73
+ sage: sage.modular.abvar.morphism.Morphism_abstract._repr_(t)
74
+ 'Abelian variety endomorphism of Abelian variety J0(11) of dimension 1'
75
+ sage: J0(42).projection(J0(42)[0])._repr_()
76
+ '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)'
77
+ """
78
+ return base_Morphism._repr_(self)
79
+
80
+ def _repr_type(self):
81
+ """
82
+ Return type of morphism.
83
+
84
+ EXAMPLES::
85
+
86
+ sage: t = J0(11).hecke_operator(2)
87
+ sage: sage.modular.abvar.morphism.Morphism_abstract._repr_type(t)
88
+ 'Abelian variety'
89
+ """
90
+ return "Abelian variety"
91
+
92
+ def complementary_isogeny(self):
93
+ """
94
+ Return the complementary isogeny of ``self``.
95
+
96
+ EXAMPLES::
97
+
98
+ sage: J = J0(43)
99
+ sage: A = J[1]
100
+ sage: T5 = A.hecke_operator(5)
101
+ sage: T5.is_isogeny()
102
+ True
103
+ sage: T5.complementary_isogeny()
104
+ Abelian variety endomorphism of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
105
+ sage: (T5.complementary_isogeny() * T5).matrix()
106
+ [2 0 0 0]
107
+ [0 2 0 0]
108
+ [0 0 2 0]
109
+ [0 0 0 2]
110
+ """
111
+ if not self.is_isogeny():
112
+ raise ValueError("self is not an isogeny")
113
+ M = self.matrix()
114
+ try:
115
+ iM, denom = M._invert_iml()
116
+ except AttributeError:
117
+ iM = M.matrix_over_field().invert()
118
+ iM, denom = iM._clear_denom()
119
+ return Morphism(self.parent().reversed(), iM)
120
+
121
+ def is_isogeny(self) -> bool:
122
+ """
123
+ Return ``True`` if this morphism is an isogeny of abelian varieties.
124
+
125
+ EXAMPLES::
126
+
127
+ sage: J = J0(39)
128
+ sage: Id = J.hecke_operator(1)
129
+ sage: Id.is_isogeny()
130
+ True
131
+ sage: J.hecke_operator(19).is_isogeny()
132
+ False
133
+ """
134
+ M = self.matrix()
135
+ return M.nrows() == M.ncols() == M.rank()
136
+
137
+ def cokernel(self):
138
+ """
139
+ Return the cokernel of ``self``.
140
+
141
+ OUTPUT:
142
+
143
+ - ``A`` -- an abelian variety (the cokernel)
144
+
145
+ - ``phi`` -- a quotient map from ``self.codomain()`` to the
146
+ cokernel of self
147
+
148
+ EXAMPLES::
149
+
150
+ sage: t = J0(33).hecke_operator(2)
151
+ sage: (t-1).cokernel()
152
+ (Abelian subvariety of dimension 1 of J0(33),
153
+ Abelian variety morphism:
154
+ From: Abelian variety J0(33) of dimension 3
155
+ To: Abelian subvariety of dimension 1 of J0(33))
156
+
157
+ Projection will always have cokernel zero.
158
+
159
+ ::
160
+
161
+ sage: J0(37).projection(J0(37)[0]).cokernel()
162
+ (Simple abelian subvariety of dimension 0 of J0(37),
163
+ Abelian variety morphism:
164
+ From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
165
+ To: Simple abelian subvariety of dimension 0 of J0(37))
166
+
167
+ Here we have a nontrivial cokernel of a Hecke operator, as the
168
+ T_2-eigenvalue for the newform 37b is 0.
169
+
170
+ ::
171
+
172
+ sage: J0(37).hecke_operator(2).cokernel()
173
+ (Abelian subvariety of dimension 1 of J0(37),
174
+ Abelian variety morphism:
175
+ From: Abelian variety J0(37) of dimension 2
176
+ To: Abelian subvariety of dimension 1 of J0(37))
177
+ sage: AbelianVariety('37b').newform().q_expansion(5)
178
+ q + q^3 - 2*q^4 + O(q^5)
179
+ """
180
+ try:
181
+ return self.__cokernel
182
+ except AttributeError:
183
+ I = self.image()
184
+ C = self.codomain().quotient(I)
185
+ self.__cokernel = C
186
+ return C
187
+
188
+ def kernel(self):
189
+ """
190
+ Return the kernel of this morphism.
191
+
192
+ OUTPUT:
193
+
194
+ - ``G`` -- a finite group
195
+
196
+ - ``A`` -- an abelian variety (identity component of the kernel)
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
+ def factor_out_component_group(self):
247
+ r"""
248
+ View ``self`` as a morphism `f:A \to B`. Then `\ker(f)`
249
+ is an extension of an abelian variety `C` by a finite
250
+ component group `G`. This function constructs a morphism
251
+ `g` with domain `A` and codomain Q isogenous to
252
+ `C` such that `\ker(g)` is equal to `C`.
253
+
254
+ OUTPUT: a morphism
255
+
256
+ EXAMPLES::
257
+
258
+ sage: A,B,C = J0(33)
259
+ sage: pi = J0(33).projection(A)
260
+ sage: pi.kernel()
261
+ (Finite subgroup with invariants [5] over QQbar of Abelian variety J0(33) of dimension 3,
262
+ Abelian subvariety of dimension 2 of J0(33))
263
+ sage: psi = pi.factor_out_component_group()
264
+ sage: psi.kernel()
265
+ (Finite subgroup with invariants [] over QQbar of Abelian variety J0(33) of dimension 3,
266
+ Abelian subvariety of dimension 2 of J0(33))
267
+
268
+ ALGORITHM: We compute a subgroup `G` of `B` so that
269
+ the composition `h: A\to B \to B/G` has kernel that
270
+ contains `A[n]` and component group isomorphic to
271
+ `(\ZZ/n\ZZ)^{2d}`, where `d` is the
272
+ dimension of `A`. Then `h` factors through
273
+ multiplication by `n`, so there is a morphism
274
+ `g: A\to B/G` such that `g \circ [n] = h`. Then
275
+ `g` is the desired morphism. We give more details below
276
+ about how to transform this into linear algebra.
277
+ """
278
+ try:
279
+ return self.__factor_out
280
+ except AttributeError:
281
+ A = self.matrix()
282
+ L = A.image()
283
+ # Saturate the image of the matrix corresponding to self.
284
+ Lsat = L.saturation()
285
+ if L == Lsat: # easy case
286
+ self.__factor_out = self
287
+ return self
288
+ # Now find a matrix whose rows map exactly onto the
289
+ # saturation of L.
290
+ X = A.solve_left(Lsat.basis_matrix())
291
+
292
+ # Find an integer n such that 1/n times the lattice Lambda of A
293
+ # contains the row span of X.
294
+ n = X.denominator()
295
+
296
+ # Let M be the lattice of the codomain B of self.
297
+ # Now 1/n * Lambda contains Lambda and maps
298
+ # via the matrix of self to a lattice L' that
299
+ # contains Lsat. Consider the lattice
300
+ # R = M + L'.
301
+ # This is a lattice that contains the lattice M of B.
302
+ # Also 1/n*Lambda maps exactly to L' in R.
303
+ # We have
304
+ # R/L' = (M+L')/L' = M/(L'/\M) = M/Lsat
305
+ # which is torsion free!
306
+
307
+ Q = self.codomain()
308
+ M = Q.lattice()
309
+ one_over_n = ZZ.one() / n
310
+ Lprime = (one_over_n * self.matrix() * M.basis_matrix()).row_module(ZZ)
311
+
312
+ # This R is a lattice in the ambient space for B.
313
+ R = Lprime + M
314
+
315
+ from .abvar import ModularAbelianVariety
316
+ C = ModularAbelianVariety(Q.groups(), R, Q.base_field())
317
+
318
+ # We have to change the basis of the representation of A
319
+ # to the basis for R instead of the basis for M. Each row
320
+ # of A is written in terms of M, but needs to be in terms
321
+ # of R's basis, which contains M with finite index.
322
+ change_basis_from_M_to_R = R.basis_matrix().solve_left(M.basis_matrix())
323
+ matrix = one_over_n * A * change_basis_from_M_to_R
324
+
325
+ # Finally
326
+ g = Morphism(self.domain().Hom(C), matrix)
327
+ self.__factor_out = g
328
+ return g
329
+
330
+ def image(self):
331
+ """
332
+ Return the image of this morphism.
333
+
334
+ OUTPUT: an abelian variety
335
+
336
+ EXAMPLES: We compute the image of projection onto a factor of
337
+ `J_0(33)`::
338
+
339
+ sage: A,B,C = J0(33)
340
+ sage: A
341
+ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
342
+ sage: f = J0(33).projection(A)
343
+ sage: f.image()
344
+ Abelian subvariety of dimension 1 of J0(33)
345
+ sage: f.image() == A
346
+ True
347
+
348
+ We compute the image of a Hecke operator::
349
+
350
+ sage: t2 = J0(33).hecke_operator(2); t2.fcp()
351
+ (x - 1) * (x + 2)^2
352
+ sage: phi = t2 + 2
353
+ sage: phi.image()
354
+ Abelian subvariety of dimension 1 of J0(33)
355
+
356
+ The sum of the image and the kernel is the whole space::
357
+
358
+ sage: phi.kernel()[1] + phi.image() == J0(33)
359
+ True
360
+ """
361
+ return self(self.domain())
362
+
363
+ def __call__(self, X):
364
+ """
365
+ INPUT:
366
+
367
+ - ``X`` -- abelian variety, finite group, or torsion element
368
+
369
+ OUTPUT: abelian variety, finite group, torsion element
370
+
371
+ EXAMPLES: We apply morphisms to elements::
372
+
373
+ sage: t2 = J0(33).hecke_operator(2)
374
+ sage: G = J0(33).torsion_subgroup(2); G
375
+ Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
376
+ sage: t2(G.0)
377
+ [(-1/2, 0, 1/2, -1/2, 1/2, -1/2)]
378
+ sage: t2(G.0) in G
379
+ True
380
+ sage: t2(G.1)
381
+ [(0, -1, 1/2, 0, 1/2, -1/2)]
382
+ sage: t2(G.2)
383
+ [(0, 0, 0, 0, 0, 0)]
384
+ sage: K = t2.kernel()[0]; K
385
+ Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
386
+ sage: t2(K.0)
387
+ [(0, 0, 0, 0, 0, 0)]
388
+
389
+ We apply morphisms to subgroups::
390
+
391
+ sage: t2 = J0(33).hecke_operator(2)
392
+ sage: G = J0(33).torsion_subgroup(2); G
393
+ Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
394
+ sage: t2(G)
395
+ Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
396
+ sage: t2.fcp()
397
+ (x - 1) * (x + 2)^2
398
+
399
+ We apply morphisms to abelian subvarieties::
400
+
401
+ sage: E11a0, E11a1, B = J0(33)
402
+ sage: t2 = J0(33).hecke_operator(2)
403
+ sage: t3 = J0(33).hecke_operator(3)
404
+ sage: E11a0
405
+ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
406
+ sage: t3(E11a0)
407
+ Abelian subvariety of dimension 1 of J0(33)
408
+ sage: t3(E11a0).decomposition()
409
+ [Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)]
410
+ sage: t3(E11a0) == E11a1
411
+ True
412
+ sage: t2(E11a0) == E11a0
413
+ True
414
+ sage: t3(E11a0) == E11a0
415
+ False
416
+ sage: t3(E11a0 + E11a1) == E11a0 + E11a1
417
+ True
418
+
419
+ We apply some Hecke operators to the cuspidal subgroup and split it
420
+ up::
421
+
422
+ sage: C = J0(33).cuspidal_subgroup(); C
423
+ Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3
424
+ sage: t2 = J0(33).hecke_operator(2); t2.fcp()
425
+ (x - 1) * (x + 2)^2
426
+ sage: (t2 - 1)(C)
427
+ Finite subgroup with invariants [5, 5] over QQ of Abelian variety J0(33) of dimension 3
428
+ sage: (t2 + 2)(C)
429
+ Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
430
+
431
+ Same but on a simple new factor::
432
+
433
+ sage: C = J0(33)[2].cuspidal_subgroup(); C
434
+ Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
435
+ sage: t2 = J0(33)[2].hecke_operator(2); t2.fcp()
436
+ x - 1
437
+ sage: t2(C)
438
+ Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
439
+ """
440
+ from .abvar import ModularAbelianVariety_abstract
441
+ from .finite_subgroup import FiniteSubgroup
442
+ if isinstance(X, TorsionPoint):
443
+ return self._image_of_element(X)
444
+ elif isinstance(X, ModularAbelianVariety_abstract):
445
+ return self._image_of_abvar(X)
446
+ elif isinstance(X, FiniteSubgroup):
447
+ return self._image_of_finite_subgroup(X)
448
+ else:
449
+ raise TypeError("X must be an abelian variety or finite subgroup")
450
+
451
+ def _image_of_element(self, x):
452
+ """
453
+ Return the image of the torsion point `x` under this
454
+ morphism.
455
+
456
+ The parent of the image element is always the group of all torsion
457
+ elements of the abelian variety.
458
+
459
+ INPUT:
460
+
461
+ - ``x`` -- a torsion point on an abelian variety
462
+
463
+ OUTPUT: a torsion point
464
+
465
+ EXAMPLES::
466
+
467
+ sage: A = J0(11); t = A.hecke_operator(2)
468
+ sage: t.matrix()
469
+ [-2 0]
470
+ [ 0 -2]
471
+ sage: P = A.cuspidal_subgroup().0; P
472
+ [(0, 1/5)]
473
+ sage: t._image_of_element(P)
474
+ [(0, -2/5)]
475
+ sage: -2*P
476
+ [(0, -2/5)]
477
+
478
+ ::
479
+
480
+ sage: J = J0(37) ; phi = J._isogeny_to_product_of_simples()
481
+ sage: phi._image_of_element(J.torsion_subgroup(5).gens()[0])
482
+ [(1/5, -1/5, -1/5, 1/5, 1/5, 1/5, 1/5, -1/5)]
483
+
484
+ ::
485
+
486
+ sage: K = J[0].intersection(J[1])[0]
487
+ sage: K.list()
488
+ [[(0, 0, 0, 0)],
489
+ [(1/2, -1/2, 1/2, 0)],
490
+ [(0, 0, 1, -1/2)],
491
+ [(1/2, -1/2, 3/2, -1/2)]]
492
+ sage: [ phi.restrict_domain(J[0])._image_of_element(k) for k in K ]
493
+ [[(0, 0, 0, 0, 0, 0, 0, 0)],
494
+ [(0, 0, 0, 0, 0, 0, 0, 0)],
495
+ [(0, 0, 0, 0, 0, 0, 0, 0)],
496
+ [(0, 0, 0, 0, 0, 0, 0, 0)]]
497
+ """
498
+ v = x._relative_element() * self.matrix() * self.codomain().lattice().basis_matrix()
499
+ T = self.codomain().qbar_torsion_subgroup()
500
+ return T(v)
501
+
502
+ def _image_of_finite_subgroup(self, G):
503
+ """
504
+ Return the image of the finite group `G` under ``self``.
505
+
506
+ INPUT:
507
+
508
+ - ``G`` -- a finite subgroup of the domain of ``self``
509
+
510
+ OUTPUT: a finite subgroup of the codomain
511
+
512
+ EXAMPLES::
513
+
514
+ sage: J = J0(33); A = J[0]; B = J[1]
515
+ sage: C = A.intersection(B)[0]; C
516
+ Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
517
+ sage: t = J.hecke_operator(3)
518
+ sage: D = t(C); D
519
+ Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3
520
+ sage: D == C
521
+ True
522
+
523
+ Or we directly test this function::
524
+
525
+ sage: D = t._image_of_finite_subgroup(C); D
526
+ Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3
527
+ sage: phi = J0(11).degeneracy_map(22,2)
528
+ sage: J0(11).rational_torsion_subgroup().order()
529
+ 5
530
+ sage: phi._image_of_finite_subgroup(J0(11).rational_torsion_subgroup())
531
+ Finite subgroup with invariants [5] over QQ of Abelian variety J0(22) of dimension 2
532
+ """
533
+ B = G._relative_basis_matrix() * self.restrict_domain(G.abelian_variety()).matrix() * self.codomain().lattice().basis_matrix()
534
+ lattice = B.row_module(ZZ)
535
+ return self.codomain().finite_subgroup(lattice,
536
+ field_of_definition=G.field_of_definition())
537
+
538
+ def _image_of_abvar(self, A):
539
+ """
540
+ Compute the image of the abelian variety `A` under this
541
+ morphism.
542
+
543
+ INPUT:
544
+
545
+ - ``A`` -- an abelian variety
546
+
547
+ OUTPUT an abelian variety
548
+
549
+ EXAMPLES::
550
+
551
+ sage: t = J0(33).hecke_operator(2)
552
+ sage: t._image_of_abvar(J0(33).new_subvariety())
553
+ Abelian subvariety of dimension 1 of J0(33)
554
+
555
+ ::
556
+
557
+ sage: t = J0(33).hecke_operator(3)
558
+ sage: A = J0(33)[0]
559
+ sage: B = t._image_of_abvar(A); B
560
+ Abelian subvariety of dimension 1 of J0(33)
561
+ sage: B == A
562
+ False
563
+ sage: A + B == J0(33).old_subvariety()
564
+ True
565
+
566
+ ::
567
+
568
+ sage: J = J0(37) ; A, B = J.decomposition()
569
+ sage: J.projection(A)._image_of_abvar(A)
570
+ Abelian subvariety of dimension 1 of J0(37)
571
+ sage: J.projection(A)._image_of_abvar(B)
572
+ Abelian subvariety of dimension 0 of J0(37)
573
+ sage: J.projection(B)._image_of_abvar(A)
574
+ Abelian subvariety of dimension 0 of J0(37)
575
+ sage: J.projection(B)._image_of_abvar(B)
576
+ Abelian subvariety of dimension 1 of J0(37)
577
+ sage: J.projection(B)._image_of_abvar(J)
578
+ Abelian subvariety of dimension 1 of J0(37)
579
+ """
580
+ from .abvar import ModularAbelianVariety
581
+ D = self.domain()
582
+ C = self.codomain()
583
+ if A is D:
584
+ B = self.matrix()
585
+ else:
586
+ if not A.is_subvariety(D):
587
+ raise ValueError("A must be an abelian subvariety of self.")
588
+ # Write the vector space corresponding to A in terms of self's
589
+ # vector space, then take the image under self.
590
+ B = D.vector_space().coordinate_module(A.vector_space()).basis_matrix() * self.matrix()
591
+
592
+ V = (B * C.vector_space().basis_matrix()).row_module(QQ)
593
+
594
+ lattice = V.intersection(C.lattice())
595
+ base_field = C.base_field()
596
+ return ModularAbelianVariety(C.groups(), lattice, base_field)
597
+
598
+
599
+ class Morphism(Morphism_abstract, sage.modules.matrix_morphism.MatrixMorphism):
600
+
601
+ def restrict_domain(self, sub):
602
+ """
603
+ Restrict ``self`` to the subvariety sub of ``self.domain()``.
604
+
605
+ EXAMPLES::
606
+
607
+ sage: J = J0(37) ; A, B = J.decomposition()
608
+ sage: A.lattice().matrix()
609
+ [ 1 -1 1 0]
610
+ [ 0 0 2 -1]
611
+ sage: B.lattice().matrix()
612
+ [1 1 1 0]
613
+ [0 0 0 1]
614
+ sage: T = J.hecke_operator(2) ; T.matrix()
615
+ [-1 1 1 -1]
616
+ [ 1 -1 1 0]
617
+ [ 0 0 -2 1]
618
+ [ 0 0 0 0]
619
+ sage: T.restrict_domain(A)
620
+ Abelian variety morphism:
621
+ From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
622
+ To: Abelian variety J0(37) of dimension 2
623
+ sage: T.restrict_domain(A).matrix()
624
+ [-2 2 -2 0]
625
+ [ 0 0 -4 2]
626
+ sage: T.restrict_domain(B)
627
+ Abelian variety morphism:
628
+ From: Simple abelian subvariety 37b(1,37) of dimension 1 of J0(37)
629
+ To: Abelian variety J0(37) of dimension 2
630
+ sage: T.restrict_domain(B).matrix()
631
+ [0 0 0 0]
632
+ [0 0 0 0]
633
+ """
634
+ if not sub.is_subvariety(self.domain()):
635
+ raise ValueError("sub must be a subvariety of self.domain()")
636
+
637
+ if sub == self.domain():
638
+ return self
639
+
640
+ L = self.domain().lattice()
641
+ B = sub.lattice().basis()
642
+ ims = sum(((L(b) * self.matrix()).list() for b in B), [])
643
+ MS = matrix_space.MatrixSpace(self.base_ring(), len(B), self.codomain().rank())
644
+ H = sub.Hom(self.codomain(), self.category_for())
645
+ return H(MS(ims))
646
+
647
+
648
+ class DegeneracyMap(Morphism):
649
+ def __init__(self, parent, A, t, side='left'):
650
+ """
651
+ Create the degeneracy map of index t in parent defined by the
652
+ matrix A.
653
+
654
+ INPUT:
655
+
656
+ - ``parent`` -- a space of homomorphisms of abelian varieties
657
+
658
+ - ``A`` -- a matrix defining self
659
+
660
+ - ``t`` -- list of indices defining the degeneracy map
661
+
662
+ EXAMPLES::
663
+
664
+ sage: J0(44).degeneracy_map(11,2)
665
+ Degeneracy map from Abelian variety J0(44) of dimension 4 to Abelian variety J0(11) of dimension 1 defined by [2]
666
+ sage: J0(44)[0].degeneracy_map(88,2)
667
+ 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]
668
+ """
669
+ if not isinstance(t, list):
670
+ t = [t]
671
+ self._t = t
672
+ Morphism.__init__(self, parent, A, side)
673
+
674
+ def t(self):
675
+ """
676
+ Return the list of indices defining ``self``.
677
+
678
+ EXAMPLES::
679
+
680
+ sage: J0(22).degeneracy_map(44).t()
681
+ [1]
682
+ sage: J = J0(22) * J0(11)
683
+ sage: J.degeneracy_map([44,44], [2,1])
684
+ 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]
685
+ sage: J.degeneracy_map([44,44], [2,1]).t()
686
+ [2, 1]
687
+ """
688
+ return self._t
689
+
690
+ def _repr_(self):
691
+ """
692
+ Return the string representation of ``self``.
693
+
694
+ EXAMPLES::
695
+
696
+ sage: J0(22).degeneracy_map(44)._repr_()
697
+ 'Degeneracy map from Abelian variety J0(22) of dimension 2 to Abelian variety J0(44) of dimension 4 defined by [1]'
698
+ """
699
+ return "Degeneracy map from %s to %s defined by %s" % (self.domain(), self.codomain(), self._t)
700
+
701
+
702
+ class HeckeOperator(Morphism):
703
+ """
704
+ A Hecke operator acting on a modular abelian variety.
705
+ """
706
+ def __init__(self, abvar, n, side='left'):
707
+ """
708
+ Create the Hecke operator of index `n` acting on the
709
+ abelian variety abvar.
710
+
711
+ INPUT:
712
+
713
+ - ``abvar`` -- a modular abelian variety
714
+
715
+ - ``n`` -- positive integer
716
+
717
+ EXAMPLES::
718
+
719
+ sage: J = J0(37)
720
+ sage: T2 = J.hecke_operator(2); T2
721
+ Hecke operator T_2 on Abelian variety J0(37) of dimension 2
722
+ sage: T2.parent()
723
+ Endomorphism ring of Abelian variety J0(37) of dimension 2
724
+ """
725
+ from .abvar import ModularAbelianVariety_abstract
726
+ n = ZZ(n)
727
+ if n <= 0:
728
+ raise ValueError("n must be positive")
729
+ if not isinstance(abvar, ModularAbelianVariety_abstract):
730
+ raise TypeError("abvar must be a modular abelian variety")
731
+ self.__abvar = abvar
732
+ self.__n = n
733
+ sage.modules.matrix_morphism.MatrixMorphism_abstract.__init__(self, abvar.Hom(abvar), side)
734
+
735
+ def _repr_(self):
736
+ """
737
+ String representation of this Hecke operator.
738
+
739
+ EXAMPLES::
740
+
741
+ sage: J = J0(37)
742
+ sage: J.hecke_operator(2)._repr_()
743
+ 'Hecke operator T_2 on Abelian variety J0(37) of dimension 2'
744
+ """
745
+ return "Hecke operator T_%s on %s" % (self.__n, self.__abvar)
746
+
747
+ def index(self):
748
+ """
749
+ Return the index of this Hecke operator. (For example, if this is
750
+ the operator `T_n`, then the index is the integer `n`.)
751
+
752
+ OUTPUT:
753
+
754
+ - ``n`` -- a (Sage) Integer
755
+
756
+ EXAMPLES::
757
+
758
+ sage: J = J0(15)
759
+ sage: t = J.hecke_operator(53)
760
+ sage: t
761
+ Hecke operator T_53 on Abelian variety J0(15) of dimension 1
762
+ sage: t.index()
763
+ 53
764
+ sage: t = J.hecke_operator(54)
765
+ sage: t
766
+ Hecke operator T_54 on Abelian variety J0(15) of dimension 1
767
+ sage: t.index()
768
+ 54
769
+
770
+ ::
771
+
772
+ sage: J = J1(12345)
773
+ sage: t = J.hecke_operator(997) ; t
774
+ Hecke operator T_997 on Abelian variety J1(12345) of dimension 5405473
775
+ sage: t.index()
776
+ 997
777
+ sage: type(t.index())
778
+ <class 'sage.rings.integer.Integer'>
779
+ """
780
+ return self.__n
781
+
782
+ def n(self):
783
+ r"""
784
+ Alias for ``self.index()``.
785
+
786
+ EXAMPLES::
787
+
788
+ sage: J = J0(17)
789
+ sage: J.hecke_operator(5).n()
790
+ 5
791
+ """
792
+ return self.index()
793
+
794
+ def characteristic_polynomial(self, var='x'):
795
+ """
796
+ Return the characteristic polynomial of this Hecke operator in the
797
+ given variable.
798
+
799
+ INPUT:
800
+
801
+ - ``var`` -- string (default: ``'x'``)
802
+
803
+ OUTPUT: a polynomial in var over the rational numbers
804
+
805
+ EXAMPLES::
806
+
807
+ sage: A = J0(43)[1]; A
808
+ Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
809
+ sage: t2 = A.hecke_operator(2); t2
810
+ Hecke operator T_2 on Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
811
+ sage: f = t2.characteristic_polynomial(); f
812
+ x^2 - 2
813
+ sage: f.parent()
814
+ Univariate Polynomial Ring in x over Integer Ring
815
+ sage: f.factor()
816
+ x^2 - 2
817
+ sage: t2.characteristic_polynomial('y')
818
+ y^2 - 2
819
+ """
820
+ return self.__abvar.rational_homology().hecke_polynomial(self.__n, var).change_ring(ZZ)
821
+
822
+ def charpoly(self, var='x'):
823
+ r"""
824
+ Synonym for ``self.characteristic_polynomial(var)``.
825
+
826
+ INPUT:
827
+
828
+ - ``var`` -- string (default: ``'x'``)
829
+
830
+ EXAMPLES::
831
+
832
+ sage: A = J1(13)
833
+ sage: t2 = A.hecke_operator(2); t2
834
+ Hecke operator T_2 on Abelian variety J1(13) of dimension 2
835
+ sage: f = t2.charpoly(); f
836
+ x^2 + 3*x + 3
837
+ sage: f.factor()
838
+ x^2 + 3*x + 3
839
+ sage: t2.charpoly('y')
840
+ y^2 + 3*y + 3
841
+ """
842
+ return self.characteristic_polynomial(var)
843
+
844
+ def fcp(self, var='x'):
845
+ """
846
+ Return the factorization of the characteristic polynomial.
847
+
848
+ EXAMPLES::
849
+
850
+ sage: t2 = J0(33).hecke_operator(2)
851
+ sage: t2.charpoly()
852
+ x^3 + 3*x^2 - 4
853
+ sage: t2.fcp()
854
+ (x - 1) * (x + 2)^2
855
+ """
856
+ return self.charpoly(var).factor()
857
+
858
+ def action_on_homology(self, R=ZZ):
859
+ r"""
860
+ Return the action of this Hecke operator on the homology
861
+ `H_1(A; R)` of this abelian variety with coefficients in
862
+ `R`.
863
+
864
+ EXAMPLES::
865
+
866
+ sage: A = J0(43)
867
+ sage: t2 = A.hecke_operator(2); t2
868
+ Hecke operator T_2 on Abelian variety J0(43) of dimension 3
869
+ sage: h2 = t2.action_on_homology(); h2
870
+ Hecke operator T_2 on Integral Homology of Abelian variety J0(43) of dimension 3
871
+ sage: h2.matrix()
872
+ [-2 1 0 0 0 0]
873
+ [-1 1 1 0 -1 0]
874
+ [-1 0 -1 2 -1 1]
875
+ [-1 0 1 1 -1 1]
876
+ [ 0 -2 0 2 -2 1]
877
+ [ 0 -1 0 1 0 -1]
878
+ sage: h2 = t2.action_on_homology(GF(2)); h2
879
+ Hecke operator T_2 on Homology with coefficients in Finite Field of size 2 of Abelian variety J0(43) of dimension 3
880
+ sage: h2.matrix()
881
+ [0 1 0 0 0 0]
882
+ [1 1 1 0 1 0]
883
+ [1 0 1 0 1 1]
884
+ [1 0 1 1 1 1]
885
+ [0 0 0 0 0 1]
886
+ [0 1 0 1 0 1]
887
+ """
888
+ return self.__abvar.homology(R).hecke_operator(self.index())
889
+
890
+ def matrix(self):
891
+ r"""
892
+ Return the matrix of ``self`` acting on the homology
893
+ `H_1(A, ZZ)` of this abelian variety with coefficients in `\ZZ`.
894
+
895
+ EXAMPLES::
896
+
897
+ sage: J0(47).hecke_operator(3).matrix()
898
+ [ 0 0 1 -2 1 0 -1 0]
899
+ [ 0 0 1 0 -1 0 0 0]
900
+ [-1 2 0 0 2 -2 1 -1]
901
+ [-2 1 1 -1 3 -1 -1 0]
902
+ [-1 -1 1 0 1 0 -1 1]
903
+ [-1 0 0 -1 2 0 -1 0]
904
+ [-1 -1 2 -2 2 0 -1 0]
905
+ [ 0 -1 0 0 1 0 -1 1]
906
+
907
+ ::
908
+
909
+ sage: J0(11).hecke_operator(7).matrix()
910
+ [-2 0]
911
+ [ 0 -2]
912
+ sage: (J0(11) * J0(33)).hecke_operator(7).matrix()
913
+ [-2 0 0 0 0 0 0 0]
914
+ [ 0 -2 0 0 0 0 0 0]
915
+ [ 0 0 0 0 2 -2 2 -2]
916
+ [ 0 0 0 -2 2 0 2 -2]
917
+ [ 0 0 0 0 2 0 4 -4]
918
+ [ 0 0 -4 0 2 2 2 -2]
919
+ [ 0 0 -2 0 2 2 0 -2]
920
+ [ 0 0 -2 0 0 2 0 -2]
921
+
922
+ ::
923
+
924
+ sage: J0(23).hecke_operator(2).matrix()
925
+ [ 0 1 -1 0]
926
+ [ 0 1 -1 1]
927
+ [-1 2 -2 1]
928
+ [-1 1 0 -1]
929
+ """
930
+ try:
931
+ return self._matrix
932
+ except AttributeError:
933
+ pass
934
+ self._matrix = self.action_on_homology().matrix()
935
+ return self._matrix