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,320 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.rings.padics
|
|
3
|
+
r"""
|
|
4
|
+
Computation of the Frobenius polynomial using Newton's identities
|
|
5
|
+
"""
|
|
6
|
+
# *****************************************************************************
|
|
7
|
+
# Copyright (C) 2018 Edgar Costa <edgarc@mit.edu>
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# https://www.gnu.org/licenses/
|
|
10
|
+
# *****************************************************************************
|
|
11
|
+
from sage.rings.integer_ring import ZZ
|
|
12
|
+
from sage.misc.lazy_import import lazy_import
|
|
13
|
+
lazy_import("sage.functions.log", "log")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def charpoly_frobenius(frob_matrix, charpoly_prec, p, weight, a=1, known_factor=[1]):
|
|
17
|
+
"""
|
|
18
|
+
Return the characteristic polynomial of the given Frobenius matrix.
|
|
19
|
+
|
|
20
|
+
INPUT:
|
|
21
|
+
|
|
22
|
+
- ``frob_matrix`` -- a matrix representing the Frobenius matrix up to some precision
|
|
23
|
+
|
|
24
|
+
- ``charpoly_prec`` -- a vector ai, such that, ``frob_matrix.change_ring(ZZ).charpoly()[i]``
|
|
25
|
+
will be correct mod `p^ai`, this can be easily deduced from the
|
|
26
|
+
Hodge numbers and knowing the q-adic precision of ``frob_matrix``
|
|
27
|
+
|
|
28
|
+
- ``p`` -- prime `p`
|
|
29
|
+
|
|
30
|
+
- ``weight`` -- weight of the motive
|
|
31
|
+
|
|
32
|
+
- ``a`` -- `p = q^a`
|
|
33
|
+
|
|
34
|
+
- ``known_factor`` -- the list of coefficients of the known factor
|
|
35
|
+
|
|
36
|
+
OUTPUT: list of integers corresponding to the characteristic polynomial
|
|
37
|
+
of the Frobenius action
|
|
38
|
+
|
|
39
|
+
EXAMPLES::
|
|
40
|
+
|
|
41
|
+
sage: from sage.schemes.cyclic_covers.charpoly_frobenius import charpoly_frobenius
|
|
42
|
+
sage: M = Matrix([[O(17), 8 + O(17)], [O(17), 15 + O(17)]])
|
|
43
|
+
sage: charpoly_frobenius(M, [2, 1, 1], 17, 1, 1)
|
|
44
|
+
[17, 2, 1]
|
|
45
|
+
|
|
46
|
+
sage: R = Zq(17**2, names=('a',))
|
|
47
|
+
sage: M = Matrix(R, [[8*17 + 16*17**2 + O(17**3), 8 + 11*17 + O(17**2)],
|
|
48
|
+
....: [7*17**2 + O(17**3), 15 + 8*17 + O(17**2)]])
|
|
49
|
+
sage: charpoly_frobenius(M*M, [3, 2, 2], 17, 1, 2)
|
|
50
|
+
[289, 30, 1]
|
|
51
|
+
|
|
52
|
+
sage: M = Matrix([[8*31 + 8*31**2 + O(31**3), O(31**3), O(31**3), O(31**3)],
|
|
53
|
+
....: [O(31**3), 23*31 + 22*31**2 + O(31**3), O(31**3), O(31**3)],
|
|
54
|
+
....: [O(31**3), O(31**3), 27 + 7*31 + O(31**3), O(31**3)],
|
|
55
|
+
....: [O(31**3), O(31**3), O(31**3), 4 + 23*31 + O(31**3)]])
|
|
56
|
+
sage: charpoly_frobenius(M, [4, 3, 2, 2, 2], 31, 1, 1)
|
|
57
|
+
[961, 0, 46, 0, 1]
|
|
58
|
+
|
|
59
|
+
sage: M = Matrix([(4*43^2 + O(43^3), 17*43 + 11*43^2 + O(43^3), O(43^3), O(43^3), 17 + 37*43 + O(43^3), O(43^3)),
|
|
60
|
+
....: (30*43 + 23*43^2 + O(43^3), 5*43 + O(43^3), O(43^3), O(43^3), 3 + 38*43 + O(43^3), O(43^3)),
|
|
61
|
+
....: (O(43^3), O(43^3), 9*43 + 32*43^2 + O(43^3), 13 + 25*43 + O(43^3), O(43^3), 17 + 18*43 + O(43^3)),
|
|
62
|
+
....: (O(43^3), O(43^3), 22*43 + 25*43^2 + O(43^3), 11 + 24*43 + O(43^3), O(43^3), 36 + 5*43 + O(43^3)),
|
|
63
|
+
....: (42*43 + 15*43^2 + O(43^3), 22*43 + 8*43^2 + O(43^3), O(43^3), O(43^3), 29 + 4*43 + O(43^3), O(43^3)),
|
|
64
|
+
....: (O(43^3), O(43^3), 6*43 + 19*43^2 + O(43^3), 8 + 24*43 + O(43^3), O(43^3), 31 + 42*43 + O(43^3))])
|
|
65
|
+
sage: charpoly_frobenius(M, [5, 4, 3, 2, 2, 2, 2], 43, 1, 1)
|
|
66
|
+
[79507, 27735, 6579, 1258, 153, 15, 1]
|
|
67
|
+
|
|
68
|
+
sage: M = Matrix([(1 + O(4999), O(4999), 0, 0),
|
|
69
|
+
....: (O(4999), 4860 + O(4999), 0, 0),
|
|
70
|
+
....: (0, 0, O(4999), O(4999)),
|
|
71
|
+
....: (0, 0, O(4999), 1 + O(4999))])
|
|
72
|
+
sage: charpoly_frobenius(M, [2, 1, 1], 4999, 1, 1, [1, -2, 1])
|
|
73
|
+
[4999, 139, 1]
|
|
74
|
+
|
|
75
|
+
TESTS::
|
|
76
|
+
|
|
77
|
+
sage: M = Matrix([[-149196156000219, 0, 0, 0, 0, 0, 0, 0],
|
|
78
|
+
....: [0, 76324364094257, 0, 0, 0, 0, 0, 0],
|
|
79
|
+
....: [0, 0, 76324364094257, 0, 0, 0, 0, 0],
|
|
80
|
+
....: [0, 0, 0, -149196156000219, 0, 0, 0, 0],
|
|
81
|
+
....: [0, 0, 0, 0, 281855171388275, 0, 0, 0],
|
|
82
|
+
....: [0, 0, 0, 0, 0, -208983379482579, 0, 0],
|
|
83
|
+
....: [0, 0, 0, 0, 0, 0, -208983379482579, 0],
|
|
84
|
+
....: [0, 0, 0, 0, 0, 0, 0, 281855171388275]])
|
|
85
|
+
sage: charpoly_frobenius(M, [9, 8, 7, 6, 5, 5, 5, 5, 5], 1009, 1, 2)
|
|
86
|
+
[1074309286591662654798721,
|
|
87
|
+
561382189105547134612,
|
|
88
|
+
-2982540407204025062,
|
|
89
|
+
-247015136050256,
|
|
90
|
+
4390163797795,
|
|
91
|
+
-242628176,
|
|
92
|
+
-2877542,
|
|
93
|
+
532,
|
|
94
|
+
1]
|
|
95
|
+
sage: M = Matrix([[0, 0, 0, -338082603, 0, 0, 0, 0],
|
|
96
|
+
....: [0, 0, -317436968, 0, 0, 0, 0, 0],
|
|
97
|
+
....: [0, -120741807, 0, 0, 0, 0, 0, 0],
|
|
98
|
+
....: [200618482, 0, 0, 0, 0, 0, 0, 0],
|
|
99
|
+
....: [0, 0, 0, 0, 0, 0, 0, 123492519],
|
|
100
|
+
....: [0, 0, 0, 0, 0, 0, 426826171, 0],
|
|
101
|
+
....: [0, 0, 0, 0, 0, 157417117, 0, 0],
|
|
102
|
+
....: [0, 0, 0, 0, 373415235, 0, 0, 0]])
|
|
103
|
+
sage: charpoly_frobenius(M, [7, 6, 5, 4, 3, 3, 3, 3, 3], 1009, 1, 1)
|
|
104
|
+
[1036488922561, 0, 270809546, 0, -1474149, 0, 266, 0, 1]
|
|
105
|
+
|
|
106
|
+
sage: M = Matrix({(0, 31): 1814236329200021268558465351501717,
|
|
107
|
+
....: (1, 30): 3268331092352160631300311212049390,
|
|
108
|
+
....: (2, 29): 1002349136486054751305109007707560,
|
|
109
|
+
....: (3, 28): 1789497403160078628636360424523308,
|
|
110
|
+
....: (4, 19): 919866278512654133838788268427125,
|
|
111
|
+
....: (5, 18): 2918980842679879118243999587726673,
|
|
112
|
+
....: (6, 17): 2062741569795231121341967954037400,
|
|
113
|
+
....: (7, 16): 3562554496811633214919332352788305,
|
|
114
|
+
....: (8, 7): 287823825201170974551150606916601,
|
|
115
|
+
....: (9, 6): 2657175570144838727074228404244845,
|
|
116
|
+
....: (10, 5): 3200631048273888400670606576807785,
|
|
117
|
+
....: (11, 4): 707085630754978281870563133348521,
|
|
118
|
+
....: (12, 39): 679572779843478608532167180287595,
|
|
119
|
+
....: (13, 38): 510867456922807824071915371084390,
|
|
120
|
+
....: (14, 37): 3300741705093235469798877501619286,
|
|
121
|
+
....: (15, 36): 1374430202827161695034370373469332,
|
|
122
|
+
....: (16, 27): 1897240889699239396313755822318254,
|
|
123
|
+
....: (17, 26): 3171751877741319729745976757727266,
|
|
124
|
+
....: (18, 25): 1151779650995750952707414056498421,
|
|
125
|
+
....: (19, 24): 1309748952162524211332312241346156,
|
|
126
|
+
....: (20, 15): 2914640274871541651939754878647777,
|
|
127
|
+
....: (21, 14): 2524322227034087814555116576604052,
|
|
128
|
+
....: (22, 13): 693999428630644346611319813759997,
|
|
129
|
+
....: (23, 12): 2093267437436875555592094407087011,
|
|
130
|
+
....: (24, 3): 101158112439244133585487537448909,
|
|
131
|
+
....: (25, 2): 638873050956374173808321501215560,
|
|
132
|
+
....: (26, 1): 3529335795023815426485172749287314,
|
|
133
|
+
....: (27, 0): 618726320422582798159865537548600,
|
|
134
|
+
....: (28, 35): 2510605595766272594980682702750921,
|
|
135
|
+
....: (29, 34): 2978146199632282120435531158312695,
|
|
136
|
+
....: (30, 33): 1724161588290366191539756998844438,
|
|
137
|
+
....: (31, 32): 516507426627993787229114955328811,
|
|
138
|
+
....: (32, 23): 1716672265998537901154333190869011,
|
|
139
|
+
....: (33, 22): 3787144776814278856737374038432424,
|
|
140
|
+
....: (34, 21): 3765560528316833596614887925578722,
|
|
141
|
+
....: (35, 20): 1628311006615824767735977131865996,
|
|
142
|
+
....: (36, 11): 3638935478569769465046956942756848,
|
|
143
|
+
....: (37, 10): 1878821491042105813643148323053706,
|
|
144
|
+
....: (38, 9): 1187568624951630613061547491748348,
|
|
145
|
+
....: (39, 8): 2538351040819233009959661983810741}
|
|
146
|
+
....: )
|
|
147
|
+
sage: charpoly_frobenius(M,
|
|
148
|
+
....: [31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
|
|
149
|
+
....: 15, 14, 13, 12] + [11]*21, 1129, 1, 1)
|
|
150
|
+
[11320844849639649951608809973589776933203136765026963553258401,
|
|
151
|
+
0,
|
|
152
|
+
0,
|
|
153
|
+
0,
|
|
154
|
+
0,
|
|
155
|
+
0,
|
|
156
|
+
0,
|
|
157
|
+
0,
|
|
158
|
+
0,
|
|
159
|
+
0,
|
|
160
|
+
24687045654725446027864774006541463602997309796,
|
|
161
|
+
0,
|
|
162
|
+
0,
|
|
163
|
+
0,
|
|
164
|
+
0,
|
|
165
|
+
0,
|
|
166
|
+
0,
|
|
167
|
+
0,
|
|
168
|
+
0,
|
|
169
|
+
0,
|
|
170
|
+
20187877911930897108199045855206,
|
|
171
|
+
0,
|
|
172
|
+
0,
|
|
173
|
+
0,
|
|
174
|
+
0,
|
|
175
|
+
0,
|
|
176
|
+
0,
|
|
177
|
+
0,
|
|
178
|
+
0,
|
|
179
|
+
0,
|
|
180
|
+
7337188909826596,
|
|
181
|
+
0,
|
|
182
|
+
0,
|
|
183
|
+
0,
|
|
184
|
+
0,
|
|
185
|
+
0,
|
|
186
|
+
0,
|
|
187
|
+
0,
|
|
188
|
+
0,
|
|
189
|
+
0,
|
|
190
|
+
1]
|
|
191
|
+
|
|
192
|
+
sage: F = Matrix(Qp(17),
|
|
193
|
+
....: [(28442601332527957763, 729848492961404015, 70994086070709920),
|
|
194
|
+
....: (24928804992606688137, 1345506389644311177, 147442915782003034),
|
|
195
|
+
....: (7562462964206075698, 1262441299395996535, 92309755559576133)])
|
|
196
|
+
sage: F+= F.base_ring()(0).add_bigoh(6)*ones_matrix(*F.dimensions())
|
|
197
|
+
sage: charpoly_frobenius(F, [6, 5, 4, 4], 17, 2)
|
|
198
|
+
[-4913, -221, 13, 1]
|
|
199
|
+
"""
|
|
200
|
+
assert known_factor[-1] == 1
|
|
201
|
+
try:
|
|
202
|
+
cp = frob_matrix.change_ring(ZZ).charpoly().list()
|
|
203
|
+
except ValueError:
|
|
204
|
+
# the given matrix was not integral
|
|
205
|
+
cp = frob_matrix.charpoly().change_ring(ZZ).list()
|
|
206
|
+
assert len(charpoly_prec) == len(cp) - (len(known_factor) - 1)
|
|
207
|
+
assert cp[-1] == 1
|
|
208
|
+
|
|
209
|
+
# reduce cp mod prec
|
|
210
|
+
degree = len(charpoly_prec) - 1
|
|
211
|
+
mod = [0] * (degree + 1)
|
|
212
|
+
for i in range(len(charpoly_prec)):
|
|
213
|
+
mod[-i] = p**charpoly_prec[-i]
|
|
214
|
+
cp[-i] = cp[-i] % mod[-i]
|
|
215
|
+
|
|
216
|
+
# figure out the sign
|
|
217
|
+
# i.e., if it is a reciprocal or an antireciprocal polynomial
|
|
218
|
+
if weight % 2:
|
|
219
|
+
# for odd weight the sign is always 1
|
|
220
|
+
# it's the charpoly of a USp matrix
|
|
221
|
+
# and charpoly of a symplectic matrix is reciprocal
|
|
222
|
+
sign = 1
|
|
223
|
+
else:
|
|
224
|
+
# For the moment I will not worry about this case
|
|
225
|
+
if known_factor != [1]:
|
|
226
|
+
raise NotImplementedError()
|
|
227
|
+
# we compare ith coefficient and (degree - i)th coefficient to deduce the sign
|
|
228
|
+
# note, if degree is even, the middle coefficient will not help us determine the sign
|
|
229
|
+
for i in range((degree + 1) // 2):
|
|
230
|
+
# Note: degree*weight is even
|
|
231
|
+
p_power = p**min(
|
|
232
|
+
charpoly_prec[i],
|
|
233
|
+
charpoly_prec[degree - i] + ((a * (degree - 2 * i) * weight) // 2),
|
|
234
|
+
)
|
|
235
|
+
if cp[i] % p_power != 0 and cp[degree - i] % p_power != 0:
|
|
236
|
+
other = cp[degree - i] * p**((a * (degree - 2 * i) * weight) // 2)
|
|
237
|
+
if (cp[i] + other) % p_power == 0:
|
|
238
|
+
sign = -1
|
|
239
|
+
else:
|
|
240
|
+
sign = 1
|
|
241
|
+
assert (-sign * cp[i] + other) % p_power == 0
|
|
242
|
+
break
|
|
243
|
+
# halfdegree is the number of coefficients that we will compute
|
|
244
|
+
# the rest will be deduced using the functional equation
|
|
245
|
+
# as up to scaling of the variable
|
|
246
|
+
# the polynomial is either reciprocal or antireciprocal polynomial
|
|
247
|
+
# note, this includes the middle coefficient if degree is even
|
|
248
|
+
halfdegree = degree // 2 + 1
|
|
249
|
+
|
|
250
|
+
cp[0] = sign * p**((a * degree * weight) // 2)
|
|
251
|
+
# Note: degree*weight is even
|
|
252
|
+
|
|
253
|
+
# calculate the i-th power sum of the roots and correct cp along the way
|
|
254
|
+
e = cp[-halfdegree:]
|
|
255
|
+
e.reverse()
|
|
256
|
+
for k in range(halfdegree):
|
|
257
|
+
if k % 2:
|
|
258
|
+
e[k] = -e[k] % mod[degree - k]
|
|
259
|
+
# e[k] = cp[degree - k] if (k%2 ==0) else -cp[degree - k]
|
|
260
|
+
if k > 0:
|
|
261
|
+
# verify if p^charpoly_prec[degree - k] > 2*degree/k * q^(w*k/2)
|
|
262
|
+
assert (
|
|
263
|
+
log(k, p) + charpoly_prec[degree - k]
|
|
264
|
+
> log(2 * degree, p) + a * 0.5 * weight * k
|
|
265
|
+
), (
|
|
266
|
+
"log(k)/log(p) + charpoly_prec[degree - k] <= log(2*degree)/log(p) + a*0.5*weight*k, k = %d"
|
|
267
|
+
% k
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
fix_e = known_factor[:]
|
|
271
|
+
fix_e.reverse()
|
|
272
|
+
if len(fix_e) < halfdegree:
|
|
273
|
+
fix_e.extend([0] * (halfdegree - len(fix_e)))
|
|
274
|
+
for i in range(halfdegree):
|
|
275
|
+
if i % 2:
|
|
276
|
+
fix_e[i] *= -1
|
|
277
|
+
|
|
278
|
+
# e[k] = \sum x_{i_1} x_{i_2} ... x_{i_k} # where x_* are eigenvalues
|
|
279
|
+
# and i_1 < i_2 ... < i_k
|
|
280
|
+
|
|
281
|
+
# s[k] = \sum x_i ^k for k>0
|
|
282
|
+
s = [None] * (halfdegree)
|
|
283
|
+
res = [None] * len(charpoly_prec)
|
|
284
|
+
res[0] = sign * p**((a * degree * weight) // 2)
|
|
285
|
+
# Note: degree*weight is even
|
|
286
|
+
|
|
287
|
+
res[-1] = 1
|
|
288
|
+
e[1] -= fix_e[1]
|
|
289
|
+
e[1] = e[1] % mod[degree - 1]
|
|
290
|
+
for k in range(1, halfdegree):
|
|
291
|
+
# assume that s[i] and e[i] are correct for i < k
|
|
292
|
+
# e[k] correct modulo mod[degree - k]
|
|
293
|
+
# S = sum (-1)^i e[k-i] * s[i]
|
|
294
|
+
# s[k] = (-1)^(k-1) (k*e[k] + S) ==> (-1)^(k-1) s[k] - S = k*e[k]
|
|
295
|
+
S = sum((-1)**i * e[k - i] * s[i] for i in range(1, k))
|
|
296
|
+
s[k] = (-1)**(k - 1) * (S + k * e[k])
|
|
297
|
+
# hence s[k] is correct modulo k*mod[degree - k]
|
|
298
|
+
localmod = k * mod[degree - k]
|
|
299
|
+
# s[k] += (-1)**k * fix_power_sum[k]
|
|
300
|
+
s[k] = s[k] % localmod
|
|
301
|
+
|
|
302
|
+
# |x_i| = p^(w*0.5)
|
|
303
|
+
# => s[k] <= degree*p^(a*w*k*0.5)
|
|
304
|
+
# recall, 2*degree*p^(a*w*k*0.5) /k < mod[degree - k]
|
|
305
|
+
if s[k]**2 > degree**2 * p**(a * weight * k):
|
|
306
|
+
s[k] = -(-s[k] % localmod)
|
|
307
|
+
|
|
308
|
+
# now correct e[k] with:
|
|
309
|
+
# (-1)^(k-1) s[k] - S = k*e[k]
|
|
310
|
+
e[k] = (-S + (-1)**(k - 1) * s[k]) // k
|
|
311
|
+
assert (-S + (-1)**(k - 1) * s[k]) % k == 0
|
|
312
|
+
res[degree - k] = e[k] if not k % 2 else -e[k]
|
|
313
|
+
# Note: degree*weight is even
|
|
314
|
+
|
|
315
|
+
res[k] = sign * res[degree - k] * p**((a * (degree - 2 * k) * weight) // 2)
|
|
316
|
+
# fix e[k + 1]
|
|
317
|
+
if k + 1 < halfdegree:
|
|
318
|
+
e[k + 1] -= sum([fix_e[k + 1 - i] * e[i] for i in range(k + 1)])
|
|
319
|
+
e[k + 1] = e[k + 1] % mod[degree - (k + 1)]
|
|
320
|
+
return res
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Cyclic cover curve constructor
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# *****************************************************************************
|
|
7
|
+
# Copyright (C) 2018 Edgar Costa <edgarcosta@math.dartmouth.edu>
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# https://www.gnu.org/licenses/
|
|
10
|
+
# *****************************************************************************
|
|
11
|
+
|
|
12
|
+
from sage.rings.finite_rings.finite_field_base import FiniteField
|
|
13
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
14
|
+
from sage.schemes.affine.affine_space import AffineSpace
|
|
15
|
+
|
|
16
|
+
from .cycliccover_generic import CyclicCover_generic
|
|
17
|
+
from .cycliccover_finite_field import CyclicCover_finite_field
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def CyclicCover(r, f, names=None, check_smooth=True):
|
|
21
|
+
r"""
|
|
22
|
+
Return the cyclic cover of the projective line given by `y^r = f`, for
|
|
23
|
+
a univariate polynomial `f`.
|
|
24
|
+
|
|
25
|
+
INPUT:
|
|
26
|
+
|
|
27
|
+
- ``r`` -- the order of the cover
|
|
28
|
+
|
|
29
|
+
- ``f`` -- univariate polynomial if not given, then it defaults to 0
|
|
30
|
+
|
|
31
|
+
- ``names`` -- (default: ``["x","y"]``) names for the coordinate functions
|
|
32
|
+
|
|
33
|
+
- ``check_squarefree`` -- boolean (default: ``True``); test if
|
|
34
|
+
the input defines a unramified cover of the projective line
|
|
35
|
+
|
|
36
|
+
.. WARNING::
|
|
37
|
+
|
|
38
|
+
When setting ``check_smooth=False`` or using a base ring that is
|
|
39
|
+
not a field, the output curves are not to be trusted. For example, the
|
|
40
|
+
output of ``is_singular`` or ``is_smooth`` only tests smoothness over
|
|
41
|
+
the field of fractions.
|
|
42
|
+
|
|
43
|
+
.. NOTE::
|
|
44
|
+
|
|
45
|
+
The words "cyclic cover" are usually used for covers of degree
|
|
46
|
+
greater than two.
|
|
47
|
+
We usually refer to smooth double covers of the projective line as
|
|
48
|
+
"hyperelliptic curves" or "elliptic curves" if the genus is one.
|
|
49
|
+
We allow such cases in this implementation, but we highly recommend
|
|
50
|
+
to use the more specific constructors/classes HyperellipticCurve and
|
|
51
|
+
EllipticCurve for a wider range of tools.
|
|
52
|
+
|
|
53
|
+
EXAMPLES:
|
|
54
|
+
|
|
55
|
+
Basic examples::
|
|
56
|
+
|
|
57
|
+
sage: R.<x> = QQ[]
|
|
58
|
+
sage: CyclicCover(2, x^5 + x + 1)
|
|
59
|
+
Cyclic Cover of P^1 over Rational Field defined by y^2 = x^5 + x + 1
|
|
60
|
+
sage: CyclicCover(3, x^5 + x + 1)
|
|
61
|
+
Cyclic Cover of P^1 over Rational Field defined by y^3 = x^5 + x + 1
|
|
62
|
+
sage: CyclicCover(5, x^5 + x + 1)
|
|
63
|
+
Cyclic Cover of P^1 over Rational Field defined by y^5 = x^5 + x + 1
|
|
64
|
+
sage: CyclicCover(15, x^9 + x + 1)
|
|
65
|
+
Cyclic Cover of P^1 over Rational Field defined by y^15 = x^9 + x + 1
|
|
66
|
+
|
|
67
|
+
sage: k.<a> = GF(9); R.<x> = k[] # needs sage.rings.finite_rings
|
|
68
|
+
sage: CyclicCover(5, x^9 + x + 1) # needs sage.rings.finite_rings
|
|
69
|
+
Cyclic Cover of P^1 over Finite Field in a of size 3^2
|
|
70
|
+
defined by y^5 = x^9 + x + 1
|
|
71
|
+
sage: CyclicCover(15, x^9 + x + 1) # needs sage.rings.finite_rings
|
|
72
|
+
Traceback (most recent call last):
|
|
73
|
+
...
|
|
74
|
+
ValueError: As the characteristic divides the order of the cover,
|
|
75
|
+
this model is not smooth.
|
|
76
|
+
|
|
77
|
+
We can change the names of the variables in the output::
|
|
78
|
+
|
|
79
|
+
sage: k.<a> = GF(9); R.<x> = k[] # needs sage.rings.finite_rings
|
|
80
|
+
sage: CyclicCover(5, x^9 + x + 1, names=["A","B"]) # needs sage.rings.finite_rings
|
|
81
|
+
Cyclic Cover of P^1 over Finite Field in a of size 3^2
|
|
82
|
+
defined by B^5 = A^9 + A + 1
|
|
83
|
+
|
|
84
|
+
Double roots::
|
|
85
|
+
|
|
86
|
+
sage: P.<x> = GF(7)[]
|
|
87
|
+
sage: CyclicCover(2, (x^3-x+2)^2*(x^6-1))
|
|
88
|
+
Traceback (most recent call last):
|
|
89
|
+
...
|
|
90
|
+
ValueError: Not a smooth Cyclic Cover of P^1: singularity in the provided affine patch.
|
|
91
|
+
|
|
92
|
+
sage: CyclicCover(2, (x^3-x+2)^2*(x^6-1), check_smooth=False) # needs sage.rings.finite_rings
|
|
93
|
+
Cyclic Cover of P^1 over Finite Field of size 7
|
|
94
|
+
defined by y^2 = x^12 - 2*x^10 - 3*x^9 + x^8 + 3*x^7 + 3*x^6
|
|
95
|
+
+ 2*x^4 + 3*x^3 - x^2 - 3*x + 3
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
Input with integer coefficients creates objects with the integers
|
|
99
|
+
as base ring, but only checks smoothness over `\QQ`, not over Spec(`\ZZ`).
|
|
100
|
+
In other words, it is checked that the discriminant is nonzero, but it is
|
|
101
|
+
not checked whether the discriminant is a unit in `\ZZ^*`::
|
|
102
|
+
|
|
103
|
+
sage: R.<x> = ZZ[]
|
|
104
|
+
sage: CyclicCover(5, (x^3-x+2)*(x^6-1))
|
|
105
|
+
Cyclic Cover of P^1 over Integer Ring defined by y^5 = x^9 - x^7 + 2*x^6 - x^3 + x - 2
|
|
106
|
+
"""
|
|
107
|
+
if not isinstance(f, Polynomial):
|
|
108
|
+
raise TypeError("Arguments f (= %s) must be a polynomial" % (f,))
|
|
109
|
+
P = f.parent()
|
|
110
|
+
f = P(f)
|
|
111
|
+
if check_smooth:
|
|
112
|
+
if P(r) == 0:
|
|
113
|
+
raise ValueError(
|
|
114
|
+
"As the characteristic divides the order of the cover, "
|
|
115
|
+
"this model is not smooth."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
smooth = f.is_squarefree()
|
|
120
|
+
except NotImplementedError as err:
|
|
121
|
+
raise NotImplementedError(
|
|
122
|
+
str(err) + "Use " "check_smooth=False to skip this check."
|
|
123
|
+
)
|
|
124
|
+
if not smooth:
|
|
125
|
+
raise ValueError(
|
|
126
|
+
"Not a smooth Cyclic Cover of P^1: "
|
|
127
|
+
"singularity in the provided affine patch."
|
|
128
|
+
)
|
|
129
|
+
R = P.base_ring()
|
|
130
|
+
if names is None:
|
|
131
|
+
names = ["x", "y"]
|
|
132
|
+
A2 = AffineSpace(2, R, names=names)
|
|
133
|
+
|
|
134
|
+
if isinstance(R, FiniteField):
|
|
135
|
+
return CyclicCover_finite_field(A2, r, f, names=names)
|
|
136
|
+
else:
|
|
137
|
+
return CyclicCover_generic(A2, r, f, names=names)
|