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
|
@@ -0,0 +1,1317 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Power Series Methods
|
|
4
|
+
|
|
5
|
+
The class ``PowerSeries_poly`` provides additional methods for univariate power series.
|
|
6
|
+
"""
|
|
7
|
+
from sage.rings.power_series_ring_element cimport PowerSeries
|
|
8
|
+
from sage.structure.element cimport Element
|
|
9
|
+
from sage.rings.infinity import infinity
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
from cypari2.handle_error import PariError
|
|
13
|
+
from cypari2.gen import Gen as pari_gen
|
|
14
|
+
except ImportError:
|
|
15
|
+
pari_gen = ()
|
|
16
|
+
PariError = ()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
cdef class PowerSeries_poly(PowerSeries):
|
|
20
|
+
|
|
21
|
+
def __init__(self, parent, f=0, prec=infinity, int check=1, is_gen=0):
|
|
22
|
+
"""
|
|
23
|
+
EXAMPLES::
|
|
24
|
+
|
|
25
|
+
sage: R.<q> = PowerSeriesRing(CC); R # needs sage.rings.real_mpfr
|
|
26
|
+
Power Series Ring in q over Complex Field with 53 bits of precision
|
|
27
|
+
sage: loads(q.dumps()) == q # needs sage.rings.real_mpfr
|
|
28
|
+
True
|
|
29
|
+
|
|
30
|
+
sage: R.<t> = QQ[[]]
|
|
31
|
+
sage: f = 3 - t^3 + O(t^5)
|
|
32
|
+
sage: a = f^3; a
|
|
33
|
+
27 - 27*t^3 + O(t^5)
|
|
34
|
+
sage: b = f^-3; b
|
|
35
|
+
1/27 + 1/27*t^3 + O(t^5)
|
|
36
|
+
sage: a*b
|
|
37
|
+
1 + O(t^5)
|
|
38
|
+
|
|
39
|
+
Check that :issue:`22216` is fixed::
|
|
40
|
+
|
|
41
|
+
sage: R.<T> = PowerSeriesRing(QQ)
|
|
42
|
+
sage: R(pari('1 + O(T)')) # needs sage.libs.pari
|
|
43
|
+
1 + O(T)
|
|
44
|
+
sage: R(pari('1/T + O(T)')) # needs sage.libs.pari
|
|
45
|
+
Traceback (most recent call last):
|
|
46
|
+
...
|
|
47
|
+
ValueError: series has negative valuation
|
|
48
|
+
"""
|
|
49
|
+
R = parent._poly_ring()
|
|
50
|
+
if isinstance(f, Element):
|
|
51
|
+
if (<Element>f)._parent is R:
|
|
52
|
+
pass
|
|
53
|
+
elif (<Element>f)._parent == R.base_ring():
|
|
54
|
+
f = R([f])
|
|
55
|
+
elif isinstance(f, PowerSeries): # not only PowerSeries_poly
|
|
56
|
+
prec = (<PowerSeries>f)._prec
|
|
57
|
+
f = R(f.polynomial())
|
|
58
|
+
else:
|
|
59
|
+
if f:
|
|
60
|
+
f = R(f, check=check)
|
|
61
|
+
else:
|
|
62
|
+
f = R(None)
|
|
63
|
+
elif isinstance(f, pari_gen) and f.type() == 't_SER':
|
|
64
|
+
if f._valp() < 0:
|
|
65
|
+
raise ValueError('series has negative valuation')
|
|
66
|
+
if prec is infinity:
|
|
67
|
+
prec = f.length() + f._valp()
|
|
68
|
+
f = R(f.truncate())
|
|
69
|
+
else:
|
|
70
|
+
if f:
|
|
71
|
+
f = R(f, check=check)
|
|
72
|
+
else: # None is supposed to yield zero
|
|
73
|
+
f = R(None)
|
|
74
|
+
|
|
75
|
+
self.__f = f
|
|
76
|
+
if check and not (prec is infinity):
|
|
77
|
+
self.__f = self.__f.truncate(prec)
|
|
78
|
+
PowerSeries.__init__(self, parent, prec, is_gen)
|
|
79
|
+
|
|
80
|
+
def __hash__(self):
|
|
81
|
+
"""
|
|
82
|
+
Return a hash of ``self``.
|
|
83
|
+
|
|
84
|
+
EXAMPLES::
|
|
85
|
+
|
|
86
|
+
sage: R.<t> = ZZ[[]]
|
|
87
|
+
sage: hash(t) == hash(R.gen())
|
|
88
|
+
True
|
|
89
|
+
sage: hash(t) != hash(R.one())
|
|
90
|
+
True
|
|
91
|
+
"""
|
|
92
|
+
return hash(self.__f)
|
|
93
|
+
|
|
94
|
+
def __reduce__(self):
|
|
95
|
+
"""
|
|
96
|
+
Used for pickling.
|
|
97
|
+
|
|
98
|
+
EXAMPLES::
|
|
99
|
+
|
|
100
|
+
sage: A.<z> = RR[[]]
|
|
101
|
+
sage: f = z - z^3 + O(z^10)
|
|
102
|
+
sage: f == loads(dumps(f)) # indirect doctest
|
|
103
|
+
True
|
|
104
|
+
"""
|
|
105
|
+
return self.__class__, (self._parent, self.__f, self._prec, self._is_gen)
|
|
106
|
+
|
|
107
|
+
def polynomial(self):
|
|
108
|
+
"""
|
|
109
|
+
Return the underlying polynomial of ``self``.
|
|
110
|
+
|
|
111
|
+
EXAMPLES::
|
|
112
|
+
|
|
113
|
+
sage: R.<t> = GF(7)[[]]
|
|
114
|
+
sage: f = 3 - t^3 + O(t^5)
|
|
115
|
+
sage: f.polynomial()
|
|
116
|
+
6*t^3 + 3
|
|
117
|
+
"""
|
|
118
|
+
return self.__f
|
|
119
|
+
|
|
120
|
+
def valuation(self):
|
|
121
|
+
"""
|
|
122
|
+
Return the valuation of ``self``.
|
|
123
|
+
|
|
124
|
+
EXAMPLES::
|
|
125
|
+
|
|
126
|
+
sage: R.<t> = QQ[[]]
|
|
127
|
+
sage: (5 - t^8 + O(t^11)).valuation()
|
|
128
|
+
0
|
|
129
|
+
sage: (-t^8 + O(t^11)).valuation()
|
|
130
|
+
8
|
|
131
|
+
sage: O(t^7).valuation()
|
|
132
|
+
7
|
|
133
|
+
sage: R(0).valuation()
|
|
134
|
+
+Infinity
|
|
135
|
+
"""
|
|
136
|
+
if self.__f == 0:
|
|
137
|
+
return self._prec
|
|
138
|
+
|
|
139
|
+
return self.__f.valuation()
|
|
140
|
+
|
|
141
|
+
def degree(self):
|
|
142
|
+
"""
|
|
143
|
+
Return the degree of the underlying polynomial of ``self``.
|
|
144
|
+
|
|
145
|
+
That is, if ``self`` is of the form `f(x) + O(x^n)`, we return
|
|
146
|
+
the degree of `f(x)`. Note that if `f(x)` is `0`, we return `-1`,
|
|
147
|
+
just as with polynomials.
|
|
148
|
+
|
|
149
|
+
EXAMPLES::
|
|
150
|
+
|
|
151
|
+
sage: R.<t> = ZZ[[]]
|
|
152
|
+
sage: (5 + t^3 + O(t^4)).degree()
|
|
153
|
+
3
|
|
154
|
+
sage: (5 + O(t^4)).degree()
|
|
155
|
+
0
|
|
156
|
+
sage: O(t^4).degree()
|
|
157
|
+
-1
|
|
158
|
+
"""
|
|
159
|
+
return self.__f.degree()
|
|
160
|
+
|
|
161
|
+
def __bool__(self):
|
|
162
|
+
"""
|
|
163
|
+
Return ``True`` if ``self`` is nonzero, and ``False`` otherwise.
|
|
164
|
+
|
|
165
|
+
EXAMPLES::
|
|
166
|
+
|
|
167
|
+
sage: R.<t> = GF(11)[[]]
|
|
168
|
+
sage: bool(1 + t + O(t^18))
|
|
169
|
+
True
|
|
170
|
+
sage: bool(R(0))
|
|
171
|
+
False
|
|
172
|
+
sage: bool(O(t^18))
|
|
173
|
+
False
|
|
174
|
+
"""
|
|
175
|
+
return not not self.__f
|
|
176
|
+
|
|
177
|
+
def __call__(self, *x, **kwds):
|
|
178
|
+
"""
|
|
179
|
+
Evaluate the series at `x=a`.
|
|
180
|
+
|
|
181
|
+
INPUT:
|
|
182
|
+
|
|
183
|
+
- ``x``:
|
|
184
|
+
|
|
185
|
+
- a tuple of elements the first of which can be meaningfully
|
|
186
|
+
substituted in ``self``, with the remainder used for substitution
|
|
187
|
+
in the coefficients of ``self``.
|
|
188
|
+
|
|
189
|
+
- a dictionary for kwds:value pairs. If the variable name of
|
|
190
|
+
``self`` is a keyword it is substituted for. Other keywords
|
|
191
|
+
are used for substitution in the coefficients of ``self``.
|
|
192
|
+
|
|
193
|
+
OUTPUT: the value of ``self`` after substitution
|
|
194
|
+
|
|
195
|
+
EXAMPLES::
|
|
196
|
+
|
|
197
|
+
sage: R.<t> = ZZ[[]]
|
|
198
|
+
sage: f = t^2 + t^3 + O(t^6)
|
|
199
|
+
sage: f(t^3)
|
|
200
|
+
t^6 + t^9 + O(t^18)
|
|
201
|
+
sage: f(t=t^3)
|
|
202
|
+
t^6 + t^9 + O(t^18)
|
|
203
|
+
sage: f(f)
|
|
204
|
+
t^4 + 2*t^5 + 2*t^6 + 3*t^7 + O(t^8)
|
|
205
|
+
sage: f(f)(f) == f(f(f))
|
|
206
|
+
True
|
|
207
|
+
|
|
208
|
+
The following demonstrates that the problems raised in :issue:`3979`
|
|
209
|
+
and :issue:`5367` are solved::
|
|
210
|
+
|
|
211
|
+
sage: [f(t^2 + O(t^n)) for n in [9, 10, 11]]
|
|
212
|
+
[t^4 + t^6 + O(t^11), t^4 + t^6 + O(t^12), t^4 + t^6 + O(t^12)]
|
|
213
|
+
sage: f(t^2)
|
|
214
|
+
t^4 + t^6 + O(t^12)
|
|
215
|
+
|
|
216
|
+
It is possible to substitute a series for which only the precision
|
|
217
|
+
is defined::
|
|
218
|
+
|
|
219
|
+
sage: f(O(t^5))
|
|
220
|
+
O(t^10)
|
|
221
|
+
|
|
222
|
+
or to substitute a polynomial (the result belonging to the power
|
|
223
|
+
series ring over the same base ring)::
|
|
224
|
+
|
|
225
|
+
sage: P.<z> = ZZ[]
|
|
226
|
+
sage: g = f(z + z^3); g
|
|
227
|
+
z^2 + z^3 + 2*z^4 + 3*z^5 + O(z^6)
|
|
228
|
+
sage: g.parent()
|
|
229
|
+
Power Series Ring in z over Integer Ring
|
|
230
|
+
|
|
231
|
+
A series defined over another ring can be substituted::
|
|
232
|
+
|
|
233
|
+
sage: S.<u> = GF(7)[[]]
|
|
234
|
+
sage: f(2*u + u^3 + O(u^5))
|
|
235
|
+
4*u^2 + u^3 + 4*u^4 + 5*u^5 + O(u^6)
|
|
236
|
+
|
|
237
|
+
As can a `p`-adic integer as long as the coefficient ring is compatible::
|
|
238
|
+
|
|
239
|
+
sage: f(100 + O(5^7)) # needs sage.rings.padics
|
|
240
|
+
5^4 + 3*5^5 + 4*5^6 + 2*5^7 + 2*5^8 + O(5^9)
|
|
241
|
+
sage: f.change_ring(Zp(5))(100 + O(5^7)) # needs sage.rings.padics
|
|
242
|
+
5^4 + 3*5^5 + 4*5^6 + 2*5^7 + 2*5^8 + O(5^9)
|
|
243
|
+
sage: f.change_ring(Zp(5))(100 + O(2^7)) # needs sage.rings.padics
|
|
244
|
+
Traceback (most recent call last):
|
|
245
|
+
...
|
|
246
|
+
ValueError: Cannot substitute this value
|
|
247
|
+
|
|
248
|
+
To substitute a value it must have valuation at least 1::
|
|
249
|
+
|
|
250
|
+
sage: f(0)
|
|
251
|
+
0
|
|
252
|
+
sage: f(1 + t)
|
|
253
|
+
Traceback (most recent call last):
|
|
254
|
+
...
|
|
255
|
+
ValueError: Can only substitute elements of positive valuation
|
|
256
|
+
sage: f(2 + O(5^3)) # needs sage.rings.padics
|
|
257
|
+
Traceback (most recent call last):
|
|
258
|
+
...
|
|
259
|
+
ValueError: Can only substitute elements of positive valuation
|
|
260
|
+
sage: f(t^-2)
|
|
261
|
+
Traceback (most recent call last):
|
|
262
|
+
...
|
|
263
|
+
ValueError: Can only substitute elements of positive valuation
|
|
264
|
+
|
|
265
|
+
Unless, of course, it is being substituted in a series with infinite
|
|
266
|
+
precision, i.e., a polynomial::
|
|
267
|
+
|
|
268
|
+
sage: g = t^2 + t^3
|
|
269
|
+
sage: g(1 + t + O(t^2))
|
|
270
|
+
2 + 5*t + O(t^2)
|
|
271
|
+
sage: g(3)
|
|
272
|
+
36
|
|
273
|
+
|
|
274
|
+
Arguments beyond the first can refer to the base ring::
|
|
275
|
+
|
|
276
|
+
sage: P.<x> = GF(5)[]
|
|
277
|
+
sage: Q.<y> = P[[]]
|
|
278
|
+
sage: h = (1 - x*y)^-1 + O(y^7); h
|
|
279
|
+
1 + x*y + x^2*y^2 + x^3*y^3 + x^4*y^4 + x^5*y^5 + x^6*y^6 + O(y^7)
|
|
280
|
+
sage: h(y^2, 3)
|
|
281
|
+
1 + 3*y^2 + 4*y^4 + 2*y^6 + y^8 + 3*y^10 + 4*y^12 + O(y^14)
|
|
282
|
+
|
|
283
|
+
These secondary values can also be specified using keywords::
|
|
284
|
+
|
|
285
|
+
sage: h(y=y^2, x=3)
|
|
286
|
+
1 + 3*y^2 + 4*y^4 + 2*y^6 + y^8 + 3*y^10 + 4*y^12 + O(y^14)
|
|
287
|
+
sage: h(y^2, x=3)
|
|
288
|
+
1 + 3*y^2 + 4*y^4 + 2*y^6 + y^8 + 3*y^10 + 4*y^12 + O(y^14)
|
|
289
|
+
"""
|
|
290
|
+
P = self.parent()
|
|
291
|
+
|
|
292
|
+
if len(kwds) >= 1:
|
|
293
|
+
name = P.variable_name()
|
|
294
|
+
if name in kwds: # a keyword specifies the power series generator
|
|
295
|
+
if x:
|
|
296
|
+
raise ValueError("must not specify %s keyword and positional argument" % name)
|
|
297
|
+
a = self(kwds[name])
|
|
298
|
+
del kwds[name]
|
|
299
|
+
try:
|
|
300
|
+
return a(**kwds)
|
|
301
|
+
except TypeError:
|
|
302
|
+
return a
|
|
303
|
+
elif x: # both keywords and positional arguments
|
|
304
|
+
a = self(*x)
|
|
305
|
+
try:
|
|
306
|
+
return a(**kwds)
|
|
307
|
+
except TypeError:
|
|
308
|
+
return a
|
|
309
|
+
else: # keywords but no positional arguments
|
|
310
|
+
return P(self.__f(**kwds)).add_bigoh(self._prec)
|
|
311
|
+
|
|
312
|
+
if len(x) == 0:
|
|
313
|
+
return self
|
|
314
|
+
|
|
315
|
+
if isinstance(x[0], tuple):
|
|
316
|
+
x = x[0]
|
|
317
|
+
a = x[0]
|
|
318
|
+
|
|
319
|
+
s = self._prec
|
|
320
|
+
if s == infinity:
|
|
321
|
+
return self.__f(x)
|
|
322
|
+
|
|
323
|
+
Q = a.parent()
|
|
324
|
+
|
|
325
|
+
from sage.rings.padics.padic_generic import pAdicGeneric
|
|
326
|
+
padic = isinstance(Q, pAdicGeneric)
|
|
327
|
+
if padic:
|
|
328
|
+
p = Q.prime()
|
|
329
|
+
|
|
330
|
+
try:
|
|
331
|
+
t = a.valuation()
|
|
332
|
+
except (TypeError, AttributeError):
|
|
333
|
+
if a.is_zero():
|
|
334
|
+
t = infinity
|
|
335
|
+
else:
|
|
336
|
+
t = 0
|
|
337
|
+
|
|
338
|
+
if t == infinity:
|
|
339
|
+
return self[0]
|
|
340
|
+
|
|
341
|
+
if t <= 0:
|
|
342
|
+
raise ValueError("Can only substitute elements of positive valuation")
|
|
343
|
+
|
|
344
|
+
if not Q.has_coerce_map_from(P.base_ring()):
|
|
345
|
+
from sage.structure.element import canonical_coercion
|
|
346
|
+
try:
|
|
347
|
+
R = canonical_coercion(P.base_ring()(0), Q.base_ring()(0))[0].parent()
|
|
348
|
+
self = self.change_ring(R)
|
|
349
|
+
except TypeError:
|
|
350
|
+
raise ValueError("Cannot substitute this value")
|
|
351
|
+
|
|
352
|
+
r = (self - self[0]).valuation()
|
|
353
|
+
if r == s: # self is constant + O(x^s)
|
|
354
|
+
if padic:
|
|
355
|
+
from sage.rings.big_oh import O
|
|
356
|
+
return self[0] + O(p**(s*t))
|
|
357
|
+
else:
|
|
358
|
+
return P(self[0]).add_bigoh(s*t)
|
|
359
|
+
|
|
360
|
+
try:
|
|
361
|
+
u = a.prec()
|
|
362
|
+
except AttributeError:
|
|
363
|
+
u = a.precision_absolute()
|
|
364
|
+
n = (s - r + 1)*t
|
|
365
|
+
if n < u:
|
|
366
|
+
a = a.add_bigoh(n)
|
|
367
|
+
x = list(x)
|
|
368
|
+
x[0] = a
|
|
369
|
+
x = tuple(x)
|
|
370
|
+
return self.__f(x)
|
|
371
|
+
|
|
372
|
+
def _unsafe_mutate(self, i, value):
|
|
373
|
+
"""
|
|
374
|
+
Sage assumes throughout that commutative ring elements are immutable.
|
|
375
|
+
This is relevant for caching, etc. But sometimes you need to change
|
|
376
|
+
a power series and you really know what you're doing. That's
|
|
377
|
+
when this function is for you.
|
|
378
|
+
|
|
379
|
+
** DO NOT USE THIS ** unless you know what you're doing.
|
|
380
|
+
|
|
381
|
+
EXAMPLES::
|
|
382
|
+
|
|
383
|
+
sage: R.<t> = GF(7)[[]]
|
|
384
|
+
sage: f = 3 + 6*t^3 + O(t^5)
|
|
385
|
+
sage: f._unsafe_mutate(0, 5)
|
|
386
|
+
sage: f
|
|
387
|
+
5 + 6*t^3 + O(t^5)
|
|
388
|
+
sage: f._unsafe_mutate(2, 1); f
|
|
389
|
+
5 + t^2 + 6*t^3 + O(t^5)
|
|
390
|
+
|
|
391
|
+
- Mutating can even bump up the precision::
|
|
392
|
+
|
|
393
|
+
sage: f._unsafe_mutate(6, 1); f
|
|
394
|
+
5 + t^2 + 6*t^3 + t^6 + O(t^7)
|
|
395
|
+
sage: f._unsafe_mutate(0, 0); f
|
|
396
|
+
t^2 + 6*t^3 + t^6 + O(t^7)
|
|
397
|
+
sage: f._unsafe_mutate(1, 0); f
|
|
398
|
+
t^2 + 6*t^3 + t^6 + O(t^7)
|
|
399
|
+
sage: f._unsafe_mutate(11,0); f
|
|
400
|
+
t^2 + 6*t^3 + t^6 + O(t^12)
|
|
401
|
+
|
|
402
|
+
sage: g = t + O(t^7)
|
|
403
|
+
sage: g._unsafe_mutate(1,0); g
|
|
404
|
+
O(t^7)
|
|
405
|
+
"""
|
|
406
|
+
self.__f._unsafe_mutate(i, value)
|
|
407
|
+
self._prec = max(self._prec, i+1)
|
|
408
|
+
|
|
409
|
+
def __getitem__(self, n):
|
|
410
|
+
"""
|
|
411
|
+
Return the ``n``-th coefficient of ``self``.
|
|
412
|
+
|
|
413
|
+
This returns 0 for negative coefficients and raises an
|
|
414
|
+
:exc:`IndexError` if trying to access beyond known coefficients.
|
|
415
|
+
|
|
416
|
+
If ``n`` is a slice object ``[:k]``, this will return a power
|
|
417
|
+
series of the same precision, whose coefficients are the same
|
|
418
|
+
as ``self`` for those indices in the slice, and 0 otherwise.
|
|
419
|
+
Other kinds of slicing are not allowed.
|
|
420
|
+
|
|
421
|
+
EXAMPLES::
|
|
422
|
+
|
|
423
|
+
sage: R.<t> = QQ[[]]
|
|
424
|
+
sage: f = 3/2 - 17/5*t^3 + O(t^5)
|
|
425
|
+
sage: f[3]
|
|
426
|
+
-17/5
|
|
427
|
+
sage: f[-2]
|
|
428
|
+
0
|
|
429
|
+
sage: f[4]
|
|
430
|
+
0
|
|
431
|
+
sage: f[5]
|
|
432
|
+
Traceback (most recent call last):
|
|
433
|
+
...
|
|
434
|
+
IndexError: coefficient not known
|
|
435
|
+
|
|
436
|
+
Using slices::
|
|
437
|
+
|
|
438
|
+
sage: R.<t> = ZZ[[]]
|
|
439
|
+
sage: f = (2-t)^5; f
|
|
440
|
+
32 - 80*t + 80*t^2 - 40*t^3 + 10*t^4 - t^5
|
|
441
|
+
sage: f[:4]
|
|
442
|
+
32 - 80*t + 80*t^2 - 40*t^3
|
|
443
|
+
sage: f = 1 + t^3 - 4*t^4 + O(t^7); f
|
|
444
|
+
1 + t^3 - 4*t^4 + O(t^7)
|
|
445
|
+
sage: f[:4]
|
|
446
|
+
1 + t^3 + O(t^7)
|
|
447
|
+
|
|
448
|
+
TESTS::
|
|
449
|
+
|
|
450
|
+
sage: f[1:4]
|
|
451
|
+
Traceback (most recent call last):
|
|
452
|
+
...
|
|
453
|
+
IndexError: polynomial slicing with a start is not defined
|
|
454
|
+
"""
|
|
455
|
+
if isinstance(n, slice):
|
|
456
|
+
return PowerSeries_poly(self._parent, self.polynomial()[n],
|
|
457
|
+
prec=self._prec, check=False)
|
|
458
|
+
elif n < 0:
|
|
459
|
+
return self.base_ring().zero()
|
|
460
|
+
elif n > self.__f.degree():
|
|
461
|
+
if self._prec > n:
|
|
462
|
+
return self.base_ring().zero()
|
|
463
|
+
else:
|
|
464
|
+
raise IndexError("coefficient not known")
|
|
465
|
+
return self.__f[n]
|
|
466
|
+
|
|
467
|
+
def __iter__(self):
|
|
468
|
+
"""
|
|
469
|
+
Return an iterator over the coefficients of this power series.
|
|
470
|
+
|
|
471
|
+
EXAMPLES::
|
|
472
|
+
|
|
473
|
+
sage: R.<t> = QQ[[]]
|
|
474
|
+
sage: f = t + 17/5*t^3 + 2*t^4 + O(t^5)
|
|
475
|
+
sage: [a for a in f]
|
|
476
|
+
[0, 1, 0, 17/5, 2]
|
|
477
|
+
"""
|
|
478
|
+
return iter(self.__f)
|
|
479
|
+
|
|
480
|
+
def __neg__(self):
|
|
481
|
+
"""
|
|
482
|
+
Return the negative of this power series.
|
|
483
|
+
|
|
484
|
+
EXAMPLES::
|
|
485
|
+
|
|
486
|
+
sage: R.<t> = QQ[[]]
|
|
487
|
+
sage: f = t + 17/5*t^3 + 2*t^4 + O(t^5)
|
|
488
|
+
sage: -f
|
|
489
|
+
-t - 17/5*t^3 - 2*t^4 + O(t^5)
|
|
490
|
+
"""
|
|
491
|
+
return PowerSeries_poly(self._parent, -self.__f,
|
|
492
|
+
self._prec, check=False)
|
|
493
|
+
|
|
494
|
+
cpdef _add_(self, right_m):
|
|
495
|
+
"""
|
|
496
|
+
EXAMPLES::
|
|
497
|
+
|
|
498
|
+
sage: R.<x> = PowerSeriesRing(ZZ)
|
|
499
|
+
sage: f = x^4 + O(x^5); f
|
|
500
|
+
x^4 + O(x^5)
|
|
501
|
+
sage: g = x^2 + O(x^3); g
|
|
502
|
+
x^2 + O(x^3)
|
|
503
|
+
sage: f+g
|
|
504
|
+
x^2 + O(x^3)
|
|
505
|
+
|
|
506
|
+
TESTS:
|
|
507
|
+
|
|
508
|
+
In the past this could die with EXC_BAD_ACCESS (:issue:`8029`)::
|
|
509
|
+
|
|
510
|
+
sage: # needs sage.rings.real_mpfr
|
|
511
|
+
sage: A.<x> = RR['x']
|
|
512
|
+
sage: B.<t> = PowerSeriesRing(A)
|
|
513
|
+
sage: 1. + O(t)
|
|
514
|
+
1.00000000000000 + O(t)
|
|
515
|
+
sage: 1. + O(t^2)
|
|
516
|
+
1.00000000000000 + O(t^2)
|
|
517
|
+
sage: 1. + O(t^3)
|
|
518
|
+
1.00000000000000 + O(t^3)
|
|
519
|
+
sage: 1. + O(t^4)
|
|
520
|
+
1.00000000000000 + O(t^4)
|
|
521
|
+
"""
|
|
522
|
+
cdef PowerSeries_poly right = <PowerSeries_poly>right_m
|
|
523
|
+
return PowerSeries_poly(self._parent, self.__f + right.__f,
|
|
524
|
+
self.common_prec_c(right), check=True)
|
|
525
|
+
|
|
526
|
+
cpdef _sub_(self, right_m):
|
|
527
|
+
"""
|
|
528
|
+
Return the difference of two power series.
|
|
529
|
+
|
|
530
|
+
EXAMPLES::
|
|
531
|
+
|
|
532
|
+
sage: k.<w> = ZZ[]
|
|
533
|
+
sage: R.<t> = k[[]]
|
|
534
|
+
sage: w*t^2 -w*t +13 - (w*t^2 + w*t)
|
|
535
|
+
13 - 2*w*t
|
|
536
|
+
"""
|
|
537
|
+
cdef PowerSeries_poly right = <PowerSeries_poly>right_m
|
|
538
|
+
return PowerSeries_poly(self._parent, self.__f - right.__f,
|
|
539
|
+
self.common_prec_c(right), check=True)
|
|
540
|
+
|
|
541
|
+
cpdef _mul_(self, right_r):
|
|
542
|
+
"""
|
|
543
|
+
Return the product of two power series.
|
|
544
|
+
|
|
545
|
+
EXAMPLES::
|
|
546
|
+
|
|
547
|
+
sage: k.<w> = ZZ[[]]
|
|
548
|
+
sage: (1+17*w+15*w^3+O(w^5))*(19*w^10+O(w^12))
|
|
549
|
+
19*w^10 + 323*w^11 + O(w^12)
|
|
550
|
+
"""
|
|
551
|
+
prec = self._mul_prec(right_r)
|
|
552
|
+
return PowerSeries_poly(self._parent,
|
|
553
|
+
self.__f * (<PowerSeries_poly>right_r).__f,
|
|
554
|
+
prec=prec,
|
|
555
|
+
check=True) # check, since truncation may be needed
|
|
556
|
+
|
|
557
|
+
cpdef _rmul_(self, Element c):
|
|
558
|
+
"""
|
|
559
|
+
Multiply ``self`` on the right by a scalar.
|
|
560
|
+
|
|
561
|
+
EXAMPLES::
|
|
562
|
+
|
|
563
|
+
sage: R.<t> = GF(7)[[]]
|
|
564
|
+
sage: f = t + 3*t^4 + O(t^11)
|
|
565
|
+
sage: f * GF(7)(3)
|
|
566
|
+
3*t + 2*t^4 + O(t^11)
|
|
567
|
+
"""
|
|
568
|
+
return PowerSeries_poly(self._parent, self.__f * c, self._prec, check=False)
|
|
569
|
+
|
|
570
|
+
cpdef _lmul_(self, Element c):
|
|
571
|
+
"""
|
|
572
|
+
Multiply ``self`` on the left by a scalar.
|
|
573
|
+
|
|
574
|
+
EXAMPLES::
|
|
575
|
+
|
|
576
|
+
sage: R.<t> = GF(11)[[]]
|
|
577
|
+
sage: f = 1 + 3*t^4 + O(t^120)
|
|
578
|
+
sage: 2 * f
|
|
579
|
+
2 + 6*t^4 + O(t^120)
|
|
580
|
+
"""
|
|
581
|
+
return PowerSeries_poly(self._parent, c * self.__f, self._prec, check=False)
|
|
582
|
+
|
|
583
|
+
def __lshift__(PowerSeries_poly self, n):
|
|
584
|
+
"""
|
|
585
|
+
Shift ``self`` to the left by ``n``, i.e. multiply by `x^n`.
|
|
586
|
+
|
|
587
|
+
EXAMPLES::
|
|
588
|
+
|
|
589
|
+
sage: R.<t> = QQ[[]]
|
|
590
|
+
sage: f = 1 + t + t^4
|
|
591
|
+
sage: f << 1
|
|
592
|
+
t + t^2 + t^5
|
|
593
|
+
"""
|
|
594
|
+
if n:
|
|
595
|
+
return PowerSeries_poly(self._parent, self.__f << n, self._prec + n)
|
|
596
|
+
else:
|
|
597
|
+
return self
|
|
598
|
+
|
|
599
|
+
def __rshift__(PowerSeries_poly self, n):
|
|
600
|
+
"""
|
|
601
|
+
Shift ``self`` to the right by ``n``, i.e. multiply by `x^{-n}` and
|
|
602
|
+
remove any terms of negative exponent.
|
|
603
|
+
|
|
604
|
+
EXAMPLES::
|
|
605
|
+
|
|
606
|
+
sage: # needs sage.rings.finite_rings
|
|
607
|
+
sage: R.<t> = GF(2)[[]]
|
|
608
|
+
sage: f = t + t^4 + O(t^7)
|
|
609
|
+
sage: f >> 1
|
|
610
|
+
1 + t^3 + O(t^6)
|
|
611
|
+
sage: f >> 10
|
|
612
|
+
O(t^0)
|
|
613
|
+
"""
|
|
614
|
+
if n:
|
|
615
|
+
return PowerSeries_poly(self._parent, self.__f >> n, max(0,self._prec - n))
|
|
616
|
+
else:
|
|
617
|
+
return self
|
|
618
|
+
|
|
619
|
+
def __invert__(self):
|
|
620
|
+
"""
|
|
621
|
+
Return the inverse of the power series (i.e., a series `Y` such
|
|
622
|
+
that `XY = 1`).
|
|
623
|
+
|
|
624
|
+
The first nonzero coefficient must be a unit in
|
|
625
|
+
the coefficient ring. If the valuation of the series is positive or
|
|
626
|
+
`X` is not a unit, this function will return a
|
|
627
|
+
:class:`sage.rings.laurent_series_ring_element.LaurentSeries`.
|
|
628
|
+
|
|
629
|
+
EXAMPLES::
|
|
630
|
+
|
|
631
|
+
sage: R.<q> = QQ[[]]
|
|
632
|
+
sage: 1/(1+q + O(q**2))
|
|
633
|
+
1 - q + O(q^2)
|
|
634
|
+
sage: 1/(1+q)
|
|
635
|
+
1 - q + q^2 - q^3 + q^4 - q^5 + q^6 - q^7 + q^8 - q^9 + q^10 - q^11 + q^12 - q^13 + q^14 - q^15 + q^16 - q^17 + q^18 - q^19 + O(q^20)
|
|
636
|
+
sage: prec = R.default_prec(); prec
|
|
637
|
+
20
|
|
638
|
+
sage: 1/(1+q) + O(q^5)
|
|
639
|
+
1 - q + q^2 - q^3 + q^4 + O(q^5)
|
|
640
|
+
|
|
641
|
+
::
|
|
642
|
+
|
|
643
|
+
sage: 1/(q + q^2) + O(q^4)
|
|
644
|
+
q^-1 - 1 + q - q^2 + q^3 + O(q^4)
|
|
645
|
+
sage: g = 1/(q + q^2 + O(q^5))
|
|
646
|
+
sage: g; g.parent()
|
|
647
|
+
q^-1 - 1 + q - q^2 + O(q^3)
|
|
648
|
+
Laurent Series Ring in q over Rational Field
|
|
649
|
+
|
|
650
|
+
::
|
|
651
|
+
|
|
652
|
+
sage: 1/g
|
|
653
|
+
q + q^2 + O(q^5)
|
|
654
|
+
sage: (1/g).parent()
|
|
655
|
+
Laurent Series Ring in q over Rational Field
|
|
656
|
+
|
|
657
|
+
::
|
|
658
|
+
|
|
659
|
+
sage: 1/(2 + q) + O(q^5)
|
|
660
|
+
1/2 - 1/4*q + 1/8*q^2 - 1/16*q^3 + 1/32*q^4 + O(q^5)
|
|
661
|
+
|
|
662
|
+
::
|
|
663
|
+
|
|
664
|
+
sage: R.<q> = PowerSeriesRing(QQ, name='q', default_prec=5)
|
|
665
|
+
sage: f = 1 + q + q^2 + O(q^50)
|
|
666
|
+
sage: f/10
|
|
667
|
+
1/10 + 1/10*q + 1/10*q^2 + O(q^50)
|
|
668
|
+
sage: f/(10+q)
|
|
669
|
+
1/10 + 9/100*q + 91/1000*q^2 - 91/10000*q^3 + 91/100000*q^4 + O(q^5)
|
|
670
|
+
|
|
671
|
+
::
|
|
672
|
+
|
|
673
|
+
sage: R.<t> = PowerSeriesRing(QQ, sparse=True)
|
|
674
|
+
sage: u = 17 + 3*t^2 + 19*t^10 + O(t^12)
|
|
675
|
+
sage: v = ~u; v
|
|
676
|
+
1/17 - 3/289*t^2 + 9/4913*t^4 - 27/83521*t^6 + 81/1419857*t^8 - 1587142/24137569*t^10 + O(t^12)
|
|
677
|
+
sage: u*v
|
|
678
|
+
1 + O(t^12)
|
|
679
|
+
|
|
680
|
+
If we try a nonzero, non-unit constant term, we end up in
|
|
681
|
+
the fraction field, i.e. the Laurent series ring::
|
|
682
|
+
|
|
683
|
+
sage: R.<t> = PowerSeriesRing(ZZ)
|
|
684
|
+
sage: ~R(2)
|
|
685
|
+
1/2
|
|
686
|
+
sage: parent(~R(2))
|
|
687
|
+
Laurent Series Ring in t over Rational Field
|
|
688
|
+
|
|
689
|
+
As for units, we stay in the power series ring::
|
|
690
|
+
|
|
691
|
+
sage: ~R(-1)
|
|
692
|
+
-1
|
|
693
|
+
sage: parent(~R(-1))
|
|
694
|
+
Power Series Ring in t over Integer Ring
|
|
695
|
+
|
|
696
|
+
However, inversion of non-unit elements must fail when the underlying
|
|
697
|
+
ring is not an integral domain::
|
|
698
|
+
|
|
699
|
+
sage: R = IntegerModRing(8)
|
|
700
|
+
sage: P.<s> = R[[]]
|
|
701
|
+
sage: ~P(2)
|
|
702
|
+
Traceback (most recent call last):
|
|
703
|
+
...
|
|
704
|
+
ValueError: must be an integral domain
|
|
705
|
+
"""
|
|
706
|
+
if self.is_one():
|
|
707
|
+
return self
|
|
708
|
+
prec = self.prec()
|
|
709
|
+
if prec is infinity:
|
|
710
|
+
if self.degree() > 0:
|
|
711
|
+
prec = self._parent.default_prec()
|
|
712
|
+
else:
|
|
713
|
+
# constant series
|
|
714
|
+
a = self[0]
|
|
715
|
+
if not a.is_unit():
|
|
716
|
+
from sage.categories.integral_domains import IntegralDomains
|
|
717
|
+
if self._parent in IntegralDomains():
|
|
718
|
+
R = self._parent.fraction_field()
|
|
719
|
+
return 1 / R(a)
|
|
720
|
+
else:
|
|
721
|
+
raise ValueError('must be an integral domain')
|
|
722
|
+
try:
|
|
723
|
+
a = a.inverse_unit()
|
|
724
|
+
except (AttributeError, NotImplementedError):
|
|
725
|
+
a = self._parent.base_ring()(~a)
|
|
726
|
+
return self._parent(a, prec=infinity)
|
|
727
|
+
|
|
728
|
+
if self.valuation() > 0:
|
|
729
|
+
u = ~self.valuation_zero_part() # inverse of unit part
|
|
730
|
+
R = self._parent.laurent_series_ring()
|
|
731
|
+
return R(u, -self.valuation())
|
|
732
|
+
|
|
733
|
+
return self._parent(self.truncate().inverse_series_trunc(prec), prec=prec)
|
|
734
|
+
|
|
735
|
+
def truncate(self, prec=infinity):
|
|
736
|
+
"""
|
|
737
|
+
The polynomial obtained from power series by truncation at
|
|
738
|
+
precision ``prec``.
|
|
739
|
+
|
|
740
|
+
EXAMPLES::
|
|
741
|
+
|
|
742
|
+
sage: R.<I> = GF(2)[[]]
|
|
743
|
+
sage: f = 1/(1+I+O(I^8)); f
|
|
744
|
+
1 + I + I^2 + I^3 + I^4 + I^5 + I^6 + I^7 + O(I^8)
|
|
745
|
+
sage: f.truncate(5)
|
|
746
|
+
I^4 + I^3 + I^2 + I + 1
|
|
747
|
+
"""
|
|
748
|
+
if prec is infinity:
|
|
749
|
+
return self.__f
|
|
750
|
+
else:
|
|
751
|
+
return self.__f.truncate(prec)
|
|
752
|
+
|
|
753
|
+
cdef _inplace_truncate(self, long prec):
|
|
754
|
+
"""
|
|
755
|
+
Truncate ``self`` to precision ``prec`` in place.
|
|
756
|
+
|
|
757
|
+
.. NOTE::
|
|
758
|
+
|
|
759
|
+
This is very unsafe, since power series are supposed to
|
|
760
|
+
be immutable in Sage. Use at your own risk!
|
|
761
|
+
"""
|
|
762
|
+
self.__f = self.__f._inplace_truncate(prec)
|
|
763
|
+
self.prec = prec
|
|
764
|
+
return self
|
|
765
|
+
|
|
766
|
+
def truncate_powerseries(self, long prec):
|
|
767
|
+
r"""
|
|
768
|
+
Given input ``prec`` = `n`, returns the power series of degree
|
|
769
|
+
`< n` which is equivalent to ``self`` modulo `x^n`.
|
|
770
|
+
|
|
771
|
+
EXAMPLES::
|
|
772
|
+
|
|
773
|
+
sage: R.<I> = GF(2)[[]]
|
|
774
|
+
sage: f = 1/(1+I+O(I^8)); f
|
|
775
|
+
1 + I + I^2 + I^3 + I^4 + I^5 + I^6 + I^7 + O(I^8)
|
|
776
|
+
sage: f.truncate_powerseries(5)
|
|
777
|
+
1 + I + I^2 + I^3 + I^4 + O(I^5)
|
|
778
|
+
"""
|
|
779
|
+
return PowerSeries_poly(self._parent, self.__f.truncate(prec),
|
|
780
|
+
min(self._prec, prec), check=False)
|
|
781
|
+
|
|
782
|
+
def list(self):
|
|
783
|
+
"""
|
|
784
|
+
Return the list of known coefficients for ``self``.
|
|
785
|
+
|
|
786
|
+
This is just the list of coefficients of the underlying
|
|
787
|
+
polynomial, so in particular, need not have length equal to
|
|
788
|
+
``self.prec()``.
|
|
789
|
+
|
|
790
|
+
EXAMPLES::
|
|
791
|
+
|
|
792
|
+
sage: R.<t> = ZZ[[]]
|
|
793
|
+
sage: f = 1 - 5*t^3 + t^5 + O(t^7)
|
|
794
|
+
sage: f.list()
|
|
795
|
+
[1, 0, 0, -5, 0, 1]
|
|
796
|
+
"""
|
|
797
|
+
return self.__f.list()
|
|
798
|
+
|
|
799
|
+
def monomial_coefficients(self, copy=True):
|
|
800
|
+
"""
|
|
801
|
+
Return a dictionary of coefficients for ``self``.
|
|
802
|
+
|
|
803
|
+
This is simply a dict for the underlying polynomial, so need
|
|
804
|
+
not have keys corresponding to every number smaller than
|
|
805
|
+
``self.prec()``.
|
|
806
|
+
|
|
807
|
+
EXAMPLES::
|
|
808
|
+
|
|
809
|
+
sage: R.<t> = ZZ[[]]
|
|
810
|
+
sage: f = 1 + t^10 + O(t^12)
|
|
811
|
+
sage: f.monomial_coefficients()
|
|
812
|
+
{0: 1, 10: 1}
|
|
813
|
+
|
|
814
|
+
``dict`` is an alias::
|
|
815
|
+
|
|
816
|
+
sage: f.dict()
|
|
817
|
+
{0: 1, 10: 1}
|
|
818
|
+
"""
|
|
819
|
+
return self.__f.monomial_coefficients(copy=copy)
|
|
820
|
+
|
|
821
|
+
dict = monomial_coefficients
|
|
822
|
+
|
|
823
|
+
def _derivative(self, var=None):
|
|
824
|
+
"""
|
|
825
|
+
Return the derivative of this power series with respect
|
|
826
|
+
to the variable ``var``.
|
|
827
|
+
|
|
828
|
+
If ``var`` is ``None`` or is the generator of this ring, we
|
|
829
|
+
take the derivative with respect to the generator.
|
|
830
|
+
|
|
831
|
+
Otherwise, we call ``_derivative(var)`` on each coefficient of
|
|
832
|
+
the series.
|
|
833
|
+
|
|
834
|
+
.. SEEALSO::
|
|
835
|
+
|
|
836
|
+
``self.derivative()``
|
|
837
|
+
|
|
838
|
+
EXAMPLES::
|
|
839
|
+
|
|
840
|
+
sage: R.<t> = PowerSeriesRing(QQ, sparse=True)
|
|
841
|
+
sage: f = 2 + 3*t^2 + t^100000 + O(t^10000000); f
|
|
842
|
+
2 + 3*t^2 + t^100000 + O(t^10000000)
|
|
843
|
+
sage: f._derivative()
|
|
844
|
+
6*t + 100000*t^99999 + O(t^9999999)
|
|
845
|
+
sage: f._derivative(t)
|
|
846
|
+
6*t + 100000*t^99999 + O(t^9999999)
|
|
847
|
+
|
|
848
|
+
sage: R.<x> = PolynomialRing(ZZ)
|
|
849
|
+
sage: S.<y> = PowerSeriesRing(R, sparse=True)
|
|
850
|
+
sage: f = x^3*y^4 + O(y^5)
|
|
851
|
+
sage: f._derivative()
|
|
852
|
+
4*x^3*y^3 + O(y^4)
|
|
853
|
+
sage: f._derivative(y)
|
|
854
|
+
4*x^3*y^3 + O(y^4)
|
|
855
|
+
sage: f._derivative(x)
|
|
856
|
+
3*x^2*y^4 + O(y^5)
|
|
857
|
+
|
|
858
|
+
TESTS::
|
|
859
|
+
|
|
860
|
+
sage: R.<t> = PowerSeriesRing(QQ, sparse=True)
|
|
861
|
+
sage: x = var('x') # needs sage.symbolic
|
|
862
|
+
sage: t.derivative(x)
|
|
863
|
+
Traceback (most recent call last):
|
|
864
|
+
...
|
|
865
|
+
ValueError: cannot differentiate with respect to x
|
|
866
|
+
"""
|
|
867
|
+
if var is not None and var != self._parent.gen():
|
|
868
|
+
try:
|
|
869
|
+
# call _derivative() recursively on coefficients
|
|
870
|
+
return PowerSeries_poly(self._parent, self.__f._derivative(var),
|
|
871
|
+
self.prec(), check=False)
|
|
872
|
+
except AttributeError:
|
|
873
|
+
raise ValueError('cannot differentiate with respect to {}'.format(var))
|
|
874
|
+
|
|
875
|
+
# compute formal derivative with respect to generator
|
|
876
|
+
return PowerSeries_poly(self._parent, self.__f._derivative(),
|
|
877
|
+
self.prec()-1, check=False)
|
|
878
|
+
|
|
879
|
+
def integral(self, var=None):
|
|
880
|
+
"""
|
|
881
|
+
Return the integral of this power series.
|
|
882
|
+
|
|
883
|
+
By default, the integration variable is the variable of the
|
|
884
|
+
power series.
|
|
885
|
+
|
|
886
|
+
Otherwise, the integration variable is the optional parameter ``var``.
|
|
887
|
+
|
|
888
|
+
.. NOTE::
|
|
889
|
+
|
|
890
|
+
The integral is always chosen so the constant term is 0.
|
|
891
|
+
|
|
892
|
+
EXAMPLES::
|
|
893
|
+
|
|
894
|
+
sage: k.<w> = QQ[[]]
|
|
895
|
+
sage: (1+17*w+15*w^3+O(w^5)).integral()
|
|
896
|
+
w + 17/2*w^2 + 15/4*w^4 + O(w^6)
|
|
897
|
+
sage: (w^3 + 4*w^4 + O(w^7)).integral()
|
|
898
|
+
1/4*w^4 + 4/5*w^5 + O(w^8)
|
|
899
|
+
sage: (3*w^2).integral()
|
|
900
|
+
w^3
|
|
901
|
+
|
|
902
|
+
TESTS::
|
|
903
|
+
|
|
904
|
+
sage: t = PowerSeriesRing(QQ,'t').gen()
|
|
905
|
+
sage: f = t + 5*t^2 + 21*t^3
|
|
906
|
+
sage: g = f.integral(); g
|
|
907
|
+
1/2*t^2 + 5/3*t^3 + 21/4*t^4
|
|
908
|
+
sage: g.parent()
|
|
909
|
+
Power Series Ring in t over Rational Field
|
|
910
|
+
|
|
911
|
+
sage: R.<x> = QQ[]
|
|
912
|
+
sage: t = PowerSeriesRing(R,'t').gen()
|
|
913
|
+
sage: f = x*t +5*t^2
|
|
914
|
+
sage: f.integral()
|
|
915
|
+
1/2*x*t^2 + 5/3*t^3
|
|
916
|
+
sage: f.integral(x)
|
|
917
|
+
1/2*x^2*t + 5*x*t^2
|
|
918
|
+
"""
|
|
919
|
+
return PowerSeries_poly(self._parent, self.__f.integral(var),
|
|
920
|
+
self.prec()+1, check=False)
|
|
921
|
+
|
|
922
|
+
def reverse(self, precision=None):
|
|
923
|
+
"""
|
|
924
|
+
Return the reverse of `f`, i.e., the series `g` such that `g(f(x)) = x`.
|
|
925
|
+
|
|
926
|
+
Given an optional argument ``precision``, return the reverse with given
|
|
927
|
+
precision (note that the reverse can have precision at most
|
|
928
|
+
``f.prec()``). If `f` has infinite precision, and the argument
|
|
929
|
+
``precision`` is not given, then the precision of the reverse defaults
|
|
930
|
+
to the default precision of ``f.parent()``.
|
|
931
|
+
|
|
932
|
+
Note that this is only possible if the valuation of ``self`` is exactly
|
|
933
|
+
1.
|
|
934
|
+
|
|
935
|
+
ALGORITHM:
|
|
936
|
+
|
|
937
|
+
We first attempt to pass the computation to pari; if this fails, we
|
|
938
|
+
use Lagrange inversion. Using ``sage: set_verbose(1)`` will print
|
|
939
|
+
a message if passing to pari fails.
|
|
940
|
+
|
|
941
|
+
If the base ring has positive characteristic, then we attempt to
|
|
942
|
+
lift to a characteristic zero ring and perform the reverse there.
|
|
943
|
+
If this fails, an error is raised.
|
|
944
|
+
|
|
945
|
+
EXAMPLES::
|
|
946
|
+
|
|
947
|
+
sage: R.<x> = PowerSeriesRing(QQ)
|
|
948
|
+
sage: f = 2*x + 3*x^2 - x^4 + O(x^5)
|
|
949
|
+
sage: g = f.reverse()
|
|
950
|
+
sage: g
|
|
951
|
+
1/2*x - 3/8*x^2 + 9/16*x^3 - 131/128*x^4 + O(x^5)
|
|
952
|
+
sage: f(g)
|
|
953
|
+
x + O(x^5)
|
|
954
|
+
sage: g(f)
|
|
955
|
+
x + O(x^5)
|
|
956
|
+
|
|
957
|
+
sage: A.<t> = PowerSeriesRing(ZZ)
|
|
958
|
+
sage: a = t - t^2 - 2*t^4 + t^5 + O(t^6)
|
|
959
|
+
sage: b = a.reverse(); b
|
|
960
|
+
t + t^2 + 2*t^3 + 7*t^4 + 25*t^5 + O(t^6)
|
|
961
|
+
sage: a(b)
|
|
962
|
+
t + O(t^6)
|
|
963
|
+
sage: b(a)
|
|
964
|
+
t + O(t^6)
|
|
965
|
+
|
|
966
|
+
sage: B.<b,c> = PolynomialRing(ZZ)
|
|
967
|
+
sage: A.<t> = PowerSeriesRing(B)
|
|
968
|
+
sage: f = t + b*t^2 + c*t^3 + O(t^4)
|
|
969
|
+
sage: g = f.reverse(); g
|
|
970
|
+
t - b*t^2 + (2*b^2 - c)*t^3 + O(t^4)
|
|
971
|
+
sage: f(g)
|
|
972
|
+
t + O(t^4)
|
|
973
|
+
sage: g(f)
|
|
974
|
+
t + O(t^4)
|
|
975
|
+
|
|
976
|
+
sage: A.<t> = PowerSeriesRing(ZZ)
|
|
977
|
+
sage: B.<s> = A[[]]
|
|
978
|
+
sage: f = (1 - 3*t + 4*t^3 + O(t^4))*s + (2 + t + t^2 + O(t^3))*s^2 + O(s^3)
|
|
979
|
+
sage: from sage.misc.verbose import set_verbose
|
|
980
|
+
sage: set_verbose(1)
|
|
981
|
+
sage: g = f.reverse(); g
|
|
982
|
+
verbose 1 (<module>) passing to pari failed; trying Lagrange inversion
|
|
983
|
+
(1 + 3*t + 9*t^2 + 23*t^3 + O(t^4))*s + (-2 - 19*t - 118*t^2 + O(t^3))*s^2 + O(s^3)
|
|
984
|
+
sage: set_verbose(0)
|
|
985
|
+
sage: f(g) == g(f) == s
|
|
986
|
+
True
|
|
987
|
+
|
|
988
|
+
If the leading coefficient is not a unit, we pass to its fraction
|
|
989
|
+
field if possible::
|
|
990
|
+
|
|
991
|
+
sage: A.<t> = PowerSeriesRing(ZZ)
|
|
992
|
+
sage: a = 2*t - 4*t^2 + t^4 - t^5 + O(t^6)
|
|
993
|
+
sage: a.reverse()
|
|
994
|
+
1/2*t + 1/2*t^2 + t^3 + 79/32*t^4 + 437/64*t^5 + O(t^6)
|
|
995
|
+
|
|
996
|
+
sage: B.<b> = PolynomialRing(ZZ)
|
|
997
|
+
sage: A.<t> = PowerSeriesRing(B)
|
|
998
|
+
sage: f = 2*b*t + b*t^2 + 3*b^2*t^3 + O(t^4)
|
|
999
|
+
sage: g = f.reverse(); g
|
|
1000
|
+
1/(2*b)*t - 1/(8*b^2)*t^2 + ((-3*b + 1)/(16*b^3))*t^3 + O(t^4)
|
|
1001
|
+
sage: f(g)
|
|
1002
|
+
t + O(t^4)
|
|
1003
|
+
sage: g(f)
|
|
1004
|
+
t + O(t^4)
|
|
1005
|
+
|
|
1006
|
+
We can handle some base rings of positive characteristic::
|
|
1007
|
+
|
|
1008
|
+
sage: A8.<t> = PowerSeriesRing(Zmod(8))
|
|
1009
|
+
sage: a = t - 15*t^2 - 2*t^4 + t^5 + O(t^6)
|
|
1010
|
+
sage: b = a.reverse(); b
|
|
1011
|
+
t + 7*t^2 + 2*t^3 + 5*t^4 + t^5 + O(t^6)
|
|
1012
|
+
sage: a(b)
|
|
1013
|
+
t + O(t^6)
|
|
1014
|
+
sage: b(a)
|
|
1015
|
+
t + O(t^6)
|
|
1016
|
+
|
|
1017
|
+
The optional argument ``precision`` sets the precision of the output::
|
|
1018
|
+
|
|
1019
|
+
sage: R.<x> = PowerSeriesRing(QQ)
|
|
1020
|
+
sage: f = 2*x + 3*x^2 - 7*x^3 + x^4 + O(x^5)
|
|
1021
|
+
sage: g = f.reverse(precision=3); g
|
|
1022
|
+
1/2*x - 3/8*x^2 + O(x^3)
|
|
1023
|
+
sage: f(g)
|
|
1024
|
+
x + O(x^3)
|
|
1025
|
+
sage: g(f)
|
|
1026
|
+
x + O(x^3)
|
|
1027
|
+
|
|
1028
|
+
If the input series has infinite precision, the precision of the
|
|
1029
|
+
output is automatically set to the default precision of the parent
|
|
1030
|
+
ring::
|
|
1031
|
+
|
|
1032
|
+
sage: R.<x> = PowerSeriesRing(QQ, default_prec=20)
|
|
1033
|
+
sage: (x - x^2).reverse() # get some Catalan numbers
|
|
1034
|
+
x + x^2 + 2*x^3 + 5*x^4 + 14*x^5 + 42*x^6 + 132*x^7 + 429*x^8 + 1430*x^9
|
|
1035
|
+
+ 4862*x^10 + 16796*x^11 + 58786*x^12 + 208012*x^13 + 742900*x^14
|
|
1036
|
+
+ 2674440*x^15 + 9694845*x^16 + 35357670*x^17 + 129644790*x^18
|
|
1037
|
+
+ 477638700*x^19 + O(x^20)
|
|
1038
|
+
sage: (x - x^2).reverse(precision=3)
|
|
1039
|
+
x + x^2 + O(x^3)
|
|
1040
|
+
|
|
1041
|
+
TESTS::
|
|
1042
|
+
|
|
1043
|
+
sage: R.<x> = PowerSeriesRing(QQ)
|
|
1044
|
+
sage: f = 1 + 2*x + 3*x^2 - x^4 + O(x^5)
|
|
1045
|
+
sage: f.reverse()
|
|
1046
|
+
Traceback (most recent call last):
|
|
1047
|
+
...
|
|
1048
|
+
ValueError: Series must have valuation one for reversion.
|
|
1049
|
+
|
|
1050
|
+
sage: Series = PowerSeriesRing(SR, 'x') # needs sage.symbolic
|
|
1051
|
+
sage: ser = Series([0, pi]); ser # needs sage.symbolic
|
|
1052
|
+
pi*x
|
|
1053
|
+
sage: ser.reverse() # needs sage.symbolic
|
|
1054
|
+
1/pi*x + O(x^20)
|
|
1055
|
+
"""
|
|
1056
|
+
if self.valuation() != 1:
|
|
1057
|
+
raise ValueError("Series must have valuation one for reversion.")
|
|
1058
|
+
|
|
1059
|
+
f = self
|
|
1060
|
+
|
|
1061
|
+
if f.prec() is infinity and precision is None:
|
|
1062
|
+
precision = f.parent().default_prec()
|
|
1063
|
+
if precision:
|
|
1064
|
+
f = f.add_bigoh(precision)
|
|
1065
|
+
|
|
1066
|
+
out_prec = f.prec()
|
|
1067
|
+
|
|
1068
|
+
if not f[1].is_unit():
|
|
1069
|
+
# if leading coefficient is not a unit, attempt passing
|
|
1070
|
+
# to fraction field
|
|
1071
|
+
try:
|
|
1072
|
+
f = f.change_ring(f.base_ring().fraction_field())
|
|
1073
|
+
except TypeError:
|
|
1074
|
+
raise TypeError("Leading coefficient must be a unit, or base ring must have a fraction field.")
|
|
1075
|
+
|
|
1076
|
+
# set output parent after possibly passing to fraction field,
|
|
1077
|
+
# but before possibly lifting to characteristic zero
|
|
1078
|
+
out_parent = f.parent()
|
|
1079
|
+
|
|
1080
|
+
# first, try reversion with pari; this is faster than Lagrange inversion
|
|
1081
|
+
try:
|
|
1082
|
+
f2 = f.__pari__()
|
|
1083
|
+
g = f2.serreverse()
|
|
1084
|
+
return PowerSeries_poly(f.parent(), g.Vec(-out_prec), out_prec)
|
|
1085
|
+
except (TypeError, ValueError, AttributeError, PariError, ImportError, NameError):
|
|
1086
|
+
# if pari fails, continue with Lagrange inversion
|
|
1087
|
+
from sage.misc.verbose import verbose
|
|
1088
|
+
verbose("passing to pari failed; trying Lagrange inversion")
|
|
1089
|
+
|
|
1090
|
+
if f.parent().characteristic():
|
|
1091
|
+
# over a ring of positive characteristic, attempt lifting to
|
|
1092
|
+
# characteristic zero ring
|
|
1093
|
+
verbose("parent ring has positive characteristic; attempting lift to characteristic zero")
|
|
1094
|
+
base_lift = f.base_ring().lift().codomain()
|
|
1095
|
+
verbose("characteristic zero base is "+str(base_lift))
|
|
1096
|
+
f_lift = f.change_ring(base_lift)
|
|
1097
|
+
verbose("f_lift is "+str(f_lift))
|
|
1098
|
+
rev_lift = f_lift.reverse()
|
|
1099
|
+
return rev_lift.change_ring(f.base_ring())
|
|
1100
|
+
|
|
1101
|
+
t = f.parent().gen()
|
|
1102
|
+
R = f.parent().base_ring()
|
|
1103
|
+
|
|
1104
|
+
h = t/f
|
|
1105
|
+
k = 1
|
|
1106
|
+
g = 0
|
|
1107
|
+
for i in range(1, out_prec):
|
|
1108
|
+
k *= h
|
|
1109
|
+
g += R(k.padded_list(i)[i - 1]/i)*t**i
|
|
1110
|
+
g = g.add_bigoh(out_prec)
|
|
1111
|
+
return PowerSeries_poly(out_parent, g, out_prec, check=False)
|
|
1112
|
+
|
|
1113
|
+
def pade(self, m, n):
|
|
1114
|
+
r"""
|
|
1115
|
+
Return the Padé approximant of ``self`` of index `(m, n)`.
|
|
1116
|
+
|
|
1117
|
+
The Padé approximant of index `(m, n)` of a formal power
|
|
1118
|
+
series `f` is the quotient `Q/P` of two polynomials `Q` and `P`
|
|
1119
|
+
such that `\deg(Q)\leq m`, `\deg(P)\leq n` and
|
|
1120
|
+
|
|
1121
|
+
.. MATH::
|
|
1122
|
+
|
|
1123
|
+
f(z) - Q(z)/P(z) = O(z^{m+n+1}).
|
|
1124
|
+
|
|
1125
|
+
The formal power series `f` must be known up to order `n + m`.
|
|
1126
|
+
|
|
1127
|
+
See :wikipedia:`Padé\_approximant`
|
|
1128
|
+
|
|
1129
|
+
INPUT:
|
|
1130
|
+
|
|
1131
|
+
- ``m``, ``n`` -- integers, describing the degrees of the polynomials
|
|
1132
|
+
|
|
1133
|
+
OUTPUT: a ratio of two polynomials
|
|
1134
|
+
|
|
1135
|
+
ALGORITHM:
|
|
1136
|
+
|
|
1137
|
+
This method uses the formula as a quotient of two determinants.
|
|
1138
|
+
|
|
1139
|
+
.. SEEALSO::
|
|
1140
|
+
|
|
1141
|
+
* :mod:`sage.matrix.berlekamp_massey`,
|
|
1142
|
+
* :meth:`sage.rings.polynomial.polynomial_zmod_flint.Polynomial_zmod_flint.rational_reconstruction`
|
|
1143
|
+
|
|
1144
|
+
EXAMPLES::
|
|
1145
|
+
|
|
1146
|
+
sage: z = PowerSeriesRing(QQ, 'z').gen()
|
|
1147
|
+
sage: exp(z).pade(4, 0)
|
|
1148
|
+
1/24*z^4 + 1/6*z^3 + 1/2*z^2 + z + 1
|
|
1149
|
+
sage: exp(z).pade(1, 1)
|
|
1150
|
+
(-z - 2)/(z - 2)
|
|
1151
|
+
sage: exp(z).pade(3, 3)
|
|
1152
|
+
(-z^3 - 12*z^2 - 60*z - 120)/(z^3 - 12*z^2 + 60*z - 120)
|
|
1153
|
+
sage: log(1-z).pade(4, 4)
|
|
1154
|
+
(25/6*z^4 - 130/3*z^3 + 105*z^2 - 70*z)/(z^4 - 20*z^3 + 90*z^2
|
|
1155
|
+
- 140*z + 70)
|
|
1156
|
+
sage: sqrt(1+z).pade(3, 2)
|
|
1157
|
+
(1/6*z^3 + 3*z^2 + 8*z + 16/3)/(z^2 + 16/3*z + 16/3)
|
|
1158
|
+
sage: exp(2*z).pade(3, 3)
|
|
1159
|
+
(-z^3 - 6*z^2 - 15*z - 15)/(z^3 - 6*z^2 + 15*z - 15)
|
|
1160
|
+
|
|
1161
|
+
TESTS:
|
|
1162
|
+
|
|
1163
|
+
With real coefficients::
|
|
1164
|
+
|
|
1165
|
+
sage: # needs sage.rings.real_mpfr
|
|
1166
|
+
sage: R.<z> = RR[[]]
|
|
1167
|
+
sage: f = exp(2*z)
|
|
1168
|
+
sage: f.pade(3, 3) # abs tol 1e-10
|
|
1169
|
+
(-z^3 - 6.0*z^2 - 15.0*z - 15.0)/(z^3 - 6.0*z^2 + 15.0*z - 15.0)
|
|
1170
|
+
|
|
1171
|
+
When precision is too low::
|
|
1172
|
+
|
|
1173
|
+
sage: # needs sage.rings.real_mpfr
|
|
1174
|
+
sage: f = z + O(z**6)
|
|
1175
|
+
sage: f.pade(4, 4)
|
|
1176
|
+
Traceback (most recent call last):
|
|
1177
|
+
...
|
|
1178
|
+
ValueError: the precision of the series is not large enough
|
|
1179
|
+
|
|
1180
|
+
Check that :issue:`21212` is fixed::
|
|
1181
|
+
|
|
1182
|
+
sage: QQx.<x> = QQ[[]]
|
|
1183
|
+
sage: (1 + x + O(x^100)).pade(2,2)
|
|
1184
|
+
x + 1
|
|
1185
|
+
|
|
1186
|
+
Check for correct precision::
|
|
1187
|
+
|
|
1188
|
+
sage: QQx.<x> = QQ[[]]
|
|
1189
|
+
sage: (1 + x + O(x^2)).pade(0,1)
|
|
1190
|
+
-1/(x - 1)
|
|
1191
|
+
"""
|
|
1192
|
+
if self.precision_absolute() < n + m + 1:
|
|
1193
|
+
raise ValueError("the precision of the series is not large enough")
|
|
1194
|
+
polyring = self.parent()._poly_ring()
|
|
1195
|
+
z = polyring.gen()
|
|
1196
|
+
c = self.polynomial()
|
|
1197
|
+
u, v = c.rational_reconstruction(z**(n + m + 1), m, n)
|
|
1198
|
+
return u / v
|
|
1199
|
+
|
|
1200
|
+
def _symbolic_(self, ring):
|
|
1201
|
+
"""
|
|
1202
|
+
Conversion to symbolic series.
|
|
1203
|
+
|
|
1204
|
+
EXAMPLES::
|
|
1205
|
+
|
|
1206
|
+
sage: # needs sage.symbolic
|
|
1207
|
+
sage: R.<x> = PowerSeriesRing(QQ)
|
|
1208
|
+
sage: s = R([1,2,3,4,5], prec=10); s
|
|
1209
|
+
1 + 2*x + 3*x^2 + 4*x^3 + 5*x^4 + O(x^10)
|
|
1210
|
+
sage: SR(s)
|
|
1211
|
+
1 + 2*x + 3*x^2 + 4*x^3 + 5*x^4 + Order(x^10)
|
|
1212
|
+
sage: SR(s).is_terminating_series()
|
|
1213
|
+
False
|
|
1214
|
+
sage: SR(s).variables()
|
|
1215
|
+
(x,)
|
|
1216
|
+
sage: s = R([1,2,3,4,5]); s
|
|
1217
|
+
1 + 2*x + 3*x^2 + 4*x^3 + 5*x^4
|
|
1218
|
+
sage: SR(s)
|
|
1219
|
+
1 + 2*x + 3*x^2 + 4*x^3 + 5*x^4
|
|
1220
|
+
sage: _.is_terminating_series()
|
|
1221
|
+
True
|
|
1222
|
+
|
|
1223
|
+
TESTS:
|
|
1224
|
+
|
|
1225
|
+
Check that :issue:`18094` is fixed::
|
|
1226
|
+
|
|
1227
|
+
sage: R.<x> = PolynomialRing(ZZ)
|
|
1228
|
+
sage: SR(R(0).add_bigoh(20)) # needs sage.symbolic
|
|
1229
|
+
Order(x^20)
|
|
1230
|
+
"""
|
|
1231
|
+
from sage.symbolic.ring import SR
|
|
1232
|
+
pex = SR(self.polynomial())
|
|
1233
|
+
var = SR.var(self.variable())
|
|
1234
|
+
return pex.series(var, self.prec())
|
|
1235
|
+
|
|
1236
|
+
|
|
1237
|
+
def make_powerseries_poly_v0(parent, f, prec, is_gen):
|
|
1238
|
+
"""
|
|
1239
|
+
Return the power series specified by ``f``, ``prec``, and ``is_gen``.
|
|
1240
|
+
|
|
1241
|
+
This function exists for the purposes of pickling. Do not delete
|
|
1242
|
+
this function -- if you change the internal representation,
|
|
1243
|
+
instead make a new function and make sure that both kinds of
|
|
1244
|
+
objects correctly unpickle as the new type.
|
|
1245
|
+
|
|
1246
|
+
EXAMPLES::
|
|
1247
|
+
|
|
1248
|
+
sage: R.<t> = QQ[[]]
|
|
1249
|
+
sage: sage.rings.power_series_poly.make_powerseries_poly_v0(R, t, infinity, True)
|
|
1250
|
+
t
|
|
1251
|
+
"""
|
|
1252
|
+
return PowerSeries_poly(parent, f, prec, 0, is_gen)
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
cdef class BaseRingFloorDivAction(Action):
|
|
1256
|
+
"""
|
|
1257
|
+
The floor division action of the base ring on a formal power series.
|
|
1258
|
+
"""
|
|
1259
|
+
cpdef _act_(self, g, x):
|
|
1260
|
+
r"""
|
|
1261
|
+
Let ``g`` act on ``x`` under ``self``.
|
|
1262
|
+
|
|
1263
|
+
Regardless of whether this is a left or right action, the acting
|
|
1264
|
+
element comes first.
|
|
1265
|
+
|
|
1266
|
+
INPUT:
|
|
1267
|
+
|
|
1268
|
+
- ``g`` -- an object with parent ``self.G``
|
|
1269
|
+
- ``x`` -- an object with parent ``self.US()``
|
|
1270
|
+
|
|
1271
|
+
.. WARNING::
|
|
1272
|
+
|
|
1273
|
+
This is meant to be a fast internal function, so the
|
|
1274
|
+
conditions on the input are not checked!
|
|
1275
|
+
|
|
1276
|
+
EXAMPLES:
|
|
1277
|
+
|
|
1278
|
+
One gets the correct parent with floor division::
|
|
1279
|
+
|
|
1280
|
+
sage: A = ZZ[['t']]
|
|
1281
|
+
sage: f = A([3*2**n for n in range(6)]).O(6)
|
|
1282
|
+
sage: g = f // 3; g
|
|
1283
|
+
1 + 2*t + 4*t^2 + 8*t^3 + 16*t^4 + 32*t^5 + O(t^6)
|
|
1284
|
+
sage: g.parent()
|
|
1285
|
+
Power Series Ring in t over Integer Ring
|
|
1286
|
+
|
|
1287
|
+
whereas the parent is larger with division::
|
|
1288
|
+
|
|
1289
|
+
sage: parent(f/3)
|
|
1290
|
+
Power Series Ring in t over Rational Field
|
|
1291
|
+
|
|
1292
|
+
Floor division in case that the power series is not divisible by the divisor::
|
|
1293
|
+
|
|
1294
|
+
sage: f = A([2**n for n in range(6)]).O(6)
|
|
1295
|
+
sage: g = f // 3; g
|
|
1296
|
+
t^2 + 2*t^3 + 5*t^4 + 10*t^5 + O(t^6)
|
|
1297
|
+
|
|
1298
|
+
Another example::
|
|
1299
|
+
|
|
1300
|
+
sage: s = polygen(QQ,'s')
|
|
1301
|
+
sage: A = s.parent()[['t']]
|
|
1302
|
+
sage: f = A([(s+2)*(s+n) for n in range(5)]).O(5)
|
|
1303
|
+
sage: g = f // (s + 2); g
|
|
1304
|
+
s + (s + 1)*t + (s + 2)*t^2 + (s + 3)*t^3 + (s + 4)*t^4 + O(t^5)
|
|
1305
|
+
sage: g.parent()
|
|
1306
|
+
Power Series Ring in t over Univariate Polynomial Ring in s
|
|
1307
|
+
over Rational Field
|
|
1308
|
+
|
|
1309
|
+
sage: R.<t> = PowerSeriesRing(QQ)
|
|
1310
|
+
sage: t // 2
|
|
1311
|
+
1/2*t
|
|
1312
|
+
"""
|
|
1313
|
+
cdef PowerSeries_poly elt = <PowerSeries_poly> x
|
|
1314
|
+
prec = x.prec()
|
|
1315
|
+
P = self.US()
|
|
1316
|
+
g = P.base_ring()(g)
|
|
1317
|
+
return type(x)(P, elt.__f // g, prec=prec, check=False)
|