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.
- passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.6.47.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.47.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.47.dist-info/RECORD +311 -0
- passagemath_schemes-10.6.47.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.47.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +745 -0
- sage/lfunctions/pari.py +818 -0
- sage/lfunctions/zero_sums.cpython-312-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5135 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
- sage/modular/abvar/abvar_newform.py +244 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +186 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +720 -0
- sage/modular/abvar/homspace.py +998 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +740 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1402 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +363 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +653 -0
- sage/modular/arithgroup/congroup_gammaH.py +1469 -0
- sage/modular/arithgroup/congroup_generic.py +628 -0
- sage/modular/arithgroup/congroup_sl2z.py +267 -0
- sage/modular/arithgroup/farey_symbol.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1066 -0
- sage/modular/arithgroup/tests.py +418 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3753 -0
- sage/modular/btquotients/pautomorphicform.py +2570 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1109 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +569 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1065 -0
- sage/modular/hecke/algebra.py +746 -0
- sage/modular/hecke/all.py +20 -0
- sage/modular/hecke/ambient_module.py +1019 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +325 -0
- sage/modular/hecke/hecke_operator.py +780 -0
- sage/modular/hecke/homspace.py +206 -0
- sage/modular/hecke/module.py +1767 -0
- sage/modular/hecke/morphism.py +174 -0
- sage/modular/hecke/submodule.py +989 -0
- sage/modular/hypergeometric_misc.cpython-312-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2017 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1071 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +815 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +124 -0
- sage/modular/modform/ambient_g1.py +204 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +505 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4131 -0
- sage/modular/modform/find_generators.py +59 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +133 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-312-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1860 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +381 -0
- sage/modular/modform/weight1.py +220 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3846 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-312-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1295 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-312-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +375 -0
- sage/modular/multiple_zeta.py +2632 -0
- sage/modular/multiple_zeta_F_algebra.py +786 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1878 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +778 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +859 -0
- sage/modular/pollack_stevens/modsym.py +1593 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1076 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +845 -0
- sage/modular/quasimodform/ring.py +828 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +748 -0
- sage/schemes/curves/affine_curve.py +2928 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +381 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3026 -0
- sage/schemes/curves/zariski_vankampen.py +1932 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +1036 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1102 -0
- sage/schemes/elliptic_curves/constructor.py +1552 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
- sage/schemes/elliptic_curves/ell_egros.py +459 -0
- sage/schemes/elliptic_curves/ell_field.py +2836 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4787 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7335 -0
- sage/schemes/elliptic_curves/height.py +2109 -0
- sage/schemes/elliptic_curves/hom.py +1406 -0
- sage/schemes/elliptic_curves/hom_composite.py +934 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +682 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +237 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +943 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +715 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +291 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +580 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +73 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- 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
|