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,612 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
# sage.doctest: needs sage.rings.finite_rings
|
|
3
|
+
"""
|
|
4
|
+
Givaro finite fields
|
|
5
|
+
|
|
6
|
+
Finite fields that are implemented using Zech logs and the
|
|
7
|
+
cardinality must be less than `2^{16}`. By default, Conway polynomials are
|
|
8
|
+
used as minimal polynomial.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
#*****************************************************************************
|
|
12
|
+
# Copyright (C) 2010-2012 David Roe
|
|
13
|
+
# Copyright (C) 2012 Travis Scrimshaw
|
|
14
|
+
# Copyright (C) 2013 Peter Bruin
|
|
15
|
+
# Copyright (C) 2014 Jeroen Demeyer
|
|
16
|
+
#
|
|
17
|
+
# This program is free software: you can redistribute it and/or modify
|
|
18
|
+
# it under the terms of the GNU General Public License as published by
|
|
19
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
20
|
+
# (at your option) any later version.
|
|
21
|
+
# http://www.gnu.org/licenses/
|
|
22
|
+
#*****************************************************************************
|
|
23
|
+
|
|
24
|
+
from sage.rings.finite_rings.finite_field_base import FiniteField
|
|
25
|
+
from sage.rings.integer import Integer
|
|
26
|
+
from sage.rings.finite_rings.element_givaro import Cache_givaro
|
|
27
|
+
from sage.libs.pari import pari
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class FiniteField_givaro(FiniteField):
|
|
31
|
+
"""
|
|
32
|
+
Finite field implemented using Zech logs and the cardinality must be
|
|
33
|
+
less than `2^{16}`. By default, Conway polynomials are used as minimal
|
|
34
|
+
polynomials.
|
|
35
|
+
|
|
36
|
+
INPUT:
|
|
37
|
+
|
|
38
|
+
- ``q`` -- `p^n` (must be prime power)
|
|
39
|
+
|
|
40
|
+
- ``name`` -- (default: ``'a'``) variable used for
|
|
41
|
+
:meth:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement.poly_repr()`
|
|
42
|
+
|
|
43
|
+
- ``modulus`` -- a minimal polynomial to use for reduction
|
|
44
|
+
|
|
45
|
+
- ``repr`` -- (default: ``'poly'``) controls the way elements are printed
|
|
46
|
+
to the user:
|
|
47
|
+
|
|
48
|
+
- 'log': repr is
|
|
49
|
+
:meth:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement.log_repr()`
|
|
50
|
+
- 'int': repr is
|
|
51
|
+
:meth:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement.int_repr()`
|
|
52
|
+
- 'poly': repr is
|
|
53
|
+
:meth:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement.poly_repr()`
|
|
54
|
+
|
|
55
|
+
- ``cache`` -- boolean (default: ``False``); if ``True`` a cache of all
|
|
56
|
+
elements of this field is created. Thus, arithmetic does not create new
|
|
57
|
+
elements which speeds calculations up. Also, if many elements are needed
|
|
58
|
+
during a calculation this cache reduces the memory requirement as at most
|
|
59
|
+
:meth:`order` elements are created.
|
|
60
|
+
|
|
61
|
+
OUTPUT: Givaro finite field with characteristic `p` and cardinality `p^n`
|
|
62
|
+
|
|
63
|
+
EXAMPLES:
|
|
64
|
+
|
|
65
|
+
By default, Conway polynomials are used for extension fields::
|
|
66
|
+
|
|
67
|
+
sage: k.<a> = GF(2**8)
|
|
68
|
+
sage: -a ^ k.degree()
|
|
69
|
+
a^4 + a^3 + a^2 + 1
|
|
70
|
+
sage: f = k.modulus(); f
|
|
71
|
+
x^8 + x^4 + x^3 + x^2 + 1
|
|
72
|
+
|
|
73
|
+
You may enforce a modulus::
|
|
74
|
+
|
|
75
|
+
sage: P.<x> = PolynomialRing(GF(2))
|
|
76
|
+
sage: f = x^8 + x^4 + x^3 + x + 1 # Rijndael Polynomial
|
|
77
|
+
sage: k.<a> = GF(2^8, modulus=f)
|
|
78
|
+
sage: k.modulus()
|
|
79
|
+
x^8 + x^4 + x^3 + x + 1
|
|
80
|
+
sage: a^(2^8)
|
|
81
|
+
a
|
|
82
|
+
|
|
83
|
+
You may enforce a random modulus::
|
|
84
|
+
|
|
85
|
+
sage: k = GF(3**5, 'a', modulus='random')
|
|
86
|
+
sage: k.modulus() # random polynomial
|
|
87
|
+
x^5 + 2*x^4 + 2*x^3 + x^2 + 2
|
|
88
|
+
|
|
89
|
+
Three different representations are possible::
|
|
90
|
+
|
|
91
|
+
sage: FiniteField(9, 'a', impl='givaro', repr='poly').gen()
|
|
92
|
+
a
|
|
93
|
+
sage: FiniteField(9, 'a', impl='givaro', repr='int').gen()
|
|
94
|
+
3
|
|
95
|
+
sage: FiniteField(9, 'a', impl='givaro', repr='log').gen()
|
|
96
|
+
1
|
|
97
|
+
|
|
98
|
+
For prime fields, the default modulus is the polynomial `x - 1`,
|
|
99
|
+
but you can ask for a different modulus::
|
|
100
|
+
|
|
101
|
+
sage: GF(1009, impl='givaro').modulus()
|
|
102
|
+
x + 1008
|
|
103
|
+
sage: GF(1009, impl='givaro', modulus='conway').modulus()
|
|
104
|
+
x + 998
|
|
105
|
+
"""
|
|
106
|
+
def __init__(self, q, name='a', modulus=None, repr='poly', cache=False):
|
|
107
|
+
"""
|
|
108
|
+
Initialize ``self``.
|
|
109
|
+
|
|
110
|
+
EXAMPLES::
|
|
111
|
+
|
|
112
|
+
sage: k.<a> = GF(2^3)
|
|
113
|
+
sage: j.<b> = GF(3^4)
|
|
114
|
+
sage: k == j
|
|
115
|
+
False
|
|
116
|
+
|
|
117
|
+
sage: GF(2^3,'a') == copy(GF(2^3,'a'))
|
|
118
|
+
True
|
|
119
|
+
sage: TestSuite(GF(2^3, 'a')).run()
|
|
120
|
+
"""
|
|
121
|
+
if repr not in ['int', 'log', 'poly']:
|
|
122
|
+
raise ValueError("Unknown representation %s" % repr)
|
|
123
|
+
|
|
124
|
+
q = Integer(q)
|
|
125
|
+
if q < 2:
|
|
126
|
+
raise ValueError("q must be a prime power")
|
|
127
|
+
F = q.factor()
|
|
128
|
+
if len(F) > 1:
|
|
129
|
+
raise ValueError("q must be a prime power")
|
|
130
|
+
p = F[0][0]
|
|
131
|
+
k = F[0][1]
|
|
132
|
+
|
|
133
|
+
if q >= 1 << 16:
|
|
134
|
+
raise ValueError("q must be < 2^16")
|
|
135
|
+
|
|
136
|
+
from .finite_field_constructor import GF
|
|
137
|
+
FiniteField.__init__(self, GF(p), name, normalize=False)
|
|
138
|
+
|
|
139
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
140
|
+
if not isinstance(modulus, Polynomial):
|
|
141
|
+
raise TypeError("modulus must be a polynomial")
|
|
142
|
+
|
|
143
|
+
self._cache = Cache_givaro(self, p, k, modulus, repr, cache)
|
|
144
|
+
self._modulus = modulus
|
|
145
|
+
|
|
146
|
+
def characteristic(self):
|
|
147
|
+
"""
|
|
148
|
+
Return the characteristic of this field.
|
|
149
|
+
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: p = GF(19^5,'a').characteristic(); p
|
|
153
|
+
19
|
|
154
|
+
sage: type(p)
|
|
155
|
+
<class 'sage.rings.integer.Integer'>
|
|
156
|
+
"""
|
|
157
|
+
return Integer(self._cache.characteristic())
|
|
158
|
+
|
|
159
|
+
def order(self):
|
|
160
|
+
"""
|
|
161
|
+
Return the cardinality of this field.
|
|
162
|
+
|
|
163
|
+
OUTPUT: integer; the number of elements in ``self``
|
|
164
|
+
|
|
165
|
+
EXAMPLES::
|
|
166
|
+
|
|
167
|
+
sage: n = GF(19^5,'a').order(); n
|
|
168
|
+
2476099
|
|
169
|
+
sage: type(n)
|
|
170
|
+
<class 'sage.rings.integer.Integer'>
|
|
171
|
+
"""
|
|
172
|
+
return self._cache.order()
|
|
173
|
+
|
|
174
|
+
def degree(self):
|
|
175
|
+
r"""
|
|
176
|
+
If the cardinality of ``self`` is `p^n`, then this returns `n`.
|
|
177
|
+
|
|
178
|
+
OUTPUT: integer; the degree
|
|
179
|
+
|
|
180
|
+
EXAMPLES::
|
|
181
|
+
|
|
182
|
+
sage: GF(3^4,'a').degree()
|
|
183
|
+
4
|
|
184
|
+
"""
|
|
185
|
+
return Integer(self._cache.exponent())
|
|
186
|
+
|
|
187
|
+
def _repr_option(self, key):
|
|
188
|
+
"""
|
|
189
|
+
Metadata about the :meth:`_repr_` output.
|
|
190
|
+
|
|
191
|
+
See :meth:`sage.structure.parent._repr_option` for details.
|
|
192
|
+
|
|
193
|
+
EXAMPLES::
|
|
194
|
+
|
|
195
|
+
sage: GF(23**3, 'a', repr='log')._repr_option('element_is_atomic')
|
|
196
|
+
True
|
|
197
|
+
sage: GF(23**3, 'a', repr='int')._repr_option('element_is_atomic')
|
|
198
|
+
True
|
|
199
|
+
sage: GF(23**3, 'a', repr='poly')._repr_option('element_is_atomic')
|
|
200
|
+
False
|
|
201
|
+
"""
|
|
202
|
+
if key == 'element_is_atomic':
|
|
203
|
+
return self._cache.repr != 0 # 0 means repr='poly'
|
|
204
|
+
return super()._repr_option(key)
|
|
205
|
+
|
|
206
|
+
def random_element(self, *args, **kwds):
|
|
207
|
+
"""
|
|
208
|
+
Return a random element of ``self``.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: k = GF(23**3, 'a')
|
|
213
|
+
sage: e = k.random_element()
|
|
214
|
+
sage: e.parent() is k
|
|
215
|
+
True
|
|
216
|
+
sage: type(e)
|
|
217
|
+
<class 'sage.rings.finite_rings.element_givaro.FiniteField_givaroElement'>
|
|
218
|
+
|
|
219
|
+
sage: P.<x> = PowerSeriesRing(GF(3^3, 'a'))
|
|
220
|
+
sage: P.random_element(5).parent() is P
|
|
221
|
+
True
|
|
222
|
+
"""
|
|
223
|
+
return self._cache.random_element()
|
|
224
|
+
|
|
225
|
+
def _element_constructor_(self, e):
|
|
226
|
+
"""
|
|
227
|
+
Coerces several data types to ``self``.
|
|
228
|
+
|
|
229
|
+
INPUT:
|
|
230
|
+
|
|
231
|
+
- ``e`` -- data to coerce
|
|
232
|
+
|
|
233
|
+
EXAMPLES:
|
|
234
|
+
|
|
235
|
+
:class:`FiniteField_givaroElement` are accepted where the parent
|
|
236
|
+
is either ``self``, equals ``self`` or is the prime subfield::
|
|
237
|
+
|
|
238
|
+
sage: k = GF(2**8, 'a')
|
|
239
|
+
sage: k.gen() == k(k.gen())
|
|
240
|
+
True
|
|
241
|
+
|
|
242
|
+
Floats, ints, longs, Integer are interpreted modulo characteristic::
|
|
243
|
+
|
|
244
|
+
sage: k(2) # indirect doctest
|
|
245
|
+
0
|
|
246
|
+
|
|
247
|
+
Floats are converted like integers::
|
|
248
|
+
|
|
249
|
+
sage: k(float(2.0))
|
|
250
|
+
0
|
|
251
|
+
|
|
252
|
+
Rational are interpreted as ``self(numerator)/self(denominator)``.
|
|
253
|
+
Both may not be greater than :meth:`characteristic`.
|
|
254
|
+
::
|
|
255
|
+
|
|
256
|
+
sage: k = GF(3**8, 'a')
|
|
257
|
+
sage: k(1/2) == k(1)/k(2)
|
|
258
|
+
True
|
|
259
|
+
|
|
260
|
+
Free module elements over :meth:`prime_subfield()` are interpreted
|
|
261
|
+
'little endian'::
|
|
262
|
+
|
|
263
|
+
sage: k = GF(2**8, 'a')
|
|
264
|
+
sage: e = k.vector_space(map=False).gen(1); e # needs sage.modules
|
|
265
|
+
(0, 1, 0, 0, 0, 0, 0, 0)
|
|
266
|
+
sage: k(e) # needs sage.modules
|
|
267
|
+
a
|
|
268
|
+
|
|
269
|
+
``None`` yields zero::
|
|
270
|
+
|
|
271
|
+
sage: k(None)
|
|
272
|
+
0
|
|
273
|
+
|
|
274
|
+
Strings are evaluated as polynomial representation of elements in
|
|
275
|
+
``self``::
|
|
276
|
+
|
|
277
|
+
sage: k('a^2+1')
|
|
278
|
+
a^2 + 1
|
|
279
|
+
|
|
280
|
+
Univariate polynomials coerce into finite fields by evaluating
|
|
281
|
+
the polynomial at the field's generator::
|
|
282
|
+
|
|
283
|
+
sage: R.<x> = QQ[]
|
|
284
|
+
sage: k.<a> = FiniteField(5^2, 'a', impl='givaro')
|
|
285
|
+
sage: k(R(2/3))
|
|
286
|
+
4
|
|
287
|
+
sage: k(x^2)
|
|
288
|
+
a + 3
|
|
289
|
+
sage: R.<x> = GF(5)[]
|
|
290
|
+
sage: k(x^3-2*x+1)
|
|
291
|
+
2*a + 4
|
|
292
|
+
|
|
293
|
+
sage: x = polygen(QQ)
|
|
294
|
+
sage: k(x^25)
|
|
295
|
+
a
|
|
296
|
+
|
|
297
|
+
sage: Q.<q> = FiniteField(5^3, 'q', impl='givaro')
|
|
298
|
+
sage: L = GF(5)
|
|
299
|
+
sage: LL.<xx> = L[]
|
|
300
|
+
sage: Q(xx^2 + 2*xx + 4)
|
|
301
|
+
q^2 + 2*q + 4
|
|
302
|
+
|
|
303
|
+
Multivariate polynomials only coerce if constant::
|
|
304
|
+
|
|
305
|
+
sage: R = k['x,y,z']; R
|
|
306
|
+
Multivariate Polynomial Ring in x, y, z over Finite Field in a of size 5^2
|
|
307
|
+
sage: k(R(2))
|
|
308
|
+
2
|
|
309
|
+
sage: R = QQ['x,y,z']
|
|
310
|
+
sage: k(R(1/5))
|
|
311
|
+
Traceback (most recent call last):
|
|
312
|
+
...
|
|
313
|
+
ZeroDivisionError: division by zero in finite field
|
|
314
|
+
|
|
315
|
+
PARI elements are interpreted as finite field elements; this PARI
|
|
316
|
+
flexibility is (absurdly!) liberal::
|
|
317
|
+
|
|
318
|
+
sage: k.<a> = GF(2^8)
|
|
319
|
+
sage: k(pari('Mod(1,2)'))
|
|
320
|
+
1
|
|
321
|
+
sage: k(pari('Mod(2,3)'))
|
|
322
|
+
a
|
|
323
|
+
sage: k(pari('Mod(1,3)*a^20'))
|
|
324
|
+
a^7 + a^5 + a^4 + a^2
|
|
325
|
+
sage: k(pari('O(x)'))
|
|
326
|
+
Traceback (most recent call last):
|
|
327
|
+
...
|
|
328
|
+
TypeError: unable to convert PARI t_SER to Finite Field in a of size 2^8
|
|
329
|
+
|
|
330
|
+
We can coerce from PARI finite field implementations::
|
|
331
|
+
|
|
332
|
+
sage: K.<a> = GF(3^10, impl='givaro')
|
|
333
|
+
sage: a^20
|
|
334
|
+
2*a^9 + 2*a^8 + a^7 + 2*a^5 + 2*a^4 + 2*a^3 + 1
|
|
335
|
+
sage: M.<c> = GF(3^10, impl='pari_ffelt')
|
|
336
|
+
sage: K(c^20)
|
|
337
|
+
2*a^9 + 2*a^8 + a^7 + 2*a^5 + 2*a^4 + 2*a^3 + 1
|
|
338
|
+
|
|
339
|
+
GAP elements need to be finite field elements::
|
|
340
|
+
|
|
341
|
+
sage: # needs sage.libs.gap
|
|
342
|
+
sage: x = gap('Z(13)')
|
|
343
|
+
sage: F = FiniteField(13, impl='givaro')
|
|
344
|
+
sage: F(x)
|
|
345
|
+
2
|
|
346
|
+
sage: F(gap('0*Z(13)'))
|
|
347
|
+
0
|
|
348
|
+
sage: F = FiniteField(13^2, 'a', impl='givaro')
|
|
349
|
+
sage: x = gap('Z(13)')
|
|
350
|
+
sage: F(x)
|
|
351
|
+
2
|
|
352
|
+
sage: x = gap('Z(13^2)^3')
|
|
353
|
+
sage: F(x)
|
|
354
|
+
12*a + 11
|
|
355
|
+
sage: F.multiplicative_generator()^3
|
|
356
|
+
12*a + 11
|
|
357
|
+
|
|
358
|
+
sage: k.<a> = GF(29^3)
|
|
359
|
+
sage: k(48771/1225)
|
|
360
|
+
28
|
|
361
|
+
|
|
362
|
+
sage: F9 = FiniteField(9, impl='givaro', prefix='a')
|
|
363
|
+
sage: F81 = FiniteField(81, impl='givaro', prefix='a')
|
|
364
|
+
sage: F81(F9.gen())
|
|
365
|
+
2*a4^3 + 2*a4^2 + 1
|
|
366
|
+
"""
|
|
367
|
+
return self._cache.element_from_data(e)
|
|
368
|
+
|
|
369
|
+
def gen(self, n=0):
|
|
370
|
+
r"""
|
|
371
|
+
Return a generator of ``self`` over its prime field, which is a
|
|
372
|
+
root of ``self.modulus()``.
|
|
373
|
+
|
|
374
|
+
INPUT:
|
|
375
|
+
|
|
376
|
+
- ``n`` -- must be 0
|
|
377
|
+
|
|
378
|
+
OUTPUT:
|
|
379
|
+
|
|
380
|
+
An element `a` of ``self`` such that ``self.modulus()(a) == 0``.
|
|
381
|
+
|
|
382
|
+
.. WARNING::
|
|
383
|
+
|
|
384
|
+
This generator is not guaranteed to be a generator for the
|
|
385
|
+
multiplicative group. To obtain the latter, use
|
|
386
|
+
:meth:`~sage.rings.finite_rings.finite_field_base.FiniteFields.multiplicative_generator()`
|
|
387
|
+
or use the ``modulus="primitive"`` option when constructing
|
|
388
|
+
the field.
|
|
389
|
+
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: k = GF(3^4, 'b'); k.gen()
|
|
393
|
+
b
|
|
394
|
+
sage: k.gen(1)
|
|
395
|
+
Traceback (most recent call last):
|
|
396
|
+
...
|
|
397
|
+
IndexError: only one generator
|
|
398
|
+
sage: F = FiniteField(31, impl='givaro')
|
|
399
|
+
sage: F.gen()
|
|
400
|
+
1
|
|
401
|
+
"""
|
|
402
|
+
if n:
|
|
403
|
+
raise IndexError("only one generator")
|
|
404
|
+
return self._cache.gen()
|
|
405
|
+
|
|
406
|
+
def prime_subfield(self):
|
|
407
|
+
r"""
|
|
408
|
+
Return the prime subfield `\GF{p}` of ``self`` if ``self`` is `\GF{p^n}`.
|
|
409
|
+
|
|
410
|
+
EXAMPLES::
|
|
411
|
+
|
|
412
|
+
sage: GF(3^4, 'b').prime_subfield()
|
|
413
|
+
Finite Field of size 3
|
|
414
|
+
|
|
415
|
+
sage: S.<b> = GF(5^2); S
|
|
416
|
+
Finite Field in b of size 5^2
|
|
417
|
+
sage: S.prime_subfield()
|
|
418
|
+
Finite Field of size 5
|
|
419
|
+
sage: type(S.prime_subfield())
|
|
420
|
+
<class 'sage.rings.finite_rings.finite_field_prime_modn.FiniteField_prime_modn_with_category'>
|
|
421
|
+
"""
|
|
422
|
+
try:
|
|
423
|
+
return self._prime_subfield
|
|
424
|
+
except AttributeError:
|
|
425
|
+
from .finite_field_constructor import GF
|
|
426
|
+
self._prime_subfield = GF(self.characteristic())
|
|
427
|
+
return self._prime_subfield
|
|
428
|
+
|
|
429
|
+
def log_to_int(self, n):
|
|
430
|
+
r"""
|
|
431
|
+
Given an integer `n` this method returns ``i`` where ``i``
|
|
432
|
+
satisfies `g^n = i` where `g` is the generator of ``self``; the
|
|
433
|
+
result is interpreted as an integer.
|
|
434
|
+
|
|
435
|
+
INPUT:
|
|
436
|
+
|
|
437
|
+
- ``n`` -- log representation of a finite field element
|
|
438
|
+
|
|
439
|
+
OUTPUT: integer representation of a finite field element
|
|
440
|
+
|
|
441
|
+
EXAMPLES::
|
|
442
|
+
|
|
443
|
+
sage: k = GF(2**8, 'a')
|
|
444
|
+
sage: k.log_to_int(4)
|
|
445
|
+
16
|
|
446
|
+
sage: k.log_to_int(20)
|
|
447
|
+
180
|
|
448
|
+
"""
|
|
449
|
+
return self._cache.log_to_int(n)
|
|
450
|
+
|
|
451
|
+
def int_to_log(self, n):
|
|
452
|
+
r"""
|
|
453
|
+
Given an integer `n` this method returns `i` where `i` satisfies
|
|
454
|
+
`g^i = n \mod p` where `g` is the generator and `p` is the
|
|
455
|
+
characteristic of ``self``.
|
|
456
|
+
|
|
457
|
+
INPUT:
|
|
458
|
+
|
|
459
|
+
- ``n`` -- integer representation of a finite field element
|
|
460
|
+
|
|
461
|
+
OUTPUT: log representation of ``n``
|
|
462
|
+
|
|
463
|
+
EXAMPLES::
|
|
464
|
+
|
|
465
|
+
sage: k = GF(7**3, 'a')
|
|
466
|
+
sage: k.int_to_log(4)
|
|
467
|
+
228
|
|
468
|
+
sage: k.int_to_log(3)
|
|
469
|
+
57
|
|
470
|
+
sage: k.gen()^57
|
|
471
|
+
3
|
|
472
|
+
"""
|
|
473
|
+
return self._cache.int_to_log(n)
|
|
474
|
+
|
|
475
|
+
def from_integer(self, n):
|
|
476
|
+
r"""
|
|
477
|
+
Given an integer `n` return a finite field element in ``self``
|
|
478
|
+
which equals `n` under the condition that :meth:`gen()` is set to
|
|
479
|
+
:meth:`characteristic()`.
|
|
480
|
+
|
|
481
|
+
EXAMPLES::
|
|
482
|
+
|
|
483
|
+
sage: k.<a> = GF(2^8)
|
|
484
|
+
sage: k.from_integer(8)
|
|
485
|
+
a^3
|
|
486
|
+
sage: e = k.from_integer(151); e
|
|
487
|
+
a^7 + a^4 + a^2 + a + 1
|
|
488
|
+
sage: 2^7 + 2^4 + 2^2 + 2 + 1
|
|
489
|
+
151
|
|
490
|
+
"""
|
|
491
|
+
return self._cache.fetch_int(n)
|
|
492
|
+
|
|
493
|
+
def _pari_modulus(self):
|
|
494
|
+
"""
|
|
495
|
+
Return the modulus of ``self`` in a format for PARI.
|
|
496
|
+
|
|
497
|
+
EXAMPLES::
|
|
498
|
+
|
|
499
|
+
sage: GF(3^4,'a')._pari_modulus()
|
|
500
|
+
Mod(1, 3)*a^4 + Mod(2, 3)*a^3 + Mod(2, 3)
|
|
501
|
+
"""
|
|
502
|
+
f = pari(str(self.modulus()))
|
|
503
|
+
return f.subst('x', 'a') * pari("Mod(1,%s)" % self.characteristic())
|
|
504
|
+
|
|
505
|
+
def __iter__(self):
|
|
506
|
+
"""
|
|
507
|
+
Finite fields may be iterated over.
|
|
508
|
+
|
|
509
|
+
EXAMPLES::
|
|
510
|
+
|
|
511
|
+
sage: list(GF(2**2, 'a'))
|
|
512
|
+
[0, a, a + 1, 1]
|
|
513
|
+
"""
|
|
514
|
+
from .element_givaro import FiniteField_givaro_iterator
|
|
515
|
+
return FiniteField_givaro_iterator(self._cache)
|
|
516
|
+
|
|
517
|
+
def a_times_b_plus_c(self, a, b, c):
|
|
518
|
+
"""
|
|
519
|
+
Return ``a*b + c``. This is faster than multiplying ``a`` and ``b``
|
|
520
|
+
first and adding ``c`` to the result.
|
|
521
|
+
|
|
522
|
+
INPUT:
|
|
523
|
+
|
|
524
|
+
- ``a``, ``b``, ``c`` -- :class:`~~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement`
|
|
525
|
+
|
|
526
|
+
EXAMPLES::
|
|
527
|
+
|
|
528
|
+
sage: k.<a> = GF(2**8)
|
|
529
|
+
sage: k.a_times_b_plus_c(a,a,k(1))
|
|
530
|
+
a^2 + 1
|
|
531
|
+
"""
|
|
532
|
+
return self._cache.a_times_b_plus_c(a, b, c)
|
|
533
|
+
|
|
534
|
+
def a_times_b_minus_c(self, a, b, c):
|
|
535
|
+
"""
|
|
536
|
+
Return ``a*b - c``.
|
|
537
|
+
|
|
538
|
+
INPUT:
|
|
539
|
+
|
|
540
|
+
- ``a``, ``b``, ``c`` -- :class:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement`
|
|
541
|
+
|
|
542
|
+
EXAMPLES::
|
|
543
|
+
|
|
544
|
+
sage: k.<a> = GF(3**3)
|
|
545
|
+
sage: k.a_times_b_minus_c(a,a,k(1))
|
|
546
|
+
a^2 + 2
|
|
547
|
+
"""
|
|
548
|
+
return self._cache.a_times_b_minus_c(a, b, c)
|
|
549
|
+
|
|
550
|
+
def c_minus_a_times_b(self, a, b, c):
|
|
551
|
+
"""
|
|
552
|
+
Return ``c - a*b``.
|
|
553
|
+
|
|
554
|
+
INPUT:
|
|
555
|
+
|
|
556
|
+
- ``a``, ``b``, ``c`` -- :class:`~sage.rings.finite_rings.element_givaro.FiniteField_givaroElement`
|
|
557
|
+
|
|
558
|
+
EXAMPLES::
|
|
559
|
+
|
|
560
|
+
sage: k.<a> = GF(3**3)
|
|
561
|
+
sage: k.c_minus_a_times_b(a,a,k(1))
|
|
562
|
+
2*a^2 + 1
|
|
563
|
+
"""
|
|
564
|
+
return self._cache.c_minus_a_times_b(a, b, c)
|
|
565
|
+
|
|
566
|
+
def frobenius_endomorphism(self, n=1):
|
|
567
|
+
"""
|
|
568
|
+
INPUT:
|
|
569
|
+
|
|
570
|
+
- ``n`` -- integer (default: 1)
|
|
571
|
+
|
|
572
|
+
OUTPUT:
|
|
573
|
+
|
|
574
|
+
The `n`-th power of the absolute arithmetic Frobenius
|
|
575
|
+
endomorphism on this finite field.
|
|
576
|
+
|
|
577
|
+
EXAMPLES::
|
|
578
|
+
|
|
579
|
+
sage: k.<t> = GF(3^5)
|
|
580
|
+
sage: Frob = k.frobenius_endomorphism(); Frob
|
|
581
|
+
Frobenius endomorphism t |--> t^3 on Finite Field in t of size 3^5
|
|
582
|
+
|
|
583
|
+
sage: a = k.random_element()
|
|
584
|
+
sage: Frob(a) == a^3
|
|
585
|
+
True
|
|
586
|
+
|
|
587
|
+
We can specify a power::
|
|
588
|
+
|
|
589
|
+
sage: k.frobenius_endomorphism(2)
|
|
590
|
+
Frobenius endomorphism t |--> t^(3^2) on Finite Field in t of size 3^5
|
|
591
|
+
|
|
592
|
+
The result is simplified if possible::
|
|
593
|
+
|
|
594
|
+
sage: k.frobenius_endomorphism(6)
|
|
595
|
+
Frobenius endomorphism t |--> t^3 on Finite Field in t of size 3^5
|
|
596
|
+
sage: k.frobenius_endomorphism(5)
|
|
597
|
+
Identity endomorphism of Finite Field in t of size 3^5
|
|
598
|
+
|
|
599
|
+
Comparisons work::
|
|
600
|
+
|
|
601
|
+
sage: k.frobenius_endomorphism(6) == Frob
|
|
602
|
+
True
|
|
603
|
+
sage: from sage.categories.morphism import IdentityMorphism
|
|
604
|
+
sage: k.frobenius_endomorphism(5) == IdentityMorphism(k)
|
|
605
|
+
True
|
|
606
|
+
|
|
607
|
+
AUTHOR:
|
|
608
|
+
|
|
609
|
+
- Xavier Caruso (2012-06-29)
|
|
610
|
+
"""
|
|
611
|
+
from sage.rings.finite_rings.hom_finite_field_givaro import FrobeniusEndomorphism_givaro
|
|
612
|
+
return FrobeniusEndomorphism_givaro(self, n)
|