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,436 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ r"""
3
+ Torsion subgroups of elliptic curves over number fields (including `\QQ`)
4
+
5
+ AUTHORS:
6
+
7
+ - Nick Alexander: original implementation over `\QQ`
8
+ - Chris Wuthrich: original implementation over number fields
9
+ - John Cremona: rewrote p-primary part to use division
10
+ polynomials, added some features, unified Number Field and `\QQ` code.
11
+ """
12
+
13
+ # ****************************************************************************
14
+ # Copyright (C) 2005 William Stein <wstein@gmail.com>
15
+ #
16
+ # Distributed under the terms of the GNU General Public License (GPL)
17
+ #
18
+ # This code is distributed in the hope that it will be useful,
19
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ # General Public License for more details.
22
+ #
23
+ # The full text of the GPL is available at:
24
+ #
25
+ # https://www.gnu.org/licenses/
26
+ # ****************************************************************************
27
+
28
+ from sage.misc.cachefunc import cached_method
29
+ from sage.rings.rational_field import RationalField
30
+ import sage.groups.additive_abelian.additive_abelian_wrapper as groups
31
+ from sage.structure.richcmp import richcmp_method, richcmp
32
+
33
+
34
+ @richcmp_method
35
+ class EllipticCurveTorsionSubgroup(groups.AdditiveAbelianGroupWrapper):
36
+ r"""
37
+ The torsion subgroup of an elliptic curve over a number field.
38
+
39
+ EXAMPLES:
40
+
41
+ Examples over `\QQ`::
42
+
43
+ sage: E = EllipticCurve([-4, 0]); E
44
+ Elliptic Curve defined by y^2 = x^3 - 4*x over Rational Field
45
+ sage: G = E.torsion_subgroup(); G
46
+ Torsion Subgroup isomorphic to Z/2 + Z/2 associated to the
47
+ Elliptic Curve defined by y^2 = x^3 - 4*x over Rational Field
48
+ sage: G.order()
49
+ 4
50
+ sage: G.gen(0)
51
+ (-2 : 0 : 1)
52
+ sage: G.gen(1)
53
+ (0 : 0 : 1)
54
+ sage: G.ngens()
55
+ 2
56
+
57
+ ::
58
+
59
+ sage: E = EllipticCurve([17, -120, -60, 0, 0]); E
60
+ Elliptic Curve defined by y^2 + 17*x*y - 60*y = x^3 - 120*x^2 over Rational Field
61
+ sage: G = E.torsion_subgroup(); G
62
+ Torsion Subgroup isomorphic to Trivial group associated to the
63
+ Elliptic Curve defined by y^2 + 17*x*y - 60*y = x^3 - 120*x^2 over Rational Field
64
+ sage: G.gens()
65
+ ()
66
+ sage: e = EllipticCurve([0, 33076156654533652066609946884, 0,
67
+ ....: 347897536144342179642120321790729023127716119338758604800,
68
+ ....: 1141128154369274295519023032806804247788154621049857648870032370285851781352816640000])
69
+ sage: e.torsion_order()
70
+ 16
71
+
72
+ Constructing points from the torsion subgroup::
73
+
74
+ sage: E = EllipticCurve('14a1')
75
+ sage: T = E.torsion_subgroup()
76
+ sage: [E(t) for t in T]
77
+ [(0 : 1 : 0),
78
+ (9 : 23 : 1),
79
+ (2 : 2 : 1),
80
+ (1 : -1 : 1),
81
+ (2 : -5 : 1),
82
+ (9 : -33 : 1)]
83
+
84
+ An example where the torsion subgroup is not cyclic::
85
+
86
+ sage: E = EllipticCurve([0,0,0,-49,0])
87
+ sage: T = E.torsion_subgroup()
88
+ sage: [E(t) for t in T]
89
+ [(0 : 1 : 0), (0 : 0 : 1), (-7 : 0 : 1), (7 : 0 : 1)]
90
+
91
+ An example where the torsion subgroup is trivial::
92
+
93
+ sage: E = EllipticCurve('37a1')
94
+ sage: T = E.torsion_subgroup()
95
+ sage: T
96
+ Torsion Subgroup isomorphic to Trivial group associated to the
97
+ Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
98
+ sage: [E(t) for t in T]
99
+ [(0 : 1 : 0)]
100
+
101
+ Examples over other Number Fields::
102
+
103
+ sage: # needs sage.rings.number_field
104
+ sage: E = EllipticCurve('11a1')
105
+ sage: x = polygen(ZZ, 'x')
106
+ sage: K.<i> = NumberField(x^2 + 1)
107
+ sage: EK = E.change_ring(K)
108
+ sage: from sage.schemes.elliptic_curves.ell_torsion import EllipticCurveTorsionSubgroup
109
+ sage: EllipticCurveTorsionSubgroup(EK)
110
+ Torsion Subgroup isomorphic to Z/5 associated to the
111
+ Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20)
112
+ over Number Field in i with defining polynomial x^2 + 1
113
+
114
+ sage: E = EllipticCurve('11a1')
115
+ sage: K.<i> = NumberField(x^2 + 1) # needs sage.rings.number_field
116
+ sage: EK = E.change_ring(K) # needs sage.rings.number_field
117
+ sage: T = EK.torsion_subgroup() # needs sage.rings.number_field
118
+ sage: T.ngens()
119
+ 1
120
+ sage: T.gen(0)
121
+ (5 : -6 : 1)
122
+
123
+ Note: this class is normally constructed indirectly as follows::
124
+
125
+ sage: # needs sage.rings.number_field
126
+ sage: T = EK.torsion_subgroup(); T
127
+ Torsion Subgroup isomorphic to Z/5 associated to the
128
+ Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20)
129
+ over Number Field in i with defining polynomial x^2 + 1
130
+ sage: type(T)
131
+ <class 'sage.schemes.elliptic_curves.ell_torsion.EllipticCurveTorsionSubgroup_with_category'>
132
+
133
+ AUTHORS:
134
+
135
+ - Nick Alexander: initial implementation over `\QQ`.
136
+ - Chris Wuthrich: initial implementation over number fields.
137
+ - John Cremona: additional features and unification.
138
+ """
139
+ def __init__(self, E):
140
+ r"""
141
+ Initialization function for EllipticCurveTorsionSubgroup class.
142
+
143
+ INPUT:
144
+
145
+ - ``E`` -- an elliptic curve defined over a number field (including `\QQ`)
146
+
147
+ EXAMPLES::
148
+
149
+ sage: from sage.schemes.elliptic_curves.ell_torsion import EllipticCurveTorsionSubgroup
150
+ sage: E = EllipticCurve('11a1')
151
+ sage: x = polygen(ZZ, 'x')
152
+ sage: K.<i> = NumberField(x^2 + 1) # needs sage.rings.number_field
153
+ sage: EK = E.change_ring(K) # needs sage.rings.number_field
154
+ sage: EllipticCurveTorsionSubgroup(EK) # needs sage.rings.number_field
155
+ Torsion Subgroup isomorphic to Z/5 associated to the
156
+ Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20)
157
+ over Number Field in i with defining polynomial x^2 + 1
158
+
159
+ Note: this class is normally constructed indirectly as follows::
160
+
161
+ sage: T = EK.torsion_subgroup(); T # needs sage.rings.number_field
162
+ Torsion Subgroup isomorphic to Z/5 associated to the
163
+ Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20)
164
+ over Number Field in i with defining polynomial x^2 + 1
165
+ sage: type(T) # needs sage.rings.number_field
166
+ <class 'sage.schemes.elliptic_curves.ell_torsion.EllipticCurveTorsionSubgroup_with_category'>
167
+
168
+ sage: T == loads(dumps(T)) # known bug, see https://github.com/sagemath/sage/issues/11599#comment:7
169
+ True
170
+ """
171
+ self.__E = E
172
+ self.__K = E.base_field()
173
+
174
+ if self.__K is RationalField():
175
+ G = self.__E.pari_curve().elltors()
176
+ structure = G[1].sage()
177
+ gens = G[2].sage()
178
+
179
+ self.__torsion_gens = [self.__E(P) for P in gens]
180
+ groups.AdditiveAbelianGroupWrapper.__init__(self, self.__E(0).parent(), self.__torsion_gens, structure)
181
+ return
182
+
183
+ T1 = E(0) # these will be the two generators
184
+ T2 = E(0)
185
+ k1 = 1 # with their order
186
+ k2 = 1
187
+
188
+ # find a multiple of the order of the torsion group
189
+ bound = torsion_bound(E, number_of_places=20)
190
+
191
+ # now do prime by prime
192
+ for p, e in bound.factor():
193
+ ptor = E._p_primary_torsion_basis(p, e)
194
+ if ptor:
195
+ T1 += ptor[0][0]
196
+ k1 *= p**(ptor[0][1])
197
+ if len(ptor) > 1:
198
+ T2 += ptor[1][0]
199
+ k2 *= p**(ptor[1][1])
200
+
201
+ if k1 == 1:
202
+ structure = []
203
+ gens = []
204
+ elif k2 == 1:
205
+ structure = [k1]
206
+ gens = [T1]
207
+ else:
208
+ structure = [k1, k2]
209
+ gens = [T1, T2]
210
+
211
+ #self.__torsion_gens = gens
212
+ self._structure = structure
213
+ groups.AdditiveAbelianGroupWrapper.__init__(self, T1.parent(),
214
+ [T1, T2], structure)
215
+
216
+ def _repr_(self):
217
+ r"""
218
+ String representation of an instance of the EllipticCurveTorsionSubgroup class.
219
+
220
+ EXAMPLES::
221
+
222
+ sage: E = EllipticCurve('11a1')
223
+ sage: x = polygen(ZZ, 'x')
224
+ sage: K.<i> = NumberField(x^2 + 1) # needs sage.rings.number_field
225
+ sage: EK = E.change_ring(K) # needs sage.rings.number_field
226
+ sage: T = EK.torsion_subgroup(); T._repr_() # needs sage.rings.number_field
227
+ 'Torsion Subgroup isomorphic to Z/5 associated to the Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20) over Number Field in i with defining polynomial x^2 + 1'
228
+ """
229
+ return "Torsion Subgroup isomorphic to %s associated to the %s" % (self.short_name(), self.__E)
230
+
231
+ def __richcmp__(self, other, op):
232
+ r"""
233
+ Compare two torsion groups by simply comparing the elliptic curves.
234
+
235
+ EXAMPLES::
236
+
237
+ sage: E = EllipticCurve('37a1')
238
+ sage: tor = E.torsion_subgroup()
239
+ sage: tor == tor
240
+ True
241
+ """
242
+ if type(self) is not type(other):
243
+ return NotImplemented
244
+ return richcmp(self.__E, other.__E, op)
245
+
246
+ def curve(self):
247
+ r"""
248
+ Return the curve of this torsion subgroup.
249
+
250
+ EXAMPLES::
251
+
252
+ sage: # needs sage.rings.number_field
253
+ sage: E = EllipticCurve('11a1')
254
+ sage: x = polygen(ZZ, 'x')
255
+ sage: K.<i> = NumberField(x^2 + 1)
256
+ sage: EK = E.change_ring(K)
257
+ sage: T = EK.torsion_subgroup()
258
+ sage: T.curve() is EK
259
+ True
260
+ """
261
+ return self.__E
262
+
263
+ @cached_method
264
+ def points(self):
265
+ r"""
266
+ Return a list of all the points in this torsion subgroup.
267
+
268
+ The list is cached.
269
+
270
+ EXAMPLES::
271
+
272
+ sage: # needs sage.rings.number_field
273
+ sage: x = polygen(ZZ, 'x')
274
+ sage: K.<i> = NumberField(x^2 + 1)
275
+ sage: E = EllipticCurve(K, [0,0,0,1,0])
276
+ sage: tor = E.torsion_subgroup()
277
+ sage: tor.points()
278
+ [(0 : 1 : 0), (0 : 0 : 1), (-i : 0 : 1), (i : 0 : 1)]
279
+ """
280
+ return [x.element() for x in self]
281
+
282
+
283
+ def torsion_bound(E, number_of_places=20):
284
+ r"""
285
+ Return an upper bound on the order of the torsion subgroup.
286
+
287
+ INPUT:
288
+
289
+ - ``E`` -- an elliptic curve over `\QQ` or a number field
290
+
291
+ - ``number_of_places`` -- positive integer (default: 20); the
292
+ number of places that will be used to find the bound
293
+
294
+ OUTPUT:
295
+
296
+ (integer) An upper bound on the torsion order.
297
+
298
+ ALGORITHM:
299
+
300
+ An upper bound on the order of the torsion group of the elliptic
301
+ curve is obtained by counting points modulo several primes of good
302
+ reduction. Note that the upper bound returned by this function is
303
+ a multiple of the order of the torsion group, and in general will
304
+ be greater than the order.
305
+
306
+ To avoid nontrivial arithmetic in the base field (in particular,
307
+ to avoid having to compute the maximal order) we only use prime
308
+ `P` above rational primes `p` which do not divide the discriminant
309
+ of the equation order.
310
+
311
+ EXAMPLES::
312
+
313
+ sage: CDB = CremonaDatabase()
314
+ sage: from sage.schemes.elliptic_curves.ell_torsion import torsion_bound
315
+ sage: [torsion_bound(E) for E in CDB.iter([14])]
316
+ [6, 6, 6, 6, 6, 6]
317
+ sage: [E.torsion_order() for E in CDB.iter([14])]
318
+ [6, 6, 2, 6, 2, 6]
319
+
320
+ An example over a relative number field (see :issue:`16011`)::
321
+
322
+ sage: # needs sage.rings.number_field
323
+ sage: R.<x> = QQ[]
324
+ sage: F.<a> = QuadraticField(5)
325
+ sage: K.<b> = F.extension(x^2 - 3)
326
+ sage: E = EllipticCurve(K, [0,0,0,b,1])
327
+ sage: E.torsion_subgroup().order()
328
+ 1
329
+
330
+ An example of a base-change curve from `\QQ` to a degree 16 field::
331
+
332
+ sage: # needs sage.rings.number_field
333
+ sage: from sage.schemes.elliptic_curves.ell_torsion import torsion_bound
334
+ sage: f = PolynomialRing(QQ,'x')([5643417737593488384,0,
335
+ ....: -11114515801179776,0,-455989850911004,0,379781901872,
336
+ ....: 0,14339154953,0,-1564048,0,-194542,0,-32,0,1])
337
+ sage: K = NumberField(f,'a')
338
+ sage: E = EllipticCurve(K, [1, -1, 1, 824579, 245512517])
339
+ sage: torsion_bound(E)
340
+ 16
341
+ sage: E.torsion_subgroup().invariants()
342
+ (4, 4)
343
+ """
344
+ from sage.rings.integer_ring import ZZ
345
+ from sage.rings.finite_rings.finite_field_constructor import GF
346
+ from sage.schemes.elliptic_curves.constructor import EllipticCurve
347
+
348
+ K = E.base_field()
349
+
350
+ # Special case K = QQ
351
+
352
+ if K is RationalField():
353
+ bound = ZZ.zero()
354
+ k = 0
355
+ p = ZZ(2) # so we start with 3
356
+ E = E.integral_model()
357
+ disc_E = E.discriminant()
358
+
359
+ while k < number_of_places:
360
+ p = p.next_prime()
361
+ if p.divides(disc_E):
362
+ continue
363
+ k += 1
364
+ Fp = GF(p)
365
+ new_bound = E.reduction(p).cardinality()
366
+ bound = bound.gcd(new_bound)
367
+ if bound == 1:
368
+ return bound
369
+ return bound
370
+
371
+ # In case K is a relative extension we absolutize:
372
+
373
+ absK = K.absolute_field('a_')
374
+ f = absK.defining_polynomial()
375
+ abs_map = absK.structure()[1]
376
+
377
+ # Ensure f is monic and in ZZ[x]
378
+
379
+ f = f.monic()
380
+ den = f.denominator()
381
+ if den != 1:
382
+ x = f.parent().gen()
383
+ n = f.degree()
384
+ f = den**n * f(x/den)
385
+ disc_f = f.discriminant()
386
+ d = K.absolute_degree()
387
+
388
+ # Now f is monic in ZZ[x] of degree d and defines the extension K = Q(a)
389
+
390
+ # Make sure that we have a model for E with coefficients in ZZ[a]
391
+
392
+ E = E.integral_model()
393
+ disc_E = E.discriminant().norm()
394
+ ainvs = [abs_map(c) for c in E.a_invariants()]
395
+
396
+ bound = ZZ.zero()
397
+ k = 0
398
+ p = ZZ(2) # so we start with 3
399
+
400
+ try: # special case, useful for base-changes from QQ
401
+ ainvs = [ZZ(ai) for ai in ainvs]
402
+ while k < number_of_places:
403
+ p = p.next_prime()
404
+ if p.divides(disc_E) or p.divides(disc_f):
405
+ continue
406
+ k += 1
407
+ for fi, ei in f.factor_mod(p):
408
+ di = fi.degree()
409
+ Fp = GF(p)
410
+ new_bound = EllipticCurve(Fp, ainvs).cardinality(extension_degree=di)
411
+ bound = bound.gcd(new_bound)
412
+ if bound == 1:
413
+ return bound
414
+ return bound
415
+ except (ValueError, TypeError):
416
+ pass
417
+
418
+ # General case
419
+
420
+ while k < number_of_places:
421
+ p = p.next_prime()
422
+ if p.divides(disc_E) or p.divides(disc_f):
423
+ continue
424
+ k += 1
425
+ for fi, ei in f.factor_mod(p):
426
+ di = fi.degree()
427
+ Fq = GF((p, di))
428
+ ai = fi.roots(Fq, multiplicities=False)[0]
429
+
430
+ def red(c):
431
+ return Fq.sum(Fq(c[j]) * ai**j for j in range(d))
432
+ new_bound = EllipticCurve([red(c) for c in ainvs]).cardinality()
433
+ bound = bound.gcd(new_bound)
434
+ if bound == 1:
435
+ return bound
436
+ return bound