passagemath-schemes 10.6.38__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.
Potentially problematic release.
This version of passagemath-schemes might be problematic. Click here for more details.
- passagemath_schemes/.dylibs/libflint.21.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.38.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.38.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.38.dist-info/RECORD +314 -0
- passagemath_schemes-10.6.38.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.38.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-314t-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-314t-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-314t-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-314t-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-314t-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-314t-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-314t-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-314t-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.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/p1list.pxd +29 -0
- sage/modular/modsym/p1list.pyx +1372 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314t-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-314t-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-314t-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,531 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Scalar-multiplication morphisms of elliptic curves
|
|
4
|
+
|
|
5
|
+
This class provides an :class:`EllipticCurveHom` instantiation for
|
|
6
|
+
multiplication-by-`m` maps on elliptic curves.
|
|
7
|
+
|
|
8
|
+
EXAMPLES:
|
|
9
|
+
|
|
10
|
+
We can construct and evaluate scalar multiplications::
|
|
11
|
+
|
|
12
|
+
sage: from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
|
|
13
|
+
sage: E = EllipticCurve('77a1')
|
|
14
|
+
sage: phi = E.scalar_multiplication(5); phi
|
|
15
|
+
Scalar-multiplication endomorphism [5] of Elliptic Curve defined by y^2 + y = x^3 + 2*x over Rational Field
|
|
16
|
+
sage: P = E(2,3)
|
|
17
|
+
sage: phi(P)
|
|
18
|
+
(30 : 164 : 1)
|
|
19
|
+
|
|
20
|
+
The usual :class:`EllipticCurveHom` methods are supported::
|
|
21
|
+
|
|
22
|
+
sage: phi.degree()
|
|
23
|
+
25
|
|
24
|
+
sage: phi.kernel_polynomial()
|
|
25
|
+
x^12 + 124/5*x^10 + 19*x^9 - 84*x^8 + 24*x^7 - 483*x^6 - 696/5*x^5 - 448*x^4 - 37*x^3 - 332*x^2 - 84*x + 47/5
|
|
26
|
+
sage: phi.rational_maps()
|
|
27
|
+
((x^25 - 200*x^23 - 520*x^22 + 9000*x^21 + ... + 1377010*x^3 + 20360*x^2 - 39480*x + 2209),
|
|
28
|
+
(10*x^36*y - 620*x^36 + 3240*x^34*y - 44880*x^34 + ... + 424927560*x*y + 226380480*x + 42986410*y + 20974090)/(1250*x^36 + 93000*x^34 + 71250*x^33 + 1991400*x^32 + ... + 1212964050*x^3 + 138715800*x^2 - 27833400*x + 1038230))
|
|
29
|
+
sage: phi.dual()
|
|
30
|
+
Scalar-multiplication endomorphism [5] of Elliptic Curve defined by y^2 + y = x^3 + 2*x over Rational Field
|
|
31
|
+
sage: phi.dual() is phi
|
|
32
|
+
True
|
|
33
|
+
sage: phi.formal()
|
|
34
|
+
5*t - 310*t^4 - 2496*t^5 + 10540*t^7 + ... - 38140146674516*t^20 - 46800256902400*t^21 + 522178541079910*t^22 + O(t^23)
|
|
35
|
+
sage: phi.is_normalized()
|
|
36
|
+
False
|
|
37
|
+
sage: phi.is_separable()
|
|
38
|
+
True
|
|
39
|
+
sage: phi.is_injective()
|
|
40
|
+
False
|
|
41
|
+
sage: phi.is_surjective()
|
|
42
|
+
True
|
|
43
|
+
|
|
44
|
+
Contrary to constructing an :class:`EllipticCurveIsogeny` from
|
|
45
|
+
the division polynomial, :class:`EllipticCurveHom_scalar` can
|
|
46
|
+
deal with huge scalars very quickly::
|
|
47
|
+
|
|
48
|
+
sage: E = EllipticCurve(GF(2^127-1), [1,2,3,4,5])
|
|
49
|
+
sage: phi = E.scalar_multiplication(9^99); phi
|
|
50
|
+
Scalar-multiplication endomorphism [29512665430652752148753480226197736314359272517043832886063884637676943433478020332709411004889] of Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over Finite Field of size 170141183460469231731687303715884105727
|
|
51
|
+
sage: phi(E(1,2))
|
|
52
|
+
(82124533143060719620799539030695848450 : 17016022038624814655722682134021402379 : 1)
|
|
53
|
+
|
|
54
|
+
Composition of scalar multiplications results in another scalar
|
|
55
|
+
multiplication::
|
|
56
|
+
|
|
57
|
+
sage: E = EllipticCurve(GF(19), [4,4])
|
|
58
|
+
sage: phi = E.scalar_multiplication(-3); phi
|
|
59
|
+
Scalar-multiplication endomorphism [-3] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
|
|
60
|
+
sage: psi = E.scalar_multiplication(7); psi
|
|
61
|
+
Scalar-multiplication endomorphism [7] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
|
|
62
|
+
sage: phi * psi
|
|
63
|
+
Scalar-multiplication endomorphism [-21] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
|
|
64
|
+
sage: psi * phi
|
|
65
|
+
Scalar-multiplication endomorphism [-21] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
|
|
66
|
+
sage: phi * psi == psi * phi
|
|
67
|
+
True
|
|
68
|
+
sage: -phi == E.scalar_multiplication(-1) * phi
|
|
69
|
+
True
|
|
70
|
+
|
|
71
|
+
The zero endomorphism `[0]` is supported::
|
|
72
|
+
|
|
73
|
+
sage: E = EllipticCurve(GF(71), [1,1])
|
|
74
|
+
sage: zero = E.scalar_multiplication(0); zero
|
|
75
|
+
Scalar-multiplication endomorphism [0] of Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 71
|
|
76
|
+
sage: zero.is_zero()
|
|
77
|
+
True
|
|
78
|
+
sage: zero.is_injective()
|
|
79
|
+
False
|
|
80
|
+
sage: zero.is_surjective()
|
|
81
|
+
False
|
|
82
|
+
sage: zero(E.random_point())
|
|
83
|
+
(0 : 1 : 0)
|
|
84
|
+
|
|
85
|
+
Retrieving multiplication-by-`m` maps when `m` is divisible by the
|
|
86
|
+
characteristic also works (since :issue:`37096`)::
|
|
87
|
+
|
|
88
|
+
sage: E = EllipticCurve(GF(7), [1,0])
|
|
89
|
+
sage: phi = E.scalar_multiplication(7); phi
|
|
90
|
+
Scalar-multiplication endomorphism [7] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
|
|
91
|
+
sage: phi.rational_maps()
|
|
92
|
+
(x^49, -y^49)
|
|
93
|
+
sage: phi.x_rational_map()
|
|
94
|
+
x^49
|
|
95
|
+
sage: psi = E.scalar_multiplication(-2); psi
|
|
96
|
+
Scalar-multiplication endomorphism [-2] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
|
|
97
|
+
sage: chi = E.scalar_multiplication(-14); chi
|
|
98
|
+
Scalar-multiplication endomorphism [-14] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
|
|
99
|
+
sage: chi == psi * phi
|
|
100
|
+
True
|
|
101
|
+
sage: chi.rational_maps()
|
|
102
|
+
((x^196 - 2*x^98 + 1)/(-3*x^147 - 3*x^49),
|
|
103
|
+
(-x^294*y^49 + 2*x^196*y^49 - 2*x^98*y^49 + y^49)/(-x^294 - 2*x^196 - x^98))
|
|
104
|
+
sage: chi.x_rational_map()
|
|
105
|
+
(2*x^196 + 3*x^98 + 2)/(x^147 + x^49)
|
|
106
|
+
sage: chi.rational_maps() == tuple(f(*phi.rational_maps()) for f in psi.rational_maps())
|
|
107
|
+
True
|
|
108
|
+
sage: chi.x_rational_map() == psi.x_rational_map()(phi.x_rational_map())
|
|
109
|
+
True
|
|
110
|
+
|
|
111
|
+
::
|
|
112
|
+
|
|
113
|
+
sage: E = EllipticCurve(GF(7), [0,1])
|
|
114
|
+
sage: phi = E.scalar_multiplication(7); phi
|
|
115
|
+
Scalar-multiplication endomorphism [7] of Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7
|
|
116
|
+
sage: phi.rational_maps() # known bug -- #6413
|
|
117
|
+
((-3*x^49 - x^28 - x^7)/(x^42 - x^21 + 2),
|
|
118
|
+
(-x^72*y - 3*x^69*y - 3*x^66*y - x^63*y + 3*x^51*y + 2*x^48*y + 2*x^45*y + 3*x^42*y - x^9*y - 3*x^6*y - 3*x^3*y - y)/(x^63 + 2*x^42 - x^21 - 1))
|
|
119
|
+
sage: phi.x_rational_map()
|
|
120
|
+
(4*x^49 + 6*x^28 + 6*x^7)/(x^42 + 6*x^21 + 2)
|
|
121
|
+
|
|
122
|
+
TESTS::
|
|
123
|
+
|
|
124
|
+
sage: E = EllipticCurve(j = GF(65537^3).random_element())
|
|
125
|
+
sage: m = randrange(-2^99, +2^99)
|
|
126
|
+
sage: phi = E.scalar_multiplication(m)
|
|
127
|
+
sage: phi.degree() == m**2
|
|
128
|
+
True
|
|
129
|
+
sage: P = E.random_point()
|
|
130
|
+
sage: phi(P) == m*P
|
|
131
|
+
True
|
|
132
|
+
|
|
133
|
+
AUTHORS:
|
|
134
|
+
|
|
135
|
+
- Lorenz Panny (2021): implement :class:`EllipticCurveHom_scalar`
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
from sage.misc.cachefunc import cached_method
|
|
139
|
+
from sage.structure.richcmp import richcmp
|
|
140
|
+
|
|
141
|
+
from sage.rings.integer_ring import ZZ
|
|
142
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
143
|
+
|
|
144
|
+
from sage.schemes.elliptic_curves.ell_generic import EllipticCurve_generic
|
|
145
|
+
from sage.schemes.elliptic_curves.weierstrass_morphism import negation_morphism
|
|
146
|
+
from sage.schemes.elliptic_curves.hom import EllipticCurveHom
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class EllipticCurveHom_scalar(EllipticCurveHom):
|
|
150
|
+
|
|
151
|
+
def __init__(self, E, m):
|
|
152
|
+
"""
|
|
153
|
+
Construct a scalar-multiplication map on an elliptic curve.
|
|
154
|
+
|
|
155
|
+
TESTS::
|
|
156
|
+
|
|
157
|
+
sage: from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
|
|
158
|
+
sage: E = EllipticCurve([1,1])
|
|
159
|
+
sage: EllipticCurveHom_scalar(E, 123)
|
|
160
|
+
Scalar-multiplication endomorphism [123] of Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
|
|
161
|
+
"""
|
|
162
|
+
if not isinstance(E, EllipticCurve_generic):
|
|
163
|
+
raise ValueError(f'not an elliptic curve: {E}')
|
|
164
|
+
|
|
165
|
+
self._m = ZZ(m)
|
|
166
|
+
|
|
167
|
+
self._degree = self._m**2
|
|
168
|
+
self._domain = self._codomain = E
|
|
169
|
+
|
|
170
|
+
EllipticCurveHom.__init__(self, self._domain, self._codomain)
|
|
171
|
+
|
|
172
|
+
# TODO: should probably be in EllipticCurveHom?
|
|
173
|
+
self._base_ring = self._domain.base_ring()
|
|
174
|
+
self._poly_ring = PolynomialRing(self._base_ring, ['x'])
|
|
175
|
+
self._mpoly_ring = PolynomialRing(self._base_ring, ['x','y'])
|
|
176
|
+
|
|
177
|
+
self._rational_maps = None
|
|
178
|
+
|
|
179
|
+
def _call_(self, P):
|
|
180
|
+
"""
|
|
181
|
+
Evaluate this scalar-multiplication map `[m]` at a point `P`,
|
|
182
|
+
i.e., return `[m]P`.
|
|
183
|
+
|
|
184
|
+
TESTS::
|
|
185
|
+
|
|
186
|
+
sage: p = random_prime(2^22)
|
|
187
|
+
sage: q = p^randrange(1,5)
|
|
188
|
+
sage: E = EllipticCurve_from_j(GF(q).random_element())
|
|
189
|
+
sage: m = randrange(-9^99, 9^99)
|
|
190
|
+
sage: phi = E.scalar_multiplication(m)
|
|
191
|
+
sage: P = E.random_point()
|
|
192
|
+
sage: phi(P) == m*P
|
|
193
|
+
True
|
|
194
|
+
"""
|
|
195
|
+
if P not in self._domain:
|
|
196
|
+
raise ValueError(f'{P} is not a point on {self._domain}')
|
|
197
|
+
return self._m * P
|
|
198
|
+
|
|
199
|
+
def _eval(self, P):
|
|
200
|
+
"""
|
|
201
|
+
Less strict evaluation method for internal use.
|
|
202
|
+
|
|
203
|
+
In particular, this can be used to evaluate ``self`` at a
|
|
204
|
+
point defined over an extension field.
|
|
205
|
+
|
|
206
|
+
INPUT: a sequence of 3 coordinates defining a point on ``self``
|
|
207
|
+
|
|
208
|
+
OUTPUT: the result of evaluating ``self`` at the given point
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
|
|
213
|
+
sage: E = EllipticCurve(j=GF(419)(1728))
|
|
214
|
+
sage: psi = EllipticCurveHom_scalar(E, 13)
|
|
215
|
+
sage: P = E.change_ring(GF(419**2)).lift_x(5)
|
|
216
|
+
sage: P = min({P, -P}) # fix choice of y
|
|
217
|
+
sage: Q = psi._eval(P); Q
|
|
218
|
+
(134 : 210*z2 + 314 : 1)
|
|
219
|
+
sage: Q.curve()
|
|
220
|
+
Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 419^2
|
|
221
|
+
"""
|
|
222
|
+
if self._domain.defining_polynomial()(*P):
|
|
223
|
+
raise ValueError(f'{P} not on {self._domain}')
|
|
224
|
+
return self._m * P
|
|
225
|
+
|
|
226
|
+
def _repr_(self):
|
|
227
|
+
"""
|
|
228
|
+
Return basic facts about this scalar multiplication as a string.
|
|
229
|
+
|
|
230
|
+
TESTS::
|
|
231
|
+
|
|
232
|
+
sage: E = EllipticCurve([i,i])
|
|
233
|
+
sage: E.scalar_multiplication(777)
|
|
234
|
+
Scalar-multiplication endomorphism [777] of Elliptic Curve defined by y^2 = x^3 + I*x + I over Number Field in I with defining polynomial x^2 + 1 with I = 1*I
|
|
235
|
+
"""
|
|
236
|
+
return f'Scalar-multiplication endomorphism [{self._m}] of {self._domain}'
|
|
237
|
+
|
|
238
|
+
# EllipticCurveHom methods
|
|
239
|
+
|
|
240
|
+
@staticmethod
|
|
241
|
+
def _composition_impl(self, other):
|
|
242
|
+
"""
|
|
243
|
+
Helper method to compose other elliptic-curve morphisms with
|
|
244
|
+
:class:`EllipticCurveHom_scalar` objects. Called by
|
|
245
|
+
:meth:`EllipticCurveHom._composition_`.
|
|
246
|
+
|
|
247
|
+
This method only handles composing two scalar multiplications;
|
|
248
|
+
all other cases are dealt with elsewhere.
|
|
249
|
+
|
|
250
|
+
TESTS::
|
|
251
|
+
|
|
252
|
+
sage: E = EllipticCurve([1,2,3,4,5])
|
|
253
|
+
sage: phi = E.scalar_multiplication(5)
|
|
254
|
+
sage: psi = E.scalar_multiplication(-7)
|
|
255
|
+
sage: phi * psi # implicit doctest
|
|
256
|
+
Scalar-multiplication endomorphism [-35] of Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over Rational Field
|
|
257
|
+
|
|
258
|
+
::
|
|
259
|
+
|
|
260
|
+
sage: phi._composition_impl(phi, E.automorphisms()[0])
|
|
261
|
+
NotImplemented
|
|
262
|
+
"""
|
|
263
|
+
if isinstance(self, EllipticCurveHom_scalar) and isinstance(other, EllipticCurveHom_scalar):
|
|
264
|
+
assert self._domain == other._domain
|
|
265
|
+
return EllipticCurveHom_scalar(self._domain, self._m * other._m)
|
|
266
|
+
return NotImplemented
|
|
267
|
+
|
|
268
|
+
def degree(self):
|
|
269
|
+
"""
|
|
270
|
+
Return the degree of this scalar-multiplication morphism.
|
|
271
|
+
|
|
272
|
+
The map `[m]` has degree `m^2`.
|
|
273
|
+
|
|
274
|
+
EXAMPLES::
|
|
275
|
+
|
|
276
|
+
sage: E = EllipticCurve(GF(23), [0,1])
|
|
277
|
+
sage: phi = E.scalar_multiplication(1111111)
|
|
278
|
+
sage: phi.degree()
|
|
279
|
+
1234567654321
|
|
280
|
+
|
|
281
|
+
TESTS:
|
|
282
|
+
|
|
283
|
+
The degree is still `m^2` even in the inseparable case::
|
|
284
|
+
|
|
285
|
+
sage: E = EllipticCurve(GF(23), [1,1])
|
|
286
|
+
sage: E.scalar_multiplication(23).degree()
|
|
287
|
+
529
|
|
288
|
+
sage: E = EllipticCurve(GF(23), [0,1])
|
|
289
|
+
sage: E.scalar_multiplication(23).degree()
|
|
290
|
+
529
|
|
291
|
+
"""
|
|
292
|
+
return self._degree
|
|
293
|
+
|
|
294
|
+
def _richcmp_(self, other, op):
|
|
295
|
+
"""
|
|
296
|
+
Compare this scalar multiplication to another elliptic-curve morphism.
|
|
297
|
+
|
|
298
|
+
.. WARNING::
|
|
299
|
+
|
|
300
|
+
This method sometimes calls :meth:`EllipticCurveHom._richcmp_`,
|
|
301
|
+
which sometimes compares :meth:`rational_maps`. Therefore, the
|
|
302
|
+
complexity is at least quadratic in `m` in the worst case.
|
|
303
|
+
|
|
304
|
+
EXAMPLES::
|
|
305
|
+
|
|
306
|
+
sage: E = EllipticCurve([i,i])
|
|
307
|
+
sage: phi = E.scalar_multiplication(-5)
|
|
308
|
+
sage: psi = E.scalar_multiplication(5)
|
|
309
|
+
sage: phi == -psi
|
|
310
|
+
True
|
|
311
|
+
|
|
312
|
+
TESTS::
|
|
313
|
+
|
|
314
|
+
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import negation_morphism
|
|
315
|
+
sage: neg = negation_morphism(E)
|
|
316
|
+
sage: phi == neg*psi == psi*neg == -psi
|
|
317
|
+
True
|
|
318
|
+
"""
|
|
319
|
+
if isinstance(other, EllipticCurveHom_scalar):
|
|
320
|
+
return richcmp((self._domain, self._m), (other._domain, other._m), op)
|
|
321
|
+
return EllipticCurveHom._richcmp_(self, other, op)
|
|
322
|
+
|
|
323
|
+
def rational_maps(self):
|
|
324
|
+
"""
|
|
325
|
+
Return the pair of explicit rational maps defining this scalar
|
|
326
|
+
multiplication.
|
|
327
|
+
|
|
328
|
+
ALGORITHM: :meth:`EllipticCurve_generic.multiplication_by_m`
|
|
329
|
+
|
|
330
|
+
EXAMPLES::
|
|
331
|
+
|
|
332
|
+
sage: E = EllipticCurve('77a1')
|
|
333
|
+
sage: phi = E.scalar_multiplication(5)
|
|
334
|
+
sage: phi.rational_maps()
|
|
335
|
+
((x^25 - 200*x^23 - 520*x^22 + ... + 368660*x^2 + 163195*x + 16456)/(25*x^24 + 1240*x^22 + 950*x^21 + ... + 20360*x^2 - 39480*x + 2209),
|
|
336
|
+
(10*x^36*y - 620*x^36 + 3240*x^34*y - ... + 226380480*x + 42986410*y + 20974090)/(1250*x^36 + 93000*x^34 + 71250*x^33 + ... + 138715800*x^2 - 27833400*x + 1038230))
|
|
337
|
+
sage: P = (2,3)
|
|
338
|
+
sage: Q = tuple(r(P) for r in phi.rational_maps()); Q
|
|
339
|
+
(30, 164)
|
|
340
|
+
sage: E(Q) == 5*E(P)
|
|
341
|
+
True
|
|
342
|
+
|
|
343
|
+
TESTS::
|
|
344
|
+
|
|
345
|
+
sage: {r.parent() for r in phi.rational_maps()}
|
|
346
|
+
{Fraction Field of Multivariate Polynomial Ring in x, y over Rational Field}
|
|
347
|
+
"""
|
|
348
|
+
if not self._rational_maps or None in self._rational_maps:
|
|
349
|
+
if not self._m:
|
|
350
|
+
raise ValueError('[0] is not expressible in (x,y) coordinates')
|
|
351
|
+
self._rational_maps = self._domain.multiplication_by_m(self._m)
|
|
352
|
+
return self._rational_maps
|
|
353
|
+
|
|
354
|
+
def x_rational_map(self):
|
|
355
|
+
"""
|
|
356
|
+
Return the `x`-coordinate rational map of this scalar
|
|
357
|
+
multiplication.
|
|
358
|
+
|
|
359
|
+
ALGORITHM: :meth:`EllipticCurve_generic.multiplication_by_m`
|
|
360
|
+
|
|
361
|
+
EXAMPLES::
|
|
362
|
+
|
|
363
|
+
sage: E = EllipticCurve(GF(65537), [1,2,3,4,5])
|
|
364
|
+
sage: phi = E.scalar_multiplication(7)
|
|
365
|
+
sage: phi.x_rational_map() == phi.rational_maps()[0]
|
|
366
|
+
True
|
|
367
|
+
|
|
368
|
+
TESTS::
|
|
369
|
+
|
|
370
|
+
sage: phi.x_rational_map().parent()
|
|
371
|
+
Fraction Field of Univariate Polynomial Ring in x over Finite Field of size 65537
|
|
372
|
+
"""
|
|
373
|
+
if not self._rational_maps:
|
|
374
|
+
if not self._m:
|
|
375
|
+
raise ValueError('[0] is not expressible in (x,y) coordinates')
|
|
376
|
+
h = self._domain.multiplication_by_m(self._m, x_only=True)
|
|
377
|
+
self._rational_maps = (self._mpoly_ring.fraction_field()(h), None)
|
|
378
|
+
f,g = map(self._poly_ring, (self._rational_maps[0].numerator(),
|
|
379
|
+
self._rational_maps[0].denominator()))
|
|
380
|
+
return f / g
|
|
381
|
+
|
|
382
|
+
def scaling_factor(self):
|
|
383
|
+
r"""
|
|
384
|
+
Return the Weierstrass scaling factor associated to this
|
|
385
|
+
scalar multiplication.
|
|
386
|
+
|
|
387
|
+
The scaling factor is the constant `u` (in the base field)
|
|
388
|
+
such that `\varphi^* \omega_2 = u \omega_1`, where
|
|
389
|
+
`\varphi: E_1\to E_2` is this morphism and `\omega_i` are
|
|
390
|
+
the standard Weierstrass differentials on `E_i` defined by
|
|
391
|
+
`\mathrm dx/(2y+a_1x+a_3)`.
|
|
392
|
+
|
|
393
|
+
EXAMPLES::
|
|
394
|
+
|
|
395
|
+
sage: E = EllipticCurve('11a1')
|
|
396
|
+
sage: phi = E.scalar_multiplication(5)
|
|
397
|
+
sage: u = phi.scaling_factor()
|
|
398
|
+
sage: u == phi.formal()[1]
|
|
399
|
+
True
|
|
400
|
+
sage: u == 5
|
|
401
|
+
True
|
|
402
|
+
|
|
403
|
+
The scaling factor lives in the base ring::
|
|
404
|
+
|
|
405
|
+
sage: E = EllipticCurve(GF(101^2), [5,5])
|
|
406
|
+
sage: phi = E.scalar_multiplication(123)
|
|
407
|
+
sage: phi.scaling_factor()
|
|
408
|
+
22
|
|
409
|
+
sage: phi.scaling_factor().parent()
|
|
410
|
+
Finite Field in z2 of size 101^2
|
|
411
|
+
|
|
412
|
+
ALGORITHM: The scaling factor equals the scalar that is being
|
|
413
|
+
multiplied by.
|
|
414
|
+
"""
|
|
415
|
+
return self._base_ring(self._m)
|
|
416
|
+
|
|
417
|
+
@cached_method
|
|
418
|
+
def kernel_polynomial(self):
|
|
419
|
+
r"""
|
|
420
|
+
Return the kernel polynomial of this scalar-multiplication map.
|
|
421
|
+
(When `m=0`, return `0`.)
|
|
422
|
+
|
|
423
|
+
EXAMPLES::
|
|
424
|
+
|
|
425
|
+
sage: E = EllipticCurve(GF(997), [7,7,7,7,7])
|
|
426
|
+
sage: phi = E.scalar_multiplication(5)
|
|
427
|
+
sage: phi.kernel_polynomial()
|
|
428
|
+
x^12 + 77*x^11 + 380*x^10 + 198*x^9 + 840*x^8 + 376*x^7 + 946*x^6 + 848*x^5 + 246*x^4 + 778*x^3 + 77*x^2 + 518*x + 28
|
|
429
|
+
|
|
430
|
+
::
|
|
431
|
+
|
|
432
|
+
sage: E = EllipticCurve(GF(997), [5,6,7,8,9])
|
|
433
|
+
sage: phi = E.scalar_multiplication(11)
|
|
434
|
+
sage: phi.kernel_polynomial()
|
|
435
|
+
x^60 + 245*x^59 + 353*x^58 + 693*x^57 + 499*x^56 + 462*x^55 + 820*x^54 + 962*x^53 + ... + 736*x^7 + 939*x^6 + 429*x^5 + 267*x^4 + 116*x^3 + 770*x^2 + 491*x + 519
|
|
436
|
+
|
|
437
|
+
TESTS::
|
|
438
|
+
|
|
439
|
+
sage: E = EllipticCurve(j = GF(997^6).random_element())
|
|
440
|
+
sage: m = choice([+1,-1]) * randrange(1,8)
|
|
441
|
+
sage: phi = E.scalar_multiplication(m)
|
|
442
|
+
sage: phi.kernel_polynomial() == phi.x_rational_map().denominator().monic().radical()
|
|
443
|
+
True
|
|
444
|
+
|
|
445
|
+
::
|
|
446
|
+
|
|
447
|
+
sage: E.scalar_multiplication(randint(-10,+10)).kernel_polynomial().parent()
|
|
448
|
+
Univariate Polynomial Ring in x over Finite Field in z6 of size 997^6
|
|
449
|
+
"""
|
|
450
|
+
if not self._m:
|
|
451
|
+
return self._poly_ring(0)
|
|
452
|
+
# TODO: inseparable case should be consistent with Frobenius' .kernel_polynomial()
|
|
453
|
+
return self._domain.division_polynomial(self._m.abs()).monic().radical()
|
|
454
|
+
|
|
455
|
+
def dual(self):
|
|
456
|
+
"""
|
|
457
|
+
Return the dual isogeny of this scalar-multiplication map.
|
|
458
|
+
|
|
459
|
+
This method simply returns ``self`` as scalars are self-dual.
|
|
460
|
+
|
|
461
|
+
EXAMPLES::
|
|
462
|
+
|
|
463
|
+
sage: E = EllipticCurve([5,5])
|
|
464
|
+
sage: phi = E.scalar_multiplication(5)
|
|
465
|
+
sage: phi.dual() is phi
|
|
466
|
+
True
|
|
467
|
+
"""
|
|
468
|
+
return self
|
|
469
|
+
|
|
470
|
+
def inseparable_degree(self):
|
|
471
|
+
r"""
|
|
472
|
+
Return the inseparable degree of this scalar-multiplication map.
|
|
473
|
+
|
|
474
|
+
EXAMPLES::
|
|
475
|
+
|
|
476
|
+
sage: E = EllipticCurve(GF(7), [0,1])
|
|
477
|
+
sage: E.is_supersingular()
|
|
478
|
+
False
|
|
479
|
+
sage: E.scalar_multiplication(4).inseparable_degree()
|
|
480
|
+
1
|
|
481
|
+
sage: E.scalar_multiplication(-7).inseparable_degree()
|
|
482
|
+
7
|
|
483
|
+
|
|
484
|
+
::
|
|
485
|
+
|
|
486
|
+
sage: E = EllipticCurve(GF(7), [1,0])
|
|
487
|
+
sage: E.is_supersingular()
|
|
488
|
+
True
|
|
489
|
+
sage: E.scalar_multiplication(4).inseparable_degree()
|
|
490
|
+
1
|
|
491
|
+
sage: E.scalar_multiplication(-7).inseparable_degree()
|
|
492
|
+
49
|
|
493
|
+
"""
|
|
494
|
+
p = self.base_ring().characteristic()
|
|
495
|
+
if not p:
|
|
496
|
+
return ZZ.one()
|
|
497
|
+
v = self._m.valuation(p)
|
|
498
|
+
if not v:
|
|
499
|
+
return ZZ.one()
|
|
500
|
+
rk = 1 + self._domain.is_supersingular()
|
|
501
|
+
return p**(rk*v)
|
|
502
|
+
|
|
503
|
+
def __neg__(self):
|
|
504
|
+
"""
|
|
505
|
+
Negate this scalar-multiplication map, i.e., return `[-m]`
|
|
506
|
+
when this morphism equals `[m]`.
|
|
507
|
+
|
|
508
|
+
If rational maps have been computed already, they will be
|
|
509
|
+
reused for the negated morphism.
|
|
510
|
+
|
|
511
|
+
EXAMPLES::
|
|
512
|
+
|
|
513
|
+
sage: E = EllipticCurve(GF(2^8), [1,0,1,0,1])
|
|
514
|
+
sage: phi = E.scalar_multiplication(23)
|
|
515
|
+
sage: -phi
|
|
516
|
+
Scalar-multiplication endomorphism [-23] of Elliptic Curve defined by y^2 + x*y + y = x^3 + 1 over Finite Field in z8 of size 2^8
|
|
517
|
+
|
|
518
|
+
TESTS::
|
|
519
|
+
|
|
520
|
+
sage: E = EllipticCurve(GF(79), [7,7])
|
|
521
|
+
sage: phi = E.scalar_multiplication(5)
|
|
522
|
+
sage: _ = phi.rational_maps()
|
|
523
|
+
sage: (-phi)._rational_maps
|
|
524
|
+
((x^25 + 11*x^23 - 24*x^22 - ... - 7*x^2 + 34*x + 21)/(25*x^24 - 5*x^22 - 23*x^21 - ... - 11*x^2 + 36*x + 21),
|
|
525
|
+
(29*x^36*y + 22*x^34*y - 27*x^33*y - ... + 14*x^2*y - 33*x*y + 37*y)/(9*x^36 + 21*x^34 - 14*x^33 + ... - 26*x^2 + 18*x + 7))
|
|
526
|
+
"""
|
|
527
|
+
result = EllipticCurveHom_scalar(self._domain, -self._m)
|
|
528
|
+
if self._rational_maps is not None:
|
|
529
|
+
w = negation_morphism(self._domain).rational_maps()
|
|
530
|
+
result._rational_maps = tuple(f(*w) if f is not None else None for f in self._rational_maps)
|
|
531
|
+
return result
|