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,659 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.pari
3
+ r"""
4
+ Congruence subgroup `\Gamma_1(N)`
5
+ """
6
+
7
+ # ****************************************************************************
8
+ # This program is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ # https://www.gnu.org/licenses/
13
+ # ****************************************************************************
14
+
15
+
16
+ from sage.arith.misc import divisors, moebius
17
+ from sage.arith.misc import euler_phi as phi
18
+ from sage.misc.cachefunc import cached_method
19
+ from sage.misc.misc_c import prod
20
+ from sage.modular.arithgroup.congroup_gammaH import (
21
+ GammaH_class,
22
+ GammaH_constructor,
23
+ )
24
+ from sage.modular.dirichlet import DirichletGroup
25
+ from sage.rings.integer_ring import ZZ
26
+
27
+
28
+ def is_Gamma1(x):
29
+ """
30
+ Return ``True`` if x is a congruence subgroup of type Gamma1.
31
+
32
+ EXAMPLES::
33
+
34
+ sage: from sage.modular.arithgroup.congroup_gamma1 import is_Gamma1
35
+ sage: is_Gamma1(SL2Z)
36
+ doctest:warning...
37
+ DeprecationWarning: The function is_Gamma1 is deprecated; use 'isinstance(..., Gamma1_class)' instead.
38
+ See https://github.com/sagemath/sage/issues/38035 for details.
39
+ False
40
+ sage: is_Gamma1(Gamma1(13))
41
+ True
42
+ sage: is_Gamma1(Gamma0(6))
43
+ False
44
+ sage: is_Gamma1(GammaH(12, [])) # trick question!
45
+ True
46
+ sage: is_Gamma1(GammaH(12, [5]))
47
+ False
48
+ """
49
+ from sage.misc.superseded import deprecation
50
+ deprecation(38035, "The function is_Gamma1 is deprecated; use 'isinstance(..., Gamma1_class)' instead.")
51
+ # from congroup_sl2z import is_SL2Z
52
+ # return (isinstance(x, Gamma1_class) or is_SL2Z(x))
53
+ return isinstance(x, Gamma1_class)
54
+
55
+
56
+ _gamma1_cache = {}
57
+
58
+
59
+ def Gamma1_constructor(N):
60
+ r"""
61
+ Return the congruence subgroup `\Gamma_1(N)`.
62
+
63
+ EXAMPLES::
64
+
65
+ sage: Gamma1(5) # indirect doctest
66
+ Congruence Subgroup Gamma1(5)
67
+ sage: G = Gamma1(23)
68
+ sage: G is Gamma1(23)
69
+ True
70
+ sage: G is GammaH(23, [1])
71
+ True
72
+ sage: TestSuite(G).run()
73
+ sage: G is loads(dumps(G))
74
+ True
75
+ """
76
+ if N == 1 or N == 2:
77
+ from .congroup_gamma0 import (
78
+ Gamma0_constructor,
79
+ )
80
+ return Gamma0_constructor(N)
81
+ try:
82
+ return _gamma1_cache[N]
83
+ except KeyError:
84
+ _gamma1_cache[N] = Gamma1_class(N)
85
+ return _gamma1_cache[N]
86
+
87
+
88
+ class Gamma1_class(GammaH_class):
89
+ r"""
90
+ The congruence subgroup `\Gamma_1(N)`.
91
+
92
+ TESTS::
93
+
94
+ sage: [Gamma1(n).genus() for n in prime_range(2,100)]
95
+ [0, 0, 0, 0, 1, 2, 5, 7, 12, 22, 26, 40, 51, 57, 70, 92, 117, 126, 155, 176, 187, 222, 247, 287, 345]
96
+ sage: [Gamma1(n).index() for n in [1..10]]
97
+ [1, 3, 8, 12, 24, 24, 48, 48, 72, 72]
98
+
99
+ sage: [Gamma1(n).dimension_cusp_forms() for n in [1..20]]
100
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 1, 2, 5, 2, 7, 3]
101
+ sage: [Gamma1(n).dimension_cusp_forms(1) for n in [1..20]]
102
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
103
+ sage: [Gamma1(4).dimension_cusp_forms(k) for k in [1..20]]
104
+ [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8]
105
+
106
+ sage: Gamma1(23).dimension_cusp_forms(1)
107
+ 1
108
+ """
109
+
110
+ def __init__(self, level):
111
+ r"""
112
+ The congruence subgroup `\Gamma_1(N)`.
113
+
114
+ EXAMPLES::
115
+
116
+ sage: G = Gamma1(11); G
117
+ Congruence Subgroup Gamma1(11)
118
+ sage: loads(G.dumps()) == G
119
+ True
120
+ """
121
+ GammaH_class.__init__(self, level, [])
122
+
123
+ def _repr_(self):
124
+ """
125
+ Return the string representation of ``self``.
126
+
127
+ EXAMPLES::
128
+
129
+ sage: Gamma1(133)._repr_()
130
+ 'Congruence Subgroup Gamma1(133)'
131
+ """
132
+ return "Congruence Subgroup Gamma1(%s)" % self.level()
133
+
134
+ def __reduce__(self):
135
+ """
136
+ Used for pickling ``self``.
137
+
138
+ EXAMPLES::
139
+
140
+ sage: Gamma1(82).__reduce__()
141
+ (<function Gamma1_constructor at ...>, (82,))
142
+ """
143
+ return Gamma1_constructor, (self.level(),)
144
+
145
+ def _latex_(self) -> str:
146
+ r"""
147
+ Return the \LaTeX representation of ``self``.
148
+
149
+ EXAMPLES::
150
+
151
+ sage: Gamma1(3)._latex_()
152
+ '\\Gamma_1(3)'
153
+ sage: latex(Gamma1(3))
154
+ \Gamma_1(3)
155
+ """
156
+ return "\\Gamma_1(%s)" % self.level()
157
+
158
+ def is_even(self) -> bool:
159
+ """
160
+ Return ``True`` precisely if this subgroup contains the matrix -1.
161
+
162
+ EXAMPLES::
163
+
164
+ sage: Gamma1(1).is_even()
165
+ True
166
+ sage: Gamma1(2).is_even()
167
+ True
168
+ sage: Gamma1(15).is_even()
169
+ False
170
+ """
171
+ return self.level() in [1, 2]
172
+
173
+ def is_subgroup(self, right) -> bool:
174
+ """
175
+ Return ``True`` if ``self`` is a subgroup of ``right``.
176
+
177
+ EXAMPLES::
178
+
179
+ sage: Gamma1(3).is_subgroup(SL2Z)
180
+ True
181
+ sage: Gamma1(3).is_subgroup(Gamma1(5))
182
+ False
183
+ sage: Gamma1(3).is_subgroup(Gamma1(6))
184
+ False
185
+ sage: Gamma1(6).is_subgroup(Gamma1(3))
186
+ True
187
+ sage: Gamma1(6).is_subgroup(Gamma0(2))
188
+ True
189
+ sage: Gamma1(80).is_subgroup(GammaH(40, []))
190
+ True
191
+ sage: Gamma1(80).is_subgroup(GammaH(40, [21]))
192
+ True
193
+ """
194
+ if right.level() == 1:
195
+ return True
196
+ if isinstance(right, GammaH_class):
197
+ return self.level() % right.level() == 0
198
+ else:
199
+ raise NotImplementedError
200
+
201
+ @cached_method
202
+ def generators(self, algorithm='farey'):
203
+ r"""
204
+ Return generators for this congruence subgroup. The result is cached.
205
+
206
+ INPUT:
207
+
208
+ - ``algorithm`` -- string; either ``'farey'`` (default) or
209
+ ``'todd-coxeter'``
210
+
211
+ If ``algorithm`` is set to ``'farey'``, then the generators will be
212
+ calculated using Farey symbols, which will always return a *minimal*
213
+ generating set. See :mod:`~sage.modular.arithgroup.farey_symbol` for
214
+ more information.
215
+
216
+ If ``algorithm`` is set to ``'todd-coxeter'``, a simpler algorithm
217
+ based on Todd-Coxeter enumeration will be used. This tends to return
218
+ far larger sets of generators.
219
+
220
+ EXAMPLES::
221
+
222
+ sage: Gamma1(3).generators()
223
+ [
224
+ [1 1] [ 1 -1]
225
+ [0 1], [ 3 -2]
226
+ ]
227
+ sage: Gamma1(3).generators(algorithm='todd-coxeter')
228
+ [
229
+ [1 1] [-2 1] [1 1] [ 1 -1] [1 0] [1 1] [-5 2] [ 1 0]
230
+ [0 1], [-3 1], [0 1], [ 0 1], [3 1], [0 1], [12 -5], [-3 1],
231
+ <BLANKLINE>
232
+ [ 1 -1] [ 1 -1] [ 4 -1] [ -5 3]
233
+ [ 3 -2], [ 3 -2], [ 9 -2], [-12 7]
234
+ ]
235
+ """
236
+ if algorithm == "farey":
237
+ return self.farey_symbol().generators()
238
+ elif algorithm == "todd-coxeter":
239
+ from sage.modular.modsym.g1list import G1list
240
+
241
+ from .congroup import generators_helper
242
+ level = self.level()
243
+ gen_list = generators_helper(G1list(level), level)
244
+ return [self(g, check=False) for g in gen_list]
245
+ else:
246
+ raise ValueError("Unknown algorithm '%s' (should be either 'farey' or 'todd-coxeter')" % algorithm)
247
+
248
+ def _contains_sl2(self, a, b, c, d):
249
+ r"""
250
+ Test whether x is an element of this group.
251
+
252
+ EXAMPLES::
253
+
254
+ sage: G = Gamma1(5)
255
+ sage: [1, 0, -10, 1] in G
256
+ True
257
+ sage: matrix(ZZ, 2, [6, 1, 5, 1]) in G
258
+ True
259
+ sage: SL2Z.0 in G
260
+ False
261
+ sage: G([1, 1, 6, 7]) # indirect doctest
262
+ Traceback (most recent call last):
263
+ ...
264
+ TypeError: matrix [1 1]
265
+ [6 7] is not an element of Congruence Subgroup Gamma1(5)
266
+ """
267
+ N = self.level()
268
+ # don't need to check d == 1 mod N as this is automatic from det
269
+ return ((a % N == 1) and (c % N == 0))
270
+
271
+ def nu2(self):
272
+ r"""
273
+ Calculate the number of orbits of elliptic points of order 2 for this
274
+ subgroup `\Gamma_1(N)`. This is known to be 0 if N > 2.
275
+
276
+ EXAMPLES::
277
+
278
+ sage: Gamma1(2).nu2()
279
+ 1
280
+ sage: Gamma1(457).nu2()
281
+ 0
282
+ sage: [Gamma1(n).nu2() for n in [1..16]]
283
+ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
284
+ """
285
+ N = self.level()
286
+ if N > 2:
287
+ return 0
288
+ elif N == 2 or N == 1:
289
+ return 1
290
+
291
+ def nu3(self):
292
+ r"""
293
+ Calculate the number of orbits of elliptic points of order 3 for this
294
+ subgroup `\Gamma_1(N)`. This is known to be 0 if N > 3.
295
+
296
+ EXAMPLES::
297
+
298
+ sage: Gamma1(2).nu3()
299
+ 0
300
+ sage: Gamma1(3).nu3()
301
+ 1
302
+ sage: Gamma1(457).nu3()
303
+ 0
304
+ sage: [Gamma1(n).nu3() for n in [1..10]]
305
+ [1, 0, 1, 0, 0, 0, 0, 0, 0, 0]
306
+ """
307
+ N = self.level()
308
+ if N > 3 or N == 2:
309
+ return 0
310
+ else:
311
+ return 1
312
+
313
+ def ncusps(self):
314
+ r"""
315
+ Return the number of cusps of this subgroup `\Gamma_1(N)`.
316
+
317
+ EXAMPLES::
318
+
319
+ sage: [Gamma1(n).ncusps() for n in [1..15]]
320
+ [1, 2, 2, 3, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 16]
321
+ sage: [Gamma1(n).ncusps() for n in prime_range(2, 100)]
322
+ [2, 2, 4, 6, 10, 12, 16, 18, 22, 28, 30, 36, 40, 42, 46, 52, 58, 60, 66, 70, 72, 78, 82, 88, 96]
323
+ """
324
+ n = self.level()
325
+ if n <= 4:
326
+ return [None, 1, 2, 2, 3][n]
327
+ return ZZ(sum([phi(d)*phi(n/d)/ZZ(2) for d in n.divisors()]))
328
+
329
+ def index(self):
330
+ r"""
331
+ Return the index of ``self`` in the full modular group. This is given by the formula
332
+
333
+ .. MATH::
334
+
335
+ N^2 \prod_{\substack{p \mid N \\ \text{$p$ prime}}} \left( 1 - \frac{1}{p^2}\right).
336
+
337
+ EXAMPLES::
338
+
339
+ sage: Gamma1(180).index()
340
+ 20736
341
+ sage: [Gamma1(n).projective_index() for n in [1..16]]
342
+ [1, 3, 4, 6, 12, 12, 24, 24, 36, 36, 60, 48, 84, 72, 96, 96]
343
+ """
344
+ return prod([p**(2*e) - p**(2*e-2) for (p,e) in self.level().factor()])
345
+
346
+ ##################################################################################
347
+ # Dimension formulas for Gamma1, accepting a Dirichlet character as an argument. #
348
+ ##################################################################################
349
+
350
+ def dimension_modular_forms(self, k=2, eps=None, algorithm='CohenOesterle'):
351
+ r"""
352
+ Return the dimension of the space of modular forms for ``self``, or the
353
+ dimension of the subspace corresponding to the given character if one
354
+ is supplied.
355
+
356
+ INPUT:
357
+
358
+ - ``k`` -- integer (default: 2); the weight
359
+
360
+ - ``eps`` -- either ``None`` or a Dirichlet character modulo N, where N is
361
+ the level of this group. If this is ``None``, then the dimension of the
362
+ whole space is returned; otherwise, the dimension of the subspace of
363
+ forms of character eps.
364
+
365
+ - ``algorithm`` -- either ``'CohenOesterle'`` (the default) or
366
+ ``'Quer'``. This specifies the method to use in the case of
367
+ nontrivial character: either the Cohen--Oesterle formula as described
368
+ in Stein's book, or by Möbius inversion using the subgroups GammaH (a
369
+ method due to Jordi Quer).
370
+
371
+ EXAMPLES::
372
+
373
+ sage: # needs sage.rings.number_field
374
+ sage: K = CyclotomicField(3)
375
+ sage: eps = DirichletGroup(7*43,K).0^2
376
+ sage: G = Gamma1(7*43)
377
+ sage: G.dimension_modular_forms(2, eps)
378
+ 32
379
+ sage: G.dimension_modular_forms(2, eps, algorithm='Quer')
380
+ 32
381
+
382
+ TESTS:
383
+
384
+ Check that :issue:`18436` is fixed::
385
+
386
+ sage: # needs sage.rings.number_field
387
+ sage: x = polygen(ZZ, 'x')
388
+ sage: K.<a> = NumberField(x^2 + x + 1)
389
+ sage: G = DirichletGroup(13, base_ring=K)
390
+ sage: Gamma1(13).dimension_modular_forms(2, G[1])
391
+ 3
392
+ sage: Gamma1(13).dimension_modular_forms(2, G[1], algorithm='Quer')
393
+ 3
394
+ sage: Gamma1(39).dimension_modular_forms(2, G[1])
395
+ 7
396
+ sage: Gamma1(39).dimension_modular_forms(2, G[1], algorithm='Quer')
397
+ 7
398
+ """
399
+ return self.dimension_cusp_forms(k, eps, algorithm) + self.dimension_eis(k, eps, algorithm)
400
+
401
+ def dimension_cusp_forms(self, k=2, eps=None, algorithm='CohenOesterle'):
402
+ r"""
403
+ Return the dimension of the space of cusp forms for ``self``, or the
404
+ dimension of the subspace corresponding to the given character if one
405
+ is supplied.
406
+
407
+ INPUT:
408
+
409
+ - ``k`` -- integer (default: 2); the weight
410
+
411
+ - ``eps`` -- either ``None`` or a Dirichlet character modulo N, where N is
412
+ the level of this group. If this is ``None``, then the dimension of the
413
+ whole space is returned; otherwise, the dimension of the subspace of
414
+ forms of character eps.
415
+
416
+ - ``algorithm`` -- either ``'CohenOesterle'`` (the default) or
417
+ ``'Quer'``. This specifies the method to use in the case of nontrivial
418
+ character: either the Cohen--Oesterle formula as described in Stein's
419
+ book, or by Möbius inversion using the subgroups GammaH (a method due
420
+ to Jordi Quer). Ignored for weight 1.
421
+
422
+ EXAMPLES:
423
+
424
+ We compute the same dimension in two different ways ::
425
+
426
+ sage: # needs sage.rings.number_field
427
+ sage: K = CyclotomicField(3)
428
+ sage: eps = DirichletGroup(7*43,K).0^2
429
+ sage: G = Gamma1(7*43)
430
+
431
+ Via Cohen--Oesterle::
432
+
433
+ sage: Gamma1(7*43).dimension_cusp_forms(2, eps) # needs sage.rings.number_field
434
+ 28
435
+
436
+ Via Quer's method::
437
+
438
+ sage: Gamma1(7*43).dimension_cusp_forms(2, eps, algorithm='Quer') # needs sage.rings.number_field
439
+ 28
440
+
441
+ Some more examples::
442
+
443
+ sage: G.<eps> = DirichletGroup(9)
444
+ sage: [Gamma1(9).dimension_cusp_forms(k, eps) for k in [1..10]]
445
+ [0, 0, 1, 0, 3, 0, 5, 0, 7, 0]
446
+ sage: [Gamma1(9).dimension_cusp_forms(k, eps^2) for k in [1..10]]
447
+ [0, 0, 0, 2, 0, 4, 0, 6, 0, 8]
448
+
449
+ In weight 1, we can sometimes rule out cusp forms existing via
450
+ Riemann-Roch, but if this does not work, we trigger computation of the
451
+ cusp forms space via Schaeffer's algorithm::
452
+
453
+ sage: chi = [u for u in DirichletGroup(40) if u(-1) == -1 and u(21) == 1][0]
454
+ sage: Gamma1(40).dimension_cusp_forms(1, chi)
455
+ 0
456
+ sage: G = DirichletGroup(57); chi = (G.0) * (G.1)^6
457
+ sage: Gamma1(57).dimension_cusp_forms(1, chi)
458
+ 1
459
+ """
460
+ from .all import Gamma0
461
+
462
+ # first deal with special cases
463
+
464
+ if eps is None:
465
+ return GammaH_class.dimension_cusp_forms(self, k)
466
+
467
+ N = self.level()
468
+ K = eps.base_ring()
469
+ eps = DirichletGroup(N, K)(eps)
470
+
471
+ if K.characteristic() != 0:
472
+ raise NotImplementedError('dimension_cusp_forms() is only implemented for rings of characteristic 0')
473
+
474
+ if eps.is_trivial():
475
+ return Gamma0(N).dimension_cusp_forms(k)
476
+
477
+ if (k <= 0) or ((k % 2) == 1 and eps.is_even()) or ((k % 2) == 0 and eps.is_odd()):
478
+ return ZZ(0)
479
+
480
+ if k == 1:
481
+ from sage.modular.modform.weight1 import dimension_wt1_cusp_forms
482
+ return dimension_wt1_cusp_forms(eps)
483
+
484
+ # now the main part
485
+
486
+ if algorithm == "Quer":
487
+ n = eps.order()
488
+ dim = ZZ(0)
489
+ for d in n.divisors():
490
+ G = GammaH_constructor(N,(eps**d).kernel())
491
+ dim = dim + moebius(d)*G.dimension_cusp_forms(k)
492
+ return dim//phi(n)
493
+
494
+ elif algorithm == "CohenOesterle":
495
+ from sage.modular.dims import CohenOesterle
496
+ return ZZ( K(Gamma0(N).index() * (k-1)/ZZ(12)) + CohenOesterle(eps,k) )
497
+
498
+ else: # algorithm not in ["CohenOesterle", "Quer"]:
499
+ raise ValueError("Unrecognised algorithm in dimension_cusp_forms")
500
+
501
+ def dimension_eis(self, k=2, eps=None, algorithm='CohenOesterle'):
502
+ r"""
503
+ Return the dimension of the space of Eisenstein series forms for self,
504
+ or the dimension of the subspace corresponding to the given character
505
+ if one is supplied.
506
+
507
+ INPUT:
508
+
509
+ - ``k`` -- integer (default: 2); the weight
510
+
511
+ - ``eps`` -- either ``None`` or a Dirichlet character modulo N, where N is
512
+ the level of this group. If this is ``None``, then the dimension of the
513
+ whole space is returned; otherwise, the dimension of the subspace of
514
+ Eisenstein series of character eps.
515
+
516
+ - ``algorithm`` -- either ``'CohenOesterle'`` (the default) or
517
+ ``'Quer'``. This specifies the method to use in the case of nontrivial
518
+ character: either the Cohen--Oesterle formula as described in Stein's
519
+ book, or by Möbius inversion using the subgroups GammaH (a method due
520
+ to Jordi Quer).
521
+
522
+ AUTHORS:
523
+
524
+ - William Stein - Cohen--Oesterle algorithm
525
+
526
+ - Jordi Quer - algorithm based on GammaH subgroups
527
+
528
+ - David Loeffler (2009) - code refactoring
529
+
530
+ EXAMPLES:
531
+
532
+ The following two computations use different algorithms::
533
+
534
+ sage: [Gamma1(36).dimension_eis(1,eps) for eps in DirichletGroup(36)]
535
+ [0, 4, 3, 0, 0, 2, 6, 0, 0, 2, 3, 0]
536
+ sage: [Gamma1(36).dimension_eis(1,eps,algorithm='Quer') for eps in DirichletGroup(36)]
537
+ [0, 4, 3, 0, 0, 2, 6, 0, 0, 2, 3, 0]
538
+
539
+ So do these::
540
+
541
+ sage: [Gamma1(48).dimension_eis(3,eps) for eps in DirichletGroup(48)]
542
+ [0, 12, 0, 4, 0, 8, 0, 4, 12, 0, 4, 0, 8, 0, 4, 0]
543
+ sage: [Gamma1(48).dimension_eis(3,eps,algorithm='Quer') for eps in DirichletGroup(48)]
544
+ [0, 12, 0, 4, 0, 8, 0, 4, 12, 0, 4, 0, 8, 0, 4, 0]
545
+ """
546
+ from .all import Gamma0
547
+
548
+ # first deal with special cases
549
+
550
+ if eps is None:
551
+ return GammaH_class.dimension_eis(self, k)
552
+
553
+ N = self.level()
554
+ K = eps.base_ring()
555
+ eps = DirichletGroup(N, K)(eps)
556
+
557
+ if eps.is_trivial():
558
+ return Gamma0(N).dimension_eis(k)
559
+
560
+ # Note case of k = 0 and trivial character already dealt with separately, so k <= 0 here is valid:
561
+ if (k <= 0) or ((k % 2) == 1 and eps.is_even()) or ((k % 2) == 0 and eps.is_odd()):
562
+ return ZZ(0)
563
+
564
+ if algorithm == "Quer":
565
+ n = eps.order()
566
+ dim = ZZ(0)
567
+ for d in n.divisors():
568
+ G = GammaH_constructor(N,(eps**d).kernel())
569
+ dim = dim + moebius(d)*G.dimension_eis(k)
570
+ return dim//phi(n)
571
+
572
+ elif algorithm == "CohenOesterle":
573
+ from sage.modular.dims import CohenOesterle
574
+ j = 2-k
575
+ # We use the Cohen-Oesterle formula in a subtle way to
576
+ # compute dim M_k(N,eps) (see Ch. 6 of William Stein's book on
577
+ # computing with modular forms).
578
+ alpha = -ZZ( K(Gamma0(N).index()*(j-1)/ZZ(12)) + CohenOesterle(eps,j) )
579
+ if k == 1:
580
+ return alpha
581
+ else:
582
+ return alpha - self.dimension_cusp_forms(k, eps)
583
+
584
+ else: # algorithm not in ["CohenOesterle", "Quer"]:
585
+ raise ValueError("Unrecognised algorithm in dimension_eis")
586
+
587
+ def dimension_new_cusp_forms(self, k=2, eps=None, p=0, algorithm='CohenOesterle'):
588
+ r"""
589
+ Dimension of the new subspace (or `p`-new subspace) of cusp forms of
590
+ weight `k` and character `\varepsilon`.
591
+
592
+ INPUT:
593
+
594
+ - ``k`` -- integer (default: 2)
595
+
596
+ - ``eps`` -- a Dirichlet character
597
+
598
+ - ``p`` -- a prime (default: 0); just the `p`-new subspace if given
599
+
600
+ - ``algorithm`` -- either ``'CohenOesterle'`` (the default) or
601
+ ``'Quer'``. This specifies the method to use in the case of nontrivial
602
+ character: either the Cohen--Oesterle formula as described in Stein's
603
+ book, or by Möbius inversion using the subgroups GammaH (a method due
604
+ to Jordi Quer).
605
+
606
+ EXAMPLES::
607
+
608
+ sage: G = DirichletGroup(9)
609
+ sage: eps = G.0^3
610
+ sage: eps.conductor()
611
+ 3
612
+ sage: [Gamma1(9).dimension_new_cusp_forms(k, eps) for k in [2..10]]
613
+ [0, 0, 0, 2, 0, 2, 0, 2, 0]
614
+ sage: [Gamma1(9).dimension_cusp_forms(k, eps) for k in [2..10]]
615
+ [0, 0, 0, 2, 0, 4, 0, 6, 0]
616
+ sage: [Gamma1(9).dimension_new_cusp_forms(k, eps, 3) for k in [2..10]]
617
+ [0, 0, 0, 2, 0, 2, 0, 2, 0]
618
+
619
+ Double check using modular symbols (independent calculation)::
620
+
621
+ sage: [ModularSymbols(eps,k,sign=1).cuspidal_subspace().new_subspace().dimension() for k in [2..10]]
622
+ [0, 0, 0, 2, 0, 2, 0, 2, 0]
623
+ sage: [ModularSymbols(eps,k,sign=1).cuspidal_subspace().new_subspace(3).dimension() for k in [2..10]]
624
+ [0, 0, 0, 2, 0, 2, 0, 2, 0]
625
+
626
+ Another example at level 33::
627
+
628
+ sage: G = DirichletGroup(33)
629
+ sage: eps = G.1
630
+ sage: eps.conductor()
631
+ 11
632
+ sage: [Gamma1(33).dimension_new_cusp_forms(k, G.1) for k in [2..4]]
633
+ [0, 4, 0]
634
+ sage: [Gamma1(33).dimension_new_cusp_forms(k, G.1, algorithm='Quer') for k in [2..4]]
635
+ [0, 4, 0]
636
+ sage: [Gamma1(33).dimension_new_cusp_forms(k, G.1^2) for k in [2..4]]
637
+ [2, 0, 6]
638
+ sage: [Gamma1(33).dimension_new_cusp_forms(k, G.1^2, p=3) for k in [2..4]]
639
+ [2, 0, 6]
640
+ """
641
+
642
+ if eps is None:
643
+ return GammaH_class.dimension_new_cusp_forms(self, k, p)
644
+
645
+ N = self.level()
646
+ eps = DirichletGroup(N, eps.base_ring())(eps)
647
+
648
+ if eps.is_trivial():
649
+ from .all import Gamma0
650
+ return Gamma0(N).dimension_new_cusp_forms(k, p)
651
+
652
+ from .congroup_gammaH import mumu
653
+
654
+ if p == 0 or N % p != 0 or eps.conductor().valuation(p) == N.valuation(p):
655
+ D = [eps.conductor()*d for d in divisors(N//eps.conductor())]
656
+ return sum([Gamma1_constructor(M).dimension_cusp_forms(k, eps.restrict(M), algorithm)*mumu(N//M) for M in D])
657
+ eps_p = eps.restrict(N//p)
658
+ old = Gamma1_constructor(N//p).dimension_cusp_forms(k, eps_p, algorithm)
659
+ return self.dimension_cusp_forms(k, eps, algorithm) - 2*old