passagemath-schemes 10.5.44__cp313-cp313-musllinux_1_2_aarch64.whl → 10.6.42__cp313-cp313-musllinux_1_2_aarch64.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/__init__.py +3 -0
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/METADATA +41 -41
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/METADATA.bak +42 -42
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/RECORD +158 -139
- passagemath_schemes-10.6.42.dist-info/top_level.txt +3 -0
- passagemath_schemes.libs/{libflint-7dd7ad94.so.19.0.0 → libflint-edf7fb90.so.22.0.0} +0 -0
- passagemath_schemes.libs/{libgcc_s-69c45f16.so.1 → libgcc_s-2d945d6c.so.1} +0 -0
- passagemath_schemes.libs/{libgmp-8e78bd9b.so.10.5.0 → libgmp-28992bcb.so.10.5.0} +0 -0
- passagemath_schemes.libs/{libgmpxx-e6de26f1.so.4.7.0 → libgmpxx-fecb01a9.so.4.7.0} +0 -0
- passagemath_schemes.libs/{libmpfr-5ff10580.so.6.2.1 → libmpfr-1fc8ea36.so.6.2.2} +0 -0
- passagemath_schemes.libs/{libstdc++-1f1a71be.so.6.0.33 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
- sage/all__sagemath_schemes.py +3 -2
- sage/databases/all__sagemath_schemes.py +0 -10
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +4 -4
- sage/dynamics/arithmetic_dynamics/generic_ds.py +3 -3
- sage/dynamics/arithmetic_dynamics/projective_ds.py +7 -7
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-313-aarch64-linux-musl.so +0 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +18 -18
- sage/lfunctions/zero_sums.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/abvar/abvar.py +12 -11
- sage/modular/abvar/constructor.py +3 -3
- sage/modular/abvar/cuspidal_subgroup.py +5 -6
- sage/modular/abvar/finite_subgroup.py +20 -18
- sage/modular/abvar/homology.py +1 -2
- sage/modular/abvar/homspace.py +1 -1
- sage/modular/abvar/lseries.py +3 -3
- sage/modular/abvar/morphism.py +1 -1
- sage/modular/abvar/torsion_point.py +1 -1
- sage/modular/abvar/torsion_subgroup.py +1 -1
- sage/modular/arithgroup/arithgroup_element.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/arithgroup_perm.py +16 -16
- sage/modular/arithgroup/congroup.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/congroup_gamma0.py +2 -2
- sage/modular/arithgroup/congroup_gamma1.py +4 -4
- sage/modular/arithgroup/congroup_gammaH.py +2 -2
- sage/modular/arithgroup/congroup_generic.py +2 -3
- sage/modular/arithgroup/congroup_sl2z.py +3 -3
- sage/modular/arithgroup/farey_symbol.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1 -2
- sage/modular/btquotients/btquotient.py +4 -5
- sage/modular/btquotients/pautomorphicform.py +2 -2
- sage/modular/cusps.py +6 -4
- sage/modular/cusps_nf.py +7 -8
- sage/modular/dirichlet.py +34 -43
- sage/modular/drinfeld_modform/element.py +4 -4
- sage/modular/drinfeld_modform/ring.py +12 -12
- sage/modular/drinfeld_modform/tutorial.py +1 -1
- sage/modular/hecke/algebra.py +7 -5
- sage/modular/hecke/ambient_module.py +2 -2
- sage/modular/hecke/element.py +7 -2
- sage/modular/hecke/module.py +9 -9
- sage/modular/hecke/submodule.py +6 -8
- sage/modular/hypergeometric_misc.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/hypergeometric_misc.pyx +3 -2
- sage/modular/hypergeometric_motive.py +2 -2
- sage/modular/local_comp/local_comp.py +19 -11
- sage/modular/local_comp/type_space.py +10 -8
- sage/modular/modform/ambient.py +4 -3
- sage/modular/modform/cuspidal_submodule.py +2 -2
- sage/modular/modform/element.py +72 -72
- sage/modular/modform/half_integral.py +1 -1
- sage/modular/modform/l_series_gross_zagier.py +3 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +5 -2
- sage/modular/modform/ring.py +10 -12
- sage/modular/modform/space.py +18 -21
- sage/modular/modform/weight1.py +1 -2
- sage/modular/modform_hecketriangle/abstract_ring.py +7 -14
- sage/modular/modform_hecketriangle/abstract_space.py +63 -66
- sage/modular/modform_hecketriangle/graded_ring_element.py +11 -12
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +82 -84
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +2 -2
- sage/modular/modform_hecketriangle/readme.py +9 -11
- sage/modular/modform_hecketriangle/series_constructor.py +10 -18
- sage/modular/modform_hecketriangle/space.py +29 -30
- sage/modular/modform_hecketriangle/subspace.py +9 -7
- sage/modular/modsym/ambient.py +13 -20
- sage/modular/modsym/boundary.py +2 -2
- sage/modular/modsym/manin_symbol.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/manin_symbol_list.py +3 -7
- sage/modular/modsym/relation_matrix_pyx.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/space.py +10 -22
- sage/modular/modsym/subspace.py +5 -7
- sage/modular/multiple_zeta.py +11 -13
- sage/modular/multiple_zeta_F_algebra.py +4 -6
- sage/modular/overconvergent/genus0.py +5 -4
- sage/modular/overconvergent/hecke_series.py +2 -2
- sage/modular/pollack_stevens/distributions.py +2 -2
- sage/modular/pollack_stevens/fund_domain.py +26 -29
- sage/modular/pollack_stevens/manin_map.py +15 -10
- sage/modular/pollack_stevens/modsym.py +18 -18
- sage/modular/quasimodform/element.py +10 -10
- sage/modular/quasimodform/ring.py +22 -22
- sage/modular/ssmod/ssmod.py +5 -12
- sage/rings/polynomial/binary_form_reduce.py +1 -1
- sage/schemes/curves/affine_curve.py +4 -4
- sage/schemes/curves/plane_curve_arrangement.py +28 -24
- sage/schemes/elliptic_curves/BSD.py +1 -1
- sage/schemes/elliptic_curves/addition_formulas_ring.py +4 -0
- sage/schemes/elliptic_curves/cm.py +1 -1
- sage/schemes/elliptic_curves/constructor.py +3 -3
- sage/schemes/elliptic_curves/ell_egros.py +1 -1
- sage/schemes/elliptic_curves/ell_field.py +57 -46
- sage/schemes/elliptic_curves/ell_finite_field.py +138 -26
- sage/schemes/elliptic_curves/ell_local_data.py +9 -9
- sage/schemes/elliptic_curves/ell_number_field.py +25 -24
- sage/schemes/elliptic_curves/ell_point.py +21 -22
- sage/schemes/elliptic_curves/ell_rational_field.py +38 -28
- sage/schemes/elliptic_curves/formal_group.py +1 -1
- sage/schemes/elliptic_curves/heegner.py +11 -8
- sage/schemes/elliptic_curves/height.py +26 -23
- sage/schemes/elliptic_curves/hom.py +2 -1
- sage/schemes/elliptic_curves/hom_composite.py +11 -11
- sage/schemes/elliptic_curves/hom_frobenius.py +8 -8
- sage/schemes/elliptic_curves/hom_sum.py +7 -1
- sage/schemes/elliptic_curves/hom_velusqrt.py +13 -7
- sage/schemes/elliptic_curves/homset.py +2 -2
- sage/schemes/elliptic_curves/isogeny_small_degree.py +1 -1
- sage/schemes/elliptic_curves/mod_poly.py +12 -5
- sage/schemes/elliptic_curves/mod_sym_num.cpython-313-aarch64-linux-musl.so +0 -0
- sage/schemes/elliptic_curves/padic_lseries.py +25 -13
- sage/schemes/elliptic_curves/padics.py +71 -63
- sage/schemes/elliptic_curves/period_lattice.py +78 -27
- sage/schemes/elliptic_curves/period_lattice_region.cpython-313-aarch64-linux-musl.so +0 -0
- sage/schemes/elliptic_curves/sha_tate.py +1 -1
- sage/schemes/elliptic_curves/weierstrass_morphism.py +2 -2
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +1 -1
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +1 -1
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +10 -20
- sage/schemes/jacobians/abstract_jacobian.py +1 -1
- sage/schemes/plane_conics/con_field.py +42 -42
- sage/schemes/plane_conics/con_rational_field.py +1 -1
- sage/schemes/riemann_surfaces/riemann_surface.py +8 -8
- 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
- passagemath_schemes-10.5.44.dist-info/top_level.txt +0 -2
- sage/databases/db_modular_polynomials.py +0 -250
- sage/databases/stein_watkins.py +0 -363
- sage/modular/modsym/p1list.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/p1list.pxd +0 -29
- sage/modular/modsym/p1list.pyx +0 -1372
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/WHEEL +0 -0
|
@@ -137,7 +137,7 @@ class Gamma1_class(GammaH_class):
|
|
|
137
137
|
"""
|
|
138
138
|
return Gamma1_constructor, (self.level(),)
|
|
139
139
|
|
|
140
|
-
def _latex_(self):
|
|
140
|
+
def _latex_(self) -> str:
|
|
141
141
|
r"""
|
|
142
142
|
Return the \LaTeX representation of ``self``.
|
|
143
143
|
|
|
@@ -150,7 +150,7 @@ class Gamma1_class(GammaH_class):
|
|
|
150
150
|
"""
|
|
151
151
|
return "\\Gamma_1(%s)" % self.level()
|
|
152
152
|
|
|
153
|
-
def is_even(self):
|
|
153
|
+
def is_even(self) -> bool:
|
|
154
154
|
"""
|
|
155
155
|
Return ``True`` precisely if this subgroup contains the matrix -1.
|
|
156
156
|
|
|
@@ -163,9 +163,9 @@ class Gamma1_class(GammaH_class):
|
|
|
163
163
|
sage: Gamma1(15).is_even()
|
|
164
164
|
False
|
|
165
165
|
"""
|
|
166
|
-
return self.level() in [1,2]
|
|
166
|
+
return self.level() in [1, 2]
|
|
167
167
|
|
|
168
|
-
def is_subgroup(self, right):
|
|
168
|
+
def is_subgroup(self, right) -> bool:
|
|
169
169
|
"""
|
|
170
170
|
Return ``True`` if ``self`` is a subgroup of ``right``.
|
|
171
171
|
|
|
@@ -435,7 +435,7 @@ class GammaH_class(CongruenceSubgroup):
|
|
|
435
435
|
"""
|
|
436
436
|
return self.__Hlist
|
|
437
437
|
|
|
438
|
-
def is_even(self):
|
|
438
|
+
def is_even(self) -> bool:
|
|
439
439
|
"""
|
|
440
440
|
Return ``True`` precisely if this subgroup contains the matrix -1.
|
|
441
441
|
|
|
@@ -1002,7 +1002,7 @@ class GammaH_class(CongruenceSubgroup):
|
|
|
1002
1002
|
for t in reps2:
|
|
1003
1003
|
yield SL2Z(t) * r
|
|
1004
1004
|
|
|
1005
|
-
def is_subgroup(self, other):
|
|
1005
|
+
def is_subgroup(self, other) -> bool:
|
|
1006
1006
|
r"""
|
|
1007
1007
|
Return ``True`` if ``self`` is a subgroup of ``right``, and ``False``
|
|
1008
1008
|
otherwise.
|
|
@@ -181,16 +181,15 @@ class CongruenceSubgroupBase(ArithmeticSubgroup):
|
|
|
181
181
|
N = self.level()
|
|
182
182
|
return self([1-N, -N, N, 1+N])
|
|
183
183
|
|
|
184
|
-
def is_congruence(self):
|
|
184
|
+
def is_congruence(self) -> bool:
|
|
185
185
|
r"""
|
|
186
|
-
Return True
|
|
186
|
+
Return ``True``, since this is a congruence subgroup.
|
|
187
187
|
|
|
188
188
|
EXAMPLES::
|
|
189
189
|
|
|
190
190
|
sage: Gamma0(7).is_congruence()
|
|
191
191
|
True
|
|
192
192
|
"""
|
|
193
|
-
|
|
194
193
|
return True
|
|
195
194
|
|
|
196
195
|
def level(self):
|
|
@@ -15,7 +15,7 @@ AUTHORS:
|
|
|
15
15
|
#
|
|
16
16
|
# The full text of the GPL is available at:
|
|
17
17
|
#
|
|
18
|
-
#
|
|
18
|
+
# https://www.gnu.org/licenses/
|
|
19
19
|
#
|
|
20
20
|
################################################################################
|
|
21
21
|
|
|
@@ -141,7 +141,7 @@ class SL2Z_class(Gamma0_class):
|
|
|
141
141
|
"""
|
|
142
142
|
return "Modular Group SL(2,Z)"
|
|
143
143
|
|
|
144
|
-
def _latex_(self):
|
|
144
|
+
def _latex_(self) -> str:
|
|
145
145
|
r"""
|
|
146
146
|
Return the \LaTeX representation of ``self``.
|
|
147
147
|
|
|
@@ -154,7 +154,7 @@ class SL2Z_class(Gamma0_class):
|
|
|
154
154
|
"""
|
|
155
155
|
return "\\mbox{\\rm SL}_2(%s)" % (ZZ._latex_())
|
|
156
156
|
|
|
157
|
-
def is_subgroup(self, right):
|
|
157
|
+
def is_subgroup(self, right) -> bool:
|
|
158
158
|
"""
|
|
159
159
|
Return ``True`` if ``self`` is a subgroup of ``right``.
|
|
160
160
|
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# sage_setup: distribution = sagemath-schemes
|
|
2
2
|
# distutils: sources = sage/modular/arithgroup/sl2z.cpp sage/modular/arithgroup/farey.cpp
|
|
3
3
|
# distutils: language = c++
|
|
4
|
-
# distutils: extra_compile_args = -std=c++
|
|
4
|
+
# distutils: extra_compile_args = -std=c++17
|
|
5
5
|
# sage.doctest: needs sage.libs.pari
|
|
6
6
|
r"""
|
|
7
7
|
Farey symbol for arithmetic subgroups of `\PSL_2(\ZZ)`
|
|
@@ -48,7 +48,6 @@ from sage.structure.richcmp cimport richcmp_not_equal
|
|
|
48
48
|
|
|
49
49
|
cdef extern from "sl2z.hpp":
|
|
50
50
|
cppclass cpp_SL2Z "SL2Z":
|
|
51
|
-
mpz_class a, b, c, d
|
|
52
51
|
cpp_SL2Z(int, int, int, int)
|
|
53
52
|
cpp_SL2Z(mpz_class, mpz_class, mpz_class, mpz_class)
|
|
54
53
|
mpz_class a()
|
|
@@ -1715,7 +1715,7 @@ class BruhatTitsQuotient(SageObject, UniqueRepresentation):
|
|
|
1715
1715
|
Compute certain invariants from the level data of the quotient
|
|
1716
1716
|
which allow one to compute the genus of the curve.
|
|
1717
1717
|
|
|
1718
|
-
Details to be found in Theorem
|
|
1718
|
+
Details to be found in Theorem 3.8 of [FM2014]_.
|
|
1719
1719
|
|
|
1720
1720
|
EXAMPLES::
|
|
1721
1721
|
|
|
@@ -2121,7 +2121,7 @@ class BruhatTitsQuotient(SageObject, UniqueRepresentation):
|
|
|
2121
2121
|
my_args.update(kwargs)
|
|
2122
2122
|
return S.plot(*args, **my_args)
|
|
2123
2123
|
|
|
2124
|
-
def is_admissible(self, D):
|
|
2124
|
+
def is_admissible(self, D) -> bool:
|
|
2125
2125
|
r"""
|
|
2126
2126
|
Test whether the imaginary quadratic field of
|
|
2127
2127
|
discriminant `D` embeds in the quaternion algebra. It
|
|
@@ -2456,7 +2456,7 @@ class BruhatTitsQuotient(SageObject, UniqueRepresentation):
|
|
|
2456
2456
|
|
|
2457
2457
|
INPUT:
|
|
2458
2458
|
|
|
2459
|
-
- ``g`` -- a
|
|
2459
|
+
- ``g`` -- a column vector of size `4` whose entries represent a
|
|
2460
2460
|
quaternion in our basis
|
|
2461
2461
|
|
|
2462
2462
|
- ``exact`` -- boolean (default: ``False``); if True, tries to embed
|
|
@@ -3099,8 +3099,7 @@ class BruhatTitsQuotient(SageObject, UniqueRepresentation):
|
|
|
3099
3099
|
Vertex of Bruhat-Tits tree for p = 3
|
|
3100
3100
|
"""
|
|
3101
3101
|
try:
|
|
3102
|
-
|
|
3103
|
-
return tmp
|
|
3102
|
+
return self._cached_paths[v1]
|
|
3104
3103
|
except KeyError:
|
|
3105
3104
|
pass
|
|
3106
3105
|
chain, v = self._BT.find_path(v1, self.get_vertex_dict())
|
|
@@ -863,7 +863,7 @@ class BruhatTitsHarmonicCocycles(AmbientHeckeModule, UniqueRepresentation):
|
|
|
863
863
|
# return BruhatTitsHarmonicCocyclesSubmodule(self, v)
|
|
864
864
|
raise NotImplementedError
|
|
865
865
|
|
|
866
|
-
def is_simple(self):
|
|
866
|
+
def is_simple(self) -> bool:
|
|
867
867
|
r"""
|
|
868
868
|
Whether ``self`` is irreducible.
|
|
869
869
|
|
|
@@ -2498,7 +2498,7 @@ class pAdicAutomorphicForms(Module, UniqueRepresentation):
|
|
|
2498
2498
|
sage: H = X.harmonic_cocycles(2,prec = 5)
|
|
2499
2499
|
sage: A = X.padic_automorphic_forms(2,prec = 5)
|
|
2500
2500
|
sage: h = H.basis()[0]
|
|
2501
|
-
sage: A.lift(h)
|
|
2501
|
+
sage: A.lift(h) # indirect doctest, long time
|
|
2502
2502
|
p-adic automorphic form of cohomological weight 0
|
|
2503
2503
|
"""
|
|
2504
2504
|
S = self._source.get_stabilizers()
|
sage/modular/cusps.py
CHANGED
|
@@ -27,6 +27,7 @@ EXAMPLES::
|
|
|
27
27
|
#
|
|
28
28
|
# https://www.gnu.org/licenses/
|
|
29
29
|
# ****************************************************************************
|
|
30
|
+
from typing import Any
|
|
30
31
|
|
|
31
32
|
from sage.misc.cachefunc import cached_method
|
|
32
33
|
from sage.misc.fast_methods import Singleton
|
|
@@ -318,7 +319,7 @@ class Cusp(Element):
|
|
|
318
319
|
o = right._rational_()
|
|
319
320
|
return richcmp(s, o, op)
|
|
320
321
|
|
|
321
|
-
def is_infinity(self):
|
|
322
|
+
def is_infinity(self) -> bool:
|
|
322
323
|
"""
|
|
323
324
|
Return ``True`` if this is the cusp infinity.
|
|
324
325
|
|
|
@@ -466,7 +467,8 @@ class Cusp(Element):
|
|
|
466
467
|
"""
|
|
467
468
|
return Cusp(-self.__a, self.__b)
|
|
468
469
|
|
|
469
|
-
def is_gamma0_equiv(self, other, N,
|
|
470
|
+
def is_gamma0_equiv(self, other, N,
|
|
471
|
+
transformation=None) -> bool | tuple[bool, Any]:
|
|
470
472
|
r"""
|
|
471
473
|
Return whether ``self`` and ``other`` are equivalent modulo the action of
|
|
472
474
|
`\Gamma_0(N)` via linear fractional transformations.
|
|
@@ -647,7 +649,7 @@ class Cusp(Element):
|
|
|
647
649
|
A = A % (u2 * v1 * M)
|
|
648
650
|
return (True, A)
|
|
649
651
|
|
|
650
|
-
def is_gamma1_equiv(self, other, N):
|
|
652
|
+
def is_gamma1_equiv(self, other, N) -> tuple[bool, int]:
|
|
651
653
|
r"""
|
|
652
654
|
Return whether ``self`` and ``other`` are equivalent modulo the action of
|
|
653
655
|
`\Gamma_1(N)` via linear fractional transformations.
|
|
@@ -702,7 +704,7 @@ class Cusp(Element):
|
|
|
702
704
|
return True, -1
|
|
703
705
|
return False, 0
|
|
704
706
|
|
|
705
|
-
def is_gamma_h_equiv(self, other, G):
|
|
707
|
+
def is_gamma_h_equiv(self, other, G) -> tuple[bool, int]:
|
|
706
708
|
r"""
|
|
707
709
|
Return a pair ``(b, t)``, where ``b`` is ``True`` or ``False`` as
|
|
708
710
|
``self`` and ``other`` are equivalent under the action of `G`, and `t`
|
sage/modular/cusps_nf.py
CHANGED
|
@@ -73,14 +73,14 @@ List representatives for Gamma_0(N) - equivalence classes of cusps::
|
|
|
73
73
|
# Distributed under the terms of the GNU General Public License (GPL)
|
|
74
74
|
# https://www.gnu.org/licenses/
|
|
75
75
|
# ****************************************************************************
|
|
76
|
+
from typing import Any
|
|
76
77
|
|
|
78
|
+
from sage.misc.cachefunc import cached_method, cached_function
|
|
77
79
|
from sage.structure.parent import Parent
|
|
78
80
|
from sage.structure.element import Element, InfinityElement
|
|
79
81
|
from sage.structure.richcmp import richcmp, rich_to_bool
|
|
80
82
|
from sage.structure.unique_representation import UniqueRepresentation
|
|
81
83
|
|
|
82
|
-
from sage.misc.cachefunc import cached_method, cached_function
|
|
83
|
-
|
|
84
84
|
|
|
85
85
|
@cached_function
|
|
86
86
|
def list_of_representatives(N):
|
|
@@ -598,7 +598,7 @@ class NFCusp(Element):
|
|
|
598
598
|
"""
|
|
599
599
|
return self.parent().number_field()
|
|
600
600
|
|
|
601
|
-
def is_infinity(self):
|
|
601
|
+
def is_infinity(self) -> bool:
|
|
602
602
|
"""
|
|
603
603
|
Return ``True`` if this is the cusp infinity.
|
|
604
604
|
|
|
@@ -823,7 +823,7 @@ class NFCusp(Element):
|
|
|
823
823
|
k = self.number_field()
|
|
824
824
|
return k.ideal(self.__a, self.__b)
|
|
825
825
|
|
|
826
|
-
def ABmatrix(self):
|
|
826
|
+
def ABmatrix(self) -> list:
|
|
827
827
|
"""
|
|
828
828
|
Return AB-matrix associated to the cusp ``self``.
|
|
829
829
|
|
|
@@ -898,11 +898,10 @@ class NFCusp(Element):
|
|
|
898
898
|
r = A1.element_1_mod(A2)
|
|
899
899
|
b1 = -(1 - r) / a2 * g
|
|
900
900
|
b2 = (r / a1) * g
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
return ABM
|
|
901
|
+
return [a1, b1, a2, b2]
|
|
904
902
|
|
|
905
|
-
def is_Gamma0_equivalent(self, other, N,
|
|
903
|
+
def is_Gamma0_equivalent(self, other, N,
|
|
904
|
+
Transformation=False) -> bool | tuple[bool, Any]:
|
|
906
905
|
r"""
|
|
907
906
|
Check if cusps ``self`` and ``other`` are `\Gamma_0(N)`- equivalent.
|
|
908
907
|
|
sage/modular/dirichlet.py
CHANGED
|
@@ -192,7 +192,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
192
192
|
"""
|
|
193
193
|
A Dirichlet character.
|
|
194
194
|
"""
|
|
195
|
-
def __init__(self, parent, x, check=True):
|
|
195
|
+
def __init__(self, parent, x, check=True) -> None:
|
|
196
196
|
r"""
|
|
197
197
|
Create a Dirichlet character with specified values on
|
|
198
198
|
generators of `(\ZZ/n\ZZ)^*`.
|
|
@@ -402,7 +402,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
402
402
|
G = self.parent().change_ring(R)
|
|
403
403
|
return G.element_class(G, [R(x) for x in self.values_on_gens()])
|
|
404
404
|
|
|
405
|
-
def _richcmp_(self, other, op):
|
|
405
|
+
def _richcmp_(self, other, op) -> bool:
|
|
406
406
|
"""
|
|
407
407
|
Compare ``self`` to ``other``.
|
|
408
408
|
|
|
@@ -430,7 +430,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
430
430
|
"""
|
|
431
431
|
return richcmp(self.values_on_gens(), other.values_on_gens(), op)
|
|
432
432
|
|
|
433
|
-
def __hash__(self):
|
|
433
|
+
def __hash__(self) -> int:
|
|
434
434
|
"""
|
|
435
435
|
Return the hash of ``self``.
|
|
436
436
|
|
|
@@ -528,7 +528,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
528
528
|
x = tuple(z**n for z in self.values_on_gens())
|
|
529
529
|
return G.element_class(G, x, check=False)
|
|
530
530
|
|
|
531
|
-
def _repr_short_(self):
|
|
531
|
+
def _repr_short_(self) -> str:
|
|
532
532
|
r"""
|
|
533
533
|
A short string representation of ``self``, often used in string representations of modular forms.
|
|
534
534
|
|
|
@@ -540,7 +540,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
540
540
|
"""
|
|
541
541
|
return str(list(self.values_on_gens()))
|
|
542
542
|
|
|
543
|
-
def _repr_(self):
|
|
543
|
+
def _repr_(self) -> str:
|
|
544
544
|
"""
|
|
545
545
|
String representation of ``self``.
|
|
546
546
|
|
|
@@ -570,7 +570,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
570
570
|
s += str(self.parent().unit_gens()[i]) + ' |--> ' + str(self.values_on_gens()[i])
|
|
571
571
|
return s
|
|
572
572
|
|
|
573
|
-
def _latex_(self):
|
|
573
|
+
def _latex_(self) -> str:
|
|
574
574
|
r"""
|
|
575
575
|
LaTeX representation of ``self``.
|
|
576
576
|
|
|
@@ -1049,7 +1049,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1049
1049
|
return NumberField(self.fixed_field_polynomial(), 'a')
|
|
1050
1050
|
|
|
1051
1051
|
@cached_method
|
|
1052
|
-
def decomposition(self):
|
|
1052
|
+
def decomposition(self) -> list:
|
|
1053
1053
|
r"""
|
|
1054
1054
|
Return the decomposition of ``self`` as a product of Dirichlet
|
|
1055
1055
|
characters of prime power modulus, where the prime powers exactly
|
|
@@ -1230,7 +1230,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1230
1230
|
G, v = self._pari_init_()
|
|
1231
1231
|
return pari.znconreyexp(G, v).sage()
|
|
1232
1232
|
|
|
1233
|
-
def lmfdb_page(self):
|
|
1233
|
+
def lmfdb_page(self) -> None:
|
|
1234
1234
|
r"""
|
|
1235
1235
|
Open the LMFDB web page of the character in a browser.
|
|
1236
1236
|
|
|
@@ -1247,7 +1247,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1247
1247
|
url = lmfdb_url.format(self.modulus(), self.conrey_number())
|
|
1248
1248
|
webbrowser.open(url)
|
|
1249
1249
|
|
|
1250
|
-
def galois_orbit(self, sort=True):
|
|
1250
|
+
def galois_orbit(self, sort=True) -> list:
|
|
1251
1251
|
r"""
|
|
1252
1252
|
Return the orbit of this character under the action of the absolute
|
|
1253
1253
|
Galois group of the prime subfield of the base ring.
|
|
@@ -1549,7 +1549,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1549
1549
|
|
|
1550
1550
|
And sums where exactly one character is nontrivial (see :issue:`6393`)::
|
|
1551
1551
|
|
|
1552
|
-
sage: G = DirichletGroup(5); X = G.list(); Y=X[0]; Z=X[1]
|
|
1552
|
+
sage: G = DirichletGroup(5); X = G.list(); Y = X[0]; Z = X[1]
|
|
1553
1553
|
sage: Y.jacobi_sum(Z)
|
|
1554
1554
|
-1
|
|
1555
1555
|
sage: Z.jacobi_sum(Y)
|
|
@@ -1704,7 +1704,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1704
1704
|
return g
|
|
1705
1705
|
|
|
1706
1706
|
@cached_method
|
|
1707
|
-
def is_even(self):
|
|
1707
|
+
def is_even(self) -> bool:
|
|
1708
1708
|
r"""
|
|
1709
1709
|
Return ``True`` if and only if `\varepsilon(-1) = 1`.
|
|
1710
1710
|
|
|
@@ -1748,7 +1748,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1748
1748
|
return self(-1) == R.one()
|
|
1749
1749
|
|
|
1750
1750
|
@cached_method
|
|
1751
|
-
def is_odd(self):
|
|
1751
|
+
def is_odd(self) -> bool:
|
|
1752
1752
|
r"""
|
|
1753
1753
|
Return ``True`` if and only if `\varepsilon(-1) = -1`.
|
|
1754
1754
|
|
|
@@ -1788,7 +1788,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1788
1788
|
return self(-1) == R(-1)
|
|
1789
1789
|
|
|
1790
1790
|
@cached_method
|
|
1791
|
-
def is_primitive(self):
|
|
1791
|
+
def is_primitive(self) -> bool:
|
|
1792
1792
|
"""
|
|
1793
1793
|
Return ``True`` if and only if this character is
|
|
1794
1794
|
primitive, i.e., its conductor equals its modulus.
|
|
@@ -1813,7 +1813,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1813
1813
|
return (self.conductor() == self.modulus())
|
|
1814
1814
|
|
|
1815
1815
|
@cached_method
|
|
1816
|
-
def is_trivial(self):
|
|
1816
|
+
def is_trivial(self) -> bool:
|
|
1817
1817
|
r"""
|
|
1818
1818
|
Return ``True`` if this is the trivial character,
|
|
1819
1819
|
i.e., has order 1.
|
|
@@ -1831,7 +1831,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
1831
1831
|
one = self.base_ring().one()
|
|
1832
1832
|
return all(x == one for x in self.values_on_gens())
|
|
1833
1833
|
|
|
1834
|
-
def kernel(self):
|
|
1834
|
+
def kernel(self) -> list:
|
|
1835
1835
|
r"""
|
|
1836
1836
|
Return the kernel of this character.
|
|
1837
1837
|
|
|
@@ -2045,7 +2045,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
2045
2045
|
return H(self)
|
|
2046
2046
|
|
|
2047
2047
|
@cached_method
|
|
2048
|
-
def values(self):
|
|
2048
|
+
def values(self) -> list:
|
|
2049
2049
|
"""
|
|
2050
2050
|
Return a list of the values of this character on each integer
|
|
2051
2051
|
between 0 and the modulus.
|
|
@@ -2133,7 +2133,7 @@ class DirichletCharacter(MultiplicativeGroupElement):
|
|
|
2133
2133
|
i += 1
|
|
2134
2134
|
|
|
2135
2135
|
@cached_method(do_pickle=True)
|
|
2136
|
-
def values_on_gens(self):
|
|
2136
|
+
def values_on_gens(self) -> tuple:
|
|
2137
2137
|
r"""
|
|
2138
2138
|
Return a tuple of the values of ``self`` on the standard
|
|
2139
2139
|
generators of `(\ZZ/N\ZZ)^*`, where `N` is the modulus.
|
|
@@ -2459,6 +2459,12 @@ class DirichletGroupFactory(UniqueFactory):
|
|
|
2459
2459
|
|
|
2460
2460
|
sage: DirichletGroup(60) is DirichletGroup(60)
|
|
2461
2461
|
True
|
|
2462
|
+
|
|
2463
|
+
Test for pickling::
|
|
2464
|
+
|
|
2465
|
+
sage: G = DirichletGroup(9)
|
|
2466
|
+
sage: loads(dumps(G)) is G
|
|
2467
|
+
True
|
|
2462
2468
|
"""
|
|
2463
2469
|
def create_key(self, N, base_ring=None, zeta=None, zeta_order=None,
|
|
2464
2470
|
names=None, integral=False):
|
|
@@ -2566,7 +2572,7 @@ class DirichletGroupFactory(UniqueFactory):
|
|
|
2566
2572
|
DirichletGroup = DirichletGroupFactory("DirichletGroup")
|
|
2567
2573
|
|
|
2568
2574
|
|
|
2569
|
-
def is_DirichletGroup(x):
|
|
2575
|
+
def is_DirichletGroup(x) -> bool:
|
|
2570
2576
|
"""
|
|
2571
2577
|
Return ``True`` if ``x`` is a Dirichlet group.
|
|
2572
2578
|
|
|
@@ -2595,7 +2601,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
2595
2601
|
|
|
2596
2602
|
Element = DirichletCharacter
|
|
2597
2603
|
|
|
2598
|
-
def __init__(self, base_ring, modulus, zeta, zeta_order):
|
|
2604
|
+
def __init__(self, base_ring, modulus, zeta, zeta_order) -> None:
|
|
2599
2605
|
"""
|
|
2600
2606
|
Create a Dirichlet group.
|
|
2601
2607
|
|
|
@@ -2634,21 +2640,6 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
2634
2640
|
self._modulus = modulus
|
|
2635
2641
|
self._integers = IntegerModRing(modulus)
|
|
2636
2642
|
|
|
2637
|
-
def __setstate__(self, state):
|
|
2638
|
-
"""
|
|
2639
|
-
Used for unpickling old instances.
|
|
2640
|
-
|
|
2641
|
-
TESTS::
|
|
2642
|
-
|
|
2643
|
-
sage: G = DirichletGroup(9)
|
|
2644
|
-
sage: loads(dumps(G)) is G
|
|
2645
|
-
True
|
|
2646
|
-
"""
|
|
2647
|
-
self._set_element_constructor()
|
|
2648
|
-
if '_zeta_order' in state:
|
|
2649
|
-
state['_zeta_order'] = Integer(state['_zeta_order'])
|
|
2650
|
-
super().__setstate__(state)
|
|
2651
|
-
|
|
2652
2643
|
@property
|
|
2653
2644
|
def _module(self):
|
|
2654
2645
|
"""
|
|
@@ -2689,7 +2680,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
2689
2680
|
return w
|
|
2690
2681
|
|
|
2691
2682
|
@property
|
|
2692
|
-
def _zeta_dlog(self):
|
|
2683
|
+
def _zeta_dlog(self) -> dict:
|
|
2693
2684
|
"""
|
|
2694
2685
|
Return a dictionary that can be used to compute discrete
|
|
2695
2686
|
logarithms in the value group of this Dirichlet group.
|
|
@@ -2873,7 +2864,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
2873
2864
|
a.append(R(x(v)))
|
|
2874
2865
|
return self.element_class(self, a)
|
|
2875
2866
|
|
|
2876
|
-
def _coerce_map_from_(self, X):
|
|
2867
|
+
def _coerce_map_from_(self, X) -> bool:
|
|
2877
2868
|
"""
|
|
2878
2869
|
Decide whether there is a coercion map from `X`.
|
|
2879
2870
|
|
|
@@ -2918,7 +2909,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
2918
2909
|
"""
|
|
2919
2910
|
return self.order()
|
|
2920
2911
|
|
|
2921
|
-
def _repr_(self):
|
|
2912
|
+
def _repr_(self) -> str:
|
|
2922
2913
|
"""
|
|
2923
2914
|
Return a print representation of this group, which can be renamed.
|
|
2924
2915
|
|
|
@@ -2938,7 +2929,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
2938
2929
|
return s
|
|
2939
2930
|
|
|
2940
2931
|
@cached_method
|
|
2941
|
-
def decomposition(self):
|
|
2932
|
+
def decomposition(self) -> list:
|
|
2942
2933
|
r"""
|
|
2943
2934
|
Return the Dirichlet groups of prime power modulus corresponding
|
|
2944
2935
|
to primes dividing modulus.
|
|
@@ -3107,7 +3098,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
3107
3098
|
return g[n]
|
|
3108
3099
|
|
|
3109
3100
|
@cached_method
|
|
3110
|
-
def gens(self):
|
|
3101
|
+
def gens(self) -> tuple:
|
|
3111
3102
|
"""
|
|
3112
3103
|
Return generators of ``self``.
|
|
3113
3104
|
|
|
@@ -3120,7 +3111,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
3120
3111
|
g = []
|
|
3121
3112
|
ord = self.zeta_order()
|
|
3122
3113
|
M = self._module
|
|
3123
|
-
zero = M(
|
|
3114
|
+
zero = M.zero()
|
|
3124
3115
|
orders = self.integers_mod().unit_group().gens_orders()
|
|
3125
3116
|
for i in range(len(self.unit_gens())):
|
|
3126
3117
|
z = zero.__copy__()
|
|
@@ -3143,7 +3134,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
3143
3134
|
|
|
3144
3135
|
__iter__ = multiplicative_iterator
|
|
3145
3136
|
|
|
3146
|
-
def list(self):
|
|
3137
|
+
def list(self) -> list:
|
|
3147
3138
|
"""
|
|
3148
3139
|
Return a list of the Dirichlet characters in this group.
|
|
3149
3140
|
|
|
@@ -3169,7 +3160,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
3169
3160
|
"""
|
|
3170
3161
|
return self._modulus
|
|
3171
3162
|
|
|
3172
|
-
def ngens(self):
|
|
3163
|
+
def ngens(self) -> int:
|
|
3173
3164
|
"""
|
|
3174
3165
|
Return the number of generators of ``self``.
|
|
3175
3166
|
|
|
@@ -3247,7 +3238,7 @@ class DirichletGroup_class(WithEqualityById, Parent):
|
|
|
3247
3238
|
e *= g**n
|
|
3248
3239
|
return e
|
|
3249
3240
|
|
|
3250
|
-
def unit_gens(self):
|
|
3241
|
+
def unit_gens(self) -> tuple:
|
|
3251
3242
|
r"""
|
|
3252
3243
|
Return the minimal generators for the units of
|
|
3253
3244
|
`(\ZZ/N\ZZ)^*`, where `N` is the
|
|
@@ -88,7 +88,7 @@ class DrinfeldModularFormsElement(ModuleElement):
|
|
|
88
88
|
|
|
89
89
|
.. NOTE::
|
|
90
90
|
|
|
91
|
-
This class should not be directly
|
|
91
|
+
This class should not be directly instantiated, instead create
|
|
92
92
|
an instance of the parent
|
|
93
93
|
:class:`~sage.modular.drinfeld_modform.ring.DrinfeldModularForms`
|
|
94
94
|
and access its elements using the relevant methods.
|
|
@@ -255,7 +255,7 @@ class DrinfeldModularFormsElement(ModuleElement):
|
|
|
255
255
|
"""
|
|
256
256
|
return self.parent()._rank
|
|
257
257
|
|
|
258
|
-
def is_one(self):
|
|
258
|
+
def is_one(self) -> bool:
|
|
259
259
|
r"""
|
|
260
260
|
Return ``True`` whether this graded Drinfeld form is the
|
|
261
261
|
multiplicative identity.
|
|
@@ -272,7 +272,7 @@ class DrinfeldModularFormsElement(ModuleElement):
|
|
|
272
272
|
"""
|
|
273
273
|
return self._polynomial.is_one()
|
|
274
274
|
|
|
275
|
-
def is_zero(self):
|
|
275
|
+
def is_zero(self) -> bool:
|
|
276
276
|
r"""
|
|
277
277
|
Return ``True`` whether this graded Drinfeld form is the
|
|
278
278
|
additive identity.
|
|
@@ -294,7 +294,7 @@ class DrinfeldModularFormsElement(ModuleElement):
|
|
|
294
294
|
"""
|
|
295
295
|
return not bool(self)
|
|
296
296
|
|
|
297
|
-
def is_homogeneous(self):
|
|
297
|
+
def is_homogeneous(self) -> bool:
|
|
298
298
|
r"""
|
|
299
299
|
Return whether the graded form is homogeneous in the weight.
|
|
300
300
|
|
|
@@ -103,7 +103,7 @@ class DrinfeldModularForms(Parent, UniqueRepresentation):
|
|
|
103
103
|
|
|
104
104
|
If this parameter is a single character, for example ``f``, and a
|
|
105
105
|
rank is specified, then the names will be of the form
|
|
106
|
-
``f1, f2, ..., fr``. Finally, if this parameter is a list, a
|
|
106
|
+
``f1, f2, ..., fr``. Finally, if this parameter is a list, a tuple
|
|
107
107
|
or a string of comma separated characters, then each character
|
|
108
108
|
will corresponds to a generator. Note that in this case, it not
|
|
109
109
|
necessary to specify the rank.
|
|
@@ -120,7 +120,7 @@ class DrinfeldModularForms(Parent, UniqueRepresentation):
|
|
|
120
120
|
Use the :meth:`gens` method to obtain the generators of the ring::
|
|
121
121
|
|
|
122
122
|
sage: M.gens()
|
|
123
|
-
|
|
123
|
+
(g1, g2, g3)
|
|
124
124
|
sage: M.inject_variables() # assign the variable g1, g2, g3
|
|
125
125
|
Defining g1, g2, g3
|
|
126
126
|
sage: T*g1*g2 + g3
|
|
@@ -131,29 +131,29 @@ class DrinfeldModularForms(Parent, UniqueRepresentation):
|
|
|
131
131
|
|
|
132
132
|
sage: M.<F, G, H> = DrinfeldModularForms(K)
|
|
133
133
|
sage: M.gens()
|
|
134
|
-
|
|
134
|
+
(F, G, H)
|
|
135
135
|
sage: M = DrinfeldModularForms(K, 5, names='f') # must specify the rank
|
|
136
136
|
sage: M.gens()
|
|
137
|
-
|
|
137
|
+
(f1, f2, f3, f4, f5)
|
|
138
138
|
sage: M = DrinfeldModularForms(K, names='u, v, w, x')
|
|
139
139
|
sage: M.gens()
|
|
140
|
-
|
|
140
|
+
(u, v, w, x)
|
|
141
141
|
sage: M = DrinfeldModularForms(K, names=['F', 'G', 'H'])
|
|
142
142
|
sage: M.gens()
|
|
143
|
-
|
|
143
|
+
(F, G, H)
|
|
144
144
|
|
|
145
145
|
Set the keyword parameter ``has_type`` to ``True`` in order to create
|
|
146
146
|
the ring of Drinfeld modular forms of arbitrary type::
|
|
147
147
|
|
|
148
148
|
sage: M = DrinfeldModularForms(K, 4, has_type=True)
|
|
149
149
|
sage: M.gens()
|
|
150
|
-
|
|
150
|
+
(g1, g2, g3, h4)
|
|
151
151
|
sage: h4 = M.3
|
|
152
152
|
sage: h4.type()
|
|
153
153
|
1
|
|
154
154
|
|
|
155
155
|
To obtain a generating set of the subspace of forms of a fixed
|
|
156
|
-
weight, use the
|
|
156
|
+
weight, use the method :meth:`basis_of_weight`::
|
|
157
157
|
|
|
158
158
|
sage: M = DrinfeldModularForms(K, 2)
|
|
159
159
|
sage: M.basis_of_weight(q^3 - 1) # needs sage.combinat
|
|
@@ -619,18 +619,18 @@ class DrinfeldModularForms(Parent, UniqueRepresentation):
|
|
|
619
619
|
"""
|
|
620
620
|
return self(self._poly_ring.gen(n))
|
|
621
621
|
|
|
622
|
-
def gens(self):
|
|
622
|
+
def gens(self) -> tuple:
|
|
623
623
|
r"""
|
|
624
|
-
Return a
|
|
624
|
+
Return a tuple of generators of this ring.
|
|
625
625
|
|
|
626
626
|
EXAMPLES::
|
|
627
627
|
|
|
628
628
|
sage: A = GF(3)['T']; K = Frac(A); T = K.gen()
|
|
629
629
|
sage: M = DrinfeldModularForms(K, 5)
|
|
630
630
|
sage: M.gens()
|
|
631
|
-
|
|
631
|
+
(g1, g2, g3, g4, g5)
|
|
632
632
|
"""
|
|
633
|
-
return
|
|
633
|
+
return tuple(self(g) for g in self._poly_ring.gens())
|
|
634
634
|
|
|
635
635
|
def ngens(self):
|
|
636
636
|
r"""
|