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,177 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Modular forms over a non-minimal base ring
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
#########################################################################
|
|
8
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
9
|
+
#
|
|
10
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
11
|
+
#
|
|
12
|
+
# http://www.gnu.org/licenses/
|
|
13
|
+
#########################################################################
|
|
14
|
+
|
|
15
|
+
from . import ambient
|
|
16
|
+
from .cuspidal_submodule import CuspidalSubmodule_R
|
|
17
|
+
from sage.rings.integer_ring import ZZ
|
|
18
|
+
from sage.misc.cachefunc import cached_method
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModularFormsAmbient_R(ambient.ModularFormsAmbient):
|
|
22
|
+
def __init__(self, M, base_ring):
|
|
23
|
+
"""
|
|
24
|
+
Ambient space of modular forms over a ring other than QQ.
|
|
25
|
+
|
|
26
|
+
EXAMPLES::
|
|
27
|
+
|
|
28
|
+
sage: M = ModularForms(23, 2, base_ring=GF(7)) # indirect doctest
|
|
29
|
+
sage: M
|
|
30
|
+
Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(23)
|
|
31
|
+
of weight 2 over Finite Field of size 7
|
|
32
|
+
sage: M == loads(dumps(M))
|
|
33
|
+
True
|
|
34
|
+
"""
|
|
35
|
+
self.__M = M
|
|
36
|
+
if M.character() is not None:
|
|
37
|
+
self.__R_character = M.character().change_ring(base_ring)
|
|
38
|
+
else:
|
|
39
|
+
self.__R_character = None
|
|
40
|
+
ambient.ModularFormsAmbient.__init__(self, M.group(), M.weight(), base_ring, M.character(), M._eis_only)
|
|
41
|
+
|
|
42
|
+
@cached_method(key=lambda self,sign: ZZ(sign)) # convert sign to an Integer before looking this up in the cache
|
|
43
|
+
def modular_symbols(self, sign=0):
|
|
44
|
+
r"""
|
|
45
|
+
Return the space of modular symbols attached to this space, with the given sign (default 0).
|
|
46
|
+
|
|
47
|
+
TESTS::
|
|
48
|
+
|
|
49
|
+
sage: # needs sage.rings.number_field
|
|
50
|
+
sage: K.<i> = QuadraticField(-1)
|
|
51
|
+
sage: chi = DirichletGroup(5, base_ring=K).0
|
|
52
|
+
sage: x = polygen(ZZ, 'x')
|
|
53
|
+
sage: L.<c> = K.extension(x^2 - 402*i)
|
|
54
|
+
sage: M = ModularForms(chi, 7, base_ring=L)
|
|
55
|
+
sage: symbs = M.modular_symbols()
|
|
56
|
+
sage: symbs.character() == chi
|
|
57
|
+
True
|
|
58
|
+
sage: symbs.base_ring() == L
|
|
59
|
+
True
|
|
60
|
+
"""
|
|
61
|
+
sign = ZZ(sign)
|
|
62
|
+
return self.__M.modular_symbols(sign).change_ring(self.base_ring())
|
|
63
|
+
|
|
64
|
+
def _repr_(self):
|
|
65
|
+
"""
|
|
66
|
+
String representation for ``self``.
|
|
67
|
+
|
|
68
|
+
EXAMPLES::
|
|
69
|
+
|
|
70
|
+
sage: M = ModularForms(23,2,base_ring=GF(7)) # indirect doctest
|
|
71
|
+
sage: M._repr_()
|
|
72
|
+
'Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(23) of weight 2 over Finite Field of size 7'
|
|
73
|
+
|
|
74
|
+
sage: # needs sage.rings.number_field
|
|
75
|
+
sage: chi = DirichletGroup(109).0 ** 36
|
|
76
|
+
sage: ModularForms(chi, 2, base_ring = chi.base_ring())
|
|
77
|
+
Modular Forms space of dimension 9, character [zeta3] and weight 2 over Cyclotomic Field of order 108 and degree 36
|
|
78
|
+
"""
|
|
79
|
+
s = str(self.__M)
|
|
80
|
+
i = s.find('over')
|
|
81
|
+
if i != -1:
|
|
82
|
+
s = s[:i]
|
|
83
|
+
return s + 'over %s' % self.base_ring()
|
|
84
|
+
|
|
85
|
+
def _compute_q_expansion_basis(self, prec=None):
|
|
86
|
+
"""
|
|
87
|
+
Compute `q`-expansions for a basis of ``self`` to precision ``prec``.
|
|
88
|
+
|
|
89
|
+
EXAMPLES::
|
|
90
|
+
|
|
91
|
+
sage: M = ModularForms(23,2,base_ring=GF(7))
|
|
92
|
+
sage: M._compute_q_expansion_basis(10)
|
|
93
|
+
[q + 6*q^3 + 6*q^4 + 5*q^6 + 2*q^7 + 6*q^8 + 2*q^9 + O(q^10),
|
|
94
|
+
q^2 + 5*q^3 + 6*q^4 + 2*q^5 + q^6 + 2*q^7 + 5*q^8 + O(q^10),
|
|
95
|
+
1 + 5*q^3 + 5*q^4 + 5*q^6 + 3*q^8 + 5*q^9 + O(q^10)]
|
|
96
|
+
|
|
97
|
+
TESTS:
|
|
98
|
+
|
|
99
|
+
This checks that :issue:`13445` is fixed::
|
|
100
|
+
|
|
101
|
+
sage: M = ModularForms(Gamma0(11), base_ring=GF(11))
|
|
102
|
+
sage: S = M.cuspidal_subspace()
|
|
103
|
+
sage: 0 in [f.valuation() for f in S.basis()]
|
|
104
|
+
False
|
|
105
|
+
sage: from sage.modular.dims import dimension_cusp_forms
|
|
106
|
+
sage: len(S.basis()) == dimension_cusp_forms(Gamma0(11), 2)
|
|
107
|
+
True
|
|
108
|
+
"""
|
|
109
|
+
if prec is None:
|
|
110
|
+
prec = self.prec()
|
|
111
|
+
R = self._q_expansion_ring()
|
|
112
|
+
c = self.base_ring().characteristic()
|
|
113
|
+
if c == 0:
|
|
114
|
+
B = self.__M.q_expansion_basis(prec)
|
|
115
|
+
return [R(f) for f in B]
|
|
116
|
+
elif c.is_prime_power():
|
|
117
|
+
K = self.base_ring()
|
|
118
|
+
p = K.characteristic().prime_factors()[0]
|
|
119
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
120
|
+
Kp = GF(p)
|
|
121
|
+
newB = [f.change_ring(K) for f in list(self.__M.cuspidal_subspace().q_integral_basis(prec))]
|
|
122
|
+
A = Kp**prec
|
|
123
|
+
gens = [f.padded_list(prec) for f in newB]
|
|
124
|
+
V = A.span(gens)
|
|
125
|
+
B = [f.change_ring(K) for f in self.__M.q_integral_basis(prec)]
|
|
126
|
+
for f in B:
|
|
127
|
+
fc = f.padded_list(prec)
|
|
128
|
+
gens.append(fc)
|
|
129
|
+
if not A.span(gens) == V:
|
|
130
|
+
newB.append(f)
|
|
131
|
+
V = A.span(gens)
|
|
132
|
+
if len(newB) != self.dimension():
|
|
133
|
+
raise RuntimeError("The dimension of the space is %s but the basis we computed has %s elements" % (self.dimension(), len(newB)))
|
|
134
|
+
lst = [R(f) for f in newB]
|
|
135
|
+
return [f/f[f.valuation()] for f in lst]
|
|
136
|
+
else:
|
|
137
|
+
# this returns a basis of q-expansions, without guaranteeing that
|
|
138
|
+
# the first vectors form a basis of the cuspidal subspace
|
|
139
|
+
# TODO: bring this in line with the other cases
|
|
140
|
+
# simply using the above code fails because free modules over
|
|
141
|
+
# general rings do not have a .span() method
|
|
142
|
+
B = self.__M.q_integral_basis(prec)
|
|
143
|
+
return [R(f) for f in B]
|
|
144
|
+
|
|
145
|
+
def cuspidal_submodule(self):
|
|
146
|
+
r"""
|
|
147
|
+
Return the cuspidal subspace of this space.
|
|
148
|
+
|
|
149
|
+
EXAMPLES::
|
|
150
|
+
|
|
151
|
+
sage: # needs sage.rings.number_field
|
|
152
|
+
sage: C = CuspForms(7, 4, base_ring=CyclotomicField(5)) # indirect doctest
|
|
153
|
+
sage: type(C)
|
|
154
|
+
<class 'sage.modular.modform.cuspidal_submodule.CuspidalSubmodule_R_with_category'>
|
|
155
|
+
"""
|
|
156
|
+
return CuspidalSubmodule_R(self)
|
|
157
|
+
|
|
158
|
+
def change_ring(self, R):
|
|
159
|
+
r"""
|
|
160
|
+
Return this modular forms space with the base ring changed to the ring R.
|
|
161
|
+
|
|
162
|
+
EXAMPLES::
|
|
163
|
+
|
|
164
|
+
sage: # needs sage.rings.number_field
|
|
165
|
+
sage: chi = DirichletGroup(109, CyclotomicField(3)).0
|
|
166
|
+
sage: M9 = ModularForms(chi, 2, base_ring = CyclotomicField(9))
|
|
167
|
+
sage: M9.change_ring(CyclotomicField(15))
|
|
168
|
+
Modular Forms space of dimension 10, character [zeta3 + 1] and weight 2
|
|
169
|
+
over Cyclotomic Field of order 15 and degree 8
|
|
170
|
+
sage: M9.change_ring(QQ)
|
|
171
|
+
Traceback (most recent call last):
|
|
172
|
+
...
|
|
173
|
+
ValueError: Space cannot be defined over Rational Field
|
|
174
|
+
"""
|
|
175
|
+
if not R.has_coerce_map_from(self.__M.base_ring()):
|
|
176
|
+
raise ValueError("Space cannot be defined over %s" % R)
|
|
177
|
+
return ModularFormsAmbient_R(self.__M, R)
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari sage.rings.number_field
|
|
3
|
+
r"""
|
|
4
|
+
Modular forms with character
|
|
5
|
+
|
|
6
|
+
EXAMPLES::
|
|
7
|
+
|
|
8
|
+
sage: eps = DirichletGroup(13).0
|
|
9
|
+
sage: M = ModularForms(eps^2, 2); M
|
|
10
|
+
Modular Forms space of dimension 3, character [zeta6] and weight 2 over
|
|
11
|
+
Cyclotomic Field of order 6 and degree 2
|
|
12
|
+
|
|
13
|
+
sage: S = M.cuspidal_submodule(); S
|
|
14
|
+
Cuspidal subspace of dimension 1 of Modular Forms space of dimension 3,
|
|
15
|
+
character [zeta6] and weight 2 over Cyclotomic Field of order 6 and degree 2
|
|
16
|
+
sage: S.modular_symbols()
|
|
17
|
+
Modular Symbols subspace of dimension 2 of
|
|
18
|
+
Modular Symbols space of dimension 4 and level 13, weight 2, character [zeta6],
|
|
19
|
+
sign 0, over Cyclotomic Field of order 6 and degree 2
|
|
20
|
+
|
|
21
|
+
We create a spaces associated to Dirichlet characters of modulus 225::
|
|
22
|
+
|
|
23
|
+
sage: e = DirichletGroup(225).0
|
|
24
|
+
sage: e.order()
|
|
25
|
+
6
|
|
26
|
+
sage: e.base_ring()
|
|
27
|
+
Cyclotomic Field of order 60 and degree 16
|
|
28
|
+
sage: M = ModularForms(e,3)
|
|
29
|
+
|
|
30
|
+
Notice that the base ring is "minimized"::
|
|
31
|
+
|
|
32
|
+
sage: M
|
|
33
|
+
Modular Forms space of dimension 66, character [zeta6, 1] and weight 3
|
|
34
|
+
over Cyclotomic Field of order 6 and degree 2
|
|
35
|
+
|
|
36
|
+
If we don't want the base ring to change, we can explicitly specify it::
|
|
37
|
+
|
|
38
|
+
sage: ModularForms(e, 3, e.base_ring())
|
|
39
|
+
Modular Forms space of dimension 66, character [zeta6, 1] and weight 3
|
|
40
|
+
over Cyclotomic Field of order 60 and degree 16
|
|
41
|
+
|
|
42
|
+
Next we create a space associated to a Dirichlet character of order 20::
|
|
43
|
+
|
|
44
|
+
sage: e = DirichletGroup(225).1
|
|
45
|
+
sage: e.order()
|
|
46
|
+
20
|
|
47
|
+
sage: e.base_ring()
|
|
48
|
+
Cyclotomic Field of order 60 and degree 16
|
|
49
|
+
sage: M = ModularForms(e,17); M
|
|
50
|
+
Modular Forms space of dimension 484, character [1, zeta20] and
|
|
51
|
+
weight 17 over Cyclotomic Field of order 20 and degree 8
|
|
52
|
+
|
|
53
|
+
We compute the Eisenstein subspace, which is fast even though
|
|
54
|
+
the dimension of the space is large (since an explicit basis
|
|
55
|
+
of `q`-expansions has not been computed yet).
|
|
56
|
+
|
|
57
|
+
::
|
|
58
|
+
|
|
59
|
+
sage: M.eisenstein_submodule()
|
|
60
|
+
Eisenstein subspace of dimension 8 of Modular Forms space of
|
|
61
|
+
dimension 484, character [1, zeta20] and weight 17 over
|
|
62
|
+
Cyclotomic Field of order 20 and degree 8
|
|
63
|
+
|
|
64
|
+
sage: M.cuspidal_submodule()
|
|
65
|
+
Cuspidal subspace of dimension 476 of Modular Forms space of dimension 484,
|
|
66
|
+
character [1, zeta20] and weight 17 over Cyclotomic Field of order 20 and degree 8
|
|
67
|
+
|
|
68
|
+
TESTS::
|
|
69
|
+
|
|
70
|
+
sage: m = ModularForms(DirichletGroup(20).1,5)
|
|
71
|
+
sage: m == loads(dumps(m))
|
|
72
|
+
True
|
|
73
|
+
sage: type(m)
|
|
74
|
+
<class 'sage.modular.modform.ambient_eps.ModularFormsAmbient_eps_with_category'>
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
#########################################################################
|
|
78
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
79
|
+
#
|
|
80
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
81
|
+
#
|
|
82
|
+
# http://www.gnu.org/licenses/
|
|
83
|
+
#########################################################################
|
|
84
|
+
|
|
85
|
+
from sage.rings.integer import Integer
|
|
86
|
+
|
|
87
|
+
import sage.modular.arithgroup.all as arithgroup
|
|
88
|
+
import sage.modular.dirichlet as dirichlet
|
|
89
|
+
import sage.modular.modsym.modsym as modsym
|
|
90
|
+
from sage.misc.cachefunc import cached_method
|
|
91
|
+
|
|
92
|
+
from .ambient import ModularFormsAmbient
|
|
93
|
+
|
|
94
|
+
from . import ambient_R
|
|
95
|
+
from . import cuspidal_submodule
|
|
96
|
+
from . import eisenstein_submodule
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class ModularFormsAmbient_eps(ModularFormsAmbient):
|
|
100
|
+
"""
|
|
101
|
+
A space of modular forms with character.
|
|
102
|
+
"""
|
|
103
|
+
def __init__(self, character, weight=2, base_ring=None, eis_only=False):
|
|
104
|
+
"""
|
|
105
|
+
Create an ambient modular forms space with character.
|
|
106
|
+
|
|
107
|
+
.. NOTE::
|
|
108
|
+
|
|
109
|
+
The base ring must be of characteristic 0. The ambient_R
|
|
110
|
+
Python module is used for computing in characteristic p,
|
|
111
|
+
which we view as the reduction of characteristic 0.
|
|
112
|
+
|
|
113
|
+
INPUT:
|
|
114
|
+
|
|
115
|
+
- ``weight`` -- integer
|
|
116
|
+
|
|
117
|
+
- ``character`` -- dirichlet.DirichletCharacter
|
|
118
|
+
|
|
119
|
+
- ``base_ring`` -- base field
|
|
120
|
+
|
|
121
|
+
EXAMPLES::
|
|
122
|
+
|
|
123
|
+
sage: m = ModularForms(DirichletGroup(11).0,3); m
|
|
124
|
+
Modular Forms space of dimension 3, character [zeta10] and weight 3 over
|
|
125
|
+
Cyclotomic Field of order 10 and degree 4
|
|
126
|
+
sage: type(m)
|
|
127
|
+
<class 'sage.modular.modform.ambient_eps.ModularFormsAmbient_eps_with_category'>
|
|
128
|
+
"""
|
|
129
|
+
if not isinstance(character, dirichlet.DirichletCharacter):
|
|
130
|
+
raise TypeError("character (=%s) must be a Dirichlet character" % character)
|
|
131
|
+
if base_ring is None:
|
|
132
|
+
base_ring = character.base_ring()
|
|
133
|
+
if character.base_ring() != base_ring:
|
|
134
|
+
character = character.change_ring(base_ring)
|
|
135
|
+
if base_ring.characteristic() != 0:
|
|
136
|
+
raise ValueError("the base ring must have characteristic 0.")
|
|
137
|
+
group = arithgroup.Gamma1(character.modulus())
|
|
138
|
+
base_ring = character.base_ring()
|
|
139
|
+
ModularFormsAmbient.__init__(self, group, weight, base_ring, character, eis_only)
|
|
140
|
+
|
|
141
|
+
def _repr_(self):
|
|
142
|
+
"""
|
|
143
|
+
String representation of this space with character.
|
|
144
|
+
|
|
145
|
+
EXAMPLES::
|
|
146
|
+
|
|
147
|
+
sage: m = ModularForms(DirichletGroup(8).1,2)
|
|
148
|
+
sage: m._repr_()
|
|
149
|
+
'Modular Forms space of dimension 2, character [1, -1] and weight 2 over Rational Field'
|
|
150
|
+
|
|
151
|
+
sage: m = ModularForms(DirichletGroup(31, QQ).0, 1, eis_only=True)
|
|
152
|
+
sage: m._repr_()
|
|
153
|
+
'Modular Forms space of character [-1] and weight 1 over Rational Field'
|
|
154
|
+
|
|
155
|
+
You can rename the space with the rename command.
|
|
156
|
+
|
|
157
|
+
::
|
|
158
|
+
|
|
159
|
+
sage: m.rename('Modforms of level 8')
|
|
160
|
+
sage: m
|
|
161
|
+
Modforms of level 8
|
|
162
|
+
"""
|
|
163
|
+
if self._eis_only:
|
|
164
|
+
return "Modular Forms space of character %s and weight %s over %s" % (
|
|
165
|
+
self.character()._repr_short_(), self.weight(), self.base_ring())
|
|
166
|
+
else:
|
|
167
|
+
return "Modular Forms space of dimension %s, character %s and weight %s over %s" % (
|
|
168
|
+
self.dimension(), self.character()._repr_short_(), self.weight(), self.base_ring())
|
|
169
|
+
|
|
170
|
+
@cached_method
|
|
171
|
+
def cuspidal_submodule(self):
|
|
172
|
+
"""
|
|
173
|
+
Return the cuspidal submodule of this ambient space of modular forms.
|
|
174
|
+
|
|
175
|
+
EXAMPLES::
|
|
176
|
+
|
|
177
|
+
sage: eps = DirichletGroup(4).0
|
|
178
|
+
sage: M = ModularForms(eps, 5); M
|
|
179
|
+
Modular Forms space of dimension 3, character [-1] and weight 5
|
|
180
|
+
over Rational Field
|
|
181
|
+
sage: M.cuspidal_submodule()
|
|
182
|
+
Cuspidal subspace of dimension 1 of Modular Forms space of dimension 3,
|
|
183
|
+
character [-1] and weight 5 over Rational Field
|
|
184
|
+
"""
|
|
185
|
+
if self.weight() > 1:
|
|
186
|
+
return cuspidal_submodule.CuspidalSubmodule_eps(self)
|
|
187
|
+
else:
|
|
188
|
+
return cuspidal_submodule.CuspidalSubmodule_wt1_eps(self)
|
|
189
|
+
|
|
190
|
+
def change_ring(self, base_ring):
|
|
191
|
+
"""
|
|
192
|
+
Return space with same defining parameters as this ambient
|
|
193
|
+
space of modular symbols, but defined over a different base
|
|
194
|
+
ring.
|
|
195
|
+
|
|
196
|
+
EXAMPLES::
|
|
197
|
+
|
|
198
|
+
sage: m = ModularForms(DirichletGroup(13).0^2,2); m
|
|
199
|
+
Modular Forms space of dimension 3, character [zeta6] and weight 2 over
|
|
200
|
+
Cyclotomic Field of order 6 and degree 2
|
|
201
|
+
sage: m.change_ring(CyclotomicField(12))
|
|
202
|
+
Modular Forms space of dimension 3, character [zeta6] and weight 2 over
|
|
203
|
+
Cyclotomic Field of order 12 and degree 4
|
|
204
|
+
|
|
205
|
+
It must be possible to change the ring of the underlying Dirichlet character::
|
|
206
|
+
|
|
207
|
+
sage: m.change_ring(QQ)
|
|
208
|
+
Traceback (most recent call last):
|
|
209
|
+
...
|
|
210
|
+
TypeError: Unable to coerce zeta6 to a rational
|
|
211
|
+
"""
|
|
212
|
+
if self.base_ring() == base_ring:
|
|
213
|
+
return self
|
|
214
|
+
return ambient_R.ModularFormsAmbient_R(self, base_ring=base_ring)
|
|
215
|
+
|
|
216
|
+
@cached_method(key=lambda self, sign: Integer(sign)) # convert sign to an Integer before looking this up in the cache
|
|
217
|
+
def modular_symbols(self, sign=0):
|
|
218
|
+
"""
|
|
219
|
+
Return corresponding space of modular symbols with given sign.
|
|
220
|
+
|
|
221
|
+
EXAMPLES::
|
|
222
|
+
|
|
223
|
+
sage: eps = DirichletGroup(13).0
|
|
224
|
+
sage: M = ModularForms(eps^2, 2)
|
|
225
|
+
sage: M.modular_symbols()
|
|
226
|
+
Modular Symbols space of dimension 4 and level 13, weight 2,
|
|
227
|
+
character [zeta6], sign 0, over Cyclotomic Field of order 6 and degree 2
|
|
228
|
+
sage: M.modular_symbols(1)
|
|
229
|
+
Modular Symbols space of dimension 3 and level 13, weight 2,
|
|
230
|
+
character [zeta6], sign 1, over Cyclotomic Field of order 6 and degree 2
|
|
231
|
+
sage: M.modular_symbols(-1)
|
|
232
|
+
Modular Symbols space of dimension 1 and level 13, weight 2,
|
|
233
|
+
character [zeta6], sign -1, over Cyclotomic Field of order 6 and degree 2
|
|
234
|
+
sage: M.modular_symbols(2)
|
|
235
|
+
Traceback (most recent call last):
|
|
236
|
+
...
|
|
237
|
+
ValueError: sign must be -1, 0, or 1
|
|
238
|
+
"""
|
|
239
|
+
sign = Integer(sign)
|
|
240
|
+
return modsym.ModularSymbols(self.character(),
|
|
241
|
+
weight=self.weight(),
|
|
242
|
+
sign=sign,
|
|
243
|
+
base_ring=self.base_ring())
|
|
244
|
+
|
|
245
|
+
@cached_method
|
|
246
|
+
def eisenstein_submodule(self):
|
|
247
|
+
"""
|
|
248
|
+
Return the submodule of this ambient module with character that is
|
|
249
|
+
spanned by Eisenstein series. This is the Hecke stable complement
|
|
250
|
+
of the cuspidal submodule.
|
|
251
|
+
|
|
252
|
+
EXAMPLES::
|
|
253
|
+
|
|
254
|
+
sage: m = ModularForms(DirichletGroup(13).0^2,2); m
|
|
255
|
+
Modular Forms space of dimension 3, character [zeta6] and weight 2 over
|
|
256
|
+
Cyclotomic Field of order 6 and degree 2
|
|
257
|
+
sage: m.eisenstein_submodule()
|
|
258
|
+
Eisenstein subspace of dimension 2 of Modular Forms space of dimension 3,
|
|
259
|
+
character [zeta6] and weight 2 over Cyclotomic Field of order 6 and degree 2
|
|
260
|
+
"""
|
|
261
|
+
return eisenstein_submodule.EisensteinSubmodule_eps(self)
|
|
262
|
+
|
|
263
|
+
def hecke_module_of_level(self, N):
|
|
264
|
+
r"""
|
|
265
|
+
Return the Hecke module of level N corresponding to ``self``, which is the
|
|
266
|
+
domain or codomain of a degeneracy map from ``self``. Here N must be either
|
|
267
|
+
a divisor or a multiple of the level of ``self``, and a multiple of the
|
|
268
|
+
conductor of the character of ``self``.
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: M = ModularForms(DirichletGroup(15).0, 3); M.character().conductor()
|
|
273
|
+
3
|
|
274
|
+
sage: M.hecke_module_of_level(3)
|
|
275
|
+
Modular Forms space of dimension 2, character [-1] and weight 3
|
|
276
|
+
over Rational Field
|
|
277
|
+
sage: M.hecke_module_of_level(5)
|
|
278
|
+
Traceback (most recent call last):
|
|
279
|
+
...
|
|
280
|
+
ValueError: conductor(=3) must divide M(=5)
|
|
281
|
+
sage: M.hecke_module_of_level(30)
|
|
282
|
+
Modular Forms space of dimension 16, character [-1, 1] and weight 3
|
|
283
|
+
over Rational Field
|
|
284
|
+
"""
|
|
285
|
+
from . import constructor
|
|
286
|
+
if N % self.level() == 0:
|
|
287
|
+
return constructor.ModularForms(self.character().extend(N), self.weight(), self.base_ring(), prec=self.prec())
|
|
288
|
+
elif self.level() % N == 0:
|
|
289
|
+
return constructor.ModularForms(self.character().restrict(N), self.weight(), self.base_ring(), prec=self.prec())
|
|
290
|
+
else:
|
|
291
|
+
raise ValueError("N (=%s) must be a divisor or a multiple of the level of self (=%s)" % (N, self.level()))
|
|
292
|
+
|
|
293
|
+
def _pari_init_(self):
|
|
294
|
+
"""
|
|
295
|
+
Conversion to Pari.
|
|
296
|
+
|
|
297
|
+
EXAMPLES::
|
|
298
|
+
|
|
299
|
+
sage: m = ModularForms(DirichletGroup(17).0^2, 2)
|
|
300
|
+
sage: pari.mfdim(m)
|
|
301
|
+
3
|
|
302
|
+
sage: pari.mfparams(m)
|
|
303
|
+
[17, 2, Mod(9, 17), 4, t^4 + 1]
|
|
304
|
+
"""
|
|
305
|
+
from sage.libs.pari import pari
|
|
306
|
+
return pari.mfinit([self.level(), self.weight(), self.character()], 4)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
r"""
|
|
4
|
+
Modular forms for `\Gamma_0(N)` over `\QQ`
|
|
5
|
+
|
|
6
|
+
TESTS::
|
|
7
|
+
|
|
8
|
+
sage: m = ModularForms(Gamma0(389),6)
|
|
9
|
+
sage: loads(dumps(m)) == m
|
|
10
|
+
True
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
#########################################################################
|
|
14
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
15
|
+
#
|
|
16
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
17
|
+
#
|
|
18
|
+
# http://www.gnu.org/licenses/
|
|
19
|
+
#########################################################################
|
|
20
|
+
|
|
21
|
+
from sage.rings.rational_field import Q as QQ
|
|
22
|
+
|
|
23
|
+
import sage.modular.arithgroup.all as arithgroup
|
|
24
|
+
|
|
25
|
+
from . import ambient
|
|
26
|
+
from . import cuspidal_submodule
|
|
27
|
+
from . import eisenstein_submodule
|
|
28
|
+
|
|
29
|
+
from sage.misc.cachefunc import cached_method
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ModularFormsAmbient_g0_Q(ambient.ModularFormsAmbient):
|
|
33
|
+
r"""
|
|
34
|
+
A space of modular forms for `\Gamma_0(N)` over `\QQ`.
|
|
35
|
+
"""
|
|
36
|
+
def __init__(self, level, weight):
|
|
37
|
+
r"""
|
|
38
|
+
Create a space of modular symbols for `\Gamma_0(N)` of given
|
|
39
|
+
weight defined over `\QQ`.
|
|
40
|
+
|
|
41
|
+
EXAMPLES::
|
|
42
|
+
|
|
43
|
+
sage: m = ModularForms(Gamma0(11),4); m
|
|
44
|
+
Modular Forms space of dimension 4 for Congruence Subgroup Gamma0(11)
|
|
45
|
+
of weight 4 over Rational Field
|
|
46
|
+
sage: type(m)
|
|
47
|
+
<class 'sage.modular.modform.ambient_g0.ModularFormsAmbient_g0_Q_with_category'>
|
|
48
|
+
"""
|
|
49
|
+
ambient.ModularFormsAmbient.__init__(self, arithgroup.Gamma0(level), weight, QQ)
|
|
50
|
+
|
|
51
|
+
def _pari_init_(self):
|
|
52
|
+
"""
|
|
53
|
+
Conversion to Pari.
|
|
54
|
+
|
|
55
|
+
EXAMPLES::
|
|
56
|
+
|
|
57
|
+
sage: m = ModularForms(Gamma0(11),4)
|
|
58
|
+
sage: pari.mfdim(m)
|
|
59
|
+
4
|
|
60
|
+
sage: pari.mfparams(m)
|
|
61
|
+
[11, 4, 1, 4, t - 1]
|
|
62
|
+
"""
|
|
63
|
+
from sage.libs.pari import pari
|
|
64
|
+
return pari.mfinit([self.level(), self.weight()], 4)
|
|
65
|
+
|
|
66
|
+
####################################################################
|
|
67
|
+
# Computation of Special Submodules
|
|
68
|
+
####################################################################
|
|
69
|
+
@cached_method
|
|
70
|
+
def cuspidal_submodule(self):
|
|
71
|
+
r"""
|
|
72
|
+
Return the cuspidal submodule of this space of modular forms for
|
|
73
|
+
`\Gamma_0(N)`.
|
|
74
|
+
|
|
75
|
+
EXAMPLES::
|
|
76
|
+
|
|
77
|
+
sage: m = ModularForms(Gamma0(33),4)
|
|
78
|
+
sage: s = m.cuspidal_submodule(); s
|
|
79
|
+
Cuspidal subspace of dimension 10 of Modular Forms space of dimension 14
|
|
80
|
+
for Congruence Subgroup Gamma0(33) of weight 4 over Rational Field
|
|
81
|
+
sage: type(s)
|
|
82
|
+
<class 'sage.modular.modform.cuspidal_submodule.CuspidalSubmodule_g0_Q_with_category'>
|
|
83
|
+
"""
|
|
84
|
+
if self.level() == 1:
|
|
85
|
+
return cuspidal_submodule.CuspidalSubmodule_level1_Q(self)
|
|
86
|
+
else:
|
|
87
|
+
return cuspidal_submodule.CuspidalSubmodule_g0_Q(self)
|
|
88
|
+
|
|
89
|
+
@cached_method
|
|
90
|
+
def eisenstein_submodule(self):
|
|
91
|
+
r"""
|
|
92
|
+
Return the Eisenstein submodule of this space of modular forms for
|
|
93
|
+
`\Gamma_0(N)`.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: m = ModularForms(Gamma0(389),6)
|
|
98
|
+
sage: m.eisenstein_submodule()
|
|
99
|
+
Eisenstein subspace of dimension 2 of Modular Forms space of dimension 163
|
|
100
|
+
for Congruence Subgroup Gamma0(389) of weight 6 over Rational Field
|
|
101
|
+
"""
|
|
102
|
+
return eisenstein_submodule.EisensteinSubmodule_g0_Q(self)
|
|
103
|
+
|
|
104
|
+
def _compute_atkin_lehner_matrix(self, d):
|
|
105
|
+
r"""
|
|
106
|
+
Compute the matrix of the Atkin-Lehner operator W_d acting on self,
|
|
107
|
+
where d is a divisor of the level. This is only implemented in the
|
|
108
|
+
(trivial) level 1 case.
|
|
109
|
+
|
|
110
|
+
EXAMPLES::
|
|
111
|
+
|
|
112
|
+
sage: ModularForms(1, 30).atkin_lehner_operator()
|
|
113
|
+
Hecke module morphism Atkin-Lehner operator W_1 defined by the matrix
|
|
114
|
+
[1 0 0]
|
|
115
|
+
[0 1 0]
|
|
116
|
+
[0 0 1]
|
|
117
|
+
Domain: Modular Forms space of dimension 3 for Modular Group SL(2,Z) ...
|
|
118
|
+
Codomain: Modular Forms space of dimension 3 for Modular Group SL(2,Z) ...
|
|
119
|
+
"""
|
|
120
|
+
if self.level() == 1:
|
|
121
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
122
|
+
return MatrixSpace(self.base_ring(), self.rank())(1)
|
|
123
|
+
else:
|
|
124
|
+
raise NotImplementedError
|