passagemath-schemes 10.8.1a4__cp314-cp314t-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 (312) 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.8.1a4.dist-info/METADATA +203 -0
  7. passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
  8. passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
  9. passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.8.1a4.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 +9556 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +727 -0
  29. sage/lfunctions/pari.py +971 -0
  30. sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5132 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
  34. sage/modular/abvar/abvar_newform.py +246 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +187 -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 +721 -0
  40. sage/modular/abvar/homspace.py +989 -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 +741 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1406 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +361 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +659 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1491 -0
  57. sage/modular/arithgroup/congroup_generic.py +630 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +266 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1067 -0
  61. sage/modular/arithgroup/tests.py +425 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3736 -0
  64. sage/modular/btquotients/pautomorphicform.py +2564 -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 +1107 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +571 -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 +1076 -0
  77. sage/modular/hecke/algebra.py +725 -0
  78. sage/modular/hecke/all.py +19 -0
  79. sage/modular/hecke/ambient_module.py +994 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +302 -0
  82. sage/modular/hecke/hecke_operator.py +736 -0
  83. sage/modular/hecke/homspace.py +185 -0
  84. sage/modular/hecke/module.py +1744 -0
  85. sage/modular/hecke/morphism.py +139 -0
  86. sage/modular/hecke/submodule.py +970 -0
  87. sage/modular/hypergeometric_misc.cpython-314t-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 +2020 -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 +1070 -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 +817 -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 +120 -0
  101. sage/modular/modform/ambient_g1.py +199 -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 +487 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4105 -0
  108. sage/modular/modform/half_integral.py +154 -0
  109. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  110. sage/modular/modform/j_invariant.py +47 -0
  111. sage/modular/modform/l_series_gross_zagier.py +127 -0
  112. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  114. sage/modular/modform/notes.py +45 -0
  115. sage/modular/modform/numerical.py +514 -0
  116. sage/modular/modform/periods.py +14 -0
  117. sage/modular/modform/ring.py +1257 -0
  118. sage/modular/modform/space.py +1859 -0
  119. sage/modular/modform/submodule.py +118 -0
  120. sage/modular/modform/tests.py +64 -0
  121. sage/modular/modform/theta.py +110 -0
  122. sage/modular/modform/vm_basis.py +380 -0
  123. sage/modular/modform/weight1.py +221 -0
  124. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  125. sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
  126. sage/modular/modform_hecketriangle/all.py +30 -0
  127. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  128. sage/modular/modform_hecketriangle/constructor.py +416 -0
  129. sage/modular/modform_hecketriangle/element.py +351 -0
  130. sage/modular/modform_hecketriangle/functors.py +752 -0
  131. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  132. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  133. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
  135. sage/modular/modform_hecketriangle/readme.py +1214 -0
  136. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  137. sage/modular/modform_hecketriangle/space.py +1037 -0
  138. sage/modular/modform_hecketriangle/subspace.py +423 -0
  139. sage/modular/modsym/all.py +17 -0
  140. sage/modular/modsym/ambient.py +3844 -0
  141. sage/modular/modsym/boundary.py +1420 -0
  142. sage/modular/modsym/element.py +336 -0
  143. sage/modular/modsym/g1list.py +178 -0
  144. sage/modular/modsym/ghlist.py +182 -0
  145. sage/modular/modsym/hecke_operator.py +73 -0
  146. sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
  147. sage/modular/modsym/manin_symbol.pxd +5 -0
  148. sage/modular/modsym/manin_symbol.pyx +497 -0
  149. sage/modular/modsym/manin_symbol_list.py +1291 -0
  150. sage/modular/modsym/modsym.py +400 -0
  151. sage/modular/modsym/modular_symbols.py +384 -0
  152. sage/modular/modsym/p1list_nf.py +1241 -0
  153. sage/modular/modsym/relation_matrix.py +591 -0
  154. sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
  155. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  156. sage/modular/modsym/space.py +2468 -0
  157. sage/modular/modsym/subspace.py +455 -0
  158. sage/modular/modsym/tests.py +376 -0
  159. sage/modular/multiple_zeta.py +2635 -0
  160. sage/modular/multiple_zeta_F_algebra.py +789 -0
  161. sage/modular/overconvergent/all.py +6 -0
  162. sage/modular/overconvergent/genus0.py +1879 -0
  163. sage/modular/overconvergent/hecke_series.py +1187 -0
  164. sage/modular/overconvergent/weightspace.py +776 -0
  165. sage/modular/pollack_stevens/all.py +4 -0
  166. sage/modular/pollack_stevens/distributions.py +874 -0
  167. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  168. sage/modular/pollack_stevens/manin_map.py +856 -0
  169. sage/modular/pollack_stevens/modsym.py +1590 -0
  170. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  171. sage/modular/pollack_stevens/sigma0.py +534 -0
  172. sage/modular/pollack_stevens/space.py +1078 -0
  173. sage/modular/quasimodform/all.py +3 -0
  174. sage/modular/quasimodform/element.py +846 -0
  175. sage/modular/quasimodform/ring.py +826 -0
  176. sage/modular/quatalg/all.py +3 -0
  177. sage/modular/quatalg/brandt.py +1642 -0
  178. sage/modular/ssmod/all.py +8 -0
  179. sage/modular/ssmod/ssmod.py +827 -0
  180. sage/rings/all__sagemath_schemes.py +1 -0
  181. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  182. sage/rings/polynomial/binary_form_reduce.py +585 -0
  183. sage/schemes/all.py +41 -0
  184. sage/schemes/berkovich/all.py +6 -0
  185. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  186. sage/schemes/berkovich/berkovich_space.py +700 -0
  187. sage/schemes/curves/affine_curve.py +2924 -0
  188. sage/schemes/curves/all.py +33 -0
  189. sage/schemes/curves/closed_point.py +434 -0
  190. sage/schemes/curves/constructor.py +397 -0
  191. sage/schemes/curves/curve.py +542 -0
  192. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  193. sage/schemes/curves/point.py +463 -0
  194. sage/schemes/curves/projective_curve.py +3203 -0
  195. sage/schemes/curves/weighted_projective_curve.py +106 -0
  196. sage/schemes/curves/zariski_vankampen.py +1931 -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 +991 -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 +1103 -0
  208. sage/schemes/elliptic_curves/constructor.py +1530 -0
  209. sage/schemes/elliptic_curves/ec_database.py +175 -0
  210. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
  211. sage/schemes/elliptic_curves/ell_egros.py +457 -0
  212. sage/schemes/elliptic_curves/ell_field.py +2837 -0
  213. sage/schemes/elliptic_curves/ell_finite_field.py +3249 -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 +4944 -0
  220. sage/schemes/elliptic_curves/ell_rational_field.py +7184 -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 +1663 -0
  227. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  228. sage/schemes/elliptic_curves/heegner.py +7328 -0
  229. sage/schemes/elliptic_curves/height.py +2108 -0
  230. sage/schemes/elliptic_curves/hom.py +1788 -0
  231. sage/schemes/elliptic_curves/hom_composite.py +1084 -0
  232. sage/schemes/elliptic_curves/hom_fractional.py +544 -0
  233. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  234. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  235. sage/schemes/elliptic_curves/hom_sum.py +681 -0
  236. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  237. sage/schemes/elliptic_curves/homset.py +271 -0
  238. sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
  239. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  240. sage/schemes/elliptic_curves/jacobian.py +247 -0
  241. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  242. sage/schemes/elliptic_curves/kraus.py +1014 -0
  243. sage/schemes/elliptic_curves/lseries_ell.py +915 -0
  244. sage/schemes/elliptic_curves/mod5family.py +105 -0
  245. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  246. sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
  247. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  248. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  249. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  250. sage/schemes/elliptic_curves/padics.py +1816 -0
  251. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  252. sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
  253. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  254. sage/schemes/elliptic_curves/saturation.py +716 -0
  255. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  256. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  257. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  258. sage/schemes/hyperelliptic_curves/all.py +6 -0
  259. sage/schemes/hyperelliptic_curves/constructor.py +369 -0
  260. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
  261. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  265. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  266. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
  267. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
  271. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  272. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  273. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
  274. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  275. sage/schemes/jacobians/all.py +2 -0
  276. sage/schemes/overview.py +161 -0
  277. sage/schemes/plane_conics/all.py +22 -0
  278. sage/schemes/plane_conics/con_field.py +1296 -0
  279. sage/schemes/plane_conics/con_finite_field.py +158 -0
  280. sage/schemes/plane_conics/con_number_field.py +456 -0
  281. sage/schemes/plane_conics/con_rational_field.py +406 -0
  282. sage/schemes/plane_conics/con_rational_function_field.py +581 -0
  283. sage/schemes/plane_conics/constructor.py +249 -0
  284. sage/schemes/plane_quartics/all.py +2 -0
  285. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  286. sage/schemes/plane_quartics/quartic_generic.py +53 -0
  287. sage/schemes/riemann_surfaces/all.py +1 -0
  288. sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
  289. sage_wheels/share/cremona/cremona_mini.db +0 -0
  290. sage_wheels/share/ellcurves/rank0 +30427 -0
  291. sage_wheels/share/ellcurves/rank1 +31871 -0
  292. sage_wheels/share/ellcurves/rank10 +6 -0
  293. sage_wheels/share/ellcurves/rank11 +6 -0
  294. sage_wheels/share/ellcurves/rank12 +1 -0
  295. sage_wheels/share/ellcurves/rank14 +1 -0
  296. sage_wheels/share/ellcurves/rank15 +1 -0
  297. sage_wheels/share/ellcurves/rank17 +1 -0
  298. sage_wheels/share/ellcurves/rank19 +1 -0
  299. sage_wheels/share/ellcurves/rank2 +2388 -0
  300. sage_wheels/share/ellcurves/rank20 +1 -0
  301. sage_wheels/share/ellcurves/rank21 +1 -0
  302. sage_wheels/share/ellcurves/rank22 +1 -0
  303. sage_wheels/share/ellcurves/rank23 +1 -0
  304. sage_wheels/share/ellcurves/rank24 +1 -0
  305. sage_wheels/share/ellcurves/rank28 +1 -0
  306. sage_wheels/share/ellcurves/rank3 +836 -0
  307. sage_wheels/share/ellcurves/rank4 +10 -0
  308. sage_wheels/share/ellcurves/rank5 +5 -0
  309. sage_wheels/share/ellcurves/rank6 +5 -0
  310. sage_wheels/share/ellcurves/rank7 +5 -0
  311. sage_wheels/share/ellcurves/rank8 +6 -0
  312. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,741 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.flint sage.libs.pari
