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,708 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Ring of Laurent Polynomials (base class)
|
|
5
|
+
|
|
6
|
+
If `R` is a commutative ring, then the ring of Laurent polynomials in `n`
|
|
7
|
+
variables over `R` is `R[x_1^{\pm 1}, x_2^{\pm 1}, \ldots, x_n^{\pm 1}]`.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- David Roe (2008-2-23): created
|
|
12
|
+
- David Loeffler (2009-07-10): cleaned up docstrings
|
|
13
|
+
"""
|
|
14
|
+
# ****************************************************************************
|
|
15
|
+
# Copyright (C) 2008 David Roe <roed@math.harvard.edu>,
|
|
16
|
+
# William Stein <wstein@gmail.com>,
|
|
17
|
+
# Mike Hansen <mhansen@gmail.com>
|
|
18
|
+
# Vincent Delecroix <20100.delecroix@gmail.com>
|
|
19
|
+
#
|
|
20
|
+
# This program is free software: you can redistribute it and/or modify
|
|
21
|
+
# it under the terms of the GNU General Public License as published by
|
|
22
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
23
|
+
# (at your option) any later version.
|
|
24
|
+
# https://www.gnu.org/licenses/
|
|
25
|
+
# ****************************************************************************
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
from sage.rings.infinity import infinity
|
|
29
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
30
|
+
from sage.rings.ring import CommutativeRing
|
|
31
|
+
from sage.structure.parent import Parent
|
|
32
|
+
from sage.combinat.integer_vector import IntegerVectors
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class LaurentPolynomialRing_generic(CommutativeRing, Parent):
|
|
36
|
+
"""
|
|
37
|
+
Laurent polynomial ring (base class).
|
|
38
|
+
|
|
39
|
+
EXAMPLES:
|
|
40
|
+
|
|
41
|
+
This base class inherits from :class:`~sage.rings.ring.CommutativeRing`.
|
|
42
|
+
Since :issue:`11900`, it is also initialised as such::
|
|
43
|
+
|
|
44
|
+
sage: R.<x1,x2> = LaurentPolynomialRing(QQ)
|
|
45
|
+
sage: R.category()
|
|
46
|
+
Join of Category of unique factorization domains
|
|
47
|
+
and Category of algebras with basis
|
|
48
|
+
over (number fields and quotient fields and metric spaces)
|
|
49
|
+
and Category of commutative algebras
|
|
50
|
+
over (number fields and quotient fields and metric spaces)
|
|
51
|
+
and Category of infinite sets
|
|
52
|
+
sage: TestSuite(R).run()
|
|
53
|
+
"""
|
|
54
|
+
def __init__(self, R):
|
|
55
|
+
"""
|
|
56
|
+
EXAMPLES::
|
|
57
|
+
|
|
58
|
+
sage: R = LaurentPolynomialRing(QQ, 2, 'x')
|
|
59
|
+
sage: R == loads(dumps(R))
|
|
60
|
+
True
|
|
61
|
+
"""
|
|
62
|
+
self._n = R.ngens()
|
|
63
|
+
self._R = R
|
|
64
|
+
names = R.variable_names()
|
|
65
|
+
self._one_element = self.element_class(self, R.one())
|
|
66
|
+
CommutativeRing.__init__(self, R.base_ring(), names=names,
|
|
67
|
+
category=R.category())
|
|
68
|
+
ernames = []
|
|
69
|
+
for n in names:
|
|
70
|
+
ernames.append(n)
|
|
71
|
+
ernames.append(n + "inv")
|
|
72
|
+
ER = PolynomialRing(R.base_ring(), ernames)
|
|
73
|
+
self._extended_ring = ER
|
|
74
|
+
self._extended_ring_ideal = ER.ideal([ER.gen(2*i)*ER.gen(2*i+1)-1 for i in range(self._n)])
|
|
75
|
+
|
|
76
|
+
def ngens(self):
|
|
77
|
+
"""
|
|
78
|
+
Return the number of generators of ``self``.
|
|
79
|
+
|
|
80
|
+
EXAMPLES::
|
|
81
|
+
|
|
82
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').ngens()
|
|
83
|
+
2
|
|
84
|
+
sage: LaurentPolynomialRing(QQ, 1, 'x').ngens()
|
|
85
|
+
1
|
|
86
|
+
"""
|
|
87
|
+
return self._n
|
|
88
|
+
|
|
89
|
+
def gen(self, i=0):
|
|
90
|
+
r"""
|
|
91
|
+
Return the `i`-th generator of ``self``. If `i` is not specified, then
|
|
92
|
+
the first generator will be returned.
|
|
93
|
+
|
|
94
|
+
EXAMPLES::
|
|
95
|
+
|
|
96
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').gen()
|
|
97
|
+
x0
|
|
98
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').gen(0)
|
|
99
|
+
x0
|
|
100
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').gen(1)
|
|
101
|
+
x1
|
|
102
|
+
|
|
103
|
+
TESTS::
|
|
104
|
+
|
|
105
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').gen(3)
|
|
106
|
+
Traceback (most recent call last):
|
|
107
|
+
...
|
|
108
|
+
ValueError: generator not defined
|
|
109
|
+
"""
|
|
110
|
+
if i < 0 or i >= self._n:
|
|
111
|
+
raise ValueError("generator not defined")
|
|
112
|
+
try:
|
|
113
|
+
return self.__generators[i]
|
|
114
|
+
except AttributeError:
|
|
115
|
+
self.__generators = tuple(self(x) for x in self._R.gens())
|
|
116
|
+
return self.__generators[i]
|
|
117
|
+
|
|
118
|
+
def variable_names_recursive(self, depth=infinity):
|
|
119
|
+
r"""
|
|
120
|
+
Return the list of variable names of this ring and its base rings,
|
|
121
|
+
as if it were a single multi-variate Laurent polynomial.
|
|
122
|
+
|
|
123
|
+
INPUT:
|
|
124
|
+
|
|
125
|
+
- ``depth`` -- integer or :mod:`Infinity <sage.rings.infinity>`
|
|
126
|
+
|
|
127
|
+
OUTPUT: a tuple of strings
|
|
128
|
+
|
|
129
|
+
EXAMPLES::
|
|
130
|
+
|
|
131
|
+
sage: T = LaurentPolynomialRing(QQ, 'x')
|
|
132
|
+
sage: S = LaurentPolynomialRing(T, 'y')
|
|
133
|
+
sage: R = LaurentPolynomialRing(S, 'z')
|
|
134
|
+
sage: R.variable_names_recursive()
|
|
135
|
+
('x', 'y', 'z')
|
|
136
|
+
sage: R.variable_names_recursive(2)
|
|
137
|
+
('y', 'z')
|
|
138
|
+
"""
|
|
139
|
+
if depth <= 0:
|
|
140
|
+
return ()
|
|
141
|
+
if depth == 1:
|
|
142
|
+
return self.variable_names()
|
|
143
|
+
my_vars = self.variable_names()
|
|
144
|
+
try:
|
|
145
|
+
return self.base_ring().variable_names_recursive(depth - len(my_vars)) + my_vars
|
|
146
|
+
except AttributeError:
|
|
147
|
+
return my_vars
|
|
148
|
+
|
|
149
|
+
def is_integral_domain(self, proof=True):
|
|
150
|
+
"""
|
|
151
|
+
Return ``True`` if ``self`` is an integral domain.
|
|
152
|
+
|
|
153
|
+
EXAMPLES::
|
|
154
|
+
|
|
155
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').is_integral_domain()
|
|
156
|
+
True
|
|
157
|
+
|
|
158
|
+
The following used to fail; see :issue:`7530`::
|
|
159
|
+
|
|
160
|
+
sage: L = LaurentPolynomialRing(ZZ, 'X')
|
|
161
|
+
sage: L['Y']
|
|
162
|
+
Univariate Polynomial Ring in Y over
|
|
163
|
+
Univariate Laurent Polynomial Ring in X over Integer Ring
|
|
164
|
+
"""
|
|
165
|
+
return self.base_ring().is_integral_domain(proof)
|
|
166
|
+
|
|
167
|
+
def is_noetherian(self):
|
|
168
|
+
"""
|
|
169
|
+
Return ``True`` if ``self`` is Noetherian.
|
|
170
|
+
|
|
171
|
+
EXAMPLES::
|
|
172
|
+
|
|
173
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').is_noetherian()
|
|
174
|
+
True
|
|
175
|
+
"""
|
|
176
|
+
return self.base_ring().is_noetherian()
|
|
177
|
+
|
|
178
|
+
def construction(self):
|
|
179
|
+
"""
|
|
180
|
+
Return the construction of ``self``.
|
|
181
|
+
|
|
182
|
+
EXAMPLES::
|
|
183
|
+
|
|
184
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x,y').construction()
|
|
185
|
+
(LaurentPolynomialFunctor,
|
|
186
|
+
Univariate Laurent Polynomial Ring in x over Rational Field)
|
|
187
|
+
"""
|
|
188
|
+
from sage.categories.pushout import LaurentPolynomialFunctor
|
|
189
|
+
from .laurent_polynomial_ring import LaurentPolynomialRing
|
|
190
|
+
|
|
191
|
+
vars = self.variable_names()
|
|
192
|
+
if len(vars) == 1:
|
|
193
|
+
return LaurentPolynomialFunctor(vars[0], False), self.base_ring()
|
|
194
|
+
else:
|
|
195
|
+
return LaurentPolynomialFunctor(vars[-1], True), LaurentPolynomialRing(self.base_ring(), vars[:-1])
|
|
196
|
+
|
|
197
|
+
def completion(self, p=None, prec=20, extras=None):
|
|
198
|
+
r"""
|
|
199
|
+
Return the completion of ``self``.
|
|
200
|
+
|
|
201
|
+
Currently only implemented for the ring of formal Laurent series.
|
|
202
|
+
The ``prec`` variable controls the precision used in the
|
|
203
|
+
Laurent series ring. If ``prec`` is `\infty`, then this
|
|
204
|
+
returns a :class:`LazyLaurentSeriesRing`.
|
|
205
|
+
|
|
206
|
+
EXAMPLES::
|
|
207
|
+
|
|
208
|
+
sage: P.<x> = LaurentPolynomialRing(QQ); P
|
|
209
|
+
Univariate Laurent Polynomial Ring in x over Rational Field
|
|
210
|
+
sage: PP = P.completion(x); PP
|
|
211
|
+
Laurent Series Ring in x over Rational Field
|
|
212
|
+
sage: f = 1 - 1/x
|
|
213
|
+
sage: PP(f)
|
|
214
|
+
-x^-1 + 1
|
|
215
|
+
sage: g = 1 / PP(f); g
|
|
216
|
+
-x - x^2 - x^3 - x^4 - x^5 - x^6 - x^7 - x^8 - x^9 - x^10 - x^11
|
|
217
|
+
- x^12 - x^13 - x^14 - x^15 - x^16 - x^17 - x^18 - x^19 - x^20 + O(x^21)
|
|
218
|
+
sage: 1 / g
|
|
219
|
+
-x^-1 + 1 + O(x^19)
|
|
220
|
+
|
|
221
|
+
sage: # needs sage.combinat
|
|
222
|
+
sage: PP = P.completion(x, prec=oo); PP
|
|
223
|
+
Lazy Laurent Series Ring in x over Rational Field
|
|
224
|
+
sage: g = 1 / PP(f); g
|
|
225
|
+
-x - x^2 - x^3 + O(x^4)
|
|
226
|
+
sage: 1 / g == f
|
|
227
|
+
True
|
|
228
|
+
|
|
229
|
+
TESTS:
|
|
230
|
+
|
|
231
|
+
Check that the precision is taken into account (:issue:`24431`)::
|
|
232
|
+
|
|
233
|
+
sage: L = LaurentPolynomialRing(QQ, 'x')
|
|
234
|
+
sage: L.completion('x', 100).default_prec()
|
|
235
|
+
100
|
|
236
|
+
sage: L.completion('x', 20).default_prec()
|
|
237
|
+
20
|
|
238
|
+
"""
|
|
239
|
+
if p is None or str(p) == self._names[0] and self._n == 1:
|
|
240
|
+
if prec == float('inf'):
|
|
241
|
+
from sage.rings.lazy_series_ring import LazyLaurentSeriesRing
|
|
242
|
+
sparse = self.polynomial_ring().is_sparse()
|
|
243
|
+
return LazyLaurentSeriesRing(self.base_ring(), names=(self._names[0],), sparse=sparse)
|
|
244
|
+
from sage.rings.laurent_series_ring import LaurentSeriesRing
|
|
245
|
+
R = self.polynomial_ring().completion(self._names[0], prec)
|
|
246
|
+
return LaurentSeriesRing(R)
|
|
247
|
+
|
|
248
|
+
raise TypeError("cannot complete %s with respect to %s" % (self, p))
|
|
249
|
+
|
|
250
|
+
def remove_var(self, var):
|
|
251
|
+
"""
|
|
252
|
+
EXAMPLES::
|
|
253
|
+
|
|
254
|
+
sage: R = LaurentPolynomialRing(QQ,'x,y,z')
|
|
255
|
+
sage: R.remove_var('x')
|
|
256
|
+
Multivariate Laurent Polynomial Ring in y, z over Rational Field
|
|
257
|
+
sage: R.remove_var('x').remove_var('y')
|
|
258
|
+
Univariate Laurent Polynomial Ring in z over Rational Field
|
|
259
|
+
"""
|
|
260
|
+
from .laurent_polynomial_ring import LaurentPolynomialRing
|
|
261
|
+
|
|
262
|
+
vars = list(self.variable_names())
|
|
263
|
+
vars.remove(str(var))
|
|
264
|
+
return LaurentPolynomialRing(self.base_ring(), vars)
|
|
265
|
+
|
|
266
|
+
def _coerce_map_from_(self, R):
|
|
267
|
+
"""
|
|
268
|
+
EXAMPLES::
|
|
269
|
+
|
|
270
|
+
sage: L.<x,y> = LaurentPolynomialRing(QQ)
|
|
271
|
+
sage: L.coerce_map_from(QQ)
|
|
272
|
+
Generic morphism:
|
|
273
|
+
From: Rational Field
|
|
274
|
+
To: Multivariate Laurent Polynomial Ring in x, y over Rational Field
|
|
275
|
+
|
|
276
|
+
Let us check that coercion between Laurent Polynomials over
|
|
277
|
+
different base rings works (:issue:`15345`)::
|
|
278
|
+
|
|
279
|
+
sage: R = LaurentPolynomialRing(ZZ, 'x')
|
|
280
|
+
sage: T = LaurentPolynomialRing(QQ, 'x')
|
|
281
|
+
sage: R.gen() + 3*T.gen()
|
|
282
|
+
4*x
|
|
283
|
+
"""
|
|
284
|
+
if R is self._R:
|
|
285
|
+
return self._generic_coerce_map(R)
|
|
286
|
+
f = self._coerce_map_via([self._R], R)
|
|
287
|
+
if f is not None:
|
|
288
|
+
return f
|
|
289
|
+
if (isinstance(R, LaurentPolynomialRing_generic)
|
|
290
|
+
and self._R.has_coerce_map_from(R._R)):
|
|
291
|
+
return self._generic_coerce_map(R)
|
|
292
|
+
|
|
293
|
+
def __eq__(self, right):
|
|
294
|
+
"""
|
|
295
|
+
Check whether ``self`` is equal to ``right``.
|
|
296
|
+
|
|
297
|
+
EXAMPLES::
|
|
298
|
+
|
|
299
|
+
sage: R = LaurentPolynomialRing(QQ,'x,y,z')
|
|
300
|
+
sage: P = LaurentPolynomialRing(ZZ,'x,y,z')
|
|
301
|
+
sage: Q = LaurentPolynomialRing(QQ,'x,y')
|
|
302
|
+
|
|
303
|
+
sage: R == R
|
|
304
|
+
True
|
|
305
|
+
sage: R == Q
|
|
306
|
+
False
|
|
307
|
+
sage: Q == P
|
|
308
|
+
False
|
|
309
|
+
sage: P == R
|
|
310
|
+
False
|
|
311
|
+
"""
|
|
312
|
+
if type(self) is not type(right):
|
|
313
|
+
return False
|
|
314
|
+
return self._R == right._R
|
|
315
|
+
|
|
316
|
+
def __ne__(self, other):
|
|
317
|
+
"""
|
|
318
|
+
Check whether ``self`` is not equal to ``other``.
|
|
319
|
+
|
|
320
|
+
EXAMPLES::
|
|
321
|
+
|
|
322
|
+
sage: R = LaurentPolynomialRing(QQ,'x,y,z')
|
|
323
|
+
sage: P = LaurentPolynomialRing(ZZ,'x,y,z')
|
|
324
|
+
sage: Q = LaurentPolynomialRing(QQ,'x,y')
|
|
325
|
+
|
|
326
|
+
sage: R != R
|
|
327
|
+
False
|
|
328
|
+
sage: R != Q
|
|
329
|
+
True
|
|
330
|
+
sage: Q != P
|
|
331
|
+
True
|
|
332
|
+
sage: P != R
|
|
333
|
+
True
|
|
334
|
+
"""
|
|
335
|
+
return not (self == other)
|
|
336
|
+
|
|
337
|
+
def __hash__(self):
|
|
338
|
+
"""
|
|
339
|
+
Return the hash of ``self``.
|
|
340
|
+
|
|
341
|
+
EXAMPLES::
|
|
342
|
+
|
|
343
|
+
sage: h1 = hash(LaurentPolynomialRing(ZZ,'x,y,z'))
|
|
344
|
+
sage: h2 = hash(LaurentPolynomialRing(ZZ,'x,y,z'))
|
|
345
|
+
sage: h3 = hash(LaurentPolynomialRing(QQ,'x,y,z'))
|
|
346
|
+
sage: h4 = hash(LaurentPolynomialRing(ZZ,'x,y'))
|
|
347
|
+
sage: h1 == h2 and h1 != h3 and h1 != h4
|
|
348
|
+
True
|
|
349
|
+
"""
|
|
350
|
+
return hash(self._R) ^ 12059065606945654693
|
|
351
|
+
|
|
352
|
+
def _latex_(self):
|
|
353
|
+
r"""
|
|
354
|
+
EXAMPLES::
|
|
355
|
+
|
|
356
|
+
sage: latex(LaurentPolynomialRing(QQ, 2, 'x'))
|
|
357
|
+
\Bold{Q}[x_{0}^{\pm 1}, x_{1}^{\pm 1}]
|
|
358
|
+
"""
|
|
359
|
+
from sage.misc.latex import latex
|
|
360
|
+
|
|
361
|
+
vars = ', '.join(a + r'^{\pm 1}' for a in self.latex_variable_names())
|
|
362
|
+
return "%s[%s]" % (latex(self.base_ring()), vars)
|
|
363
|
+
|
|
364
|
+
def _ideal_class_(self, n=0):
|
|
365
|
+
"""
|
|
366
|
+
EXAMPLES::
|
|
367
|
+
|
|
368
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x')._ideal_class_()
|
|
369
|
+
Traceback (most recent call last):
|
|
370
|
+
...
|
|
371
|
+
NotImplementedError
|
|
372
|
+
"""
|
|
373
|
+
# One may eventually want ideal classes in these guys.
|
|
374
|
+
raise NotImplementedError
|
|
375
|
+
|
|
376
|
+
def ideal(self, *args, **kwds):
|
|
377
|
+
"""
|
|
378
|
+
EXAMPLES::
|
|
379
|
+
|
|
380
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').ideal([1])
|
|
381
|
+
Ideal (1) of Multivariate Laurent Polynomial Ring in x0, x1 over Rational Field
|
|
382
|
+
|
|
383
|
+
TESTS:
|
|
384
|
+
|
|
385
|
+
check that :issue:`26421` is fixed::
|
|
386
|
+
|
|
387
|
+
sage: R.<t> = LaurentPolynomialRing(ZZ)
|
|
388
|
+
sage: P.<x> = PolynomialRing(R)
|
|
389
|
+
sage: p = x-t
|
|
390
|
+
sage: p.content_ideal() # indirect doctest
|
|
391
|
+
Ideal (-t, 1) of Univariate Laurent Polynomial Ring in t over Integer Ring
|
|
392
|
+
"""
|
|
393
|
+
from sage.rings.polynomial.laurent_polynomial_ideal import LaurentPolynomialIdeal
|
|
394
|
+
return LaurentPolynomialIdeal(self, *args, **kwds)
|
|
395
|
+
|
|
396
|
+
def _is_valid_homomorphism_(self, codomain, im_gens, base_map=None):
|
|
397
|
+
"""
|
|
398
|
+
EXAMPLES::
|
|
399
|
+
|
|
400
|
+
sage: # needs sage.rings.number_field
|
|
401
|
+
sage: T.<t> = ZZ[]
|
|
402
|
+
sage: K.<i> = NumberField(t^2 + 1)
|
|
403
|
+
sage: L.<x,y> = LaurentPolynomialRing(K)
|
|
404
|
+
sage: L._is_valid_homomorphism_(K, (K(1/2), K(3/2)))
|
|
405
|
+
True
|
|
406
|
+
sage: Q5 = Qp(5); i5 = Q5(-1).sqrt() # needs sage.rings.padics
|
|
407
|
+
sage: L._is_valid_homomorphism_(Q5, (Q5(1/2), Q5(3/2))) # no coercion # needs sage.rings.padics
|
|
408
|
+
False
|
|
409
|
+
sage: L._is_valid_homomorphism_(Q5, (Q5(1/2), Q5(3/2)), base_map=K.hom([i5])) # needs sage.rings.padics
|
|
410
|
+
True
|
|
411
|
+
"""
|
|
412
|
+
if base_map is None and not codomain.has_coerce_map_from(self.base_ring()):
|
|
413
|
+
# we need that elements of the base ring
|
|
414
|
+
# canonically coerce into codomain.
|
|
415
|
+
return False
|
|
416
|
+
for a in im_gens:
|
|
417
|
+
# in addition, the image of each generator must be invertible.
|
|
418
|
+
if not a.is_unit():
|
|
419
|
+
return False
|
|
420
|
+
return True
|
|
421
|
+
|
|
422
|
+
def term_order(self):
|
|
423
|
+
"""
|
|
424
|
+
Return the term order of ``self``.
|
|
425
|
+
|
|
426
|
+
EXAMPLES::
|
|
427
|
+
|
|
428
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').term_order()
|
|
429
|
+
Degree reverse lexicographic term order
|
|
430
|
+
"""
|
|
431
|
+
return self._R.term_order()
|
|
432
|
+
|
|
433
|
+
def is_finite(self):
|
|
434
|
+
"""
|
|
435
|
+
EXAMPLES::
|
|
436
|
+
|
|
437
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').is_finite()
|
|
438
|
+
False
|
|
439
|
+
"""
|
|
440
|
+
return False
|
|
441
|
+
|
|
442
|
+
def is_field(self, proof=True):
|
|
443
|
+
"""
|
|
444
|
+
EXAMPLES::
|
|
445
|
+
|
|
446
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').is_field()
|
|
447
|
+
False
|
|
448
|
+
"""
|
|
449
|
+
return False
|
|
450
|
+
|
|
451
|
+
def polynomial_ring(self):
|
|
452
|
+
"""
|
|
453
|
+
Return the polynomial ring associated with ``self``.
|
|
454
|
+
|
|
455
|
+
EXAMPLES::
|
|
456
|
+
|
|
457
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').polynomial_ring()
|
|
458
|
+
Multivariate Polynomial Ring in x0, x1 over Rational Field
|
|
459
|
+
sage: LaurentPolynomialRing(QQ, 1, 'x').polynomial_ring()
|
|
460
|
+
Multivariate Polynomial Ring in x over Rational Field
|
|
461
|
+
"""
|
|
462
|
+
return self._R
|
|
463
|
+
|
|
464
|
+
def characteristic(self):
|
|
465
|
+
"""
|
|
466
|
+
Return the characteristic of the base ring.
|
|
467
|
+
|
|
468
|
+
EXAMPLES::
|
|
469
|
+
|
|
470
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').characteristic()
|
|
471
|
+
0
|
|
472
|
+
sage: LaurentPolynomialRing(GF(3), 2, 'x').characteristic()
|
|
473
|
+
3
|
|
474
|
+
"""
|
|
475
|
+
return self.base_ring().characteristic()
|
|
476
|
+
|
|
477
|
+
def krull_dimension(self):
|
|
478
|
+
"""
|
|
479
|
+
EXAMPLES::
|
|
480
|
+
|
|
481
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').krull_dimension()
|
|
482
|
+
Traceback (most recent call last):
|
|
483
|
+
...
|
|
484
|
+
NotImplementedError
|
|
485
|
+
"""
|
|
486
|
+
raise NotImplementedError
|
|
487
|
+
|
|
488
|
+
def random_element(self, min_valuation=-2, max_degree=2, *args, **kwds):
|
|
489
|
+
"""
|
|
490
|
+
Return a random polynomial with degree at most ``max_degree`` and
|
|
491
|
+
lowest valuation at least ``min_valuation``.
|
|
492
|
+
|
|
493
|
+
Uses the random sampling from the base polynomial ring then divides out
|
|
494
|
+
by a monomial to ensure correct ``max_degree`` and ``min_valuation``.
|
|
495
|
+
|
|
496
|
+
INPUT:
|
|
497
|
+
|
|
498
|
+
- ``min_valuation`` -- integer (default: `-2`); the
|
|
499
|
+
minimal allowed valuation of the polynomial
|
|
500
|
+
|
|
501
|
+
- ``max_degree`` -- integer (default: `2`); the
|
|
502
|
+
maximal allowed degree of the polynomial
|
|
503
|
+
|
|
504
|
+
- ``*args``, ``**kwds`` -- passed to the random element generator of the
|
|
505
|
+
base polynomial ring and base ring itself
|
|
506
|
+
|
|
507
|
+
EXAMPLES::
|
|
508
|
+
|
|
509
|
+
sage: L.<x> = LaurentPolynomialRing(QQ)
|
|
510
|
+
sage: f = L.random_element()
|
|
511
|
+
sage: f.degree() <= 2
|
|
512
|
+
True
|
|
513
|
+
sage: f.valuation() >= -2
|
|
514
|
+
True
|
|
515
|
+
sage: f.parent() is L
|
|
516
|
+
True
|
|
517
|
+
|
|
518
|
+
::
|
|
519
|
+
|
|
520
|
+
sage: L = LaurentPolynomialRing(ZZ, 2, 'x')
|
|
521
|
+
sage: f = L.random_element(10, 20)
|
|
522
|
+
sage: f.degree() <= 20
|
|
523
|
+
True
|
|
524
|
+
sage: f.valuation() >= 10
|
|
525
|
+
True
|
|
526
|
+
sage: f.parent() is L
|
|
527
|
+
True
|
|
528
|
+
|
|
529
|
+
::
|
|
530
|
+
|
|
531
|
+
sage: L = LaurentPolynomialRing(GF(13), 3, 'x')
|
|
532
|
+
sage: f = L.random_element(-10, -1)
|
|
533
|
+
sage: f.degree() <= -1
|
|
534
|
+
True
|
|
535
|
+
sage: f.valuation() >= -10
|
|
536
|
+
True
|
|
537
|
+
sage: f.parent() is L
|
|
538
|
+
True
|
|
539
|
+
|
|
540
|
+
::
|
|
541
|
+
|
|
542
|
+
sage: L.<x, y> = LaurentPolynomialRing(RR)
|
|
543
|
+
sage: f = L.random_element()
|
|
544
|
+
sage: f.degree() <= 2
|
|
545
|
+
True
|
|
546
|
+
sage: f.valuation() >= -2
|
|
547
|
+
True
|
|
548
|
+
sage: f.parent() is L
|
|
549
|
+
True
|
|
550
|
+
|
|
551
|
+
::
|
|
552
|
+
|
|
553
|
+
sage: # needs sage.rings.number_field
|
|
554
|
+
sage: L = LaurentPolynomialRing(QQbar, 5, 'x')
|
|
555
|
+
sage: f = L.random_element(-1, 1)
|
|
556
|
+
sage: f = L.random_element(-1, 1)
|
|
557
|
+
sage: f.degree() <= 1
|
|
558
|
+
True
|
|
559
|
+
sage: f.valuation() >= -1
|
|
560
|
+
True
|
|
561
|
+
sage: f.parent() is L
|
|
562
|
+
True
|
|
563
|
+
|
|
564
|
+
TESTS:
|
|
565
|
+
|
|
566
|
+
Ensure everything works for the multivariate case with only
|
|
567
|
+
one generator::
|
|
568
|
+
|
|
569
|
+
sage: L = LaurentPolynomialRing(ZZ, 1, 'x')
|
|
570
|
+
sage: f = L.random_element(10, 20)
|
|
571
|
+
sage: f.degree() <= 20
|
|
572
|
+
True
|
|
573
|
+
sage: f.valuation() >= 10
|
|
574
|
+
True
|
|
575
|
+
sage: f.parent() is L
|
|
576
|
+
True
|
|
577
|
+
|
|
578
|
+
Test for constructions which use multivariate polynomial rings::
|
|
579
|
+
|
|
580
|
+
sage: rings = [RR, QQ, ZZ, GF(13)]
|
|
581
|
+
sage: rings += [GF(7^3)] # needs sage.rings.finite_rings
|
|
582
|
+
sage: for ring in rings:
|
|
583
|
+
....: d = randint(1, 6)
|
|
584
|
+
....: t = randint(5, 20)
|
|
585
|
+
....: L = LaurentPolynomialRing(ring, d, 'x')
|
|
586
|
+
....: for _ in range(100):
|
|
587
|
+
....: n, m = randint(-10, 10), randint(-10, 10)
|
|
588
|
+
....: if n > m:
|
|
589
|
+
....: n, m = m, n
|
|
590
|
+
....: f = L.random_element(n, m, terms=t)
|
|
591
|
+
....: if f.is_zero(): continue # the zero polynomial is defined to have degree -1
|
|
592
|
+
....: assert len(list(f)) <= t
|
|
593
|
+
....: assert f.degree() <= m
|
|
594
|
+
....: assert f.valuation() >= n
|
|
595
|
+
|
|
596
|
+
Test for constructions which use univariate polynomial rings::
|
|
597
|
+
|
|
598
|
+
sage: rings = [RR, QQ, ZZ, GF(13)]
|
|
599
|
+
sage: rings += [GF(7^3)] # needs sage.rings.finite_rings
|
|
600
|
+
sage: for ring in rings:
|
|
601
|
+
....: L.<x> = LaurentPolynomialRing(ring)
|
|
602
|
+
....: for _ in range(100):
|
|
603
|
+
....: n, m = randint(-10, 10), randint(-10, 10)
|
|
604
|
+
....: if n > m:
|
|
605
|
+
....: n, m = m, n
|
|
606
|
+
....: f = L.random_element(n, m)
|
|
607
|
+
....: if f.is_zero(): continue # the zero polynomial is defined to have degree -1
|
|
608
|
+
....: for x in L.gens():
|
|
609
|
+
....: assert f.degree() <= m
|
|
610
|
+
....: assert f.valuation() >= n
|
|
611
|
+
|
|
612
|
+
The ``max_degree`` must be greater than or equal to ``min_valuation``::
|
|
613
|
+
|
|
614
|
+
sage: L.<x> = LaurentPolynomialRing(QQ)
|
|
615
|
+
sage: f = L.random_element(1, -1)
|
|
616
|
+
Traceback (most recent call last):
|
|
617
|
+
...
|
|
618
|
+
ValueError: `max_degree` must be greater than or equal to `min_valuation`
|
|
619
|
+
"""
|
|
620
|
+
# Ensure the degree parameters are sensible
|
|
621
|
+
if max_degree < min_valuation:
|
|
622
|
+
raise ValueError("`max_degree` must be greater than or equal to `min_valuation`")
|
|
623
|
+
|
|
624
|
+
# Sample a polynomial in the base ring of degree `max_degree - min_valuation`
|
|
625
|
+
abs_deg = (max_degree - min_valuation)
|
|
626
|
+
f_rand = self._R.random_element(degree=abs_deg, *args, **kwds)
|
|
627
|
+
|
|
628
|
+
# Cast this polynomial back the ``self``
|
|
629
|
+
f = self(f_rand)
|
|
630
|
+
|
|
631
|
+
# For the univariate case we simply shift by x**min_valuation
|
|
632
|
+
if self._n == 1:
|
|
633
|
+
# When there is one generator we either have a univariate class
|
|
634
|
+
# and can shift by min_valuation
|
|
635
|
+
try:
|
|
636
|
+
return f.shift(min_valuation)
|
|
637
|
+
# Or we have a multivariate class with one variable, which does not
|
|
638
|
+
# have the shift method
|
|
639
|
+
except AttributeError:
|
|
640
|
+
return f * self.gen() ** min_valuation
|
|
641
|
+
|
|
642
|
+
# For the multivariate case, we sample a single monomial of degree
|
|
643
|
+
# exactly min_valuation and then use this to shift the polynomial
|
|
644
|
+
# into the correct bounds
|
|
645
|
+
s = self.monomial(*IntegerVectors(abs(min_valuation), self._n).random_element())
|
|
646
|
+
if min_valuation < 0:
|
|
647
|
+
s = ~s
|
|
648
|
+
return f * s
|
|
649
|
+
|
|
650
|
+
def is_exact(self):
|
|
651
|
+
"""
|
|
652
|
+
Return ``True`` if the base ring is exact.
|
|
653
|
+
|
|
654
|
+
EXAMPLES::
|
|
655
|
+
|
|
656
|
+
sage: LaurentPolynomialRing(QQ, 2, 'x').is_exact()
|
|
657
|
+
True
|
|
658
|
+
sage: LaurentPolynomialRing(RDF, 2, 'x').is_exact()
|
|
659
|
+
False
|
|
660
|
+
"""
|
|
661
|
+
return self.base_ring().is_exact()
|
|
662
|
+
|
|
663
|
+
def change_ring(self, base_ring=None, names=None, sparse=False, order=None):
|
|
664
|
+
"""
|
|
665
|
+
EXAMPLES::
|
|
666
|
+
|
|
667
|
+
sage: R = LaurentPolynomialRing(QQ, 2, 'x')
|
|
668
|
+
sage: R.change_ring(ZZ)
|
|
669
|
+
Multivariate Laurent Polynomial Ring in x0, x1 over Integer Ring
|
|
670
|
+
|
|
671
|
+
Check that the distinction between a univariate ring and a multivariate ring with one
|
|
672
|
+
generator is preserved::
|
|
673
|
+
|
|
674
|
+
sage: P.<x> = LaurentPolynomialRing(QQ, 1)
|
|
675
|
+
sage: P
|
|
676
|
+
Multivariate Laurent Polynomial Ring in x over Rational Field
|
|
677
|
+
sage: K.<i> = CyclotomicField(4) # needs sage.rings.number_field
|
|
678
|
+
sage: P.change_ring(K) # needs sage.rings.number_field
|
|
679
|
+
Multivariate Laurent Polynomial Ring in x over
|
|
680
|
+
Cyclotomic Field of order 4 and degree 2
|
|
681
|
+
"""
|
|
682
|
+
from .laurent_polynomial_ring import LaurentPolynomialRing, LaurentPolynomialRing_univariate
|
|
683
|
+
|
|
684
|
+
if base_ring is None:
|
|
685
|
+
base_ring = self.base_ring()
|
|
686
|
+
if names is None:
|
|
687
|
+
names = self.variable_names()
|
|
688
|
+
if isinstance(self, LaurentPolynomialRing_univariate):
|
|
689
|
+
return LaurentPolynomialRing(base_ring, names[0], sparse=sparse)
|
|
690
|
+
|
|
691
|
+
if order is None:
|
|
692
|
+
order = self.polynomial_ring().term_order()
|
|
693
|
+
return LaurentPolynomialRing(base_ring, self._n, names, order=order)
|
|
694
|
+
|
|
695
|
+
def fraction_field(self):
|
|
696
|
+
"""
|
|
697
|
+
The fraction field is the same as the fraction field of the
|
|
698
|
+
polynomial ring.
|
|
699
|
+
|
|
700
|
+
EXAMPLES::
|
|
701
|
+
|
|
702
|
+
sage: L.<x> = LaurentPolynomialRing(QQ)
|
|
703
|
+
sage: L.fraction_field()
|
|
704
|
+
Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
705
|
+
sage: (x^-1 + 2) / (x - 1)
|
|
706
|
+
(2*x + 1)/(x^2 - x)
|
|
707
|
+
"""
|
|
708
|
+
return self.polynomial_ring().fraction_field()
|