passagemath-flint 10.6.1rc10__cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.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 +360 -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-3701249d.so.21.0.0 +0 -0
- passagemath_flint.libs/libgf2x-fbd36f80.so.3.0.0 +0 -0
- passagemath_flint.libs/libgfortran-8a9a71bc.so.5.0.0 +0 -0
- passagemath_flint.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
- passagemath_flint.libs/libgsl-e3525837.so.28.0.0 +0 -0
- passagemath_flint.libs/libmpfi-ad12a86d.so.0.0.0 +0 -0
- passagemath_flint.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
- passagemath_flint.libs/libntl-1004113e.so.44.0.1 +0 -0
- passagemath_flint.libs/libopenblasp-r0-4c5b64b1.3.29.so +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-310-aarch64-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-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/chrompoly.pyx +555 -0
- sage/graphs/matchpoly.cpython-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/matrix/change_ring.pyx +43 -0
- sage/matrix/matrix_complex_ball_dense.cpython-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/modular/modsym/apply.pxd +6 -0
- sage/modular/modsym/apply.pyx +113 -0
- sage/modular/modsym/heilbronn.cpython-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/rings/complex_arb.pxd +29 -0
- sage/rings/complex_arb.pyx +5176 -0
- sage/rings/complex_interval.cpython-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/rings/convert/mpfi.pxd +6 -0
- sage/rings/convert/mpfi.pyx +576 -0
- sage/rings/factorint_flint.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/rings/factorint_flint.pyx +99 -0
- sage/rings/fraction_field_FpT.cpython-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/hilbert.pyx +602 -0
- sage/rings/polynomial/polynomial_complex_arb.cpython-310-aarch64-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-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_number_field.pyx +345 -0
- sage/rings/polynomial/polynomial_rational_flint.cpython-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-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-310-aarch64-linux-gnu.so +0 -0
- sage/rings/real_interval_absolute.pyx +1073 -0
- sage/rings/real_mpfi.cpython-310-aarch64-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-310-aarch64-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,721 @@
|
|
1
|
+
# sage_setup: distribution = sagemath-flint
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
3
|
+
r"""
|
4
|
+
Units and `S`-unit groups of number fields
|
5
|
+
|
6
|
+
EXAMPLES::
|
7
|
+
|
8
|
+
sage: x = polygen(QQ)
|
9
|
+
sage: K.<a> = NumberField(x^4 - 8*x^2 + 36)
|
10
|
+
sage: UK = UnitGroup(K); UK
|
11
|
+
Unit group with structure C4 x Z of
|
12
|
+
Number Field in a with defining polynomial x^4 - 8*x^2 + 36
|
13
|
+
|
14
|
+
The first generator is a primitive root of unity in the field::
|
15
|
+
|
16
|
+
sage: UK.gens()
|
17
|
+
(u0, u1)
|
18
|
+
sage: UK.gens_values() # random
|
19
|
+
[-1/12*a^3 + 1/6*a, 1/24*a^3 + 1/4*a^2 - 1/12*a - 1]
|
20
|
+
sage: UK.gen(0).value()
|
21
|
+
1/12*a^3 - 1/6*a
|
22
|
+
|
23
|
+
sage: UK.gen(0)
|
24
|
+
u0
|
25
|
+
sage: UK.gen(0) + K.one() # coerce abstract generator into number field
|
26
|
+
1/12*a^3 - 1/6*a + 1
|
27
|
+
|
28
|
+
sage: [u.multiplicative_order() for u in UK.gens()]
|
29
|
+
[4, +Infinity]
|
30
|
+
sage: UK.rank()
|
31
|
+
1
|
32
|
+
sage: UK.ngens()
|
33
|
+
2
|
34
|
+
|
35
|
+
Units in the field can be converted into elements of the unit group represented
|
36
|
+
as elements of an abstract multiplicative group::
|
37
|
+
|
38
|
+
sage: UK(1)
|
39
|
+
1
|
40
|
+
sage: UK(-1)
|
41
|
+
u0^2
|
42
|
+
sage: [UK(u) for u in (x^4 - 1).roots(K, multiplicities=False)]
|
43
|
+
[1, u0^2, u0, u0^3]
|
44
|
+
|
45
|
+
sage: UK.fundamental_units() # random
|
46
|
+
[1/24*a^3 + 1/4*a^2 - 1/12*a - 1]
|
47
|
+
sage: torsion_gen = UK.torsion_generator(); torsion_gen
|
48
|
+
u0
|
49
|
+
sage: torsion_gen.value()
|
50
|
+
1/12*a^3 - 1/6*a
|
51
|
+
sage: UK.zeta_order()
|
52
|
+
4
|
53
|
+
sage: UK.roots_of_unity()
|
54
|
+
[1/12*a^3 - 1/6*a, -1, -1/12*a^3 + 1/6*a, 1]
|
55
|
+
|
56
|
+
Exp and log functions provide maps between units as field elements and exponent
|
57
|
+
vectors with respect to the generators::
|
58
|
+
|
59
|
+
sage: u = UK.exp([13,10]); u # random
|
60
|
+
-41/8*a^3 - 55/4*a^2 + 41/4*a + 55
|
61
|
+
sage: UK.log(u)
|
62
|
+
(1, 10)
|
63
|
+
sage: u = UK.fundamental_units()[0]
|
64
|
+
sage: [UK.log(u^k) == (0,k) for k in range(10)]
|
65
|
+
[True, True, True, True, True, True, True, True, True, True]
|
66
|
+
sage: all(UK.log(u^k) == (0,k) for k in range(10))
|
67
|
+
True
|
68
|
+
|
69
|
+
sage: K.<a> = NumberField(x^5 - 2,'a')
|
70
|
+
sage: UK = UnitGroup(K)
|
71
|
+
sage: UK.rank()
|
72
|
+
2
|
73
|
+
sage: UK.fundamental_units()
|
74
|
+
[a^3 + a^2 - 1, a - 1]
|
75
|
+
|
76
|
+
`S`-unit groups may be constructed, where `S` is a set of primes::
|
77
|
+
|
78
|
+
sage: K.<a> = NumberField(x^6 + 2)
|
79
|
+
sage: S = K.ideal(3).prime_factors(); S
|
80
|
+
[Fractional ideal (3, a + 1), Fractional ideal (3, a - 1)]
|
81
|
+
sage: SUK = UnitGroup(K,S=tuple(S)); SUK
|
82
|
+
S-unit group with structure C2 x Z x Z x Z x Z of
|
83
|
+
Number Field in a with defining polynomial x^6 + 2
|
84
|
+
with S = (Fractional ideal (3, a + 1), Fractional ideal (3, a - 1))
|
85
|
+
sage: SUK.primes()
|
86
|
+
(Fractional ideal (3, a + 1), Fractional ideal (3, a - 1))
|
87
|
+
sage: SUK.rank()
|
88
|
+
4
|
89
|
+
sage: SUK.gens_values()
|
90
|
+
[-1, a^2 + 1, -a^5 - a^4 + a^2 + a + 1, a + 1, a - 1]
|
91
|
+
sage: u = 9*prod(SUK.gens_values()); u
|
92
|
+
-18*a^5 - 18*a^4 - 18*a^3 - 9*a^2 + 9*a + 27
|
93
|
+
sage: SUK.log(u)
|
94
|
+
(1, 3, 1, 7, 7)
|
95
|
+
sage: u == SUK.exp((1,3,1,7,7))
|
96
|
+
True
|
97
|
+
|
98
|
+
A relative number field example::
|
99
|
+
|
100
|
+
sage: L.<a, b> = NumberField([x^2 + x + 1, x^4 + 1])
|
101
|
+
sage: UL = L.unit_group(); UL
|
102
|
+
Unit group with structure C24 x Z x Z x Z of
|
103
|
+
Number Field in a with defining polynomial x^2 + x + 1 over its base field
|
104
|
+
sage: UL.gens_values() # random
|
105
|
+
[-b^3*a - b^3, -b^3*a + b, (-b^3 - b^2 - b)*a - b - 1, (-b^3 - 1)*a - b^2 + b - 1]
|
106
|
+
sage: UL.zeta_order()
|
107
|
+
24
|
108
|
+
sage: UL.roots_of_unity()
|
109
|
+
[-b*a,
|
110
|
+
-b^2*a - b^2,
|
111
|
+
-b^3,
|
112
|
+
-a,
|
113
|
+
-b*a - b,
|
114
|
+
-b^2,
|
115
|
+
b^3*a,
|
116
|
+
-a - 1,
|
117
|
+
-b,
|
118
|
+
b^2*a,
|
119
|
+
b^3*a + b^3,
|
120
|
+
-1,
|
121
|
+
b*a,
|
122
|
+
b^2*a + b^2,
|
123
|
+
b^3,
|
124
|
+
a,
|
125
|
+
b*a + b,
|
126
|
+
b^2,
|
127
|
+
-b^3*a,
|
128
|
+
a + 1,
|
129
|
+
b,
|
130
|
+
-b^2*a,
|
131
|
+
-b^3*a - b^3,
|
132
|
+
1]
|
133
|
+
|
134
|
+
A relative extension example, which worked thanks to the code review by F.W.Clarke::
|
135
|
+
|
136
|
+
sage: PQ.<X> = QQ[]
|
137
|
+
sage: F.<a, b> = NumberField([X^2 - 2, X^2 - 3])
|
138
|
+
sage: PF.<Y> = F[]
|
139
|
+
sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b)
|
140
|
+
sage: K.unit_group()
|
141
|
+
Unit group with structure C2 x Z x Z x Z x Z x Z x Z x Z of Number Field in c
|
142
|
+
with defining polynomial Y^2 + (-2*b - 3)*a - 2*b - 6 over its base field
|
143
|
+
|
144
|
+
TESTS::
|
145
|
+
|
146
|
+
sage: UK == loads(dumps(UK))
|
147
|
+
True
|
148
|
+
sage: UL == loads(dumps(UL))
|
149
|
+
True
|
150
|
+
|
151
|
+
AUTHOR:
|
152
|
+
|
153
|
+
- John Cremona
|
154
|
+
"""
|
155
|
+
# ****************************************************************************
|
156
|
+
# Copyright (C) 2009 William Stein, John Cremona
|
157
|
+
#
|
158
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
159
|
+
#
|
160
|
+
# This code is distributed in the hope that it will be useful,
|
161
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
162
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
163
|
+
# General Public License for more details.
|
164
|
+
#
|
165
|
+
# The full text of the GPL is available at:
|
166
|
+
#
|
167
|
+
# https://www.gnu.org/licenses/
|
168
|
+
# ****************************************************************************
|
169
|
+
|
170
|
+
from sage.groups.abelian_gps.values import AbelianGroupWithValues_class
|
171
|
+
from sage.structure.proof.proof import get_flag
|
172
|
+
from sage.libs.pari import pari
|
173
|
+
from sage.misc.misc_c import prod
|
174
|
+
from sage.rings.integer_ring import ZZ
|
175
|
+
|
176
|
+
|
177
|
+
class UnitGroup(AbelianGroupWithValues_class):
|
178
|
+
"""
|
179
|
+
The unit group or an `S`-unit group of a number field.
|
180
|
+
|
181
|
+
TESTS::
|
182
|
+
|
183
|
+
sage: x = polygen(QQ)
|
184
|
+
sage: K.<a> = NumberField(x^4 + 23)
|
185
|
+
sage: UK = K.unit_group()
|
186
|
+
sage: u = UK.an_element(); u
|
187
|
+
u0*u1
|
188
|
+
sage: u.value()
|
189
|
+
-1/4*a^3 + 7/4*a^2 - 17/4*a + 19/4
|
190
|
+
|
191
|
+
sage: x = polygen(QQ)
|
192
|
+
sage: K.<a> = NumberField(x^4 + 23)
|
193
|
+
sage: K.unit_group().gens_values() # random
|
194
|
+
[-1, 1/4*a^3 - 7/4*a^2 + 17/4*a - 19/4]
|
195
|
+
|
196
|
+
sage: x = polygen(QQ)
|
197
|
+
sage: U = NumberField(x^2 + x + 23899, 'a').unit_group(); U
|
198
|
+
Unit group with structure C2 of Number Field in a with defining polynomial x^2 + x + 23899
|
199
|
+
sage: U.ngens()
|
200
|
+
1
|
201
|
+
|
202
|
+
sage: K.<z> = CyclotomicField(13)
|
203
|
+
sage: UK = K.unit_group()
|
204
|
+
sage: UK.ngens()
|
205
|
+
6
|
206
|
+
sage: UK.gen(5)
|
207
|
+
u5
|
208
|
+
sage: UK.gen(5).value()
|
209
|
+
-z^7 - z
|
210
|
+
|
211
|
+
An S-unit group::
|
212
|
+
|
213
|
+
sage: SUK = UnitGroup(K,S=21); SUK
|
214
|
+
S-unit group with structure C26 x Z x Z x Z x Z x Z x Z x Z x Z x Z x Z of
|
215
|
+
Cyclotomic Field of order 13 and degree 12 with
|
216
|
+
S = (Fractional ideal (3, z^3 - z - 1),
|
217
|
+
Fractional ideal (3, z^3 + z^2 + z - 1),
|
218
|
+
Fractional ideal (3, z^3 + z^2 - 1),
|
219
|
+
Fractional ideal (3, z^3 - z^2 - z - 1),
|
220
|
+
Fractional ideal (7))
|
221
|
+
sage: SUK.rank()
|
222
|
+
10
|
223
|
+
sage: SUK.zeta_order()
|
224
|
+
26
|
225
|
+
sage: SUK.log(21*z)
|
226
|
+
(25, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1)
|
227
|
+
"""
|
228
|
+
# This structure is not a parent in the usual sense. The
|
229
|
+
# "elements" are NumberFieldElement_absolute. Instead, they should
|
230
|
+
# derive from AbelianGroupElement and coerce into
|
231
|
+
# NumberFieldElement_absolute.
|
232
|
+
|
233
|
+
def __init__(self, number_field, proof=True, S=None):
|
234
|
+
"""
|
235
|
+
Create a unit group of a number field.
|
236
|
+
|
237
|
+
INPUT:
|
238
|
+
|
239
|
+
- ``number_field`` -- a number field
|
240
|
+
- ``proof`` -- boolean (default: ``True``); proof flag
|
241
|
+
- ``S`` -- tuple of prime ideals, or an ideal, or a single
|
242
|
+
ideal or element from which an ideal can be constructed, in
|
243
|
+
which case the support is used. If ``None``, the global unit
|
244
|
+
group is constructed; otherwise, the `S`-unit group is
|
245
|
+
constructed.
|
246
|
+
|
247
|
+
The ``proof`` flag is passed to PARI via the :pari:`pari_bnf` function
|
248
|
+
which computes the unit group. See the documentation for the
|
249
|
+
``number_field`` module.
|
250
|
+
|
251
|
+
EXAMPLES::
|
252
|
+
|
253
|
+
sage: x = polygen(QQ)
|
254
|
+
sage: K.<a> = NumberField(x^2-38)
|
255
|
+
sage: UK = K.unit_group(); UK
|
256
|
+
Unit group with structure C2 x Z of Number Field in a with defining polynomial x^2 - 38
|
257
|
+
sage: UK.gens()
|
258
|
+
(u0, u1)
|
259
|
+
sage: UK.gens_values()
|
260
|
+
[-1, -6*a + 37]
|
261
|
+
|
262
|
+
sage: K.<a> = QuadraticField(-3)
|
263
|
+
sage: UK = K.unit_group(); UK
|
264
|
+
Unit group with structure C6 of Number Field in a with defining polynomial x^2 + 3 with a = 1.732050807568878?*I
|
265
|
+
sage: UK.gens()
|
266
|
+
(u,)
|
267
|
+
sage: UK.gens_values()
|
268
|
+
[-1/2*a + 1/2]
|
269
|
+
|
270
|
+
sage: K.<z> = CyclotomicField(13)
|
271
|
+
sage: UK = K.unit_group(); UK
|
272
|
+
Unit group with structure C26 x Z x Z x Z x Z x Z of Cyclotomic Field of order 13 and degree 12
|
273
|
+
sage: UK.gens()
|
274
|
+
(u0, u1, u2, u3, u4, u5)
|
275
|
+
sage: UK.gens_values() # random
|
276
|
+
[-z^11, z^5 + z^3, z^6 + z^5, z^9 + z^7 + z^5, z^9 + z^5 + z^4 + 1, z^5 + z]
|
277
|
+
sage: SUK = UnitGroup(K,S=2); SUK
|
278
|
+
S-unit group with structure C26 x Z x Z x Z x Z x Z x Z of
|
279
|
+
Cyclotomic Field of order 13 and degree 12 with S = (Fractional ideal (2),)
|
280
|
+
|
281
|
+
TESTS:
|
282
|
+
|
283
|
+
Number fields defined by non-monic and non-integral
|
284
|
+
polynomials are supported (:issue:`252`);
|
285
|
+
the representation depends on the PARI version::
|
286
|
+
|
287
|
+
sage: K.<a> = NumberField(7/9*x^3 + 7/3*x^2 - 56*x + 123)
|
288
|
+
sage: K.unit_group()
|
289
|
+
Unit group with structure C2 x Z x Z of
|
290
|
+
Number Field in a with defining polynomial 7/9*x^3 + 7/3*x^2 - 56*x + 123
|
291
|
+
sage: UnitGroup(K, S=tuple(K.primes_above(7)))
|
292
|
+
S-unit group with structure C2 x Z x Z x Z of
|
293
|
+
Number Field in a with defining polynomial 7/9*x^3 + 7/3*x^2 - 56*x + 123
|
294
|
+
with S = (Fractional ideal (...),)
|
295
|
+
sage: K.primes_above(7)[0] in (7/225*a^2 - 7/75*a - 42/25, 28/225*a^2 + 77/75*a - 133/25)
|
296
|
+
True
|
297
|
+
|
298
|
+
Conversion from unit group to a number field and back
|
299
|
+
gives the right results (:issue:`25874`)::
|
300
|
+
|
301
|
+
sage: # needs sage.libs.linbox
|
302
|
+
sage: K = QuadraticField(-3).composite_fields(QuadraticField(2))[0]
|
303
|
+
sage: U = K.unit_group()
|
304
|
+
sage: tuple(U(K(u)) for u in U.gens()) == U.gens()
|
305
|
+
True
|
306
|
+
sage: US = K.S_unit_group(3)
|
307
|
+
sage: tuple(US(K(u)) for u in US.gens()) == US.gens()
|
308
|
+
True
|
309
|
+
|
310
|
+
Bug :issue:`36386` (pari stack overflow while expanding units)::
|
311
|
+
|
312
|
+
sage: d = 12936642
|
313
|
+
sage: K = QuadraticField(d)
|
314
|
+
sage: K.unit_group(proof=False)
|
315
|
+
Unit group with structure C2 x Z of Number Field in a with defining polynomial x^2 - 12936642 with a = 3596.754370262167?
|
316
|
+
"""
|
317
|
+
proof = get_flag(proof, "number_field")
|
318
|
+
K = number_field
|
319
|
+
pK = K.pari_bnf(proof)
|
320
|
+
self.__number_field = K
|
321
|
+
self.__pari_number_field = pK
|
322
|
+
|
323
|
+
# process the parameter S:
|
324
|
+
if not S:
|
325
|
+
S = self.__S = ()
|
326
|
+
else:
|
327
|
+
if isinstance(S, list):
|
328
|
+
S = tuple(S)
|
329
|
+
if not isinstance(S, tuple):
|
330
|
+
try:
|
331
|
+
S = tuple(K.ideal(S).prime_factors())
|
332
|
+
except (NameError, TypeError, ValueError):
|
333
|
+
raise ValueError("Cannot make a set of primes from %s" % (S,))
|
334
|
+
else:
|
335
|
+
try:
|
336
|
+
S = tuple(K.ideal(P) for P in S)
|
337
|
+
except (NameError, TypeError, ValueError):
|
338
|
+
raise ValueError("Cannot make a set of primes from %s" % (S,))
|
339
|
+
if not all(P.is_prime() for P in S):
|
340
|
+
raise ValueError("Not all elements of %s are prime ideals" % (S,))
|
341
|
+
self.__S = S
|
342
|
+
self.__pS = pS = [P.pari_prime() for P in S]
|
343
|
+
|
344
|
+
# compute the fundamental units via pari:
|
345
|
+
fu = [K(u, check=False) for u in pK.bnf_get_fu()]
|
346
|
+
self.__nfu = len(fu)
|
347
|
+
|
348
|
+
# compute the additional S-unit generators:
|
349
|
+
if S:
|
350
|
+
self.__S_unit_data = pK.bnfunits(pS)
|
351
|
+
# TODO: converting the factored matrix representation of bnfunits into polynomial
|
352
|
+
# form is a *big* waste of time
|
353
|
+
su = [pK.nfbasistoalg(pK.nffactorback(z)) for z in self.__S_unit_data[0][0:len(S)]]
|
354
|
+
su = [K(u, check=False) for u in su]
|
355
|
+
else:
|
356
|
+
su = []
|
357
|
+
|
358
|
+
self.__nfu = len(fu) # number of fundamental units
|
359
|
+
self.__nsu = len(su) # number of S-units
|
360
|
+
self.__ntu = pK.bnf_get_tu()[0] # order of torsion
|
361
|
+
self.__rank = self.__nfu + self.__nsu
|
362
|
+
|
363
|
+
# Put the torsion unit first, then fundamental units then S-units
|
364
|
+
gens = [K(pK.bnf_get_tu()[1], check=False)] + fu + su
|
365
|
+
|
366
|
+
# Construct the abstract group:
|
367
|
+
gens_orders = tuple([ZZ(self.__ntu)]+[ZZ(0)]*(self.__rank))
|
368
|
+
AbelianGroupWithValues_class.__init__(self, gens_orders, 'u', gens, number_field)
|
369
|
+
|
370
|
+
def _element_constructor_(self, u):
|
371
|
+
"""
|
372
|
+
Return the abstract group element corresponding to the unit u.
|
373
|
+
|
374
|
+
INPUT:
|
375
|
+
|
376
|
+
- ``u`` -- any object from which an element of the unit group's number
|
377
|
+
field `K` may be constructed; an error is raised if an element of `K`
|
378
|
+
cannot be constructed from u, or if the element constructed is not a
|
379
|
+
unit
|
380
|
+
|
381
|
+
EXAMPLES::
|
382
|
+
|
383
|
+
sage: x = polygen(QQ)
|
384
|
+
sage: K.<a> = NumberField(x^2-38)
|
385
|
+
sage: UK = UnitGroup(K)
|
386
|
+
sage: UK(1)
|
387
|
+
1
|
388
|
+
sage: UK(-1)
|
389
|
+
u0
|
390
|
+
sage: UK.gens()
|
391
|
+
(u0, u1)
|
392
|
+
sage: UK.gens_values()
|
393
|
+
[-1, -6*a + 37]
|
394
|
+
sage: UK.ngens()
|
395
|
+
2
|
396
|
+
sage: [UK(u) for u in UK.gens()]
|
397
|
+
[u0, u1]
|
398
|
+
sage: [UK(u).exponents() for u in UK.gens()]
|
399
|
+
[(1, 0), (0, 1)]
|
400
|
+
sage: UK(a)
|
401
|
+
Traceback (most recent call last):
|
402
|
+
...
|
403
|
+
ValueError: a is not a unit
|
404
|
+
"""
|
405
|
+
K = self.__number_field
|
406
|
+
pK = self.__pari_number_field
|
407
|
+
try:
|
408
|
+
u = K(u)
|
409
|
+
except TypeError:
|
410
|
+
raise ValueError("%s is not an element of %s" % (u,K))
|
411
|
+
if self.__S:
|
412
|
+
m = pK.bnfisunit(pari(u), self.__S_unit_data).mattranspose()
|
413
|
+
if m.ncols() == 0:
|
414
|
+
raise ValueError("%s is not an S-unit" % u)
|
415
|
+
else:
|
416
|
+
if not u.is_integral() or u.norm().abs() != 1:
|
417
|
+
raise ValueError("%s is not a unit" % u)
|
418
|
+
m = pK.bnfisunit(pari(u)).mattranspose()
|
419
|
+
|
420
|
+
# convert column matrix to a list:
|
421
|
+
m = [ZZ(m[0,i].sage()) for i in range(m.ncols())]
|
422
|
+
|
423
|
+
# NOTE: pari ordering for the units is (S-units, fundamental units, torsion unit)
|
424
|
+
m = [m[-1]] + m[self.__nsu:-1] + m[:self.__nsu]
|
425
|
+
|
426
|
+
return self.element_class(self, m)
|
427
|
+
|
428
|
+
def rank(self):
|
429
|
+
"""
|
430
|
+
Return the rank of the unit group.
|
431
|
+
|
432
|
+
EXAMPLES::
|
433
|
+
|
434
|
+
sage: K.<z> = CyclotomicField(13)
|
435
|
+
sage: UnitGroup(K).rank()
|
436
|
+
5
|
437
|
+
sage: SUK = UnitGroup(K, S=2); SUK.rank()
|
438
|
+
6
|
439
|
+
"""
|
440
|
+
return self.ngens()-1
|
441
|
+
|
442
|
+
def _repr_(self):
|
443
|
+
"""
|
444
|
+
Return string representation of this unit group.
|
445
|
+
|
446
|
+
EXAMPLES::
|
447
|
+
|
448
|
+
sage: x = polygen(QQ)
|
449
|
+
sage: U = UnitGroup(NumberField(x^3 - 2, 'a'))
|
450
|
+
sage: U
|
451
|
+
Unit group with structure C2 x Z of Number Field in a with defining polynomial x^3 - 2
|
452
|
+
sage: U._repr_()
|
453
|
+
'Unit group with structure C2 x Z of Number Field in a with defining polynomial x^3 - 2'
|
454
|
+
sage: UnitGroup(NumberField(x^3 - 2, 'a'), S=2)
|
455
|
+
S-unit group with structure C2 x Z x Z of
|
456
|
+
Number Field in a with defining polynomial x^3 - 2
|
457
|
+
with S = (Fractional ideal (a),)
|
458
|
+
"""
|
459
|
+
if self.__S:
|
460
|
+
return 'S-unit group with structure %s of %s with S = %s' % (
|
461
|
+
self._group_notation(self.gens_orders()),
|
462
|
+
self.number_field(),
|
463
|
+
self.primes())
|
464
|
+
return 'Unit group with structure %s of %s' % (
|
465
|
+
self._group_notation(self.gens_orders()),
|
466
|
+
self.number_field())
|
467
|
+
|
468
|
+
def fundamental_units(self):
|
469
|
+
"""
|
470
|
+
Return generators for the free part of the unit group, as a list.
|
471
|
+
|
472
|
+
EXAMPLES::
|
473
|
+
|
474
|
+
sage: x = polygen(QQ)
|
475
|
+
sage: K.<a> = NumberField(x^4 + 23)
|
476
|
+
sage: U = UnitGroup(K)
|
477
|
+
sage: U.fundamental_units() # random
|
478
|
+
[1/4*a^3 - 7/4*a^2 + 17/4*a - 19/4]
|
479
|
+
"""
|
480
|
+
return self.gens_values()[1:]
|
481
|
+
|
482
|
+
def roots_of_unity(self):
|
483
|
+
"""
|
484
|
+
Return all the roots of unity in this unit group, primitive or not.
|
485
|
+
|
486
|
+
EXAMPLES::
|
487
|
+
|
488
|
+
sage: x = polygen(QQ)
|
489
|
+
sage: K.<b> = NumberField(x^2 + 1)
|
490
|
+
sage: U = UnitGroup(K)
|
491
|
+
sage: zs = U.roots_of_unity(); zs
|
492
|
+
[b, -1, -b, 1]
|
493
|
+
sage: [ z**U.zeta_order() for z in zs ]
|
494
|
+
[1, 1, 1, 1]
|
495
|
+
"""
|
496
|
+
z = self.gen(0).value()
|
497
|
+
n = self.__ntu
|
498
|
+
return [z**k for k in range(1, n + 1)]
|
499
|
+
|
500
|
+
def torsion_generator(self):
|
501
|
+
"""
|
502
|
+
Return a generator for the torsion part of the unit group.
|
503
|
+
|
504
|
+
EXAMPLES::
|
505
|
+
|
506
|
+
sage: x = polygen(QQ)
|
507
|
+
sage: K.<a> = NumberField(x^4 - x^2 + 4)
|
508
|
+
sage: U = UnitGroup(K)
|
509
|
+
sage: U.torsion_generator()
|
510
|
+
u0
|
511
|
+
sage: U.torsion_generator().value() # random
|
512
|
+
-1/4*a^3 - 1/4*a + 1/2
|
513
|
+
"""
|
514
|
+
return self.gen(0)
|
515
|
+
|
516
|
+
def zeta_order(self):
|
517
|
+
"""
|
518
|
+
Return the order of the torsion part of the unit group.
|
519
|
+
|
520
|
+
EXAMPLES::
|
521
|
+
|
522
|
+
sage: x = polygen(QQ)
|
523
|
+
sage: K.<a> = NumberField(x^4 - x^2 + 4)
|
524
|
+
sage: U = UnitGroup(K)
|
525
|
+
sage: U.zeta_order()
|
526
|
+
6
|
527
|
+
"""
|
528
|
+
return self.__ntu
|
529
|
+
|
530
|
+
def zeta(self, n=2, all=False):
|
531
|
+
"""
|
532
|
+
Return one, or a list of all, primitive `n`-th root of unity in this unit group.
|
533
|
+
|
534
|
+
EXAMPLES::
|
535
|
+
|
536
|
+
sage: x = polygen(QQ)
|
537
|
+
sage: K.<z> = NumberField(x^2 + 3)
|
538
|
+
sage: U = UnitGroup(K)
|
539
|
+
sage: U.zeta(1)
|
540
|
+
1
|
541
|
+
sage: U.zeta(2)
|
542
|
+
-1
|
543
|
+
sage: U.zeta(2, all=True)
|
544
|
+
[-1]
|
545
|
+
sage: U.zeta(3)
|
546
|
+
-1/2*z - 1/2
|
547
|
+
sage: U.zeta(3, all=True)
|
548
|
+
[-1/2*z - 1/2, 1/2*z - 1/2]
|
549
|
+
sage: U.zeta(4)
|
550
|
+
Traceback (most recent call last):
|
551
|
+
...
|
552
|
+
ValueError: n (=4) does not divide order of generator
|
553
|
+
|
554
|
+
sage: r.<x> = QQ[]
|
555
|
+
sage: K.<b> = NumberField(x^2 + 1)
|
556
|
+
sage: U = UnitGroup(K)
|
557
|
+
sage: U.zeta(4)
|
558
|
+
b
|
559
|
+
sage: U.zeta(4,all=True)
|
560
|
+
[b, -b]
|
561
|
+
sage: U.zeta(3)
|
562
|
+
Traceback (most recent call last):
|
563
|
+
...
|
564
|
+
ValueError: n (=3) does not divide order of generator
|
565
|
+
sage: U.zeta(3, all=True)
|
566
|
+
[]
|
567
|
+
"""
|
568
|
+
N = self.__ntu
|
569
|
+
K = self.number_field()
|
570
|
+
n = ZZ(n)
|
571
|
+
if n <= 0:
|
572
|
+
raise ValueError("n (=%s) must be positive" % n)
|
573
|
+
if n == 1:
|
574
|
+
if all:
|
575
|
+
return [K(1)]
|
576
|
+
else:
|
577
|
+
return K(1)
|
578
|
+
elif n == 2:
|
579
|
+
if all:
|
580
|
+
return [K(-1)]
|
581
|
+
else:
|
582
|
+
return K(-1)
|
583
|
+
if n.divides(N):
|
584
|
+
z = self.torsion_generator().value() ** (N//n)
|
585
|
+
if all:
|
586
|
+
return [z**i for i in n.coprime_integers(n)]
|
587
|
+
else:
|
588
|
+
return z
|
589
|
+
else:
|
590
|
+
if all:
|
591
|
+
return []
|
592
|
+
else:
|
593
|
+
raise ValueError("n (=%s) does not divide order of generator" % n)
|
594
|
+
|
595
|
+
def number_field(self):
|
596
|
+
"""
|
597
|
+
Return the number field associated with this unit group.
|
598
|
+
|
599
|
+
EXAMPLES::
|
600
|
+
|
601
|
+
sage: U = UnitGroup(QuadraticField(-23, 'w')); U
|
602
|
+
Unit group with structure C2 of
|
603
|
+
Number Field in w with defining polynomial x^2 + 23 with w = 4.795831523312720?*I
|
604
|
+
sage: U.number_field()
|
605
|
+
Number Field in w with defining polynomial x^2 + 23 with w = 4.795831523312720?*I
|
606
|
+
"""
|
607
|
+
return self.__number_field
|
608
|
+
|
609
|
+
def primes(self):
|
610
|
+
"""
|
611
|
+
Return the (possibly empty) list of primes associated with this S-unit group.
|
612
|
+
|
613
|
+
EXAMPLES::
|
614
|
+
|
615
|
+
sage: K.<a> = QuadraticField(-23)
|
616
|
+
sage: S = tuple(K.ideal(3).prime_factors()); S
|
617
|
+
(Fractional ideal (3, 1/2*a - 1/2), Fractional ideal (3, 1/2*a + 1/2))
|
618
|
+
sage: U = UnitGroup(K,S=tuple(S)); U
|
619
|
+
S-unit group with structure C2 x Z x Z of
|
620
|
+
Number Field in a with defining polynomial x^2 + 23 with a = 4.795831523312720?*I
|
621
|
+
with S = (Fractional ideal (3, 1/2*a - 1/2), Fractional ideal (3, 1/2*a + 1/2))
|
622
|
+
sage: U.primes() == S
|
623
|
+
True
|
624
|
+
"""
|
625
|
+
return self.__S
|
626
|
+
|
627
|
+
def log(self, u):
|
628
|
+
r"""
|
629
|
+
Return the exponents of the unit `u` with respect to group generators.
|
630
|
+
|
631
|
+
INPUT:
|
632
|
+
|
633
|
+
- ``u`` -- any object from which an element of the unit group's number
|
634
|
+
field `K` may be constructed; an error is raised if an element of `K`
|
635
|
+
cannot be constructed from `u`, or if the element constructed is not a
|
636
|
+
unit
|
637
|
+
|
638
|
+
OUTPUT: list of integers giving the exponents of `u` with
|
639
|
+
respect to the unit group's basis
|
640
|
+
|
641
|
+
EXAMPLES::
|
642
|
+
|
643
|
+
sage: x = polygen(QQ)
|
644
|
+
sage: K.<z> = CyclotomicField(13)
|
645
|
+
sage: UK = UnitGroup(K)
|
646
|
+
sage: [UK.log(u) for u in UK.gens()]
|
647
|
+
[(1, 0, 0, 0, 0, 0),
|
648
|
+
(0, 1, 0, 0, 0, 0),
|
649
|
+
(0, 0, 1, 0, 0, 0),
|
650
|
+
(0, 0, 0, 1, 0, 0),
|
651
|
+
(0, 0, 0, 0, 1, 0),
|
652
|
+
(0, 0, 0, 0, 0, 1)]
|
653
|
+
sage: vec = [65,6,7,8,9,10]
|
654
|
+
sage: unit = UK.exp(vec); unit # random
|
655
|
+
-253576*z^11 + 7003*z^10 - 395532*z^9 - 35275*z^8 - 500326*z^7 - 35275*z^6
|
656
|
+
- 395532*z^5 + 7003*z^4 - 253576*z^3 - 59925*z - 59925
|
657
|
+
sage: UK.log(unit)
|
658
|
+
(13, 6, 7, 8, 9, 10)
|
659
|
+
|
660
|
+
An S-unit example::
|
661
|
+
|
662
|
+
sage: SUK = UnitGroup(K, S=2)
|
663
|
+
sage: v = (3,1,4,1,5,9,2)
|
664
|
+
sage: u = SUK.exp(v); u
|
665
|
+
8732*z^11 - 15496*z^10 - 51840*z^9 - 68804*z^8 - 51840*z^7 - 15496*z^6
|
666
|
+
+ 8732*z^5 - 34216*z^3 - 64312*z^2 - 64312*z - 34216
|
667
|
+
sage: SUK.log(u)
|
668
|
+
(3, 1, 4, 1, 5, 9, 2)
|
669
|
+
sage: SUK.log(u) == v
|
670
|
+
True
|
671
|
+
"""
|
672
|
+
return self(u).exponents()
|
673
|
+
|
674
|
+
def exp(self, exponents):
|
675
|
+
r"""
|
676
|
+
Return unit with given exponents with respect to group generators.
|
677
|
+
|
678
|
+
INPUT:
|
679
|
+
|
680
|
+
- ``u`` -- any object from which an element of the unit
|
681
|
+
group's number field `K` may be constructed; an error is
|
682
|
+
raised if an element of `K` cannot be constructed from `u`, or
|
683
|
+
if the element constructed is not a unit.
|
684
|
+
|
685
|
+
OUTPUT: list of integers giving the exponents of `u` with
|
686
|
+
respect to the unit group's basis.
|
687
|
+
|
688
|
+
EXAMPLES::
|
689
|
+
|
690
|
+
sage: x = polygen(QQ)
|
691
|
+
sage: K.<z> = CyclotomicField(13)
|
692
|
+
sage: UK = UnitGroup(K)
|
693
|
+
sage: [UK.log(u) for u in UK.gens()]
|
694
|
+
[(1, 0, 0, 0, 0, 0),
|
695
|
+
(0, 1, 0, 0, 0, 0),
|
696
|
+
(0, 0, 1, 0, 0, 0),
|
697
|
+
(0, 0, 0, 1, 0, 0),
|
698
|
+
(0, 0, 0, 0, 1, 0),
|
699
|
+
(0, 0, 0, 0, 0, 1)]
|
700
|
+
sage: vec = [65,6,7,8,9,10]
|
701
|
+
sage: unit = UK.exp(vec)
|
702
|
+
sage: UK.log(unit)
|
703
|
+
(13, 6, 7, 8, 9, 10)
|
704
|
+
sage: u = UK.gens()[-1]
|
705
|
+
sage: UK.exp(UK.log(u)) == u.value()
|
706
|
+
True
|
707
|
+
|
708
|
+
An S-unit example::
|
709
|
+
|
710
|
+
sage: SUK = UnitGroup(K,S=2)
|
711
|
+
sage: v = (3,1,4,1,5,9,2)
|
712
|
+
sage: u = SUK.exp(v); u
|
713
|
+
8732*z^11 - 15496*z^10 - 51840*z^9 - 68804*z^8 - 51840*z^7 - 15496*z^6
|
714
|
+
+ 8732*z^5 - 34216*z^3 - 64312*z^2 - 64312*z - 34216
|
715
|
+
sage: SUK.log(u)
|
716
|
+
(3, 1, 4, 1, 5, 9, 2)
|
717
|
+
sage: SUK.log(u) == v
|
718
|
+
True
|
719
|
+
"""
|
720
|
+
return prod((u**e for u, e in zip(self.gens_values(), exponents)),
|
721
|
+
self.number_field().one())
|