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,459 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ r"""
3
+ Elliptic curves with prescribed good reduction
4
+
5
+ Construction of elliptic curves with good reduction outside a finite
6
+ set of primes
7
+
8
+ A theorem of Shafarevich states that, over a number field `K`, given
9
+ any finite set `S` of primes of `K`, there are (up to isomorphism)
10
+ only a finite set of elliptic curves defined over `K` with good
11
+ reduction at all primes outside `S`. An explicit form of the theorem
12
+ with an algorithm for finding this finite set was given in "Finding
13
+ all elliptic curves with good reduction outside a given set of primes"
14
+ by John Cremona and Mark Lingham, Experimental Mathematics 16 No.3
15
+ (2007), 303-312. The method requires computation of the class and
16
+ unit groups of `K` as well as all the `S`-integral points on a
17
+ collection of auxiliary elliptic curves defined over `K`.
18
+
19
+ This implementation (April 2009) is only for the case `K=\QQ`, where in
20
+ many cases the determination of the necessary sets of `S`-integral
21
+ points is possible. The main user-level function is
22
+ :func:`EllipticCurves_with_good_reduction_outside_S`, defined in
23
+ constructor.py. Users should note carefully the following points:
24
+
25
+ (1) the number of auxiliary curves to be considered is exponential in
26
+ the size of `S` (specifically, `2.6^s` where `s=|S|`).
27
+
28
+ (2) For some of the auxiliary curves it is impossible at present to
29
+ provably find all the `S`-integral points using the current
30
+ algorithms, which rely on first finding a basis for their Mordell-Weil
31
+ groups using 2-descent. A warning is output in cases where the set of
32
+ points (and hence the final output) is not guaranteed to be complete.
33
+ Using the ``proof=False`` flag suppresses these warnings.
34
+
35
+ EXAMPLES: We find all elliptic curves with good reduction outside 2,
36
+ listing the label of each::
37
+
38
+ sage: [e.label() for e in EllipticCurves_with_good_reduction_outside_S([2])] # long time (5s on sage.math, 2013)
39
+ ['32a1',
40
+ '32a2',
41
+ '32a3',
42
+ '32a4',
43
+ '64a1',
44
+ '64a2',
45
+ '64a3',
46
+ '64a4',
47
+ '128a1',
48
+ '128a2',
49
+ '128b1',
50
+ '128b2',
51
+ '128c1',
52
+ '128c2',
53
+ '128d1',
54
+ '128d2',
55
+ '256a1',
56
+ '256a2',
57
+ '256b1',
58
+ '256b2',
59
+ '256c1',
60
+ '256c2',
61
+ '256d1',
62
+ '256d2']
63
+
64
+ Secondly we try the same with `S={11}`; note that warning messages are
65
+ printed without ``proof=False`` (unless the optional database is
66
+ installed: two of the auxiliary curves whose Mordell-Weil bases are
67
+ required have conductors 13068 and 52272 so are in the database)::
68
+
69
+ sage: [e.label() for e in EllipticCurves_with_good_reduction_outside_S([11], proof=False)] # long time (13s on sage.math, 2011)
70
+ ['11a1', '11a2', '11a3', '121a1', '121a2', '121b1', '121b2', '121c1', '121c2', '121d1', '121d2', '121d3']
71
+
72
+ AUTHORS:
73
+
74
+ - John Cremona (6 April 2009): initial version (over `\QQ` only).
75
+ """
76
+
77
+ # ****************************************************************************
78
+ # Copyright (C) 2009 John Cremona <john.cremona@gmail.com>
79
+ #
80
+ # Distributed under the terms of the GNU General Public License (GPL)
81
+ #
82
+ # This code is distributed in the hope that it will be useful,
83
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
84
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
85
+ # General Public License for more details.
86
+ #
87
+ # The full text of the GPL is available at:
88
+ #
89
+ # https://www.gnu.org/licenses/
90
+ # ****************************************************************************
91
+
92
+ from sage.misc.mrange import xmrange
93
+ from sage.rings.rational_field import QQ
94
+ from .constructor import EllipticCurve, EllipticCurve_from_j
95
+
96
+
97
+ def is_possible_j(j, S=[]):
98
+ r"""
99
+ Test if the rational `j` is a possible `j`-invariant of an
100
+ elliptic curve with good reduction outside `S`.
101
+
102
+ .. NOTE::
103
+
104
+ The condition used is necessary but not sufficient unless S
105
+ contains both 2 and 3.
106
+
107
+ EXAMPLES::
108
+
109
+ sage: from sage.schemes.elliptic_curves.ell_egros import is_possible_j
110
+ sage: is_possible_j(0,[])
111
+ False
112
+ sage: is_possible_j(1728,[])
113
+ True
114
+ sage: is_possible_j(-4096/11,[11])
115
+ True
116
+ """
117
+ j = QQ(j)
118
+ return (j.is_zero() and 3 in S) or (j == 1728) \
119
+ or (j.is_S_integral(S) and j.prime_to_S_part(S).is_nth_power(3)
120
+ and (j - 1728).prime_to_S_part(S).abs().is_square())
121
+
122
+
123
+ def curve_key(E1):
124
+ r"""
125
+ Comparison key for elliptic curves over `\QQ`.
126
+
127
+ The key is a tuple:
128
+
129
+ - if the curve is in the database: (conductor, 0, label, number)
130
+
131
+ - otherwise: (conductor, 1, a_invariants)
132
+
133
+ EXAMPLES::
134
+
135
+ sage: from sage.schemes.elliptic_curves.ell_egros import curve_key
136
+ sage: E = EllipticCurve_from_j(1728)
137
+ sage: curve_key(E)
138
+ (32, 0, 0, 2)
139
+ sage: E = EllipticCurve_from_j(1729)
140
+ sage: curve_key(E)
141
+ (2989441, 1, (1, 0, 0, -36, -1))
142
+ """
143
+ try:
144
+ from sage.databases.cremona import parse_cremona_label, class_to_int
145
+ N, l, k = parse_cremona_label(E1.label())
146
+ return (N, 0, class_to_int(l), k)
147
+ except LookupError:
148
+ return (E1.conductor(), 1, E1.ainvs())
149
+
150
+
151
+ def egros_from_j_1728(S=[]):
152
+ r"""
153
+ Given a list of primes S, returns a list of elliptic curves over `\QQ`
154
+ with j-invariant 1728 and good reduction outside S, by checking
155
+ all relevant quartic twists.
156
+
157
+ INPUT:
158
+
159
+ - ``S`` -- list of primes (default: empty list)
160
+
161
+ .. NOTE::
162
+
163
+ Primality of elements of S is not checked, and the output
164
+ is undefined if S is not a list or contains non-primes.
165
+
166
+ OUTPUT:
167
+
168
+ A sorted list of all elliptic curves defined over `\QQ` with
169
+ `j`-invariant equal to `1728` and with good reduction at
170
+ all primes outside the list ``S``.
171
+
172
+ EXAMPLES::
173
+
174
+ sage: from sage.schemes.elliptic_curves.ell_egros import egros_from_j_1728
175
+ sage: egros_from_j_1728([])
176
+ []
177
+ sage: egros_from_j_1728([3])
178
+ []
179
+ sage: [e.cremona_label() for e in egros_from_j_1728([2])]
180
+ ['32a1', '32a2', '64a1', '64a4', '256b1', '256b2', '256c1', '256c2']
181
+ """
182
+ Elist = []
183
+ no2 = 2 not in S
184
+ for ei in xmrange([2] + [4] * len(S)):
185
+ u = QQ.prod(p**e for p, e in zip([-1] + S, ei))
186
+ if no2:
187
+ u *= 4 # make sure 12|val(D,2)
188
+ Eu = EllipticCurve([0, 0, 0, u, 0]).minimal_model()
189
+ if Eu.has_good_reduction_outside_S(S):
190
+ Elist += [Eu]
191
+ Elist.sort(key=curve_key)
192
+ return Elist
193
+
194
+
195
+ def egros_from_j_0(S=[]):
196
+ r"""
197
+ Given a list of primes S, returns a list of elliptic curves over `\QQ`
198
+ with j-invariant 0 and good reduction outside S, by checking all
199
+ relevant sextic twists.
200
+
201
+ INPUT:
202
+
203
+ - ``S`` -- list of primes (default: empty list)
204
+
205
+ .. NOTE::
206
+
207
+ Primality of elements of S is not checked, and the output
208
+ is undefined if S is not a list or contains non-primes.
209
+
210
+ OUTPUT:
211
+
212
+ A sorted list of all elliptic curves defined over `\QQ` with
213
+ `j`-invariant equal to `0` and with good reduction at
214
+ all primes outside the list ``S``.
215
+
216
+ EXAMPLES::
217
+
218
+ sage: from sage.schemes.elliptic_curves.ell_egros import egros_from_j_0
219
+ sage: egros_from_j_0([])
220
+ []
221
+ sage: egros_from_j_0([2])
222
+ []
223
+ sage: [e.label() for e in egros_from_j_0([3])]
224
+ ['27a1', '27a3', '243a1', '243a2', '243b1', '243b2']
225
+ sage: len(egros_from_j_0([2,3,5])) # long time (8s on sage.math, 2013)
226
+ 432
227
+ """
228
+ Elist = []
229
+ if 3 not in S:
230
+ return Elist
231
+ no2 = 2 not in S
232
+ for ei in xmrange([2] + [6] * len(S)):
233
+ u = QQ.prod(p**e for p, e in zip([-1] + S, ei))
234
+ if no2:
235
+ u *= 16 # make sure 12|val(D,2)
236
+ Eu = EllipticCurve([0, 0, 0, 0, u]).minimal_model()
237
+ if Eu.has_good_reduction_outside_S(S):
238
+ Elist += [Eu]
239
+ Elist.sort(key=curve_key)
240
+ return Elist
241
+
242
+
243
+ def egros_from_j(j, S=[]):
244
+ r"""
245
+ Given a rational j and a list of primes S, returns a list of
246
+ elliptic curves over `\QQ` with j-invariant j and good reduction
247
+ outside S, by checking all relevant quadratic twists.
248
+
249
+ INPUT:
250
+
251
+ - ``j`` -- a rational number
252
+
253
+ - ``S`` -- list of primes (default: empty list)
254
+
255
+ .. NOTE::
256
+
257
+ Primality of elements of S is not checked, and the output
258
+ is undefined if S is not a list or contains non-primes.
259
+
260
+ OUTPUT:
261
+
262
+ A sorted list of all elliptic curves defined over `\QQ` with
263
+ `j`-invariant equal to `j` and with good reduction at
264
+ all primes outside the list ``S``.
265
+
266
+ EXAMPLES::
267
+
268
+ sage: from sage.schemes.elliptic_curves.ell_egros import egros_from_j
269
+ sage: [e.label() for e in egros_from_j(0,[3])]
270
+ ['27a1', '27a3', '243a1', '243a2', '243b1', '243b2']
271
+ sage: [e.label() for e in egros_from_j(1728,[2])]
272
+ ['32a1', '32a2', '64a1', '64a4', '256b1', '256b2', '256c1', '256c2']
273
+ sage: elist=egros_from_j(-4096/11,[11])
274
+ sage: [e.label() for e in elist]
275
+ ['11a3', '121d1']
276
+ """
277
+ if j == 1728:
278
+ return egros_from_j_1728(S)
279
+
280
+ if j == 0:
281
+ return egros_from_j_0(S)
282
+
283
+ # Now j != 0, 1728
284
+
285
+ E = EllipticCurve_from_j(j)
286
+ Elist = []
287
+
288
+ for ei in xmrange([2] * (1 + len(S))):
289
+ u = QQ.prod(p**e for p, e in zip(reversed([-1] + S), ei))
290
+ Eu = E.quadratic_twist(u).minimal_model()
291
+ if Eu.has_good_reduction_outside_S(S):
292
+ Elist += [Eu]
293
+
294
+ Elist.sort(key=curve_key)
295
+ return Elist
296
+
297
+
298
+ def egros_from_jlist(jlist, S=[]):
299
+ r"""
300
+ Given a list of rational j and a list of primes S, returns a list
301
+ of elliptic curves over `\QQ` with j-invariant in the list and good
302
+ reduction outside S.
303
+
304
+ INPUT:
305
+
306
+ - ``j`` -- list of rational numbers
307
+
308
+ - ``S`` -- list of primes (default: empty list)
309
+
310
+ .. NOTE::
311
+
312
+ Primality of elements of S is not checked, and the output
313
+ is undefined if S is not a list or contains non-primes.
314
+
315
+ OUTPUT:
316
+
317
+ A sorted list of all elliptic curves defined over `\QQ` with
318
+ `j`-invariant in the list ``jlist`` and with good reduction at
319
+ all primes outside the list ``S``.
320
+
321
+ EXAMPLES::
322
+
323
+ sage: # needs eclib sage.symbolic
324
+ sage: from sage.schemes.elliptic_curves.ell_egros import egros_get_j, egros_from_jlist
325
+ sage: jlist = egros_get_j([3])
326
+ sage: elist = egros_from_jlist(jlist,[3])
327
+ sage: [e.label() for e in elist]
328
+ ['27a1', '27a2', '27a3', '27a4', '243a1', '243a2', '243b1', '243b2']
329
+ sage: [e.ainvs() for e in elist]
330
+ [(0, 0, 1, 0, -7),
331
+ (0, 0, 1, -270, -1708),
332
+ (0, 0, 1, 0, 0),
333
+ (0, 0, 1, -30, 63),
334
+ (0, 0, 1, 0, -1),
335
+ (0, 0, 1, 0, 20),
336
+ (0, 0, 1, 0, 2),
337
+ (0, 0, 1, 0, -61)]
338
+ """
339
+ elist = [e for j in jlist for e in egros_from_j(j, S)]
340
+ elist.sort(key=curve_key)
341
+ return elist
342
+
343
+
344
+ def egros_get_j(S=[], proof=None, verbose=False):
345
+ r"""
346
+ Return a list of rational `j` such that all elliptic curves
347
+ defined over `\QQ` with good reduction outside `S` have
348
+ `j`-invariant in the list, sorted by height.
349
+
350
+ INPUT:
351
+
352
+ - ``S`` -- list of primes (default: empty list)
353
+
354
+ - ``proof`` -- boolean (default: ``True``); the MW basis for
355
+ auxiliary curves will be computed with this proof flag
356
+
357
+ - ``verbose`` -- boolean (default: ``False``); if ``True``, some
358
+ details of the computation will be output
359
+
360
+ .. NOTE::
361
+
362
+ Proof flag: The algorithm used requires determining all
363
+ S-integral points on several auxiliary curves, which in turn
364
+ requires the computation of their generators. This is not
365
+ always possible (even in theory) using current knowledge.
366
+
367
+ The value of this flag is passed to the function which
368
+ computes generators of various auxiliary elliptic curves, in
369
+ order to find their S-integral points. Set to ``False`` if the
370
+ default (``True``) causes warning messages, but note that you can
371
+ then not rely on the set of invariants returned being
372
+ complete.
373
+
374
+ EXAMPLES::
375
+
376
+ sage: # needs eclib
377
+ sage: from sage.schemes.elliptic_curves.ell_egros import egros_get_j
378
+ sage: egros_get_j([])
379
+ [1728]
380
+ sage: egros_get_j([2]) # long time (3s on sage.math, 2013)
381
+ [128, 432, -864, 1728, 3375/2, -3456, 6912, 8000, 10976, -35937/4, 287496, -784446336, -189613868625/128]
382
+ sage: egros_get_j([3]) # long time (3s on sage.math, 2013)
383
+ [0, -576, 1536, 1728, -5184, -13824, 21952/9, -41472, 140608/3, -12288000]
384
+ sage: jlist=egros_get_j([2,3]); len(jlist) # long time (30s)
385
+ 83
386
+ """
387
+ if not all(p.is_prime() for p in S):
388
+ raise ValueError("Elements of S must be prime.")
389
+
390
+ if proof is None:
391
+ from sage.structure.proof.proof import get_flag
392
+ proof = get_flag(proof, "elliptic_curve")
393
+ else:
394
+ proof = bool(proof)
395
+
396
+ if verbose:
397
+ import sys # so we can flush stdout for debugging
398
+
399
+ SS = [-1] + S
400
+
401
+ jlist = []
402
+ wcount = 0
403
+ nw = 6**len(S) * 2
404
+
405
+ if verbose:
406
+ print("Finding possible j invariants for S = ", S)
407
+ print("Using ", nw, " twists of base curve")
408
+ sys.stdout.flush()
409
+
410
+ for ei in xmrange([6] * len(S) + [2]):
411
+ w = QQ.prod(p**e for p, e in zip(reversed(SS), ei))
412
+ wcount += 1
413
+ if verbose:
414
+ print("Curve #", wcount, "/", nw, ":")
415
+ print("w = ", w, "=", w.factor())
416
+ sys.stdout.flush()
417
+ a6 = -1728 * w
418
+ E = EllipticCurve([0, 0, 0, 0, a6])
419
+ # This curve may not be minimal at 2 or 3, but the
420
+ # S-integral_points function requires minimality at primes in
421
+ # S, so we find a new model which is p-minimal at both 2 and 3
422
+ # if they are in S. Note that the isomorphism between models
423
+ # will preserve S-integrality of points.
424
+ E2 = E.local_minimal_model(2) if 2 in S else E
425
+ E23 = E2.local_minimal_model(3) if 3 in S else E2
426
+ urst = E23.isomorphism_to(E)
427
+
428
+ try:
429
+ pts = E23.S_integral_points(S, proof=proof)
430
+ except RuntimeError:
431
+ pts = []
432
+ print("Failed to find S-integral points on ", E23.ainvs())
433
+ if proof:
434
+ if verbose:
435
+ print("--trying again with proof=False")
436
+ sys.stdout.flush()
437
+ pts = E23.S_integral_points(S, proof=False)
438
+ if verbose:
439
+ print("--done")
440
+ if verbose:
441
+ print(len(pts), " S-integral points: ", pts)
442
+ sys.stdout.flush()
443
+ for P in pts:
444
+ P = urst(P)
445
+ x = P[0]
446
+ y = P[1]
447
+ j = x**3 / w
448
+ assert j - 1728 == y**2 / w
449
+ if is_possible_j(j, S):
450
+ if j not in jlist:
451
+ if verbose:
452
+ print("Adding possible j = ", j)
453
+ sys.stdout.flush()
454
+ jlist += [j]
455
+ else:
456
+ if verbose:
457
+ print("Discarding illegal j = ", j)
458
+ sys.stdout.flush()
459
+ return sorted(jlist, key=lambda j: j.height())