passagemath-pari 10.6.32__cp314-cp314-musllinux_1_2_x86_64.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-pari might be problematic. Click here for more details.
- PARIKernel/__init__.py +2 -0
- PARIKernel/__main__.py +5 -0
- PARIKernel/io.cpython-314-x86_64-linux-musl.so +0 -0
- PARIKernel/io.pxd +7 -0
- PARIKernel/io.pyx +84 -0
- PARIKernel/kernel.cpython-314-x86_64-linux-musl.so +0 -0
- PARIKernel/kernel.pyx +260 -0
- PARIKernel/paridecl.pxd +95 -0
- PARIKernel/svg.cpython-314-x86_64-linux-musl.so +0 -0
- PARIKernel/svg.pyx +52 -0
- cypari2/__init__.py +8 -0
- cypari2/auto_paridecl.pxd +1070 -0
- cypari2/closure.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/closure.pxd +5 -0
- cypari2/closure.pyx +246 -0
- cypari2/convert.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/convert.pxd +80 -0
- cypari2/convert.pyx +613 -0
- cypari2/custom_block.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/custom_block.pyx +30 -0
- cypari2/cypari.h +13 -0
- cypari2/gen.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/gen.pxd +69 -0
- cypari2/gen.pyx +4819 -0
- cypari2/handle_error.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/handle_error.pxd +7 -0
- cypari2/handle_error.pyx +232 -0
- cypari2/pari_instance.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/pari_instance.pxd +27 -0
- cypari2/pari_instance.pyx +1438 -0
- cypari2/paridecl.pxd +5353 -0
- cypari2/paripriv.pxd +34 -0
- cypari2/pycore_long.h +98 -0
- cypari2/pycore_long.pxd +9 -0
- cypari2/stack.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/stack.pxd +27 -0
- cypari2/stack.pyx +278 -0
- cypari2/string_utils.cpython-314-x86_64-linux-musl.so +0 -0
- cypari2/string_utils.pxd +29 -0
- cypari2/string_utils.pyx +65 -0
- cypari2/types.pxd +147 -0
- passagemath_pari-10.6.32.data/data/etc/jupyter/nbconfig/notebook.d/gp-mode.json +5 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/pari_jupyter/kernel.js +28 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/pari_jupyter/kernel.json +6 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/pari_jupyter/logo-64x64.png +0 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/kernel.json +13 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/logo-32x32.png +0 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/logo-64x64.png +0 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/kernels/xeus-gp/logo-svg.svg +75 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/nbextensions/gp-mode/gp.js +284 -0
- passagemath_pari-10.6.32.data/data/share/jupyter/nbextensions/gp-mode/main.js +15 -0
- passagemath_pari-10.6.32.dist-info/METADATA +209 -0
- passagemath_pari-10.6.32.dist-info/RECORD +331 -0
- passagemath_pari-10.6.32.dist-info/WHEEL +5 -0
- passagemath_pari-10.6.32.dist-info/top_level.txt +4 -0
- passagemath_pari.libs/libcrypto-f04afe95.so.3 +0 -0
- passagemath_pari.libs/libflint-fd6f12fc.so.21.0.0 +0 -0
- passagemath_pari.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_pari.libs/libgf2x-9e30c3e3.so.3.0.0 +0 -0
- passagemath_pari.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_pari.libs/libgivaro-9a94c711.so.9.2.1 +0 -0
- passagemath_pari.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_pari.libs/libgmpxx-9e08595c.so.4.7.0 +0 -0
- passagemath_pari.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_pari.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_pari.libs/libncursesw-9c9e32c3.so.6.5 +0 -0
- passagemath_pari.libs/libntl-26885ca2.so.44.0.1 +0 -0
- passagemath_pari.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_pari.libs/libpari-gmp-tls-f31f908f.so.2.17.2 +0 -0
- passagemath_pari.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- passagemath_pari.libs/libreadline-06542304.so.8.2 +0 -0
- passagemath_pari.libs/libstdc++-5d72f927.so.6.0.33 +0 -0
- passagemath_pari.libs/libuuid-f3770415.so.1.3.0 +0 -0
- passagemath_pari.libs/libxeus-735780ff.so.13.1.0 +0 -0
- passagemath_pari.libs/libxeus-zmq-c68577b4.so.6.0.1 +0 -0
- passagemath_pari.libs/libzmq-1ba9a3da.so.5.2.5 +0 -0
- sage/all__sagemath_pari.py +26 -0
- sage/databases/all__sagemath_pari.py +7 -0
- sage/databases/conway.py +274 -0
- sage/ext/all__sagemath_pari.py +1 -0
- sage/ext/memory.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/memory.pyx +98 -0
- sage/ext_data/pari/buzzard/DimensionSk.g +286 -0
- sage/ext_data/pari/buzzard/Tpprog.g +179 -0
- sage/ext_data/pari/buzzard/genusn.g +129 -0
- sage/ext_data/pari/dokchitser/computel.gp +740 -0
- sage/ext_data/pari/dokchitser/computel.gp.template +740 -0
- sage/ext_data/pari/dokchitser/ex-bsw +43 -0
- sage/ext_data/pari/dokchitser/ex-chgen +48 -0
- sage/ext_data/pari/dokchitser/ex-chqua +37 -0
- sage/ext_data/pari/dokchitser/ex-delta +35 -0
- sage/ext_data/pari/dokchitser/ex-eisen +30 -0
- sage/ext_data/pari/dokchitser/ex-gen2 +38 -0
- sage/ext_data/pari/dokchitser/ex-gen3 +49 -0
- sage/ext_data/pari/dokchitser/ex-gen4 +54 -0
- sage/ext_data/pari/dokchitser/ex-nf +48 -0
- sage/ext_data/pari/dokchitser/ex-shin +50 -0
- sage/ext_data/pari/dokchitser/ex-tau2 +30 -0
- sage/ext_data/pari/dokchitser/ex-zeta +27 -0
- sage/ext_data/pari/dokchitser/ex-zeta2 +47 -0
- sage/ext_data/pari/dokchitser/testall +13 -0
- sage/ext_data/pari/simon/ell.gp +2129 -0
- sage/ext_data/pari/simon/ellQ.gp +2151 -0
- sage/ext_data/pari/simon/ellcommon.gp +126 -0
- sage/ext_data/pari/simon/qfsolve.gp +722 -0
- sage/ext_data/pari/simon/resultant3.gp +306 -0
- sage/groups/all__sagemath_pari.py +3 -0
- sage/groups/pari_group.py +175 -0
- sage/interfaces/all__sagemath_pari.py +1 -0
- sage/interfaces/genus2reduction.py +464 -0
- sage/interfaces/gp.py +1114 -0
- sage/libs/all__sagemath_pari.py +2 -0
- sage/libs/linkages/__init__.py +1 -0
- sage/libs/linkages/padics/API.pxi +617 -0
- sage/libs/linkages/padics/Polynomial_ram.pxi +388 -0
- sage/libs/linkages/padics/Polynomial_shared.pxi +554 -0
- sage/libs/linkages/padics/__init__.py +1 -0
- sage/libs/linkages/padics/fmpz_poly_unram.pxi +869 -0
- sage/libs/linkages/padics/mpz.pxi +691 -0
- sage/libs/linkages/padics/relaxed/API.pxi +518 -0
- sage/libs/linkages/padics/relaxed/__init__.py +1 -0
- sage/libs/linkages/padics/relaxed/flint.pxi +543 -0
- sage/libs/linkages/padics/unram_shared.pxi +247 -0
- sage/libs/pari/__init__.py +210 -0
- sage/libs/pari/all.py +5 -0
- sage/libs/pari/convert_flint.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/convert_flint.pxd +14 -0
- sage/libs/pari/convert_flint.pyx +159 -0
- sage/libs/pari/convert_gmp.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/convert_gmp.pxd +14 -0
- sage/libs/pari/convert_gmp.pyx +210 -0
- sage/libs/pari/convert_sage.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/convert_sage.pxd +16 -0
- sage/libs/pari/convert_sage.pyx +588 -0
- sage/libs/pari/convert_sage_complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/convert_sage_complex_double.pxd +14 -0
- sage/libs/pari/convert_sage_complex_double.pyx +132 -0
- sage/libs/pari/convert_sage_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/convert_sage_matrix.pyx +106 -0
- sage/libs/pari/convert_sage_real_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/convert_sage_real_double.pxd +5 -0
- sage/libs/pari/convert_sage_real_double.pyx +14 -0
- sage/libs/pari/convert_sage_real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/convert_sage_real_mpfr.pxd +7 -0
- sage/libs/pari/convert_sage_real_mpfr.pyx +108 -0
- sage/libs/pari/misc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/pari/misc.pxd +4 -0
- sage/libs/pari/misc.pyx +26 -0
- sage/libs/pari/tests.py +1848 -0
- sage/matrix/all__sagemath_pari.py +1 -0
- sage/matrix/matrix_integer_pari.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_integer_pari.pyx +187 -0
- sage/matrix/matrix_rational_pari.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_rational_pari.pyx +160 -0
- sage/quadratic_forms/all__sagemath_pari.py +10 -0
- sage/quadratic_forms/genera/all.py +9 -0
- sage/quadratic_forms/genera/genus.py +3506 -0
- sage/quadratic_forms/genera/normal_form.py +1519 -0
- sage/quadratic_forms/genera/spinor_genus.py +243 -0
- sage/quadratic_forms/qfsolve.py +255 -0
- sage/quadratic_forms/quadratic_form__automorphisms.py +427 -0
- sage/quadratic_forms/quadratic_form__genus.py +141 -0
- sage/quadratic_forms/quadratic_form__local_density_interfaces.py +140 -0
- sage/quadratic_forms/quadratic_form__local_normal_form.py +421 -0
- sage/quadratic_forms/quadratic_form__local_representation_conditions.py +889 -0
- sage/quadratic_forms/quadratic_form__mass.py +69 -0
- sage/quadratic_forms/quadratic_form__mass__Conway_Sloane_masses.py +663 -0
- sage/quadratic_forms/quadratic_form__mass__Siegel_densities.py +373 -0
- sage/quadratic_forms/quadratic_form__siegel_product.py +198 -0
- sage/quadratic_forms/special_values.py +323 -0
- sage/rings/all__sagemath_pari.py +15 -0
- sage/rings/factorint_pari.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/factorint_pari.pyx +80 -0
- sage/rings/finite_rings/all__sagemath_pari.py +1 -0
- sage/rings/finite_rings/element_givaro.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_givaro.pxd +91 -0
- sage/rings/finite_rings/element_givaro.pyx +1769 -0
- sage/rings/finite_rings/element_ntl_gf2e.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_ntl_gf2e.pxd +22 -0
- sage/rings/finite_rings/element_ntl_gf2e.pyx +1333 -0
- sage/rings/finite_rings/element_pari_ffelt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_pari_ffelt.pxd +13 -0
- sage/rings/finite_rings/element_pari_ffelt.pyx +1441 -0
- sage/rings/finite_rings/finite_field_givaro.py +612 -0
- sage/rings/finite_rings/finite_field_pari_ffelt.py +238 -0
- sage/rings/finite_rings/hom_finite_field_givaro.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field_givaro.pxd +28 -0
- sage/rings/finite_rings/hom_finite_field_givaro.pyx +280 -0
- sage/rings/finite_rings/residue_field_givaro.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field_givaro.pyx +133 -0
- sage/rings/finite_rings/residue_field_pari_ffelt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field_pari_ffelt.pyx +128 -0
- sage/rings/function_field/all__sagemath_pari.py +1 -0
- sage/rings/function_field/valuation.py +1450 -0
- sage/rings/function_field/valuation_ring.py +212 -0
- sage/rings/number_field/all__sagemath_pari.py +14 -0
- sage/rings/number_field/totallyreal.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/number_field/totallyreal.pyx +509 -0
- sage/rings/number_field/totallyreal_data.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/number_field/totallyreal_data.pxd +26 -0
- sage/rings/number_field/totallyreal_data.pyx +928 -0
- sage/rings/number_field/totallyreal_phc.py +144 -0
- sage/rings/number_field/totallyreal_rel.py +1018 -0
- sage/rings/padics/CA_template.pxi +1847 -0
- sage/rings/padics/CA_template_header.pxi +50 -0
- sage/rings/padics/CR_template.pxi +2563 -0
- sage/rings/padics/CR_template_header.pxi +57 -0
- sage/rings/padics/FM_template.pxi +1575 -0
- sage/rings/padics/FM_template_header.pxi +50 -0
- sage/rings/padics/FP_template.pxi +2176 -0
- sage/rings/padics/FP_template_header.pxi +57 -0
- sage/rings/padics/all.py +3 -0
- sage/rings/padics/all__sagemath_pari.py +11 -0
- sage/rings/padics/common_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/common_conversion.pxd +15 -0
- sage/rings/padics/common_conversion.pyx +508 -0
- sage/rings/padics/eisenstein_extension_generic.py +232 -0
- sage/rings/padics/factory.py +3623 -0
- sage/rings/padics/generic_nodes.py +1615 -0
- sage/rings/padics/lattice_precision.py +2889 -0
- sage/rings/padics/morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/morphism.pxd +11 -0
- sage/rings/padics/morphism.pyx +366 -0
- sage/rings/padics/padic_base_generic.py +467 -0
- sage/rings/padics/padic_base_leaves.py +1235 -0
- sage/rings/padics/padic_capped_absolute_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_capped_absolute_element.pxd +15 -0
- sage/rings/padics/padic_capped_absolute_element.pyx +520 -0
- sage/rings/padics/padic_capped_relative_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_capped_relative_element.pxd +14 -0
- sage/rings/padics/padic_capped_relative_element.pyx +614 -0
- sage/rings/padics/padic_extension_generic.py +990 -0
- sage/rings/padics/padic_extension_leaves.py +738 -0
- sage/rings/padics/padic_fixed_mod_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_fixed_mod_element.pxd +15 -0
- sage/rings/padics/padic_fixed_mod_element.pyx +584 -0
- sage/rings/padics/padic_floating_point_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_floating_point_element.pxd +14 -0
- sage/rings/padics/padic_floating_point_element.pyx +447 -0
- sage/rings/padics/padic_generic_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_generic_element.pxd +48 -0
- sage/rings/padics/padic_generic_element.pyx +4642 -0
- sage/rings/padics/padic_lattice_element.py +1342 -0
- sage/rings/padics/padic_printing.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_printing.pxd +38 -0
- sage/rings/padics/padic_printing.pyx +1505 -0
- sage/rings/padics/padic_relaxed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_relaxed_element.pxd +56 -0
- sage/rings/padics/padic_relaxed_element.pyx +18 -0
- sage/rings/padics/padic_relaxed_errors.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/padic_relaxed_errors.pxd +11 -0
- sage/rings/padics/padic_relaxed_errors.pyx +71 -0
- sage/rings/padics/padic_template_element.pxi +1212 -0
- sage/rings/padics/padic_template_element_header.pxi +50 -0
- sage/rings/padics/padic_valuation.py +1423 -0
- sage/rings/padics/pow_computer_flint.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer_flint.pxd +38 -0
- sage/rings/padics/pow_computer_flint.pyx +641 -0
- sage/rings/padics/pow_computer_relative.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer_relative.pxd +29 -0
- sage/rings/padics/pow_computer_relative.pyx +415 -0
- sage/rings/padics/qadic_flint_CA.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/qadic_flint_CA.pxd +21 -0
- sage/rings/padics/qadic_flint_CA.pyx +130 -0
- sage/rings/padics/qadic_flint_CR.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/qadic_flint_CR.pxd +13 -0
- sage/rings/padics/qadic_flint_CR.pyx +172 -0
- sage/rings/padics/qadic_flint_FM.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/qadic_flint_FM.pxd +14 -0
- sage/rings/padics/qadic_flint_FM.pyx +111 -0
- sage/rings/padics/qadic_flint_FP.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/qadic_flint_FP.pxd +12 -0
- sage/rings/padics/qadic_flint_FP.pyx +165 -0
- sage/rings/padics/relative_extension_leaves.py +429 -0
- sage/rings/padics/relative_ramified_CA.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/relative_ramified_CA.pxd +9 -0
- sage/rings/padics/relative_ramified_CA.pyx +33 -0
- sage/rings/padics/relative_ramified_CR.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/relative_ramified_CR.pxd +8 -0
- sage/rings/padics/relative_ramified_CR.pyx +33 -0
- sage/rings/padics/relative_ramified_FM.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/relative_ramified_FM.pxd +9 -0
- sage/rings/padics/relative_ramified_FM.pyx +33 -0
- sage/rings/padics/relative_ramified_FP.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/padics/relative_ramified_FP.pxd +8 -0
- sage/rings/padics/relative_ramified_FP.pyx +33 -0
- sage/rings/padics/relaxed_template.pxi +4229 -0
- sage/rings/padics/relaxed_template_header.pxi +160 -0
- sage/rings/padics/tests.py +35 -0
- sage/rings/padics/tutorial.py +341 -0
- sage/rings/padics/unramified_extension_generic.py +335 -0
- sage/rings/padics/witt_vector.py +917 -0
- sage/rings/padics/witt_vector_ring.py +934 -0
- sage/rings/pari_ring.py +235 -0
- sage/rings/polynomial/all__sagemath_pari.py +1 -0
- sage/rings/polynomial/padics/all.py +1 -0
- sage/rings/polynomial/padics/polynomial_padic.py +360 -0
- sage/rings/polynomial/padics/polynomial_padic_capped_relative_dense.py +1324 -0
- sage/rings/polynomial/padics/polynomial_padic_flat.py +72 -0
- sage/rings/power_series_pari.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/power_series_pari.pxd +6 -0
- sage/rings/power_series_pari.pyx +934 -0
- sage/rings/tate_algebra.py +1282 -0
- sage/rings/tate_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/tate_algebra_element.pxd +49 -0
- sage/rings/tate_algebra_element.pyx +3464 -0
- sage/rings/tate_algebra_ideal.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/tate_algebra_ideal.pxd +7 -0
- sage/rings/tate_algebra_ideal.pyx +1307 -0
- sage/rings/valuation/all.py +7 -0
- sage/rings/valuation/augmented_valuation.py +2118 -0
- sage/rings/valuation/developing_valuation.py +362 -0
- sage/rings/valuation/gauss_valuation.py +812 -0
- sage/rings/valuation/inductive_valuation.py +1686 -0
- sage/rings/valuation/limit_valuation.py +946 -0
- sage/rings/valuation/mapped_valuation.py +656 -0
- sage/rings/valuation/scaled_valuation.py +322 -0
- sage/rings/valuation/trivial_valuation.py +382 -0
- sage/rings/valuation/valuation.py +1119 -0
- sage/rings/valuation/valuation_space.py +1615 -0
- sage/rings/valuation/valuations_catalog.py +10 -0
- sage/rings/valuation/value_group.py +697 -0
- sage/schemes/all__sagemath_pari.py +1 -0
- sage/schemes/elliptic_curves/all__sagemath_pari.py +1 -0
- sage/schemes/elliptic_curves/descent_two_isogeny_pari.cpython-314-x86_64-linux-musl.so +0 -0
- sage/schemes/elliptic_curves/descent_two_isogeny_pari.pyx +46 -0
- sage_wheels/bin/gp +0 -0
- sage_wheels/bin/gp2c +0 -0
- sage_wheels/bin/gp2c-run +57 -0
- sage_wheels/bin/xeus-gp +0 -0
- sage_wheels/share/gp2c/func.dsc +18414 -0
|
@@ -0,0 +1,738 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
r"""
|
|
3
|
+
`p`-adic Extension Leaves
|
|
4
|
+
|
|
5
|
+
The final classes for extensions of `\ZZ_p` and `\QQ_p` (i.e., classes that are not
|
|
6
|
+
just designed to be inherited from).
|
|
7
|
+
|
|
8
|
+
AUTHORS:
|
|
9
|
+
|
|
10
|
+
- David Roe
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
#*****************************************************************************
|
|
14
|
+
# Copyright (C) 2008 David Roe <roed.math@gmail.com>
|
|
15
|
+
# William Stein <wstein@gmail.com>
|
|
16
|
+
#
|
|
17
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
18
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
19
|
+
# the License, or (at your option) any later version.
|
|
20
|
+
#
|
|
21
|
+
# http://www.gnu.org/licenses/
|
|
22
|
+
#*****************************************************************************
|
|
23
|
+
|
|
24
|
+
from sage.misc.lazy_import import lazy_import
|
|
25
|
+
from sage.rings.integer_ring import ZZ
|
|
26
|
+
from sage.rings.finite_rings.integer_mod_ring import Zmod
|
|
27
|
+
|
|
28
|
+
lazy_import('sage.rings.padics.pow_computer_ext', 'PowComputer_ext_maker')
|
|
29
|
+
lazy_import('sage.rings.padics.pow_computer_flint', 'PowComputer_flint_maker')
|
|
30
|
+
lazy_import('sage.libs.ntl.ntl_ZZ_pX', 'ntl_ZZ_pX')
|
|
31
|
+
|
|
32
|
+
from .unramified_extension_generic import UnramifiedExtensionGeneric
|
|
33
|
+
from .eisenstein_extension_generic import EisensteinExtensionGeneric
|
|
34
|
+
#from padic_general_extension_generic import pAdicGeneralExtensionGeneric
|
|
35
|
+
|
|
36
|
+
from .generic_nodes import pAdicCappedRelativeRingGeneric, \
|
|
37
|
+
pAdicCappedRelativeFieldGeneric, \
|
|
38
|
+
pAdicCappedAbsoluteRingGeneric, \
|
|
39
|
+
pAdicFixedModRingGeneric, \
|
|
40
|
+
pAdicFloatingPointRingGeneric, \
|
|
41
|
+
pAdicFloatingPointFieldGeneric
|
|
42
|
+
|
|
43
|
+
#from unramified_extension_absolute_element import UnramifiedExtensionAbsoluteElement
|
|
44
|
+
#from unramified_extension_capped_relative_element import UnramifiedExtensionCappedRelativeElement
|
|
45
|
+
#from unramified_extension_lazy_element import UnramifiedExtensionRelaxedElement
|
|
46
|
+
#from eisenstein_extension_absolute_element import EisensteinExtensionAbsoluteElement
|
|
47
|
+
#from eisenstein_extension_capped_relative_element import EisensteinExtensionCappedRelativeElement
|
|
48
|
+
#from eisenstein_extension_lazy_element import EisensteinExtensionRelaxedElement
|
|
49
|
+
#from padic_general_extension_absolute_element import pAdicGeneralExtensionAbsoluteElement
|
|
50
|
+
#from padic_general_extension_capped_relative_element import pAdicGeneralExtensionCappedRelativeElement
|
|
51
|
+
#from padic_general_extension_lazy_element import pAdicGeneralExtensionRelaxedElement
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
from .padic_ZZ_pX_FM_element import pAdicZZpXFMElement
|
|
55
|
+
from .padic_ZZ_pX_CR_element import pAdicZZpXCRElement
|
|
56
|
+
from .padic_ZZ_pX_CA_element import pAdicZZpXCAElement
|
|
57
|
+
except ImportError:
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
from .qadic_flint_CR import qAdicCappedRelativeElement
|
|
62
|
+
from .qadic_flint_CA import qAdicCappedAbsoluteElement
|
|
63
|
+
from .qadic_flint_FM import qAdicFixedModElement
|
|
64
|
+
from .qadic_flint_FP import qAdicFloatingPointElement
|
|
65
|
+
except ImportError:
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _make_integral_poly(exact_modulus, p, prec):
|
|
70
|
+
"""
|
|
71
|
+
Convert a defining polynomial into one with integral coefficients.
|
|
72
|
+
|
|
73
|
+
INPUT:
|
|
74
|
+
|
|
75
|
+
- ``exact_modulus`` -- a univariate polynomial
|
|
76
|
+
|
|
77
|
+
- ``p`` -- a prime
|
|
78
|
+
|
|
79
|
+
- ``prec`` -- the precision
|
|
80
|
+
|
|
81
|
+
EXAMPLES::
|
|
82
|
+
|
|
83
|
+
sage: from sage.rings.padics.padic_extension_leaves import _make_integral_poly
|
|
84
|
+
sage: R.<x> = QQ[]
|
|
85
|
+
sage: f = _make_integral_poly(x^2 - 2, 5, 3); f
|
|
86
|
+
x^2 - 2
|
|
87
|
+
sage: f.parent()
|
|
88
|
+
Univariate Polynomial Ring in x over Integer Ring
|
|
89
|
+
sage: f = _make_integral_poly(x^2 - 2/7, 5, 3); f
|
|
90
|
+
x^2 + 89
|
|
91
|
+
sage: f.parent()
|
|
92
|
+
Univariate Polynomial Ring in x over Integer Ring
|
|
93
|
+
"""
|
|
94
|
+
try:
|
|
95
|
+
return exact_modulus.change_ring(ZZ)
|
|
96
|
+
except TypeError:
|
|
97
|
+
return exact_modulus.change_ring(Zmod(p**prec)).change_ring(ZZ)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class UnramifiedExtensionRingCappedRelative(UnramifiedExtensionGeneric, pAdicCappedRelativeRingGeneric):
|
|
101
|
+
"""
|
|
102
|
+
TESTS::
|
|
103
|
+
|
|
104
|
+
sage: R.<a> = ZqCR(27,1000) # needs sage.libs.ntl
|
|
105
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # needs sage.libs.ntl
|
|
106
|
+
"""
|
|
107
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='FLINT'):
|
|
108
|
+
r"""
|
|
109
|
+
A capped relative representation of `\ZZ_q`.
|
|
110
|
+
|
|
111
|
+
INPUT:
|
|
112
|
+
|
|
113
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
114
|
+
This could be a polynomial with integer coefficients, for example,
|
|
115
|
+
while ``poly`` has coefficients in a `p`-adic ring.
|
|
116
|
+
|
|
117
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
118
|
+
defining this extension
|
|
119
|
+
|
|
120
|
+
- ``prec`` -- the precision cap of this ring
|
|
121
|
+
|
|
122
|
+
- ``print_mode`` -- dictionary of print options
|
|
123
|
+
|
|
124
|
+
- ``shift_seed`` -- unused
|
|
125
|
+
|
|
126
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name,
|
|
127
|
+
unramified_subextension_variable_name, uniformizer_name)``
|
|
128
|
+
|
|
129
|
+
EXAMPLES::
|
|
130
|
+
|
|
131
|
+
sage: R.<a> = ZqCR(27,10000); R # indirect doctest # needs sage.libs.ntl
|
|
132
|
+
3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
|
|
133
|
+
|
|
134
|
+
sage: R.<a> = ZqCR(next_prime(10^30)^3, 3); R.prime() # needs sage.libs.ntl
|
|
135
|
+
1000000000000000000000000000057
|
|
136
|
+
"""
|
|
137
|
+
self._shift_seed = None
|
|
138
|
+
self._exact_modulus = exact_modulus
|
|
139
|
+
self._implementation = implementation
|
|
140
|
+
if implementation == 'NTL':
|
|
141
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**prec)
|
|
142
|
+
if prec <= 30:
|
|
143
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), prec, prec, prec, False, ntl_poly, "small", "u")
|
|
144
|
+
else:
|
|
145
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), 30, prec, prec, False, ntl_poly, "big", "u")
|
|
146
|
+
element_class = pAdicZZpXCRElement
|
|
147
|
+
else:
|
|
148
|
+
Zpoly = _make_integral_poly(exact_modulus, poly.base_ring().prime(), prec)
|
|
149
|
+
cache_limit = min(prec, 30)
|
|
150
|
+
self.prime_pow = PowComputer_flint_maker(poly.base_ring().prime(), cache_limit, prec, prec, False, Zpoly, prec_type='capped-rel')
|
|
151
|
+
element_class = qAdicCappedRelativeElement
|
|
152
|
+
UnramifiedExtensionGeneric.__init__(self, poly, prec, print_mode, names, element_class)
|
|
153
|
+
if implementation != 'NTL':
|
|
154
|
+
from .qadic_flint_CR import pAdicCoercion_ZZ_CR, pAdicConvert_QQ_CR
|
|
155
|
+
self.register_coercion(pAdicCoercion_ZZ_CR(self))
|
|
156
|
+
self.register_conversion(pAdicConvert_QQ_CR(self))
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class UnramifiedExtensionFieldCappedRelative(UnramifiedExtensionGeneric, pAdicCappedRelativeFieldGeneric):
|
|
160
|
+
"""
|
|
161
|
+
TESTS::
|
|
162
|
+
|
|
163
|
+
sage: R.<a> = QqCR(27,1000) # needs sage.libs.ntl
|
|
164
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # needs sage.libs.ntl
|
|
165
|
+
"""
|
|
166
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='FLINT'):
|
|
167
|
+
r"""
|
|
168
|
+
A representation of `\QQ_q`.
|
|
169
|
+
|
|
170
|
+
INPUT:
|
|
171
|
+
|
|
172
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
173
|
+
This could be a polynomial with rational coefficients, for example,
|
|
174
|
+
while ``poly`` has coefficients in a `p`-adic field.
|
|
175
|
+
|
|
176
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
177
|
+
defining this extension
|
|
178
|
+
|
|
179
|
+
- ``prec`` -- the precision cap of this ring
|
|
180
|
+
|
|
181
|
+
- ``print_mode`` -- dictionary of print options
|
|
182
|
+
|
|
183
|
+
- ``shift_seed`` -- unused
|
|
184
|
+
|
|
185
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name,
|
|
186
|
+
unramified_subextension_variable_name, uniformizer_name)``
|
|
187
|
+
|
|
188
|
+
EXAMPLES::
|
|
189
|
+
|
|
190
|
+
sage: R.<a> = Qq(27,10000); R # indirect doctest # needs sage.libs.ntl
|
|
191
|
+
3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1
|
|
192
|
+
|
|
193
|
+
sage: R.<a> = Qq(next_prime(10^30)^3, 3); R.prime() # needs sage.libs.ntl
|
|
194
|
+
1000000000000000000000000000057
|
|
195
|
+
"""
|
|
196
|
+
# Currently doesn't support polynomials with non-integral coefficients
|
|
197
|
+
self._shift_seed = None
|
|
198
|
+
self._exact_modulus = exact_modulus
|
|
199
|
+
self._implementation = implementation
|
|
200
|
+
if implementation == 'NTL':
|
|
201
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**prec)
|
|
202
|
+
if prec <= 30:
|
|
203
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), prec, prec, prec, True, ntl_poly, "small", "u")
|
|
204
|
+
else:
|
|
205
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), 30, prec, prec, True, ntl_poly, "big", "u")
|
|
206
|
+
element_class = pAdicZZpXCRElement
|
|
207
|
+
else:
|
|
208
|
+
Zpoly = _make_integral_poly(exact_modulus, poly.base_ring().prime(), prec)
|
|
209
|
+
cache_limit = min(prec, 30)
|
|
210
|
+
self.prime_pow = PowComputer_flint_maker(poly.base_ring().prime(), cache_limit, prec, prec, True, Zpoly, prec_type='capped-rel')
|
|
211
|
+
element_class = qAdicCappedRelativeElement
|
|
212
|
+
UnramifiedExtensionGeneric.__init__(self, poly, prec, print_mode, names, element_class)
|
|
213
|
+
if implementation != 'NTL':
|
|
214
|
+
from .qadic_flint_CR import pAdicCoercion_ZZ_CR, pAdicCoercion_QQ_CR
|
|
215
|
+
self.register_coercion(pAdicCoercion_ZZ_CR(self))
|
|
216
|
+
self.register_coercion(pAdicCoercion_QQ_CR(self))
|
|
217
|
+
|
|
218
|
+
def _coerce_map_from_(self, R):
|
|
219
|
+
r"""
|
|
220
|
+
Return a coercion from ``R`` into this ring or ``True`` if the default
|
|
221
|
+
conversion map can be used to perform a coercion.
|
|
222
|
+
|
|
223
|
+
EXAMPLES::
|
|
224
|
+
|
|
225
|
+
sage: R.<a> = QqCR(27) # needs sage.libs.ntl
|
|
226
|
+
sage: R.coerce_map_from(ZqCR(27,names='a')) # indirect doctest # needs sage.libs.ntl
|
|
227
|
+
Ring morphism:
|
|
228
|
+
From: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
|
|
229
|
+
To: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1
|
|
230
|
+
sage: R.coerce_map_from(ZqCA(27,names='a')) # indirect doctest # needs sage.libs.ntl
|
|
231
|
+
Ring morphism:
|
|
232
|
+
From: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
|
|
233
|
+
To: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1
|
|
234
|
+
"""
|
|
235
|
+
if isinstance(R, UnramifiedExtensionRingCappedRelative) and R.fraction_field() is self:
|
|
236
|
+
from sage.rings.padics.qadic_flint_CR import pAdicCoercion_CR_frac_field
|
|
237
|
+
return pAdicCoercion_CR_frac_field(R, self)
|
|
238
|
+
if isinstance(R, UnramifiedExtensionRingCappedAbsolute) and R.fraction_field() is self:
|
|
239
|
+
from sage.rings.padics.qadic_flint_CA import pAdicCoercion_CA_frac_field
|
|
240
|
+
return pAdicCoercion_CA_frac_field(R, self)
|
|
241
|
+
|
|
242
|
+
return super()._coerce_map_from_(R)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class UnramifiedExtensionRingCappedAbsolute(UnramifiedExtensionGeneric, pAdicCappedAbsoluteRingGeneric):
|
|
246
|
+
"""
|
|
247
|
+
TESTS::
|
|
248
|
+
|
|
249
|
+
sage: R.<a> = ZqCA(27,1000) # needs sage.libs.flint
|
|
250
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # needs sage.libs.flint
|
|
251
|
+
"""
|
|
252
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='FLINT'):
|
|
253
|
+
r"""
|
|
254
|
+
A capped absolute representation of `ZZ_q`.
|
|
255
|
+
|
|
256
|
+
INPUT:
|
|
257
|
+
|
|
258
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
259
|
+
This could be a polynomial with integer coefficients, for example,
|
|
260
|
+
while ``poly`` has coefficients in a `p`-adic ring.
|
|
261
|
+
|
|
262
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
263
|
+
defining this extension
|
|
264
|
+
|
|
265
|
+
- ``prec`` -- the precision cap of this ring
|
|
266
|
+
|
|
267
|
+
- ``print_mode`` -- dictionary of print options
|
|
268
|
+
|
|
269
|
+
- ``shift_seed`` -- unused
|
|
270
|
+
|
|
271
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name,
|
|
272
|
+
unramified_subextension_variable_name, uniformizer_name)``
|
|
273
|
+
|
|
274
|
+
EXAMPLES::
|
|
275
|
+
|
|
276
|
+
sage: R.<a> = ZqCA(27,10000); R # indirect doctest # needs sage.libs.flint
|
|
277
|
+
3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
|
|
278
|
+
|
|
279
|
+
sage: R.<a> = ZqCA(next_prime(10^30)^3, 3); R.prime() # needs sage.libs.flint
|
|
280
|
+
1000000000000000000000000000057
|
|
281
|
+
"""
|
|
282
|
+
# Currently doesn't support polynomials with non-integral coefficients
|
|
283
|
+
self._shift_seed = None
|
|
284
|
+
self._exact_modulus = exact_modulus
|
|
285
|
+
self._implementation = implementation
|
|
286
|
+
if implementation == 'NTL':
|
|
287
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**prec)
|
|
288
|
+
if prec <= 30:
|
|
289
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), prec, prec, prec, True, ntl_poly, "small", "u")
|
|
290
|
+
else:
|
|
291
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), 30, prec, prec, True, ntl_poly, "big", "u")
|
|
292
|
+
element_class = pAdicZZpXCAElement
|
|
293
|
+
else:
|
|
294
|
+
Zpoly = _make_integral_poly(exact_modulus, poly.base_ring().prime(), prec)
|
|
295
|
+
cache_limit = min(prec, 30)
|
|
296
|
+
self.prime_pow = PowComputer_flint_maker(poly.base_ring().prime(), cache_limit, prec, prec, False, Zpoly, prec_type='capped-abs')
|
|
297
|
+
element_class = qAdicCappedAbsoluteElement
|
|
298
|
+
UnramifiedExtensionGeneric.__init__(self, poly, prec, print_mode, names, element_class)
|
|
299
|
+
if implementation != 'NTL':
|
|
300
|
+
from .qadic_flint_CA import pAdicCoercion_ZZ_CA, pAdicConvert_QQ_CA
|
|
301
|
+
self.register_coercion(pAdicCoercion_ZZ_CA(self))
|
|
302
|
+
self.register_conversion(pAdicConvert_QQ_CA(self))
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class UnramifiedExtensionRingFixedMod(UnramifiedExtensionGeneric, pAdicFixedModRingGeneric):
|
|
306
|
+
"""
|
|
307
|
+
TESTS::
|
|
308
|
+
|
|
309
|
+
sage: R.<a> = ZqFM(27,1000) # needs sage.libs.flint
|
|
310
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # long time # needs sage.libs.flint
|
|
311
|
+
"""
|
|
312
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='FLINT'):
|
|
313
|
+
"""
|
|
314
|
+
A fixed modulus representation of Zq.
|
|
315
|
+
|
|
316
|
+
INPUT:
|
|
317
|
+
|
|
318
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
319
|
+
This could be a polynomial with integer coefficients, for example,
|
|
320
|
+
while ``poly`` has coefficients in a `p`-adic field.
|
|
321
|
+
|
|
322
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
323
|
+
defining this extension
|
|
324
|
+
|
|
325
|
+
- ``prec`` -- the precision cap of this ring
|
|
326
|
+
|
|
327
|
+
- ``print_mode`` -- dictionary of print options
|
|
328
|
+
|
|
329
|
+
- ``shift_seed`` -- unused
|
|
330
|
+
|
|
331
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name, unramified_subextension_variable_name, uniformizer_name)``
|
|
332
|
+
|
|
333
|
+
EXAMPLES::
|
|
334
|
+
|
|
335
|
+
sage: R.<a> = ZqFM(27,10000); R # indirect doctest # needs sage.libs.flint
|
|
336
|
+
3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
|
|
337
|
+
|
|
338
|
+
sage: R.<a> = ZqFM(next_prime(10^30)^3, 3); R.prime() # needs sage.libs.flint
|
|
339
|
+
1000000000000000000000000000057
|
|
340
|
+
"""
|
|
341
|
+
self._shift_seed = None
|
|
342
|
+
self._exact_modulus = exact_modulus
|
|
343
|
+
self._implementation = implementation
|
|
344
|
+
if implementation == 'NTL':
|
|
345
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**prec)
|
|
346
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), max(min(prec - 1, 30), 1), prec, prec, False, ntl_poly, "FM", "u")
|
|
347
|
+
element_class = pAdicZZpXFMElement
|
|
348
|
+
else:
|
|
349
|
+
Zpoly = _make_integral_poly(exact_modulus, poly.base_ring().prime(), prec)
|
|
350
|
+
cache_limit = 0 # prevents caching
|
|
351
|
+
self.prime_pow = PowComputer_flint_maker(poly.base_ring().prime(), cache_limit, prec, prec, False, Zpoly, prec_type='fixed-mod')
|
|
352
|
+
element_class = qAdicFixedModElement
|
|
353
|
+
UnramifiedExtensionGeneric.__init__(self, poly, prec, print_mode, names, element_class)
|
|
354
|
+
if implementation != 'NTL':
|
|
355
|
+
from .qadic_flint_FM import pAdicCoercion_ZZ_FM, pAdicConvert_QQ_FM
|
|
356
|
+
self.register_coercion(pAdicCoercion_ZZ_FM(self))
|
|
357
|
+
self.register_conversion(pAdicConvert_QQ_FM(self))
|
|
358
|
+
|
|
359
|
+
#def coerce_map_explicit(self, S):
|
|
360
|
+
# from sage.rings.padics.morphism import Morphism_ZZ_UnrFM, Morphism_ZpFM_UnrFM
|
|
361
|
+
# if S is ZZ:
|
|
362
|
+
# return Morphism_ZZ_UnrFM(self)
|
|
363
|
+
# elif isinstance(S, pAdicRingFixedMod) and S.prime() == self.prime():
|
|
364
|
+
# return Morphism_ZpFM_UnrFM(S, self)
|
|
365
|
+
# return None
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
class UnramifiedExtensionRingFloatingPoint(UnramifiedExtensionGeneric, pAdicFloatingPointRingGeneric):
|
|
369
|
+
"""
|
|
370
|
+
TESTS::
|
|
371
|
+
|
|
372
|
+
sage: R.<a> = ZqFP(27,10000); R == loads(dumps(R)) # needs sage.libs.flint
|
|
373
|
+
True
|
|
374
|
+
"""
|
|
375
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='FLINT'):
|
|
376
|
+
r"""
|
|
377
|
+
A floating point representation of `\ZZ_q`.
|
|
378
|
+
|
|
379
|
+
INPUT:
|
|
380
|
+
|
|
381
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
382
|
+
This could be a polynomial with integer coefficients, for example,
|
|
383
|
+
while ``poly`` has coefficients in `\ZZ_p`.
|
|
384
|
+
|
|
385
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
386
|
+
defining this extension
|
|
387
|
+
|
|
388
|
+
- ``prec`` -- the precision cap of this ring
|
|
389
|
+
|
|
390
|
+
- ``print_mode`` -- dictionary of print options
|
|
391
|
+
|
|
392
|
+
- ``shift_seed`` -- unused
|
|
393
|
+
|
|
394
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name, unramified_subextension_variable_name, uniformizer_name)``
|
|
395
|
+
|
|
396
|
+
EXAMPLES::
|
|
397
|
+
|
|
398
|
+
sage: R.<a> = ZqFP(27,10000); R # indirect doctest # needs sage.libs.flint
|
|
399
|
+
3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
|
|
400
|
+
sage: R.<a> = ZqFP(next_prime(10^30)^3, 3); R.prime() # needs sage.libs.flint
|
|
401
|
+
1000000000000000000000000000057
|
|
402
|
+
|
|
403
|
+
TESTS:
|
|
404
|
+
|
|
405
|
+
Check that :issue:`23228` has been resolved::
|
|
406
|
+
|
|
407
|
+
sage: a % R.prime() # needs sage.libs.flint
|
|
408
|
+
a
|
|
409
|
+
"""
|
|
410
|
+
self._shift_seed = None
|
|
411
|
+
self._exact_modulus = exact_modulus
|
|
412
|
+
self._implementation = implementation
|
|
413
|
+
if implementation == 'NTL':
|
|
414
|
+
raise NotImplementedError
|
|
415
|
+
Zpoly = _make_integral_poly(exact_modulus, poly.base_ring().prime(), prec)
|
|
416
|
+
cache_limit = min(prec, 30)
|
|
417
|
+
self.prime_pow = PowComputer_flint_maker(poly.base_ring().prime(), cache_limit, prec, prec, False, Zpoly, prec_type='floating-point')
|
|
418
|
+
UnramifiedExtensionGeneric.__init__(self, poly, prec, print_mode, names, qAdicFloatingPointElement)
|
|
419
|
+
from .qadic_flint_FP import pAdicCoercion_ZZ_FP, pAdicConvert_QQ_FP
|
|
420
|
+
self.register_coercion(pAdicCoercion_ZZ_FP(self))
|
|
421
|
+
self.register_conversion(pAdicConvert_QQ_FP(self))
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
class UnramifiedExtensionFieldFloatingPoint(UnramifiedExtensionGeneric, pAdicFloatingPointFieldGeneric):
|
|
425
|
+
"""
|
|
426
|
+
TESTS::
|
|
427
|
+
|
|
428
|
+
sage: R.<a> = QqFP(27,10000); R == loads(dumps(R)) # needs sage.libs.flint
|
|
429
|
+
True
|
|
430
|
+
"""
|
|
431
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='FLINT'):
|
|
432
|
+
r"""
|
|
433
|
+
A representation of `\QQ_q`.
|
|
434
|
+
|
|
435
|
+
INPUT:
|
|
436
|
+
|
|
437
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
438
|
+
This could be a polynomial with rational coefficients, for example,
|
|
439
|
+
while ``poly`` has coefficients in a `p`-adic field.
|
|
440
|
+
|
|
441
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
442
|
+
defining this extension
|
|
443
|
+
|
|
444
|
+
- ``prec`` -- the precision cap of this ring
|
|
445
|
+
|
|
446
|
+
- ``print_mode`` -- dictionary of print options
|
|
447
|
+
|
|
448
|
+
- ``shift_seed`` -- unused
|
|
449
|
+
|
|
450
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name, unramified_subextension_variable_name, uniformizer_name)``
|
|
451
|
+
|
|
452
|
+
EXAMPLES::
|
|
453
|
+
|
|
454
|
+
sage: R.<a> = QqFP(27,10000); R # indirect doctest # needs sage.libs.flint
|
|
455
|
+
3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1
|
|
456
|
+
sage: R.<a> = Qq(next_prime(10^30)^3, 3); R.prime() # needs sage.libs.ntl
|
|
457
|
+
1000000000000000000000000000057
|
|
458
|
+
"""
|
|
459
|
+
# Currently doesn't support polynomials with non-integral coefficients
|
|
460
|
+
self._shift_seed = None
|
|
461
|
+
self._exact_modulus = exact_modulus
|
|
462
|
+
self._implementation = implementation
|
|
463
|
+
if implementation == 'NTL':
|
|
464
|
+
raise NotImplementedError
|
|
465
|
+
Zpoly = _make_integral_poly(exact_modulus, poly.base_ring().prime(), prec)
|
|
466
|
+
cache_limit = min(prec, 30)
|
|
467
|
+
self.prime_pow = PowComputer_flint_maker(poly.base_ring().prime(), cache_limit, prec, prec, True, Zpoly, prec_type='floating-point')
|
|
468
|
+
UnramifiedExtensionGeneric.__init__(self, poly, prec, print_mode, names, qAdicFloatingPointElement)
|
|
469
|
+
from .qadic_flint_FP import pAdicCoercion_ZZ_FP, pAdicCoercion_QQ_FP
|
|
470
|
+
self.register_coercion(pAdicCoercion_ZZ_FP(self))
|
|
471
|
+
self.register_coercion(pAdicCoercion_QQ_FP(self))
|
|
472
|
+
|
|
473
|
+
def _coerce_map_from_(self, R):
|
|
474
|
+
r"""
|
|
475
|
+
Return a coercion from ``R`` into this ring or ``True`` if the default
|
|
476
|
+
conversion map can be used to perform a coercion.
|
|
477
|
+
|
|
478
|
+
EXAMPLES::
|
|
479
|
+
|
|
480
|
+
sage: R.<a> = QqFP(27) # needs sage.libs.flint
|
|
481
|
+
sage: R.coerce_map_from(ZqFP(27,names='a')) # indirect doctest # needs sage.libs.flint
|
|
482
|
+
Ring morphism:
|
|
483
|
+
From: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
|
|
484
|
+
To: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1
|
|
485
|
+
"""
|
|
486
|
+
if isinstance(R, UnramifiedExtensionRingFloatingPoint) and R.fraction_field() is self:
|
|
487
|
+
from sage.rings.padics.qadic_flint_FP import pAdicCoercion_FP_frac_field
|
|
488
|
+
return pAdicCoercion_FP_frac_field(R, self)
|
|
489
|
+
|
|
490
|
+
return super()._coerce_map_from_(R)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
class EisensteinExtensionRingCappedRelative(EisensteinExtensionGeneric, pAdicCappedRelativeRingGeneric):
|
|
494
|
+
"""
|
|
495
|
+
TESTS::
|
|
496
|
+
|
|
497
|
+
sage: R = Zp(3, 1000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
498
|
+
sage: W.<w> = R.ext(f) # needs sage.libs.ntl sage.rings.padics
|
|
499
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # needs sage.geometry.polyhedron
|
|
500
|
+
"""
|
|
501
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='NTL'):
|
|
502
|
+
r"""
|
|
503
|
+
A capped relative representation of an Eisenstein extension of `\ZZ_p`.
|
|
504
|
+
|
|
505
|
+
INPUT:
|
|
506
|
+
|
|
507
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
508
|
+
This could be a polynomial with integer coefficients, for example,
|
|
509
|
+
while ``poly`` has coefficients in a `p`-adic ring.
|
|
510
|
+
|
|
511
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
512
|
+
defining this extension
|
|
513
|
+
|
|
514
|
+
- ``prec`` -- the precision cap of this ring
|
|
515
|
+
|
|
516
|
+
- ``print_mode`` -- dictionary of print options
|
|
517
|
+
|
|
518
|
+
- ``shift_seed`` -- unused
|
|
519
|
+
|
|
520
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name, unramified_subextension_variable_name, uniformizer_name)``
|
|
521
|
+
|
|
522
|
+
EXAMPLES::
|
|
523
|
+
|
|
524
|
+
sage: R = Zp(3, 10000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
525
|
+
sage: W.<w> = R.ext(f); W # indirect doctest # needs sage.libs.ntl
|
|
526
|
+
3-adic Eisenstein Extension Ring in w defined by x^3 + 9*x - 3
|
|
527
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
528
|
+
30000
|
|
529
|
+
|
|
530
|
+
sage: R.<p> = Zp(next_prime(10^30), 3, print_pos=False); S.<x> = ZZ[]; f = x^3 + p^2*x - p # needs sage.libs.ntl
|
|
531
|
+
sage: W.<w> = R.ext(f); W.prime() # needs sage.libs.ntl
|
|
532
|
+
1000000000000000000000000000057
|
|
533
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
534
|
+
9
|
|
535
|
+
"""
|
|
536
|
+
unram_prec = (prec + poly.degree() - 1) // poly.degree()
|
|
537
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**unram_prec)
|
|
538
|
+
shift_poly = ntl_ZZ_pX([a.lift() for a in shift_seed.list()], shift_seed.base_ring().prime()**unram_prec)
|
|
539
|
+
if unram_prec <= 30:
|
|
540
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), unram_prec, unram_prec, prec, False, ntl_poly, "small", "e", shift_poly)
|
|
541
|
+
else:
|
|
542
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), 30, unram_prec, prec, False, ntl_poly, "big", "e", shift_poly)
|
|
543
|
+
self._shift_seed = shift_seed
|
|
544
|
+
self._exact_modulus = exact_modulus
|
|
545
|
+
self._implementation = implementation
|
|
546
|
+
EisensteinExtensionGeneric.__init__(self, poly, prec, print_mode, names, pAdicZZpXCRElement)
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
class EisensteinExtensionFieldCappedRelative(EisensteinExtensionGeneric, pAdicCappedRelativeFieldGeneric):
|
|
550
|
+
"""
|
|
551
|
+
TESTS::
|
|
552
|
+
|
|
553
|
+
sage: R = Qp(3, 1000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
554
|
+
sage: W.<w> = R.ext(f) # needs sage.libs.ntl
|
|
555
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # needs sage.geometry.polyhedron
|
|
556
|
+
"""
|
|
557
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='NTL'):
|
|
558
|
+
r"""
|
|
559
|
+
A capped relative representation of an Eisenstein extension of `\QQ_p`.
|
|
560
|
+
|
|
561
|
+
INPUT:
|
|
562
|
+
|
|
563
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
564
|
+
This could be a polynomial with rational coefficients, for example,
|
|
565
|
+
while ``poly`` has coefficients in a `p`-adic field.
|
|
566
|
+
|
|
567
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
568
|
+
defining this extension
|
|
569
|
+
|
|
570
|
+
- ``prec`` -- the precision cap of this ring
|
|
571
|
+
|
|
572
|
+
- ``print_mode`` -- dictionary of print options
|
|
573
|
+
|
|
574
|
+
- ``shift_seed`` -- unused
|
|
575
|
+
|
|
576
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name, unramified_subextension_variable_name, uniformizer_name)``
|
|
577
|
+
|
|
578
|
+
EXAMPLES::
|
|
579
|
+
|
|
580
|
+
sage: R = Qp(3, 10000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
581
|
+
sage: W.<w> = R.ext(f); W # indirect doctest # needs sage.libs.ntl
|
|
582
|
+
3-adic Eisenstein Extension Field in w defined by x^3 + 9*x - 3
|
|
583
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
584
|
+
30000
|
|
585
|
+
|
|
586
|
+
sage: R.<p> = Qp(next_prime(10^30), 3, print_pos=False); S.<x> = ZZ[]; f = x^3 + p^2*x - p # needs sage.libs.ntl
|
|
587
|
+
sage: W.<w> = R.ext(f); W.prime() # needs sage.libs.ntl
|
|
588
|
+
1000000000000000000000000000057
|
|
589
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
590
|
+
9
|
|
591
|
+
"""
|
|
592
|
+
# Currently doesn't support polynomials with non-integral coefficients
|
|
593
|
+
unram_prec = (prec + poly.degree() - 1) // poly.degree()
|
|
594
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**unram_prec)
|
|
595
|
+
shift_poly = ntl_ZZ_pX([a.lift() for a in shift_seed.list()], shift_seed.base_ring().prime()**unram_prec)
|
|
596
|
+
if unram_prec <= 30:
|
|
597
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), unram_prec, unram_prec, prec, True, ntl_poly, "small", "e", shift_poly)
|
|
598
|
+
else:
|
|
599
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), 30, unram_prec, prec, True, ntl_poly, "big", "e", shift_poly)
|
|
600
|
+
self._shift_seed = shift_seed
|
|
601
|
+
self._exact_modulus = exact_modulus
|
|
602
|
+
self._implementation = implementation
|
|
603
|
+
EisensteinExtensionGeneric.__init__(self, poly, prec, print_mode, names, pAdicZZpXCRElement)
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
class EisensteinExtensionRingCappedAbsolute(EisensteinExtensionGeneric, pAdicCappedAbsoluteRingGeneric):
|
|
607
|
+
"""
|
|
608
|
+
TESTS::
|
|
609
|
+
|
|
610
|
+
sage: R = ZpCA(3, 1000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
611
|
+
sage: W.<w> = R.ext(f) # needs sage.libs.ntl sage.rings.padics
|
|
612
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # needs sage.geometry.polyhedron
|
|
613
|
+
"""
|
|
614
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation):
|
|
615
|
+
r"""
|
|
616
|
+
A capped absolute representation of an Eisenstein extension of `\ZZ_p`.
|
|
617
|
+
|
|
618
|
+
INPUT:
|
|
619
|
+
|
|
620
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
621
|
+
This could be a polynomial with integer coefficients, for example,
|
|
622
|
+
while ``poly`` has coefficients in a `p`-adic ring.
|
|
623
|
+
|
|
624
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
625
|
+
defining this extension
|
|
626
|
+
|
|
627
|
+
- ``prec`` -- the precision cap of this ring
|
|
628
|
+
|
|
629
|
+
- ``print_mode`` -- dictionary of print options
|
|
630
|
+
|
|
631
|
+
- ``shift_seed`` -- unused
|
|
632
|
+
|
|
633
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name, unramified_subextension_variable_name, uniformizer_name)``
|
|
634
|
+
|
|
635
|
+
EXAMPLES::
|
|
636
|
+
|
|
637
|
+
sage: R = ZpCA(3, 10000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
638
|
+
sage: W.<w> = R.ext(f); W # needs sage.libs.ntl
|
|
639
|
+
3-adic Eisenstein Extension Ring in w defined by x^3 + 9*x - 3
|
|
640
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
641
|
+
30000
|
|
642
|
+
|
|
643
|
+
sage: R.<p> = ZpCA(next_prime(10^30), 3, print_pos=False); S.<x> = ZZ[]; f = x^3 + p^2*x - p
|
|
644
|
+
sage: W.<w> = R.ext(f); W.prime() # needs sage.libs.ntl
|
|
645
|
+
1000000000000000000000000000057
|
|
646
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
647
|
+
9
|
|
648
|
+
"""
|
|
649
|
+
unram_prec = (prec + poly.degree() - 1) // poly.degree()
|
|
650
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**unram_prec)
|
|
651
|
+
shift_poly = ntl_ZZ_pX([a.lift() for a in shift_seed.list()], shift_seed.base_ring().prime()**unram_prec)
|
|
652
|
+
if unram_prec <= 30:
|
|
653
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), unram_prec, unram_prec, prec, False, ntl_poly, "small", "e", shift_poly)
|
|
654
|
+
else:
|
|
655
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), 30, unram_prec, prec, False, ntl_poly, "big", "e", shift_poly)
|
|
656
|
+
self._shift_seed = shift_seed
|
|
657
|
+
self._exact_modulus = exact_modulus
|
|
658
|
+
self._implementation = implementation
|
|
659
|
+
EisensteinExtensionGeneric.__init__(self, poly, prec, print_mode, names, pAdicZZpXCAElement)
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
class EisensteinExtensionRingFixedMod(EisensteinExtensionGeneric, pAdicFixedModRingGeneric):
|
|
663
|
+
"""
|
|
664
|
+
TESTS::
|
|
665
|
+
|
|
666
|
+
sage: R = ZpFM(3, 1000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
667
|
+
sage: W.<w> = R.ext(f) # needs sage.libs.ntl sage.rings.padics
|
|
668
|
+
sage: TestSuite(R).run(skip='_test_log',max_runs=4) # needs sage.geometry.polyhedron
|
|
669
|
+
"""
|
|
670
|
+
def __init__(self, exact_modulus, poly, prec, print_mode, shift_seed, names, implementation='NTL'):
|
|
671
|
+
r"""
|
|
672
|
+
A fixed modulus representation of an eisenstein extension of `\ZZ_p`.
|
|
673
|
+
|
|
674
|
+
INPUT:
|
|
675
|
+
|
|
676
|
+
- ``exact_modulus`` -- the original polynomial defining the extension.
|
|
677
|
+
This could be a polynomial with integer coefficients, for example,
|
|
678
|
+
while ``poly`` has coefficients in a `p`-adic ring.
|
|
679
|
+
|
|
680
|
+
- ``poly`` -- the polynomial with coefficients in :meth:`base_ring`
|
|
681
|
+
defining this extension
|
|
682
|
+
|
|
683
|
+
- ``prec`` -- the precision cap of this ring
|
|
684
|
+
|
|
685
|
+
- ``print_mode`` -- dictionary of print options
|
|
686
|
+
|
|
687
|
+
- ``shift_seed`` -- unused
|
|
688
|
+
|
|
689
|
+
- ``names`` -- a 4-tuple, ``(variable_name, residue_name, unramified_subextension_variable_name, uniformizer_name)``
|
|
690
|
+
|
|
691
|
+
EXAMPLES::
|
|
692
|
+
|
|
693
|
+
sage: R = ZpFM(3, 10000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
|
|
694
|
+
sage: W.<w> = R.ext(f); W # indirect doctest # needs sage.libs.ntl
|
|
695
|
+
3-adic Eisenstein Extension Ring in w defined by x^3 + 9*x - 3
|
|
696
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
697
|
+
30000
|
|
698
|
+
|
|
699
|
+
sage: R.<p> = ZpFM(next_prime(10^30), 3, print_pos=False); S.<x> = ZZ[]; f = x^3 + p^2*x - p
|
|
700
|
+
sage: W.<w> = R.ext(f); W.prime() # needs sage.libs.ntl
|
|
701
|
+
1000000000000000000000000000057
|
|
702
|
+
sage: W.precision_cap() # needs sage.libs.ntl
|
|
703
|
+
9
|
|
704
|
+
"""
|
|
705
|
+
unram_prec = (prec + poly.degree() - 1) // poly.degree()
|
|
706
|
+
ntl_poly = ntl_ZZ_pX([a.lift() for a in poly.list()], poly.base_ring().prime()**unram_prec)
|
|
707
|
+
shift_poly = ntl_ZZ_pX([a.lift() for a in shift_seed.list()],
|
|
708
|
+
shift_seed.base_ring().prime()**unram_prec)
|
|
709
|
+
# deal with prec not a multiple of e better.
|
|
710
|
+
self.prime_pow = PowComputer_ext_maker(poly.base_ring().prime(), max(min(unram_prec - 1, 30), 1), unram_prec, prec, False, ntl_poly, "FM", "e", shift_poly)
|
|
711
|
+
self._shift_seed = shift_seed
|
|
712
|
+
self._exact_modulus = exact_modulus
|
|
713
|
+
self._implementation = implementation
|
|
714
|
+
EisensteinExtensionGeneric.__init__(self, poly, prec, print_mode, names, pAdicZZpXFMElement)
|
|
715
|
+
|
|
716
|
+
def fraction_field(self):
|
|
717
|
+
"""
|
|
718
|
+
Eisenstein extensions with fixed modulus do not support fraction fields.
|
|
719
|
+
|
|
720
|
+
EXAMPLES::
|
|
721
|
+
|
|
722
|
+
sage: S.<x> = ZZ[]
|
|
723
|
+
sage: R.<a> = ZpFM(5).extension(x^2 - 5) # needs sage.libs.ntl
|
|
724
|
+
sage: R.fraction_field() # needs sage.libs.ntl
|
|
725
|
+
Traceback (most recent call last):
|
|
726
|
+
...
|
|
727
|
+
TypeError: This implementation of the p-adic ring
|
|
728
|
+
does not support fields of fractions.
|
|
729
|
+
"""
|
|
730
|
+
raise TypeError("This implementation of the p-adic ring does not support fields of fractions.")
|
|
731
|
+
|
|
732
|
+
#def coerce_map_explicit(self, S):
|
|
733
|
+
# from sage.rings.padics.morphism import Morphism_ZZ_EisFM, Morphism_ZpFM_EisFM
|
|
734
|
+
# if S is ZZ:
|
|
735
|
+
# return Morphism_ZZ_EisFM(self)
|
|
736
|
+
# elif isinstance(S, pAdicRingFixedMod) and S.prime() == self.prime():
|
|
737
|
+
# return Morphism_ZpFM_EisFM(S, self)
|
|
738
|
+
# return None
|