passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_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_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
sage/functions/log.py
ADDED
|
@@ -0,0 +1,1402 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Logarithmic functions
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Yoora Yi Tenen (2012-11-16): Add documentation for :meth:`log()` (:issue:`12113`)
|
|
8
|
+
|
|
9
|
+
- Tomas Kalvoda (2015-04-01): Add :meth:`exp_polar()` (:issue:`18085`)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from sage.misc.functional import log
|
|
13
|
+
from sage.misc.lazy_import import lazy_import
|
|
14
|
+
from sage.rings.integer import Integer
|
|
15
|
+
from sage.rings.integer_ring import ZZ
|
|
16
|
+
from sage.rings.rational_field import QQ
|
|
17
|
+
from sage.rings.real_double import RDF
|
|
18
|
+
from sage.structure.element import Expression, parent as s_parent
|
|
19
|
+
from sage.symbolic.function import GinacFunction, BuiltinFunction
|
|
20
|
+
from sage.symbolic.symbols import register_symbol
|
|
21
|
+
|
|
22
|
+
lazy_import('sage.functions.gamma', 'psi1')
|
|
23
|
+
lazy_import('sage.functions.other', 'imag')
|
|
24
|
+
lazy_import('sage.functions.transcendental', ['hurwitz_zeta', 'zeta'])
|
|
25
|
+
|
|
26
|
+
lazy_import('sage.symbolic.constants', 'e', as_='const_e')
|
|
27
|
+
lazy_import('sage.symbolic.constants', 'pi', as_='const_pi')
|
|
28
|
+
lazy_import('sage.rings.complex_double', 'CDF')
|
|
29
|
+
|
|
30
|
+
lazy_import('sage.libs.flint.arith_sage', 'harmonic_number', as_='_flint_harmonic_number')
|
|
31
|
+
|
|
32
|
+
lazy_import('sage.libs.mpmath.utils', 'call', as_='_mpmath_utils_call')
|
|
33
|
+
lazy_import('mpmath', 'harmonic', as_='_mpmath_harmonic')
|
|
34
|
+
lazy_import('mpmath', 'lambertw', as_='_mpmath_lambertw')
|
|
35
|
+
|
|
36
|
+
lazy_import('sympy', 'polylog', as_='_sympy_polylog')
|
|
37
|
+
lazy_import('sympy', 'sympify', as_='_sympify')
|
|
38
|
+
|
|
39
|
+
lazy_import('scipy.special', 'lambertw', as_='_scipy_lambertw')
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class Function_exp(GinacFunction):
|
|
43
|
+
r"""
|
|
44
|
+
The exponential function, `\exp(x) = e^x`.
|
|
45
|
+
|
|
46
|
+
EXAMPLES::
|
|
47
|
+
|
|
48
|
+
sage: # needs sage.symbolic
|
|
49
|
+
sage: exp(-1)
|
|
50
|
+
e^(-1)
|
|
51
|
+
sage: exp(2)
|
|
52
|
+
e^2
|
|
53
|
+
sage: exp(2).n(100)
|
|
54
|
+
7.3890560989306502272304274606
|
|
55
|
+
sage: exp(x^2 + log(x))
|
|
56
|
+
e^(x^2 + log(x))
|
|
57
|
+
sage: exp(x^2 + log(x)).simplify()
|
|
58
|
+
x*e^(x^2)
|
|
59
|
+
sage: exp(2.5)
|
|
60
|
+
12.1824939607035
|
|
61
|
+
sage: exp(I*pi/12)
|
|
62
|
+
(1/4*I + 1/4)*sqrt(6) - (1/4*I - 1/4)*sqrt(2)
|
|
63
|
+
|
|
64
|
+
sage: exp(float(2.5))
|
|
65
|
+
12.182493960703473
|
|
66
|
+
sage: exp(RDF('2.5')) # needs sage.symbolic
|
|
67
|
+
12.182493960703473
|
|
68
|
+
|
|
69
|
+
To prevent automatic evaluation, use the ``hold`` parameter::
|
|
70
|
+
|
|
71
|
+
sage: exp(I*pi, hold=True) # needs sage.symbolic
|
|
72
|
+
e^(I*pi)
|
|
73
|
+
sage: exp(0, hold=True) # needs sage.symbolic
|
|
74
|
+
e^0
|
|
75
|
+
|
|
76
|
+
To then evaluate again, we currently must use Maxima via
|
|
77
|
+
:meth:`sage.symbolic.expression.Expression.simplify`::
|
|
78
|
+
|
|
79
|
+
sage: exp(0, hold=True).simplify() # needs sage.symbolic
|
|
80
|
+
1
|
|
81
|
+
|
|
82
|
+
::
|
|
83
|
+
|
|
84
|
+
sage: # needs sage.symbolic
|
|
85
|
+
sage: exp(pi*I/2)
|
|
86
|
+
I
|
|
87
|
+
sage: exp(pi*I)
|
|
88
|
+
-1
|
|
89
|
+
sage: exp(8*pi*I)
|
|
90
|
+
1
|
|
91
|
+
sage: exp(7*pi*I/2)
|
|
92
|
+
-I
|
|
93
|
+
|
|
94
|
+
For the sake of simplification, the argument is reduced modulo the
|
|
95
|
+
period of the complex exponential function, `2\pi i`::
|
|
96
|
+
|
|
97
|
+
sage: k = var('k', domain='integer') # needs sage.symbolic
|
|
98
|
+
sage: exp(2*k*pi*I) # needs sage.symbolic
|
|
99
|
+
1
|
|
100
|
+
sage: exp(log(2) + 2*k*pi*I) # needs sage.symbolic
|
|
101
|
+
2
|
|
102
|
+
|
|
103
|
+
The precision for the result is deduced from the precision of
|
|
104
|
+
the input. Convert the input to a higher precision explicitly
|
|
105
|
+
if a result with higher precision is desired::
|
|
106
|
+
|
|
107
|
+
sage: t = exp(RealField(100)(2)); t # needs sage.rings.real_mpfr
|
|
108
|
+
7.3890560989306502272304274606
|
|
109
|
+
sage: t.prec() # needs sage.rings.real_mpfr
|
|
110
|
+
100
|
|
111
|
+
sage: exp(2).n(100) # needs sage.symbolic
|
|
112
|
+
7.3890560989306502272304274606
|
|
113
|
+
|
|
114
|
+
TESTS::
|
|
115
|
+
|
|
116
|
+
sage: # needs sage.symbolic
|
|
117
|
+
sage: latex(exp(x))
|
|
118
|
+
e^{x}
|
|
119
|
+
sage: latex(exp(sqrt(x)))
|
|
120
|
+
e^{\sqrt{x}}
|
|
121
|
+
sage: latex(exp)
|
|
122
|
+
\exp
|
|
123
|
+
sage: latex(exp(sqrt(x))^x)
|
|
124
|
+
\left(e^{\sqrt{x}}\right)^{x}
|
|
125
|
+
sage: latex(exp(sqrt(x)^x))
|
|
126
|
+
e^{\left(\sqrt{x}^{x}\right)}
|
|
127
|
+
sage: exp(x)._sympy_() # needs sympy
|
|
128
|
+
exp(x)
|
|
129
|
+
|
|
130
|
+
Test conjugates::
|
|
131
|
+
|
|
132
|
+
sage: conjugate(exp(x)) # needs sage.symbolic
|
|
133
|
+
e^conjugate(x)
|
|
134
|
+
|
|
135
|
+
Test simplifications when taking powers of exp (:issue:`7264`)::
|
|
136
|
+
|
|
137
|
+
sage: # needs sage.symbolic
|
|
138
|
+
sage: var('a,b,c,II')
|
|
139
|
+
(a, b, c, II)
|
|
140
|
+
sage: model_exp = exp(II)**a*(b)
|
|
141
|
+
sage: sol1_l = {b: 5.0, a: 1.1}
|
|
142
|
+
sage: model_exp.subs(sol1_l)
|
|
143
|
+
5.00000000000000*e^(1.10000000000000*II)
|
|
144
|
+
|
|
145
|
+
::
|
|
146
|
+
|
|
147
|
+
sage: # needs sage.symbolic
|
|
148
|
+
sage: exp(3)^II*exp(x)
|
|
149
|
+
e^(3*II + x)
|
|
150
|
+
sage: exp(x)*exp(x)
|
|
151
|
+
e^(2*x)
|
|
152
|
+
sage: exp(x)*exp(a)
|
|
153
|
+
e^(a + x)
|
|
154
|
+
sage: exp(x)*exp(a)^2
|
|
155
|
+
e^(2*a + x)
|
|
156
|
+
|
|
157
|
+
Another instance of the same problem (:issue:`7394`)::
|
|
158
|
+
|
|
159
|
+
sage: 2*sqrt(e) # needs sage.symbolic
|
|
160
|
+
2*e^(1/2)
|
|
161
|
+
|
|
162
|
+
Check that :issue:`19918` is fixed::
|
|
163
|
+
|
|
164
|
+
sage: exp(-x^2).subs(x=oo) # needs sage.symbolic
|
|
165
|
+
0
|
|
166
|
+
sage: exp(-x).subs(x=-oo) # needs sage.symbolic
|
|
167
|
+
+Infinity
|
|
168
|
+
"""
|
|
169
|
+
def __init__(self):
|
|
170
|
+
"""
|
|
171
|
+
TESTS::
|
|
172
|
+
|
|
173
|
+
sage: loads(dumps(exp))
|
|
174
|
+
exp
|
|
175
|
+
sage: maxima(exp(x))._sage_() # needs sage.symbolic
|
|
176
|
+
e^x
|
|
177
|
+
"""
|
|
178
|
+
GinacFunction.__init__(self, "exp", latex_name=r"\exp",
|
|
179
|
+
conversions=dict(maxima='exp', fricas='exp'))
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
exp = Function_exp()
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class Function_log1(GinacFunction):
|
|
186
|
+
r"""
|
|
187
|
+
The natural logarithm of ``x``.
|
|
188
|
+
|
|
189
|
+
See :meth:`log()` for extensive documentation.
|
|
190
|
+
|
|
191
|
+
EXAMPLES::
|
|
192
|
+
|
|
193
|
+
sage: ln(e^2) # needs sage.symbolic
|
|
194
|
+
2
|
|
195
|
+
sage: ln(2) # needs sage.symbolic
|
|
196
|
+
log(2)
|
|
197
|
+
sage: ln(10) # needs sage.symbolic
|
|
198
|
+
log(10)
|
|
199
|
+
|
|
200
|
+
TESTS::
|
|
201
|
+
|
|
202
|
+
sage: # needs sage.symbolic
|
|
203
|
+
sage: latex(x.log())
|
|
204
|
+
\log\left(x\right)
|
|
205
|
+
sage: latex(log(1/4))
|
|
206
|
+
\log\left(\frac{1}{4}\right)
|
|
207
|
+
sage: log(x)._sympy_() # needs sympy
|
|
208
|
+
log(x)
|
|
209
|
+
sage: loads(dumps(ln(x)+1))
|
|
210
|
+
log(x) + 1
|
|
211
|
+
|
|
212
|
+
``conjugate(log(x))==log(conjugate(x))`` unless on the branch cut which
|
|
213
|
+
runs along the negative real axis.::
|
|
214
|
+
|
|
215
|
+
sage: # needs sage.symbolic
|
|
216
|
+
sage: conjugate(log(x))
|
|
217
|
+
conjugate(log(x))
|
|
218
|
+
sage: var('y', domain='positive')
|
|
219
|
+
y
|
|
220
|
+
sage: conjugate(log(y))
|
|
221
|
+
log(y)
|
|
222
|
+
sage: conjugate(log(y + I))
|
|
223
|
+
conjugate(log(y + I))
|
|
224
|
+
sage: conjugate(log(-1))
|
|
225
|
+
-I*pi
|
|
226
|
+
sage: log(conjugate(-1))
|
|
227
|
+
I*pi
|
|
228
|
+
|
|
229
|
+
Check if float arguments are handled properly.::
|
|
230
|
+
|
|
231
|
+
sage: from sage.functions.log import function_log as log
|
|
232
|
+
sage: log(float(5))
|
|
233
|
+
1.6094379124341003
|
|
234
|
+
sage: log(float(0)) # needs sage.symbolic
|
|
235
|
+
-inf
|
|
236
|
+
sage: log(float(-1)) # needs sage.symbolic
|
|
237
|
+
3.141592653589793j
|
|
238
|
+
sage: log(x).subs(x=float(-1)) # needs sage.symbolic
|
|
239
|
+
3.141592653589793j
|
|
240
|
+
|
|
241
|
+
:issue:`22142`::
|
|
242
|
+
|
|
243
|
+
sage: log(QQbar(sqrt(2))) # needs sage.rings.number_field sage.symbolic
|
|
244
|
+
log(1.414213562373095?)
|
|
245
|
+
sage: log(QQbar(sqrt(2))*1.) # needs sage.rings.number_field sage.symbolic
|
|
246
|
+
0.346573590279973
|
|
247
|
+
sage: polylog(QQbar(sqrt(2)),3) # needs sage.rings.number_field sage.symbolic
|
|
248
|
+
polylog(1.414213562373095?, 3)
|
|
249
|
+
"""
|
|
250
|
+
def __init__(self):
|
|
251
|
+
"""
|
|
252
|
+
TESTS::
|
|
253
|
+
|
|
254
|
+
sage: loads(dumps(ln))
|
|
255
|
+
log
|
|
256
|
+
sage: maxima(ln(x))._sage_() # needs sage.symbolic
|
|
257
|
+
log(x)
|
|
258
|
+
"""
|
|
259
|
+
GinacFunction.__init__(self, 'log', latex_name=r'\log',
|
|
260
|
+
conversions=dict(maxima='log', fricas='log',
|
|
261
|
+
mathematica='Log', giac='ln'))
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
ln = function_log = Function_log1()
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
class Function_log2(GinacFunction):
|
|
268
|
+
"""
|
|
269
|
+
Return the logarithm of x to the given base.
|
|
270
|
+
|
|
271
|
+
See :meth:`log() <sage.functions.log.log>` for extensive documentation.
|
|
272
|
+
|
|
273
|
+
EXAMPLES::
|
|
274
|
+
|
|
275
|
+
sage: from sage.functions.log import logb
|
|
276
|
+
sage: logb(1000, 10) # needs sage.symbolic
|
|
277
|
+
3
|
|
278
|
+
|
|
279
|
+
TESTS::
|
|
280
|
+
|
|
281
|
+
sage: logb(7, 2) # needs sage.symbolic
|
|
282
|
+
log(7)/log(2)
|
|
283
|
+
sage: logb(int(7), 2) # needs sage.symbolic
|
|
284
|
+
log(7)/log(2)
|
|
285
|
+
"""
|
|
286
|
+
def __init__(self):
|
|
287
|
+
"""
|
|
288
|
+
TESTS::
|
|
289
|
+
|
|
290
|
+
sage: from sage.functions.log import logb
|
|
291
|
+
sage: loads(dumps(logb))
|
|
292
|
+
log
|
|
293
|
+
"""
|
|
294
|
+
GinacFunction.__init__(self, 'log', ginac_name='logb', nargs=2,
|
|
295
|
+
latex_name=r'\log',
|
|
296
|
+
conversions=dict(maxima='log'))
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
logb = Function_log2()
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
class Function_polylog(GinacFunction):
|
|
303
|
+
def __init__(self):
|
|
304
|
+
r"""
|
|
305
|
+
The polylog function
|
|
306
|
+
`\text{Li}_s(z) = \sum_{k=1}^{\infty} z^k / k^s`.
|
|
307
|
+
|
|
308
|
+
The first argument is `s` (usually an integer called the weight)
|
|
309
|
+
and the second argument is `z`: ``polylog(s, z)``.
|
|
310
|
+
|
|
311
|
+
This definition is valid for arbitrary complex numbers `s` and `z`
|
|
312
|
+
with `|z| < 1`. It can be extended to `|z| \ge 1` by the process of
|
|
313
|
+
analytic continuation, with a branch cut along the positive real axis
|
|
314
|
+
from `1` to `+\infty`. A ``NaN`` value may be returned for floating
|
|
315
|
+
point arguments that are on the branch cut.
|
|
316
|
+
|
|
317
|
+
EXAMPLES::
|
|
318
|
+
|
|
319
|
+
sage: # needs sage.symbolic
|
|
320
|
+
sage: polylog(2.7, 0)
|
|
321
|
+
0.000000000000000
|
|
322
|
+
sage: polylog(2, 1)
|
|
323
|
+
1/6*pi^2
|
|
324
|
+
sage: polylog(2, -1)
|
|
325
|
+
-1/12*pi^2
|
|
326
|
+
sage: polylog(3, -1)
|
|
327
|
+
-3/4*zeta(3)
|
|
328
|
+
sage: polylog(2, I)
|
|
329
|
+
I*catalan - 1/48*pi^2
|
|
330
|
+
sage: polylog(4, 1/2)
|
|
331
|
+
polylog(4, 1/2)
|
|
332
|
+
sage: polylog(4, 0.5)
|
|
333
|
+
0.517479061673899
|
|
334
|
+
|
|
335
|
+
sage: # needs sage.symbolic
|
|
336
|
+
sage: polylog(1, x)
|
|
337
|
+
-log(-x + 1)
|
|
338
|
+
sage: polylog(2, x^2 + 1)
|
|
339
|
+
dilog(x^2 + 1)
|
|
340
|
+
sage: f = polylog(4, 1); f
|
|
341
|
+
1/90*pi^4
|
|
342
|
+
sage: f.n()
|
|
343
|
+
1.08232323371114
|
|
344
|
+
sage: polylog(4, 2).n()
|
|
345
|
+
2.42786280675470 - 0.174371300025453*I
|
|
346
|
+
sage: complex(polylog(4, 2))
|
|
347
|
+
(2.4278628067547032-0.17437130002545306j)
|
|
348
|
+
sage: float(polylog(4, 0.5))
|
|
349
|
+
0.5174790616738993
|
|
350
|
+
sage: z = var('z')
|
|
351
|
+
sage: polylog(2, z).series(z==0, 5)
|
|
352
|
+
1*z + 1/4*z^2 + 1/9*z^3 + 1/16*z^4 + Order(z^5)
|
|
353
|
+
|
|
354
|
+
sage: loads(dumps(polylog))
|
|
355
|
+
polylog
|
|
356
|
+
|
|
357
|
+
sage: latex(polylog(5, x)) # needs sage.symbolic
|
|
358
|
+
{\rm Li}_{5}(x)
|
|
359
|
+
sage: polylog(x, x)._sympy_() # needs sympy sage.symbolic
|
|
360
|
+
polylog(x, x)
|
|
361
|
+
|
|
362
|
+
TESTS:
|
|
363
|
+
|
|
364
|
+
Check if :issue:`8459` is fixed::
|
|
365
|
+
|
|
366
|
+
sage: t = maxima(polylog(5,x)).sage(); t # needs sage.symbolic
|
|
367
|
+
polylog(5, x)
|
|
368
|
+
sage: t.operator() == polylog # needs sage.symbolic
|
|
369
|
+
True
|
|
370
|
+
sage: t.subs(x=.5).n() # needs sage.symbolic
|
|
371
|
+
0.50840057924226...
|
|
372
|
+
|
|
373
|
+
Check if :issue:`18386` is fixed::
|
|
374
|
+
|
|
375
|
+
sage: polylog(2.0, 1) # needs sage.symbolic
|
|
376
|
+
1.64493406684823
|
|
377
|
+
sage: polylog(2, 1.0) # needs sage.symbolic
|
|
378
|
+
1.64493406684823
|
|
379
|
+
sage: polylog(2.0, 1.0) # needs sage.symbolic
|
|
380
|
+
1.64493406684823
|
|
381
|
+
|
|
382
|
+
sage: # needs sage.libs.flint
|
|
383
|
+
sage: polylog(2, RealBallField(100)(1/3))
|
|
384
|
+
[0.36621322997706348761674629766... +/- ...]
|
|
385
|
+
sage: polylog(2, ComplexBallField(100)(4/3))
|
|
386
|
+
[2.27001825336107090380391448586 +/- ...] + [-0.90377988538400159956755721265 +/- ...]*I
|
|
387
|
+
sage: polylog(2, CBF(1/3))
|
|
388
|
+
[0.366213229977063 +/- ...]
|
|
389
|
+
sage: parent(_)
|
|
390
|
+
Complex ball field with 53 bits of precision
|
|
391
|
+
sage: polylog(2, CBF(1))
|
|
392
|
+
[1.644934066848226 +/- ...]
|
|
393
|
+
sage: parent(_)
|
|
394
|
+
Complex ball field with 53 bits of precision
|
|
395
|
+
|
|
396
|
+
sage: polylog(1, -1) # known bug # needs sage.symbolic
|
|
397
|
+
-log(2)
|
|
398
|
+
|
|
399
|
+
Check for :issue:`21907`::
|
|
400
|
+
|
|
401
|
+
sage: bool(x*polylog(x,x)==0) # needs sage.symbolic
|
|
402
|
+
False
|
|
403
|
+
"""
|
|
404
|
+
GinacFunction.__init__(self, "polylog", nargs=2,
|
|
405
|
+
conversions=dict(mathematica='PolyLog',
|
|
406
|
+
magma='Polylog',
|
|
407
|
+
matlab='polylog',
|
|
408
|
+
sympy='polylog'))
|
|
409
|
+
|
|
410
|
+
def _maxima_init_evaled_(self, *args):
|
|
411
|
+
"""
|
|
412
|
+
EXAMPLES:
|
|
413
|
+
|
|
414
|
+
These are indirect doctests for this function::
|
|
415
|
+
|
|
416
|
+
sage: polylog(2, x)._maxima_() # needs sage.symbolic
|
|
417
|
+
li[2](_SAGE_VAR_x)
|
|
418
|
+
sage: polylog(4, x)._maxima_() # needs sage.symbolic
|
|
419
|
+
polylog(4,_SAGE_VAR_x)
|
|
420
|
+
"""
|
|
421
|
+
args_maxima = []
|
|
422
|
+
for a in args:
|
|
423
|
+
if isinstance(a, str):
|
|
424
|
+
args_maxima.append(a)
|
|
425
|
+
elif hasattr(a, '_maxima_init_'):
|
|
426
|
+
args_maxima.append(a._maxima_init_())
|
|
427
|
+
else:
|
|
428
|
+
args_maxima.append(str(a))
|
|
429
|
+
|
|
430
|
+
n, x = args_maxima
|
|
431
|
+
if int(n) in [1, 2, 3]:
|
|
432
|
+
return 'li[%s](%s)' % (n, x)
|
|
433
|
+
else:
|
|
434
|
+
return 'polylog(%s, %s)' % (n, x)
|
|
435
|
+
|
|
436
|
+
def _method_arguments(self, k, z):
|
|
437
|
+
r"""
|
|
438
|
+
TESTS::
|
|
439
|
+
|
|
440
|
+
sage: b = RBF(1/2, .0001) # needs sage.libs.flint
|
|
441
|
+
sage: polylog(2, b) # needs sage.libs.flint
|
|
442
|
+
[0.582 +/- ...]
|
|
443
|
+
"""
|
|
444
|
+
return [z, k]
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
polylog = Function_polylog()
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
class Function_dilog(GinacFunction):
|
|
451
|
+
def __init__(self):
|
|
452
|
+
r"""
|
|
453
|
+
The dilogarithm function
|
|
454
|
+
`\text{Li}_2(z) = \sum_{k=1}^{\infty} z^k / k^2`.
|
|
455
|
+
|
|
456
|
+
This is simply an alias for ``polylog(2, z)``.
|
|
457
|
+
|
|
458
|
+
EXAMPLES::
|
|
459
|
+
|
|
460
|
+
sage: # needs sage.symbolic
|
|
461
|
+
sage: dilog(1)
|
|
462
|
+
1/6*pi^2
|
|
463
|
+
sage: dilog(1/2)
|
|
464
|
+
1/12*pi^2 - 1/2*log(2)^2
|
|
465
|
+
sage: dilog(x^2+1)
|
|
466
|
+
dilog(x^2 + 1)
|
|
467
|
+
sage: dilog(-1)
|
|
468
|
+
-1/12*pi^2
|
|
469
|
+
sage: dilog(-1.0)
|
|
470
|
+
-0.822467033424113
|
|
471
|
+
sage: dilog(-1.1)
|
|
472
|
+
-0.890838090262283
|
|
473
|
+
sage: dilog(1/2)
|
|
474
|
+
1/12*pi^2 - 1/2*log(2)^2
|
|
475
|
+
sage: dilog(.5)
|
|
476
|
+
0.582240526465012
|
|
477
|
+
sage: dilog(1/2).n()
|
|
478
|
+
0.582240526465012
|
|
479
|
+
sage: var('z')
|
|
480
|
+
z
|
|
481
|
+
sage: dilog(z).diff(z, 2)
|
|
482
|
+
log(-z + 1)/z^2 - 1/((z - 1)*z)
|
|
483
|
+
sage: dilog(z).series(z==1/2, 3)
|
|
484
|
+
(1/12*pi^2 - 1/2*log(2)^2) + (-2*log(1/2))*(z - 1/2)
|
|
485
|
+
+ (2*log(1/2) + 2)*(z - 1/2)^2 + Order(1/8*(2*z - 1)^3)
|
|
486
|
+
|
|
487
|
+
sage: latex(dilog(z)) # needs sage.symbolic
|
|
488
|
+
{\rm Li}_2\left(z\right)
|
|
489
|
+
|
|
490
|
+
Dilog has a branch point at `1`. Sage's floating point libraries
|
|
491
|
+
may handle this differently from the symbolic package::
|
|
492
|
+
|
|
493
|
+
sage: # needs sage.symbolic
|
|
494
|
+
sage: dilog(1)
|
|
495
|
+
1/6*pi^2
|
|
496
|
+
sage: dilog(1.)
|
|
497
|
+
1.64493406684823
|
|
498
|
+
sage: dilog(1).n()
|
|
499
|
+
1.64493406684823
|
|
500
|
+
sage: float(dilog(1))
|
|
501
|
+
1.6449340668482262
|
|
502
|
+
|
|
503
|
+
TESTS:
|
|
504
|
+
|
|
505
|
+
``conjugate(dilog(x))==dilog(conjugate(x))`` unless on the branch cuts
|
|
506
|
+
which run along the positive real axis beginning at 1.::
|
|
507
|
+
|
|
508
|
+
sage: # needs sage.symbolic
|
|
509
|
+
sage: conjugate(dilog(x))
|
|
510
|
+
conjugate(dilog(x))
|
|
511
|
+
sage: var('y', domain='positive')
|
|
512
|
+
y
|
|
513
|
+
sage: conjugate(dilog(y))
|
|
514
|
+
conjugate(dilog(y))
|
|
515
|
+
sage: conjugate(dilog(1/19))
|
|
516
|
+
dilog(1/19)
|
|
517
|
+
sage: conjugate(dilog(1/2*I))
|
|
518
|
+
dilog(-1/2*I)
|
|
519
|
+
sage: dilog(conjugate(1/2*I))
|
|
520
|
+
dilog(-1/2*I)
|
|
521
|
+
sage: conjugate(dilog(2))
|
|
522
|
+
conjugate(dilog(2))
|
|
523
|
+
|
|
524
|
+
Check that return type matches argument type where possible
|
|
525
|
+
(:issue:`18386`)::
|
|
526
|
+
|
|
527
|
+
sage: dilog(0.5) # needs sage.symbolic
|
|
528
|
+
0.582240526465012
|
|
529
|
+
sage: dilog(-1.0) # needs sage.symbolic
|
|
530
|
+
-0.822467033424113
|
|
531
|
+
|
|
532
|
+
sage: # needs sage.rings.real_mpfr sage.symbolic
|
|
533
|
+
sage: y = dilog(RealField(13)(0.5))
|
|
534
|
+
sage: parent(y)
|
|
535
|
+
Real Field with 13 bits of precision
|
|
536
|
+
sage: dilog(RealField(13)(1.1))
|
|
537
|
+
1.96 - 0.300*I
|
|
538
|
+
sage: parent(_)
|
|
539
|
+
Complex Field with 13 bits of precision
|
|
540
|
+
"""
|
|
541
|
+
GinacFunction.__init__(self, 'dilog',
|
|
542
|
+
conversions=dict(maxima='li[2]',
|
|
543
|
+
magma='Dilog',
|
|
544
|
+
fricas='(x+->dilog(1-x))'))
|
|
545
|
+
|
|
546
|
+
def _sympy_(self, z):
|
|
547
|
+
r"""
|
|
548
|
+
Special case for sympy, where there is no dilog function.
|
|
549
|
+
|
|
550
|
+
EXAMPLES::
|
|
551
|
+
|
|
552
|
+
sage: w = dilog(x)._sympy_(); w # needs sympy sage.symbolic
|
|
553
|
+
polylog(2, x)
|
|
554
|
+
sage: w.diff() # needs sympy sage.symbolic
|
|
555
|
+
polylog(1, x)/x
|
|
556
|
+
sage: w._sage_() # needs sympy sage.symbolic
|
|
557
|
+
dilog(x)
|
|
558
|
+
"""
|
|
559
|
+
return _sympy_polylog(2, _sympify(z, evaluate=False))
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
dilog = Function_dilog()
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
class Function_lambert_w(BuiltinFunction):
|
|
566
|
+
r"""
|
|
567
|
+
The integral branches of the Lambert W function `W_n(z)`.
|
|
568
|
+
|
|
569
|
+
This function satisfies the equation
|
|
570
|
+
|
|
571
|
+
.. MATH::
|
|
572
|
+
|
|
573
|
+
z = W_n(z) e^{W_n(z)}
|
|
574
|
+
|
|
575
|
+
INPUT:
|
|
576
|
+
|
|
577
|
+
- ``n`` -- integer; `n=0` corresponds to the principal branch
|
|
578
|
+
|
|
579
|
+
- ``z`` -- a complex number
|
|
580
|
+
|
|
581
|
+
If called with a single argument, that argument is ``z`` and the branch ``n`` is
|
|
582
|
+
assumed to be 0 (the principal branch).
|
|
583
|
+
|
|
584
|
+
ALGORITHM:
|
|
585
|
+
|
|
586
|
+
Numerical evaluation is handled using the mpmath and SciPy libraries.
|
|
587
|
+
|
|
588
|
+
REFERENCES:
|
|
589
|
+
|
|
590
|
+
- :wikipedia:`Lambert_W_function`
|
|
591
|
+
|
|
592
|
+
EXAMPLES:
|
|
593
|
+
|
|
594
|
+
Evaluation of the principal branch::
|
|
595
|
+
|
|
596
|
+
sage: lambert_w(1.0) # needs scipy
|
|
597
|
+
0.567143290409784
|
|
598
|
+
sage: lambert_w(-1).n() # needs mpmath
|
|
599
|
+
-0.318131505204764 + 1.33723570143069*I
|
|
600
|
+
sage: lambert_w(-1.5 + 5*I) # needs mpmath sage.symbolic
|
|
601
|
+
1.17418016254171 + 1.10651494102011*I
|
|
602
|
+
|
|
603
|
+
Evaluation of other branches::
|
|
604
|
+
|
|
605
|
+
sage: lambert_w(2, 1.0) # needs scipy
|
|
606
|
+
-2.40158510486800 + 10.7762995161151*I
|
|
607
|
+
|
|
608
|
+
Solutions to certain exponential equations are returned in terms of lambert_w::
|
|
609
|
+
|
|
610
|
+
sage: S = solve(e^(5*x)+x==0, x, to_poly_solve=True) # needs sage.symbolic
|
|
611
|
+
sage: z = S[0].rhs(); z # needs sage.symbolic
|
|
612
|
+
-1/5*lambert_w(5)
|
|
613
|
+
sage: N(z) # needs sage.symbolic
|
|
614
|
+
-0.265344933048440
|
|
615
|
+
|
|
616
|
+
Check the defining equation numerically at `z=5`::
|
|
617
|
+
|
|
618
|
+
sage: N(lambert_w(5)*exp(lambert_w(5)) - 5) # needs mpmath
|
|
619
|
+
0.000000000000000
|
|
620
|
+
|
|
621
|
+
There are several special values of the principal branch which
|
|
622
|
+
are automatically simplified::
|
|
623
|
+
|
|
624
|
+
sage: lambert_w(0) # needs mpmath
|
|
625
|
+
0
|
|
626
|
+
sage: lambert_w(e) # needs sage.symbolic
|
|
627
|
+
1
|
|
628
|
+
sage: lambert_w(-1/e) # needs sage.symbolic
|
|
629
|
+
-1
|
|
630
|
+
|
|
631
|
+
Integration (of the principal branch) is evaluated using Maxima::
|
|
632
|
+
|
|
633
|
+
sage: integrate(lambert_w(x), x) # needs sage.symbolic
|
|
634
|
+
(lambert_w(x)^2 - lambert_w(x) + 1)*x/lambert_w(x)
|
|
635
|
+
sage: integrate(lambert_w(x), x, 0, 1) # needs sage.symbolic
|
|
636
|
+
(lambert_w(1)^2 - lambert_w(1) + 1)/lambert_w(1) - 1
|
|
637
|
+
sage: integrate(lambert_w(x), x, 0, 1.0) # needs sage.symbolic
|
|
638
|
+
0.3303661247616807
|
|
639
|
+
|
|
640
|
+
Warning: The integral of a non-principal branch is not implemented,
|
|
641
|
+
neither is numerical integration using GSL. The :meth:`numerical_integral`
|
|
642
|
+
function does work if you pass a lambda function::
|
|
643
|
+
|
|
644
|
+
sage: numerical_integral(lambda x: lambert_w(x), 0, 1) # needs scipy sage.modules
|
|
645
|
+
(0.33036612476168054, 3.667800782666048e-15)
|
|
646
|
+
"""
|
|
647
|
+
|
|
648
|
+
def __init__(self):
|
|
649
|
+
r"""
|
|
650
|
+
See the docstring for :meth:`Function_lambert_w`.
|
|
651
|
+
|
|
652
|
+
EXAMPLES::
|
|
653
|
+
|
|
654
|
+
sage: lambert_w(0, 1.0) # needs scipy
|
|
655
|
+
0.567143290409784
|
|
656
|
+
sage: lambert_w(x, x)._sympy_() # needs sympy sage.symbolic
|
|
657
|
+
LambertW(x, x)
|
|
658
|
+
|
|
659
|
+
TESTS:
|
|
660
|
+
|
|
661
|
+
Check that :issue:`25987` is fixed::
|
|
662
|
+
|
|
663
|
+
sage: lambert_w(x)._fricas_() # optional - fricas, needs sage.symbolic
|
|
664
|
+
lambertW(x)
|
|
665
|
+
|
|
666
|
+
sage: fricas(lambert_w(x)).eval(x=-1/e) # optional - fricas, needs sage.symbolic
|
|
667
|
+
- 1
|
|
668
|
+
|
|
669
|
+
The two-argument form of Lambert's function is not supported
|
|
670
|
+
by FriCAS, so we return a generic operator::
|
|
671
|
+
|
|
672
|
+
sage: var("n") # needs sage.symbolic
|
|
673
|
+
n
|
|
674
|
+
sage: lambert_w(n, x)._fricas_() # optional - fricas, needs sage.symbolic
|
|
675
|
+
generalizedLambertW(n,x)
|
|
676
|
+
"""
|
|
677
|
+
BuiltinFunction.__init__(self, "lambert_w", nargs=2,
|
|
678
|
+
conversions={'mathematica': 'ProductLog',
|
|
679
|
+
'maple': 'LambertW',
|
|
680
|
+
'matlab': 'lambertw',
|
|
681
|
+
'maxima': 'generalized_lambert_w',
|
|
682
|
+
'fricas': "((n,z)+->(if n=0 then lambertW(z) else operator('generalizedLambertW)(n,z)))",
|
|
683
|
+
'sympy': 'LambertW'})
|
|
684
|
+
|
|
685
|
+
def __call__(self, *args, **kwds):
|
|
686
|
+
r"""
|
|
687
|
+
Custom call method allows the user to pass one argument or two. If
|
|
688
|
+
one argument is passed, we assume it is ``z`` and that ``n=0``.
|
|
689
|
+
|
|
690
|
+
EXAMPLES::
|
|
691
|
+
|
|
692
|
+
sage: lambert_w(1) # needs sage.symbolic
|
|
693
|
+
lambert_w(1)
|
|
694
|
+
sage: lambert_w(1, 2) # needs sage.symbolic
|
|
695
|
+
lambert_w(1, 2)
|
|
696
|
+
"""
|
|
697
|
+
if len(args) == 2:
|
|
698
|
+
return BuiltinFunction.__call__(self, *args, **kwds)
|
|
699
|
+
elif len(args) == 1:
|
|
700
|
+
return BuiltinFunction.__call__(self, 0, args[0], **kwds)
|
|
701
|
+
else:
|
|
702
|
+
raise TypeError("lambert_w takes either one or two arguments.")
|
|
703
|
+
|
|
704
|
+
def _method_arguments(self, n, z):
|
|
705
|
+
r"""
|
|
706
|
+
TESTS::
|
|
707
|
+
|
|
708
|
+
sage: # needs sage.libs.flint
|
|
709
|
+
sage: b = RBF(1, 0.001)
|
|
710
|
+
sage: lambert_w(b)
|
|
711
|
+
[0.567 +/- 6.44e-4]
|
|
712
|
+
sage: lambert_w(CBF(b))
|
|
713
|
+
[0.567 +/- 6.44e-4]
|
|
714
|
+
sage: lambert_w(2r, CBF(b))
|
|
715
|
+
[-2.40 +/- 2.79e-3] + [10.78 +/- 4.91e-3]*I
|
|
716
|
+
sage: lambert_w(2, CBF(b))
|
|
717
|
+
[-2.40 +/- 2.79e-3] + [10.78 +/- 4.91e-3]*I
|
|
718
|
+
"""
|
|
719
|
+
if n == 0:
|
|
720
|
+
return [z]
|
|
721
|
+
else:
|
|
722
|
+
return [z, n]
|
|
723
|
+
|
|
724
|
+
def _eval_(self, n, z):
|
|
725
|
+
"""
|
|
726
|
+
EXAMPLES::
|
|
727
|
+
|
|
728
|
+
sage: lambert_w(6.0) # needs scipy
|
|
729
|
+
1.43240477589830
|
|
730
|
+
sage: lambert_w(1) # needs sage.symbolic
|
|
731
|
+
lambert_w(1)
|
|
732
|
+
sage: lambert_w(x + 1) # needs sage.symbolic
|
|
733
|
+
lambert_w(x + 1)
|
|
734
|
+
|
|
735
|
+
There are three special values which are automatically simplified::
|
|
736
|
+
|
|
737
|
+
sage: lambert_w(0) # needs mpmath
|
|
738
|
+
0
|
|
739
|
+
sage: lambert_w(e) # needs sage.symbolic
|
|
740
|
+
1
|
|
741
|
+
sage: lambert_w(-1/e) # needs sage.symbolic
|
|
742
|
+
-1
|
|
743
|
+
sage: lambert_w(SR(0)) # needs sage.symbolic
|
|
744
|
+
0
|
|
745
|
+
|
|
746
|
+
The special values only hold on the principal branch::
|
|
747
|
+
|
|
748
|
+
sage: lambert_w(1, e) # needs sage.symbolic
|
|
749
|
+
lambert_w(1, e)
|
|
750
|
+
sage: lambert_w(1, e.n()) # needs sage.symbolic
|
|
751
|
+
-0.532092121986380 + 4.59715801330257*I
|
|
752
|
+
|
|
753
|
+
TESTS:
|
|
754
|
+
|
|
755
|
+
When automatic simplification occurs, the parent of the output
|
|
756
|
+
value should be either the same as the parent of the input, or
|
|
757
|
+
a Sage type::
|
|
758
|
+
|
|
759
|
+
sage: parent(lambert_w(int(0))) # needs mpmath
|
|
760
|
+
<... 'int'>
|
|
761
|
+
sage: parent(lambert_w(Integer(0))) # needs mpmath
|
|
762
|
+
Integer Ring
|
|
763
|
+
sage: parent(lambert_w(e)) # needs sage.symbolic
|
|
764
|
+
Symbolic Ring
|
|
765
|
+
"""
|
|
766
|
+
if not isinstance(z, Expression):
|
|
767
|
+
if n == 0 and z == 0:
|
|
768
|
+
return s_parent(z)(0)
|
|
769
|
+
elif n == 0:
|
|
770
|
+
if z.is_trivial_zero():
|
|
771
|
+
return s_parent(z)(Integer(0))
|
|
772
|
+
elif (z - const_e).is_trivial_zero():
|
|
773
|
+
return s_parent(z)(Integer(1))
|
|
774
|
+
elif (z + 1 / const_e).is_trivial_zero():
|
|
775
|
+
return s_parent(z)(Integer(-1))
|
|
776
|
+
|
|
777
|
+
def _evalf_(self, n, z, parent=None, algorithm=None):
|
|
778
|
+
"""
|
|
779
|
+
EXAMPLES::
|
|
780
|
+
|
|
781
|
+
sage: N(lambert_w(1)) # needs sage.symbolic
|
|
782
|
+
0.567143290409784
|
|
783
|
+
sage: lambert_w(RealField(100)(1)) # needs sage.rings.real_mpfr
|
|
784
|
+
0.56714329040978387299996866221
|
|
785
|
+
|
|
786
|
+
SciPy is used to evaluate for float, RDF, and CDF inputs::
|
|
787
|
+
|
|
788
|
+
sage: # needs scipy
|
|
789
|
+
sage: lambert_w(RDF(1))
|
|
790
|
+
0.5671432904097838
|
|
791
|
+
sage: lambert_w(float(1))
|
|
792
|
+
0.5671432904097838
|
|
793
|
+
sage: lambert_w(CDF(1))
|
|
794
|
+
0.5671432904097838
|
|
795
|
+
sage: lambert_w(complex(1))
|
|
796
|
+
(0.5671432904097838+0j)
|
|
797
|
+
sage: lambert_w(RDF(-1)) # abs tol 2e-16
|
|
798
|
+
-0.31813150520476413 + 1.3372357014306895*I
|
|
799
|
+
sage: lambert_w(float(-1)) # abs tol 2e-16
|
|
800
|
+
(-0.31813150520476413+1.3372357014306895j)
|
|
801
|
+
"""
|
|
802
|
+
R = parent or s_parent(z)
|
|
803
|
+
if R is float or R is RDF:
|
|
804
|
+
res = _scipy_lambertw(z, n)
|
|
805
|
+
# SciPy always returns a complex value, make it real if possible
|
|
806
|
+
if not res.imag:
|
|
807
|
+
return R(res.real)
|
|
808
|
+
elif R is float:
|
|
809
|
+
return complex(res)
|
|
810
|
+
else:
|
|
811
|
+
return CDF(res)
|
|
812
|
+
elif R is complex or R is CDF:
|
|
813
|
+
return R(_scipy_lambertw(z, n))
|
|
814
|
+
else:
|
|
815
|
+
return _mpmath_utils_call(_mpmath_lambertw, z, n, parent=R)
|
|
816
|
+
|
|
817
|
+
def _derivative_(self, n, z, diff_param=None):
|
|
818
|
+
r"""
|
|
819
|
+
The derivative of `W_n(x)` is `W_n(x)/(x \cdot W_n(x) + x)`.
|
|
820
|
+
|
|
821
|
+
EXAMPLES::
|
|
822
|
+
|
|
823
|
+
sage: x = var('x') # needs sage.symbolic
|
|
824
|
+
sage: derivative(lambert_w(x), x) # needs sage.symbolic
|
|
825
|
+
lambert_w(x)/(x*lambert_w(x) + x)
|
|
826
|
+
|
|
827
|
+
sage: derivative(lambert_w(2, exp(x)), x) # needs sage.symbolic
|
|
828
|
+
e^x*lambert_w(2, e^x)/(e^x*lambert_w(2, e^x) + e^x)
|
|
829
|
+
|
|
830
|
+
TESTS:
|
|
831
|
+
|
|
832
|
+
Differentiation in the first parameter raises an error :issue:`14788`::
|
|
833
|
+
|
|
834
|
+
sage: n = var('n') # needs sage.symbolic
|
|
835
|
+
sage: lambert_w(n, x).diff(n) # needs sage.symbolic
|
|
836
|
+
Traceback (most recent call last):
|
|
837
|
+
...
|
|
838
|
+
ValueError: cannot differentiate lambert_w in the first parameter
|
|
839
|
+
"""
|
|
840
|
+
if diff_param == 0:
|
|
841
|
+
raise ValueError("cannot differentiate lambert_w in the first parameter")
|
|
842
|
+
|
|
843
|
+
return lambert_w(n, z) / (z * lambert_w(n, z) + z)
|
|
844
|
+
|
|
845
|
+
def _maxima_init_evaled_(self, n, z):
|
|
846
|
+
"""
|
|
847
|
+
EXAMPLES:
|
|
848
|
+
|
|
849
|
+
These are indirect doctests for this function.::
|
|
850
|
+
|
|
851
|
+
sage: lambert_w(0, x)._maxima_() # needs sage.symbolic
|
|
852
|
+
lambert_w(_SAGE_VAR_x)
|
|
853
|
+
sage: lambert_w(1, x)._maxima_() # needs sage.symbolic
|
|
854
|
+
generalized_lambert_w(1,_SAGE_VAR_x)
|
|
855
|
+
|
|
856
|
+
TESTS::
|
|
857
|
+
|
|
858
|
+
sage: lambert_w(x)._maxima_()._sage_() # needs sage.symbolic
|
|
859
|
+
lambert_w(x)
|
|
860
|
+
sage: lambert_w(2, x)._maxima_()._sage_() # needs sage.symbolic
|
|
861
|
+
lambert_w(2, x)
|
|
862
|
+
"""
|
|
863
|
+
if isinstance(z, str):
|
|
864
|
+
maxima_z = z
|
|
865
|
+
elif hasattr(z, '_maxima_init_'):
|
|
866
|
+
maxima_z = z._maxima_init_()
|
|
867
|
+
else:
|
|
868
|
+
maxima_z = str(z)
|
|
869
|
+
if n == 0:
|
|
870
|
+
return "lambert_w(%s)" % maxima_z
|
|
871
|
+
else:
|
|
872
|
+
return "generalized_lambert_w(%s,%s)" % (n, maxima_z)
|
|
873
|
+
|
|
874
|
+
def _print_(self, n, z):
|
|
875
|
+
"""
|
|
876
|
+
Custom _print_ method to avoid printing the branch number if
|
|
877
|
+
it is zero.
|
|
878
|
+
|
|
879
|
+
EXAMPLES::
|
|
880
|
+
|
|
881
|
+
sage: lambert_w(1) # needs sage.symbolic
|
|
882
|
+
lambert_w(1)
|
|
883
|
+
sage: lambert_w(0, x) # needs sage.symbolic
|
|
884
|
+
lambert_w(x)
|
|
885
|
+
"""
|
|
886
|
+
if n == 0:
|
|
887
|
+
return "lambert_w(%s)" % z
|
|
888
|
+
else:
|
|
889
|
+
return "lambert_w(%s, %s)" % (n, z)
|
|
890
|
+
|
|
891
|
+
def _print_latex_(self, n, z):
|
|
892
|
+
r"""
|
|
893
|
+
Custom _print_latex_ method to avoid printing the branch
|
|
894
|
+
number if it is zero.
|
|
895
|
+
|
|
896
|
+
EXAMPLES::
|
|
897
|
+
|
|
898
|
+
sage: # needs sage.symbolic
|
|
899
|
+
sage: latex(lambert_w(1))
|
|
900
|
+
\operatorname{W}({1})
|
|
901
|
+
sage: latex(lambert_w(0, x))
|
|
902
|
+
\operatorname{W}({x})
|
|
903
|
+
sage: latex(lambert_w(1, x))
|
|
904
|
+
\operatorname{W_{1}}({x})
|
|
905
|
+
sage: latex(lambert_w(1, x + exp(x)))
|
|
906
|
+
\operatorname{W_{1}}({x + e^{x}})
|
|
907
|
+
"""
|
|
908
|
+
if n == 0:
|
|
909
|
+
return r"\operatorname{W}({%s})" % z._latex_()
|
|
910
|
+
else:
|
|
911
|
+
return r"\operatorname{W_{%s}}({%s})" % (n, z._latex_())
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
lambert_w = Function_lambert_w()
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
class Function_exp_polar(BuiltinFunction):
|
|
918
|
+
def __init__(self):
|
|
919
|
+
r"""
|
|
920
|
+
Representation of a complex number in a polar form.
|
|
921
|
+
|
|
922
|
+
INPUT:
|
|
923
|
+
|
|
924
|
+
- ``z`` -- a complex number `z = a + ib`
|
|
925
|
+
|
|
926
|
+
OUTPUT:
|
|
927
|
+
|
|
928
|
+
A complex number with modulus `\exp(a)` and argument `b`.
|
|
929
|
+
|
|
930
|
+
If `-\pi < b \leq \pi` then `\operatorname{exp\_polar}(z)=\exp(z)`.
|
|
931
|
+
For other values of `b` the function is left unevaluated.
|
|
932
|
+
|
|
933
|
+
EXAMPLES:
|
|
934
|
+
|
|
935
|
+
The following expressions are evaluated using the exponential
|
|
936
|
+
function::
|
|
937
|
+
|
|
938
|
+
sage: exp_polar(pi*I/2) # needs sage.symbolic
|
|
939
|
+
I
|
|
940
|
+
sage: x = var('x', domain='real') # needs sage.symbolic
|
|
941
|
+
sage: exp_polar(-1/2*I*pi + x) # needs sage.symbolic
|
|
942
|
+
e^(-1/2*I*pi + x)
|
|
943
|
+
|
|
944
|
+
The function is left unevaluated when the imaginary part of the
|
|
945
|
+
input `z` does not satisfy `-\pi < \Im(z) \leq \pi`::
|
|
946
|
+
|
|
947
|
+
sage: exp_polar(2*pi*I) # needs sage.symbolic
|
|
948
|
+
exp_polar(2*I*pi)
|
|
949
|
+
sage: exp_polar(-4*pi*I) # needs sage.symbolic
|
|
950
|
+
exp_polar(-4*I*pi)
|
|
951
|
+
|
|
952
|
+
This fixes :issue:`18085`::
|
|
953
|
+
|
|
954
|
+
sage: integrate(1/sqrt(1+x^3), x, algorithm='sympy') # needs sage.symbolic
|
|
955
|
+
1/3*x*gamma(1/3)*hypergeometric((1/3, 1/2), (4/3,), -x^3)/gamma(4/3)
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
.. SEEALSO::
|
|
959
|
+
|
|
960
|
+
`Examples in Sympy documentation <http://docs.sympy.org/latest/modules/functions/special.html?highlight=exp_polar>`_,
|
|
961
|
+
`Sympy source code of exp_polar <http://docs.sympy.org/0.7.4/_modules/sympy/functions/elementary/exponential.html>`_
|
|
962
|
+
|
|
963
|
+
REFERENCES:
|
|
964
|
+
|
|
965
|
+
:wikipedia:`Complex_number#Polar_form`
|
|
966
|
+
"""
|
|
967
|
+
BuiltinFunction.__init__(self, "exp_polar",
|
|
968
|
+
latex_name=r"\operatorname{exp\_polar}",
|
|
969
|
+
conversions=dict(sympy='exp_polar'))
|
|
970
|
+
|
|
971
|
+
def _evalf_(self, z, parent=None, algorithm=None):
|
|
972
|
+
r"""
|
|
973
|
+
EXAMPLES:
|
|
974
|
+
|
|
975
|
+
If the imaginary part of `z` obeys `-\pi < z \leq \pi`, then
|
|
976
|
+
`\operatorname{exp\_polar}(z)` is evaluated as `\exp(z)`::
|
|
977
|
+
|
|
978
|
+
sage: exp_polar(1.0 + 2.0*I) # needs sage.symbolic
|
|
979
|
+
-1.13120438375681 + 2.47172667200482*I
|
|
980
|
+
|
|
981
|
+
If the imaginary part of `z` is outside of that interval the
|
|
982
|
+
expression is left unevaluated::
|
|
983
|
+
|
|
984
|
+
sage: exp_polar(-5.0 + 8.0*I) # needs sage.symbolic
|
|
985
|
+
exp_polar(-5.00000000000000 + 8.00000000000000*I)
|
|
986
|
+
|
|
987
|
+
An attempt to numerically evaluate such an expression raises an error::
|
|
988
|
+
|
|
989
|
+
sage: exp_polar(-5.0 + 8.0*I).n() # needs sage.symbolic
|
|
990
|
+
Traceback (most recent call last):
|
|
991
|
+
...
|
|
992
|
+
ValueError: invalid attempt to numerically evaluate exp_polar()
|
|
993
|
+
"""
|
|
994
|
+
if (not isinstance(z, Expression) and
|
|
995
|
+
bool(-const_pi < imag(z) <= const_pi)):
|
|
996
|
+
return exp(z)
|
|
997
|
+
else:
|
|
998
|
+
raise ValueError("invalid attempt to numerically evaluate exp_polar()")
|
|
999
|
+
|
|
1000
|
+
def _eval_(self, z):
|
|
1001
|
+
"""
|
|
1002
|
+
EXAMPLES::
|
|
1003
|
+
|
|
1004
|
+
sage: exp_polar(3*I*pi) # needs sage.symbolic
|
|
1005
|
+
exp_polar(3*I*pi)
|
|
1006
|
+
sage: x = var('x', domain='real') # needs sage.symbolic
|
|
1007
|
+
sage: exp_polar(4*I*pi + x) # needs sage.symbolic
|
|
1008
|
+
exp_polar(4*I*pi + x)
|
|
1009
|
+
|
|
1010
|
+
TESTS:
|
|
1011
|
+
|
|
1012
|
+
Check that :issue:`24441` is fixed::
|
|
1013
|
+
|
|
1014
|
+
sage: exp_polar(arcsec(jacobi_sn(1.1*I*x, x))) # should be fast # needs sage.symbolic
|
|
1015
|
+
exp_polar(arcsec(jacobi_sn(1.10000000000000*I*x, x)))
|
|
1016
|
+
"""
|
|
1017
|
+
try:
|
|
1018
|
+
im = z.imag_part()
|
|
1019
|
+
if not im.variables() and (-const_pi < im <= const_pi):
|
|
1020
|
+
return exp(z)
|
|
1021
|
+
except AttributeError:
|
|
1022
|
+
pass
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
exp_polar = Function_exp_polar()
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
class Function_harmonic_number_generalized(BuiltinFunction):
|
|
1029
|
+
r"""
|
|
1030
|
+
Harmonic and generalized harmonic number functions,
|
|
1031
|
+
defined by:
|
|
1032
|
+
|
|
1033
|
+
.. MATH::
|
|
1034
|
+
|
|
1035
|
+
H_{n}=H_{n,1}=\sum_{k=1}^n\frac{1}{k}
|
|
1036
|
+
|
|
1037
|
+
H_{n,m}=\sum_{k=1}^n\frac{1}{k^m}
|
|
1038
|
+
|
|
1039
|
+
They are also well-defined for complex argument, through:
|
|
1040
|
+
|
|
1041
|
+
.. MATH::
|
|
1042
|
+
|
|
1043
|
+
H_{s}=\int_0^1\frac{1-x^s}{1-x}
|
|
1044
|
+
|
|
1045
|
+
H_{s,m}=\zeta(m)-\zeta(m,s-1)
|
|
1046
|
+
|
|
1047
|
+
If called with a single argument, that argument is ``s`` and ``m`` is
|
|
1048
|
+
assumed to be 1 (the normal harmonic numbers `H_s`).
|
|
1049
|
+
|
|
1050
|
+
ALGORITHM:
|
|
1051
|
+
|
|
1052
|
+
Numerical evaluation is handled using the mpmath and FLINT libraries.
|
|
1053
|
+
|
|
1054
|
+
REFERENCES:
|
|
1055
|
+
|
|
1056
|
+
- :wikipedia:`Harmonic_number`
|
|
1057
|
+
|
|
1058
|
+
EXAMPLES:
|
|
1059
|
+
|
|
1060
|
+
Evaluation of integer, rational, or complex argument::
|
|
1061
|
+
|
|
1062
|
+
sage: harmonic_number(5) # needs mpmath
|
|
1063
|
+
137/60
|
|
1064
|
+
|
|
1065
|
+
sage: # needs sage.symbolic
|
|
1066
|
+
sage: harmonic_number(3, 3)
|
|
1067
|
+
251/216
|
|
1068
|
+
sage: harmonic_number(5/2)
|
|
1069
|
+
-2*log(2) + 46/15
|
|
1070
|
+
sage: harmonic_number(3., 3)
|
|
1071
|
+
zeta(3) - 0.0400198661225573
|
|
1072
|
+
sage: harmonic_number(3., 3.)
|
|
1073
|
+
1.16203703703704
|
|
1074
|
+
sage: harmonic_number(3, 3).n(200)
|
|
1075
|
+
1.16203703703703703703703...
|
|
1076
|
+
sage: harmonic_number(1 + I, 5)
|
|
1077
|
+
harmonic_number(I + 1, 5)
|
|
1078
|
+
sage: harmonic_number(5, 1. + I)
|
|
1079
|
+
1.57436810798989 - 1.06194728851357*I
|
|
1080
|
+
|
|
1081
|
+
Solutions to certain sums are returned in terms of harmonic numbers::
|
|
1082
|
+
|
|
1083
|
+
sage: k = var('k') # needs sage.symbolic
|
|
1084
|
+
sage: sum(1/k^7,k,1,x) # needs sage.symbolic
|
|
1085
|
+
harmonic_number(x, 7)
|
|
1086
|
+
|
|
1087
|
+
Check the defining integral at a random integer::
|
|
1088
|
+
|
|
1089
|
+
sage: n = randint(10,100)
|
|
1090
|
+
sage: bool(SR(integrate((1-x^n)/(1-x),x,0,1)) == harmonic_number(n)) # needs sage.symbolic
|
|
1091
|
+
True
|
|
1092
|
+
|
|
1093
|
+
There are several special values which are automatically simplified::
|
|
1094
|
+
|
|
1095
|
+
sage: harmonic_number(0) # needs mpmath
|
|
1096
|
+
0
|
|
1097
|
+
sage: harmonic_number(1) # needs mpmath
|
|
1098
|
+
1
|
|
1099
|
+
sage: harmonic_number(x, 1) # needs sage.symbolic
|
|
1100
|
+
harmonic_number(x)
|
|
1101
|
+
"""
|
|
1102
|
+
|
|
1103
|
+
def __init__(self):
|
|
1104
|
+
r"""
|
|
1105
|
+
EXAMPLES::
|
|
1106
|
+
|
|
1107
|
+
sage: loads(dumps(harmonic_number(x, 5))) # needs sage.symbolic
|
|
1108
|
+
harmonic_number(x, 5)
|
|
1109
|
+
sage: harmonic_number(x, x)._sympy_() # needs sympy sage.symbolic
|
|
1110
|
+
harmonic(x, x)
|
|
1111
|
+
"""
|
|
1112
|
+
BuiltinFunction.__init__(self, "harmonic_number", nargs=2,
|
|
1113
|
+
conversions={'sympy': 'harmonic'})
|
|
1114
|
+
|
|
1115
|
+
def __call__(self, z, m=1, **kwds):
|
|
1116
|
+
r"""
|
|
1117
|
+
Custom call method allows the user to pass one argument or two. If
|
|
1118
|
+
one argument is passed, we assume it is ``z`` and that `m=1`.
|
|
1119
|
+
|
|
1120
|
+
EXAMPLES::
|
|
1121
|
+
|
|
1122
|
+
sage: harmonic_number(x) # needs sage.symbolic
|
|
1123
|
+
harmonic_number(x)
|
|
1124
|
+
sage: harmonic_number(x, 1) # needs sage.symbolic
|
|
1125
|
+
harmonic_number(x)
|
|
1126
|
+
sage: harmonic_number(x, 2) # needs sage.symbolic
|
|
1127
|
+
harmonic_number(x, 2)
|
|
1128
|
+
"""
|
|
1129
|
+
return BuiltinFunction.__call__(self, z, m, **kwds)
|
|
1130
|
+
|
|
1131
|
+
def _eval_(self, z, m):
|
|
1132
|
+
"""
|
|
1133
|
+
EXAMPLES::
|
|
1134
|
+
|
|
1135
|
+
sage: harmonic_number(5) # needs mpmath
|
|
1136
|
+
137/60
|
|
1137
|
+
|
|
1138
|
+
sage: # needs sage.symbolic
|
|
1139
|
+
sage: harmonic_number(x, 0)
|
|
1140
|
+
x
|
|
1141
|
+
sage: harmonic_number(x, 1)
|
|
1142
|
+
harmonic_number(x)
|
|
1143
|
+
sage: harmonic_number(3, 3)
|
|
1144
|
+
251/216
|
|
1145
|
+
sage: harmonic_number(3, 3).n() # this goes from rational to float
|
|
1146
|
+
1.16203703703704
|
|
1147
|
+
sage: harmonic_number(3, 3.) # the following uses zeta functions
|
|
1148
|
+
1.16203703703704
|
|
1149
|
+
sage: harmonic_number(3., 3)
|
|
1150
|
+
zeta(3) - 0.0400198661225573
|
|
1151
|
+
sage: harmonic_number(0.1, 5)
|
|
1152
|
+
zeta(5) - 0.650300133161038
|
|
1153
|
+
sage: harmonic_number(0.1, 5).n()
|
|
1154
|
+
0.386627621982332
|
|
1155
|
+
sage: harmonic_number(3, 5/2)
|
|
1156
|
+
1/27*sqrt(3) + 1/8*sqrt(2) + 1
|
|
1157
|
+
|
|
1158
|
+
TESTS::
|
|
1159
|
+
|
|
1160
|
+
sage: harmonic_number(int(3), int(3)) # needs sage.symbolic
|
|
1161
|
+
1.162037037037037
|
|
1162
|
+
"""
|
|
1163
|
+
if m == 0:
|
|
1164
|
+
return z
|
|
1165
|
+
elif m == 1:
|
|
1166
|
+
return harmonic_m1._eval_(z)
|
|
1167
|
+
|
|
1168
|
+
if z in ZZ and z >= 0:
|
|
1169
|
+
return sum(ZZ(k) ** (-m) for k in range(1, z + 1))
|
|
1170
|
+
|
|
1171
|
+
def _evalf_(self, z, m, parent=None, algorithm=None):
|
|
1172
|
+
"""
|
|
1173
|
+
EXAMPLES::
|
|
1174
|
+
|
|
1175
|
+
sage: # needs sage.symbolic
|
|
1176
|
+
sage: harmonic_number(3., 3)
|
|
1177
|
+
zeta(3) - 0.0400198661225573
|
|
1178
|
+
sage: harmonic_number(3., 3.)
|
|
1179
|
+
1.16203703703704
|
|
1180
|
+
sage: harmonic_number(3, 3).n(200)
|
|
1181
|
+
1.16203703703703703703703...
|
|
1182
|
+
sage: harmonic_number(5, I).n()
|
|
1183
|
+
2.36889632899995 - 3.51181956521611*I
|
|
1184
|
+
"""
|
|
1185
|
+
if m == 0:
|
|
1186
|
+
if parent is None:
|
|
1187
|
+
return z
|
|
1188
|
+
return parent(z)
|
|
1189
|
+
elif m == 1:
|
|
1190
|
+
return harmonic_m1._evalf_(z, parent, algorithm)
|
|
1191
|
+
|
|
1192
|
+
return zeta(m) - hurwitz_zeta(m, z + 1)
|
|
1193
|
+
|
|
1194
|
+
def _maxima_init_evaled_(self, n, z):
|
|
1195
|
+
"""
|
|
1196
|
+
EXAMPLES::
|
|
1197
|
+
|
|
1198
|
+
sage: maxima_calculus(harmonic_number(x, 2)) # needs sage.symbolic
|
|
1199
|
+
gen_harmonic_number(2,_SAGE_VAR_x)
|
|
1200
|
+
sage: maxima_calculus(harmonic_number(3, harmonic_number(x,3), hold=True)) # needs sage.symbolic
|
|
1201
|
+
1/3^gen_harmonic_number(3,_SAGE_VAR_x)+1/2^gen_harmonic_number(3,_SAGE_VAR_x)+1
|
|
1202
|
+
"""
|
|
1203
|
+
if isinstance(n, str):
|
|
1204
|
+
maxima_n = n
|
|
1205
|
+
elif hasattr(n, '_maxima_init_'):
|
|
1206
|
+
maxima_n = n._maxima_init_()
|
|
1207
|
+
else:
|
|
1208
|
+
maxima_n = str(n)
|
|
1209
|
+
if isinstance(z, str):
|
|
1210
|
+
maxima_z = z
|
|
1211
|
+
elif hasattr(z, '_maxima_init_'):
|
|
1212
|
+
maxima_z = z._maxima_init_()
|
|
1213
|
+
else:
|
|
1214
|
+
maxima_z = str(z)
|
|
1215
|
+
return "gen_harmonic_number(%s,%s)" % (maxima_z, maxima_n) # swap arguments
|
|
1216
|
+
|
|
1217
|
+
def _derivative_(self, n, m, diff_param=None):
|
|
1218
|
+
"""
|
|
1219
|
+
The derivative of `H_{n,m}`.
|
|
1220
|
+
|
|
1221
|
+
EXAMPLES::
|
|
1222
|
+
|
|
1223
|
+
sage: # needs sage.symbolic
|
|
1224
|
+
sage: k,m,n = var('k,m,n')
|
|
1225
|
+
sage: sum(1/k, k, 1, x).diff(x)
|
|
1226
|
+
1/6*pi^2 - harmonic_number(x, 2)
|
|
1227
|
+
sage: harmonic_number(x, 1).diff(x)
|
|
1228
|
+
1/6*pi^2 - harmonic_number(x, 2)
|
|
1229
|
+
sage: harmonic_number(n, m).diff(n)
|
|
1230
|
+
-m*(harmonic_number(n, m + 1) - zeta(m + 1))
|
|
1231
|
+
sage: harmonic_number(n, m).diff(m)
|
|
1232
|
+
Traceback (most recent call last):
|
|
1233
|
+
...
|
|
1234
|
+
ValueError: cannot differentiate harmonic_number in the second parameter
|
|
1235
|
+
"""
|
|
1236
|
+
if diff_param == 1:
|
|
1237
|
+
raise ValueError("cannot differentiate harmonic_number in the second parameter")
|
|
1238
|
+
if m == 1:
|
|
1239
|
+
return harmonic_m1(n).diff()
|
|
1240
|
+
else:
|
|
1241
|
+
return m * (zeta(m + 1) - harmonic_number(n, m + 1))
|
|
1242
|
+
|
|
1243
|
+
def _print_(self, z, m):
|
|
1244
|
+
"""
|
|
1245
|
+
EXAMPLES::
|
|
1246
|
+
|
|
1247
|
+
sage: harmonic_number(x) # needs sage.symbolic
|
|
1248
|
+
harmonic_number(x)
|
|
1249
|
+
sage: harmonic_number(x, 2) # needs sage.symbolic
|
|
1250
|
+
harmonic_number(x, 2)
|
|
1251
|
+
"""
|
|
1252
|
+
if m == 1:
|
|
1253
|
+
return "harmonic_number(%s)" % z
|
|
1254
|
+
else:
|
|
1255
|
+
return "harmonic_number(%s, %s)" % (z, m)
|
|
1256
|
+
|
|
1257
|
+
def _print_latex_(self, z, m):
|
|
1258
|
+
"""
|
|
1259
|
+
EXAMPLES::
|
|
1260
|
+
|
|
1261
|
+
sage: latex(harmonic_number(x)) # needs sage.symbolic
|
|
1262
|
+
H_{x}
|
|
1263
|
+
sage: latex(harmonic_number(x, 2)) # needs sage.symbolic
|
|
1264
|
+
H_{{x},{2}}
|
|
1265
|
+
"""
|
|
1266
|
+
if m == 1:
|
|
1267
|
+
return r"H_{%s}" % z
|
|
1268
|
+
else:
|
|
1269
|
+
return r"H_{{%s},{%s}}" % (z, m)
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
harmonic_number = Function_harmonic_number_generalized()
|
|
1273
|
+
|
|
1274
|
+
|
|
1275
|
+
class _Function_swap_harmonic(BuiltinFunction):
|
|
1276
|
+
r"""
|
|
1277
|
+
Harmonic number function with swapped arguments. For internal use only.
|
|
1278
|
+
|
|
1279
|
+
EXAMPLES::
|
|
1280
|
+
|
|
1281
|
+
sage: # needs sage.symbolic
|
|
1282
|
+
sage: maxima(harmonic_number(x, 2)) # maxima expect interface
|
|
1283
|
+
gen_harmonic_number(2,_SAGE_VAR_x)
|
|
1284
|
+
sage: from sage.calculus.calculus import symbolic_expression_from_maxima_string as sefms
|
|
1285
|
+
sage: sefms('gen_harmonic_number(3,x)')
|
|
1286
|
+
harmonic_number(x, 3)
|
|
1287
|
+
sage: from sage.interfaces.maxima_lib import maxima_lib, max_to_sr
|
|
1288
|
+
sage: c = maxima_lib(harmonic_number(x,2)); c
|
|
1289
|
+
gen_harmonic_number(2,_SAGE_VAR_x)
|
|
1290
|
+
sage: max_to_sr(c.ecl())
|
|
1291
|
+
harmonic_number(x, 2)
|
|
1292
|
+
"""
|
|
1293
|
+
def __init__(self):
|
|
1294
|
+
BuiltinFunction.__init__(self, "_swap_harmonic", nargs=2)
|
|
1295
|
+
|
|
1296
|
+
def _eval_(self, a, b, **kwds):
|
|
1297
|
+
return harmonic_number(b, a, **kwds)
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
_swap_harmonic = _Function_swap_harmonic()
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
register_symbol(_swap_harmonic, {'maxima': 'gen_harmonic_number'})
|
|
1304
|
+
register_symbol(_swap_harmonic, {'maple': 'harmonic'})
|
|
1305
|
+
|
|
1306
|
+
|
|
1307
|
+
class Function_harmonic_number(BuiltinFunction):
|
|
1308
|
+
r"""
|
|
1309
|
+
Harmonic number function, defined by:
|
|
1310
|
+
|
|
1311
|
+
.. MATH::
|
|
1312
|
+
|
|
1313
|
+
H_{n}=H_{n,1}=\sum_{k=1}^n\frac1k
|
|
1314
|
+
|
|
1315
|
+
H_{s}=\int_0^1\frac{1-x^s}{1-x}
|
|
1316
|
+
|
|
1317
|
+
See the docstring for :meth:`Function_harmonic_number_generalized`.
|
|
1318
|
+
|
|
1319
|
+
This class exists as callback for ``harmonic_number`` returned by Maxima.
|
|
1320
|
+
"""
|
|
1321
|
+
|
|
1322
|
+
def __init__(self):
|
|
1323
|
+
r"""
|
|
1324
|
+
EXAMPLES::
|
|
1325
|
+
|
|
1326
|
+
sage: k = var('k') # needs sage.symbolic
|
|
1327
|
+
sage: loads(dumps(sum(1/k, k, 1, x))) # needs sage.symbolic
|
|
1328
|
+
harmonic_number(x)
|
|
1329
|
+
sage: harmonic_number(x)._sympy_() # needs sympy sage.symbolic
|
|
1330
|
+
harmonic(x)
|
|
1331
|
+
"""
|
|
1332
|
+
BuiltinFunction.__init__(self, "harmonic_number", nargs=1,
|
|
1333
|
+
conversions={'mathematica': 'HarmonicNumber',
|
|
1334
|
+
'maple': 'harmonic',
|
|
1335
|
+
'maxima': 'harmonic_number',
|
|
1336
|
+
'sympy': 'harmonic'})
|
|
1337
|
+
|
|
1338
|
+
def _eval_(self, z, **kwds):
|
|
1339
|
+
"""
|
|
1340
|
+
EXAMPLES::
|
|
1341
|
+
|
|
1342
|
+
sage: harmonic_number(0) # needs mpmath
|
|
1343
|
+
0
|
|
1344
|
+
sage: harmonic_number(1) # needs mpmath
|
|
1345
|
+
1
|
|
1346
|
+
sage: harmonic_number(20) # needs mpmath
|
|
1347
|
+
55835135/15519504
|
|
1348
|
+
sage: harmonic_number(5/2) # needs sage.symbolic
|
|
1349
|
+
-2*log(2) + 46/15
|
|
1350
|
+
sage: harmonic_number(2*x) # needs sage.symbolic
|
|
1351
|
+
harmonic_number(2*x)
|
|
1352
|
+
"""
|
|
1353
|
+
if z in ZZ:
|
|
1354
|
+
if z == 0:
|
|
1355
|
+
return Integer(0)
|
|
1356
|
+
elif z == 1:
|
|
1357
|
+
return Integer(1)
|
|
1358
|
+
elif z > 1:
|
|
1359
|
+
return _flint_harmonic_number(z)
|
|
1360
|
+
elif z in QQ:
|
|
1361
|
+
return psi1(z + 1) - psi1(1)
|
|
1362
|
+
|
|
1363
|
+
def _evalf_(self, z, parent=None, algorithm='mpmath'):
|
|
1364
|
+
"""
|
|
1365
|
+
EXAMPLES::
|
|
1366
|
+
|
|
1367
|
+
sage: # needs mpmath
|
|
1368
|
+
sage: harmonic_number(20).n() # this goes from rational to float
|
|
1369
|
+
3.59773965714368
|
|
1370
|
+
sage: harmonic_number(20).n(200)
|
|
1371
|
+
3.59773965714368191148376906...
|
|
1372
|
+
sage: harmonic_number(20.) # this computes the integral with mpmath
|
|
1373
|
+
3.59773965714368
|
|
1374
|
+
sage: harmonic_number(1.0*I) # needs sage.symbolic
|
|
1375
|
+
0.671865985524010 + 1.07667404746858*I
|
|
1376
|
+
"""
|
|
1377
|
+
return _mpmath_utils_call(_mpmath_harmonic, z, parent=parent)
|
|
1378
|
+
|
|
1379
|
+
def _derivative_(self, z, diff_param=None):
|
|
1380
|
+
"""
|
|
1381
|
+
The derivative of `H_x`.
|
|
1382
|
+
|
|
1383
|
+
EXAMPLES::
|
|
1384
|
+
|
|
1385
|
+
sage: k = var('k') # needs sage.symbolic
|
|
1386
|
+
sage: sum(1/k, k, 1, x).diff(x) # needs sage.symbolic
|
|
1387
|
+
1/6*pi^2 - harmonic_number(x, 2)
|
|
1388
|
+
"""
|
|
1389
|
+
return zeta(2) - harmonic_number(z, 2)
|
|
1390
|
+
|
|
1391
|
+
def _print_latex_(self, z):
|
|
1392
|
+
"""
|
|
1393
|
+
EXAMPLES::
|
|
1394
|
+
|
|
1395
|
+
sage: k = var('k') # needs sage.symbolic
|
|
1396
|
+
sage: latex(sum(1/k, k, 1, x)) # needs sage.symbolic
|
|
1397
|
+
H_{x}
|
|
1398
|
+
"""
|
|
1399
|
+
return r"H_{%s}" % z
|
|
1400
|
+
|
|
1401
|
+
|
|
1402
|
+
harmonic_m1 = Function_harmonic_number()
|