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,994 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.flint sage.libs.pari
3
+ """
4
+ Ambient Hecke modules
5
+ """
6
+ # ****************************************************************************
7
+ # Sage: Open Source Mathematical Software
8
+ #
9
+ # Copyright (C) 2005 William Stein <wstein@gmail.com>
10
+ #
11
+ # Distributed under the terms of the GNU General Public License (GPL)
12
+ #
13
+ # This code is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
+ # General Public License for more details.
17
+ #
18
+ # The full text of the GPL is available at:
19
+ #
20
+ # https://www.gnu.org/licenses/
21
+ # ****************************************************************************
22
+ from . import degenmap
23
+ from . import module
24
+ from . import submodule
25
+
26
+ from sage.modules.free_module import FreeModule, FreeModule_generic
27
+ from sage.rings.integer import Integer
28
+
29
+ import sage.arith.misc as arith
30
+
31
+ import sage.matrix.matrix_space as matrix_space
32
+ from sage.matrix.constructor import matrix
33
+
34
+ from sage.modular.arithgroup.congroup_gamma0 import Gamma0_constructor as Gamma0 # for Sturm bound
35
+
36
+
37
+ class AmbientHeckeModule(module.HeckeModule_free_module):
38
+ """
39
+ An ambient Hecke module, i.e. a Hecke module that is isomorphic as a module
40
+ over its base ring `R` to the standard free module `R^k` for some `k`. This
41
+ is the base class for ambient spaces of modular forms and modular symbols,
42
+ and for Brandt modules.
43
+ """
44
+ def __init__(self, base_ring, rank, level, weight, category=None):
45
+ r"""
46
+ Create an ambient Hecke module.
47
+
48
+ EXAMPLES::
49
+
50
+ sage: ModularSymbols(6) # indirect doctest
51
+ Modular Symbols space of dimension 3 for Gamma_0(6) of weight 2 with sign 0 over Rational Field
52
+ sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)
53
+ Generic ambient Hecke module of rank 3, level 2 and weight 4 over Rational Field
54
+ """
55
+ rank = Integer(rank)
56
+ if rank < 0:
57
+ raise ValueError("rank (=%s) must be nonnegative" % rank)
58
+ self.__rank = rank
59
+ module.HeckeModule_free_module.__init__(self, base_ring, level,
60
+ weight, category=category)
61
+
62
+ def rank(self):
63
+ """
64
+ Return the rank of this ambient Hecke module.
65
+
66
+ OUTPUT: integer
67
+
68
+ EXAMPLES::
69
+
70
+ sage: M = sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 11, 2); M
71
+ Generic ambient Hecke module of rank 3, level 11 and weight 2 over Rational Field
72
+ sage: M.rank()
73
+ 3
74
+ """
75
+ return self.__rank
76
+
77
+ def __add__(self, other):
78
+ r"""
79
+ Return the sum of ``self`` and ``other``.
80
+
81
+ As ``self`` is an ambient space, this will only make sense if
82
+ ``other`` is a subspace of ``self``, in which case the answer
83
+ is ``self``.
84
+
85
+ EXAMPLES::
86
+
87
+ sage: M = ModularSymbols(23)
88
+ sage: M + M is M
89
+ True
90
+ sage: M + 3
91
+ Traceback (most recent call last):
92
+ ...
93
+ TypeError: other (=3) must be a Hecke module
94
+ """
95
+ if not isinstance(other, module.HeckeModule_free_module):
96
+ raise TypeError("other (=%s) must be a Hecke module" % other)
97
+ if other.ambient_hecke_module() == self:
98
+ return self
99
+ raise ArithmeticError("sum only defined for subspaces of a common ambient Hecke module")
100
+
101
+ def _repr_(self):
102
+ r"""
103
+ Return the string representation of ``self``.
104
+
105
+ This should be overridden by derived classes.
106
+
107
+ EXAMPLES::
108
+
109
+ sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._repr_()
110
+ 'Generic ambient Hecke module of rank 3, level 2 and weight 4 over Rational Field'
111
+ """
112
+ return "Generic ambient Hecke module of rank %s, level %s and weight %s over %s" % (self.rank(), self.level(), self.weight(), self.base_ring())
113
+
114
+ def _degeneracy_raising_matrix(self, codomain):
115
+ """
116
+ Matrix of the degeneracy map (with t = 1) from ``self`` to ``codomain``,
117
+ whose level should be a multiple of the level of ``self``.
118
+
119
+ EXAMPLES::
120
+
121
+ sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._degeneracy_raising_matrix(4)
122
+ Traceback (most recent call last):
123
+ ...
124
+ NotImplementedError
125
+ """
126
+ raise NotImplementedError
127
+
128
+ def _degeneracy_lowering_matrix(self, codomain, t):
129
+ """
130
+ Matrix of the degeneracy map of index t from ``self`` to ``codomain``,
131
+ whose level should be a divisor of the level of ``self``.
132
+
133
+ EXAMPLES::
134
+
135
+ sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._degeneracy_lowering_matrix(2, 2)
136
+ Traceback (most recent call last):
137
+ ...
138
+ NotImplementedError
139
+ """
140
+ raise NotImplementedError
141
+
142
+ def _hecke_image_of_ith_basis_element(self, n, i):
143
+ """
144
+ Return the image under the Hecke operator `T_n` of the `i`-th basis
145
+ element.
146
+
147
+ EXAMPLES::
148
+
149
+ sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._hecke_image_of_ith_basis_element(4, 2)
150
+ Traceback (most recent call last):
151
+ ...
152
+ NotImplementedError: All subclasses must implement _compute_hecke_matrix_prime
153
+ """
154
+ return self.hecke_operator(n)(self.gen(i))
155
+
156
+ def _set_dual_free_module(self, V):
157
+ r"""
158
+ Store the embedded dual module of this module.
159
+
160
+ Since this module is an ambient module, this is not necessary.
161
+
162
+ EXAMPLES::
163
+
164
+ sage: ModularForms(11, 2)._set_dual_free_module(None)
165
+ """
166
+ pass # setting dual free module of ambient space is not necessary
167
+
168
+ def ambient_hecke_module(self):
169
+ r"""
170
+ Return the ambient space that contains this ambient space.
171
+
172
+ This is, of course, just this space again.
173
+
174
+ EXAMPLES::
175
+
176
+ sage: M = ModularForms(11, 4); M.ambient_hecke_module() is M
177
+ True
178
+ """
179
+ return self
180
+
181
+ def complement(self):
182
+ """
183
+ Return the largest Hecke-stable complement of this space.
184
+
185
+ EXAMPLES::
186
+
187
+ sage: M = ModularSymbols(11,2,1); M
188
+ Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
189
+ sage: M.complement()
190
+ Modular Symbols subspace of dimension 0 of Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
191
+ sage: C = M.cuspidal_subspace(); C
192
+ Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
193
+ sage: C.complement()
194
+ Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
195
+ """
196
+ return self.zero_submodule()
197
+
198
+ def decomposition_matrix(self):
199
+ r"""
200
+ Return the matrix whose columns form a basis for the canonical
201
+ sorted decomposition of ``self`` coming from the Hecke operators.
202
+
203
+ If the simple factors are `D_0, \ldots, D_n`, then the
204
+ first few columns are an echelonized basis for `D_0`, the
205
+ next an echelonized basis for `D_1`, the next for
206
+ `D_2`, etc.
207
+
208
+ EXAMPLES::
209
+
210
+ sage: S = ModularSymbols(37, 2)
211
+ sage: S.decomposition_matrix()
212
+ [ 1 0 0 0 -1/3]
213
+ [ 0 1 -1 0 1/2]
214
+ [ 0 0 0 1 -1/2]
215
+ [ 0 1 1 1 0]
216
+ [ 0 0 0 0 1]
217
+ """
218
+ try:
219
+ return self.__decomposition_matrix_cache
220
+ except AttributeError:
221
+ rows = [x.list() for A in self.decomposition()
222
+ for x in A.basis()]
223
+ A = matrix_space.MatrixSpace(self.base_ring(), self.rank())(rows)
224
+ self.__decomposition_matrix_cache = A
225
+ return self.__decomposition_matrix_cache
226
+
227
+ def decomposition_matrix_inverse(self):
228
+ """
229
+ Return the inverse of the decomposition matrix.
230
+
231
+ This is the inverse of the matrix returned by
232
+ :meth:`decomposition_matrix`.
233
+
234
+ EXAMPLES::
235
+
236
+ sage: S = ModularSymbols(37, 2)
237
+ sage: t = S.decomposition_matrix_inverse(); t
238
+ [ 1 0 0 0 1/3]
239
+ [ 0 1/2 -1/2 1/2 -1/2]
240
+ [ 0 -1/2 -1/2 1/2 0]
241
+ [ 0 0 1 0 1/2]
242
+ [ 0 0 0 0 1]
243
+ sage: t * S.decomposition_matrix() == 1
244
+ True
245
+ """
246
+ try:
247
+ return self.__decomposition_matrix_inverse_cache
248
+ except AttributeError:
249
+ self.__decomposition_matrix_inverse_cache = ~self.decomposition_matrix()
250
+ return self.__decomposition_matrix_inverse_cache
251
+
252
+ def degeneracy_map(self, codomain, t=1):
253
+ """
254
+ The `t`-th degeneracy map from ``self`` to the module ``codomain``.
255
+
256
+ The level of the codomain must be a divisor or multiple of
257
+ level, and `t` must be a divisor of the quotient.
258
+
259
+ INPUT:
260
+
261
+ - ``codomain`` -- a Hecke module, which should be of the same type as
262
+ self, or a positive integer (in which case Sage will use
263
+ :meth:`~hecke_module_of_level` to find the "natural" module of the
264
+ corresponding level).
265
+ - ``t`` -- integer; the parameter of the degeneracy map, i.e., the map
266
+ is related to `f(q)` - `f(q^t)`
267
+
268
+ OUTPUT: a morphism from ``self`` to ``codomain``
269
+
270
+ EXAMPLES::
271
+
272
+ sage: M = ModularSymbols(11,sign=1)
273
+ sage: d1 = M.degeneracy_map(33); d1
274
+ Hecke module morphism degeneracy map corresponding to f(q) |--> f(q)
275
+ defined by the matrix
276
+ [ 1 0 0 0 -2 -1]
277
+ [ 0 -1 1 0 0 0]
278
+ Domain: Modular Symbols space of dimension 2 for Gamma_0(11) of weight ...
279
+ Codomain: Modular Symbols space of dimension 6 for Gamma_0(33) of weight ...
280
+ sage: M.degeneracy_map(33, 3).matrix()
281
+ [ 3 2 0 2 -2 1]
282
+ [ 0 0 -1 1 0 0]
283
+ sage: M = ModularSymbols(33, sign=1)
284
+ sage: d2 = M.degeneracy_map(11); d2.matrix()
285
+ [ 1 0]
286
+ [ 0 -2]
287
+ [ 0 2]
288
+ [ 0 1]
289
+ [-1 0]
290
+ [-1 0]
291
+ sage: (d2*d1).matrix()
292
+ [4 0]
293
+ [0 4]
294
+
295
+ ::
296
+
297
+ sage: M = ModularSymbols(3, 12, sign=1)
298
+ sage: M.degeneracy_map(1)
299
+ Hecke module morphism degeneracy map corresponding to f(q) |--> f(q)
300
+ defined by the matrix
301
+ [1 0]
302
+ [0 0]
303
+ [0 1]
304
+ [0 1]
305
+ [0 1]
306
+ Domain: Modular Symbols space of dimension 5 for Gamma_0(3) of weight ...
307
+ Codomain: Modular Symbols space of dimension 2 for Gamma_0(1) of weight ...
308
+
309
+ ::
310
+
311
+ sage: S = M.cuspidal_submodule()
312
+ sage: S.degeneracy_map(1)
313
+ Hecke module morphism defined by the matrix
314
+ [1 0]
315
+ [0 0]
316
+ [0 0]
317
+ Domain: Modular Symbols subspace of dimension 3 of Modular Symbols space ...
318
+ Codomain: Modular Symbols space of dimension 2 for Gamma_0(1) of weight ...
319
+
320
+ ::
321
+
322
+ sage: D = ModularSymbols(10,4).cuspidal_submodule().decomposition()
323
+ sage: D
324
+ [Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 10 for Gamma_0(10) of weight 4 with sign 0 over Rational Field,
325
+ Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 10 for Gamma_0(10) of weight 4 with sign 0 over Rational Field]
326
+ sage: D[1].degeneracy_map(5)
327
+ Hecke module morphism defined by the matrix
328
+ [ 0 0 -1 1]
329
+ [ 0 1/2 3/2 -2]
330
+ [ 0 -1 1 0]
331
+ [ 0 -3/4 -1/4 1]
332
+ Domain: Modular Symbols subspace of dimension 4 of Modular Symbols space ...
333
+ Codomain: Modular Symbols space of dimension 4 for Gamma_0(5) of weight ...
334
+
335
+ We check for a subtle caching bug that came up in work on :issue:`10453`::
336
+
337
+ sage: loads(dumps(J0(33).decomposition()[0].modular_symbols()))
338
+ Modular Symbols subspace of dimension 2 of
339
+ Modular Symbols space of dimension 9 for
340
+ Gamma_0(33) of weight 2 with sign 0 over Rational Field
341
+
342
+ We check that certain absurd inputs are correctly caught::
343
+
344
+ sage: chi = kronecker_character(7)
345
+ sage: ModularSymbols(Gamma0(7), 4).degeneracy_map(ModularSymbols(chi, 4))
346
+ Traceback (most recent call last):
347
+ ...
348
+ ValueError: the characters of the domain and codomain must match
349
+ """
350
+ if isinstance(codomain, AmbientHeckeModule):
351
+ M = codomain
352
+ level = int(M.level())
353
+ else:
354
+ level = int(codomain)
355
+ M = None
356
+
357
+ t = int(t)
358
+
359
+ err = False
360
+ if self.level() % level == 0:
361
+ quo = self.level() // level
362
+ if quo % t != 0:
363
+ err = True
364
+ elif level % self.level() == 0:
365
+ quo = level // self.level()
366
+ if quo % t != 0:
367
+ err = True
368
+ else:
369
+ err = True
370
+ if err:
371
+ raise ValueError(("the level of self (=%s) must be a divisor or multiple of "
372
+ "level (=%s) and t (=%s) must be a divisor of the quotient") % (self.level(), level, t))
373
+
374
+ eps = self.character()
375
+ if eps is not None and level % eps.conductor() != 0:
376
+ raise ArithmeticError("the conductor of the character of this space "
377
+ "(=%s) must be divisible by the level (=%s)" % (eps.conductor(), level))
378
+
379
+ if M is None:
380
+ M = self.hecke_module_of_level(level)
381
+
382
+ if eps is not None and M.character() is not None:
383
+ if eps.primitive_character() != M.character().primitive_character():
384
+ raise ValueError("the characters of the domain and codomain must match")
385
+
386
+ key = (M.group(), t)
387
+ # bad idea to use (M, t) as the key, because using complicated objects
388
+ # like modular forms spaces as dictionary keys causes weird behaviour;
389
+ # on the other hand, (M.level(), t) isn't enough information.
390
+ try:
391
+ self._degeneracy_maps
392
+ except AttributeError:
393
+ self._degeneracy_maps = {}
394
+
395
+ if key in self._degeneracy_maps:
396
+ return self._degeneracy_maps[key]
397
+
398
+ if M.rank() == 0:
399
+ A = matrix_space.MatrixSpace(self.base_ring(), self.rank(), 0)(0)
400
+
401
+ elif self.level() % level == 0: # lower the level
402
+ A = self._degeneracy_lowering_matrix(M, t)
403
+
404
+ elif level % self.level() == 0: # raise the level
405
+ A = self._degeneracy_raising_matrix(M, t)
406
+
407
+ d = degenmap.DegeneracyMap(A, self, M, t)
408
+ self._degeneracy_maps[key] = d
409
+ return d
410
+
411
+ def dual_free_module(self):
412
+ r"""
413
+ The free module dual to ``self``, as a submodule of the dual
414
+ module of the ambient space. As this space is ambient anyway,
415
+ this just returns ``self.free_module()``.
416
+
417
+ EXAMPLES::
418
+
419
+ sage: M = ModularForms(2,8); M.dual_free_module()
420
+ Vector space of dimension 3 over Rational Field
421
+ sage: M.dual_free_module() is M.free_module()
422
+ True
423
+ """
424
+ return self.free_module()
425
+
426
+ def fcp(self, n, var='x'):
427
+ """
428
+ Return the factorization of the characteristic polynomial of
429
+ the Hecke operator `T_n` of index `n` acting on this space.
430
+
431
+ INPUT:
432
+
433
+ - ``self`` -- Hecke module invariant under the Hecke operator of index
434
+ `n`
435
+
436
+ - ``n`` --- a positive integer.
437
+
438
+ - ``var`` --- variable of polynomial (default: ``'x'``)
439
+
440
+ OUTPUT:
441
+
442
+ - ``list`` -- list of the pairs `(g,e)`, where `g` is an
443
+ irreducible factor of the characteristic polynomial of `T_n`, and `e`
444
+ is its multiplicity.
445
+
446
+ EXAMPLES::
447
+
448
+ sage: m = ModularSymbols(23, 2, sign=1)
449
+ sage: m.fcp(2)
450
+ (x - 3) * (x^2 + x - 1)
451
+ sage: m.hecke_operator(2).charpoly('x').factor()
452
+ (x - 3) * (x^2 + x - 1)
453
+ """
454
+ n = int(n)
455
+ if n <= 0:
456
+ raise ArithmeticError("n (=%s) must be positive" % n)
457
+ return self.hecke_operator(n).fcp(var)
458
+
459
+ def free_module(self):
460
+ """
461
+ Return the free module underlying this ambient Hecke module (the
462
+ forgetful functor from Hecke modules to modules over the base ring)
463
+
464
+ EXAMPLES::
465
+
466
+ sage: ModularForms(59, 2).free_module()
467
+ Vector space of dimension 6 over Rational Field
468
+ """
469
+ try:
470
+ return self.__free_module
471
+ except AttributeError:
472
+ M = FreeModule(self.base_ring(), self.rank())
473
+ self.__free_module = M
474
+ return M
475
+
476
+ def hecke_bound(self):
477
+ r"""
478
+ Return an integer `B` such that the Hecke operators `T_n`, for `n\leq B`,
479
+ generate the full Hecke algebra as a module over the base ring. Note
480
+ that we include the `n` with `n` not coprime to the level.
481
+
482
+ At present this returns an unproven guess for non-cuspidal spaces which
483
+ appears to be valid for `M_k(\Gamma_0(N))`, where `k` and `N` are the
484
+ weight and level of ``self``. (It is clearly valid for *cuspidal* spaces
485
+ of any fixed character, as a consequence of the Sturm bound theorem.)
486
+ It returns a hopelessly wrong answer for spaces of full level
487
+ `\Gamma_1`.
488
+
489
+ TODO: Get rid of this dreadful bit of code.
490
+
491
+ EXAMPLES::
492
+
493
+ sage: ModularSymbols(17, 4).hecke_bound()
494
+ 15
495
+ sage: ModularSymbols(Gamma1(17), 4).hecke_bound() # wrong!
496
+ 15
497
+ """
498
+ from sage.misc.verbose import verbose
499
+ try:
500
+ if self.is_cuspidal():
501
+ return Gamma0(self.level()).sturm_bound(self.weight())
502
+ except AttributeError:
503
+ pass
504
+ verbose("WARNING: ambient.py -- hecke_bound; returning unproven guess.")
505
+ return Gamma0(self.level()).sturm_bound(self.weight()) + 2 * Gamma0(self.level()).dimension_eis(self.weight()) + 5
506
+
507
+ def hecke_module_of_level(self, level):
508
+ r"""
509
+ Return the Hecke module corresponding to ``self`` at the given level, which
510
+ should be either a divisor or a multiple of the level of ``self``.
511
+
512
+ This raises :exc:`NotImplementedError`, and should be overridden in
513
+ derived classes.
514
+
515
+ EXAMPLES::
516
+
517
+ sage: sage.modular.hecke.ambient_module.AmbientHeckeModule.hecke_module_of_level(ModularForms(2, 8),6)
518
+ Traceback (most recent call last):
519
+ ...
520
+ NotImplementedError
521
+ """
522
+ raise NotImplementedError
523
+
524
+ def hecke_images(self, i, v):
525
+ """
526
+ Return images of the `i`-th standard basis vector under the
527
+ Hecke operators `T_p` for all integers in `v`.
528
+
529
+ INPUT:
530
+
531
+ - ``i`` -- nonnegative integer
532
+
533
+ - ``v`` -- list of positive integer
534
+
535
+ OUTPUT: ``matrix`` -- whose rows are the Hecke images
536
+
537
+ EXAMPLES::
538
+
539
+ sage: M = ModularSymbols(DirichletGroup(13).0, 3)
540
+ sage: M.T(2)(M.0).element()
541
+ (zeta12 + 4, 0, -1, 1)
542
+ sage: M.hecke_images(0, [1,2])
543
+ [ 1 0 0 0]
544
+ [zeta12 + 4 0 -1 1]
545
+ """
546
+ try:
547
+ return self._hecke_images(i, v)
548
+ except (AttributeError, NotImplementedError):
549
+ pass
550
+ # Use slow generic algorithm
551
+ x = self.gen(i)
552
+ X = [self.hecke_operator(n).apply_sparse(x).element() for n in v]
553
+ return matrix(self.base_ring(), X)
554
+
555
+ def intersection(self, other):
556
+ """
557
+ Return the intersection of ``self`` and ``other``, which must both lie in
558
+ a common ambient space of modular symbols.
559
+
560
+ EXAMPLES::
561
+
562
+ sage: M = ModularSymbols(43, sign=1)
563
+ sage: A = M[0] + M[1]
564
+ sage: B = M[1] + M[2]
565
+ sage: A.rank(), B.rank()
566
+ (2, 3)
567
+ sage: C = A.intersection(B); C.rank() # TODO
568
+ 1
569
+ """
570
+ if not isinstance(other, module.HeckeModule_free_module):
571
+ raise TypeError("other (=%s) must be a Hecke module" % other)
572
+ if self.ambient_hecke_module() != other.ambient_hecke_module():
573
+ raise ArithmeticError("intersection only defined for subspaces of a common ambient Hecke module")
574
+ return other # since self is ambient, so the intersection must equal other.
575
+
576
+ def is_ambient(self) -> bool:
577
+ r"""
578
+ Return ``True`` if and only if ``self`` is an ambient Hecke module.
579
+
580
+ .. warning::
581
+
582
+ ``self`` can only be ambient by being of type
583
+ :class:`AmbientHeckeModule`.
584
+
585
+ For example, decomposing a simple ambient space yields a
586
+ single factor, and that factor is *not* considered an
587
+ ambient space.
588
+
589
+ EXAMPLES::
590
+
591
+ sage: m = ModularSymbols(10)
592
+ sage: m.is_ambient()
593
+ True
594
+
595
+ ::
596
+
597
+ sage: a = m[0] # the unique simple factor
598
+ sage: a == m
599
+ True
600
+ sage: a.is_ambient()
601
+ False
602
+ """
603
+ return True
604
+
605
+ def is_full_hecke_module(self, compute=True) -> bool:
606
+ """
607
+ Return ``True`` if this space is invariant under the action of
608
+ all Hecke operators, even those that divide the level. This is
609
+ always true for ambient Hecke modules, so return ``True``.
610
+
611
+ EXAMPLES::
612
+
613
+ sage: ModularSymbols(11, 4).is_full_hecke_module()
614
+ True
615
+ """
616
+ return True
617
+
618
+ def is_new(self, p=None) -> bool:
619
+ r"""
620
+ Return ``True`` if this module is entirely new.
621
+
622
+ EXAMPLES::
623
+
624
+ sage: ModularSymbols(11, 4).is_new()
625
+ False
626
+ sage: ModularSymbols(1, 12).is_new()
627
+ True
628
+ """
629
+ try:
630
+ if p in self.__is_new:
631
+ return self.__is_new[p]
632
+ except AttributeError:
633
+ pass
634
+ AmbientHeckeModule.new_submodule(self, p)
635
+ return self.__is_new[p]
636
+
637
+ def is_old(self, p=None) -> bool:
638
+ r"""
639
+ Return ``True`` if this module is entirely old.
640
+
641
+ EXAMPLES::
642
+
643
+ sage: ModularSymbols(22).is_old()
644
+ True
645
+ sage: ModularSymbols(3, 12).is_old()
646
+ False
647
+ """
648
+ try:
649
+ if p in self.__is_old:
650
+ return self.__is_old[p]
651
+ except AttributeError:
652
+ pass
653
+ self.old_submodule(p)
654
+ return self.__is_old[p]
655
+
656
+ def is_submodule(self, V) -> bool:
657
+ """
658
+ Return ``True`` if and only if ``self`` is a submodule of ``V``.
659
+
660
+ Since this is an ambient space, this returns ``True`` if and
661
+ only if ``V`` is equal to ``self``.
662
+
663
+ EXAMPLES::
664
+
665
+ sage: ModularSymbols(1, 4).is_submodule(ModularSymbols(11,4))
666
+ False
667
+ sage: ModularSymbols(11, 4).is_submodule(ModularSymbols(11,4))
668
+ True
669
+ """
670
+ if not isinstance(V, module.HeckeModule_free_module):
671
+ raise TypeError("V must be a Hecke module")
672
+ if not V.is_ambient():
673
+ return False
674
+ return V.ambient_hecke_module() == self
675
+
676
+ def linear_combination_of_basis(self, v):
677
+ r"""
678
+ Given a list or vector of length equal to the dimension of ``self``,
679
+ construct the appropriate linear combination of the basis vectors of
680
+ ``self``.
681
+
682
+ EXAMPLES::
683
+
684
+ sage: ModularForms(3, 12).linear_combination_of_basis([1,0,0,0,1])
685
+ 2*q + 2049*q^2 + 177147*q^3 + 4196177*q^4 + 48830556*q^5 + O(q^6)
686
+ """
687
+ return self(v)
688
+
689
+ def new_submodule(self, p=None):
690
+ """
691
+ Return the new or `p`-new submodule of ``self``.
692
+
693
+ INPUT:
694
+
695
+ - ``p`` -- (default: ``None``) if not ``None``, return only
696
+ the `p`-new submodule
697
+
698
+ OUTPUT: the new or `p`-new submodule of ``self``, i.e. the intersection of
699
+ the kernel of the degeneracy lowering maps to level `N/p` (for the
700
+ given prime `p`, or for all prime divisors of `N` if `p` is not given).
701
+
702
+ If ``self`` is cuspidal, this is a Hecke-invariant complement of the
703
+ corresponding old submodule, but this may break down on Eisenstein
704
+ subspaces (see the amusing example in William Stein's book of a form
705
+ which is new and old at the same time).
706
+
707
+ EXAMPLES::
708
+
709
+ sage: m = ModularSymbols(33); m.rank()
710
+ 9
711
+ sage: m.new_submodule().rank()
712
+ 3
713
+ sage: m.new_submodule(3).rank()
714
+ 4
715
+ sage: m.new_submodule(11).rank()
716
+ 8
717
+ """
718
+ try:
719
+ if self.__is_new[p]:
720
+ return self
721
+ except AttributeError:
722
+ self.__is_new = {}
723
+ except KeyError:
724
+ pass
725
+
726
+ if self.rank() == 0:
727
+ self.__is_new[p] = True
728
+ return self
729
+ try:
730
+ return self.__new_submodule[p]
731
+ except AttributeError:
732
+ self.__new_submodule = {}
733
+ except KeyError:
734
+ pass
735
+
736
+ # Construct the degeneracy map d.
737
+ N = self.level()
738
+ d = None
739
+ eps = self.character()
740
+ if eps is None:
741
+ f = 1
742
+ else:
743
+ f = eps.conductor()
744
+ if p is None:
745
+ D = arith.prime_divisors(N)
746
+ else:
747
+ if N % p != 0:
748
+ raise ValueError("p must divide the level")
749
+ D = [p]
750
+ for q in D:
751
+ # Here we are only using degeneracy *lowering* maps, so it is fine
752
+ # to be careless and pass an integer for the level. One needs to be
753
+ # a bit more careful with degeneracy *raising* maps for the Gamma1
754
+ # and GammaH cases.
755
+ if ((N // q) % f) == 0:
756
+ NN = N // q
757
+ d1 = self.degeneracy_map(NN, 1).matrix()
758
+ if d is None:
759
+ d = d1
760
+ else:
761
+ d = d.augment(d1)
762
+ d = d.augment(self.degeneracy_map(NN, q).matrix())
763
+
764
+ if d is None or d == 0:
765
+ self.__is_new[p] = True
766
+ return self
767
+ else:
768
+ self.__is_new[p] = False
769
+ ns = self.submodule(d.kernel(), check=False)
770
+ ns.__is_new = {p: True}
771
+ ns._is_full_hecke_module = True
772
+ self.__new_submodule[p] = ns
773
+ return ns
774
+
775
+ def nonembedded_free_module(self):
776
+ r"""
777
+ Return the free module corresponding to ``self`` as an abstract free module
778
+ (rather than as a submodule of an ambient free module).
779
+
780
+ As this module is ambient anyway, this just returns
781
+ ``self.free_module()``.
782
+
783
+ EXAMPLES::
784
+
785
+ sage: M = ModularSymbols(11, 2)
786
+ sage: M.nonembedded_free_module() is M.free_module()
787
+ True
788
+ """
789
+ return self.free_module()
790
+
791
+ def old_submodule(self, p=None):
792
+ """
793
+ Return the old or `p`-old submodule of ``self``, i.e. the sum of the images
794
+ of the degeneracy maps from level `N/p` (for the given prime `p`, or
795
+ for all primes `p` dividing `N` if `p` is not given).
796
+
797
+ INPUT:
798
+
799
+ - ``p`` -- (default: ``None``) if not ``None``, return only the `p`-old
800
+ submodule
801
+
802
+ OUTPUT: the old or `p`-old submodule of ``self``
803
+
804
+ EXAMPLES::
805
+
806
+ sage: m = ModularSymbols(33); m.rank()
807
+ 9
808
+ sage: m.old_submodule().rank()
809
+ 7
810
+ sage: m.old_submodule(3).rank()
811
+ 6
812
+ sage: m.new_submodule(11).rank()
813
+ 8
814
+
815
+ ::
816
+
817
+ sage: e = DirichletGroup(16)([-1, 1])
818
+ sage: M = ModularSymbols(e, 3, sign=1); M
819
+ Modular Symbols space of dimension 4 and level 16, weight 3,
820
+ character [-1, 1], sign 1, over Rational Field
821
+ sage: M.old_submodule()
822
+ Modular Symbols subspace of dimension 3 of
823
+ Modular Symbols space of dimension 4 and level 16, weight 3,
824
+ character [-1, 1], sign 1, over Rational Field
825
+
826
+ Illustrate that :issue:`10664` is fixed::
827
+
828
+ sage: ModularSymbols(DirichletGroup(42)[7], 6, sign=1).old_subspace(3)
829
+ Modular Symbols subspace of dimension 0 of
830
+ Modular Symbols space of dimension 40 and level 42, weight 6,
831
+ character [-1, -1], sign 1, over Rational Field
832
+ """
833
+ try:
834
+ if self.__is_old[p]:
835
+ return self
836
+ except AttributeError:
837
+ self.__is_old = {}
838
+ except KeyError:
839
+ pass
840
+
841
+ if self.rank() == 0:
842
+ self.__is_old[p] = True
843
+ return self
844
+ try:
845
+ return self.__old_submodule[p]
846
+ except AttributeError:
847
+ self.__old_submodule = {}
848
+ except KeyError:
849
+ pass
850
+
851
+ # Construct the degeneracy map d.
852
+ N = self.level()
853
+ d = None
854
+
855
+ eps = self.character()
856
+ if eps is None:
857
+ f = 1
858
+ else:
859
+ f = eps.conductor()
860
+
861
+ if p is None:
862
+ D = arith.prime_divisors(N)
863
+ else:
864
+ if N % p != 0:
865
+ raise ValueError("p must divide the level")
866
+ D = [p]
867
+
868
+ for q in D:
869
+ NN = N // q
870
+ if NN % f == 0:
871
+ M = self.hecke_module_of_level(NN)
872
+
873
+ # Here it is vital to pass self as an argument to
874
+ # degeneracy_map, because M and the level N don't uniquely
875
+ # determine self (e.g. the degeneracy map from level 1 to level
876
+ # N could go to Gamma0(N), Gamma1(N) or anything in between)
877
+ d1 = M.degeneracy_map(self, 1).matrix()
878
+
879
+ if d is None:
880
+ d = d1
881
+ else:
882
+ d = d.stack(d1)
883
+ d = d.stack(M.degeneracy_map(self, q).matrix())
884
+
885
+ if d is None:
886
+ os = self.zero_submodule()
887
+ else:
888
+ os = self.submodule(d.image(), check=False)
889
+
890
+ self.__is_old[p] = (os == self)
891
+
892
+ os.__is_old = {p: True}
893
+ os._is_full_hecke_module = True
894
+ self.__old_submodule[p] = os
895
+ return os
896
+
897
+ def submodule(self, M, Mdual=None, check=True):
898
+ """
899
+ Return the Hecke submodule of ``self`` generated by `M`, which may be a
900
+ submodule of the free module of ``self``, or a list of elements of ``self``.
901
+
902
+ EXAMPLES::
903
+
904
+ sage: M = ModularForms(37, 2)
905
+ sage: A = M.submodule([M.newforms()[0].element(), M.newforms()[1].element()]); A
906
+ Modular Forms subspace of dimension 2 of
907
+ Modular Forms space of dimension 3 for
908
+ Congruence Subgroup Gamma0(37) of weight 2 over Rational Field
909
+ """
910
+ if check:
911
+ if not isinstance(M, FreeModule_generic):
912
+ V = self.free_module()
913
+ if isinstance(M, (list, tuple)):
914
+ M = V.span([V(x.element()) for x in M])
915
+ else:
916
+ M = V.span(M)
917
+ if not M.is_submodule(self.free_module()):
918
+ raise TypeError("M must be a submodule of the free module associated to this module")
919
+ if M == self.free_module():
920
+ return self
921
+ return self._submodule_class()(self, M, Mdual, check=check)
922
+
923
+ def _submodule_class(self):
924
+ r"""
925
+ The class of submodules of this module. This is a separate method so it
926
+ can be overridden in derived classes.
927
+
928
+ EXAMPLES::
929
+
930
+ sage: sage.modular.hecke.ambient_module.AmbientHeckeModule._submodule_class(ModularForms(1, 24))
931
+ <class 'sage.modular.hecke.submodule.HeckeSubmodule'>
932
+ sage: ModularForms(1, 24)._submodule_class()
933
+ <class 'sage.modular.modform.submodule.ModularFormsSubmodule'>
934
+ """
935
+ return submodule.HeckeSubmodule
936
+
937
+ def submodule_from_nonembedded_module(self, V, Vdual=None, check=True):
938
+ """
939
+ Create a submodule of this module, from a submodule of an ambient free
940
+ module of the same rank as the rank of ``self``.
941
+
942
+ INPUT:
943
+
944
+ - ``V`` -- submodule of ambient free module of the same rank as the
945
+ rank of ``self``
946
+
947
+ - ``Vdual`` -- used to pass in dual submodule (may be ``None``)
948
+
949
+ - ``check`` -- whether to check that submodule is Hecke-equivariant
950
+
951
+ OUTPUT: Hecke submodule of ``self``
952
+
953
+ EXAMPLES::
954
+
955
+ sage: V = QQ^8
956
+ sage: ModularForms(24, 2).submodule_from_nonembedded_module(V.submodule([0]))
957
+ Modular Forms subspace of dimension 0 of
958
+ Modular Forms space of dimension 8 for
959
+ Congruence Subgroup Gamma0(24) of weight 2 over Rational Field
960
+ """
961
+ return self.submodule(V, Vdual, check=check)
962
+
963
+ def submodule_generated_by_images(self, M):
964
+ """
965
+ Return the submodule of this ambient modular symbols space
966
+ generated by the images under all degeneracy maps of `M`.
967
+
968
+ The space `M` must have the same weight, sign, and group or
969
+ character as this ambient space.
970
+
971
+ EXAMPLES::
972
+
973
+ sage: ModularSymbols(6, 12).submodule_generated_by_images(ModularSymbols(1,12))
974
+ Modular Symbols subspace of dimension 12 of
975
+ Modular Symbols space of dimension 22 for
976
+ Gamma_0(6) of weight 12 with sign 0 over Rational Field
977
+ """
978
+ S = self.zero_submodule()
979
+ if self.level() % M.level() == 0:
980
+ D = arith.divisors(self.level() // M.level())
981
+ elif M.level() % self.level() == 0:
982
+ D = arith.divisors(M.level() // self.level())
983
+ else:
984
+ D = []
985
+ for t in D:
986
+ d = M.degeneracy_map(self, t)
987
+ if d.codomain() != self:
988
+ raise ArithmeticError("incompatible spaces of modular symbols")
989
+ S += d.image()
990
+
991
+ if self.is_full_hecke_module(compute=False):
992
+ S._is_full_hecke_module = True
993
+
994
+ return S