passagemath-schemes 10.6.47__cp312-cp312-macosx_13_0_arm64.whl

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