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,1214 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.gap
3
+ r"""
4
+ Overview of Hecke triangle groups and modular forms for Hecke triangle groups
5
+
6
+ AUTHORS:
7
+
8
+ - Jonas Jermann (2013): initial version
9
+
10
+
11
+ Hecke triangle groups and elements:
12
+ -----------------------------------
13
+
14
+ - **Hecke triangle group:**
15
+ The Von Dyck group corresponding to the triangle group with angles
16
+ ``(pi/2, pi/n, 0)`` for ``n=3, 4, 5, ...``, generated by the conformal
17
+ circle inversion ``S`` and by the translation ``T`` by ``lambda=2*cos(pi/n)``.
18
+ I.e. the subgroup of orientation preserving elements of the triangle
19
+ group generated by reflections along the boundaries of the above hyperbolic
20
+ triangle. The group is arithmetic iff ``n=3, 4, 6, infinity``.
21
+
22
+ The group elements correspond to matrices over ZZ[lambda], namely the
23
+ corresponding order in the number field defined by the minimal polynomial
24
+ of lambda (which embeds into ``AlgebraicReal`` accordingly).
25
+
26
+ An exact symbolic expression of the corresponding transfinite diameter ``d``
27
+ (which is used as a formal parameter for Fourier expansion of modular forms)
28
+ can be obtained. For arithmetic groups the (correct) rational number is
29
+ returned instead.
30
+
31
+ Basic matrices like ``S, T, U, V(j)`` are available.
32
+
33
+ EXAMPLES::
34
+
35
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
36
+ sage: G = HeckeTriangleGroup(12)
37
+ sage: G
38
+ Hecke triangle group for n = 12
39
+ sage: G.is_arithmetic()
40
+ False
41
+ sage: G.dvalue()
42
+ e^(2*euler_gamma - 4*pi/(sqrt(6) + sqrt(2)) + psi(19/24) + psi(17/24))
43
+ sage: AA(G.lam())
44
+ 1.9318516525781...?
45
+
46
+ sage: G = HeckeTriangleGroup(6)
47
+ sage: G
48
+ Hecke triangle group for n = 6
49
+ sage: G.is_arithmetic()
50
+ True
51
+ sage: G.dvalue()
52
+ 1/108
53
+ sage: AA(G.lam()) == AA(sqrt(3))
54
+ True
55
+ sage: G.gens()
56
+ (
57
+ [ 0 -1] [ 1 lam]
58
+ [ 1 0], [ 0 1]
59
+ )
60
+ sage: G.U()^3
61
+ [ lam -2]
62
+ [ 2 -lam]
63
+ sage: G.U().parent()
64
+ Hecke triangle group for n = 6
65
+ sage: G.U().matrix().parent()
66
+ Full MatrixSpace of 2 by 2 dense matrices over Maximal Order generated by lam in Number Field in lam with defining polynomial x^2 - 3 with lam = 1.732050807568878?
67
+
68
+
69
+ - **Decomposition into product of generators:**
70
+ It is possible to decompose any group element into products
71
+ of generators the ``S`` and ``T``. In particular this allows
72
+ to check whether a given matrix indeed is a group element.
73
+
74
+ It also allows one to calculate the automorphy factor
75
+ of a modular form for the Hecke triangle group for
76
+ arbitrary arguments.
77
+
78
+ EXAMPLES::
79
+
80
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
81
+ sage: G = HeckeTriangleGroup(6)
82
+ sage: G.element_repr_method("basic")
83
+ sage: A = G.V(2)*G.V(3)^(-2)
84
+ sage: (L, sgn) = A.word_S_T()
85
+ sage: L
86
+ (S, T^(-2), S, T^(-1), S, T^(-1))
87
+ sage: sgn
88
+ -1
89
+ sage: sgn.parent()
90
+ Hecke triangle group for n = 6
91
+
92
+ sage: G(matrix([[-1, 1+G.lam()],[0, -1]]))
93
+ Traceback (most recent call last):
94
+ ...
95
+ TypeError: The matrix is not an element of Hecke triangle group for n = 6, up to equivalence it identifies two nonequivalent points.
96
+ sage: G(matrix([[-1, G.lam()],[0, -1]]))
97
+ -T^(-1)
98
+
99
+ sage: G.element_repr_method("basic")
100
+
101
+ sage: from sage.modular.modform_hecketriangle.space import ModularForms
102
+ sage: MF = ModularForms(G, k=4, ep=1)
103
+ sage: z = AlgebraicField()(1+i/2)
104
+ sage: MF.aut_factor(A, z)
105
+ 37.62113890008...? + 12.18405525839...?*I
106
+
107
+
108
+ - **Representation of elements:**
109
+ An element can be represented in several ways:
110
+
111
+ - As a matrix over the base ring (default)
112
+ - As a product of the generators ``S`` and ``T``
113
+ - As a product of basic blocks conjugated by some element
114
+
115
+ EXAMPLES::
116
+
117
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
118
+ sage: G = HeckeTriangleGroup(n=5)
119
+ sage: el = G.S()*G.T(3)*G.S()*G.T(-2)
120
+
121
+ sage: G.element_repr_method("default")
122
+ sage: el
123
+ [ -1 2*lam]
124
+ [ 3*lam -6*lam - 7]
125
+
126
+ sage: G.element_repr_method("basic")
127
+ sage: el
128
+ S*T^3*S*T^(-2)
129
+
130
+ sage: G.element_repr_method("block")
131
+ sage: el
132
+ -(S*T^3) * (V(4)^2*V(1)^3) * (S*T^3)^(-1)
133
+
134
+ sage: G.element_repr_method("conj")
135
+ sage: el
136
+ [-V(4)^2*V(1)^3]
137
+
138
+ sage: G.element_repr_method("default")
139
+
140
+
141
+ - **Group action on the (extended) upper half plane:**
142
+ The group action of Hecke triangle groups on the (extended)
143
+ upper half plane (by linear fractional transformations)
144
+ is implemented. The implementation is not based on a
145
+ specific upper half plane model but is defined formally
146
+ (for arbitrary arguments) instead.
147
+
148
+ It is possible to determine the group translate of an
149
+ element in the classic (strict) fundamental domain for
150
+ the group, together with the corresponding mapping
151
+ group element.
152
+
153
+ The corresponding action of the group on itself by
154
+ conjugation is supported as well.
155
+
156
+ The usual `slash`-operator for even integer weights is
157
+ also available. It acts on rational functions (resp. polynomials).
158
+ For modular forms an evaluation argument is required.
159
+
160
+ EXAMPLES::
161
+
162
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
163
+ sage: G = HeckeTriangleGroup(n=7)
164
+ sage: G.element_repr_method("basic")
165
+
166
+ sage: G.S().acton(i + exp(-2))
167
+ -1/(e^(-2) + I)
168
+ sage: A = G.V(2)*G.V(3)^(-2)
169
+ sage: A
170
+ -S*T^(-2)*S*T^(-1)*S*T^(-1)
171
+ sage: A.acton(CC(i + exp(-2)))
172
+ 0.344549645079... + 0.0163901095115...*I
173
+
174
+ sage: G.S().acton(A)
175
+ -T^(-2)*S*T^(-1)*S*T^(-1)*S
176
+
177
+ sage: z = AlgebraicField()(4 + 1/7*i)
178
+ sage: G.in_FD(z)
179
+ False
180
+ sage: A, w = G.get_FD(z)
181
+ sage: A
182
+ T^2*S*T^(-1)*S
183
+ sage: w
184
+ 0.516937798396...? + 0.964078044600...?*I
185
+
186
+ sage: A.acton(w) == z
187
+ True
188
+ sage: G.in_FD(w)
189
+ True
190
+
191
+ sage: z = PolynomialRing(G.base_ring(), 'z').gen()
192
+ sage: rat = z^2 + 1/(z-G.lam())
193
+ sage: G.S().slash(rat)
194
+ (z^6 - lam*z^4 - z^3)/(-lam*z^4 - z^3)
195
+
196
+ sage: G.element_repr_method("default")
197
+
198
+
199
+ - **Basic properties of group elements:**
200
+ The trace, sign (based on the trace), discriminant and
201
+ elliptic/parabolic/hyperbolic type are available.
202
+
203
+ Group elements can be displayed/represented in several ways:
204
+
205
+ - As matrices over the base ring.
206
+ - As a word in (powers of) the generators ``S`` and ``T``.
207
+ - As a word in (powers of) basic block matrices ``V(j)``
208
+ (resp. ``U, S`` in the elliptic case) together
209
+ with the conjugation matrix that maps the element to
210
+ this form (also see below).
211
+
212
+ For the case ``n=infinity`` the last method is not
213
+ properly implemented.
214
+
215
+ EXAMPLES::
216
+
217
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
218
+ sage: G = HeckeTriangleGroup(n=7)
219
+ sage: A = -G.V(2)*G.V(3)^(-2)
220
+
221
+ sage: print(A.string_repr("default"))
222
+ [ lam -lam^2 + 1]
223
+ [ 2*lam^2 - 1 -2*lam^2 - lam + 2]
224
+ sage: print(A.string_repr("basic"))
225
+ S*T^(-2)*S*T^(-1)*S*T^(-1)
226
+ sage: print(A.string_repr("block"))
227
+ -(-S*T^(-1)*S) * (V(3)) * (-S*T^(-1)*S)^(-1)
228
+ sage: print(A.string_repr("conj"))
229
+ [-V(3)]
230
+ sage: A.trace()
231
+ -2*lam^2 + 2
232
+ sage: A.sign()
233
+ [-1 0]
234
+ [ 0 -1]
235
+ sage: A.discriminant()
236
+ 4*lam^2 + 4*lam - 4
237
+ sage: A.is_elliptic()
238
+ False
239
+ sage: A.is_hyperbolic()
240
+ True
241
+
242
+
243
+ - **Fixed points:**
244
+ Elliptic, parabolic or hyperbolic fixed points of group
245
+ can be obtained. They are implemented as a (relative)
246
+ quadratic extension (given by the square root of the discriminant)
247
+ of the base ring. It is possible to query the correct embedding
248
+ into a given field.
249
+
250
+ Note that for hyperbolic (and parabolic) fixed points there is a
251
+ 1-1 correspondence with primitive hyperbolic/parabolic group
252
+ elements (at least if ``n < infinity``). The group action on
253
+ fixed points resp. on matrices is compatible with this correspondence.
254
+
255
+ EXAMPLES::
256
+
257
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
258
+ sage: G = HeckeTriangleGroup(n=7)
259
+
260
+ sage: A = G.S()
261
+ sage: A.fixed_points()
262
+ (1/2*e, -1/2*e)
263
+ sage: A.fixed_points(embedded=True)
264
+ (I, -I)
265
+
266
+ sage: A = G.U()
267
+ sage: A.fixed_points()
268
+ (1/2*e + 1/2*lam, -1/2*e + 1/2*lam)
269
+ sage: A.fixed_points(embedded=True)
270
+ (0.9009688679024...? + 0.4338837391175...?*I, 0.9009688679024...? - 0.4338837391175...?*I)
271
+
272
+ sage: A = -G.V(2)*G.V(3)^(-2)
273
+ sage: A.fixed_points()
274
+ ((-3/7*lam^2 + 2/7*lam + 11/14)*e - 1/7*lam^2 + 3/7*lam + 3/7, (3/7*lam^2 - 2/7*lam - 11/14)*e - 1/7*lam^2 + 3/7*lam + 3/7)
275
+ sage: A.fixed_points(embedded=True)
276
+ (0.3707208390178...?, 1.103231619181...?)
277
+
278
+ sage: el = A.fixed_points()[0]
279
+ sage: F = A.root_extension_field()
280
+ sage: F == el.parent()
281
+ True
282
+ sage: A.root_extension_embedding(CC)
283
+ Relative number field morphism:
284
+ From: Number Field in e with defining polynomial x^2 - 4*lam^2 - 4*lam + 4 over its base field
285
+ To: Complex Field with 53 bits of precision
286
+ Defn: e |--> 4.02438434522465
287
+ lam |--> 1.80193773580484
288
+
289
+ sage: G.V(2).acton(A).fixed_points()[0] == G.V(2).acton(el)
290
+ True
291
+
292
+
293
+ - **Lambda-continued fractions:**
294
+ For parabolic or hyperbolic elements (resp. their corresponding
295
+ fixed point) the (negative) lambda-continued fraction expansion
296
+ is eventually periodic. The lambda-CF (i.e. the preperiod and period)
297
+ is calculated exactly.
298
+
299
+ In particular this allows to determine primitive and reduced
300
+ generators of group elements and the corresponding primitive
301
+ power of the element.
302
+
303
+ The case ``n=infinity`` is not properly implemented.
304
+
305
+ EXAMPLES::
306
+
307
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
308
+ sage: G = HeckeTriangleGroup(n=7)
309
+ sage: G.element_repr_method("block")
310
+
311
+ sage: G.V(6).continued_fraction()
312
+ ((1,), (1, 1, 1, 1, 2))
313
+ sage: (-G.V(2)).continued_fraction()
314
+ ((1,), (2,))
315
+
316
+ sage: A = -(G.V(2)*G.V(3)^(-2))^2
317
+ sage: A.is_primitive()
318
+ False
319
+ sage: A.primitive_power()
320
+ 2
321
+ sage: A.is_reduced()
322
+ False
323
+ sage: A.continued_fraction()
324
+ ((1, 1, 1, 1), (1, 2))
325
+
326
+ sage: B = A.primitive_part()
327
+ sage: B
328
+ (-S*T^(-1)*S) * (V(3)) * (-S*T^(-1)*S)^(-1)
329
+ sage: B.is_primitive()
330
+ True
331
+ sage: B.is_reduced()
332
+ False
333
+ sage: B.continued_fraction()
334
+ ((1, 1, 1, 1), (1, 2))
335
+ sage: A == A.sign() * B^A.primitive_power()
336
+ True
337
+
338
+ sage: B = A.reduce()
339
+ sage: B
340
+ (T*S*T) * (V(3)) * (T*S*T)^(-1)
341
+ sage: B.is_primitive()
342
+ True
343
+ sage: B.is_reduced()
344
+ True
345
+ sage: B.continued_fraction()
346
+ ((), (1, 2))
347
+
348
+ sage: G.element_repr_method("default")
349
+
350
+
351
+ - **Reduced and simple elements, Hecke-symmetric elements:**
352
+ For primitive conjugacy classes of hyperbolic elements
353
+ the cycle of reduced elements can be obtain as well as
354
+ all simple elements. It is also possible to determine
355
+ whether a class is Hecke-symmetric.
356
+
357
+ The case ``n=infinity`` is not properly implemented.
358
+
359
+ EXAMPLES::
360
+
361
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
362
+ sage: G = HeckeTriangleGroup(n=5)
363
+
364
+ sage: el = G.V(1)^2*G.V(2)*G.V(4)
365
+ sage: R = el.reduced_elements()
366
+ sage: [v.continued_fraction() for v in R]
367
+ [((), (2, 1, 1, 4)), ((), (1, 1, 4, 2)), ((), (1, 4, 2, 1)), ((), (4, 2, 1, 1))]
368
+
369
+ sage: el = G.V(1)^2*G.V(2)*G.V(4)
370
+ sage: R = el.simple_elements()
371
+ sage: [v.is_simple() for v in R]
372
+ [True, True, True, True]
373
+ sage: (fp1, fp2) = R[2].fixed_points(embedded=True)
374
+ sage: fp2 < 0 < fp1
375
+ True
376
+
377
+ sage: el = G.V(2)
378
+ sage: el.is_hecke_symmetric()
379
+ False
380
+ sage: (el.simple_fixed_point_set(), el.inverse().simple_fixed_point_set())
381
+ ({1/2*e, (-1/2*lam + 1/2)*e}, {-1/2*e, (1/2*lam - 1/2)*e})
382
+ sage: el = G.V(2)*G.V(3)
383
+ sage: el.is_hecke_symmetric()
384
+ True
385
+ sage: el.simple_fixed_point_set() == el.inverse().simple_fixed_point_set()
386
+ True
387
+
388
+
389
+ - **Rational period functions:**
390
+ For each primitive (hyperbolic) conjugacy classes and each even
391
+ weight ``k`` we can associate a corresponding rational period
392
+ function. I.e. a rational function ``q`` of weight ``k`` which satisfies:
393
+ ``q | S == 0`` and ``q + q|U + ... + q|U^(n-1) == 0``,
394
+ where ``S``, ``U`` are the corresponding group elements and
395
+ ``|`` is the usual `slash-operator` of weight ``k``.
396
+
397
+ The set of all rational period function is expected
398
+ to be generated by such functions.
399
+
400
+ EXAMPLES::
401
+
402
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
403
+ sage: G = HeckeTriangleGroup(n=5)
404
+ sage: S = G.S()
405
+ sage: U = G.U()
406
+
407
+ sage: def is_rpf(f, k=None) -> bool:
408
+ ....: if not f + S.slash(f, k=k) == 0:
409
+ ....: return False
410
+ ....: return sum((U^m).slash(f, k=k) for m in range(G.n())) == 0
411
+
412
+ sage: z = PolynomialRing(G.base_ring(), 'z').gen()
413
+ sage: [is_rpf(1 - z^(-k), k=k) for k in range(-6, 6, 2)] # long time
414
+ [True, True, True, True, True, True]
415
+ sage: [is_rpf(1/z, k=k) for k in range(-6, 6, 2)]
416
+ [False, False, False, False, True, False]
417
+
418
+ sage: el = G.V(2)
419
+ sage: el.is_hecke_symmetric()
420
+ False
421
+ sage: rpf = el.rational_period_function(-4)
422
+ sage: is_rpf(rpf)
423
+ True
424
+ sage: rpf
425
+ -lam*z^4 + lam
426
+ sage: rpf = el.rational_period_function(-2)
427
+ sage: is_rpf(rpf)
428
+ True
429
+ sage: rpf
430
+ (lam + 1)*z^2 - lam - 1
431
+ sage: el.rational_period_function(0) == 0
432
+ True
433
+ sage: rpf = el.rational_period_function(2)
434
+ sage: is_rpf(rpf)
435
+ True
436
+ sage: rpf
437
+ ((lam + 1)*z^2 - lam - 1)/(lam*z^4 + (-lam - 2)*z^2 + lam)
438
+
439
+ sage: el = G.V(2)*G.V(3)
440
+ sage: el.is_hecke_symmetric()
441
+ True
442
+ sage: el.rational_period_function(-4) == 0
443
+ True
444
+ sage: rpf = el.rational_period_function(-2)
445
+ sage: rpf
446
+ (8*lam + 4)*z^2 - 8*lam - 4
447
+ sage: rpf = el.rational_period_function(2)
448
+ sage: is_rpf(rpf)
449
+ True
450
+ sage: rpf.denominator()
451
+ (144*lam + 89)*z^8 + (-618*lam - 382)*z^6 + (951*lam + 588)*z^4 + (-618*lam - 382)*z^2 + 144*lam + 89
452
+ sage: el.rational_period_function(4) == 0
453
+ True
454
+
455
+ sage: G = HeckeTriangleGroup(n=4)
456
+ sage: G.rational_period_functions(k=4, D=12)
457
+ [(z^4 - 1)/z^4]
458
+ sage: G.rational_period_functions(k=2, D=14)
459
+ [(z^2 - 1)/z^2, 1/z, (24*z^6 - 120*z^4 + 120*z^2 - 24)/(9*z^8 - 80*z^6 + 146*z^4 - 80*z^2 + 9), (24*z^6 - 120*z^4 + 120*z^2 - 24)/(9*z^8 - 80*z^6 + 146*z^4 - 80*z^2 + 9)]
460
+
461
+
462
+ - **Block decomposition of elements:**
463
+ For each group element a very specific conjugacy representative
464
+ can be obtained. For hyperbolic and parabolic elements the
465
+ representative is a product ``V(j)``-matrices. They all
466
+ have nonnegative trace and the number of factors is called
467
+ the block length of the element (which is implemented).
468
+
469
+ Note: For this decomposition special care is given to the
470
+ sign (of the trace) of the matrices.
471
+
472
+ The case ``n=infinity`` for everything above is not properly implemented.
473
+
474
+ EXAMPLES::
475
+
476
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
477
+ sage: G = HeckeTriangleGroup(n=7)
478
+ sage: G.element_repr_method("block")
479
+
480
+ sage: A = -G.V(2)*G.V(6)^3*G.V(3)
481
+ sage: A
482
+ -(T*S*T) * (V(6)^3*V(3)*V(2)) * (T*S*T)^(-1)
483
+ sage: A.sign()
484
+ -1
485
+ sage: (L, R, sgn) = A.block_decomposition()
486
+ sage: L
487
+ ((-S*T^(-1)*S) * (V(6)^3) * (-S*T^(-1)*S)^(-1), (T*S*T*S*T) * (V(3)) * (T*S*T*S*T)^(-1), (T*S*T) * (V(2)) * (T*S*T)^(-1))
488
+ sage: prod(L).sign()
489
+ 1
490
+ sage: A == sgn * (R.acton(prod(L)))
491
+ True
492
+ sage: t = A.block_length()
493
+ sage: t
494
+ 5
495
+ sage: AA(A.discriminant()) >= AA(t^2 * G.lam() - 4)
496
+ True
497
+
498
+
499
+ - **Class number and class representatives**:
500
+ The block length provides a lower bound for the
501
+ discriminant. This allows to enlist all (representatives of)
502
+ matrices of (or up to) a given discriminant.
503
+
504
+ Using the 1-1 correspondence with hyperbolic fixed points
505
+ (and certain hyperbolic binary quadratic forms) this
506
+ makes it possible to calculate the corresponding class number
507
+ (number of conjugacy classes for a given discriminant).
508
+
509
+ It also allows to list all occurring discriminants up
510
+ to some bound. Or to enlist all reduced/simple elements
511
+ resp. their corresponding hyperbolic fixed points
512
+ for the given discriminant.
513
+
514
+ Warning: The currently used algorithm is very slow!
515
+
516
+ EXAMPLES::
517
+
518
+ sage: from sage.modular.modform_hecketriangle.hecke_triangle_groups import HeckeTriangleGroup
519
+ sage: G = HeckeTriangleGroup(n=4)
520
+ sage: G.element_repr_method("basic")
521
+ sage: G.is_discriminant(68)
522
+ True
523
+ sage: G.class_number(14)
524
+ 2
525
+ sage: G.list_discriminants(D=68)
526
+ [4, 12, 14, 28, 32, 46, 60, 68]
527
+ sage: G.list_discriminants(D=0, hyperbolic=False, primitive=False)
528
+ [-4, -2, 0]
529
+ sage: G.class_number(68)
530
+ 4
531
+ sage: sorted(G.class_representatives(68))
532
+ [S*T^(-5)*S*T^(-1)*S, S*T^(-2)*S*T^(-1)*S*T, T*S*T^5, -S*T^(-1)*S*T^2*S*T]
533
+ sage: R = G.reduced_elements(68)
534
+ sage: all(v.is_reduced() for v in R) # long time
535
+ True
536
+ sage: R = G.simple_elements(68)
537
+ sage: all(v.is_simple() for v in R) # long time
538
+ True
539
+ sage: G.element_repr_method("default")
540
+
541
+ sage: G = HeckeTriangleGroup(n=5)
542
+ sage: G.element_repr_method("basic")
543
+ sage: G.list_discriminants(9*G.lam() + 5)
544
+ [4*lam, 7*lam + 6, 9*lam + 5]
545
+ sage: G.list_discriminants(D=0, hyperbolic=False, primitive=False)
546
+ [-4, -lam - 2, lam - 3, 0]
547
+ sage: G.class_number(9*G.lam() + 5)
548
+ 2
549
+ sage: sorted(G.class_representatives(9*G.lam() + 5))
550
+ [S*T^(-2)*S*T^(-1)*S, T*S*T^2]
551
+ sage: R = G.reduced_elements(9*G.lam() + 5)
552
+ sage: all(v.is_reduced() for v in R) # long time
553
+ True
554
+ sage: R = G.simple_elements(7*G.lam() + 6)
555
+ sage: for v in R: print(v.string_repr("default"))
556
+ [lam + 2 lam]
557
+ [ lam 1]
558
+ [ 1 lam]
559
+ [ lam lam + 2]
560
+ sage: G.element_repr_method("default")
561
+
562
+
563
+ Modular forms ring and spaces for Hecke triangle groups:
564
+ --------------------------------------------------------
565
+
566
+ - **Analytic type:**
567
+ The analytic type of forms, including the behavior at infinity:
568
+
569
+ - Meromorphic (and meromorphic at infinity)
570
+ - Weakly holomorphic (holomorphic and meromorphic at infinity)
571
+ - Holomorphic (and holomorphic at infinity)
572
+ - Cuspidal (holomorphic and zero at infinity)
573
+
574
+ Additionally the type specifies whether the form is modular or only quasi modular.
575
+
576
+ EXAMPLES::
577
+
578
+ sage: from sage.modular.modform_hecketriangle.analytic_type import AnalyticType
579
+ sage: AnalyticType()(["quasi", "cusp"])
580
+ quasi cuspidal
581
+
582
+
583
+ - **Modular form (for Hecke triangle groups):**
584
+ A function of some analytic type which transforms like a modular form
585
+ for the given group, weight ``k`` and multiplier ``epsilon``:
586
+
587
+ - ``f(z+lambda) = f(lambda)``
588
+ - ``f(-1/z) = epsilon * (z/i)^k * f(z)``
589
+
590
+ The multiplier is either ``1`` or ``-1``.
591
+ The weight is a rational number of the form ``4*(n*l+l')/(n-2) + (1-epsilon)*n/(n-2)``.
592
+ If ``n`` is odd, then the multiplier is unique and given by ``(-1)^(k*(n-2)/2)``.
593
+ The space of modular forms for a given group, weight and multiplier forms a module
594
+ over the base ring. It is finite dimensional if the analytic type is ``holomorphic``.
595
+
596
+ Modular forms can be constructed in several ways:
597
+
598
+ - Using some already available construction function for modular forms
599
+ (those function are available for all spaces/rings and in general
600
+ do not return elements of the same parent)
601
+ - Specifying the form as a rational function in the basic generators (see below)
602
+ - For weakly holomorphic modular forms it is possible to exactly determine the
603
+ form by specifying (sufficiently many) initial coefficients of its Fourier expansion.
604
+ - There is even hope (no guarantee) to determine a (exact) form from
605
+ the initial numerical coefficients (see below).
606
+ - By specifying the coefficients with respect to a basis of the space
607
+ (if the corresponding space supports coordinate vectors)
608
+ - Arithmetic combination of forms or differential operators applied to forms
609
+
610
+ The implementation is based on the implementation of the graded ring (see below).
611
+ All calculations are exact (no precision argument is required).
612
+ The analytic type of forms is checked during construction.
613
+ The analytic type of parent spaces after arithmetic/differential operations
614
+ with elements is changed (extended/reduced) accordingly.
615
+
616
+ In particular it is possible to multiply arbitrary modular forms (and end up
617
+ with an element of a modular forms space). If two forms of different
618
+ weight/multiplier are added then an element of the corresponding
619
+ modular forms ring is returned instead.
620
+
621
+ Elements of modular forms spaces are represented by their Fourier expansion.
622
+
623
+ EXAMPLES::
624
+
625
+ sage: from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms, MeromorphicModularForms
626
+ sage: MeromorphicModularForms(n=4, k=8, ep=1)
627
+ MeromorphicModularForms(n=4, k=8, ep=1) over Integer Ring
628
+ sage: CF = CuspForms(n=7, k=12, ep=1)
629
+ sage: CF
630
+ CuspForms(n=7, k=12, ep=1) over Integer Ring
631
+
632
+ sage: MF = ModularForms(k=12, ep=1)
633
+ sage: (x,y,z,d) = MF.pol_ring().gens()
634
+
635
+ Using existing functions::
636
+
637
+ sage: CF.Delta()
638
+ q + 17/(56*d)*q^2 + 88887/(2458624*d^2)*q^3 + 941331/(481890304*d^3)*q^4 + O(q^5)
639
+
640
+ Using rational function in the basic generators::
641
+
642
+ sage: MF(x^3)
643
+ 1 + 720*q + 179280*q^2 + 16954560*q^3 + 396974160*q^4 + O(q^5)
644
+
645
+ Using Fourier expansions::
646
+
647
+ sage: qexp = CF.Delta().q_expansion(prec=2)
648
+ sage: qexp
649
+ q + O(q^2)
650
+ sage: qexp.parent()
651
+ Power Series Ring in q over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
652
+ sage: MF(qexp)
653
+ q - 24*q^2 + 252*q^3 - 1472*q^4 + O(q^5)
654
+
655
+ Using coordinate vectors::
656
+
657
+ sage: MF([0,1]) == MF.f_inf()
658
+ True
659
+
660
+ Using arithmetic expressions::
661
+
662
+ sage: d = CF.get_d()
663
+ sage: CF.f_rho()^7 / (d*CF.f_rho()^7 - d*CF.f_i()^2) == CF.j_inv()
664
+ True
665
+ sage: MF.E4().serre_derivative() == -1/3 * MF.E6()
666
+ True
667
+
668
+
669
+ - **Hauptmodul:**
670
+ The ``j-function`` for Hecke triangle groups is given by the unique Riemann map
671
+ from the hyperbolic triangle with vertices at ``rho``, ``i`` and ``infinity`` to the
672
+ upper half plane, normalized such that its Fourier coefficients are real and such
673
+ that the first nontrivial Fourier coefficient is 1. The function extends to a
674
+ completely invariant weakly holomorphic function from the upper half plane to the
675
+ complex numbers. Another used normalization (in capital letters) is ``J(i)=1``.
676
+ The coefficients of ``j`` are rational numbers up to a power of ``d=1/j(i)``
677
+ which is only rational in the arithmetic cases ``n=3, 4, 6, infinity``.
678
+
679
+ All Fourier coefficients of modular forms are based on the coefficients of ``j``.
680
+ The coefficients of ``j`` are calculated by inverting the Fourier series of its
681
+ inverse (the series inversion is also by far the most expensive operation of all).
682
+
683
+ EXAMPLES::
684
+
685
+ sage: from sage.modular.modform_hecketriangle.graded_ring import WeakModularFormsRing
686
+ sage: from sage.modular.modform_hecketriangle.space import WeakModularForms
687
+ sage: WeakModularForms(n=3, k=0, ep=1).j_inv()
688
+ q^-1 + 744 + 196884*q + 21493760*q^2 + 864299970*q^3 + 20245856256*q^4 + O(q^5)
689
+ sage: WeakModularFormsRing(n=7).j_inv()
690
+ f_rho^7/(f_rho^7*d - f_i^2*d)
691
+ sage: WeakModularFormsRing(n=7, red_hom=True).j_inv()
692
+ q^-1 + 151/(392*d) + 165229/(2458624*d^2)*q + 107365/(15059072*d^3)*q^2 + 25493858865/(48358655787008*d^4)*q^3 + 2771867459/(92561489592320*d^5)*q^4 + O(q^5)
693
+
694
+
695
+ - **Basic generators:**
696
+ There exist unique modular forms ``f_rho``, ``f_i`` and ``f_inf`` such that
697
+ each has a simple zero at ``rho=exp(pi/n)``, ``i`` and ``infinity`` resp. and
698
+ no other zeros. The forms are normalized such that their first Fourier coefficient
699
+ is ``1``. They have the weight and multiplier ``(4/(n-2), 1)``, ``(2*n/(n-2), -1)``,
700
+ ``(4*n/(n-2), 1)`` resp. and can be defined in terms of the Hauptmodul ``j``.
701
+
702
+ EXAMPLES::
703
+
704
+ sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
705
+ sage: ModularFormsRing(n=5, red_hom=True).f_rho()
706
+ 1 + 7/(100*d)*q + 21/(160000*d^2)*q^2 + 1043/(192000000*d^3)*q^3 + 45479/(1228800000000*d^4)*q^4 + O(q^5)
707
+ sage: ModularFormsRing(n=5, red_hom=True).f_i()
708
+ 1 - 13/(40*d)*q - 351/(64000*d^2)*q^2 - 13819/(76800000*d^3)*q^3 - 1163669/(491520000000*d^4)*q^4 + O(q^5)
709
+ sage: ModularFormsRing(n=5, red_hom=True).f_inf()
710
+ q - 9/(200*d)*q^2 + 279/(640000*d^2)*q^3 + 961/(192000000*d^3)*q^4 + O(q^5)
711
+ sage: ModularFormsRing(n=5).f_inf()
712
+ f_rho^5*d - f_i^2*d
713
+
714
+
715
+ - **Eisenstein series and Delta:**
716
+ The Eisenstein series of weight ``2``, ``4`` and ``6`` exist for all ``n`` and
717
+ are all implemented . Note that except for ``n=3`` the series ``E4`` and ``E6``
718
+ do not coincide with ``f_rho`` and ``f_i``.
719
+
720
+ Similarly there always exists a (generalization of) ``Delta``. Except for ``n=3``
721
+ it also does not coincide with ``f_inf``.
722
+
723
+ In general Eisenstein series of all even weights exist for all ``n``.
724
+ In the non-arithmetic cases they are however very hard to determine
725
+ (it's an open problem(?) and consequently not yet implemented,
726
+ except for trivial one-dimensional cases).
727
+
728
+ The Eisenstein series in the arithmetic cases ``n = 3, 4, 6`` are fully
729
+ implemented though. Note that this requires a lot more work/effort
730
+ for ``k != 2, 4, 6`` resp. for multidimensional spaces.
731
+
732
+ The case ``n=infinity`` is a special case (since there are two cusps)
733
+ and is not implemented yet.
734
+
735
+ EXAMPLES::
736
+
737
+ sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
738
+ sage: from sage.modular.modform_hecketriangle.space import ModularForms
739
+ sage: ModularFormsRing(n=5).E4()
740
+ f_rho^3
741
+ sage: ModularFormsRing(n=5).E6()
742
+ f_rho^2*f_i
743
+ sage: ModularFormsRing(n=5).Delta()
744
+ f_rho^9*d - f_rho^4*f_i^2*d
745
+ sage: ModularFormsRing(n=5).Delta() == ModularFormsRing(n=5).f_inf()*ModularFormsRing(n=5).f_rho()^4
746
+ True
747
+
748
+ The basic generators in some arithmetic cases::
749
+
750
+ sage: ModularForms(n=3, k=6).E6()
751
+ 1 - 504*q - 16632*q^2 - 122976*q^3 - 532728*q^4 + O(q^5)
752
+ sage: ModularForms(n=4, k=6).E6()
753
+ 1 - 56*q - 2296*q^2 - 13664*q^3 - 73976*q^4 + O(q^5)
754
+ sage: ModularForms(n=infinity, k=4).E4()
755
+ 1 + 16*q + 112*q^2 + 448*q^3 + 1136*q^4 + O(q^5)
756
+
757
+ General Eisenstein series in some arithmetic cases::
758
+
759
+ sage: ModularFormsRing(n=4).EisensteinSeries(k=8) * 34
760
+ 25*f_rho^4 + 9*f_i^2
761
+ sage: ModularForms(n=3, k=12).EisensteinSeries()
762
+ 1 + 65520/691*q + 134250480/691*q^2 + 11606736960/691*q^3 + 274945048560/691*q^4 + O(q^5)
763
+ sage: ModularForms(n=6, k=12).EisensteinSeries()
764
+ 1 + 6552/50443*q + 13425048/50443*q^2 + 1165450104/50443*q^3 + 27494504856/50443*q^4 + O(q^5)
765
+ sage: ModularForms(n=4, k=22, ep=-1).EisensteinSeries()
766
+ 1 - 184/53057489*q - 386252984/53057489*q^2 - 1924704989536/53057489*q^3 - 810031218278584/53057489*q^4 + O(q^5)
767
+
768
+
769
+ - **Generator for ``k=0``, ``ep=-1``:**
770
+ If ``n`` is even then the space of weakly holomorphic modular forms of weight
771
+ ``0`` and multiplier ``-1`` is not empty and generated by one element,
772
+ denoted by ``g_inv``.
773
+
774
+ EXAMPLES::
775
+
776
+ sage: from sage.modular.modform_hecketriangle.space import WeakModularForms
777
+ sage: WeakModularForms(n=4, k=0, ep=-1).g_inv()
778
+ q^-1 - 24 - 3820*q - 100352*q^2 - 1217598*q^3 - 10797056*q^4 + O(q^5)
779
+ sage: WeakModularFormsRing(n=8).g_inv()
780
+ f_rho^4*f_i/(f_rho^8*d - f_i^2*d)
781
+
782
+
783
+ - **Quasi modular form (for Hecke triangle groups):**
784
+ ``E2`` no longer transforms like a modular form but like a quasi modular form.
785
+ More generally quasi modular forms are given in terms of modular forms and powers
786
+ of ``E2``. E.g. a holomorphic quasi modular form is a sum of holomorphic modular
787
+ forms multiplied with a power of ``E2`` such that the weights and multipliers match up.
788
+ The space of quasi modular forms for a given group, weight and multiplier forms a
789
+ module over the base ring. It is finite dimensional if the analytic type is
790
+ ``holomorphic``.
791
+
792
+ The implementation and construction are analogous to modular forms (see above).
793
+ In particular construction of quasi weakly holomorphic forms by their initial
794
+ Laurent coefficients is supported as well!
795
+
796
+ EXAMPLES::
797
+
798
+ sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
799
+ sage: from sage.modular.modform_hecketriangle.space import QuasiCuspForms, QuasiModularForms, QuasiWeakModularForms
800
+ sage: QuasiCuspForms(n=7, k=12, ep=1)
801
+ QuasiCuspForms(n=7, k=12, ep=1) over Integer Ring
802
+ sage: QuasiModularForms(n=4, k=8, ep=-1)
803
+ QuasiModularForms(n=4, k=8, ep=-1) over Integer Ring
804
+
805
+ sage: QuasiModularForms(n=4, k=2, ep=-1).E2()
806
+ 1 - 8*q - 40*q^2 - 32*q^3 - 104*q^4 + O(q^5)
807
+
808
+ A quasi weak form can be constructed by using its initial Laurent expansion::
809
+
810
+ sage: QF = QuasiWeakModularForms(n=8, k=10/3, ep=-1)
811
+ sage: qexp = (QF.quasi_part_gens(min_exp=-1)[4]).q_expansion(prec=5)
812
+ sage: qexp
813
+ q^-1 - 19/(64*d) - 7497/(262144*d^2)*q + 15889/(8388608*d^3)*q^2 + 543834047/(1649267441664*d^4)*q^3 + 711869853/(43980465111040*d^5)*q^4 + O(q^5)
814
+ sage: qexp.parent()
815
+ Laurent Series Ring in q over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
816
+ sage: QF(qexp).as_ring_element()
817
+ f_rho^3*f_i*E2^2/(f_rho^8*d - f_i^2*d)
818
+ sage: QF(qexp).reduced_parent()
819
+ QuasiWeakModularForms(n=8, k=10/3, ep=-1) over Integer Ring
820
+
821
+ Derivatives of (quasi weak) modular forms are again quasi (weak) modular forms::
822
+
823
+ sage: CF.f_inf().derivative() == CF.f_inf()*CF.E2()
824
+ True
825
+
826
+
827
+ - **Ring of (quasi) modular forms:**
828
+ The ring of (quasi) modular forms for a given analytic type and Hecke triangle group.
829
+ In fact it is a graded algebra over the base ring where the grading is over
830
+ ``1/(n-2)*Z x Z/(2Z)`` corresponding to the weight and multiplier.
831
+ A ring element is thus a finite linear combination of (quasi) modular forms
832
+ of (possibly) varying weights and multipliers.
833
+
834
+ Each ring element is represented as a rational function in the
835
+ generators ``f_rho``, ``f_i`` and ``E2``. The representations and arithmetic
836
+ operations are exact (no precision argument is required).
837
+
838
+ Elements of the ring are represented by the rational function in the generators.
839
+
840
+ If the parameter ``red_hom`` is set to ``True`` (default: ``False``) then
841
+ operations with homogeneous elements try to return an element of the corresponding
842
+ vector space (if the element is homogeneous) instead of the forms ring.
843
+ It is also easier to use the forms ring with ``red_hom=True`` to construct known
844
+ forms (since then it is not required to specify the weight and multiplier).
845
+
846
+ EXAMPLES::
847
+
848
+ sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiModularFormsRing, ModularFormsRing
849
+ sage: QuasiModularFormsRing(n=5, red_hom=True)
850
+ QuasiModularFormsRing(n=5) over Integer Ring
851
+ sage: ModularFormsRing()
852
+ ModularFormsRing(n=3) over Integer Ring
853
+ sage: (x,y,z,d) = ModularFormsRing().pol_ring().gens()
854
+
855
+ sage: ModularFormsRing()(x+y)
856
+ f_rho + f_i
857
+
858
+ sage: QuasiModularFormsRing(n=5, red_hom=True)(x^5-y^2).reduce()
859
+ 1/d*q - 9/(200*d^2)*q^2 + 279/(640000*d^3)*q^3 + 961/(192000000*d^4)*q^4 + O(q^5)
860
+
861
+
862
+ - **Construction of modular forms spaces and rings:**
863
+ There are functorial constructions behind all forms spaces and rings
864
+ which assure that arithmetic operations between those spaces and rings
865
+ work and fit into the coercion framework. In particular ring elements
866
+ are interpreted as constant modular forms in this context and base
867
+ extensions are done if necessary.
868
+
869
+
870
+ - **Fourier expansion of (quasi) modular forms (for Hecke triangle groups):**
871
+ Each (quasi) modular form (in fact each ring element) possesses a Fourier
872
+ expansion of the form ``sum_{n>=n_0} a_n q^n``, where ``n_0`` is an integer,
873
+ ``q=exp(2*pi*i*z/lambda)`` and the coefficients ``a_n`` are rational numbers
874
+ (or more generally an extension of rational numbers) up to a power of ``d``,
875
+ where ``d`` is the (possibly) transcendental parameter described above.
876
+ I.e. the coefficient ring is given by ``Frac(R)(d)``.
877
+
878
+ The coefficients are calculated exactly in terms of the (formal) parameter
879
+ ``d``. The expansion is calculated exactly up to the specified precision.
880
+ It is also possible to get a Fourier expansion where ``d`` is evaluated
881
+ to its numerical approximation.
882
+
883
+ EXAMPLES::
884
+
885
+ sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing, QuasiModularFormsRing
886
+ sage: ModularFormsRing(n=4).j_inv().q_expansion(prec=3)
887
+ q^-1 + 13/(32*d) + 1093/(16384*d^2)*q + 47/(8192*d^3)*q^2 + O(q^3)
888
+ sage: QuasiModularFormsRing(n=5).E2().q_expansion(prec=3)
889
+ 1 - 9/(200*d)*q - 369/(320000*d^2)*q^2 + O(q^3)
890
+ sage: QuasiModularFormsRing(n=5).E2().q_expansion_fixed_d(prec=3)
891
+ 1.000000000000... - 6.380956565426...*q - 23.18584547617...*q^2 + O(q^3)
892
+
893
+
894
+ - **Evaluation of forms:**
895
+ (Quasi) modular forms (and also ring elements) can be viewed as
896
+ functions from the upper half plane and can be numerically evaluated
897
+ by using the Fourier expansion.
898
+
899
+ The evaluation uses the (quasi) modularity properties (if possible)
900
+ for a faster and more precise evaluation. The precision of the result
901
+ depends both on the numerical precision and on the default precision
902
+ used for the Fourier expansion.
903
+
904
+ EXAMPLES::
905
+
906
+ sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
907
+ sage: f_i = ModularFormsRing(n=4).f_i()
908
+ sage: f_i(i)
909
+ 0
910
+ sage: f_i(infinity)
911
+ 1
912
+ sage: f_i(1/7 + 0.01*i)
913
+ 32189.02016723... + 21226.62951394...*I
914
+
915
+
916
+ - **L-functions of forms:**
917
+ Using the (pari based) function ``Dokchitser`` L-functions of non-constant
918
+ holomorphic modular forms are supported for all values of ``n``.
919
+
920
+ Note: For non-arithmetic groups this involves an irrational conductor.
921
+ The conductor for the arithmetic groups ``n = 3, 4, 6, infinity`` is
922
+ ``1, 2, 3, 4`` respectively.
923
+
924
+ EXAMPLES::
925
+
926
+ sage: from sage.modular.modform.eis_series import eisenstein_series_lseries
927
+ sage: from sage.modular.modform_hecketriangle.space import ModularForms
928
+ sage: f = ModularForms(n=3, k=4).E4()/240
929
+ sage: L = f.lseries()
930
+ sage: L.conductor
931
+ 1
932
+ sage: L.check_functional_equation() < 2^(-50)
933
+ True
934
+ sage: L(1)
935
+ -0.0304484570583...
936
+ sage: abs(L(1) - eisenstein_series_lseries(4)(1)) < 2^(-53)
937
+ True
938
+ sage: L.taylor_series(1, 3)
939
+ -0.0304484570583... - 0.0504570844798...*z - 0.0350657360354...*z^2 + O(z^3)
940
+ sage: coeffs = f.q_expansion_vector(min_exp=0, max_exp=20, fix_d=True)
941
+ sage: abs(L(10) - sum([coeffs[k] * ZZ(k)^(-10) for k in range(1,len(coeffs))]).n(53)) < 10^(-7)
942
+ True
943
+
944
+ sage: L = ModularForms(n=6, k=6, ep=-1).E6().lseries(num_prec=200)
945
+ sage: L.conductor
946
+ 3
947
+ sage: L.check_functional_equation() < 2^(-180)
948
+ True
949
+ sage: L.eps
950
+ -1
951
+ sage: abs(L(3)) < 2^(-180)
952
+ True
953
+
954
+ sage: L = ModularForms(n=17, k=12).Delta().lseries()
955
+ sage: L.conductor
956
+ 3.86494445880...
957
+ sage: L.check_functional_equation() < 2^(-50)
958
+ True
959
+ sage: L.taylor_series(6, 3)
960
+ 2.15697985314... - 1.17385918996...*z + 0.605865993050...*z^2 + O(z^3)
961
+
962
+ sage: L = ModularForms(n=infinity, k=2, ep=-1).f_i().lseries()
963
+ sage: L.conductor
964
+ 4
965
+ sage: L.check_functional_equation() < 2^(-50)
966
+ True
967
+ sage: L.taylor_series(1, 3)
968
+ 0.000000000000... + 5.76543616701...*z + 9.92776715593...*z^2 + O(z^3)
969
+
970
+
971
+ - **(Serre) derivatives:**
972
+ Derivatives and Serre derivatives of forms can be calculated.
973
+ The analytic type is extended accordingly.
974
+
975
+ EXAMPLES::
976
+
977
+ sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
978
+ sage: from sage.modular.modform_hecketriangle.space import QuasiModularForms
979
+ sage: f_inf = ModularFormsRing(n=4, red_hom=True).f_inf()
980
+ sage: f_inf.derivative()/f_inf == QuasiModularForms(n=4, k=2, ep=-1).E2()
981
+ True
982
+ sage: ModularFormsRing().E4().serre_derivative() == -1/3 * ModularFormsRing().E6()
983
+ True
984
+
985
+
986
+ - **Basis for weakly holomorphic modular forms and Faber polynomials:**
987
+ (Natural) generators of weakly holomorphic modular forms can
988
+ be obtained using the corresponding generalized Faber polynomials.
989
+
990
+ EXAMPLES::
991
+
992
+ sage: from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
993
+ sage: MF = WeakModularForms(n=5, k=62/3, ep=-1)
994
+ sage: MF.disp_prec(MF._l1+2)
995
+
996
+ sage: MF.F_basis(2)
997
+ q^2 - 41/(200*d)*q^3 + O(q^4)
998
+ sage: MF.F_basis(1)
999
+ q - 13071/(640000*d^2)*q^3 + O(q^4)
1000
+ sage: MF.F_basis(-0)
1001
+ 1 - 277043/(192000000*d^3)*q^3 + O(q^4)
1002
+ sage: MF.F_basis(-2)
1003
+ q^-2 - 162727620113/(40960000000000000*d^5)*q^3 + O(q^4)
1004
+
1005
+
1006
+ - **Basis for quasi weakly holomorphic modular forms:**
1007
+ (Natural) generators of quasi weakly holomorphic modular forms can
1008
+ also be obtained. In most cases it is even possible to find a basis consisting
1009
+ of elements with only one non-trivial Laurent coefficient (up to some coefficient).
1010
+
1011
+ EXAMPLES::
1012
+
1013
+ sage: from sage.modular.modform_hecketriangle.space import QuasiWeakModularForms
1014
+ sage: QF = QuasiWeakModularForms(n=8, k=10/3, ep=-1)
1015
+ sage: QF.default_prec(1)
1016
+ sage: QF.quasi_part_gens(min_exp=-1)
1017
+ (q^-1 + O(q),
1018
+ 1 + O(q),
1019
+ q^-1 - 9/(128*d) + O(q),
1020
+ 1 + O(q),
1021
+ q^-1 - 19/(64*d) + O(q),
1022
+ q^-1 + 1/(64*d) + O(q))
1023
+ sage: QF.default_prec(QF.required_laurent_prec(min_exp=-1))
1024
+ sage: QF.q_basis(min_exp=-1) # long time
1025
+ [q^-1 + O(q^5),
1026
+ 1 + O(q^5),
1027
+ q + O(q^5),
1028
+ q^2 + O(q^5),
1029
+ q^3 + O(q^5),
1030
+ q^4 + O(q^5)]
1031
+
1032
+
1033
+ - **Dimension and basis for holomorphic or cuspidal (quasi) modular forms:**
1034
+ For finite dimensional spaces the dimension and a basis can be obtained.
1035
+
1036
+ EXAMPLES::
1037
+
1038
+ sage: from sage.modular.modform_hecketriangle.space import QuasiModularForms
1039
+ sage: MF = QuasiModularForms(n=5, k=6, ep=-1)
1040
+ sage: MF.dimension()
1041
+ 3
1042
+ sage: MF.default_prec(2)
1043
+ sage: MF.gens()
1044
+ (1 - 37/(200*d)*q + O(q^2),
1045
+ 1 + 33/(200*d)*q + O(q^2),
1046
+ 1 - 27/(200*d)*q + O(q^2))
1047
+
1048
+
1049
+ - **Coordinate vectors for (quasi) holomorphic modular forms and (quasi) cusp forms:**
1050
+ For (quasi) holomorphic modular forms and (quasi) cusp forms it is possible
1051
+ to determine the coordinate vectors of elements with respect to the basis.
1052
+
1053
+ EXAMPLES::
1054
+
1055
+ sage: from sage.modular.modform_hecketriangle.space import ModularForms
1056
+ sage: ModularForms(n=7, k=12, ep=1).dimension()
1057
+ 3
1058
+ sage: ModularForms(n=7, k=12, ep=1).Delta().coordinate_vector()
1059
+ (0, 1, 17/(56*d))
1060
+
1061
+ sage: from sage.modular.modform_hecketriangle.space import QuasiCuspForms
1062
+ sage: MF = QuasiCuspForms(n=7, k=20, ep=1)
1063
+ sage: MF.dimension()
1064
+ 13
1065
+ sage: el = MF(MF.Delta()*MF.E2()^4 + MF.Delta()*MF.E2()*MF.E6())
1066
+ sage: el.coordinate_vector() # long time
1067
+ (0, 0, 0, 1, 29/(196*d), 0, 0, 0, 0, 1, 17/(56*d), 0, 0)
1068
+
1069
+
1070
+ - **Subspaces:**
1071
+ It is possible to construct subspaces of (quasi) holomorphic modular forms
1072
+ or (quasi) cusp forms spaces with respect to a specified basis of the
1073
+ corresponding ambient space. The subspaces also support coordinate
1074
+ vectors with respect to its basis.
1075
+
1076
+ EXAMPLES::
1077
+
1078
+ sage: from sage.modular.modform_hecketriangle.space import ModularForms
1079
+ sage: MF = ModularForms(n=7, k=12, ep=1)
1080
+ sage: subspace = MF.subspace([MF.E4()^3, MF.Delta()])
1081
+ sage: subspace
1082
+ Subspace of dimension 2 of ModularForms(n=7, k=12, ep=1) over Integer Ring
1083
+ sage: el = subspace(MF.E6()^2)
1084
+ sage: el.coordinate_vector()
1085
+ (1, -61/(196*d))
1086
+ sage: el.ambient_coordinate_vector()
1087
+ (1, -61/(196*d), -51187/(614656*d^2))
1088
+
1089
+ sage: from sage.modular.modform_hecketriangle.space import QuasiCuspForms
1090
+ sage: MF = QuasiCuspForms(n=7, k=20, ep=1)
1091
+ sage: subspace = MF.subspace([MF.Delta()*MF.E2()^2*MF.E4(), MF.Delta()*MF.E2()^4]) # long time
1092
+ sage: subspace # long time
1093
+ Subspace of dimension 2 of QuasiCuspForms(n=7, k=20, ep=1) over Integer Ring
1094
+ sage: el = subspace(MF.Delta()*MF.E2()^4) # long time
1095
+ sage: el.coordinate_vector() # long time
1096
+ (0, 1)
1097
+ sage: el.ambient_coordinate_vector() # long time
1098
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17/(56*d), 0, 0)
1099
+
1100
+
1101
+ - **Theta subgroup:**
1102
+ The Hecke triangle group corresponding to ``n=infinity`` is also
1103
+ completely supported. In particular the (special) behavior around
1104
+ the cusp ``-1`` is considered and can be specified.
1105
+
1106
+ EXAMPLES::
1107
+
1108
+ sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing
1109
+ sage: MR = QuasiMeromorphicModularFormsRing(n=infinity, red_hom=True)
1110
+ sage: MR
1111
+ QuasiMeromorphicModularFormsRing(n=+Infinity) over Integer Ring
1112
+ sage: j_inv = MR.j_inv().full_reduce()
1113
+ sage: f_i = MR.f_i().full_reduce()
1114
+ sage: E4 = MR.E4().full_reduce()
1115
+ sage: E2 = MR.E2().full_reduce()
1116
+
1117
+ sage: j_inv
1118
+ q^-1 + 24 + 276*q + 2048*q^2 + 11202*q^3 + 49152*q^4 + O(q^5)
1119
+ sage: MR.f_rho() == MR(1)
1120
+ True
1121
+ sage: E4
1122
+ 1 + 16*q + 112*q^2 + 448*q^3 + 1136*q^4 + O(q^5)
1123
+ sage: f_i
1124
+ 1 - 24*q + 24*q^2 - 96*q^3 + 24*q^4 + O(q^5)
1125
+ sage: E2
1126
+ 1 - 8*q - 8*q^2 - 32*q^3 - 40*q^4 + O(q^5)
1127
+ sage: E4.derivative() == E4 * (E2 - f_i)
1128
+ True
1129
+ sage: f_i.serre_derivative() == -1/2 * E4
1130
+ True
1131
+ sage: MF = f_i.serre_derivative().parent()
1132
+ sage: MF
1133
+ ModularForms(n=+Infinity, k=4, ep=1) over Integer Ring
1134
+ sage: MF.dimension()
1135
+ 2
1136
+ sage: MF.gens()
1137
+ (1 + 240*q^2 + 2160*q^4 + O(q^5), q - 8*q^2 + 28*q^3 - 64*q^4 + O(q^5))
1138
+ sage: E4(i)
1139
+ 1.941017189...
1140
+ sage: E4.order_at(-1)
1141
+ 1
1142
+
1143
+ sage: MF = (E2/E4).reduced_parent()
1144
+ sage: MF.quasi_part_gens(order_1=-1)
1145
+ (1 - 40*q + 552*q^2 - 4896*q^3 + 33320*q^4 + O(q^5),
1146
+ 1 - 24*q + 264*q^2 - 2016*q^3 + 12264*q^4 + O(q^5))
1147
+ sage: prec = MF.required_laurent_prec(order_1=-1)
1148
+ sage: qexp = (E2/E4).q_expansion(prec=prec)
1149
+ sage: qexp
1150
+ 1 - 3/(8*d)*q + O(q^2)
1151
+ sage: MF.construct_quasi_form(qexp, order_1=-1) == E2/E4
1152
+ True
1153
+ sage: MF.disp_prec(6)
1154
+ sage: MF.q_basis(m=-1, order_1=-1, min_exp=-1)
1155
+ q^-1 - 203528/7*q^5 + O(q^6)
1156
+
1157
+ Elements with respect to the full group are automatically coerced
1158
+ to elements of the Theta subgroup if necessary::
1159
+
1160
+ sage: el = QuasiMeromorphicModularFormsRing(n=3).Delta().full_reduce() + E2
1161
+ sage: el
1162
+ (E4*f_i^4 - 2*E4^2*f_i^2 + E4^3 + 4096*E2)/4096
1163
+ sage: el.parent()
1164
+ QuasiModularFormsRing(n=+Infinity) over Integer Ring
1165
+
1166
+
1167
+ - **Determine exact coefficients from numerical ones:**
1168
+ There is some experimental support for replacing numerical coefficients with
1169
+ corresponding exact coefficients. There is however NO guarantee that
1170
+ the procedure will work (and most probably there are cases where it won't).
1171
+
1172
+ EXAMPLES::
1173
+
1174
+ sage: from sage.modular.modform_hecketriangle.space import WeakModularForms, QuasiCuspForms
1175
+ sage: WF = WeakModularForms(n=14)
1176
+ sage: qexp = WF.J_inv().q_expansion_fixed_d(d_num_prec=1000)
1177
+ sage: qexp.parent()
1178
+ Laurent Series Ring in q over Real Field with 1000 bits of precision
1179
+ sage: qexp_int = WF.rationalize_series(qexp)
1180
+ doctest:...: UserWarning: Using an experimental rationalization of coefficients, please check the result for correctness!
1181
+ sage: qexp_int.parent()
1182
+ Laurent Series Ring in q over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
1183
+ sage: qexp_int == WF.J_inv().q_expansion()
1184
+ True
1185
+ sage: WF(qexp_int) == WF.J_inv()
1186
+ True
1187
+
1188
+ sage: QF = QuasiCuspForms(n=8, k=22/3, ep=-1)
1189
+ sage: el = QF(QF.f_inf()*QF.E2())
1190
+ sage: qexp = el.q_expansion_fixed_d(d_num_prec=1000)
1191
+ sage: qexp_int = QF.rationalize_series(qexp)
1192
+ sage: qexp_int == el.q_expansion()
1193
+ True
1194
+ sage: QF(qexp_int) == el
1195
+ True
1196
+
1197
+
1198
+ Future ideas:
1199
+ -------------
1200
+
1201
+ - Complete support for the case ``n=infinity`` (e.g. lambda-CF)
1202
+
1203
+ - Properly implemented lambda-CF
1204
+
1205
+ - Binary quadratic forms for Hecke triangle groups
1206
+
1207
+ - Cycle integrals
1208
+
1209
+ - Maybe: Proper spaces (with coordinates) for (quasi) weakly holomorphic forms with bounds on the initial Fourier exponent
1210
+
1211
+ - Support for general triangle groups (hard)
1212
+
1213
+ - Support for "congruence" subgroups (hard)
1214
+ """