passagemath-flint 10.6.1rc10__cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_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.
- passagemath_flint-10.6.1rc10.dist-info/METADATA +122 -0
- passagemath_flint-10.6.1rc10.dist-info/RECORD +361 -0
- passagemath_flint-10.6.1rc10.dist-info/WHEEL +6 -0
- passagemath_flint-10.6.1rc10.dist-info/top_level.txt +2 -0
- passagemath_flint.libs/libflint-aecb9cc5.so.21.0.0 +0 -0
- passagemath_flint.libs/libgf2x-a4cdec90.so.3.0.0 +0 -0
- passagemath_flint.libs/libgfortran-8f1e9814.so.5.0.0 +0 -0
- passagemath_flint.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_flint.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_flint.libs/libmpfi-e3c25853.so.0.0.0 +0 -0
- passagemath_flint.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_flint.libs/libntl-74e7d9a3.so.44.0.1 +0 -0
- passagemath_flint.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_flint.libs/libquadmath-828275a7.so.0.0.0 +0 -0
- sage/all__sagemath_flint.py +29 -0
- sage/combinat/all__sagemath_flint.py +1 -0
- sage/combinat/posets/all__sagemath_flint.py +1 -0
- sage/combinat/posets/hasse_cython_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/combinat/posets/hasse_cython_flint.pyx +194 -0
- sage/data_structures/all__sagemath_flint.py +1 -0
- sage/data_structures/bounded_integer_sequences.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/data_structures/bounded_integer_sequences.pxd +62 -0
- sage/data_structures/bounded_integer_sequences.pyx +1418 -0
- sage/graphs/all__sagemath_flint.py +1 -0
- sage/graphs/chrompoly.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/graphs/chrompoly.pyx +555 -0
- sage/graphs/matchpoly.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/graphs/matchpoly.pyx +412 -0
- sage/libs/all__sagemath_flint.py +17 -0
- sage/libs/arb/__init__.py +1 -0
- sage/libs/arb/acb.pxd +154 -0
- sage/libs/arb/acb_calc.pxd +9 -0
- sage/libs/arb/acb_elliptic.pxd +25 -0
- sage/libs/arb/acb_hypgeom.pxd +74 -0
- sage/libs/arb/acb_mat.pxd +62 -0
- sage/libs/arb/acb_modular.pxd +17 -0
- sage/libs/arb/acb_poly.pxd +216 -0
- sage/libs/arb/arb.pxd +240 -0
- sage/libs/arb/arb_fmpz_poly.pxd +21 -0
- sage/libs/arb/arb_hypgeom.pxd +83 -0
- sage/libs/arb/arb_wrap.h +34 -0
- sage/libs/arb/arf.pxd +131 -0
- sage/libs/arb/arith.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/arb/arith.pyx +87 -0
- sage/libs/arb/bernoulli.pxd +6 -0
- sage/libs/arb/mag.pxd +77 -0
- sage/libs/arb/types.pxd +37 -0
- sage/libs/flint/__init__.py +1 -0
- sage/libs/flint/acb.pxd +270 -0
- sage/libs/flint/acb_calc.pxd +22 -0
- sage/libs/flint/acb_dft.pxd +51 -0
- sage/libs/flint/acb_dirichlet.pxd +112 -0
- sage/libs/flint/acb_elliptic.pxd +42 -0
- sage/libs/flint/acb_hypgeom.pxd +169 -0
- sage/libs/flint/acb_macros.pxd +9 -0
- sage/libs/flint/acb_mat.pxd +136 -0
- sage/libs/flint/acb_mat_macros.pxd +10 -0
- sage/libs/flint/acb_modular.pxd +62 -0
- sage/libs/flint/acb_poly.pxd +251 -0
- sage/libs/flint/acb_poly_macros.pxd +8 -0
- sage/libs/flint/acb_theta.pxd +124 -0
- sage/libs/flint/acf.pxd +32 -0
- sage/libs/flint/aprcl.pxd +84 -0
- sage/libs/flint/arb.pxd +382 -0
- sage/libs/flint/arb_calc.pxd +31 -0
- sage/libs/flint/arb_fmpz_poly.pxd +34 -0
- sage/libs/flint/arb_fpwrap.pxd +215 -0
- sage/libs/flint/arb_hypgeom.pxd +147 -0
- sage/libs/flint/arb_macros.pxd +9 -0
- sage/libs/flint/arb_mat.pxd +140 -0
- sage/libs/flint/arb_mat_macros.pxd +10 -0
- sage/libs/flint/arb_poly.pxd +237 -0
- sage/libs/flint/arf.pxd +167 -0
- sage/libs/flint/arith.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/arith.pxd +76 -0
- sage/libs/flint/arith.pyx +77 -0
- sage/libs/flint/arith_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/arith_sage.pyx +308 -0
- sage/libs/flint/bernoulli.pxd +28 -0
- sage/libs/flint/bool_mat.pxd +52 -0
- sage/libs/flint/ca.pxd +203 -0
- sage/libs/flint/ca_ext.pxd +34 -0
- sage/libs/flint/ca_field.pxd +32 -0
- sage/libs/flint/ca_mat.pxd +117 -0
- sage/libs/flint/ca_poly.pxd +104 -0
- sage/libs/flint/ca_vec.pxd +46 -0
- sage/libs/flint/calcium.pxd +27 -0
- sage/libs/flint/d_mat.pxd +39 -0
- sage/libs/flint/d_vec.pxd +32 -0
- sage/libs/flint/dirichlet.pxd +57 -0
- sage/libs/flint/dlog.pxd +53 -0
- sage/libs/flint/double_extras.pxd +24 -0
- sage/libs/flint/double_interval.pxd +36 -0
- sage/libs/flint/fexpr.pxd +104 -0
- sage/libs/flint/fexpr_builtin.pxd +20 -0
- sage/libs/flint/fft.pxd +66 -0
- sage/libs/flint/flint.pxd +36 -0
- sage/libs/flint/flint_ntl_wrap.h +35 -0
- sage/libs/flint/flint_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/flint_sage.pyx +163 -0
- sage/libs/flint/flint_wrap.h +190 -0
- sage/libs/flint/fmpq.pxd +137 -0
- sage/libs/flint/fmpq_mat.pxd +105 -0
- sage/libs/flint/fmpq_mat_macros.pxd +10 -0
- sage/libs/flint/fmpq_mpoly.pxd +165 -0
- sage/libs/flint/fmpq_mpoly_factor.pxd +30 -0
- sage/libs/flint/fmpq_poly.pxd +241 -0
- sage/libs/flint/fmpq_poly_macros.pxd +9 -0
- sage/libs/flint/fmpq_poly_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpq_poly_sage.pxd +31 -0
- sage/libs/flint/fmpq_poly_sage.pyx +48 -0
- sage/libs/flint/fmpq_vec.pxd +27 -0
- sage/libs/flint/fmpz.pxd +256 -0
- sage/libs/flint/fmpz_extras.pxd +32 -0
- sage/libs/flint/fmpz_factor.pxd +42 -0
- sage/libs/flint/fmpz_factor_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpz_factor_sage.pxd +4 -0
- sage/libs/flint/fmpz_factor_sage.pyx +29 -0
- sage/libs/flint/fmpz_lll.pxd +49 -0
- sage/libs/flint/fmpz_macros.pxd +8 -0
- sage/libs/flint/fmpz_mat.pxd +184 -0
- sage/libs/flint/fmpz_mat_macros.pxd +10 -0
- sage/libs/flint/fmpz_mod.pxd +46 -0
- sage/libs/flint/fmpz_mod_mat.pxd +71 -0
- sage/libs/flint/fmpz_mod_mpoly.pxd +161 -0
- sage/libs/flint/fmpz_mod_mpoly_factor.pxd +28 -0
- sage/libs/flint/fmpz_mod_poly.pxd +249 -0
- sage/libs/flint/fmpz_mod_poly_factor.pxd +46 -0
- sage/libs/flint/fmpz_mod_vec.pxd +27 -0
- sage/libs/flint/fmpz_mpoly.pxd +224 -0
- sage/libs/flint/fmpz_mpoly_factor.pxd +29 -0
- sage/libs/flint/fmpz_mpoly_q.pxd +57 -0
- sage/libs/flint/fmpz_poly.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpz_poly.pxd +407 -0
- sage/libs/flint/fmpz_poly.pyx +19 -0
- sage/libs/flint/fmpz_poly_factor.pxd +33 -0
- sage/libs/flint/fmpz_poly_macros.pxd +8 -0
- sage/libs/flint/fmpz_poly_mat.pxd +71 -0
- sage/libs/flint/fmpz_poly_q.pxd +55 -0
- sage/libs/flint/fmpz_poly_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpz_poly_sage.pxd +20 -0
- sage/libs/flint/fmpz_poly_sage.pyx +500 -0
- sage/libs/flint/fmpz_vec.pxd +80 -0
- sage/libs/flint/fmpzi.pxd +52 -0
- sage/libs/flint/fq.pxd +97 -0
- sage/libs/flint/fq_default.pxd +84 -0
- sage/libs/flint/fq_default_mat.pxd +70 -0
- sage/libs/flint/fq_default_poly.pxd +97 -0
- sage/libs/flint/fq_default_poly_factor.pxd +39 -0
- sage/libs/flint/fq_embed.pxd +28 -0
- sage/libs/flint/fq_mat.pxd +83 -0
- sage/libs/flint/fq_nmod.pxd +95 -0
- sage/libs/flint/fq_nmod_embed.pxd +28 -0
- sage/libs/flint/fq_nmod_mat.pxd +83 -0
- sage/libs/flint/fq_nmod_mpoly.pxd +130 -0
- sage/libs/flint/fq_nmod_mpoly_factor.pxd +28 -0
- sage/libs/flint/fq_nmod_poly.pxd +202 -0
- sage/libs/flint/fq_nmod_poly_factor.pxd +47 -0
- sage/libs/flint/fq_nmod_vec.pxd +33 -0
- sage/libs/flint/fq_poly.pxd +204 -0
- sage/libs/flint/fq_poly_factor.pxd +47 -0
- sage/libs/flint/fq_vec.pxd +33 -0
- sage/libs/flint/fq_zech.pxd +99 -0
- sage/libs/flint/fq_zech_embed.pxd +28 -0
- sage/libs/flint/fq_zech_mat.pxd +78 -0
- sage/libs/flint/fq_zech_poly.pxd +198 -0
- sage/libs/flint/fq_zech_poly_factor.pxd +47 -0
- sage/libs/flint/fq_zech_vec.pxd +33 -0
- sage/libs/flint/gr.pxd +174 -0
- sage/libs/flint/gr_generic.pxd +215 -0
- sage/libs/flint/gr_mat.pxd +161 -0
- sage/libs/flint/gr_mpoly.pxd +68 -0
- sage/libs/flint/gr_poly.pxd +276 -0
- sage/libs/flint/gr_special.pxd +237 -0
- sage/libs/flint/gr_vec.pxd +120 -0
- sage/libs/flint/hypgeom.pxd +24 -0
- sage/libs/flint/long_extras.pxd +23 -0
- sage/libs/flint/mag.pxd +131 -0
- sage/libs/flint/mag_macros.pxd +8 -0
- sage/libs/flint/mpf_mat.pxd +36 -0
- sage/libs/flint/mpf_vec.pxd +34 -0
- sage/libs/flint/mpfr_mat.pxd +27 -0
- sage/libs/flint/mpfr_vec.pxd +25 -0
- sage/libs/flint/mpn_extras.pxd +41 -0
- sage/libs/flint/mpoly.pxd +72 -0
- sage/libs/flint/nf.pxd +19 -0
- sage/libs/flint/nf_elem.pxd +74 -0
- sage/libs/flint/nmod.pxd +35 -0
- sage/libs/flint/nmod_mat.pxd +104 -0
- sage/libs/flint/nmod_mpoly.pxd +144 -0
- sage/libs/flint/nmod_mpoly_factor.pxd +28 -0
- sage/libs/flint/nmod_poly.pxd +339 -0
- sage/libs/flint/nmod_poly_factor.pxd +44 -0
- sage/libs/flint/nmod_poly_linkage.pxi +710 -0
- sage/libs/flint/nmod_poly_mat.pxd +76 -0
- sage/libs/flint/nmod_vec.pxd +40 -0
- sage/libs/flint/ntl_interface.pxd +17 -0
- sage/libs/flint/padic.pxd +93 -0
- sage/libs/flint/padic_mat.pxd +64 -0
- sage/libs/flint/padic_poly.pxd +88 -0
- sage/libs/flint/partitions.pxd +23 -0
- sage/libs/flint/perm.pxd +26 -0
- sage/libs/flint/profiler.pxd +24 -0
- sage/libs/flint/qadic.pxd +77 -0
- sage/libs/flint/qfb.pxd +44 -0
- sage/libs/flint/qqbar.pxd +172 -0
- sage/libs/flint/qsieve.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/qsieve.pxd +41 -0
- sage/libs/flint/qsieve.pyx +21 -0
- sage/libs/flint/qsieve_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/qsieve_sage.pyx +67 -0
- sage/libs/flint/thread_pool.pxd +25 -0
- sage/libs/flint/types.pxd +2076 -0
- sage/libs/flint/ulong_extras.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/ulong_extras.pxd +141 -0
- sage/libs/flint/ulong_extras.pyx +21 -0
- sage/libs/flint/ulong_extras_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/ulong_extras_sage.pyx +21 -0
- sage/matrix/all__sagemath_flint.py +1 -0
- sage/matrix/change_ring.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/change_ring.pyx +43 -0
- sage/matrix/matrix_complex_ball_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_ball_dense.pxd +14 -0
- sage/matrix/matrix_complex_ball_dense.pyx +973 -0
- sage/matrix/matrix_cyclo_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_cyclo_dense.pxd +16 -0
- sage/matrix/matrix_cyclo_dense.pyx +1761 -0
- sage/matrix/matrix_integer_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_integer_dense.pxd +32 -0
- sage/matrix/matrix_integer_dense.pyx +5801 -0
- sage/matrix/matrix_integer_dense_hnf.py +1294 -0
- sage/matrix/matrix_integer_dense_saturation.py +346 -0
- sage/matrix/matrix_integer_sparse.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_integer_sparse.pxd +9 -0
- sage/matrix/matrix_integer_sparse.pyx +1090 -0
- sage/matrix/matrix_rational_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_rational_dense.pxd +23 -0
- sage/matrix/matrix_rational_dense.pyx +2995 -0
- sage/matrix/matrix_rational_sparse.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_rational_sparse.pxd +11 -0
- sage/matrix/matrix_rational_sparse.pyx +789 -0
- sage/matrix/misc_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/misc_flint.pyx +109 -0
- sage/modular/all__sagemath_flint.py +1 -0
- sage/modular/modform/all__sagemath_flint.py +1 -0
- sage/modular/modform/eis_series_cython.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/modform/eis_series_cython.pyx +226 -0
- sage/modular/modsym/all__sagemath_flint.py +1 -0
- sage/modular/modsym/apply.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/modsym/apply.pxd +6 -0
- sage/modular/modsym/apply.pyx +113 -0
- sage/modular/modsym/heilbronn.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/modsym/heilbronn.pyx +966 -0
- sage/modular/pollack_stevens/all__sagemath_flint.py +1 -0
- sage/modular/pollack_stevens/dist.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/pollack_stevens/dist.pxd +38 -0
- sage/modular/pollack_stevens/dist.pyx +1439 -0
- sage/quivers/algebra.py +691 -0
- sage/quivers/algebra_elements.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/quivers/algebra_elements.pxd +97 -0
- sage/quivers/algebra_elements.pxi +1324 -0
- sage/quivers/algebra_elements.pyx +1424 -0
- sage/quivers/all.py +1 -0
- sage/quivers/ar_quiver.py +917 -0
- sage/quivers/homspace.py +640 -0
- sage/quivers/morphism.py +1282 -0
- sage/quivers/path_semigroup.py +1155 -0
- sage/quivers/paths.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/quivers/paths.pxd +13 -0
- sage/quivers/paths.pyx +809 -0
- sage/quivers/representation.py +2975 -0
- sage/rings/all__sagemath_flint.py +37 -0
- sage/rings/cif.py +4 -0
- sage/rings/complex_arb.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_arb.pxd +29 -0
- sage/rings/complex_arb.pyx +5176 -0
- sage/rings/complex_interval.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_interval.pxd +30 -0
- sage/rings/complex_interval.pyx +2475 -0
- sage/rings/complex_interval_field.py +711 -0
- sage/rings/convert/all.py +1 -0
- sage/rings/convert/mpfi.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/convert/mpfi.pxd +6 -0
- sage/rings/convert/mpfi.pyx +576 -0
- sage/rings/factorint_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/factorint_flint.pyx +99 -0
- sage/rings/fraction_field_FpT.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/fraction_field_FpT.pxd +28 -0
- sage/rings/fraction_field_FpT.pyx +2043 -0
- sage/rings/imaginary_unit.py +5 -0
- sage/rings/monomials.py +73 -0
- sage/rings/number_field/S_unit_solver.py +2870 -0
- sage/rings/number_field/all__sagemath_flint.py +7 -0
- sage/rings/number_field/bdd_height.py +664 -0
- sage/rings/number_field/class_group.py +762 -0
- sage/rings/number_field/galois_group.py +1307 -0
- sage/rings/number_field/homset.py +612 -0
- sage/rings/number_field/maps.py +687 -0
- sage/rings/number_field/morphism.py +272 -0
- sage/rings/number_field/number_field.py +12820 -0
- sage/rings/number_field/number_field_element.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/number_field/number_field_element.pxd +59 -0
- sage/rings/number_field/number_field_element.pyx +5735 -0
- sage/rings/number_field/number_field_element_quadratic.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/number_field/number_field_element_quadratic.pxd +34 -0
- sage/rings/number_field/number_field_element_quadratic.pyx +3185 -0
- sage/rings/number_field/number_field_ideal_rel.py +925 -0
- sage/rings/number_field/number_field_morphisms.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/number_field/number_field_morphisms.pyx +781 -0
- sage/rings/number_field/number_field_rel.py +2734 -0
- sage/rings/number_field/order.py +2981 -0
- sage/rings/number_field/order_ideal.py +804 -0
- sage/rings/number_field/selmer_group.py +715 -0
- sage/rings/number_field/small_primes_of_degree_one.py +242 -0
- sage/rings/number_field/splitting_field.py +606 -0
- sage/rings/number_field/structure.py +380 -0
- sage/rings/number_field/unit_group.py +721 -0
- sage/rings/padics/all__sagemath_flint.py +3 -0
- sage/rings/polynomial/all__sagemath_flint.py +1 -0
- sage/rings/polynomial/complex_roots.py +312 -0
- sage/rings/polynomial/evaluation_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/evaluation_flint.pxd +7 -0
- sage/rings/polynomial/evaluation_flint.pyx +68 -0
- sage/rings/polynomial/hilbert.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/hilbert.pyx +602 -0
- sage/rings/polynomial/polynomial_complex_arb.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_complex_arb.pxd +7 -0
- sage/rings/polynomial/polynomial_complex_arb.pyx +963 -0
- sage/rings/polynomial/polynomial_integer_dense_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_integer_dense_flint.pxd +13 -0
- sage/rings/polynomial/polynomial_integer_dense_flint.pyx +1881 -0
- sage/rings/polynomial/polynomial_number_field.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_number_field.pyx +345 -0
- sage/rings/polynomial/polynomial_rational_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_rational_flint.pxd +20 -0
- sage/rings/polynomial/polynomial_rational_flint.pyx +2598 -0
- sage/rings/polynomial/polynomial_zmod_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_zmod_flint.pxd +20 -0
- sage/rings/polynomial/polynomial_zmod_flint.pyx +1063 -0
- sage/rings/polynomial/real_roots.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/real_roots.pxd +81 -0
- sage/rings/polynomial/real_roots.pyx +4704 -0
- sage/rings/polynomial/refine_root.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/refine_root.pyx +142 -0
- sage/rings/polynomial/weil/all.py +4 -0
- sage/rings/polynomial/weil/power_sums.h +46 -0
- sage/rings/polynomial/weil/weil_polynomials.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/weil/weil_polynomials.pyx +596 -0
- sage/rings/qqbar.py +9025 -0
- sage/rings/real_arb.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/real_arb.pxd +21 -0
- sage/rings/real_arb.pyx +4065 -0
- sage/rings/real_interval_absolute.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/real_interval_absolute.pyx +1073 -0
- sage/rings/real_mpfi.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/real_mpfi.pyx +5428 -0
- sage/schemes/all__sagemath_flint.py +1 -0
- sage/schemes/elliptic_curves/all__sagemath_flint.py +1 -0
- sage/schemes/elliptic_curves/descent_two_isogeny.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/schemes/elliptic_curves/descent_two_isogeny.pyx +1387 -0
- sage/schemes/elliptic_curves/descent_two_isogeny_pari.pxd +5 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
# sage_setup: distribution = sagemath-flint
|
2
|
+
|
3
|
+
from sage.rings.number_field.number_field import (NumberField, NumberFieldTower, CyclotomicField, QuadraticField,
|
4
|
+
is_fundamental_discriminant, is_real_place)
|
5
|
+
from sage.rings.number_field.number_field_element import NumberFieldElement
|
6
|
+
|
7
|
+
from sage.rings.number_field.order import EquationOrder, GaussianIntegers, EisensteinIntegers
|
@@ -0,0 +1,664 @@
|
|
1
|
+
# sage_setup: distribution = sagemath-flint
|
2
|
+
# sage.doctest: needs sage.geometry.polyhedron
|
3
|
+
r"""
|
4
|
+
Elements of bounded height in number fields
|
5
|
+
|
6
|
+
This module provides functions to list all elements of a given number field
|
7
|
+
with height less than a specified bound.
|
8
|
+
|
9
|
+
REFERENCES:
|
10
|
+
|
11
|
+
- [DK2013]_
|
12
|
+
|
13
|
+
AUTHORS:
|
14
|
+
|
15
|
+
- John Doyle, David Krumm (2013): initial version
|
16
|
+
- TJ Combs, Raghukul Raman (2018): added Doyle-Krumm algorithm-4
|
17
|
+
"""
|
18
|
+
# ****************************************************************************
|
19
|
+
# Copyright (C) 2013 John Doyle and David Krumm
|
20
|
+
#
|
21
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
22
|
+
# as published by the Free Software Foundation; either version 2 of
|
23
|
+
# the License, or (at your option) any later version.
|
24
|
+
# https://www.gnu.org/licenses/
|
25
|
+
# ****************************************************************************
|
26
|
+
|
27
|
+
from copy import copy
|
28
|
+
from itertools import product
|
29
|
+
from sage.rings.real_mpfr import RealField
|
30
|
+
from sage.rings.number_field.unit_group import UnitGroup
|
31
|
+
from sage.modules.free_module_element import vector
|
32
|
+
from sage.matrix.constructor import column_matrix
|
33
|
+
from sage.rings.rational_field import QQ
|
34
|
+
from sage.rings.infinity import Infinity
|
35
|
+
from sage.rings.real_mpfr import RR
|
36
|
+
from sage.geometry.polyhedron.constructor import Polyhedron
|
37
|
+
|
38
|
+
|
39
|
+
def bdd_norm_pr_gens_iq(K, norm_list):
|
40
|
+
r"""
|
41
|
+
Compute generators for all principal ideals in an imaginary quadratic field
|
42
|
+
`K` whose norms are in ``norm_list``.
|
43
|
+
|
44
|
+
The only keys for the output dictionary are integers n appearing in
|
45
|
+
``norm_list``.
|
46
|
+
|
47
|
+
The function will only be called with `K` an imaginary quadratic field.
|
48
|
+
|
49
|
+
The function will return a dictionary for other number fields, but it may be
|
50
|
+
incorrect.
|
51
|
+
|
52
|
+
INPUT:
|
53
|
+
|
54
|
+
- ``K`` -- an imaginary quadratic number field
|
55
|
+
|
56
|
+
- ``norm_list`` -- list of positive integers
|
57
|
+
|
58
|
+
OUTPUT: dictionary of number field elements, keyed by norm
|
59
|
+
|
60
|
+
EXAMPLES:
|
61
|
+
|
62
|
+
In `QQ(i)`, there is one principal ideal of norm 4, two principal ideals of
|
63
|
+
norm 5, but no principal ideals of norm 7::
|
64
|
+
|
65
|
+
sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_gens_iq
|
66
|
+
sage: x = polygen(ZZ, 'x')
|
67
|
+
sage: K.<g> = NumberField(x^2 + 1)
|
68
|
+
sage: L = range(10)
|
69
|
+
sage: bdd_pr_ideals = bdd_norm_pr_gens_iq(K, L)
|
70
|
+
sage: bdd_pr_ideals[4]
|
71
|
+
[2]
|
72
|
+
sage: bdd_pr_ideals[5]
|
73
|
+
[-g - 2, -g + 2]
|
74
|
+
sage: bdd_pr_ideals[7]
|
75
|
+
[]
|
76
|
+
|
77
|
+
There are no ideals in the ring of integers with negative norm::
|
78
|
+
|
79
|
+
sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_gens_iq
|
80
|
+
sage: K.<g> = NumberField(x^2 + 10)
|
81
|
+
sage: L = range(-5,-1)
|
82
|
+
sage: bdd_pr_ideals = bdd_norm_pr_gens_iq(K,L)
|
83
|
+
sage: bdd_pr_ideals
|
84
|
+
{-5: [], -4: [], -3: [], -2: []}
|
85
|
+
|
86
|
+
Calling a key that is not in the input ``norm_list`` raises a KeyError::
|
87
|
+
|
88
|
+
sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_gens_iq
|
89
|
+
sage: K.<g> = NumberField(x^2 + 20)
|
90
|
+
sage: L = range(100)
|
91
|
+
sage: bdd_pr_ideals = bdd_norm_pr_gens_iq(K, L)
|
92
|
+
sage: bdd_pr_ideals[100]
|
93
|
+
Traceback (most recent call last):
|
94
|
+
...
|
95
|
+
KeyError: 100
|
96
|
+
"""
|
97
|
+
return {n: K.elements_of_norm(n) for n in norm_list}
|
98
|
+
|
99
|
+
|
100
|
+
def bdd_height_iq(K, height_bound):
|
101
|
+
r"""
|
102
|
+
Compute all elements in the imaginary quadratic field `K` which have
|
103
|
+
relative multiplicative height at most ``height_bound``.
|
104
|
+
|
105
|
+
The function will only be called with `K` an imaginary quadratic field.
|
106
|
+
|
107
|
+
If called with `K` not an imaginary quadratic, the function will likely
|
108
|
+
yield incorrect output.
|
109
|
+
|
110
|
+
ALGORITHM:
|
111
|
+
|
112
|
+
This is an implementation of Algorithm 5 in [DK2013]_.
|
113
|
+
|
114
|
+
INPUT:
|
115
|
+
|
116
|
+
- ``K`` -- an imaginary quadratic number field
|
117
|
+
|
118
|
+
- ``height_bound`` -- a real number
|
119
|
+
|
120
|
+
OUTPUT: an iterator of number field elements
|
121
|
+
|
122
|
+
EXAMPLES::
|
123
|
+
|
124
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height_iq
|
125
|
+
sage: x = polygen(ZZ, 'x')
|
126
|
+
sage: K.<a> = NumberField(x^2 + 191)
|
127
|
+
sage: for t in bdd_height_iq(K,8):
|
128
|
+
....: print(exp(2*t.global_height()))
|
129
|
+
1.00000000000000
|
130
|
+
1.00000000000000
|
131
|
+
1.00000000000000
|
132
|
+
4.00000000000000
|
133
|
+
4.00000000000000
|
134
|
+
4.00000000000000
|
135
|
+
4.00000000000000
|
136
|
+
8.00000000000000
|
137
|
+
8.00000000000000
|
138
|
+
8.00000000000000
|
139
|
+
8.00000000000000
|
140
|
+
8.00000000000000
|
141
|
+
8.00000000000000
|
142
|
+
8.00000000000000
|
143
|
+
8.00000000000000
|
144
|
+
|
145
|
+
There are 175 elements of height at most 10 in `QQ(\sqrt(-3))`::
|
146
|
+
|
147
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height_iq
|
148
|
+
sage: K.<a> = NumberField(x^2 + 3)
|
149
|
+
sage: len(list(bdd_height_iq(K,10)))
|
150
|
+
175
|
151
|
+
|
152
|
+
The only elements of multiplicative height 1 in a number field are 0 and
|
153
|
+
the roots of unity::
|
154
|
+
|
155
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height_iq
|
156
|
+
sage: K.<a> = NumberField(x^2 + x + 1)
|
157
|
+
sage: list(bdd_height_iq(K,1))
|
158
|
+
[0, a + 1, a, -1, -a - 1, -a, 1]
|
159
|
+
|
160
|
+
A number field has no elements of multiplicative height less than 1::
|
161
|
+
|
162
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height_iq
|
163
|
+
sage: K.<a> = NumberField(x^2 + 5)
|
164
|
+
sage: list(bdd_height_iq(K,0.9))
|
165
|
+
[]
|
166
|
+
"""
|
167
|
+
if height_bound < 1:
|
168
|
+
return
|
169
|
+
yield K(0)
|
170
|
+
roots_of_unity = K.roots_of_unity()
|
171
|
+
for zeta in roots_of_unity:
|
172
|
+
yield zeta
|
173
|
+
|
174
|
+
# Get a complete set of ideal class representatives
|
175
|
+
class_group_reps = []
|
176
|
+
class_group_rep_norms = []
|
177
|
+
for c in K.class_group():
|
178
|
+
a = c.ideal()
|
179
|
+
class_group_reps.append(a)
|
180
|
+
class_group_rep_norms.append(a.norm())
|
181
|
+
class_number = len(class_group_reps)
|
182
|
+
|
183
|
+
# Find principal ideals of bounded norm
|
184
|
+
possible_norm_set = set()
|
185
|
+
for n in range(class_number):
|
186
|
+
for m in range(1, int(height_bound + 1)):
|
187
|
+
possible_norm_set.add(m * class_group_rep_norms[n])
|
188
|
+
bdd_ideals = bdd_norm_pr_gens_iq(K, possible_norm_set)
|
189
|
+
|
190
|
+
# Distribute the principal ideals
|
191
|
+
generator_lists = []
|
192
|
+
for n in range(class_number):
|
193
|
+
this_ideal = class_group_reps[n]
|
194
|
+
this_ideal_norm = class_group_rep_norms[n]
|
195
|
+
gens = [g for i in range(1, int(height_bound + 1))
|
196
|
+
for g in bdd_ideals[i * this_ideal_norm] if g in this_ideal]
|
197
|
+
generator_lists.append(gens)
|
198
|
+
|
199
|
+
# Build all the output numbers
|
200
|
+
for n in range(class_number):
|
201
|
+
gens = generator_lists[n]
|
202
|
+
s = len(gens)
|
203
|
+
for i in range(s):
|
204
|
+
for j in range(i + 1, s):
|
205
|
+
if K.ideal(gens[i], gens[j]) == class_group_reps[n]:
|
206
|
+
new_number = gens[i] / gens[j]
|
207
|
+
for zeta in roots_of_unity:
|
208
|
+
yield zeta * new_number
|
209
|
+
yield zeta / new_number
|
210
|
+
|
211
|
+
|
212
|
+
def bdd_norm_pr_ideal_gens(K, norm_list):
|
213
|
+
r"""
|
214
|
+
Compute generators for all principal ideals in a number field `K` whose
|
215
|
+
norms are in ``norm_list``.
|
216
|
+
|
217
|
+
INPUT:
|
218
|
+
|
219
|
+
- ``K`` -- a number field
|
220
|
+
|
221
|
+
- ``norm_list`` -- list of positive integers
|
222
|
+
|
223
|
+
OUTPUT: dictionary of number field elements, keyed by norm
|
224
|
+
|
225
|
+
EXAMPLES:
|
226
|
+
|
227
|
+
There is only one principal ideal of norm 1, and it is generated by the
|
228
|
+
element 1::
|
229
|
+
|
230
|
+
sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_ideal_gens
|
231
|
+
sage: K.<g> = QuadraticField(101)
|
232
|
+
sage: bdd_norm_pr_ideal_gens(K, [1])
|
233
|
+
{1: [1]}
|
234
|
+
|
235
|
+
::
|
236
|
+
|
237
|
+
sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_ideal_gens
|
238
|
+
sage: K.<g> = QuadraticField(123)
|
239
|
+
sage: bdd_norm_pr_ideal_gens(K, range(5))
|
240
|
+
{0: [0], 1: [1], 2: [g + 11], 3: [], 4: [2]} # 64-bit
|
241
|
+
{0: [0], 1: [1], 2: [g - 11], 3: [], 4: [2]} # 32-bit
|
242
|
+
|
243
|
+
::
|
244
|
+
|
245
|
+
sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_ideal_gens
|
246
|
+
sage: x = polygen(ZZ, 'x')
|
247
|
+
sage: K.<g> = NumberField(x^5 - x + 19)
|
248
|
+
sage: b = bdd_norm_pr_ideal_gens(K, range(30))
|
249
|
+
sage: key = ZZ(28)
|
250
|
+
sage: b[key]
|
251
|
+
[157*g^4 - 139*g^3 - 369*g^2 + 848*g + 158, g^4 + g^3 - g - 7]
|
252
|
+
"""
|
253
|
+
negative_norm_units = K.elements_of_norm(-1)
|
254
|
+
gens = {}
|
255
|
+
if not negative_norm_units:
|
256
|
+
for n in norm_list:
|
257
|
+
if not n:
|
258
|
+
gens[n] = [K.zero()]
|
259
|
+
else:
|
260
|
+
gens[n] = K.elements_of_norm(n) + K.elements_of_norm(-n)
|
261
|
+
else:
|
262
|
+
for n in norm_list:
|
263
|
+
gens[n] = K.elements_of_norm(n)
|
264
|
+
return gens
|
265
|
+
|
266
|
+
|
267
|
+
def integer_points_in_polytope(matrix, interval_radius):
|
268
|
+
r"""
|
269
|
+
Return the set of integer points in the polytope obtained by acting on a
|
270
|
+
cube by a linear transformation.
|
271
|
+
|
272
|
+
Given an `r`-by-`r` matrix ``matrix`` and a real number ``interval_radius``,
|
273
|
+
this function finds all integer lattice points in the polytope obtained by
|
274
|
+
transforming the cube ``[-interval_radius, interval_radius]^r`` via the linear
|
275
|
+
map induced by ``matrix``.
|
276
|
+
|
277
|
+
INPUT:
|
278
|
+
|
279
|
+
- ``matrix`` -- a square matrix of real numbers
|
280
|
+
|
281
|
+
- ``interval_radius`` -- a real number
|
282
|
+
|
283
|
+
OUTPUT: list of tuples of integers
|
284
|
+
|
285
|
+
EXAMPLES:
|
286
|
+
|
287
|
+
Stretch the interval `[-1,1]` by a factor of 2 and find the integers in the
|
288
|
+
resulting interval::
|
289
|
+
|
290
|
+
sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
|
291
|
+
sage: m = matrix([2])
|
292
|
+
sage: r = 1
|
293
|
+
sage: integer_points_in_polytope(m, r)
|
294
|
+
[(-2), (-1), (0), (1), (2)]
|
295
|
+
|
296
|
+
Integer points inside a parallelogram::
|
297
|
+
|
298
|
+
sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
|
299
|
+
sage: m = matrix([[1, 2], [3, 4]])
|
300
|
+
sage: r = RealField()(1.3)
|
301
|
+
sage: integer_points_in_polytope(m, r)
|
302
|
+
[(-3, -7), (-2, -5), (-2, -4), (-1, -3), (-1, -2), (-1, -1), (0, -1),
|
303
|
+
(0, 0), (0, 1), (1, 1), (1, 2), (1, 3), (2, 4), (2, 5), (3, 7)]
|
304
|
+
|
305
|
+
Integer points inside a parallelepiped::
|
306
|
+
|
307
|
+
sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
|
308
|
+
sage: m = matrix([[1.2,3.7,0.2], [-5.3,-.43,3], [1.2,4.7,-2.1]])
|
309
|
+
sage: r = 2.2
|
310
|
+
sage: L = integer_points_in_polytope(m, r)
|
311
|
+
sage: len(L)
|
312
|
+
4143
|
313
|
+
|
314
|
+
If ``interval_radius`` is 0, the output should include only the zero tuple::
|
315
|
+
|
316
|
+
sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
|
317
|
+
sage: m = matrix([[1,2,3,7], [4,5,6,2], [7,8,9,3], [0,3,4,5]])
|
318
|
+
sage: integer_points_in_polytope(m, 0)
|
319
|
+
[(0, 0, 0, 0)]
|
320
|
+
"""
|
321
|
+
T = matrix
|
322
|
+
d = interval_radius
|
323
|
+
r = T.nrows()
|
324
|
+
|
325
|
+
# Find the vertices of the given box
|
326
|
+
box_vertices = [vector(x) for x in product([-d, d], repeat=r)]
|
327
|
+
|
328
|
+
# Transform the vertices
|
329
|
+
T_trans = T.transpose()
|
330
|
+
transformed_vertices = [v * T_trans for v in box_vertices]
|
331
|
+
|
332
|
+
# Create polyhedron from transformed vertices and find integer points inside
|
333
|
+
return list(Polyhedron(transformed_vertices, base_ring=QQ).integral_points())
|
334
|
+
|
335
|
+
|
336
|
+
def bdd_height(K, height_bound, tolerance=1e-2, precision=53):
|
337
|
+
r"""
|
338
|
+
Compute all elements in the number field `K` which have relative
|
339
|
+
multiplicative height at most ``height_bound``.
|
340
|
+
|
341
|
+
The function can only be called for number fields `K` with positive unit
|
342
|
+
rank. An error will occur if `K` is `\QQ` or an imaginary quadratic field.
|
343
|
+
|
344
|
+
This algorithm computes 2 lists: `L`, containing elements `x` in `K` such that
|
345
|
+
`H_k(x) \leq B`, and a list `L'` containing elements `x` in `K` that, due to
|
346
|
+
floating point issues,
|
347
|
+
may be slightly larger then the bound. This can be controlled
|
348
|
+
by lowering the tolerance.
|
349
|
+
|
350
|
+
In current implementation both lists `(L,L')` are merged and returned in
|
351
|
+
form of iterator.
|
352
|
+
|
353
|
+
ALGORITHM:
|
354
|
+
|
355
|
+
This is an implementation of the revised algorithm (Algorithm 4) in
|
356
|
+
[DK2013]_.
|
357
|
+
|
358
|
+
INPUT:
|
359
|
+
|
360
|
+
- ``height_bound`` -- real number
|
361
|
+
|
362
|
+
- ``tolerance`` -- (default: 0.01) a rational number in (0,1]
|
363
|
+
|
364
|
+
- ``precision`` -- (default: 53) positive integer
|
365
|
+
|
366
|
+
OUTPUT: an iterator of number field elements
|
367
|
+
|
368
|
+
EXAMPLES:
|
369
|
+
|
370
|
+
There are no elements of negative height::
|
371
|
+
|
372
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height
|
373
|
+
sage: x = polygen(ZZ, 'x')
|
374
|
+
sage: K.<g> = NumberField(x^5 - x + 7)
|
375
|
+
sage: list(bdd_height(K, -3))
|
376
|
+
[]
|
377
|
+
|
378
|
+
The only nonzero elements of height 1 are the roots of unity::
|
379
|
+
|
380
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height
|
381
|
+
sage: K.<g> = QuadraticField(3)
|
382
|
+
sage: list(bdd_height(K, 1))
|
383
|
+
[0, -1, 1]
|
384
|
+
|
385
|
+
::
|
386
|
+
|
387
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height
|
388
|
+
sage: K.<g> = QuadraticField(36865)
|
389
|
+
sage: len(list(bdd_height(K, 101))) # long time (4 s)
|
390
|
+
131
|
391
|
+
|
392
|
+
::
|
393
|
+
|
394
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height
|
395
|
+
sage: K.<g> = NumberField(x^6 + 2)
|
396
|
+
sage: len(list(bdd_height(K, 60))) # long time (5 s)
|
397
|
+
1899
|
398
|
+
|
399
|
+
::
|
400
|
+
|
401
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height
|
402
|
+
sage: K.<g> = NumberField(x^4 - x^3 - 3*x^2 + x + 1)
|
403
|
+
sage: len(list(bdd_height(K, 10)))
|
404
|
+
99
|
405
|
+
|
406
|
+
TESTS:
|
407
|
+
|
408
|
+
Check that :issue:`22771` is fixed::
|
409
|
+
|
410
|
+
sage: from sage.rings.number_field.bdd_height import bdd_height
|
411
|
+
sage: K.<v> = NumberField(x^3 + x + 1)
|
412
|
+
sage: len(list(bdd_height(K,3)))
|
413
|
+
23
|
414
|
+
"""
|
415
|
+
# global values, used in internal function
|
416
|
+
B = height_bound
|
417
|
+
theta = tolerance
|
418
|
+
if B < 1:
|
419
|
+
return
|
420
|
+
embeddings = K.places(prec=precision)
|
421
|
+
r1, r2 = K.signature()
|
422
|
+
r = r1 + r2 - 1
|
423
|
+
RF = RealField(precision)
|
424
|
+
lambda_gens_approx = {}
|
425
|
+
class_group_rep_norm_log_approx = []
|
426
|
+
unit_log_dict = {}
|
427
|
+
|
428
|
+
def rational_in(x, y):
|
429
|
+
r"""
|
430
|
+
Compute a rational number q, such that x<q<y using Archimedes' axiom
|
431
|
+
"""
|
432
|
+
z = y - x
|
433
|
+
if z == 0:
|
434
|
+
n = 1
|
435
|
+
else:
|
436
|
+
n = RR(1/z).ceil() + 1
|
437
|
+
if RR(n*y).ceil() is n*y: # WHAT !?
|
438
|
+
m = n*y - 1
|
439
|
+
else:
|
440
|
+
m = RR(n*y).floor()
|
441
|
+
return m / n
|
442
|
+
|
443
|
+
def delta_approximation(x, delta):
|
444
|
+
r"""
|
445
|
+
Compute a rational number in range `(x-\delta, x+\delta)`
|
446
|
+
"""
|
447
|
+
return rational_in(x - delta, x + delta)
|
448
|
+
|
449
|
+
def vector_delta_approximation(v, delta):
|
450
|
+
r"""
|
451
|
+
Compute a rational vector `w=(w_1, ..., w_n)`
|
452
|
+
such that `|v_i-w_i|<\delta` for all `i` in `[1, n]`
|
453
|
+
"""
|
454
|
+
return [delta_approximation(vi, delta) for vi in v]
|
455
|
+
|
456
|
+
def log_map(number):
|
457
|
+
r"""
|
458
|
+
Compute the image of an element of `K` under the logarithmic map.
|
459
|
+
"""
|
460
|
+
x = number
|
461
|
+
x_logs = []
|
462
|
+
for i in range(r1):
|
463
|
+
sigma = embeddings[i] # real embeddings
|
464
|
+
x_logs.append(sigma(x).abs().log())
|
465
|
+
for i in range(r1, r + 1):
|
466
|
+
tau = embeddings[i] # Complex embeddings
|
467
|
+
x_logs.append(2 * tau(x).abs().log())
|
468
|
+
return vector(x_logs)
|
469
|
+
|
470
|
+
def log_height_for_generators_approx(alpha, beta, Lambda):
|
471
|
+
r"""
|
472
|
+
Compute the rational approximation of logarithmic height function.
|
473
|
+
Return a lambda approximation h_K(alpha/beta)
|
474
|
+
"""
|
475
|
+
delta = Lambda / (r + 2)
|
476
|
+
norm_log = delta_approximation(RR(K.ideal(alpha, beta).norm()).log(), delta)
|
477
|
+
log_ga = vector_delta_approximation(log_map(alpha), delta)
|
478
|
+
log_gb = vector_delta_approximation(log_map(beta), delta)
|
479
|
+
arch_sum = sum([max(log_ga[k], log_gb[k]) for k in range(r + 1)])
|
480
|
+
return (arch_sum - norm_log)
|
481
|
+
|
482
|
+
def packet_height(n, pair, u):
|
483
|
+
r"""
|
484
|
+
Compute the height of the element of `K` encoded by a given packet.
|
485
|
+
"""
|
486
|
+
gens = generator_lists[n]
|
487
|
+
i = pair[0]
|
488
|
+
j = pair[1]
|
489
|
+
Log_gi = lambda_gens_approx[gens[i]]
|
490
|
+
Log_gj = lambda_gens_approx[gens[j]]
|
491
|
+
Log_u_gi = vector(Log_gi) + unit_log_dict[u]
|
492
|
+
arch_sum = sum([max(Log_u_gi[k], Log_gj[k]) for k in range(r + 1)])
|
493
|
+
return (arch_sum - class_group_rep_norm_log_approx[n])
|
494
|
+
|
495
|
+
# Step 1
|
496
|
+
# Computes ideal class representative and their rational approx norm
|
497
|
+
t = theta / (3*B)
|
498
|
+
delta_1 = t / (6*r+12)
|
499
|
+
|
500
|
+
class_group_reps = []
|
501
|
+
class_group_rep_norms = []
|
502
|
+
|
503
|
+
for c in K.class_group():
|
504
|
+
a = c.ideal()
|
505
|
+
a_norm = a.norm()
|
506
|
+
log_norm = RF(a_norm).log()
|
507
|
+
log_norm_approx = delta_approximation(log_norm, delta_1)
|
508
|
+
class_group_reps.append(a)
|
509
|
+
class_group_rep_norms.append(a_norm)
|
510
|
+
class_group_rep_norm_log_approx.append(log_norm_approx)
|
511
|
+
class_number = len(class_group_reps)
|
512
|
+
|
513
|
+
# Step 2
|
514
|
+
# Find generators for principal ideals of bounded norm
|
515
|
+
possible_norm_set = set()
|
516
|
+
for n in range(class_number):
|
517
|
+
for m in range(1, (B + 1).ceil()):
|
518
|
+
possible_norm_set.add(m * class_group_rep_norms[n])
|
519
|
+
bdd_ideals = bdd_norm_pr_ideal_gens(K, possible_norm_set)
|
520
|
+
|
521
|
+
# Stores it in form of a dictionary and gives lambda(g)_approx for key g
|
522
|
+
for norm in possible_norm_set:
|
523
|
+
gens = bdd_ideals[norm]
|
524
|
+
for g in gens:
|
525
|
+
lambda_g_approx = vector_delta_approximation(log_map(g), delta_1)
|
526
|
+
lambda_gens_approx[g] = lambda_g_approx
|
527
|
+
|
528
|
+
# Step 3
|
529
|
+
# Find a list of all generators corresponding to each ideal a_l
|
530
|
+
generator_lists = []
|
531
|
+
for l in range(class_number):
|
532
|
+
this_ideal = class_group_reps[l]
|
533
|
+
this_ideal_norm = class_group_rep_norms[l]
|
534
|
+
gens = []
|
535
|
+
for i in range(1, (B + 1).ceil()):
|
536
|
+
for g in bdd_ideals[i * this_ideal_norm]:
|
537
|
+
if g in this_ideal:
|
538
|
+
gens.append(g)
|
539
|
+
generator_lists.append(gens)
|
540
|
+
|
541
|
+
# Step 4
|
542
|
+
# Finds all relevant pair and their height
|
543
|
+
gen_height_approx_dictionary = {}
|
544
|
+
relevant_pair_lists = []
|
545
|
+
|
546
|
+
for n in range(class_number):
|
547
|
+
relevant_pairs = []
|
548
|
+
gens = generator_lists[n]
|
549
|
+
l = len(gens)
|
550
|
+
for i in range(l):
|
551
|
+
for j in range(i+1, l):
|
552
|
+
if K.ideal(gens[i], gens[j]) == class_group_reps[n]:
|
553
|
+
relevant_pairs.append([i, j])
|
554
|
+
gen_height_approx_dictionary[(n, i, j)] = log_height_for_generators_approx(gens[i], gens[j], t/6)
|
555
|
+
relevant_pair_lists.append(relevant_pairs)
|
556
|
+
|
557
|
+
# Step 5
|
558
|
+
b = rational_in(t/12 + RR(B).log(), t/4 + RR(B).log())
|
559
|
+
maximum = 0
|
560
|
+
for n in range(class_number):
|
561
|
+
for p in relevant_pair_lists[n]:
|
562
|
+
maximum = max(maximum, gen_height_approx_dictionary[(n, p[0], p[1])])
|
563
|
+
d_tilde = b + t/6 + maximum
|
564
|
+
|
565
|
+
# Step 6
|
566
|
+
# computes fundamental units and their value under log map
|
567
|
+
fund_units = UnitGroup(K).fundamental_units()
|
568
|
+
fund_unit_logs = [log_map(fund_units[i]) for i in range(r)]
|
569
|
+
S = column_matrix(fund_unit_logs).delete_rows([r])
|
570
|
+
S_inverse = S.inverse()
|
571
|
+
S_norm = S.norm(Infinity)
|
572
|
+
S_inverse_norm = S_inverse.norm(Infinity)
|
573
|
+
|
574
|
+
upper_bound = (r**2) * max(S_norm, S_inverse_norm)
|
575
|
+
m = RR(upper_bound).ceil() + 1
|
576
|
+
|
577
|
+
# Step 7
|
578
|
+
# Variables needed for rational approximation
|
579
|
+
lambda_tilde = (t/12) / (d_tilde*r*(1+m))
|
580
|
+
delta_tilde = min(lambda_tilde/((r**2)*((m**2)+m*lambda_tilde)), 1/(r**2))
|
581
|
+
M = d_tilde * (upper_bound+lambda_tilde*RR(r).sqrt())
|
582
|
+
M = RR(M).ceil()
|
583
|
+
d_tilde = RR(d_tilde)
|
584
|
+
delta_2 = min(delta_tilde, (t/6)/(r*(r+1)*M))
|
585
|
+
|
586
|
+
# Step 8, 9
|
587
|
+
# Computes relevant points in polytope
|
588
|
+
fund_unit_log_approx = [vector_delta_approximation(fund_unit_logs[i], delta_2) for i in range(r)]
|
589
|
+
S_tilde = column_matrix(fund_unit_log_approx).delete_rows([r])
|
590
|
+
S_tilde_inverse = S_tilde.inverse()
|
591
|
+
U = integer_points_in_polytope(S_tilde_inverse, d_tilde)
|
592
|
+
|
593
|
+
# Step 10
|
594
|
+
# tilde suffixed list are used for computing second list (L_primed)
|
595
|
+
yield K(0)
|
596
|
+
U0 = []
|
597
|
+
U0_tilde = []
|
598
|
+
L0 = []
|
599
|
+
L0_tilde = []
|
600
|
+
|
601
|
+
# Step 11
|
602
|
+
# Computes unit height
|
603
|
+
unit_height_dict = {}
|
604
|
+
U_copy = copy(U)
|
605
|
+
inter_bound = b - (5*t)/12
|
606
|
+
|
607
|
+
for u in U:
|
608
|
+
u_log = sum([u[j]*vector(fund_unit_log_approx[j]) for j in range(r)])
|
609
|
+
unit_log_dict[u] = u_log
|
610
|
+
u_height = sum([max(u_log[k], 0) for k in range(r + 1)])
|
611
|
+
unit_height_dict[u] = u_height
|
612
|
+
if u_height < inter_bound:
|
613
|
+
U0.append(u)
|
614
|
+
if inter_bound <= u_height < b - (t/12):
|
615
|
+
U0_tilde.append(u)
|
616
|
+
if u_height > t/12 + d_tilde:
|
617
|
+
U_copy.remove(u)
|
618
|
+
U = U_copy
|
619
|
+
|
620
|
+
relevant_tuples = set(U0 + U0_tilde)
|
621
|
+
|
622
|
+
# Step 12
|
623
|
+
# check for relevant packets
|
624
|
+
for n in range(class_number):
|
625
|
+
for pair in relevant_pair_lists[n]:
|
626
|
+
i = pair[0]
|
627
|
+
j = pair[1]
|
628
|
+
u_height_bound = b + gen_height_approx_dictionary[(n, i, j)] + t/4
|
629
|
+
for u in U:
|
630
|
+
if unit_height_dict[u] < u_height_bound:
|
631
|
+
candidate_height = packet_height(n, pair, u)
|
632
|
+
if candidate_height <= b - 7*t/12:
|
633
|
+
L0.append([n, pair, u])
|
634
|
+
relevant_tuples.add(u)
|
635
|
+
elif candidate_height < b + t/4:
|
636
|
+
L0_tilde.append([n, pair, u])
|
637
|
+
relevant_tuples.add(u)
|
638
|
+
|
639
|
+
# Step 13
|
640
|
+
# forms a dictionary of all_unit_tuples and their value
|
641
|
+
tuple_to_unit_dict = {}
|
642
|
+
for u in relevant_tuples:
|
643
|
+
unit = K.one()
|
644
|
+
for k in range(r):
|
645
|
+
unit *= fund_units[k]**u[k]
|
646
|
+
tuple_to_unit_dict[u] = unit
|
647
|
+
|
648
|
+
# Step 14
|
649
|
+
# Build all output numbers
|
650
|
+
roots_of_unity = K.roots_of_unity()
|
651
|
+
for u in U0 + U0_tilde:
|
652
|
+
for zeta in roots_of_unity:
|
653
|
+
yield zeta * tuple_to_unit_dict[u]
|
654
|
+
|
655
|
+
# Step 15
|
656
|
+
for p in L0 + L0_tilde:
|
657
|
+
gens = generator_lists[p[0]]
|
658
|
+
i = p[1][0]
|
659
|
+
j = p[1][1]
|
660
|
+
u = p[2]
|
661
|
+
c_p = tuple_to_unit_dict[u] * (gens[i] / gens[j])
|
662
|
+
for zeta in roots_of_unity:
|
663
|
+
yield zeta * c_p
|
664
|
+
yield zeta / c_p
|