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,509 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
# sage.doctest: needs sage.libs.pari sage.rings.real_mpfr
|
|
3
|
+
r"""
|
|
4
|
+
Enumeration of primitive totally real fields
|
|
5
|
+
|
|
6
|
+
This module contains functions for enumerating all primitive
|
|
7
|
+
totally real number fields of given degree and small discriminant.
|
|
8
|
+
Here a number field is called *primitive* if it contains no proper
|
|
9
|
+
subfields except `\QQ`.
|
|
10
|
+
|
|
11
|
+
See also :mod:`sage.rings.number_field.totallyreal_rel`, which handles the non-primitive
|
|
12
|
+
case using relative extensions.
|
|
13
|
+
|
|
14
|
+
ALGORITHM:
|
|
15
|
+
|
|
16
|
+
We use Hunter's algorithm ([Coh2000]_, Section 9.3) with modifications
|
|
17
|
+
due to Takeuchi [Tak1999]_ and the author [Voi2008]_.
|
|
18
|
+
|
|
19
|
+
We enumerate polynomials `f(x) = x^n + a_{n-1} x^{n-1} + \dots + a_0`.
|
|
20
|
+
Hunter's theorem gives bounds on `a_{n-1}` and `a_{n-2}`; then given
|
|
21
|
+
`a_{n-1}` and `a_{n-2}`, one can recursively compute bounds on `a_{n-3},
|
|
22
|
+
\dots, a_0`, using the fact that the polynomial is totally real by
|
|
23
|
+
looking at the zeros of successive derivatives and applying
|
|
24
|
+
Rolle's theorem. See [Tak1999]_ for more details.
|
|
25
|
+
|
|
26
|
+
EXAMPLES:
|
|
27
|
+
|
|
28
|
+
In this first simple example, we compute the totally real quadratic
|
|
29
|
+
fields of discriminant `\le 50`. ::
|
|
30
|
+
|
|
31
|
+
sage: enumerate_totallyreal_fields_prim(2,50)
|
|
32
|
+
[[5, x^2 - x - 1],
|
|
33
|
+
[8, x^2 - 2],
|
|
34
|
+
[12, x^2 - 3],
|
|
35
|
+
[13, x^2 - x - 3],
|
|
36
|
+
[17, x^2 - x - 4],
|
|
37
|
+
[21, x^2 - x - 5],
|
|
38
|
+
[24, x^2 - 6],
|
|
39
|
+
[28, x^2 - 7],
|
|
40
|
+
[29, x^2 - x - 7],
|
|
41
|
+
[33, x^2 - x - 8],
|
|
42
|
+
[37, x^2 - x - 9],
|
|
43
|
+
[40, x^2 - 10],
|
|
44
|
+
[41, x^2 - x - 10],
|
|
45
|
+
[44, x^2 - 11]]
|
|
46
|
+
sage: [d for d in range(5,50)
|
|
47
|
+
....: if (is_squarefree(d) and d%4 == 1) or (d%4 == 0 and is_squarefree(d/4))]
|
|
48
|
+
[5, 8, 12, 13, 17, 20, 21, 24, 28, 29, 33, 37, 40, 41, 44]
|
|
49
|
+
|
|
50
|
+
Next, we compute all totally real quintic fields of discriminant `\le 10^5`::
|
|
51
|
+
|
|
52
|
+
sage: ls = enumerate_totallyreal_fields_prim(5,10^5) ; ls
|
|
53
|
+
[[14641, x^5 - x^4 - 4*x^3 + 3*x^2 + 3*x - 1],
|
|
54
|
+
[24217, x^5 - 5*x^3 - x^2 + 3*x + 1],
|
|
55
|
+
[36497, x^5 - 2*x^4 - 3*x^3 + 5*x^2 + x - 1],
|
|
56
|
+
[38569, x^5 - 5*x^3 + 4*x - 1],
|
|
57
|
+
[65657, x^5 - x^4 - 5*x^3 + 2*x^2 + 5*x + 1],
|
|
58
|
+
[70601, x^5 - x^4 - 5*x^3 + 2*x^2 + 3*x - 1],
|
|
59
|
+
[81509, x^5 - x^4 - 5*x^3 + 3*x^2 + 5*x - 2],
|
|
60
|
+
[81589, x^5 - 6*x^3 + 8*x - 1],
|
|
61
|
+
[89417, x^5 - 6*x^3 - x^2 + 8*x + 3]]
|
|
62
|
+
sage: len(ls)
|
|
63
|
+
9
|
|
64
|
+
|
|
65
|
+
We see that there are 9 such fields (up to isomorphism!).
|
|
66
|
+
|
|
67
|
+
See also [Mar1980]_.
|
|
68
|
+
|
|
69
|
+
AUTHORS:
|
|
70
|
+
|
|
71
|
+
- John Voight (2007-09-01): initial version; various optimization tweaks
|
|
72
|
+
- John Voight (2007-10-09): added DSage module; added pari functions to avoid
|
|
73
|
+
recomputations; separated DSage component
|
|
74
|
+
- Craig Citro and John Voight (2007-11-04): additional doctests and type checking
|
|
75
|
+
- Craig Citro and John Voight (2008-02-10): final modifications for submission
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
# ****************************************************************************
|
|
79
|
+
# Copyright (C) 2007 William Stein and John Voight
|
|
80
|
+
#
|
|
81
|
+
# This program is free software: you can redistribute it and/or modify
|
|
82
|
+
# it under the terms of the GNU General Public License as published by
|
|
83
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
84
|
+
# (at your option) any later version.
|
|
85
|
+
# https://www.gnu.org/licenses/
|
|
86
|
+
# ****************************************************************************
|
|
87
|
+
|
|
88
|
+
from cysignals.memory cimport check_calloc, sig_free
|
|
89
|
+
|
|
90
|
+
import math
|
|
91
|
+
import sys
|
|
92
|
+
|
|
93
|
+
from sage.libs.gmp.mpz cimport *
|
|
94
|
+
from sage.libs.pari import pari
|
|
95
|
+
from cypari2.gen cimport Gen as pari_gen
|
|
96
|
+
from sage.libs.pari.misc cimport new_t_POL_from_int_star
|
|
97
|
+
|
|
98
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
99
|
+
from sage.rings.integer import Integer
|
|
100
|
+
from sage.rings.integer cimport Integer
|
|
101
|
+
from sage.rings.integer_ring import ZZ
|
|
102
|
+
from sage.rings.rational_field import QQ
|
|
103
|
+
|
|
104
|
+
from sage.rings.number_field.totallyreal_data import tr_data, int_has_small_square_divisor
|
|
105
|
+
from sage.rings.number_field.totallyreal_data cimport tr_data
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
cpdef double odlyzko_bound_totallyreal(int n) noexcept:
|
|
109
|
+
r"""
|
|
110
|
+
This function returns the unconditional Odlyzko bound for the root
|
|
111
|
+
discriminant of a totally real number field of degree `n`.
|
|
112
|
+
|
|
113
|
+
.. NOTE::
|
|
114
|
+
|
|
115
|
+
The bounds for `n > 50` are not necessarily optimal.
|
|
116
|
+
|
|
117
|
+
INPUT:
|
|
118
|
+
|
|
119
|
+
- ``n`` -- integer; the degree
|
|
120
|
+
|
|
121
|
+
OUTPUT: a lower bound on the root discriminant (as a real number)
|
|
122
|
+
|
|
123
|
+
EXAMPLES::
|
|
124
|
+
|
|
125
|
+
sage: from sage.rings.number_field.totallyreal import odlyzko_bound_totallyreal
|
|
126
|
+
sage: [odlyzko_bound_totallyreal(n) for n in range(1, 5)]
|
|
127
|
+
[1.0, 2.223, 3.61, 5.067]
|
|
128
|
+
|
|
129
|
+
AUTHORS:
|
|
130
|
+
|
|
131
|
+
- John Voight (2007-09-03)
|
|
132
|
+
|
|
133
|
+
.. NOTE::
|
|
134
|
+
|
|
135
|
+
The values are calculated by Martinet [Mar1980]_.
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
if n <= 10:
|
|
139
|
+
dB = [1.,2.223,3.610,5.067,6.523,7.941,9.301,10.596,11.823,12.985][n-1]
|
|
140
|
+
elif n <= 20:
|
|
141
|
+
dB = [14.0831,15.1217,16.1047,17.0359,17.9192,18.7580,19.5555,20.3148,21.0386,21.7294][n-11]
|
|
142
|
+
elif n <= 30:
|
|
143
|
+
dB = [22.3896,23.0212,23.6261,24.2061,24.7628,25.2976,25.2976,26.3071,26.3071,27.2440][n-21]
|
|
144
|
+
elif n <= 40:
|
|
145
|
+
dB = [27.2440,28.1165,28.1165,28.9315,28.9315,29.6948,29.6948,30.4117,30.4117,31.0865][n-31]
|
|
146
|
+
elif n <= 50:
|
|
147
|
+
dB = [31.0865,31.7232,31.7232,32.3252,32.3252,32.8954,32.8954,33.4365,33.4365,33.9508][n-41]
|
|
148
|
+
else:
|
|
149
|
+
dB = 33.9508
|
|
150
|
+
return dB
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def enumerate_totallyreal_fields_prim(n, B, a = [], verbose=0, return_seqs=False,
|
|
154
|
+
phc=False, keep_fields=False, t_2=False,
|
|
155
|
+
just_print=False,
|
|
156
|
+
return_pari_objects=True):
|
|
157
|
+
r"""
|
|
158
|
+
Enumerate primitive totally real fields of degree
|
|
159
|
+
`n>1` with discriminant `d \leq B`; optionally one can specify the
|
|
160
|
+
first few coefficients, where the sequence `a` corresponds to
|
|
161
|
+
|
|
162
|
+
::
|
|
163
|
+
|
|
164
|
+
a[d]*x^n + ... + a[0]*x^(n-d)
|
|
165
|
+
|
|
166
|
+
where ``length(a) = d+1``, so in particular always ``a[d] = 1``.
|
|
167
|
+
|
|
168
|
+
.. NOTE::
|
|
169
|
+
|
|
170
|
+
This is guaranteed to give all primitive such fields, and
|
|
171
|
+
seems in practice to give many imprimitive ones.
|
|
172
|
+
|
|
173
|
+
INPUT:
|
|
174
|
+
|
|
175
|
+
- ``n`` -- integer; the degree
|
|
176
|
+
- ``B`` -- integer; the discriminant bound
|
|
177
|
+
- ``a`` -- list (default: ``[]``); the coefficient list to begin with
|
|
178
|
+
- ``verbose`` -- (integer or string, default: 0) if ``verbose == 1``
|
|
179
|
+
(or ``2``), then print to the screen (really) verbosely; if verbose is
|
|
180
|
+
a string, then print verbosely to the file specified by verbose.
|
|
181
|
+
- ``return_seqs`` -- boolean (default: ``False``); if ``True``, then return
|
|
182
|
+
the polynomials as sequences (for easier exporting to a file)
|
|
183
|
+
- ``phc`` -- boolean or integer (default: ``False``)
|
|
184
|
+
- ``keep_fields`` -- boolean or integer (default: ``False``); if
|
|
185
|
+
``keep_fields`` is ``True``, then keep fields up to ``B*log(B)``; if
|
|
186
|
+
``keep_fields`` is an integer, then keep fields up to that integer.
|
|
187
|
+
- ``t_2`` -- boolean or integer (default: ``False``); if ``t_2 = T``, then
|
|
188
|
+
keep only polynomials with ``t_2 norm >= T``
|
|
189
|
+
- ``just_print`` -- boolean (default: ``False``); if ``just_print`` is not
|
|
190
|
+
``False``, instead of creating a sorted list of totally real number
|
|
191
|
+
fields, we simply write each totally real field we find to the file
|
|
192
|
+
whose filename is given by ``just_print``. In this case, we don't
|
|
193
|
+
return anything.
|
|
194
|
+
- ``return_pari_objects`` -- boolean (default: ``True``); if
|
|
195
|
+
both ``return_seqs`` and ``return_pari_objects`` are ``False`` then
|
|
196
|
+
it returns the elements as Sage objects. Otherwise it returns PARI
|
|
197
|
+
objects.
|
|
198
|
+
|
|
199
|
+
OUTPUT:
|
|
200
|
+
|
|
201
|
+
the list of fields with entries ``[d,f]``, where ``d`` is the
|
|
202
|
+
discriminant and ``f`` is a defining polynomial, sorted by
|
|
203
|
+
discriminant.
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
AUTHORS:
|
|
207
|
+
|
|
208
|
+
- John Voight (2007-09-03)
|
|
209
|
+
- Craig Citro (2008-09-19): moved to Cython for speed improvement
|
|
210
|
+
|
|
211
|
+
TESTS::
|
|
212
|
+
|
|
213
|
+
sage: len(enumerate_totallyreal_fields_prim(2,10**4))
|
|
214
|
+
3043
|
|
215
|
+
sage: len(enumerate_totallyreal_fields_prim(3,3**8))
|
|
216
|
+
237
|
|
217
|
+
sage: len(enumerate_totallyreal_fields_prim(5,5**7))
|
|
218
|
+
6
|
|
219
|
+
sage: len(enumerate_totallyreal_fields_prim(2,2**15)) # long time
|
|
220
|
+
9957
|
|
221
|
+
sage: len(enumerate_totallyreal_fields_prim(3,3**10)) # long time
|
|
222
|
+
2720
|
|
223
|
+
sage: len(enumerate_totallyreal_fields_prim(5,5**8)) # long time
|
|
224
|
+
103
|
|
225
|
+
|
|
226
|
+
Each of the outputs must be elements of Sage if ``return_pari_objects``
|
|
227
|
+
is set to ``False``::
|
|
228
|
+
|
|
229
|
+
sage: enumerate_totallyreal_fields_prim(2, 10)
|
|
230
|
+
[[5, x^2 - x - 1], [8, x^2 - 2]]
|
|
231
|
+
sage: type(enumerate_totallyreal_fields_prim(2, 10)[0][1])
|
|
232
|
+
<class 'cypari2.gen.Gen'>
|
|
233
|
+
sage: enumerate_totallyreal_fields_prim(2, 10, return_pari_objects=False)[0][0].parent()
|
|
234
|
+
Integer Ring
|
|
235
|
+
sage: enumerate_totallyreal_fields_prim(2, 10, return_pari_objects=False)[0][1].parent()
|
|
236
|
+
Univariate Polynomial Ring in x over Rational Field
|
|
237
|
+
sage: enumerate_totallyreal_fields_prim(2, 10, return_seqs=True)[1][0][1][0].parent()
|
|
238
|
+
Rational Field
|
|
239
|
+
"""
|
|
240
|
+
|
|
241
|
+
cdef pari_gen B_pari, d, d_poly, keepB, nf, t2val, ngt2, ng
|
|
242
|
+
cdef int *f_out
|
|
243
|
+
cdef int counts[4]
|
|
244
|
+
cdef int i, n_int, j, skip_jp
|
|
245
|
+
cdef bint found, use_t2, phc_flag, verb_int, temp_bint
|
|
246
|
+
cdef Py_ssize_t k0, lenS
|
|
247
|
+
cdef tr_data T
|
|
248
|
+
cdef Integer dB
|
|
249
|
+
|
|
250
|
+
if not isinstance(n, Integer):
|
|
251
|
+
try:
|
|
252
|
+
n = Integer(n)
|
|
253
|
+
except TypeError:
|
|
254
|
+
raise TypeError("cannot coerce n (= %s) to an integer" % n)
|
|
255
|
+
if (n < 1):
|
|
256
|
+
raise ValueError("n must be at least 1.")
|
|
257
|
+
|
|
258
|
+
# Initialize
|
|
259
|
+
n_int = int(n)
|
|
260
|
+
S = set() # set of pairs (d, f)
|
|
261
|
+
lenS = 0
|
|
262
|
+
|
|
263
|
+
# This is just to quiet valgrind down
|
|
264
|
+
B_pari = pari(0)
|
|
265
|
+
d = B_pari
|
|
266
|
+
d_poly = B_pari
|
|
267
|
+
keepB = B_pari
|
|
268
|
+
nf = B_pari
|
|
269
|
+
t2val = B_pari
|
|
270
|
+
ngt2 = B_pari
|
|
271
|
+
ng = B_pari
|
|
272
|
+
|
|
273
|
+
dB = Integer.__new__(Integer)
|
|
274
|
+
dB_odlyzko = odlyzko_bound_totallyreal(n_int)
|
|
275
|
+
mpz_set_d(dB.value, dB_odlyzko)
|
|
276
|
+
dB = 40000*((dB+1)**n_int)
|
|
277
|
+
for i from 0 <= i < 4:
|
|
278
|
+
counts[i] = 0
|
|
279
|
+
|
|
280
|
+
B_pari = pari(B)
|
|
281
|
+
f_out = <int *>check_calloc(n_int + 1, sizeof(int))
|
|
282
|
+
f_out[n_int] = 1
|
|
283
|
+
|
|
284
|
+
if keep_fields:
|
|
285
|
+
if isinstance(keep_fields, bool):
|
|
286
|
+
keepB = pari(int(math.floor(B*math.log(B))))
|
|
287
|
+
else:
|
|
288
|
+
keepB = pari(keep_fields)
|
|
289
|
+
else:
|
|
290
|
+
keepB = pari(0)
|
|
291
|
+
|
|
292
|
+
if B > keepB:
|
|
293
|
+
keepB = B_pari
|
|
294
|
+
|
|
295
|
+
if t_2:
|
|
296
|
+
k0 = len(a)
|
|
297
|
+
if isinstance(t_2, Integer):
|
|
298
|
+
t2val = pari(t_2)
|
|
299
|
+
else:
|
|
300
|
+
t2val = pari(a[k0-2]**2-2*a[k0-3])
|
|
301
|
+
use_t2 = 1
|
|
302
|
+
else:
|
|
303
|
+
use_t2 = 0
|
|
304
|
+
|
|
305
|
+
if phc:
|
|
306
|
+
phc_flag = 1
|
|
307
|
+
else:
|
|
308
|
+
phc_flag = 0
|
|
309
|
+
|
|
310
|
+
if just_print:
|
|
311
|
+
skip_jp = 0
|
|
312
|
+
jp_file = open(just_print, "w")
|
|
313
|
+
else:
|
|
314
|
+
skip_jp = 1
|
|
315
|
+
|
|
316
|
+
# Trivial case
|
|
317
|
+
if n == 1:
|
|
318
|
+
sig_free(f_out)
|
|
319
|
+
if return_seqs:
|
|
320
|
+
return [[0,0,0,0],[[1,[-1,1]]]]
|
|
321
|
+
elif return_pari_objects:
|
|
322
|
+
return [[1,pari('x-1')]]
|
|
323
|
+
else:
|
|
324
|
+
Px = PolynomialRing(QQ, 'x')
|
|
325
|
+
return [[ZZ(1), Px.gen()-1]]
|
|
326
|
+
|
|
327
|
+
if verbose:
|
|
328
|
+
verb_int = 1
|
|
329
|
+
saveout = sys.stdout
|
|
330
|
+
if isinstance(verbose, str):
|
|
331
|
+
fsock = open(verbose, 'w')
|
|
332
|
+
sys.stdout = fsock
|
|
333
|
+
# Else, print to screen
|
|
334
|
+
else:
|
|
335
|
+
verb_int = 0
|
|
336
|
+
|
|
337
|
+
T = tr_data(n_int,B,a)
|
|
338
|
+
if verb_int == 2:
|
|
339
|
+
T.incr(f_out,verb_int,0,phc_flag)
|
|
340
|
+
else:
|
|
341
|
+
T.incr(f_out,0,0,phc_flag)
|
|
342
|
+
|
|
343
|
+
while f_out[n]:
|
|
344
|
+
nf = new_t_POL_from_int_star(f_out, n_int+1, 0)
|
|
345
|
+
if verb_int:
|
|
346
|
+
print("==>", nf, "[")
|
|
347
|
+
for j from 0 <= j < n-1:
|
|
348
|
+
print("%s " % f_out[j])
|
|
349
|
+
print("%s]" % f_out[n - 1])
|
|
350
|
+
d_poly = nf.poldisc()
|
|
351
|
+
counts[0] += 1
|
|
352
|
+
if d_poly > 0 and nf.polsturm() == n:
|
|
353
|
+
da = int_has_small_square_divisor(Integer(d_poly))
|
|
354
|
+
if d_poly > dB or d_poly <= B*da:
|
|
355
|
+
counts[1] += 1
|
|
356
|
+
if nf.polisirreducible():
|
|
357
|
+
counts[2] += 1
|
|
358
|
+
zk, d = nf.nfbasis_d()
|
|
359
|
+
|
|
360
|
+
if d <= keepB:
|
|
361
|
+
if verb_int:
|
|
362
|
+
print("has discriminant", d, end='')
|
|
363
|
+
|
|
364
|
+
# Find a minimal lattice element
|
|
365
|
+
counts[3] += 1
|
|
366
|
+
ng = <pari_gen>((<pari_gen>(pari([nf,zk]))).polredabs())
|
|
367
|
+
|
|
368
|
+
dng = (d, ng)
|
|
369
|
+
|
|
370
|
+
if skip_jp:
|
|
371
|
+
# Check if K is contained in the list.
|
|
372
|
+
found = dng in S
|
|
373
|
+
if found and verb_int:
|
|
374
|
+
print("but is not new")
|
|
375
|
+
|
|
376
|
+
ngt2 = <pari_gen>(ng[n_int-1]**2-2*ng[n_int-2])
|
|
377
|
+
if not found:
|
|
378
|
+
temp_bint = ngt2 >= t2val
|
|
379
|
+
if ((not use_t2) or temp_bint):
|
|
380
|
+
if verb_int:
|
|
381
|
+
print("and is new!")
|
|
382
|
+
S.add(dng)
|
|
383
|
+
lenS += 1
|
|
384
|
+
else:
|
|
385
|
+
if ((not use_t2) or ngt2 >= t2val):
|
|
386
|
+
jp_file.write(str([d, ng.Vecrev()]) + "\n")
|
|
387
|
+
|
|
388
|
+
else:
|
|
389
|
+
if verb_int:
|
|
390
|
+
print("has discriminant", abs(d), "> B")
|
|
391
|
+
else:
|
|
392
|
+
if verb_int:
|
|
393
|
+
print("is not irreducible")
|
|
394
|
+
else:
|
|
395
|
+
if verb_int:
|
|
396
|
+
print("has discriminant", abs(d), "with no large enough square divisor")
|
|
397
|
+
else:
|
|
398
|
+
if verb_int:
|
|
399
|
+
if d == 0:
|
|
400
|
+
print("is not squarefree")
|
|
401
|
+
else:
|
|
402
|
+
print("is not totally real")
|
|
403
|
+
|
|
404
|
+
if verb_int == 2:
|
|
405
|
+
T.incr(f_out,verb_int,0,phc_flag)
|
|
406
|
+
else:
|
|
407
|
+
T.incr(f_out,0,0,phc_flag)
|
|
408
|
+
|
|
409
|
+
if not skip_jp:
|
|
410
|
+
if n_int == 2 and B >= 5 and ((not use_t2) or t2val <= 5):
|
|
411
|
+
jp_file.write(str([2,[-1,-1,1]]) + "\n")
|
|
412
|
+
if B >= 8 and B < 32:
|
|
413
|
+
jp_file.write(str([2,[-2,0,1]]) + "\n")
|
|
414
|
+
elif n_int == 3 and B >= 49 and ((not use_t2) or 5 >= t2val):
|
|
415
|
+
jp_file.write(str([3,[1,-2,-1,1]]) + "\n")
|
|
416
|
+
jp_file.close()
|
|
417
|
+
sig_free(f_out)
|
|
418
|
+
return
|
|
419
|
+
|
|
420
|
+
# Convert S to a sorted list of pairs [d, f]
|
|
421
|
+
# we sort only according to d
|
|
422
|
+
# because we cannot compare t_POL objects (PARI polynomials)
|
|
423
|
+
S = sorted([list(s) for s in S], key=lambda x: x[0])
|
|
424
|
+
|
|
425
|
+
# In the application of Smyth's theorem above (and easy
|
|
426
|
+
# irreducibility test), we exclude finitely many possibilities
|
|
427
|
+
# which we must now throw back in.
|
|
428
|
+
if n_int == 2 and B >= 5 and ((not use_t2) or t2val <= 5):
|
|
429
|
+
S = [[5, pari('x^2-x-1')]] + S
|
|
430
|
+
lenS += 1
|
|
431
|
+
if B >= 8 and B < 32:
|
|
432
|
+
S.insert(1, [8, pari('x^2-2')])
|
|
433
|
+
lenS += 1
|
|
434
|
+
elif n_int == 3 and B >= 49 and ((not use_t2) or 5 >= t2val):
|
|
435
|
+
S = [[49, pari('x^3-x^2-2*x+1')]] + S
|
|
436
|
+
lenS += 1
|
|
437
|
+
# The polynomials with n = 4 define imprimitive number fields.
|
|
438
|
+
|
|
439
|
+
# Now check for isomorphic fields
|
|
440
|
+
lenS = weed_fields(S, lenS)
|
|
441
|
+
|
|
442
|
+
# Output.
|
|
443
|
+
if verb_int:
|
|
444
|
+
print("=" * 80)
|
|
445
|
+
print("Polynomials tested:", counts[0])
|
|
446
|
+
print("Polynomials with sssd poldisc:", counts[1])
|
|
447
|
+
print("Irreducible polynomials:", counts[2])
|
|
448
|
+
print("Polynomials with nfdisc <= B:", counts[3])
|
|
449
|
+
for i from 0 <= i < lenS:
|
|
450
|
+
print(S[i])
|
|
451
|
+
if isinstance(verbose, str):
|
|
452
|
+
fsock.close()
|
|
453
|
+
sys.stdout = saveout
|
|
454
|
+
|
|
455
|
+
sig_free(f_out)
|
|
456
|
+
# Make sure to return elements that belong to Sage
|
|
457
|
+
if return_seqs:
|
|
458
|
+
return [[ZZ(counts[i]) for i in range(4)],
|
|
459
|
+
[[ZZ(s[0]), [QQ(x) for x in s[1].polrecip().Vec()]] for s in S]]
|
|
460
|
+
elif return_pari_objects:
|
|
461
|
+
return S
|
|
462
|
+
else:
|
|
463
|
+
Px = PolynomialRing(QQ, 'x')
|
|
464
|
+
return [[ZZ(s[0]), Px([QQ(x) for x in s[1].list()])]
|
|
465
|
+
for s in S]
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
def weed_fields(S, Py_ssize_t lenS=0):
|
|
469
|
+
r"""
|
|
470
|
+
Function used internally by the :func:`~enumerate_totallyreal_fields_prim`
|
|
471
|
+
routine. (Weeds the fields listed by ``[discriminant, polynomial]``
|
|
472
|
+
for isomorphism classes.) Returns the size of the resulting list.
|
|
473
|
+
|
|
474
|
+
EXAMPLES::
|
|
475
|
+
|
|
476
|
+
sage: from sage.rings.number_field.totallyreal import weed_fields
|
|
477
|
+
sage: ls = [[5,pari('x^2-3*x+1')],[5,pari('x^2-5')]]
|
|
478
|
+
sage: weed_fields(ls)
|
|
479
|
+
1
|
|
480
|
+
sage: ls
|
|
481
|
+
[[5, x^2 - 3*x + 1]]
|
|
482
|
+
"""
|
|
483
|
+
cdef Py_ssize_t i, j, n
|
|
484
|
+
if lenS == 0:
|
|
485
|
+
lenS = len(S)
|
|
486
|
+
i = 0
|
|
487
|
+
if not lenS:
|
|
488
|
+
return lenS
|
|
489
|
+
n = len(S[0][1])-1
|
|
490
|
+
while i < lenS-1:
|
|
491
|
+
j = i+1
|
|
492
|
+
while j < lenS and S[i][0] == S[j][0]:
|
|
493
|
+
if S[i][1].nfisisom(S[j][1]):
|
|
494
|
+
# Keep the one with a smallest T_2
|
|
495
|
+
T_2i = S[i][1][n-1]**2 - 2*S[i][1][n-2]
|
|
496
|
+
T_2j = S[j][1][n-1]**2 - 2*S[j][1][n-2]
|
|
497
|
+
if T_2i <= T_2j:
|
|
498
|
+
S.pop(j)
|
|
499
|
+
lenS -= 1
|
|
500
|
+
else:
|
|
501
|
+
t = S.pop(j)
|
|
502
|
+
S.pop(i)
|
|
503
|
+
S.insert(i, t)
|
|
504
|
+
lenS -= 1
|
|
505
|
+
else:
|
|
506
|
+
j += 1
|
|
507
|
+
i += 1
|
|
508
|
+
|
|
509
|
+
return lenS
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-pari
|
|
2
|
+
cdef double eval_seq_as_poly(int *f, int n, double x) noexcept
|
|
3
|
+
cdef double newton(int *f, int *df, int n, double x0, double eps) noexcept
|
|
4
|
+
cdef void newton_in_intervals(int *f, int *df, int n, double *beta, double eps, double *rts) noexcept
|
|
5
|
+
cpdef lagrange_degree_3(int n, int an1, int an2, int an3)
|
|
6
|
+
|
|
7
|
+
cimport sage.rings.integer
|
|
8
|
+
|
|
9
|
+
cdef int eval_seq_as_poly_int(int *f, int n, int x) noexcept
|
|
10
|
+
|
|
11
|
+
cdef int easy_is_irreducible(int *a, int n) noexcept
|
|
12
|
+
|
|
13
|
+
cdef class tr_data:
|
|
14
|
+
|
|
15
|
+
cdef int n, k
|
|
16
|
+
cdef double B
|
|
17
|
+
cdef double b_lower, b_upper, gamma
|
|
18
|
+
|
|
19
|
+
cdef int *a
|
|
20
|
+
cdef int *amax
|
|
21
|
+
cdef double *beta
|
|
22
|
+
cdef int *gnk
|
|
23
|
+
|
|
24
|
+
cdef int *df
|
|
25
|
+
|
|
26
|
+
cdef void incr(self, int *f_out, int verbose, int haltk, int phc) noexcept
|