passagemath-schemes 10.6.40__cp314-cp314-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.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.40.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
- passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.40.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-314-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-314-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-314-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-314-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-314-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-314-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-314-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-314-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-314-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-314-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-314-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-314-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,315 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Some functions regarding geometric endomorphism rings of Jacobians of
|
|
4
|
+
hyperelliptic curves.
|
|
5
|
+
|
|
6
|
+
There are currently two main functions in this module, associated to the
|
|
7
|
+
Jacobian `J` of a genus 2 curve over the rational numbers `\QQ`:
|
|
8
|
+
|
|
9
|
+
- ``get_is_geom_field``
|
|
10
|
+
- ``is_geom_trivial_when_field``
|
|
11
|
+
|
|
12
|
+
``get_is_geom_field`` determines whether the geometric endomorphism
|
|
13
|
+
algebra \textup{End}_{\overline{\QQ}}(J) \otimes \QQ` is a field.
|
|
14
|
+
|
|
15
|
+
``is_geom_trivial_when_field`` determines whether the geometric endomorphism ring
|
|
16
|
+
`\textup{End}_{\overline{\QQ}}(J)` is equal to the integer ring `\ZZ`, assuming
|
|
17
|
+
the geometric endomorphism algebra is a field. If this is the case, one says
|
|
18
|
+
that `J` is ``generic``.
|
|
19
|
+
|
|
20
|
+
These functions are used in `jacobian_generic.py` in the following two
|
|
21
|
+
analogous methods associated to the Jacobian `J` of a genus 2 curve over the
|
|
22
|
+
rational numbers `\QQ`:
|
|
23
|
+
|
|
24
|
+
- ``geometric_endomorphism_algebra_is_field(J)``
|
|
25
|
+
- ``geometric_endomorphism_ring_is_ZZ(J)``
|
|
26
|
+
|
|
27
|
+
Both of these are important attributes of the Jacobian J.
|
|
28
|
+
|
|
29
|
+
The algorithms in the functions in this module are implementations of
|
|
30
|
+
Algorithms 4.10 and 4.15 from Lombardo's paper [Lom2019]_.
|
|
31
|
+
|
|
32
|
+
The following examples have been verified with the corresponding LMFDB entries.
|
|
33
|
+
|
|
34
|
+
EXAMPLES:
|
|
35
|
+
|
|
36
|
+
Here is an example of a generic Jacobian; the LMFDB label of the curve is
|
|
37
|
+
249.a.249.1::
|
|
38
|
+
|
|
39
|
+
sage: R.<x> = QQ[]
|
|
40
|
+
sage: f = x^6 + 2*x^3 + 4*x^2 + 4*x + 1
|
|
41
|
+
sage: C = HyperellipticCurve(f)
|
|
42
|
+
sage: A = C.jacobian()
|
|
43
|
+
sage: A.geometric_endomorphism_ring_is_ZZ()
|
|
44
|
+
True
|
|
45
|
+
|
|
46
|
+
Here is an example of a Jacobian whose endomorphism algebra is a field but not
|
|
47
|
+
the rational number field; the LMFDB label of the curve is 529.a.529.1::
|
|
48
|
+
|
|
49
|
+
sage: f = x^6 - 4*x^5 + 2*x^4 + 2*x^3 + x^2 + 2*x + 1
|
|
50
|
+
sage: C = HyperellipticCurve(f)
|
|
51
|
+
sage: A = C.jacobian()
|
|
52
|
+
sage: A.geometric_endomorphism_algebra_is_field()
|
|
53
|
+
True
|
|
54
|
+
sage: A.geometric_endomorphism_ring_is_ZZ()
|
|
55
|
+
False
|
|
56
|
+
|
|
57
|
+
Here is an example of a Jacobian whose endomorphism algebra is not a field;
|
|
58
|
+
the LMFDB label of the curve is 169.a.169.1::
|
|
59
|
+
|
|
60
|
+
sage: f = x^6 + 4*x^5 + 6*x^4 + 2*x^3 + x^2 + 2*x + 1
|
|
61
|
+
sage: C = HyperellipticCurve(f)
|
|
62
|
+
sage: A = C.jacobian()
|
|
63
|
+
sage: A.geometric_endomorphism_algebra_is_field() # needs sage.groups
|
|
64
|
+
False
|
|
65
|
+
|
|
66
|
+
.. WARNING::
|
|
67
|
+
|
|
68
|
+
There is a very small chance that the algorithms return ``False`` for the
|
|
69
|
+
two methods described above when in fact one or both of them are ``True``.
|
|
70
|
+
In this case, as explained in the discussion immediately preceding
|
|
71
|
+
Algorithm 4.15 of [Lom2019]_, this can be established by increasing the
|
|
72
|
+
optional `B` parameter of the two methods. Mathematically, the algorithms
|
|
73
|
+
give the correct answer only in the limit as `B \to \infty`, although in
|
|
74
|
+
practice `B = 200` was sufficient to correctly verify every single entry
|
|
75
|
+
in the LMFDB.
|
|
76
|
+
|
|
77
|
+
AUTHORS:
|
|
78
|
+
|
|
79
|
+
- Barinder S. Banwait and Davide Lombardo (2021-06-09): initial version
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
# ****************************************************************************
|
|
83
|
+
# Copyright (C) 2021 Barinder S. Banwait and Davide Lombardo
|
|
84
|
+
#
|
|
85
|
+
# This program is free software: you can redistribute it and/or modify
|
|
86
|
+
# it under the terms of the GNU General Public License as published by
|
|
87
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
88
|
+
# (at your option) any later version.
|
|
89
|
+
# https://www.gnu.org/licenses/
|
|
90
|
+
# ****************************************************************************
|
|
91
|
+
|
|
92
|
+
from sage.rings.rational_field import QQ
|
|
93
|
+
from sage.rings.integer_ring import ZZ
|
|
94
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
95
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField
|
|
96
|
+
from sage.misc.lazy_import import lazy_import
|
|
97
|
+
from sage.rings.fast_arith import prime_range
|
|
98
|
+
from sage.arith.misc import GCD as gcd
|
|
99
|
+
|
|
100
|
+
lazy_import('sage.interfaces.genus2reduction', ['genus2reduction', 'Genus2reduction'])
|
|
101
|
+
lazy_import('sage.rings.number_field.number_field', 'NumberField')
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def satisfies_coefficient_condition(g, p):
|
|
105
|
+
"""
|
|
106
|
+
This is the coefficient condition in the definition of Omega_K'
|
|
107
|
+
on page 912 of the published version of paper.
|
|
108
|
+
|
|
109
|
+
EXAMPLES::
|
|
110
|
+
|
|
111
|
+
sage: from sage.schemes.hyperelliptic_curves.jacobian_endomorphism_utils import satisfies_coefficient_condition
|
|
112
|
+
sage: R.<x> = ZZ[]
|
|
113
|
+
sage: f = x^4 + x^3 + 17*x^2 + 5*x
|
|
114
|
+
sage: satisfies_coefficient_condition(f,17)
|
|
115
|
+
False
|
|
116
|
+
sage: f = x^4 + x^3 + 17*x^2 + 23*x + 23^2
|
|
117
|
+
sage: satisfies_coefficient_condition(f,23)
|
|
118
|
+
True
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
if g[0] != p**2:
|
|
122
|
+
return False
|
|
123
|
+
if g[3]*p != g[1]:
|
|
124
|
+
return False
|
|
125
|
+
if g[2] % p == 0:
|
|
126
|
+
return False
|
|
127
|
+
return True
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def get_is_geom_field(f, C, bad_primes, B=200):
|
|
131
|
+
r"""
|
|
132
|
+
Determine whether the geometric endomorphism algebra is a field.
|
|
133
|
+
|
|
134
|
+
This is Algorithm 4.10 in [Lom2019]_. The computation done here
|
|
135
|
+
may allow one to immediately conclude that the geometric endomorphism
|
|
136
|
+
ring is trivial (i.e. the integer ring); this information is output
|
|
137
|
+
in a second boolean to avoid unnecessary subsequent computation.
|
|
138
|
+
|
|
139
|
+
An additional optimisation comes from Part (2) of Theorem 4.8 in
|
|
140
|
+
[Lom2019]_, from which we can conclude that the endomorphism ring
|
|
141
|
+
is geometrically trivial, and from Proposition 4.7 in loc. cit. from
|
|
142
|
+
which we can rule out potential QM.
|
|
143
|
+
|
|
144
|
+
INPUT:
|
|
145
|
+
|
|
146
|
+
- ``f`` -- a polynomial defining the hyperelliptic curve
|
|
147
|
+
|
|
148
|
+
- ``C`` -- the hyperelliptic curve
|
|
149
|
+
|
|
150
|
+
- ``bad_primes`` -- the list of odd primes of bad reduction
|
|
151
|
+
|
|
152
|
+
- ``B`` -- (default: 200) the bound which appears in the statement of
|
|
153
|
+
the algorithm from [Lom2019]_
|
|
154
|
+
|
|
155
|
+
OUTPUT:
|
|
156
|
+
|
|
157
|
+
Pair of booleans (bool1, bool2). `bool1` indicates if the
|
|
158
|
+
geometric endomorphism algebra is a field; `bool2` indicates if the
|
|
159
|
+
geometric endomorphism algebra is the field of rational numbers.
|
|
160
|
+
|
|
161
|
+
WARNING:
|
|
162
|
+
|
|
163
|
+
There is a very small chance that this algorithm return ``False`` when in
|
|
164
|
+
fact it is ``True``. In this case, as explained in the discussion
|
|
165
|
+
immediately preceding Algorithm 4.15 of [Lom2019]_, this can be established
|
|
166
|
+
by increasing the optional `B` parameter. Mathematically, this algorithm
|
|
167
|
+
gives the correct answer only in the limit as `B \to \infty`, although in
|
|
168
|
+
practice `B = 200` was sufficient to correctly verify every single entry
|
|
169
|
+
in the LMFDB. However, strictly speaking, a ``False`` returned by this
|
|
170
|
+
function is not provably ``False``.
|
|
171
|
+
|
|
172
|
+
EXAMPLES:
|
|
173
|
+
|
|
174
|
+
This is LMFDB curve 940693.a.960693.1::
|
|
175
|
+
|
|
176
|
+
sage: from sage.schemes.hyperelliptic_curves.jacobian_endomorphism_utils import get_is_geom_field
|
|
177
|
+
sage: R.<x> = QQ[]
|
|
178
|
+
sage: f = 4*x^6 - 12*x^5 + 20*x^3 - 8*x^2 - 4*x + 1
|
|
179
|
+
sage: C = HyperellipticCurve(f)
|
|
180
|
+
sage: get_is_geom_field(f,C,[13,269]) # needs sage.groups
|
|
181
|
+
(False, False)
|
|
182
|
+
|
|
183
|
+
This is LMFDB curve 3125.a.3125.1::
|
|
184
|
+
|
|
185
|
+
sage: f = 4*x^5 + 1
|
|
186
|
+
sage: C = HyperellipticCurve(f)
|
|
187
|
+
sage: get_is_geom_field(f,C,[5]) # needs sage.groups
|
|
188
|
+
(True, False)
|
|
189
|
+
|
|
190
|
+
This is LMFDB curve 277.a.277.2::
|
|
191
|
+
|
|
192
|
+
sage: f = 4*x^6 - 36*x^4 + 56*x^3 - 76*x^2 + 44*x - 23
|
|
193
|
+
sage: C = HyperellipticCurve(f)
|
|
194
|
+
sage: get_is_geom_field(f,C,[277]) # needs sage.groups
|
|
195
|
+
(True, True)
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
if C.has_odd_degree_model():
|
|
199
|
+
C_odd = C.odd_degree_model()
|
|
200
|
+
f_odd, h_odd = C_odd.hyperelliptic_polynomials()
|
|
201
|
+
# if f was odd to begin with, then f_odd = f
|
|
202
|
+
assert f_odd.degree() == 5
|
|
203
|
+
|
|
204
|
+
if (4*f_odd + h_odd**2).degree() == 5:
|
|
205
|
+
f_new = 4*f_odd + h_odd**2
|
|
206
|
+
if f_new.is_irreducible():
|
|
207
|
+
# i.e. the Jacobian is geometrically simple
|
|
208
|
+
f_disc_odd_prime_exponents = [v for _,v in f_new.discriminant().prime_to_S_part([ZZ(2)]).factor()]
|
|
209
|
+
if 1 in f_disc_odd_prime_exponents:
|
|
210
|
+
return (True, True) # Theorem 4.8 (2)
|
|
211
|
+
# At this point we are in the situation of Algorithm 4.10
|
|
212
|
+
# Step 1, so either the geometric endomorphism algebra is a
|
|
213
|
+
# field or it is a quaternion algebra. This latter case implies
|
|
214
|
+
# that the Jacobian is the square of an elliptic curve modulo
|
|
215
|
+
# a prime p where f is also irreducible (which exist by
|
|
216
|
+
# Chebotarev density). This contradicts Prop 4.7, hence we can
|
|
217
|
+
# conclude as follows.
|
|
218
|
+
return (True, False)
|
|
219
|
+
|
|
220
|
+
if f.is_irreducible():
|
|
221
|
+
assert f.degree() == 6 # else we should already have exited by now
|
|
222
|
+
G = f.galois_group()
|
|
223
|
+
if G.order() in [360, 720]:
|
|
224
|
+
return (True, True) # Algorithm 4.10 Step 2
|
|
225
|
+
|
|
226
|
+
R = PolynomialRing(ZZ,2,"xv")
|
|
227
|
+
x,v = R.gens()
|
|
228
|
+
T = PolynomialRing(QQ,'v')
|
|
229
|
+
g = v - x**12
|
|
230
|
+
|
|
231
|
+
for p in prime_range(3,B):
|
|
232
|
+
if p not in bad_primes:
|
|
233
|
+
fp = C.change_ring(FiniteField(p)).frobenius_polynomial()
|
|
234
|
+
|
|
235
|
+
# This defines the polynomial f_v**[12] from the paper
|
|
236
|
+
fp12 = T(R(fp).resultant(g))
|
|
237
|
+
|
|
238
|
+
if fp12.is_irreducible():
|
|
239
|
+
# i.e. the Jacobian is geometrically simple
|
|
240
|
+
f_disc_odd_prime_exponents = [v for _,v in f.discriminant().prime_to_S_part([ZZ(2)]).factor()]
|
|
241
|
+
if 1 in f_disc_odd_prime_exponents:
|
|
242
|
+
return (True, True) # Theorem 4.8 (2)
|
|
243
|
+
return (True, False) # Algorithm 4.10 Step 3 plus Prop 4.7 as above
|
|
244
|
+
return (False, False)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def is_geom_trivial_when_field(C, bad_primes, B=200):
|
|
248
|
+
r"""
|
|
249
|
+
Determine if the geometric endomorphism ring is trivial assuming the
|
|
250
|
+
geometric endomorphism algebra is a field.
|
|
251
|
+
|
|
252
|
+
This is Algorithm 4.15 in [Lom2019]_.
|
|
253
|
+
|
|
254
|
+
INPUT:
|
|
255
|
+
|
|
256
|
+
- ``C`` -- the hyperelliptic curve
|
|
257
|
+
|
|
258
|
+
- ``bad_primes`` -- the list of odd primes of bad reduction
|
|
259
|
+
|
|
260
|
+
- ``B`` -- (default: 200) the bound which appears in the statement of
|
|
261
|
+
the algorithm from [Lom2019]_
|
|
262
|
+
|
|
263
|
+
OUTPUT:
|
|
264
|
+
|
|
265
|
+
Boolean indicating whether or not the geometric endomorphism
|
|
266
|
+
algebra is the field of rational numbers.
|
|
267
|
+
|
|
268
|
+
WARNING:
|
|
269
|
+
|
|
270
|
+
There is a very small chance that this algorithm returns ``False`` when in
|
|
271
|
+
fact it is ``True``. In this case, as explained in the discussion
|
|
272
|
+
immediately preceding Algorithm 4.15 of [Lom2019]_, this can be established
|
|
273
|
+
by increasing the optional `B` parameter. Mathematically, this algorithm
|
|
274
|
+
gives the correct answer only in the limit as `B \to \infty`, although in
|
|
275
|
+
practice `B = 200` was sufficient to correctly verify every single entry
|
|
276
|
+
in the LMFDB. However, strictly speaking, a ``False`` returned by this
|
|
277
|
+
function is not provably ``False``.
|
|
278
|
+
|
|
279
|
+
EXAMPLES:
|
|
280
|
+
|
|
281
|
+
This is LMFDB curve 461.a.461.2::
|
|
282
|
+
|
|
283
|
+
sage: from sage.schemes.hyperelliptic_curves.jacobian_endomorphism_utils import is_geom_trivial_when_field
|
|
284
|
+
sage: R.<x> = QQ[]
|
|
285
|
+
sage: f = 4*x^5 - 4*x^4 - 156*x^3 + 40*x^2 + 1088*x - 1223
|
|
286
|
+
sage: C = HyperellipticCurve(f)
|
|
287
|
+
sage: is_geom_trivial_when_field(C,[461])
|
|
288
|
+
True
|
|
289
|
+
|
|
290
|
+
This is LMFDB curve 4489.a.4489.1::
|
|
291
|
+
|
|
292
|
+
sage: f = x^6 + 4*x^5 + 2*x^4 + 2*x^3 + x^2 - 2*x + 1
|
|
293
|
+
sage: C = HyperellipticCurve(f)
|
|
294
|
+
sage: is_geom_trivial_when_field(C,[67])
|
|
295
|
+
False
|
|
296
|
+
"""
|
|
297
|
+
|
|
298
|
+
running_gcd = 0
|
|
299
|
+
R = PolynomialRing(ZZ,2,"xv")
|
|
300
|
+
x,v = R.gens()
|
|
301
|
+
T = PolynomialRing(QQ,'v')
|
|
302
|
+
g = v - x**4
|
|
303
|
+
|
|
304
|
+
for p in prime_range(3,B):
|
|
305
|
+
if p not in bad_primes:
|
|
306
|
+
Cp = C.change_ring(FiniteField(p))
|
|
307
|
+
fp = Cp.frobenius_polynomial()
|
|
308
|
+
if satisfies_coefficient_condition(fp, p):
|
|
309
|
+
# This defines the polynomial f_v**[4] from the paper
|
|
310
|
+
fp4 = T(R(fp).resultant(g))
|
|
311
|
+
if fp4.is_irreducible():
|
|
312
|
+
running_gcd = gcd(running_gcd, NumberField(fp,'a').discriminant())
|
|
313
|
+
if running_gcd <= 24:
|
|
314
|
+
return True
|
|
315
|
+
return False
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Jacobian of a hyperelliptic curve of genus 2
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
#*****************************************************************************
|
|
7
|
+
# Copyright (C) 2006 David Kohel <kohel@maths.usyd.edu>
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# http://www.gnu.org/licenses/
|
|
10
|
+
#*****************************************************************************
|
|
11
|
+
|
|
12
|
+
from . import jacobian_generic
|
|
13
|
+
from . import kummer_surface
|
|
14
|
+
|
|
15
|
+
# The generic genus 2 curve in Weierstrass form:
|
|
16
|
+
#
|
|
17
|
+
# y^2 + (c0*x^3 + c2*x^2 + c4*x + c6)*y =
|
|
18
|
+
# a0*x^6 + a2*x^5 + a4*x^4 + a6*x^3 + a8*x^2 + a10*x + a12.
|
|
19
|
+
#
|
|
20
|
+
# Transforms to:
|
|
21
|
+
#
|
|
22
|
+
# y^2 = (4*a0 + c0^2)*x^6 + (4*a2 + 2*c0*c2)*x^5
|
|
23
|
+
# + (4*a4 + 2*c0*c4 + c2^2)*x^4 + (4*a6 + 2*c0*c6 + 2*c2*c4)*x^3
|
|
24
|
+
# + (4*a8 + 2*c2*c6 + c4^2)*x^2 + (4*a10 + 2*c4*c6)*x + 4*a12 + c6^2
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class HyperellipticJacobian_g2(jacobian_generic.HyperellipticJacobian_generic):
|
|
28
|
+
def kummer_surface(self):
|
|
29
|
+
try:
|
|
30
|
+
return self._kummer_surface
|
|
31
|
+
except AttributeError:
|
|
32
|
+
return kummer_surface.KummerSurface(self)
|