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,237 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Construct elliptic curves as Jacobians
|
|
4
|
+
|
|
5
|
+
An elliptic curve is a genus one curve with a designated point. The
|
|
6
|
+
Jacobian of a genus-one curve can be defined as the set of line
|
|
7
|
+
bundles on the curve, and is isomorphic to the original genus-one
|
|
8
|
+
curve. It is also an elliptic curve with the trivial line bundle as
|
|
9
|
+
designated point. The utility of this construction is that we can
|
|
10
|
+
construct elliptic curves without having to specify which point we
|
|
11
|
+
take as the origin.
|
|
12
|
+
|
|
13
|
+
EXAMPLES::
|
|
14
|
+
|
|
15
|
+
sage: R.<u,v,w> = QQ[]
|
|
16
|
+
sage: Jacobian(u^3 + v^3 + w^3)
|
|
17
|
+
Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
18
|
+
sage: Jacobian(u^4 + v^4 + w^2)
|
|
19
|
+
Elliptic Curve defined by y^2 = x^3 - 4*x over Rational Field
|
|
20
|
+
|
|
21
|
+
sage: C = Curve(u^3 + v^3 + w^3)
|
|
22
|
+
sage: Jacobian(C)
|
|
23
|
+
Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
24
|
+
|
|
25
|
+
sage: P2.<u,v,w> = ProjectiveSpace(2, QQ)
|
|
26
|
+
sage: C = P2.subscheme(u^3 + v^3 + w^3)
|
|
27
|
+
sage: Jacobian(C)
|
|
28
|
+
Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
29
|
+
|
|
30
|
+
One can also define Jacobians of varieties that are not genus-one
|
|
31
|
+
curves. These are not implemented in this module, but we call the
|
|
32
|
+
relevant functionality::
|
|
33
|
+
|
|
34
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
35
|
+
sage: f = x**5 + 1184*x**3 + 1846*x**2 + 956*x + 560
|
|
36
|
+
sage: C = HyperellipticCurve(f)
|
|
37
|
+
sage: Jacobian(C)
|
|
38
|
+
Jacobian of Hyperelliptic Curve over Rational Field defined
|
|
39
|
+
by y^2 = x^5 + 1184*x^3 + 1846*x^2 + 956*x + 560
|
|
40
|
+
|
|
41
|
+
REFERENCES:
|
|
42
|
+
|
|
43
|
+
- :wikipedia:`Jacobian_variety`
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
##############################################################################
|
|
47
|
+
# Copyright (C) 2013 Volker Braun <vbraun.name@gmail.com>
|
|
48
|
+
#
|
|
49
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
50
|
+
#
|
|
51
|
+
# The full text of the GPL is available at:
|
|
52
|
+
#
|
|
53
|
+
# http://www.gnu.org/licenses/
|
|
54
|
+
##############################################################################
|
|
55
|
+
|
|
56
|
+
from sage.schemes.elliptic_curves.constructor import EllipticCurve
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def Jacobian(X, **kwds):
|
|
60
|
+
"""
|
|
61
|
+
Return the Jacobian.
|
|
62
|
+
|
|
63
|
+
INPUT:
|
|
64
|
+
|
|
65
|
+
- ``X`` -- polynomial, algebraic variety, or anything else that
|
|
66
|
+
has a Jacobian elliptic curve
|
|
67
|
+
|
|
68
|
+
- ``kwds`` -- optional keyword arguments
|
|
69
|
+
|
|
70
|
+
The input ``X`` can be one of the following:
|
|
71
|
+
|
|
72
|
+
* A polynomial, see :func:`Jacobian_of_equation` for details.
|
|
73
|
+
|
|
74
|
+
* A curve, see :func:`Jacobian_of_curve` for details.
|
|
75
|
+
|
|
76
|
+
EXAMPLES::
|
|
77
|
+
|
|
78
|
+
sage: R.<u,v,w> = QQ[]
|
|
79
|
+
sage: Jacobian(u^3 + v^3 + w^3)
|
|
80
|
+
Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
81
|
+
|
|
82
|
+
sage: C = Curve(u^3 + v^3 + w^3)
|
|
83
|
+
sage: Jacobian(C)
|
|
84
|
+
Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
85
|
+
|
|
86
|
+
sage: P2.<u,v,w> = ProjectiveSpace(2, QQ)
|
|
87
|
+
sage: C = P2.subscheme(u^3 + v^3 + w^3)
|
|
88
|
+
sage: Jacobian(C)
|
|
89
|
+
Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
90
|
+
|
|
91
|
+
sage: Jacobian(C, morphism=True)
|
|
92
|
+
Scheme morphism:
|
|
93
|
+
From: Closed subscheme of Projective Space of dimension 2 over Rational Field defined by:
|
|
94
|
+
u^3 + v^3 + w^3
|
|
95
|
+
To: Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
96
|
+
Defn: Defined on coordinates by sending (u : v : w) to
|
|
97
|
+
(-u^4*v^4*w - u^4*v*w^4 - u*v^4*w^4 :
|
|
98
|
+
1/2*u^6*v^3 - 1/2*u^3*v^6 - 1/2*u^6*w^3 + 1/2*v^6*w^3 + 1/2*u^3*w^6 - 1/2*v^3*w^6 :
|
|
99
|
+
u^3*v^3*w^3)
|
|
100
|
+
"""
|
|
101
|
+
try:
|
|
102
|
+
return X.jacobian(**kwds)
|
|
103
|
+
except (AttributeError, TypeError):
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
morphism = kwds.pop('morphism', False)
|
|
107
|
+
from sage.rings.polynomial.multi_polynomial import MPolynomial
|
|
108
|
+
if isinstance(X, MPolynomial):
|
|
109
|
+
if morphism:
|
|
110
|
+
from sage.schemes.curves.constructor import Curve
|
|
111
|
+
return Jacobian_of_equation(X, curve=Curve(X), **kwds)
|
|
112
|
+
else:
|
|
113
|
+
return Jacobian_of_equation(X, **kwds)
|
|
114
|
+
|
|
115
|
+
from sage.schemes.generic.scheme import Scheme
|
|
116
|
+
if isinstance(X, Scheme) and X.dimension() == 1:
|
|
117
|
+
return Jacobian_of_curve(X, morphism=morphism, **kwds)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def Jacobian_of_curve(curve, morphism=False):
|
|
121
|
+
"""
|
|
122
|
+
Return the Jacobian of a genus-one curve.
|
|
123
|
+
|
|
124
|
+
INPUT:
|
|
125
|
+
|
|
126
|
+
- ``curve`` -- a one-dimensional algebraic variety of genus one
|
|
127
|
+
|
|
128
|
+
OUTPUT: its Jacobian elliptic curve
|
|
129
|
+
|
|
130
|
+
EXAMPLES::
|
|
131
|
+
|
|
132
|
+
sage: R.<u,v,w> = QQ[]
|
|
133
|
+
sage: C = Curve(u^3 + v^3 + w^3)
|
|
134
|
+
sage: Jacobian(C)
|
|
135
|
+
Elliptic Curve defined by y^2 = x^3 - 27/4 over Rational Field
|
|
136
|
+
"""
|
|
137
|
+
eqn = None
|
|
138
|
+
try:
|
|
139
|
+
eqn = curve.defining_polynomial()
|
|
140
|
+
except AttributeError:
|
|
141
|
+
pass
|
|
142
|
+
if len(curve.defining_polynomials()) == 1:
|
|
143
|
+
eqn = curve.defining_polynomials()[0]
|
|
144
|
+
if eqn is not None:
|
|
145
|
+
if morphism:
|
|
146
|
+
return Jacobian_of_equation(eqn, curve=curve)
|
|
147
|
+
else:
|
|
148
|
+
return Jacobian_of_equation(eqn)
|
|
149
|
+
raise NotImplementedError('Jacobian for this curve is not implemented')
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def Jacobian_of_equation(polynomial, variables=None, curve=None):
|
|
153
|
+
r"""
|
|
154
|
+
Construct the Jacobian of a genus-one curve given by a polynomial.
|
|
155
|
+
|
|
156
|
+
INPUT:
|
|
157
|
+
|
|
158
|
+
- ``F`` -- a polynomial defining a plane curve of genus one. May
|
|
159
|
+
be homogeneous or inhomogeneous
|
|
160
|
+
|
|
161
|
+
- ``variables`` -- list of two or three variables or ``None``
|
|
162
|
+
(default). The inhomogeneous or homogeneous coordinates. By
|
|
163
|
+
default, all variables in the polynomial are used.
|
|
164
|
+
|
|
165
|
+
- ``curve`` -- the genus-one curve defined by ``polynomial`` or #
|
|
166
|
+
``None`` (default). If specified, suitable morphism from the
|
|
167
|
+
jacobian elliptic curve to the curve is returned.
|
|
168
|
+
|
|
169
|
+
OUTPUT:
|
|
170
|
+
|
|
171
|
+
An elliptic curve in short Weierstrass form isomorphic to the
|
|
172
|
+
curve ``polynomial=0``. If the optional argument ``curve`` is
|
|
173
|
+
specified, a rational multicover from the Jacobian elliptic curve
|
|
174
|
+
to the genus-one curve is returned.
|
|
175
|
+
|
|
176
|
+
EXAMPLES::
|
|
177
|
+
|
|
178
|
+
sage: R.<a,b,c> = QQ[]
|
|
179
|
+
sage: f = a^3 + b^3 + 60*c^3
|
|
180
|
+
sage: Jacobian(f)
|
|
181
|
+
Elliptic Curve defined by y^2 = x^3 - 24300 over Rational Field
|
|
182
|
+
sage: Jacobian(f.subs(c=1))
|
|
183
|
+
Elliptic Curve defined by y^2 = x^3 - 24300 over Rational Field
|
|
184
|
+
|
|
185
|
+
If we specify the domain curve, the birational covering is returned::
|
|
186
|
+
|
|
187
|
+
sage: h = Jacobian(f, curve=Curve(f)); h
|
|
188
|
+
Scheme morphism:
|
|
189
|
+
From: Projective Plane Curve over Rational Field defined by a^3 + b^3 + 60*c^3
|
|
190
|
+
To: Elliptic Curve defined by y^2 = x^3 - 24300 over Rational Field
|
|
191
|
+
Defn: Defined on coordinates by sending (a : b : c) to
|
|
192
|
+
(-216000*a^4*b^4*c - 12960000*a^4*b*c^4 - 12960000*a*b^4*c^4
|
|
193
|
+
: 108000*a^6*b^3 - 108000*a^3*b^6 - 6480000*a^6*c^3 + 6480000*b^6*c^3
|
|
194
|
+
+ 388800000*a^3*c^6 - 388800000*b^3*c^6
|
|
195
|
+
: 216000*a^3*b^3*c^3)
|
|
196
|
+
|
|
197
|
+
sage: h([1,-1,0])
|
|
198
|
+
(0 : 1 : 0)
|
|
199
|
+
|
|
200
|
+
Plugging in the polynomials defining `h` allows us to verify that
|
|
201
|
+
it is indeed a rational morphism to the elliptic curve::
|
|
202
|
+
|
|
203
|
+
sage: E = h.codomain()
|
|
204
|
+
sage: E.defining_polynomial()(h.defining_polynomials()).factor()
|
|
205
|
+
(2519424000000000) * c^3 * b^3 * a^3 * (a^3 + b^3 + 60*c^3)
|
|
206
|
+
* (a^9*b^6 + a^6*b^9 - 120*a^9*b^3*c^3 + 900*a^6*b^6*c^3 - 120*a^3*b^9*c^3
|
|
207
|
+
+ 3600*a^9*c^6 + 54000*a^6*b^3*c^6 + 54000*a^3*b^6*c^6 + 3600*b^9*c^6
|
|
208
|
+
+ 216000*a^6*c^9 - 432000*a^3*b^3*c^9 + 216000*b^6*c^9)
|
|
209
|
+
|
|
210
|
+
By specifying the variables, we can also construct an elliptic
|
|
211
|
+
curve over a polynomial ring::
|
|
212
|
+
|
|
213
|
+
sage: R.<u,v,t> = QQ[]
|
|
214
|
+
sage: Jacobian(u^3 + v^3 + t, variables=[u,v])
|
|
215
|
+
Elliptic Curve defined by y^2 = x^3 + (-27/4*t^2) over
|
|
216
|
+
Multivariate Polynomial Ring in u, v, t over Rational Field
|
|
217
|
+
|
|
218
|
+
TESTS::
|
|
219
|
+
|
|
220
|
+
sage: from sage.schemes.elliptic_curves.jacobian import Jacobian_of_equation
|
|
221
|
+
sage: Jacobian_of_equation(f, variables=[a,b,c])
|
|
222
|
+
Elliptic Curve defined by y^2 = x^3 - 24300 over Rational Field
|
|
223
|
+
"""
|
|
224
|
+
from sage.schemes.toric.weierstrass import WeierstrassForm
|
|
225
|
+
f, g = WeierstrassForm(polynomial, variables=variables)
|
|
226
|
+
try:
|
|
227
|
+
K = polynomial.base_ring()
|
|
228
|
+
f = K(f)
|
|
229
|
+
g = K(g)
|
|
230
|
+
except (TypeError, ValueError):
|
|
231
|
+
pass
|
|
232
|
+
E = EllipticCurve([f, g])
|
|
233
|
+
if curve is None:
|
|
234
|
+
return E
|
|
235
|
+
X, Y, Z = WeierstrassForm(polynomial, variables=variables, transformation=True)
|
|
236
|
+
from sage.schemes.elliptic_curves.weierstrass_transform import WeierstrassTransformation
|
|
237
|
+
return WeierstrassTransformation(curve, E, [X*Z, Y, Z**3], 1)
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Kodaira symbols
|
|
4
|
+
|
|
5
|
+
Kodaira symbols encode the type of reduction of an elliptic curve at a
|
|
6
|
+
(finite) place.
|
|
7
|
+
|
|
8
|
+
The standard notation for Kodaira Symbols is as a string which is one
|
|
9
|
+
of `\rm{I}_m`, `\rm{II}`, `\rm{III}`, `\rm{IV}`, `\rm{I}^*_m`,
|
|
10
|
+
`\rm{II}^*`, `\rm{III}^*`, `\rm{IV}^*`, where `m` denotes a
|
|
11
|
+
nonnegative integer. These have been encoded by single integers by
|
|
12
|
+
different people. For convenience we give here the conversion table
|
|
13
|
+
between strings, the eclib coding and the PARI encoding.
|
|
14
|
+
|
|
15
|
+
+----------------------+----------------+--------------------+
|
|
16
|
+
| Kodaira Symbol | Eclib coding | PARI Coding |
|
|
17
|
+
+======================+================+====================+
|
|
18
|
+
| `\rm{I}_0` | `0` | `1` |
|
|
19
|
+
+----------------------+----------------+--------------------+
|
|
20
|
+
| `\rm{I}^*_0` | `1` | `-1` |
|
|
21
|
+
+----------------------+----------------+--------------------+
|
|
22
|
+
| `\rm{I}_m` `(m>0)` | `10m` | `m+4` |
|
|
23
|
+
+----------------------+----------------+--------------------+
|
|
24
|
+
| `\rm{I}^*_m` `(m>0)` | `10m+1` | `-(m+4)` |
|
|
25
|
+
+----------------------+----------------+--------------------+
|
|
26
|
+
| `\rm{II}` | `2` | `2` |
|
|
27
|
+
+----------------------+----------------+--------------------+
|
|
28
|
+
| `\rm{III}` | `3` | `3` |
|
|
29
|
+
+----------------------+----------------+--------------------+
|
|
30
|
+
| `\rm{IV}` | `4` | `4` |
|
|
31
|
+
+----------------------+----------------+--------------------+
|
|
32
|
+
| `\rm{II}^*` | `7` | `-2` |
|
|
33
|
+
+----------------------+----------------+--------------------+
|
|
34
|
+
| `\rm{III}^*` | `6` | `-3` |
|
|
35
|
+
+----------------------+----------------+--------------------+
|
|
36
|
+
| `\rm{IV}^*` | `5` | `-4` |
|
|
37
|
+
+----------------------+----------------+--------------------+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
AUTHORS:
|
|
41
|
+
|
|
42
|
+
- David Roe <roed@math.harvard.edu>
|
|
43
|
+
|
|
44
|
+
- John Cremona
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
# ****************************************************************************
|
|
48
|
+
# Copyright (C) 2007 David Roe <roed@math.harvard.edu>
|
|
49
|
+
# William Stein <wstein@gmail.com>
|
|
50
|
+
#
|
|
51
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
52
|
+
#
|
|
53
|
+
# This code is distributed in the hope that it will be useful,
|
|
54
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
55
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
56
|
+
# General Public License for more details.
|
|
57
|
+
#
|
|
58
|
+
# The full text of the GPL is available at:
|
|
59
|
+
#
|
|
60
|
+
# https://www.gnu.org/licenses/
|
|
61
|
+
# ****************************************************************************
|
|
62
|
+
|
|
63
|
+
from sage.structure.sage_object import SageObject
|
|
64
|
+
from sage.structure.richcmp import richcmp_method, richcmp
|
|
65
|
+
from sage.rings.integer import Integer
|
|
66
|
+
import weakref
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@richcmp_method
|
|
70
|
+
class KodairaSymbol_class(SageObject):
|
|
71
|
+
r"""
|
|
72
|
+
Class to hold a Kodaira symbol of an elliptic curve over a
|
|
73
|
+
`p`-adic local field.
|
|
74
|
+
|
|
75
|
+
Users should use the ``KodairaSymbol()`` function to construct
|
|
76
|
+
Kodaira Symbols rather than use the class constructor directly.
|
|
77
|
+
"""
|
|
78
|
+
def __init__(self, symbol):
|
|
79
|
+
r"""
|
|
80
|
+
Constructor for Kodaira Symbol class.
|
|
81
|
+
|
|
82
|
+
INPUT:
|
|
83
|
+
|
|
84
|
+
- ``symbol`` -- string or integer; the string should be a
|
|
85
|
+
standard string representation (e.g. III*) of a Kodaira
|
|
86
|
+
symbol, which will be parsed. Alternatively, use the PARI
|
|
87
|
+
encoding of Kodaira symbols as integers.
|
|
88
|
+
|
|
89
|
+
EXAMPLES::
|
|
90
|
+
|
|
91
|
+
sage: from sage.schemes.elliptic_curves.kodaira_symbol import KodairaSymbol_class
|
|
92
|
+
sage: KodairaSymbol_class(14)
|
|
93
|
+
I10
|
|
94
|
+
sage: KodairaSymbol_class('III*')
|
|
95
|
+
III*
|
|
96
|
+
sage: latex(KodairaSymbol_class('In'))
|
|
97
|
+
I_n
|
|
98
|
+
sage: KodairaSymbol_class('In')
|
|
99
|
+
In
|
|
100
|
+
|
|
101
|
+
Check that :issue:`31147` is fixed::
|
|
102
|
+
|
|
103
|
+
sage: latex(KodairaSymbol_class(-14))
|
|
104
|
+
I_{10}^{*}
|
|
105
|
+
"""
|
|
106
|
+
if not isinstance(symbol, str):
|
|
107
|
+
n = Integer(symbol)
|
|
108
|
+
self._n = None
|
|
109
|
+
if n == 0:
|
|
110
|
+
raise ValueError("Kodaira Symbol code number must be nonzero.")
|
|
111
|
+
if n == 1:
|
|
112
|
+
self._n = 0
|
|
113
|
+
self._roman = 1
|
|
114
|
+
self._str = 'I0'
|
|
115
|
+
self._latex = 'I_0'
|
|
116
|
+
elif n == 2:
|
|
117
|
+
self._roman = 2
|
|
118
|
+
self._str = 'II'
|
|
119
|
+
self._latex = 'II'
|
|
120
|
+
elif n == 3:
|
|
121
|
+
self._roman = 3
|
|
122
|
+
self._str = 'III'
|
|
123
|
+
self._latex = 'III'
|
|
124
|
+
elif n == 4:
|
|
125
|
+
self._roman = 4
|
|
126
|
+
self._str = 'IV'
|
|
127
|
+
self._latex = 'IV'
|
|
128
|
+
elif n > 4:
|
|
129
|
+
nu = n - 4
|
|
130
|
+
self._n = nu
|
|
131
|
+
self._roman = 1
|
|
132
|
+
self._str = 'I%s' % nu
|
|
133
|
+
self._latex = 'I_{%s}' % nu
|
|
134
|
+
elif n == -1:
|
|
135
|
+
self._roman = 1
|
|
136
|
+
self._n = 0
|
|
137
|
+
self._str = 'I0*'
|
|
138
|
+
self._latex = 'I_0^{*}'
|
|
139
|
+
elif n == -2:
|
|
140
|
+
self._roman = 2
|
|
141
|
+
self._str = 'II*'
|
|
142
|
+
self._latex = 'II^{*}'
|
|
143
|
+
elif n == -3:
|
|
144
|
+
self._roman = 3
|
|
145
|
+
self._str = 'III*'
|
|
146
|
+
self._latex = 'III^{*}'
|
|
147
|
+
elif n == -4:
|
|
148
|
+
self._roman = 4
|
|
149
|
+
self._str = 'IV*'
|
|
150
|
+
self._latex = 'IV^{*}'
|
|
151
|
+
elif n < -4:
|
|
152
|
+
nu = -n - 4
|
|
153
|
+
self._roman = 1
|
|
154
|
+
self._n = nu
|
|
155
|
+
self._str = 'I%s*' % nu
|
|
156
|
+
self._latex = 'I_{%s}^{*}' % nu
|
|
157
|
+
self._starred = (n < 0)
|
|
158
|
+
self._pari = n
|
|
159
|
+
return
|
|
160
|
+
elif not symbol:
|
|
161
|
+
raise TypeError("symbol must be a nonempty string")
|
|
162
|
+
if symbol[0] == "I":
|
|
163
|
+
symbol = symbol[1:]
|
|
164
|
+
starred = False
|
|
165
|
+
if symbol[-1] == "*":
|
|
166
|
+
starred = True
|
|
167
|
+
symbol = symbol[:-1]
|
|
168
|
+
self._starred = starred
|
|
169
|
+
if symbol in ["I", "II", "V"]: # NB we have already stripped off the leading 'I'
|
|
170
|
+
self._roman = ["I", "II", "V"].index(symbol) + 2 # =2, 3 or 4
|
|
171
|
+
self._n = None
|
|
172
|
+
if starred:
|
|
173
|
+
sign = -1
|
|
174
|
+
self._str = "I" + symbol + "*"
|
|
175
|
+
self._latex = "I" + symbol + "^*"
|
|
176
|
+
else:
|
|
177
|
+
sign = 1
|
|
178
|
+
self._str = "I" + symbol
|
|
179
|
+
self._latex = "" + self._str + ""
|
|
180
|
+
if symbol == "I":
|
|
181
|
+
self._pari = 2 * sign
|
|
182
|
+
elif symbol == "II":
|
|
183
|
+
self._pari = 3 * sign
|
|
184
|
+
elif symbol == "V":
|
|
185
|
+
self._pari = 4 * sign
|
|
186
|
+
elif symbol == "n":
|
|
187
|
+
self._roman = 1
|
|
188
|
+
self._pari = None
|
|
189
|
+
self._n = "generic"
|
|
190
|
+
if starred:
|
|
191
|
+
self._str = "In*"
|
|
192
|
+
self._latex = "I_n^*"
|
|
193
|
+
else:
|
|
194
|
+
self._str = "In"
|
|
195
|
+
self._latex = "I_n"
|
|
196
|
+
elif symbol.isdigit():
|
|
197
|
+
self._roman = 1
|
|
198
|
+
self._n = Integer(symbol)
|
|
199
|
+
if starred:
|
|
200
|
+
if self._n == 0:
|
|
201
|
+
self._pari = -1
|
|
202
|
+
else:
|
|
203
|
+
self._pari = -self._n - 4
|
|
204
|
+
self._str = "I" + symbol + "*"
|
|
205
|
+
self._latex = "I_{%s}^*" % (symbol)
|
|
206
|
+
else:
|
|
207
|
+
if self._n == 0:
|
|
208
|
+
self._pari = 1
|
|
209
|
+
else:
|
|
210
|
+
self._pari = self._n + 4
|
|
211
|
+
self._str = "I" + symbol
|
|
212
|
+
self._latex = "I_{%s}" % (symbol)
|
|
213
|
+
else:
|
|
214
|
+
raise ValueError("input is not a Kodaira symbol")
|
|
215
|
+
|
|
216
|
+
def __repr__(self):
|
|
217
|
+
r"""
|
|
218
|
+
Return the string representation of this Kodaira Symbol.
|
|
219
|
+
|
|
220
|
+
EXAMPLES::
|
|
221
|
+
|
|
222
|
+
sage: from sage.schemes.elliptic_curves.kodaira_symbol import KodairaSymbol_class
|
|
223
|
+
sage: KS = KodairaSymbol_class(15)
|
|
224
|
+
sage: str(KS) # indirect doctest
|
|
225
|
+
'I11'
|
|
226
|
+
"""
|
|
227
|
+
return self._str
|
|
228
|
+
|
|
229
|
+
def _latex_(self):
|
|
230
|
+
r"""
|
|
231
|
+
Return the string representation of this Kodaira Symbol.
|
|
232
|
+
|
|
233
|
+
EXAMPLES::
|
|
234
|
+
|
|
235
|
+
sage: from sage.schemes.elliptic_curves.kodaira_symbol import KodairaSymbol_class
|
|
236
|
+
sage: KS = KodairaSymbol_class(15)
|
|
237
|
+
sage: latex(KS)
|
|
238
|
+
I_{11}
|
|
239
|
+
"""
|
|
240
|
+
return self._latex
|
|
241
|
+
|
|
242
|
+
def __richcmp__(self, other, op):
|
|
243
|
+
r"""
|
|
244
|
+
Standard comparison function for Kodaira Symbols.
|
|
245
|
+
|
|
246
|
+
EXAMPLES::
|
|
247
|
+
|
|
248
|
+
sage: from sage.schemes.elliptic_curves.kodaira_symbol import KodairaSymbol_class
|
|
249
|
+
sage: KS1 = KodairaSymbol_class(15); KS1
|
|
250
|
+
I11
|
|
251
|
+
sage: KS2 = KodairaSymbol_class(-34); KS2
|
|
252
|
+
I30*
|
|
253
|
+
sage: KS1 < KS2
|
|
254
|
+
True
|
|
255
|
+
sage: KS2 < KS1
|
|
256
|
+
False
|
|
257
|
+
|
|
258
|
+
::
|
|
259
|
+
|
|
260
|
+
sage: Klist = [KodairaSymbol_class(i) for i in [-10..10] if i!=0]
|
|
261
|
+
sage: Klist.sort()
|
|
262
|
+
sage: Klist
|
|
263
|
+
[I0,
|
|
264
|
+
I0*,
|
|
265
|
+
I1,
|
|
266
|
+
I1*,
|
|
267
|
+
I2,
|
|
268
|
+
I2*,
|
|
269
|
+
I3,
|
|
270
|
+
I3*,
|
|
271
|
+
I4,
|
|
272
|
+
I4*,
|
|
273
|
+
I5,
|
|
274
|
+
I5*,
|
|
275
|
+
I6,
|
|
276
|
+
I6*,
|
|
277
|
+
II,
|
|
278
|
+
II*,
|
|
279
|
+
III,
|
|
280
|
+
III*,
|
|
281
|
+
IV,
|
|
282
|
+
IV*]
|
|
283
|
+
"""
|
|
284
|
+
if isinstance(other, KodairaSymbol_class):
|
|
285
|
+
if (self._n == "generic" and other._n is not None) or (other._n == "generic" and self._n is not None):
|
|
286
|
+
return richcmp(self._starred, other._starred, op)
|
|
287
|
+
return richcmp(self._str, other._str, op)
|
|
288
|
+
else:
|
|
289
|
+
return NotImplemented
|
|
290
|
+
|
|
291
|
+
def _pari_code(self):
|
|
292
|
+
"""
|
|
293
|
+
Return the PARI encoding of this Kodaira Symbol.
|
|
294
|
+
|
|
295
|
+
EXAMPLES::
|
|
296
|
+
|
|
297
|
+
sage: KodairaSymbol('I0')._pari_code()
|
|
298
|
+
1
|
|
299
|
+
sage: KodairaSymbol('I10')._pari_code()
|
|
300
|
+
14
|
|
301
|
+
sage: KodairaSymbol('I10*')._pari_code()
|
|
302
|
+
-14
|
|
303
|
+
sage: [KodairaSymbol(s)._pari_code() for s in ['II','III','IV']]
|
|
304
|
+
[2, 3, 4]
|
|
305
|
+
sage: [KodairaSymbol(s)._pari_code() for s in ['II*','III*','IV*']]
|
|
306
|
+
[-2, -3, -4]
|
|
307
|
+
"""
|
|
308
|
+
return self._pari
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
_ks_cache = {}
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def KodairaSymbol(symbol):
|
|
315
|
+
r"""
|
|
316
|
+
Return the specified Kodaira symbol.
|
|
317
|
+
|
|
318
|
+
INPUT:
|
|
319
|
+
|
|
320
|
+
- ``symbol`` -- string or integer; either a string of the form
|
|
321
|
+
"I0", "I1", ..., "In", "II", "III", "IV", "I0*", "I1*", ..., "In*", "II*", "III*", or "IV*",
|
|
322
|
+
or an integer encoding a Kodaira symbol using PARI's conventions
|
|
323
|
+
|
|
324
|
+
OUTPUT:
|
|
325
|
+
|
|
326
|
+
(KodairaSymbol) The corresponding Kodaira symbol.
|
|
327
|
+
|
|
328
|
+
EXAMPLES::
|
|
329
|
+
|
|
330
|
+
sage: KS = KodairaSymbol
|
|
331
|
+
sage: [KS(n) for n in range(1,10)]
|
|
332
|
+
[I0, II, III, IV, I1, I2, I3, I4, I5]
|
|
333
|
+
sage: [KS(-n) for n in range(1,10)]
|
|
334
|
+
[I0*, II*, III*, IV*, I1*, I2*, I3*, I4*, I5*]
|
|
335
|
+
sage: all(KS(str(KS(n))) == KS(n) for n in range(-10,10) if n != 0)
|
|
336
|
+
True
|
|
337
|
+
"""
|
|
338
|
+
if symbol in _ks_cache:
|
|
339
|
+
ks = _ks_cache[symbol]()
|
|
340
|
+
if ks is not None:
|
|
341
|
+
return ks
|
|
342
|
+
ks = KodairaSymbol_class(symbol)
|
|
343
|
+
_ks_cache[symbol] = weakref.ref(ks)
|
|
344
|
+
return ks
|