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.

Files changed (314) hide show
  1. passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
  2. passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
  3. passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
  4. passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
  5. passagemath_schemes/__init__.py +3 -0
  6. passagemath_schemes-10.6.40.dist-info/METADATA +204 -0
  7. passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
  8. passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
  9. passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.6.40.dist-info/top_level.txt +3 -0
  11. sage/all__sagemath_schemes.py +23 -0
  12. sage/databases/all__sagemath_schemes.py +7 -0
  13. sage/databases/cremona.py +1723 -0
  14. sage/dynamics/all__sagemath_schemes.py +2 -0
  15. sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
  16. sage/dynamics/arithmetic_dynamics/all.py +14 -0
  17. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
  18. sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
  19. sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
  20. sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
  21. sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
  22. sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
  23. sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +745 -0
  29. sage/lfunctions/pari.py +818 -0
  30. sage/lfunctions/zero_sums.cpython-314-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5135 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
  34. sage/modular/abvar/abvar_newform.py +244 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +186 -0
  37. sage/modular/abvar/cuspidal_subgroup.py +371 -0
  38. sage/modular/abvar/finite_subgroup.py +896 -0
  39. sage/modular/abvar/homology.py +720 -0
  40. sage/modular/abvar/homspace.py +998 -0
  41. sage/modular/abvar/lseries.py +415 -0
  42. sage/modular/abvar/morphism.py +935 -0
  43. sage/modular/abvar/torsion_point.py +274 -0
  44. sage/modular/abvar/torsion_subgroup.py +740 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1402 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +363 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +653 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1469 -0
  57. sage/modular/arithgroup/congroup_generic.py +628 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +267 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1066 -0
  61. sage/modular/arithgroup/tests.py +418 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3753 -0
  64. sage/modular/btquotients/pautomorphicform.py +2570 -0
  65. sage/modular/buzzard.py +100 -0
  66. sage/modular/congroup.py +29 -0
  67. sage/modular/congroup_element.py +13 -0
  68. sage/modular/cusps.py +1109 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +569 -0
  71. sage/modular/dirichlet.py +3310 -0
  72. sage/modular/drinfeld_modform/all.py +2 -0
  73. sage/modular/drinfeld_modform/element.py +446 -0
  74. sage/modular/drinfeld_modform/ring.py +773 -0
  75. sage/modular/drinfeld_modform/tutorial.py +236 -0
  76. sage/modular/etaproducts.py +1065 -0
  77. sage/modular/hecke/algebra.py +746 -0
  78. sage/modular/hecke/all.py +20 -0
  79. sage/modular/hecke/ambient_module.py +1019 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +325 -0
  82. sage/modular/hecke/hecke_operator.py +780 -0
  83. sage/modular/hecke/homspace.py +206 -0
  84. sage/modular/hecke/module.py +1767 -0
  85. sage/modular/hecke/morphism.py +174 -0
  86. sage/modular/hecke/submodule.py +989 -0
  87. sage/modular/hypergeometric_misc.cpython-314-darwin.so +0 -0
  88. sage/modular/hypergeometric_misc.pxd +4 -0
  89. sage/modular/hypergeometric_misc.pyx +166 -0
  90. sage/modular/hypergeometric_motive.py +2017 -0
  91. sage/modular/local_comp/all.py +2 -0
  92. sage/modular/local_comp/liftings.py +292 -0
  93. sage/modular/local_comp/local_comp.py +1071 -0
  94. sage/modular/local_comp/smoothchar.py +1825 -0
  95. sage/modular/local_comp/type_space.py +748 -0
  96. sage/modular/modform/all.py +30 -0
  97. sage/modular/modform/ambient.py +815 -0
  98. sage/modular/modform/ambient_R.py +177 -0
  99. sage/modular/modform/ambient_eps.py +306 -0
  100. sage/modular/modform/ambient_g0.py +124 -0
  101. sage/modular/modform/ambient_g1.py +204 -0
  102. sage/modular/modform/constructor.py +545 -0
  103. sage/modular/modform/cuspidal_submodule.py +708 -0
  104. sage/modular/modform/defaults.py +14 -0
  105. sage/modular/modform/eis_series.py +505 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4131 -0
  108. sage/modular/modform/find_generators.py +59 -0
  109. sage/modular/modform/half_integral.py +154 -0
  110. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  111. sage/modular/modform/j_invariant.py +47 -0
  112. sage/modular/modform/l_series_gross_zagier.py +133 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314-darwin.so +0 -0
  114. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  115. sage/modular/modform/notes.py +45 -0
  116. sage/modular/modform/numerical.py +514 -0
  117. sage/modular/modform/periods.py +14 -0
  118. sage/modular/modform/ring.py +1257 -0
  119. sage/modular/modform/space.py +1860 -0
  120. sage/modular/modform/submodule.py +118 -0
  121. sage/modular/modform/tests.py +64 -0
  122. sage/modular/modform/theta.py +110 -0
  123. sage/modular/modform/vm_basis.py +381 -0
  124. sage/modular/modform/weight1.py +220 -0
  125. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  126. sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
  127. sage/modular/modform_hecketriangle/all.py +30 -0
  128. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  129. sage/modular/modform_hecketriangle/constructor.py +416 -0
  130. sage/modular/modform_hecketriangle/element.py +351 -0
  131. sage/modular/modform_hecketriangle/functors.py +752 -0
  132. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  133. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
  135. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
  136. sage/modular/modform_hecketriangle/readme.py +1214 -0
  137. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  138. sage/modular/modform_hecketriangle/space.py +1037 -0
  139. sage/modular/modform_hecketriangle/subspace.py +423 -0
  140. sage/modular/modsym/all.py +17 -0
  141. sage/modular/modsym/ambient.py +3846 -0
  142. sage/modular/modsym/boundary.py +1420 -0
  143. sage/modular/modsym/element.py +336 -0
  144. sage/modular/modsym/g1list.py +178 -0
  145. sage/modular/modsym/ghlist.py +182 -0
  146. sage/modular/modsym/hecke_operator.py +73 -0
  147. sage/modular/modsym/manin_symbol.cpython-314-darwin.so +0 -0
  148. sage/modular/modsym/manin_symbol.pxd +5 -0
  149. sage/modular/modsym/manin_symbol.pyx +497 -0
  150. sage/modular/modsym/manin_symbol_list.py +1295 -0
  151. sage/modular/modsym/modsym.py +400 -0
  152. sage/modular/modsym/modular_symbols.py +384 -0
  153. sage/modular/modsym/p1list.cpython-314-darwin.so +0 -0
  154. sage/modular/modsym/p1list.pxd +29 -0
  155. sage/modular/modsym/p1list.pyx +1372 -0
  156. sage/modular/modsym/p1list_nf.py +1241 -0
  157. sage/modular/modsym/relation_matrix.py +591 -0
  158. sage/modular/modsym/relation_matrix_pyx.cpython-314-darwin.so +0 -0
  159. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  160. sage/modular/modsym/space.py +2468 -0
  161. sage/modular/modsym/subspace.py +455 -0
  162. sage/modular/modsym/tests.py +375 -0
  163. sage/modular/multiple_zeta.py +2632 -0
  164. sage/modular/multiple_zeta_F_algebra.py +786 -0
  165. sage/modular/overconvergent/all.py +6 -0
  166. sage/modular/overconvergent/genus0.py +1878 -0
  167. sage/modular/overconvergent/hecke_series.py +1187 -0
  168. sage/modular/overconvergent/weightspace.py +778 -0
  169. sage/modular/pollack_stevens/all.py +4 -0
  170. sage/modular/pollack_stevens/distributions.py +874 -0
  171. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  172. sage/modular/pollack_stevens/manin_map.py +859 -0
  173. sage/modular/pollack_stevens/modsym.py +1593 -0
  174. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  175. sage/modular/pollack_stevens/sigma0.py +534 -0
  176. sage/modular/pollack_stevens/space.py +1076 -0
  177. sage/modular/quasimodform/all.py +3 -0
  178. sage/modular/quasimodform/element.py +845 -0
  179. sage/modular/quasimodform/ring.py +828 -0
  180. sage/modular/quatalg/all.py +3 -0
  181. sage/modular/quatalg/brandt.py +1642 -0
  182. sage/modular/ssmod/all.py +8 -0
  183. sage/modular/ssmod/ssmod.py +827 -0
  184. sage/rings/all__sagemath_schemes.py +1 -0
  185. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  186. sage/rings/polynomial/binary_form_reduce.py +585 -0
  187. sage/schemes/all.py +41 -0
  188. sage/schemes/berkovich/all.py +6 -0
  189. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  190. sage/schemes/berkovich/berkovich_space.py +748 -0
  191. sage/schemes/curves/affine_curve.py +2928 -0
  192. sage/schemes/curves/all.py +33 -0
  193. sage/schemes/curves/closed_point.py +434 -0
  194. sage/schemes/curves/constructor.py +381 -0
  195. sage/schemes/curves/curve.py +542 -0
  196. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  197. sage/schemes/curves/point.py +463 -0
  198. sage/schemes/curves/projective_curve.py +3026 -0
  199. sage/schemes/curves/zariski_vankampen.py +1932 -0
  200. sage/schemes/cyclic_covers/all.py +2 -0
  201. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  202. sage/schemes/cyclic_covers/constructor.py +137 -0
  203. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  204. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  205. sage/schemes/elliptic_curves/BSD.py +1036 -0
  206. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  207. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  208. sage/schemes/elliptic_curves/all.py +49 -0
  209. sage/schemes/elliptic_curves/cardinality.py +609 -0
  210. sage/schemes/elliptic_curves/cm.py +1102 -0
  211. sage/schemes/elliptic_curves/constructor.py +1552 -0
  212. sage/schemes/elliptic_curves/ec_database.py +175 -0
  213. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
  214. sage/schemes/elliptic_curves/ell_egros.py +459 -0
  215. sage/schemes/elliptic_curves/ell_field.py +2836 -0
  216. sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
  217. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  218. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  219. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  220. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  221. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  222. sage/schemes/elliptic_curves/ell_point.py +4787 -0
  223. sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
  224. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  225. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  226. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  227. sage/schemes/elliptic_curves/formal_group.py +760 -0
  228. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  229. sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
  230. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  231. sage/schemes/elliptic_curves/heegner.py +7335 -0
  232. sage/schemes/elliptic_curves/height.py +2109 -0
  233. sage/schemes/elliptic_curves/hom.py +1406 -0
  234. sage/schemes/elliptic_curves/hom_composite.py +934 -0
  235. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  236. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  237. sage/schemes/elliptic_curves/hom_sum.py +682 -0
  238. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  239. sage/schemes/elliptic_curves/homset.py +271 -0
  240. sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
  241. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  242. sage/schemes/elliptic_curves/jacobian.py +237 -0
  243. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  244. sage/schemes/elliptic_curves/kraus.py +1014 -0
  245. sage/schemes/elliptic_curves/lseries_ell.py +943 -0
  246. sage/schemes/elliptic_curves/mod5family.py +105 -0
  247. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  248. sage/schemes/elliptic_curves/mod_sym_num.cpython-314-darwin.so +0 -0
  249. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  250. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  251. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  252. sage/schemes/elliptic_curves/padics.py +1816 -0
  253. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  254. sage/schemes/elliptic_curves/period_lattice_region.cpython-314-darwin.so +0 -0
  255. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  256. sage/schemes/elliptic_curves/saturation.py +715 -0
  257. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  258. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  259. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  260. sage/schemes/hyperelliptic_curves/all.py +6 -0
  261. sage/schemes/hyperelliptic_curves/constructor.py +291 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
  265. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  266. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  267. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
  271. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  272. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
  273. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  274. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  275. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
  276. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  277. sage/schemes/jacobians/all.py +2 -0
  278. sage/schemes/overview.py +161 -0
  279. sage/schemes/plane_conics/all.py +22 -0
  280. sage/schemes/plane_conics/con_field.py +1296 -0
  281. sage/schemes/plane_conics/con_finite_field.py +158 -0
  282. sage/schemes/plane_conics/con_number_field.py +456 -0
  283. sage/schemes/plane_conics/con_rational_field.py +406 -0
  284. sage/schemes/plane_conics/con_rational_function_field.py +580 -0
  285. sage/schemes/plane_conics/constructor.py +249 -0
  286. sage/schemes/plane_quartics/all.py +2 -0
  287. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  288. sage/schemes/plane_quartics/quartic_generic.py +73 -0
  289. sage/schemes/riemann_surfaces/all.py +1 -0
  290. sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
  291. sage_wheels/share/cremona/cremona_mini.db +0 -0
  292. sage_wheels/share/ellcurves/rank0 +30427 -0
  293. sage_wheels/share/ellcurves/rank1 +31871 -0
  294. sage_wheels/share/ellcurves/rank10 +6 -0
  295. sage_wheels/share/ellcurves/rank11 +6 -0
  296. sage_wheels/share/ellcurves/rank12 +1 -0
  297. sage_wheels/share/ellcurves/rank14 +1 -0
  298. sage_wheels/share/ellcurves/rank15 +1 -0
  299. sage_wheels/share/ellcurves/rank17 +1 -0
  300. sage_wheels/share/ellcurves/rank19 +1 -0
  301. sage_wheels/share/ellcurves/rank2 +2388 -0
  302. sage_wheels/share/ellcurves/rank20 +1 -0
  303. sage_wheels/share/ellcurves/rank21 +1 -0
  304. sage_wheels/share/ellcurves/rank22 +1 -0
  305. sage_wheels/share/ellcurves/rank23 +1 -0
  306. sage_wheels/share/ellcurves/rank24 +1 -0
  307. sage_wheels/share/ellcurves/rank28 +1 -0
  308. sage_wheels/share/ellcurves/rank3 +836 -0
  309. sage_wheels/share/ellcurves/rank4 +10 -0
  310. sage_wheels/share/ellcurves/rank5 +5 -0
  311. sage_wheels/share/ellcurves/rank6 +5 -0
  312. sage_wheels/share/ellcurves/rank7 +5 -0
  313. sage_wheels/share/ellcurves/rank8 +6 -0
  314. 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