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,105 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Elliptic curves with congruent mod-5 representation
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Alice Silverberg and Karl Rubin -- original PARI/GP version
|
|
8
|
+
|
|
9
|
+
- William Stein -- Sage version
|
|
10
|
+
"""
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
# This program is free software: you can redistribute it and/or modify
|
|
13
|
+
# it under the terms of the GNU General Public License as published by
|
|
14
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
15
|
+
# (at your option) any later version.
|
|
16
|
+
# https://www.gnu.org/licenses/
|
|
17
|
+
# ****************************************************************************
|
|
18
|
+
|
|
19
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
20
|
+
from sage.rings.rational_field import QQ
|
|
21
|
+
from .constructor import EllipticCurve
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def mod5family(a, b):
|
|
25
|
+
"""
|
|
26
|
+
Formulas for computing the family of elliptic curves with
|
|
27
|
+
congruent mod-5 representation.
|
|
28
|
+
|
|
29
|
+
EXAMPLES::
|
|
30
|
+
|
|
31
|
+
sage: from sage.schemes.elliptic_curves.mod5family import mod5family
|
|
32
|
+
sage: mod5family(0,1)
|
|
33
|
+
Elliptic Curve defined by y^2 = x^3 + (t^30+30*t^29+435*t^28+4060*t^27+27405*t^26+142506*t^25+593775*t^24+2035800*t^23+5852925*t^22+14307150*t^21+30045015*t^20+54627300*t^19+86493225*t^18+119759850*t^17+145422675*t^16+155117520*t^15+145422675*t^14+119759850*t^13+86493225*t^12+54627300*t^11+30045015*t^10+14307150*t^9+5852925*t^8+2035800*t^7+593775*t^6+142506*t^5+27405*t^4+4060*t^3+435*t^2+30*t+1) over Fraction Field of Univariate Polynomial Ring in t over Rational Field
|
|
34
|
+
"""
|
|
35
|
+
J = 4*a**3 / (4*a**3+27*b**2)
|
|
36
|
+
|
|
37
|
+
alpha = [0 for _ in range(21)]
|
|
38
|
+
alpha[0] = 1
|
|
39
|
+
alpha[1] = 0
|
|
40
|
+
alpha[2] = 190*(J - 1)
|
|
41
|
+
alpha[3] = -2280*(J - 1)**2
|
|
42
|
+
alpha[4] = 855*(J - 1)**2*(-17 + 16*J)
|
|
43
|
+
alpha[5] = 3648*(J - 1)**3*(17 - 9*J)
|
|
44
|
+
alpha[6] = 11400*(J - 1)**3*(17 - 8*J)
|
|
45
|
+
alpha[7] = -27360*(J - 1)**4*(17 + 26*J)
|
|
46
|
+
alpha[8] = 7410*(J - 1)**4*(-119 - 448*J + 432*J**2)
|
|
47
|
+
alpha[9] = 79040*(J - 1)**5*(17 + 145*J - 108*J**2)
|
|
48
|
+
alpha[10] = 8892*(J - 1)**5*(187 + 2640*J - 5104*J**2 + 1152*J**3)
|
|
49
|
+
alpha[11] = 98800*(J - 1)**6*(-17 - 388*J + 864*J**2)
|
|
50
|
+
alpha[12] = 7410*(J - 1)**6*(-187 - 6160*J + 24464*J**2 - 24192*J**3)
|
|
51
|
+
alpha[13] = 54720*(J - 1)**7*(17 + 795*J - 3944*J**2 + 9072*J**3)
|
|
52
|
+
alpha[14] = 2280*(J - 1)**7*(221 + 13832*J - 103792*J**2 + 554112*J**3 - 373248*J**4)
|
|
53
|
+
alpha[15] = 1824*(J - 1)**8*(-119 - 9842*J + 92608*J**2 - 911520*J**3 + 373248*J**4)
|
|
54
|
+
alpha[16] = 4275*(J - 1)**8*(-17 - 1792*J + 23264*J**2 - 378368*J**3 + 338688*J**4)
|
|
55
|
+
alpha[17] = 18240*(J - 1)**9*(1 + 133*J - 2132*J**2 + 54000*J**3 - 15552*J**4)
|
|
56
|
+
alpha[18] = 190*(J - 1)**9*(17 + 2784*J - 58080*J**2 + 2116864*J**3 - 946944*J**4 + 2985984*J**5)
|
|
57
|
+
alpha[19] = 360*(J - 1)**10*(-1 + 28*J - 1152*J**2)*(1 + 228*J + 176*J**2 + 1728*J**3)
|
|
58
|
+
alpha[20] = (J - 1)**10*(-19 - 4560*J + 144096*J**2 - 9859328*J**3 - 8798976*J**4 - 226934784*J**5 + 429981696*J**6)
|
|
59
|
+
|
|
60
|
+
beta = [0 for _ in range(31)]
|
|
61
|
+
beta[0] = 1
|
|
62
|
+
beta[1] = 30
|
|
63
|
+
beta[2] = -435*(J - 1)
|
|
64
|
+
beta[3] = 580*(J - 1)*(-7 + 9*J)
|
|
65
|
+
beta[4] = 3915*(J - 1)**2*(7 - 8*J)
|
|
66
|
+
beta[5] = 1566*(J - 1)**2*(91 - 78*J + 48*J**2)
|
|
67
|
+
beta[6] = -84825*(J - 1)**3*(7 + 16*J)
|
|
68
|
+
beta[7] = 156600*(J - 1)**3*(-13 - 91*J + 92*J**2)
|
|
69
|
+
beta[8] = 450225*(J - 1)**4*(13 + 208*J - 144*J**2)
|
|
70
|
+
beta[9] = 100050*(J - 1)**4*(143 + 4004*J - 5632*J**2 + 1728*J**3)
|
|
71
|
+
beta[10] = 30015*(J - 1)**5*(-1001 - 45760*J + 44880*J**2 - 6912*J**3)
|
|
72
|
+
beta[11] = 600300*(J - 1)**5*(-91 - 6175*J + 9272*J**2 - 2736*J**3)
|
|
73
|
+
beta[12] = 950475*(J - 1)**6*(91 + 8840*J - 7824*J**2)
|
|
74
|
+
beta[13] = 17108550*(J - 1)**6*(7 + 926*J - 1072*J**2 + 544*J**3)
|
|
75
|
+
beta[14] = 145422675*(J - 1)**7*(-1 - 176*J + 48*J**2 - 384*J**3)
|
|
76
|
+
beta[15] = 155117520*(J - 1)**8*(1 + 228*J + 176*J**2 + 1728*J**3)
|
|
77
|
+
beta[16] = 145422675*(J - 1)**8*(1 + 288*J + 288*J**2 + 5120*J**3 - 6912*J**4)
|
|
78
|
+
beta[17] = 17108550*(J - 1)**8*(7 + 2504*J + 3584*J**2 + 93184*J**3 - 283392*J**4 + 165888*J**5)
|
|
79
|
+
beta[18] = 950475*(J - 1)**9*(-91 - 39936*J - 122976*J**2 - 2960384*J**3 + 11577600*J**4 - 5971968*J**5)
|
|
80
|
+
beta[19] = 600300*(J - 1)**9*(-91 - 48243*J - 191568*J**2 - 6310304*J**3 + 40515072*J**4 - 46455552*J**5 + 11943936*J**6)
|
|
81
|
+
beta[20] = 30015*(J - 1)**10*(1001 + 634920*J + 3880800*J**2 + 142879744*J**3 - 1168475904*J**4 + 1188919296*J**5 - 143327232*J**6)
|
|
82
|
+
beta[21] = 100050*(J - 1)**10*(143 + 107250*J + 808368*J**2 + 38518336*J**3 - 451953408*J**4 + 757651968*J**5 - 367276032*J**6)
|
|
83
|
+
beta[22] = 450225*(J - 1)**11*(-13 - 11440*J - 117216*J**2 - 6444800*J**3 + 94192384*J**4 - 142000128*J**5 + 95551488*J**6)
|
|
84
|
+
beta[23] = 156600*(J - 1)**11*(-13 - 13299*J - 163284*J**2 - 11171552*J**3 + 217203840*J**4 - 474406656*J**5 + 747740160*J**6 - 429981696*J**7)
|
|
85
|
+
beta[24] = 6525*(J - 1)**12*(91 + 107536*J + 1680624*J**2 + 132912128*J**3 -
|
|
86
|
+
3147511552*J**4 + 6260502528*J**5 - 21054173184*J**6 + 10319560704*J**7)
|
|
87
|
+
beta[25] = 1566*(J - 1)**12*(91 + 123292*J + 2261248*J**2 + 216211904*J**3 -
|
|
88
|
+
6487793920*J**4 + 17369596928*J**5 - 97854234624*J**6 + 96136740864*J**7 - 20639121408*J**8)
|
|
89
|
+
beta[26] = 3915*(J - 1)**13*(-7 - 10816*J - 242352*J**2 - 26620160*J**3 + 953885440*J**4 -
|
|
90
|
+
2350596096*J**5 + 26796552192*J**6 - 13329432576*J**7)
|
|
91
|
+
beta[27] = 580*(J - 1)**13*(-7 - 12259*J - 317176*J**2 - 41205008*J**3 +
|
|
92
|
+
1808220160*J**4 - 5714806016*J**5 + 93590857728*J**6 - 70131806208*J**7 - 36118462464*J**8)
|
|
93
|
+
beta[28] = 435*(J - 1)**14*(1 + 1976*J + 60720*J**2 + 8987648*J**3 - 463120640*J**4 + 1359157248*J**5 -
|
|
94
|
+
40644882432*J**6 - 5016453120*J**7 + 61917364224*J**8)
|
|
95
|
+
beta[29] = 30*(J - 1)**14*(1 + 2218*J + 77680*J**2 + 13365152*J**3 -
|
|
96
|
+
822366976*J**4 + 2990693888*J**5 - 118286217216*J**6 - 24514928640*J**7 + 509958291456*J**8 - 743008370688*J**9)
|
|
97
|
+
beta[30] = (J - 1)**15*(-1 - 2480*J - 101040*J**2 - 19642496*J**3 + 1399023872*J**4 -
|
|
98
|
+
4759216128*J**5 + 315623485440*J**6 + 471904911360*J**7 - 2600529297408*J**8 + 8916100448256*J**9)
|
|
99
|
+
|
|
100
|
+
R = PolynomialRing(QQ, 't')
|
|
101
|
+
c2 = a * R(alpha)
|
|
102
|
+
c3 = b * R(beta)
|
|
103
|
+
d = c2.denominator().lcm(c3.denominator())
|
|
104
|
+
F = R.fraction_field()
|
|
105
|
+
return EllipticCurve(F, [c2 * d**4, c3 * d**6])
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Modular polynomials for elliptic curves
|
|
4
|
+
|
|
5
|
+
For a positive integer `\ell`, the classical modular polynomial
|
|
6
|
+
`\Phi_\ell \in \ZZ[X,Y]` is characterized by the property that its
|
|
7
|
+
zero set is exactly the set of pairs of `j`-invariants connected
|
|
8
|
+
by a cyclic `\ell`-isogeny.
|
|
9
|
+
|
|
10
|
+
AUTHORS:
|
|
11
|
+
|
|
12
|
+
- Lorenz Panny (2023)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from sage.structure.element import parent
|
|
16
|
+
|
|
17
|
+
from sage.rings.integer_ring import ZZ
|
|
18
|
+
|
|
19
|
+
from sage.libs.pari import pari
|
|
20
|
+
from cypari2.handle_error import PariError
|
|
21
|
+
|
|
22
|
+
_db = None
|
|
23
|
+
|
|
24
|
+
_cache_bound = 100
|
|
25
|
+
_cache = {}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def classical_modular_polynomial(l, j=None):
|
|
29
|
+
r"""
|
|
30
|
+
Return the classical modular polynomial `\Phi_\ell`, either as a
|
|
31
|
+
"generic" bivariate polynomial over `\ZZ`, or as an "instantiated"
|
|
32
|
+
modular polynomial where one variable has been replaced by the
|
|
33
|
+
given `j`-invariant.
|
|
34
|
+
|
|
35
|
+
Generic polynomials are cached up to a certain size of `\ell`,
|
|
36
|
+
which significantly accelerates subsequent invocations with the
|
|
37
|
+
same `\ell`. The default bound is `\ell \leq 100`, which can be
|
|
38
|
+
adjusted using ``classical_modular_polynomial.set_cache_bound()``
|
|
39
|
+
with a different value. Beware that modular polynomials are very
|
|
40
|
+
big objects and the amount of memory consumed by the cache will
|
|
41
|
+
grow rapidly when the bound is set to a large value.
|
|
42
|
+
|
|
43
|
+
INPUT:
|
|
44
|
+
|
|
45
|
+
- ``l`` -- positive integer
|
|
46
|
+
- ``j`` -- either ``None`` or a ring element:
|
|
47
|
+
|
|
48
|
+
* if ``None`` is given, the original modular polynomial
|
|
49
|
+
is returned as an element of `\ZZ[X,Y]`
|
|
50
|
+
* if a ring element `j \in R` is given, the evaluation
|
|
51
|
+
`\Phi_\ell(j,Y)` is returned as an element of the
|
|
52
|
+
univariate polynomial ring `R[Y]`
|
|
53
|
+
|
|
54
|
+
ALGORITHMS:
|
|
55
|
+
|
|
56
|
+
- The Kohel database
|
|
57
|
+
:class:`~sage.databases.db_modular_polynomials.ClassicalModularPolynomialDatabase`
|
|
58
|
+
- :pari:`polmodular`
|
|
59
|
+
|
|
60
|
+
EXAMPLES::
|
|
61
|
+
|
|
62
|
+
sage: classical_modular_polynomial(2)
|
|
63
|
+
-X^2*Y^2 + X^3 + 1488*X^2*Y + 1488*X*Y^2 + Y^3 - 162000*X^2 + 40773375*X*Y - 162000*Y^2 + 8748000000*X + 8748000000*Y - 157464000000000
|
|
64
|
+
sage: j = Mod(1728, 419)
|
|
65
|
+
sage: classical_modular_polynomial(3, j)
|
|
66
|
+
Y^4 + 230*Y^3 + 84*Y^2 + 118*Y + 329
|
|
67
|
+
|
|
68
|
+
Increasing the cache size can be useful for repeated invocations::
|
|
69
|
+
|
|
70
|
+
sage: %timeit classical_modular_polynomial(101) # not tested
|
|
71
|
+
6.11 s ± 1.21 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
|
|
72
|
+
sage: %timeit classical_modular_polynomial(101, GF(65537).random_element()) # not tested
|
|
73
|
+
5.43 s ± 2.71 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
|
|
74
|
+
|
|
75
|
+
sage: classical_modular_polynomial.set_cache_bound(150) # not tested
|
|
76
|
+
sage: %timeit classical_modular_polynomial(101) # not tested
|
|
77
|
+
The slowest run took 10.35 times longer than the fastest. This could mean that an intermediate result is being cached.
|
|
78
|
+
1.84 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
|
|
79
|
+
sage: %timeit classical_modular_polynomial(101, GF(65537).random_element()) # not tested
|
|
80
|
+
59.8 ms ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
|
|
81
|
+
|
|
82
|
+
TESTS::
|
|
83
|
+
|
|
84
|
+
sage: q = random_prime(50)^randrange(1,4)
|
|
85
|
+
sage: j = GF(q).random_element()
|
|
86
|
+
sage: l = random_prime(50)
|
|
87
|
+
sage: Y = polygen(parent(j), 'Y')
|
|
88
|
+
sage: classical_modular_polynomial(l, j) == classical_modular_polynomial(l)(j, Y)
|
|
89
|
+
True
|
|
90
|
+
sage: p = 2^216 * 3^137 - 1
|
|
91
|
+
sage: F.<i> = GF((p,2), modulus=[1,0,1])
|
|
92
|
+
sage: l = random_prime(50)
|
|
93
|
+
sage: j = F.random_element()
|
|
94
|
+
sage: Y = polygen(parent(j), 'Y')
|
|
95
|
+
sage: classical_modular_polynomial(l, j) == classical_modular_polynomial(l)(j, Y)
|
|
96
|
+
True
|
|
97
|
+
sage: E = EllipticCurve(F, [0, 6, 0, 1, 0])
|
|
98
|
+
sage: j = E.j_invariant()
|
|
99
|
+
sage: l = random_prime(50)
|
|
100
|
+
sage: classical_modular_polynomial(l, j) == classical_modular_polynomial(l)(j, Y)
|
|
101
|
+
True
|
|
102
|
+
sage: R.<Y> = QQ['Y']
|
|
103
|
+
sage: j = QQ(1/2)
|
|
104
|
+
sage: l = random_prime(50)
|
|
105
|
+
sage: classical_modular_polynomial(l, j) == classical_modular_polynomial(l)(j, Y)
|
|
106
|
+
True
|
|
107
|
+
"""
|
|
108
|
+
global _db
|
|
109
|
+
l = ZZ(l)
|
|
110
|
+
|
|
111
|
+
if j is None:
|
|
112
|
+
# We are supposed to return the generic modular polynomial. First
|
|
113
|
+
# check if it is already in the cache, then check the database,
|
|
114
|
+
# finally compute it using PARI.
|
|
115
|
+
try:
|
|
116
|
+
return _cache[l]
|
|
117
|
+
except KeyError:
|
|
118
|
+
pass
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
if _db is None:
|
|
122
|
+
from sage.databases.db_modular_polynomials import ClassicalModularPolynomialDatabase
|
|
123
|
+
_db = ClassicalModularPolynomialDatabase()
|
|
124
|
+
Phi = ZZ['X,Y'](_db[l])
|
|
125
|
+
except (FileNotFoundError, ImportError, ValueError):
|
|
126
|
+
try:
|
|
127
|
+
pari_Phi = pari.polmodular(l)
|
|
128
|
+
except PariError:
|
|
129
|
+
raise NotImplementedError('modular polynomial is not in database and computing it on the fly is not yet implemented')
|
|
130
|
+
d = {(i, j): c for i, f in enumerate(pari_Phi)
|
|
131
|
+
for j, c in enumerate(f)}
|
|
132
|
+
Phi = ZZ['X,Y'](d)
|
|
133
|
+
|
|
134
|
+
if l <= _cache_bound:
|
|
135
|
+
_cache[l] = Phi
|
|
136
|
+
|
|
137
|
+
return Phi
|
|
138
|
+
|
|
139
|
+
R = parent(j)['Y']
|
|
140
|
+
Y = R.gen()
|
|
141
|
+
|
|
142
|
+
# If the generic polynomial is in the cache or the database, evaluating
|
|
143
|
+
# it directly should always be faster than recomputing it from scratch.
|
|
144
|
+
if l in _cache:
|
|
145
|
+
return _cache[l](j, Y)
|
|
146
|
+
try:
|
|
147
|
+
if _db is None:
|
|
148
|
+
from sage.databases.db_modular_polynomials import ClassicalModularPolynomialDatabase
|
|
149
|
+
_db = ClassicalModularPolynomialDatabase()
|
|
150
|
+
Phi = _db[l]
|
|
151
|
+
except (ValueError, ImportError, FileNotFoundError):
|
|
152
|
+
pass
|
|
153
|
+
else:
|
|
154
|
+
if l <= _cache_bound:
|
|
155
|
+
_cache[l] = ZZ['X,Y'](Phi)
|
|
156
|
+
return Phi(j, Y)
|
|
157
|
+
|
|
158
|
+
# Now try to get the instantiated modular polynomial directly from PARI.
|
|
159
|
+
# This should be slightly more efficient (in particular regarding memory
|
|
160
|
+
# usage) than computing and evaluating the generic modular polynomial.
|
|
161
|
+
# This currently only works if we are over Z/nZ.
|
|
162
|
+
try:
|
|
163
|
+
pari_Phi = pari.polmodular(l, 0, j)
|
|
164
|
+
return R(pari_Phi)
|
|
165
|
+
except PariError:
|
|
166
|
+
pass
|
|
167
|
+
except TypeError:
|
|
168
|
+
return R(ZZ['Y'](pari_Phi))
|
|
169
|
+
|
|
170
|
+
# Nothing worked. Fall back to computing the generic modular polynomial
|
|
171
|
+
# and simply evaluating it.
|
|
172
|
+
return classical_modular_polynomial(l)(j, Y)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _set_cache_bound(bnd):
|
|
176
|
+
r"""
|
|
177
|
+
Internal helper function to allow setting the caching cutoff for
|
|
178
|
+
:func:`classical_modular_polynomial`.
|
|
179
|
+
|
|
180
|
+
Exposed as ``classical_modular_polynomial.set_cache_bound()``.
|
|
181
|
+
|
|
182
|
+
EXAMPLES::
|
|
183
|
+
|
|
184
|
+
sage: import sage.schemes.elliptic_curves.mod_poly as m
|
|
185
|
+
sage: m._cache_bound
|
|
186
|
+
100
|
|
187
|
+
sage: m._set_cache_bound(123)
|
|
188
|
+
sage: m._cache_bound
|
|
189
|
+
123
|
|
190
|
+
sage: classical_modular_polynomial.set_cache_bound is m._set_cache_bound
|
|
191
|
+
True
|
|
192
|
+
"""
|
|
193
|
+
global _cache_bound
|
|
194
|
+
_cache_bound = bnd
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
classical_modular_polynomial.set_cache_bound = _set_cache_bound
|
|
Binary file
|