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,1073 @@
|
|
1
|
+
# sage_setup: distribution = sagemath-flint
|
2
|
+
# sage.doctest: # needs sage.symbolic
|
3
|
+
"""
|
4
|
+
Real intervals with a fixed absolute precision
|
5
|
+
"""
|
6
|
+
|
7
|
+
from sage.ext.stdsage cimport PY_NEW
|
8
|
+
|
9
|
+
from sage.libs.gmp.mpz cimport *
|
10
|
+
|
11
|
+
from sage.structure.factory import UniqueFactory
|
12
|
+
from sage.structure.element cimport Element, FieldElement
|
13
|
+
from sage.rings.ring cimport Field
|
14
|
+
from sage.rings.integer cimport Integer
|
15
|
+
import sage.rings.abc
|
16
|
+
|
17
|
+
from sage.structure.parent cimport Parent
|
18
|
+
from sage.structure.element cimport parent as parent_of
|
19
|
+
|
20
|
+
from sage.rings.real_mpfr import RR_min_prec
|
21
|
+
from sage.rings.real_mpfi import RealIntervalField, RealIntervalFieldElement
|
22
|
+
from sage.rings.rational_field import QQ
|
23
|
+
|
24
|
+
cdef Integer zero = Integer(0)
|
25
|
+
cdef Integer one = Integer(1)
|
26
|
+
|
27
|
+
cpdef inline Integer shift_floor(Integer x, long shift):
|
28
|
+
r"""
|
29
|
+
Return `x / 2^s` where `s` is the value of ``shift``, rounded towards
|
30
|
+
`-\infty`. For internal use.
|
31
|
+
|
32
|
+
EXAMPLES::
|
33
|
+
|
34
|
+
sage: from sage.rings.real_interval_absolute import shift_floor
|
35
|
+
sage: shift_floor(15, 2)
|
36
|
+
3
|
37
|
+
sage: shift_floor(-15, 2)
|
38
|
+
-4
|
39
|
+
"""
|
40
|
+
cdef Integer z = PY_NEW(Integer)
|
41
|
+
mpz_fdiv_q_2exp(z.value, x.value, shift)
|
42
|
+
return z
|
43
|
+
|
44
|
+
cpdef inline Integer shift_ceil(Integer x, long shift):
|
45
|
+
r"""
|
46
|
+
Return `x / 2^s` where `s` is the value of ``shift``, rounded towards
|
47
|
+
`+\infty`. For internal use.
|
48
|
+
|
49
|
+
EXAMPLES::
|
50
|
+
|
51
|
+
sage: from sage.rings.real_interval_absolute import shift_ceil
|
52
|
+
sage: shift_ceil(15, 2)
|
53
|
+
4
|
54
|
+
sage: shift_ceil(-15, 2)
|
55
|
+
-3
|
56
|
+
sage: shift_ceil(32, 2)
|
57
|
+
8
|
58
|
+
sage: shift_ceil(-32, 2)
|
59
|
+
-8
|
60
|
+
"""
|
61
|
+
cdef Integer z = PY_NEW(Integer)
|
62
|
+
mpz_cdiv_q_2exp(z.value, x.value, shift)
|
63
|
+
return z
|
64
|
+
|
65
|
+
|
66
|
+
class Factory(UniqueFactory):
|
67
|
+
def create_key(self, prec):
|
68
|
+
"""
|
69
|
+
The only piece of data is the precision.
|
70
|
+
|
71
|
+
TESTS::
|
72
|
+
|
73
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
74
|
+
sage: RealIntervalAbsoluteField.create_key(1000)
|
75
|
+
1000
|
76
|
+
"""
|
77
|
+
return prec
|
78
|
+
|
79
|
+
def create_object(self, version, prec):
|
80
|
+
"""
|
81
|
+
Ensures uniqueness.
|
82
|
+
|
83
|
+
TESTS::
|
84
|
+
|
85
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
86
|
+
sage: RealIntervalAbsoluteField(23) is RealIntervalAbsoluteField(23) # indirect doctest
|
87
|
+
True
|
88
|
+
"""
|
89
|
+
return RealIntervalAbsoluteField_class(prec)
|
90
|
+
|
91
|
+
|
92
|
+
RealIntervalAbsoluteField = Factory('sage.rings.real_interval_absolute.RealIntervalAbsoluteField')
|
93
|
+
RealIntervalAbsoluteField.__doc__ = RealIntervalAbsoluteField_class.__doc__
|
94
|
+
|
95
|
+
|
96
|
+
cdef class RealIntervalAbsoluteField_class(Field):
|
97
|
+
"""
|
98
|
+
This field is similar to the :class:`RealIntervalField` except instead of
|
99
|
+
truncating everything to a fixed relative precision, it maintains a
|
100
|
+
fixed absolute precision.
|
101
|
+
|
102
|
+
Note that unlike the standard real interval field, elements in this
|
103
|
+
field can have different size and experience coefficient blowup. On
|
104
|
+
the other hand, it avoids precision loss on addition and subtraction.
|
105
|
+
This is useful for, e.g., series computations for special functions.
|
106
|
+
|
107
|
+
EXAMPLES::
|
108
|
+
|
109
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
110
|
+
sage: R = RealIntervalAbsoluteField(10); R
|
111
|
+
Real Interval Field with absolute precision 2^-10
|
112
|
+
sage: R(3/10)
|
113
|
+
0.300?
|
114
|
+
sage: R(1000003/10)
|
115
|
+
100000.300?
|
116
|
+
sage: R(1e100) + R(1) - R(1e100)
|
117
|
+
1
|
118
|
+
"""
|
119
|
+
|
120
|
+
cdef long _absprec
|
121
|
+
|
122
|
+
def __init__(self, absprec):
|
123
|
+
"""
|
124
|
+
Initialize ``self``.
|
125
|
+
|
126
|
+
EXAMPLES::
|
127
|
+
|
128
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
129
|
+
sage: RealIntervalAbsoluteField(100)
|
130
|
+
Real Interval Field with absolute precision 2^-100
|
131
|
+
sage: RealIntervalAbsoluteField(-100)
|
132
|
+
Traceback (most recent call last):
|
133
|
+
File "<ipython console>", line 1, in <module>
|
134
|
+
File "real_interval_absolute.pyx", line 81, in sage.rings.real_interval_absolute.RealIntervalAbsoluteField.__init__ (sage/rings/real_interval_absolute.c:2463)
|
135
|
+
ValueError: Absolute precision must be positive.
|
136
|
+
"""
|
137
|
+
if absprec < 0:
|
138
|
+
raise ValueError("Absolute precision must be positive.")
|
139
|
+
Field.__init__(self, self)
|
140
|
+
self._absprec = absprec
|
141
|
+
|
142
|
+
def __reduce__(self):
|
143
|
+
"""
|
144
|
+
Used for pickling.
|
145
|
+
|
146
|
+
TESTS::
|
147
|
+
|
148
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
149
|
+
sage: R = RealIntervalAbsoluteField(100)
|
150
|
+
sage: loads(dumps(R))
|
151
|
+
Real Interval Field with absolute precision 2^-100
|
152
|
+
"""
|
153
|
+
return RealIntervalAbsoluteField, (self._absprec,)
|
154
|
+
|
155
|
+
def _element_constructor_(self, x):
|
156
|
+
"""
|
157
|
+
Construct an element with ``self`` as the parent.
|
158
|
+
|
159
|
+
TESTS::
|
160
|
+
|
161
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
162
|
+
sage: R = RealIntervalAbsoluteField(100)
|
163
|
+
sage: R(1/2) # indirect doctest
|
164
|
+
0.50000000000000000000000000000000?
|
165
|
+
"""
|
166
|
+
return RealIntervalAbsoluteElement(self, x)
|
167
|
+
|
168
|
+
cpdef _coerce_map_from_(self, R):
|
169
|
+
"""
|
170
|
+
Anything that coerces into the reals coerces into this ring.
|
171
|
+
|
172
|
+
TESTS::
|
173
|
+
|
174
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
175
|
+
sage: R = RealIntervalAbsoluteField(100)
|
176
|
+
sage: R.has_coerce_map_from(RR) # indirect doctest
|
177
|
+
True
|
178
|
+
sage: R.has_coerce_map_from(QQ)
|
179
|
+
True
|
180
|
+
sage: R.has_coerce_map_from(Qp(5)) # needs sage.rings.padics
|
181
|
+
False
|
182
|
+
|
183
|
+
sage: R(1/2) + 100
|
184
|
+
100.5000000000000000000000000000000?
|
185
|
+
sage: R(1/2) + 1.75
|
186
|
+
2.2500000000000000000000000000000?
|
187
|
+
|
188
|
+
sage: R10 = RealIntervalAbsoluteField(10)
|
189
|
+
sage: R10(1/4) + R(1/4)
|
190
|
+
0.50000?
|
191
|
+
"""
|
192
|
+
if isinstance(R, RealIntervalAbsoluteField_class):
|
193
|
+
return self._absprec < (<RealIntervalAbsoluteField_class>R)._absprec
|
194
|
+
elif isinstance(R, sage.rings.abc.RealIntervalField):
|
195
|
+
return True
|
196
|
+
else:
|
197
|
+
return RR_min_prec.has_coerce_map_from(R)
|
198
|
+
|
199
|
+
def _repr_(self):
|
200
|
+
"""
|
201
|
+
Return the string representation of ``self``.
|
202
|
+
|
203
|
+
TESTS::
|
204
|
+
|
205
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
206
|
+
sage: R = RealIntervalAbsoluteField(100)
|
207
|
+
sage: print(R)
|
208
|
+
Real Interval Field with absolute precision 2^-100
|
209
|
+
sage: R._repr_()
|
210
|
+
'Real Interval Field with absolute precision 2^-100'
|
211
|
+
"""
|
212
|
+
return "Real Interval Field with absolute precision 2^-%s" % self._absprec
|
213
|
+
|
214
|
+
def absprec(self):
|
215
|
+
"""
|
216
|
+
Return the absolute precision of ``self``.
|
217
|
+
|
218
|
+
EXAMPLES::
|
219
|
+
|
220
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
221
|
+
sage: R = RealIntervalAbsoluteField(100)
|
222
|
+
sage: R.absprec()
|
223
|
+
100
|
224
|
+
sage: RealIntervalAbsoluteField(5).absprec()
|
225
|
+
5
|
226
|
+
"""
|
227
|
+
return self._absprec
|
228
|
+
|
229
|
+
|
230
|
+
cdef inline shift_left(value, shift):
|
231
|
+
"""
|
232
|
+
Utility function for operands that don't support the ``<<`` operator.
|
233
|
+
"""
|
234
|
+
try:
|
235
|
+
return value << shift
|
236
|
+
except TypeError:
|
237
|
+
if isinstance(value, (str, list, tuple)):
|
238
|
+
# Better than the OverflowError we would get from trying to multiply.
|
239
|
+
raise
|
240
|
+
else:
|
241
|
+
return value * (one << shift)
|
242
|
+
|
243
|
+
cdef class RealIntervalAbsoluteElement(FieldElement):
|
244
|
+
|
245
|
+
# This could be optimized by letting these be raw mpz_t.
|
246
|
+
cdef Integer _mantissa # left endpoint
|
247
|
+
cdef Integer _diameter
|
248
|
+
|
249
|
+
def __init__(self, RealIntervalAbsoluteField_class parent, value):
|
250
|
+
"""
|
251
|
+
Create a :class:`RealIntervalAbsoluteElement`.
|
252
|
+
|
253
|
+
EXAMPLES::
|
254
|
+
|
255
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
256
|
+
sage: R = RealIntervalAbsoluteField(50)
|
257
|
+
sage: R(1)
|
258
|
+
1
|
259
|
+
sage: R(1/3)
|
260
|
+
0.333333333333334?
|
261
|
+
sage: R(1.3)
|
262
|
+
1.300000000000000?
|
263
|
+
sage: R(pi)
|
264
|
+
3.141592653589794?
|
265
|
+
sage: R((11, 12))
|
266
|
+
12.?
|
267
|
+
sage: R((11, 11.00001))
|
268
|
+
11.00001?
|
269
|
+
|
270
|
+
sage: R100 = RealIntervalAbsoluteField(100)
|
271
|
+
sage: R(R100((5,6)))
|
272
|
+
6.?
|
273
|
+
sage: R100(R((5,6)))
|
274
|
+
6.?
|
275
|
+
sage: RIF(CIF(NaN))
|
276
|
+
[.. NaN ..]
|
277
|
+
"""
|
278
|
+
Element.__init__(self, parent)
|
279
|
+
|
280
|
+
if isinstance(value, RealIntervalAbsoluteElement):
|
281
|
+
prec_diff = (<RealIntervalAbsoluteField_class>(<Element>value)._parent)._absprec - parent._absprec
|
282
|
+
if prec_diff > 0:
|
283
|
+
self._mantissa = shift_floor((<RealIntervalAbsoluteElement>value)._mantissa, prec_diff)
|
284
|
+
self._diameter = shift_ceil((<RealIntervalAbsoluteElement>value)._diameter, prec_diff)
|
285
|
+
else:
|
286
|
+
self._mantissa = (<RealIntervalAbsoluteElement>value)._mantissa << -prec_diff
|
287
|
+
self._diameter = (<RealIntervalAbsoluteElement>value)._diameter << -prec_diff
|
288
|
+
return
|
289
|
+
|
290
|
+
if isinstance(value, tuple):
|
291
|
+
value, upper = value
|
292
|
+
elif isinstance(value, RealIntervalFieldElement):
|
293
|
+
value, upper = value.lower(), value.upper()
|
294
|
+
else:
|
295
|
+
upper = None
|
296
|
+
value = shift_left(value, parent._absprec)
|
297
|
+
if upper is not None:
|
298
|
+
upper = shift_left(upper, parent._absprec)
|
299
|
+
else:
|
300
|
+
upper = value
|
301
|
+
from sage.functions.other import floor, ceil
|
302
|
+
try:
|
303
|
+
self._mantissa = floor(value)
|
304
|
+
self._diameter = ceil(upper) - self._mantissa
|
305
|
+
except OverflowError:
|
306
|
+
raise TypeError(type(value))
|
307
|
+
|
308
|
+
def __reduce__(self):
|
309
|
+
"""
|
310
|
+
Used for pickling.
|
311
|
+
|
312
|
+
EXAMPLES::
|
313
|
+
|
314
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
315
|
+
sage: R = RealIntervalAbsoluteField(50)
|
316
|
+
sage: loads(dumps(R(1/16)))
|
317
|
+
0.06250000000000000?
|
318
|
+
sage: R = RealIntervalAbsoluteField(100)
|
319
|
+
sage: loads(dumps(R(1/3)))
|
320
|
+
0.333333333333333333333333333334?
|
321
|
+
sage: loads(dumps(R(pi))).endpoints() == R(pi).endpoints()
|
322
|
+
True
|
323
|
+
"""
|
324
|
+
return RealIntervalAbsoluteElement, (self._parent, self.endpoints())
|
325
|
+
|
326
|
+
cdef _new_c(self, Integer _mantissa, Integer _diameter):
|
327
|
+
cdef RealIntervalAbsoluteElement x
|
328
|
+
x = <RealIntervalAbsoluteElement>RealIntervalAbsoluteElement.__new__(RealIntervalAbsoluteElement)
|
329
|
+
x._parent = self._parent
|
330
|
+
x._mantissa = _mantissa
|
331
|
+
x._diameter = _diameter
|
332
|
+
return x
|
333
|
+
|
334
|
+
cpdef lower(self):
|
335
|
+
"""
|
336
|
+
Return the lower bound of ``self``.
|
337
|
+
|
338
|
+
EXAMPLES::
|
339
|
+
|
340
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
341
|
+
sage: R = RealIntervalAbsoluteField(50)
|
342
|
+
sage: R(1/4).lower()
|
343
|
+
1/4
|
344
|
+
"""
|
345
|
+
return QQ(self._mantissa) >> (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
346
|
+
|
347
|
+
cpdef midpoint(self):
|
348
|
+
"""
|
349
|
+
Return the midpoint of ``self``.
|
350
|
+
|
351
|
+
EXAMPLES::
|
352
|
+
|
353
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
354
|
+
sage: R = RealIntervalAbsoluteField(100)
|
355
|
+
sage: R(1/4).midpoint()
|
356
|
+
1/4
|
357
|
+
sage: R(pi).midpoint()
|
358
|
+
7964883625991394727376702227905/2535301200456458802993406410752
|
359
|
+
sage: R(pi).midpoint().n()
|
360
|
+
3.14159265358979
|
361
|
+
"""
|
362
|
+
return (self._mantissa + self._diameter / 2) >> (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
363
|
+
|
364
|
+
cpdef upper(self):
|
365
|
+
"""
|
366
|
+
Return the upper bound of ``self``.
|
367
|
+
|
368
|
+
EXAMPLES::
|
369
|
+
|
370
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
371
|
+
sage: R = RealIntervalAbsoluteField(50)
|
372
|
+
sage: R(1/4).upper()
|
373
|
+
1/4
|
374
|
+
"""
|
375
|
+
return QQ(self._mantissa + self._diameter) >> (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
376
|
+
|
377
|
+
cpdef absolute_diameter(self):
|
378
|
+
"""
|
379
|
+
Return the diameter ``self``.
|
380
|
+
|
381
|
+
EXAMPLES::
|
382
|
+
|
383
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
384
|
+
sage: R = RealIntervalAbsoluteField(10)
|
385
|
+
sage: R(1/4).absolute_diameter()
|
386
|
+
0
|
387
|
+
sage: a = R(pi)
|
388
|
+
sage: a.absolute_diameter()
|
389
|
+
1/1024
|
390
|
+
sage: a.upper() - a.lower()
|
391
|
+
1/1024
|
392
|
+
"""
|
393
|
+
return QQ(self._diameter) >> (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
394
|
+
|
395
|
+
diameter = absolute_diameter
|
396
|
+
|
397
|
+
cpdef endpoints(self):
|
398
|
+
"""
|
399
|
+
Return the left and right endpoints of ``self``, as a tuple.
|
400
|
+
|
401
|
+
EXAMPLES::
|
402
|
+
|
403
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
404
|
+
sage: R = RealIntervalAbsoluteField(10)
|
405
|
+
sage: R(1/4).endpoints()
|
406
|
+
(1/4, 1/4)
|
407
|
+
sage: R((1,2)).endpoints()
|
408
|
+
(1, 2)
|
409
|
+
"""
|
410
|
+
return self.lower(), self.upper()
|
411
|
+
|
412
|
+
def _real_mpfi_(self, R):
|
413
|
+
"""
|
414
|
+
Create a (relative) real interval out of this absolute real interval.
|
415
|
+
|
416
|
+
EXAMPLES::
|
417
|
+
|
418
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
419
|
+
sage: R = RealIntervalAbsoluteField(10)
|
420
|
+
sage: R(1/2)._real_mpfi_(RIF)
|
421
|
+
0.50000000000000000?
|
422
|
+
|
423
|
+
sage: a = RealIntervalAbsoluteField(100)(1/3)
|
424
|
+
sage: RIF(a)
|
425
|
+
0.3333333333333334?
|
426
|
+
"""
|
427
|
+
return R(self._mantissa, self._mantissa + self._diameter) >> (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
428
|
+
|
429
|
+
cpdef long mpfi_prec(self) noexcept:
|
430
|
+
"""
|
431
|
+
Return the precision needed to represent this value as an mpfi interval.
|
432
|
+
|
433
|
+
EXAMPLES::
|
434
|
+
|
435
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
436
|
+
sage: R = RealIntervalAbsoluteField(10)
|
437
|
+
sage: R(10).mpfi_prec()
|
438
|
+
14
|
439
|
+
sage: R(1000).mpfi_prec()
|
440
|
+
20
|
441
|
+
"""
|
442
|
+
return max(mpz_sizeinbase(self._mantissa.value, 2), mpz_sizeinbase(self._diameter.value, 2))
|
443
|
+
|
444
|
+
def _repr_(self):
|
445
|
+
"""
|
446
|
+
Leverage real interval printing.
|
447
|
+
|
448
|
+
TESTS::
|
449
|
+
|
450
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
451
|
+
sage: R = RealIntervalAbsoluteField(10)
|
452
|
+
sage: R(1/3) # indirect doctest
|
453
|
+
0.334?
|
454
|
+
sage: R(10^50/3)
|
455
|
+
3.3333333333333333333333333333333333333333333333333334?e49
|
456
|
+
sage: R(0)
|
457
|
+
0
|
458
|
+
"""
|
459
|
+
prec = max(self.mpfi_prec(), 5)
|
460
|
+
return repr(self._real_mpfi_(RealIntervalField(prec)))
|
461
|
+
|
462
|
+
def __hash__(self):
|
463
|
+
"""
|
464
|
+
Hash to the midpoint of the interval.
|
465
|
+
|
466
|
+
TESTS::
|
467
|
+
|
468
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
469
|
+
sage: R = RealIntervalAbsoluteField(10)
|
470
|
+
sage: hash(R(10))
|
471
|
+
10
|
472
|
+
sage: hash(R((11,13)))
|
473
|
+
12
|
474
|
+
sage: hash(R(1/4)) == hash(1/4)
|
475
|
+
True
|
476
|
+
sage: hash(R(pi))
|
477
|
+
891658780 # 32-bit
|
478
|
+
532995478001132060 # 64-bit
|
479
|
+
"""
|
480
|
+
return hash(self.midpoint())
|
481
|
+
|
482
|
+
def __contains__(self, x):
|
483
|
+
"""
|
484
|
+
Return whether the given value lies in this interval.
|
485
|
+
|
486
|
+
EXAMPLES::
|
487
|
+
|
488
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
489
|
+
sage: R = RealIntervalAbsoluteField(50)
|
490
|
+
sage: 1 in R((1,2))
|
491
|
+
True
|
492
|
+
sage: 2 in R((1,2))
|
493
|
+
True
|
494
|
+
sage: 3 in R((1,2))
|
495
|
+
False
|
496
|
+
sage: 1.75 in R((1,2))
|
497
|
+
True
|
498
|
+
"""
|
499
|
+
x *= (one << self._parent.absprec())
|
500
|
+
return self._mantissa <= x <= self._mantissa + self._diameter
|
501
|
+
|
502
|
+
cpdef bint is_positive(self) noexcept:
|
503
|
+
"""
|
504
|
+
Return whether ``self`` is definitely positive.
|
505
|
+
|
506
|
+
EXAMPLES::
|
507
|
+
|
508
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
509
|
+
sage: R = RealIntervalAbsoluteField(10)
|
510
|
+
sage: R(10).is_positive()
|
511
|
+
True
|
512
|
+
sage: R((10,11)).is_positive()
|
513
|
+
True
|
514
|
+
sage: R((0,11)).is_positive()
|
515
|
+
False
|
516
|
+
sage: R((-10,11)).is_positive()
|
517
|
+
False
|
518
|
+
sage: R((-10,-1)).is_positive()
|
519
|
+
False
|
520
|
+
sage: R(pi).is_positive()
|
521
|
+
True
|
522
|
+
"""
|
523
|
+
return mpz_sgn(self._mantissa.value) == 1
|
524
|
+
|
525
|
+
cpdef bint contains_zero(self) noexcept:
|
526
|
+
"""
|
527
|
+
Return whether ``self`` contains zero.
|
528
|
+
|
529
|
+
EXAMPLES::
|
530
|
+
|
531
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
532
|
+
sage: R = RealIntervalAbsoluteField(10)
|
533
|
+
sage: R(10).contains_zero()
|
534
|
+
False
|
535
|
+
sage: R((10,11)).contains_zero()
|
536
|
+
False
|
537
|
+
sage: R((0,11)).contains_zero()
|
538
|
+
True
|
539
|
+
sage: R((-10,11)).contains_zero()
|
540
|
+
True
|
541
|
+
sage: R((-10,-1)).contains_zero()
|
542
|
+
False
|
543
|
+
sage: R((-10,0)).contains_zero()
|
544
|
+
True
|
545
|
+
sage: R(pi).contains_zero()
|
546
|
+
False
|
547
|
+
"""
|
548
|
+
return (mpz_sgn(self._mantissa.value) == 0
|
549
|
+
or (mpz_sgn(self._mantissa.value) == -1 and mpz_cmpabs(self._mantissa.value, self._diameter.value) <= 0))
|
550
|
+
|
551
|
+
cpdef bint is_negative(self) noexcept:
|
552
|
+
"""
|
553
|
+
Return whether ``self`` is definitely negative.
|
554
|
+
|
555
|
+
EXAMPLES::
|
556
|
+
|
557
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
558
|
+
sage: R = RealIntervalAbsoluteField(100)
|
559
|
+
sage: R(10).is_negative()
|
560
|
+
False
|
561
|
+
sage: R((10,11)).is_negative()
|
562
|
+
False
|
563
|
+
sage: R((0,11)).is_negative()
|
564
|
+
False
|
565
|
+
sage: R((-10,11)).is_negative()
|
566
|
+
False
|
567
|
+
sage: R((-10,-1)).is_negative()
|
568
|
+
True
|
569
|
+
sage: R(pi).is_negative()
|
570
|
+
False
|
571
|
+
"""
|
572
|
+
return (mpz_sgn(self._mantissa.value) == -1
|
573
|
+
and mpz_cmpabs(self._mantissa.value, self._diameter.value) > 0)
|
574
|
+
|
575
|
+
cdef bint is_exact(self) noexcept:
|
576
|
+
return not self._diameter
|
577
|
+
|
578
|
+
def __bool__(self):
|
579
|
+
"""
|
580
|
+
Return ``True`` for anything except exact zero.
|
581
|
+
|
582
|
+
EXAMPLES::
|
583
|
+
|
584
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
585
|
+
sage: R = RealIntervalAbsoluteField(10)
|
586
|
+
sage: bool(R(1))
|
587
|
+
True
|
588
|
+
sage: bool(R(0))
|
589
|
+
False
|
590
|
+
sage: bool(R((0,1)))
|
591
|
+
True
|
592
|
+
"""
|
593
|
+
return not not self._mantissa or not not self._diameter
|
594
|
+
|
595
|
+
def __neg__(self):
|
596
|
+
"""
|
597
|
+
TESTS::
|
598
|
+
|
599
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
600
|
+
sage: R = RealIntervalAbsoluteField(100)
|
601
|
+
sage: -R(1/2)
|
602
|
+
-0.50000000000000000000000000000000?
|
603
|
+
sage: -R((101,102))
|
604
|
+
-102.?
|
605
|
+
"""
|
606
|
+
return self._new_c(-self._mantissa - self._diameter, self._diameter)
|
607
|
+
|
608
|
+
def __abs__(self):
|
609
|
+
"""
|
610
|
+
EXAMPLES::
|
611
|
+
|
612
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
613
|
+
sage: R = RealIntervalAbsoluteField(100)
|
614
|
+
sage: abs(-R(1/4))
|
615
|
+
0.2500000000000000000000000000000?
|
616
|
+
"""
|
617
|
+
return self.abs()
|
618
|
+
|
619
|
+
cpdef abs(self):
|
620
|
+
"""
|
621
|
+
Return the absolute value of ``self``.
|
622
|
+
|
623
|
+
EXAMPLES::
|
624
|
+
|
625
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
626
|
+
sage: R = RealIntervalAbsoluteField(100)
|
627
|
+
sage: R(1/3).abs()
|
628
|
+
0.333333333333333333333333333334?
|
629
|
+
sage: R(-1/3).abs()
|
630
|
+
0.333333333333333333333333333334?
|
631
|
+
sage: R((-1/3, 1/2)).abs()
|
632
|
+
1.?
|
633
|
+
sage: R((-1/3, 1/2)).abs().endpoints()
|
634
|
+
(0, 1/2)
|
635
|
+
sage: R((-3/2, 1/2)).abs().endpoints()
|
636
|
+
(0, 3/2)
|
637
|
+
"""
|
638
|
+
if self.is_positive():
|
639
|
+
return self
|
640
|
+
elif self.is_negative():
|
641
|
+
return -self
|
642
|
+
else:
|
643
|
+
return self._new_c(zero, max(-self._mantissa, self._mantissa + self._diameter))
|
644
|
+
|
645
|
+
cpdef _add_(self, _other):
|
646
|
+
"""
|
647
|
+
TESTS::
|
648
|
+
|
649
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
650
|
+
sage: R = RealIntervalAbsoluteField(10)
|
651
|
+
sage: R(1) + R(2) # indirect doctest
|
652
|
+
3
|
653
|
+
sage: R(1e100) + R(0.1) + R(-1e100)
|
654
|
+
0.100?
|
655
|
+
sage: (R((1,2)) + 1).endpoints()
|
656
|
+
(2, 3)
|
657
|
+
sage: (R((1,2)) + R((-10,0))).endpoints()
|
658
|
+
(-9, 2)
|
659
|
+
"""
|
660
|
+
cdef RealIntervalAbsoluteElement other = <RealIntervalAbsoluteElement>_other
|
661
|
+
return self._new_c(self._mantissa + other._mantissa, self._diameter + other._diameter)
|
662
|
+
|
663
|
+
cpdef _sub_(self, _other):
|
664
|
+
"""
|
665
|
+
TESTS::
|
666
|
+
|
667
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
668
|
+
sage: R = RealIntervalAbsoluteField(10)
|
669
|
+
sage: R(1) - R(2) # indirect doctest
|
670
|
+
-1
|
671
|
+
sage: R(1e100) - R(0.1) - R(1e100)
|
672
|
+
-0.100?
|
673
|
+
sage: (R((1,2)) - 1).endpoints()
|
674
|
+
(0, 1)
|
675
|
+
sage: (R((1,2)) - R((10,100))).endpoints()
|
676
|
+
(-99, -8)
|
677
|
+
sage: R(pi) - R(pi)
|
678
|
+
0.000?
|
679
|
+
"""
|
680
|
+
cdef RealIntervalAbsoluteElement other = <RealIntervalAbsoluteElement>_other
|
681
|
+
return self._new_c(self._mantissa - other._mantissa - other._diameter, self._diameter + other._diameter)
|
682
|
+
|
683
|
+
cpdef _mul_(self, _other):
|
684
|
+
"""
|
685
|
+
TESTS::
|
686
|
+
|
687
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
688
|
+
sage: R = RealIntervalAbsoluteField(10)
|
689
|
+
sage: R(2) * R(3) # indirect doctest
|
690
|
+
6
|
691
|
+
sage: R(2) * R(-3)
|
692
|
+
-6
|
693
|
+
sage: elts = [R((left, right)) for left in [-2..2] for right in [left+1..2]]
|
694
|
+
sage: elts
|
695
|
+
[-2.?, -1.?, 0.?e1, 0.?e1, -1.?, 0.?, 0.?e1, 1.?, 1.?, 2.?]
|
696
|
+
sage: for a in elts:
|
697
|
+
....: for b in elts:
|
698
|
+
....: if (a*b).lower() != (a._real_mpfi_(RIF)*b._real_mpfi_(RIF)).lower():
|
699
|
+
....: print(a, b)
|
700
|
+
....: if (a*b).upper() != (a._real_mpfi_(RIF)*b._real_mpfi_(RIF)).upper():
|
701
|
+
....: print(a, b)
|
702
|
+
sage: R(pi) * R(pi) - R(pi^2)
|
703
|
+
0.00?
|
704
|
+
"""
|
705
|
+
cdef bint negate = False
|
706
|
+
cdef RealIntervalAbsoluteElement other = <RealIntervalAbsoluteElement>_other
|
707
|
+
cdef long absprec = (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
708
|
+
|
709
|
+
# Break symmetry.
|
710
|
+
if self.is_negative():
|
711
|
+
negate = not negate
|
712
|
+
self = -self
|
713
|
+
if other.is_negative():
|
714
|
+
negate = not negate
|
715
|
+
other = -other
|
716
|
+
elif other.contains_zero():
|
717
|
+
self, other = other, self
|
718
|
+
|
719
|
+
if self.is_positive():
|
720
|
+
if other.is_positive():
|
721
|
+
res = self._new_c(shift_floor(self._mantissa * other._mantissa, absprec),
|
722
|
+
shift_ceil(self._mantissa * other._diameter + (other._mantissa + other._diameter) * self._diameter, absprec))
|
723
|
+
else:
|
724
|
+
res = self._new_c(shift_floor((self._mantissa + self._diameter) * other._mantissa, absprec),
|
725
|
+
shift_ceil((self._mantissa + self._diameter) * other._diameter, absprec))
|
726
|
+
else:
|
727
|
+
# They both contain zero.
|
728
|
+
self_lower, self_upper = self._mantissa, self._mantissa + self._diameter
|
729
|
+
other_lower, other_upper = other._mantissa, other._mantissa + other._diameter
|
730
|
+
lower = min(self_lower * other_upper, self_upper * other_lower)
|
731
|
+
upper = max(self_lower * other_lower, self_upper * other_upper)
|
732
|
+
res = self._new_c(shift_floor(lower, absprec),
|
733
|
+
shift_ceil(upper - lower, absprec))
|
734
|
+
if negate:
|
735
|
+
res = -res
|
736
|
+
return res
|
737
|
+
|
738
|
+
cpdef _acted_upon_(self, x, bint self_on_left):
|
739
|
+
"""
|
740
|
+
``Absprec * relprec -> absprec`` works better than coercing both
|
741
|
+
operands to absolute precision first.
|
742
|
+
|
743
|
+
EXAMPLES::
|
744
|
+
|
745
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
746
|
+
sage: R = RealIntervalAbsoluteField(4)
|
747
|
+
sage: 1/4 * R(100)
|
748
|
+
25
|
749
|
+
sage: 1/100 * R(100)
|
750
|
+
1
|
751
|
+
sage: R(1/100) * R(100)
|
752
|
+
1.?e1
|
753
|
+
sage: RIF(1/100) * R(100)
|
754
|
+
1.0?
|
755
|
+
|
756
|
+
sage: R(1.5)._acted_upon_(3, True)
|
757
|
+
4.500?
|
758
|
+
"""
|
759
|
+
if x < 0:
|
760
|
+
neg = self._acted_upon_(-x, self_on_left)
|
761
|
+
return None if neg is None else -neg
|
762
|
+
if type(x) in (int, Integer):
|
763
|
+
return self._new_c(self._mantissa * x, self._diameter * x)
|
764
|
+
P = parent_of(x)
|
765
|
+
if isinstance(P, Parent):
|
766
|
+
if P.is_exact():
|
767
|
+
left = (self._mantissa * x).floor()
|
768
|
+
right = ((self._mantissa + self._diameter) * x).ceil()
|
769
|
+
return self._new_c(left, right - left)
|
770
|
+
elif isinstance(x, RealIntervalFieldElement):
|
771
|
+
if x.contains_zero() or self.contains_zero():
|
772
|
+
return self * RealIntervalAbsoluteElement(self._parent, (x.lower(), x.upper()))
|
773
|
+
# Remember, x > 0
|
774
|
+
if self.is_positive():
|
775
|
+
left = (self._mantissa * x.lower()).floor()
|
776
|
+
right = ((self._mantissa + self._diameter) * x.upper()).ceil()
|
777
|
+
else:
|
778
|
+
left = (self._mantissa * x.upper()).floor()
|
779
|
+
right = ((self._mantissa + self._diameter) * x.lower()).ceil()
|
780
|
+
return self._new_c(left, right - left)
|
781
|
+
|
782
|
+
def __invert__(self):
|
783
|
+
"""
|
784
|
+
EXAMPLES::
|
785
|
+
|
786
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
787
|
+
sage: R = RealIntervalAbsoluteField(10)
|
788
|
+
sage: ~R(2)
|
789
|
+
0.50000?
|
790
|
+
sage: ~~R(2)
|
791
|
+
2
|
792
|
+
sage: ~R(3)
|
793
|
+
0.334?
|
794
|
+
sage: ~~R(3)
|
795
|
+
3.00?
|
796
|
+
|
797
|
+
sage: R = RealIntervalAbsoluteField(200)
|
798
|
+
sage: ~R(1e10)
|
799
|
+
1.00000000000000000000000000000000000000000000000000?e-10
|
800
|
+
sage: ~~R(1e10)
|
801
|
+
1.00000000000000000000000000000000000000000000000000?e10
|
802
|
+
sage: (~R((1,2))).endpoints()
|
803
|
+
(1/2, 1)
|
804
|
+
sage: (~R((1/4,8))).endpoints()
|
805
|
+
(1/8, 4)
|
806
|
+
sage: R(1/pi) - 1/R(pi)
|
807
|
+
0.?e-60
|
808
|
+
"""
|
809
|
+
if self.contains_zero():
|
810
|
+
raise ZeroDivisionError("Inversion of an interval containing zero.")
|
811
|
+
cdef long absprec = (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
812
|
+
cdef bint negate
|
813
|
+
if self.is_negative():
|
814
|
+
self = -self
|
815
|
+
negate = True
|
816
|
+
else:
|
817
|
+
negate = False
|
818
|
+
|
819
|
+
# Let our (positive) interval be [2^-B a, 2^-B b].
|
820
|
+
# Then its inverse is [2^-B 2^(2B)/b , 2^-B 2^(2B)/a].
|
821
|
+
|
822
|
+
cdef Integer mantissa = <Integer>PY_NEW(Integer)
|
823
|
+
cdef Integer diameter = <Integer>PY_NEW(Integer)
|
824
|
+
cdef mpz_t scaling_factor
|
825
|
+
mpz_init_set_ui(scaling_factor, 1)
|
826
|
+
try:
|
827
|
+
mpz_set_ui(scaling_factor, 1)
|
828
|
+
mpz_mul_2exp(scaling_factor, scaling_factor, 2 * absprec)
|
829
|
+
# Use diameter as temp value for right endpoint...
|
830
|
+
mpz_add(diameter.value, self._mantissa.value, self._diameter.value)
|
831
|
+
mpz_fdiv_q(mantissa.value, scaling_factor, diameter.value)
|
832
|
+
# Divide a second time to get the rounding correct...
|
833
|
+
mpz_cdiv_q(diameter.value, scaling_factor, self._mantissa.value)
|
834
|
+
mpz_sub(diameter.value, diameter.value, mantissa.value)
|
835
|
+
finally:
|
836
|
+
mpz_clear(scaling_factor)
|
837
|
+
|
838
|
+
res = self._new_c(mantissa, diameter)
|
839
|
+
if negate:
|
840
|
+
res = -res
|
841
|
+
return res
|
842
|
+
|
843
|
+
cpdef _div_(self, _other):
|
844
|
+
"""
|
845
|
+
TESTS::
|
846
|
+
|
847
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
848
|
+
sage: R = RealIntervalAbsoluteField(10)
|
849
|
+
sage: R(5)/R(2) # indirect doctest
|
850
|
+
2.5000?
|
851
|
+
sage: a = R((5,6))/R((2,4))
|
852
|
+
sage: a.endpoints()
|
853
|
+
(5/4, 3)
|
854
|
+
sage: a = R((-5,6))/R((2,4))
|
855
|
+
sage: a.endpoints()
|
856
|
+
(-5/2, 3)
|
857
|
+
sage: R(1e100) / R(2e100)
|
858
|
+
0.50000?
|
859
|
+
"""
|
860
|
+
cdef RealIntervalAbsoluteElement other = <RealIntervalAbsoluteElement>_other
|
861
|
+
if other.contains_zero():
|
862
|
+
raise ZeroDivisionError("Division by an interval containing zero.")
|
863
|
+
|
864
|
+
cdef Integer mantissa = <Integer>PY_NEW(Integer)
|
865
|
+
cdef Integer diameter = <Integer>PY_NEW(Integer)
|
866
|
+
cdef long absprec = (<RealIntervalAbsoluteField_class>self._parent)._absprec
|
867
|
+
cdef bint negate = False
|
868
|
+
cdef mpz_t temp
|
869
|
+
mpz_init(temp)
|
870
|
+
|
871
|
+
try:
|
872
|
+
|
873
|
+
if self.is_negative():
|
874
|
+
negate = True
|
875
|
+
self = -self
|
876
|
+
|
877
|
+
mpz_mul_2exp(mantissa.value, self._mantissa.value, absprec)
|
878
|
+
if self.contains_zero():
|
879
|
+
mpz_fdiv_q(mantissa.value, mantissa.value, other._mantissa.value)
|
880
|
+
else:
|
881
|
+
mpz_add(temp, other._mantissa.value, other._diameter.value)
|
882
|
+
mpz_fdiv_q(mantissa.value, mantissa.value, temp)
|
883
|
+
|
884
|
+
mpz_add(temp, self._mantissa.value, self._diameter.value)
|
885
|
+
mpz_mul_2exp(diameter.value, temp, absprec)
|
886
|
+
mpz_cdiv_q(diameter.value, diameter.value, other._mantissa.value)
|
887
|
+
mpz_sub(diameter.value, diameter.value, mantissa.value)
|
888
|
+
|
889
|
+
finally:
|
890
|
+
mpz_clear(temp)
|
891
|
+
|
892
|
+
res = self._new_c(mantissa, diameter)
|
893
|
+
if negate:
|
894
|
+
res = -res
|
895
|
+
return res
|
896
|
+
|
897
|
+
def __lshift__(RealIntervalAbsoluteElement self, long n):
|
898
|
+
"""
|
899
|
+
EXAMPLES::
|
900
|
+
|
901
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
902
|
+
sage: R = RealIntervalAbsoluteField(10)
|
903
|
+
sage: R(1) << 2
|
904
|
+
4
|
905
|
+
sage: R(3) << -2
|
906
|
+
0.75000?
|
907
|
+
sage: (R((1/2, 5)) << 10).endpoints()
|
908
|
+
(512, 5120)
|
909
|
+
"""
|
910
|
+
return self.shift(n)
|
911
|
+
|
912
|
+
def __rshift__(RealIntervalAbsoluteElement self, long n):
|
913
|
+
"""
|
914
|
+
EXAMPLES::
|
915
|
+
|
916
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
917
|
+
sage: R = RealIntervalAbsoluteField(10)
|
918
|
+
sage: R(1) >> 2
|
919
|
+
0.2500?
|
920
|
+
sage: R(3) >> -2
|
921
|
+
12
|
922
|
+
sage: (R((1/2, 5)) >> 10).endpoints()
|
923
|
+
(0, 5/1024)
|
924
|
+
"""
|
925
|
+
return self.shift(-n)
|
926
|
+
|
927
|
+
cdef shift(self, long n):
|
928
|
+
if n >= 0:
|
929
|
+
return self._new_c(self._mantissa << n, self._diameter << n)
|
930
|
+
else:
|
931
|
+
return self._new_c(shift_floor(self._mantissa, -n), shift_ceil(self._diameter, -n))
|
932
|
+
|
933
|
+
def __pow__(self, exponent, dummy):
|
934
|
+
"""
|
935
|
+
EXAMPLES::
|
936
|
+
|
937
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
938
|
+
sage: R = RealIntervalAbsoluteField(10)
|
939
|
+
sage: R(10)^10
|
940
|
+
10000000000
|
941
|
+
sage: R(10)^100
|
942
|
+
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
943
|
+
sage: R(10)^-2
|
944
|
+
0.010?
|
945
|
+
sage: R(10)^-10
|
946
|
+
0.001?
|
947
|
+
sage: R(100)^(1/2)
|
948
|
+
10.00?
|
949
|
+
sage: (R((2,3))^2).endpoints()
|
950
|
+
(4, 9)
|
951
|
+
sage: (R((-5,3))^3).endpoints()
|
952
|
+
(-125, 75)
|
953
|
+
sage: (R((-5,3))^4).endpoints()
|
954
|
+
(0, 625)
|
955
|
+
"""
|
956
|
+
cdef RealIntervalAbsoluteElement base
|
957
|
+
try:
|
958
|
+
base = self
|
959
|
+
except TypeError:
|
960
|
+
base = exponent.parent()(self)
|
961
|
+
cdef RealIntervalAbsoluteField_class parent = self.parent()
|
962
|
+
if not base:
|
963
|
+
if not exponent:
|
964
|
+
raise ZeroDivisionError
|
965
|
+
else:
|
966
|
+
return base
|
967
|
+
import math
|
968
|
+
cdef double height
|
969
|
+
base_height = max(abs(base.lower()), abs(base.upper()))
|
970
|
+
height = math.log(base_height) / math.log(2)
|
971
|
+
height *= <double>(exponent.midpoint() if isinstance(exponent, RealIntervalAbsoluteElement) else exponent)
|
972
|
+
relprec = max(<long>height + parent._absprec, 10)
|
973
|
+
RIF = RealIntervalField(relprec)
|
974
|
+
if isinstance(exponent, RealIntervalAbsoluteElement):
|
975
|
+
exponent = exponent._real_mpfi_(RIF)
|
976
|
+
return parent(base._real_mpfi_(RIF)**exponent)
|
977
|
+
|
978
|
+
def __getattr__(self, name):
|
979
|
+
"""
|
980
|
+
EXAMPLES::
|
981
|
+
|
982
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
983
|
+
sage: R = RealIntervalAbsoluteField(100)
|
984
|
+
sage: R(1).sin()
|
985
|
+
0.841470984807896506652502321631?
|
986
|
+
sage: R(2).log()
|
987
|
+
0.693147180559945309417232121458?
|
988
|
+
sage: R(1).exp().log()
|
989
|
+
1.00000000000000000000000000000?
|
990
|
+
|
991
|
+
sage: R((0,10)).sin().endpoints()
|
992
|
+
(-1, 1)
|
993
|
+
sage: R(1).sin().parent()
|
994
|
+
Real Interval Field with absolute precision 2^-100
|
995
|
+
"""
|
996
|
+
if name[0] != '_' and hasattr(RealIntervalFieldElement, name):
|
997
|
+
return MpfrOp(self, name)
|
998
|
+
else:
|
999
|
+
raise AttributeError(name)
|
1000
|
+
|
1001
|
+
def sqrt(self):
|
1002
|
+
"""
|
1003
|
+
Return the square root of ``self``.
|
1004
|
+
|
1005
|
+
EXAMPLES::
|
1006
|
+
|
1007
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
1008
|
+
sage: R = RealIntervalAbsoluteField(100)
|
1009
|
+
sage: R(2).sqrt()
|
1010
|
+
1.414213562373095048801688724210?
|
1011
|
+
sage: R((4,9)).sqrt().endpoints()
|
1012
|
+
(2, 3)
|
1013
|
+
"""
|
1014
|
+
return self._parent(self._real_mpfi_(RealIntervalField(self.mpfi_prec())).sqrt())
|
1015
|
+
|
1016
|
+
cdef class MpfrOp:
|
1017
|
+
"""
|
1018
|
+
This class is used to endow absolute real interval field elements with
|
1019
|
+
all the methods of (relative) real interval field elements.
|
1020
|
+
|
1021
|
+
EXAMPLES::
|
1022
|
+
|
1023
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField
|
1024
|
+
sage: R = RealIntervalAbsoluteField(100)
|
1025
|
+
sage: R(1).sin()
|
1026
|
+
0.841470984807896506652502321631?
|
1027
|
+
"""
|
1028
|
+
cdef object name
|
1029
|
+
cdef RealIntervalAbsoluteElement value
|
1030
|
+
|
1031
|
+
def __init__(self, value, name):
|
1032
|
+
"""
|
1033
|
+
EXAMPLES::
|
1034
|
+
|
1035
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField, MpfrOp
|
1036
|
+
sage: R = RealIntervalAbsoluteField(100)
|
1037
|
+
sage: MpfrOp(R(1), 'tan')()
|
1038
|
+
1.557407724654902230506974807459?
|
1039
|
+
"""
|
1040
|
+
self.name = name
|
1041
|
+
self.value = value
|
1042
|
+
|
1043
|
+
def __call__(self, *args):
|
1044
|
+
"""
|
1045
|
+
EXAMPLES::
|
1046
|
+
|
1047
|
+
sage: from sage.rings.real_interval_absolute import RealIntervalAbsoluteField, MpfrOp
|
1048
|
+
sage: R = RealIntervalAbsoluteField(100)
|
1049
|
+
sage: curried_log = MpfrOp(R(2), 'log')
|
1050
|
+
sage: curried_log()
|
1051
|
+
0.693147180559945309417232121458?
|
1052
|
+
sage: curried_log(2)
|
1053
|
+
1
|
1054
|
+
"""
|
1055
|
+
cdef RealIntervalAbsoluteField_class parent = self.value._parent
|
1056
|
+
cdef long absprec = parent._absprec
|
1057
|
+
cdef long relprec = self.value.mpfi_prec()
|
1058
|
+
for a in args:
|
1059
|
+
if isinstance(a, RealIntervalAbsoluteElement):
|
1060
|
+
absprec = min(absprec, (<RealIntervalAbsoluteField_class>(<RealIntervalAbsoluteElement>a)._parent)._absprec)
|
1061
|
+
relprec = max(absprec, (<RealIntervalAbsoluteElement>a).mpfi_prec())
|
1062
|
+
if parent._absprec > absprec:
|
1063
|
+
parent = RealIntervalAbsoluteField(absprec)
|
1064
|
+
if relprec < 53:
|
1065
|
+
relprec = 53
|
1066
|
+
R = RealIntervalField(relprec)
|
1067
|
+
new_args = []
|
1068
|
+
for a in args:
|
1069
|
+
if isinstance(a, RealIntervalAbsoluteElement):
|
1070
|
+
new_args.append(a._real_mpfi_(R))
|
1071
|
+
else:
|
1072
|
+
new_args.append(a)
|
1073
|
+
return parent(getattr(self.value._real_mpfi_(R), self.name)(*new_args))
|