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,1295 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Manin symbol lists
|
|
4
|
+
|
|
5
|
+
There are various different classes holding lists of Manin symbols of
|
|
6
|
+
different types. The hierarchy is as follows:
|
|
7
|
+
|
|
8
|
+
- :class:`ManinSymbolList`
|
|
9
|
+
|
|
10
|
+
- :class:`ManinSymbolList_group`
|
|
11
|
+
|
|
12
|
+
- :class:`ManinSymbolList_gamma0`
|
|
13
|
+
- :class:`ManinSymbolList_gamma1`
|
|
14
|
+
- :class:`ManinSymbolList_gamma_h`
|
|
15
|
+
|
|
16
|
+
- :class:`ManinSymbolList_character`
|
|
17
|
+
"""
|
|
18
|
+
# ****************************************************************************
|
|
19
|
+
# Sage: Open Source Mathematical Software
|
|
20
|
+
#
|
|
21
|
+
# Copyright (C) 2005 William Stein <wstein@gmail.com>
|
|
22
|
+
#
|
|
23
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
24
|
+
#
|
|
25
|
+
# This code is distributed in the hope that it will be useful,
|
|
26
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
27
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
28
|
+
# General Public License for more details.
|
|
29
|
+
#
|
|
30
|
+
# The full text of the GPL is available at:
|
|
31
|
+
#
|
|
32
|
+
# https://www.gnu.org/licenses/
|
|
33
|
+
# ****************************************************************************
|
|
34
|
+
|
|
35
|
+
import sage.modular.modsym.p1list as p1list
|
|
36
|
+
import sage.modular.modsym.g1list as g1list
|
|
37
|
+
import sage.modular.modsym.ghlist as ghlist
|
|
38
|
+
from sage.rings.integer import Integer
|
|
39
|
+
from sage.structure.parent import Parent
|
|
40
|
+
from sage.misc.persist import register_unpickle_override
|
|
41
|
+
from sage.misc.cachefunc import cached_method
|
|
42
|
+
from sage.structure.richcmp import richcmp_method, richcmp
|
|
43
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
44
|
+
|
|
45
|
+
from .apply import apply_to_monomial
|
|
46
|
+
|
|
47
|
+
from sage.modular.modsym.manin_symbol import ManinSymbol
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@richcmp_method
|
|
51
|
+
class ManinSymbolList(Parent):
|
|
52
|
+
"""
|
|
53
|
+
Base class for lists of all Manin symbols for a given weight, group or character.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
Element = ManinSymbol
|
|
57
|
+
|
|
58
|
+
def __init__(self, weight, lst):
|
|
59
|
+
"""
|
|
60
|
+
Constructor for a ManinSymbolList.
|
|
61
|
+
|
|
62
|
+
INPUT:
|
|
63
|
+
|
|
64
|
+
- ``weight`` -- the weight of the symbols
|
|
65
|
+
|
|
66
|
+
- ``lst`` -- the list of symbols
|
|
67
|
+
|
|
68
|
+
On construction, a ManinSymbolList constructs a dict for
|
|
69
|
+
rapid determination of the index of any given symbol.
|
|
70
|
+
|
|
71
|
+
This is a base class only; users will only directly construct
|
|
72
|
+
objects in the derived classes ManinSymbolList_gamma0,
|
|
73
|
+
ManinSymbolList_gamma1, ManinSymbolList_gamma_h,
|
|
74
|
+
ManinSymbolList_gamma_character. Many standard methods are
|
|
75
|
+
only implemented in the derived classes.
|
|
76
|
+
|
|
77
|
+
EXAMPLES::
|
|
78
|
+
|
|
79
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
80
|
+
sage: ManinSymbolList(6,P1List(11))
|
|
81
|
+
<sage.modular.modsym.manin_symbol_list.ManinSymbolList_with_category object at ...>
|
|
82
|
+
"""
|
|
83
|
+
self._weight = weight
|
|
84
|
+
self._symbol_list = lst
|
|
85
|
+
self._index = {x: i for i,x in enumerate(lst)}
|
|
86
|
+
Parent.__init__(self, category=FiniteEnumeratedSets())
|
|
87
|
+
|
|
88
|
+
def _element_constructor_(self, x):
|
|
89
|
+
"""
|
|
90
|
+
Construct an element of ``self``.
|
|
91
|
+
|
|
92
|
+
TESTS::
|
|
93
|
+
|
|
94
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
95
|
+
sage: m = ManinSymbolList(6, P1List(11))
|
|
96
|
+
sage: x = m((2, 3, 5)); x
|
|
97
|
+
[X^2*Y^2,(3,5)]
|
|
98
|
+
sage: m(x) == x
|
|
99
|
+
True
|
|
100
|
+
"""
|
|
101
|
+
if isinstance(x, ManinSymbol):
|
|
102
|
+
x = x.tuple()
|
|
103
|
+
return self.element_class(self, x)
|
|
104
|
+
|
|
105
|
+
def __richcmp__(self, right, op):
|
|
106
|
+
"""
|
|
107
|
+
Comparison function for ManinSymbolList objects.
|
|
108
|
+
|
|
109
|
+
EXAMPLES::
|
|
110
|
+
|
|
111
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
112
|
+
sage: m1 = ManinSymbolList(6,P1List(11))
|
|
113
|
+
sage: m2 = ManinSymbolList(6,P1List(13))
|
|
114
|
+
sage: m3 = ManinSymbolList(4,P1List(11))
|
|
115
|
+
sage: m1 < m2
|
|
116
|
+
True
|
|
117
|
+
sage: m2 < m3
|
|
118
|
+
False
|
|
119
|
+
sage: m1 < m3
|
|
120
|
+
False
|
|
121
|
+
"""
|
|
122
|
+
if not isinstance(right, ManinSymbolList):
|
|
123
|
+
return NotImplemented
|
|
124
|
+
return richcmp((self._weight, self._symbol_list),
|
|
125
|
+
(right._weight, right._symbol_list), op)
|
|
126
|
+
|
|
127
|
+
def symbol_list(self):
|
|
128
|
+
"""
|
|
129
|
+
Return the list of symbols of ``self``.
|
|
130
|
+
|
|
131
|
+
EXAMPLES::
|
|
132
|
+
|
|
133
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
134
|
+
sage: m = ManinSymbolList(6, P1List(11))
|
|
135
|
+
"""
|
|
136
|
+
return list(self._symbol_list) # This makes a shallow copy
|
|
137
|
+
|
|
138
|
+
def __len__(self):
|
|
139
|
+
"""
|
|
140
|
+
Return the length of this :class:`ManinSymbolList`.
|
|
141
|
+
|
|
142
|
+
EXAMPLES::
|
|
143
|
+
|
|
144
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
145
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
146
|
+
sage: len(m)
|
|
147
|
+
12
|
|
148
|
+
"""
|
|
149
|
+
return len(self._symbol_list)
|
|
150
|
+
|
|
151
|
+
def apply(self, j, X):
|
|
152
|
+
"""
|
|
153
|
+
Apply the matrix `X = [a, b; c, d]` to the `j`-th Manin symbol.
|
|
154
|
+
|
|
155
|
+
Implemented in derived classes.
|
|
156
|
+
|
|
157
|
+
EXAMPLES::
|
|
158
|
+
|
|
159
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
160
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
161
|
+
sage: m.apply(10, [1,2,0,1])
|
|
162
|
+
Traceback (most recent call last):
|
|
163
|
+
...
|
|
164
|
+
NotImplementedError: Only implemented in derived classes
|
|
165
|
+
"""
|
|
166
|
+
raise NotImplementedError("Only implemented in derived classes")
|
|
167
|
+
|
|
168
|
+
def _apply_S_only_0pm1(self) -> bool:
|
|
169
|
+
"""
|
|
170
|
+
Return ``True`` if the coefficient when applying the S relation is
|
|
171
|
+
always 0, 1, or -1. This is useful for optimizing code in
|
|
172
|
+
relation_matrix.py.
|
|
173
|
+
|
|
174
|
+
EXAMPLES::
|
|
175
|
+
|
|
176
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
177
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
178
|
+
sage: ManinSymbolList_character(eps,2)._apply_S_only_0pm1()
|
|
179
|
+
True
|
|
180
|
+
sage: eps = DirichletGroup(7).gen(0)
|
|
181
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
182
|
+
sage: ManinSymbolList_character(eps,2)._apply_S_only_0pm1()
|
|
183
|
+
False
|
|
184
|
+
"""
|
|
185
|
+
return False # derived classes could overload and put True
|
|
186
|
+
|
|
187
|
+
def apply_S(self, j):
|
|
188
|
+
"""
|
|
189
|
+
Apply the matrix `S = [0, -1; 1, 0]` to the `j`-th Manin symbol.
|
|
190
|
+
|
|
191
|
+
Implemented in derived classes.
|
|
192
|
+
|
|
193
|
+
EXAMPLES::
|
|
194
|
+
|
|
195
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
196
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
197
|
+
sage: m.apply_S(10)
|
|
198
|
+
Traceback (most recent call last):
|
|
199
|
+
...
|
|
200
|
+
NotImplementedError: Only implemented in derived classes
|
|
201
|
+
"""
|
|
202
|
+
raise NotImplementedError("Only implemented in derived classes")
|
|
203
|
+
|
|
204
|
+
def apply_I(self, j):
|
|
205
|
+
"""
|
|
206
|
+
Apply the matrix `I = [-1, 0; 0, 1]` to the `j`-th Manin symbol.
|
|
207
|
+
|
|
208
|
+
Implemented in derived classes.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
213
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
214
|
+
sage: m.apply_I(10)
|
|
215
|
+
Traceback (most recent call last):
|
|
216
|
+
...
|
|
217
|
+
NotImplementedError: Only implemented in derived classes
|
|
218
|
+
"""
|
|
219
|
+
raise NotImplementedError("Only implemented in derived classes")
|
|
220
|
+
|
|
221
|
+
def apply_T(self, j):
|
|
222
|
+
"""
|
|
223
|
+
Apply the matrix `T = [0, 1; -1, -1]` to the `j`-th Manin symbol.
|
|
224
|
+
|
|
225
|
+
Implemented in derived classes.
|
|
226
|
+
|
|
227
|
+
EXAMPLES::
|
|
228
|
+
|
|
229
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
230
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
231
|
+
sage: m.apply_T(10)
|
|
232
|
+
Traceback (most recent call last):
|
|
233
|
+
...
|
|
234
|
+
NotImplementedError: Only implemented in derived classes
|
|
235
|
+
"""
|
|
236
|
+
raise NotImplementedError("Only implemented in derived classes")
|
|
237
|
+
|
|
238
|
+
def apply_TT(self, j):
|
|
239
|
+
"""
|
|
240
|
+
Apply the matrix `TT = T^2 = [-1, -1; 0, 1]` to the `j`-th
|
|
241
|
+
Manin symbol.
|
|
242
|
+
|
|
243
|
+
Implemented in derived classes.
|
|
244
|
+
|
|
245
|
+
EXAMPLES::
|
|
246
|
+
|
|
247
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
248
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
249
|
+
sage: m.apply_TT(10)
|
|
250
|
+
Traceback (most recent call last):
|
|
251
|
+
...
|
|
252
|
+
NotImplementedError: Only implemented in derived classes
|
|
253
|
+
"""
|
|
254
|
+
raise NotImplementedError("Only implemented in derived classes")
|
|
255
|
+
|
|
256
|
+
def index(self, x):
|
|
257
|
+
"""
|
|
258
|
+
Return the index of ``x`` in the list of Manin symbols.
|
|
259
|
+
|
|
260
|
+
INPUT:
|
|
261
|
+
|
|
262
|
+
- ``x`` -- a triple of integers `(i, u, v)` defining a valid
|
|
263
|
+
Manin symbol, which need not be normalized
|
|
264
|
+
|
|
265
|
+
OUTPUT:
|
|
266
|
+
|
|
267
|
+
integer -- the index of the normalized Manin symbol equivalent
|
|
268
|
+
to `(i, u, v)`. If ``x`` is not in ``self``, -1 is returned.
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
273
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
274
|
+
sage: m.index(m.symbol_list()[2])
|
|
275
|
+
2
|
|
276
|
+
sage: S = m.symbol_list()
|
|
277
|
+
sage: all(i == m.index(S[i]) for i in range(len(S)))
|
|
278
|
+
True
|
|
279
|
+
"""
|
|
280
|
+
if x in self._index:
|
|
281
|
+
return self._index[x]
|
|
282
|
+
x = self.normalize(x)
|
|
283
|
+
try:
|
|
284
|
+
return self._index[x]
|
|
285
|
+
except KeyError:
|
|
286
|
+
return -1
|
|
287
|
+
|
|
288
|
+
@cached_method
|
|
289
|
+
def manin_symbol_list(self):
|
|
290
|
+
"""
|
|
291
|
+
Return all the Manin symbols in ``self`` as a list.
|
|
292
|
+
|
|
293
|
+
Cached for subsequent calls.
|
|
294
|
+
|
|
295
|
+
OUTPUT:
|
|
296
|
+
|
|
297
|
+
A list of :class:`ManinSymbol` objects, which is a copy of the
|
|
298
|
+
complete list of Manin symbols.
|
|
299
|
+
|
|
300
|
+
EXAMPLES::
|
|
301
|
+
|
|
302
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
303
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
304
|
+
sage: m.manin_symbol_list() # not implemented for the base class
|
|
305
|
+
|
|
306
|
+
::
|
|
307
|
+
|
|
308
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
309
|
+
sage: m = ManinSymbolList_gamma0(6, 4)
|
|
310
|
+
sage: m.manin_symbol_list()
|
|
311
|
+
[[Y^2,(0,1)],
|
|
312
|
+
[Y^2,(1,0)],
|
|
313
|
+
[Y^2,(1,1)],
|
|
314
|
+
...
|
|
315
|
+
[X^2,(3,1)],
|
|
316
|
+
[X^2,(3,2)]]
|
|
317
|
+
"""
|
|
318
|
+
return [self.manin_symbol(i) for i in range(len(self))]
|
|
319
|
+
|
|
320
|
+
list = manin_symbol_list
|
|
321
|
+
|
|
322
|
+
def manin_symbol(self, i):
|
|
323
|
+
"""
|
|
324
|
+
Return the ``i``-th Manin symbol in this :class:`ManinSymbolList`.
|
|
325
|
+
|
|
326
|
+
INPUT:
|
|
327
|
+
|
|
328
|
+
- ``i`` -- integer; a valid index of a symbol in this list
|
|
329
|
+
|
|
330
|
+
OUTPUT:
|
|
331
|
+
|
|
332
|
+
:class:`ManinSymbol` -- the `i`-th Manin symbol in the list.
|
|
333
|
+
|
|
334
|
+
EXAMPLES::
|
|
335
|
+
|
|
336
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
337
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
338
|
+
sage: m.manin_symbol(3) # not implemented for base class
|
|
339
|
+
|
|
340
|
+
::
|
|
341
|
+
|
|
342
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
343
|
+
sage: m = ManinSymbolList_gamma0(6, 4)
|
|
344
|
+
sage: s = m.manin_symbol(3); s
|
|
345
|
+
[Y^2,(1,2)]
|
|
346
|
+
sage: type(s)
|
|
347
|
+
<class 'sage.modular.modsym.manin_symbol.ManinSymbol'>
|
|
348
|
+
"""
|
|
349
|
+
return self.element_class(self, self._symbol_list[i])
|
|
350
|
+
|
|
351
|
+
def normalize(self, x):
|
|
352
|
+
"""
|
|
353
|
+
Return a normalized Manin symbol from ``x``.
|
|
354
|
+
|
|
355
|
+
To be implemented in derived classes.
|
|
356
|
+
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList
|
|
360
|
+
sage: m = ManinSymbolList(6,P1List(11))
|
|
361
|
+
sage: m.normalize((0,6,7)) # not implemented in base class
|
|
362
|
+
"""
|
|
363
|
+
raise NotImplementedError("Only implemented in derived classes")
|
|
364
|
+
|
|
365
|
+
def weight(self):
|
|
366
|
+
"""
|
|
367
|
+
Return the weight of the Manin symbols in this :class:`ManinSymbolList`.
|
|
368
|
+
|
|
369
|
+
OUTPUT: integer; the weight of the Manin symbols in the list
|
|
370
|
+
|
|
371
|
+
EXAMPLES::
|
|
372
|
+
|
|
373
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
374
|
+
sage: m = ManinSymbolList_gamma0(6, 4)
|
|
375
|
+
sage: m.weight()
|
|
376
|
+
4
|
|
377
|
+
"""
|
|
378
|
+
return self._weight
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
class ManinSymbolList_group(ManinSymbolList):
|
|
382
|
+
"""
|
|
383
|
+
Base class for Manin symbol lists for a given group.
|
|
384
|
+
|
|
385
|
+
INPUT:
|
|
386
|
+
|
|
387
|
+
- ``level`` -- integer level
|
|
388
|
+
|
|
389
|
+
- ``weight`` -- integer weight
|
|
390
|
+
|
|
391
|
+
- ``syms`` -- something with ``normalize`` and ``list`` methods,
|
|
392
|
+
e.g. :class:`~sage.modular.modsym.p1list.P1List`
|
|
393
|
+
|
|
394
|
+
EXAMPLES::
|
|
395
|
+
|
|
396
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_group
|
|
397
|
+
sage: ManinSymbolList_group(11, 2, P1List(11))
|
|
398
|
+
<sage.modular.modsym.manin_symbol_list.ManinSymbolList_group_with_category object at ...>
|
|
399
|
+
"""
|
|
400
|
+
def __init__(self, level, weight, syms):
|
|
401
|
+
"""
|
|
402
|
+
Constructor for class ManinSymbolList_group.
|
|
403
|
+
|
|
404
|
+
INPUT:
|
|
405
|
+
|
|
406
|
+
- ``level`` -- integer level
|
|
407
|
+
|
|
408
|
+
- ``weight`` -- integer weight
|
|
409
|
+
|
|
410
|
+
- ``syms`` -- something with ``normalize`` and ``list``
|
|
411
|
+
methods, e.g. :class:`~sage.modular.modsym.p1list.P1List`
|
|
412
|
+
|
|
413
|
+
EXAMPLES::
|
|
414
|
+
|
|
415
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_group
|
|
416
|
+
sage: L = ManinSymbolList_group(11, 2, P1List(11)); L
|
|
417
|
+
<sage.modular.modsym.manin_symbol_list.ManinSymbolList_group_with_category object at ...>
|
|
418
|
+
"""
|
|
419
|
+
self.__level = level
|
|
420
|
+
self.__syms = syms # syms is anything with a normalize and list method.
|
|
421
|
+
|
|
422
|
+
# The list returned from P1List is guaranteed to be sorted.
|
|
423
|
+
# Thus each list constructed below is also sorted. This is
|
|
424
|
+
# important since the index function assumes the list is sorted.
|
|
425
|
+
L = [(i, u, v) for i in range(weight - 2 + 1)
|
|
426
|
+
for u, v in syms.list()]
|
|
427
|
+
ManinSymbolList.__init__(self, weight, L)
|
|
428
|
+
|
|
429
|
+
def level(self):
|
|
430
|
+
"""
|
|
431
|
+
Return the level of this :class:`ManinSymbolList`.
|
|
432
|
+
|
|
433
|
+
EXAMPLES::
|
|
434
|
+
|
|
435
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
436
|
+
sage: ManinSymbolList_gamma0(5,2).level()
|
|
437
|
+
5
|
|
438
|
+
|
|
439
|
+
::
|
|
440
|
+
|
|
441
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma1
|
|
442
|
+
sage: ManinSymbolList_gamma1(51,2).level()
|
|
443
|
+
51
|
|
444
|
+
|
|
445
|
+
::
|
|
446
|
+
|
|
447
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma_h
|
|
448
|
+
sage: ManinSymbolList_gamma_h(GammaH(117, [4]),2).level()
|
|
449
|
+
117
|
|
450
|
+
"""
|
|
451
|
+
return self.__level
|
|
452
|
+
|
|
453
|
+
def apply_S(self, j):
|
|
454
|
+
"""
|
|
455
|
+
Apply the matrix `S = [0, -1; 1, 0]` to the `j`-th Manin symbol.
|
|
456
|
+
|
|
457
|
+
INPUT:
|
|
458
|
+
|
|
459
|
+
- ``j`` -- integer; a symbol index
|
|
460
|
+
|
|
461
|
+
OUTPUT:
|
|
462
|
+
|
|
463
|
+
``(k, s)`` where k is the index of the symbol obtained by acting on the
|
|
464
|
+
`j`-th symbol with `S`, and `s` is the parity of the `j`-th symbol
|
|
465
|
+
(a Python ``int``, either 1 or -1).
|
|
466
|
+
|
|
467
|
+
EXAMPLES::
|
|
468
|
+
|
|
469
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
470
|
+
sage: m = ManinSymbolList_gamma0(5,8)
|
|
471
|
+
sage: m.apply_S(4)
|
|
472
|
+
(40, 1)
|
|
473
|
+
sage: [m.apply_S(i) for i in range(len(m))]
|
|
474
|
+
[(37, 1),
|
|
475
|
+
(36, 1),
|
|
476
|
+
(41, 1),
|
|
477
|
+
(39, 1),
|
|
478
|
+
(40, 1),
|
|
479
|
+
(38, 1),
|
|
480
|
+
(31, -1),
|
|
481
|
+
(30, -1),
|
|
482
|
+
(35, -1),
|
|
483
|
+
(33, -1),
|
|
484
|
+
(34, -1),
|
|
485
|
+
(32, -1),
|
|
486
|
+
...
|
|
487
|
+
(4, 1),
|
|
488
|
+
(2, 1)]
|
|
489
|
+
"""
|
|
490
|
+
i, u, v = self._symbol_list[j]
|
|
491
|
+
k = self.index((self._weight - 2 - i, v, -u))
|
|
492
|
+
return k, -1 if i % 2 else 1
|
|
493
|
+
|
|
494
|
+
def _apply_S_only_0pm1(self):
|
|
495
|
+
"""
|
|
496
|
+
Return ``True`` if the coefficient when applying the S relation is
|
|
497
|
+
always 0, 1, or -1. This is useful for optimizing code in
|
|
498
|
+
relation_matrix.py.
|
|
499
|
+
|
|
500
|
+
EXAMPLES::
|
|
501
|
+
|
|
502
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
503
|
+
sage: ManinSymbolList_gamma0(5,8)._apply_S_only_0pm1()
|
|
504
|
+
True
|
|
505
|
+
"""
|
|
506
|
+
return True
|
|
507
|
+
|
|
508
|
+
def apply_I(self, j):
|
|
509
|
+
"""
|
|
510
|
+
Apply the matrix `I=[-1,0,0,1]` to the `j`-th Manin symbol.
|
|
511
|
+
|
|
512
|
+
INPUT:
|
|
513
|
+
|
|
514
|
+
- ``j`` -- integer; a symbol index
|
|
515
|
+
|
|
516
|
+
OUTPUT:
|
|
517
|
+
|
|
518
|
+
``(k, s)`` where k is the index of the symbol obtained by acting on the
|
|
519
|
+
`j`-th symbol with `I`, and `s` is the parity of the `j`-th symbol
|
|
520
|
+
(a Python ``int``, either 1 or -1)
|
|
521
|
+
|
|
522
|
+
EXAMPLES::
|
|
523
|
+
|
|
524
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
525
|
+
sage: m = ManinSymbolList_gamma0(5,8)
|
|
526
|
+
sage: m.apply_I(4)
|
|
527
|
+
(3, 1)
|
|
528
|
+
sage: [m.apply_I(i) for i in range(10)]
|
|
529
|
+
[(0, 1),
|
|
530
|
+
(1, 1),
|
|
531
|
+
(5, 1),
|
|
532
|
+
(4, 1),
|
|
533
|
+
(3, 1),
|
|
534
|
+
(2, 1),
|
|
535
|
+
(6, -1),
|
|
536
|
+
(7, -1),
|
|
537
|
+
(11, -1),
|
|
538
|
+
(10, -1)]
|
|
539
|
+
"""
|
|
540
|
+
i, u, v = self._symbol_list[j]
|
|
541
|
+
k = self.index((i, -u, v))
|
|
542
|
+
if i % 2 == 0:
|
|
543
|
+
return k, 1
|
|
544
|
+
else:
|
|
545
|
+
return k, -1
|
|
546
|
+
|
|
547
|
+
def apply_T(self, j):
|
|
548
|
+
"""
|
|
549
|
+
Apply the matrix `T=[0,1,-1,-1]` to the `j`-th Manin symbol.
|
|
550
|
+
|
|
551
|
+
INPUT:
|
|
552
|
+
|
|
553
|
+
- ``j`` -- integer; a symbol index
|
|
554
|
+
|
|
555
|
+
OUTPUT: see documentation for apply()
|
|
556
|
+
|
|
557
|
+
EXAMPLES::
|
|
558
|
+
|
|
559
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
560
|
+
sage: m = ManinSymbolList_gamma0(5,8)
|
|
561
|
+
sage: m.apply_T(4)
|
|
562
|
+
[(3, 1), (9, -6), (15, 15), (21, -20), (27, 15), (33, -6), (39, 1)]
|
|
563
|
+
sage: [m.apply_T(i) for i in range(10)]
|
|
564
|
+
[[(5, 1), (11, -6), (17, 15), (23, -20), (29, 15), (35, -6), (41, 1)],
|
|
565
|
+
[(0, 1), (6, -6), (12, 15), (18, -20), (24, 15), (30, -6), (36, 1)],
|
|
566
|
+
[(4, 1), (10, -6), (16, 15), (22, -20), (28, 15), (34, -6), (40, 1)],
|
|
567
|
+
[(2, 1), (8, -6), (14, 15), (20, -20), (26, 15), (32, -6), (38, 1)],
|
|
568
|
+
[(3, 1), (9, -6), (15, 15), (21, -20), (27, 15), (33, -6), (39, 1)],
|
|
569
|
+
[(1, 1), (7, -6), (13, 15), (19, -20), (25, 15), (31, -6), (37, 1)],
|
|
570
|
+
[(5, 1), (11, -5), (17, 10), (23, -10), (29, 5), (35, -1)],
|
|
571
|
+
[(0, 1), (6, -5), (12, 10), (18, -10), (24, 5), (30, -1)],
|
|
572
|
+
[(4, 1), (10, -5), (16, 10), (22, -10), (28, 5), (34, -1)],
|
|
573
|
+
[(2, 1), (8, -5), (14, 10), (20, -10), (26, 5), (32, -1)]]
|
|
574
|
+
"""
|
|
575
|
+
k = self._weight
|
|
576
|
+
i, u, v = self._symbol_list[j]
|
|
577
|
+
u, v = self.__syms.normalize(v,-u-v)
|
|
578
|
+
if (k-2) % 2 == 0:
|
|
579
|
+
s = 1
|
|
580
|
+
else:
|
|
581
|
+
s = -1
|
|
582
|
+
z = []
|
|
583
|
+
a = Integer(k-2-i)
|
|
584
|
+
for j in range(k-2-i+1):
|
|
585
|
+
m = self.index((j, u, v))
|
|
586
|
+
z.append((m, s * a.binomial(j)))
|
|
587
|
+
s *= -1
|
|
588
|
+
return z
|
|
589
|
+
|
|
590
|
+
def apply_TT(self, j):
|
|
591
|
+
"""
|
|
592
|
+
Apply the matrix `TT=[-1,-1,0,1]` to the `j`-th Manin symbol.
|
|
593
|
+
|
|
594
|
+
INPUT:
|
|
595
|
+
|
|
596
|
+
- ``j`` -- integer; a symbol index
|
|
597
|
+
|
|
598
|
+
OUTPUT: see documentation for apply()
|
|
599
|
+
|
|
600
|
+
EXAMPLES::
|
|
601
|
+
|
|
602
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
603
|
+
sage: m = ManinSymbolList_gamma0(5,8)
|
|
604
|
+
sage: m.apply_TT(4)
|
|
605
|
+
[(38, 1)]
|
|
606
|
+
sage: [m.apply_TT(i) for i in range(10)]
|
|
607
|
+
[[(37, 1)],
|
|
608
|
+
[(41, 1)],
|
|
609
|
+
[(39, 1)],
|
|
610
|
+
[(40, 1)],
|
|
611
|
+
[(38, 1)],
|
|
612
|
+
[(36, 1)],
|
|
613
|
+
[(31, -1), (37, 1)],
|
|
614
|
+
[(35, -1), (41, 1)],
|
|
615
|
+
[(33, -1), (39, 1)],
|
|
616
|
+
[(34, -1), (40, 1)]]
|
|
617
|
+
"""
|
|
618
|
+
k = self._weight
|
|
619
|
+
i, u, v = self._symbol_list[j]
|
|
620
|
+
u, v = self.__syms.normalize(-u-v,u)
|
|
621
|
+
if (k-2-i) % 2 == 0:
|
|
622
|
+
s = 1
|
|
623
|
+
else:
|
|
624
|
+
s = -1
|
|
625
|
+
z = []
|
|
626
|
+
a = Integer(i)
|
|
627
|
+
for j in range(i+1):
|
|
628
|
+
m = self.index((k-2-i+j, u, v))
|
|
629
|
+
z.append((m, s * a.binomial(j)))
|
|
630
|
+
s *= -1
|
|
631
|
+
return z
|
|
632
|
+
|
|
633
|
+
def apply(self, j, m):
|
|
634
|
+
r"""
|
|
635
|
+
Apply the matrix `m = [a, b; c, d]` to the `j`-th Manin symbol.
|
|
636
|
+
|
|
637
|
+
INPUT:
|
|
638
|
+
|
|
639
|
+
- ``j`` -- integer; a symbol index
|
|
640
|
+
|
|
641
|
+
- ``m = [a, b, c, d]`` a list of 4 integers, which defines a 2x2 matrix
|
|
642
|
+
|
|
643
|
+
OUTPUT:
|
|
644
|
+
|
|
645
|
+
a list of pairs `(j_i, \alpha_i)`, where each `\alpha_i` is a nonzero
|
|
646
|
+
integer, `j_i` is an integer (index of the `j_i`-th Manin symbol), and
|
|
647
|
+
`\sum_i \alpha_i\*x_{j_i}` is the image of the `j`-th Manin symbol under
|
|
648
|
+
the right action of the matrix [a,b;c,d]. Here the right action of
|
|
649
|
+
`g = [a, b; c, d]` on a Manin symbol `[P(X,Y),(u,v)]` is
|
|
650
|
+
`[P(aX+bY,cX+dY),(u,v)\*g]`.
|
|
651
|
+
|
|
652
|
+
EXAMPLES::
|
|
653
|
+
|
|
654
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
655
|
+
sage: m = ManinSymbolList_gamma0(5,8)
|
|
656
|
+
sage: m.apply(40, [2,3,1,1])
|
|
657
|
+
[(0, 729), (6, 2916), (12, 4860), (18, 4320),
|
|
658
|
+
(24, 2160), (30, 576), (36, 64)]
|
|
659
|
+
"""
|
|
660
|
+
a, b, c, d = m[0], m[1], m[2], m[3]
|
|
661
|
+
i, u, v = self._symbol_list[j]
|
|
662
|
+
P = apply_to_monomial(i, self._weight-2, a, b, c, d)
|
|
663
|
+
m = self.index((0, u*a+v*c, u*b+v*d))
|
|
664
|
+
if m == -1:
|
|
665
|
+
return []
|
|
666
|
+
r = len(self.__syms)
|
|
667
|
+
return [(m + r*k, P[k]) for k in range(self._weight-2+1)
|
|
668
|
+
if P[k] != 0]
|
|
669
|
+
|
|
670
|
+
def normalize(self, x):
|
|
671
|
+
"""
|
|
672
|
+
Return the normalization of the Manin symbol ``x`` with
|
|
673
|
+
respect to this list.
|
|
674
|
+
|
|
675
|
+
INPUT:
|
|
676
|
+
|
|
677
|
+
- ``x`` -- (3-tuple of ints) a tuple defining a ManinSymbol
|
|
678
|
+
|
|
679
|
+
OUTPUT:
|
|
680
|
+
|
|
681
|
+
``(i,u,v)`` -- (3-tuple of ints) another tuple defining the associated
|
|
682
|
+
normalized ManinSymbol
|
|
683
|
+
|
|
684
|
+
EXAMPLES::
|
|
685
|
+
|
|
686
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
687
|
+
sage: m = ManinSymbolList_gamma0(5,8)
|
|
688
|
+
sage: [m.normalize(s.tuple()) for s in m.manin_symbol_list()][:10]
|
|
689
|
+
[(0, 0, 1),
|
|
690
|
+
(0, 1, 0),
|
|
691
|
+
(0, 1, 1),
|
|
692
|
+
(0, 1, 2),
|
|
693
|
+
(0, 1, 3),
|
|
694
|
+
(0, 1, 4),
|
|
695
|
+
(1, 0, 1),
|
|
696
|
+
(1, 1, 0),
|
|
697
|
+
(1, 1, 1),
|
|
698
|
+
(1, 1, 2)]
|
|
699
|
+
"""
|
|
700
|
+
u,v = self.__syms.normalize(x[1],x[2])
|
|
701
|
+
return (x[0],u,v)
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
class ManinSymbolList_gamma0(ManinSymbolList_group):
|
|
705
|
+
r"""
|
|
706
|
+
Class for Manin symbols for `\Gamma_0(N)`.
|
|
707
|
+
|
|
708
|
+
INPUT:
|
|
709
|
+
|
|
710
|
+
- ``level`` -- integer; the level
|
|
711
|
+
|
|
712
|
+
- ``weight`` -- integer; the weight
|
|
713
|
+
|
|
714
|
+
EXAMPLES::
|
|
715
|
+
|
|
716
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
717
|
+
sage: m = ManinSymbolList_gamma0(5,2); m
|
|
718
|
+
Manin Symbol List of weight 2 for Gamma0(5)
|
|
719
|
+
sage: m.manin_symbol_list()
|
|
720
|
+
[(0,1), (1,0), (1,1), (1,2), (1,3), (1,4)]
|
|
721
|
+
sage: m = ManinSymbolList_gamma0(6,4); m
|
|
722
|
+
Manin Symbol List of weight 4 for Gamma0(6)
|
|
723
|
+
sage: len(m)
|
|
724
|
+
36
|
|
725
|
+
"""
|
|
726
|
+
def __init__(self, level, weight):
|
|
727
|
+
"""
|
|
728
|
+
Constructor for a ModularSymbolList for Gamma_0(N).
|
|
729
|
+
|
|
730
|
+
EXAMPLES::
|
|
731
|
+
|
|
732
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
733
|
+
sage: M11 = ManinSymbolList_gamma0(11,2)
|
|
734
|
+
sage: M11
|
|
735
|
+
Manin Symbol List of weight 2 for Gamma0(11)
|
|
736
|
+
sage: M11 == loads(dumps(M11))
|
|
737
|
+
True
|
|
738
|
+
"""
|
|
739
|
+
ManinSymbolList_group.__init__(self, level, weight, p1list.P1List(level))
|
|
740
|
+
|
|
741
|
+
def __repr__(self):
|
|
742
|
+
"""
|
|
743
|
+
String representation.
|
|
744
|
+
|
|
745
|
+
EXAMPLES::
|
|
746
|
+
|
|
747
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma0
|
|
748
|
+
sage: M11 = ManinSymbolList_gamma0(11,2)
|
|
749
|
+
sage: str(M11)
|
|
750
|
+
'Manin Symbol List of weight 2 for Gamma0(11)'
|
|
751
|
+
"""
|
|
752
|
+
return "Manin Symbol List of weight %s for Gamma0(%s)" % (
|
|
753
|
+
self.weight(), self.level())
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
class ManinSymbolList_gamma1(ManinSymbolList_group):
|
|
757
|
+
r"""
|
|
758
|
+
Class for Manin symbols for `\Gamma_1(N)`.
|
|
759
|
+
|
|
760
|
+
INPUT:
|
|
761
|
+
|
|
762
|
+
- ``level`` -- integer; the level
|
|
763
|
+
|
|
764
|
+
- ``weight`` -- integer; the weight
|
|
765
|
+
|
|
766
|
+
EXAMPLES::
|
|
767
|
+
|
|
768
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma1
|
|
769
|
+
sage: m = ManinSymbolList_gamma1(5,2); m
|
|
770
|
+
Manin Symbol List of weight 2 for Gamma1(5)
|
|
771
|
+
sage: m.manin_symbol_list()
|
|
772
|
+
[(0,1),
|
|
773
|
+
(0,2),
|
|
774
|
+
(0,3),
|
|
775
|
+
...
|
|
776
|
+
(4,3),
|
|
777
|
+
(4,4)]
|
|
778
|
+
sage: m = ManinSymbolList_gamma1(6,4); m
|
|
779
|
+
Manin Symbol List of weight 4 for Gamma1(6)
|
|
780
|
+
sage: len(m)
|
|
781
|
+
72
|
|
782
|
+
sage: m == loads(dumps(m))
|
|
783
|
+
True
|
|
784
|
+
"""
|
|
785
|
+
def __init__(self, level, weight):
|
|
786
|
+
r"""
|
|
787
|
+
Constructor for a ModularSymbolList for `\Gamma_0(N)`.
|
|
788
|
+
|
|
789
|
+
EXAMPLES::
|
|
790
|
+
|
|
791
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma1
|
|
792
|
+
sage: M11 = ManinSymbolList_gamma1(11,2)
|
|
793
|
+
sage: M11
|
|
794
|
+
Manin Symbol List of weight 2 for Gamma1(11)
|
|
795
|
+
"""
|
|
796
|
+
ManinSymbolList_group.__init__(self, level, weight, g1list.G1list(level))
|
|
797
|
+
|
|
798
|
+
def __repr__(self):
|
|
799
|
+
"""
|
|
800
|
+
Return the string representation of this :class:`ManinSymbolList`.
|
|
801
|
+
|
|
802
|
+
EXAMPLES::
|
|
803
|
+
|
|
804
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma1
|
|
805
|
+
sage: M11 = ManinSymbolList_gamma1(11,4)
|
|
806
|
+
sage: str(M11)
|
|
807
|
+
'Manin Symbol List of weight 4 for Gamma1(11)'
|
|
808
|
+
"""
|
|
809
|
+
return "Manin Symbol List of weight %s for Gamma1(%s)" % (
|
|
810
|
+
self.weight(), self.level())
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
class ManinSymbolList_gamma_h(ManinSymbolList_group):
|
|
814
|
+
r"""
|
|
815
|
+
Class for Manin symbols for `\Gamma_H(N)`.
|
|
816
|
+
|
|
817
|
+
INPUT:
|
|
818
|
+
|
|
819
|
+
- ``group`` -- integer; the congruence subgroup
|
|
820
|
+
|
|
821
|
+
- ``weight`` -- integer; the weight
|
|
822
|
+
|
|
823
|
+
EXAMPLES::
|
|
824
|
+
|
|
825
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma_h
|
|
826
|
+
sage: G = GammaH(117, [4])
|
|
827
|
+
sage: m = ManinSymbolList_gamma_h(G,2); m
|
|
828
|
+
Manin Symbol List of weight 2 for Congruence Subgroup Gamma_H(117) with H generated by [4]
|
|
829
|
+
sage: m.manin_symbol_list()[100:110]
|
|
830
|
+
[(1,88),
|
|
831
|
+
(1,89),
|
|
832
|
+
(1,90),
|
|
833
|
+
(1,91),
|
|
834
|
+
(1,92),
|
|
835
|
+
(1,93),
|
|
836
|
+
(1,94),
|
|
837
|
+
(1,95),
|
|
838
|
+
(1,96),
|
|
839
|
+
(1,97)]
|
|
840
|
+
sage: len(m.manin_symbol_list())
|
|
841
|
+
2016
|
|
842
|
+
sage: m == loads(dumps(m))
|
|
843
|
+
True
|
|
844
|
+
"""
|
|
845
|
+
def __init__(self, group, weight):
|
|
846
|
+
r"""
|
|
847
|
+
Constructor for Manin symbols for `\Gamma_H(N)`.
|
|
848
|
+
|
|
849
|
+
EXAMPLES::
|
|
850
|
+
|
|
851
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_gamma_h
|
|
852
|
+
sage: G = GammaH(117, [4])
|
|
853
|
+
sage: m = ManinSymbolList_gamma_h(G,2); m
|
|
854
|
+
Manin Symbol List of weight 2 for Congruence Subgroup Gamma_H(117) with H generated by [4]
|
|
855
|
+
"""
|
|
856
|
+
self.__group = group
|
|
857
|
+
ManinSymbolList_group.__init__(self, group.level(), weight, ghlist.GHlist(group))
|
|
858
|
+
|
|
859
|
+
def group(self):
|
|
860
|
+
"""
|
|
861
|
+
Return the group associated to ``self``.
|
|
862
|
+
|
|
863
|
+
EXAMPLES::
|
|
864
|
+
|
|
865
|
+
sage: ModularSymbols(GammaH(12, [5]), 2).manin_symbols().group()
|
|
866
|
+
Congruence Subgroup Gamma_H(12) with H generated by [5]
|
|
867
|
+
"""
|
|
868
|
+
return self.__group
|
|
869
|
+
|
|
870
|
+
def __repr__(self):
|
|
871
|
+
"""
|
|
872
|
+
Return the string representation of ``self``.
|
|
873
|
+
|
|
874
|
+
EXAMPLES::
|
|
875
|
+
|
|
876
|
+
sage: ModularSymbols(GammaH(12, [5]), 2).manin_symbols().__repr__()
|
|
877
|
+
'Manin Symbol List of weight 2 for Congruence Subgroup Gamma_H(12) with H generated by [5]'
|
|
878
|
+
"""
|
|
879
|
+
return "Manin Symbol List of weight %s for %s" % (
|
|
880
|
+
self.weight(), self.group())
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
class ManinSymbolList_character(ManinSymbolList):
|
|
884
|
+
"""
|
|
885
|
+
List of Manin symbols with character.
|
|
886
|
+
|
|
887
|
+
INPUT:
|
|
888
|
+
|
|
889
|
+
- ``character`` -- (DirichletCharacter) the Dirichlet character
|
|
890
|
+
|
|
891
|
+
- ``weight`` -- integer; the weight
|
|
892
|
+
|
|
893
|
+
EXAMPLES::
|
|
894
|
+
|
|
895
|
+
sage: # needs sage.rings.number_field
|
|
896
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
897
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
898
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
899
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
900
|
+
sage: m.manin_symbol_list()
|
|
901
|
+
[(0,1), (1,0), (1,1), (1,2), (1,3), (2,1)]
|
|
902
|
+
sage: m == loads(dumps(m))
|
|
903
|
+
True
|
|
904
|
+
"""
|
|
905
|
+
def __init__(self, character, weight):
|
|
906
|
+
"""
|
|
907
|
+
Constructor for :class:`ManinSymbolList_character` objects.
|
|
908
|
+
|
|
909
|
+
INPUT:
|
|
910
|
+
|
|
911
|
+
- ``character`` -- (DirichletCharacter) the Dirichlet character
|
|
912
|
+
|
|
913
|
+
- ``weight`` -- integer; the weight
|
|
914
|
+
|
|
915
|
+
EXAMPLES::
|
|
916
|
+
|
|
917
|
+
sage: # needs sage.rings.number_field
|
|
918
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
919
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
920
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
921
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
922
|
+
sage: m.manin_symbol_list()
|
|
923
|
+
[(0,1), (1,0), (1,1), (1,2), (1,3), (2,1)]
|
|
924
|
+
sage: TestSuite(m).run()
|
|
925
|
+
"""
|
|
926
|
+
self.__level = character.modulus()
|
|
927
|
+
self.__P1 = p1list.P1List(self.level())
|
|
928
|
+
|
|
929
|
+
# We make a copy of the character *only* to program around what seems
|
|
930
|
+
# to be a bug in the cPickle module in some obscure case.
|
|
931
|
+
# If we don't due this, then this doctest fails.
|
|
932
|
+
# sage: M = ModularSymbols(DirichletGroup(5).0)
|
|
933
|
+
# sage: loads(dumps(M)) == M
|
|
934
|
+
|
|
935
|
+
self.__character = character.__copy__()
|
|
936
|
+
|
|
937
|
+
# The list returned from P1List is guaranteed to be sorted.
|
|
938
|
+
# Thus each list constructed below is also sorted. This is
|
|
939
|
+
# important since the index function assumes the list is sorted.
|
|
940
|
+
L = [(i, u, v) for i in range(weight - 2 + 1)
|
|
941
|
+
for u, v in self.__P1.list()]
|
|
942
|
+
self.__list = L
|
|
943
|
+
ManinSymbolList.__init__(self, weight, L)
|
|
944
|
+
|
|
945
|
+
def __repr__(self):
|
|
946
|
+
"""
|
|
947
|
+
Standard function returning string representation.
|
|
948
|
+
|
|
949
|
+
EXAMPLES::
|
|
950
|
+
|
|
951
|
+
sage: # needs sage.rings.number_field
|
|
952
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
953
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
954
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
955
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
956
|
+
sage: str(m) # indirect doctest
|
|
957
|
+
'Manin Symbol List of weight 2 for Gamma1(4) with character [-1]'
|
|
958
|
+
"""
|
|
959
|
+
return "Manin Symbol List of weight %s for Gamma1(%s) with character %s" % (
|
|
960
|
+
self.weight(), self.level(), self.character()._repr_short_())
|
|
961
|
+
|
|
962
|
+
def level(self):
|
|
963
|
+
"""
|
|
964
|
+
Return the level of this :class:`ManinSymbolList`.
|
|
965
|
+
|
|
966
|
+
OUTPUT: integer; the level of the symbols in this list
|
|
967
|
+
|
|
968
|
+
EXAMPLES::
|
|
969
|
+
|
|
970
|
+
sage: # needs sage.rings.number_field
|
|
971
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
972
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
973
|
+
sage: ManinSymbolList_character(eps,4).level()
|
|
974
|
+
4
|
|
975
|
+
"""
|
|
976
|
+
return self.__level
|
|
977
|
+
|
|
978
|
+
def apply(self, j, m):
|
|
979
|
+
"""
|
|
980
|
+
Apply the integer matrix `m=[a,b;c,d]` to the `j`-th Manin symbol.
|
|
981
|
+
|
|
982
|
+
INPUT:
|
|
983
|
+
|
|
984
|
+
- ``j`` -- integer; the index of the symbol to act on
|
|
985
|
+
|
|
986
|
+
- ``m`` -- list of integers `[a,b,c,d]` where `m = [a, b; c, d]` is the
|
|
987
|
+
matrix to be applied
|
|
988
|
+
|
|
989
|
+
OUTPUT:
|
|
990
|
+
|
|
991
|
+
A list of pairs `(j, c_i)`, where each `c_i` is an
|
|
992
|
+
integer, `j` is an integer (the `j`-th Manin symbol), and the
|
|
993
|
+
sum `c_i*x_i` is the image of ``self`` under the right action
|
|
994
|
+
of the matrix `[a,b;c,d]`. Here the right action of
|
|
995
|
+
`g = [a,b;c,d]` on a Manin symbol `[P(X,Y),(u,v)]` is by
|
|
996
|
+
definition `[P(aX+bY,cX+dY),(u,v)*g]`.
|
|
997
|
+
|
|
998
|
+
EXAMPLES::
|
|
999
|
+
|
|
1000
|
+
sage: # needs sage.rings.number_field
|
|
1001
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1002
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1003
|
+
sage: m = ManinSymbolList_character(eps,4)
|
|
1004
|
+
sage: m[6]
|
|
1005
|
+
[X*Y,(0,1)]
|
|
1006
|
+
sage: m.apply(4, [1,0,0,1])
|
|
1007
|
+
[(4, 1)]
|
|
1008
|
+
sage: m.apply(1, [-1,0,0,1])
|
|
1009
|
+
[(1, -1)]
|
|
1010
|
+
"""
|
|
1011
|
+
a, b, c, d = m[0], m[1], m[2], m[3]
|
|
1012
|
+
i, u, v = self._symbol_list[j]
|
|
1013
|
+
P = apply_to_monomial(i, self._weight-2, a, b, c, d)
|
|
1014
|
+
m, s = self.index((0, u*a+v*c, u*b+v*d))
|
|
1015
|
+
if m == -1 or s == 0:
|
|
1016
|
+
return []
|
|
1017
|
+
r = len(self.__P1)
|
|
1018
|
+
return [(m + r*k, s*P[k]) for k in range(self._weight-2+1)
|
|
1019
|
+
if P[k] != 0]
|
|
1020
|
+
|
|
1021
|
+
def apply_S(self, j):
|
|
1022
|
+
"""
|
|
1023
|
+
Apply the matrix `S=[0,1;-1,0]` to the `j`-th Manin symbol.
|
|
1024
|
+
|
|
1025
|
+
INPUT:
|
|
1026
|
+
|
|
1027
|
+
- ``j`` -- integer; a symbol index
|
|
1028
|
+
|
|
1029
|
+
OUTPUT:
|
|
1030
|
+
|
|
1031
|
+
``(k, s)`` where `k` is the index of the symbol obtained by acting
|
|
1032
|
+
on the `j`-th symbol with `S`, and `s` is the parity of the
|
|
1033
|
+
`j`-th symbol.
|
|
1034
|
+
|
|
1035
|
+
EXAMPLES::
|
|
1036
|
+
|
|
1037
|
+
sage: # needs sage.rings.number_field
|
|
1038
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1039
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1040
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
1041
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
1042
|
+
sage: m.apply_S(4)
|
|
1043
|
+
(2, -1)
|
|
1044
|
+
sage: [m.apply_S(i) for i in range(len(m))]
|
|
1045
|
+
[(1, 1), (0, -1), (4, 1), (5, -1), (2, -1), (3, 1)]
|
|
1046
|
+
"""
|
|
1047
|
+
i, u, v = self._symbol_list[j]
|
|
1048
|
+
k, s = self.index((self._weight - 2 - i, v, -u))
|
|
1049
|
+
if i % 2 == 0:
|
|
1050
|
+
return k, s
|
|
1051
|
+
else:
|
|
1052
|
+
return k, -s
|
|
1053
|
+
|
|
1054
|
+
def _apply_S_only_0pm1(self):
|
|
1055
|
+
"""
|
|
1056
|
+
Return ``True`` if the coefficient when applying the S relation is
|
|
1057
|
+
always 0, 1, or -1. This is useful for optimizing code in
|
|
1058
|
+
relation_matrix.py.
|
|
1059
|
+
|
|
1060
|
+
EXAMPLES::
|
|
1061
|
+
|
|
1062
|
+
sage: # needs sage.rings.number_field
|
|
1063
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1064
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1065
|
+
sage: ManinSymbolList_character(eps,2)._apply_S_only_0pm1()
|
|
1066
|
+
True
|
|
1067
|
+
sage: ManinSymbolList_character(DirichletGroup(13).0,2)._apply_S_only_0pm1()
|
|
1068
|
+
False
|
|
1069
|
+
"""
|
|
1070
|
+
return self.__character.order() <= 2
|
|
1071
|
+
|
|
1072
|
+
def apply_I(self, j):
|
|
1073
|
+
"""
|
|
1074
|
+
Apply the matrix `I=[-1,0,0,1]` to the `j`-th Manin symbol.
|
|
1075
|
+
|
|
1076
|
+
INPUT:
|
|
1077
|
+
|
|
1078
|
+
- ``j`` -- integer; a symbol index
|
|
1079
|
+
|
|
1080
|
+
OUTPUT:
|
|
1081
|
+
|
|
1082
|
+
``(k, s)`` where `k` is the index of the symbol obtained by acting
|
|
1083
|
+
on the `j`-th symbol with `I`, and `s` is the parity of the
|
|
1084
|
+
`j`-th symbol.
|
|
1085
|
+
|
|
1086
|
+
EXAMPLES::
|
|
1087
|
+
|
|
1088
|
+
sage: # needs sage.rings.number_field
|
|
1089
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1090
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1091
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
1092
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
1093
|
+
sage: m.apply_I(4)
|
|
1094
|
+
(2, -1)
|
|
1095
|
+
sage: [m.apply_I(i) for i in range(len(m))]
|
|
1096
|
+
[(0, 1), (1, -1), (4, -1), (3, -1), (2, -1), (5, 1)]
|
|
1097
|
+
"""
|
|
1098
|
+
i, u, v = self._symbol_list[j]
|
|
1099
|
+
k, s = self.index((i, -u, v))
|
|
1100
|
+
if i % 2 == 0:
|
|
1101
|
+
return k, s
|
|
1102
|
+
else:
|
|
1103
|
+
return k, -s
|
|
1104
|
+
|
|
1105
|
+
def apply_T(self, j):
|
|
1106
|
+
"""
|
|
1107
|
+
Apply the matrix `T=[0,1,-1,-1]` to the `j`-th Manin symbol.
|
|
1108
|
+
|
|
1109
|
+
INPUT:
|
|
1110
|
+
|
|
1111
|
+
- ``j`` -- integer; a symbol index
|
|
1112
|
+
|
|
1113
|
+
OUTPUT:
|
|
1114
|
+
|
|
1115
|
+
A list of pairs `(j, c_i)`, where each `c_i` is an
|
|
1116
|
+
integer, `j` is an integer (the `j`-th Manin symbol), and the
|
|
1117
|
+
sum `c_i*x_i` is the image of ``self`` under the right action
|
|
1118
|
+
of the matrix `T`.
|
|
1119
|
+
|
|
1120
|
+
EXAMPLES::
|
|
1121
|
+
|
|
1122
|
+
sage: # needs sage.rings.number_field
|
|
1123
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1124
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1125
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
1126
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
1127
|
+
sage: m.apply_T(4)
|
|
1128
|
+
[(1, -1)]
|
|
1129
|
+
sage: [m.apply_T(i) for i in range(len(m))]
|
|
1130
|
+
[[(4, 1)], [(0, -1)], [(3, 1)], [(5, 1)], [(1, -1)], [(2, 1)]]
|
|
1131
|
+
"""
|
|
1132
|
+
k = self._weight
|
|
1133
|
+
i, u, v = self._symbol_list[j]
|
|
1134
|
+
u, v, r = self.__P1.normalize_with_scalar(v,-u-v)
|
|
1135
|
+
r = self.__character(r)
|
|
1136
|
+
if (k-2) % 2 == 0:
|
|
1137
|
+
s = r
|
|
1138
|
+
else:
|
|
1139
|
+
s = -r
|
|
1140
|
+
z = []
|
|
1141
|
+
a = Integer(k-2-i)
|
|
1142
|
+
for j in range(k-2-i+1):
|
|
1143
|
+
m, r = self.index((j, u, v))
|
|
1144
|
+
z.append((m, s * r * a.binomial(j)))
|
|
1145
|
+
s *= -1
|
|
1146
|
+
return z
|
|
1147
|
+
|
|
1148
|
+
def apply_TT(self, j):
|
|
1149
|
+
"""
|
|
1150
|
+
Apply the matrix `TT=[-1,-1,0,1]` to the `j`-th Manin symbol.
|
|
1151
|
+
|
|
1152
|
+
INPUT:
|
|
1153
|
+
|
|
1154
|
+
- ``j`` -- integer; a symbol index
|
|
1155
|
+
|
|
1156
|
+
OUTPUT:
|
|
1157
|
+
|
|
1158
|
+
A list of pairs `(j, c_i)`, where each `c_i` is an
|
|
1159
|
+
integer, `j` is an integer (the `j`-th Manin symbol), and the
|
|
1160
|
+
sum `c_i*x_i` is the image of ``self`` under the right action
|
|
1161
|
+
of the matrix `T^2`.
|
|
1162
|
+
|
|
1163
|
+
EXAMPLES::
|
|
1164
|
+
|
|
1165
|
+
sage: # needs sage.rings.number_field
|
|
1166
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1167
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1168
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
1169
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
1170
|
+
sage: m.apply_TT(4)
|
|
1171
|
+
[(0, 1)]
|
|
1172
|
+
sage: [m.apply_TT(i) for i in range(len(m))]
|
|
1173
|
+
[[(1, -1)], [(4, -1)], [(5, 1)], [(2, 1)], [(0, 1)], [(3, 1)]]
|
|
1174
|
+
"""
|
|
1175
|
+
k = self._weight
|
|
1176
|
+
i, u, v = self._symbol_list[j]
|
|
1177
|
+
u, v, r = self.__P1.normalize_with_scalar(-u-v,u)
|
|
1178
|
+
r = self.__character(r)
|
|
1179
|
+
if (k-2-i) % 2 == 0:
|
|
1180
|
+
s = r
|
|
1181
|
+
else:
|
|
1182
|
+
s = -r
|
|
1183
|
+
z = []
|
|
1184
|
+
a = Integer(i)
|
|
1185
|
+
for j in range(i+1):
|
|
1186
|
+
m, r = self.index((k-2-i+j, u, v))
|
|
1187
|
+
z.append((m, s * r * a.binomial(j)))
|
|
1188
|
+
s *= -1
|
|
1189
|
+
return z
|
|
1190
|
+
|
|
1191
|
+
def character(self):
|
|
1192
|
+
"""
|
|
1193
|
+
Return the character of this :class:`ManinSymbolList_character` object.
|
|
1194
|
+
|
|
1195
|
+
OUTPUT: the Dirichlet character of this Manin symbol list
|
|
1196
|
+
|
|
1197
|
+
EXAMPLES::
|
|
1198
|
+
|
|
1199
|
+
sage: # needs sage.rings.number_field
|
|
1200
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1201
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1202
|
+
sage: m = ManinSymbolList_character(eps,2); m
|
|
1203
|
+
Manin Symbol List of weight 2 for Gamma1(4) with character [-1]
|
|
1204
|
+
sage: m.character()
|
|
1205
|
+
Dirichlet character modulo 4 of conductor 4 mapping 3 |--> -1
|
|
1206
|
+
"""
|
|
1207
|
+
return self.__character
|
|
1208
|
+
|
|
1209
|
+
def index(self, x):
|
|
1210
|
+
"""
|
|
1211
|
+
Return the index of a standard Manin symbol equivalent to
|
|
1212
|
+
``x``, together with a scaling factor.
|
|
1213
|
+
|
|
1214
|
+
INPUT:
|
|
1215
|
+
|
|
1216
|
+
- ``x`` -- 3-tuple of integers defining an element of this
|
|
1217
|
+
list of Manin symbols, which need not be normalized
|
|
1218
|
+
|
|
1219
|
+
OUTPUT:
|
|
1220
|
+
|
|
1221
|
+
A pair ``(i, s)`` where ``i`` is the index of the Manin symbol
|
|
1222
|
+
equivalent to ``x`` and ``s`` is the scalar (an element of the
|
|
1223
|
+
base field). If there is no Manin symbol equivalent to ``x``
|
|
1224
|
+
in the list, then ``(-1, 0)`` is returned.
|
|
1225
|
+
|
|
1226
|
+
EXAMPLES::
|
|
1227
|
+
|
|
1228
|
+
sage: # needs sage.rings.number_field
|
|
1229
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1230
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1231
|
+
sage: m = ManinSymbolList_character(eps,4); m
|
|
1232
|
+
Manin Symbol List of weight 4 for Gamma1(4) with character [-1]
|
|
1233
|
+
sage: [m.index(s.tuple()) for s in m.manin_symbol_list()]
|
|
1234
|
+
[(0, 1),
|
|
1235
|
+
(1, 1),
|
|
1236
|
+
(2, 1),
|
|
1237
|
+
(3, 1),
|
|
1238
|
+
...
|
|
1239
|
+
(16, 1),
|
|
1240
|
+
(17, 1)]
|
|
1241
|
+
"""
|
|
1242
|
+
if x in self._index:
|
|
1243
|
+
return self._index[x], 1
|
|
1244
|
+
x, s = self.normalize(x)
|
|
1245
|
+
try:
|
|
1246
|
+
return self._index[x], s
|
|
1247
|
+
except KeyError:
|
|
1248
|
+
return -1, 0
|
|
1249
|
+
|
|
1250
|
+
def normalize(self, x):
|
|
1251
|
+
"""
|
|
1252
|
+
Return the normalization of the Manin Symbol ``x`` with
|
|
1253
|
+
respect to this list, together with the normalizing scalar.
|
|
1254
|
+
|
|
1255
|
+
INPUT:
|
|
1256
|
+
|
|
1257
|
+
- ``x`` -- 3-tuple of integers ``(i,u,v)``, defining an element of this
|
|
1258
|
+
list of Manin symbols, which need not be normalized
|
|
1259
|
+
|
|
1260
|
+
OUTPUT:
|
|
1261
|
+
|
|
1262
|
+
``((i,u,v),s)``, where ``(i,u,v)`` is the normalized Manin symbol equivalent
|
|
1263
|
+
to ``x``, and ``s`` is the normalizing scalar.
|
|
1264
|
+
|
|
1265
|
+
EXAMPLES::
|
|
1266
|
+
|
|
1267
|
+
sage: # needs sage.rings.number_field
|
|
1268
|
+
sage: eps = DirichletGroup(4).gen(0)
|
|
1269
|
+
sage: from sage.modular.modsym.manin_symbol_list import ManinSymbolList_character
|
|
1270
|
+
sage: m = ManinSymbolList_character(eps,4); m
|
|
1271
|
+
Manin Symbol List of weight 4 for Gamma1(4) with character [-1]
|
|
1272
|
+
sage: [m.normalize(s.tuple()) for s in m.manin_symbol_list()]
|
|
1273
|
+
[((0, 0, 1), 1),
|
|
1274
|
+
((0, 1, 0), 1),
|
|
1275
|
+
((0, 1, 1), 1),
|
|
1276
|
+
...
|
|
1277
|
+
((2, 1, 3), 1),
|
|
1278
|
+
((2, 2, 1), 1)]
|
|
1279
|
+
"""
|
|
1280
|
+
u,v,s = self.__P1.normalize_with_scalar(x[1],x[2])
|
|
1281
|
+
return (x[0],u,v), self.__character(s)
|
|
1282
|
+
|
|
1283
|
+
|
|
1284
|
+
register_unpickle_override('sage.modular.modsym.manin_symbols',
|
|
1285
|
+
'ManinSymbolList', ManinSymbolList)
|
|
1286
|
+
register_unpickle_override('sage.modular.modsym.manin_symbols',
|
|
1287
|
+
'ManinSymbolList_group', ManinSymbolList_group)
|
|
1288
|
+
register_unpickle_override('sage.modular.modsym.manin_symbols',
|
|
1289
|
+
'ManinSymbolList_gamma0', ManinSymbolList_gamma0)
|
|
1290
|
+
register_unpickle_override('sage.modular.modsym.manin_symbols',
|
|
1291
|
+
'ManinSymbolList_gamma1', ManinSymbolList_gamma1)
|
|
1292
|
+
register_unpickle_override('sage.modular.modsym.manin_symbols',
|
|
1293
|
+
'ManinSymbolList_gamma_h', ManinSymbolList_gamma_h)
|
|
1294
|
+
register_unpickle_override('sage.modular.modsym.manin_symbols',
|
|
1295
|
+
'ManinSymbolList_character', ManinSymbolList_character)
|