passagemath-schemes 10.6.47__cp312-cp312-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.
- passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.6.47.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.47.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.47.dist-info/RECORD +311 -0
- passagemath_schemes-10.6.47.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.47.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +745 -0
- sage/lfunctions/pari.py +818 -0
- sage/lfunctions/zero_sums.cpython-312-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5135 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
- sage/modular/abvar/abvar_newform.py +244 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +186 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +720 -0
- sage/modular/abvar/homspace.py +998 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +740 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1402 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +363 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +653 -0
- sage/modular/arithgroup/congroup_gammaH.py +1469 -0
- sage/modular/arithgroup/congroup_generic.py +628 -0
- sage/modular/arithgroup/congroup_sl2z.py +267 -0
- sage/modular/arithgroup/farey_symbol.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1066 -0
- sage/modular/arithgroup/tests.py +418 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3753 -0
- sage/modular/btquotients/pautomorphicform.py +2570 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1109 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +569 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1065 -0
- sage/modular/hecke/algebra.py +746 -0
- sage/modular/hecke/all.py +20 -0
- sage/modular/hecke/ambient_module.py +1019 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +325 -0
- sage/modular/hecke/hecke_operator.py +780 -0
- sage/modular/hecke/homspace.py +206 -0
- sage/modular/hecke/module.py +1767 -0
- sage/modular/hecke/morphism.py +174 -0
- sage/modular/hecke/submodule.py +989 -0
- sage/modular/hypergeometric_misc.cpython-312-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2017 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1071 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +815 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +124 -0
- sage/modular/modform/ambient_g1.py +204 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +505 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4131 -0
- sage/modular/modform/find_generators.py +59 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +133 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-312-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1860 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +381 -0
- sage/modular/modform/weight1.py +220 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3846 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-312-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1295 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-312-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +375 -0
- sage/modular/multiple_zeta.py +2632 -0
- sage/modular/multiple_zeta_F_algebra.py +786 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1878 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +778 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +859 -0
- sage/modular/pollack_stevens/modsym.py +1593 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1076 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +845 -0
- sage/modular/quasimodform/ring.py +828 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +748 -0
- sage/schemes/curves/affine_curve.py +2928 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +381 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3026 -0
- sage/schemes/curves/zariski_vankampen.py +1932 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +1036 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1102 -0
- sage/schemes/elliptic_curves/constructor.py +1552 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
- sage/schemes/elliptic_curves/ell_egros.py +459 -0
- sage/schemes/elliptic_curves/ell_field.py +2836 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4787 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7335 -0
- sage/schemes/elliptic_curves/height.py +2109 -0
- sage/schemes/elliptic_curves/hom.py +1406 -0
- sage/schemes/elliptic_curves/hom_composite.py +934 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +682 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +237 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +943 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +715 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +291 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +580 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +73 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- 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
|