3
+ """
4
+ Torsion subgroups of modular abelian varieties
5
+
6
+ Sage can compute information about the structure of the torsion
7
+ subgroup of a modular abelian variety. Sage computes a multiple of
8
+ the order by computing the greatest common divisor of the orders of
9
+ the torsion subgroup of the reduction of the abelian variety modulo
10
+ p for various primes p. Sage computes a divisor of the order by
11
+ computing the rational cuspidal subgroup. When these two bounds
12
+ agree (which is often the case), we determine the exact structure
13
+ of the torsion subgroup.
14
+
15
+ AUTHORS:
16
+
17
+ - William Stein (2007-03)
18
+
19
+ EXAMPLES: First we consider `J_0(50)` where everything
20
+ works out nicely::
21
+
22
+ sage: J = J0(50)
23
+ sage: T = J.rational_torsion_subgroup(); T
24
+ Torsion subgroup of Abelian variety J0(50) of dimension 2
25
+ sage: T.multiple_of_order()
26
+ 15
27
+ sage: T.divisor_of_order()
28
+ 15
29
+ sage: T.gens()
30
+ ([(1/15, 3/5, 2/5, 14/15)],)
31
+ sage: T.invariants()
32
+ [15]
33
+ sage: d = J.decomposition(); d
34
+ [Simple abelian subvariety 50a(1,50) of dimension 1 of J0(50),
35
+ Simple abelian subvariety 50b(1,50) of dimension 1 of J0(50)]
36
+ sage: d[0].rational_torsion_subgroup().order() # needs database_cremona_mini_ellcurve
37
+ 3
38
+ sage: d[1].rational_torsion_subgroup().order() # needs database_cremona_mini_ellcurve
39
+ 5
40
+
41
+ Next we make a table of the upper and lower bounds for each new
42
+ factor.
43
+
44
+ ::
45
+
46
+ sage: # needs database_cremona_mini_ellcurve
47
+ sage: for N in range(1,38):
48
+ ....: for A in J0(N).new_subvariety().decomposition():
49
+ ....: T = A.rational_torsion_subgroup()
50
+ ....: print('%-5s%-5s%-5s%-5s'%(N, A.dimension(), T.divisor_of_order(), T.multiple_of_order()))
51
+ 11 1 5 5
52
+ 14 1 6 6
53
+ 15 1 8 8
54
+ 17 1 4 4
55
+ 19 1 3 3
56
+ 20 1 6 6
57
+ 21 1 8 8
58
+ 23 2 11 11
59
+ 24 1 8 8
60
+ 26 1 3 3
61
+ 26 1 7 7
62
+ 27 1 3 3
63
+ 29 2 7 7
64
+ 30 1 6 6
65
+ 31 2 5 5
66
+ 32 1 4 4
67
+ 33 1 4 4
68
+ 34 1 6 6
69
+ 35 1 3 3
70
+ 35 2 16 16
71
+ 36 1 6 6
72
+ 37 1 1 1
73
+ 37 1 3 3
74
+
75
+ TESTS::
76
+
77
+ sage: T = J0(54).rational_torsion_subgroup()
78
+ sage: loads(dumps(T)) == T
79
+ True
80
+ """
81
+
82
+ # ****************************************************************************
83
+ # Copyright (C) 2007 William Stein <wstein@gmail.com>
84
+ #
85
+ # This program is free software: you can redistribute it and/or modify
86
+ # it under the terms of the GNU General Public License as published by
87
+ # the Free Software Foundation, either version 2 of the License, or
88
+ # (at your option) any later version.
89
+ # https://www.gnu.org/licenses/
90
+ # ****************************************************************************
91
+
92
+ from sage.arith.misc import divisors, gcd
93
+ from sage.misc.misc_c import prod
94
+ from sage.modular.abvar.torsion_point import TorsionPoint
95
+ from sage.modular.arithgroup.congroup_gamma0 import Gamma0_class
96
+ from sage.modular.arithgroup.congroup_gamma1 import Gamma1_class
97
+ from sage.modular.dirichlet import DirichletGroup
98
+ from sage.modules.module import Module
99
+ from sage.rings.fast_arith import prime_range
100
+ from sage.rings.integer_ring import ZZ
101
+ from sage.rings.rational_field import QQ
102
+ from sage.sets.primes import Primes
103
+ from sage.structure.richcmp import richcmp_method, richcmp
104
+
105
+ from .finite_subgroup import FiniteSubgroup
106
+
107
+
108
+ @richcmp_method
109
+ class RationalTorsionSubgroup(FiniteSubgroup):
110
+ """
111
+ The torsion subgroup of a modular abelian variety.
112
+ """
113
+ def __init__(self, abvar):
114
+ """
115
+ Create the torsion subgroup.
116
+
117
+ INPUT:
118
+
119
+ - ``abvar`` -- a modular abelian variety
120
+
121
+ EXAMPLES::
122
+
123
+ sage: T = J0(14).rational_torsion_subgroup(); T
124
+ Torsion subgroup of Abelian variety J0(14) of dimension 1
125
+ sage: type(T)
126
+ <class 'sage.modular.abvar.torsion_subgroup.RationalTorsionSubgroup_with_category'>
127
+ """
128
+ FiniteSubgroup.__init__(self, abvar)
129
+
130
+ def _repr_(self):
131
+ """
132
+ Return string representation of this torsion subgroup.
133
+
134
+ EXAMPLES::
135
+
136
+ sage: T = J1(13).rational_torsion_subgroup(); T
137
+ Torsion subgroup of Abelian variety J1(13) of dimension 2
138
+ sage: T._repr_()
139
+ 'Torsion subgroup of Abelian variety J1(13) of dimension 2'
140
+ """
141
+ return "Torsion subgroup of %s" % self.abelian_variety()
142
+
143
+ def __richcmp__(self, other, op):
144
+ """
145
+ Compare torsion subgroups.
146
+
147
+ INPUT:
148
+
149
+ - ``other`` -- an object
150
+
151
+ If other is a torsion subgroup, the abelian varieties are compared.
152
+ Otherwise, the generic behavior for finite abelian variety
153
+ subgroups is used.
154
+
155
+ EXAMPLES::
156
+
157
+ sage: G = J0(11).rational_torsion_subgroup(); H = J0(13).rational_torsion_subgroup()
158
+ sage: G == G
159
+ True
160
+ sage: G < H # since 11 < 13
161
+ True
162
+ sage: G > H
163
+ False
164
+ """
165
+ if isinstance(other, RationalTorsionSubgroup):
166
+ return richcmp(self.abelian_variety(), other.abelian_variety(), op)
167
+ return FiniteSubgroup.__richcmp__(self, other, op)
168
+
169
+ def order(self, proof=True):
170
+ """
171
+ Return the order of the torsion subgroup of this modular abelian
172
+ variety.
173
+
174
+ This function may fail if the multiple obtained by counting points
175
+ modulo `p` exceeds the divisor obtained from the rational cuspidal
176
+ subgroup.
177
+
178
+ The computation of the rational torsion order of J1(p) is conjectural
179
+ and will only be used if ``proof=False``. See Section 6.2.3 of [CES2003]_.
180
+
181
+ INPUT:
182
+
183
+ - ``proof`` -- boolean (default: ``True``)
184
+
185
+ OUTPUT: the order of this torsion subgroup
186
+
187
+ EXAMPLES::
188
+
189
+ sage: A = J0(11)
190
+ sage: A.rational_torsion_subgroup().order()
191
+ 5
192
+ sage: A = J0(23)
193
+ sage: A.rational_torsion_subgroup().order()
194
+ 11
195
+ sage: T = J0(37)[1].rational_torsion_subgroup()
196
+ sage: T.order() # needs database_cremona_mini_ellcurve
197
+ 3
198
+
199
+ sage: J = J1(13)
200
+ sage: J.rational_torsion_subgroup().order()
201
+ 19
202
+
203
+ Sometimes the order can only be computed with ``proof=False``. ::
204
+
205
+ sage: J = J1(23)
206
+ sage: J.rational_torsion_subgroup().order()
207
+ Traceback (most recent call last):
208
+ ...
209
+ RuntimeError: Unable to compute order of torsion subgroup
210
+ (it is in [408991, 9406793])
211
+
212
+ sage: J.rational_torsion_subgroup().order(proof=False)
213
+ 408991
214
+ """
215
+ O = self.possible_orders(proof=proof)
216
+ if len(O) == 1:
217
+ n = O[0]
218
+ self._order = n
219
+ return n
220
+ raise RuntimeError("Unable to compute order of torsion subgroup (it is in %s)" % O)
221
+
222
+ def lattice(self):
223
+ """
224
+ Return lattice that defines this torsion subgroup, if possible.
225
+
226
+ .. warning::
227
+
228
+ There is no known algorithm in general to compute the
229
+ rational torsion subgroup. Use rational_cusp_group to
230
+ obtain a subgroup of the rational torsion subgroup in
231
+ general.
232
+
233
+ EXAMPLES::
234
+
235
+ sage: J0(11).rational_torsion_subgroup().lattice()
236
+ Free module of degree 2 and rank 2 over Integer Ring
237
+ Echelon basis matrix:
238
+ [ 1 0]
239
+ [ 0 1/5]
240
+
241
+ The following fails because in fact I know of no (reasonable)
242
+ algorithm to provably compute the torsion subgroup in general.
243
+
244
+ ::
245
+
246
+ sage: T = J0(33).rational_torsion_subgroup()
247
+ sage: T.lattice()
248
+ Traceback (most recent call last):
249
+ ...
250
+ NotImplementedError: unable to compute the rational torsion subgroup
251
+ in this case (there is no known general algorithm yet)
252
+
253
+ The problem is that the multiple of the order obtained by counting
254
+ points over finite fields is twice the divisor of the order got
255
+ from the rational cuspidal subgroup.
256
+
257
+ ::
258
+
259
+ sage: T.multiple_of_order(30)
260
+ 200
261
+ sage: J0(33).rational_cusp_subgroup().order()
262
+ 100
263
+ """
264
+ A = self.abelian_variety()
265
+ if A.dimension() == 0:
266
+ return []
267
+ R = A.rational_cusp_subgroup()
268
+ if R.order() == self.multiple_of_order():
269
+ return R.lattice()
270
+ else:
271
+ raise NotImplementedError("unable to compute the rational torsion subgroup in this case (there is no known general algorithm yet)")
272
+
273
+ def possible_orders(self, proof=True):
274
+ """
275
+ Return the possible orders of this torsion subgroup. Outside of special
276
+ cases, this is done by computing a divisor and multiple of the order.
277
+
278
+ INPUT:
279
+
280
+ - ``proof`` -- boolean (default: ``True``)
281
+
282
+ OUTPUT: an array of positive integers
283
+
284
+ The computation of the rational torsion order of J1(p) is conjectural
285
+ and will only be used if ``proof=False``. See Section 6.2.3 of [CES2003]_.
286
+
287
+ EXAMPLES::
288
+
289
+ sage: J0(11).rational_torsion_subgroup().possible_orders()
290
+ [5]
291
+ sage: J0(33).rational_torsion_subgroup().possible_orders()
292
+ [100, 200]
293
+
294
+ sage: J1(13).rational_torsion_subgroup().possible_orders()
295
+ [19]
296
+ sage: J1(16).rational_torsion_subgroup().possible_orders()
297
+ [1, 2, 4, 5, 10, 20]
298
+ """
299
+ try:
300
+ if proof:
301
+ return self._possible_orders
302
+ else:
303
+ return self._possible_orders_proof_false
304
+ except AttributeError:
305
+ pass
306
+
307
+ A = self.abelian_variety()
308
+ N = A.level()
309
+ # return the order of the cuspidal subgroup in the J0(p) case
310
+ if A.is_J0() and N.is_prime():
311
+ self._possible_orders = [QQ((A.level()-1)/12).numerator()]
312
+ self._possible_orders_proof_false = self._possible_orders
313
+ return self._possible_orders
314
+
315
+ # the elliptic curve case
316
+ if A.dimension() == 1:
317
+ self._possible_orders = [A.elliptic_curve().torsion_order()]
318
+ self._possible_orders_proof_false = self._possible_orders
319
+ return self._possible_orders
320
+
321
+ # the conjectural J1(p) case
322
+ if not proof and A.is_J1() and N.is_prime():
323
+ epsilons = [epsilon for epsilon in DirichletGroup(N)
324
+ if not epsilon.is_trivial() and epsilon.is_even()]
325
+ bernoullis = [epsilon.bernoulli(2) for epsilon in epsilons]
326
+ self._possible_orders_proof_false = [ZZ(N/(2**(N-3))*prod(bernoullis))]
327
+ return self._possible_orders_proof_false
328
+
329
+ u = self.multiple_of_order()
330
+ l = self.divisor_of_order()
331
+
332
+ assert u % l == 0
333
+ O = [l * d for d in divisors(u//l)]
334
+ self._possible_orders = O
335
+ if u == l:
336
+ self._possible_orders_proof_false = O
337
+ return O
338
+
339
+ def divisor_of_order(self):
340
+ """
341
+ Return a divisor of the order of this torsion subgroup of a modular
342
+ abelian variety.
343
+
344
+ OUTPUT: a divisor of this torsion subgroup
345
+
346
+ EXAMPLES::
347
+
348
+ sage: t = J0(37)[1].rational_torsion_subgroup()
349
+ sage: t.divisor_of_order() # needs database_cremona_mini_ellcurve
350
+ 3
351
+
352
+ sage: J = J1(19)
353
+ sage: J.rational_torsion_subgroup().divisor_of_order() # needs database_cremona_mini_ellcurve
354
+ 4383
355
+
356
+ sage: # needs database_cremona_mini_ellcurve
357
+ sage: J = J0(45)
358
+ sage: J.rational_cusp_subgroup().order()
359
+ 32
360
+ sage: J.rational_cuspidal_subgroup().order()
361
+ 64
362
+ sage: J.rational_torsion_subgroup().divisor_of_order()
363
+ 64
364
+ """
365
+ try:
366
+ return self._divisor_of_order
367
+ except AttributeError:
368
+ pass
369
+
370
+ A = self.abelian_variety()
371
+ N = A.level()
372
+
373
+ if A.dimension() == 0:
374
+ self._divisor_of_order = ZZ(1)
375
+ return self._divisor_of_order
376
+
377
+ # return the order of the cuspidal subgroup in the J0(p) case
378
+ if A.is_J0() and N.is_prime():
379
+ self._divisor_of_order = QQ((A.level()-1)/12).numerator()
380
+ return self._divisor_of_order
381
+
382
+ # The elliptic curve case
383
+ if A.dimension() == 1:
384
+ self._divisor_of_order = A.elliptic_curve().torsion_order()
385
+ return self._divisor_of_order
386
+
387
+ # The J1(p) case
388
+ if A.is_J1() and N.is_prime():
389
+ epsilons = [epsilon for epsilon in DirichletGroup(N)
390
+ if not epsilon.is_trivial() and epsilon.is_even()]
391
+ bernoullis = [epsilon.bernoulli(2) for epsilon in epsilons]
392
+ self._divisor_of_order = ZZ(N/(2**(N-3))*prod(bernoullis))
393
+ return self._divisor_of_order
394
+
395
+ # The Gamma0 case
396
+ if all(isinstance(G, Gamma0_class) for G in A.groups()):
397
+ self._divisor_of_order = A.rational_cuspidal_subgroup().order()
398
+ return self._divisor_of_order
399
+
400
+ # Unhandled case
401
+ self._divisor_of_order = ZZ(1)
402
+ return self._divisor_of_order
403
+
404
+ def multiple_of_order(self, maxp=None, proof=True):
405
+ """
406
+ Return a multiple of the order.
407
+
408
+ INPUT:
409
+
410
+ - ``proof`` -- boolean (default: ``True``)
411
+
412
+ The computation of the rational torsion order of J1(p) is conjectural
413
+ and will only be used if proof=False. See Section 6.2.3 of [CES2003]_.
414
+
415
+ EXAMPLES::
416
+
417
+ sage: J = J1(11); J
418
+ Abelian variety J1(11) of dimension 1
419
+ sage: J.rational_torsion_subgroup().multiple_of_order() # needs database_cremona_mini_ellcurve
420
+ 5
421
+
422
+ sage: J = J0(17)
423
+ sage: J.rational_torsion_subgroup().order() # needs database_cremona_mini_ellcurve
424
+ 4
425
+
426
+ This is an example where proof=False leads to a better bound and better
427
+ performance. ::
428
+
429
+ sage: J = J1(23)
430
+ sage: J.rational_torsion_subgroup().multiple_of_order() # long time (2s) # needs database_cremona_mini_ellcurve
431
+ 9406793
432
+ sage: J.rational_torsion_subgroup().multiple_of_order(proof=False) # needs database_cremona_mini_ellcurve
433
+ 408991
434
+ """
435
+
436
+ try:
437
+ if proof:
438
+ return self._multiple_of_order
439
+ else:
440
+ return self._multiple_of_order_proof_false
441
+ except AttributeError:
442
+ pass
443
+
444
+ A = self.abelian_variety()
445
+ N = A.level()
446
+
447
+ if A.dimension() == 0:
448
+ self._multiple_of_order = ZZ(1)
449
+ self._multiple_of_order_proof_false = self._multiple_of_order
450
+ return self._multiple_of_order
451
+
452
+ # return the order of the cuspidal subgroup in the J0(p) case
453
+ if A.is_J0() and N.is_prime():
454
+ self._multiple_of_order = QQ((A.level()-1)/12).numerator()
455
+ self._multiple_of_order_proof_false = self._multiple_of_order
456
+ return self._multiple_of_order
457
+
458
+ # The elliptic curve case
459
+ if A.dimension() == 1:
460
+ self._multiple_of_order = A.elliptic_curve().torsion_order()
461
+ self._multiple_of_order_proof_false = self._multiple_of_order
462
+ return self._multiple_of_order
463
+
464
+ # The conjectural J1(p) case
465
+ if not proof and A.is_J1() and N.is_prime():
466
+ epsilons = [epsilon for epsilon in DirichletGroup(N)
467
+ if not epsilon.is_trivial() and epsilon.is_even()]
468
+ bernoullis = [epsilon.bernoulli(2) for epsilon in epsilons]
469
+ self._multiple_of_order_proof_false = ZZ(N/(2**(N-3))*prod(bernoullis))
470
+ return self._multiple_of_order_proof_false
471
+
472
+ # The Gamma0 and Gamma1 case
473
+ if all(isinstance(G, (Gamma0_class, Gamma1_class)) for G in A.groups()):
474
+ self._multiple_of_order = self.multiple_of_order_using_frobp()
475
+ return self._multiple_of_order
476
+
477
+ # Unhandled case
478
+ raise NotImplementedError("No implemented algorithm")
479
+
480
+ def multiple_of_order_using_frobp(self, maxp=None):
481
+ """
482
+ Return a multiple of the order of this torsion group.
483
+
484
+ In the `Gamma_0` case, the multiple is computed using characteristic
485
+ polynomials of Hecke operators of odd index not dividing the level. In
486
+ the `Gamma_1` case, the multiple is computed by expressing the
487
+ frobenius polynomial in terms of the characteristic polynomial of left
488
+ multiplication by `a_p` for odd primes p not dividing the level.
489
+
490
+ INPUT:
491
+
492
+ - ``maxp`` -- (default: ``None``) if ``maxp`` is ``None``, return gcd
493
+ of best bound computed so far with bound obtained by computing GCD's
494
+ of orders modulo `p` until this gcd stabilizes for 3 successive
495
+ primes. If ``maxp`` is given, just use all primes up to and including
496
+ ``maxp``.
497
+
498
+ EXAMPLES::
499
+
500
+ sage: J = J0(11)
501
+ sage: G = J.rational_torsion_subgroup()
502
+ sage: G.multiple_of_order_using_frobp(11)
503
+ 5
504
+
505
+ Increasing maxp may yield a tighter bound. If maxp=None, then Sage
506
+ will use more primes until the multiple stabilizes for 3 successive
507
+ primes. ::
508
+
509
+ sage: J = J0(389)
510
+ sage: G = J.rational_torsion_subgroup(); G
511
+ Torsion subgroup of Abelian variety J0(389) of dimension 32
512
+ sage: G.multiple_of_order_using_frobp()
513
+ 97
514
+ sage: [G.multiple_of_order_using_frobp(p) for p in prime_range(3,11)]
515
+ [92645296242160800, 7275, 291]
516
+ sage: [G.multiple_of_order_using_frobp(p) for p in prime_range(3,13)]
517
+ [92645296242160800, 7275, 291, 97]
518
+ sage: [G.multiple_of_order_using_frobp(p) for p in prime_range(3,19)]
519
+ [92645296242160800, 7275, 291, 97, 97, 97]
520
+
521
+ We can compute the multiple of order of the torsion subgroup for Gamma0
522
+ and Gamma1 varieties, and their products. ::
523
+
524
+ sage: A = J0(11) * J0(33)
525
+ sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
526
+ 1000
527
+
528
+ sage: A = J1(23)
529
+ sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
530
+ 9406793
531
+ sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp(maxp=50)
532
+ 408991
533
+
534
+ sage: A = J1(19) * J0(21)
535
+ sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
536
+ 35064
537
+
538
+ The next example illustrates calling this function with a larger
539
+ input and how the result may be cached when maxp is None::
540
+
541
+ sage: T = J0(43)[1].rational_torsion_subgroup()
542
+ sage: T.multiple_of_order_using_frobp()
543
+ 14
544
+ sage: T.multiple_of_order_using_frobp(50)
545
+ 7
546
+ sage: T.multiple_of_order_using_frobp()
547
+ 7
548
+
549
+ This function is not implemented for general congruence subgroups
550
+ unless the dimension is zero. ::
551
+
552
+ sage: A = JH(13,[2]); A
553
+ Abelian variety J0(13) of dimension 0
554
+ sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
555
+ 1
556
+
557
+ sage: A = JH(15, [2]); A
558
+ Abelian variety JH(15,[2]) of dimension 1
559
+ sage: A.rational_torsion_subgroup().multiple_of_order_using_frobp()
560
+ Traceback (most recent call last):
561
+ ...
562
+ NotImplementedError: torsion multiple only implemented for Gamma0 and Gamma1
563
+ """
564
+ if maxp is None:
565
+ try:
566
+ return self.__multiple_of_order_using_frobp
567
+ except AttributeError:
568
+ pass
569
+ A = self.abelian_variety()
570
+ if A.dimension() == 0:
571
+ T = ZZ.one()
572
+ self.__multiple_of_order_using_frobp = T
573
+ return T
574
+ if not all(isinstance(G, (Gamma0_class, Gamma1_class)) for G in A.groups()):
575
+ raise NotImplementedError("torsion multiple only implemented for Gamma0 and Gamma1")
576
+
577
+ bnd = ZZ.zero()
578
+ N = A.level()
579
+ cnt = 0
580
+ if maxp is None:
581
+ X = Primes()
582
+ else:
583
+ X = prime_range(maxp+1)
584
+ for p in X:
585
+ if (2*N) % p == 0:
586
+ continue
587
+
588
+ if (len(A.groups()) == 1 and isinstance(A.groups()[0], Gamma0_class)):
589
+ f = A.hecke_polynomial(p)
590
+ b = ZZ(f(p+1))
591
+ else:
592
+ from .constructor import AbelianVariety
593
+ D = [AbelianVariety(f) for f in
594
+ A.newform_decomposition('a')]
595
+ b = 1
596
+ for simple in D:
597
+ G = simple.newform_level()[1]
598
+ if isinstance(G, Gamma0_class):
599
+ f = simple.hecke_polynomial(p)
600
+ b *= ZZ(f(p+1))
601
+ else:
602
+ f = simple.newform('a')
603
+ Kf = f.base_ring()
604
+ eps = f.character()
605
+ Qe = eps.base_ring()
606
+
607
+ if Kf != QQ:
608
+ # relativize number fields to compute charpoly of
609
+ # left multiplication of ap on Kf as a Qe-vector
610
+ # space.
611
+ Lf = Kf.relativize(Qe.gen(), 'a')
612
+ to_Lf = Lf.structure()[1]
613
+
614
+ name = Kf._names[0]
615
+ ap = to_Lf(f.modular_symbols(1).eigenvalue(p, name))
616
+
617
+ G_ps = ap.matrix().charpoly()
618
+ b *= ZZ(Qe(G_ps(1 + to_Lf(eps(p))*p)).norm())
619
+ else:
620
+ ap = f.modular_symbols(1).eigenvalue(p)
621
+ b *= ZZ(1 + eps(p)*p - ap)
622
+
623
+ if bnd == 0:
624
+ bnd = b
625
+ else:
626
+ bnd_last = bnd
627
+ bnd = ZZ(gcd(bnd, b))
628
+ if bnd == bnd_last:
629
+ cnt += 1
630
+ else:
631
+ cnt = 0
632
+ if maxp is None and cnt >= 2:
633
+ break
634
+
635
+ # The code below caches the computed bound and
636
+ # will be used if this function is called
637
+ # again with maxp equal to None (the default).
638
+ if maxp is None:
639
+ # maxp is None but self.__multiple_of_order_using_frobp is
640
+ # not set, since otherwise we would have immediately
641
+ # returned at the top of this function
642
+ self.__multiple_of_order_using_frobp = bnd
643
+ else:
644
+ # maxp is given -- record new info we get as
645
+ # a gcd...
646
+ try:
647
+ self.__multiple_of_order_using_frobp = \
648
+ gcd(self.__multiple_of_order_using_frobp, bnd)
649
+ except AttributeError:
650
+ # ... except in the case when
651
+ # self.__multiple_of_order_using_frobp was never set. In this
652
+ # case, we just set it as long as the gcd stabilized for 3 in a
653
+ # row.
654
+ if cnt >= 2:
655
+ self.__multiple_of_order_using_frobp = bnd
656
+ return bnd
657
+
658
+
659
+ class QQbarTorsionSubgroup(Module):
660
+
661
+ Element = TorsionPoint
662
+
663
+ def __init__(self, abvar):
664
+ """
665
+ Group of all torsion points over the algebraic closure on an
666
+ abelian variety.
667
+
668
+ INPUT:
669
+
670
+ - ``abvar`` -- an abelian variety
671
+
672
+ EXAMPLES::
673
+
674
+ sage: A = J0(23)
675
+ sage: A.qbar_torsion_subgroup() # needs sage.rings.number_field
676
+ Group of all torsion points in QQbar on Abelian variety J0(23) of dimension 2
677
+ """
678
+ self.__abvar = abvar
679
+ Module.__init__(self, ZZ)
680
+
681
+ def _repr_(self):
682
+ """
683
+ Print representation of QQbar points.
684
+
685
+ OUTPUT: string
686
+
687
+ EXAMPLES::
688
+
689
+ sage: J0(23).qbar_torsion_subgroup()._repr_() # needs sage.rings.number_field
690
+ 'Group of all torsion points in QQbar on Abelian variety J0(23) of dimension 2'
691
+ """
692
+ return 'Group of all torsion points in QQbar on %s' % self.__abvar
693
+
694
+ def field_of_definition(self):
695
+ """
696
+ Return the field of definition of this subgroup. Since this is the
697
+ group of all torsion it is defined over the base field of this
698
+ abelian variety.
699
+
700
+ OUTPUT: a field
701
+
702
+ EXAMPLES::
703
+
704
+ sage: J0(23).qbar_torsion_subgroup().field_of_definition() # needs sage.rings.number_field
705
+ Rational Field
706
+ """
707
+ return self.__abvar.base_field()
708
+
709
+ def _element_constructor_(self, x):
710
+ r"""
711
+ Create an element in this torsion subgroup.
712
+
713
+ INPUT:
714
+
715
+ - ``x`` -- vector in `\QQ^{2d}`
716
+
717
+ OUTPUT: torsion point
718
+
719
+ EXAMPLES::
720
+
721
+ sage: P = J0(23).qbar_torsion_subgroup()([1,1/2,3/4,2]); P # needs sage.rings.number_field
722
+ [(1, 1/2, 3/4, 2)]
723
+ sage: P.order() # needs sage.rings.number_field
724
+ 4
725
+ """
726
+ v = self.__abvar.vector_space()(x)
727
+ return self.element_class(self, v)
728
+
729
+ def abelian_variety(self):
730
+ """
731
+ Return the abelian variety that this is the set of all torsion
732
+ points on.
733
+
734
+ OUTPUT: abelian variety
735
+
736
+ EXAMPLES::
737
+
738
+ sage: J0(23).qbar_torsion_subgroup().abelian_variety() # needs sage.rings.number_field
739
+ Abelian variety J0(23) of dimension 2
740
+ """
741
+ return self.__abvar