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,160 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
"""
|
|
3
|
+
This file provides the declaration for the RelaxedElement class,
|
|
4
|
+
which collects common functionality for the different relaxed `p`-adic
|
|
5
|
+
template classes.
|
|
6
|
+
|
|
7
|
+
It is included in padic_relaxed_element.pxd and should be included
|
|
8
|
+
in any pxd file implementing relaxed `p`-adics.
|
|
9
|
+
|
|
10
|
+
AUTHORS:
|
|
11
|
+
|
|
12
|
+
- Xavier Caruso (2021-02) -- initial version
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
#*****************************************************************************
|
|
16
|
+
# Copyright (C) 2021 Xavier Caruso <xavier.caruso@normalesup.org>
|
|
17
|
+
#
|
|
18
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
19
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
20
|
+
# the License, or (at your option) any later version.
|
|
21
|
+
#
|
|
22
|
+
# http://www.gnu.org/licenses/
|
|
23
|
+
#*****************************************************************************
|
|
24
|
+
|
|
25
|
+
from sage.rings.integer cimport Integer
|
|
26
|
+
from sage.rings.padics.pow_computer cimport PowComputer_class
|
|
27
|
+
from sage.rings.padics.padic_generic_element cimport pAdicGenericElement
|
|
28
|
+
|
|
29
|
+
cdef enum expansion_mode:
|
|
30
|
+
simple_mode, smallest_mode, teichmuller_mode
|
|
31
|
+
|
|
32
|
+
cdef class RelaxedElement(pAdicGenericElement):
|
|
33
|
+
cdef long _valuation
|
|
34
|
+
cdef long _precrel
|
|
35
|
+
cdef long _precbound
|
|
36
|
+
cdef PowComputer_class prime_pow
|
|
37
|
+
|
|
38
|
+
cdef cdigit_ptr _getdigit_relative(self, long i) noexcept
|
|
39
|
+
cdef cdigit_ptr _getdigit_absolute(self, long i) noexcept
|
|
40
|
+
cdef void _getslice_relative(self, celement slice, long start, long length) noexcept
|
|
41
|
+
|
|
42
|
+
cdef int _init_jump(self) except -1
|
|
43
|
+
cdef int _jump_c(self, long prec) noexcept
|
|
44
|
+
cdef int _jump_relative_c(self, long prec, long halt) noexcept
|
|
45
|
+
cdef int _next_c(self) noexcept
|
|
46
|
+
|
|
47
|
+
cdef long valuation_c(self, long halt=*) noexcept
|
|
48
|
+
cdef bint _is_equal(self, RelaxedElement right, long prec, bint permissive) except -1
|
|
49
|
+
|
|
50
|
+
cdef class RelaxedElement_abandon(RelaxedElement):
|
|
51
|
+
pass
|
|
52
|
+
cdef relaxedelement_abandon
|
|
53
|
+
|
|
54
|
+
cdef class RelaxedElementWithDigits(RelaxedElement):
|
|
55
|
+
cdef celement _digits
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# Assignment
|
|
59
|
+
|
|
60
|
+
cdef class RelaxedElement_zero(RelaxedElement):
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
cdef class RelaxedElement_one(RelaxedElementWithDigits):
|
|
64
|
+
pass
|
|
65
|
+
|
|
66
|
+
cdef class RelaxedElement_bound(RelaxedElement):
|
|
67
|
+
cdef RelaxedElement _x
|
|
68
|
+
|
|
69
|
+
cdef class RelaxedElement_value(RelaxedElementWithDigits):
|
|
70
|
+
cdef long _valuebound
|
|
71
|
+
cdef long _shift
|
|
72
|
+
cdef _value
|
|
73
|
+
|
|
74
|
+
cdef class RelaxedElement_random(RelaxedElementWithDigits):
|
|
75
|
+
cdef randgen _generator
|
|
76
|
+
# for pickling
|
|
77
|
+
cdef long _initialvaluation
|
|
78
|
+
cdef long _seed
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# Operations
|
|
82
|
+
|
|
83
|
+
cdef class RelaxedElement_slice(RelaxedElement):
|
|
84
|
+
cdef RelaxedElement _x
|
|
85
|
+
cdef long _start
|
|
86
|
+
cdef long _stop
|
|
87
|
+
cdef long _shift
|
|
88
|
+
|
|
89
|
+
cdef class RelaxedElement_add(RelaxedElementWithDigits):
|
|
90
|
+
cdef RelaxedElement _x
|
|
91
|
+
cdef RelaxedElement _y
|
|
92
|
+
|
|
93
|
+
cdef class RelaxedElement_sub(RelaxedElementWithDigits):
|
|
94
|
+
cdef RelaxedElement _x
|
|
95
|
+
cdef RelaxedElement _y
|
|
96
|
+
|
|
97
|
+
cdef class RelaxedElement_mul(RelaxedElementWithDigits):
|
|
98
|
+
cdef RelaxedElement _x
|
|
99
|
+
cdef cdigit _lastdigit_x
|
|
100
|
+
cdef RelaxedElement _y
|
|
101
|
+
cdef cdigit _lastdigit_y
|
|
102
|
+
cdef int _update_last_digit(self) noexcept
|
|
103
|
+
|
|
104
|
+
cdef class RelaxedElement_muldigit(RelaxedElementWithDigits):
|
|
105
|
+
cdef cdigit_ptr _x
|
|
106
|
+
cdef RelaxedElement _y
|
|
107
|
+
|
|
108
|
+
cdef class RelaxedElement_div(RelaxedElementWithDigits):
|
|
109
|
+
cdef long _maxprec
|
|
110
|
+
cdef cdigit _inverse
|
|
111
|
+
cdef RelaxedElement _num
|
|
112
|
+
cdef RelaxedElement _denom
|
|
113
|
+
cdef RelaxedElement _definition
|
|
114
|
+
cdef int _bootstrap_c(self) noexcept
|
|
115
|
+
cdef bint _bootstraping
|
|
116
|
+
|
|
117
|
+
cdef class RelaxedElement_sqrt(RelaxedElementWithDigits):
|
|
118
|
+
cdef RelaxedElement _x
|
|
119
|
+
cdef RelaxedElement _definition
|
|
120
|
+
cdef int _bootstrap_c(self) noexcept
|
|
121
|
+
|
|
122
|
+
cdef class RelaxedElement_teichmuller(RelaxedElementWithDigits):
|
|
123
|
+
cdef bint _ready
|
|
124
|
+
cdef bint _trivial
|
|
125
|
+
cdef list _xns
|
|
126
|
+
cdef RelaxedElement _xbar
|
|
127
|
+
cdef RelaxedElement _xp
|
|
128
|
+
|
|
129
|
+
# Self-referent numbers
|
|
130
|
+
|
|
131
|
+
cdef class RelaxedElement_unknown(RelaxedElementWithDigits):
|
|
132
|
+
cdef RelaxedElement _definition
|
|
133
|
+
cdef long _next
|
|
134
|
+
cpdef set(self, RelaxedElement definition)
|
|
135
|
+
# for pickling
|
|
136
|
+
cdef long _initialvaluation
|
|
137
|
+
cdef long _initialprecrel
|
|
138
|
+
|
|
139
|
+
# Expansion
|
|
140
|
+
|
|
141
|
+
cdef class RelaxedElement_zeroone(RelaxedElementWithDigits):
|
|
142
|
+
cdef void _setdigit_to_zero(self) noexcept
|
|
143
|
+
cdef void _setdigit_to_one(self) noexcept
|
|
144
|
+
|
|
145
|
+
cdef class ExpansionIter():
|
|
146
|
+
cdef RelaxedElement elt
|
|
147
|
+
cdef expansion_mode mode
|
|
148
|
+
cdef long start
|
|
149
|
+
cdef long stop
|
|
150
|
+
cdef long current
|
|
151
|
+
cdef cdigit digit
|
|
152
|
+
# simple mode
|
|
153
|
+
cdef _next_simple(self)
|
|
154
|
+
# smallest mode
|
|
155
|
+
cdef cdigit carry
|
|
156
|
+
cdef _next_smallest(self)
|
|
157
|
+
# teichmuller mode
|
|
158
|
+
cdef RelaxedElement tail
|
|
159
|
+
cdef dict coefficients
|
|
160
|
+
cdef _next_teichmuller(self)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
"""
|
|
3
|
+
TESTS::
|
|
4
|
+
|
|
5
|
+
sage: R = Zp(5, prec=5, type='fixed-mod')
|
|
6
|
+
sage: a = random_matrix(R,5) # needs sage.geometry.polyhedron
|
|
7
|
+
sage: a.determinant().parent() is R # needs sage.geometry.polyhedron
|
|
8
|
+
True
|
|
9
|
+
sage: K = Qp(3, 10,'capped-rel'); K.krull_dimension()
|
|
10
|
+
0
|
|
11
|
+
|
|
12
|
+
Computation of logs::
|
|
13
|
+
|
|
14
|
+
sage: Qp(5)(1).log()
|
|
15
|
+
O(5^20)
|
|
16
|
+
sage: Qp(5)(-1).log()
|
|
17
|
+
O(5^20)
|
|
18
|
+
sage: Qp(5,prec=5)(7).log()
|
|
19
|
+
4*5^2 + 4*5^3 + 3*5^4 + O(5^5)
|
|
20
|
+
sage: Qp(5,prec=10)(25*8).log(p_branch = 0)
|
|
21
|
+
5 + 3*5^3 + 3*5^4 + 2*5^5 + 5^6 + 2*5^7 + 3*5^8 + 3*5^9 + O(5^10)
|
|
22
|
+
sage: Zp(5,prec=10)(8).log()
|
|
23
|
+
5 + 3*5^3 + 3*5^4 + 2*5^5 + 5^6 + 2*5^7 + 3*5^8 + 3*5^9 + O(5^10)
|
|
24
|
+
|
|
25
|
+
Loading and saving elements of various types::
|
|
26
|
+
|
|
27
|
+
sage: a = Zp(5)(-3); loads(dumps(a)) == a
|
|
28
|
+
True
|
|
29
|
+
|
|
30
|
+
sage: M = MatrixSpace(pAdicField(3,100),2) # needs sage.geometry.polyhedron
|
|
31
|
+
sage: (M([1,0,0,90]) - (1+O(3^100)) * M(1)).left_kernel() # needs sage.geometry.polyhedron
|
|
32
|
+
Vector space of degree 2 and dimension 1 over 3-adic Field with capped relative precision 100
|
|
33
|
+
Basis matrix:
|
|
34
|
+
[1 + O(3^100) 0]
|
|
35
|
+
"""
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
r"""
|
|
3
|
+
Introduction to the `p`-adics
|
|
4
|
+
==========================================
|
|
5
|
+
|
|
6
|
+
This tutorial outlines what you need to know in order to use
|
|
7
|
+
`p`-adics in Sage effectively.
|
|
8
|
+
|
|
9
|
+
Our goal is to create a rich structure of different options that
|
|
10
|
+
will reflect the mathematical structures of the `p`-adics.
|
|
11
|
+
This is very much a work in progress: some of the classes that we
|
|
12
|
+
eventually intend to include have not yet been written, and some of
|
|
13
|
+
the functionality for classes in existence has not yet been
|
|
14
|
+
implemented. In addition, while we strive for perfect code, bugs
|
|
15
|
+
(both subtle and not-so-subtle) continue to evade our clutches. As
|
|
16
|
+
a user, you serve an important role. By writing non-trivial code
|
|
17
|
+
that uses the `p`-adics, you both give us insight into what
|
|
18
|
+
features are actually used and also expose problems in the code for
|
|
19
|
+
us to fix.
|
|
20
|
+
|
|
21
|
+
Our design philosophy has been to create a robust, usable interface
|
|
22
|
+
working first, with simple-minded implementations underneath. We
|
|
23
|
+
want this interface to stabilize rapidly, so that users' code does
|
|
24
|
+
not have to change. Once we get the framework in place, we can go
|
|
25
|
+
back and work on the algorithms and implementations underneath. All
|
|
26
|
+
of the current `p`-adic code is currently written in pure
|
|
27
|
+
Python, which means that it does not have the speed advantage of
|
|
28
|
+
compiled code. Thus our `p`-adics can be painfully slow at
|
|
29
|
+
times when you're doing real computations. However, finding and
|
|
30
|
+
fixing bugs in Python code is *far* easier than finding and fixing
|
|
31
|
+
errors in the compiled alternative within Sage (Cython), and Python
|
|
32
|
+
code is also faster and easier to write. We thus have significantly
|
|
33
|
+
more functionality implemented and working than we would have if we
|
|
34
|
+
had chosen to focus initially on speed. And at some point in the
|
|
35
|
+
future, we will go back and improve the speed. Any code you have
|
|
36
|
+
written on top of our `p`-adics will then get an immediate
|
|
37
|
+
performance enhancement.
|
|
38
|
+
|
|
39
|
+
If you do find bugs, have feature requests or general comments,
|
|
40
|
+
please email sage-support@groups.google.com or
|
|
41
|
+
roed@math.harvard.edu.
|
|
42
|
+
|
|
43
|
+
Terminology and types of `p`-adics
|
|
44
|
+
==========================================
|
|
45
|
+
|
|
46
|
+
To write down a general `p`-adic element completely would
|
|
47
|
+
require an infinite amount of data. Since computers do not have
|
|
48
|
+
infinite storage space, we must instead store finite approximations
|
|
49
|
+
to elements. Thus, just as in the case of floating point numbers
|
|
50
|
+
for representing reals, we have to store an element to a finite
|
|
51
|
+
precision level. The different ways of doing this account for the
|
|
52
|
+
different types of `p`-adics.
|
|
53
|
+
|
|
54
|
+
We can think of `p`-adics in two ways. First, as a
|
|
55
|
+
projective limit of finite groups:
|
|
56
|
+
|
|
57
|
+
.. MATH::
|
|
58
|
+
|
|
59
|
+
\ZZ_p = \lim_{\leftarrow n} \ZZ/p^n\ZZ.
|
|
60
|
+
|
|
61
|
+
Secondly, as Cauchy sequences of rationals (or integers, in the
|
|
62
|
+
case of `\ZZ_p`) under the `p`-adic metric.
|
|
63
|
+
Since we only need to consider these sequences up to equivalence,
|
|
64
|
+
this second way of thinking of the `p`-adics is the same as
|
|
65
|
+
considering power series in `p` with integral coefficients
|
|
66
|
+
in the range `0` to `p-1`. If we only allow
|
|
67
|
+
nonnegative powers of `p` then these power series converge
|
|
68
|
+
to elements of `\ZZ_p`, and if we allow bounded
|
|
69
|
+
negative powers of `p` then we get `\QQ_p`.
|
|
70
|
+
|
|
71
|
+
Both of these representations give a natural way of thinking about
|
|
72
|
+
finite approximations to a `p`-adic element. In the first
|
|
73
|
+
representation, we can just stop at some point in the projective
|
|
74
|
+
limit, giving an element of `\ZZ/p^n\ZZ`. As
|
|
75
|
+
`\ZZ_p / p^n\ZZ_p \cong \ZZ/p^n\ZZ`, this
|
|
76
|
+
is equivalent to specifying our element modulo
|
|
77
|
+
`p^n\ZZ_p`.
|
|
78
|
+
|
|
79
|
+
The *absolute precision* of a finite approximation
|
|
80
|
+
`\bar{x} \in \ZZ/p^n\ZZ` to `x \in \ZZ_p`
|
|
81
|
+
is the nonnegative integer `n`.
|
|
82
|
+
|
|
83
|
+
In the second representation, we can achieve the same thing by
|
|
84
|
+
truncating a series
|
|
85
|
+
|
|
86
|
+
.. MATH::
|
|
87
|
+
|
|
88
|
+
a_0 + a_1 p + a_2 p^2 + \cdots
|
|
89
|
+
|
|
90
|
+
at `p^n`, yielding
|
|
91
|
+
|
|
92
|
+
.. MATH::
|
|
93
|
+
|
|
94
|
+
a_0 + a_1 p + \cdots + a_{n-1} p^{n-1} + O(p^n).
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
As above, we call this `n` the absolute precision of our
|
|
98
|
+
element.
|
|
99
|
+
|
|
100
|
+
Given any `x \in \QQ_p` with `x \ne 0`, we
|
|
101
|
+
can write `x = p^v u` where `v \in \ZZ` and
|
|
102
|
+
`u \in \ZZ_p^{\times}`. We could thus also store an element
|
|
103
|
+
of `\QQ_p` (or `\ZZ_p`) by storing
|
|
104
|
+
`v` and a finite approximation of `u`. This
|
|
105
|
+
motivates the following definition: the *relative precision* of an
|
|
106
|
+
approximation to `x` is defined as the absolute precision
|
|
107
|
+
of the approximation minus the valuation of `x`. For
|
|
108
|
+
example, if
|
|
109
|
+
`x = a_k p^k + a_{k+1} p^{k+1} +
|
|
110
|
+
\cdots + a_{n-1} p^{n-1} + O(p^n)`
|
|
111
|
+
then the absolute precision of `x` is `n`, the
|
|
112
|
+
valuation of `x` is `k` and the relative precision
|
|
113
|
+
of `x` is `n-k`.
|
|
114
|
+
|
|
115
|
+
There are three different representations of `\ZZ_p`
|
|
116
|
+
in Sage and one representation of `\QQ_p`:
|
|
117
|
+
|
|
118
|
+
- the fixed modulus ring
|
|
119
|
+
|
|
120
|
+
- the capped absolute precision ring
|
|
121
|
+
|
|
122
|
+
- the capped relative precision ring, and
|
|
123
|
+
|
|
124
|
+
- the capped relative precision field.
|
|
125
|
+
|
|
126
|
+
Fixed Modulus Rings
|
|
127
|
+
-------------------
|
|
128
|
+
|
|
129
|
+
The first, and simplest, type of `\ZZ_p` is basically
|
|
130
|
+
a wrapper around `\ZZ/p^n\ZZ`, providing a unified
|
|
131
|
+
interface with the rest of the `p`-adics. You specify a
|
|
132
|
+
precision, and all elements are stored to that absolute precision.
|
|
133
|
+
If you perform an operation that would normally lose precision, the
|
|
134
|
+
element does not track that it no longer has full precision.
|
|
135
|
+
|
|
136
|
+
The fixed modulus ring provides the lowest level of convenience,
|
|
137
|
+
but it is also the one that has the lowest computational overhead.
|
|
138
|
+
Once we have ironed out some bugs, the fixed modulus elements will
|
|
139
|
+
be those most optimized for speed.
|
|
140
|
+
|
|
141
|
+
As with all of the implementations of `\ZZ_p`, one
|
|
142
|
+
creates a new ring using the constructor ``Zp``, and passing in
|
|
143
|
+
``'fixed-mod'`` for the ``type`` parameter. For example,
|
|
144
|
+
|
|
145
|
+
::
|
|
146
|
+
|
|
147
|
+
sage: R = Zp(5, prec = 10, type = 'fixed-mod', print_mode = 'series')
|
|
148
|
+
sage: R
|
|
149
|
+
5-adic Ring of fixed modulus 5^10
|
|
150
|
+
|
|
151
|
+
One can create elements as follows::
|
|
152
|
+
|
|
153
|
+
sage: a = R(375)
|
|
154
|
+
sage: a
|
|
155
|
+
3*5^3
|
|
156
|
+
sage: b = R(105)
|
|
157
|
+
sage: b
|
|
158
|
+
5 + 4*5^2
|
|
159
|
+
|
|
160
|
+
Now that we have some elements, we can do arithmetic in the ring.
|
|
161
|
+
|
|
162
|
+
::
|
|
163
|
+
|
|
164
|
+
sage: a + b
|
|
165
|
+
5 + 4*5^2 + 3*5^3
|
|
166
|
+
sage: a * b
|
|
167
|
+
3*5^4 + 2*5^5 + 2*5^6
|
|
168
|
+
|
|
169
|
+
Floor division (//) divides even though the result isn't really
|
|
170
|
+
known to the claimed precision; note that division isn't defined::
|
|
171
|
+
|
|
172
|
+
sage: a // 5
|
|
173
|
+
3*5^2
|
|
174
|
+
|
|
175
|
+
::
|
|
176
|
+
|
|
177
|
+
sage: a / 5
|
|
178
|
+
Traceback (most recent call last):
|
|
179
|
+
...
|
|
180
|
+
ValueError: cannot invert non-unit
|
|
181
|
+
|
|
182
|
+
Since elements don't actually store their actual precision, one can
|
|
183
|
+
only divide by units::
|
|
184
|
+
|
|
185
|
+
sage: a / 2
|
|
186
|
+
4*5^3 + 2*5^4 + 2*5^5 + 2*5^6 + 2*5^7 + 2*5^8 + 2*5^9
|
|
187
|
+
sage: a / b
|
|
188
|
+
Traceback (most recent call last):
|
|
189
|
+
...
|
|
190
|
+
ValueError: cannot invert non-unit
|
|
191
|
+
|
|
192
|
+
If you want to divide by a non-unit, do it using the ``//``
|
|
193
|
+
operator::
|
|
194
|
+
|
|
195
|
+
sage: a // b
|
|
196
|
+
3*5^2 + 3*5^3 + 2*5^5 + 5^6 + 4*5^7 + 2*5^8 + 3*5^9
|
|
197
|
+
|
|
198
|
+
Capped Absolute Rings
|
|
199
|
+
---------------------
|
|
200
|
+
|
|
201
|
+
The second type of implementation of `\ZZ_p` is
|
|
202
|
+
similar to the fixed modulus implementation, except that individual
|
|
203
|
+
elements track their known precision. The absolute precision of
|
|
204
|
+
each element is limited to be less than the precision cap of the
|
|
205
|
+
ring, even if mathematically the precision of the element would be
|
|
206
|
+
known to greater precision (see Appendix A for the reasons for the
|
|
207
|
+
existence of a precision cap).
|
|
208
|
+
|
|
209
|
+
Once again, use ``Zp`` to create a capped absolute `p`-adic
|
|
210
|
+
ring.
|
|
211
|
+
|
|
212
|
+
::
|
|
213
|
+
|
|
214
|
+
sage: R = Zp(5, prec = 10, type = 'capped-abs', print_mode = 'series')
|
|
215
|
+
sage: R
|
|
216
|
+
5-adic Ring with capped absolute precision 10
|
|
217
|
+
|
|
218
|
+
We can do similar things as in the fixed modulus case::
|
|
219
|
+
|
|
220
|
+
sage: a = R(375)
|
|
221
|
+
sage: a
|
|
222
|
+
3*5^3 + O(5^10)
|
|
223
|
+
sage: b = R(105)
|
|
224
|
+
sage: b
|
|
225
|
+
5 + 4*5^2 + O(5^10)
|
|
226
|
+
sage: a + b
|
|
227
|
+
5 + 4*5^2 + 3*5^3 + O(5^10)
|
|
228
|
+
sage: a * b
|
|
229
|
+
3*5^4 + 2*5^5 + 2*5^6 + O(5^10)
|
|
230
|
+
sage: c = a // 5
|
|
231
|
+
sage: c
|
|
232
|
+
3*5^2 + O(5^9)
|
|
233
|
+
|
|
234
|
+
Note that when we divided by 5, the precision of ``c`` dropped.
|
|
235
|
+
This lower precision is now reflected in arithmetic.
|
|
236
|
+
|
|
237
|
+
::
|
|
238
|
+
|
|
239
|
+
sage: c + b
|
|
240
|
+
5 + 2*5^2 + 5^3 + O(5^9)
|
|
241
|
+
|
|
242
|
+
Division is allowed: the element that results is a capped relative
|
|
243
|
+
field element, which is discussed in the next section::
|
|
244
|
+
|
|
245
|
+
sage: 1 / (c + b)
|
|
246
|
+
5^-1 + 3 + 2*5 + 5^2 + 4*5^3 + 4*5^4 + 3*5^6 + O(5^7)
|
|
247
|
+
|
|
248
|
+
Capped Relative Rings and Fields
|
|
249
|
+
--------------------------------
|
|
250
|
+
|
|
251
|
+
Instead of restricting the absolute precision of elements (which
|
|
252
|
+
doesn't make much sense when elements have negative valuations),
|
|
253
|
+
one can cap the relative precision of elements. This is analogous
|
|
254
|
+
to floating point representations of real numbers. As in the reals,
|
|
255
|
+
multiplication works very well: the valuations add and the relative
|
|
256
|
+
precision of the product is the minimum of the relative precisions
|
|
257
|
+
of the inputs. Addition, however, faces similar issues as floating
|
|
258
|
+
point addition: relative precision is lost when lower order terms
|
|
259
|
+
cancel.
|
|
260
|
+
|
|
261
|
+
To create a capped relative precision ring, use ``Zp`` as before.
|
|
262
|
+
To create capped relative precision fields, use ``Qp``.
|
|
263
|
+
|
|
264
|
+
::
|
|
265
|
+
|
|
266
|
+
sage: R = Zp(5, prec = 10, type = 'capped-rel', print_mode = 'series')
|
|
267
|
+
sage: R
|
|
268
|
+
5-adic Ring with capped relative precision 10
|
|
269
|
+
sage: K = Qp(5, prec = 10, type = 'capped-rel', print_mode = 'series')
|
|
270
|
+
sage: K
|
|
271
|
+
5-adic Field with capped relative precision 10
|
|
272
|
+
|
|
273
|
+
We can do all of the same operations as in the other two cases, but
|
|
274
|
+
precision works a bit differently: the maximum precision of an
|
|
275
|
+
element is limited by the precision cap of the ring.
|
|
276
|
+
|
|
277
|
+
::
|
|
278
|
+
|
|
279
|
+
sage: a = R(375)
|
|
280
|
+
sage: a
|
|
281
|
+
3*5^3 + O(5^13)
|
|
282
|
+
sage: b = K(105)
|
|
283
|
+
sage: b
|
|
284
|
+
5 + 4*5^2 + O(5^11)
|
|
285
|
+
sage: a + b
|
|
286
|
+
5 + 4*5^2 + 3*5^3 + O(5^11)
|
|
287
|
+
sage: a * b
|
|
288
|
+
3*5^4 + 2*5^5 + 2*5^6 + O(5^14)
|
|
289
|
+
sage: c = a // 5
|
|
290
|
+
sage: c
|
|
291
|
+
3*5^2 + O(5^12)
|
|
292
|
+
sage: c + 1
|
|
293
|
+
1 + 3*5^2 + O(5^10)
|
|
294
|
+
|
|
295
|
+
As with the capped absolute precision rings, we can divide,
|
|
296
|
+
yielding a capped relative precision field element.
|
|
297
|
+
|
|
298
|
+
::
|
|
299
|
+
|
|
300
|
+
sage: 1 / (c + b)
|
|
301
|
+
5^-1 + 3 + 2*5 + 5^2 + 4*5^3 + 4*5^4 + 3*5^6 + 2*5^7 + 5^8 + O(5^9)
|
|
302
|
+
|
|
303
|
+
Unramified Extensions
|
|
304
|
+
---------------------
|
|
305
|
+
|
|
306
|
+
One can create unramified extensions of `\ZZ_p` and
|
|
307
|
+
`\QQ_p` using the functions ``Zq`` and ``Qq``.
|
|
308
|
+
|
|
309
|
+
In addition to requiring a prime power as the first argument,
|
|
310
|
+
``Zq`` also requires a name for the generator of the residue field.
|
|
311
|
+
One can specify this name as follows::
|
|
312
|
+
|
|
313
|
+
sage: R.<c> = Zq(125, prec=20); R # needs sage.libs.ntl
|
|
314
|
+
5-adic Unramified Extension Ring in c defined by x^3 + 3*x + 3
|
|
315
|
+
|
|
316
|
+
Eisenstein Extensions
|
|
317
|
+
---------------------
|
|
318
|
+
|
|
319
|
+
It is also possible to create Eisenstein extensions of `\ZZ_p`
|
|
320
|
+
and `\QQ_p`. In order to do so, create the ground field first::
|
|
321
|
+
|
|
322
|
+
sage: R = Zp(5, 2)
|
|
323
|
+
|
|
324
|
+
Then define the polynomial yielding the desired extension.::
|
|
325
|
+
|
|
326
|
+
sage: S.<x> = ZZ[]
|
|
327
|
+
sage: f = x^5 - 25*x^3 + 15*x - 5
|
|
328
|
+
|
|
329
|
+
Finally, use the ``ext`` function on the ground field to create the
|
|
330
|
+
desired extension.::
|
|
331
|
+
|
|
332
|
+
sage: W.<w> = R.ext(f) # needs sage.libs.ntl sage.rings.padics
|
|
333
|
+
|
|
334
|
+
You can do arithmetic in this Eisenstein extension::
|
|
335
|
+
|
|
336
|
+
sage: (1 + w)^7 # needs sage.libs.ntl sage.rings.padics
|
|
337
|
+
1 + 2*w + w^2 + w^5 + 3*w^6 + 3*w^7 + 3*w^8 + w^9 + O(w^10)
|
|
338
|
+
|
|
339
|
+
Note that the precision cap increased by a factor of 5, since the
|
|
340
|
+
ramification index of this extension over `\ZZ_p` is 5.
|
|
341
|
+
"""
|