passagemath-schemes 10.6.47__cp312-cp312-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.6.47.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.47.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.47.dist-info/RECORD +311 -0
- passagemath_schemes-10.6.47.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.47.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +745 -0
- sage/lfunctions/pari.py +818 -0
- sage/lfunctions/zero_sums.cpython-312-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5135 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
- sage/modular/abvar/abvar_newform.py +244 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +186 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +720 -0
- sage/modular/abvar/homspace.py +998 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +740 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1402 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +363 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +653 -0
- sage/modular/arithgroup/congroup_gammaH.py +1469 -0
- sage/modular/arithgroup/congroup_generic.py +628 -0
- sage/modular/arithgroup/congroup_sl2z.py +267 -0
- sage/modular/arithgroup/farey_symbol.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1066 -0
- sage/modular/arithgroup/tests.py +418 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3753 -0
- sage/modular/btquotients/pautomorphicform.py +2570 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1109 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +569 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1065 -0
- sage/modular/hecke/algebra.py +746 -0
- sage/modular/hecke/all.py +20 -0
- sage/modular/hecke/ambient_module.py +1019 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +325 -0
- sage/modular/hecke/hecke_operator.py +780 -0
- sage/modular/hecke/homspace.py +206 -0
- sage/modular/hecke/module.py +1767 -0
- sage/modular/hecke/morphism.py +174 -0
- sage/modular/hecke/submodule.py +989 -0
- sage/modular/hypergeometric_misc.cpython-312-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2017 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1071 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +815 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +124 -0
- sage/modular/modform/ambient_g1.py +204 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +505 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4131 -0
- sage/modular/modform/find_generators.py +59 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +133 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-312-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1860 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +381 -0
- sage/modular/modform/weight1.py +220 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3846 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-312-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1295 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-312-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +375 -0
- sage/modular/multiple_zeta.py +2632 -0
- sage/modular/multiple_zeta_F_algebra.py +786 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1878 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +778 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +859 -0
- sage/modular/pollack_stevens/modsym.py +1593 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1076 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +845 -0
- sage/modular/quasimodform/ring.py +828 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +748 -0
- sage/schemes/curves/affine_curve.py +2928 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +381 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3026 -0
- sage/schemes/curves/zariski_vankampen.py +1932 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +1036 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1102 -0
- sage/schemes/elliptic_curves/constructor.py +1552 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
- sage/schemes/elliptic_curves/ell_egros.py +459 -0
- sage/schemes/elliptic_curves/ell_field.py +2836 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4787 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7335 -0
- sage/schemes/elliptic_curves/height.py +2109 -0
- sage/schemes/elliptic_curves/hom.py +1406 -0
- sage/schemes/elliptic_curves/hom_composite.py +934 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +682 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +237 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +943 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +715 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +291 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +580 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +73 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- sage_wheels/share/ellcurves/rank9 +7 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Ambient Jacobian abelian variety
|
|
4
|
+
|
|
5
|
+
TESTS::
|
|
6
|
+
|
|
7
|
+
sage: loads(dumps(J0(37))) == J0(37)
|
|
8
|
+
True
|
|
9
|
+
sage: loads(dumps(J1(13))) == J1(13)
|
|
10
|
+
True
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import weakref
|
|
14
|
+
from sage.structure.sequence import Sequence
|
|
15
|
+
|
|
16
|
+
from .abvar import (ModularAbelianVariety_modsym_abstract,
|
|
17
|
+
simple_factorization_of_modsym_space, modsym_lattices,
|
|
18
|
+
ModularAbelianVariety_modsym)
|
|
19
|
+
from sage.rings.rational_field import QQ
|
|
20
|
+
|
|
21
|
+
from sage.modular.modsym.modsym import ModularSymbols
|
|
22
|
+
from sage.modular.modform.constructor import Newforms
|
|
23
|
+
from sage.modular.arithgroup.all import Gamma0_class, Gamma1_class
|
|
24
|
+
from sage.modular.abvar import morphism
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
_cache = {}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def ModAbVar_ambient_jacobian(group):
|
|
31
|
+
"""
|
|
32
|
+
Return the ambient Jacobian attached to a given congruence
|
|
33
|
+
subgroup.
|
|
34
|
+
|
|
35
|
+
The result is cached using a weakref. This function is called
|
|
36
|
+
internally by modular abelian variety constructors.
|
|
37
|
+
|
|
38
|
+
INPUT:
|
|
39
|
+
|
|
40
|
+
- ``group`` -- a congruence subgroup
|
|
41
|
+
|
|
42
|
+
OUTPUT: a modular abelian variety attached
|
|
43
|
+
|
|
44
|
+
EXAMPLES::
|
|
45
|
+
|
|
46
|
+
sage: import sage.modular.abvar.abvar_ambient_jacobian as abvar_ambient_jacobian
|
|
47
|
+
sage: A = abvar_ambient_jacobian.ModAbVar_ambient_jacobian(Gamma0(11))
|
|
48
|
+
sage: A
|
|
49
|
+
Abelian variety J0(11) of dimension 1
|
|
50
|
+
sage: B = abvar_ambient_jacobian.ModAbVar_ambient_jacobian(Gamma0(11))
|
|
51
|
+
sage: A is B
|
|
52
|
+
True
|
|
53
|
+
|
|
54
|
+
You can get access to and/or clear the cache as follows::
|
|
55
|
+
|
|
56
|
+
sage: abvar_ambient_jacobian._cache = {}
|
|
57
|
+
sage: B = abvar_ambient_jacobian.ModAbVar_ambient_jacobian(Gamma0(11))
|
|
58
|
+
sage: A is B
|
|
59
|
+
False
|
|
60
|
+
"""
|
|
61
|
+
try:
|
|
62
|
+
X = _cache[group]()
|
|
63
|
+
if X is not None:
|
|
64
|
+
return X
|
|
65
|
+
except KeyError:
|
|
66
|
+
pass
|
|
67
|
+
X = ModAbVar_ambient_jacobian_class(group)
|
|
68
|
+
_cache[group] = weakref.ref(X)
|
|
69
|
+
return X
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class ModAbVar_ambient_jacobian_class(ModularAbelianVariety_modsym_abstract):
|
|
73
|
+
"""
|
|
74
|
+
An ambient Jacobian modular abelian variety attached to a
|
|
75
|
+
congruence subgroup.
|
|
76
|
+
"""
|
|
77
|
+
def __init__(self, group):
|
|
78
|
+
"""
|
|
79
|
+
Create an ambient Jacobian modular abelian variety.
|
|
80
|
+
|
|
81
|
+
EXAMPLES::
|
|
82
|
+
|
|
83
|
+
sage: A = J0(37); A
|
|
84
|
+
Abelian variety J0(37) of dimension 2
|
|
85
|
+
sage: type(A)
|
|
86
|
+
<class 'sage.modular.abvar.abvar_ambient_jacobian.ModAbVar_ambient_jacobian_class_with_category'>
|
|
87
|
+
sage: A.group()
|
|
88
|
+
Congruence Subgroup Gamma0(37)
|
|
89
|
+
"""
|
|
90
|
+
ModularAbelianVariety_modsym_abstract.__init__(self, (group,), QQ)
|
|
91
|
+
self.__group = group
|
|
92
|
+
self._is_hecke_stable = True
|
|
93
|
+
|
|
94
|
+
def _modular_symbols(self):
|
|
95
|
+
"""
|
|
96
|
+
Return the modular symbols space associated to this ambient
|
|
97
|
+
Jacobian.
|
|
98
|
+
|
|
99
|
+
OUTPUT: modular symbols space
|
|
100
|
+
|
|
101
|
+
EXAMPLES::
|
|
102
|
+
|
|
103
|
+
sage: M = J0(33)._modular_symbols(); M
|
|
104
|
+
Modular Symbols subspace of dimension 6 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field
|
|
105
|
+
sage: J0(33)._modular_symbols() is M
|
|
106
|
+
True
|
|
107
|
+
"""
|
|
108
|
+
try:
|
|
109
|
+
return self.__modsym
|
|
110
|
+
except AttributeError:
|
|
111
|
+
self.__modsym = ModularSymbols(self.__group, weight=2).cuspidal_submodule()
|
|
112
|
+
return self.__modsym
|
|
113
|
+
|
|
114
|
+
def _repr_(self):
|
|
115
|
+
"""
|
|
116
|
+
Return string representation of this Jacobian modular abelian
|
|
117
|
+
variety.
|
|
118
|
+
|
|
119
|
+
EXAMPLES::
|
|
120
|
+
|
|
121
|
+
sage: A = J0(11); A
|
|
122
|
+
Abelian variety J0(11) of dimension 1
|
|
123
|
+
sage: A._repr_()
|
|
124
|
+
'Abelian variety J0(11) of dimension 1'
|
|
125
|
+
sage: A.rename('J_0(11)')
|
|
126
|
+
sage: A
|
|
127
|
+
J_0(11)
|
|
128
|
+
|
|
129
|
+
We now clear the cache to get rid of our renamed
|
|
130
|
+
`J_0(11)`.
|
|
131
|
+
|
|
132
|
+
::
|
|
133
|
+
|
|
134
|
+
sage: import sage.modular.abvar.abvar_ambient_jacobian as abvar_ambient_jacobian
|
|
135
|
+
sage: abvar_ambient_jacobian._cache = {}
|
|
136
|
+
"""
|
|
137
|
+
return 'Abelian variety %s of dimension %s%s' % (self._ambient_repr(),
|
|
138
|
+
self.dimension(),
|
|
139
|
+
'' if self.base_field() == QQ else ' over %s' % self.base_field())
|
|
140
|
+
|
|
141
|
+
def _latex_(self):
|
|
142
|
+
"""
|
|
143
|
+
Return Latex representation of ``self``.
|
|
144
|
+
|
|
145
|
+
EXAMPLES::
|
|
146
|
+
|
|
147
|
+
sage: latex(J0(37))
|
|
148
|
+
J_0(37)
|
|
149
|
+
sage: J1(13)._latex_()
|
|
150
|
+
'J_1(13)'
|
|
151
|
+
sage: latex(JH(389,[16]))
|
|
152
|
+
J_H(389,[16])
|
|
153
|
+
"""
|
|
154
|
+
return self._ambient_latex_repr()
|
|
155
|
+
|
|
156
|
+
def ambient_variety(self):
|
|
157
|
+
"""
|
|
158
|
+
Return the ambient modular abelian variety that contains ``self``.
|
|
159
|
+
Since ``self`` is a Jacobian modular abelian variety, this is just
|
|
160
|
+
``self``.
|
|
161
|
+
|
|
162
|
+
OUTPUT: abelian variety
|
|
163
|
+
|
|
164
|
+
EXAMPLES::
|
|
165
|
+
|
|
166
|
+
sage: A = J0(17)
|
|
167
|
+
sage: A.ambient_variety()
|
|
168
|
+
Abelian variety J0(17) of dimension 1
|
|
169
|
+
sage: A is A.ambient_variety()
|
|
170
|
+
True
|
|
171
|
+
"""
|
|
172
|
+
return self
|
|
173
|
+
|
|
174
|
+
def group(self):
|
|
175
|
+
"""
|
|
176
|
+
Return the group that this Jacobian modular abelian variety is
|
|
177
|
+
attached to.
|
|
178
|
+
|
|
179
|
+
EXAMPLES::
|
|
180
|
+
|
|
181
|
+
sage: J1(37).group()
|
|
182
|
+
Congruence Subgroup Gamma1(37)
|
|
183
|
+
sage: J0(5077).group()
|
|
184
|
+
Congruence Subgroup Gamma0(5077)
|
|
185
|
+
sage: J = GammaH(11,[3]).modular_abelian_variety(); J
|
|
186
|
+
Abelian variety JH(11,[3]) of dimension 1
|
|
187
|
+
sage: J.group()
|
|
188
|
+
Congruence Subgroup Gamma_H(11) with H generated by [3]
|
|
189
|
+
"""
|
|
190
|
+
return self.__group
|
|
191
|
+
|
|
192
|
+
def groups(self):
|
|
193
|
+
"""
|
|
194
|
+
Return the tuple of congruence subgroups attached to this ambient
|
|
195
|
+
Jacobian. This is always a tuple of length 1.
|
|
196
|
+
|
|
197
|
+
OUTPUT: tuple
|
|
198
|
+
|
|
199
|
+
EXAMPLES::
|
|
200
|
+
|
|
201
|
+
sage: J0(37).groups()
|
|
202
|
+
(Congruence Subgroup Gamma0(37),)
|
|
203
|
+
"""
|
|
204
|
+
return (self.__group,)
|
|
205
|
+
|
|
206
|
+
def _calculate_endomorphism_generators(self):
|
|
207
|
+
"""
|
|
208
|
+
Calculate generators for the endomorphism ring of ``self``.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: J0(11)._calculate_endomorphism_generators()
|
|
213
|
+
[Abelian variety endomorphism of Abelian variety J0(11) of dimension 1]
|
|
214
|
+
sage: ls = J0(46)._calculate_endomorphism_generators() ; ls
|
|
215
|
+
[Abelian variety endomorphism of Abelian variety J0(46) of dimension 5,
|
|
216
|
+
Abelian variety endomorphism of Abelian variety J0(46) of dimension 5,
|
|
217
|
+
Abelian variety endomorphism of Abelian variety J0(46) of dimension 5,
|
|
218
|
+
Abelian variety endomorphism of Abelian variety J0(46) of dimension 5,
|
|
219
|
+
Abelian variety endomorphism of Abelian variety J0(46) of dimension 5]
|
|
220
|
+
sage: len(ls) == J0(46).dimension()
|
|
221
|
+
True
|
|
222
|
+
"""
|
|
223
|
+
D = self.decomposition()
|
|
224
|
+
phi = self._isogeny_to_product_of_simples()
|
|
225
|
+
psi = phi.complementary_isogeny()
|
|
226
|
+
|
|
227
|
+
m1 = phi.matrix()
|
|
228
|
+
m2 = psi.matrix()
|
|
229
|
+
|
|
230
|
+
H = self.Hom(self)
|
|
231
|
+
M = H.matrix_space()
|
|
232
|
+
|
|
233
|
+
ls = []
|
|
234
|
+
ind = 0
|
|
235
|
+
for d in D:
|
|
236
|
+
to_newform = d._isogeny_to_newform_abelian_variety()
|
|
237
|
+
n1 = to_newform.matrix()
|
|
238
|
+
n2 = to_newform.complementary_isogeny().matrix()
|
|
239
|
+
f_gens = to_newform.codomain()._calculate_endomorphism_generators()
|
|
240
|
+
small_space = to_newform.parent().matrix_space()
|
|
241
|
+
f_gens = [small_space(x.list()) for x in f_gens]
|
|
242
|
+
for m in f_gens:
|
|
243
|
+
mat = H.matrix_space()(0)
|
|
244
|
+
mat.set_block(ind, ind, n1 * m * n2)
|
|
245
|
+
ls.append((m1 * mat * m2).list())
|
|
246
|
+
ind += 2 * d.dimension()
|
|
247
|
+
|
|
248
|
+
return [H(morphism.Morphism(H, M(x))) for x in ls]
|
|
249
|
+
|
|
250
|
+
def degeneracy_map(self, level, t=1, check=True):
|
|
251
|
+
"""
|
|
252
|
+
Return the `t`-th degeneracy map from ``self`` to ``J(level)``. Here
|
|
253
|
+
`t` must be a divisor of either ``level/self.level()`` or
|
|
254
|
+
``self.level()/level``.
|
|
255
|
+
|
|
256
|
+
INPUT:
|
|
257
|
+
|
|
258
|
+
- ``level`` -- integer (multiple or divisor of level of
|
|
259
|
+
``self``)
|
|
260
|
+
|
|
261
|
+
- ``t`` -- divisor of quotient of level of ``self`` and
|
|
262
|
+
level
|
|
263
|
+
|
|
264
|
+
- ``check`` -- boolean (default: ``True``); if ``True`` do some
|
|
265
|
+
checks on the input
|
|
266
|
+
|
|
267
|
+
OUTPUT: a morphism
|
|
268
|
+
|
|
269
|
+
EXAMPLES::
|
|
270
|
+
|
|
271
|
+
sage: J0(11).degeneracy_map(33)
|
|
272
|
+
Degeneracy map from Abelian variety J0(11) of dimension 1 to Abelian variety J0(33) of dimension 3 defined by [1]
|
|
273
|
+
sage: J0(11).degeneracy_map(33).matrix()
|
|
274
|
+
[ 0 -3 2 1 -2 0]
|
|
275
|
+
[ 1 -2 0 1 0 -1]
|
|
276
|
+
sage: J0(11).degeneracy_map(33,3).matrix()
|
|
277
|
+
[-1 0 0 0 1 -2]
|
|
278
|
+
[-1 -1 1 -1 1 0]
|
|
279
|
+
sage: J0(33).degeneracy_map(11,1).matrix()
|
|
280
|
+
[ 0 1]
|
|
281
|
+
[ 0 -1]
|
|
282
|
+
[ 1 -1]
|
|
283
|
+
[ 0 1]
|
|
284
|
+
[-1 1]
|
|
285
|
+
[ 0 0]
|
|
286
|
+
sage: J0(11).degeneracy_map(33,1).matrix() * J0(33).degeneracy_map(11,1).matrix()
|
|
287
|
+
[4 0]
|
|
288
|
+
[0 4]
|
|
289
|
+
"""
|
|
290
|
+
if check:
|
|
291
|
+
if (level % self.level()) and (self.level() % level):
|
|
292
|
+
raise ValueError("level must be divisible by level of self")
|
|
293
|
+
if (max(level, self.level()) // min(self.level(), level)) % t:
|
|
294
|
+
raise ValueError("t must divide the quotient of the two levels")
|
|
295
|
+
|
|
296
|
+
Mself = self.modular_symbols()
|
|
297
|
+
Jdest = (type(Mself.group()))(level).modular_abelian_variety()
|
|
298
|
+
Mdest = Jdest.modular_symbols()
|
|
299
|
+
|
|
300
|
+
symbol_map = Mself.degeneracy_map(level, t).restrict_codomain(Mdest)
|
|
301
|
+
H = self.Hom(Jdest)
|
|
302
|
+
|
|
303
|
+
return H(morphism.DegeneracyMap(H, symbol_map.matrix(), [t]))
|
|
304
|
+
|
|
305
|
+
def dimension(self):
|
|
306
|
+
"""
|
|
307
|
+
Return the dimension of this modular abelian variety.
|
|
308
|
+
|
|
309
|
+
EXAMPLES::
|
|
310
|
+
|
|
311
|
+
sage: J0(2007).dimension()
|
|
312
|
+
221
|
|
313
|
+
sage: J1(13).dimension()
|
|
314
|
+
2
|
|
315
|
+
sage: J1(997).dimension()
|
|
316
|
+
40920
|
|
317
|
+
sage: J0(389).dimension()
|
|
318
|
+
32
|
|
319
|
+
sage: JH(389,[4]).dimension()
|
|
320
|
+
64
|
|
321
|
+
sage: J1(389).dimension()
|
|
322
|
+
6112
|
|
323
|
+
"""
|
|
324
|
+
try:
|
|
325
|
+
return self._dimension
|
|
326
|
+
except AttributeError:
|
|
327
|
+
d = self.group().genus()
|
|
328
|
+
self._dimension = d
|
|
329
|
+
return d
|
|
330
|
+
|
|
331
|
+
def decomposition(self, simple=True, bound=None):
|
|
332
|
+
"""
|
|
333
|
+
Decompose this ambient Jacobian as a product of abelian
|
|
334
|
+
subvarieties, up to isogeny.
|
|
335
|
+
|
|
336
|
+
EXAMPLES::
|
|
337
|
+
|
|
338
|
+
sage: J0(33).decomposition(simple=False)
|
|
339
|
+
[Abelian subvariety of dimension 2 of J0(33),
|
|
340
|
+
Abelian subvariety of dimension 1 of J0(33)]
|
|
341
|
+
sage: J0(33).decomposition(simple=False)[1].is_simple()
|
|
342
|
+
True
|
|
343
|
+
sage: J0(33).decomposition(simple=False)[0].is_simple()
|
|
344
|
+
False
|
|
345
|
+
sage: J0(33).decomposition(simple=False)
|
|
346
|
+
[Abelian subvariety of dimension 2 of J0(33),
|
|
347
|
+
Simple abelian subvariety 33a(None,33) of dimension 1 of J0(33)]
|
|
348
|
+
sage: J0(33).decomposition(simple=True)
|
|
349
|
+
[Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33),
|
|
350
|
+
Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33),
|
|
351
|
+
Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)]
|
|
352
|
+
"""
|
|
353
|
+
try:
|
|
354
|
+
return self.__decomposition[simple]
|
|
355
|
+
except KeyError:
|
|
356
|
+
pass
|
|
357
|
+
except AttributeError:
|
|
358
|
+
self.__decomposition = {}
|
|
359
|
+
|
|
360
|
+
M = self.modular_symbols().ambient_module()
|
|
361
|
+
level = M.level()
|
|
362
|
+
group = M.group()
|
|
363
|
+
factors = simple_factorization_of_modsym_space(M, simple=simple)
|
|
364
|
+
factors = modsym_lattices(M, factors)
|
|
365
|
+
|
|
366
|
+
D = []
|
|
367
|
+
is_simple = True if simple else None
|
|
368
|
+
for newform_level, isogeny_number, number, modsym, lattice in factors:
|
|
369
|
+
A = ModularAbelianVariety_modsym(modsym, lattice=lattice,
|
|
370
|
+
newform_level=(newform_level, group),
|
|
371
|
+
is_simple=is_simple,
|
|
372
|
+
isogeny_number=isogeny_number,
|
|
373
|
+
number=(number, level),
|
|
374
|
+
check=False)
|
|
375
|
+
D.append(A)
|
|
376
|
+
|
|
377
|
+
# This line below could be safely deleted. It basically creates a circular
|
|
378
|
+
# reference so that say J0(389)[0] + J0(389)[1] doesn't do two separate
|
|
379
|
+
# decompositions. Memory will be freed though, at least if you do
|
|
380
|
+
# import gc; gc.collect().
|
|
381
|
+
A._ambient = self
|
|
382
|
+
|
|
383
|
+
D.sort()
|
|
384
|
+
D = Sequence(D, immutable=True, cr=True, universe=self.category())
|
|
385
|
+
self.__decomposition[simple] = D
|
|
386
|
+
return D
|
|
387
|
+
|
|
388
|
+
def newform_decomposition(self, names=None):
|
|
389
|
+
"""
|
|
390
|
+
Return the newforms of the simple subvarieties in the decomposition of
|
|
391
|
+
``self`` as a product of simple subvarieties, up to isogeny.
|
|
392
|
+
|
|
393
|
+
OUTPUT: an array of newforms
|
|
394
|
+
|
|
395
|
+
EXAMPLES::
|
|
396
|
+
|
|
397
|
+
sage: J0(81).newform_decomposition('a')
|
|
398
|
+
[q - 2*q^4 + O(q^6), q - 2*q^4 + O(q^6), q + a0*q^2 + q^4 - a0*q^5 + O(q^6)]
|
|
399
|
+
|
|
400
|
+
sage: J1(19).newform_decomposition('a')
|
|
401
|
+
[q - 2*q^3 - 2*q^4 + 3*q^5 + O(q^6),
|
|
402
|
+
q + a1*q^2 + (-1/9*a1^5 - 1/3*a1^4 - 1/3*a1^3 + 1/3*a1^2 - a1 - 1)*q^3 + (4/9*a1^5 + 2*a1^4 + 14/3*a1^3 + 17/3*a1^2 + 6*a1 + 2)*q^4 + (-2/3*a1^5 - 11/3*a1^4 - 10*a1^3 - 14*a1^2 - 15*a1 - 9)*q^5 + O(q^6)]
|
|
403
|
+
"""
|
|
404
|
+
if self.dimension() == 0:
|
|
405
|
+
return []
|
|
406
|
+
G = self.group()
|
|
407
|
+
if not isinstance(G, (Gamma0_class, Gamma1_class)):
|
|
408
|
+
return [S.newform(names=names) for S in self.decomposition()]
|
|
409
|
+
Gtype = G.parent()
|
|
410
|
+
N = G.level()
|
|
411
|
+
preans = [Newforms(Gtype(d), names=names) * len((N // d).divisors())
|
|
412
|
+
for d in N.divisors()]
|
|
413
|
+
return [newform for l in preans for newform in l]
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Abelian varieties attached to newforms
|
|
5
|
+
|
|
6
|
+
TESTS::
|
|
7
|
+
|
|
8
|
+
sage: A = AbelianVariety('23a')
|
|
9
|
+
sage: loads(dumps(A)) == A
|
|
10
|
+
True
|
|
11
|
+
"""
|
|
12
|
+
###########################################################################
|
|
13
|
+
# Copyright (C) 2008 William Stein <wstein@gmail.com> #
|
|
14
|
+
# Distributed under the terms of the GNU General Public License (GPL) #
|
|
15
|
+
# https://www.gnu.org/licenses/ #
|
|
16
|
+
###########################################################################
|
|
17
|
+
from sage.misc.lazy_import import lazy_import
|
|
18
|
+
|
|
19
|
+
from sage.rings.integer_ring import ZZ
|
|
20
|
+
from sage.rings.rational_field import QQ
|
|
21
|
+
|
|
22
|
+
from sage.modular.modform.element import Newform
|
|
23
|
+
from sage.modular.arithgroup.all import Gamma0_class, Gamma1_class, GammaH_class
|
|
24
|
+
|
|
25
|
+
from .abvar import ModularAbelianVariety_modsym_abstract
|
|
26
|
+
from sage.modular.abvar import homspace
|
|
27
|
+
lazy_import('sage.databases.cremona', 'cremona_letter_code')
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ModularAbelianVariety_newform(ModularAbelianVariety_modsym_abstract):
|
|
31
|
+
"""
|
|
32
|
+
A modular abelian variety attached to a specific newform.
|
|
33
|
+
"""
|
|
34
|
+
def __init__(self, f, internal_name=False):
|
|
35
|
+
"""
|
|
36
|
+
Create the modular abelian variety `A_f` attached to the
|
|
37
|
+
newform `f`.
|
|
38
|
+
|
|
39
|
+
INPUT:
|
|
40
|
+
|
|
41
|
+
- ``f`` -- a newform
|
|
42
|
+
|
|
43
|
+
EXAMPLES::
|
|
44
|
+
|
|
45
|
+
sage: f = CuspForms(37).newforms('a')[0]
|
|
46
|
+
sage: f.abelian_variety()
|
|
47
|
+
Newform abelian subvariety 37a of dimension 1 of J0(37)
|
|
48
|
+
|
|
49
|
+
sage: AbelianVariety(Newforms(1, 12)[0])
|
|
50
|
+
Traceback (most recent call last):
|
|
51
|
+
...
|
|
52
|
+
TypeError: f must have weight 2
|
|
53
|
+
"""
|
|
54
|
+
if not isinstance(f, Newform):
|
|
55
|
+
raise TypeError("f must be a newform")
|
|
56
|
+
if f.weight() != 2:
|
|
57
|
+
raise TypeError("f must have weight 2")
|
|
58
|
+
self.__f = f
|
|
59
|
+
self._is_hecke_stable = True
|
|
60
|
+
K = f.qexp().base_ring()
|
|
61
|
+
if K == QQ:
|
|
62
|
+
variable_name = None
|
|
63
|
+
else:
|
|
64
|
+
variable_name = K.variable_name()
|
|
65
|
+
self.__named_newforms = {variable_name: self.__f}
|
|
66
|
+
if not internal_name:
|
|
67
|
+
self.__named_newforms[None] = self.__f
|
|
68
|
+
ModularAbelianVariety_modsym_abstract.__init__(self, (f.group(),), QQ,
|
|
69
|
+
is_simple=True, newform_level=(f.level(), f.group()),
|
|
70
|
+
isogeny_number=f.number(), number=0)
|
|
71
|
+
|
|
72
|
+
def _modular_symbols(self, sign=0):
|
|
73
|
+
"""
|
|
74
|
+
EXAMPLES::
|
|
75
|
+
|
|
76
|
+
sage: f = CuspForms(52).newforms('a')[0]
|
|
77
|
+
sage: A = f.abelian_variety()
|
|
78
|
+
sage: A._modular_symbols()
|
|
79
|
+
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 15 for Gamma_0(52) of weight 2 with sign 0 over Rational Field
|
|
80
|
+
sage: A._modular_symbols(1)
|
|
81
|
+
Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 10 for Gamma_0(52) of weight 2 with sign 1 over Rational Field
|
|
82
|
+
sage: A._modular_symbols(-1)
|
|
83
|
+
Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 5 for Gamma_0(52) of weight 2 with sign -1 over Rational Field
|
|
84
|
+
"""
|
|
85
|
+
return self.__f.modular_symbols(sign=sign)
|
|
86
|
+
|
|
87
|
+
def newform(self, names=None):
|
|
88
|
+
r"""
|
|
89
|
+
Return the newform that this modular abelian variety is attached to.
|
|
90
|
+
|
|
91
|
+
EXAMPLES::
|
|
92
|
+
|
|
93
|
+
sage: f = Newform('37a')
|
|
94
|
+
sage: A = f.abelian_variety()
|
|
95
|
+
sage: A.newform()
|
|
96
|
+
q - 2*q^2 - 3*q^3 + 2*q^4 - 2*q^5 + O(q^6)
|
|
97
|
+
sage: A.newform() is f
|
|
98
|
+
True
|
|
99
|
+
|
|
100
|
+
If the a variable name has not been specified, we must specify one::
|
|
101
|
+
|
|
102
|
+
sage: A = AbelianVariety('67b')
|
|
103
|
+
sage: A.newform()
|
|
104
|
+
Traceback (most recent call last):
|
|
105
|
+
...
|
|
106
|
+
TypeError: You must specify the name of the generator.
|
|
107
|
+
sage: A.newform('alpha')
|
|
108
|
+
q + alpha*q^2 + (-alpha - 3)*q^3 + (-3*alpha - 3)*q^4 - 3*q^5 + O(q^6)
|
|
109
|
+
|
|
110
|
+
If the eigenform is actually over `\QQ` then we don't have to specify
|
|
111
|
+
the name::
|
|
112
|
+
|
|
113
|
+
sage: A = AbelianVariety('67a')
|
|
114
|
+
sage: A.newform()
|
|
115
|
+
q + 2*q^2 - 2*q^3 + 2*q^4 + 2*q^5 + O(q^6)
|
|
116
|
+
"""
|
|
117
|
+
try:
|
|
118
|
+
return self.__named_newforms[names]
|
|
119
|
+
except KeyError:
|
|
120
|
+
self.__named_newforms[names] = Newform(self.__f.parent().change_ring(QQ), self.__f.modular_symbols(1), names=names, check=False)
|
|
121
|
+
return self.__named_newforms[names]
|
|
122
|
+
|
|
123
|
+
def label(self) -> str:
|
|
124
|
+
"""
|
|
125
|
+
Return canonical label that defines this newform modular
|
|
126
|
+
abelian variety.
|
|
127
|
+
|
|
128
|
+
OUTPUT: string
|
|
129
|
+
|
|
130
|
+
EXAMPLES::
|
|
131
|
+
|
|
132
|
+
sage: A = AbelianVariety('43b')
|
|
133
|
+
sage: A.label()
|
|
134
|
+
'43b'
|
|
135
|
+
"""
|
|
136
|
+
G = self.__f.group()
|
|
137
|
+
if isinstance(G, Gamma0_class):
|
|
138
|
+
group = ''
|
|
139
|
+
elif isinstance(G, Gamma1_class):
|
|
140
|
+
group = 'G1'
|
|
141
|
+
elif isinstance(G, GammaH_class):
|
|
142
|
+
group = 'GH[' + ','.join(str(z) for z in G._generators_for_H()) + ']'
|
|
143
|
+
return '%s%s%s' % (self.level(), cremona_letter_code(self.factor_number()), group)
|
|
144
|
+
|
|
145
|
+
def factor_number(self):
|
|
146
|
+
"""
|
|
147
|
+
Return factor number.
|
|
148
|
+
|
|
149
|
+
OUTPUT: int
|
|
150
|
+
|
|
151
|
+
EXAMPLES::
|
|
152
|
+
|
|
153
|
+
sage: A = AbelianVariety('43b')
|
|
154
|
+
sage: A.factor_number()
|
|
155
|
+
1
|
|
156
|
+
"""
|
|
157
|
+
try:
|
|
158
|
+
return self.__factor_number
|
|
159
|
+
except AttributeError:
|
|
160
|
+
self.__factor_number = self.__f.number()
|
|
161
|
+
return self.__factor_number
|
|
162
|
+
|
|
163
|
+
def _repr_(self) -> str:
|
|
164
|
+
"""
|
|
165
|
+
String representation of this modular abelian variety.
|
|
166
|
+
|
|
167
|
+
EXAMPLES::
|
|
168
|
+
|
|
169
|
+
sage: AbelianVariety('37a')._repr_()
|
|
170
|
+
'Newform abelian subvariety 37a of dimension 1 of J0(37)'
|
|
171
|
+
"""
|
|
172
|
+
return "Newform abelian subvariety %s of dimension %s of %s" % (
|
|
173
|
+
self.newform_label(), self.dimension(), self._ambient_repr())
|
|
174
|
+
|
|
175
|
+
def endomorphism_ring(self):
|
|
176
|
+
"""
|
|
177
|
+
Return the endomorphism ring of this newform abelian variety.
|
|
178
|
+
|
|
179
|
+
EXAMPLES::
|
|
180
|
+
|
|
181
|
+
sage: A = AbelianVariety('23a')
|
|
182
|
+
sage: E = A.endomorphism_ring(); E
|
|
183
|
+
Endomorphism ring of Newform abelian subvariety 23a of dimension 2 of J0(23)
|
|
184
|
+
|
|
185
|
+
We display the matrices of these two basis matrices::
|
|
186
|
+
|
|
187
|
+
sage: E.0.matrix()
|
|
188
|
+
[1 0 0 0]
|
|
189
|
+
[0 1 0 0]
|
|
190
|
+
[0 0 1 0]
|
|
191
|
+
[0 0 0 1]
|
|
192
|
+
sage: E.1.matrix()
|
|
193
|
+
[ 0 1 -1 0]
|
|
194
|
+
[ 0 1 -1 1]
|
|
195
|
+
[-1 2 -2 1]
|
|
196
|
+
[-1 1 0 -1]
|
|
197
|
+
|
|
198
|
+
The result is cached::
|
|
199
|
+
|
|
200
|
+
sage: E is A.endomorphism_ring()
|
|
201
|
+
True
|
|
202
|
+
"""
|
|
203
|
+
try:
|
|
204
|
+
return self.__endomorphism_ring
|
|
205
|
+
except AttributeError:
|
|
206
|
+
pass
|
|
207
|
+
|
|
208
|
+
E = homspace.EndomorphismSubring(self)
|
|
209
|
+
self.__endomorphism_ring = E
|
|
210
|
+
return self.__endomorphism_ring
|
|
211
|
+
|
|
212
|
+
def _calculate_endomorphism_generators(self):
|
|
213
|
+
"""
|
|
214
|
+
EXAMPLES::
|
|
215
|
+
|
|
216
|
+
sage: A = AbelianVariety('43b')
|
|
217
|
+
sage: B = A.endomorphism_ring(); B # indirect doctest
|
|
218
|
+
Endomorphism ring of Newform abelian subvariety 43b of dimension 2 of J0(43)
|
|
219
|
+
sage: [b.matrix() for b in B.gens()]
|
|
220
|
+
[
|
|
221
|
+
[1 0 0 0] [ 0 1 0 0]
|
|
222
|
+
[0 1 0 0] [ 1 -2 0 0]
|
|
223
|
+
[0 0 1 0] [ 1 0 -2 -1]
|
|
224
|
+
[0 0 0 1], [ 0 1 -1 0]
|
|
225
|
+
]
|
|
226
|
+
"""
|
|
227
|
+
M = self.modular_symbols()
|
|
228
|
+
bound = M.sturm_bound()
|
|
229
|
+
|
|
230
|
+
d = self.dimension()
|
|
231
|
+
T1list = self.hecke_operator(1).matrix().list()
|
|
232
|
+
EndVecZ = ZZ**(len(T1list))
|
|
233
|
+
V = EndVecZ.submodule([T1list])
|
|
234
|
+
n = 2
|
|
235
|
+
|
|
236
|
+
while V.dimension() < d:
|
|
237
|
+
W = EndVecZ.submodule([((self.hecke_operator(n).matrix())**i).list()
|
|
238
|
+
for i in range(1, d + 1)])
|
|
239
|
+
V = V + W
|
|
240
|
+
n += 1
|
|
241
|
+
if n > bound:
|
|
242
|
+
raise ArithmeticError("Error computing endomorphism generators")
|
|
243
|
+
|
|
244
|
+
return V.saturation().basis()
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
###########################################################################
|
|
3
|
+
# Copyright (C) 2007 William Stein <wstein@gmail.com> #
|
|
4
|
+
# Distributed under the terms of the GNU General Public License (GPL) #
|
|
5
|
+
# https://www.gnu.org/licenses/ #
|
|
6
|
+
###########################################################################
|
|
7
|
+
|
|
8
|
+
from sage.modular.abvar.constructor import J0, J1, JH, AbelianVariety
|