passagemath-schemes 10.6.40__cp314-cp314-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.

Potentially problematic release.


This version of passagemath-schemes might be problematic. Click here for more details.

Files changed (314) 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.6.40.dist-info/METADATA +204 -0
  7. passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
  8. passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
  9. passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.6.40.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 +9558 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +745 -0
  29. sage/lfunctions/pari.py +818 -0
  30. sage/lfunctions/zero_sums.cpython-314-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5135 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
  34. sage/modular/abvar/abvar_newform.py +244 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +186 -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 +720 -0
  40. sage/modular/abvar/homspace.py +998 -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 +740 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1402 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +363 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +653 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1469 -0
  57. sage/modular/arithgroup/congroup_generic.py +628 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +267 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1066 -0
  61. sage/modular/arithgroup/tests.py +418 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3753 -0
  64. sage/modular/btquotients/pautomorphicform.py +2570 -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 +1109 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +569 -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 +1065 -0
  77. sage/modular/hecke/algebra.py +746 -0
  78. sage/modular/hecke/all.py +20 -0
  79. sage/modular/hecke/ambient_module.py +1019 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +325 -0
  82. sage/modular/hecke/hecke_operator.py +780 -0
  83. sage/modular/hecke/homspace.py +206 -0
  84. sage/modular/hecke/module.py +1767 -0
  85. sage/modular/hecke/morphism.py +174 -0
  86. sage/modular/hecke/submodule.py +989 -0
  87. sage/modular/hypergeometric_misc.cpython-314-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 +2017 -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 +1071 -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 +815 -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 +124 -0
  101. sage/modular/modform/ambient_g1.py +204 -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 +505 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4131 -0
  108. sage/modular/modform/find_generators.py +59 -0
  109. sage/modular/modform/half_integral.py +154 -0
  110. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  111. sage/modular/modform/j_invariant.py +47 -0
  112. sage/modular/modform/l_series_gross_zagier.py +133 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314-darwin.so +0 -0
  114. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  115. sage/modular/modform/notes.py +45 -0
  116. sage/modular/modform/numerical.py +514 -0
  117. sage/modular/modform/periods.py +14 -0
  118. sage/modular/modform/ring.py +1257 -0
  119. sage/modular/modform/space.py +1860 -0
  120. sage/modular/modform/submodule.py +118 -0
  121. sage/modular/modform/tests.py +64 -0
  122. sage/modular/modform/theta.py +110 -0
  123. sage/modular/modform/vm_basis.py +381 -0
  124. sage/modular/modform/weight1.py +220 -0
  125. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  126. sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
  127. sage/modular/modform_hecketriangle/all.py +30 -0
  128. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  129. sage/modular/modform_hecketriangle/constructor.py +416 -0
  130. sage/modular/modform_hecketriangle/element.py +351 -0
  131. sage/modular/modform_hecketriangle/functors.py +752 -0
  132. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  133. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
  135. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
  136. sage/modular/modform_hecketriangle/readme.py +1214 -0
  137. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  138. sage/modular/modform_hecketriangle/space.py +1037 -0
  139. sage/modular/modform_hecketriangle/subspace.py +423 -0
  140. sage/modular/modsym/all.py +17 -0
  141. sage/modular/modsym/ambient.py +3846 -0
  142. sage/modular/modsym/boundary.py +1420 -0
  143. sage/modular/modsym/element.py +336 -0
  144. sage/modular/modsym/g1list.py +178 -0
  145. sage/modular/modsym/ghlist.py +182 -0
  146. sage/modular/modsym/hecke_operator.py +73 -0
  147. sage/modular/modsym/manin_symbol.cpython-314-darwin.so +0 -0
  148. sage/modular/modsym/manin_symbol.pxd +5 -0
  149. sage/modular/modsym/manin_symbol.pyx +497 -0
  150. sage/modular/modsym/manin_symbol_list.py +1295 -0
  151. sage/modular/modsym/modsym.py +400 -0
  152. sage/modular/modsym/modular_symbols.py +384 -0
  153. sage/modular/modsym/p1list.cpython-314-darwin.so +0 -0
  154. sage/modular/modsym/p1list.pxd +29 -0
  155. sage/modular/modsym/p1list.pyx +1372 -0
  156. sage/modular/modsym/p1list_nf.py +1241 -0
  157. sage/modular/modsym/relation_matrix.py +591 -0
  158. sage/modular/modsym/relation_matrix_pyx.cpython-314-darwin.so +0 -0
  159. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  160. sage/modular/modsym/space.py +2468 -0
  161. sage/modular/modsym/subspace.py +455 -0
  162. sage/modular/modsym/tests.py +375 -0
  163. sage/modular/multiple_zeta.py +2632 -0
  164. sage/modular/multiple_zeta_F_algebra.py +786 -0
  165. sage/modular/overconvergent/all.py +6 -0
  166. sage/modular/overconvergent/genus0.py +1878 -0
  167. sage/modular/overconvergent/hecke_series.py +1187 -0
  168. sage/modular/overconvergent/weightspace.py +778 -0
  169. sage/modular/pollack_stevens/all.py +4 -0
  170. sage/modular/pollack_stevens/distributions.py +874 -0
  171. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  172. sage/modular/pollack_stevens/manin_map.py +859 -0
  173. sage/modular/pollack_stevens/modsym.py +1593 -0
  174. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  175. sage/modular/pollack_stevens/sigma0.py +534 -0
  176. sage/modular/pollack_stevens/space.py +1076 -0
  177. sage/modular/quasimodform/all.py +3 -0
  178. sage/modular/quasimodform/element.py +845 -0
  179. sage/modular/quasimodform/ring.py +828 -0
  180. sage/modular/quatalg/all.py +3 -0
  181. sage/modular/quatalg/brandt.py +1642 -0
  182. sage/modular/ssmod/all.py +8 -0
  183. sage/modular/ssmod/ssmod.py +827 -0
  184. sage/rings/all__sagemath_schemes.py +1 -0
  185. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  186. sage/rings/polynomial/binary_form_reduce.py +585 -0
  187. sage/schemes/all.py +41 -0
  188. sage/schemes/berkovich/all.py +6 -0
  189. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  190. sage/schemes/berkovich/berkovich_space.py +748 -0
  191. sage/schemes/curves/affine_curve.py +2928 -0
  192. sage/schemes/curves/all.py +33 -0
  193. sage/schemes/curves/closed_point.py +434 -0
  194. sage/schemes/curves/constructor.py +381 -0
  195. sage/schemes/curves/curve.py +542 -0
  196. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  197. sage/schemes/curves/point.py +463 -0
  198. sage/schemes/curves/projective_curve.py +3026 -0
  199. sage/schemes/curves/zariski_vankampen.py +1932 -0
  200. sage/schemes/cyclic_covers/all.py +2 -0
  201. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  202. sage/schemes/cyclic_covers/constructor.py +137 -0
  203. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  204. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  205. sage/schemes/elliptic_curves/BSD.py +1036 -0
  206. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  207. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  208. sage/schemes/elliptic_curves/all.py +49 -0
  209. sage/schemes/elliptic_curves/cardinality.py +609 -0
  210. sage/schemes/elliptic_curves/cm.py +1102 -0
  211. sage/schemes/elliptic_curves/constructor.py +1552 -0
  212. sage/schemes/elliptic_curves/ec_database.py +175 -0
  213. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
  214. sage/schemes/elliptic_curves/ell_egros.py +459 -0
  215. sage/schemes/elliptic_curves/ell_field.py +2836 -0
  216. sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
  217. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  218. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  219. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  220. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  221. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  222. sage/schemes/elliptic_curves/ell_point.py +4787 -0
  223. sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
  224. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  225. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  226. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  227. sage/schemes/elliptic_curves/formal_group.py +760 -0
  228. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  229. sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
  230. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  231. sage/schemes/elliptic_curves/heegner.py +7335 -0
  232. sage/schemes/elliptic_curves/height.py +2109 -0
  233. sage/schemes/elliptic_curves/hom.py +1406 -0
  234. sage/schemes/elliptic_curves/hom_composite.py +934 -0
  235. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  236. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  237. sage/schemes/elliptic_curves/hom_sum.py +682 -0
  238. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  239. sage/schemes/elliptic_curves/homset.py +271 -0
  240. sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
  241. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  242. sage/schemes/elliptic_curves/jacobian.py +237 -0
  243. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  244. sage/schemes/elliptic_curves/kraus.py +1014 -0
  245. sage/schemes/elliptic_curves/lseries_ell.py +943 -0
  246. sage/schemes/elliptic_curves/mod5family.py +105 -0
  247. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  248. sage/schemes/elliptic_curves/mod_sym_num.cpython-314-darwin.so +0 -0
  249. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  250. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  251. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  252. sage/schemes/elliptic_curves/padics.py +1816 -0
  253. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  254. sage/schemes/elliptic_curves/period_lattice_region.cpython-314-darwin.so +0 -0
  255. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  256. sage/schemes/elliptic_curves/saturation.py +715 -0
  257. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  258. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  259. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  260. sage/schemes/hyperelliptic_curves/all.py +6 -0
  261. sage/schemes/hyperelliptic_curves/constructor.py +291 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
  265. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  266. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  267. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
  271. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  272. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
  273. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  274. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  275. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
  276. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  277. sage/schemes/jacobians/all.py +2 -0
  278. sage/schemes/overview.py +161 -0
  279. sage/schemes/plane_conics/all.py +22 -0
  280. sage/schemes/plane_conics/con_field.py +1296 -0
  281. sage/schemes/plane_conics/con_finite_field.py +158 -0
  282. sage/schemes/plane_conics/con_number_field.py +456 -0
  283. sage/schemes/plane_conics/con_rational_field.py +406 -0
  284. sage/schemes/plane_conics/con_rational_function_field.py +580 -0
  285. sage/schemes/plane_conics/constructor.py +249 -0
  286. sage/schemes/plane_quartics/all.py +2 -0
  287. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  288. sage/schemes/plane_quartics/quartic_generic.py +73 -0
  289. sage/schemes/riemann_surfaces/all.py +1 -0
  290. sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
  291. sage_wheels/share/cremona/cremona_mini.db +0 -0
  292. sage_wheels/share/ellcurves/rank0 +30427 -0
  293. sage_wheels/share/ellcurves/rank1 +31871 -0
  294. sage_wheels/share/ellcurves/rank10 +6 -0
  295. sage_wheels/share/ellcurves/rank11 +6 -0
  296. sage_wheels/share/ellcurves/rank12 +1 -0
  297. sage_wheels/share/ellcurves/rank14 +1 -0
  298. sage_wheels/share/ellcurves/rank15 +1 -0
  299. sage_wheels/share/ellcurves/rank17 +1 -0
  300. sage_wheels/share/ellcurves/rank19 +1 -0
  301. sage_wheels/share/ellcurves/rank2 +2388 -0
  302. sage_wheels/share/ellcurves/rank20 +1 -0
  303. sage_wheels/share/ellcurves/rank21 +1 -0
  304. sage_wheels/share/ellcurves/rank22 +1 -0
  305. sage_wheels/share/ellcurves/rank23 +1 -0
  306. sage_wheels/share/ellcurves/rank24 +1 -0
  307. sage_wheels/share/ellcurves/rank28 +1 -0
  308. sage_wheels/share/ellcurves/rank3 +836 -0
  309. sage_wheels/share/ellcurves/rank4 +10 -0
  310. sage_wheels/share/ellcurves/rank5 +5 -0
  311. sage_wheels/share/ellcurves/rank6 +5 -0
  312. sage_wheels/share/ellcurves/rank7 +5 -0
  313. sage_wheels/share/ellcurves/rank8 +6 -0
  314. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,418 @@
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 .arithgroup_perm import ArithmeticSubgroup_Permutation, EvenArithmeticSubgroup_Permutation, OddArithmeticSubgroup_Permutation
20
+ from sage.modular.arithgroup.all import Gamma, Gamma0, Gamma1, GammaH
21
+ from sage.rings.finite_rings.integer_mod_ring import Zmod
22
+
23
+ import sage.misc.prandom as prandom
24
+ from sage.misc.timing import cputime
25
+
26
+
27
+ def random_even_arithgroup(index, nu2_max=None, nu3_max=None):
28
+ r"""
29
+ Return a random even arithmetic subgroup.
30
+
31
+ EXAMPLES::
32
+
33
+ sage: import sage.modular.arithgroup.tests as tests
34
+ sage: G = tests.random_even_arithgroup(30); G # random
35
+ Arithmetic subgroup of index 30
36
+ sage: G.is_even()
37
+ True
38
+ """
39
+ from sage.groups.perm_gps.permgroup import PermutationGroup
40
+
41
+ test = False
42
+
43
+ if nu2_max is None:
44
+ nu2_max = index // 5
45
+ elif nu2_max == 0:
46
+ assert index % 2 == 0
47
+ if nu3_max is None:
48
+ nu3_max = index // 7
49
+ elif nu3_max == 0:
50
+ assert index % 3 == 0
51
+
52
+ while not test:
53
+ nu2 = prandom.randint(0, nu2_max)
54
+ nu2 = index % 2 + nu2 * 2
55
+ nu3 = prandom.randint(0, nu3_max)
56
+ nu3 = index % 3 + nu3 * 3
57
+
58
+ l = list(range(1, index + 1))
59
+ prandom.shuffle(l)
60
+ S2: list[tuple] = []
61
+ for i in range(nu2):
62
+ S2.append((l[i],))
63
+ for i in range(nu2, index, 2):
64
+ S2.append((l[i], l[i + 1]))
65
+ prandom.shuffle(l)
66
+ S3: list[tuple] = []
67
+ for i in range(nu3):
68
+ S3.append((l[i],))
69
+ for i in range(nu3, index, 3):
70
+ S3.append((l[i], l[i + 1], l[i + 2]))
71
+ G = PermutationGroup([S2, S3])
72
+ test = G.is_transitive()
73
+
74
+ return ArithmeticSubgroup_Permutation(S2=S2, S3=S3)
75
+
76
+
77
+ def random_odd_arithgroup(index, nu3_max=None):
78
+ r"""
79
+ Return a random odd arithmetic subgroup.
80
+
81
+ EXAMPLES::
82
+
83
+ sage: from sage.modular.arithgroup.tests import random_odd_arithgroup
84
+ sage: G = random_odd_arithgroup(20); G #random
85
+ Arithmetic subgroup of index 20
86
+ sage: G.is_odd()
87
+ True
88
+ """
89
+ assert index % 4 == 0
90
+ G = random_even_arithgroup(index // 2, nu2_max=0, nu3_max=nu3_max)
91
+ return G.one_odd_subgroup(random=True)
92
+
93
+
94
+ class Test:
95
+ r"""
96
+ Testing class for arithmetic subgroup implemented via permutations.
97
+ """
98
+
99
+ def __init__(self, index=20, index_max=50, odd_probability=0.5):
100
+ r"""
101
+ Create an arithmetic subgroup testing object.
102
+
103
+ INPUT:
104
+
105
+ - ``index`` -- the index of random subgroup to test
106
+
107
+ - ``index_max`` -- the maximum index for congruence subgroup to test
108
+
109
+ EXAMPLES::
110
+
111
+ sage: from sage.modular.arithgroup.tests import Test
112
+ sage: Test()
113
+ Arithmetic subgroup testing class
114
+ """
115
+ self.congroups = []
116
+ i = 1
117
+ self.odd_probability = odd_probability
118
+ if index % 4:
119
+ self.odd_probability = 0
120
+ while Gamma(i).index() < index_max:
121
+ self.congroups.append(Gamma(i))
122
+ i += 1
123
+ i = 1
124
+ while Gamma0(i).index() < index_max:
125
+ self.congroups.append(Gamma0(i))
126
+ i += 1
127
+ i = 2
128
+ while Gamma1(i).index() < index_max:
129
+ self.congroups.append(Gamma1(i))
130
+ M = Zmod(i)
131
+ U = [x for x in M if x.is_unit()]
132
+ for j in range(1, len(U) - 1):
133
+ self.congroups.append(GammaH(i, prandom.sample(U, j)))
134
+ i += 1
135
+
136
+ self.index = index
137
+
138
+ def __repr__(self):
139
+ r"""
140
+ Return the string representation of ``self``.
141
+
142
+ EXAMPLES::
143
+
144
+ sage: from sage.modular.arithgroup.tests import Test
145
+ sage: Test().__repr__()
146
+ 'Arithmetic subgroup testing class'
147
+ """
148
+ return "Arithmetic subgroup testing class"
149
+
150
+ def _do(self, name):
151
+ """
152
+ Perform the test 'test_name', where name is specified as an
153
+ argument. This function exists to avoid a call to eval.
154
+
155
+ EXAMPLES::
156
+
157
+ sage: from sage.modular.arithgroup.tests import Test
158
+ sage: Test()._do("random")
159
+ test_random
160
+ ...
161
+ """
162
+ print("test_%s" % name)
163
+ Test.__dict__["test_%s" % name](self)
164
+
165
+ def random(self, seconds=0):
166
+ """
167
+ Perform random tests for a given number of seconds, or
168
+ indefinitely if seconds is not specified.
169
+
170
+ EXAMPLES::
171
+
172
+ sage: from sage.modular.arithgroup.tests import Test
173
+ sage: Test().random(1)
174
+ test_random
175
+ ...
176
+ """
177
+ self.test("random", seconds)
178
+
179
+ def test(self, name, seconds=0):
180
+ """
181
+ Repeatedly run 'test_name', where name is passed as an
182
+ argument. If seconds is nonzero, run for that many seconds. If
183
+ seconds is 0, run indefinitely.
184
+
185
+ EXAMPLES::
186
+
187
+ sage: from sage.modular.arithgroup.tests import Test
188
+ sage: T = Test()
189
+ sage: T.test('relabel',seconds=1)
190
+ test_relabel
191
+ ...
192
+ sage: T.test('congruence_groups',seconds=1)
193
+ test_congruence_groups
194
+ ...
195
+ sage: T.test('contains',seconds=1)
196
+ test_contains
197
+ ...
198
+ sage: T.test('todd_coxeter',seconds=1)
199
+ test_todd_coxeter
200
+ ...
201
+ """
202
+ seconds = float(seconds)
203
+ total = cputime()
204
+ n = 1
205
+ while seconds == 0 or cputime(total) < seconds:
206
+ s = "** test_dimension: number %s" % n
207
+ if seconds > 0:
208
+ s += " (will stop after about %s seconds)" % seconds
209
+ t = cputime()
210
+ self._do(name)
211
+ print("\ttime=%s\telapsed=%s" % (cputime(t), cputime(total)))
212
+ n += 1
213
+
214
+ def test_random(self):
215
+ """
216
+ Do a random test from all the possible tests.
217
+
218
+ EXAMPLES::
219
+
220
+ sage: from sage.modular.arithgroup.tests import Test
221
+ sage: Test().test_random() #random
222
+ Doing random test
223
+ """
224
+ tests = [a for a in Test.__dict__
225
+ if a[:5] == "test_" and a != "test_random"]
226
+ name = prandom.choice(tests)
227
+ print("Doing random test %s" % name)
228
+ Test.__dict__[name](self)
229
+
230
+ def test_relabel(self):
231
+ r"""
232
+ Try the function canonical labels for a random even modular subgroup.
233
+
234
+ EXAMPLES::
235
+
236
+ sage: from sage.modular.arithgroup.tests import Test
237
+ sage: Test().test_relabel() # random
238
+ """
239
+ if prandom.uniform(0, 1) < self.odd_probability:
240
+ G = random_odd_arithgroup(self.index)
241
+ else:
242
+ G = random_even_arithgroup(self.index)
243
+
244
+ G.relabel()
245
+ s2 = G._S2
246
+ s3 = G._S3
247
+ l = G._L
248
+ r = G._R
249
+
250
+ # 0 should be stabilized by the mapping
251
+ # used for renumbering so we start at 1
252
+ p = list(range(1, self.index))
253
+
254
+ for _ in range(10):
255
+ prandom.shuffle(p)
256
+ # we add 0 to the mapping
257
+ pp = [0] + p
258
+ ss2 = [None] * self.index
259
+ ss3 = [None] * self.index
260
+ ll = [None] * self.index
261
+ rr = [None] * self.index
262
+ for i in range(self.index):
263
+ ss2[pp[i]] = pp[s2[i]]
264
+ ss3[pp[i]] = pp[s3[i]]
265
+ ll[pp[i]] = pp[l[i]]
266
+ rr[pp[i]] = pp[r[i]]
267
+ if G.is_even():
268
+ GG = EvenArithmeticSubgroup_Permutation(ss2, ss3, ll, rr)
269
+ else:
270
+ GG = OddArithmeticSubgroup_Permutation(ss2, ss3, ll, rr)
271
+ GG.relabel()
272
+
273
+ for elt in ['_S2', '_S3', '_L', '_R']:
274
+ if getattr(G, elt) != getattr(GG, elt):
275
+ print("s2 = %s" % str(s2))
276
+ print("s3 = %s" % str(s3))
277
+ print("ss2 = %s" % str(ss2))
278
+ print("ss3 = %s" % str(ss3))
279
+ print("pp = %s" % str(pp))
280
+ raise AssertionError("%s does not coincide" % elt)
281
+
282
+ def test_congruence_groups(self):
283
+ r"""
284
+ Check whether the different implementations of methods for congruence
285
+ groups and generic arithmetic group by permutations return the same
286
+ results.
287
+
288
+ EXAMPLES::
289
+
290
+ sage: from sage.modular.arithgroup.tests import Test
291
+ sage: Test().test_congruence_groups() #random
292
+ """
293
+ G = prandom.choice(self.congroups)
294
+ GG = G.as_permutation_group()
295
+
296
+ if not GG.is_congruence():
297
+ raise AssertionError("Hsu congruence test failed")
298
+
299
+ methods = [
300
+ 'index',
301
+ 'is_odd',
302
+ 'is_even',
303
+ 'is_normal',
304
+ 'ncusps',
305
+ 'nregcusps',
306
+ 'nirregcusps',
307
+ 'nu2',
308
+ 'nu3',
309
+ 'generalised_level']
310
+
311
+ for f in methods:
312
+ if getattr(G, f)() != getattr(GG, f)():
313
+ raise AssertionError("results of %s does not coincide for %s" % (f, G))
314
+
315
+ if sorted(G.cusp_width(c) for c in G.cusps()) != GG.cusp_widths():
316
+ raise AssertionError("Cusps widths are different for %s" % G)
317
+
318
+ for _ in range(20):
319
+ m = GG.random_element()
320
+ if m not in G:
321
+ raise AssertionError("random element generated by perm. group not in %s" % str(G))
322
+
323
+ def test_contains(self):
324
+ r"""
325
+ Test whether the random generator for arithgroup perms gives matrices in
326
+ the group.
327
+
328
+ EXAMPLES::
329
+
330
+ sage: from sage.modular.arithgroup.tests import Test
331
+ sage: Test().test_contains() #random
332
+ """
333
+ if prandom.uniform(0, 1) < self.odd_probability:
334
+ G = random_odd_arithgroup(self.index)
335
+ else:
336
+ G = random_even_arithgroup(self.index)
337
+
338
+ for _ in range(20):
339
+ g = G.random_element()
340
+ if G.random_element() not in G:
341
+ raise AssertionError("%s not in %s" % (g, G))
342
+
343
+ def test_spanning_trees(self):
344
+ r"""
345
+ Test coset representatives obtained from spanning trees for even
346
+ subgroup (Kulkarni's method with generators ``S2``, ``S3`` and Verrill's
347
+ method with generators ``L``, ``S2``).
348
+
349
+ EXAMPLES::
350
+
351
+ sage: from sage.modular.arithgroup.tests import Test
352
+ sage: Test().test_spanning_trees() #random
353
+ """
354
+ from sage.misc.misc_c import prod
355
+ from .all import SL2Z
356
+ from .arithgroup_perm import S2m, S3m, Lm
357
+
358
+ G = random_even_arithgroup(self.index)
359
+
360
+ m = {'l': Lm, 's': S2m}
361
+ tree, reps, wreps, gens = G._spanning_tree_verrill()
362
+ assert reps[0] == SL2Z([1, 0, 0, 1])
363
+ assert wreps[0] == ''
364
+ for i in range(1, self.index):
365
+ assert prod(m[letter] for letter in wreps[i]) == reps[i]
366
+ tree, reps, wreps, gens = G._spanning_tree_verrill(on_right=False)
367
+ assert reps[0] == SL2Z([1, 0, 0, 1])
368
+ assert wreps[0] == ''
369
+ for i in range(1, self.index):
370
+ assert prod(m[letter] for letter in wreps[i]) == reps[i]
371
+
372
+ m = {'s2': S2m, 's3': S3m}
373
+ tree, reps, wreps, gens = G._spanning_tree_kulkarni()
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
+ tree, reps, wreps, gens = G._spanning_tree_kulkarni(on_right=False)
379
+ assert reps[0] == SL2Z([1, 0, 0, 1])
380
+ assert wreps[0] == []
381
+ for i in range(1, self.index):
382
+ assert prod(m[letter] for letter in wreps[i]) == reps[i]
383
+
384
+ def test_todd_coxeter(self):
385
+ r"""
386
+ Test representatives of Todd-Coxeter algorithm.
387
+
388
+ EXAMPLES::
389
+
390
+ sage: from sage.modular.arithgroup.tests import Test
391
+ sage: Test().test_todd_coxeter() #random
392
+ """
393
+ from .all import SL2Z
394
+ from .arithgroup_perm import S2m, S3m, Lm
395
+
396
+ G = random_even_arithgroup(self.index)
397
+
398
+ reps, gens, l, s2 = G.todd_coxeter_l_s2()
399
+ assert reps[0] == SL2Z([1, 0, 0, 1])
400
+ assert len(reps) == G.index()
401
+ for i in range(1, len(reps)):
402
+ assert reps[i] not in G
403
+ assert reps[i] * S2m * ~reps[s2[i]] in G
404
+ assert reps[i] * Lm * ~reps[l[i]] in G
405
+ for j in range(i + 1, len(reps)):
406
+ assert reps[i] * ~reps[j] not in G
407
+ assert reps[j] * ~reps[i] not in G
408
+
409
+ reps, gens, s2, s3 = G.todd_coxeter_s2_s3()
410
+ assert reps[0] == SL2Z([1, 0, 0, 1])
411
+ assert len(reps) == G.index()
412
+ for i in range(1, len(reps)):
413
+ assert reps[i] not in G
414
+ assert reps[i] * S2m * ~reps[s2[i]] in G
415
+ assert reps[i] * S3m * ~reps[s3[i]] in G
416
+ for j in range(i + 1, len(reps)):
417
+ assert reps[i] * ~reps[j] not in G
418
+ 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