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,832 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Ring of Laurent Polynomials
|
|
4
|
+
|
|
5
|
+
If `R` is a commutative ring, then the ring of Laurent polynomials in `n`
|
|
6
|
+
variables over `R` is `R[x_1^{\pm 1}, x_2^{\pm 1}, \ldots, x_n^{\pm 1}]`.
|
|
7
|
+
We implement it as a quotient ring
|
|
8
|
+
|
|
9
|
+
.. MATH::
|
|
10
|
+
|
|
11
|
+
R[x_1, y_1, x_2, y_2, \ldots, x_n, y_n] / (x_1 y_1 - 1, x_2 y_2 - 1, \ldots, x_n y_n - 1).
|
|
12
|
+
|
|
13
|
+
TESTS::
|
|
14
|
+
|
|
15
|
+
sage: P.<q> = LaurentPolynomialRing(QQ)
|
|
16
|
+
sage: qi = q^(-1)
|
|
17
|
+
sage: qi in P
|
|
18
|
+
True
|
|
19
|
+
sage: P(qi)
|
|
20
|
+
q^-1
|
|
21
|
+
|
|
22
|
+
sage: A.<Y> = QQ[]
|
|
23
|
+
sage: R.<X> = LaurentPolynomialRing(A)
|
|
24
|
+
sage: matrix(R,2,2,[X,0,0,1]) # needs sage.modules
|
|
25
|
+
[X 0]
|
|
26
|
+
[0 1]
|
|
27
|
+
|
|
28
|
+
AUTHORS:
|
|
29
|
+
|
|
30
|
+
- David Roe (2008-2-23): created
|
|
31
|
+
- David Loeffler (2009-07-10): cleaned up docstrings
|
|
32
|
+
"""
|
|
33
|
+
# ****************************************************************************
|
|
34
|
+
# Copyright (C) 2008 David Roe <roed@math.harvard.edu>,
|
|
35
|
+
# William Stein <wstein@gmail.com>,
|
|
36
|
+
# Mike Hansen <mhansen@gmail.com>
|
|
37
|
+
# Vincent Delecroix <20100.delecroix@gmail.com>
|
|
38
|
+
#
|
|
39
|
+
# This program is free software: you can redistribute it and/or modify
|
|
40
|
+
# it under the terms of the GNU General Public License as published by
|
|
41
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
42
|
+
# (at your option) any later version.
|
|
43
|
+
# https://www.gnu.org/licenses/
|
|
44
|
+
# ****************************************************************************
|
|
45
|
+
|
|
46
|
+
from sage.misc.lazy_import import LazyImport
|
|
47
|
+
from sage.rings.polynomial.laurent_polynomial import LaurentPolynomial, LaurentPolynomial_univariate
|
|
48
|
+
from sage.rings.polynomial.laurent_polynomial_ring_base import LaurentPolynomialRing_generic
|
|
49
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
50
|
+
from sage.structure.element import parent
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def is_LaurentPolynomialRing(R):
|
|
54
|
+
"""
|
|
55
|
+
Return ``True`` if and only if R is a Laurent polynomial ring.
|
|
56
|
+
|
|
57
|
+
EXAMPLES::
|
|
58
|
+
|
|
59
|
+
sage: from sage.rings.polynomial.laurent_polynomial_ring import is_LaurentPolynomialRing
|
|
60
|
+
sage: P = PolynomialRing(QQ, 2, 'x')
|
|
61
|
+
sage: is_LaurentPolynomialRing(P)
|
|
62
|
+
doctest:warning...
|
|
63
|
+
DeprecationWarning: is_LaurentPolynomialRing is deprecated; use isinstance(...,
|
|
64
|
+
sage.rings.polynomial.laurent_polynomial_ring_base.LaurentPolynomialRing_generic) instead
|
|
65
|
+
See https://github.com/sagemath/sage/issues/35229 for details.
|
|
66
|
+
False
|
|
67
|
+
|
|
68
|
+
sage: R = LaurentPolynomialRing(QQ,3,'x') # needs sage.modules
|
|
69
|
+
sage: is_LaurentPolynomialRing(R) # needs sage.modules
|
|
70
|
+
True
|
|
71
|
+
"""
|
|
72
|
+
from sage.misc.superseded import deprecation
|
|
73
|
+
deprecation(35229,
|
|
74
|
+
"is_LaurentPolynomialRing is deprecated; use "
|
|
75
|
+
"isinstance(..., sage.rings.polynomial.laurent_polynomial_ring_base."
|
|
76
|
+
"LaurentPolynomialRing_generic) instead")
|
|
77
|
+
return isinstance(R, LaurentPolynomialRing_generic)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
_cache = {}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def LaurentPolynomialRing(base_ring, *args, **kwds):
|
|
84
|
+
r"""
|
|
85
|
+
Return the globally unique univariate or multivariate Laurent polynomial
|
|
86
|
+
ring with given properties and variable name or names.
|
|
87
|
+
|
|
88
|
+
There are four ways to call the Laurent polynomial ring constructor:
|
|
89
|
+
|
|
90
|
+
1. ``LaurentPolynomialRing(base_ring, name, sparse=False)``
|
|
91
|
+
2. ``LaurentPolynomialRing(base_ring, names, order='degrevlex')``
|
|
92
|
+
3. ``LaurentPolynomialRing(base_ring, name, n, order='degrevlex')``
|
|
93
|
+
4. ``LaurentPolynomialRing(base_ring, n, name, order='degrevlex')``
|
|
94
|
+
|
|
95
|
+
The optional arguments ``sparse`` and ``order`` *must* be explicitly
|
|
96
|
+
named, and the other arguments must be given positionally.
|
|
97
|
+
|
|
98
|
+
INPUT:
|
|
99
|
+
|
|
100
|
+
- ``base_ring`` -- a commutative ring
|
|
101
|
+
- ``name`` -- string
|
|
102
|
+
- ``names`` -- list or tuple of names, or a comma separated string
|
|
103
|
+
- ``n`` -- positive integer
|
|
104
|
+
- ``sparse`` -- boolean (default: ``False``); whether or not elements are sparse
|
|
105
|
+
- ``order`` -- string or
|
|
106
|
+
:class:`~sage.rings.polynomial.term_order.TermOrder`, e.g.,
|
|
107
|
+
|
|
108
|
+
- ``'degrevlex'`` -- default; degree reverse lexicographic
|
|
109
|
+
- ``'lex'`` -- lexicographic
|
|
110
|
+
- ``'deglex'`` -- degree lexicographic
|
|
111
|
+
- ``TermOrder('deglex',3) + TermOrder('deglex',3)`` -- block ordering
|
|
112
|
+
|
|
113
|
+
OUTPUT:
|
|
114
|
+
|
|
115
|
+
``LaurentPolynomialRing(base_ring, name, sparse=False)`` returns a
|
|
116
|
+
univariate Laurent polynomial ring; all other input formats return a
|
|
117
|
+
multivariate Laurent polynomial ring.
|
|
118
|
+
|
|
119
|
+
UNIQUENESS and IMMUTABILITY: In Sage there is exactly one
|
|
120
|
+
single-variate Laurent polynomial ring over each base ring in each choice
|
|
121
|
+
of variable and sparseness. There is also exactly one multivariate
|
|
122
|
+
Laurent polynomial ring over each base ring for each choice of names of
|
|
123
|
+
variables and term order.
|
|
124
|
+
|
|
125
|
+
::
|
|
126
|
+
|
|
127
|
+
sage: R.<x,y> = LaurentPolynomialRing(QQ, 2); R # needs sage.modules
|
|
128
|
+
Multivariate Laurent Polynomial Ring in x, y over Rational Field
|
|
129
|
+
sage: f = x^2 - 2*y^-2 # needs sage.modules
|
|
130
|
+
|
|
131
|
+
You can't just globally change the names of those variables.
|
|
132
|
+
This is because objects all over Sage could have pointers to
|
|
133
|
+
that polynomial ring.
|
|
134
|
+
|
|
135
|
+
::
|
|
136
|
+
|
|
137
|
+
sage: R._assign_names(['z','w']) # needs sage.modules
|
|
138
|
+
Traceback (most recent call last):
|
|
139
|
+
...
|
|
140
|
+
ValueError: variable names cannot be changed after object creation.
|
|
141
|
+
|
|
142
|
+
EXAMPLES:
|
|
143
|
+
|
|
144
|
+
1. ``LaurentPolynomialRing(base_ring, name, sparse=False)``
|
|
145
|
+
|
|
146
|
+
::
|
|
147
|
+
|
|
148
|
+
sage: LaurentPolynomialRing(QQ, 'w')
|
|
149
|
+
Univariate Laurent Polynomial Ring in w over Rational Field
|
|
150
|
+
|
|
151
|
+
Use the diamond brackets notation to make the variable
|
|
152
|
+
ready for use after you define the ring::
|
|
153
|
+
|
|
154
|
+
sage: R.<w> = LaurentPolynomialRing(QQ)
|
|
155
|
+
sage: (1 + w)^3
|
|
156
|
+
1 + 3*w + 3*w^2 + w^3
|
|
157
|
+
|
|
158
|
+
You must specify a name::
|
|
159
|
+
|
|
160
|
+
sage: LaurentPolynomialRing(QQ)
|
|
161
|
+
Traceback (most recent call last):
|
|
162
|
+
...
|
|
163
|
+
TypeError: you must specify the names of the variables
|
|
164
|
+
|
|
165
|
+
sage: R.<abc> = LaurentPolynomialRing(QQ, sparse=True); R
|
|
166
|
+
Univariate Laurent Polynomial Ring in abc over Rational Field
|
|
167
|
+
|
|
168
|
+
sage: R.<w> = LaurentPolynomialRing(PolynomialRing(GF(7),'k')); R
|
|
169
|
+
Univariate Laurent Polynomial Ring in w over
|
|
170
|
+
Univariate Polynomial Ring in k over Finite Field of size 7
|
|
171
|
+
|
|
172
|
+
Rings with different variables are different::
|
|
173
|
+
|
|
174
|
+
sage: LaurentPolynomialRing(QQ, 'x') == LaurentPolynomialRing(QQ, 'y')
|
|
175
|
+
False
|
|
176
|
+
|
|
177
|
+
2. ``LaurentPolynomialRing(base_ring, names, order='degrevlex')``
|
|
178
|
+
|
|
179
|
+
::
|
|
180
|
+
|
|
181
|
+
sage: R = LaurentPolynomialRing(QQ, 'a,b,c'); R # needs sage.modules
|
|
182
|
+
Multivariate Laurent Polynomial Ring in a, b, c over Rational Field
|
|
183
|
+
|
|
184
|
+
sage: S = LaurentPolynomialRing(QQ, ['a','b','c']); S # needs sage.modules
|
|
185
|
+
Multivariate Laurent Polynomial Ring in a, b, c over Rational Field
|
|
186
|
+
|
|
187
|
+
sage: T = LaurentPolynomialRing(QQ, ('a','b','c')); T # needs sage.modules
|
|
188
|
+
Multivariate Laurent Polynomial Ring in a, b, c over Rational Field
|
|
189
|
+
|
|
190
|
+
All three rings are identical.
|
|
191
|
+
|
|
192
|
+
::
|
|
193
|
+
|
|
194
|
+
sage: (R is S) and (S is T) # needs sage.modules
|
|
195
|
+
True
|
|
196
|
+
|
|
197
|
+
There is a unique Laurent polynomial ring with each term order::
|
|
198
|
+
|
|
199
|
+
sage: # needs sage.modules
|
|
200
|
+
sage: R = LaurentPolynomialRing(QQ, 'x,y,z', order='degrevlex'); R
|
|
201
|
+
Multivariate Laurent Polynomial Ring in x, y, z over Rational Field
|
|
202
|
+
sage: S = LaurentPolynomialRing(QQ, 'x,y,z', order='invlex'); S
|
|
203
|
+
Multivariate Laurent Polynomial Ring in x, y, z over Rational Field
|
|
204
|
+
sage: S is LaurentPolynomialRing(QQ, 'x,y,z', order='invlex')
|
|
205
|
+
True
|
|
206
|
+
sage: R == S
|
|
207
|
+
False
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
3. ``LaurentPolynomialRing(base_ring, name, n, order='degrevlex')``
|
|
211
|
+
|
|
212
|
+
If you specify a single name as a string and a number of
|
|
213
|
+
variables, then variables labeled with numbers are created.
|
|
214
|
+
|
|
215
|
+
::
|
|
216
|
+
|
|
217
|
+
sage: LaurentPolynomialRing(QQ, 'x', 10) # needs sage.modules
|
|
218
|
+
Multivariate Laurent Polynomial Ring in x0, x1, x2, x3, x4, x5, x6, x7, x8, x9
|
|
219
|
+
over Rational Field
|
|
220
|
+
|
|
221
|
+
sage: LaurentPolynomialRing(GF(7), 'y', 5) # needs sage.modules
|
|
222
|
+
Multivariate Laurent Polynomial Ring in y0, y1, y2, y3, y4
|
|
223
|
+
over Finite Field of size 7
|
|
224
|
+
|
|
225
|
+
sage: LaurentPolynomialRing(QQ, 'y', 3, sparse=True) # needs sage.modules
|
|
226
|
+
Multivariate Laurent Polynomial Ring in y0, y1, y2 over Rational Field
|
|
227
|
+
|
|
228
|
+
By calling the
|
|
229
|
+
:meth:`~sage.structure.category_object.CategoryObject.inject_variables`
|
|
230
|
+
method, all those variable names are available for interactive use::
|
|
231
|
+
|
|
232
|
+
sage: R = LaurentPolynomialRing(GF(7), 15, 'w'); R # needs sage.modules
|
|
233
|
+
Multivariate Laurent Polynomial Ring in w0, w1, w2, w3, w4, w5, w6, w7,
|
|
234
|
+
w8, w9, w10, w11, w12, w13, w14 over Finite Field of size 7
|
|
235
|
+
sage: R.inject_variables() # needs sage.modules
|
|
236
|
+
Defining w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14
|
|
237
|
+
sage: (w0 + 2*w8 + w13)^2 # needs sage.modules
|
|
238
|
+
w0^2 + 4*w0*w8 + 4*w8^2 + 2*w0*w13 + 4*w8*w13 + w13^2
|
|
239
|
+
"""
|
|
240
|
+
from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic
|
|
241
|
+
from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base
|
|
242
|
+
|
|
243
|
+
R = PolynomialRing(base_ring, *args, **kwds)
|
|
244
|
+
if R in _cache:
|
|
245
|
+
return _cache[R] # put () here to re-enable weakrefs
|
|
246
|
+
|
|
247
|
+
if isinstance(R, PolynomialRing_generic):
|
|
248
|
+
# univariate case
|
|
249
|
+
P = LaurentPolynomialRing_univariate(R)
|
|
250
|
+
else:
|
|
251
|
+
assert isinstance(R, MPolynomialRing_base)
|
|
252
|
+
P = LaurentPolynomialRing_mpair(R)
|
|
253
|
+
|
|
254
|
+
_cache[R] = P
|
|
255
|
+
return P
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def _split_dict_(D, indices, group_by=None):
|
|
259
|
+
r"""
|
|
260
|
+
Split the dictionary ``D`` by ``indices`` and ``group_by``.
|
|
261
|
+
|
|
262
|
+
INPUT:
|
|
263
|
+
|
|
264
|
+
- ``D`` -- dictionary
|
|
265
|
+
|
|
266
|
+
- ``indices`` -- tuple or list of nonnegative integers
|
|
267
|
+
|
|
268
|
+
- ``group_by`` -- tuple or list of nonnegative integers;
|
|
269
|
+
if this is ``None`` (default), then no grouping is done
|
|
270
|
+
|
|
271
|
+
OUTPUT: a dictionary
|
|
272
|
+
|
|
273
|
+
TESTS::
|
|
274
|
+
|
|
275
|
+
sage: from sage.rings.polynomial.laurent_polynomial_ring import _split_dict_
|
|
276
|
+
sage: D = {(0,0,0,0): 'a', (1,0,0,0): 'b',
|
|
277
|
+
....: (1,0,0,2): 'c', (1,2,0,3): 'd'}
|
|
278
|
+
sage: _split_dict_(D, [1,0,3])
|
|
279
|
+
{(0, 0, 0): 'a', (0, 1, 0): 'b', (0, 1, 2): 'c', (2, 1, 3): 'd'}
|
|
280
|
+
sage: _split_dict_(D, [2,3], [0,1])
|
|
281
|
+
{(0, 0): {(0, 0): 'a'},
|
|
282
|
+
(1, 0): {(0, 0): 'b', (0, 2): 'c'},
|
|
283
|
+
(1, 2): {(0, 3): 'd'}}
|
|
284
|
+
sage: _split_dict_(D, [3,1], [0])
|
|
285
|
+
{(0,): {(0, 0): 'a'}, (1,): {(0, 0): 'b', (2, 0): 'c', (3, 2): 'd'}}
|
|
286
|
+
|
|
287
|
+
sage: _split_dict_(D, [0,None,1,3])
|
|
288
|
+
{(0, 0, 0, 0): 'a', (1, 0, 0, 0): 'b',
|
|
289
|
+
(1, 0, 0, 2): 'c', (1, 0, 2, 3): 'd'}
|
|
290
|
+
sage: _split_dict_(D, [0,1], [None,3,None])
|
|
291
|
+
{(0, 0, 0): {(0, 0): 'a', (1, 0): 'b'},
|
|
292
|
+
(0, 2, 0): {(1, 0): 'c'},
|
|
293
|
+
(0, 3, 0): {(1, 2): 'd'}}
|
|
294
|
+
sage: _split_dict_(D, [None,3,1], [0,None])
|
|
295
|
+
{(0, 0): {(0, 0, 0): 'a'},
|
|
296
|
+
(1, 0): {(0, 0, 0): 'b', (0, 2, 0): 'c',
|
|
297
|
+
(0, 3, 2): 'd'}}
|
|
298
|
+
|
|
299
|
+
sage: _split_dict_(D, [0,1])
|
|
300
|
+
Traceback (most recent call last):
|
|
301
|
+
...
|
|
302
|
+
SplitDictError: split not possible
|
|
303
|
+
sage: _split_dict_(D, [0], [1])
|
|
304
|
+
Traceback (most recent call last):
|
|
305
|
+
...
|
|
306
|
+
SplitDictError: split not possible
|
|
307
|
+
sage: _split_dict_({}, [])
|
|
308
|
+
{}
|
|
309
|
+
"""
|
|
310
|
+
if not D:
|
|
311
|
+
return {}
|
|
312
|
+
if group_by is None:
|
|
313
|
+
group_by = tuple()
|
|
314
|
+
|
|
315
|
+
class SplitDictError(ValueError):
|
|
316
|
+
pass
|
|
317
|
+
|
|
318
|
+
def get(T, i):
|
|
319
|
+
return T[i] if i is not None else 0
|
|
320
|
+
|
|
321
|
+
def extract(T, indices):
|
|
322
|
+
return tuple(get(T, i) for i in indices)
|
|
323
|
+
|
|
324
|
+
remaining = sorted(set(range(len(next(iter(D)))))
|
|
325
|
+
- set(indices) - set(group_by))
|
|
326
|
+
result = {}
|
|
327
|
+
for K, V in D.items():
|
|
328
|
+
if not all(r == 0 for r in extract(K, remaining)):
|
|
329
|
+
raise SplitDictError('split not possible')
|
|
330
|
+
G = extract(K, group_by)
|
|
331
|
+
I = extract(K, indices)
|
|
332
|
+
result.setdefault(G, dict()).update({I: V})
|
|
333
|
+
if not group_by:
|
|
334
|
+
return result.popitem()[1]
|
|
335
|
+
else:
|
|
336
|
+
return result
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def _split_laurent_polynomial_dict_(P, M, d):
|
|
340
|
+
r"""
|
|
341
|
+
Helper function for splitting a multivariate Laurent polynomial
|
|
342
|
+
during conversion.
|
|
343
|
+
|
|
344
|
+
INPUT:
|
|
345
|
+
|
|
346
|
+
- ``P`` -- the parent to which we want to convert
|
|
347
|
+
|
|
348
|
+
- ``M`` -- the parent from which we want to convert
|
|
349
|
+
|
|
350
|
+
- ``d`` -- dictionary mapping tuples (representing the exponents)
|
|
351
|
+
to their coefficients. This is the dictionary corresponding to
|
|
352
|
+
an element of ``M``.
|
|
353
|
+
|
|
354
|
+
OUTPUT: a dictionary corresponding to an element of ``P``
|
|
355
|
+
|
|
356
|
+
TESTS::
|
|
357
|
+
|
|
358
|
+
sage: # needs sage.modules
|
|
359
|
+
sage: L.<a, b, c, d> = LaurentPolynomialRing(ZZ)
|
|
360
|
+
sage: M = LaurentPolynomialRing(ZZ, 'c, d')
|
|
361
|
+
sage: N = LaurentPolynomialRing(M, 'a, b')
|
|
362
|
+
sage: M(c/d + 1/c) # indirect doctest
|
|
363
|
+
c*d^-1 + c^-1
|
|
364
|
+
sage: N(a + b/c/d + 1/b) # indirect doctest
|
|
365
|
+
a + (c^-1*d^-1)*b + b^-1
|
|
366
|
+
"""
|
|
367
|
+
vars_P = P.variable_names()
|
|
368
|
+
vars_M = M.variable_names()
|
|
369
|
+
if not set(vars_M) & set(vars_P):
|
|
370
|
+
raise TypeError('no common variables')
|
|
371
|
+
|
|
372
|
+
def index(T, value):
|
|
373
|
+
try:
|
|
374
|
+
return T.index(value)
|
|
375
|
+
except ValueError:
|
|
376
|
+
return None
|
|
377
|
+
|
|
378
|
+
def value(d, R):
|
|
379
|
+
assert d
|
|
380
|
+
if len(d) == 1:
|
|
381
|
+
k, v = next(iter(d.items()))
|
|
382
|
+
if all(i == 0 for i in k):
|
|
383
|
+
return R(v)
|
|
384
|
+
return R(M(d))
|
|
385
|
+
|
|
386
|
+
group_by = tuple(index(vars_M, var) for var in vars_P)
|
|
387
|
+
indices = list(range(len(vars_M)))
|
|
388
|
+
for g in group_by:
|
|
389
|
+
if g is not None:
|
|
390
|
+
indices[g] = None
|
|
391
|
+
D = _split_dict_(d, indices, group_by)
|
|
392
|
+
try:
|
|
393
|
+
return {k: value(v, P.base_ring()) for k, v in D.items()}
|
|
394
|
+
except (ValueError, TypeError):
|
|
395
|
+
pass
|
|
396
|
+
return sum(P({k: 1}) * value(v, P)
|
|
397
|
+
for k, v in D.items()).monomial_coefficients()
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def from_fraction_field(L, x):
|
|
401
|
+
r"""
|
|
402
|
+
Helper function to construct a Laurent polynomial from an element of its
|
|
403
|
+
parent's fraction field.
|
|
404
|
+
|
|
405
|
+
INPUT:
|
|
406
|
+
|
|
407
|
+
- ``L`` -- an instance of :class:`LaurentPolynomialRing_generic`
|
|
408
|
+
- ``x`` -- an element of the fraction field of ``L``
|
|
409
|
+
|
|
410
|
+
OUTPUT:
|
|
411
|
+
|
|
412
|
+
An instance of the element class of ``L``. If the denominator fails to be
|
|
413
|
+
a unit in ``L`` an error is raised.
|
|
414
|
+
|
|
415
|
+
EXAMPLES::
|
|
416
|
+
|
|
417
|
+
sage: # needs sage.modules
|
|
418
|
+
sage: from sage.rings.polynomial.laurent_polynomial_ring import from_fraction_field
|
|
419
|
+
sage: L.<x, y> = LaurentPolynomialRing(ZZ)
|
|
420
|
+
sage: F = L.fraction_field()
|
|
421
|
+
sage: xi = F(~x)
|
|
422
|
+
sage: from_fraction_field(L, xi) == ~x
|
|
423
|
+
True
|
|
424
|
+
"""
|
|
425
|
+
d = L(x.denominator())
|
|
426
|
+
if d.is_unit():
|
|
427
|
+
n = L(x.numerator())
|
|
428
|
+
return n * d.inverse_of_unit()
|
|
429
|
+
else:
|
|
430
|
+
raise TypeError("fraction must have unit denominator")
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
class LaurentPolynomialRing_univariate(LaurentPolynomialRing_generic):
|
|
434
|
+
def __init__(self, R):
|
|
435
|
+
"""
|
|
436
|
+
EXAMPLES::
|
|
437
|
+
|
|
438
|
+
sage: L = LaurentPolynomialRing(QQ,'x')
|
|
439
|
+
sage: type(L)
|
|
440
|
+
<class 'sage.rings.polynomial.laurent_polynomial_ring.LaurentPolynomialRing_univariate_with_category'>
|
|
441
|
+
sage: TestSuite(L).run()
|
|
442
|
+
|
|
443
|
+
TESTS::
|
|
444
|
+
|
|
445
|
+
sage: TestSuite(LaurentPolynomialRing(Zmod(2), 'y')).run()
|
|
446
|
+
sage: TestSuite(LaurentPolynomialRing(Zmod(4), 'y')).run()
|
|
447
|
+
sage: TestSuite(LaurentPolynomialRing(ZZ, 'u')).run()
|
|
448
|
+
sage: TestSuite(LaurentPolynomialRing(Zmod(2)['T'], 'u')).run()
|
|
449
|
+
sage: TestSuite(LaurentPolynomialRing(Zmod(4)['T'], 'u')).run()
|
|
450
|
+
"""
|
|
451
|
+
if R.ngens() != 1:
|
|
452
|
+
raise ValueError("must be 1 generator")
|
|
453
|
+
LaurentPolynomialRing_generic.__init__(self, R)
|
|
454
|
+
from sage.rings.integer_ring import IntegerRing
|
|
455
|
+
self._indices = IntegerRing()
|
|
456
|
+
|
|
457
|
+
Element = LaurentPolynomial_univariate
|
|
458
|
+
|
|
459
|
+
def _repr_(self):
|
|
460
|
+
"""
|
|
461
|
+
TESTS::
|
|
462
|
+
|
|
463
|
+
sage: LaurentPolynomialRing(QQ,'x') # indirect doctest
|
|
464
|
+
Univariate Laurent Polynomial Ring in x over Rational Field
|
|
465
|
+
"""
|
|
466
|
+
return "Univariate Laurent Polynomial Ring in %s over %s" % (self._R.variable_name(), self._R.base_ring())
|
|
467
|
+
|
|
468
|
+
def _element_constructor_(self, x):
|
|
469
|
+
"""
|
|
470
|
+
EXAMPLES::
|
|
471
|
+
|
|
472
|
+
sage: L = LaurentPolynomialRing(QQ, 'x')
|
|
473
|
+
sage: L(1/2)
|
|
474
|
+
1/2
|
|
475
|
+
|
|
476
|
+
sage: L(x + 3/x) # needs sage.symbolic
|
|
477
|
+
3*x^-1 + x
|
|
478
|
+
|
|
479
|
+
::
|
|
480
|
+
|
|
481
|
+
sage: L(exp(x)) # needs sage.symbolic
|
|
482
|
+
Traceback (most recent call last):
|
|
483
|
+
...
|
|
484
|
+
TypeError: unable to convert e^x to a rational
|
|
485
|
+
|
|
486
|
+
::
|
|
487
|
+
|
|
488
|
+
sage: # needs sage.modules
|
|
489
|
+
sage: U = LaurentPolynomialRing(QQ, 'a')
|
|
490
|
+
sage: V = LaurentPolynomialRing(QQ, 'c')
|
|
491
|
+
sage: L.<a, b, c, d> = LaurentPolynomialRing(QQ)
|
|
492
|
+
sage: M = LaurentPolynomialRing(QQ, 'c, d')
|
|
493
|
+
sage: Mc, Md = M.gens()
|
|
494
|
+
sage: N = LaurentPolynomialRing(M, 'a, b')
|
|
495
|
+
sage: Na, Nb = N.gens()
|
|
496
|
+
sage: U(Na)
|
|
497
|
+
a
|
|
498
|
+
sage: V(Mc)
|
|
499
|
+
c
|
|
500
|
+
|
|
501
|
+
sage: # needs sage.modules
|
|
502
|
+
sage: M(L(0))
|
|
503
|
+
0
|
|
504
|
+
sage: N(L(0))
|
|
505
|
+
0
|
|
506
|
+
sage: L(M(0))
|
|
507
|
+
0
|
|
508
|
+
sage: L(N(0))
|
|
509
|
+
0
|
|
510
|
+
|
|
511
|
+
::
|
|
512
|
+
|
|
513
|
+
sage: A.<a> = LaurentPolynomialRing(QQ)
|
|
514
|
+
sage: B.<b> = LaurentPolynomialRing(A)
|
|
515
|
+
sage: B(a)
|
|
516
|
+
a
|
|
517
|
+
sage: C.<c> = LaurentPolynomialRing(B)
|
|
518
|
+
sage: B(C(b))
|
|
519
|
+
b
|
|
520
|
+
sage: D.<d, e> = LaurentPolynomialRing(B) # needs sage.modules
|
|
521
|
+
sage: B(D(b)) # needs sage.modules
|
|
522
|
+
b
|
|
523
|
+
|
|
524
|
+
TESTS:
|
|
525
|
+
|
|
526
|
+
Check that conversion back from fraction field does work (:issue:`26425`)::
|
|
527
|
+
|
|
528
|
+
sage: R.<t> = LaurentPolynomialRing(ZZ)
|
|
529
|
+
sage: F = FractionField(R)
|
|
530
|
+
sage: R(F(25/(5*t**2)))
|
|
531
|
+
5*t^-2
|
|
532
|
+
sage: R(F(1/(1+t**2)))
|
|
533
|
+
Traceback (most recent call last):
|
|
534
|
+
...
|
|
535
|
+
TypeError: fraction must have unit denominator
|
|
536
|
+
"""
|
|
537
|
+
from sage.structure.element import Expression
|
|
538
|
+
from sage.rings.fraction_field_element import FractionFieldElement
|
|
539
|
+
from sage.rings.localization import LocalizationElement
|
|
540
|
+
if isinstance(x, Expression):
|
|
541
|
+
return x.laurent_polynomial(ring=self)
|
|
542
|
+
|
|
543
|
+
elif isinstance(x, LaurentPolynomial):
|
|
544
|
+
P = x.parent()
|
|
545
|
+
if set(self.variable_names()) & set(P.variable_names()):
|
|
546
|
+
if isinstance(x, LaurentPolynomial_univariate):
|
|
547
|
+
d = {(k,): v for k, v in x.monomial_coefficients().items()}
|
|
548
|
+
else:
|
|
549
|
+
d = x.monomial_coefficients()
|
|
550
|
+
x = _split_laurent_polynomial_dict_(self, P, d)
|
|
551
|
+
x = {k[0]: v for k, v in x.items()}
|
|
552
|
+
elif P is self.base_ring():
|
|
553
|
+
x = {0: x}
|
|
554
|
+
elif x.is_constant() and self.has_coerce_map_from(x.parent().base_ring()):
|
|
555
|
+
return self(x.constant_coefficient())
|
|
556
|
+
elif len(self.variable_names()) == len(P.variable_names()):
|
|
557
|
+
x = x.monomial_coefficients()
|
|
558
|
+
|
|
559
|
+
elif isinstance(x, FractionFieldElement):
|
|
560
|
+
# since the field of fraction of self is defined corresponding to
|
|
561
|
+
# the polynomial ring of self the conversion of its elements back
|
|
562
|
+
# must be treated separately (:issue:`26425`).
|
|
563
|
+
return from_fraction_field(self, x)
|
|
564
|
+
|
|
565
|
+
elif isinstance(x, LocalizationElement):
|
|
566
|
+
# see :issue:`33477`.
|
|
567
|
+
F = self.fraction_field()
|
|
568
|
+
return from_fraction_field(self, F(x))
|
|
569
|
+
|
|
570
|
+
return self.element_class(self, x)
|
|
571
|
+
|
|
572
|
+
def monomial(self, arg):
|
|
573
|
+
r"""
|
|
574
|
+
Return the monomial with the given exponent.
|
|
575
|
+
"""
|
|
576
|
+
return self.element_class(self, {arg: self.base_ring().one()})
|
|
577
|
+
|
|
578
|
+
def __reduce__(self):
|
|
579
|
+
"""
|
|
580
|
+
Used in pickling.
|
|
581
|
+
|
|
582
|
+
EXAMPLES::
|
|
583
|
+
|
|
584
|
+
sage: L = LaurentPolynomialRing(QQ, 'x')
|
|
585
|
+
sage: loads(dumps(L)) == L
|
|
586
|
+
True
|
|
587
|
+
"""
|
|
588
|
+
return LaurentPolynomialRing_univariate, (self._R,)
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
class LaurentPolynomialRing_mpair(LaurentPolynomialRing_generic):
|
|
592
|
+
def __init__(self, R):
|
|
593
|
+
"""
|
|
594
|
+
EXAMPLES::
|
|
595
|
+
|
|
596
|
+
sage: L = LaurentPolynomialRing(QQ,2,'x') # needs sage.modules
|
|
597
|
+
sage: type(L) # needs sage.modules
|
|
598
|
+
<class
|
|
599
|
+
'sage.rings.polynomial.laurent_polynomial_ring.LaurentPolynomialRing_mpair_with_category'>
|
|
600
|
+
sage: L == loads(dumps(L)) # needs sage.modules
|
|
601
|
+
True
|
|
602
|
+
"""
|
|
603
|
+
if R.ngens() <= 0:
|
|
604
|
+
raise ValueError("n must be positive")
|
|
605
|
+
if not R.base_ring().is_integral_domain():
|
|
606
|
+
raise ValueError("base ring must be an integral domain")
|
|
607
|
+
LaurentPolynomialRing_generic.__init__(self, R)
|
|
608
|
+
from sage.modules.free_module import FreeModule
|
|
609
|
+
from sage.rings.integer_ring import IntegerRing
|
|
610
|
+
self._indices = FreeModule(IntegerRing(), R.ngens())
|
|
611
|
+
|
|
612
|
+
Element = LazyImport('sage.rings.polynomial.laurent_polynomial_mpair', 'LaurentPolynomial_mpair')
|
|
613
|
+
|
|
614
|
+
def _repr_(self):
|
|
615
|
+
"""
|
|
616
|
+
TESTS::
|
|
617
|
+
|
|
618
|
+
sage: LaurentPolynomialRing(QQ,2,'x').__repr__() # needs sage.modules
|
|
619
|
+
'Multivariate Laurent Polynomial Ring in x0, x1 over Rational Field'
|
|
620
|
+
sage: LaurentPolynomialRing(QQ,1,'x').__repr__() # needs sage.modules
|
|
621
|
+
'Multivariate Laurent Polynomial Ring in x over Rational Field'
|
|
622
|
+
"""
|
|
623
|
+
return "Multivariate Laurent Polynomial Ring in %s over %s" % (", ".join(self._R.variable_names()), self._R.base_ring())
|
|
624
|
+
|
|
625
|
+
def monomial(self, *exponents):
|
|
626
|
+
r"""
|
|
627
|
+
Return the monomial whose exponents are given in argument.
|
|
628
|
+
|
|
629
|
+
EXAMPLES::
|
|
630
|
+
|
|
631
|
+
sage: # needs sage.modules
|
|
632
|
+
sage: L = LaurentPolynomialRing(QQ, 'x', 2)
|
|
633
|
+
sage: L.monomial(-3, 5)
|
|
634
|
+
x0^-3*x1^5
|
|
635
|
+
sage: L.monomial(1, 1)
|
|
636
|
+
x0*x1
|
|
637
|
+
sage: L.monomial(0, 0)
|
|
638
|
+
1
|
|
639
|
+
sage: L.monomial(-2, -3)
|
|
640
|
+
x0^-2*x1^-3
|
|
641
|
+
|
|
642
|
+
sage: x0, x1 = L.gens() # needs sage.modules
|
|
643
|
+
sage: L.monomial(-1, 2) == x0^-1 * x1^2 # needs sage.modules
|
|
644
|
+
True
|
|
645
|
+
|
|
646
|
+
sage: L.monomial(1, 2, 3) # needs sage.modules
|
|
647
|
+
Traceback (most recent call last):
|
|
648
|
+
...
|
|
649
|
+
TypeError: tuple key (1, 2, 3) must have same length as ngens (= 2)
|
|
650
|
+
|
|
651
|
+
We also allow to specify the exponents in a single tuple::
|
|
652
|
+
|
|
653
|
+
sage: L.monomial((-1, 2)) # needs sage.modules
|
|
654
|
+
x0^-1*x1^2
|
|
655
|
+
|
|
656
|
+
sage: L.monomial((-1, 2, 3)) # needs sage.modules
|
|
657
|
+
Traceback (most recent call last):
|
|
658
|
+
...
|
|
659
|
+
TypeError: tuple key (-1, 2, 3) must have same length as ngens (= 2)
|
|
660
|
+
"""
|
|
661
|
+
from sage.rings.polynomial.polydict import ETuple
|
|
662
|
+
if len(exponents) == 1 and isinstance((e := exponents[0]), (tuple, ETuple)):
|
|
663
|
+
exponents = e
|
|
664
|
+
|
|
665
|
+
if len(exponents) != self.ngens():
|
|
666
|
+
raise TypeError(f"tuple key {exponents} must have same length as ngens (= {self.ngens()})")
|
|
667
|
+
|
|
668
|
+
m = ETuple(exponents, int(self.ngens()))
|
|
669
|
+
return self.element_class(self, self.polynomial_ring().base_ring().one(), m)
|
|
670
|
+
|
|
671
|
+
def _element_constructor_(self, x, mon=None):
|
|
672
|
+
"""
|
|
673
|
+
EXAMPLES::
|
|
674
|
+
|
|
675
|
+
sage: L = LaurentPolynomialRing(QQ,2,'x') # needs sage.modules
|
|
676
|
+
sage: L(1/2) # needs sage.modules
|
|
677
|
+
1/2
|
|
678
|
+
|
|
679
|
+
sage: M = LaurentPolynomialRing(QQ, 'x, y') # needs sage.modules
|
|
680
|
+
sage: var('x, y') # needs sage.modules sage.symbolic
|
|
681
|
+
(x, y)
|
|
682
|
+
sage: M(x/y + 3/x) # needs sage.modules sage.symbolic
|
|
683
|
+
x*y^-1 + 3*x^-1
|
|
684
|
+
|
|
685
|
+
::
|
|
686
|
+
|
|
687
|
+
sage: M(exp(x)) # needs sage.modules sage.symbolic
|
|
688
|
+
Traceback (most recent call last):
|
|
689
|
+
...
|
|
690
|
+
TypeError: unable to convert e^x to a rational
|
|
691
|
+
|
|
692
|
+
::
|
|
693
|
+
|
|
694
|
+
sage: # needs sage.modules
|
|
695
|
+
sage: L.<a, b, c, d> = LaurentPolynomialRing(QQ)
|
|
696
|
+
sage: M = LaurentPolynomialRing(QQ, 'c, d')
|
|
697
|
+
sage: Mc, Md = M.gens()
|
|
698
|
+
sage: N = LaurentPolynomialRing(M, 'a, b')
|
|
699
|
+
sage: Na, Nb = N.gens()
|
|
700
|
+
sage: M(c/d)
|
|
701
|
+
c*d^-1
|
|
702
|
+
sage: N(a*b/c/d)
|
|
703
|
+
(c^-1*d^-1)*a*b
|
|
704
|
+
sage: N(c/d)
|
|
705
|
+
c*d^-1
|
|
706
|
+
sage: L(Mc)
|
|
707
|
+
c
|
|
708
|
+
sage: L(Nb)
|
|
709
|
+
b
|
|
710
|
+
|
|
711
|
+
sage: # needs sage.modules
|
|
712
|
+
sage: M(L(0))
|
|
713
|
+
0
|
|
714
|
+
sage: N(L(0))
|
|
715
|
+
0
|
|
716
|
+
sage: L(M(0))
|
|
717
|
+
0
|
|
718
|
+
sage: L(N(0))
|
|
719
|
+
0
|
|
720
|
+
|
|
721
|
+
sage: # needs sage.modules
|
|
722
|
+
sage: U = LaurentPolynomialRing(QQ, 'a')
|
|
723
|
+
sage: Ua = U.gen()
|
|
724
|
+
sage: V = LaurentPolynomialRing(QQ, 'c')
|
|
725
|
+
sage: Vc = V.gen()
|
|
726
|
+
sage: L(Ua)
|
|
727
|
+
a
|
|
728
|
+
sage: L(Vc)
|
|
729
|
+
c
|
|
730
|
+
sage: N(Ua)
|
|
731
|
+
a
|
|
732
|
+
sage: M(Vc)
|
|
733
|
+
c
|
|
734
|
+
|
|
735
|
+
sage: # needs sage.modules
|
|
736
|
+
sage: P = LaurentPolynomialRing(QQ, 'a, b')
|
|
737
|
+
sage: Q = LaurentPolynomialRing(P, 'c, d')
|
|
738
|
+
sage: Q(P.0)
|
|
739
|
+
a
|
|
740
|
+
|
|
741
|
+
::
|
|
742
|
+
|
|
743
|
+
sage: # needs sage.modules
|
|
744
|
+
sage: A.<a> = LaurentPolynomialRing(QQ)
|
|
745
|
+
sage: B.<b> = LaurentPolynomialRing(A)
|
|
746
|
+
sage: C = LaurentPolynomialRing(QQ, 'a, b')
|
|
747
|
+
sage: C(B({1: a}))
|
|
748
|
+
a*b
|
|
749
|
+
sage: D.<d, e> = LaurentPolynomialRing(B)
|
|
750
|
+
sage: F.<f, g> = LaurentPolynomialRing(D)
|
|
751
|
+
sage: D(F(d*e))
|
|
752
|
+
d*e
|
|
753
|
+
|
|
754
|
+
::
|
|
755
|
+
|
|
756
|
+
sage: # needs sage.modules
|
|
757
|
+
sage: from sage.rings.polynomial.polydict import ETuple
|
|
758
|
+
sage: R.<x,y,z> = LaurentPolynomialRing(QQ)
|
|
759
|
+
sage: mon = ETuple({}, int(3))
|
|
760
|
+
sage: P = R.polynomial_ring()
|
|
761
|
+
sage: R(sum(P.gens()), mon)
|
|
762
|
+
x + y + z
|
|
763
|
+
sage: R(sum(P.gens()), (-1,-1,-1))
|
|
764
|
+
y^-1*z^-1 + x^-1*z^-1 + x^-1*y^-1
|
|
765
|
+
|
|
766
|
+
::
|
|
767
|
+
|
|
768
|
+
sage: # needs sage.modules
|
|
769
|
+
sage: RL = R.localization(x + 1)
|
|
770
|
+
sage: xi = RL(~x)
|
|
771
|
+
sage: R(xi) == ~x # indirect doctests
|
|
772
|
+
True
|
|
773
|
+
"""
|
|
774
|
+
from sage.structure.element import Expression
|
|
775
|
+
from sage.rings.fraction_field_element import FractionFieldElement
|
|
776
|
+
from sage.rings.localization import LocalizationElement
|
|
777
|
+
|
|
778
|
+
if mon is not None:
|
|
779
|
+
return self.element_class(self, x, mon)
|
|
780
|
+
|
|
781
|
+
P = parent(x)
|
|
782
|
+
if P is self.polynomial_ring():
|
|
783
|
+
from sage.rings.polynomial.polydict import ETuple
|
|
784
|
+
return self.element_class( self, x, mon=ETuple({}, int(self.ngens())) )
|
|
785
|
+
|
|
786
|
+
elif isinstance(x, Expression):
|
|
787
|
+
return x.laurent_polynomial(ring=self)
|
|
788
|
+
|
|
789
|
+
elif isinstance(x, LaurentPolynomial):
|
|
790
|
+
if self.variable_names() == P.variable_names():
|
|
791
|
+
# No special processing needed here;
|
|
792
|
+
# handled by LaurentPolynomial_mpair.__init__
|
|
793
|
+
pass
|
|
794
|
+
elif set(self.variable_names()) & set(P.variable_names()):
|
|
795
|
+
if isinstance(x, LaurentPolynomial_univariate):
|
|
796
|
+
d = {(k,): v for k, v in x.monomial_coefficients().items()}
|
|
797
|
+
else:
|
|
798
|
+
d = x.monomial_coefficients()
|
|
799
|
+
x = _split_laurent_polynomial_dict_(self, P, d)
|
|
800
|
+
elif P is self.base_ring():
|
|
801
|
+
from sage.rings.polynomial.polydict import ETuple
|
|
802
|
+
mz = ETuple({}, int(self.ngens()))
|
|
803
|
+
return self.element_class(self, {mz: x}, mz)
|
|
804
|
+
elif x.is_constant() and self.has_coerce_map_from(P.base_ring()):
|
|
805
|
+
return self(x.constant_coefficient())
|
|
806
|
+
elif len(self.variable_names()) == len(P.variable_names()):
|
|
807
|
+
x = x.monomial_coefficients()
|
|
808
|
+
|
|
809
|
+
elif isinstance(x, FractionFieldElement):
|
|
810
|
+
# since the field of fraction of self is defined corresponding to
|
|
811
|
+
# the polynomial ring of self the conversion of its elements back
|
|
812
|
+
# must be treated separately (:issue:`33477`).
|
|
813
|
+
return from_fraction_field(self, x)
|
|
814
|
+
|
|
815
|
+
elif isinstance(x, LocalizationElement):
|
|
816
|
+
# see :issue:`33477`.
|
|
817
|
+
F = self.fraction_field()
|
|
818
|
+
return from_fraction_field(self, F(x))
|
|
819
|
+
|
|
820
|
+
return self.element_class(self, x)
|
|
821
|
+
|
|
822
|
+
def __reduce__(self):
|
|
823
|
+
"""
|
|
824
|
+
Used in pickling.
|
|
825
|
+
|
|
826
|
+
EXAMPLES::
|
|
827
|
+
|
|
828
|
+
sage: L = LaurentPolynomialRing(QQ, 2, 'x') # needs sage.modules
|
|
829
|
+
sage: loads(dumps(L)) == L # needs sage.modules
|
|
830
|
+
True
|
|
831
|
+
"""
|
|
832
|
+
return LaurentPolynomialRing_mpair, (self._R,)
|