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,425 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.groups
3
+ r"""
4
+ Testing arithmetic subgroup
5
+ """
6
+ ################################################################################
7
+ #
8
+ # Copyright (C) 2009, The Sage Group -- http://www.sagemath.org/
9
+ #
10
+ # Distributed under the terms of the GNU General Public License (GPL)
11
+ #
12
+ # The full text of the GPL is available at:
13
+ #
14
+ # https://www.gnu.org/licenses/
15
+ #
16
+ ################################################################################
17
+ from __future__ import annotations
18
+
19
+ from sage.misc import prandom
20
+ from sage.misc.timing import cputime
21
+ from sage.modular.arithgroup.arithgroup_perm import (
22
+ ArithmeticSubgroup_Permutation,
23
+ EvenArithmeticSubgroup_Permutation,
24
+ OddArithmeticSubgroup_Permutation,
25
+ )
26
+ from sage.modular.arithgroup.congroup_gamma import Gamma_constructor as Gamma
27
+ from sage.modular.arithgroup.congroup_gamma0 import Gamma0_constructor as Gamma0
28
+ from sage.modular.arithgroup.congroup_gamma1 import Gamma1_constructor as Gamma1
29
+ from sage.modular.arithgroup.congroup_gammaH import GammaH_constructor as GammaH
30
+ from sage.rings.finite_rings.integer_mod_ring import Zmod
31
+
32
+
33
+ def random_even_arithgroup(index, nu2_max=None, nu3_max=None):
34
+ r"""
35
+ Return a random even arithmetic subgroup.
36
+
37
+ EXAMPLES::
38
+
39
+ sage: import sage.modular.arithgroup.tests as tests
40
+ sage: G = tests.random_even_arithgroup(30); G # random
41
+ Arithmetic subgroup of index 30
42
+ sage: G.is_even()
43
+ True
44
+ """
45
+ from sage.groups.perm_gps.permgroup import PermutationGroup
46
+
47
+ test = False
48
+
49
+ if nu2_max is None:
50
+ nu2_max = index // 5
51
+ elif nu2_max == 0:
52
+ assert index % 2 == 0
53
+ if nu3_max is None:
54
+ nu3_max = index // 7
55
+ elif nu3_max == 0:
56
+ assert index % 3 == 0
57
+
58
+ while not test:
59
+ nu2 = prandom.randint(0, nu2_max)
60
+ nu2 = index % 2 + nu2 * 2
61
+ nu3 = prandom.randint(0, nu3_max)
62
+ nu3 = index % 3 + nu3 * 3
63
+
64
+ l = list(range(1, index + 1))
65
+ prandom.shuffle(l)
66
+ S2: list[tuple] = []
67
+ for i in range(nu2):
68
+ S2.append((l[i],))
69
+ for i in range(nu2, index, 2):
70
+ S2.append((l[i], l[i + 1]))
71
+ prandom.shuffle(l)
72
+ S3: list[tuple] = []
73
+ for i in range(nu3):
74
+ S3.append((l[i],))
75
+ for i in range(nu3, index, 3):
76
+ S3.append((l[i], l[i + 1], l[i + 2]))
77
+ G = PermutationGroup([S2, S3])
78
+ test = G.is_transitive()
79
+
80
+ return ArithmeticSubgroup_Permutation(S2=S2, S3=S3)
81
+
82
+
83
+ def random_odd_arithgroup(index, nu3_max=None):
84
+ r"""
85
+ Return a random odd arithmetic subgroup.
86
+
87
+ EXAMPLES::
88
+
89
+ sage: from sage.modular.arithgroup.tests import random_odd_arithgroup
90
+ sage: G = random_odd_arithgroup(20); G #random
91
+ Arithmetic subgroup of index 20
92
+ sage: G.is_odd()
93
+ True
94
+ """
95
+ assert index % 4 == 0
96
+ G = random_even_arithgroup(index // 2, nu2_max=0, nu3_max=nu3_max)
97
+ return G.one_odd_subgroup(random=True)
98
+
99
+
100
+ class Test:
101
+ r"""
102
+ Testing class for arithmetic subgroup implemented via permutations.
103
+ """
104
+
105
+ def __init__(self, index=20, index_max=50, odd_probability=0.5):
106
+ r"""
107
+ Create an arithmetic subgroup testing object.
108
+
109
+ INPUT:
110
+
111
+ - ``index`` -- the index of random subgroup to test
112
+
113
+ - ``index_max`` -- the maximum index for congruence subgroup to test
114
+
115
+ EXAMPLES::
116
+
117
+ sage: from sage.modular.arithgroup.tests import Test
118
+ sage: Test()
119
+ Arithmetic subgroup testing class
120
+ """
121
+ self.congroups = []
122
+ i = 1
123
+ self.odd_probability = odd_probability
124
+ if index % 4:
125
+ self.odd_probability = 0
126
+ while Gamma(i).index() < index_max:
127
+ self.congroups.append(Gamma(i))
128
+ i += 1
129
+ i = 1
130
+ while Gamma0(i).index() < index_max:
131
+ self.congroups.append(Gamma0(i))
132
+ i += 1
133
+ i = 2
134
+ while Gamma1(i).index() < index_max:
135
+ self.congroups.append(Gamma1(i))
136
+ M = Zmod(i)
137
+ U = [x for x in M if x.is_unit()]
138
+ for j in range(1, len(U) - 1):
139
+ self.congroups.append(GammaH(i, prandom.sample(U, j)))
140
+ i += 1
141
+
142
+ self.index = index
143
+
144
+ def __repr__(self):
145
+ r"""
146
+ Return the string representation of ``self``.
147
+
148
+ EXAMPLES::
149
+
150
+ sage: from sage.modular.arithgroup.tests import Test
151
+ sage: Test().__repr__()
152
+ 'Arithmetic subgroup testing class'
153
+ """
154
+ return "Arithmetic subgroup testing class"
155
+
156
+ def _do(self, name):
157
+ """
158
+ Perform the test 'test_name', where name is specified as an
159
+ argument. This function exists to avoid a call to eval.
160
+
161
+ EXAMPLES::
162
+
163
+ sage: from sage.modular.arithgroup.tests import Test
164
+ sage: Test()._do("random")
165
+ test_random
166
+ ...
167
+ """
168
+ print("test_%s" % name)
169
+ Test.__dict__["test_%s" % name](self)
170
+
171
+ def random(self, seconds=0):
172
+ """
173
+ Perform random tests for a given number of seconds, or
174
+ indefinitely if seconds is not specified.
175
+
176
+ EXAMPLES::
177
+
178
+ sage: from sage.modular.arithgroup.tests import Test
179
+ sage: Test().random(1)
180
+ test_random
181
+ ...
182
+ """
183
+ self.test("random", seconds)
184
+
185
+ def test(self, name, seconds=0):
186
+ """
187
+ Repeatedly run 'test_name', where name is passed as an
188
+ argument. If seconds is nonzero, run for that many seconds. If
189
+ seconds is 0, run indefinitely.
190
+
191
+ EXAMPLES::
192
+
193
+ sage: from sage.modular.arithgroup.tests import Test
194
+ sage: T = Test()
195
+ sage: T.test('relabel',seconds=1)
196
+ test_relabel
197
+ ...
198
+ sage: T.test('congruence_groups',seconds=1)
199
+ test_congruence_groups
200
+ ...
201
+ sage: T.test('contains',seconds=1)
202
+ test_contains
203
+ ...
204
+ sage: T.test('todd_coxeter',seconds=1)
205
+ test_todd_coxeter
206
+ ...
207
+ """
208
+ seconds = float(seconds)
209
+ total = cputime()
210
+ n = 1
211
+ while seconds == 0 or cputime(total) < seconds:
212
+ s = "** test_dimension: number %s" % n
213
+ if seconds > 0:
214
+ s += " (will stop after about %s seconds)" % seconds
215
+ t = cputime()
216
+ self._do(name)
217
+ print("\ttime=%s\telapsed=%s" % (cputime(t), cputime(total)))
218
+ n += 1
219
+
220
+ def test_random(self):
221
+ """
222
+ Do a random test from all the possible tests.
223
+
224
+ EXAMPLES::
225
+
226
+ sage: from sage.modular.arithgroup.tests import Test
227
+ sage: Test().test_random() #random
228
+ Doing random test
229
+ """
230
+ tests = [a for a in Test.__dict__
231
+ if a[:5] == "test_" and a != "test_random"]
232
+ name = prandom.choice(tests)
233
+ print("Doing random test %s" % name)
234
+ Test.__dict__[name](self)
235
+
236
+ def test_relabel(self):
237
+ r"""
238
+ Try the function canonical labels for a random even modular subgroup.
239
+
240
+ EXAMPLES::
241
+
242
+ sage: from sage.modular.arithgroup.tests import Test
243
+ sage: Test().test_relabel() # random
244
+ """
245
+ if prandom.uniform(0, 1) < self.odd_probability:
246
+ G = random_odd_arithgroup(self.index)
247
+ else:
248
+ G = random_even_arithgroup(self.index)
249
+
250
+ G.relabel()
251
+ s2 = G._S2
252
+ s3 = G._S3
253
+ l = G._L
254
+ r = G._R
255
+
256
+ # 0 should be stabilized by the mapping
257
+ # used for renumbering so we start at 1
258
+ p = list(range(1, self.index))
259
+
260
+ for _ in range(10):
261
+ prandom.shuffle(p)
262
+ # we add 0 to the mapping
263
+ pp = [0] + p
264
+ ss2 = [None] * self.index
265
+ ss3 = [None] * self.index
266
+ ll = [None] * self.index
267
+ rr = [None] * self.index
268
+ for i in range(self.index):
269
+ ss2[pp[i]] = pp[s2[i]]
270
+ ss3[pp[i]] = pp[s3[i]]
271
+ ll[pp[i]] = pp[l[i]]
272
+ rr[pp[i]] = pp[r[i]]
273
+ if G.is_even():
274
+ GG = EvenArithmeticSubgroup_Permutation(ss2, ss3, ll, rr)
275
+ else:
276
+ GG = OddArithmeticSubgroup_Permutation(ss2, ss3, ll, rr)
277
+ GG.relabel()
278
+
279
+ for elt in ['_S2', '_S3', '_L', '_R']:
280
+ if getattr(G, elt) != getattr(GG, elt):
281
+ print("s2 = %s" % str(s2))
282
+ print("s3 = %s" % str(s3))
283
+ print("ss2 = %s" % str(ss2))
284
+ print("ss3 = %s" % str(ss3))
285
+ print("pp = %s" % str(pp))
286
+ raise AssertionError("%s does not coincide" % elt)
287
+
288
+ def test_congruence_groups(self):
289
+ r"""
290
+ Check whether the different implementations of methods for congruence
291
+ groups and generic arithmetic group by permutations return the same
292
+ results.
293
+
294
+ EXAMPLES::
295
+
296
+ sage: from sage.modular.arithgroup.tests import Test
297
+ sage: Test().test_congruence_groups() #random
298
+ """
299
+ G = prandom.choice(self.congroups)
300
+ GG = G.as_permutation_group()
301
+
302
+ if not GG.is_congruence():
303
+ raise AssertionError("Hsu congruence test failed")
304
+
305
+ methods = [
306
+ 'index',
307
+ 'is_odd',
308
+ 'is_even',
309
+ 'is_normal',
310
+ 'ncusps',
311
+ 'nregcusps',
312
+ 'nirregcusps',
313
+ 'nu2',
314
+ 'nu3',
315
+ 'generalised_level']
316
+
317
+ for f in methods:
318
+ if getattr(G, f)() != getattr(GG, f)():
319
+ raise AssertionError("results of %s does not coincide for %s" % (f, G))
320
+
321
+ if sorted(G.cusp_width(c) for c in G.cusps()) != GG.cusp_widths():
322
+ raise AssertionError("Cusps widths are different for %s" % G)
323
+
324
+ for _ in range(20):
325
+ m = GG.random_element()
326
+ if m not in G:
327
+ raise AssertionError("random element generated by perm. group not in %s" % str(G))
328
+
329
+ def test_contains(self):
330
+ r"""
331
+ Test whether the random generator for arithgroup perms gives matrices in
332
+ the group.
333
+
334
+ EXAMPLES::
335
+
336
+ sage: from sage.modular.arithgroup.tests import Test
337
+ sage: Test().test_contains() #random
338
+ """
339
+ if prandom.uniform(0, 1) < self.odd_probability:
340
+ G = random_odd_arithgroup(self.index)
341
+ else:
342
+ G = random_even_arithgroup(self.index)
343
+
344
+ for _ in range(20):
345
+ g = G.random_element()
346
+ if G.random_element() not in G:
347
+ raise AssertionError("%s not in %s" % (g, G))
348
+
349
+ def test_spanning_trees(self):
350
+ r"""
351
+ Test coset representatives obtained from spanning trees for even
352
+ subgroup (Kulkarni's method with generators ``S2``, ``S3`` and Verrill's
353
+ method with generators ``L``, ``S2``).
354
+
355
+ EXAMPLES::
356
+
357
+ sage: from sage.modular.arithgroup.tests import Test
358
+ sage: Test().test_spanning_trees() #random
359
+ """
360
+ from sage.misc.misc_c import prod
361
+
362
+ from .all import SL2Z
363
+ from .arithgroup_perm import Lm, S2m, S3m
364
+
365
+ G = random_even_arithgroup(self.index)
366
+
367
+ m = {'l': Lm, 's': S2m}
368
+ tree, reps, wreps, gens = G._spanning_tree_verrill()
369
+ assert reps[0] == SL2Z([1, 0, 0, 1])
370
+ assert wreps[0] == ''
371
+ for i in range(1, self.index):
372
+ assert prod(m[letter] for letter in wreps[i]) == reps[i]
373
+ tree, reps, wreps, gens = G._spanning_tree_verrill(on_right=False)
374
+ assert reps[0] == SL2Z([1, 0, 0, 1])
375
+ assert wreps[0] == ''
376
+ for i in range(1, self.index):
377
+ assert prod(m[letter] for letter in wreps[i]) == reps[i]
378
+
379
+ m = {'s2': S2m, 's3': S3m}
380
+ tree, reps, wreps, gens = G._spanning_tree_kulkarni()
381
+ assert reps[0] == SL2Z([1, 0, 0, 1])
382
+ assert wreps[0] == []
383
+ for i in range(1, self.index):
384
+ assert prod(m[letter] for letter in wreps[i]) == reps[i]
385
+ tree, reps, wreps, gens = G._spanning_tree_kulkarni(on_right=False)
386
+ assert reps[0] == SL2Z([1, 0, 0, 1])
387
+ assert wreps[0] == []
388
+ for i in range(1, self.index):
389
+ assert prod(m[letter] for letter in wreps[i]) == reps[i]
390
+
391
+ def test_todd_coxeter(self):
392
+ r"""
393
+ Test representatives of Todd-Coxeter algorithm.
394
+
395
+ EXAMPLES::
396
+
397
+ sage: from sage.modular.arithgroup.tests import Test
398
+ sage: Test().test_todd_coxeter() #random
399
+ """
400
+ from .all import SL2Z
401
+ from .arithgroup_perm import Lm, S2m, S3m
402
+
403
+ G = random_even_arithgroup(self.index)
404
+
405
+ reps, gens, l, s2 = G.todd_coxeter_l_s2()
406
+ assert reps[0] == SL2Z([1, 0, 0, 1])
407
+ assert len(reps) == G.index()
408
+ for i in range(1, len(reps)):
409
+ assert reps[i] not in G
410
+ assert reps[i] * S2m * ~reps[s2[i]] in G
411
+ assert reps[i] * Lm * ~reps[l[i]] in G
412
+ for j in range(i + 1, len(reps)):
413
+ assert reps[i] * ~reps[j] not in G
414
+ assert reps[j] * ~reps[i] not in G
415
+
416
+ reps, gens, s2, s3 = G.todd_coxeter_s2_s3()
417
+ assert reps[0] == SL2Z([1, 0, 0, 1])
418
+ assert len(reps) == G.index()
419
+ for i in range(1, len(reps)):
420
+ assert reps[i] not in G
421
+ assert reps[i] * S2m * ~reps[s2[i]] in G
422
+ assert reps[i] * S3m * ~reps[s3[i]] in G
423
+ for j in range(i + 1, len(reps)):
424
+ assert reps[i] * ~reps[j] not in G
425
+ assert reps[j] * ~reps[i] not in G
@@ -0,0 +1,4 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ from sage.modular.btquotients.btquotient import BruhatTitsQuotient
3
+ # from pautomorphicform import pAdicAutomorphicForms
4
+ # from pautomorphicform import BruhatTitsHarmonicCocycles