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,362 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
r"""
|
|
3
|
+
Valuations on polynomial rings based on `\phi`-adic expansions
|
|
4
|
+
|
|
5
|
+
This file implements a base class for discrete valuations on polynomial rings,
|
|
6
|
+
defined by a `\phi`-adic expansion.
|
|
7
|
+
|
|
8
|
+
AUTHORS:
|
|
9
|
+
|
|
10
|
+
- Julian Rüth (2013-04-15): initial version
|
|
11
|
+
|
|
12
|
+
EXAMPLES:
|
|
13
|
+
|
|
14
|
+
The :mod:`Gauss valuation <sage.rings.valuation.gauss_valuation>` is a simple example of a valuation that relies on
|
|
15
|
+
`\phi`-adic expansions::
|
|
16
|
+
|
|
17
|
+
sage: R.<x> = QQ[]
|
|
18
|
+
sage: v = GaussValuation(R, QQ.valuation(2))
|
|
19
|
+
|
|
20
|
+
In this case, `\phi = x`, so the expansion simply lists the coefficients of the
|
|
21
|
+
polynomial::
|
|
22
|
+
|
|
23
|
+
sage: f = x^2 + 2*x + 2
|
|
24
|
+
sage: list(v.coefficients(f))
|
|
25
|
+
[2, 2, 1]
|
|
26
|
+
|
|
27
|
+
Often only the first few coefficients are necessary in computations, so for
|
|
28
|
+
performance reasons, coefficients are computed lazily::
|
|
29
|
+
|
|
30
|
+
sage: v.coefficients(f)
|
|
31
|
+
<generator object ...coefficients at 0x...>
|
|
32
|
+
|
|
33
|
+
Another example of a :class:`DevelopingValuation` is an :mod:`augmented
|
|
34
|
+
valuation <sage.rings.valuation.augmented_valuation>`::
|
|
35
|
+
|
|
36
|
+
sage: w = v.augmentation(x^2 + x + 1, 3)
|
|
37
|
+
|
|
38
|
+
Here, the expansion lists the remainders of repeated division by `x^2 + x + 1`::
|
|
39
|
+
|
|
40
|
+
sage: list(w.coefficients(f))
|
|
41
|
+
[x + 1, 1]
|
|
42
|
+
"""
|
|
43
|
+
# ****************************************************************************
|
|
44
|
+
# Copyright (C) 2013-2025 Julian Rüth <julian.rueth@fsfe.org>
|
|
45
|
+
#
|
|
46
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
47
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
48
|
+
# the License, or (at your option) any later version.
|
|
49
|
+
# https://www.gnu.org/licenses/
|
|
50
|
+
# ****************************************************************************
|
|
51
|
+
|
|
52
|
+
from .valuation import DiscretePseudoValuation
|
|
53
|
+
from sage.misc.abstract_method import abstract_method
|
|
54
|
+
|
|
55
|
+
from sage.misc.cachefunc import cached_method
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class DevelopingValuation(DiscretePseudoValuation):
|
|
59
|
+
r"""
|
|
60
|
+
Abstract base class for a discrete valuation of polynomials defined over
|
|
61
|
+
the polynomial ring ``domain`` by the `\phi`-adic development.
|
|
62
|
+
|
|
63
|
+
EXAMPLES::
|
|
64
|
+
|
|
65
|
+
sage: R.<x> = QQ[]
|
|
66
|
+
sage: v = GaussValuation(R, QQ.valuation(7))
|
|
67
|
+
|
|
68
|
+
TESTS::
|
|
69
|
+
|
|
70
|
+
sage: TestSuite(v).run() # long time # needs sage.geometry.polyhedron
|
|
71
|
+
"""
|
|
72
|
+
def __init__(self, parent, phi):
|
|
73
|
+
r"""
|
|
74
|
+
TESTS::
|
|
75
|
+
|
|
76
|
+
sage: R.<x> = QQ[]
|
|
77
|
+
sage: v = GaussValuation(R, QQ.valuation(7))
|
|
78
|
+
sage: from sage.rings.valuation.developing_valuation import DevelopingValuation
|
|
79
|
+
sage: isinstance(v, DevelopingValuation)
|
|
80
|
+
True
|
|
81
|
+
"""
|
|
82
|
+
DiscretePseudoValuation.__init__(self, parent)
|
|
83
|
+
|
|
84
|
+
domain = parent.domain()
|
|
85
|
+
from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic
|
|
86
|
+
if not isinstance(domain, PolynomialRing_generic) or not domain.ngens() == 1:
|
|
87
|
+
raise TypeError("domain must be a univariate polynomial ring but %r is not" % (domain,))
|
|
88
|
+
|
|
89
|
+
phi = domain.coerce(phi)
|
|
90
|
+
if phi.is_constant() or not phi.is_monic():
|
|
91
|
+
raise ValueError("phi must be a monic non-constant polynomial but %r is not" % (phi,))
|
|
92
|
+
|
|
93
|
+
self._phi = phi
|
|
94
|
+
|
|
95
|
+
def phi(self):
|
|
96
|
+
r"""
|
|
97
|
+
Return the polynomial `\phi`, the key polynomial of this valuation.
|
|
98
|
+
|
|
99
|
+
EXAMPLES::
|
|
100
|
+
|
|
101
|
+
sage: R = Zp(2,5)
|
|
102
|
+
sage: S.<x> = R[] # needs sage.libs.ntl
|
|
103
|
+
sage: v = GaussValuation(S) # needs sage.libs.ntl
|
|
104
|
+
sage: v.phi() # needs sage.libs.ntl
|
|
105
|
+
(1 + O(2^5))*x
|
|
106
|
+
|
|
107
|
+
Use
|
|
108
|
+
:meth:`~sage.rings.valuation.inductive_valuation.InductiveValuation.augmentation_chain`
|
|
109
|
+
to obtain the sequence of key polynomials of an
|
|
110
|
+
:class:`~sage.rings.valuation.inductive_valuation.InductiveValuation`::
|
|
111
|
+
|
|
112
|
+
sage: R.<x> = QQ[]
|
|
113
|
+
sage: v = GaussValuation(R, QQ.valuation(2))
|
|
114
|
+
sage: v = v.augmentation(x, 1)
|
|
115
|
+
sage: v = v.augmentation(x^2 + 2*x + 4, 3)
|
|
116
|
+
|
|
117
|
+
sage: v
|
|
118
|
+
[ Gauss valuation induced by 2-adic valuation, v(x) = 1, v(x^2 + 2*x + 4) = 3 ]
|
|
119
|
+
|
|
120
|
+
sage: [w.phi() for w in v.augmentation_chain()[:-1]]
|
|
121
|
+
[x^2 + 2*x + 4, x]
|
|
122
|
+
|
|
123
|
+
A similar approach can be used to obtain the key polynomials and their
|
|
124
|
+
corresponding valuations::
|
|
125
|
+
|
|
126
|
+
sage: [(w.phi(), w.mu()) for w in v.augmentation_chain()[:-1]]
|
|
127
|
+
[(x^2 + 2*x + 4, 3), (x, 1)]
|
|
128
|
+
|
|
129
|
+
"""
|
|
130
|
+
return self._phi
|
|
131
|
+
|
|
132
|
+
def effective_degree(self, f, valuations=None):
|
|
133
|
+
r"""
|
|
134
|
+
Return the effective degree of ``f`` with respect to this valuation.
|
|
135
|
+
|
|
136
|
+
The effective degree of `f` is the largest `i` such that the valuation
|
|
137
|
+
of `f` and the valuation of `f_i\phi^i` in the development `f=\sum_j
|
|
138
|
+
f_j\phi^j` coincide (see [Mac1936II]_ p.497.)
|
|
139
|
+
|
|
140
|
+
INPUT:
|
|
141
|
+
|
|
142
|
+
- ``f`` -- a nonzero polynomial in the domain of this valuation
|
|
143
|
+
|
|
144
|
+
EXAMPLES::
|
|
145
|
+
|
|
146
|
+
sage: # needs sage.libs.ntl
|
|
147
|
+
sage: R = Zp(2,5)
|
|
148
|
+
sage: S.<x> = R[]
|
|
149
|
+
sage: v = GaussValuation(S)
|
|
150
|
+
sage: v.effective_degree(x)
|
|
151
|
+
1
|
|
152
|
+
sage: v.effective_degree(2*x + 1)
|
|
153
|
+
0
|
|
154
|
+
"""
|
|
155
|
+
f = self.domain().coerce(f)
|
|
156
|
+
|
|
157
|
+
if f.is_zero():
|
|
158
|
+
raise ValueError("the effective degree is only defined for nonzero polynomials")
|
|
159
|
+
|
|
160
|
+
if valuations is None:
|
|
161
|
+
valuations = list(self.valuations(f))
|
|
162
|
+
v = min(valuations)
|
|
163
|
+
return [i for i, w in enumerate(valuations) if w == v][-1]
|
|
164
|
+
|
|
165
|
+
@cached_method
|
|
166
|
+
def _pow(self, f, e, error, effective_degree):
|
|
167
|
+
r"""
|
|
168
|
+
Return `f^e`.
|
|
169
|
+
|
|
170
|
+
This method does not compute the exact value of `f^e` but only an
|
|
171
|
+
element that differs from the correct result by an error with valuation
|
|
172
|
+
at least ``error``. The output is assumed to have at most
|
|
173
|
+
``effective_degree``. If the effective degree is higher than
|
|
174
|
+
``effective_degree``, then the result may not be correct.
|
|
175
|
+
|
|
176
|
+
EXAMPLES::
|
|
177
|
+
|
|
178
|
+
sage: # needs sage.libs.ntl
|
|
179
|
+
sage: R = Zp(2,5)
|
|
180
|
+
sage: S.<x> = R[]
|
|
181
|
+
sage: v = GaussValuation(S)
|
|
182
|
+
sage: v._pow(2*x + 1, 10, effective_degree=0, error=5)
|
|
183
|
+
1 + O(2^5)
|
|
184
|
+
"""
|
|
185
|
+
if e == 0:
|
|
186
|
+
return self.domain().one()
|
|
187
|
+
if e == 1:
|
|
188
|
+
return self.simplify(f, error=error)
|
|
189
|
+
if e % 2 == 0:
|
|
190
|
+
return self._pow(self.simplify(f*f, error=error*2/e, effective_degree=effective_degree*2/e),
|
|
191
|
+
e//2, error=error, effective_degree=effective_degree)
|
|
192
|
+
else:
|
|
193
|
+
return self.simplify(f*self._pow(f, e-1, error=error*(e-1)/e, effective_degree=effective_degree*(e-1)/e),
|
|
194
|
+
error=error, effective_degree=effective_degree)
|
|
195
|
+
|
|
196
|
+
def coefficients(self, f):
|
|
197
|
+
r"""
|
|
198
|
+
Return the `\phi`-adic expansion of ``f``.
|
|
199
|
+
|
|
200
|
+
INPUT:
|
|
201
|
+
|
|
202
|
+
- ``f`` -- a monic polynomial in the domain of this valuation
|
|
203
|
+
|
|
204
|
+
OUTPUT:
|
|
205
|
+
|
|
206
|
+
An iterator `f_0, f_1, \dots, f_n` of polynomials in the domain of this
|
|
207
|
+
valuation such that `f=\sum_i f_i\phi^i`
|
|
208
|
+
|
|
209
|
+
EXAMPLES::
|
|
210
|
+
|
|
211
|
+
sage: # needs sage.libs.ntl
|
|
212
|
+
sage: R = Qp(2,5)
|
|
213
|
+
sage: S.<x> = R[]
|
|
214
|
+
sage: v = GaussValuation(S)
|
|
215
|
+
sage: f = x^2 + 2*x + 3
|
|
216
|
+
sage: list(v.coefficients(f)) # note that these constants are in the polynomial ring
|
|
217
|
+
[1 + 2 + O(2^5), 2 + O(2^6), 1 + O(2^5)]
|
|
218
|
+
sage: v = v.augmentation( x^2 + x + 1, 1)
|
|
219
|
+
sage: list(v.coefficients(f))
|
|
220
|
+
[(1 + O(2^5))*x + 2 + O(2^5), 1 + O(2^5)]
|
|
221
|
+
"""
|
|
222
|
+
domain = self.domain()
|
|
223
|
+
f = domain.coerce(f)
|
|
224
|
+
|
|
225
|
+
if f.degree() < self.phi().degree():
|
|
226
|
+
yield f
|
|
227
|
+
elif self.phi().degree() == 1:
|
|
228
|
+
if self.phi() != domain.gen() or not domain.is_exact():
|
|
229
|
+
f = f(domain.gen() - self.phi()[0])
|
|
230
|
+
for c in f.coefficients(sparse=False):
|
|
231
|
+
yield domain(c)
|
|
232
|
+
else:
|
|
233
|
+
while f.degree() >= 0:
|
|
234
|
+
f, r = self._quo_rem(f)
|
|
235
|
+
yield r
|
|
236
|
+
|
|
237
|
+
def _quo_rem(self, f):
|
|
238
|
+
r"""
|
|
239
|
+
Return the quotient and remainder of ``f`` divided by the key
|
|
240
|
+
polynomial :meth:`phi`.
|
|
241
|
+
|
|
242
|
+
EXAMPLES::
|
|
243
|
+
|
|
244
|
+
sage: S.<x> = QQ[]
|
|
245
|
+
sage: v = GaussValuation(S, QQ.valuation(2))
|
|
246
|
+
sage: v._quo_rem(x^2 + 1)
|
|
247
|
+
(x, 1)
|
|
248
|
+
"""
|
|
249
|
+
return f.quo_rem(self.phi())
|
|
250
|
+
|
|
251
|
+
def newton_polygon(self, f, valuations=None):
|
|
252
|
+
r"""
|
|
253
|
+
Return the Newton polygon of the `\phi`-adic development of ``f``.
|
|
254
|
+
|
|
255
|
+
INPUT:
|
|
256
|
+
|
|
257
|
+
- ``f`` -- a polynomial in the domain of this valuation
|
|
258
|
+
|
|
259
|
+
EXAMPLES::
|
|
260
|
+
|
|
261
|
+
sage: # needs sage.libs.ntl
|
|
262
|
+
sage: R = Qp(2,5)
|
|
263
|
+
sage: S.<x> = R[]
|
|
264
|
+
sage: v = GaussValuation(S)
|
|
265
|
+
sage: f = x^2 + 2*x + 3
|
|
266
|
+
sage: v.newton_polygon(f) # needs sage.geometry.polyhedron
|
|
267
|
+
Finite Newton polygon with 2 vertices: (0, 0), (2, 0)
|
|
268
|
+
sage: v = v.augmentation( x^2 + x + 1, 1)
|
|
269
|
+
sage: v.newton_polygon(f) # needs sage.geometry.polyhedron
|
|
270
|
+
Finite Newton polygon with 2 vertices: (0, 0), (1, 1)
|
|
271
|
+
sage: v.newton_polygon( f * v.phi()^3 ) # needs sage.geometry.polyhedron
|
|
272
|
+
Finite Newton polygon with 2 vertices: (3, 3), (4, 4)
|
|
273
|
+
"""
|
|
274
|
+
f = self.domain().coerce(f)
|
|
275
|
+
|
|
276
|
+
from sage.geometry.newton_polygon import NewtonPolygon
|
|
277
|
+
if valuations is None:
|
|
278
|
+
valuations = self.valuations(f)
|
|
279
|
+
return NewtonPolygon(list(enumerate(valuations)))
|
|
280
|
+
|
|
281
|
+
def _call_(self, f):
|
|
282
|
+
r"""
|
|
283
|
+
Evaluate this valuation at ``f``.
|
|
284
|
+
|
|
285
|
+
INPUT:
|
|
286
|
+
|
|
287
|
+
- ``f`` -- a polynomial in the domain of this valuation
|
|
288
|
+
|
|
289
|
+
EXAMPLES::
|
|
290
|
+
|
|
291
|
+
sage: # needs sage.libs.ntl
|
|
292
|
+
sage: R = Qp(2,5)
|
|
293
|
+
sage: S.<x> = R[]
|
|
294
|
+
sage: v = GaussValuation(S)
|
|
295
|
+
sage: f = x^2 + 2*x + 3
|
|
296
|
+
sage: v(f)
|
|
297
|
+
0
|
|
298
|
+
|
|
299
|
+
sage: # needs sage.libs.ntl
|
|
300
|
+
sage: v = v.augmentation( x^2 + x + 1, 1)
|
|
301
|
+
sage: v(f)
|
|
302
|
+
0
|
|
303
|
+
sage: v(f * v.phi()^3 )
|
|
304
|
+
3
|
|
305
|
+
sage: v(S.zero())
|
|
306
|
+
+Infinity
|
|
307
|
+
"""
|
|
308
|
+
f = self.domain().coerce(f)
|
|
309
|
+
|
|
310
|
+
from sage.rings.infinity import infinity
|
|
311
|
+
if f.is_zero():
|
|
312
|
+
return infinity
|
|
313
|
+
|
|
314
|
+
ret = infinity
|
|
315
|
+
for v in self.valuations(f, call_error=True):
|
|
316
|
+
if ret is infinity or (v is not infinity and v < ret):
|
|
317
|
+
# "ret is infinity" is redundant but much faster than < when ret is infinite
|
|
318
|
+
ret = v
|
|
319
|
+
return ret
|
|
320
|
+
|
|
321
|
+
@abstract_method
|
|
322
|
+
def valuations(self, f):
|
|
323
|
+
r"""
|
|
324
|
+
Return the valuations of the `f_i\phi^i` in the expansion `f=\sum f_i\phi^i`.
|
|
325
|
+
|
|
326
|
+
INPUT:
|
|
327
|
+
|
|
328
|
+
- ``f`` -- a polynomial in the domain of this valuation
|
|
329
|
+
|
|
330
|
+
OUTPUT:
|
|
331
|
+
|
|
332
|
+
A list, each entry a rational numbers or infinity, the valuations of
|
|
333
|
+
`f_0, f_1\phi, \dots`
|
|
334
|
+
|
|
335
|
+
EXAMPLES::
|
|
336
|
+
|
|
337
|
+
sage: # needs sage.libs.ntl
|
|
338
|
+
sage: R = Qp(2,5)
|
|
339
|
+
sage: S.<x> = R[]
|
|
340
|
+
sage: v = GaussValuation(S, R.valuation())
|
|
341
|
+
sage: f = x^2 + 2*x + 16
|
|
342
|
+
sage: list(v.valuations(f))
|
|
343
|
+
[4, 1, 0]
|
|
344
|
+
"""
|
|
345
|
+
|
|
346
|
+
def _test_effective_degree(self, **options):
|
|
347
|
+
r"""
|
|
348
|
+
Test the correctness of :meth:`effective_degree`.
|
|
349
|
+
|
|
350
|
+
EXAMPLES::
|
|
351
|
+
|
|
352
|
+
sage: R = Zp(2,5)
|
|
353
|
+
sage: S.<x> = R[] # needs sage.libs.ntl
|
|
354
|
+
sage: v = GaussValuation(S) # needs sage.libs.ntl
|
|
355
|
+
sage: v._test_effective_degree() # needs sage.libs.ntl
|
|
356
|
+
"""
|
|
357
|
+
tester = self._tester(**options)
|
|
358
|
+
S = tester.some_elements(self.domain().base_ring().some_elements())
|
|
359
|
+
for x in S:
|
|
360
|
+
if x == 0:
|
|
361
|
+
continue
|
|
362
|
+
tester.assertEqual(self.effective_degree(x), 0)
|