passagemath-schemes 10.8.1a4__cp314-cp314t-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.8.1a4.dist-info/METADATA +203 -0
- passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
- passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
- passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
- passagemath_schemes-10.8.1a4.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 +9556 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +727 -0
- sage/lfunctions/pari.py +971 -0
- sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5132 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
- sage/modular/abvar/abvar_newform.py +246 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +187 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +721 -0
- sage/modular/abvar/homspace.py +989 -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 +741 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1406 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +361 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +659 -0
- sage/modular/arithgroup/congroup_gammaH.py +1491 -0
- sage/modular/arithgroup/congroup_generic.py +630 -0
- sage/modular/arithgroup/congroup_sl2z.py +266 -0
- sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1067 -0
- sage/modular/arithgroup/tests.py +425 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3736 -0
- sage/modular/btquotients/pautomorphicform.py +2564 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1107 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +571 -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 +1076 -0
- sage/modular/hecke/algebra.py +725 -0
- sage/modular/hecke/all.py +19 -0
- sage/modular/hecke/ambient_module.py +994 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +302 -0
- sage/modular/hecke/hecke_operator.py +736 -0
- sage/modular/hecke/homspace.py +185 -0
- sage/modular/hecke/module.py +1744 -0
- sage/modular/hecke/morphism.py +139 -0
- sage/modular/hecke/submodule.py +970 -0
- sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2020 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1070 -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 +817 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +120 -0
- sage/modular/modform/ambient_g1.py +199 -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 +487 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4105 -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 +127 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-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 +1859 -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 +380 -0
- sage/modular/modform/weight1.py +221 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2527 -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 +3349 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -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 +3844 -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-314t-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 +1291 -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-314t-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 +376 -0
- sage/modular/multiple_zeta.py +2635 -0
- sage/modular/multiple_zeta_F_algebra.py +789 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1879 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +776 -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 +856 -0
- sage/modular/pollack_stevens/modsym.py +1590 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1078 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +846 -0
- sage/modular/quasimodform/ring.py +826 -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 +700 -0
- sage/schemes/curves/affine_curve.py +2924 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +397 -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 +3203 -0
- sage/schemes/curves/weighted_projective_curve.py +106 -0
- sage/schemes/curves/zariski_vankampen.py +1931 -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 +991 -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 +1103 -0
- sage/schemes/elliptic_curves/constructor.py +1530 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
- sage/schemes/elliptic_curves/ell_egros.py +457 -0
- sage/schemes/elliptic_curves/ell_field.py +2837 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3249 -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 +4944 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7184 -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 +1663 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7328 -0
- sage/schemes/elliptic_curves/height.py +2108 -0
- sage/schemes/elliptic_curves/hom.py +1788 -0
- sage/schemes/elliptic_curves/hom_composite.py +1084 -0
- sage/schemes/elliptic_curves/hom_fractional.py +544 -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 +681 -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 +1523 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +247 -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 +915 -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-314t-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-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +716 -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 +369 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -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 +312 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -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 +3863 -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 +581 -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 +53 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4177 -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,446 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Elements of Drinfeld modular forms rings
|
|
4
|
+
|
|
5
|
+
This module defines the elements of the class
|
|
6
|
+
:class:`~sage.modular.drinfeld_modform.ring.DrinfeldModularForms`.
|
|
7
|
+
|
|
8
|
+
AUTHORS:
|
|
9
|
+
|
|
10
|
+
- David Ayotte (2022): initial version
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# ****************************************************************************
|
|
14
|
+
# Copyright (C) 2022 DAVID AYOTTE <da.ayotte@outlook.com>
|
|
15
|
+
#
|
|
16
|
+
# This program is free software: you can redistribute it and/or modify
|
|
17
|
+
# it under the terms of the GNU General Public License as published by
|
|
18
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
19
|
+
# (at your option) any later version.
|
|
20
|
+
# https://www.gnu.org/licenses/
|
|
21
|
+
# ****************************************************************************
|
|
22
|
+
|
|
23
|
+
from sage.structure.element import ModuleElement
|
|
24
|
+
from sage.structure.richcmp import richcmp, op_NE, op_EQ
|
|
25
|
+
|
|
26
|
+
from sage.rings.integer_ring import ZZ
|
|
27
|
+
from sage.rings.polynomial.multi_polynomial import MPolynomial
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class DrinfeldModularFormsElement(ModuleElement):
|
|
31
|
+
r"""
|
|
32
|
+
Element class of rings of Drinfeld modular forms.
|
|
33
|
+
|
|
34
|
+
Recall that a *graded Drinfeld form* is a sum of Drinfeld modular
|
|
35
|
+
forms having potentially different weights:
|
|
36
|
+
|
|
37
|
+
.. MATH::
|
|
38
|
+
|
|
39
|
+
F = f_{k_1} + f_{k_2} + \cdots + f_{k_n}
|
|
40
|
+
|
|
41
|
+
where `f_{k_i}` is a Drinfeld modular form of weight `k_i`. We also
|
|
42
|
+
say that `f_{k_i}` is an *homogeneous component of weight* `k_i`. If
|
|
43
|
+
`n=1`, then we say that `F` is *homogeneous of weight* `k_1`.
|
|
44
|
+
|
|
45
|
+
EXAMPLES: use the ``inject_variable`` method of the parent to
|
|
46
|
+
quickly assign variables names to the generators::
|
|
47
|
+
|
|
48
|
+
sage: A = GF(3)['T']
|
|
49
|
+
sage: K.<T> = Frac(A)
|
|
50
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
51
|
+
sage: M.inject_variables()
|
|
52
|
+
Defining g1, g2
|
|
53
|
+
sage: g1 in M
|
|
54
|
+
True
|
|
55
|
+
sage: g2.parent()
|
|
56
|
+
Ring of Drinfeld modular forms of rank 2 over Fraction Field of Univariate Polynomial Ring in T over Finite Field of size 3
|
|
57
|
+
|
|
58
|
+
Next, via algebraic combination of the generator, we may create any
|
|
59
|
+
element of the ring::
|
|
60
|
+
|
|
61
|
+
sage: F = g1*g2 + g2
|
|
62
|
+
sage: F
|
|
63
|
+
g1*g2 + g2
|
|
64
|
+
sage: F.is_homogeneous()
|
|
65
|
+
False
|
|
66
|
+
sage: F.homogeneous_components()
|
|
67
|
+
{8: g2, 10: g1*g2}
|
|
68
|
+
|
|
69
|
+
If the created form is homogeneous, we can ask for its weight in
|
|
70
|
+
which case it will be a Drinfeld modular form::
|
|
71
|
+
|
|
72
|
+
sage: H = g1^4*g2^9 + T*g1^8*g2^8 + (T^2 - 1)*g1^28*g2^3
|
|
73
|
+
sage: H.is_homogeneous()
|
|
74
|
+
True
|
|
75
|
+
sage: H.weight()
|
|
76
|
+
80
|
|
77
|
+
|
|
78
|
+
You can also construct an element by simply passing a multivariate
|
|
79
|
+
polynomial to the parent::
|
|
80
|
+
|
|
81
|
+
sage: f1, f2 = polygens(K, 2, 'f1, f2')
|
|
82
|
+
sage: M(f1)
|
|
83
|
+
g1
|
|
84
|
+
sage: M(f2)
|
|
85
|
+
g2
|
|
86
|
+
sage: M(T*f1 + f2^3 + T^2 + 1)
|
|
87
|
+
g2^3 + T*g1 + (T^2 + 1)
|
|
88
|
+
|
|
89
|
+
.. NOTE::
|
|
90
|
+
|
|
91
|
+
This class should not be directly instantiated, instead create
|
|
92
|
+
an instance of the parent
|
|
93
|
+
:class:`~sage.modular.drinfeld_modform.ring.DrinfeldModularForms`
|
|
94
|
+
and access its elements using the relevant methods.
|
|
95
|
+
"""
|
|
96
|
+
def __init__(self, parent, polynomial):
|
|
97
|
+
if not isinstance(polynomial, MPolynomial):
|
|
98
|
+
raise TypeError("input must be a multivariate polynomial")
|
|
99
|
+
if not parent.base_ring().has_coerce_map_from(polynomial.base_ring()):
|
|
100
|
+
raise ValueError("unable to coerce base ring of the given "
|
|
101
|
+
"polynomial into Drinfeld modular form ring")
|
|
102
|
+
poly = parent._poly_ring(polynomial)
|
|
103
|
+
self._polynomial = poly
|
|
104
|
+
|
|
105
|
+
super().__init__(parent)
|
|
106
|
+
|
|
107
|
+
def _repr_(self):
|
|
108
|
+
r"""
|
|
109
|
+
Return the string representation of ``self``.
|
|
110
|
+
|
|
111
|
+
TESTS::
|
|
112
|
+
|
|
113
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
114
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
115
|
+
sage: (M.0)._repr_()
|
|
116
|
+
'g1'
|
|
117
|
+
sage: M.0 + M.1
|
|
118
|
+
g2 + g1
|
|
119
|
+
"""
|
|
120
|
+
return str(self._polynomial)
|
|
121
|
+
|
|
122
|
+
def _add_(self, other):
|
|
123
|
+
r"""
|
|
124
|
+
Return the addition of ``self`` with ``other``.
|
|
125
|
+
|
|
126
|
+
TESTS::
|
|
127
|
+
|
|
128
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
129
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
130
|
+
sage: M.0 + M.1 # indirect doctest
|
|
131
|
+
g2 + g1
|
|
132
|
+
"""
|
|
133
|
+
return self.__class__(self.parent(), self._polynomial + other._polynomial)
|
|
134
|
+
|
|
135
|
+
def _mul_(self, other):
|
|
136
|
+
r"""
|
|
137
|
+
Return the multiplication of ``self`` with ``other``.
|
|
138
|
+
|
|
139
|
+
TESTS::
|
|
140
|
+
|
|
141
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
142
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
143
|
+
sage: M.0*M.1 # indirect doctest
|
|
144
|
+
g1*g2
|
|
145
|
+
sage: M.0*(M.0 + M.1)
|
|
146
|
+
g1*g2 + g1^2
|
|
147
|
+
sage: (M.0 + M.1)*M.0
|
|
148
|
+
g1*g2 + g1^2
|
|
149
|
+
"""
|
|
150
|
+
return self.__class__(self.parent(), self._polynomial*other._polynomial)
|
|
151
|
+
|
|
152
|
+
def _lmul_(self, c):
|
|
153
|
+
r"""
|
|
154
|
+
Return the scalar multiplication of ``self`` by `c`.
|
|
155
|
+
|
|
156
|
+
TESTS::
|
|
157
|
+
|
|
158
|
+
sage: A = GF(3)['T']; K = Frac(A); T = K.gen()
|
|
159
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
160
|
+
sage: (T^2 + T + 2) * M.0 # indirect doctest
|
|
161
|
+
(T^2 + T - 1)*g1
|
|
162
|
+
sage: M.1 * (T^5 + T^2)
|
|
163
|
+
(T^5 + T^2)*g2
|
|
164
|
+
sage: 0 * M.1
|
|
165
|
+
0
|
|
166
|
+
sage: M.0 * 0
|
|
167
|
+
0
|
|
168
|
+
"""
|
|
169
|
+
return self.__class__(self.parent(), c*self._polynomial)
|
|
170
|
+
|
|
171
|
+
def __neg__(self):
|
|
172
|
+
r"""
|
|
173
|
+
Return the negation of ``self``.
|
|
174
|
+
|
|
175
|
+
TESTS::
|
|
176
|
+
|
|
177
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
178
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
179
|
+
sage: -M.0 # indirect doctest
|
|
180
|
+
-g1
|
|
181
|
+
"""
|
|
182
|
+
return self.__class__(self.parent(), -self._polynomial)
|
|
183
|
+
|
|
184
|
+
def __bool__(self):
|
|
185
|
+
r"""
|
|
186
|
+
Return ``True`` whether ``self`` is nonzero.
|
|
187
|
+
|
|
188
|
+
TESTS::
|
|
189
|
+
|
|
190
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
191
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
192
|
+
sage: bool(M.0)
|
|
193
|
+
True
|
|
194
|
+
"""
|
|
195
|
+
return bool(self._polynomial)
|
|
196
|
+
|
|
197
|
+
def _latex_(self):
|
|
198
|
+
r"""
|
|
199
|
+
Return the LaTeX expression of ``self``.
|
|
200
|
+
|
|
201
|
+
TESTS::
|
|
202
|
+
|
|
203
|
+
sage: A = GF(3)['T']; K.<T> = Frac(A)
|
|
204
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
205
|
+
sage: M.inject_variables()
|
|
206
|
+
Defining g1, g2
|
|
207
|
+
sage: latex(g1)
|
|
208
|
+
g_{1}
|
|
209
|
+
sage: latex(g2)
|
|
210
|
+
g_{2}
|
|
211
|
+
sage: latex(1/T*g1^5 + g2*g1)
|
|
212
|
+
\frac{1}{T} g_{1}^{5} + g_{1} g_{2}
|
|
213
|
+
"""
|
|
214
|
+
return self._polynomial._latex_()
|
|
215
|
+
|
|
216
|
+
def _richcmp_(self, other, op):
|
|
217
|
+
r"""
|
|
218
|
+
Return the comparison of ``self`` with ``other``.
|
|
219
|
+
|
|
220
|
+
TESTS::
|
|
221
|
+
|
|
222
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
223
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
224
|
+
sage: M.0 == M.1
|
|
225
|
+
False
|
|
226
|
+
sage: M.0 != M.1
|
|
227
|
+
True
|
|
228
|
+
sage: M.0 == M.0
|
|
229
|
+
True
|
|
230
|
+
sage: M.0 < M.1
|
|
231
|
+
Traceback (most recent call last):
|
|
232
|
+
...
|
|
233
|
+
TypeError: '<' not supported between instances of 'DrinfeldModularForms_with_category.element_class' and 'DrinfeldModularForms_with_category.element_class'
|
|
234
|
+
"""
|
|
235
|
+
if op != op_EQ and op != op_NE:
|
|
236
|
+
return NotImplemented
|
|
237
|
+
return richcmp(self._polynomial, other._polynomial, op)
|
|
238
|
+
|
|
239
|
+
def rank(self):
|
|
240
|
+
r"""
|
|
241
|
+
Return the rank of this graded Drinfeld form.
|
|
242
|
+
|
|
243
|
+
Note that the rank is independent of the chosen form and depends
|
|
244
|
+
only on the parent.
|
|
245
|
+
|
|
246
|
+
EXAMPLES::
|
|
247
|
+
|
|
248
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
249
|
+
sage: M2 = DrinfeldModularForms(K, 2)
|
|
250
|
+
sage: (M2.0).rank()
|
|
251
|
+
2
|
|
252
|
+
sage: M5 = DrinfeldModularForms(K, 5)
|
|
253
|
+
sage: (M5.0 + M5.3).rank()
|
|
254
|
+
5
|
|
255
|
+
"""
|
|
256
|
+
return self.parent()._rank
|
|
257
|
+
|
|
258
|
+
def is_one(self) -> bool:
|
|
259
|
+
r"""
|
|
260
|
+
Return ``True`` whether this graded Drinfeld form is the
|
|
261
|
+
multiplicative identity.
|
|
262
|
+
|
|
263
|
+
EXAMPLES::
|
|
264
|
+
|
|
265
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
266
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
267
|
+
sage: u = M.one()
|
|
268
|
+
sage: u.is_one()
|
|
269
|
+
True
|
|
270
|
+
sage: (M.0).is_one()
|
|
271
|
+
False
|
|
272
|
+
"""
|
|
273
|
+
return self._polynomial.is_one()
|
|
274
|
+
|
|
275
|
+
def is_zero(self) -> bool:
|
|
276
|
+
r"""
|
|
277
|
+
Return ``True`` whether this graded Drinfeld form is the
|
|
278
|
+
additive identity.
|
|
279
|
+
|
|
280
|
+
EXAMPLES::
|
|
281
|
+
|
|
282
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
283
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
284
|
+
sage: z = M.zero()
|
|
285
|
+
sage: z.is_zero()
|
|
286
|
+
True
|
|
287
|
+
sage: f = M.0
|
|
288
|
+
sage: f.is_zero()
|
|
289
|
+
False
|
|
290
|
+
sage: (f - f).is_zero()
|
|
291
|
+
True
|
|
292
|
+
sage: (0 * M.0).is_zero()
|
|
293
|
+
True
|
|
294
|
+
"""
|
|
295
|
+
return not bool(self)
|
|
296
|
+
|
|
297
|
+
def is_homogeneous(self) -> bool:
|
|
298
|
+
r"""
|
|
299
|
+
Return whether the graded form is homogeneous in the weight.
|
|
300
|
+
|
|
301
|
+
We recall that elements of Drinfeld modular forms ring are not
|
|
302
|
+
necessarily modular forms as they may have mixed weight
|
|
303
|
+
components.
|
|
304
|
+
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
308
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
309
|
+
sage: M.inject_variables()
|
|
310
|
+
Defining g1, g2
|
|
311
|
+
sage: f = g1^5*g2^2 # homogeneous polynomial
|
|
312
|
+
sage: f.is_homogeneous()
|
|
313
|
+
True
|
|
314
|
+
sage: g = g1 + g2 # mixed weight components
|
|
315
|
+
sage: g.is_homogeneous()
|
|
316
|
+
False
|
|
317
|
+
"""
|
|
318
|
+
return self._polynomial.is_homogeneous()
|
|
319
|
+
|
|
320
|
+
def homogeneous_components(self):
|
|
321
|
+
r"""
|
|
322
|
+
Return the homogeneous components of this graded Drinfeld
|
|
323
|
+
form.
|
|
324
|
+
|
|
325
|
+
EXAMPLES::
|
|
326
|
+
|
|
327
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
328
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
329
|
+
sage: M.inject_variables()
|
|
330
|
+
Defining g1, g2
|
|
331
|
+
sage: F = g1 + g1^2 + g1*g2^2 + g2^4
|
|
332
|
+
sage: D = F.homogeneous_components(); D
|
|
333
|
+
{2: g1, 4: g1^2, 18: g1*g2^2, 32: g2^4}
|
|
334
|
+
sage: D[32]
|
|
335
|
+
g2^4
|
|
336
|
+
"""
|
|
337
|
+
M = self.parent()
|
|
338
|
+
components = self._polynomial.homogeneous_components().items()
|
|
339
|
+
return {k: self.__class__(M, p) for k, p in components}
|
|
340
|
+
|
|
341
|
+
def polynomial(self):
|
|
342
|
+
r"""
|
|
343
|
+
Return this graded Drinfeld forms as a multivariate polynomial
|
|
344
|
+
over the generators of the ring.
|
|
345
|
+
|
|
346
|
+
OUTPUT: a multivariate polynomial over the base ring
|
|
347
|
+
|
|
348
|
+
EXAMPLES::
|
|
349
|
+
|
|
350
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
351
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
352
|
+
sage: M.inject_variables()
|
|
353
|
+
Defining g1, g2
|
|
354
|
+
sage: P1 = g1.polynomial();
|
|
355
|
+
sage: P2 = g2.polynomial();
|
|
356
|
+
sage: P2^2 + P1^2 + P1
|
|
357
|
+
g2^2 + g1^2 + g1
|
|
358
|
+
sage: P1.parent()
|
|
359
|
+
Multivariate Polynomial Ring in g1, g2 over Fraction Field of Univariate Polynomial Ring in T over Finite Field of size 3
|
|
360
|
+
|
|
361
|
+
The degree of each variables corresponds to the weight of the
|
|
362
|
+
generator::
|
|
363
|
+
|
|
364
|
+
sage: P1.degree()
|
|
365
|
+
2
|
|
366
|
+
sage: P2.degree()
|
|
367
|
+
8
|
|
368
|
+
"""
|
|
369
|
+
return self._polynomial
|
|
370
|
+
|
|
371
|
+
def type(self):
|
|
372
|
+
r"""
|
|
373
|
+
Return the type of this graded Drinfeld form.
|
|
374
|
+
|
|
375
|
+
Recall that the *type* is the integer `0 \leq m \leq q-1` such that
|
|
376
|
+
|
|
377
|
+
.. MATH::
|
|
378
|
+
|
|
379
|
+
f(\gamma(w)) = \mathrm{det}(\gamma)^m j(\gamma, w)^k f(w).
|
|
380
|
+
|
|
381
|
+
EXAMPLES::
|
|
382
|
+
|
|
383
|
+
sage: A = GF(11)['T']; K = Frac(A)
|
|
384
|
+
sage: M = DrinfeldModularForms(K, 2, has_type=True)
|
|
385
|
+
sage: M.inject_variables()
|
|
386
|
+
Defining g1, h2
|
|
387
|
+
sage: F = g1*h2^9
|
|
388
|
+
sage: F.type()
|
|
389
|
+
9
|
|
390
|
+
sage: (h2^11).type()
|
|
391
|
+
1
|
|
392
|
+
sage: g1.type()
|
|
393
|
+
0
|
|
394
|
+
|
|
395
|
+
The type only makes sense when the form is homogeneous::
|
|
396
|
+
|
|
397
|
+
sage: F = g1^4 + h2
|
|
398
|
+
sage: F.type()
|
|
399
|
+
Traceback (most recent call last):
|
|
400
|
+
...
|
|
401
|
+
ValueError: the graded form is not homogeneous
|
|
402
|
+
|
|
403
|
+
TESTS::
|
|
404
|
+
|
|
405
|
+
sage: A = GF(2)['T']; K = Frac(A)
|
|
406
|
+
sage: M = DrinfeldModularForms(K, 2, has_type=False)
|
|
407
|
+
sage: (M.1).type()
|
|
408
|
+
0
|
|
409
|
+
"""
|
|
410
|
+
if not self.is_homogeneous():
|
|
411
|
+
raise ValueError("the graded form is not homogeneous")
|
|
412
|
+
if not self.parent()._has_type:
|
|
413
|
+
return ZZ(0)
|
|
414
|
+
q = self.base_ring().base_ring().cardinality()
|
|
415
|
+
return self.polynomial().degrees()[-1] % (q-1)
|
|
416
|
+
|
|
417
|
+
def weight(self):
|
|
418
|
+
r"""
|
|
419
|
+
Return the weight of this graded Drinfeld modular form.
|
|
420
|
+
|
|
421
|
+
EXAMPLES::
|
|
422
|
+
|
|
423
|
+
sage: A = GF(3)['T']; K = Frac(A)
|
|
424
|
+
sage: M = DrinfeldModularForms(K, 2)
|
|
425
|
+
sage: M.inject_variables()
|
|
426
|
+
Defining g1, g2
|
|
427
|
+
sage: g1.weight()
|
|
428
|
+
2
|
|
429
|
+
sage: g2.weight()
|
|
430
|
+
8
|
|
431
|
+
sage: f = g1^5*g2^2
|
|
432
|
+
sage: f.weight()
|
|
433
|
+
26
|
|
434
|
+
|
|
435
|
+
If the form is not homogeneous, then the method returns an
|
|
436
|
+
error::
|
|
437
|
+
|
|
438
|
+
sage: f = g1 + g2
|
|
439
|
+
sage: f.weight()
|
|
440
|
+
Traceback (most recent call last):
|
|
441
|
+
...
|
|
442
|
+
ValueError: the graded form is not homogeneous
|
|
443
|
+
"""
|
|
444
|
+
if not self.is_homogeneous():
|
|
445
|
+
raise ValueError("the graded form is not homogeneous")
|
|
446
|
+
return self._polynomial.degree()
|