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,827 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Module of supersingular points
|
|
5
|
+
|
|
6
|
+
The module of divisors on the modular curve `X_0(N)` over `F_p` supported at supersingular points.
|
|
7
|
+
|
|
8
|
+
EXAMPLES::
|
|
9
|
+
|
|
10
|
+
sage: x = SupersingularModule(389)
|
|
11
|
+
sage: m = x.T(2).matrix()
|
|
12
|
+
sage: a = m.change_ring(GF(97))
|
|
13
|
+
sage: D = a.decomposition()
|
|
14
|
+
sage: D[:3]
|
|
15
|
+
[(Vector space of degree 33 and dimension 1 over Finite Field of size 97
|
|
16
|
+
Basis matrix:
|
|
17
|
+
[ 0 0 0 1 96 96 1 0 95 1 1 1 1 95 2 96 0 0 96 0 96 0 96 2 96 96 0 1 0 2 1 95 0],
|
|
18
|
+
True),
|
|
19
|
+
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
|
|
20
|
+
Basis matrix:
|
|
21
|
+
[ 0 1 96 16 75 22 81 0 0 17 17 80 80 0 0 74 40 1 16 57 23 96 81 0 74 23 0 24 0 0 73 0 0],
|
|
22
|
+
True),
|
|
23
|
+
(Vector space of degree 33 and dimension 1 over Finite Field of size 97
|
|
24
|
+
Basis matrix:
|
|
25
|
+
[ 0 1 96 90 90 7 7 0 0 91 6 6 91 0 0 91 0 13 7 0 6 84 90 0 6 91 0 90 0 0 7 0 0],
|
|
26
|
+
True)]
|
|
27
|
+
sage: len(D)
|
|
28
|
+
9
|
|
29
|
+
|
|
30
|
+
We compute a Hecke operator on a space of huge dimension!::
|
|
31
|
+
|
|
32
|
+
sage: X = SupersingularModule(next_prime(10000))
|
|
33
|
+
sage: t = X.T(2).matrix() # long time (21s on sage.math, 2011)
|
|
34
|
+
sage: t.nrows() # long time
|
|
35
|
+
835
|
|
36
|
+
|
|
37
|
+
TESTS::
|
|
38
|
+
|
|
39
|
+
sage: X = SupersingularModule(389)
|
|
40
|
+
sage: T = X.T(2).matrix().change_ring(QQ)
|
|
41
|
+
sage: d = T.decomposition()
|
|
42
|
+
sage: len(d)
|
|
43
|
+
6
|
|
44
|
+
sage: [a[0].dimension() for a in d]
|
|
45
|
+
[1, 1, 2, 3, 6, 20]
|
|
46
|
+
sage: loads(dumps(X)) == X
|
|
47
|
+
True
|
|
48
|
+
sage: loads(dumps(d)) == d
|
|
49
|
+
True
|
|
50
|
+
|
|
51
|
+
AUTHORS:
|
|
52
|
+
|
|
53
|
+
- William Stein
|
|
54
|
+
|
|
55
|
+
- David Kohel
|
|
56
|
+
|
|
57
|
+
- Iftikhar Burhanuddin
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
# ****************************************************************************
|
|
61
|
+
# Copyright (C) 2004, 2006 William Stein <wstein@gmail.com>
|
|
62
|
+
# Copyright (C) 2006 David Kohel <kohel@maths.usyd.edu.au>
|
|
63
|
+
# Copyright (C) 2006 Iftikhar Burhanuddin <burhanud@usc.edu>
|
|
64
|
+
#
|
|
65
|
+
# This program is free software: you can redistribute it and/or modify
|
|
66
|
+
# it under the terms of the GNU General Public License as published by
|
|
67
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
68
|
+
# (at your option) any later version.
|
|
69
|
+
# https://www.gnu.org/licenses/
|
|
70
|
+
# ****************************************************************************
|
|
71
|
+
|
|
72
|
+
from sage.arith.misc import kronecker, next_prime
|
|
73
|
+
from sage.categories.fields import Fields
|
|
74
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
75
|
+
from sage.misc.cachefunc import cached_method
|
|
76
|
+
from sage.misc.lazy_import import lazy_import
|
|
77
|
+
from sage.modular.arithgroup.all import Gamma0
|
|
78
|
+
from sage.modular.hecke.module import HeckeModule_free_module
|
|
79
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField
|
|
80
|
+
from sage.rings.integer import Integer
|
|
81
|
+
from sage.rings.integer_ring import ZZ
|
|
82
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
83
|
+
from sage.structure.richcmp import richcmp_method, richcmp
|
|
84
|
+
|
|
85
|
+
lazy_import('sage.libs.pari', 'pari')
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
ZZy = PolynomialRing(ZZ, 'y')
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def Phi2_quad(J3, ssJ1, ssJ2):
|
|
92
|
+
r"""
|
|
93
|
+
Return a certain quadratic polynomial over a finite
|
|
94
|
+
field in indeterminate J3.
|
|
95
|
+
|
|
96
|
+
The roots of the polynomial along with ssJ1 are the
|
|
97
|
+
neighboring/2-isogenous supersingular j-invariants of ssJ2.
|
|
98
|
+
|
|
99
|
+
INPUT:
|
|
100
|
+
|
|
101
|
+
- ``J3`` -- indeterminate of a univariate polynomial ring defined over a finite
|
|
102
|
+
field with p^2 elements where p is a prime number
|
|
103
|
+
|
|
104
|
+
- ``ssJ2``, ``ssJ2`` -- supersingular j-invariants over the finite field
|
|
105
|
+
|
|
106
|
+
OUTPUT: polynomial; defined over the finite field
|
|
107
|
+
|
|
108
|
+
EXAMPLES:
|
|
109
|
+
|
|
110
|
+
The following code snippet produces a factor of the modular polynomial
|
|
111
|
+
`\Phi_{2}(x,j_{in})`, where `j_{in}` is a supersingular j-invariant
|
|
112
|
+
defined over the finite field with `37^2` elements::
|
|
113
|
+
|
|
114
|
+
sage: F = GF(37^2, 'a')
|
|
115
|
+
sage: X = PolynomialRing(F, 'x').gen()
|
|
116
|
+
sage: j_in = supersingular_j(F)
|
|
117
|
+
sage: poly = sage.modular.ssmod.ssmod.Phi_polys(2,X,j_in)
|
|
118
|
+
sage: poly.roots()
|
|
119
|
+
[(8, 1), (27*a + 23, 1), (10*a + 20, 1)]
|
|
120
|
+
sage: sage.modular.ssmod.ssmod.Phi2_quad(X, F(8), j_in)
|
|
121
|
+
x^2 + 31*x + 31
|
|
122
|
+
|
|
123
|
+
.. NOTE::
|
|
124
|
+
|
|
125
|
+
Given a root (j1,j2) to the polynomial `Phi_2(J1,J2)`, the pairs
|
|
126
|
+
(j2,j3) not equal to (j2,j1) which solve `Phi_2(j2,j3)` are roots of
|
|
127
|
+
the quadratic equation:
|
|
128
|
+
|
|
129
|
+
J3^2 + (-j2^2 + 1488*j2 + (j1 - 162000))*J3 + (-j1 + 1488)*j2^2 +
|
|
130
|
+
(1488*j1 + 40773375)*j2 + j1^2 - 162000*j1 + 8748000000
|
|
131
|
+
|
|
132
|
+
This will be of use to extend the 2-isogeny graph, once the initial
|
|
133
|
+
three roots are determined for `Phi_2(J1,J2)`.
|
|
134
|
+
|
|
135
|
+
AUTHORS:
|
|
136
|
+
|
|
137
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
138
|
+
|
|
139
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
140
|
+
"""
|
|
141
|
+
ssJ1_pow2 = ssJ1**2
|
|
142
|
+
ssJ2_pow2 = ssJ2**2
|
|
143
|
+
|
|
144
|
+
return J3.parent()([(-ssJ1 + 1488) * ssJ2_pow2
|
|
145
|
+
+ (1488 * ssJ1 + 40773375) * ssJ2
|
|
146
|
+
+ ssJ1_pow2 - 162000 * ssJ1 + 8748000000,
|
|
147
|
+
-ssJ2_pow2 + 1488 * ssJ2 + (ssJ1 - 162000),
|
|
148
|
+
1])
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def Phi_polys(L, x, j):
|
|
152
|
+
r"""
|
|
153
|
+
Return a certain polynomial of degree `L+1` in the
|
|
154
|
+
indeterminate x over a finite field.
|
|
155
|
+
|
|
156
|
+
The roots of the **modular** polynomial `\Phi(L, x, j)` are the
|
|
157
|
+
`L`-isogenous supersingular j-invariants of j.
|
|
158
|
+
|
|
159
|
+
INPUT:
|
|
160
|
+
|
|
161
|
+
- ``L`` -- integer
|
|
162
|
+
|
|
163
|
+
- ``x`` -- indeterminate of a univariate polynomial ring defined over a
|
|
164
|
+
finite field with p^2 elements, where p is a prime number
|
|
165
|
+
|
|
166
|
+
- ``j`` -- supersingular j-invariant over the finite field
|
|
167
|
+
|
|
168
|
+
OUTPUT: polynomial; defined over the finite field
|
|
169
|
+
|
|
170
|
+
EXAMPLES:
|
|
171
|
+
|
|
172
|
+
The following code snippet produces the modular polynomial
|
|
173
|
+
`\Phi_{L}(x,j_{in})`, where `j_{in}` is a supersingular j-invariant
|
|
174
|
+
defined over the finite field with `7^2` elements::
|
|
175
|
+
|
|
176
|
+
sage: F = GF(7^2, 'a')
|
|
177
|
+
sage: X = PolynomialRing(F, 'x').gen()
|
|
178
|
+
sage: j_in = supersingular_j(F)
|
|
179
|
+
sage: sage.modular.ssmod.ssmod.Phi_polys(2,X,j_in)
|
|
180
|
+
x^3 + 3*x^2 + 3*x + 1
|
|
181
|
+
sage: sage.modular.ssmod.ssmod.Phi_polys(3,X,j_in)
|
|
182
|
+
x^4 + 4*x^3 + 6*x^2 + 4*x + 1
|
|
183
|
+
sage: sage.modular.ssmod.ssmod.Phi_polys(5,X,j_in)
|
|
184
|
+
x^6 + 6*x^5 + x^4 + 6*x^3 + x^2 + 6*x + 1
|
|
185
|
+
sage: sage.modular.ssmod.ssmod.Phi_polys(7,X,j_in)
|
|
186
|
+
x^8 + x^7 + x + 1
|
|
187
|
+
sage: sage.modular.ssmod.ssmod.Phi_polys(11,X,j_in)
|
|
188
|
+
x^12 + 5*x^11 + 3*x^10 + 3*x^9 + 5*x^8 + x^7 + x^5 + 5*x^4 + 3*x^3 + 3*x^2 + 5*x + 1
|
|
189
|
+
sage: sage.modular.ssmod.ssmod.Phi_polys(13,X,j_in)
|
|
190
|
+
x^14 + 2*x^7 + 1
|
|
191
|
+
"""
|
|
192
|
+
r = 0
|
|
193
|
+
for pol in pari.polmodular(L).Vec():
|
|
194
|
+
r = r * x + ZZy(pol)(j)
|
|
195
|
+
return r
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def dimension_supersingular_module(prime, level=1):
|
|
199
|
+
r"""
|
|
200
|
+
Return the dimension of the Supersingular module, which is
|
|
201
|
+
equal to the dimension of the space of modular forms of weight `2`
|
|
202
|
+
and conductor equal to ``prime`` times ``level``.
|
|
203
|
+
|
|
204
|
+
INPUT:
|
|
205
|
+
|
|
206
|
+
- ``prime`` -- integer; prime
|
|
207
|
+
|
|
208
|
+
- ``level`` -- integer; positive
|
|
209
|
+
|
|
210
|
+
OUTPUT: dimension; integer, nonnegative
|
|
211
|
+
|
|
212
|
+
EXAMPLES:
|
|
213
|
+
|
|
214
|
+
The code below computes the dimensions of Supersingular modules
|
|
215
|
+
with level=1 and prime = 7, 15073 and 83401::
|
|
216
|
+
|
|
217
|
+
sage: dimension_supersingular_module(7)
|
|
218
|
+
1
|
|
219
|
+
|
|
220
|
+
sage: dimension_supersingular_module(15073)
|
|
221
|
+
1256
|
|
222
|
+
|
|
223
|
+
sage: dimension_supersingular_module(83401)
|
|
224
|
+
6950
|
|
225
|
+
|
|
226
|
+
.. NOTE::
|
|
227
|
+
|
|
228
|
+
The case of level > 1 has not been implemented yet.
|
|
229
|
+
|
|
230
|
+
AUTHORS:
|
|
231
|
+
|
|
232
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
233
|
+
|
|
234
|
+
- Iftikhar Burhanuddin - burhanud@usc.edu
|
|
235
|
+
"""
|
|
236
|
+
if not Integer(prime).is_prime():
|
|
237
|
+
raise ValueError(f"{prime} is not a prime")
|
|
238
|
+
|
|
239
|
+
if level == 1:
|
|
240
|
+
return Gamma0(prime).dimension_modular_forms(2)
|
|
241
|
+
|
|
242
|
+
# list of genus(X_0(level)) equal to zero
|
|
243
|
+
# elif (level in [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 16, 18, 25]):
|
|
244
|
+
# compute basis
|
|
245
|
+
|
|
246
|
+
raise NotImplementedError
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def supersingular_D(prime):
|
|
250
|
+
r"""
|
|
251
|
+
Return a fundamental discriminant `D` of an
|
|
252
|
+
imaginary quadratic field, where the given prime does not split.
|
|
253
|
+
|
|
254
|
+
See Silverman's Advanced Topics in the Arithmetic of Elliptic
|
|
255
|
+
Curves, page 184, exercise 2.30(d).
|
|
256
|
+
|
|
257
|
+
INPUT:
|
|
258
|
+
|
|
259
|
+
- ``prime`` -- integer, prime
|
|
260
|
+
|
|
261
|
+
OUTPUT: d; integer, negative
|
|
262
|
+
|
|
263
|
+
EXAMPLES:
|
|
264
|
+
|
|
265
|
+
These examples return *supersingular discriminants* for 7,
|
|
266
|
+
15073 and 83401::
|
|
267
|
+
|
|
268
|
+
sage: supersingular_D(7)
|
|
269
|
+
-4
|
|
270
|
+
|
|
271
|
+
sage: supersingular_D(15073)
|
|
272
|
+
-15
|
|
273
|
+
|
|
274
|
+
sage: supersingular_D(83401)
|
|
275
|
+
-7
|
|
276
|
+
|
|
277
|
+
AUTHORS:
|
|
278
|
+
|
|
279
|
+
- David Kohel - kohel@maths.usyd.edu.au
|
|
280
|
+
|
|
281
|
+
- Iftikhar Burhanuddin - burhanud@usc.edu
|
|
282
|
+
"""
|
|
283
|
+
if not Integer(prime).is_prime():
|
|
284
|
+
raise ValueError("%s is not a prime" % prime)
|
|
285
|
+
|
|
286
|
+
# Making picking D more intelligent
|
|
287
|
+
D = -1
|
|
288
|
+
while True:
|
|
289
|
+
Dmod4 = D % 4
|
|
290
|
+
if Dmod4 in (0, 1) and kronecker(D, prime) != 1:
|
|
291
|
+
return D
|
|
292
|
+
D -= 1
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def supersingular_j(FF):
|
|
296
|
+
r"""
|
|
297
|
+
Return a supersingular j-invariant over the finite
|
|
298
|
+
field FF.
|
|
299
|
+
|
|
300
|
+
INPUT:
|
|
301
|
+
|
|
302
|
+
- ``FF`` -- finite field with p^2 elements, where p is a prime number
|
|
303
|
+
|
|
304
|
+
OUTPUT:
|
|
305
|
+
|
|
306
|
+
- finite field element -- a supersingular j-invariant
|
|
307
|
+
defined over the finite field FF
|
|
308
|
+
|
|
309
|
+
EXAMPLES:
|
|
310
|
+
|
|
311
|
+
The following examples calculate supersingular j-invariants for a
|
|
312
|
+
few finite fields::
|
|
313
|
+
|
|
314
|
+
sage: supersingular_j(GF(7^2, 'a'))
|
|
315
|
+
6
|
|
316
|
+
|
|
317
|
+
Observe that in this example the j-invariant is not defined over
|
|
318
|
+
the prime field::
|
|
319
|
+
|
|
320
|
+
sage: supersingular_j(GF(15073^2, 'a'))
|
|
321
|
+
4443*a + 13964
|
|
322
|
+
sage: supersingular_j(GF(83401^2, 'a'))
|
|
323
|
+
67977
|
|
324
|
+
|
|
325
|
+
AUTHORS:
|
|
326
|
+
|
|
327
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
328
|
+
|
|
329
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
330
|
+
"""
|
|
331
|
+
if FF not in Fields().Finite():
|
|
332
|
+
raise ValueError("%s is not a finite field" % FF)
|
|
333
|
+
prime = FF.characteristic()
|
|
334
|
+
if not Integer(prime).is_prime():
|
|
335
|
+
raise ValueError("%s is not a prime" % prime)
|
|
336
|
+
if FF.cardinality() != Integer(prime**2):
|
|
337
|
+
raise ValueError("%s is not a quadratic extension" % FF)
|
|
338
|
+
if kronecker(-1, prime) != 1:
|
|
339
|
+
j_invss = 1728 # (2^2 * 3)^3
|
|
340
|
+
elif kronecker(-2, prime) != 1:
|
|
341
|
+
j_invss = 8000 # (2^2 * 5)^3
|
|
342
|
+
elif kronecker(-3, prime) != 1:
|
|
343
|
+
j_invss = 0 # 0^3
|
|
344
|
+
elif kronecker(-7, prime) != 1:
|
|
345
|
+
j_invss = 16581375 # (3 * 5 * 17)^3
|
|
346
|
+
elif kronecker(-11, prime) != 1:
|
|
347
|
+
j_invss = -32768 # -(2^5)^3
|
|
348
|
+
elif kronecker(-19, prime) != 1:
|
|
349
|
+
j_invss = -884736 # -(2^5 * 3)^3
|
|
350
|
+
elif kronecker(-43, prime) != 1:
|
|
351
|
+
j_invss = -884736000 # -(2^6 * 3 * 5)^3
|
|
352
|
+
elif kronecker(-67, prime) != 1:
|
|
353
|
+
j_invss = -147197952000 # -(2^5 * 3 * 5 * 11)^3
|
|
354
|
+
elif kronecker(-163, prime) != 1:
|
|
355
|
+
j_invss = -262537412640768000 # -(2^6 * 3 * 5 * 23 * 29)^3
|
|
356
|
+
else:
|
|
357
|
+
D = supersingular_D(prime)
|
|
358
|
+
hc_poly = FF['x'](pari(D).polclass())
|
|
359
|
+
root_hc_poly_list = list(hc_poly.roots())
|
|
360
|
+
|
|
361
|
+
j_invss = root_hc_poly_list[0][0]
|
|
362
|
+
return FF(j_invss)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
@richcmp_method
|
|
366
|
+
class SupersingularModule(HeckeModule_free_module):
|
|
367
|
+
r"""
|
|
368
|
+
The module of supersingular points in a given characteristic, with
|
|
369
|
+
given level structure.
|
|
370
|
+
|
|
371
|
+
The characteristic must not divide the level.
|
|
372
|
+
|
|
373
|
+
.. NOTE:: Currently, only level 1 is implemented.
|
|
374
|
+
|
|
375
|
+
EXAMPLES::
|
|
376
|
+
|
|
377
|
+
sage: S = SupersingularModule(17)
|
|
378
|
+
sage: S
|
|
379
|
+
Module of supersingular points on X_0(1)/F_17 over Integer Ring
|
|
380
|
+
sage: S = SupersingularModule(16)
|
|
381
|
+
Traceback (most recent call last):
|
|
382
|
+
...
|
|
383
|
+
ValueError: the argument prime must be a prime number
|
|
384
|
+
sage: S = SupersingularModule(prime=17, level=34)
|
|
385
|
+
Traceback (most recent call last):
|
|
386
|
+
...
|
|
387
|
+
ValueError: the argument level must be coprime to the argument prime
|
|
388
|
+
sage: S = SupersingularModule(prime=17, level=5)
|
|
389
|
+
Traceback (most recent call last):
|
|
390
|
+
...
|
|
391
|
+
NotImplementedError: supersingular modules of level > 1 not yet implemented
|
|
392
|
+
"""
|
|
393
|
+
def __init__(self, prime=2, level=1, base_ring=ZZ):
|
|
394
|
+
r"""
|
|
395
|
+
Create a supersingular module.
|
|
396
|
+
|
|
397
|
+
EXAMPLES::
|
|
398
|
+
|
|
399
|
+
sage: SupersingularModule(3)
|
|
400
|
+
Module of supersingular points on X_0(1)/F_3 over Integer Ring
|
|
401
|
+
"""
|
|
402
|
+
if not prime.is_prime():
|
|
403
|
+
raise ValueError("the argument prime must be a prime number")
|
|
404
|
+
if prime.divides(level):
|
|
405
|
+
raise ValueError("the argument level must be coprime to the argument prime")
|
|
406
|
+
if level != 1:
|
|
407
|
+
raise NotImplementedError("supersingular modules of level > 1 not yet implemented")
|
|
408
|
+
self.__prime = prime
|
|
409
|
+
self.__finite_field = FiniteField(prime**2, 'a')
|
|
410
|
+
self.__level = level
|
|
411
|
+
self.__hecke_matrices = {}
|
|
412
|
+
HeckeModule_free_module.__init__(self, base_ring,
|
|
413
|
+
prime * level, weight=2)
|
|
414
|
+
|
|
415
|
+
def _repr_(self) -> str:
|
|
416
|
+
"""
|
|
417
|
+
String representation of ``self``.
|
|
418
|
+
|
|
419
|
+
EXAMPLES::
|
|
420
|
+
|
|
421
|
+
sage: SupersingularModule(11)._repr_()
|
|
422
|
+
'Module of supersingular points on X_0(1)/F_11 over Integer Ring'
|
|
423
|
+
"""
|
|
424
|
+
return "Module of supersingular points on X_0(%s)/F_%s over %s" % (
|
|
425
|
+
self.__level, self.__prime, self.base_ring())
|
|
426
|
+
|
|
427
|
+
def __richcmp__(self, other, op) -> bool:
|
|
428
|
+
r"""
|
|
429
|
+
Compare ``self`` to ``other``.
|
|
430
|
+
|
|
431
|
+
EXAMPLES::
|
|
432
|
+
|
|
433
|
+
sage: SupersingularModule(37) == ModularForms(37, 2)
|
|
434
|
+
False
|
|
435
|
+
sage: SupersingularModule(37) == SupersingularModule(37, base_ring=Qp(7))
|
|
436
|
+
False
|
|
437
|
+
sage: SupersingularModule(37) == SupersingularModule(37)
|
|
438
|
+
True
|
|
439
|
+
"""
|
|
440
|
+
if not isinstance(other, SupersingularModule):
|
|
441
|
+
return NotImplemented
|
|
442
|
+
return richcmp((self.__level, self.__prime, self.base_ring()),
|
|
443
|
+
(other.__level, other.__prime, other.base_ring()), op)
|
|
444
|
+
|
|
445
|
+
def free_module(self):
|
|
446
|
+
"""
|
|
447
|
+
EXAMPLES::
|
|
448
|
+
|
|
449
|
+
sage: X = SupersingularModule(37)
|
|
450
|
+
sage: X.free_module()
|
|
451
|
+
Ambient free module of rank 3 over the principal ideal domain Integer Ring
|
|
452
|
+
|
|
453
|
+
This illustrates the fix at :issue:`4306`::
|
|
454
|
+
|
|
455
|
+
sage: X = SupersingularModule(389)
|
|
456
|
+
sage: X.basis()
|
|
457
|
+
((1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
458
|
+
(0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
459
|
+
(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
460
|
+
(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
461
|
+
(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
462
|
+
(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
463
|
+
(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
464
|
+
(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
465
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
466
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
467
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
468
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
469
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
470
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
471
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
472
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
473
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
474
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
475
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
476
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
477
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
478
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
479
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
480
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
481
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
482
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0),
|
|
483
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0),
|
|
484
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
|
|
485
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
|
|
486
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
|
|
487
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
|
|
488
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0),
|
|
489
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1))
|
|
490
|
+
"""
|
|
491
|
+
return ZZ**self.dimension()
|
|
492
|
+
|
|
493
|
+
@cached_method
|
|
494
|
+
def dimension(self):
|
|
495
|
+
r"""
|
|
496
|
+
Return the dimension of the space of modular forms of weight 2
|
|
497
|
+
and level equal to the level associated to ``self``.
|
|
498
|
+
|
|
499
|
+
INPUT:
|
|
500
|
+
|
|
501
|
+
- ``self`` -- SupersingularModule object
|
|
502
|
+
|
|
503
|
+
OUTPUT: integer; dimension, nonnegative
|
|
504
|
+
|
|
505
|
+
EXAMPLES::
|
|
506
|
+
|
|
507
|
+
sage: S = SupersingularModule(7)
|
|
508
|
+
sage: S.dimension()
|
|
509
|
+
1
|
|
510
|
+
|
|
511
|
+
sage: S = SupersingularModule(15073)
|
|
512
|
+
sage: S.dimension()
|
|
513
|
+
1256
|
|
514
|
+
|
|
515
|
+
sage: S = SupersingularModule(83401)
|
|
516
|
+
sage: S.dimension()
|
|
517
|
+
6950
|
|
518
|
+
|
|
519
|
+
.. NOTE::
|
|
520
|
+
|
|
521
|
+
The case of level > 1 has not yet been implemented.
|
|
522
|
+
|
|
523
|
+
AUTHORS:
|
|
524
|
+
|
|
525
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
526
|
+
|
|
527
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
528
|
+
"""
|
|
529
|
+
if self.__level == 1:
|
|
530
|
+
G = Gamma0(self.__prime)
|
|
531
|
+
return G.dimension_modular_forms(2)
|
|
532
|
+
raise NotImplementedError
|
|
533
|
+
|
|
534
|
+
rank = dimension
|
|
535
|
+
|
|
536
|
+
def level(self):
|
|
537
|
+
r"""
|
|
538
|
+
This function returns the level associated to ``self``.
|
|
539
|
+
|
|
540
|
+
INPUT:
|
|
541
|
+
|
|
542
|
+
- ``self`` -- SupersingularModule object
|
|
543
|
+
|
|
544
|
+
OUTPUT: integer; the level, positive
|
|
545
|
+
|
|
546
|
+
EXAMPLES::
|
|
547
|
+
|
|
548
|
+
sage: S = SupersingularModule(15073)
|
|
549
|
+
sage: S.level()
|
|
550
|
+
1
|
|
551
|
+
|
|
552
|
+
AUTHORS:
|
|
553
|
+
|
|
554
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
555
|
+
|
|
556
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
557
|
+
"""
|
|
558
|
+
return self.__level
|
|
559
|
+
|
|
560
|
+
def prime(self):
|
|
561
|
+
r"""
|
|
562
|
+
Return the characteristic of the finite field associated to ``self``.
|
|
563
|
+
|
|
564
|
+
INPUT:
|
|
565
|
+
|
|
566
|
+
- ``self`` -- SupersingularModule object
|
|
567
|
+
|
|
568
|
+
OUTPUT: integer; characteristic, positive
|
|
569
|
+
|
|
570
|
+
EXAMPLES::
|
|
571
|
+
|
|
572
|
+
sage: S = SupersingularModule(19)
|
|
573
|
+
sage: S.prime()
|
|
574
|
+
19
|
|
575
|
+
|
|
576
|
+
AUTHORS:
|
|
577
|
+
|
|
578
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
579
|
+
|
|
580
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
581
|
+
"""
|
|
582
|
+
return self.__prime
|
|
583
|
+
|
|
584
|
+
def weight(self):
|
|
585
|
+
r"""
|
|
586
|
+
Return the weight associated to ``self``.
|
|
587
|
+
|
|
588
|
+
INPUT:
|
|
589
|
+
|
|
590
|
+
- ``self`` -- SupersingularModule object
|
|
591
|
+
|
|
592
|
+
OUTPUT: integer; weight, positive
|
|
593
|
+
|
|
594
|
+
EXAMPLES::
|
|
595
|
+
|
|
596
|
+
sage: S = SupersingularModule(19)
|
|
597
|
+
sage: S.weight()
|
|
598
|
+
2
|
|
599
|
+
|
|
600
|
+
AUTHORS:
|
|
601
|
+
|
|
602
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
603
|
+
|
|
604
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
605
|
+
"""
|
|
606
|
+
return 2
|
|
607
|
+
|
|
608
|
+
@cached_method
|
|
609
|
+
def supersingular_points(self):
|
|
610
|
+
r"""
|
|
611
|
+
Compute the supersingular j-invariants over the
|
|
612
|
+
finite field associated to ``self``.
|
|
613
|
+
|
|
614
|
+
INPUT:
|
|
615
|
+
|
|
616
|
+
- ``self`` -- SupersingularModule object
|
|
617
|
+
|
|
618
|
+
OUTPUT:
|
|
619
|
+
|
|
620
|
+
- list_j, dict_j -- list_j is the list of supersingular
|
|
621
|
+
j-invariants, dict_j is a dictionary with these
|
|
622
|
+
j-invariants as keys and their indexes as values. The
|
|
623
|
+
latter is used to speed up j-invariant look-up. The
|
|
624
|
+
indexes are based on the order of their *discovery*.
|
|
625
|
+
|
|
626
|
+
EXAMPLES:
|
|
627
|
+
|
|
628
|
+
The following examples calculate supersingular j-invariants
|
|
629
|
+
over finite fields with characteristic 7, 11 and 37::
|
|
630
|
+
|
|
631
|
+
sage: S = SupersingularModule(7)
|
|
632
|
+
sage: S.supersingular_points()
|
|
633
|
+
([6], {6: 0})
|
|
634
|
+
|
|
635
|
+
sage: S = SupersingularModule(11)
|
|
636
|
+
sage: S.supersingular_points()[0]
|
|
637
|
+
[1, 0]
|
|
638
|
+
|
|
639
|
+
sage: S = SupersingularModule(37)
|
|
640
|
+
sage: S.supersingular_points()[0]
|
|
641
|
+
[8, 27*a + 23, 10*a + 20]
|
|
642
|
+
|
|
643
|
+
AUTHORS:
|
|
644
|
+
|
|
645
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
646
|
+
|
|
647
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
648
|
+
"""
|
|
649
|
+
Fp2 = self.__finite_field
|
|
650
|
+
level = self.__level
|
|
651
|
+
prime = Fp2.characteristic()
|
|
652
|
+
X = Fp2['x'].gen()
|
|
653
|
+
jinv = supersingular_j(Fp2)
|
|
654
|
+
|
|
655
|
+
dim = dimension_supersingular_module(prime, level)
|
|
656
|
+
|
|
657
|
+
pos = 0
|
|
658
|
+
# using list to keep track of explored nodes using pos
|
|
659
|
+
ss_points = [jinv]
|
|
660
|
+
|
|
661
|
+
# using to keep track of index of the previous node
|
|
662
|
+
ss_points_pre = [-1]
|
|
663
|
+
|
|
664
|
+
# using dictionary for fast j-invariant look-up
|
|
665
|
+
ss_points_dic = {jinv: pos}
|
|
666
|
+
|
|
667
|
+
T2_matrix = MatrixSpace(ZZ, dim, sparse=True)(0)
|
|
668
|
+
|
|
669
|
+
while pos < len(ss_points):
|
|
670
|
+
if pos == 0:
|
|
671
|
+
neighbors = Phi_polys(2, X, ss_points[pos]).roots()
|
|
672
|
+
else:
|
|
673
|
+
j_prev = ss_points_pre[pos]
|
|
674
|
+
# TODO: These are quadratic polynomials -- maybe we
|
|
675
|
+
# should use the quadratic formula and fast square
|
|
676
|
+
# root finding (??)
|
|
677
|
+
neighbors = Phi2_quad(X, ss_points[j_prev], ss_points[pos]).roots()
|
|
678
|
+
|
|
679
|
+
for xj, ej in neighbors:
|
|
680
|
+
if xj not in ss_points_dic:
|
|
681
|
+
j = len(ss_points)
|
|
682
|
+
ss_points += [xj]
|
|
683
|
+
ss_points_pre += [pos]
|
|
684
|
+
ss_points_dic[xj] = j
|
|
685
|
+
else:
|
|
686
|
+
j = ss_points_dic[xj]
|
|
687
|
+
T2_matrix[pos, j] += ej
|
|
688
|
+
# end for
|
|
689
|
+
if pos != 0:
|
|
690
|
+
# also record the root from j_prev
|
|
691
|
+
T2_matrix[pos, j_prev] += 1
|
|
692
|
+
pos += 1
|
|
693
|
+
|
|
694
|
+
self.__hecke_matrices[2] = T2_matrix
|
|
695
|
+
return (ss_points, ss_points_dic)
|
|
696
|
+
|
|
697
|
+
def upper_bound_on_elliptic_factors(self, p=None, ellmax=2):
|
|
698
|
+
r"""
|
|
699
|
+
Return an upper bound (provably correct) on the number of
|
|
700
|
+
elliptic curves of conductor equal to the level of this
|
|
701
|
+
supersingular module.
|
|
702
|
+
|
|
703
|
+
INPUT:
|
|
704
|
+
|
|
705
|
+
- ``p`` -- (default: 997) prime to work modulo
|
|
706
|
+
|
|
707
|
+
ALGORITHM: Currently we only use `T_2`. Function will be
|
|
708
|
+
extended to use more Hecke operators later.
|
|
709
|
+
|
|
710
|
+
The prime p is replaced by the smallest prime that does not
|
|
711
|
+
divide the level.
|
|
712
|
+
|
|
713
|
+
EXAMPLES::
|
|
714
|
+
|
|
715
|
+
sage: SupersingularModule(37).upper_bound_on_elliptic_factors()
|
|
716
|
+
2
|
|
717
|
+
|
|
718
|
+
(There are 4 elliptic curves of conductor 37, but only 2 isogeny
|
|
719
|
+
classes.)
|
|
720
|
+
"""
|
|
721
|
+
from sage.misc.verbose import verbose
|
|
722
|
+
|
|
723
|
+
# NOTE: The heuristic runtime is *very* roughly `p^2/(2\cdot 10^6)`.
|
|
724
|
+
# ellmax -- (default: 2) use Hecke operators T_ell with ell <= ellmax
|
|
725
|
+
if p is None:
|
|
726
|
+
p = 997
|
|
727
|
+
|
|
728
|
+
while self.level() % p == 0:
|
|
729
|
+
p = next_prime(p)
|
|
730
|
+
|
|
731
|
+
ell = 2
|
|
732
|
+
t = self.hecke_matrix(ell).change_ring(FiniteField(p))
|
|
733
|
+
|
|
734
|
+
# TODO: temporarily try using sparse=False
|
|
735
|
+
# turn this off when sparse rank is optimized.
|
|
736
|
+
t = t.dense_matrix()
|
|
737
|
+
|
|
738
|
+
B = ZZ(4 * ell).isqrt()
|
|
739
|
+
bnd = 0
|
|
740
|
+
lower = -B
|
|
741
|
+
upper = B + 1
|
|
742
|
+
for a in range(lower, upper):
|
|
743
|
+
tm = verbose("computing T_%s - %s" % (ell, a))
|
|
744
|
+
if a == lower:
|
|
745
|
+
c = a
|
|
746
|
+
else:
|
|
747
|
+
c = 1
|
|
748
|
+
for i in range(t.nrows()):
|
|
749
|
+
t[i, i] += c
|
|
750
|
+
tm = verbose("computing kernel", tm)
|
|
751
|
+
# dim = t.kernel().dimension()
|
|
752
|
+
dim = t.nullity()
|
|
753
|
+
bnd += dim
|
|
754
|
+
verbose('got dimension = %s; new bound = %s' % (dim, bnd), tm)
|
|
755
|
+
return bnd
|
|
756
|
+
|
|
757
|
+
def hecke_matrix(self, L):
|
|
758
|
+
r"""
|
|
759
|
+
Return the `L^{\text{th}}` Hecke matrix.
|
|
760
|
+
|
|
761
|
+
INPUT:
|
|
762
|
+
|
|
763
|
+
- ``self`` -- SupersingularModule object
|
|
764
|
+
|
|
765
|
+
- ``L`` -- integer; positive
|
|
766
|
+
|
|
767
|
+
OUTPUT: matrix; sparse integer matrix
|
|
768
|
+
|
|
769
|
+
EXAMPLES:
|
|
770
|
+
|
|
771
|
+
This example computes the action of the Hecke operator `T_2`
|
|
772
|
+
on the module of supersingular points on `X_0(1)/F_{37}`::
|
|
773
|
+
|
|
774
|
+
sage: S = SupersingularModule(37)
|
|
775
|
+
sage: M = S.hecke_matrix(2)
|
|
776
|
+
sage: M
|
|
777
|
+
[1 1 1]
|
|
778
|
+
[1 0 2]
|
|
779
|
+
[1 2 0]
|
|
780
|
+
|
|
781
|
+
This example computes the action of the Hecke operator `T_3`
|
|
782
|
+
on the module of supersingular points on `X_0(1)/F_{67}`::
|
|
783
|
+
|
|
784
|
+
sage: S = SupersingularModule(67)
|
|
785
|
+
sage: M = S.hecke_matrix(3)
|
|
786
|
+
sage: M
|
|
787
|
+
[0 0 0 0 2 2]
|
|
788
|
+
[0 0 1 1 1 1]
|
|
789
|
+
[0 1 0 2 0 1]
|
|
790
|
+
[0 1 2 0 1 0]
|
|
791
|
+
[1 1 0 1 0 1]
|
|
792
|
+
[1 1 1 0 1 0]
|
|
793
|
+
|
|
794
|
+
.. NOTE::
|
|
795
|
+
|
|
796
|
+
The first list --- list_j --- returned by the supersingular_points
|
|
797
|
+
function are the rows *and* column indexes of the above hecke
|
|
798
|
+
matrices and its ordering should be kept in mind when interpreting
|
|
799
|
+
these matrices.
|
|
800
|
+
|
|
801
|
+
AUTHORS:
|
|
802
|
+
|
|
803
|
+
- David Kohel -- kohel@maths.usyd.edu.au
|
|
804
|
+
|
|
805
|
+
- Iftikhar Burhanuddin -- burhanud@usc.edu
|
|
806
|
+
"""
|
|
807
|
+
if L in self.__hecke_matrices:
|
|
808
|
+
return self.__hecke_matrices[L]
|
|
809
|
+
SS, II = self.supersingular_points()
|
|
810
|
+
if L == 2:
|
|
811
|
+
# since T_2 gets computed as a side effect of computing the supersingular points
|
|
812
|
+
return self.__hecke_matrices[2]
|
|
813
|
+
Fp2 = self.__finite_field
|
|
814
|
+
h = len(SS)
|
|
815
|
+
R = self.base_ring()
|
|
816
|
+
T_L = MatrixSpace(R, h)(0) # mutable
|
|
817
|
+
S, X = Fp2['x'].objgen()
|
|
818
|
+
|
|
819
|
+
for i in range(len(SS)):
|
|
820
|
+
ss_i = SS[i]
|
|
821
|
+
phi_L_in_x = Phi_polys(L, X, ss_i)
|
|
822
|
+
rts = phi_L_in_x.roots()
|
|
823
|
+
for r in rts:
|
|
824
|
+
T_L[i, int(II[r[0]])] = r[1]
|
|
825
|
+
|
|
826
|
+
self.__hecke_matrices[L] = T_L
|
|
827
|
+
return T_L
|