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
sage/modular/dims.py ADDED
@@ -0,0 +1,571 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.pari
3
+ r"""
4
+ Dimensions of spaces of modular forms
5
+
6
+ AUTHORS:
7
+
8
+ - William Stein
9
+
10
+ - Jordi Quer
11
+
12
+ ACKNOWLEDGEMENT: The dimension formulas and implementations in this
13
+ module grew out of a program that Bruce Kaskel wrote (around 1996)
14
+ in PARI, which Kevin Buzzard subsequently extended. I (William
15
+ Stein) then implemented it in C++ for Hecke. I also implemented it
16
+ in Magma. Also, the functions for dimensions of spaces with
17
+ nontrivial character are based on a paper (that has no proofs) by
18
+ Cohen and Oesterlé [CO1977]_. The formulas for `\Gamma_H(N)` were found
19
+ and implemented by Jordi Quer.
20
+
21
+ The formulas here are more complete than in Hecke or Magma.
22
+
23
+ Currently the input to each function below is an integer and either a Dirichlet
24
+ character `\varepsilon` or a finite index subgroup of `\SL_2(\ZZ)`.
25
+ If the input is a Dirichlet character `\varepsilon`, the dimensions are for
26
+ subspaces of `M_k(\Gamma_1(N), \varepsilon)`, where `N` is the modulus of
27
+ `\varepsilon`.
28
+
29
+ These functions mostly call the methods ``dimension_cusp_forms``,
30
+ ``dimension_modular_forms`` and so on of the corresponding congruence subgroup
31
+ classes.
32
+
33
+ REFERENCES:
34
+
35
+ .. [CO1977] \H. Cohen, J. Oesterlé, *Dimensions des espaces de formes
36
+ modulaires*, p. 69-78 in Modular functions in one variable VI.
37
+ Lecture Notes in Math. 627, Springer-Verlag, NewYork, 1977.
38
+ """
39
+ # ****************************************************************************
40
+ # Copyright (C) 2004-2008 William Stein <wstein@gmail.com>
41
+ #
42
+ # This program is free software: you can redistribute it and/or modify
43
+ # it under the terms of the GNU General Public License as published by
44
+ # the Free Software Foundation, either version 2 of the License, or
45
+ # (at your option) any later version.
46
+ # https://www.gnu.org/licenses/
47
+ # ****************************************************************************
48
+
49
+ from sage.arith.misc import factor, is_prime, valuation
50
+ from sage.misc.misc_c import prod
51
+ from sage.modular.arithgroup.congroup_gamma0 import Gamma0_constructor as Gamma0
52
+ from sage.modular.arithgroup.congroup_gamma1 import Gamma1_constructor as Gamma1
53
+ from sage.modular.arithgroup.congroup_gammaH import GammaH_class
54
+ from sage.modular.arithgroup.congroup_generic import ArithmeticSubgroup
55
+ from sage.rings.finite_rings.integer_mod import Mod
56
+ from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
57
+ from sage.rings.integer import Integer
58
+ from sage.rings.rational_field import frac
59
+
60
+ from sage.modular import dirichlet
61
+
62
+ ##########################################################################
63
+ # Helper functions for calculating dimensions of spaces of modular forms
64
+ ##########################################################################
65
+
66
+
67
+ def eisen(p):
68
+ """
69
+ Return the Eisenstein number `n` which is the numerator of `(p-1)/12`.
70
+
71
+ INPUT:
72
+
73
+ - ``p`` -- a prime
74
+
75
+ OUTPUT: integer
76
+
77
+ EXAMPLES::
78
+
79
+ sage: [(p, sage.modular.dims.eisen(p)) for p in prime_range(24)]
80
+ [(2, 1), (3, 1), (5, 1), (7, 1), (11, 5), (13, 1), (17, 4),
81
+ (19, 3), (23, 11)]
82
+ """
83
+ if not is_prime(p):
84
+ raise ValueError("p must be prime")
85
+ return frac(p - 1, 12).numerator()
86
+
87
+ ##########################################################################
88
+ # Formula of Cohen-Oesterlé for dim S_k(Gamma_1(N),eps). REF:
89
+ # Springer Lecture notes in math, volume 627, pages 69--78. The
90
+ # functions CO_delta and CO_nu, which were first written by Kevin
91
+ # Buzzard, are used only by the function CohenOesterle.
92
+ ##########################################################################
93
+
94
+
95
+ def CO_delta(r, p, N, eps):
96
+ r"""
97
+ This is used as an intermediate value in computations related to
98
+ the paper of Cohen-Oesterlé.
99
+
100
+ INPUT:
101
+
102
+ - ``r`` -- positive integer
103
+
104
+ - ``p`` -- a prime
105
+
106
+ - ``N`` -- positive integer
107
+
108
+ - ``eps`` -- character
109
+
110
+ OUTPUT: element of the base ring of the character
111
+
112
+ EXAMPLES::
113
+
114
+ sage: G.<eps> = DirichletGroup(7)
115
+ sage: sage.modular.dims.CO_delta(1,5,7,eps^3)
116
+ 2
117
+ """
118
+ K = eps.base_ring()
119
+ if p % 4 == 3:
120
+ return K.zero()
121
+ if p == 2:
122
+ if r == 1:
123
+ return K.one()
124
+ return K.zero()
125
+ # interesting case: p=1(mod 4).
126
+ # omega is a primitive 4th root of unity mod p.
127
+ omega = (IntegerModRing(p).unit_gens()[0])**((p - 1) // 4)
128
+ # this n is within a p-power root of a "local" 4th root of 1 modulo p.
129
+ n = Mod(int(omega.crt(Mod(1, N // (p**r)))), N)
130
+ n = n**(p**(r - 1)) # this is correct now
131
+ t = eps(n)
132
+ if t == K.one():
133
+ return K(2)
134
+ if t == -K.one():
135
+ return K(-2)
136
+ return K.zero()
137
+
138
+
139
+ def CO_nu(r, p, N, eps):
140
+ r"""
141
+ This is used as an intermediate value in computations related to
142
+ the paper of Cohen-Oesterlé.
143
+
144
+ INPUT:
145
+
146
+ - ``r`` -- positive integer
147
+
148
+ - ``p`` -- a prime
149
+
150
+ - ``N`` -- positive integer
151
+
152
+ - ``eps`` -- character
153
+
154
+ OUTPUT: element of the base ring of the character
155
+
156
+ EXAMPLES::
157
+
158
+ sage: G.<eps> = DirichletGroup(7)
159
+ sage: G.<eps> = DirichletGroup(7)
160
+ sage: sage.modular.dims.CO_nu(1,7,7,eps)
161
+ -1
162
+ """
163
+ K = eps.base_ring()
164
+ if p % 3 == 2:
165
+ return K.zero()
166
+ if p == 3:
167
+ if r == 1:
168
+ return K.one()
169
+ return K.zero()
170
+ # interesting case: p=1(mod 3)
171
+ # omega is a cube root of 1 mod p.
172
+ omega = (IntegerModRing(p).unit_gens()[0])**((p - 1) // 3)
173
+ n = Mod(omega.crt(Mod(1, N // (p**r))), N)
174
+ # within a p-power root of a "local" cube root of 1 mod p.
175
+ n = n**(p**(r - 1)) # this is right now
176
+ t = eps(n)
177
+ if t == K.one():
178
+ return K(2)
179
+ return -K.one()
180
+
181
+
182
+ def CohenOesterle(eps, k):
183
+ r"""
184
+ Compute the Cohen-Oesterlé function associate to eps, `k`.
185
+
186
+ This is a summand in the formula for the dimension of the space of
187
+ cusp forms of weight `2` with character `\varepsilon`.
188
+
189
+ INPUT:
190
+
191
+ - ``eps`` -- Dirichlet character
192
+
193
+ - ``k`` -- integer
194
+
195
+ OUTPUT: element of the base ring of eps
196
+
197
+ EXAMPLES::
198
+
199
+ sage: G.<eps> = DirichletGroup(7)
200
+ sage: sage.modular.dims.CohenOesterle(eps, 2)
201
+ -2/3
202
+ sage: sage.modular.dims.CohenOesterle(eps, 4)
203
+ -1
204
+ """
205
+ N = eps.modulus()
206
+ facN = factor(N)
207
+ f = eps.conductor()
208
+ gamma_k = 0
209
+ if k % 4 == 2:
210
+ gamma_k = frac(-1, 4)
211
+ elif k % 4 == 0:
212
+ gamma_k = frac(1, 4)
213
+ mu_k = 0
214
+ if k % 3 == 2:
215
+ mu_k = frac(-1, 3)
216
+ elif k % 3 == 0:
217
+ mu_k = frac(1, 3)
218
+
219
+ def _lambda(r, s, p):
220
+ """
221
+ Used internally by the CohenOesterle function.
222
+
223
+ INPUT:
224
+
225
+ - ``r``, ``s``, ``p`` -- integers
226
+
227
+ OUTPUT: integer
228
+
229
+ EXAMPLES: (indirect doctest)
230
+
231
+ ::
232
+
233
+ sage: # needs sage.rings.number_field
234
+ sage: K = CyclotomicField(3)
235
+ sage: eps = DirichletGroup(7*43, K).0^2
236
+ sage: sage.modular.dims.CohenOesterle(eps, 2)
237
+ -4/3
238
+ """
239
+ if 2 * s <= r:
240
+ if r % 2 == 0:
241
+ return p**(r // 2) + p**((r // 2) - 1)
242
+ return 2 * p**((r - 1) // 2)
243
+ return 2 * p**(r - s)
244
+
245
+ K = eps.base_ring()
246
+ return K(frac(-1, 2) *
247
+ prod(_lambda(r, valuation(f, p), p) for p, r in facN) +
248
+ gamma_k * K.prod(CO_delta(r, p, N, eps) for p, r in facN) +
249
+ mu_k * K.prod(CO_nu(r, p, N, eps) for p, r in facN))
250
+
251
+
252
+ ####################################################################
253
+ # Functions exported to the global namespace.
254
+ # These have very flexible inputs.
255
+ ####################################################################
256
+
257
+ def dimension_new_cusp_forms(X, k=2, p=0):
258
+ """
259
+ Return the dimension of the new (or `p`-new) subspace of
260
+ cusp forms for the character or group `X`.
261
+
262
+ INPUT:
263
+
264
+ - ``X`` -- integer, congruence subgroup or Dirichlet
265
+ character
266
+
267
+ - ``k`` -- weight (integer)
268
+
269
+ - ``p`` -- 0 or a prime
270
+
271
+ EXAMPLES::
272
+
273
+ sage: from sage.modular.dims import dimension_new_cusp_forms
274
+ sage: dimension_new_cusp_forms(100,2)
275
+ 1
276
+
277
+ sage: dimension_new_cusp_forms(Gamma0(100),2)
278
+ 1
279
+ sage: dimension_new_cusp_forms(Gamma0(100),4)
280
+ 5
281
+
282
+ sage: dimension_new_cusp_forms(Gamma1(100),2)
283
+ 141
284
+ sage: dimension_new_cusp_forms(Gamma1(100),4)
285
+ 463
286
+
287
+ sage: dimension_new_cusp_forms(DirichletGroup(100).1^2,2)
288
+ 2
289
+ sage: dimension_new_cusp_forms(DirichletGroup(100).1^2,4)
290
+ 8
291
+
292
+ sage: sum(dimension_new_cusp_forms(e,3) for e in DirichletGroup(30))
293
+ 12
294
+ sage: dimension_new_cusp_forms(Gamma1(30),3)
295
+ 12
296
+
297
+ Check that :issue:`12640` is fixed::
298
+
299
+ sage: dimension_new_cusp_forms(DirichletGroup(1)(1), 12)
300
+ 1
301
+ sage: dimension_new_cusp_forms(DirichletGroup(2)(1), 24)
302
+ 1
303
+ """
304
+ if isinstance(X, GammaH_class):
305
+ return X.dimension_new_cusp_forms(k, p=p)
306
+ elif isinstance(X, dirichlet.DirichletCharacter):
307
+ N = X.modulus()
308
+ if N <= 2:
309
+ return Gamma0(N).dimension_new_cusp_forms(k, p=p)
310
+ else:
311
+ # Gamma1(N) for N<=2 just returns Gamma0(N), which has no
312
+ # eps parameter. See trac #12640.
313
+ return Gamma1(N).dimension_new_cusp_forms(k, eps=X, p=p)
314
+ elif isinstance(X, (int, Integer)):
315
+ return Gamma0(X).dimension_new_cusp_forms(k, p=p)
316
+ raise TypeError(f"X (={X}) must be an integer, a Dirichlet character or a congruence subgroup of type Gamma0, Gamma1 or GammaH")
317
+
318
+
319
+ def dimension_cusp_forms(X, k=2):
320
+ r"""
321
+ The dimension of the space of cusp forms for the given congruence
322
+ subgroup or Dirichlet character.
323
+
324
+ INPUT:
325
+
326
+ - ``X`` -- congruence subgroup or Dirichlet character
327
+ or integer
328
+
329
+ - ``k`` -- weight (integer)
330
+
331
+ EXAMPLES::
332
+
333
+ sage: from sage.modular.dims import dimension_cusp_forms
334
+ sage: dimension_cusp_forms(5,4)
335
+ 1
336
+
337
+ sage: dimension_cusp_forms(Gamma0(11),2)
338
+ 1
339
+ sage: dimension_cusp_forms(Gamma1(13),2)
340
+ 2
341
+
342
+ sage: dimension_cusp_forms(DirichletGroup(13).0^2,2)
343
+ 1
344
+ sage: dimension_cusp_forms(DirichletGroup(13).0,3)
345
+ 1
346
+
347
+ sage: dimension_cusp_forms(Gamma0(11),2)
348
+ 1
349
+ sage: dimension_cusp_forms(Gamma0(11),0)
350
+ 0
351
+ sage: dimension_cusp_forms(Gamma0(1),12)
352
+ 1
353
+ sage: dimension_cusp_forms(Gamma0(1),2)
354
+ 0
355
+ sage: dimension_cusp_forms(Gamma0(1),4)
356
+ 0
357
+
358
+ sage: dimension_cusp_forms(Gamma0(389),2)
359
+ 32
360
+ sage: dimension_cusp_forms(Gamma0(389),4)
361
+ 97
362
+ sage: dimension_cusp_forms(Gamma0(2005),2)
363
+ 199
364
+ sage: dimension_cusp_forms(Gamma0(11),1)
365
+ 0
366
+
367
+ sage: dimension_cusp_forms(Gamma1(11),2)
368
+ 1
369
+ sage: dimension_cusp_forms(Gamma1(1),12)
370
+ 1
371
+ sage: dimension_cusp_forms(Gamma1(1),2)
372
+ 0
373
+ sage: dimension_cusp_forms(Gamma1(1),4)
374
+ 0
375
+
376
+ sage: dimension_cusp_forms(Gamma1(389),2)
377
+ 6112
378
+ sage: dimension_cusp_forms(Gamma1(389),4)
379
+ 18721
380
+ sage: dimension_cusp_forms(Gamma1(2005),2)
381
+ 159201
382
+
383
+ sage: dimension_cusp_forms(Gamma1(11),1)
384
+ 0
385
+
386
+ sage: e = DirichletGroup(13).0
387
+ sage: e.order()
388
+ 12
389
+ sage: dimension_cusp_forms(e,2)
390
+ 0
391
+ sage: dimension_cusp_forms(e^2,2)
392
+ 1
393
+
394
+ Check that :issue:`12640` is fixed::
395
+
396
+ sage: dimension_cusp_forms(DirichletGroup(1)(1), 12)
397
+ 1
398
+ sage: dimension_cusp_forms(DirichletGroup(2)(1), 24)
399
+ 5
400
+ """
401
+ if isinstance(X, dirichlet.DirichletCharacter):
402
+ N = X.modulus()
403
+ if N <= 2:
404
+ return Gamma0(N).dimension_cusp_forms(k)
405
+ else:
406
+ return Gamma1(N).dimension_cusp_forms(k, X)
407
+ elif isinstance(X, ArithmeticSubgroup):
408
+ return X.dimension_cusp_forms(k)
409
+ elif isinstance(X, (int, Integer)):
410
+ return Gamma0(X).dimension_cusp_forms(k)
411
+ raise TypeError("argument 1 must be a Dirichlet character, an integer "
412
+ "or a finite index subgroup of SL2Z")
413
+
414
+
415
+ def dimension_eis(X, k=2):
416
+ """
417
+ The dimension of the space of Eisenstein series for the given
418
+ congruence subgroup.
419
+
420
+ INPUT:
421
+
422
+ - ``X`` -- congruence subgroup or Dirichlet character
423
+ or integer
424
+
425
+ - ``k`` -- integer; weight
426
+
427
+ EXAMPLES::
428
+
429
+ sage: from sage.modular.dims import dimension_eis
430
+ sage: dimension_eis(5,4)
431
+ 2
432
+
433
+ sage: dimension_eis(Gamma0(11),2)
434
+ 1
435
+ sage: dimension_eis(Gamma1(13),2)
436
+ 11
437
+ sage: dimension_eis(Gamma1(2006),2)
438
+ 3711
439
+
440
+ sage: e = DirichletGroup(13).0
441
+ sage: e.order()
442
+ 12
443
+ sage: dimension_eis(e,2)
444
+ 0
445
+ sage: dimension_eis(e^2,2)
446
+ 2
447
+
448
+ sage: e = DirichletGroup(13).0
449
+ sage: e.order()
450
+ 12
451
+ sage: dimension_eis(e,2)
452
+ 0
453
+ sage: dimension_eis(e^2,2)
454
+ 2
455
+ sage: dimension_eis(e,13)
456
+ 2
457
+
458
+ sage: G = DirichletGroup(20)
459
+ sage: dimension_eis(G.0,3)
460
+ 4
461
+ sage: dimension_eis(G.1,3)
462
+ 6
463
+ sage: dimension_eis(G.1^2,2)
464
+ 6
465
+
466
+ sage: G = DirichletGroup(200)
467
+ sage: e = prod(G.gens(), G(1))
468
+ sage: e.conductor()
469
+ 200
470
+ sage: dimension_eis(e,2)
471
+ 4
472
+
473
+ sage: from sage.modular.dims import dimension_modular_forms
474
+ sage: dimension_modular_forms(Gamma1(4), 11)
475
+ 6
476
+ """
477
+ if isinstance(X, ArithmeticSubgroup):
478
+ return X.dimension_eis(k)
479
+ elif isinstance(X, dirichlet.DirichletCharacter):
480
+ return Gamma1(X.modulus()).dimension_eis(k, X)
481
+ elif isinstance(X, (int, Integer)):
482
+ return Gamma0(X).dimension_eis(k)
483
+ raise TypeError(f"argument in dimension_eis must be an integer, a Dirichlet character, or a finite index subgroup of SL2Z (got {X})")
484
+
485
+
486
+ def dimension_modular_forms(X, k=2):
487
+ r"""
488
+ The dimension of the space of cusp forms for the given congruence
489
+ subgroup (either `\Gamma_0(N)`, `\Gamma_1(N)`, or
490
+ `\Gamma_H(N)`) or Dirichlet character.
491
+
492
+ INPUT:
493
+
494
+ - ``X`` -- congruence subgroup or Dirichlet character
495
+
496
+ - ``k`` -- integer; weight
497
+
498
+ EXAMPLES::
499
+
500
+ sage: from sage.modular.dims import dimension_modular_forms
501
+ sage: dimension_modular_forms(Gamma0(11),2)
502
+ 2
503
+ sage: dimension_modular_forms(Gamma0(11),0)
504
+ 1
505
+ sage: dimension_modular_forms(Gamma1(13),2)
506
+ 13
507
+ sage: dimension_modular_forms(GammaH(11, [10]), 2)
508
+ 10
509
+ sage: dimension_modular_forms(GammaH(11, [10]))
510
+ 10
511
+ sage: dimension_modular_forms(GammaH(11, [10]), 4)
512
+ 20
513
+ sage: e = DirichletGroup(20).1
514
+ sage: dimension_modular_forms(e,3)
515
+ 9
516
+ sage: from sage.modular.dims import dimension_cusp_forms
517
+ sage: dimension_cusp_forms(e,3)
518
+ 3
519
+ sage: from sage.modular.dims import dimension_eis
520
+ sage: dimension_eis(e,3)
521
+ 6
522
+ sage: dimension_modular_forms(11,2)
523
+ 2
524
+ """
525
+ if isinstance(X, (int, Integer)):
526
+ return Gamma0(X).dimension_modular_forms(k)
527
+ elif isinstance(X, ArithmeticSubgroup):
528
+ return X.dimension_modular_forms(k)
529
+ elif isinstance(X, dirichlet.DirichletCharacter):
530
+ return Gamma1(X.modulus()).dimension_modular_forms(k, eps=X)
531
+ else:
532
+ raise TypeError("argument 1 must be an integer, a Dirichlet character "
533
+ "or an arithmetic subgroup")
534
+
535
+
536
+ def sturm_bound(level, weight=2):
537
+ r"""
538
+ Return the Sturm bound for modular forms with given level and weight.
539
+
540
+ For more details, see the documentation for the ``sturm_bound`` method
541
+ of :class:`sage.modular.arithgroup.CongruenceSubgroup` objects.
542
+
543
+ INPUT:
544
+
545
+ - ``level`` -- integer (interpreted as a level for `\Gamma0`) or a
546
+ congruence subgroup
547
+
548
+ - ``weight`` -- integer `\geq 2` (default: 2)
549
+
550
+ EXAMPLES::
551
+
552
+ sage: from sage.modular.dims import sturm_bound
553
+ sage: sturm_bound(11,2)
554
+ 2
555
+ sage: sturm_bound(389,2)
556
+ 65
557
+ sage: sturm_bound(1,12)
558
+ 1
559
+ sage: sturm_bound(100,2)
560
+ 30
561
+ sage: sturm_bound(1,36)
562
+ 3
563
+ sage: sturm_bound(11)
564
+ 2
565
+ """
566
+ if isinstance(level, ArithmeticSubgroup):
567
+ if level.is_congruence():
568
+ return level.sturm_bound(weight)
569
+ raise ValueError("no Sturm bound defined for noncongruence subgroups")
570
+ if isinstance(level, (int, Integer)):
571
+ return Gamma0(level).sturm_bound(weight)