passagemath-schemes 10.6.40__cp314-cp314-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.
Potentially problematic release.
This version of passagemath-schemes might be problematic. Click here for more details.
- 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.40.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
- passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.40.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-314-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-314-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-314-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-314-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-314-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-314-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-314-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-314-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.cpython-314-darwin.so +0 -0
- sage/modular/modsym/p1list.pxd +29 -0
- sage/modular/modsym/p1list.pyx +1372 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314-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-314-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-314-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,740 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Torsion subgroups of modular abelian varieties
|
|
5
|
+
|
|
6
|
+
Sage can compute information about the structure of the torsion
|
|
7
|
+
subgroup of a modular abelian variety. Sage computes a multiple of
|
|
8
|
+
the order by computing the greatest common divisor of the orders of
|
|
9
|
+
the torsion subgroup of the reduction of the abelian variety modulo
|
|
10
|
+
p for various primes p. Sage computes a divisor of the order by
|
|
11
|
+
computing the rational cuspidal subgroup. When these two bounds
|
|
12
|
+
agree (which is often the case), we determine the exact structure
|
|
13
|
+
of the torsion subgroup.
|
|
14
|
+
|
|
15
|
+
AUTHORS:
|
|
16
|
+
|
|
17
|
+
- William Stein (2007-03)
|
|
18
|
+
|
|
19
|
+
EXAMPLES: First we consider `J_0(50)` where everything
|
|
20
|
+
works out nicely::
|
|
21
|
+
|
|
22
|
+
sage: J = J0(50)
|
|
23
|
+
sage: T = J.rational_torsion_subgroup(); T
|
|
24
|
+
Torsion subgroup of Abelian variety J0(50) of dimension 2
|
|
25
|
+
sage: T.multiple_of_order()
|
|
26
|
+
15
|
|
27
|
+
sage: T.divisor_of_order()
|
|
28
|
+
15
|
|
29
|
+
sage: T.gens()
|
|
30
|
+
([(1/15, 3/5, 2/5, 14/15)],)
|
|
31
|
+
sage: T.invariants()
|
|
32
|
+
[15]
|
|
33
|
+
sage: d = J.decomposition(); d
|
|
34
|
+
[Simple abelian subvariety 50a(1,50) of dimension 1 of J0(50),
|
|
35
|
+
Simple abelian subvariety 50b(1,50) of dimension 1 of J0(50)]
|
|
36
|
+
sage: d[0].rational_torsion_subgroup().order() # needs database_cremona_mini_ellcurve
|
|
37
|
+
3
|
|
38
|
+
sage: d[1].rational_torsion_subgroup().order() # needs database_cremona_mini_ellcurve
|
|
39
|
+
5
|
|
40
|
+
|
|
41
|
+
Next we make a table of the upper and lower bounds for each new
|
|
42
|
+
factor.
|
|
43
|
+
|
|
44
|
+
::
|
|
45
|
+
|
|
46
|
+
sage: # needs database_cremona_mini_ellcurve
|
|
47
|
+
sage: for N in range(1,38):
|
|
48
|
+
....: for A in J0(N).new_subvariety().decomposition():
|
|
49
|
+
....: T = A.rational_torsion_subgroup()
|
|
50
|
+
....: print('%-5s%-5s%-5s%-5s'%(N, A.dimension(), T.divisor_of_order(), T.multiple_of_order()))
|
|
51
|
+
11 1 5 5
|
|
52
|
+
14 1 6 6
|
|
53
|
+
15 1 8 8
|
|
54
|
+
17 1 4 4
|
|
55
|
+
19 1 3 3
|
|
56
|
+
20 1 6 6
|
|
57
|
+
21 1 8 8
|
|
58
|
+
23 2 11 11
|
|
59
|
+
24 1 8 8
|
|
60
|
+
26 1 3 3
|
|
61
|
+
26 1 7 7
|
|
62
|
+
27 1 3 3
|
|
63
|
+
29 2 7 7
|
|
64
|
+
30 1 6 6
|
|
65
|
+
31 2 5 5
|
|
66
|
+
32 1 4 4
|
|
67
|
+
33 1 4 4
|
|
68
|
+
34 1 6 6
|
|
69
|
+
35 1 3 3
|
|
70
|
+
35 2 16 16
|
|
71
|
+
36 1 6 6
|
|
72
|
+
37 1 1 1
|
|
73
|
+
37 1 3 3
|
|
74
|
+
|
|
75
|
+
TESTS::
|
|
76
|
+
|
|
77
|
+
sage: T = J0(54).rational_torsion_subgroup()
|
|
78
|
+
sage: loads(dumps(T)) == T
|
|
79
|
+
True
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
# ****************************************************************************
|
|
83
|
+
# Copyright (C) 2007 William Stein <wstein@gmail.com>
|
|
84
|
+
#
|
|
85
|
+
# This program is free software: you can redistribute it and/or modify
|
|
86
|
+
# it under the terms of the GNU General Public License as published by
|
|
87
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
88
|
+
# (at your option) any later version.
|
|
89
|
+
# https://www.gnu.org/licenses/
|
|
90
|
+
# ****************************************************************************
|
|
91
|
+
|
|
92
|
+
from sage.arith.misc import divisors, gcd
|
|
93
|
+
from sage.misc.misc_c import prod
|
|
94
|
+
from sage.modular.abvar.torsion_point import TorsionPoint
|
|
95
|
+
from sage.modular.arithgroup.all import Gamma0_class, Gamma1_class
|
|
96
|
+
from sage.modular.dirichlet import DirichletGroup
|
|
97
|
+
from sage.modules.module import Module
|
|
98
|
+
from sage.rings.fast_arith import prime_range
|
|
99
|
+
from sage.rings.integer_ring import ZZ
|
|
100
|
+
from sage.rings.rational_field import QQ
|
|
101
|
+
from sage.sets.primes import Primes
|
|
102
|
+
from sage.structure.richcmp import richcmp_method, richcmp
|
|
103
|
+
|
|
104
|
+
from .finite_subgroup import FiniteSubgroup
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@richcmp_method
|
|
108
|
+
class RationalTorsionSubgroup(FiniteSubgroup):
|
|
109
|
+
"""
|
|
110
|
+
The torsion subgroup of a modular abelian variety.
|
|
111
|
+
"""
|
|
112
|
+
def __init__(self, abvar):
|
|
113
|
+
"""
|
|
114
|
+
Create the torsion subgroup.
|
|
115
|
+
|
|
116
|
+
INPUT:
|
|
117
|
+
|
|
118
|
+
- ``abvar`` -- a modular abelian variety
|
|
119
|
+
|
|
120
|
+
EXAMPLES::
|
|
121
|
+
|
|
122
|
+
sage: T = J0(14).rational_torsion_subgroup(); T
|
|
123
|
+
Torsion subgroup of Abelian variety J0(14) of dimension 1
|
|
124
|
+
sage: type(T)
|
|
125
|
+
<class 'sage.modular.abvar.torsion_subgroup.RationalTorsionSubgroup_with_category'>
|
|
126
|
+
"""
|
|
127
|
+
FiniteSubgroup.__init__(self, abvar)
|
|
128
|
+
|
|
129
|
+
def _repr_(self):
|
|
130
|
+
"""
|
|
131
|
+
Return string representation of this torsion subgroup.
|
|
132
|
+
|
|
133
|
+
EXAMPLES::
|
|
134
|
+
|
|
135
|
+
sage: T = J1(13).rational_torsion_subgroup(); T
|
|
136
|
+
Torsion subgroup of Abelian variety J1(13) of dimension 2
|
|
137
|
+
sage: T._repr_()
|
|
138
|
+
'Torsion subgroup of Abelian variety J1(13) of dimension 2'
|
|
139
|
+
"""
|
|
140
|
+
return "Torsion subgroup of %s" % self.abelian_variety()
|
|
141
|
+
|
|
142
|
+
def __richcmp__(self, other, op):
|
|
143
|
+
"""
|
|
144
|
+
Compare torsion subgroups.
|
|
145
|
+
|
|
146
|
+
INPUT:
|
|
147
|
+
|
|
148
|
+
- ``other`` -- an object
|
|
149
|
+
|
|
150
|
+
If other is a torsion subgroup, the abelian varieties are compared.
|
|
151
|
+
Otherwise, the generic behavior for finite abelian variety
|
|
152
|
+
subgroups is used.
|
|
153
|
+
|
|
154
|
+
EXAMPLES::
|
|
155
|
+
|
|
156
|
+
sage: G = J0(11).rational_torsion_subgroup(); H = J0(13).rational_torsion_subgroup()
|
|
157
|
+
sage: G == G
|
|
158
|
+
True
|
|
159
|
+
sage: G < H # since 11 < 13
|
|
160
|
+
True
|
|
161
|
+
sage: G > H
|
|
162
|
+
False
|
|
163
|
+
"""
|
|
164
|
+
if isinstance(other, RationalTorsionSubgroup):
|
|
165
|
+
return richcmp(self.abelian_variety(), other.abelian_variety(), op)
|
|
166
|
+
return FiniteSubgroup.__richcmp__(self, other, op)
|
|
167
|
+
|
|
168
|
+
def order(self, proof=True):
|
|
169
|
+
"""
|
|
170
|
+
Return the order of the torsion subgroup of this modular abelian
|
|
171
|
+
variety.
|
|
172
|
+
|
|
173
|
+
This function may fail if the multiple obtained by counting points
|
|
174
|
+
modulo `p` exceeds the divisor obtained from the rational cuspidal
|
|
175
|
+
subgroup.
|
|
176
|
+
|
|
177
|
+
The computation of the rational torsion order of J1(p) is conjectural
|
|
178
|
+
and will only be used if ``proof=False``. See Section 6.2.3 of [CES2003]_.
|
|
179
|
+
|
|
180
|
+
INPUT:
|
|
181
|
+
|
|
182
|
+
- ``proof`` -- boolean (default: ``True``)
|
|
183
|
+
|
|
184
|
+
OUTPUT: the order of this torsion subgroup
|
|
185
|
+
|
|
186
|
+
EXAMPLES::
|
|
187
|
+
|
|
188
|
+
sage: A = J0(11)
|
|
189
|
+
sage: A.rational_torsion_subgroup().order()
|
|
190
|
+
5
|
|
191
|
+
sage: A = J0(23)
|
|
192
|
+
sage: A.rational_torsion_subgroup().order()
|
|
193
|
+
11
|
|
194
|
+
sage: T = J0(37)[1].rational_torsion_subgroup()
|
|
195
|
+
sage: T.order() # needs database_cremona_mini_ellcurve
|
|
196
|
+
3
|
|
197
|
+
|
|
198
|
+
sage: J = J1(13)
|
|
199
|
+
sage: J.rational_torsion_subgroup().order()
|
|
200
|
+
19
|
|
201
|
+
|
|
202
|
+
Sometimes the order can only be computed with ``proof=False``. ::
|
|
203
|
+
|
|
204
|
+
sage: J = J1(23)
|
|
205
|
+
sage: J.rational_torsion_subgroup().order()
|
|
206
|
+
Traceback (most recent call last):
|
|
207
|
+
...
|
|
208
|
+
RuntimeError: Unable to compute order of torsion subgroup
|
|
209
|
+
(it is in [408991, 9406793])
|
|
210
|
+
|
|
211
|
+
sage: J.rational_torsion_subgroup().order(proof=False)
|
|
212
|
+
408991
|
|
213
|
+
"""
|
|
214
|
+
O = self.possible_orders(proof=proof)
|
|
215
|
+
if len(O) == 1:
|
|
216
|
+
n = O[0]
|
|
217
|
+
self._order = n
|
|
218
|
+
return n
|
|
219
|
+
raise RuntimeError("Unable to compute order of torsion subgroup (it is in %s)" % O)
|
|
220
|
+
|
|
221
|
+
def lattice(self):
|
|
222
|
+
"""
|
|
223
|
+
Return lattice that defines this torsion subgroup, if possible.
|
|
224
|
+
|
|
225
|
+
.. warning::
|
|
226
|
+
|
|
227
|
+
There is no known algorithm in general to compute the
|
|
228
|
+
rational torsion subgroup. Use rational_cusp_group to
|
|
229
|
+
obtain a subgroup of the rational torsion subgroup in
|
|
230
|
+
general.
|
|
231
|
+
|
|
232
|
+
EXAMPLES::
|
|
233
|
+
|
|
234
|
+
sage: J0(11).rational_torsion_subgroup().lattice()
|
|
235
|
+
Free module of degree 2 and rank 2 over Integer Ring
|
|
236
|
+
Echelon basis matrix:
|
|
237
|
+
[ 1 0]
|
|
238
|
+
[ 0 1/5]
|
|
239
|
+
|
|
240
|
+
The following fails because in fact I know of no (reasonable)
|
|
241
|
+
algorithm to provably compute the torsion subgroup in general.
|
|
242
|
+
|
|
243
|
+
::
|
|
244
|
+
|
|
245
|
+
sage: T = J0(33).rational_torsion_subgroup()
|
|
246
|
+
sage: T.lattice()
|
|
247
|
+
Traceback (most recent call last):
|
|
248
|
+
...
|
|
249
|
+
NotImplementedError: unable to compute the rational torsion subgroup
|
|
250
|
+
in this case (there is no known general algorithm yet)
|
|
251
|
+
|
|
252
|
+
The problem is that the multiple of the order obtained by counting
|
|
253
|
+
points over finite fields is twice the divisor of the order got
|
|
254
|
+
from the rational cuspidal subgroup.
|
|
255
|
+
|
|
256
|
+
::
|
|
257
|
+
|
|
258
|
+
sage: T.multiple_of_order(30)
|
|
259
|
+
200
|
|
260
|
+
sage: J0(33).rational_cusp_subgroup().order()
|
|
261
|
+
100
|
|
262
|
+
"""
|
|
263
|
+
A = self.abelian_variety()
|
|
264
|
+
if A.dimension() == 0:
|
|
265
|
+
return []
|
|
266
|
+
R = A.rational_cusp_subgroup()
|
|
267
|
+
if R.order() == self.multiple_of_order():
|
|
268
|
+
return R.lattice()
|
|
269
|
+
else:
|
|
270
|
+
raise NotImplementedError("unable to compute the rational torsion subgroup in this case (there is no known general algorithm yet)")
|
|
271
|
+
|
|
272
|
+
def possible_orders(self, proof=True):
|
|
273
|
+
"""
|
|
274
|
+
Return the possible orders of this torsion subgroup. Outside of special
|
|
275
|
+
cases, this is done by computing a divisor and multiple of the order.
|
|
276
|
+
|
|
277
|
+
INPUT:
|
|
278
|
+
|
|
279
|
+
- ``proof`` -- boolean (default: ``True``)
|
|
280
|
+
|
|
281
|
+
OUTPUT: an array of positive integers
|
|
282
|
+
|
|
283
|
+
The computation of the rational torsion order of J1(p) is conjectural
|
|
284
|
+
and will only be used if ``proof=False``. See Section 6.2.3 of [CES2003]_.
|
|
285
|
+
|
|
286
|
+
EXAMPLES::
|
|
287
|
+
|
|
288
|
+
sage: J0(11).rational_torsion_subgroup().possible_orders()
|
|
289
|
+
[5]
|
|
290
|
+
sage: J0(33).rational_torsion_subgroup().possible_orders()
|
|
291
|
+
[100, 200]
|
|
292
|
+
|
|
293
|
+
sage: J1(13).rational_torsion_subgroup().possible_orders()
|
|
294
|
+
[19]
|
|
295
|
+
sage: J1(16).rational_torsion_subgroup().possible_orders()
|
|
296
|
+
[1, 2, 4, 5, 10, 20]
|
|
297
|
+
"""
|
|
298
|
+
try:
|
|
299
|
+
if proof:
|
|
300
|
+
return self._possible_orders
|
|
301
|
+
else:
|
|
302
|
+
return self._possible_orders_proof_false
|
|
303
|
+
except AttributeError:
|
|
304
|
+
pass
|
|
305
|
+
|
|
306
|
+
A = self.abelian_variety()
|
|
307
|
+
N = A.level()
|
|
308
|
+
# return the order of the cuspidal subgroup in the J0(p) case
|
|
309
|
+
if A.is_J0() and N.is_prime():
|
|
310
|
+
self._possible_orders = [QQ((A.level()-1)/12).numerator()]
|
|
311
|
+
self._possible_orders_proof_false = self._possible_orders
|
|
312
|
+
return self._possible_orders
|
|
313
|
+
|
|
314
|
+
# the elliptic curve case
|
|
315
|
+
if A.dimension() == 1:
|
|
316
|
+
self._possible_orders = [A.elliptic_curve().torsion_order()]
|
|
317
|
+
self._possible_orders_proof_false = self._possible_orders
|
|
318
|
+
return self._possible_orders
|
|
319
|
+
|
|
320
|
+
# the conjectural J1(p) case
|
|
321
|
+
if not proof and A.is_J1() and N.is_prime():
|
|
322
|
+
epsilons = [epsilon for epsilon in DirichletGroup(N)
|
|
323
|
+
if not epsilon.is_trivial() and epsilon.is_even()]
|
|
324
|
+
bernoullis = [epsilon.bernoulli(2) for epsilon in epsilons]
|
|
325
|
+
self._possible_orders_proof_false = [ZZ(N/(2**(N-3))*prod(bernoullis))]
|
|
326
|
+
return self._possible_orders_proof_false
|
|
327
|
+
|
|
328
|
+
u = self.multiple_of_order()
|
|
329
|
+
l = self.divisor_of_order()
|
|
330
|
+
|
|
331
|
+
assert u % l == 0
|
|
332
|
+
O = [l * d for d in divisors(u//l)]
|
|
333
|
+
self._possible_orders = O
|
|
334
|
+
if u == l:
|
|
335
|
+
self._possible_orders_proof_false = O
|
|
336
|
+
return O
|
|
337
|
+
|
|
338
|
+
def divisor_of_order(self):
|
|
339
|
+
"""
|
|
340
|
+
Return a divisor of the order of this torsion subgroup of a modular
|
|
341
|
+
abelian variety.
|
|
342
|
+
|
|
343
|
+
OUTPUT: a divisor of this torsion subgroup
|
|
344
|
+
|
|
345
|
+
EXAMPLES::
|
|
346
|
+
|
|
347
|
+
sage: t = J0(37)[1].rational_torsion_subgroup()
|
|
348
|
+
sage: t.divisor_of_order() # needs database_cremona_mini_ellcurve
|
|
349
|
+
3
|
|
350
|
+
|
|
351
|
+
sage: J = J1(19)
|
|
352
|
+
sage: J.rational_torsion_subgroup().divisor_of_order() # needs database_cremona_mini_ellcurve
|
|
353
|
+
4383
|
|
354
|
+
|
|
355
|
+
sage: # needs database_cremona_mini_ellcurve
|
|
356
|
+
sage: J = J0(45)
|
|
357
|
+
sage: J.rational_cusp_subgroup().order()
|
|
358
|
+
32
|
|
359
|
+
sage: J.rational_cuspidal_subgroup().order()
|
|
360
|
+
64
|
|
361
|
+
sage: J.rational_torsion_subgroup().divisor_of_order()
|
|
362
|
+
64
|
|
363
|
+
"""
|
|
364
|
+
try:
|
|
365
|
+
return self._divisor_of_order
|
|
366
|
+
except AttributeError:
|
|
367
|
+
pass
|
|
368
|
+
|
|
369
|
+
A = self.abelian_variety()
|
|
370
|
+
N = A.level()
|
|
371
|
+
|
|
372
|
+
if A.dimension() == 0:
|
|
373
|
+
self._divisor_of_order = ZZ(1)
|
|
374
|
+
return self._divisor_of_order
|
|
375
|
+
|
|
376
|
+
# return the order of the cuspidal subgroup in the J0(p) case
|
|
377
|
+
if A.is_J0() and N.is_prime():
|
|
378
|
+
self._divisor_of_order = QQ((A.level()-1)/12).numerator()
|
|
379
|
+
return self._divisor_of_order
|
|
380
|
+
|
|
381
|
+
# The elliptic curve case
|
|
382
|
+
if A.dimension() == 1:
|
|
383
|
+
self._divisor_of_order = A.elliptic_curve().torsion_order()
|
|
384
|
+
return self._divisor_of_order
|
|
385
|
+
|
|
386
|
+
# The J1(p) case
|
|
387
|
+
if A.is_J1() and N.is_prime():
|
|
388
|
+
epsilons = [epsilon for epsilon in DirichletGroup(N)
|
|
389
|
+
if not epsilon.is_trivial() and epsilon.is_even()]
|
|
390
|
+
bernoullis = [epsilon.bernoulli(2) for epsilon in epsilons]
|
|
391
|
+
self._divisor_of_order = ZZ(N/(2**(N-3))*prod(bernoullis))
|
|
392
|
+
return self._divisor_of_order
|
|
393
|
+
|
|
394
|
+
# The Gamma0 case
|
|
395
|
+
if all(isinstance(G, Gamma0_class) for G in A.groups()):
|
|
396
|
+
self._divisor_of_order = A.rational_cuspidal_subgroup().order()
|
|
397
|
+
return self._divisor_of_order
|
|
398
|
+
|
|
399
|
+
# Unhandled case
|
|
400
|
+
self._divisor_of_order = ZZ(1)
|
|
401
|
+
return self._divisor_of_order
|
|
402
|
+
|
|
403
|
+
def multiple_of_order(self, maxp=None, proof=True):
|
|
404
|
+
"""
|
|
405
|
+
Return a multiple of the order.
|
|
406
|
+
|
|
407
|
+
INPUT:
|
|
408
|
+
|
|
409
|
+
- ``proof`` -- boolean (default: ``True``)
|
|
410
|
+
|
|
411
|
+
The computation of the rational torsion order of J1(p) is conjectural
|
|
412
|
+
and will only be used if proof=False. See Section 6.2.3 of [CES2003]_.
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: J = J1(11); J
|
|
417
|
+
Abelian variety J1(11) of dimension 1
|
|
418
|
+
sage: J.rational_torsion_subgroup().multiple_of_order() # needs database_cremona_mini_ellcurve
|
|
419
|
+
5
|
|
420
|
+
|
|
421
|
+
sage: J = J0(17)
|
|
422
|
+
sage: J.rational_torsion_subgroup().order() # needs database_cremona_mini_ellcurve
|
|
423
|
+
4
|
|
424
|
+
|
|
425
|
+
This is an example where proof=False leads to a better bound and better
|
|
426
|
+
performance. ::
|
|
427
|
+
|
|
428
|
+
sage: J = J1(23)
|
|
429
|
+
sage: J.rational_torsion_subgroup().multiple_of_order() # long time (2s) # needs database_cremona_mini_ellcurve
|
|
430
|
+
9406793
|
|
431
|
+
sage: J.rational_torsion_subgroup().multiple_of_order(proof=False) # needs database_cremona_mini_ellcurve
|
|
432
|
+
408991
|
|
433
|
+
"""
|
|
434
|
+
|
|
435
|
+
try:
|
|
436
|
+
if proof:
|
|
437
|
+
return self._multiple_of_order
|
|
438
|
+
else:
|
|
439
|
+
return self._multiple_of_order_proof_false
|
|
440
|
+
except AttributeError:
|
|
441
|
+
pass
|
|
442
|
+
|
|
443
|
+
A = self.abelian_variety()
|
|
444
|
+
N = A.level()
|
|
445
|
+
|
|
446
|
+
if A.dimension() == 0:
|
|
447
|
+
self._multiple_of_order = ZZ(1)
|
|
448
|
+
self._multiple_of_order_proof_false = self._multiple_of_order
|
|
449
|
+
return self._multiple_of_order
|
|
450
|
+
|
|
451
|
+
# return the order of the cuspidal subgroup in the J0(p) case
|
|
452
|
+
if A.is_J0() and N.is_prime():
|
|
453
|
+
self._multiple_of_order = QQ((A.level()-1)/12).numerator()
|
|
454
|
+
self._multiple_of_order_proof_false = self._multiple_of_order
|
|
455
|
+
return self._multiple_of_order
|
|
456
|
+
|
|
457
|
+
# The elliptic curve case
|
|
458
|
+
if A.dimension() == 1:
|
|
459
|
+
self._multiple_of_order = A.elliptic_curve().torsion_order()
|
|
460
|
+
self._multiple_of_order_proof_false = self._multiple_of_order
|
|
461
|
+
return self._multiple_of_order
|
|
462
|
+
|
|
463
|
+
# The conjectural J1(p) case
|
|
464
|
+
if not proof and A.is_J1() and N.is_prime():
|
|
465
|
+
epsilons = [epsilon for epsilon in DirichletGroup(N)
|
|
466
|
+
if not epsilon.is_trivial() and epsilon.is_even()]
|
|
467
|
+
bernoullis = [epsilon.bernoulli(2) for epsilon in epsilons]
|
|
468
|
+
self._multiple_of_order_proof_false = ZZ(N/(2**(N-3))*prod(bernoullis))
|
|
469
|
+
return self._multiple_of_order_proof_false
|
|
470
|
+
|
|
471
|
+
# The Gamma0 and Gamma1 case
|
|
472
|
+
if all(isinstance(G, (Gamma0_class, Gamma1_class)) for G in A.groups()):
|
|
473
|
+
self._multiple_of_order = self.multiple_of_order_using_frobp()
|
|
474
|
+
return self._multiple_of_order
|
|
475
|
+
|
|
476
|
+
# Unhandled case
|
|
477
|
+
raise NotImplementedError("No implemented algorithm")
|
|
478
|
+
|
|
479
|
+
def multiple_of_order_using_frobp(self, maxp=None):
|
|
480
|
+
"""
|
|
481
|
+
Return a multiple of the order of this torsion group.
|
|
482
|
+
|
|
483
|
+
In the `Gamma_0` case, the multiple is computed using characteristic
|
|
484
|
+
polynomials of Hecke operators of odd index not dividing the level. In
|
|
485
|
+
the `Gamma_1` case, the multiple is computed by expressing the
|
|
486
|
+
frobenius polynomial in terms of the characteristic polynomial of left
|
|
487
|
+
multiplication by `a_p` for odd primes p not dividing the level.
|
|
488
|
+
|
|
489
|
+
INPUT:
|
|
490
|
+
|
|
491
|
+
- ``maxp`` -- (default: ``None``) if ``maxp`` is ``None``, return gcd
|
|
492
|
+
of best bound computed so far with bound obtained by computing GCD's
|
|
493
|
+
of orders modulo `p` until this gcd stabilizes for 3 successive
|
|
494
|
+
primes. If ``maxp`` is given, just use all primes up to and including
|
|
495
|
+
``maxp``.
|
|
496
|
+
|
|
497
|
+
EXAMPLES::
|
|
498
|
+
|
|
499
|
+
sage: J = J0(11)
|
|
500
|
+
sage: G = J.rational_torsion_subgroup()
|
|
501
|
+
sage: G.multiple_of_order_using_frobp(11)
|
|
502
|
+
5
|
|
503
|
+
|
|
504
|
+
Increasing maxp may yield a tighter bound. If maxp=None, then Sage
|
|
505
|
+
will use more primes until the multiple stabilizes for 3 successive
|
|
506
|
+
primes. ::
|
|
507
|
+
|
|
508
|
+
sage: J = J0(389)
|
|
509
|
+
sage: G = J.rational_torsion_subgroup(); G
|
|
510
|
+
Torsion subgroup of Abelian variety J0(389) of dimension 32
|
|
511
|
+
sage: G.multiple_of_order_using_frobp()
|
|
512
|
+
97
|
|
513
|
+
sage: [G.multiple_of_order_using_frobp(p) for p in prime_range(3,11)]
|
|
514
|
+
[92645296242160800, 7275, 291]
|
|
515
|
+
sage: [G.multiple_of_order_using_frobp(p) for p in prime_range(3,13)]
|
|
516
|
+
[92645296242160800, 7275, 291, 97]
|
|
517
|
+
sage: [G.multiple_of_order_using_frobp(p) for p in prime_range(3,19)]
|
|
518
|
+
[92645296242160800, 7275, 291, 97, 97, 97]
|
|
519
|
+
|
|
520
|
+
We can compute the multiple of order of the torsion subgroup for Gamma0
|
|
521
|
+
and Gamma1 varieties, and their products. ::
|
|
522
|
+
|
|
523
|
+
sage: A = J0(11) * J0(33)
|
|
524
|
+
sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
|
|
525
|
+
1000
|
|
526
|
+
|
|
527
|
+
sage: A = J1(23)
|
|
528
|
+
sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
|
|
529
|
+
9406793
|
|
530
|
+
sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp(maxp=50)
|
|
531
|
+
408991
|
|
532
|
+
|
|
533
|
+
sage: A = J1(19) * J0(21)
|
|
534
|
+
sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
|
|
535
|
+
35064
|
|
536
|
+
|
|
537
|
+
The next example illustrates calling this function with a larger
|
|
538
|
+
input and how the result may be cached when maxp is None::
|
|
539
|
+
|
|
540
|
+
sage: T = J0(43)[1].rational_torsion_subgroup()
|
|
541
|
+
sage: T.multiple_of_order_using_frobp()
|
|
542
|
+
14
|
|
543
|
+
sage: T.multiple_of_order_using_frobp(50)
|
|
544
|
+
7
|
|
545
|
+
sage: T.multiple_of_order_using_frobp()
|
|
546
|
+
7
|
|
547
|
+
|
|
548
|
+
This function is not implemented for general congruence subgroups
|
|
549
|
+
unless the dimension is zero. ::
|
|
550
|
+
|
|
551
|
+
sage: A = JH(13,[2]); A
|
|
552
|
+
Abelian variety J0(13) of dimension 0
|
|
553
|
+
sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
|
|
554
|
+
1
|
|
555
|
+
|
|
556
|
+
sage: A = JH(15, [2]); A
|
|
557
|
+
Abelian variety JH(15,[2]) of dimension 1
|
|
558
|
+
sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
|
|
559
|
+
Traceback (most recent call last):
|
|
560
|
+
...
|
|
561
|
+
NotImplementedError: torsion multiple only implemented for Gamma0 and Gamma1
|
|
562
|
+
"""
|
|
563
|
+
if maxp is None:
|
|
564
|
+
try:
|
|
565
|
+
return self.__multiple_of_order_using_frobp
|
|
566
|
+
except AttributeError:
|
|
567
|
+
pass
|
|
568
|
+
A = self.abelian_variety()
|
|
569
|
+
if A.dimension() == 0:
|
|
570
|
+
T = ZZ.one()
|
|
571
|
+
self.__multiple_of_order_using_frobp = T
|
|
572
|
+
return T
|
|
573
|
+
if not all(isinstance(G, (Gamma0_class, Gamma1_class)) for G in A.groups()):
|
|
574
|
+
raise NotImplementedError("torsion multiple only implemented for Gamma0 and Gamma1")
|
|
575
|
+
|
|
576
|
+
bnd = ZZ.zero()
|
|
577
|
+
N = A.level()
|
|
578
|
+
cnt = 0
|
|
579
|
+
if maxp is None:
|
|
580
|
+
X = Primes()
|
|
581
|
+
else:
|
|
582
|
+
X = prime_range(maxp+1)
|
|
583
|
+
for p in X:
|
|
584
|
+
if (2*N) % p == 0:
|
|
585
|
+
continue
|
|
586
|
+
|
|
587
|
+
if (len(A.groups()) == 1 and isinstance(A.groups()[0], Gamma0_class)):
|
|
588
|
+
f = A.hecke_polynomial(p)
|
|
589
|
+
b = ZZ(f(p+1))
|
|
590
|
+
else:
|
|
591
|
+
from .constructor import AbelianVariety
|
|
592
|
+
D = [AbelianVariety(f) for f in
|
|
593
|
+
A.newform_decomposition('a')]
|
|
594
|
+
b = 1
|
|
595
|
+
for simple in D:
|
|
596
|
+
G = simple.newform_level()[1]
|
|
597
|
+
if isinstance(G, Gamma0_class):
|
|
598
|
+
f = simple.hecke_polynomial(p)
|
|
599
|
+
b *= ZZ(f(p+1))
|
|
600
|
+
else:
|
|
601
|
+
f = simple.newform('a')
|
|
602
|
+
Kf = f.base_ring()
|
|
603
|
+
eps = f.character()
|
|
604
|
+
Qe = eps.base_ring()
|
|
605
|
+
|
|
606
|
+
if Kf != QQ:
|
|
607
|
+
# relativize number fields to compute charpoly of
|
|
608
|
+
# left multiplication of ap on Kf as a Qe-vector
|
|
609
|
+
# space.
|
|
610
|
+
Lf = Kf.relativize(Qe.gen(), 'a')
|
|
611
|
+
to_Lf = Lf.structure()[1]
|
|
612
|
+
|
|
613
|
+
name = Kf._names[0]
|
|
614
|
+
ap = to_Lf(f.modular_symbols(1).eigenvalue(p, name))
|
|
615
|
+
|
|
616
|
+
G_ps = ap.matrix().charpoly()
|
|
617
|
+
b *= ZZ(Qe(G_ps(1 + to_Lf(eps(p))*p)).norm())
|
|
618
|
+
else:
|
|
619
|
+
ap = f.modular_symbols(1).eigenvalue(p)
|
|
620
|
+
b *= ZZ(1 + eps(p)*p - ap)
|
|
621
|
+
|
|
622
|
+
if bnd == 0:
|
|
623
|
+
bnd = b
|
|
624
|
+
else:
|
|
625
|
+
bnd_last = bnd
|
|
626
|
+
bnd = ZZ(gcd(bnd, b))
|
|
627
|
+
if bnd == bnd_last:
|
|
628
|
+
cnt += 1
|
|
629
|
+
else:
|
|
630
|
+
cnt = 0
|
|
631
|
+
if maxp is None and cnt >= 2:
|
|
632
|
+
break
|
|
633
|
+
|
|
634
|
+
# The code below caches the computed bound and
|
|
635
|
+
# will be used if this function is called
|
|
636
|
+
# again with maxp equal to None (the default).
|
|
637
|
+
if maxp is None:
|
|
638
|
+
# maxp is None but self.__multiple_of_order_using_frobp is
|
|
639
|
+
# not set, since otherwise we would have immediately
|
|
640
|
+
# returned at the top of this function
|
|
641
|
+
self.__multiple_of_order_using_frobp = bnd
|
|
642
|
+
else:
|
|
643
|
+
# maxp is given -- record new info we get as
|
|
644
|
+
# a gcd...
|
|
645
|
+
try:
|
|
646
|
+
self.__multiple_of_order_using_frobp = \
|
|
647
|
+
gcd(self.__multiple_of_order_using_frobp, bnd)
|
|
648
|
+
except AttributeError:
|
|
649
|
+
# ... except in the case when
|
|
650
|
+
# self.__multiple_of_order_using_frobp was never set. In this
|
|
651
|
+
# case, we just set it as long as the gcd stabilized for 3 in a
|
|
652
|
+
# row.
|
|
653
|
+
if cnt >= 2:
|
|
654
|
+
self.__multiple_of_order_using_frobp = bnd
|
|
655
|
+
return bnd
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
class QQbarTorsionSubgroup(Module):
|
|
659
|
+
|
|
660
|
+
Element = TorsionPoint
|
|
661
|
+
|
|
662
|
+
def __init__(self, abvar):
|
|
663
|
+
"""
|
|
664
|
+
Group of all torsion points over the algebraic closure on an
|
|
665
|
+
abelian variety.
|
|
666
|
+
|
|
667
|
+
INPUT:
|
|
668
|
+
|
|
669
|
+
- ``abvar`` -- an abelian variety
|
|
670
|
+
|
|
671
|
+
EXAMPLES::
|
|
672
|
+
|
|
673
|
+
sage: A = J0(23)
|
|
674
|
+
sage: A.qbar_torsion_subgroup() # needs sage.rings.number_field
|
|
675
|
+
Group of all torsion points in QQbar on Abelian variety J0(23) of dimension 2
|
|
676
|
+
"""
|
|
677
|
+
self.__abvar = abvar
|
|
678
|
+
Module.__init__(self, ZZ)
|
|
679
|
+
|
|
680
|
+
def _repr_(self):
|
|
681
|
+
"""
|
|
682
|
+
Print representation of QQbar points.
|
|
683
|
+
|
|
684
|
+
OUTPUT: string
|
|
685
|
+
|
|
686
|
+
EXAMPLES::
|
|
687
|
+
|
|
688
|
+
sage: J0(23).qbar_torsion_subgroup()._repr_() # needs sage.rings.number_field
|
|
689
|
+
'Group of all torsion points in QQbar on Abelian variety J0(23) of dimension 2'
|
|
690
|
+
"""
|
|
691
|
+
return 'Group of all torsion points in QQbar on %s' % self.__abvar
|
|
692
|
+
|
|
693
|
+
def field_of_definition(self):
|
|
694
|
+
"""
|
|
695
|
+
Return the field of definition of this subgroup. Since this is the
|
|
696
|
+
group of all torsion it is defined over the base field of this
|
|
697
|
+
abelian variety.
|
|
698
|
+
|
|
699
|
+
OUTPUT: a field
|
|
700
|
+
|
|
701
|
+
EXAMPLES::
|
|
702
|
+
|
|
703
|
+
sage: J0(23).qbar_torsion_subgroup().field_of_definition() # needs sage.rings.number_field
|
|
704
|
+
Rational Field
|
|
705
|
+
"""
|
|
706
|
+
return self.__abvar.base_field()
|
|
707
|
+
|
|
708
|
+
def _element_constructor_(self, x):
|
|
709
|
+
r"""
|
|
710
|
+
Create an element in this torsion subgroup.
|
|
711
|
+
|
|
712
|
+
INPUT:
|
|
713
|
+
|
|
714
|
+
- ``x`` -- vector in `\QQ^{2d}`
|
|
715
|
+
|
|
716
|
+
OUTPUT: torsion point
|
|
717
|
+
|
|
718
|
+
EXAMPLES::
|
|
719
|
+
|
|
720
|
+
sage: P = J0(23).qbar_torsion_subgroup()([1,1/2,3/4,2]); P # needs sage.rings.number_field
|
|
721
|
+
[(1, 1/2, 3/4, 2)]
|
|
722
|
+
sage: P.order() # needs sage.rings.number_field
|
|
723
|
+
4
|
|
724
|
+
"""
|
|
725
|
+
v = self.__abvar.vector_space()(x)
|
|
726
|
+
return self.element_class(self, v)
|
|
727
|
+
|
|
728
|
+
def abelian_variety(self):
|
|
729
|
+
"""
|
|
730
|
+
Return the abelian variety that this is the set of all torsion
|
|
731
|
+
points on.
|
|
732
|
+
|
|
733
|
+
OUTPUT: abelian variety
|
|
734
|
+
|
|
735
|
+
EXAMPLES::
|
|
736
|
+
|
|
737
|
+
sage: J0(23).qbar_torsion_subgroup().abelian_variety() # needs sage.rings.number_field
|
|
738
|
+
Abelian variety J0(23) of dimension 2
|
|
739
|
+
"""
|
|
740
|
+
return self.__abvar
|