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,271 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Homsets and endomorphism rings of elliptic curves
|
|
4
|
+
|
|
5
|
+
The set of homomorphisms between two elliptic curves (:class:`EllipticCurveHom`)
|
|
6
|
+
forms an abelian group under addition. Moreover, if the two curves are the same,
|
|
7
|
+
it even forms a (not always commutative) ring under composition.
|
|
8
|
+
|
|
9
|
+
This module encapsulates the set of homomorphisms between two given elliptic
|
|
10
|
+
curves as a Sage object.
|
|
11
|
+
|
|
12
|
+
.. NOTE::
|
|
13
|
+
|
|
14
|
+
Currently only little nontrivial functionality is available, but this will
|
|
15
|
+
hopefully change in the future.
|
|
16
|
+
|
|
17
|
+
EXAMPLES:
|
|
18
|
+
|
|
19
|
+
The only useful thing this class does at the moment is coercing integers into
|
|
20
|
+
the endomorphism ring as scalar multiplications::
|
|
21
|
+
|
|
22
|
+
sage: E = EllipticCurve([1,2,3,4,5])
|
|
23
|
+
sage: f = End(E)(7); f
|
|
24
|
+
Scalar-multiplication endomorphism [7] of Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over Rational Field
|
|
25
|
+
sage: f == E.scalar_multiplication(7)
|
|
26
|
+
True
|
|
27
|
+
|
|
28
|
+
::
|
|
29
|
+
|
|
30
|
+
sage: E = EllipticCurve(GF(431^2), [0,1])
|
|
31
|
+
sage: E.automorphisms()[0] == 1
|
|
32
|
+
True
|
|
33
|
+
sage: E.automorphisms()[1] == -1
|
|
34
|
+
True
|
|
35
|
+
sage: omega = E.automorphisms()[2]
|
|
36
|
+
sage: omega == 1
|
|
37
|
+
False
|
|
38
|
+
sage: omega^3 == 1
|
|
39
|
+
True
|
|
40
|
+
sage: (1 + omega + omega^2) == 0
|
|
41
|
+
True
|
|
42
|
+
sage: (2*omega + 1)^2 == -3 # needs sage.symbolic
|
|
43
|
+
True
|
|
44
|
+
|
|
45
|
+
AUTHORS:
|
|
46
|
+
|
|
47
|
+
- Lorenz Panny (2023)
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
# ****************************************************************************
|
|
51
|
+
# Copyright (C) 2023 Lorenz Panny
|
|
52
|
+
#
|
|
53
|
+
# This program is free software: you can redistribute it and/or modify
|
|
54
|
+
# it under the terms of the GNU General Public License as published by
|
|
55
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
56
|
+
# (at your option) any later version.
|
|
57
|
+
# https://www.gnu.org/licenses/
|
|
58
|
+
# ****************************************************************************
|
|
59
|
+
|
|
60
|
+
from sage.rings.integer_ring import ZZ
|
|
61
|
+
from sage.categories.morphism import Morphism
|
|
62
|
+
from sage.schemes.generic.homset import SchemeHomset_generic
|
|
63
|
+
from sage.schemes.elliptic_curves.ell_generic import EllipticCurve_generic
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class EllipticCurveHomset(SchemeHomset_generic):
|
|
67
|
+
r"""
|
|
68
|
+
This class represents the set of all homomorphisms between two fixed
|
|
69
|
+
elliptic curves.
|
|
70
|
+
|
|
71
|
+
EXAMPLES::
|
|
72
|
+
|
|
73
|
+
sage: E = EllipticCurve(GF(419^2), [1,0])
|
|
74
|
+
sage: E.frobenius_isogeny() in End(E)
|
|
75
|
+
True
|
|
76
|
+
sage: phi = E.isogenies_prime_degree(7)[0]
|
|
77
|
+
sage: phi in End(E)
|
|
78
|
+
False
|
|
79
|
+
sage: phi in Hom(E, phi.codomain())
|
|
80
|
+
True
|
|
81
|
+
|
|
82
|
+
Note that domain and codomain are *not* taken up to isomorphism::
|
|
83
|
+
|
|
84
|
+
sage: iso = E.isomorphism_to(EllipticCurve(GF(419^2), [2,0]))
|
|
85
|
+
sage: iso in End(E)
|
|
86
|
+
False
|
|
87
|
+
"""
|
|
88
|
+
def __init__(self, E1, E2, category=None):
|
|
89
|
+
r"""
|
|
90
|
+
Construct the homset for a given pair of elliptic curves
|
|
91
|
+
defined over the same base ring.
|
|
92
|
+
|
|
93
|
+
TESTS::
|
|
94
|
+
|
|
95
|
+
sage: E = EllipticCurve(GF(101), [1,1])
|
|
96
|
+
sage: H = End(E)
|
|
97
|
+
sage: TestSuite(H).run(skip='_test_elements') # needs sage.symbolic
|
|
98
|
+
|
|
99
|
+
::
|
|
100
|
+
|
|
101
|
+
sage: E1 = EllipticCurve(GF(101), [1,1])
|
|
102
|
+
sage: E2 = EllipticCurve(GF(101), [4,9])
|
|
103
|
+
sage: H = Hom(E1, E2)
|
|
104
|
+
sage: TestSuite(H).run(skip='_test_elements')
|
|
105
|
+
|
|
106
|
+
::
|
|
107
|
+
|
|
108
|
+
sage: E1 = EllipticCurve(j=42)
|
|
109
|
+
sage: E2 = EllipticCurve(j=43)
|
|
110
|
+
sage: Hom(E1, E2)
|
|
111
|
+
Additive group of elliptic-curve morphisms
|
|
112
|
+
From: Elliptic Curve defined by y^2 = x^3 + 5901*x + 1105454 over Rational Field
|
|
113
|
+
To: Elliptic Curve defined by y^2 + x*y = x^3 + x^2 + 1510*x - 140675 over Rational Field
|
|
114
|
+
sage: Hom(E1, E2) in CommutativeAdditiveGroups()
|
|
115
|
+
True
|
|
116
|
+
sage: Hom(E1, E2) in Rings()
|
|
117
|
+
False
|
|
118
|
+
sage: End(E1) in CommutativeRings() # not implemented; see note in code below
|
|
119
|
+
True
|
|
120
|
+
|
|
121
|
+
::
|
|
122
|
+
|
|
123
|
+
sage: E0 = EllipticCurve(GF(419), [1,0])
|
|
124
|
+
sage: EE0 = E0.change_ring(GF(419^2))
|
|
125
|
+
sage: End(E0) in CommutativeRings() # not implemented; see note in code below
|
|
126
|
+
True
|
|
127
|
+
sage: End(EE0) in CommutativeRings()
|
|
128
|
+
False
|
|
129
|
+
sage: End(EE0) in Rings()
|
|
130
|
+
True
|
|
131
|
+
sage: E1 = EllipticCurve(GF(419), [1,1])
|
|
132
|
+
sage: EE1 = E1.change_ring(GF(419^2))
|
|
133
|
+
sage: Hom(E0, E1) in CommutativeAdditiveGroups()
|
|
134
|
+
True
|
|
135
|
+
sage: Hom(EE0, EE1) in CommutativeAdditiveGroups()
|
|
136
|
+
True
|
|
137
|
+
sage: Hom(E0, E1) in Rings()
|
|
138
|
+
False
|
|
139
|
+
sage: Hom(EE0, EE1) in Rings()
|
|
140
|
+
False
|
|
141
|
+
"""
|
|
142
|
+
if not isinstance(E1, EllipticCurve_generic):
|
|
143
|
+
raise ValueError('domain must be an elliptic curve')
|
|
144
|
+
if not isinstance(E2, EllipticCurve_generic):
|
|
145
|
+
raise ValueError('codomain must be an elliptic curve')
|
|
146
|
+
base = E1.base_ring()
|
|
147
|
+
if base != E2.base_ring():
|
|
148
|
+
raise ValueError('domain and codomain must have the same base ring')
|
|
149
|
+
|
|
150
|
+
super().__init__(E1, E2, category=category, base=base)
|
|
151
|
+
|
|
152
|
+
#TODO: We should also add CommutativeRings to the category
|
|
153
|
+
# of self whenever this holds true; see the method
|
|
154
|
+
# EllipticCurve_field.endomorphism_ring_is_commutative().
|
|
155
|
+
# Is there a way to perform this check lazily?
|
|
156
|
+
|
|
157
|
+
def _coerce_map_from_(self, other):
|
|
158
|
+
r"""
|
|
159
|
+
Check if this homset has a coercion map from another
|
|
160
|
+
parent ``other``.
|
|
161
|
+
|
|
162
|
+
The only currently supported case is when this homset has
|
|
163
|
+
equal domain and codomain: In this case elements from `\ZZ`
|
|
164
|
+
are embedded as scalar multiplications.
|
|
165
|
+
|
|
166
|
+
EXAMPLES::
|
|
167
|
+
|
|
168
|
+
sage: E1 = EllipticCurve(j=42)
|
|
169
|
+
sage: E2 = EllipticCurve(j=43)
|
|
170
|
+
sage: Hom(E1, E1)._coerce_map_from_(ZZ)
|
|
171
|
+
True
|
|
172
|
+
sage: Hom(E1, E2)._coerce_map_from_(ZZ)
|
|
173
|
+
False
|
|
174
|
+
"""
|
|
175
|
+
return self.is_endomorphism_set() and other is ZZ
|
|
176
|
+
|
|
177
|
+
def _element_constructor_(self, data):
|
|
178
|
+
r"""
|
|
179
|
+
Construct an element of this homset from the given ``data``.
|
|
180
|
+
|
|
181
|
+
The only currently supported case is when this homset has
|
|
182
|
+
equal domain and codomain: In this case elements from `\ZZ`
|
|
183
|
+
are embedded as scalar multiplications.
|
|
184
|
+
|
|
185
|
+
EXAMPLES::
|
|
186
|
+
|
|
187
|
+
sage: E1 = EllipticCurve(j=42)
|
|
188
|
+
sage: E2 = EllipticCurve(j=43)
|
|
189
|
+
sage: Hom(E1, E1)(5)
|
|
190
|
+
Scalar-multiplication endomorphism [5] of Elliptic Curve defined by y^2 = x^3 + 5901*x + 1105454 over Rational Field
|
|
191
|
+
sage: Hom(E1, E2)(5)
|
|
192
|
+
Traceback (most recent call last):
|
|
193
|
+
...
|
|
194
|
+
ValueError: domain and codomain must be equal
|
|
195
|
+
"""
|
|
196
|
+
m = ZZ(data)
|
|
197
|
+
if not self.is_endomorphism_set():
|
|
198
|
+
if m:
|
|
199
|
+
raise ValueError('domain and codomain must be equal')
|
|
200
|
+
from sage.schemes.elliptic_curves.hom_sum import EllipticCurveHom_sum
|
|
201
|
+
return EllipticCurveHom_sum([], domain=self.domain(), codomain=self.codomain())
|
|
202
|
+
from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
|
|
203
|
+
return EllipticCurveHom_scalar(self.domain(), m)
|
|
204
|
+
|
|
205
|
+
def _repr_(self):
|
|
206
|
+
r"""
|
|
207
|
+
Output a description of this homset, with special formatting
|
|
208
|
+
for endomorphism rings.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: E1 = EllipticCurve([1,1])
|
|
213
|
+
sage: E2 = EllipticCurve([2,2])
|
|
214
|
+
sage: End(E1)
|
|
215
|
+
Ring of elliptic-curve endomorphisms
|
|
216
|
+
From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
|
|
217
|
+
To: Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
|
|
218
|
+
sage: Hom(E1, E1)
|
|
219
|
+
Ring of elliptic-curve endomorphisms
|
|
220
|
+
From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
|
|
221
|
+
To: Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
|
|
222
|
+
sage: Hom(E1, E2)
|
|
223
|
+
Additive group of elliptic-curve morphisms
|
|
224
|
+
From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
|
|
225
|
+
To: Elliptic Curve defined by y^2 = x^3 + 2*x + 2 over Rational Field
|
|
226
|
+
"""
|
|
227
|
+
if self.is_endomorphism_set():
|
|
228
|
+
s = 'Ring of elliptic-curve endomorphisms'
|
|
229
|
+
else:
|
|
230
|
+
s = 'Additive group of elliptic-curve morphisms'
|
|
231
|
+
s += f'\n From: {self.domain()}'
|
|
232
|
+
s += f'\n To: {self.codomain()}'
|
|
233
|
+
return s
|
|
234
|
+
|
|
235
|
+
def identity(self):
|
|
236
|
+
r"""
|
|
237
|
+
Return the identity morphism in this elliptic-curve homset
|
|
238
|
+
as an :class:`EllipticCurveHom` object.
|
|
239
|
+
|
|
240
|
+
EXAMPLES::
|
|
241
|
+
|
|
242
|
+
sage: E = EllipticCurve(j=42)
|
|
243
|
+
sage: End(E).identity()
|
|
244
|
+
Elliptic-curve endomorphism of Elliptic Curve defined by y^2 = x^3 + 5901*x + 1105454 over Rational Field
|
|
245
|
+
Via: (u,r,s,t) = (1, 0, 0, 0)
|
|
246
|
+
sage: End(E).identity() == E.scalar_multiplication(1)
|
|
247
|
+
True
|
|
248
|
+
"""
|
|
249
|
+
if not self.is_endomorphism_set():
|
|
250
|
+
raise ValueError('domain and codomain must be equal')
|
|
251
|
+
return self.domain().identity_morphism()
|
|
252
|
+
|
|
253
|
+
def is_commutative(self):
|
|
254
|
+
r"""
|
|
255
|
+
Assuming this homset is an endomorphism ring, check whether
|
|
256
|
+
it is a commutative ring.
|
|
257
|
+
|
|
258
|
+
ALGORITHM: :meth:`EllipticCurve_field.endomorphism_ring_is_commutative`
|
|
259
|
+
|
|
260
|
+
EXAMPLES::
|
|
261
|
+
|
|
262
|
+
sage: End(EllipticCurve(j=123)).is_commutative()
|
|
263
|
+
True
|
|
264
|
+
sage: End(EllipticCurve(GF(11), [1,0])).is_commutative()
|
|
265
|
+
True
|
|
266
|
+
sage: End(EllipticCurve(GF(11^2), [1,0])).is_commutative()
|
|
267
|
+
False
|
|
268
|
+
"""
|
|
269
|
+
if not self.is_endomorphism_set():
|
|
270
|
+
raise ValueError('commutativity does not make sense for homsets between different objects')
|
|
271
|
+
return self.domain().endomorphism_ring_is_commutative()
|