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,375 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Testing modular symbols spaces
|
|
5
|
+
|
|
6
|
+
TESTS::
|
|
7
|
+
|
|
8
|
+
sage: m = ModularSymbols(389)
|
|
9
|
+
sage: [(g.degree(), e) for g, e in m.T(2).fcp()]
|
|
10
|
+
[(1, 1), (1, 2), (2, 2), (3, 2), (6, 2), (20, 2)]
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# ****************************************************************************
|
|
14
|
+
# Sage: Open Source Mathematical Software
|
|
15
|
+
#
|
|
16
|
+
# Copyright (C) 2005 William Stein <wstein@gmail.com>
|
|
17
|
+
#
|
|
18
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
19
|
+
#
|
|
20
|
+
# This code is distributed in the hope that it will be useful,
|
|
21
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
22
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
23
|
+
# General Public License for more details.
|
|
24
|
+
#
|
|
25
|
+
# The full text of the GPL is available at:
|
|
26
|
+
#
|
|
27
|
+
# https://www.gnu.org/licenses/
|
|
28
|
+
# ****************************************************************************
|
|
29
|
+
|
|
30
|
+
import random
|
|
31
|
+
|
|
32
|
+
from . import modsym
|
|
33
|
+
import sage.modular.dirichlet as dirichlet
|
|
34
|
+
import sage.modular.arithgroup.all as arithgroup
|
|
35
|
+
from sage.misc.timing import cputime
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Test:
|
|
39
|
+
"""
|
|
40
|
+
Modular symbol testing class.
|
|
41
|
+
"""
|
|
42
|
+
def __init__(self, levels=20, weights=4, onlyg0=False, onlyg1=False,
|
|
43
|
+
onlychar=False):
|
|
44
|
+
"""
|
|
45
|
+
Create a modular symbol testing object.
|
|
46
|
+
|
|
47
|
+
INPUT:
|
|
48
|
+
|
|
49
|
+
- ``levels`` -- list or integer
|
|
50
|
+
- ``weights`` -- list or integer
|
|
51
|
+
- ``onlyg0`` -- boolean; if ``True`` only select Gamma0 spaces for testing
|
|
52
|
+
- ``onlyg1`` -- boolean; if ``True`` only select Gamma1 spaces for testing
|
|
53
|
+
- ``onlychar`` -- boolean; if ``True`` only selects spaces with character for testing
|
|
54
|
+
|
|
55
|
+
EXAMPLES::
|
|
56
|
+
|
|
57
|
+
sage: from sage.modular.modsym.tests import Test
|
|
58
|
+
sage: Test()
|
|
59
|
+
Modular symbols testing class
|
|
60
|
+
sage: T = Test(weights=[3,5,7])
|
|
61
|
+
sage: T.weights
|
|
62
|
+
[3, 5, 7]
|
|
63
|
+
sage: T = Test(levels=5) ; T.levels
|
|
64
|
+
[1, 2, 3, 4, 5]
|
|
65
|
+
"""
|
|
66
|
+
if not isinstance(levels, list):
|
|
67
|
+
levels = list(range(1, int(levels) + 1))
|
|
68
|
+
if not isinstance(weights, list):
|
|
69
|
+
weights = list(range(2, int(weights) + 1))
|
|
70
|
+
self.levels = levels
|
|
71
|
+
self.weights = weights
|
|
72
|
+
if not levels:
|
|
73
|
+
raise RuntimeError("levels must have positive length")
|
|
74
|
+
if not weights:
|
|
75
|
+
raise RuntimeError("weights must have positive length")
|
|
76
|
+
self.current_space = None
|
|
77
|
+
self.onlyg0 = onlyg0
|
|
78
|
+
self.onlyg1 = onlyg1
|
|
79
|
+
self.onlychar = onlychar
|
|
80
|
+
|
|
81
|
+
def __repr__(self):
|
|
82
|
+
"""
|
|
83
|
+
Return the string representation of ``self``.
|
|
84
|
+
|
|
85
|
+
EXAMPLES::
|
|
86
|
+
|
|
87
|
+
sage: from sage.modular.modsym.tests import Test
|
|
88
|
+
sage: Test().__repr__()
|
|
89
|
+
'Modular symbols testing class'
|
|
90
|
+
"""
|
|
91
|
+
return "Modular symbols testing class"
|
|
92
|
+
|
|
93
|
+
def _modular_symbols_space(self):
|
|
94
|
+
"""
|
|
95
|
+
Generate a random space of modular symbols subject to
|
|
96
|
+
the conditions of ``self``.
|
|
97
|
+
|
|
98
|
+
EXAMPLES::
|
|
99
|
+
|
|
100
|
+
sage: from sage.modular.modsym.tests import Test
|
|
101
|
+
sage: T = Test(levels=[5],weights=[2], onlychar=True)
|
|
102
|
+
|
|
103
|
+
Note that the sign of the generated space is always arbitrary.
|
|
104
|
+
sage: T._modular_symbols_space()
|
|
105
|
+
character
|
|
106
|
+
level = 5, weight = 2, sign = ...
|
|
107
|
+
...
|
|
108
|
+
"""
|
|
109
|
+
if self.onlyg0:
|
|
110
|
+
which = 0
|
|
111
|
+
elif self.onlyg1:
|
|
112
|
+
which = 1
|
|
113
|
+
elif self.onlychar:
|
|
114
|
+
which = 2
|
|
115
|
+
else:
|
|
116
|
+
which = random.randrange(0, 3)
|
|
117
|
+
if which == 0:
|
|
118
|
+
print("gamma0")
|
|
119
|
+
M = self._modular_symbols_space_gamma0()
|
|
120
|
+
elif which == 1:
|
|
121
|
+
print("gamma1")
|
|
122
|
+
M = self._modular_symbols_space_gamma1()
|
|
123
|
+
else:
|
|
124
|
+
print("character")
|
|
125
|
+
M = self._modular_symbols_space_character()
|
|
126
|
+
print("\t", M)
|
|
127
|
+
return M
|
|
128
|
+
|
|
129
|
+
def _level_weight_sign(self):
|
|
130
|
+
"""
|
|
131
|
+
Return a triple containing a random choice of level from
|
|
132
|
+
self.levels, weights from self.weights, and sign chosen
|
|
133
|
+
randomly from [1, 0, -1].
|
|
134
|
+
|
|
135
|
+
EXAMPLES::
|
|
136
|
+
|
|
137
|
+
sage: from sage.modular.modsym.tests import Test
|
|
138
|
+
sage: Test()._level_weight_sign() # random
|
|
139
|
+
level = 4, weight = 3, sign = 1
|
|
140
|
+
(4, 3, 1)
|
|
141
|
+
"""
|
|
142
|
+
level = random.choice(self.levels)
|
|
143
|
+
weight = random.choice(self.weights)
|
|
144
|
+
sign = random.choice([-1, 0, 1])
|
|
145
|
+
print("level = %s, weight = %s, sign = %s" % (level, weight, sign))
|
|
146
|
+
return level, weight, sign
|
|
147
|
+
|
|
148
|
+
def _modular_symbols_space_gamma0(self):
|
|
149
|
+
"""
|
|
150
|
+
Return a space of modular symbols for Gamma0, with level a
|
|
151
|
+
random choice from self.levels, weight from self.weights, and
|
|
152
|
+
sign chosen randomly from [1, 0, -1].
|
|
153
|
+
|
|
154
|
+
EXAMPLES::
|
|
155
|
+
|
|
156
|
+
sage: from sage.modular.modsym.tests import Test
|
|
157
|
+
sage: Test()._modular_symbols_space_gamma0() # random
|
|
158
|
+
level = 1, weight = 3, sign = 0
|
|
159
|
+
Modular Symbols space of dimension 0 for Gamma_0(1) of weight 3 with sign 0 over Rational Field
|
|
160
|
+
"""
|
|
161
|
+
level, weight, sign = self._level_weight_sign()
|
|
162
|
+
M = modsym.ModularSymbols(arithgroup.Gamma0(level), weight, sign)
|
|
163
|
+
self.current_space = M
|
|
164
|
+
return M
|
|
165
|
+
|
|
166
|
+
def _modular_symbols_space_gamma1(self):
|
|
167
|
+
"""
|
|
168
|
+
Return a space of modular symbols for Gamma1, with level a
|
|
169
|
+
random choice from self.levels, weight from self.weights, and
|
|
170
|
+
sign chosen randomly from [1, 0, -1].
|
|
171
|
+
|
|
172
|
+
EXAMPLES::
|
|
173
|
+
|
|
174
|
+
sage: from sage.modular.modsym.tests import Test
|
|
175
|
+
sage: Test()._modular_symbols_space_gamma1() # random
|
|
176
|
+
level = 3, weight = 4, sign = 0
|
|
177
|
+
Modular Symbols space of dimension 2 for Gamma_1(3) of weight 4 with sign 0 over Rational Field
|
|
178
|
+
"""
|
|
179
|
+
level, weight, sign = self._level_weight_sign()
|
|
180
|
+
M = modsym.ModularSymbols(arithgroup.Gamma1(level), weight, sign)
|
|
181
|
+
self.current_space = M
|
|
182
|
+
return M
|
|
183
|
+
|
|
184
|
+
def _modular_symbols_space_character(self):
|
|
185
|
+
"""
|
|
186
|
+
Return a random space of modular symbols for Gamma1, with
|
|
187
|
+
(possibly trivial) character, random sign, and weight a
|
|
188
|
+
random choice from self.weights.
|
|
189
|
+
|
|
190
|
+
EXAMPLES::
|
|
191
|
+
|
|
192
|
+
sage: # needs sage.rings.number_field
|
|
193
|
+
sage: from sage.modular.modsym.tests import Test
|
|
194
|
+
sage: Test()._modular_symbols_space_character() # random
|
|
195
|
+
level = 18, weight = 3, sign = 0
|
|
196
|
+
Modular Symbols space of dimension 0
|
|
197
|
+
and level 18, weight 3, character [1, zeta6 - 1], sign 0,
|
|
198
|
+
over Cyclotomic Field of order 6 and degree 2
|
|
199
|
+
"""
|
|
200
|
+
level, weight, sign = self._level_weight_sign()
|
|
201
|
+
G = dirichlet.DirichletGroup(level)
|
|
202
|
+
eps = G.random_element()
|
|
203
|
+
M = modsym.ModularSymbols(eps, weight, sign)
|
|
204
|
+
self.current_space = M
|
|
205
|
+
return M
|
|
206
|
+
|
|
207
|
+
def _do(self, name):
|
|
208
|
+
"""
|
|
209
|
+
Perform the test 'test_name', where name is specified as an
|
|
210
|
+
argument. This function exists to avoid a call to eval.
|
|
211
|
+
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: from sage.modular.modsym.tests import Test
|
|
215
|
+
sage: Test()._do("random")
|
|
216
|
+
test_random
|
|
217
|
+
...
|
|
218
|
+
"""
|
|
219
|
+
print("test_%s" % name)
|
|
220
|
+
Test.__dict__["test_%s" % name](self)
|
|
221
|
+
|
|
222
|
+
#################################################################
|
|
223
|
+
# The tests
|
|
224
|
+
#################################################################
|
|
225
|
+
def random(self, seconds=0):
|
|
226
|
+
"""
|
|
227
|
+
Perform random tests for a given number of seconds, or
|
|
228
|
+
indefinitely if seconds is not specified.
|
|
229
|
+
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: from sage.modular.modsym.tests import Test
|
|
233
|
+
sage: Test().random(1)
|
|
234
|
+
test_random
|
|
235
|
+
...
|
|
236
|
+
"""
|
|
237
|
+
self.test("random", seconds)
|
|
238
|
+
|
|
239
|
+
def test(self, name, seconds=0):
|
|
240
|
+
"""
|
|
241
|
+
Repeatedly run 'test_name', where name is passed as an
|
|
242
|
+
argument. If seconds is nonzero, run for that many seconds. If
|
|
243
|
+
seconds is 0, run indefinitely.
|
|
244
|
+
|
|
245
|
+
EXAMPLES::
|
|
246
|
+
|
|
247
|
+
sage: from sage.modular.modsym.tests import Test
|
|
248
|
+
sage: Test().test('cs_dimension',seconds=1)
|
|
249
|
+
test_cs_dimension
|
|
250
|
+
...
|
|
251
|
+
sage: Test().test('csnew_dimension',seconds=1)
|
|
252
|
+
test_csnew_dimension
|
|
253
|
+
...
|
|
254
|
+
"""
|
|
255
|
+
seconds = float(seconds)
|
|
256
|
+
total = cputime()
|
|
257
|
+
n = 1
|
|
258
|
+
while seconds == 0 or cputime(total) < seconds:
|
|
259
|
+
s = "** test_dimension: number %s" % n
|
|
260
|
+
if seconds > 0:
|
|
261
|
+
s += " (will stop after about %s seconds)" % seconds
|
|
262
|
+
t = cputime()
|
|
263
|
+
self._do(name)
|
|
264
|
+
print("\ttime=%s\telapsed=%s" % (cputime(t), cputime(total)))
|
|
265
|
+
n += 1
|
|
266
|
+
|
|
267
|
+
def test_cs_dimension(self):
|
|
268
|
+
"""
|
|
269
|
+
Compute the cuspidal subspace (this implicitly checks that the
|
|
270
|
+
dimension is correct using formulas).
|
|
271
|
+
|
|
272
|
+
EXAMPLES::
|
|
273
|
+
|
|
274
|
+
sage: from sage.modular.modsym.tests import Test
|
|
275
|
+
sage: Test().test_cs_dimension() # random
|
|
276
|
+
gamma0
|
|
277
|
+
level = 16, weight = 3, sign = -1
|
|
278
|
+
Modular Symbols space of dimension 0 for Gamma_0(16) of weight 3
|
|
279
|
+
with sign -1 over Rational Field
|
|
280
|
+
"""
|
|
281
|
+
self._modular_symbols_space().cuspidal_submodule()
|
|
282
|
+
|
|
283
|
+
def test_csnew_dimension(self):
|
|
284
|
+
"""
|
|
285
|
+
Compute the new cuspidal subspace and verify that the
|
|
286
|
+
dimension is correct using a dimension formula.
|
|
287
|
+
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: from sage.modular.modsym.tests import Test
|
|
291
|
+
sage: Test().test_csnew_dimension() # random
|
|
292
|
+
gamma0
|
|
293
|
+
level = 3, weight = 3, sign = 1
|
|
294
|
+
Modular Symbols space of dimension 0 for Gamma_0(3) of weight 3
|
|
295
|
+
with sign 1 over Rational Field
|
|
296
|
+
"""
|
|
297
|
+
M = self._modular_symbols_space()
|
|
298
|
+
V = M.cuspidal_submodule().new_submodule()
|
|
299
|
+
d = V.dimension()
|
|
300
|
+
d2 = M._cuspidal_new_submodule_dimension_formula()
|
|
301
|
+
assert d == d2, \
|
|
302
|
+
"Test failed for M=\"%s\", where computed dimension is %s but formula dimension is %s." % (M, d, d2)
|
|
303
|
+
|
|
304
|
+
def test_csns_nscs(self):
|
|
305
|
+
"""
|
|
306
|
+
Compute new cuspidal subspace in two ways and verify that the
|
|
307
|
+
results are the same.
|
|
308
|
+
|
|
309
|
+
EXAMPLES::
|
|
310
|
+
|
|
311
|
+
sage: from sage.modular.modsym.tests import Test
|
|
312
|
+
sage: Test().test_csns_nscs() # random
|
|
313
|
+
gamma0
|
|
314
|
+
level = 5, weight = 4, sign = 1
|
|
315
|
+
Modular Symbols space of dimension 3 for Gamma_0(5) of weight 4 with sign 1 over Rational Field
|
|
316
|
+
"""
|
|
317
|
+
M = self._modular_symbols_space()
|
|
318
|
+
V1 = M.cuspidal_submodule().new_submodule()
|
|
319
|
+
V2 = M.new_submodule().cuspidal_submodule()
|
|
320
|
+
assert V1 == V2, "Test failed for M=\"%s\", where the new cuspidal and cuspidal new spaces are computed differently." % M
|
|
321
|
+
d = M._cuspidal_new_submodule_dimension_formula()
|
|
322
|
+
assert d == V1.dimension(), \
|
|
323
|
+
"Test failed for M=\"%s\", where computed dimension is %s but formula dimension is %s." % (
|
|
324
|
+
M, V1.dimension(), d)
|
|
325
|
+
|
|
326
|
+
def test_decomposition(self):
|
|
327
|
+
"""
|
|
328
|
+
Compute the decomposition of a modular symbols space, and
|
|
329
|
+
verify that the sum of the dimensions of its components equals
|
|
330
|
+
the dimension of the original space.
|
|
331
|
+
|
|
332
|
+
EXAMPLES::
|
|
333
|
+
|
|
334
|
+
sage: from sage.modular.modsym.tests import Test
|
|
335
|
+
sage: Test().test_decomposition() # random
|
|
336
|
+
gamma1
|
|
337
|
+
level = 10, weight = 4, sign = 0
|
|
338
|
+
Modular Symbols space of dimension 18 for Gamma_1(10) of weight 4 with sign 0 over Rational Field
|
|
339
|
+
"""
|
|
340
|
+
M = self._modular_symbols_space()
|
|
341
|
+
D = M.decomposition()
|
|
342
|
+
assert M.dimension() == sum([A.dimension() for A in D])
|
|
343
|
+
|
|
344
|
+
def test_dimension(self):
|
|
345
|
+
"""
|
|
346
|
+
Compute the dimension of a modular symbols space.
|
|
347
|
+
|
|
348
|
+
EXAMPLES::
|
|
349
|
+
|
|
350
|
+
sage: from sage.modular.modsym.tests import Test
|
|
351
|
+
sage: Test().test_dimension() # random
|
|
352
|
+
gamma1
|
|
353
|
+
level = 14, weight = 2, sign = -1
|
|
354
|
+
Modular Symbols space of dimension 1 for Gamma_1(14) of weight 2 with sign -1 over Rational Field
|
|
355
|
+
"""
|
|
356
|
+
self._modular_symbols_space().dimension()
|
|
357
|
+
|
|
358
|
+
def test_random(self):
|
|
359
|
+
"""
|
|
360
|
+
Do a random test from all the possible tests.
|
|
361
|
+
|
|
362
|
+
EXAMPLES::
|
|
363
|
+
|
|
364
|
+
sage: from sage.modular.modsym.tests import Test
|
|
365
|
+
sage: Test().test_random() # random
|
|
366
|
+
Doing random test test_csnew_dimension
|
|
367
|
+
character
|
|
368
|
+
level = 18, weight = 4, sign = -1
|
|
369
|
+
Modular Symbols space of dimension 0 and level 18, weight 4, character [1, -1], sign -1, over Rational Field
|
|
370
|
+
"""
|
|
371
|
+
tests = [a for a in Test.__dict__
|
|
372
|
+
if a[:5] == "test_" and a != "test_random"]
|
|
373
|
+
name = random.choice(tests)
|
|
374
|
+
print("Doing random test %s" % name)
|
|
375
|
+
Test.__dict__[name](self)
|