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,931 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Laurent Series Rings
|
|
4
|
+
|
|
5
|
+
EXAMPLES::
|
|
6
|
+
|
|
7
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
8
|
+
sage: R.base_ring()
|
|
9
|
+
Rational Field
|
|
10
|
+
sage: S = LaurentSeriesRing(GF(17)['x'], 'y')
|
|
11
|
+
sage: S
|
|
12
|
+
Laurent Series Ring in y over
|
|
13
|
+
Univariate Polynomial Ring in x over Finite Field of size 17
|
|
14
|
+
sage: S.base_ring()
|
|
15
|
+
Univariate Polynomial Ring in x over Finite Field of size 17
|
|
16
|
+
|
|
17
|
+
.. SEEALSO::
|
|
18
|
+
|
|
19
|
+
* :func:`sage.misc.defaults.set_series_precision`
|
|
20
|
+
"""
|
|
21
|
+
# ****************************************************************************
|
|
22
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
23
|
+
# 2007 Robert Bradshaw <robertwb@math.washington.edu>
|
|
24
|
+
# 2012 David Roe <roed.math@gmail.com>
|
|
25
|
+
# 2014 Peter Bruin <P.J.Bruin@math.leidenuniv.nl>
|
|
26
|
+
# 2017 Vincent Delecroix <20100.delecroix@gmail.com>
|
|
27
|
+
#
|
|
28
|
+
# This program is free software: you can redistribute it and/or modify
|
|
29
|
+
# it under the terms of the GNU General Public License as published by
|
|
30
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
31
|
+
# (at your option) any later version.
|
|
32
|
+
# https://www.gnu.org/licenses/
|
|
33
|
+
# ****************************************************************************
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
from sage.categories.algebras import Algebras
|
|
37
|
+
from sage.categories.complete_discrete_valuation import CompleteDiscreteValuationFields
|
|
38
|
+
from sage.categories.fields import Fields
|
|
39
|
+
from sage.categories.integral_domains import IntegralDomains
|
|
40
|
+
from sage.categories.rings import Rings
|
|
41
|
+
from sage.misc.cachefunc import cached_method
|
|
42
|
+
from sage.misc.lazy_import import lazy_import
|
|
43
|
+
from sage.rings.infinity import infinity
|
|
44
|
+
from sage.rings.integer_ring import ZZ
|
|
45
|
+
from sage.rings.laurent_series_ring_element import LaurentSeries
|
|
46
|
+
from sage.structure.parent import Parent
|
|
47
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
48
|
+
|
|
49
|
+
try:
|
|
50
|
+
from cypari2.gen import Gen as pari_gen
|
|
51
|
+
except ImportError:
|
|
52
|
+
pari_gen = ()
|
|
53
|
+
|
|
54
|
+
lazy_import('sage.rings.polynomial.laurent_polynomial_ring_base', 'LaurentPolynomialRing_generic')
|
|
55
|
+
lazy_import('sage.rings.lazy_series', ['LazyPowerSeries', 'LazyLaurentSeries'])
|
|
56
|
+
lazy_import('sage.rings.lazy_series_ring', ('LazyPowerSeriesRing', 'LazyLaurentSeriesRing'))
|
|
57
|
+
lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_generic')
|
|
58
|
+
lazy_import('sage.rings.power_series_ring', 'PowerSeriesRing_generic')
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def is_LaurentSeriesRing(x):
|
|
62
|
+
"""
|
|
63
|
+
Return ``True`` if this is a *univariate* Laurent series ring.
|
|
64
|
+
|
|
65
|
+
This is in keeping with the behavior of ``is_PolynomialRing``
|
|
66
|
+
versus ``is_MPolynomialRing``.
|
|
67
|
+
|
|
68
|
+
TESTS::
|
|
69
|
+
|
|
70
|
+
sage: from sage.rings.laurent_series_ring import is_LaurentSeriesRing
|
|
71
|
+
sage: K.<q> = LaurentSeriesRing(QQ)
|
|
72
|
+
sage: is_LaurentSeriesRing(K)
|
|
73
|
+
doctest:warning...
|
|
74
|
+
DeprecationWarning: The function is_LaurentSeriesRing is deprecated;
|
|
75
|
+
use 'isinstance(..., (LaurentSeriesRing, LazyLaurentSeriesRing))' instead.
|
|
76
|
+
See https://github.com/sagemath/sage/issues/38290 for details.
|
|
77
|
+
True
|
|
78
|
+
sage: L.<z> = LazyLaurentSeriesRing(QQ) # needs sage.combinat
|
|
79
|
+
sage: is_LaurentSeriesRing(L) # needs sage.combinat
|
|
80
|
+
True
|
|
81
|
+
"""
|
|
82
|
+
from sage.misc.superseded import deprecation
|
|
83
|
+
deprecation(38290,
|
|
84
|
+
"The function is_LaurentSeriesRing is deprecated; "
|
|
85
|
+
"use 'isinstance(..., (LaurentSeriesRing, LazyLaurentSeriesRing))' instead.")
|
|
86
|
+
return isinstance(x, (LaurentSeriesRing, LazyLaurentSeriesRing))
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class LaurentSeriesRing(UniqueRepresentation, Parent):
|
|
90
|
+
r"""
|
|
91
|
+
Univariate Laurent Series Ring.
|
|
92
|
+
|
|
93
|
+
EXAMPLES::
|
|
94
|
+
|
|
95
|
+
sage: R = LaurentSeriesRing(QQ, 'x'); R
|
|
96
|
+
Laurent Series Ring in x over Rational Field
|
|
97
|
+
sage: x = R.0
|
|
98
|
+
sage: g = 1 - x + x^2 - x^4 + O(x^8); g
|
|
99
|
+
1 - x + x^2 - x^4 + O(x^8)
|
|
100
|
+
sage: g = 10*x^(-3) + 2006 - 19*x + x^2 - x^4 +O(x^8); g
|
|
101
|
+
10*x^-3 + 2006 - 19*x + x^2 - x^4 + O(x^8)
|
|
102
|
+
|
|
103
|
+
You can also use more mathematical notation when the base is a
|
|
104
|
+
field::
|
|
105
|
+
|
|
106
|
+
sage: Frac(QQ[['x']])
|
|
107
|
+
Laurent Series Ring in x over Rational Field
|
|
108
|
+
sage: Frac(GF(5)['y'])
|
|
109
|
+
Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5
|
|
110
|
+
|
|
111
|
+
When the base ring is a domain, the fraction field is the
|
|
112
|
+
Laurent series ring over the fraction field of the base ring::
|
|
113
|
+
|
|
114
|
+
sage: Frac(ZZ[['t']])
|
|
115
|
+
Laurent Series Ring in t over Rational Field
|
|
116
|
+
|
|
117
|
+
Laurent series rings are determined by their variable and the base
|
|
118
|
+
ring, and are globally unique::
|
|
119
|
+
|
|
120
|
+
sage: # needs sage.rings.padics
|
|
121
|
+
sage: K = Qp(5, prec=5)
|
|
122
|
+
sage: L = Qp(5, prec=200)
|
|
123
|
+
sage: R.<x> = LaurentSeriesRing(K)
|
|
124
|
+
sage: S.<y> = LaurentSeriesRing(L)
|
|
125
|
+
sage: R is S
|
|
126
|
+
False
|
|
127
|
+
sage: T.<y> = LaurentSeriesRing(Qp(5, prec=200))
|
|
128
|
+
sage: S is T
|
|
129
|
+
True
|
|
130
|
+
sage: W.<y> = LaurentSeriesRing(Qp(5, prec=199))
|
|
131
|
+
sage: W is T
|
|
132
|
+
False
|
|
133
|
+
|
|
134
|
+
sage: K = LaurentSeriesRing(CC, 'q'); K # needs sage.rings.real_mpfr
|
|
135
|
+
Laurent Series Ring in q over Complex Field with 53 bits of precision
|
|
136
|
+
sage: loads(K.dumps()) == K # needs sage.rings.real_mpfr
|
|
137
|
+
True
|
|
138
|
+
sage: P = QQ[['x']]
|
|
139
|
+
sage: F = Frac(P)
|
|
140
|
+
sage: TestSuite(F).run()
|
|
141
|
+
|
|
142
|
+
When the base ring `k` is a field, the ring `k((x))` is a CDVF, that is
|
|
143
|
+
a field equipped with a discrete valuation for which it is complete.
|
|
144
|
+
The appropriate (sub)category is automatically set in this case::
|
|
145
|
+
|
|
146
|
+
sage: k = GF(11)
|
|
147
|
+
sage: R.<x> = k[[]]
|
|
148
|
+
sage: F = Frac(R)
|
|
149
|
+
sage: F.category()
|
|
150
|
+
Join of
|
|
151
|
+
Category of complete discrete valuation fields and
|
|
152
|
+
Category of commutative algebras over (finite enumerated fields and
|
|
153
|
+
subquotients of monoids and quotients of semigroups) and
|
|
154
|
+
Category of infinite sets
|
|
155
|
+
sage: TestSuite(F).run()
|
|
156
|
+
|
|
157
|
+
TESTS:
|
|
158
|
+
|
|
159
|
+
Check if changing global series precision does it right (and
|
|
160
|
+
that :issue:`17955` is fixed)::
|
|
161
|
+
|
|
162
|
+
sage: set_series_precision(3)
|
|
163
|
+
sage: R.<x> = LaurentSeriesRing(ZZ)
|
|
164
|
+
sage: 1/(1 - 2*x)
|
|
165
|
+
1 + 2*x + 4*x^2 + O(x^3)
|
|
166
|
+
sage: set_series_precision(5)
|
|
167
|
+
sage: R.<x> = LaurentSeriesRing(ZZ)
|
|
168
|
+
sage: 1/(1 - 2*x)
|
|
169
|
+
1 + 2*x + 4*x^2 + 8*x^3 + 16*x^4 + O(x^5)
|
|
170
|
+
sage: set_series_precision(20)
|
|
171
|
+
|
|
172
|
+
Check categories (:issue:`24420`)::
|
|
173
|
+
|
|
174
|
+
sage: LaurentSeriesRing(ZZ, 'x').category()
|
|
175
|
+
Category of infinite commutative no zero divisors algebras
|
|
176
|
+
over (Dedekind domains and euclidean domains
|
|
177
|
+
and noetherian rings and infinite enumerated sets and metric spaces)
|
|
178
|
+
sage: LaurentSeriesRing(QQ, 'x').category()
|
|
179
|
+
Join of Category of complete discrete valuation fields and Category of commutative algebras
|
|
180
|
+
over (number fields and quotient fields and metric spaces) and Category of infinite sets
|
|
181
|
+
sage: LaurentSeriesRing(Zmod(4), 'x').category()
|
|
182
|
+
Category of infinite commutative algebras
|
|
183
|
+
over (finite commutative rings and subquotients of monoids and quotients of semigroups and finite enumerated sets)
|
|
184
|
+
|
|
185
|
+
Check coercions (:issue:`24431`)::
|
|
186
|
+
|
|
187
|
+
sage: pts = [LaurentSeriesRing,
|
|
188
|
+
....: PolynomialRing,
|
|
189
|
+
....: PowerSeriesRing,
|
|
190
|
+
....: LaurentPolynomialRing]
|
|
191
|
+
sage: LS = LaurentSeriesRing(QQ, 'x')
|
|
192
|
+
sage: LSx = LS.gen()
|
|
193
|
+
|
|
194
|
+
sage: for P in pts:
|
|
195
|
+
....: x = P(QQ, 'x').gen()
|
|
196
|
+
....: assert parent(LSx * x) is LS, "wrong parent for {}".format(P)
|
|
197
|
+
|
|
198
|
+
sage: for P in pts:
|
|
199
|
+
....: y = P(QQ, 'y').gen()
|
|
200
|
+
....: try:
|
|
201
|
+
....: LSx * y
|
|
202
|
+
....: except TypeError:
|
|
203
|
+
....: pass
|
|
204
|
+
....: else:
|
|
205
|
+
....: print("wrong coercion {}".format(P))
|
|
206
|
+
"""
|
|
207
|
+
Element = LaurentSeries
|
|
208
|
+
|
|
209
|
+
@staticmethod
|
|
210
|
+
def __classcall__(cls, *args, **kwds):
|
|
211
|
+
r"""
|
|
212
|
+
TESTS::
|
|
213
|
+
|
|
214
|
+
sage: L = LaurentSeriesRing(QQ, 'q')
|
|
215
|
+
sage: L is LaurentSeriesRing(QQ, name='q')
|
|
216
|
+
True
|
|
217
|
+
sage: loads(dumps(L)) is L
|
|
218
|
+
True
|
|
219
|
+
|
|
220
|
+
sage: L.variable_names()
|
|
221
|
+
('q',)
|
|
222
|
+
sage: L.variable_name()
|
|
223
|
+
'q'
|
|
224
|
+
"""
|
|
225
|
+
from .power_series_ring import PowerSeriesRing
|
|
226
|
+
|
|
227
|
+
if not kwds and len(args) == 1 and isinstance(args[0], (PowerSeriesRing_generic, LazyPowerSeriesRing)):
|
|
228
|
+
power_series = args[0]
|
|
229
|
+
else:
|
|
230
|
+
power_series = PowerSeriesRing(*args, **kwds)
|
|
231
|
+
|
|
232
|
+
return UniqueRepresentation.__classcall__(cls, power_series)
|
|
233
|
+
|
|
234
|
+
def __init__(self, power_series):
|
|
235
|
+
"""
|
|
236
|
+
Initialization.
|
|
237
|
+
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: K.<q> = LaurentSeriesRing(QQ, default_prec=4); K
|
|
241
|
+
Laurent Series Ring in q over Rational Field
|
|
242
|
+
sage: 1 / (q-q^2)
|
|
243
|
+
q^-1 + 1 + q + q^2 + O(q^3)
|
|
244
|
+
|
|
245
|
+
sage: RZZ = LaurentSeriesRing(ZZ, 't')
|
|
246
|
+
sage: RZZ.category()
|
|
247
|
+
Category of infinite commutative no zero divisors algebras
|
|
248
|
+
over (Dedekind domains and euclidean domains
|
|
249
|
+
and noetherian rings and infinite enumerated sets
|
|
250
|
+
and metric spaces)
|
|
251
|
+
sage: TestSuite(RZZ).run()
|
|
252
|
+
|
|
253
|
+
sage: R1 = LaurentSeriesRing(Zmod(1), 't')
|
|
254
|
+
sage: R1.category()
|
|
255
|
+
Category of finite commutative algebras
|
|
256
|
+
over (finite commutative rings and subquotients of monoids and quotients of semigroups and finite enumerated sets)
|
|
257
|
+
sage: TestSuite(R1).run()
|
|
258
|
+
|
|
259
|
+
sage: R2 = LaurentSeriesRing(Zmod(2), 't')
|
|
260
|
+
sage: R2.category()
|
|
261
|
+
Join of Category of complete discrete valuation fields
|
|
262
|
+
and Category of commutative algebras over (finite enumerated fields and subquotients of monoids and quotients of semigroups)
|
|
263
|
+
and Category of infinite sets
|
|
264
|
+
sage: TestSuite(R2).run()
|
|
265
|
+
|
|
266
|
+
sage: R4 = LaurentSeriesRing(Zmod(4), 't')
|
|
267
|
+
sage: R4.category()
|
|
268
|
+
Category of infinite commutative algebras
|
|
269
|
+
over (finite commutative rings and subquotients of monoids and quotients of semigroups and finite enumerated sets)
|
|
270
|
+
sage: TestSuite(R4).run()
|
|
271
|
+
|
|
272
|
+
sage: RQQ = LaurentSeriesRing(QQ, 't')
|
|
273
|
+
sage: RQQ.category()
|
|
274
|
+
Join of Category of complete discrete valuation fields
|
|
275
|
+
and Category of commutative algebras over (number fields and quotient fields and metric spaces)
|
|
276
|
+
and Category of infinite sets
|
|
277
|
+
sage: TestSuite(RQQ).run()
|
|
278
|
+
"""
|
|
279
|
+
base_ring = power_series.base_ring()
|
|
280
|
+
category = Algebras(base_ring.category())
|
|
281
|
+
if base_ring in Fields():
|
|
282
|
+
category &= CompleteDiscreteValuationFields()
|
|
283
|
+
elif base_ring in IntegralDomains():
|
|
284
|
+
category &= IntegralDomains()
|
|
285
|
+
elif base_ring in Rings().Commutative():
|
|
286
|
+
category = category.Commutative()
|
|
287
|
+
|
|
288
|
+
if base_ring.is_zero():
|
|
289
|
+
category = category.Finite()
|
|
290
|
+
else:
|
|
291
|
+
category = category.Infinite()
|
|
292
|
+
|
|
293
|
+
self._power_series_ring = power_series
|
|
294
|
+
self._one_element = self.element_class(self, power_series.one())
|
|
295
|
+
Parent.__init__(self, base_ring,
|
|
296
|
+
names=power_series.variable_names(),
|
|
297
|
+
category=category)
|
|
298
|
+
|
|
299
|
+
def base_extend(self, R):
|
|
300
|
+
"""
|
|
301
|
+
Return the Laurent series ring over R in the same variable as
|
|
302
|
+
``self``, assuming there is a canonical coerce map from the base ring
|
|
303
|
+
of ``self`` to R.
|
|
304
|
+
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: K.<x> = LaurentSeriesRing(QQ, default_prec=4)
|
|
308
|
+
sage: K.base_extend(QQ['t'])
|
|
309
|
+
Laurent Series Ring in x over Univariate Polynomial Ring in t over Rational Field
|
|
310
|
+
"""
|
|
311
|
+
if R.has_coerce_map_from(self.base_ring()):
|
|
312
|
+
return self.change_ring(R)
|
|
313
|
+
else:
|
|
314
|
+
raise TypeError("no valid base extension defined")
|
|
315
|
+
|
|
316
|
+
def fraction_field(self):
|
|
317
|
+
r"""
|
|
318
|
+
Return the fraction field of this ring of Laurent series.
|
|
319
|
+
|
|
320
|
+
If the base ring is a field, then Laurent series are already a field.
|
|
321
|
+
If the base ring is a domain, then the Laurent series over its fraction
|
|
322
|
+
field is returned. Otherwise, raise a :exc:`ValueError`.
|
|
323
|
+
|
|
324
|
+
EXAMPLES::
|
|
325
|
+
|
|
326
|
+
sage: R = LaurentSeriesRing(ZZ, 't', 30).fraction_field()
|
|
327
|
+
sage: R
|
|
328
|
+
Laurent Series Ring in t over Rational Field
|
|
329
|
+
sage: R.default_prec()
|
|
330
|
+
30
|
|
331
|
+
|
|
332
|
+
sage: LaurentSeriesRing(Zmod(4), 't').fraction_field()
|
|
333
|
+
Traceback (most recent call last):
|
|
334
|
+
...
|
|
335
|
+
ValueError: must be an integral domain
|
|
336
|
+
"""
|
|
337
|
+
from sage.categories.fields import Fields
|
|
338
|
+
from sage.categories.integral_domains import IntegralDomains
|
|
339
|
+
if self in Fields():
|
|
340
|
+
return self
|
|
341
|
+
elif self in IntegralDomains():
|
|
342
|
+
return LaurentSeriesRing(self.base_ring().fraction_field(),
|
|
343
|
+
self.variable_names(),
|
|
344
|
+
self.default_prec())
|
|
345
|
+
else:
|
|
346
|
+
raise ValueError('must be an integral domain')
|
|
347
|
+
|
|
348
|
+
def change_ring(self, R):
|
|
349
|
+
"""
|
|
350
|
+
EXAMPLES::
|
|
351
|
+
|
|
352
|
+
sage: K.<x> = LaurentSeriesRing(QQ, default_prec=4)
|
|
353
|
+
sage: R = K.change_ring(ZZ); R
|
|
354
|
+
Laurent Series Ring in x over Integer Ring
|
|
355
|
+
sage: R.default_prec()
|
|
356
|
+
4
|
|
357
|
+
"""
|
|
358
|
+
return LaurentSeriesRing(R, self.variable_names(),
|
|
359
|
+
default_prec=self.default_prec(),
|
|
360
|
+
sparse=self.is_sparse())
|
|
361
|
+
|
|
362
|
+
def is_sparse(self):
|
|
363
|
+
"""
|
|
364
|
+
Return if ``self`` is a sparse implementation.
|
|
365
|
+
|
|
366
|
+
EXAMPLES::
|
|
367
|
+
|
|
368
|
+
sage: K.<x> = LaurentSeriesRing(QQ, sparse=True)
|
|
369
|
+
sage: K.is_sparse()
|
|
370
|
+
True
|
|
371
|
+
"""
|
|
372
|
+
return self.power_series_ring().is_sparse()
|
|
373
|
+
|
|
374
|
+
def is_field(self, proof=True):
|
|
375
|
+
"""
|
|
376
|
+
A Laurent series ring is a field if and only if the base ring
|
|
377
|
+
is a field.
|
|
378
|
+
|
|
379
|
+
TESTS::
|
|
380
|
+
|
|
381
|
+
sage: LaurentSeriesRing(QQ,'t').is_field()
|
|
382
|
+
True
|
|
383
|
+
sage: LaurentSeriesRing(ZZ,'t').is_field()
|
|
384
|
+
False
|
|
385
|
+
"""
|
|
386
|
+
return self.base_ring().is_field()
|
|
387
|
+
|
|
388
|
+
def is_dense(self):
|
|
389
|
+
"""
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: K.<x> = LaurentSeriesRing(QQ, sparse=True)
|
|
393
|
+
sage: K.is_dense()
|
|
394
|
+
False
|
|
395
|
+
"""
|
|
396
|
+
return self.power_series_ring().is_dense()
|
|
397
|
+
|
|
398
|
+
def _repr_(self):
|
|
399
|
+
"""
|
|
400
|
+
EXAMPLES::
|
|
401
|
+
|
|
402
|
+
sage: LaurentSeriesRing(QQ, 'q') # indirect doctest
|
|
403
|
+
Laurent Series Ring in q over Rational Field
|
|
404
|
+
sage: LaurentSeriesRing(ZZ, 't', sparse=True)
|
|
405
|
+
Sparse Laurent Series Ring in t over Integer Ring
|
|
406
|
+
"""
|
|
407
|
+
s = "Laurent Series Ring in %s over %s" % (self.variable_name(), self.base_ring())
|
|
408
|
+
if self.is_sparse():
|
|
409
|
+
s = 'Sparse ' + s
|
|
410
|
+
return s
|
|
411
|
+
|
|
412
|
+
def _magma_init_(self, magma):
|
|
413
|
+
"""
|
|
414
|
+
Used in converting this ring to the corresponding ring in MAGMA.
|
|
415
|
+
|
|
416
|
+
EXAMPLES::
|
|
417
|
+
|
|
418
|
+
sage: # optional - magma
|
|
419
|
+
sage: R = LaurentSeriesRing(QQ, 'y')
|
|
420
|
+
sage: R._magma_init_(magma)
|
|
421
|
+
'SageCreateWithNames(LaurentSeriesRing(_sage_ref...),["y"])'
|
|
422
|
+
sage: S = magma(R)
|
|
423
|
+
sage: S
|
|
424
|
+
Laurent series field in y over Rational Field
|
|
425
|
+
sage: S.1
|
|
426
|
+
y
|
|
427
|
+
sage: S.sage() == R
|
|
428
|
+
True
|
|
429
|
+
|
|
430
|
+
sage: # optional - magma
|
|
431
|
+
sage: magma(LaurentSeriesRing(GF(7), 'x')) # needs sage.rings.finite_rings
|
|
432
|
+
Laurent series field in x over GF(7)
|
|
433
|
+
"""
|
|
434
|
+
B = magma(self.base_ring())
|
|
435
|
+
Bref = B._ref()
|
|
436
|
+
s = 'LaurentSeriesRing(%s)' % (Bref)
|
|
437
|
+
return magma._with_names(s, self.variable_names())
|
|
438
|
+
|
|
439
|
+
def _element_constructor_(self, x, n=0, prec=infinity):
|
|
440
|
+
r"""
|
|
441
|
+
Construct a Laurent series from `x`.
|
|
442
|
+
|
|
443
|
+
INPUT:
|
|
444
|
+
|
|
445
|
+
- ``x`` -- object that can be converted into a Laurent series
|
|
446
|
+
|
|
447
|
+
- ``n`` -- (default: 0) multiply the result by `t^n`
|
|
448
|
+
|
|
449
|
+
- ``prec`` -- (default: ``infinity``) the precision of the series
|
|
450
|
+
as an integer
|
|
451
|
+
|
|
452
|
+
EXAMPLES::
|
|
453
|
+
|
|
454
|
+
sage: # needs sage.rings.padics
|
|
455
|
+
sage: R.<u> = LaurentSeriesRing(Qp(5, 10))
|
|
456
|
+
sage: S.<t> = LaurentSeriesRing(RationalField())
|
|
457
|
+
sage: R(t + t^2 + O(t^3))
|
|
458
|
+
(1 + O(5^10))*u + (1 + O(5^10))*u^2 + O(u^3)
|
|
459
|
+
sage: R(t + t^2 + O(t^3), prec=2)
|
|
460
|
+
(1 + O(5^10))*u + O(u^2)
|
|
461
|
+
|
|
462
|
+
Coercing an element into its own parent produces that element
|
|
463
|
+
again, unless a different ``n`` or ``prec`` is given::
|
|
464
|
+
|
|
465
|
+
sage: u is R(u) # needs sage.rings.padics
|
|
466
|
+
True
|
|
467
|
+
sage: R(u, n=3, prec=7) # needs sage.rings.padics
|
|
468
|
+
(1 + O(5^10))*u^4 + O(u^7)
|
|
469
|
+
|
|
470
|
+
Rational functions are accepted::
|
|
471
|
+
|
|
472
|
+
sage: # needs sage.rings.number_field sage.symbolic
|
|
473
|
+
sage: I = sqrt(-1)
|
|
474
|
+
sage: K.<I> = QQ[I]
|
|
475
|
+
sage: P.<t> = PolynomialRing(K)
|
|
476
|
+
sage: L.<u> = LaurentSeriesRing(QQ[I])
|
|
477
|
+
sage: L((t*I)/(t^3+I*2*t))
|
|
478
|
+
1/2 + 1/4*I*u^2 - 1/8*u^4 - 1/16*I*u^6 + 1/32*u^8 +
|
|
479
|
+
1/64*I*u^10 - 1/128*u^12 - 1/256*I*u^14 + 1/512*u^16 +
|
|
480
|
+
1/1024*I*u^18 + O(u^20)
|
|
481
|
+
|
|
482
|
+
::
|
|
483
|
+
|
|
484
|
+
sage: L(t*I) / L(t^3+I*2*t) # needs sage.rings.number_field sage.symbolic
|
|
485
|
+
1/2 + 1/4*I*u^2 - 1/8*u^4 - 1/16*I*u^6 + 1/32*u^8 +
|
|
486
|
+
1/64*I*u^10 - 1/128*u^12 - 1/256*I*u^14 + 1/512*u^16 +
|
|
487
|
+
1/1024*I*u^18 + O(u^20)
|
|
488
|
+
|
|
489
|
+
Lazy series::
|
|
490
|
+
|
|
491
|
+
sage: # needs sage.combinat
|
|
492
|
+
sage: L.<z> = LazyLaurentSeriesRing(ZZ)
|
|
493
|
+
sage: R = LaurentSeriesRing(QQ, names='z')
|
|
494
|
+
sage: R(z^-5 + 1/(1-z))
|
|
495
|
+
z^-5 + 1 + z + z^2 + z^3 + z^4 + z^5 + z^6 + z^7 + z^8 + z^9 + z^10
|
|
496
|
+
+ z^11 + z^12 + z^13 + z^14 + z^15 + z^16 + z^17 + z^18 + z^19 + O(z^20)
|
|
497
|
+
sage: L.<z> = LazyPowerSeriesRing(QQ)
|
|
498
|
+
sage: R(5 + z - 5*z^7)
|
|
499
|
+
5 + z - 5*z^7
|
|
500
|
+
|
|
501
|
+
TESTS:
|
|
502
|
+
|
|
503
|
+
Check that :issue:`28993` is fixed::
|
|
504
|
+
|
|
505
|
+
sage: from sage.modular.etaproducts import qexp_eta # needs sage.modular
|
|
506
|
+
sage: S.<t> = LaurentSeriesRing(RationalField())
|
|
507
|
+
sage: qexp_eta(S, prec=30) # needs sage.modular
|
|
508
|
+
1 - t - t^2 + t^5 + t^7 - t^12 - t^15 + t^22 + t^26 + O(t^30)
|
|
509
|
+
|
|
510
|
+
When converting from `R((z))` to `R((z))((w))`, the variable
|
|
511
|
+
`z` is sent to `z` rather than to `w` (see :issue:`7085`)::
|
|
512
|
+
|
|
513
|
+
sage: A.<z> = LaurentSeriesRing(QQ)
|
|
514
|
+
sage: B.<w> = LaurentSeriesRing(A)
|
|
515
|
+
sage: B(z)
|
|
516
|
+
z
|
|
517
|
+
sage: z/w
|
|
518
|
+
z*w^-1
|
|
519
|
+
|
|
520
|
+
Various conversions from PARI (see also :issue:`2508`)::
|
|
521
|
+
|
|
522
|
+
sage: # needs sage.libs.pari
|
|
523
|
+
sage: L.<q> = LaurentSeriesRing(QQ, default_prec=10)
|
|
524
|
+
sage: L(pari('1/x'))
|
|
525
|
+
q^-1
|
|
526
|
+
sage: L(pari('polchebyshev(5)'))
|
|
527
|
+
5*q - 20*q^3 + 16*q^5
|
|
528
|
+
sage: L(pari('polchebyshev(5) - 1/x^4'))
|
|
529
|
+
-q^-4 + 5*q - 20*q^3 + 16*q^5
|
|
530
|
+
sage: L(pari('1/polchebyshev(5)'))
|
|
531
|
+
1/5*q^-1 + 4/5*q + 64/25*q^3 + 192/25*q^5 + 2816/125*q^7 + O(q^9)
|
|
532
|
+
sage: L(pari('polchebyshev(5) + O(x^40)'))
|
|
533
|
+
5*q - 20*q^3 + 16*q^5 + O(q^40)
|
|
534
|
+
sage: L(pari('polchebyshev(5) - 1/x^4 + O(x^40)'))
|
|
535
|
+
-q^-4 + 5*q - 20*q^3 + 16*q^5 + O(q^40)
|
|
536
|
+
sage: L(pari('1/polchebyshev(5) + O(x^10)'))
|
|
537
|
+
1/5*q^-1 + 4/5*q + 64/25*q^3 + 192/25*q^5 + 2816/125*q^7 + 8192/125*q^9 + O(q^10)
|
|
538
|
+
sage: L(pari('1/polchebyshev(5) + O(x^10)'), -10) # Multiply by q^-10
|
|
539
|
+
1/5*q^-11 + 4/5*q^-9 + 64/25*q^-7 + 192/25*q^-5 + 2816/125*q^-3 + 8192/125*q^-1 + O(1)
|
|
540
|
+
sage: L(pari('O(x^-10)'))
|
|
541
|
+
O(q^-10)
|
|
542
|
+
|
|
543
|
+
Check that :issue:`30073` is fixed::
|
|
544
|
+
|
|
545
|
+
sage: P.<x> = LaurentSeriesRing(QQ)
|
|
546
|
+
sage: P({-3: 1})
|
|
547
|
+
x^-3
|
|
548
|
+
"""
|
|
549
|
+
from sage.rings.fraction_field_element import FractionFieldElement
|
|
550
|
+
from sage.rings.polynomial.multi_polynomial import MPolynomial
|
|
551
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
552
|
+
from sage.structure.element import parent
|
|
553
|
+
|
|
554
|
+
P = parent(x)
|
|
555
|
+
if isinstance(x, self.element_class) and n == 0 and P is self:
|
|
556
|
+
return x.add_bigoh(prec) # ok, since Laurent series are immutable (no need to make a copy)
|
|
557
|
+
elif P is self.base_ring():
|
|
558
|
+
# Convert x into a power series; if P is itself a Laurent
|
|
559
|
+
# series ring A((t)), this prevents the implementation of
|
|
560
|
+
# LaurentSeries.__init__() from effectively applying the
|
|
561
|
+
# ring homomorphism A((t)) -> A((t))((u)) sending t to u
|
|
562
|
+
# instead of the one sending t to t. We cannot easily
|
|
563
|
+
# tell LaurentSeries.__init__() to be more strict, because
|
|
564
|
+
# A((t)) -> B((u)) is expected to send t to u if A admits
|
|
565
|
+
# a coercion to B but A((t)) does not, and this condition
|
|
566
|
+
# would be inefficient to check there.
|
|
567
|
+
x = self.power_series_ring()(x)
|
|
568
|
+
elif isinstance(x, pari_gen):
|
|
569
|
+
t = x.type()
|
|
570
|
+
if t == "t_RFRAC": # Rational function
|
|
571
|
+
x = self(self.polynomial_ring()(x.numerator())) / \
|
|
572
|
+
self(self.polynomial_ring()(x.denominator()))
|
|
573
|
+
return (x << n).add_bigoh(prec)
|
|
574
|
+
elif t == "t_SER": # Laurent series
|
|
575
|
+
n += x._valp()
|
|
576
|
+
bigoh = n + x.length()
|
|
577
|
+
x = self(self.polynomial_ring()(x.Vec()))
|
|
578
|
+
return (x << n).add_bigoh(bigoh)
|
|
579
|
+
else: # General case, pretend to be a polynomial
|
|
580
|
+
return (self(self.polynomial_ring()(x)) << n).add_bigoh(prec)
|
|
581
|
+
elif (isinstance(x, FractionFieldElement)
|
|
582
|
+
and (x.base_ring() is self.base_ring() or x.base_ring() == self.base_ring())
|
|
583
|
+
and isinstance(x.numerator(), (Polynomial, MPolynomial))):
|
|
584
|
+
x = self(x.numerator()) / self(x.denominator())
|
|
585
|
+
return (x << n).add_bigoh(prec)
|
|
586
|
+
elif isinstance(x, (LazyPowerSeries, LazyLaurentSeries)):
|
|
587
|
+
if prec is infinity:
|
|
588
|
+
try:
|
|
589
|
+
x = self.power_series_ring()(x.polynomial())
|
|
590
|
+
except ValueError:
|
|
591
|
+
x = x.add_bigoh(self.default_prec())
|
|
592
|
+
else:
|
|
593
|
+
x = x.add_bigoh(prec)
|
|
594
|
+
return self.element_class(self, x, n).add_bigoh(prec)
|
|
595
|
+
|
|
596
|
+
def random_element(self, algorithm='default'):
|
|
597
|
+
r"""
|
|
598
|
+
Return a random element of this Laurent series ring.
|
|
599
|
+
|
|
600
|
+
The optional ``algorithm`` parameter decides how elements are generated.
|
|
601
|
+
Algorithms currently implemented:
|
|
602
|
+
|
|
603
|
+
- ``'default'``: Choose an integer ``shift`` using the standard
|
|
604
|
+
distribution on the integers. Then choose a list of coefficients
|
|
605
|
+
using the ``random_element`` function of the base ring, and construct
|
|
606
|
+
a new element based on those coefficients, so that the i-th
|
|
607
|
+
coefficient corresponds to the (i+shift)-th power of the uniformizer.
|
|
608
|
+
The amount of coefficients is determined by the ``default_prec``
|
|
609
|
+
of the ring. Note that this method only creates non-exact elements.
|
|
610
|
+
|
|
611
|
+
EXAMPLES::
|
|
612
|
+
|
|
613
|
+
sage: S.<s> = LaurentSeriesRing(GF(3))
|
|
614
|
+
sage: S.random_element() # random
|
|
615
|
+
s^-8 + s^-7 + s^-6 + s^-5 + s^-1 + s + s^3 + s^4
|
|
616
|
+
+ s^5 + 2*s^6 + s^7 + s^11 + O(s^12)
|
|
617
|
+
"""
|
|
618
|
+
if algorithm == 'default':
|
|
619
|
+
shift = ZZ.random_element()
|
|
620
|
+
return self([self.base_ring().random_element()
|
|
621
|
+
for k in range(self.default_prec())],
|
|
622
|
+
shift).O(shift + self.default_prec())
|
|
623
|
+
else:
|
|
624
|
+
raise ValueError("algorithm cannot be %s" % algorithm)
|
|
625
|
+
|
|
626
|
+
def construction(self):
|
|
627
|
+
r"""
|
|
628
|
+
Return the functorial construction of this Laurent power series ring.
|
|
629
|
+
|
|
630
|
+
The construction is given as the completion of the Laurent polynomials.
|
|
631
|
+
|
|
632
|
+
EXAMPLES::
|
|
633
|
+
|
|
634
|
+
sage: L.<t> = LaurentSeriesRing(ZZ, default_prec=42)
|
|
635
|
+
sage: phi, arg = L.construction()
|
|
636
|
+
sage: phi
|
|
637
|
+
Completion[t, prec=42]
|
|
638
|
+
sage: arg
|
|
639
|
+
Univariate Laurent Polynomial Ring in t over Integer Ring
|
|
640
|
+
sage: phi(arg) is L
|
|
641
|
+
True
|
|
642
|
+
|
|
643
|
+
Because of this construction, pushout is automatically available::
|
|
644
|
+
|
|
645
|
+
sage: 1/2 * t
|
|
646
|
+
1/2*t
|
|
647
|
+
sage: parent(1/2 * t)
|
|
648
|
+
Laurent Series Ring in t over Rational Field
|
|
649
|
+
|
|
650
|
+
sage: QQbar.gen() * t # needs sage.rings.number_field
|
|
651
|
+
I*t
|
|
652
|
+
sage: parent(QQbar.gen() * t) # needs sage.rings.number_field
|
|
653
|
+
Laurent Series Ring in t over Algebraic Field
|
|
654
|
+
"""
|
|
655
|
+
from sage.categories.pushout import CompletionFunctor
|
|
656
|
+
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
|
|
657
|
+
L = LaurentPolynomialRing(self.base_ring(), self._names[0])
|
|
658
|
+
return CompletionFunctor(self._names[0], self.default_prec()), L
|
|
659
|
+
|
|
660
|
+
def _coerce_map_from_(self, P):
|
|
661
|
+
"""
|
|
662
|
+
Return a coercion map from `P` to ``self``, or True, or None.
|
|
663
|
+
|
|
664
|
+
The following rings admit a coercion map to the Laurent series
|
|
665
|
+
ring `A((t))`:
|
|
666
|
+
|
|
667
|
+
- any ring that admits a coercion map to `A` (including `A`
|
|
668
|
+
itself);
|
|
669
|
+
|
|
670
|
+
- any Laurent series ring, power series ring or polynomial
|
|
671
|
+
ring in the variable `t` over a ring admitting a coercion
|
|
672
|
+
map to `A`.
|
|
673
|
+
|
|
674
|
+
EXAMPLES::
|
|
675
|
+
|
|
676
|
+
sage: S.<t> = LaurentSeriesRing(ZZ)
|
|
677
|
+
sage: S.has_coerce_map_from(ZZ)
|
|
678
|
+
True
|
|
679
|
+
sage: S.has_coerce_map_from(PolynomialRing(ZZ, 't'))
|
|
680
|
+
True
|
|
681
|
+
sage: S.has_coerce_map_from(Frac(PolynomialRing(ZZ, 't')))
|
|
682
|
+
False
|
|
683
|
+
sage: S.has_coerce_map_from(LaurentPolynomialRing(ZZ, 't'))
|
|
684
|
+
True
|
|
685
|
+
sage: S.has_coerce_map_from(PowerSeriesRing(ZZ, 't'))
|
|
686
|
+
True
|
|
687
|
+
sage: S.has_coerce_map_from(S)
|
|
688
|
+
True
|
|
689
|
+
sage: S.has_coerce_map_from(LazyLaurentSeriesRing(ZZ, 't')) # needs sage.combinat
|
|
690
|
+
True
|
|
691
|
+
sage: S.has_coerce_map_from(LazyPowerSeriesRing(ZZ, 't')) # needs sage.combinat
|
|
692
|
+
True
|
|
693
|
+
|
|
694
|
+
sage: S.has_coerce_map_from(QQ)
|
|
695
|
+
False
|
|
696
|
+
sage: S.has_coerce_map_from(PolynomialRing(QQ, 't'))
|
|
697
|
+
False
|
|
698
|
+
sage: S.has_coerce_map_from(LaurentPolynomialRing(QQ, 't'))
|
|
699
|
+
False
|
|
700
|
+
sage: S.has_coerce_map_from(PowerSeriesRing(QQ, 't'))
|
|
701
|
+
False
|
|
702
|
+
sage: S.has_coerce_map_from(LaurentSeriesRing(QQ, 't'))
|
|
703
|
+
False
|
|
704
|
+
|
|
705
|
+
sage: T.<t> = LaurentSeriesRing(QQ)
|
|
706
|
+
sage: T.has_coerce_map_from(QQ['t'])
|
|
707
|
+
True
|
|
708
|
+
sage: T.has_coerce_map_from(Frac(QQ['t']))
|
|
709
|
+
True
|
|
710
|
+
|
|
711
|
+
sage: R.<t> = LaurentSeriesRing(QQ['x'])
|
|
712
|
+
sage: R.has_coerce_map_from(QQ[['t']])
|
|
713
|
+
True
|
|
714
|
+
sage: R.has_coerce_map_from(QQ['t'])
|
|
715
|
+
True
|
|
716
|
+
sage: R.has_coerce_map_from(ZZ['x']['t'])
|
|
717
|
+
True
|
|
718
|
+
sage: R.has_coerce_map_from(ZZ['t']['x'])
|
|
719
|
+
False
|
|
720
|
+
sage: R.has_coerce_map_from(ZZ['x'])
|
|
721
|
+
True
|
|
722
|
+
sage: R.has_coerce_map_from(LazyLaurentSeriesRing(ZZ, 't')) # needs sage.combinat
|
|
723
|
+
True
|
|
724
|
+
sage: R.has_coerce_map_from(LazyLaurentSeriesRing(ZZ['x'], 't')) # needs sage.combinat
|
|
725
|
+
True
|
|
726
|
+
"""
|
|
727
|
+
from sage.rings.fraction_field import FractionField_generic
|
|
728
|
+
A = self.base_ring()
|
|
729
|
+
if isinstance(P, FractionField_generic) and A.is_field():
|
|
730
|
+
return self.has_coerce_map_from(P.base())
|
|
731
|
+
if (isinstance(P, (LaurentSeriesRing, LazyLaurentSeriesRing,
|
|
732
|
+
LaurentPolynomialRing_generic,
|
|
733
|
+
PowerSeriesRing_generic, LazyPowerSeriesRing,
|
|
734
|
+
PolynomialRing_generic))
|
|
735
|
+
and P.variable_name() == self.variable_name()
|
|
736
|
+
and A.has_coerce_map_from(P.base_ring())):
|
|
737
|
+
return True
|
|
738
|
+
|
|
739
|
+
def _is_valid_homomorphism_(self, codomain, im_gens, base_map=None):
|
|
740
|
+
"""
|
|
741
|
+
EXAMPLES::
|
|
742
|
+
|
|
743
|
+
sage: # needs sage.rings.finite_rings
|
|
744
|
+
sage: R.<x> = LaurentSeriesRing(GF(17))
|
|
745
|
+
sage: S.<y> = LaurentSeriesRing(GF(19))
|
|
746
|
+
sage: R.hom([y], S) # indirect doctest
|
|
747
|
+
Traceback (most recent call last):
|
|
748
|
+
...
|
|
749
|
+
ValueError: relations do not all (canonically) map to 0
|
|
750
|
+
under map determined by images of generators
|
|
751
|
+
sage: f = R.hom(x + x^3, R)
|
|
752
|
+
sage: f(x^2)
|
|
753
|
+
x^2 + 2*x^4 + x^6
|
|
754
|
+
|
|
755
|
+
The image of the generator needs to be a unit::
|
|
756
|
+
|
|
757
|
+
sage: R.<x> = LaurentSeriesRing(ZZ)
|
|
758
|
+
sage: R._is_valid_homomorphism_(R, [2*x])
|
|
759
|
+
False
|
|
760
|
+
"""
|
|
761
|
+
# NOTE: There are no ring homomorphisms from the ring of
|
|
762
|
+
# all formal power series to most rings, e.g, the `p`-adic
|
|
763
|
+
# field, since you can always (mathematically!) construct
|
|
764
|
+
# some power series that does not converge.
|
|
765
|
+
# NOTE: The above claim is wrong when the base ring is Z.
|
|
766
|
+
# See trac 28486.
|
|
767
|
+
|
|
768
|
+
if base_map is None and not codomain.has_coerce_map_from(self.base_ring()):
|
|
769
|
+
return False
|
|
770
|
+
# Note that 0 is not a *ring* homomorphism, and you cannot map to a power series ring
|
|
771
|
+
if isinstance(codomain, (LaurentSeriesRing, LazyLaurentSeriesRing)):
|
|
772
|
+
return im_gens[0].valuation() > 0 and im_gens[0].is_unit()
|
|
773
|
+
return False
|
|
774
|
+
|
|
775
|
+
def characteristic(self):
|
|
776
|
+
"""
|
|
777
|
+
EXAMPLES::
|
|
778
|
+
|
|
779
|
+
sage: R.<x> = LaurentSeriesRing(GF(17))
|
|
780
|
+
sage: R.characteristic()
|
|
781
|
+
17
|
|
782
|
+
"""
|
|
783
|
+
return self.base_ring().characteristic()
|
|
784
|
+
|
|
785
|
+
def residue_field(self):
|
|
786
|
+
"""
|
|
787
|
+
Return the residue field of this Laurent series field
|
|
788
|
+
if it is a complete discrete valuation field (i.e. if
|
|
789
|
+
the base ring is a field, in which base it is also the
|
|
790
|
+
residue field).
|
|
791
|
+
|
|
792
|
+
EXAMPLES::
|
|
793
|
+
|
|
794
|
+
sage: R.<x> = LaurentSeriesRing(GF(17))
|
|
795
|
+
sage: R.residue_field()
|
|
796
|
+
Finite Field of size 17
|
|
797
|
+
|
|
798
|
+
sage: R.<x> = LaurentSeriesRing(ZZ)
|
|
799
|
+
sage: R.residue_field()
|
|
800
|
+
Traceback (most recent call last):
|
|
801
|
+
...
|
|
802
|
+
TypeError: the base ring is not a field
|
|
803
|
+
"""
|
|
804
|
+
if not self.base_ring().is_field():
|
|
805
|
+
raise TypeError("the base ring is not a field")
|
|
806
|
+
return self.base_ring()
|
|
807
|
+
|
|
808
|
+
def default_prec(self):
|
|
809
|
+
"""
|
|
810
|
+
Get the precision to which exact elements are truncated when
|
|
811
|
+
necessary (most frequently when inverting).
|
|
812
|
+
|
|
813
|
+
EXAMPLES::
|
|
814
|
+
|
|
815
|
+
sage: R.<x> = LaurentSeriesRing(QQ, default_prec=5)
|
|
816
|
+
sage: R.default_prec()
|
|
817
|
+
5
|
|
818
|
+
"""
|
|
819
|
+
return self._power_series_ring.default_prec()
|
|
820
|
+
|
|
821
|
+
def is_exact(self):
|
|
822
|
+
"""
|
|
823
|
+
Laurent series rings are inexact.
|
|
824
|
+
|
|
825
|
+
EXAMPLES::
|
|
826
|
+
|
|
827
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
828
|
+
sage: R.is_exact()
|
|
829
|
+
False
|
|
830
|
+
"""
|
|
831
|
+
return False
|
|
832
|
+
|
|
833
|
+
@cached_method
|
|
834
|
+
def gen(self, n=0):
|
|
835
|
+
"""
|
|
836
|
+
EXAMPLES::
|
|
837
|
+
|
|
838
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
839
|
+
sage: R.gen()
|
|
840
|
+
x
|
|
841
|
+
"""
|
|
842
|
+
if n != 0:
|
|
843
|
+
raise IndexError("generator {} not defined".format(n))
|
|
844
|
+
return self.element_class(self, [0, 1])
|
|
845
|
+
|
|
846
|
+
def gens(self) -> tuple:
|
|
847
|
+
"""
|
|
848
|
+
EXAMPLES::
|
|
849
|
+
|
|
850
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
851
|
+
sage: R.gens()
|
|
852
|
+
(x,)
|
|
853
|
+
"""
|
|
854
|
+
return (self.gen(),)
|
|
855
|
+
|
|
856
|
+
def uniformizer(self):
|
|
857
|
+
"""
|
|
858
|
+
Return a uniformizer of this Laurent series field if it is
|
|
859
|
+
a discrete valuation field (i.e. if the base ring is actually
|
|
860
|
+
a field). Otherwise, an error is raised.
|
|
861
|
+
|
|
862
|
+
EXAMPLES::
|
|
863
|
+
|
|
864
|
+
sage: R.<t> = LaurentSeriesRing(QQ)
|
|
865
|
+
sage: R.uniformizer()
|
|
866
|
+
t
|
|
867
|
+
|
|
868
|
+
sage: R.<t> = LaurentSeriesRing(ZZ)
|
|
869
|
+
sage: R.uniformizer()
|
|
870
|
+
Traceback (most recent call last):
|
|
871
|
+
...
|
|
872
|
+
TypeError: the base ring is not a field
|
|
873
|
+
"""
|
|
874
|
+
if not self.base_ring().is_field():
|
|
875
|
+
raise TypeError("the base ring is not a field")
|
|
876
|
+
return self.gen()
|
|
877
|
+
|
|
878
|
+
def ngens(self):
|
|
879
|
+
"""
|
|
880
|
+
Laurent series rings are univariate.
|
|
881
|
+
|
|
882
|
+
EXAMPLES::
|
|
883
|
+
|
|
884
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
885
|
+
sage: R.ngens()
|
|
886
|
+
1
|
|
887
|
+
"""
|
|
888
|
+
return 1
|
|
889
|
+
|
|
890
|
+
def polynomial_ring(self):
|
|
891
|
+
r"""
|
|
892
|
+
If this is the Laurent series ring `R((t))`, return the
|
|
893
|
+
polynomial ring `R[t]`.
|
|
894
|
+
|
|
895
|
+
EXAMPLES::
|
|
896
|
+
|
|
897
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
898
|
+
sage: R.polynomial_ring()
|
|
899
|
+
Univariate Polynomial Ring in x over Rational Field
|
|
900
|
+
"""
|
|
901
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
902
|
+
return PolynomialRing(self.base_ring(), self.variable_name(),
|
|
903
|
+
sparse=self.is_sparse())
|
|
904
|
+
|
|
905
|
+
def laurent_polynomial_ring(self):
|
|
906
|
+
r"""
|
|
907
|
+
If this is the Laurent series ring `R((t))`, return the Laurent
|
|
908
|
+
polynomial ring `R[t,1/t]`.
|
|
909
|
+
|
|
910
|
+
EXAMPLES::
|
|
911
|
+
|
|
912
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
913
|
+
sage: R.laurent_polynomial_ring()
|
|
914
|
+
Univariate Laurent Polynomial Ring in x over Rational Field
|
|
915
|
+
"""
|
|
916
|
+
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
|
|
917
|
+
return LaurentPolynomialRing(self.base_ring(), self.variable_name(),
|
|
918
|
+
sparse=self.is_sparse())
|
|
919
|
+
|
|
920
|
+
def power_series_ring(self):
|
|
921
|
+
r"""
|
|
922
|
+
If this is the Laurent series ring `R((t))`, return the
|
|
923
|
+
power series ring `R[[t]]`.
|
|
924
|
+
|
|
925
|
+
EXAMPLES::
|
|
926
|
+
|
|
927
|
+
sage: R = LaurentSeriesRing(QQ, "x")
|
|
928
|
+
sage: R.power_series_ring()
|
|
929
|
+
Power Series Ring in x over Rational Field
|
|
930
|
+
"""
|
|
931
|
+
return self._power_series_ring
|