passagemath-schemes 10.5.48__cp312-cp312-musllinux_1_2_aarch64.whl → 10.6.47__cp312-cp312-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.
Potentially problematic release.
This version of passagemath-schemes might be problematic. Click here for more details.
- passagemath_schemes/__init__.py +3 -0
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/METADATA +42 -42
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/METADATA.bak +43 -43
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/RECORD +159 -140
- passagemath_schemes-10.6.47.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 +6 -6
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-aarch64-linux-musl.so +0 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +18 -18
- sage/lfunctions/zero_sums.cpython-312-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-312-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/arithgroup_perm.py +16 -16
- sage/modular/arithgroup/congroup.cpython-312-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-312-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-312-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-312-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/all.py +2 -2
- sage/modular/modsym/ambient.py +13 -20
- sage/modular/modsym/boundary.py +2 -2
- sage/modular/modsym/manin_symbol.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/manin_symbol_list.py +3 -7
- sage/modular/modsym/relation_matrix_pyx.cpython-312-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-312-aarch64-linux-musl.so +0 -0
- sage/schemes/elliptic_curves/padic_lseries.py +25 -13
- sage/schemes/elliptic_curves/padics.py +71 -62
- sage/schemes/elliptic_curves/period_lattice.py +78 -27
- sage/schemes/elliptic_curves/period_lattice_region.cpython-312-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.48.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-312-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/p1list.pxd +0 -29
- sage/modular/modsym/p1list.pyx +0 -1372
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/WHEEL +0 -0
|
@@ -838,7 +838,7 @@ class FormsRing_abstract(Parent):
|
|
|
838
838
|
- (self._group.n()-2) / (4*self._group.n()) * (Z**2+X**(self._group.n()-2)) * dZ
|
|
839
839
|
|
|
840
840
|
@cached_method
|
|
841
|
-
def has_reduce_hom(self):
|
|
841
|
+
def has_reduce_hom(self) -> bool:
|
|
842
842
|
r"""
|
|
843
843
|
Return whether the method ``reduce`` should reduce
|
|
844
844
|
homogeneous elements to the corresponding space of homogeneous elements.
|
|
@@ -862,10 +862,9 @@ class FormsRing_abstract(Parent):
|
|
|
862
862
|
sage: ModularForms(k=6).graded_ring().has_reduce_hom()
|
|
863
863
|
True
|
|
864
864
|
"""
|
|
865
|
-
|
|
866
865
|
return self._red_hom
|
|
867
866
|
|
|
868
|
-
def is_homogeneous(self):
|
|
867
|
+
def is_homogeneous(self) -> bool:
|
|
869
868
|
r"""
|
|
870
869
|
Return whether ``self`` is homogeneous component.
|
|
871
870
|
|
|
@@ -879,10 +878,9 @@ class FormsRing_abstract(Parent):
|
|
|
879
878
|
sage: ModularForms(k=6).is_homogeneous()
|
|
880
879
|
True
|
|
881
880
|
"""
|
|
882
|
-
|
|
883
881
|
return self._weight is not None
|
|
884
882
|
|
|
885
|
-
def is_modular(self):
|
|
883
|
+
def is_modular(self) -> bool:
|
|
886
884
|
r"""
|
|
887
885
|
Return whether ``self`` only contains modular elements.
|
|
888
886
|
|
|
@@ -900,10 +898,9 @@ class FormsRing_abstract(Parent):
|
|
|
900
898
|
sage: CuspForms(n=7, k=12, base_ring=AA).is_modular()
|
|
901
899
|
True
|
|
902
900
|
"""
|
|
903
|
-
|
|
904
901
|
return not (self.AT("quasi") <= self._analytic_type)
|
|
905
902
|
|
|
906
|
-
def is_weakly_holomorphic(self):
|
|
903
|
+
def is_weakly_holomorphic(self) -> bool:
|
|
907
904
|
r"""
|
|
908
905
|
Return whether ``self`` only contains weakly
|
|
909
906
|
holomorphic modular elements.
|
|
@@ -922,10 +919,9 @@ class FormsRing_abstract(Parent):
|
|
|
922
919
|
sage: CuspForms(n=7, k=12, base_ring=AA).is_weakly_holomorphic()
|
|
923
920
|
True
|
|
924
921
|
"""
|
|
925
|
-
|
|
926
922
|
return (self.AT("weak", "quasi") >= self._analytic_type)
|
|
927
923
|
|
|
928
|
-
def is_holomorphic(self):
|
|
924
|
+
def is_holomorphic(self) -> bool:
|
|
929
925
|
r"""
|
|
930
926
|
Return whether ``self`` only contains holomorphic
|
|
931
927
|
modular elements.
|
|
@@ -944,10 +940,9 @@ class FormsRing_abstract(Parent):
|
|
|
944
940
|
sage: CuspForms(n=7, k=12, base_ring=AA).is_holomorphic()
|
|
945
941
|
True
|
|
946
942
|
"""
|
|
947
|
-
|
|
948
943
|
return (self.AT("holo", "quasi") >= self._analytic_type)
|
|
949
944
|
|
|
950
|
-
def is_cuspidal(self):
|
|
945
|
+
def is_cuspidal(self) -> bool:
|
|
951
946
|
r"""
|
|
952
947
|
Return whether ``self`` only contains cuspidal elements.
|
|
953
948
|
|
|
@@ -965,10 +960,9 @@ class FormsRing_abstract(Parent):
|
|
|
965
960
|
sage: QuasiCuspForms(k=12).is_cuspidal()
|
|
966
961
|
True
|
|
967
962
|
"""
|
|
968
|
-
|
|
969
963
|
return (self.AT("cusp", "quasi") >= self._analytic_type)
|
|
970
964
|
|
|
971
|
-
def is_zerospace(self):
|
|
965
|
+
def is_zerospace(self) -> bool:
|
|
972
966
|
r"""
|
|
973
967
|
Return whether ``self`` is the (`0`-dimensional) zero space.
|
|
974
968
|
|
|
@@ -984,7 +978,6 @@ class FormsRing_abstract(Parent):
|
|
|
984
978
|
sage: CuspForms(k=12).reduce_type([]).is_zerospace()
|
|
985
979
|
True
|
|
986
980
|
"""
|
|
987
|
-
|
|
988
981
|
return (self.AT(["quasi"]) >= self._analytic_type)
|
|
989
982
|
|
|
990
983
|
def analytic_type(self):
|
|
@@ -363,7 +363,7 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
363
363
|
"""
|
|
364
364
|
return self.extend_type("holo", ring=True)(1).reduce()
|
|
365
365
|
|
|
366
|
-
def is_ambient(self):
|
|
366
|
+
def is_ambient(self) -> bool:
|
|
367
367
|
r"""
|
|
368
368
|
Return whether ``self`` is an ambient space.
|
|
369
369
|
|
|
@@ -1353,7 +1353,7 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
1353
1353
|
|
|
1354
1354
|
return (min_exp, order_1)
|
|
1355
1355
|
|
|
1356
|
-
def quasi_part_gens(self, r=None, min_exp=0, max_exp=infinity, order_1=ZZ.zero()):
|
|
1356
|
+
def quasi_part_gens(self, r=None, min_exp=0, max_exp=infinity, order_1=ZZ.zero()) -> tuple:
|
|
1357
1357
|
r"""
|
|
1358
1358
|
Return a basis in ``self`` of the subspace of (quasi) weakly
|
|
1359
1359
|
holomorphic forms which satisfy the specified properties on
|
|
@@ -1392,17 +1392,20 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
1392
1392
|
sage: QF = QuasiWeakModularForms(n=8, k=10/3, ep=-1)
|
|
1393
1393
|
sage: QF.default_prec(1)
|
|
1394
1394
|
sage: QF.quasi_part_gens(min_exp=-1)
|
|
1395
|
-
|
|
1395
|
+
(q^-1 + O(q), 1 + O(q), q^-1 - 9/(128*d) + O(q),
|
|
1396
|
+
1 + O(q), q^-1 - 19/(64*d) + O(q), q^-1 + 1/(64*d) + O(q))
|
|
1396
1397
|
|
|
1397
1398
|
sage: QF.quasi_part_gens(min_exp=-1, max_exp=-1)
|
|
1398
|
-
|
|
1399
|
+
(q^-1 + O(q), q^-1 - 9/(128*d) + O(q),
|
|
1400
|
+
q^-1 - 19/(64*d) + O(q), q^-1 + 1/(64*d) + O(q))
|
|
1399
1401
|
sage: QF.quasi_part_gens(min_exp=-2, r=1)
|
|
1400
|
-
|
|
1402
|
+
(q^-2 - 9/(128*d)*q^-1 - 261/(131072*d^2) + O(q),
|
|
1403
|
+
q^-1 - 9/(128*d) + O(q), 1 + O(q))
|
|
1401
1404
|
|
|
1402
1405
|
sage: from sage.modular.modform_hecketriangle.space import ModularForms
|
|
1403
1406
|
sage: MF = ModularForms(k=36)
|
|
1404
1407
|
sage: MF.quasi_part_gens(min_exp=2)
|
|
1405
|
-
|
|
1408
|
+
(q^2 + 194184*q^4 + O(q^5), q^3 - 72*q^4 + O(q^5))
|
|
1406
1409
|
|
|
1407
1410
|
sage: from sage.modular.modform_hecketriangle.space import QuasiModularForms
|
|
1408
1411
|
sage: MF = QuasiModularForms(n=5, k=6, ep=-1)
|
|
@@ -1410,17 +1413,17 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
1410
1413
|
sage: MF.dimension()
|
|
1411
1414
|
3
|
|
1412
1415
|
sage: MF.quasi_part_gens(r=0)
|
|
1413
|
-
|
|
1416
|
+
(1 - 37/(200*d)*q + O(q^2),)
|
|
1414
1417
|
sage: MF.quasi_part_gens(r=0)[0] == MF.E6()
|
|
1415
1418
|
True
|
|
1416
1419
|
sage: MF.quasi_part_gens(r=1)
|
|
1417
|
-
|
|
1420
|
+
(1 + 33/(200*d)*q + O(q^2),)
|
|
1418
1421
|
sage: MF.quasi_part_gens(r=1)[0] == MF.E2()*MF.E4()
|
|
1419
1422
|
True
|
|
1420
1423
|
sage: MF.quasi_part_gens(r=2)
|
|
1421
|
-
|
|
1424
|
+
()
|
|
1422
1425
|
sage: MF.quasi_part_gens(r=3)
|
|
1423
|
-
|
|
1426
|
+
(1 - 27/(200*d)*q + O(q^2),)
|
|
1424
1427
|
sage: MF.quasi_part_gens(r=3)[0] == MF.E2()^3
|
|
1425
1428
|
True
|
|
1426
1429
|
|
|
@@ -1430,18 +1433,18 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
1430
1433
|
sage: MF.dimension()
|
|
1431
1434
|
8
|
|
1432
1435
|
sage: MF.quasi_part_gens(r=0)
|
|
1433
|
-
|
|
1436
|
+
(q - 34743/(640000*d^2)*q^3 + O(q^4), q^2 - 69/(200*d)*q^3 + O(q^4))
|
|
1434
1437
|
sage: MF.quasi_part_gens(r=1)
|
|
1435
|
-
|
|
1436
|
-
q^2 + 1/(200*d)*q^3 + O(q^4)
|
|
1438
|
+
(q - 9/(200*d)*q^2 + 37633/(640000*d^2)*q^3 + O(q^4),
|
|
1439
|
+
q^2 + 1/(200*d)*q^3 + O(q^4))
|
|
1437
1440
|
sage: MF.quasi_part_gens(r=2)
|
|
1438
|
-
|
|
1441
|
+
(q - 1/(4*d)*q^2 - 24903/(640000*d^2)*q^3 + O(q^4),)
|
|
1439
1442
|
sage: MF.quasi_part_gens(r=3)
|
|
1440
|
-
|
|
1443
|
+
(q + 1/(10*d)*q^2 - 7263/(640000*d^2)*q^3 + O(q^4),)
|
|
1441
1444
|
sage: MF.quasi_part_gens(r=4)
|
|
1442
|
-
|
|
1445
|
+
(q - 11/(20*d)*q^2 + 53577/(640000*d^2)*q^3 + O(q^4),)
|
|
1443
1446
|
sage: MF.quasi_part_gens(r=5)
|
|
1444
|
-
|
|
1447
|
+
(q - 1/(5*d)*q^2 + 4017/(640000*d^2)*q^3 + O(q^4),)
|
|
1445
1448
|
|
|
1446
1449
|
sage: MF.quasi_part_gens(r=1)[0] == MF.E2() * CuspForms(n=5, k=16, ep=1).gen(0)
|
|
1447
1450
|
True
|
|
@@ -1454,9 +1457,9 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
1454
1457
|
sage: MF.quasi_part_gens(r=1, min_exp=-2) == MF.quasi_part_gens(r=1, min_exp=1)
|
|
1455
1458
|
True
|
|
1456
1459
|
sage: MF.quasi_part_gens(r=1)
|
|
1457
|
-
|
|
1460
|
+
(q - 8*q^2 - 8*q^3 + 5952*q^4 + O(q^5),
|
|
1458
1461
|
q^2 - 8*q^3 + 208*q^4 + O(q^5),
|
|
1459
|
-
q^3 - 16*q^4 + O(q^5)
|
|
1462
|
+
q^3 - 16*q^4 + O(q^5))
|
|
1460
1463
|
|
|
1461
1464
|
sage: MF = QuasiWeakModularForms(n=infinity, k=4, ep=1)
|
|
1462
1465
|
sage: MF.quasi_part_gens(r=2, min_exp=2, order_1=-2)[0] == MF.E2()^2 * MF.E4()^(-2) * MF.f_inf()^2
|
|
@@ -1464,23 +1467,22 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
1464
1467
|
sage: [v.order_at(-1) for v in MF.quasi_part_gens(r=0, min_exp=2, order_1=-2)]
|
|
1465
1468
|
[-2, -2]
|
|
1466
1469
|
"""
|
|
1467
|
-
|
|
1468
|
-
if (not self.is_weakly_holomorphic()):
|
|
1470
|
+
if not self.is_weakly_holomorphic():
|
|
1469
1471
|
from warnings import warn
|
|
1470
1472
|
warn("This function only determines generators of (quasi) weakly modular forms!")
|
|
1471
1473
|
|
|
1472
|
-
|
|
1474
|
+
min_exp, order_1 = self._canonical_min_exp(min_exp, order_1)
|
|
1473
1475
|
|
|
1474
1476
|
# For modular forms spaces the quasi parts are all zero except for r=0
|
|
1475
|
-
if
|
|
1477
|
+
if self.is_modular():
|
|
1476
1478
|
r = ZZ(r)
|
|
1477
|
-
if
|
|
1478
|
-
return
|
|
1479
|
+
if r:
|
|
1480
|
+
return ()
|
|
1479
1481
|
|
|
1480
1482
|
# The lower bounds on the powers of f_inf and E4 determine
|
|
1481
1483
|
# how large powers of E2 we can fit in...
|
|
1482
1484
|
n = self.hecke_n()
|
|
1483
|
-
if
|
|
1485
|
+
if n == infinity:
|
|
1484
1486
|
max_numerator_weight = self._weight - 4*min_exp - 4*order_1 + 4
|
|
1485
1487
|
else:
|
|
1486
1488
|
max_numerator_weight = self._weight - 4*n/(n-2)*min_exp + 4
|
|
@@ -1488,30 +1490,28 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
1488
1490
|
# If r is not specified we gather all generators for all possible r's
|
|
1489
1491
|
if r is None:
|
|
1490
1492
|
gens = []
|
|
1491
|
-
for rnew in range(QQ(max_numerator_weight/ZZ(2)).floor() + 1):
|
|
1492
|
-
gens
|
|
1493
|
-
return gens
|
|
1493
|
+
for rnew in range(QQ(max_numerator_weight / ZZ(2)).floor() + 1):
|
|
1494
|
+
gens.extend(self.quasi_part_gens(r=rnew, min_exp=min_exp, max_exp=max_exp, order_1=order_1))
|
|
1495
|
+
return tuple(gens)
|
|
1494
1496
|
|
|
1495
1497
|
r = ZZ(r)
|
|
1496
1498
|
if r < 0 or 2*r > max_numerator_weight:
|
|
1497
|
-
return
|
|
1499
|
+
return ()
|
|
1498
1500
|
|
|
1499
1501
|
E2 = self.E2()
|
|
1500
|
-
ambient_weak_space = self.graded_ring().reduce_type("weak",
|
|
1502
|
+
ambient_weak_space = self.graded_ring().reduce_type("weak",
|
|
1503
|
+
degree=(self._weight-QQ(2*r), self._ep*(-1)**r))
|
|
1501
1504
|
order_inf = ambient_weak_space._l1 - order_1
|
|
1502
1505
|
|
|
1503
|
-
if
|
|
1506
|
+
if max_exp == infinity:
|
|
1504
1507
|
max_exp = order_inf
|
|
1505
|
-
elif
|
|
1506
|
-
return
|
|
1508
|
+
elif max_exp < min_exp:
|
|
1509
|
+
return ()
|
|
1507
1510
|
else:
|
|
1508
1511
|
max_exp = min(ZZ(max_exp), order_inf)
|
|
1509
1512
|
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
gens += [ self(ambient_weak_space.F_basis(m, order_1=order_1)*E2**r) ]
|
|
1513
|
-
|
|
1514
|
-
return gens
|
|
1513
|
+
return tuple(self(ambient_weak_space.F_basis(m, order_1=order_1) * E2**r)
|
|
1514
|
+
for m in range(min_exp, max_exp + 1))
|
|
1515
1515
|
|
|
1516
1516
|
def quasi_part_dimension(self, r=None, min_exp=0, max_exp=infinity, order_1=ZZ.zero()):
|
|
1517
1517
|
r"""
|
|
@@ -2097,7 +2097,7 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
2097
2097
|
q^-1 + O(q^5)
|
|
2098
2098
|
|
|
2099
2099
|
sage: MF = ModularForms(k=36)
|
|
2100
|
-
sage: MF.q_basis() == MF.gens()
|
|
2100
|
+
sage: MF.q_basis() == list(MF.gens())
|
|
2101
2101
|
True
|
|
2102
2102
|
|
|
2103
2103
|
sage: QF = QuasiModularForms(k=6)
|
|
@@ -2150,26 +2150,25 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
2150
2150
|
raise ValueError("Index out of range: m={} >= {}=dimension + min_exp".format(m, column_len + min_exp))
|
|
2151
2151
|
|
|
2152
2152
|
return q_basis[m - min_exp]
|
|
2153
|
-
else:
|
|
2154
|
-
row_len = self.required_laurent_prec(min_exp=min_exp, order_1=order_1) - min_exp
|
|
2155
|
-
if (m >= row_len + min_exp):
|
|
2156
|
-
raise ValueError("Index out of range: m={} >= {}=required_precision + min_exp".format(m, row_len + min_exp))
|
|
2157
|
-
|
|
2158
|
-
A = self._quasi_form_matrix(min_exp=min_exp, order_1=order_1)
|
|
2159
|
-
b = vector(self.coeff_ring(), row_len)
|
|
2160
|
-
b[m - min_exp] = 1
|
|
2161
|
-
try:
|
|
2162
|
-
coord_vector = A.solve_right(b)
|
|
2163
|
-
except ValueError:
|
|
2164
|
-
raise ValueError("Unfortunately the q_basis vector (m={}, min_exp={}) doesn't exist in this case (this is rare/interesting, please report)".format(m, min_exp))
|
|
2165
2153
|
|
|
2166
|
-
|
|
2167
|
-
|
|
2154
|
+
row_len = self.required_laurent_prec(min_exp=min_exp, order_1=order_1) - min_exp
|
|
2155
|
+
if (m >= row_len + min_exp):
|
|
2156
|
+
raise ValueError("Index out of range: m={} >= {}=required_precision + min_exp".format(m, row_len + min_exp))
|
|
2168
2157
|
|
|
2169
|
-
|
|
2170
|
-
|
|
2158
|
+
A = self._quasi_form_matrix(min_exp=min_exp, order_1=order_1)
|
|
2159
|
+
b = vector(self.coeff_ring(), row_len)
|
|
2160
|
+
b[m - min_exp] = 1
|
|
2161
|
+
try:
|
|
2162
|
+
coord_vector = A.solve_right(b)
|
|
2163
|
+
except ValueError:
|
|
2164
|
+
raise ValueError("Unfortunately the q_basis vector (m={}, min_exp={}) doesn't exist in this case (this is rare/interesting, please report)".format(m, min_exp))
|
|
2171
2165
|
|
|
2172
|
-
|
|
2166
|
+
max_exp = order_inf + 1
|
|
2167
|
+
basis = self.quasi_part_gens(min_exp=min_exp, max_exp=max_exp, order_1=order_1)
|
|
2168
|
+
|
|
2169
|
+
column_len = A.dimensions()[1]
|
|
2170
|
+
return self(sum([coord_vector[l] * basis[l]
|
|
2171
|
+
for l in range(column_len)]))
|
|
2173
2172
|
|
|
2174
2173
|
def rationalize_series(self, laurent_series, coeff_bound=1e-10, denom_factor=ZZ(1)):
|
|
2175
2174
|
r"""
|
|
@@ -2347,9 +2346,8 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
2347
2346
|
|
|
2348
2347
|
return rational_coeff / d**m
|
|
2349
2348
|
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
return laurent_series
|
|
2349
|
+
return sum([rationalize_coefficient(laurent_series[m], m) * q**m
|
|
2350
|
+
for m in range(first_exp, laurent_series.exponents()[-1] + 1)]).add_bigoh(series_prec)
|
|
2353
2351
|
|
|
2354
2352
|
# DEFAULT METHODS (should be overwritten in concrete classes)
|
|
2355
2353
|
|
|
@@ -2491,11 +2489,11 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
2491
2489
|
|
|
2492
2490
|
return self.module()(self.ambient_space().coordinate_vector(v))
|
|
2493
2491
|
|
|
2494
|
-
def gens(self):
|
|
2492
|
+
def gens(self) -> tuple:
|
|
2495
2493
|
r"""
|
|
2496
2494
|
This method should be overloaded by subclasses.
|
|
2497
2495
|
|
|
2498
|
-
Return a basis of ``self
|
|
2496
|
+
Return a basis of ``self`` as a tuple.
|
|
2499
2497
|
|
|
2500
2498
|
Note that the coordinate vector of elements of ``self``
|
|
2501
2499
|
are with respect to this basis.
|
|
@@ -2504,11 +2502,10 @@ class FormsSpace_abstract(FormsRing_abstract):
|
|
|
2504
2502
|
|
|
2505
2503
|
sage: from sage.modular.modform_hecketriangle.space import ModularForms
|
|
2506
2504
|
sage: ModularForms(k=12).gens() # defined in space.py
|
|
2507
|
-
|
|
2508
|
-
q - 24*q^2 + 252*q^3 - 1472*q^4 + O(q^5)
|
|
2505
|
+
(1 + 196560*q^2 + 16773120*q^3 + 398034000*q^4 + O(q^5),
|
|
2506
|
+
q - 24*q^2 + 252*q^3 - 1472*q^4 + O(q^5))
|
|
2509
2507
|
"""
|
|
2510
|
-
|
|
2511
|
-
raise NotImplementedError("No generators are implemented yet for {}!".format(self))
|
|
2508
|
+
raise NotImplementedError(f"No generators are implemented yet for {self}!")
|
|
2512
2509
|
|
|
2513
2510
|
def gen(self, k=0):
|
|
2514
2511
|
r"""
|
|
@@ -154,8 +154,6 @@ class FormsRingElement(CommutativeAlgebraElement, UniqueRepresentation,
|
|
|
154
154
|
sage: MeromorphicModularFormsRing(n=3)(x) == MeromorphicModularFormsRing(n=4)(x)
|
|
155
155
|
False
|
|
156
156
|
sage: MeromorphicModularFormsRing()(-1/x) is MeromorphicModularFormsRing()(1/(-x))
|
|
157
|
-
False
|
|
158
|
-
sage: MeromorphicModularFormsRing()(-1/x) == MeromorphicModularFormsRing()(1/(-x))
|
|
159
157
|
True
|
|
160
158
|
sage: MeromorphicModularFormsRing(base_ring=CC)(-1/x) == MeromorphicModularFormsRing()(1/(-x))
|
|
161
159
|
True
|
|
@@ -357,7 +355,7 @@ class FormsRingElement(CommutativeAlgebraElement, UniqueRepresentation,
|
|
|
357
355
|
d = self.parent().get_d(fix_d=True)
|
|
358
356
|
return self.parent()(self._rat.subs(d=d))
|
|
359
357
|
|
|
360
|
-
def is_homogeneous(self):
|
|
358
|
+
def is_homogeneous(self) -> bool:
|
|
361
359
|
r"""
|
|
362
360
|
Return whether ``self`` is homogeneous.
|
|
363
361
|
|
|
@@ -375,7 +373,6 @@ class FormsRingElement(CommutativeAlgebraElement, UniqueRepresentation,
|
|
|
375
373
|
sage: QuasiModularFormsRing(n=infinity)(x*(x-y^2)+y^4).is_homogeneous() # needs sage.symbolic
|
|
376
374
|
True
|
|
377
375
|
"""
|
|
378
|
-
|
|
379
376
|
return self._weight is not None
|
|
380
377
|
|
|
381
378
|
def weight(self):
|
|
@@ -459,10 +456,11 @@ class FormsRingElement(CommutativeAlgebraElement, UniqueRepresentation,
|
|
|
459
456
|
"""
|
|
460
457
|
return not (self.AT("quasi") <= self._analytic_type)
|
|
461
458
|
|
|
462
|
-
def is_weakly_holomorphic(self):
|
|
459
|
+
def is_weakly_holomorphic(self) -> bool:
|
|
463
460
|
r"""
|
|
464
|
-
Return whether ``self`` is weakly holomorphic
|
|
465
|
-
|
|
461
|
+
Return whether ``self`` is weakly holomorphic.
|
|
462
|
+
|
|
463
|
+
This means that ``self`` has at most a power of ``f_inf``
|
|
466
464
|
in its denominator.
|
|
467
465
|
|
|
468
466
|
EXAMPLES::
|
|
@@ -485,7 +483,7 @@ class FormsRingElement(CommutativeAlgebraElement, UniqueRepresentation,
|
|
|
485
483
|
|
|
486
484
|
return self.AT("weak", "quasi") >= self._analytic_type
|
|
487
485
|
|
|
488
|
-
def is_holomorphic(self):
|
|
486
|
+
def is_holomorphic(self) -> bool:
|
|
489
487
|
r"""
|
|
490
488
|
Return whether ``self`` is holomorphic
|
|
491
489
|
in the sense that the denominator of ``self``
|
|
@@ -510,10 +508,11 @@ class FormsRingElement(CommutativeAlgebraElement, UniqueRepresentation,
|
|
|
510
508
|
|
|
511
509
|
return self.AT("holo", "quasi") >= self._analytic_type
|
|
512
510
|
|
|
513
|
-
def is_cuspidal(self):
|
|
511
|
+
def is_cuspidal(self) -> bool:
|
|
514
512
|
r"""
|
|
515
|
-
Return whether ``self`` is cuspidal
|
|
516
|
-
|
|
513
|
+
Return whether ``self`` is cuspidal.
|
|
514
|
+
|
|
515
|
+
This means that ``self`` is holomorphic and ``f_inf``
|
|
517
516
|
divides the numerator.
|
|
518
517
|
|
|
519
518
|
EXAMPLES::
|
|
@@ -536,7 +535,7 @@ class FormsRingElement(CommutativeAlgebraElement, UniqueRepresentation,
|
|
|
536
535
|
"""
|
|
537
536
|
return self.AT("cusp", "quasi") >= self._analytic_type
|
|
538
537
|
|
|
539
|
-
def is_zero(self):
|
|
538
|
+
def is_zero(self) -> bool:
|
|
540
539
|
r"""
|
|
541
540
|
Return whether ``self`` is the zero function.
|
|
542
541
|
|