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,15 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
from sage.libs.gmp.types cimport mpz_t
|
|
3
|
+
from cypari2.gen cimport Gen as pari_gen
|
|
4
|
+
from sage.rings.padics.padic_floating_point_element cimport FPElement
|
|
5
|
+
|
|
6
|
+
ctypedef mpz_t celement
|
|
7
|
+
include "FM_template_header.pxi"
|
|
8
|
+
|
|
9
|
+
cdef class pAdicFixedModElement(FMElement):
|
|
10
|
+
cdef lift_c(self)
|
|
11
|
+
cdef pari_gen _to_gen(self)
|
|
12
|
+
|
|
13
|
+
from sage.rings.padics.pow_computer cimport PowComputer_base
|
|
14
|
+
cdef class PowComputer_(PowComputer_base):
|
|
15
|
+
pass
|
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
# sage.doctest: needs sage.rings.padics
|
|
3
|
+
"""
|
|
4
|
+
`p`-adic Fixed-Mod Element
|
|
5
|
+
|
|
6
|
+
Elements of `p`-adic Rings with Fixed Modulus
|
|
7
|
+
|
|
8
|
+
AUTHORS:
|
|
9
|
+
|
|
10
|
+
- David Roe
|
|
11
|
+
- Genya Zaytman: documentation
|
|
12
|
+
- David Harvey: doctests
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
#*****************************************************************************
|
|
16
|
+
# Copyright (C) 2007-2013 David Roe <roed.math@gmail.com>
|
|
17
|
+
# William Stein <wstein@gmail.com>
|
|
18
|
+
#
|
|
19
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
20
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
21
|
+
# the License, or (at your option) any later version.
|
|
22
|
+
#
|
|
23
|
+
# http://www.gnu.org/licenses/
|
|
24
|
+
#*****************************************************************************
|
|
25
|
+
|
|
26
|
+
include "sage/libs/linkages/padics/mpz.pxi"
|
|
27
|
+
include "FM_template.pxi"
|
|
28
|
+
|
|
29
|
+
from sage.libs.pari.convert_gmp cimport new_gen_from_padic
|
|
30
|
+
from sage.rings.finite_rings.integer_mod import Mod
|
|
31
|
+
|
|
32
|
+
cdef extern from "transcendantal.c":
|
|
33
|
+
cdef void padiclog(mpz_t ans, const mpz_t a, unsigned long p, unsigned long prec, const mpz_t modulo)
|
|
34
|
+
cdef void padicexp(mpz_t ans, const mpz_t a, unsigned long p, unsigned long prec, const mpz_t modulo)
|
|
35
|
+
cdef void padicexp_Newton(mpz_t ans, const mpz_t a, unsigned long p, unsigned long prec, unsigned long precinit, const mpz_t modulo)
|
|
36
|
+
|
|
37
|
+
cdef class PowComputer_(PowComputer_base):
|
|
38
|
+
"""
|
|
39
|
+
A PowComputer for a fixed-modulus `p`-adic ring.
|
|
40
|
+
"""
|
|
41
|
+
def __init__(self, Integer prime, long cache_limit, long prec_cap, long ram_prec_cap, bint in_field):
|
|
42
|
+
"""
|
|
43
|
+
Initialization.
|
|
44
|
+
|
|
45
|
+
EXAMPLES::
|
|
46
|
+
|
|
47
|
+
sage: R = ZpFM(5)
|
|
48
|
+
sage: type(R.prime_pow)
|
|
49
|
+
<class 'sage.rings.padics.padic_fixed_mod_element.PowComputer_'>
|
|
50
|
+
sage: R.prime_pow._prec_type
|
|
51
|
+
'fixed-mod'
|
|
52
|
+
"""
|
|
53
|
+
self._prec_type = 'fixed-mod'
|
|
54
|
+
PowComputer_base.__init__(self, prime, cache_limit, prec_cap, ram_prec_cap, in_field)
|
|
55
|
+
|
|
56
|
+
cdef class pAdicFixedModElement(FMElement):
|
|
57
|
+
r"""
|
|
58
|
+
INPUT:
|
|
59
|
+
|
|
60
|
+
- ``parent`` -- a ``pAdicRingFixedMod`` object
|
|
61
|
+
|
|
62
|
+
- ``x`` -- input data to be converted into the parent
|
|
63
|
+
|
|
64
|
+
- ``absprec`` -- ignored; for compatibility with other `p`-adic rings
|
|
65
|
+
|
|
66
|
+
- ``relprec`` -- ignored; for compatibility with other `p`-adic rings
|
|
67
|
+
|
|
68
|
+
.. NOTE::
|
|
69
|
+
|
|
70
|
+
The following types are currently supported for x:
|
|
71
|
+
|
|
72
|
+
- Integers
|
|
73
|
+
- Rationals -- denominator must be relatively prime to `p`
|
|
74
|
+
- FixedMod `p`-adics
|
|
75
|
+
- Elements of ``IntegerModRing(p^k)`` for ``k`` less than or equal
|
|
76
|
+
to the modulus
|
|
77
|
+
|
|
78
|
+
The following types should be supported eventually:
|
|
79
|
+
|
|
80
|
+
- Finite precision `p`-adics
|
|
81
|
+
- Lazy `p`-adics
|
|
82
|
+
- Elements of local extensions of THIS `p`-adic ring that actually
|
|
83
|
+
lie in `\ZZ_p`
|
|
84
|
+
|
|
85
|
+
EXAMPLES::
|
|
86
|
+
|
|
87
|
+
sage: R = Zp(5, 20, 'fixed-mod', 'terse')
|
|
88
|
+
|
|
89
|
+
Construct from integers::
|
|
90
|
+
|
|
91
|
+
sage: R(3)
|
|
92
|
+
3
|
|
93
|
+
sage: R(75)
|
|
94
|
+
75
|
|
95
|
+
sage: R(0)
|
|
96
|
+
0
|
|
97
|
+
|
|
98
|
+
sage: R(-1)
|
|
99
|
+
95367431640624
|
|
100
|
+
sage: R(-5)
|
|
101
|
+
95367431640620
|
|
102
|
+
|
|
103
|
+
Construct from rationals::
|
|
104
|
+
|
|
105
|
+
sage: R(1/2)
|
|
106
|
+
47683715820313
|
|
107
|
+
sage: R(-7875/874)
|
|
108
|
+
9493096742250
|
|
109
|
+
sage: R(15/425)
|
|
110
|
+
Traceback (most recent call last):
|
|
111
|
+
...
|
|
112
|
+
ValueError: p divides denominator
|
|
113
|
+
|
|
114
|
+
Construct from IntegerMod::
|
|
115
|
+
|
|
116
|
+
sage: R(Integers(125)(3))
|
|
117
|
+
3
|
|
118
|
+
sage: R(Integers(5)(3))
|
|
119
|
+
3
|
|
120
|
+
sage: R(Integers(5^30)(3))
|
|
121
|
+
3
|
|
122
|
+
sage: R(Integers(5^30)(1+5^23))
|
|
123
|
+
1
|
|
124
|
+
sage: R(Integers(49)(3))
|
|
125
|
+
Traceback (most recent call last):
|
|
126
|
+
...
|
|
127
|
+
TypeError: p does not divide modulus 49
|
|
128
|
+
|
|
129
|
+
sage: R(Integers(48)(3))
|
|
130
|
+
Traceback (most recent call last):
|
|
131
|
+
...
|
|
132
|
+
TypeError: p does not divide modulus 48
|
|
133
|
+
|
|
134
|
+
Some other conversions::
|
|
135
|
+
|
|
136
|
+
sage: R(R(5))
|
|
137
|
+
5
|
|
138
|
+
|
|
139
|
+
.. TODO:: doctests for converting from other types of `p`-adic rings
|
|
140
|
+
"""
|
|
141
|
+
def lift(self):
|
|
142
|
+
r"""
|
|
143
|
+
Return an integer congruent to ``self`` modulo the precision.
|
|
144
|
+
|
|
145
|
+
.. WARNING::
|
|
146
|
+
|
|
147
|
+
Since fixed modulus elements don't track their precision,
|
|
148
|
+
the result may not be correct modulo
|
|
149
|
+
`i^{\mathrm{prec_cap}}` if the element was defined by
|
|
150
|
+
constructions that lost precision.
|
|
151
|
+
|
|
152
|
+
EXAMPLES::
|
|
153
|
+
|
|
154
|
+
sage: R = Zp(7,4,'fixed-mod'); a = R(8); a.lift()
|
|
155
|
+
8
|
|
156
|
+
sage: type(a.lift())
|
|
157
|
+
<class 'sage.rings.integer.Integer'>
|
|
158
|
+
"""
|
|
159
|
+
return self.lift_c()
|
|
160
|
+
|
|
161
|
+
cdef lift_c(self):
|
|
162
|
+
r"""
|
|
163
|
+
Return an integer congruent to this element modulo the precision.
|
|
164
|
+
|
|
165
|
+
.. WARNING::
|
|
166
|
+
|
|
167
|
+
Since fixed modulus elements don't track their precision,
|
|
168
|
+
the result may not be correct modulo
|
|
169
|
+
`i^{\mbox{prec_cap}}` if the element was defined by
|
|
170
|
+
constructions that lost precision.
|
|
171
|
+
|
|
172
|
+
EXAMPLES::
|
|
173
|
+
|
|
174
|
+
sage: R = ZpFM(7,4); a = R(8); a.lift() # indirect doctest
|
|
175
|
+
8
|
|
176
|
+
"""
|
|
177
|
+
cdef Integer ans = PY_NEW(Integer)
|
|
178
|
+
mpz_set(ans.value, self.value)
|
|
179
|
+
return ans
|
|
180
|
+
|
|
181
|
+
def __pari__(self):
|
|
182
|
+
"""
|
|
183
|
+
Conversion to PARI.
|
|
184
|
+
|
|
185
|
+
EXAMPLES::
|
|
186
|
+
|
|
187
|
+
sage: R = ZpCA(5)
|
|
188
|
+
sage: pari(R(1777)) # indirect doctest # needs sage.libs.pari
|
|
189
|
+
2 + 5^2 + 4*5^3 + 2*5^4 + O(5^20)
|
|
190
|
+
"""
|
|
191
|
+
return self._to_gen()
|
|
192
|
+
|
|
193
|
+
cdef pari_gen _to_gen(self):
|
|
194
|
+
"""
|
|
195
|
+
Convert ``self`` to an equivalent pari element.
|
|
196
|
+
|
|
197
|
+
EXAMPLES::
|
|
198
|
+
|
|
199
|
+
sage: R = ZpFM(5, 10); a = R(17); pari(a) # indirect doctest
|
|
200
|
+
2 + 3*5 + O(5^10)
|
|
201
|
+
sage: pari(R(0)) # needs sage.libs.pari
|
|
202
|
+
O(5^10)
|
|
203
|
+
sage: pari(R(0,5)) # needs sage.libs.pari
|
|
204
|
+
O(5^10)
|
|
205
|
+
sage: pari(R(0)).debug() # needs sage.libs.pari
|
|
206
|
+
[&=...] PADIC(lg=5):... (precp=0,valp=10):... ... ... ...
|
|
207
|
+
p : [&=...] INT(lg=3):... (+,lgefint=3):... ...
|
|
208
|
+
p^l : [&=...] INT(lg=3):... (+,lgefint=3):... ...
|
|
209
|
+
I : gen_0
|
|
210
|
+
|
|
211
|
+
This checks that :issue:`15653` is fixed::
|
|
212
|
+
|
|
213
|
+
sage: x = polygen(ZpFM(3,10))
|
|
214
|
+
sage: (x^3 + x + 1).__pari__().poldisc()
|
|
215
|
+
2 + 3 + 2*3^2 + 3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + O(3^10)
|
|
216
|
+
"""
|
|
217
|
+
cdef long val
|
|
218
|
+
# Let val be the valuation of self, holder (defined in the
|
|
219
|
+
# linkage file) be the unit part.
|
|
220
|
+
if mpz_sgn(self.value) == 0:
|
|
221
|
+
# Special case for zero: maximal valuation and 0 unit part
|
|
222
|
+
val = self.prime_pow.prec_cap
|
|
223
|
+
mpz_set_ui(holder.value, 0)
|
|
224
|
+
else:
|
|
225
|
+
val = mpz_remove(holder.value, self.value, self.prime_pow.prime.value)
|
|
226
|
+
return new_gen_from_padic(val, self.prime_pow.prec_cap - val,
|
|
227
|
+
self.prime_pow.prime.value,
|
|
228
|
+
self.prime_pow.pow_mpz_t_tmp(self.prime_pow.prec_cap - val),
|
|
229
|
+
holder.value)
|
|
230
|
+
|
|
231
|
+
def _integer_(self, Z=None):
|
|
232
|
+
r"""
|
|
233
|
+
Return an integer congruent to ``self`` modulo the precision.
|
|
234
|
+
|
|
235
|
+
.. WARNING::
|
|
236
|
+
|
|
237
|
+
Since fixed modulus elements don't track their precision,
|
|
238
|
+
the result may not be correct modulo
|
|
239
|
+
`p^{\mathrm{prec_cap}}` if the element was defined by
|
|
240
|
+
constructions that lost precision.
|
|
241
|
+
|
|
242
|
+
EXAMPLES::
|
|
243
|
+
|
|
244
|
+
sage: R = ZpFM(5); R(-1)._integer_()
|
|
245
|
+
95367431640624
|
|
246
|
+
"""
|
|
247
|
+
return self.lift_c()
|
|
248
|
+
|
|
249
|
+
def residue(self, absprec=1, field=None, check_prec=False):
|
|
250
|
+
r"""
|
|
251
|
+
Reduce ``self`` modulo `p^\mathrm{absprec}`.
|
|
252
|
+
|
|
253
|
+
INPUT:
|
|
254
|
+
|
|
255
|
+
- ``absprec`` -- integer (default: 1)
|
|
256
|
+
|
|
257
|
+
- ``field`` -- boolean (default: ``None``); whether to return an
|
|
258
|
+
element of GF(p) or Zmod(p)
|
|
259
|
+
|
|
260
|
+
- ``check_prec`` -- boolean (default: ``False``); no effect (for
|
|
261
|
+
compatibility with other types)
|
|
262
|
+
|
|
263
|
+
OUTPUT:
|
|
264
|
+
|
|
265
|
+
This element reduced modulo `p^\mathrm{absprec}` as an element of
|
|
266
|
+
`\ZZ/p^\mathrm{absprec}\ZZ`.
|
|
267
|
+
|
|
268
|
+
EXAMPLES::
|
|
269
|
+
|
|
270
|
+
sage: R = Zp(7,4,'fixed-mod')
|
|
271
|
+
sage: a = R(8)
|
|
272
|
+
sage: a.residue(1)
|
|
273
|
+
1
|
|
274
|
+
|
|
275
|
+
This is different from applying ``% p^n`` which returns an element in
|
|
276
|
+
the same ring::
|
|
277
|
+
|
|
278
|
+
sage: b = a.residue(2); b
|
|
279
|
+
8
|
|
280
|
+
sage: b.parent()
|
|
281
|
+
Ring of integers modulo 49
|
|
282
|
+
sage: c = a % 7^2; c
|
|
283
|
+
1 + 7
|
|
284
|
+
sage: c.parent()
|
|
285
|
+
7-adic Ring of fixed modulus 7^4
|
|
286
|
+
|
|
287
|
+
TESTS::
|
|
288
|
+
|
|
289
|
+
sage: R = Zp(7,4,'fixed-mod')
|
|
290
|
+
sage: a = R(8)
|
|
291
|
+
sage: a.residue(0)
|
|
292
|
+
0
|
|
293
|
+
sage: a.residue(-1)
|
|
294
|
+
Traceback (most recent call last):
|
|
295
|
+
...
|
|
296
|
+
ValueError: cannot reduce modulo a negative power of p
|
|
297
|
+
sage: a.residue(5)
|
|
298
|
+
8
|
|
299
|
+
|
|
300
|
+
sage: a.residue(field=True).parent()
|
|
301
|
+
Finite Field of size 7
|
|
302
|
+
|
|
303
|
+
.. SEEALSO::
|
|
304
|
+
|
|
305
|
+
:meth:`_mod_`
|
|
306
|
+
"""
|
|
307
|
+
cdef Integer selfvalue, modulus
|
|
308
|
+
cdef long aprec
|
|
309
|
+
if not isinstance(absprec, Integer):
|
|
310
|
+
absprec = Integer(absprec)
|
|
311
|
+
if absprec < 0:
|
|
312
|
+
raise ValueError("cannot reduce modulo a negative power of p")
|
|
313
|
+
if field is None:
|
|
314
|
+
field = (absprec == 1)
|
|
315
|
+
elif field and absprec != 1:
|
|
316
|
+
raise ValueError("field keyword may only be set at precision 1")
|
|
317
|
+
if mpz_fits_slong_p((<Integer>absprec).value) == 0:
|
|
318
|
+
raise ValueError("absolute precision does not fit in a long")
|
|
319
|
+
aprec = mpz_get_si((<Integer>absprec).value)
|
|
320
|
+
modulus = PY_NEW(Integer)
|
|
321
|
+
mpz_set(modulus.value, self.prime_pow.pow_mpz_t_tmp(aprec))
|
|
322
|
+
selfvalue = PY_NEW(Integer)
|
|
323
|
+
mpz_set(selfvalue.value, self.value)
|
|
324
|
+
if field:
|
|
325
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
326
|
+
return GF(self.parent().prime())(selfvalue)
|
|
327
|
+
else:
|
|
328
|
+
return Mod(selfvalue, modulus)
|
|
329
|
+
|
|
330
|
+
def multiplicative_order(self):
|
|
331
|
+
r"""
|
|
332
|
+
Return the minimum possible multiplicative order of ``self``.
|
|
333
|
+
|
|
334
|
+
OUTPUT:
|
|
335
|
+
|
|
336
|
+
an integer -- the multiplicative order of this element. This is the
|
|
337
|
+
minimum multiplicative order of all elements of `\ZZ_p` lifting this
|
|
338
|
+
element to infinite precision.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: R = ZpFM(7, 6)
|
|
343
|
+
sage: R(1/3)
|
|
344
|
+
5 + 4*7 + 4*7^2 + 4*7^3 + 4*7^4 + 4*7^5
|
|
345
|
+
sage: R(1/3).multiplicative_order()
|
|
346
|
+
+Infinity
|
|
347
|
+
sage: R(7).multiplicative_order()
|
|
348
|
+
+Infinity
|
|
349
|
+
sage: R(1).multiplicative_order()
|
|
350
|
+
1
|
|
351
|
+
sage: R(-1).multiplicative_order()
|
|
352
|
+
2
|
|
353
|
+
sage: R.teichmuller(3).multiplicative_order()
|
|
354
|
+
6
|
|
355
|
+
"""
|
|
356
|
+
cdef mpz_t tmp
|
|
357
|
+
cdef Integer ans
|
|
358
|
+
if mpz_divisible_p(self.value, self.prime_pow.prime.value):
|
|
359
|
+
return infinity
|
|
360
|
+
if mpz_cmp_ui(self.value, 1) == 0:
|
|
361
|
+
ans = PY_NEW(Integer)
|
|
362
|
+
mpz_set_ui(ans.value, 1)
|
|
363
|
+
return ans
|
|
364
|
+
mpz_init(tmp)
|
|
365
|
+
mpz_sub_ui(tmp, self.prime_pow.pow_mpz_t_top(), 1)
|
|
366
|
+
if mpz_cmp(self.value, tmp) == 0:
|
|
367
|
+
ans = PY_NEW(Integer)
|
|
368
|
+
mpz_set_ui(ans.value, 2)
|
|
369
|
+
return ans
|
|
370
|
+
# check if self is an approximation to a teichmuller lift:
|
|
371
|
+
mpz_powm(tmp, self.value, self.prime_pow.prime.value, self.prime_pow.pow_mpz_t_top())
|
|
372
|
+
if mpz_cmp(tmp, self.value) == 0:
|
|
373
|
+
mpz_clear(tmp)
|
|
374
|
+
return self.residue(1).multiplicative_order()
|
|
375
|
+
else:
|
|
376
|
+
mpz_clear(tmp)
|
|
377
|
+
return infinity
|
|
378
|
+
|
|
379
|
+
def _log_binary_splitting(self, aprec, mina=0):
|
|
380
|
+
r"""
|
|
381
|
+
Return ``\log(self)`` for ``self`` equal to 1 in the residue field.
|
|
382
|
+
|
|
383
|
+
This is a helper method for :meth:`log`.
|
|
384
|
+
It uses a fast binary splitting algorithm.
|
|
385
|
+
|
|
386
|
+
INPUT:
|
|
387
|
+
|
|
388
|
+
- ``aprec`` -- integer; the precision to which the result is
|
|
389
|
+
correct. ``aprec`` must not exceed the precision cap of the ring over
|
|
390
|
+
which this element is defined.
|
|
391
|
+
- ``mina`` -- integer (default: 0); the series will check `n` up to
|
|
392
|
+
this valuation (and beyond) to see if they can contribute to the
|
|
393
|
+
series
|
|
394
|
+
|
|
395
|
+
.. NOTE::
|
|
396
|
+
|
|
397
|
+
The function does not check that its argument ``self`` is
|
|
398
|
+
1 in the residue field. If this assumption is not fulfilled
|
|
399
|
+
the behaviour of the function is not specified.
|
|
400
|
+
|
|
401
|
+
ALGORITHM:
|
|
402
|
+
|
|
403
|
+
1. Raise `u` to the power `p^v` for a suitable `v` in order
|
|
404
|
+
to make it closer to 1. (`v` is chosen such that `p^v` is
|
|
405
|
+
close to the precision.)
|
|
406
|
+
|
|
407
|
+
2. Write
|
|
408
|
+
|
|
409
|
+
.. MATH::
|
|
410
|
+
|
|
411
|
+
u^{p-1} = \prod_{i=1}^\infty (1 - a_i p^{(v+1)*2^i})
|
|
412
|
+
|
|
413
|
+
with `0 \leq a_i < p^{(v+1)*2^i}` and compute
|
|
414
|
+
`\log(1 - a_i p^{(v+1)*2^i})` using the standard Taylor expansion
|
|
415
|
+
|
|
416
|
+
.. MATH::
|
|
417
|
+
|
|
418
|
+
\log(1 - x) = -x - 1/2 x^2 - 1/3 x^3 - 1/4 x^4 - 1/5 x^5 - \cdots
|
|
419
|
+
|
|
420
|
+
together with a binary splitting method.
|
|
421
|
+
|
|
422
|
+
3. Divide the result by `p^v`
|
|
423
|
+
|
|
424
|
+
The complexity of this algorithm is quasi-linear.
|
|
425
|
+
|
|
426
|
+
EXAMPLES::
|
|
427
|
+
|
|
428
|
+
sage: r = Qp(5,prec=4)(6)
|
|
429
|
+
sage: r._log_binary_splitting(2)
|
|
430
|
+
5 + O(5^2)
|
|
431
|
+
sage: r._log_binary_splitting(4)
|
|
432
|
+
5 + 2*5^2 + 4*5^3 + O(5^4)
|
|
433
|
+
sage: r._log_binary_splitting(100)
|
|
434
|
+
5 + 2*5^2 + 4*5^3 + O(5^4)
|
|
435
|
+
|
|
436
|
+
sage: r = Zp(5,prec=4,type='fixed-mod')(6)
|
|
437
|
+
sage: r._log_binary_splitting(5)
|
|
438
|
+
5 + 2*5^2 + 4*5^3
|
|
439
|
+
"""
|
|
440
|
+
cdef unsigned long p
|
|
441
|
+
cdef unsigned long prec = min(aprec, self.prime_pow.prec_cap)
|
|
442
|
+
cdef pAdicFixedModElement ans
|
|
443
|
+
|
|
444
|
+
if mpz_fits_slong_p(self.prime_pow.prime.value) == 0:
|
|
445
|
+
raise NotImplementedError("the prime %s does not fit in a long" % self.prime_pow.prime)
|
|
446
|
+
p = self.prime_pow.prime
|
|
447
|
+
|
|
448
|
+
ans = self._new_c()
|
|
449
|
+
sig_on()
|
|
450
|
+
padiclog(ans.value, self.value, p, prec, self.prime_pow.pow_mpz_t_tmp(prec))
|
|
451
|
+
sig_off()
|
|
452
|
+
return ans
|
|
453
|
+
|
|
454
|
+
def _exp_binary_splitting(self, aprec):
|
|
455
|
+
r"""
|
|
456
|
+
Compute the exponential power series of this element.
|
|
457
|
+
|
|
458
|
+
This is a helper method for :meth:`exp`.
|
|
459
|
+
|
|
460
|
+
INPUT:
|
|
461
|
+
|
|
462
|
+
- ``aprec`` -- integer; the precision to which to compute the
|
|
463
|
+
exponential
|
|
464
|
+
|
|
465
|
+
.. NOTE::
|
|
466
|
+
|
|
467
|
+
The function does not check that its argument ``self`` is
|
|
468
|
+
the disk of convergence of ``exp``. If this assumption is not
|
|
469
|
+
fulfilled the behaviour of the function is not specified.
|
|
470
|
+
|
|
471
|
+
ALGORITHM:
|
|
472
|
+
|
|
473
|
+
Write
|
|
474
|
+
|
|
475
|
+
.. MATH::
|
|
476
|
+
|
|
477
|
+
self = \sum_{i=1}^\infty a_i p^{2^i}
|
|
478
|
+
|
|
479
|
+
with `0 \leq a_i < p^{2^i}` and compute
|
|
480
|
+
`\exp(a_i p^{2^i})` using the standard Taylor expansion
|
|
481
|
+
|
|
482
|
+
.. MATH::
|
|
483
|
+
|
|
484
|
+
\exp(x) = 1 + x + x^2/2 + x^3/6 + x^4/24 + \cdots
|
|
485
|
+
|
|
486
|
+
together with a binary splitting method.
|
|
487
|
+
|
|
488
|
+
The binary complexity of this algorithm is quasi-linear.
|
|
489
|
+
|
|
490
|
+
EXAMPLES::
|
|
491
|
+
|
|
492
|
+
sage: R = Zp(7,5)
|
|
493
|
+
sage: x = R(7)
|
|
494
|
+
sage: x.exp(algorithm='binary_splitting') # indirect doctest
|
|
495
|
+
1 + 7 + 4*7^2 + 2*7^3 + O(7^5)
|
|
496
|
+
"""
|
|
497
|
+
cdef unsigned long p
|
|
498
|
+
cdef unsigned long prec = aprec
|
|
499
|
+
cdef pAdicFixedModElement ans
|
|
500
|
+
|
|
501
|
+
if mpz_fits_slong_p(self.prime_pow.prime.value) == 0:
|
|
502
|
+
raise NotImplementedError("the prime %s does not fit in a long" % self.prime_pow.prime)
|
|
503
|
+
p = self.prime_pow.prime
|
|
504
|
+
|
|
505
|
+
ans = self._new_c()
|
|
506
|
+
sig_on()
|
|
507
|
+
padicexp(ans.value, self.value, p, prec, self.prime_pow.pow_mpz_t_tmp(prec))
|
|
508
|
+
sig_off()
|
|
509
|
+
|
|
510
|
+
return ans
|
|
511
|
+
|
|
512
|
+
def _exp_newton(self, aprec, log_algorithm=None):
|
|
513
|
+
r"""
|
|
514
|
+
Compute the exponential power series of this element.
|
|
515
|
+
|
|
516
|
+
This is a helper method for :meth:`exp`.
|
|
517
|
+
|
|
518
|
+
INPUT:
|
|
519
|
+
|
|
520
|
+
- ``aprec`` -- integer; the precision to which to compute the
|
|
521
|
+
exponential
|
|
522
|
+
|
|
523
|
+
- ``log_algorithm`` -- (default: ``None``) the algorithm used for
|
|
524
|
+
computing the logarithm. This attribute is passed to the log
|
|
525
|
+
method. See :meth:`log` for more details about the possible
|
|
526
|
+
algorithms.
|
|
527
|
+
|
|
528
|
+
.. NOTE::
|
|
529
|
+
|
|
530
|
+
The function does not check that its argument ``self`` is
|
|
531
|
+
the disk of convergence of ``exp``. If this assumption is not
|
|
532
|
+
fulfilled the behaviour of the function is not specified.
|
|
533
|
+
|
|
534
|
+
ALGORITHM:
|
|
535
|
+
|
|
536
|
+
Solve the equation `\log(x) = self` using the Newton scheme::
|
|
537
|
+
|
|
538
|
+
.. MATH::
|
|
539
|
+
|
|
540
|
+
x_{i+1} = x_i \cdot (1 + self - \log(x_i))
|
|
541
|
+
|
|
542
|
+
The binary complexity of this algorithm is roughly the same
|
|
543
|
+
than that of the computation of the logarithm.
|
|
544
|
+
|
|
545
|
+
EXAMPLES::
|
|
546
|
+
|
|
547
|
+
sage: # needs sage.libs.ntl
|
|
548
|
+
sage: R.<w> = Zq(7^2,5)
|
|
549
|
+
sage: x = R(7*w)
|
|
550
|
+
sage: x.exp(algorithm='newton') # indirect doctest
|
|
551
|
+
1 + w*7 + (4*w + 2)*7^2 + (w + 6)*7^3 + 5*7^4 + O(7^5)
|
|
552
|
+
"""
|
|
553
|
+
cdef unsigned long p
|
|
554
|
+
cdef unsigned long prec = aprec
|
|
555
|
+
cdef pAdicFixedModElement ans
|
|
556
|
+
|
|
557
|
+
if mpz_fits_slong_p(self.prime_pow.prime.value) == 0:
|
|
558
|
+
raise NotImplementedError("the prime %s does not fit in a long" % self.prime_pow.prime)
|
|
559
|
+
p = self.prime_pow.prime
|
|
560
|
+
|
|
561
|
+
ans = self._new_c()
|
|
562
|
+
mpz_set_ui(ans.value, 1)
|
|
563
|
+
sig_on()
|
|
564
|
+
if p == 2:
|
|
565
|
+
padicexp_Newton(ans.value, self.value, p, prec, 2, self.prime_pow.pow_mpz_t_tmp(prec))
|
|
566
|
+
else:
|
|
567
|
+
padicexp_Newton(ans.value, self.value, p, prec, 1, self.prime_pow.pow_mpz_t_tmp(prec))
|
|
568
|
+
sig_off()
|
|
569
|
+
|
|
570
|
+
return ans
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
def make_pAdicFixedModElement(parent, value):
|
|
574
|
+
"""
|
|
575
|
+
Unpickles a fixed modulus element.
|
|
576
|
+
|
|
577
|
+
EXAMPLES::
|
|
578
|
+
|
|
579
|
+
sage: from sage.rings.padics.padic_fixed_mod_element import make_pAdicFixedModElement
|
|
580
|
+
sage: R = ZpFM(5)
|
|
581
|
+
sage: a = make_pAdicFixedModElement(R, 17*25); a
|
|
582
|
+
2*5^2 + 3*5^3
|
|
583
|
+
"""
|
|
584
|
+
return unpickle_fme_v2(pAdicFixedModElement, parent, value)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
from sage.libs.gmp.types cimport mpz_t
|
|
3
|
+
from cypari2.gen cimport Gen as pari_gen
|
|
4
|
+
|
|
5
|
+
ctypedef mpz_t celement
|
|
6
|
+
include "FP_template_header.pxi"
|
|
7
|
+
|
|
8
|
+
cdef class pAdicFloatingPointElement(FPElement):
|
|
9
|
+
cdef lift_c(self)
|
|
10
|
+
cdef pari_gen _to_gen(self)
|
|
11
|
+
|
|
12
|
+
from sage.rings.padics.pow_computer cimport PowComputer_base
|
|
13
|
+
cdef class PowComputer_(PowComputer_base):
|
|
14
|
+
pass
|