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,1459 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Galois representations attached to elliptic curves
|
|
4
|
+
|
|
5
|
+
Given an elliptic curve `E` over `\QQ`
|
|
6
|
+
and a rational prime number `p`, the `p^n`-torsion
|
|
7
|
+
`E[p^n]` points of `E` is a representation of the
|
|
8
|
+
absolute Galois group `G_{\QQ}` of `\QQ`. As `n` varies
|
|
9
|
+
we obtain the Tate module `T_p E` which is a
|
|
10
|
+
a representation of `G_\QQ` on a free `\ZZ_p`-module
|
|
11
|
+
of rank `2`. As `p` varies the representations
|
|
12
|
+
are compatible.
|
|
13
|
+
|
|
14
|
+
Currently sage can decide whether the Galois module
|
|
15
|
+
`E[p]` is reducible, i.e., if `E` admits an isogeny
|
|
16
|
+
of degree `p`, and whether the image of
|
|
17
|
+
the representation on `E[p]` is surjective onto
|
|
18
|
+
`\text{Aut}(E[p]) = GL_2(\GF{p})`.
|
|
19
|
+
|
|
20
|
+
The following are the most useful functions for the class ``GaloisRepresentation``.
|
|
21
|
+
|
|
22
|
+
For the reducibility:
|
|
23
|
+
|
|
24
|
+
- ``is_reducible(p)``
|
|
25
|
+
- ``is_irreducible(p)``
|
|
26
|
+
- ``reducible_primes()``
|
|
27
|
+
|
|
28
|
+
For the image:
|
|
29
|
+
|
|
30
|
+
- ``is_surjective(p)``
|
|
31
|
+
- ``non_surjective()``
|
|
32
|
+
- ``image_type(p)``
|
|
33
|
+
|
|
34
|
+
For the classification of the representation
|
|
35
|
+
|
|
36
|
+
- ``is_semistable(p)``
|
|
37
|
+
- ``is_unramified(p, ell)``
|
|
38
|
+
- ``is_crystalline(p)``
|
|
39
|
+
|
|
40
|
+
EXAMPLES::
|
|
41
|
+
|
|
42
|
+
sage: E = EllipticCurve('196a1')
|
|
43
|
+
sage: rho = E.galois_representation()
|
|
44
|
+
sage: rho.is_irreducible(7)
|
|
45
|
+
True
|
|
46
|
+
sage: rho.is_reducible(3)
|
|
47
|
+
True
|
|
48
|
+
sage: rho.is_irreducible(2)
|
|
49
|
+
True
|
|
50
|
+
sage: rho.is_surjective(2)
|
|
51
|
+
False
|
|
52
|
+
sage: rho.is_surjective(3)
|
|
53
|
+
False
|
|
54
|
+
sage: rho.is_surjective(5)
|
|
55
|
+
True
|
|
56
|
+
sage: rho.reducible_primes()
|
|
57
|
+
[3]
|
|
58
|
+
sage: rho.non_surjective()
|
|
59
|
+
[2, 3]
|
|
60
|
+
sage: rho.image_type(2)
|
|
61
|
+
'The image is cyclic of order 3.'
|
|
62
|
+
sage: rho.image_type(3)
|
|
63
|
+
'The image is contained in a Borel subgroup as there is a 3-isogeny.'
|
|
64
|
+
sage: rho.image_type(5)
|
|
65
|
+
'The image is all of GL_2(F_5).'
|
|
66
|
+
|
|
67
|
+
For semi-stable curve it is known that the representation is
|
|
68
|
+
surjective if and only if it is irreducible::
|
|
69
|
+
|
|
70
|
+
sage: E = EllipticCurve('11a1')
|
|
71
|
+
sage: rho = E.galois_representation()
|
|
72
|
+
sage: rho.non_surjective()
|
|
73
|
+
[5]
|
|
74
|
+
sage: rho.reducible_primes()
|
|
75
|
+
[5]
|
|
76
|
+
|
|
77
|
+
For cm curves it is not true that there are only finitely many primes for which the
|
|
78
|
+
Galois representation mod p is surjective onto `GL_2(\GF{p})`::
|
|
79
|
+
|
|
80
|
+
sage: E = EllipticCurve('27a1')
|
|
81
|
+
sage: rho = E.galois_representation()
|
|
82
|
+
sage: rho.non_surjective()
|
|
83
|
+
[0]
|
|
84
|
+
sage: rho.reducible_primes()
|
|
85
|
+
[3]
|
|
86
|
+
sage: E.has_cm()
|
|
87
|
+
True
|
|
88
|
+
sage: rho.image_type(11)
|
|
89
|
+
'The image is contained in the normalizer of a non-split Cartan group. (cm)'
|
|
90
|
+
|
|
91
|
+
REFERENCES:
|
|
92
|
+
|
|
93
|
+
- [Ser1972]_
|
|
94
|
+
- [Ser1987]_
|
|
95
|
+
- [Coj2005]_
|
|
96
|
+
|
|
97
|
+
AUTHORS:
|
|
98
|
+
|
|
99
|
+
- chris wuthrich (02/10): moved from ell_rational_field.py.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
######################################################################
|
|
103
|
+
# Copyright (C) 2010 William Stein <wstein@gmail.com>
|
|
104
|
+
#
|
|
105
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
106
|
+
#
|
|
107
|
+
# This code is distributed in the hope that it will be useful,
|
|
108
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
109
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
110
|
+
# General Public License for more details.
|
|
111
|
+
#
|
|
112
|
+
# The full text of the GPL is available at:
|
|
113
|
+
#
|
|
114
|
+
# http://www.gnu.org/licenses/
|
|
115
|
+
######################################################################
|
|
116
|
+
|
|
117
|
+
from math import sqrt
|
|
118
|
+
|
|
119
|
+
from sage.structure.sage_object import SageObject
|
|
120
|
+
import sage.arith.all as arith
|
|
121
|
+
from sage.rings.fast_arith import prime_range
|
|
122
|
+
from sage.misc.lazy_import import lazy_import
|
|
123
|
+
from sage.misc.misc_c import prod as mul
|
|
124
|
+
from sage.misc.verbose import verbose
|
|
125
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
126
|
+
from sage.rings.real_mpfr import RealField
|
|
127
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
128
|
+
|
|
129
|
+
lazy_import('sage.libs.pari', 'pari')
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _ex_set(p):
|
|
133
|
+
"""
|
|
134
|
+
Give the set of the only values of trace^2/det
|
|
135
|
+
that appear in a exceptional subgroup in PGL_2(F_p).
|
|
136
|
+
|
|
137
|
+
EXAMPLES::
|
|
138
|
+
|
|
139
|
+
sage: from sage.schemes.elliptic_curves.gal_reps import _ex_set
|
|
140
|
+
sage: for p in prime_range(3,30): print("{} {}".format(p, _ex_set(p)))
|
|
141
|
+
3 [0, 1, 2, 1]
|
|
142
|
+
5 [0, 1, 2, 4]
|
|
143
|
+
7 [0, 1, 2, 4]
|
|
144
|
+
11 [0, 1, 2, 4, 9, 5]
|
|
145
|
+
13 [0, 1, 2, 4]
|
|
146
|
+
17 [0, 1, 2, 4]
|
|
147
|
+
19 [0, 1, 2, 4, 16, 6]
|
|
148
|
+
23 [0, 1, 2, 4]
|
|
149
|
+
29 [0, 1, 2, 4, 25, 7]
|
|
150
|
+
"""
|
|
151
|
+
k = GF(p)
|
|
152
|
+
res = [ k(0), k(1), k(2), k(4) ]
|
|
153
|
+
R = k['X']
|
|
154
|
+
f = R([1,-3,1]) #(X**2 - 3*X+1)
|
|
155
|
+
ro = f.roots()
|
|
156
|
+
for a in ro:
|
|
157
|
+
if a[0] not in res:
|
|
158
|
+
res.append(a[0])
|
|
159
|
+
return res
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class GaloisRepresentation(SageObject):
|
|
163
|
+
r"""
|
|
164
|
+
The compatible family of Galois representation
|
|
165
|
+
attached to an elliptic curve over the rational numbers.
|
|
166
|
+
|
|
167
|
+
Given an elliptic curve `E` over `\QQ` and a rational
|
|
168
|
+
prime number `p`, the `p^n`-torsion `E[p^n]` points of
|
|
169
|
+
`E` is a representation of the absolute Galois group.
|
|
170
|
+
As `n` varies we obtain the Tate module `T_p E` which is
|
|
171
|
+
a representation of the absolute Galois group on a free
|
|
172
|
+
`\ZZ_p`-module of rank `2`. As `p` varies the
|
|
173
|
+
representations are compatible.
|
|
174
|
+
|
|
175
|
+
EXAMPLES::
|
|
176
|
+
|
|
177
|
+
sage: rho = EllipticCurve('11a1').galois_representation()
|
|
178
|
+
sage: rho
|
|
179
|
+
Compatible family of Galois representations associated to the Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
def __init__(self, E):
|
|
183
|
+
r"""
|
|
184
|
+
See ``GaloisRepresentation`` for documentation.
|
|
185
|
+
|
|
186
|
+
EXAMPLES::
|
|
187
|
+
|
|
188
|
+
sage: rho = EllipticCurve('11a1').galois_representation()
|
|
189
|
+
sage: loads(rho.dumps()) == rho
|
|
190
|
+
True
|
|
191
|
+
"""
|
|
192
|
+
self.__image_type = {}
|
|
193
|
+
self._E = E
|
|
194
|
+
|
|
195
|
+
def __repr__(self):
|
|
196
|
+
r"""
|
|
197
|
+
String representation of the class.
|
|
198
|
+
|
|
199
|
+
EXAMPLES::
|
|
200
|
+
|
|
201
|
+
sage: rho = EllipticCurve([0,1]).galois_representation()
|
|
202
|
+
sage: rho
|
|
203
|
+
Compatible family of Galois representations associated to the Elliptic Curve defined by y^2 = x^3 + 1 over Rational Field
|
|
204
|
+
"""
|
|
205
|
+
return "Compatible family of Galois representations associated to the " + repr(self._E)
|
|
206
|
+
|
|
207
|
+
def __eq__(self, other):
|
|
208
|
+
r"""
|
|
209
|
+
Compare two Galois representations.
|
|
210
|
+
We define tho compatible families of representations
|
|
211
|
+
attached to elliptic curves to be isomorphic if the curves are equal.
|
|
212
|
+
|
|
213
|
+
EXAMPLES::
|
|
214
|
+
|
|
215
|
+
sage: rho = EllipticCurve('11a1').galois_representation()
|
|
216
|
+
sage: rho2 = EllipticCurve('11a2').galois_representation()
|
|
217
|
+
sage: rho == rho
|
|
218
|
+
True
|
|
219
|
+
sage: rho == rho2
|
|
220
|
+
False
|
|
221
|
+
sage: rho == 34
|
|
222
|
+
False
|
|
223
|
+
"""
|
|
224
|
+
# if rho_E = rho_E' then the L-functions agree,
|
|
225
|
+
# so E and E' are isogenous
|
|
226
|
+
# except for p=2
|
|
227
|
+
# the mod p representations will be different
|
|
228
|
+
# for p dividing the degree of the isogeny
|
|
229
|
+
# anyway, there should not be a _compatible_
|
|
230
|
+
# isomorphism between rho and rho' unless E
|
|
231
|
+
# is isomorphic to E'
|
|
232
|
+
# Note that rho can not depend on the Weierstrass model
|
|
233
|
+
if type(self) is not type(other):
|
|
234
|
+
return False
|
|
235
|
+
return self._E.is_isomorphic(other._E)
|
|
236
|
+
|
|
237
|
+
def elliptic_curve(self):
|
|
238
|
+
r"""
|
|
239
|
+
The elliptic curve associated to this representation.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: E = EllipticCurve('11a1')
|
|
244
|
+
sage: rho = E.galois_representation()
|
|
245
|
+
sage: rho.elliptic_curve() == E
|
|
246
|
+
True
|
|
247
|
+
"""
|
|
248
|
+
from copy import copy
|
|
249
|
+
return copy(self._E)
|
|
250
|
+
|
|
251
|
+
#####################################################################
|
|
252
|
+
# reducibility
|
|
253
|
+
#####################################################################
|
|
254
|
+
|
|
255
|
+
def is_reducible(self, p):
|
|
256
|
+
r"""
|
|
257
|
+
Return ``True`` if the mod-p representation is
|
|
258
|
+
reducible. This is equivalent to the existence of an
|
|
259
|
+
isogeny defined over `\QQ` of degree `p` from the
|
|
260
|
+
elliptic curve.
|
|
261
|
+
|
|
262
|
+
INPUT:
|
|
263
|
+
|
|
264
|
+
- ``p`` -- a prime number
|
|
265
|
+
|
|
266
|
+
OUTPUT: boolean
|
|
267
|
+
|
|
268
|
+
The answer is cached.
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: rho = EllipticCurve('121a').galois_representation()
|
|
273
|
+
sage: rho.is_reducible(7)
|
|
274
|
+
False
|
|
275
|
+
sage: rho.is_reducible(11)
|
|
276
|
+
True
|
|
277
|
+
sage: EllipticCurve('11a').galois_representation().is_reducible(5)
|
|
278
|
+
True
|
|
279
|
+
sage: rho = EllipticCurve('11a2').galois_representation()
|
|
280
|
+
sage: rho.is_reducible(5)
|
|
281
|
+
True
|
|
282
|
+
sage: EllipticCurve('11a2').torsion_order()
|
|
283
|
+
1
|
|
284
|
+
"""
|
|
285
|
+
try:
|
|
286
|
+
return self.__is_reducible[p]
|
|
287
|
+
except AttributeError:
|
|
288
|
+
self.__is_reducible = {}
|
|
289
|
+
except KeyError:
|
|
290
|
+
pass
|
|
291
|
+
|
|
292
|
+
if not arith.is_prime(p):
|
|
293
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
294
|
+
# we do is_surjective first, since this is
|
|
295
|
+
# much easier than computing isogeny_class
|
|
296
|
+
t = self._is_surjective(p, A=-1)
|
|
297
|
+
if t:
|
|
298
|
+
self.__is_reducible[p] = False
|
|
299
|
+
return False # definitely not reducible
|
|
300
|
+
isogeny_matrix = self._E.isogeny_class().matrix(fill=True)
|
|
301
|
+
v = isogeny_matrix.row(0) # first row
|
|
302
|
+
for a in v:
|
|
303
|
+
if a != 0 and a % p == 0:
|
|
304
|
+
self.__is_reducible[p] = True
|
|
305
|
+
return True
|
|
306
|
+
self.__is_reducible[p] = False
|
|
307
|
+
return False
|
|
308
|
+
|
|
309
|
+
def is_irreducible(self, p):
|
|
310
|
+
r"""
|
|
311
|
+
Return ``True`` if the mod p representation is irreducible.
|
|
312
|
+
|
|
313
|
+
INPUT:
|
|
314
|
+
|
|
315
|
+
- ``p`` -- a prime number
|
|
316
|
+
|
|
317
|
+
OUTPUT: boolean
|
|
318
|
+
|
|
319
|
+
EXAMPLES::
|
|
320
|
+
|
|
321
|
+
sage: rho = EllipticCurve('37b').galois_representation()
|
|
322
|
+
sage: rho.is_irreducible(2)
|
|
323
|
+
True
|
|
324
|
+
sage: rho.is_irreducible(3)
|
|
325
|
+
False
|
|
326
|
+
sage: rho.is_reducible(2)
|
|
327
|
+
False
|
|
328
|
+
sage: rho.is_reducible(3)
|
|
329
|
+
True
|
|
330
|
+
"""
|
|
331
|
+
return not self.is_reducible(p)
|
|
332
|
+
|
|
333
|
+
def reducible_primes(self):
|
|
334
|
+
r"""
|
|
335
|
+
Return a list of the primes `p` such that the mod-`p`
|
|
336
|
+
representation is reducible. For all other primes the
|
|
337
|
+
representation is irreducible.
|
|
338
|
+
|
|
339
|
+
EXAMPLES::
|
|
340
|
+
|
|
341
|
+
sage: rho = EllipticCurve('225a').galois_representation()
|
|
342
|
+
sage: rho.reducible_primes()
|
|
343
|
+
[3]
|
|
344
|
+
"""
|
|
345
|
+
try:
|
|
346
|
+
return self.__reducible_primes
|
|
347
|
+
except AttributeError:
|
|
348
|
+
pass
|
|
349
|
+
|
|
350
|
+
E = self._E
|
|
351
|
+
j = E.j_invariant()
|
|
352
|
+
from .isogeny_small_degree import sporadic_j
|
|
353
|
+
if j in sporadic_j: # includes all CM j-invariants
|
|
354
|
+
R = [sporadic_j[j]]
|
|
355
|
+
else:
|
|
356
|
+
R = [l for l in [2,3,5,7,13] if len(E.isogenies_prime_degree(l)) > 0]
|
|
357
|
+
self.__reducible_primes = R
|
|
358
|
+
return R
|
|
359
|
+
|
|
360
|
+
#####################################################################
|
|
361
|
+
# image
|
|
362
|
+
#####################################################################
|
|
363
|
+
|
|
364
|
+
def is_surjective(self, p, A=1000):
|
|
365
|
+
r"""
|
|
366
|
+
Return ``True`` if the mod-p representation is
|
|
367
|
+
surjective onto `Aut(E[p]) = GL_2(\GF{p})`.
|
|
368
|
+
|
|
369
|
+
``False`` if it is not, or ``None`` if we were unable to
|
|
370
|
+
determine whether it is or not.
|
|
371
|
+
|
|
372
|
+
INPUT:
|
|
373
|
+
|
|
374
|
+
- ``p`` -- integer; a prime number
|
|
375
|
+
|
|
376
|
+
- ``A`` -- integer; a bound on the number of `a_p` to use
|
|
377
|
+
|
|
378
|
+
OUTPUT: boolean; ``True`` if the mod-p representation is surjective
|
|
379
|
+
and ``False`` if not
|
|
380
|
+
|
|
381
|
+
The answer is cached.
|
|
382
|
+
|
|
383
|
+
EXAMPLES::
|
|
384
|
+
|
|
385
|
+
sage: rho = EllipticCurve('37b').galois_representation()
|
|
386
|
+
sage: rho.is_surjective(2)
|
|
387
|
+
True
|
|
388
|
+
sage: rho.is_surjective(3)
|
|
389
|
+
False
|
|
390
|
+
|
|
391
|
+
::
|
|
392
|
+
|
|
393
|
+
sage: rho = EllipticCurve('121a1').galois_representation()
|
|
394
|
+
sage: rho.non_surjective()
|
|
395
|
+
[11]
|
|
396
|
+
sage: rho.is_surjective(5)
|
|
397
|
+
True
|
|
398
|
+
sage: rho.is_surjective(11)
|
|
399
|
+
False
|
|
400
|
+
|
|
401
|
+
sage: rho = EllipticCurve('121d1').galois_representation()
|
|
402
|
+
sage: rho.is_surjective(5)
|
|
403
|
+
False
|
|
404
|
+
sage: rho.is_surjective(11)
|
|
405
|
+
True
|
|
406
|
+
|
|
407
|
+
Here is a case, in which the algorithm does not return an answer::
|
|
408
|
+
|
|
409
|
+
sage: rho = EllipticCurve([0,0,1,2580,549326]).galois_representation()
|
|
410
|
+
sage: rho.is_surjective(7)
|
|
411
|
+
|
|
412
|
+
In these cases, one can use image_type to get more information about the image::
|
|
413
|
+
|
|
414
|
+
sage: rho.image_type(7)
|
|
415
|
+
'The image is contained in the normalizer of a split Cartan group.'
|
|
416
|
+
|
|
417
|
+
REMARKS:
|
|
418
|
+
|
|
419
|
+
1. If `p \geq 5` then the mod-p representation is
|
|
420
|
+
surjective if and only if the `p`-adic representation is
|
|
421
|
+
surjective. When `p = 2, 3` there are
|
|
422
|
+
counterexamples. See papers of Dokchitsers and Elkies
|
|
423
|
+
for more details.
|
|
424
|
+
|
|
425
|
+
2. For the primes `p=2` and 3, this will always answer either
|
|
426
|
+
``True`` or ``False``. For larger primes it might give ``None``.
|
|
427
|
+
"""
|
|
428
|
+
if not arith.is_prime(p):
|
|
429
|
+
raise TypeError("p (=%s) must be prime." % p)
|
|
430
|
+
A = int(A)
|
|
431
|
+
key = (p, A)
|
|
432
|
+
try:
|
|
433
|
+
return self.__is_surjective[key]
|
|
434
|
+
except KeyError:
|
|
435
|
+
pass
|
|
436
|
+
except AttributeError:
|
|
437
|
+
self.__is_surjective = {}
|
|
438
|
+
|
|
439
|
+
ans = self._is_surjective(p, A)
|
|
440
|
+
self.__is_surjective[key] = ans
|
|
441
|
+
return ans
|
|
442
|
+
|
|
443
|
+
def _is_surjective(self, p, A):
|
|
444
|
+
r"""
|
|
445
|
+
Helper function for ``is_surjective``.
|
|
446
|
+
|
|
447
|
+
The value of `A` is as before, except that
|
|
448
|
+
`A=-1` is a special code to stop before
|
|
449
|
+
testing reducibility (to avoid an infinite loop).
|
|
450
|
+
|
|
451
|
+
EXAMPLES::
|
|
452
|
+
|
|
453
|
+
sage: rho = EllipticCurve('37b').galois_representation()
|
|
454
|
+
sage: rho._is_surjective(7,100)
|
|
455
|
+
True
|
|
456
|
+
|
|
457
|
+
TEST for :issue:`8451`::
|
|
458
|
+
|
|
459
|
+
sage: E = EllipticCurve('648a1')
|
|
460
|
+
sage: rho = E.galois_representation()
|
|
461
|
+
sage: rho._is_surjective(5,1000)
|
|
462
|
+
"""
|
|
463
|
+
T = self._E.torsion_subgroup().order()
|
|
464
|
+
if T % p == 0 and p != 2:
|
|
465
|
+
# we could probably determine the group structure directly
|
|
466
|
+
self.__image_type[p] = "The image is meta-cyclic inside a Borel subgroup as there is a %s-torsion point on the curve." % p
|
|
467
|
+
return False
|
|
468
|
+
|
|
469
|
+
R = PolynomialRing(self._E.base_ring(), 'x')
|
|
470
|
+
x = R.gen()
|
|
471
|
+
|
|
472
|
+
if p == 2:
|
|
473
|
+
# E is isomorphic to [0,b2,0,8*b4,16*b6]
|
|
474
|
+
b2,b4,b6,b8 = self._E.b_invariants()
|
|
475
|
+
f = x**3 + b2*x**2 + 8*b4*x + 16*b6
|
|
476
|
+
if not f.is_irreducible():
|
|
477
|
+
if len(f.roots()) > 2:
|
|
478
|
+
self.__image_type[p] = "The image is trivial as all 2-torsion points are rational."
|
|
479
|
+
else:
|
|
480
|
+
self.__image_type[p] = "The image is cyclic of order 2 as there is exactly one rational 2-torsion point."
|
|
481
|
+
return False #, '2-torsion'
|
|
482
|
+
if arith.is_square(f.discriminant()):
|
|
483
|
+
self.__image_type[p] = "The image is cyclic of order 3."
|
|
484
|
+
return False #, "A3"
|
|
485
|
+
self.__image_type[p] = "The image is all of GL_2(F_2), i.e. a symmetric group of order 6."
|
|
486
|
+
return True #, None
|
|
487
|
+
|
|
488
|
+
if p == 3:
|
|
489
|
+
# Algorithm: Let f be the 3-division polynomial, which is
|
|
490
|
+
# a polynomial of degree 4. Then I claim that this
|
|
491
|
+
# polynomial has Galois group S_4 if and only if the
|
|
492
|
+
# representation rhobar_{E,3} is surjective. If the group
|
|
493
|
+
# is S_4, then S_4 is a quotient of the image of
|
|
494
|
+
# rhobar_{E,3}. Since S_4 has order 24 and GL_2(F_3)
|
|
495
|
+
# has order 48, the only possibility we have to consider
|
|
496
|
+
# is that the image of rhobar is isomorphic to S_4.
|
|
497
|
+
# But this is not the case because S_4 is not a subgroup
|
|
498
|
+
# of GL_2(F_3). If it were, it would be normal, since
|
|
499
|
+
# it would have index 2. But there is a *unique* normal
|
|
500
|
+
# subgroup of GL_2(F_3) of index 2, namely SL_2(F_3),
|
|
501
|
+
# and SL_2(F_3) is not isomorphic to S_4 (S_4 has a normal
|
|
502
|
+
# subgroup of index 2 and SL_2(F_3) does not.)
|
|
503
|
+
# (What's a simple way to see that SL_2(F_3) is the
|
|
504
|
+
# unique index-2 normal subgroup? I didn't see an obvious
|
|
505
|
+
# reason, so just used the NormalSubgroups command in MAGMA
|
|
506
|
+
# and it output exactly one of index 2.)
|
|
507
|
+
|
|
508
|
+
#sage: G = SymmetricGroup(4)
|
|
509
|
+
#sage: [H.group_id() for H in G.conjugacy_classes_subgroups()]
|
|
510
|
+
#[[1, 1], [2, 1], [2, 1], [3, 1], [4, 2], [4, 2], [4, 1], [6, 1], [8, 3], [12, 3], [24, 12]]
|
|
511
|
+
#sage: G = GL(2,GF(3)).as_matrix_group().as_permutation_group()
|
|
512
|
+
#sage: [H.group_id() for H in G.conjugacy_classes_subgroups()]
|
|
513
|
+
#[[1, 1], [2, 1], [2, 1], [3, 1], [4, 2], [4, 1], [6, 2], [6, 1], [6, 1], [8, 4], [8, 1], [8, 3], [12, 4], [16, 8], [24, 3], [48, 29]]
|
|
514
|
+
|
|
515
|
+
# Here's Noam Elkies proof for the other direction:
|
|
516
|
+
|
|
517
|
+
#> Let E be an elliptic curve over Q. Is the mod-3
|
|
518
|
+
#> representation E[3] surjective if and only if the
|
|
519
|
+
#> (degree 4) division polynomial has Galois group S_4? I
|
|
520
|
+
#> can see why the group being S_4 implies the
|
|
521
|
+
#> representation is surjective, but the converse is not
|
|
522
|
+
#> clear to me.
|
|
523
|
+
# I would have thought that this is the easier part: to
|
|
524
|
+
# say that E[3] is surjective is to say the 3-torsion
|
|
525
|
+
# field Q(E[3]) has Galois group GL_2(Z/3) over Q. Let
|
|
526
|
+
# E[3]+ be the subfield fixed by the element -1 of
|
|
527
|
+
# GL_2(Z/3). Then E[3] has Galois group PGL_2(Z/3), which
|
|
528
|
+
# is identified with S_4 by its action on the four
|
|
529
|
+
# 3-element subgroups of E[3]. Each such subgroup is in
|
|
530
|
+
# turn determined by the x-coordinate shared by its two
|
|
531
|
+
# nonzero points. So, if E[3] is surjective then any
|
|
532
|
+
# permutation of those x-coordinates is realized by some
|
|
533
|
+
# element of Gal(E[3]+/Q). Thus the Galois group of the
|
|
534
|
+
# division polynomial (whose roots are those
|
|
535
|
+
# x-coordinates) maps surjectively to S_4, which means it
|
|
536
|
+
# equals S_4.
|
|
537
|
+
|
|
538
|
+
f = self._E.division_polynomial(3)
|
|
539
|
+
if not f.is_irreducible():
|
|
540
|
+
return False #, "reducible_3-divpoly"
|
|
541
|
+
n = pari(f).polgalois()[0]
|
|
542
|
+
if n == 24:
|
|
543
|
+
self.__image_type[p] = "The image is all of GL_2(F_3)."
|
|
544
|
+
return True #, None
|
|
545
|
+
else:
|
|
546
|
+
return False #, "3-divpoly_galgroup_order_%s"%n
|
|
547
|
+
|
|
548
|
+
if self._E.has_cm():
|
|
549
|
+
return False #, "CM"
|
|
550
|
+
|
|
551
|
+
# Now we try to prove that the rep IS surjective.
|
|
552
|
+
|
|
553
|
+
Np = self._E.conductor() * p
|
|
554
|
+
signs = []
|
|
555
|
+
# this follows Proposition 19 in Serre.
|
|
556
|
+
# there was a bug in the original implementation,
|
|
557
|
+
# counter-examples were 324b1 and 324d1, 648a1 and 648c1 for p=5
|
|
558
|
+
exclude_exceptional_image = False
|
|
559
|
+
ex_setp = _ex_set(p)
|
|
560
|
+
ell = 4
|
|
561
|
+
k = GF(p)
|
|
562
|
+
|
|
563
|
+
if A == -1:
|
|
564
|
+
Am = 1000
|
|
565
|
+
else:
|
|
566
|
+
Am = A
|
|
567
|
+
while ell < Am:
|
|
568
|
+
ell = arith.next_prime(ell)
|
|
569
|
+
if Np % ell != 0:
|
|
570
|
+
a_ell = self._E.ap(ell)
|
|
571
|
+
if a_ell % p != 0:
|
|
572
|
+
if not exclude_exceptional_image:
|
|
573
|
+
u = k(a_ell)**2 * k(ell)**(-1)
|
|
574
|
+
if u not in ex_setp:
|
|
575
|
+
exclude_exceptional_image = True
|
|
576
|
+
s = arith.kronecker(a_ell**2 - 4*ell, p)
|
|
577
|
+
if s != 0 and s not in signs:
|
|
578
|
+
signs.append(s)
|
|
579
|
+
if len(signs) == 2 and exclude_exceptional_image:
|
|
580
|
+
self.__image_type[p] = "The image is all of GL_2(F_%s)." % p
|
|
581
|
+
return True #,None
|
|
582
|
+
|
|
583
|
+
if A == -1: # we came in from is reducible. Now go out with False
|
|
584
|
+
return False
|
|
585
|
+
|
|
586
|
+
if self.is_reducible(p):
|
|
587
|
+
return False #, Borel
|
|
588
|
+
|
|
589
|
+
# if we reach this, then we do not know if it is surjective. Most likely
|
|
590
|
+
# not but we can't be certain. See trac 11271.
|
|
591
|
+
verbose("We can not conclude if the representation is surjective or not. Increasing the parameter A may help.")
|
|
592
|
+
return None
|
|
593
|
+
|
|
594
|
+
def non_surjective(self, A=1000):
|
|
595
|
+
r"""
|
|
596
|
+
Return a list of primes p such that the mod-p representation
|
|
597
|
+
*might* not be surjective. If `p` is not in the returned list,
|
|
598
|
+
then the mod-p representation is provably surjective.
|
|
599
|
+
|
|
600
|
+
By a theorem of Serre, there are only finitely
|
|
601
|
+
many primes in this list, except when the curve has
|
|
602
|
+
complex multiplication.
|
|
603
|
+
|
|
604
|
+
If the curve has CM, we simply return the
|
|
605
|
+
sequence [0] and do no further computation.
|
|
606
|
+
|
|
607
|
+
INPUT:
|
|
608
|
+
|
|
609
|
+
- ``A`` -- integer (default: 1000); by increasing this parameter
|
|
610
|
+
the resulting set might get smaller
|
|
611
|
+
|
|
612
|
+
OUTPUT:
|
|
613
|
+
|
|
614
|
+
- ``list`` -- if the curve has CM, returns ``[0]``.
|
|
615
|
+
Otherwise, returns a list of primes where mod-p representation is
|
|
616
|
+
very likely not surjective. At any prime not in this list, the
|
|
617
|
+
representation is definitely surjective.
|
|
618
|
+
|
|
619
|
+
EXAMPLES::
|
|
620
|
+
|
|
621
|
+
sage: E = EllipticCurve([0, 0, 1, -38, 90]) # 361A
|
|
622
|
+
sage: E.galois_representation().non_surjective() # CM curve
|
|
623
|
+
[0]
|
|
624
|
+
|
|
625
|
+
::
|
|
626
|
+
|
|
627
|
+
sage: E = EllipticCurve([0, -1, 1, 0, 0]) # X_1(11)
|
|
628
|
+
sage: E.galois_representation().non_surjective()
|
|
629
|
+
[5]
|
|
630
|
+
|
|
631
|
+
sage: E = EllipticCurve([0, 0, 1, -1, 0]) # 37A
|
|
632
|
+
sage: E.galois_representation().non_surjective()
|
|
633
|
+
[]
|
|
634
|
+
|
|
635
|
+
sage: E = EllipticCurve([0,-1,1,-2,-1]) # 141C
|
|
636
|
+
sage: E.galois_representation().non_surjective()
|
|
637
|
+
[13]
|
|
638
|
+
|
|
639
|
+
::
|
|
640
|
+
|
|
641
|
+
sage: E = EllipticCurve([1,-1,1,-9965,385220]) # 9999a1
|
|
642
|
+
sage: rho = E.galois_representation()
|
|
643
|
+
sage: rho.non_surjective()
|
|
644
|
+
[2]
|
|
645
|
+
|
|
646
|
+
sage: E = EllipticCurve('324b1')
|
|
647
|
+
sage: rho = E.galois_representation()
|
|
648
|
+
sage: rho.non_surjective()
|
|
649
|
+
[3, 5]
|
|
650
|
+
|
|
651
|
+
ALGORITHM:
|
|
652
|
+
We first find an upper bound `B` on the possible primes. If `E`
|
|
653
|
+
is semi-stable, we can take `B=11` by a result of Mazur. There is
|
|
654
|
+
a bound by Serre in the case that the `j`-invariant is not integral
|
|
655
|
+
in terms of the smallest prime of good reduction. Finally
|
|
656
|
+
there is an unconditional bound by Cojocaru, but which depends
|
|
657
|
+
on the conductor of `E`.
|
|
658
|
+
For the prime below that bound we call ``is_surjective``.
|
|
659
|
+
"""
|
|
660
|
+
if self._E.has_cm():
|
|
661
|
+
verbose("cm curve")
|
|
662
|
+
return [0]
|
|
663
|
+
N = self._E.conductor()
|
|
664
|
+
if self._E.is_semistable():
|
|
665
|
+
# Mazur's bound
|
|
666
|
+
C = 11
|
|
667
|
+
verbose("semistable -- so bound is 11")
|
|
668
|
+
elif not self._E.j_invariant().is_integral():
|
|
669
|
+
# prop 24 in Serre
|
|
670
|
+
vs = self._E.j_invariant().denominator().prime_factors()
|
|
671
|
+
C1 = arith.gcd([-arith.valuation(self._E.j_invariant(),v) for v in vs])
|
|
672
|
+
p0 = 2
|
|
673
|
+
while self._E.has_bad_reduction(p0):
|
|
674
|
+
p0 = arith.next_prime(p0+1)
|
|
675
|
+
C2 = (sqrt(p0)+1)**8
|
|
676
|
+
C = max(C1,C2)
|
|
677
|
+
verbose("j is not integral -- Serre's bound is %s" % C)
|
|
678
|
+
C3 = 1 + 4*sqrt(6)*int(N)/3 * sqrt(mul([1+1.0/int(p) for p,_ in arith.factor(N)]))
|
|
679
|
+
C = min(C,C3)
|
|
680
|
+
verbose("conductor = %s, and bound is %s" % (N,C))
|
|
681
|
+
else:
|
|
682
|
+
# Cojocaru's bound (depends on the conductor)
|
|
683
|
+
C = 1 + 4*sqrt(6)*int(N)/3 * sqrt(mul([1+1.0/int(p) for p,_ in arith.factor(N)]))
|
|
684
|
+
verbose("conductor = %s, and bound is %s" % (N,C))
|
|
685
|
+
B = []
|
|
686
|
+
p = 2
|
|
687
|
+
while p <= C:
|
|
688
|
+
t = self.is_surjective(p, A=A)
|
|
689
|
+
verbose("(%s,%s)" % (p,t))
|
|
690
|
+
# both False and None will be appended here.
|
|
691
|
+
if not t:
|
|
692
|
+
B.append(p)
|
|
693
|
+
p = arith.next_prime(p)
|
|
694
|
+
return B
|
|
695
|
+
|
|
696
|
+
def image_type(self, p):
|
|
697
|
+
r"""
|
|
698
|
+
Return a string describing the image of the
|
|
699
|
+
mod-p representation.
|
|
700
|
+
The result is provably correct, but only
|
|
701
|
+
indicates what sort of an image we have. If
|
|
702
|
+
one wishes to determine the exact group one
|
|
703
|
+
needs to work a bit harder. The probabilistic
|
|
704
|
+
method of image_classes or Sutherland's galrep
|
|
705
|
+
package can give a very good guess what the
|
|
706
|
+
image should be.
|
|
707
|
+
|
|
708
|
+
INPUT:
|
|
709
|
+
|
|
710
|
+
- ``p`` -- a prime number
|
|
711
|
+
|
|
712
|
+
OUTPUT: string
|
|
713
|
+
|
|
714
|
+
EXAMPLES::
|
|
715
|
+
|
|
716
|
+
sage: E = EllipticCurve('14a1')
|
|
717
|
+
sage: rho = E.galois_representation()
|
|
718
|
+
sage: rho.image_type(5)
|
|
719
|
+
'The image is all of GL_2(F_5).'
|
|
720
|
+
|
|
721
|
+
sage: E = EllipticCurve('11a1')
|
|
722
|
+
sage: rho = E.galois_representation()
|
|
723
|
+
sage: rho.image_type(5)
|
|
724
|
+
'The image is meta-cyclic inside a Borel subgroup as there is a 5-torsion point on the curve.'
|
|
725
|
+
|
|
726
|
+
sage: EllipticCurve('27a1').galois_representation().image_type(5)
|
|
727
|
+
'The image is contained in the normalizer of a non-split Cartan group. (cm)'
|
|
728
|
+
sage: EllipticCurve('30a1').galois_representation().image_type(5)
|
|
729
|
+
'The image is all of GL_2(F_5).'
|
|
730
|
+
sage: EllipticCurve("324b1").galois_representation().image_type(5)
|
|
731
|
+
'The image in PGL_2(F_5) is the exceptional group S_4.'
|
|
732
|
+
|
|
733
|
+
sage: E = EllipticCurve([0,0,0,-56,4848])
|
|
734
|
+
sage: rho = E.galois_representation()
|
|
735
|
+
|
|
736
|
+
sage: rho.image_type(5)
|
|
737
|
+
'The image is contained in the normalizer of a split Cartan group.'
|
|
738
|
+
|
|
739
|
+
sage: EllipticCurve('49a1').galois_representation().image_type(7)
|
|
740
|
+
'The image is contained in a Borel subgroup as there is a 7-isogeny.'
|
|
741
|
+
|
|
742
|
+
sage: EllipticCurve('121c1').galois_representation().image_type(11)
|
|
743
|
+
'The image is contained in a Borel subgroup as there is a 11-isogeny.'
|
|
744
|
+
sage: EllipticCurve('121d1').galois_representation().image_type(11)
|
|
745
|
+
'The image is all of GL_2(F_11).'
|
|
746
|
+
sage: EllipticCurve('441f1').galois_representation().image_type(13)
|
|
747
|
+
'The image is contained in a Borel subgroup as there is a 13-isogeny.'
|
|
748
|
+
|
|
749
|
+
sage: EllipticCurve([1,-1,1,-5,2]).galois_representation().image_type(5)
|
|
750
|
+
'The image is contained in the normalizer of a non-split Cartan group.'
|
|
751
|
+
sage: EllipticCurve([0,0,1,-25650,1570826]).galois_representation().image_type(5)
|
|
752
|
+
'The image is contained in the normalizer of a split Cartan group.'
|
|
753
|
+
sage: EllipticCurve([1,-1,1,-2680,-50053]).galois_representation().image_type(7) # the dots (...) in the output fix #11937 (installed 'Kash' may give additional output); long time (2s on sage.math, 2014)
|
|
754
|
+
'The image is a... group of order 18.'
|
|
755
|
+
sage: EllipticCurve([1,-1,0,-107,-379]).galois_representation().image_type(7) # the dots (...) in the output fix #11937 (installed 'Kash' may give additional output); long time (1s on sage.math, 2014)
|
|
756
|
+
'The image is a... group of order 36.'
|
|
757
|
+
sage: EllipticCurve([0,0,1,2580,549326]).galois_representation().image_type(7)
|
|
758
|
+
'The image is contained in the normalizer of a split Cartan group.'
|
|
759
|
+
|
|
760
|
+
Test :issue:`14577`::
|
|
761
|
+
|
|
762
|
+
sage: EllipticCurve([0, 1, 0, -4788, 109188]).galois_representation().image_type(13)
|
|
763
|
+
'The image in PGL_2(F_13) is the exceptional group S_4.'
|
|
764
|
+
|
|
765
|
+
Test :issue:`14752`::
|
|
766
|
+
|
|
767
|
+
sage: EllipticCurve([0, 0, 0, -1129345880,-86028258620304]).galois_representation().image_type(11)
|
|
768
|
+
'The image is contained in the normalizer of a non-split Cartan group.'
|
|
769
|
+
|
|
770
|
+
For `p=2`::
|
|
771
|
+
|
|
772
|
+
sage: E = EllipticCurve('11a1')
|
|
773
|
+
sage: rho = E.galois_representation()
|
|
774
|
+
sage: rho.image_type(2)
|
|
775
|
+
'The image is all of GL_2(F_2), i.e. a symmetric group of order 6.'
|
|
776
|
+
|
|
777
|
+
sage: rho = EllipticCurve('14a1').galois_representation()
|
|
778
|
+
sage: rho.image_type(2)
|
|
779
|
+
'The image is cyclic of order 2 as there is exactly one rational 2-torsion point.'
|
|
780
|
+
|
|
781
|
+
sage: rho = EllipticCurve('15a1').galois_representation()
|
|
782
|
+
sage: rho.image_type(2)
|
|
783
|
+
'The image is trivial as all 2-torsion points are rational.'
|
|
784
|
+
|
|
785
|
+
sage: rho = EllipticCurve('196a1').galois_representation()
|
|
786
|
+
sage: rho.image_type(2)
|
|
787
|
+
'The image is cyclic of order 3.'
|
|
788
|
+
|
|
789
|
+
`p=3`::
|
|
790
|
+
|
|
791
|
+
sage: rho = EllipticCurve('33a1').galois_representation()
|
|
792
|
+
sage: rho.image_type(3)
|
|
793
|
+
'The image is all of GL_2(F_3).'
|
|
794
|
+
|
|
795
|
+
sage: rho = EllipticCurve('30a1').galois_representation()
|
|
796
|
+
sage: rho.image_type(3)
|
|
797
|
+
'The image is meta-cyclic inside a Borel subgroup as there is a 3-torsion point on the curve.'
|
|
798
|
+
|
|
799
|
+
sage: rho = EllipticCurve('50b1').galois_representation()
|
|
800
|
+
sage: rho.image_type(3)
|
|
801
|
+
'The image is contained in a Borel subgroup as there is a 3-isogeny.'
|
|
802
|
+
|
|
803
|
+
sage: rho = EllipticCurve('3840h1').galois_representation()
|
|
804
|
+
sage: rho.image_type(3)
|
|
805
|
+
'The image is contained in a dihedral group of order 8.'
|
|
806
|
+
|
|
807
|
+
sage: rho = EllipticCurve('32a1').galois_representation()
|
|
808
|
+
sage: rho.image_type(3)
|
|
809
|
+
'The image is a semi-dihedral group of order 16, gap.SmallGroup([16,8]).'
|
|
810
|
+
|
|
811
|
+
ALGORITHM: Mainly based on Serre's paper.
|
|
812
|
+
"""
|
|
813
|
+
if not arith.is_prime(p):
|
|
814
|
+
raise TypeError("p (=%s) must be prime." % p)
|
|
815
|
+
try:
|
|
816
|
+
return self.__image_type[p]
|
|
817
|
+
except KeyError:
|
|
818
|
+
pass
|
|
819
|
+
except AttributeError:
|
|
820
|
+
self.__image_type = {}
|
|
821
|
+
|
|
822
|
+
# we eliminate step by step possibilities.
|
|
823
|
+
# checks if the image is all of GL_2, while doing so, it may detect certain other classes already
|
|
824
|
+
# see _is_surjective. It will have set __image_type
|
|
825
|
+
|
|
826
|
+
self._is_surjective(p, A=1000) # this sets __image_type
|
|
827
|
+
try:
|
|
828
|
+
return self.__image_type[p]
|
|
829
|
+
except KeyError:
|
|
830
|
+
pass
|
|
831
|
+
|
|
832
|
+
# check if the rep is reducible
|
|
833
|
+
|
|
834
|
+
if self.is_reducible(p):
|
|
835
|
+
self.__image_type[p] = "The image is contained in a Borel subgroup as there is a %s-isogeny." % p
|
|
836
|
+
return self.__image_type[p]
|
|
837
|
+
|
|
838
|
+
# if we are then the image of rho is not surjective and not contained in a Borel subgroup
|
|
839
|
+
# there are three cases left:
|
|
840
|
+
# it could be in a normalizer of a split Cartan,
|
|
841
|
+
# normalizer of a non-split Cartan,
|
|
842
|
+
# or the image in PGL_2 is one of the three exceptional groups A_4 S_4 A_5
|
|
843
|
+
|
|
844
|
+
non_split_str = "The image is contained in the normalizer of a non-split Cartan group."
|
|
845
|
+
split_str = "The image is contained in the normalizer of a split Cartan group."
|
|
846
|
+
s4_str = "The image in PGL_2(F_%s) is the exceptional group S_4." % p
|
|
847
|
+
a4_str = "The image in PGL_2(F_%s) is the exceptional group A_4." % p
|
|
848
|
+
a5_str = "The image in PGL_2(F_%s) is the exceptional group A_5." % p
|
|
849
|
+
|
|
850
|
+
# we first treat p=3 and 5 separately. p=2 has already been done.
|
|
851
|
+
|
|
852
|
+
if p == 3:
|
|
853
|
+
# this implies that the image of rhobar in PGL_2 = S_4
|
|
854
|
+
# determines completely the image of rho
|
|
855
|
+
f = self._E.division_polynomial(3)
|
|
856
|
+
if not f.is_irreducible():
|
|
857
|
+
# must be a product of two polynomials of degree 2
|
|
858
|
+
self.__image_type[p] = "The image is contained in a dihedral group of order 8."
|
|
859
|
+
return self.__image_type[p]
|
|
860
|
+
n = pari(f).polgalois()[0]
|
|
861
|
+
# the following is due to a simple classification of all subgroups of GL_2(F_3)
|
|
862
|
+
if n == 2:
|
|
863
|
+
self.__image_type[p] = "The image is a cyclic group of order 4."
|
|
864
|
+
elif n == 4:
|
|
865
|
+
for ell in prime_range(5,1000):
|
|
866
|
+
if ell % 3 == 2 and self._E.ap(ell) % 3 != 0:
|
|
867
|
+
# there is an element of order 8 in the image
|
|
868
|
+
self.__image_type[p] = "The image is a cyclic group of order 8."
|
|
869
|
+
return self.__image_type[p]
|
|
870
|
+
self.__image_type[p] = "The image is a group of order 8, most likely a quaternion group."
|
|
871
|
+
elif n == 6:
|
|
872
|
+
self.__image_type[p] = "The image is a dihedral group of order 12."
|
|
873
|
+
elif n == 8:
|
|
874
|
+
self.__image_type[p] = "The image is a semi-dihedral group of order 16, gap.SmallGroup([16,8])."
|
|
875
|
+
elif n == 12:
|
|
876
|
+
self.__image_type[p] = "The image is SL_2(F_3)."
|
|
877
|
+
else:
|
|
878
|
+
raise RuntimeError("Bug in image_type for p = 3.")
|
|
879
|
+
return self.__image_type[p]
|
|
880
|
+
|
|
881
|
+
# we also eliminate cm curves
|
|
882
|
+
|
|
883
|
+
if self._E.has_cm():
|
|
884
|
+
if self._E.is_good(p) and self._E.is_ordinary(p):
|
|
885
|
+
self.__image_type[p] = split_str + " (cm)"
|
|
886
|
+
return self.__image_type[p]
|
|
887
|
+
if self._E.is_supersingular(p):
|
|
888
|
+
self.__image_type[p] = non_split_str + " (cm)"
|
|
889
|
+
return self.__image_type[p]
|
|
890
|
+
else:
|
|
891
|
+
# if the reduction is bad (additive nec.) then
|
|
892
|
+
# the image is in a Borel subgroup and we should have found this before
|
|
893
|
+
raise NotImplementedError("image_type is not implemented for cm-curves at bad prime.")
|
|
894
|
+
|
|
895
|
+
# now to p=5 where a lot of non-standard thing happen
|
|
896
|
+
# we run through primes if we hit an element of order 6 in PGL_2, we know that it is the normaliser of a NON-split Cartan
|
|
897
|
+
# if we find both an element of order 3 and one of order 4, we know that we have a S_4 in PGL_2
|
|
898
|
+
|
|
899
|
+
if p == 5:
|
|
900
|
+
# we filter here a few cases and leave the rest to the computation of the Galois group later
|
|
901
|
+
ell = 1
|
|
902
|
+
k = GF(p)
|
|
903
|
+
Np = self._E.conductor()*p
|
|
904
|
+
has_an_el_order_4 = False
|
|
905
|
+
has_an_el_order_3 = False
|
|
906
|
+
while ell < 10000:
|
|
907
|
+
ell = arith.next_prime(ell)
|
|
908
|
+
if Np % ell != 0:
|
|
909
|
+
a_ell = self._E.ap(ell)
|
|
910
|
+
u = k(a_ell)**2 * k(ell)**(-1)
|
|
911
|
+
if u == 3:
|
|
912
|
+
verbose("found an element of order 6", level=2)
|
|
913
|
+
# found an element of order 6:
|
|
914
|
+
self.__image_type[p] = non_split_str
|
|
915
|
+
return self.__image_type[p]
|
|
916
|
+
|
|
917
|
+
if u == 2 and not has_an_el_order_4:
|
|
918
|
+
# found an element of order 4
|
|
919
|
+
verbose("found an element of order 4", level=2)
|
|
920
|
+
has_an_el_order_4 = True
|
|
921
|
+
if has_an_el_order_3:
|
|
922
|
+
self.__image_type[p] = s4_str
|
|
923
|
+
return self.__image_type[p]
|
|
924
|
+
|
|
925
|
+
if u == 1 and not has_an_el_order_3:
|
|
926
|
+
# found an element of order 3
|
|
927
|
+
verbose("found an element of order 3", level=2)
|
|
928
|
+
has_an_el_order_3 = True
|
|
929
|
+
if has_an_el_order_4:
|
|
930
|
+
self.__image_type[p] = s4_str
|
|
931
|
+
return self.__image_type[p]
|
|
932
|
+
|
|
933
|
+
verbose("p=5 and we could not determine the image, yet", level=2)
|
|
934
|
+
# we have not yet determined the image, there are only the following possible subgroups of PGL_2
|
|
935
|
+
# (unless we were unlucky and none of the elements of order 6 showed up above, for instance)
|
|
936
|
+
# A_4 of order 12 with elements of order 2 and 3
|
|
937
|
+
# D_4 of order 8 with elements of order 2 and 4 (normalizer of the SPLIT)
|
|
938
|
+
# Z/2 x Z/2 of order 4 with elements of order 2 (in the normalizer of the SPLIT)
|
|
939
|
+
# S_3 of order 6 with elements of order 2 and 3 (inside the normalizer of the NON-split)
|
|
940
|
+
|
|
941
|
+
# we compute the splitting field of the 5-division polynomial. Its degree is equal to the above order or the double of it.
|
|
942
|
+
# That allows us to determine almost all cases.
|
|
943
|
+
|
|
944
|
+
f = self._E.division_polynomial(5)
|
|
945
|
+
from sage.rings.number_field.splitting_field import SplittingFieldAbort
|
|
946
|
+
try:
|
|
947
|
+
K = f.splitting_field('x', degree_multiple=240, abort_degree=24)
|
|
948
|
+
except SplittingFieldAbort:
|
|
949
|
+
pass
|
|
950
|
+
else:
|
|
951
|
+
if K.degree() in (4,8,16):
|
|
952
|
+
self.__image_type[p] = split_str
|
|
953
|
+
return self.__image_type[p]
|
|
954
|
+
if K.degree() == 24:
|
|
955
|
+
self.__image_type[p] = a4_str
|
|
956
|
+
return self.__image_type[p]
|
|
957
|
+
if K.degree() == 6:
|
|
958
|
+
self.__image_type[p] = non_split_str
|
|
959
|
+
return self.__image_type[p]
|
|
960
|
+
if K.degree() == 12:
|
|
961
|
+
# PGL - image could be a S_3 in the normalizer of the split or A4
|
|
962
|
+
self.__image_type[p] = "The image is of order 6 or 12. Probably contained in the normalizer of the split Cartan g."
|
|
963
|
+
return self.__image_type[p]
|
|
964
|
+
|
|
965
|
+
## now E has no cm, is not semi-stable,
|
|
966
|
+
## p > 5,
|
|
967
|
+
## rho_p it is (most probably) not surjective , it is not contained in a Borel subgroup.
|
|
968
|
+
# trying to detect that the image is not exceptional in PGL_2
|
|
969
|
+
# this uses Serre 2.6.iii and Prop 19
|
|
970
|
+
# the existence of certain classes in the image rules out certain cases.
|
|
971
|
+
# we run over the small prime until we are left with only one case
|
|
972
|
+
# for p = 5 this could never distinguish any from an exceptional S_4 or A_4,
|
|
973
|
+
# that is why the case 5 is treated a part before
|
|
974
|
+
|
|
975
|
+
else:
|
|
976
|
+
ex_setp = _ex_set(p)
|
|
977
|
+
ell = 1
|
|
978
|
+
k = GF(p)
|
|
979
|
+
Np = self._E.conductor()*p
|
|
980
|
+
could_be_exc = 1
|
|
981
|
+
could_be_split = 1
|
|
982
|
+
could_be_non_split = 1
|
|
983
|
+
# loops over primes as long as we still have two options left
|
|
984
|
+
while ell < 10000 and (could_be_exc + could_be_split + could_be_non_split > 1):
|
|
985
|
+
ell = arith.next_prime(ell)
|
|
986
|
+
if Np % ell != 0:
|
|
987
|
+
a_ell = self._E.ap(ell)
|
|
988
|
+
u = k(a_ell)**2 * k(ell)**(-1)
|
|
989
|
+
if (u not in ex_setp) and could_be_exc == 1:
|
|
990
|
+
# it can not be in the exceptional
|
|
991
|
+
verbose("the image cannot be exceptional, found u=%s" % u, level=2)
|
|
992
|
+
could_be_exc = 0
|
|
993
|
+
if a_ell != 0 and arith.kronecker(a_ell**2 - 4*ell,p) == 1 and could_be_non_split == 1:
|
|
994
|
+
# it can not be in the normalizer of the non-split Cartan
|
|
995
|
+
verbose("the image cannot be non-split, found u=%s" % u, level=2)
|
|
996
|
+
could_be_non_split = 0
|
|
997
|
+
if a_ell != 0 and arith.kronecker(a_ell**2 - 4*ell,p) == -1 and could_be_split == 1:
|
|
998
|
+
# it can not be in the normalizer of the split Cartan
|
|
999
|
+
verbose("the image cannot be split, found u=%s" % u, level=2)
|
|
1000
|
+
could_be_split = 0
|
|
1001
|
+
|
|
1002
|
+
assert could_be_exc + could_be_split + could_be_non_split > 0, "bug in image_type."
|
|
1003
|
+
|
|
1004
|
+
if could_be_exc + could_be_split + could_be_non_split == 1:
|
|
1005
|
+
# it is only one of the three cases:
|
|
1006
|
+
if could_be_split == 1:
|
|
1007
|
+
self.__image_type[p] = split_str
|
|
1008
|
+
return self.__image_type[p]
|
|
1009
|
+
if could_be_non_split == 1:
|
|
1010
|
+
self.__image_type[p] = non_split_str
|
|
1011
|
+
return self.__image_type[p]
|
|
1012
|
+
if could_be_exc == 1:
|
|
1013
|
+
# here we can distinguish further
|
|
1014
|
+
could_be_a4 = 1
|
|
1015
|
+
could_be_s4 = 1
|
|
1016
|
+
could_be_a5 = 1
|
|
1017
|
+
if p % 5 != 1 and p % 5 != 4:
|
|
1018
|
+
could_be_a5 = 0
|
|
1019
|
+
# elements of order 5 # bug corrected see trac 14577
|
|
1020
|
+
R = k['X']
|
|
1021
|
+
f = R([1,-3,1]) #(X**2 - 3*X+1)
|
|
1022
|
+
el5 = f.roots()
|
|
1023
|
+
# loops over primes as long as we still have two options left
|
|
1024
|
+
while ell < 10000 and (could_be_s4 + could_be_a4 + could_be_a5 > 1):
|
|
1025
|
+
ell = arith.next_prime(ell)
|
|
1026
|
+
if Np % ell != 0:
|
|
1027
|
+
a_ell = self._E.ap(ell)
|
|
1028
|
+
u = k(a_ell)**2 * k(ell)**(-1)
|
|
1029
|
+
if u == 2:
|
|
1030
|
+
# it can not be A4 not A5 as they have no elements of order 4
|
|
1031
|
+
could_be_a4 = 0
|
|
1032
|
+
could_be_a5 = 0
|
|
1033
|
+
if u in el5:
|
|
1034
|
+
# it can not be A4 or S4 as they have no elements of order 5
|
|
1035
|
+
could_be_a4 = 0
|
|
1036
|
+
could_be_s4 = 0
|
|
1037
|
+
|
|
1038
|
+
assert (could_be_s4 + could_be_a4 + could_be_a5 > 0), "bug in image_type."
|
|
1039
|
+
|
|
1040
|
+
if could_be_s4 + could_be_a4 + could_be_a5 == 1:
|
|
1041
|
+
if could_be_s4 == 1:
|
|
1042
|
+
self.__image_type[p] = s4_str
|
|
1043
|
+
return self.__image_type[p]
|
|
1044
|
+
if could_be_a4 == 1:
|
|
1045
|
+
self.__image_type[p] = a4_str
|
|
1046
|
+
return self.__image_type[p]
|
|
1047
|
+
if could_be_a5 == 1:
|
|
1048
|
+
self.__image_type[p] = a5_str
|
|
1049
|
+
return self.__image_type[p]
|
|
1050
|
+
|
|
1051
|
+
else:
|
|
1052
|
+
self.__image_type[p] = "The image in PGL_2(F_%s) is an exceptional group A_4, S_4 or A_5, but we could not determine which one." % p
|
|
1053
|
+
return self.__image_type[p]
|
|
1054
|
+
|
|
1055
|
+
# If all fails, we probably have a fairly small group and we can try to detect it using the galois_group
|
|
1056
|
+
if p <= 13:
|
|
1057
|
+
K = self._E.division_field(p, 'z')
|
|
1058
|
+
d = K.absolute_degree()
|
|
1059
|
+
|
|
1060
|
+
verbose("field of degree %s. try to compute Galois group" % (d), level=2)
|
|
1061
|
+
# If the degree is too big, we have no chance at the Galois
|
|
1062
|
+
# group. K.galois_group calls is_galois which used to rely on
|
|
1063
|
+
# pari's Galois group computations, so degree < 12
|
|
1064
|
+
try:
|
|
1065
|
+
if d > 15:
|
|
1066
|
+
raise Exception()
|
|
1067
|
+
G = K.galois_group()
|
|
1068
|
+
except Exception:
|
|
1069
|
+
self.__image_type[p] = "The image is a group of order %s." % d
|
|
1070
|
+
return self.__image_type[p]
|
|
1071
|
+
|
|
1072
|
+
else:
|
|
1073
|
+
if G.is_abelian():
|
|
1074
|
+
ab = ""
|
|
1075
|
+
else:
|
|
1076
|
+
ab = "non-"
|
|
1077
|
+
self.__image_type[p] = "The image is a " + ab + "abelian group of order %s." % G.order()
|
|
1078
|
+
return self.__image_type[p]
|
|
1079
|
+
|
|
1080
|
+
## everything failed :
|
|
1081
|
+
|
|
1082
|
+
self.__image_type[p] = "The image could not be determined. Sorry."
|
|
1083
|
+
return self.__image_type[p]
|
|
1084
|
+
|
|
1085
|
+
def image_classes(self, p, bound=10000):
|
|
1086
|
+
r"""
|
|
1087
|
+
This function returns, given the representation `\rho`
|
|
1088
|
+
a list of `p` values that add up to 1, representing the
|
|
1089
|
+
frequency of the conjugacy classes of the projective image
|
|
1090
|
+
of `\rho` in `PGL_2(\GF{p})`.
|
|
1091
|
+
|
|
1092
|
+
Let `M` be a matrix in `GL_2(\GF{p})`, then define
|
|
1093
|
+
`u(M) = \text{tr}(M)^2/\det(M)`, which only depends on the
|
|
1094
|
+
conjugacy class of `M` in `PGL_2(\GF{p})`. Hence this defines
|
|
1095
|
+
a map `u: PGL_2(\GF{p}) \to \GF{p}`, which is almost
|
|
1096
|
+
a bijection between conjugacy classes of the source
|
|
1097
|
+
and `\GF{p}` (the elements of order `p` and the identity
|
|
1098
|
+
map to `4` and both classes of elements of order 2 map to 0).
|
|
1099
|
+
|
|
1100
|
+
This function returns the frequency with which the values of
|
|
1101
|
+
`u` appeared among the images of the Frobenius elements
|
|
1102
|
+
`a_{\ell}`at `\ell` for good primes `\ell\neq p` below a
|
|
1103
|
+
given ``bound``.
|
|
1104
|
+
|
|
1105
|
+
INPUT:
|
|
1106
|
+
|
|
1107
|
+
- ``p`` -- a prime
|
|
1108
|
+
|
|
1109
|
+
- ``bound`` -- a natural number (default: 10000)
|
|
1110
|
+
|
|
1111
|
+
OUTPUT: list of `p` real numbers in the interval `[0,1]` adding up to 1
|
|
1112
|
+
|
|
1113
|
+
EXAMPLES::
|
|
1114
|
+
|
|
1115
|
+
sage: E = EllipticCurve('14a1')
|
|
1116
|
+
sage: rho = E.galois_representation()
|
|
1117
|
+
sage: rho.image_classes(5)
|
|
1118
|
+
[0.2095, 0.1516, 0.2445, 0.1728, 0.2217]
|
|
1119
|
+
|
|
1120
|
+
sage: E = EllipticCurve('11a1')
|
|
1121
|
+
sage: rho = E.galois_representation()
|
|
1122
|
+
sage: rho.image_classes(5)
|
|
1123
|
+
[0.2467, 0.0000, 0.5049, 0.0000, 0.2484]
|
|
1124
|
+
|
|
1125
|
+
::
|
|
1126
|
+
|
|
1127
|
+
sage: EllipticCurve('27a1').galois_representation().image_classes(5)
|
|
1128
|
+
[0.5839, 0.1645, 0.0000, 0.1702, 0.08143]
|
|
1129
|
+
sage: EllipticCurve('30a1').galois_representation().image_classes(5)
|
|
1130
|
+
[0.1956, 0.1801, 0.2543, 0.1728, 0.1972]
|
|
1131
|
+
sage: EllipticCurve('32a1').galois_representation().image_classes(5)
|
|
1132
|
+
[0.6319, 0.0000, 0.2492, 0.0000, 0.1189]
|
|
1133
|
+
sage: EllipticCurve('900a1').galois_representation().image_classes(5)
|
|
1134
|
+
[0.5852, 0.1679, 0.0000, 0.1687, 0.07824]
|
|
1135
|
+
sage: EllipticCurve('441a1').galois_representation().image_classes(5)
|
|
1136
|
+
[0.5860, 0.1646, 0.0000, 0.1679, 0.08150]
|
|
1137
|
+
sage: EllipticCurve('648a1').galois_representation().image_classes(5)
|
|
1138
|
+
[0.3945, 0.3293, 0.2388, 0.0000, 0.03749]
|
|
1139
|
+
|
|
1140
|
+
::
|
|
1141
|
+
|
|
1142
|
+
sage: EllipticCurve('784h1').galois_representation().image_classes(7)
|
|
1143
|
+
[0.5049, 0.0000, 0.0000, 0.0000, 0.4951, 0.0000, 0.0000]
|
|
1144
|
+
sage: EllipticCurve('49a1').galois_representation().image_classes(7)
|
|
1145
|
+
[0.5045, 0.0000, 0.0000, 0.0000, 0.4955, 0.0000, 0.0000]
|
|
1146
|
+
|
|
1147
|
+
sage: EllipticCurve('121c1').galois_representation().image_classes(11)
|
|
1148
|
+
[0.1001, 0.0000, 0.0000, 0.0000, 0.1017, 0.1953, 0.1993, 0.0000, 0.0000, 0.2010, 0.2026]
|
|
1149
|
+
sage: EllipticCurve('121d1').galois_representation().image_classes(11)
|
|
1150
|
+
[0.08869, 0.07974, 0.08706, 0.08137, 0.1001, 0.09439, 0.09764, 0.08218, 0.08625, 0.1017, 0.1009]
|
|
1151
|
+
|
|
1152
|
+
sage: EllipticCurve('441f1').galois_representation().image_classes(13)
|
|
1153
|
+
[0.08232, 0.1663, 0.1663, 0.1663, 0.08232, 0.0000, 0.1549, 0.0000, 0.0000, 0.0000, 0.0000, 0.1817, 0.0000]
|
|
1154
|
+
|
|
1155
|
+
REMARKS:
|
|
1156
|
+
|
|
1157
|
+
Conjugacy classes of subgroups of `PGL_2(\GF{5})`
|
|
1158
|
+
|
|
1159
|
+
For the case `p=5`, the order of an element determines almost the value of `u`:
|
|
1160
|
+
|
|
1161
|
+
+-------+---+---+---+---+--------+
|
|
1162
|
+
|`u` | 0 | 1 | 2 | 3 | 4 |
|
|
1163
|
+
+-------+---+---+---+---+--------+
|
|
1164
|
+
|orders | 2 | 3 | 4 | 6 | 1 or 5 |
|
|
1165
|
+
+-------+---+---+---+---+--------+
|
|
1166
|
+
|
|
1167
|
+
Here we give here the full table of all conjugacy classes of subgroups with the values
|
|
1168
|
+
that ``image_classes`` should give (as ``bound`` tends to `\infty`). Comparing with the output
|
|
1169
|
+
of the above examples, it is now easy to guess what the image is.
|
|
1170
|
+
|
|
1171
|
+
+---------+-----+------------------------------------------+
|
|
1172
|
+
|subgroup |order| frequencies of values of `u` |
|
|
1173
|
+
+=========+=====+==========================================+
|
|
1174
|
+
| trivial | 1 | [0.0000, 0.0000, 0.0000, 0.0000, 1.000] |
|
|
1175
|
+
+---------+-----+------------------------------------------+
|
|
1176
|
+
| cyclic | 2 | [0.5000, 0.0000, 0.0000, 0.0000, 0.5000] |
|
|
1177
|
+
+---------+-----+------------------------------------------+
|
|
1178
|
+
| cyclic | 2 | [0.5000, 0.0000, 0.0000, 0.0000, 0.5000]|
|
|
1179
|
+
+---------+-----+------------------------------------------+
|
|
1180
|
+
| cyclic | 3 | [0.0000, 0.6667, 0.0000, 0.0000, 0.3333]|
|
|
1181
|
+
+---------+-----+------------------------------------------+
|
|
1182
|
+
| Klein | 4 | [0.7500, 0.0000, 0.0000, 0.0000, 0.2500]|
|
|
1183
|
+
+---------+-----+------------------------------------------+
|
|
1184
|
+
| cyclic | 4 | [0.2500, 0.0000, 0.5000, 0.0000, 0.2500]|
|
|
1185
|
+
+---------+-----+------------------------------------------+
|
|
1186
|
+
| Klein | 4 | [0.7500, 0.0000, 0.0000, 0.0000, 0.2500]|
|
|
1187
|
+
+---------+-----+------------------------------------------+
|
|
1188
|
+
| cyclic | 5 | [0.0000, 0.0000, 0.0000, 0.0000, 1.000]|
|
|
1189
|
+
+---------+-----+------------------------------------------+
|
|
1190
|
+
| cyclic | 6 | [0.1667, 0.3333, 0.0000, 0.3333, 0.1667]|
|
|
1191
|
+
+---------+-----+------------------------------------------+
|
|
1192
|
+
| `S_3` | 6 | [0.5000, 0.3333, 0.0000, 0.0000, 0.1667]|
|
|
1193
|
+
+---------+-----+------------------------------------------+
|
|
1194
|
+
| `S_3` | 6 | [0.5000, 0.3333, 0.0000, 0.0000, 0.1667] |
|
|
1195
|
+
+---------+-----+------------------------------------------+
|
|
1196
|
+
| `D_4` | 8 | [0.6250, 0.0000, 0.2500, 0.0000, 0.1250]|
|
|
1197
|
+
+---------+-----+------------------------------------------+
|
|
1198
|
+
| `D_5` | 10 | [0.5000, 0.0000, 0.0000, 0.0000, 0.5000]|
|
|
1199
|
+
+---------+-----+------------------------------------------+
|
|
1200
|
+
| `A_4` | 12 | [0.2500, 0.6667, 0.0000, 0.0000, 0.08333]|
|
|
1201
|
+
+---------+-----+------------------------------------------+
|
|
1202
|
+
| `D_6` | 12 | [0.5833, 0.1667, 0.0000, 0.1667, 0.08333]|
|
|
1203
|
+
+---------+-----+------------------------------------------+
|
|
1204
|
+
| Borel | 20 | [0.2500, 0.0000, 0.5000, 0.0000, 0.2500]|
|
|
1205
|
+
+---------+-----+------------------------------------------+
|
|
1206
|
+
| `S_4` | 24 | [0.3750, 0.3333, 0.2500, 0.0000, 0.04167]|
|
|
1207
|
+
+---------+-----+------------------------------------------+
|
|
1208
|
+
| `PSL_2` | 60 | [0.2500, 0.3333, 0.0000, 0.0000, 0.4167]|
|
|
1209
|
+
+---------+-----+------------------------------------------+
|
|
1210
|
+
| `PGL_2` | 120| [0.2083, 0.1667, 0.2500, 0.1667, 0.2083] |
|
|
1211
|
+
+---------+-----+------------------------------------------+
|
|
1212
|
+
"""
|
|
1213
|
+
res = [0 for i in range(p)]
|
|
1214
|
+
co = 0
|
|
1215
|
+
ell = 1
|
|
1216
|
+
while ell <= bound:
|
|
1217
|
+
ell = arith.next_prime(ell)
|
|
1218
|
+
if ell != p and self._E.is_good(ell):
|
|
1219
|
+
d = (self._E.ap(ell)**2 * ell.inverse_mod(p)) % p
|
|
1220
|
+
res[d] += 1
|
|
1221
|
+
co += 1
|
|
1222
|
+
Rt = RealField(16)
|
|
1223
|
+
res = [Rt(x)/Rt(co) for x in res]
|
|
1224
|
+
return res
|
|
1225
|
+
|
|
1226
|
+
#####################################################################
|
|
1227
|
+
# classification of ell and p-adic reps
|
|
1228
|
+
#####################################################################
|
|
1229
|
+
|
|
1230
|
+
# ell-adic reps
|
|
1231
|
+
|
|
1232
|
+
def is_unramified(self, p, ell):
|
|
1233
|
+
r"""
|
|
1234
|
+
Return true if the Galois representation to `GL_2(\ZZ_p)` is unramified at `\ell`, i.e.
|
|
1235
|
+
if the inertia group at a place above `\ell` in `\text{Gal}(\bar\QQ/\QQ)` has trivial image in
|
|
1236
|
+
`GL_2(\ZZ_p)`.
|
|
1237
|
+
|
|
1238
|
+
For a Galois representation attached to an elliptic curve `E`, this
|
|
1239
|
+
returns ``True`` if `\ell\neq p` and `E` has good reduction at `\ell`.
|
|
1240
|
+
|
|
1241
|
+
INPUT:
|
|
1242
|
+
|
|
1243
|
+
- ``p`` -- a prime
|
|
1244
|
+
- ``ell`` -- another prime
|
|
1245
|
+
|
|
1246
|
+
OUTPUT: boolean
|
|
1247
|
+
|
|
1248
|
+
EXAMPLES::
|
|
1249
|
+
|
|
1250
|
+
sage: rho = EllipticCurve('20a3').galois_representation()
|
|
1251
|
+
sage: rho.is_unramified(5,7)
|
|
1252
|
+
True
|
|
1253
|
+
sage: rho.is_unramified(5,5)
|
|
1254
|
+
False
|
|
1255
|
+
sage: rho.is_unramified(7,5)
|
|
1256
|
+
False
|
|
1257
|
+
|
|
1258
|
+
This says that the 5-adic representation is unramified at 7, but the 7-adic representation is ramified at 5.
|
|
1259
|
+
"""
|
|
1260
|
+
if not arith.is_prime(p):
|
|
1261
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1262
|
+
if not arith.is_prime(ell):
|
|
1263
|
+
raise ValueError('ell (=%s) must be prime' % ell)
|
|
1264
|
+
return (ell != p) and self._E.has_good_reduction(ell)
|
|
1265
|
+
|
|
1266
|
+
def is_unipotent(self, p, ell):
|
|
1267
|
+
r"""
|
|
1268
|
+
Return true if the Galois representation to `GL_2(\ZZ_p)` is unipotent at `\ell\neq p`, i.e.
|
|
1269
|
+
if the inertia group at a place above `\ell` in `\text{Gal}(\bar\QQ/\QQ)` maps into a Borel subgroup.
|
|
1270
|
+
|
|
1271
|
+
For a Galois representation attached to an elliptic curve `E`, this returns ``True`` if
|
|
1272
|
+
`E` has semi-stable reduction at `\ell`.
|
|
1273
|
+
|
|
1274
|
+
INPUT:
|
|
1275
|
+
|
|
1276
|
+
- ``p`` -- a prime
|
|
1277
|
+
- ``ell`` -- a different prime
|
|
1278
|
+
|
|
1279
|
+
OUTPUT: boolean
|
|
1280
|
+
|
|
1281
|
+
EXAMPLES::
|
|
1282
|
+
|
|
1283
|
+
sage: rho = EllipticCurve('120a1').galois_representation()
|
|
1284
|
+
sage: rho.is_unipotent(2,5)
|
|
1285
|
+
True
|
|
1286
|
+
sage: rho.is_unipotent(5,2)
|
|
1287
|
+
False
|
|
1288
|
+
sage: rho.is_unipotent(5,7)
|
|
1289
|
+
True
|
|
1290
|
+
sage: rho.is_unipotent(5,3)
|
|
1291
|
+
True
|
|
1292
|
+
sage: rho.is_unipotent(5,5)
|
|
1293
|
+
Traceback (most recent call last):
|
|
1294
|
+
...
|
|
1295
|
+
ValueError: unipotent is not defined for l = p, use semistable instead.
|
|
1296
|
+
"""
|
|
1297
|
+
if not arith.is_prime(p):
|
|
1298
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1299
|
+
if not arith.is_prime(ell):
|
|
1300
|
+
raise ValueError('ell (=%s) must be prime' % ell)
|
|
1301
|
+
if ell == p:
|
|
1302
|
+
raise ValueError("unipotent is not defined for l = p, use semistable instead.")
|
|
1303
|
+
return not self._E.has_additive_reduction(ell)
|
|
1304
|
+
|
|
1305
|
+
def is_quasi_unipotent(self, p, ell):
|
|
1306
|
+
r"""
|
|
1307
|
+
Return true if the Galois representation to `GL_2(\ZZ_p)` is quasi-unipotent at `\ell\neq p`, i.e. if there is a finite extension `K/\QQ` such that the inertia group at a place above `\ell` in `\text{Gal}(\bar\QQ/K)` maps into a Borel subgroup.
|
|
1308
|
+
|
|
1309
|
+
For a Galois representation attached to an elliptic curve `E`, this returns always True.
|
|
1310
|
+
|
|
1311
|
+
INPUT:
|
|
1312
|
+
|
|
1313
|
+
- ``p`` -- a prime
|
|
1314
|
+
- ``ell`` -- a different prime
|
|
1315
|
+
|
|
1316
|
+
OUTPUT: boolean
|
|
1317
|
+
|
|
1318
|
+
EXAMPLES::
|
|
1319
|
+
|
|
1320
|
+
sage: rho = EllipticCurve('11a3').galois_representation()
|
|
1321
|
+
sage: rho.is_quasi_unipotent(11,13)
|
|
1322
|
+
True
|
|
1323
|
+
"""
|
|
1324
|
+
if not arith.is_prime(p):
|
|
1325
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1326
|
+
if not arith.is_prime(ell):
|
|
1327
|
+
raise ValueError('ell (=%s) must be prime' % ell)
|
|
1328
|
+
if ell == p:
|
|
1329
|
+
raise ValueError("quasi unipotent is not defined for l = p, use semistable instead.")
|
|
1330
|
+
return True
|
|
1331
|
+
|
|
1332
|
+
# p-adic reps
|
|
1333
|
+
|
|
1334
|
+
def is_ordinary(self, p):
|
|
1335
|
+
r"""
|
|
1336
|
+
Return true if the `p`-adic Galois representation to `GL_2(\ZZ_p)` is ordinary, i.e.
|
|
1337
|
+
if the image of the decomposition group in `\text{Gal}(\bar\QQ/\QQ)` above he prime `p` maps into
|
|
1338
|
+
a Borel subgroup.
|
|
1339
|
+
|
|
1340
|
+
For an elliptic curve `E`, this is to ask whether `E` is ordinary at `p`, i.e. good ordinary or multiplicative.
|
|
1341
|
+
|
|
1342
|
+
INPUT:
|
|
1343
|
+
|
|
1344
|
+
- ``p`` -- a prime
|
|
1345
|
+
|
|
1346
|
+
OUTPUT: boolean
|
|
1347
|
+
|
|
1348
|
+
EXAMPLES::
|
|
1349
|
+
|
|
1350
|
+
sage: rho = EllipticCurve('11a3').galois_representation()
|
|
1351
|
+
sage: rho.is_ordinary(11)
|
|
1352
|
+
True
|
|
1353
|
+
sage: rho.is_ordinary(5)
|
|
1354
|
+
True
|
|
1355
|
+
sage: rho.is_ordinary(19)
|
|
1356
|
+
False
|
|
1357
|
+
"""
|
|
1358
|
+
if not arith.is_prime(p):
|
|
1359
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1360
|
+
if self._E.has_additive_reduction(p):
|
|
1361
|
+
raise NotImplementedError('is_ordinary is only implemented for semi-stable representations')
|
|
1362
|
+
return self._E.has_multiplicative_reduction(p) or (self._E.has_good_reduction(p) and self._E.ap(p) % p != 0)
|
|
1363
|
+
|
|
1364
|
+
def is_crystalline(self, p):
|
|
1365
|
+
r"""
|
|
1366
|
+
Return true is the `p`-adic Galois representation to `GL_2(\ZZ_p)` is crystalline.
|
|
1367
|
+
|
|
1368
|
+
For an elliptic curve `E`, this is to ask whether `E` has good reduction at `p`.
|
|
1369
|
+
|
|
1370
|
+
INPUT:
|
|
1371
|
+
|
|
1372
|
+
- ``p`` -- a prime
|
|
1373
|
+
|
|
1374
|
+
OUTPUT: boolean
|
|
1375
|
+
|
|
1376
|
+
EXAMPLES::
|
|
1377
|
+
|
|
1378
|
+
sage: rho = EllipticCurve('64a1').galois_representation()
|
|
1379
|
+
sage: rho.is_crystalline(5)
|
|
1380
|
+
True
|
|
1381
|
+
sage: rho.is_crystalline(2)
|
|
1382
|
+
False
|
|
1383
|
+
"""
|
|
1384
|
+
if not arith.is_prime(p):
|
|
1385
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1386
|
+
return self._E.has_good_reduction(p)
|
|
1387
|
+
|
|
1388
|
+
def is_potentially_crystalline(self, p):
|
|
1389
|
+
r"""
|
|
1390
|
+
Return true is the `p`-adic Galois representation to `GL_2(\ZZ_p)` is potentially crystalline, i.e.
|
|
1391
|
+
if there is a finite extension `K/\QQ_p` such that the `p`-adic representation becomes crystalline.
|
|
1392
|
+
|
|
1393
|
+
For an elliptic curve `E`, this is to ask whether `E` has potentially good reduction at `p`.
|
|
1394
|
+
|
|
1395
|
+
INPUT:
|
|
1396
|
+
|
|
1397
|
+
- ``p`` -- a prime
|
|
1398
|
+
|
|
1399
|
+
OUTPUT: boolean
|
|
1400
|
+
|
|
1401
|
+
EXAMPLES::
|
|
1402
|
+
|
|
1403
|
+
sage: rho = EllipticCurve('37b1').galois_representation()
|
|
1404
|
+
sage: rho.is_potentially_crystalline(37)
|
|
1405
|
+
False
|
|
1406
|
+
sage: rho.is_potentially_crystalline(7)
|
|
1407
|
+
True
|
|
1408
|
+
"""
|
|
1409
|
+
if not arith.is_prime(p):
|
|
1410
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1411
|
+
return self._E.j_invariant().valuation(p) >= 0
|
|
1412
|
+
|
|
1413
|
+
def is_semistable(self, p):
|
|
1414
|
+
r"""
|
|
1415
|
+
Return true if the `p`-adic Galois representation to `GL_2(\ZZ_p)` is semistable.
|
|
1416
|
+
|
|
1417
|
+
For an elliptic curve `E`, this is to ask whether `E` has semistable reduction at `p`.
|
|
1418
|
+
|
|
1419
|
+
INPUT:
|
|
1420
|
+
|
|
1421
|
+
- ``p`` -- a prime
|
|
1422
|
+
|
|
1423
|
+
OUTPUT: boolean
|
|
1424
|
+
|
|
1425
|
+
EXAMPLES::
|
|
1426
|
+
|
|
1427
|
+
sage: rho = EllipticCurve('20a3').galois_representation()
|
|
1428
|
+
sage: rho.is_semistable(2)
|
|
1429
|
+
False
|
|
1430
|
+
sage: rho.is_semistable(3)
|
|
1431
|
+
True
|
|
1432
|
+
sage: rho.is_semistable(5)
|
|
1433
|
+
True
|
|
1434
|
+
"""
|
|
1435
|
+
if not arith.is_prime(p):
|
|
1436
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1437
|
+
return not self._E.has_additive_reduction(p)
|
|
1438
|
+
|
|
1439
|
+
def is_potentially_semistable(self, p):
|
|
1440
|
+
r"""
|
|
1441
|
+
Return true if the `p`-adic Galois representation to `GL_2(\ZZ_p)` is potentially semistable.
|
|
1442
|
+
|
|
1443
|
+
For an elliptic curve `E`, this returns ``True`` always
|
|
1444
|
+
|
|
1445
|
+
INPUT:
|
|
1446
|
+
|
|
1447
|
+
- ``p`` -- a prime
|
|
1448
|
+
|
|
1449
|
+
OUTPUT: boolean
|
|
1450
|
+
|
|
1451
|
+
EXAMPLES::
|
|
1452
|
+
|
|
1453
|
+
sage: rho = EllipticCurve('27a2').galois_representation()
|
|
1454
|
+
sage: rho.is_potentially_semistable(3)
|
|
1455
|
+
True
|
|
1456
|
+
"""
|
|
1457
|
+
if not arith.is_prime(p):
|
|
1458
|
+
raise ValueError('p (=%s) must be prime' % p)
|
|
1459
|
+
return True
|