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,947 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Multivariate Polynomial Rings over Generic Rings
|
|
4
|
+
|
|
5
|
+
Sage implements multivariate polynomial rings through several
|
|
6
|
+
backends. This generic implementation uses the classes ``PolyDict``
|
|
7
|
+
and ``ETuple`` to construct a dictionary with exponent tuples as keys
|
|
8
|
+
and coefficients as values.
|
|
9
|
+
|
|
10
|
+
AUTHORS:
|
|
11
|
+
|
|
12
|
+
- David Joyner and William Stein
|
|
13
|
+
|
|
14
|
+
- Kiran S. Kedlaya (2006-02-12): added Macaulay2 analogues of Singular
|
|
15
|
+
features
|
|
16
|
+
|
|
17
|
+
- Martin Albrecht (2006-04-21): reorganize class hierarchy for singular
|
|
18
|
+
rep
|
|
19
|
+
|
|
20
|
+
- Martin Albrecht (2007-04-20): reorganized class hierarchy to support
|
|
21
|
+
Pyrex implementations
|
|
22
|
+
|
|
23
|
+
- Robert Bradshaw (2007-08-15): Coercions from rings in a subset of
|
|
24
|
+
the variables.
|
|
25
|
+
|
|
26
|
+
EXAMPLES:
|
|
27
|
+
|
|
28
|
+
We construct the Frobenius morphism on `\GF{5}[x,y,z]` over
|
|
29
|
+
`\GF{5}`::
|
|
30
|
+
|
|
31
|
+
sage: R.<x,y,z> = GF(5)[]
|
|
32
|
+
sage: frob = R.hom([x^5, y^5, z^5])
|
|
33
|
+
sage: frob(x^2 + 2*y - z^4)
|
|
34
|
+
-z^20 + x^10 + 2*y^5
|
|
35
|
+
sage: frob((x + 2*y)^3) # needs sage.rings.finite_rings
|
|
36
|
+
x^15 + x^10*y^5 + 2*x^5*y^10 - 2*y^15
|
|
37
|
+
sage: (x^5 + 2*y^5)^3 # needs sage.rings.finite_rings
|
|
38
|
+
x^15 + x^10*y^5 + 2*x^5*y^10 - 2*y^15
|
|
39
|
+
|
|
40
|
+
We make a polynomial ring in one variable over a polynomial ring in
|
|
41
|
+
two variables::
|
|
42
|
+
|
|
43
|
+
sage: R.<x, y> = PolynomialRing(QQ, 2)
|
|
44
|
+
sage: S.<t> = PowerSeriesRing(R)
|
|
45
|
+
sage: t*(x+y)
|
|
46
|
+
(x + y)*t
|
|
47
|
+
|
|
48
|
+
TESTS::
|
|
49
|
+
|
|
50
|
+
sage: PolynomialRing(GF(5), 3, 'xyz').objgens()
|
|
51
|
+
(Multivariate Polynomial Ring in x, y, z over Finite Field of size 5,
|
|
52
|
+
(x, y, z))
|
|
53
|
+
"""
|
|
54
|
+
# ****************************************************************************
|
|
55
|
+
# Copyright (C) 2005 William Stein <wstein@gmail.com>
|
|
56
|
+
#
|
|
57
|
+
# This program is free software: you can redistribute it and/or modify
|
|
58
|
+
# it under the terms of the GNU General Public License as published by
|
|
59
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
60
|
+
# (at your option) any later version.
|
|
61
|
+
# https://www.gnu.org/licenses/
|
|
62
|
+
# ****************************************************************************
|
|
63
|
+
|
|
64
|
+
import sage.rings.fraction_field_element as fraction_field_element
|
|
65
|
+
|
|
66
|
+
from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base, is_MPolynomialRing
|
|
67
|
+
from sage.rings.polynomial.polynomial_singular_interface import PolynomialRing_singular_repr
|
|
68
|
+
from sage.rings.polynomial.polydict import PolyDict, ETuple
|
|
69
|
+
from sage.rings.polynomial.term_order import TermOrder
|
|
70
|
+
import sage.interfaces.abc
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
from cypari2.gen import Gen as pari_gen
|
|
74
|
+
except ImportError:
|
|
75
|
+
pari_gen = ()
|
|
76
|
+
|
|
77
|
+
from sage.structure.element import Element
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class MPolynomialRing_macaulay2_repr:
|
|
81
|
+
"""
|
|
82
|
+
A mixin class for polynomial rings that support conversion to Macaulay2.
|
|
83
|
+
"""
|
|
84
|
+
def _macaulay2_init_(self, macaulay2=None):
|
|
85
|
+
"""
|
|
86
|
+
EXAMPLES::
|
|
87
|
+
|
|
88
|
+
sage: PolynomialRing(QQ, 'x', 2, implementation='generic')._macaulay2_init_() # optional - macaulay2
|
|
89
|
+
'sage...[symbol x0,symbol x1, MonomialSize=>16, MonomialOrder=>GRevLex]'
|
|
90
|
+
"""
|
|
91
|
+
if macaulay2 is None:
|
|
92
|
+
from sage.interfaces.macaulay2 import macaulay2 as m2_default
|
|
93
|
+
macaulay2 = m2_default
|
|
94
|
+
return macaulay2._macaulay2_input_ring(self.base_ring(), self.gens(),
|
|
95
|
+
self.term_order().macaulay2_str())
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class MPolynomialRing_polydict(MPolynomialRing_macaulay2_repr, PolynomialRing_singular_repr, MPolynomialRing_base):
|
|
99
|
+
"""
|
|
100
|
+
Multivariable polynomial ring.
|
|
101
|
+
|
|
102
|
+
EXAMPLES::
|
|
103
|
+
|
|
104
|
+
sage: R = PolynomialRing(Integers(12), 'x', 5); R
|
|
105
|
+
Multivariate Polynomial Ring in x0, x1, x2, x3, x4 over Ring of integers modulo 12
|
|
106
|
+
sage: loads(R.dumps()) == R
|
|
107
|
+
True
|
|
108
|
+
"""
|
|
109
|
+
from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict as Element_hidden
|
|
110
|
+
# should be just Element, once polynomial use new coercion framework
|
|
111
|
+
|
|
112
|
+
def __init__(self, base_ring, n, names, order):
|
|
113
|
+
from sage.rings.polynomial.polynomial_singular_interface import can_convert_to_singular
|
|
114
|
+
order = TermOrder(order, n)
|
|
115
|
+
# MPolynomialRing_base.__init__() normally initialises the base ring,
|
|
116
|
+
# but it also needs the generators to construct a coercion map from the
|
|
117
|
+
# base ring, and the base ring must be set to initialise the generators.
|
|
118
|
+
# We set the base ring manually to break this circular dependency.
|
|
119
|
+
self._base = base_ring
|
|
120
|
+
# Construct the generators
|
|
121
|
+
v = [0] * n
|
|
122
|
+
one = base_ring.one()
|
|
123
|
+
self._gens = []
|
|
124
|
+
for i in range(n):
|
|
125
|
+
v[i] = 1 # int's!
|
|
126
|
+
self._gens.append(self.Element_hidden(self, {tuple(v): one}))
|
|
127
|
+
v[i] = 0
|
|
128
|
+
self._gens = tuple(self._gens)
|
|
129
|
+
self._zero_tuple = tuple(v)
|
|
130
|
+
MPolynomialRing_base.__init__(self, base_ring, n, names, order)
|
|
131
|
+
self._has_singular = can_convert_to_singular(self)
|
|
132
|
+
|
|
133
|
+
def _monomial_order_function(self):
|
|
134
|
+
return self.__monomial_order_function
|
|
135
|
+
|
|
136
|
+
def __eq__(self, other):
|
|
137
|
+
"""
|
|
138
|
+
Check whether ``self`` is equal to ``other``.
|
|
139
|
+
|
|
140
|
+
EXAMPLES::
|
|
141
|
+
|
|
142
|
+
sage: R = PolynomialRing(Integers(10), 'x', 4)
|
|
143
|
+
sage: loads(R.dumps()) == R
|
|
144
|
+
True
|
|
145
|
+
"""
|
|
146
|
+
if not isinstance(other, MPolynomialRing_base):
|
|
147
|
+
return False
|
|
148
|
+
return ((self.base_ring(), self.ngens(),
|
|
149
|
+
self.variable_names(), self.term_order()) ==
|
|
150
|
+
(other.base_ring(), other.ngens(),
|
|
151
|
+
other.variable_names(), other.term_order()))
|
|
152
|
+
|
|
153
|
+
def __ne__(self, other):
|
|
154
|
+
"""
|
|
155
|
+
Check whether ``self`` is not equal to ``other``.
|
|
156
|
+
|
|
157
|
+
EXAMPLES::
|
|
158
|
+
|
|
159
|
+
sage: R = PolynomialRing(Integers(8), 'x', 3)
|
|
160
|
+
sage: loads(R.dumps()) != R
|
|
161
|
+
False
|
|
162
|
+
"""
|
|
163
|
+
return not (self == other)
|
|
164
|
+
|
|
165
|
+
def __hash__(self):
|
|
166
|
+
"""
|
|
167
|
+
Compute the hash of ``self``.
|
|
168
|
+
|
|
169
|
+
EXAMPLES::
|
|
170
|
+
|
|
171
|
+
sage: h = hash(PolynomialRing(Integers(8), 'x', 3))
|
|
172
|
+
"""
|
|
173
|
+
return hash((self.base_ring(), self.ngens(),
|
|
174
|
+
self.variable_names(), self.term_order()))
|
|
175
|
+
|
|
176
|
+
def __call__(self, x=0, check=True):
|
|
177
|
+
"""
|
|
178
|
+
Convert ``x`` to an element of this multivariate polynomial ring,
|
|
179
|
+
possibly non-canonically.
|
|
180
|
+
|
|
181
|
+
EXAMPLES:
|
|
182
|
+
|
|
183
|
+
We create a Macaulay2 multivariate polynomial via ideal
|
|
184
|
+
arithmetic, then convert it into R.
|
|
185
|
+
|
|
186
|
+
::
|
|
187
|
+
|
|
188
|
+
sage: R.<x,y> = PolynomialRing(QQ, 2)
|
|
189
|
+
sage: I = R.ideal([x^3 + y, y])
|
|
190
|
+
sage: S = I._macaulay2_() # optional - macaulay2
|
|
191
|
+
sage: T = S*S*S # optional - macaulay2
|
|
192
|
+
sage: U = T.gens().entries().flatten() # optional - macaulay2
|
|
193
|
+
sage: f = U[2]; f # optional - macaulay2
|
|
194
|
+
6 3 2 3
|
|
195
|
+
x y + 2x y + y
|
|
196
|
+
sage: R(f.external_string()) # optional - macaulay2
|
|
197
|
+
x^6*y + 2*x^3*y^2 + y^3
|
|
198
|
+
|
|
199
|
+
Some other subtle conversions. We create polynomial rings in 2
|
|
200
|
+
variables over the rationals, integers, and a finite field.
|
|
201
|
+
|
|
202
|
+
::
|
|
203
|
+
|
|
204
|
+
sage: R.<x,y> = QQ[]
|
|
205
|
+
sage: S.<x,y> = ZZ[]
|
|
206
|
+
sage: T.<x,y> = GF(7)[]
|
|
207
|
+
|
|
208
|
+
We convert from integer polynomials to rational polynomials,
|
|
209
|
+
and back::
|
|
210
|
+
|
|
211
|
+
sage: f = R(S.0^2 - 4*S.1^3); f
|
|
212
|
+
-4*y^3 + x^2
|
|
213
|
+
sage: parent(f)
|
|
214
|
+
Multivariate Polynomial Ring in x, y over Rational Field
|
|
215
|
+
sage: parent(S(f))
|
|
216
|
+
Multivariate Polynomial Ring in x, y over Integer Ring
|
|
217
|
+
|
|
218
|
+
We convert from polynomials over the finite field.
|
|
219
|
+
|
|
220
|
+
::
|
|
221
|
+
|
|
222
|
+
sage: f = R(T.0^2 - 4*T.1^3); f
|
|
223
|
+
3*y^3 + x^2
|
|
224
|
+
sage: parent(f)
|
|
225
|
+
Multivariate Polynomial Ring in x, y over Rational Field
|
|
226
|
+
|
|
227
|
+
We dump and load the polynomial ring S::
|
|
228
|
+
|
|
229
|
+
sage: S2 = loads(dumps(S))
|
|
230
|
+
sage: S2 == S
|
|
231
|
+
True
|
|
232
|
+
|
|
233
|
+
Coerce works and gets the right parent.
|
|
234
|
+
|
|
235
|
+
::
|
|
236
|
+
|
|
237
|
+
sage: parent(S2.coerce(S.0)) is S2
|
|
238
|
+
True
|
|
239
|
+
|
|
240
|
+
Conversion to reduce modulo a prime between rings with different
|
|
241
|
+
variable names::
|
|
242
|
+
|
|
243
|
+
sage: R.<x,y> = PolynomialRing(QQ,2)
|
|
244
|
+
sage: S.<a,b> = PolynomialRing(GF(7),2)
|
|
245
|
+
sage: f = x^2 + 2/3*y^3
|
|
246
|
+
sage: S(f)
|
|
247
|
+
3*b^3 + a^2
|
|
248
|
+
|
|
249
|
+
Conversion from symbolic variables::
|
|
250
|
+
|
|
251
|
+
sage: # needs sage.symbolic
|
|
252
|
+
sage: x,y,z = var('x,y,z')
|
|
253
|
+
sage: R = QQ['x,y,z']
|
|
254
|
+
sage: type(x)
|
|
255
|
+
<class 'sage.symbolic.expression.Expression'>
|
|
256
|
+
sage: type(R(x))
|
|
257
|
+
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
|
|
258
|
+
sage: f = R(x^3 + y^3 - z^3); f
|
|
259
|
+
x^3 + y^3 - z^3
|
|
260
|
+
sage: type(f)
|
|
261
|
+
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
|
|
262
|
+
sage: parent(f)
|
|
263
|
+
Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
264
|
+
|
|
265
|
+
A more complicated symbolic and computational mix. Behind the
|
|
266
|
+
scenes Singular and Maxima are doing the real work.
|
|
267
|
+
|
|
268
|
+
::
|
|
269
|
+
|
|
270
|
+
sage: # needs sage.symbolic
|
|
271
|
+
sage: R = QQ['x,y,z']
|
|
272
|
+
sage: f = (x^3 + y^3 - z^3)^10; f
|
|
273
|
+
(x^3 + y^3 - z^3)^10
|
|
274
|
+
sage: g = R(f); parent(g)
|
|
275
|
+
Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
276
|
+
sage: (f - g).expand()
|
|
277
|
+
0
|
|
278
|
+
|
|
279
|
+
It intelligently handles conversions from polynomial rings in a subset
|
|
280
|
+
of the variables too.
|
|
281
|
+
|
|
282
|
+
::
|
|
283
|
+
|
|
284
|
+
sage: R = GF(5)['x,y,z']
|
|
285
|
+
sage: S = ZZ['y']
|
|
286
|
+
sage: R(7*S.0)
|
|
287
|
+
2*y
|
|
288
|
+
sage: T = ZZ['x,z']
|
|
289
|
+
sage: R(2*T.0 + 6*T.1 + T.0*T.1^2)
|
|
290
|
+
x*z^2 + 2*x + z
|
|
291
|
+
|
|
292
|
+
::
|
|
293
|
+
|
|
294
|
+
sage: R = QQ['t,x,y,z']
|
|
295
|
+
sage: S.<x> = ZZ['x']
|
|
296
|
+
sage: T.<z> = S['z']
|
|
297
|
+
sage: T
|
|
298
|
+
Univariate Polynomial Ring in z over Univariate Polynomial Ring in x over Integer Ring
|
|
299
|
+
sage: f = (x+3*z+5)^2; f
|
|
300
|
+
9*z^2 + (6*x + 30)*z + x^2 + 10*x + 25
|
|
301
|
+
sage: R(f)
|
|
302
|
+
x^2 + 6*x*z + 9*z^2 + 10*x + 30*z + 25
|
|
303
|
+
|
|
304
|
+
Arithmetic with a constant from a base ring::
|
|
305
|
+
|
|
306
|
+
sage: R.<u,v> = QQ[]
|
|
307
|
+
sage: S.<x,y> = R[]
|
|
308
|
+
sage: u^3*x^2 + v*y
|
|
309
|
+
u^3*x^2 + v*y
|
|
310
|
+
|
|
311
|
+
Stacked polynomial rings convert into constants if possible. First,
|
|
312
|
+
the univariate case::
|
|
313
|
+
|
|
314
|
+
sage: R.<x> = QQ[]
|
|
315
|
+
sage: S.<u,v> = R[]
|
|
316
|
+
sage: S(u + 2)
|
|
317
|
+
u + 2
|
|
318
|
+
sage: S(u + 2).degree()
|
|
319
|
+
1
|
|
320
|
+
sage: S(x + 3)
|
|
321
|
+
x + 3
|
|
322
|
+
sage: S(x + 3).degree()
|
|
323
|
+
0
|
|
324
|
+
|
|
325
|
+
Second, the multivariate case::
|
|
326
|
+
|
|
327
|
+
sage: R.<x,y> = QQ[]
|
|
328
|
+
sage: S.<u,v> = R[]
|
|
329
|
+
sage: S(x + 2*y)
|
|
330
|
+
x + 2*y
|
|
331
|
+
sage: S(u + 2*v)
|
|
332
|
+
u + 2*v
|
|
333
|
+
|
|
334
|
+
Conversion from strings::
|
|
335
|
+
|
|
336
|
+
sage: R.<x,y> = QQ[]
|
|
337
|
+
sage: R('x+(1/2)*y^2')
|
|
338
|
+
1/2*y^2 + x
|
|
339
|
+
sage: S.<u,v> = ZZ[]
|
|
340
|
+
sage: S('u^2 + u*v + v^2')
|
|
341
|
+
u^2 + u*v + v^2
|
|
342
|
+
|
|
343
|
+
Foreign polynomial rings convert into the highest ring; the point
|
|
344
|
+
here is that an element of T could convert to an element of R or an
|
|
345
|
+
element of S; it is anticipated that an element of T is more likely
|
|
346
|
+
to be "the right thing" and is historically consistent.
|
|
347
|
+
|
|
348
|
+
::
|
|
349
|
+
|
|
350
|
+
sage: R.<x,y> = QQ[]
|
|
351
|
+
sage: S.<u,v> = R[]
|
|
352
|
+
sage: T.<a,b> = QQ[]
|
|
353
|
+
sage: S(a + b)
|
|
354
|
+
u + v
|
|
355
|
+
|
|
356
|
+
TESTS:
|
|
357
|
+
|
|
358
|
+
Check if we still allow nonsense (see :issue:`7951`)::
|
|
359
|
+
|
|
360
|
+
sage: P = PolynomialRing(QQ, 0, '')
|
|
361
|
+
sage: P('pi') # needs sage.symbolic
|
|
362
|
+
Traceback (most recent call last):
|
|
363
|
+
...
|
|
364
|
+
TypeError: unable to convert pi to a rational
|
|
365
|
+
|
|
366
|
+
Check that it is possible to convert strings to iterated
|
|
367
|
+
polynomial rings (see :issue:`13327`)::
|
|
368
|
+
|
|
369
|
+
sage: Rm = QQ["a"]["b, c"]
|
|
370
|
+
sage: Rm("a*b")
|
|
371
|
+
a*b
|
|
372
|
+
sage: parent(_) is Rm
|
|
373
|
+
True
|
|
374
|
+
|
|
375
|
+
Check that conversion from PARI works correctly (see
|
|
376
|
+
:issue:`17974`)::
|
|
377
|
+
|
|
378
|
+
sage: # needs sage.libs.pari
|
|
379
|
+
sage: A.<a> = PolynomialRing(QQ)
|
|
380
|
+
sage: B.<d,e> = PolynomialRing(A)
|
|
381
|
+
sage: f = pari(a*d)
|
|
382
|
+
sage: B(f)
|
|
383
|
+
a*d
|
|
384
|
+
sage: f = pari(a*d - (a+1)*d*e^3 + a*d^2)
|
|
385
|
+
sage: B(f)
|
|
386
|
+
(-a - 1)*d*e^3 + a*d^2 + a*d
|
|
387
|
+
sage: A.<a,b> = PolynomialRing(QQ)
|
|
388
|
+
sage: B.<d,e> = PolynomialRing(A)
|
|
389
|
+
sage: f = pari(a*d)
|
|
390
|
+
sage: B(f)
|
|
391
|
+
a*d
|
|
392
|
+
|
|
393
|
+
It is possible to convert `f` into `B` by using ``f.sage()``,
|
|
394
|
+
but this requires specifying a ``locals`` argument::
|
|
395
|
+
|
|
396
|
+
sage: # needs sage.libs.pari
|
|
397
|
+
sage: f
|
|
398
|
+
d*a
|
|
399
|
+
sage: f.sage()
|
|
400
|
+
Traceback (most recent call last):
|
|
401
|
+
...
|
|
402
|
+
NameError: name 'd' is not defined
|
|
403
|
+
sage: f.sage(locals={'a': a, 'd': d})
|
|
404
|
+
a*d
|
|
405
|
+
|
|
406
|
+
Check that :issue:`21999` is fixed::
|
|
407
|
+
|
|
408
|
+
sage: R = QQbar['s,t'] # needs sage.rings.number_field
|
|
409
|
+
sage: type(R({(1,2): 3}).coefficients()[0]) # needs sage.rings.number_field
|
|
410
|
+
<class 'sage.rings.qqbar.AlgebraicNumber'>
|
|
411
|
+
"""
|
|
412
|
+
from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
|
|
413
|
+
import sage.rings.polynomial.polynomial_element as polynomial_element
|
|
414
|
+
|
|
415
|
+
# handle constants that coerce into self.base_ring() first, if possible
|
|
416
|
+
if isinstance(x, Element) and x.parent() is self.base_ring():
|
|
417
|
+
# A Constant multi-polynomial
|
|
418
|
+
return self({self._zero_tuple: x})
|
|
419
|
+
|
|
420
|
+
try:
|
|
421
|
+
y = self.base_ring().coerce(x)
|
|
422
|
+
return MPolynomial_polydict(self, {self._zero_tuple: y})
|
|
423
|
+
except TypeError:
|
|
424
|
+
pass
|
|
425
|
+
|
|
426
|
+
from .multi_polynomial import MPolynomial_libsingular
|
|
427
|
+
|
|
428
|
+
if isinstance(x, MPolynomial_polydict):
|
|
429
|
+
P = x.parent()
|
|
430
|
+
|
|
431
|
+
if P is self:
|
|
432
|
+
return x
|
|
433
|
+
|
|
434
|
+
if P == self:
|
|
435
|
+
return MPolynomial_polydict(self, x.element().dict())
|
|
436
|
+
|
|
437
|
+
if self.base_ring().has_coerce_map_from(P):
|
|
438
|
+
# it might be in the base ring (i.e. a poly ring over a poly ring)
|
|
439
|
+
c = self.base_ring()(x)
|
|
440
|
+
return MPolynomial_polydict(self, {self._zero_tuple: c})
|
|
441
|
+
|
|
442
|
+
if len(P.variable_names()) == len(self.variable_names()):
|
|
443
|
+
# Map the variables in some crazy way (but in order,
|
|
444
|
+
# of course). This is here since R(blah) is supposed
|
|
445
|
+
# to be "make an element of R if at all possible with
|
|
446
|
+
# no guarantees that this is mathematically solid."
|
|
447
|
+
K = self.base_ring()
|
|
448
|
+
D = x.element().dict()
|
|
449
|
+
for i, a in D.items():
|
|
450
|
+
D[i] = K(a)
|
|
451
|
+
return MPolynomial_polydict(self, D)
|
|
452
|
+
|
|
453
|
+
if (set(P.variable_names()).issubset(set(self.variable_names()))
|
|
454
|
+
and self.base_ring().has_coerce_map_from(P.base_ring())):
|
|
455
|
+
# If the named variables are a superset of the input, map the variables by name
|
|
456
|
+
return MPolynomial_polydict(self, self._extract_polydict(x))
|
|
457
|
+
|
|
458
|
+
return MPolynomial_polydict(self,
|
|
459
|
+
x._mpoly_dict_recursive(self.variable_names(),
|
|
460
|
+
self.base_ring()))
|
|
461
|
+
|
|
462
|
+
elif isinstance(x, MPolynomial_libsingular):
|
|
463
|
+
P = x.parent()
|
|
464
|
+
if P == self:
|
|
465
|
+
return MPolynomial_polydict(self, x.monomial_coefficients())
|
|
466
|
+
|
|
467
|
+
if self.base_ring().has_coerce_map_from(P):
|
|
468
|
+
# it might be in the base ring (i.e. a poly ring over a poly ring)
|
|
469
|
+
c = self.base_ring()(x)
|
|
470
|
+
return MPolynomial_polydict(self, {self._zero_tuple: c})
|
|
471
|
+
|
|
472
|
+
if len(P.variable_names()) == len(self.variable_names()):
|
|
473
|
+
# Map the variables in some crazy way (but in order,
|
|
474
|
+
# of course). This is here since R(blah) is supposed
|
|
475
|
+
# to be "make an element of R if at all possible with
|
|
476
|
+
# no guarantees that this is mathematically solid."
|
|
477
|
+
K = self.base_ring()
|
|
478
|
+
D = x.monomial_coefficients()
|
|
479
|
+
for i, a in D.items():
|
|
480
|
+
D[i] = K(a)
|
|
481
|
+
return MPolynomial_polydict(self, D)
|
|
482
|
+
|
|
483
|
+
if (set(P.variable_names()).issubset(set(self.variable_names()))
|
|
484
|
+
and self.base_ring().has_coerce_map_from(P.base_ring())):
|
|
485
|
+
# If the named variables are a superset of the input, map the variables by name
|
|
486
|
+
return MPolynomial_polydict(self, self._extract_polydict(x))
|
|
487
|
+
|
|
488
|
+
return MPolynomial_polydict(self,
|
|
489
|
+
x._mpoly_dict_recursive(self.variable_names(),
|
|
490
|
+
self.base_ring()))
|
|
491
|
+
|
|
492
|
+
if isinstance(x, polynomial_element.Polynomial):
|
|
493
|
+
return MPolynomial_polydict(self,
|
|
494
|
+
x._mpoly_dict_recursive(self.variable_names(),
|
|
495
|
+
self.base_ring()))
|
|
496
|
+
|
|
497
|
+
if isinstance(x, PolyDict):
|
|
498
|
+
return MPolynomial_polydict(self, x)
|
|
499
|
+
|
|
500
|
+
if isinstance(x, dict):
|
|
501
|
+
K = self.base_ring()
|
|
502
|
+
return MPolynomial_polydict(self, {i: K(a) for i, a in x.items()})
|
|
503
|
+
|
|
504
|
+
if (isinstance(x, fraction_field_element.FractionFieldElement)
|
|
505
|
+
and x.parent().ring() == self):
|
|
506
|
+
if x.denominator() == 1:
|
|
507
|
+
return x.numerator()
|
|
508
|
+
|
|
509
|
+
raise TypeError("unable to coerce since the denominator is not 1")
|
|
510
|
+
|
|
511
|
+
if isinstance(x, sage.interfaces.abc.SingularElement) and self._has_singular:
|
|
512
|
+
self._singular_().set_ring()
|
|
513
|
+
try:
|
|
514
|
+
return x.sage_poly(self)
|
|
515
|
+
except TypeError:
|
|
516
|
+
raise TypeError("unable to coerce singular object")
|
|
517
|
+
|
|
518
|
+
if hasattr(x, '_polynomial_'):
|
|
519
|
+
return x._polynomial_(self)
|
|
520
|
+
|
|
521
|
+
if isinstance(x, str):
|
|
522
|
+
from sage.misc.sage_eval import sage_eval
|
|
523
|
+
try:
|
|
524
|
+
x = sage_eval(x, self.gens_dict_recursive())
|
|
525
|
+
except NameError:
|
|
526
|
+
raise TypeError("unable to evaluate {!r} in {}".format(x, self))
|
|
527
|
+
return self(x)
|
|
528
|
+
|
|
529
|
+
if isinstance(x, sage.interfaces.abc.Macaulay2Element):
|
|
530
|
+
try:
|
|
531
|
+
s = x.sage_polystring()
|
|
532
|
+
if len(s) == 0:
|
|
533
|
+
raise TypeError
|
|
534
|
+
# NOTE: It's CRUCIAL to use the eval command as follows,
|
|
535
|
+
# i.e., with the gen dict as the third arg and the second
|
|
536
|
+
# empty. Otherwise pickling won't work after calls to this eval!!!
|
|
537
|
+
# This took a while to figure out!
|
|
538
|
+
return self(eval(s, {}, self.gens_dict()))
|
|
539
|
+
except (AttributeError, TypeError, NameError, SyntaxError):
|
|
540
|
+
raise TypeError("Unable to coerce macaulay2 object")
|
|
541
|
+
return MPolynomial_polydict(self, x)
|
|
542
|
+
|
|
543
|
+
if isinstance(x, pari_gen) and x.type() == 't_POL':
|
|
544
|
+
# This recursive approach is needed because PARI
|
|
545
|
+
# represents multivariate polynomials as iterated
|
|
546
|
+
# univariate polynomials. Below, v is the variable
|
|
547
|
+
# with highest priority, and the x[i] are expressions
|
|
548
|
+
# in the remaining variables.
|
|
549
|
+
d = x.poldegree()
|
|
550
|
+
if d.type() == 't_INFINITY':
|
|
551
|
+
return self.zero()
|
|
552
|
+
v = self.gens_dict_recursive()[str(x.variable())]
|
|
553
|
+
return sum(self(x[i]) * v ** i for i in range(d + 1))
|
|
554
|
+
|
|
555
|
+
if isinstance(x, dict):
|
|
556
|
+
return MPolynomial_polydict(self, x)
|
|
557
|
+
|
|
558
|
+
c = self.base_ring()(x)
|
|
559
|
+
return MPolynomial_polydict(self, {self._zero_tuple: c})
|
|
560
|
+
|
|
561
|
+
# The following methods are handy for implementing Groebner
|
|
562
|
+
# basis algorithms. They do only superficial type/sanity checks
|
|
563
|
+
# and should be called carefully.
|
|
564
|
+
|
|
565
|
+
def monomial_quotient(self, f, g, coeff=False):
|
|
566
|
+
r"""
|
|
567
|
+
Return ``f/g``, where both ``f`` and ``g`` are treated as monomials.
|
|
568
|
+
|
|
569
|
+
Coefficients are ignored by default.
|
|
570
|
+
|
|
571
|
+
INPUT:
|
|
572
|
+
|
|
573
|
+
- ``f`` -- monomial
|
|
574
|
+
|
|
575
|
+
- ``g`` -- monomial
|
|
576
|
+
|
|
577
|
+
- ``coeff`` -- divide coefficients as well (default: ``False``)
|
|
578
|
+
|
|
579
|
+
OUTPUT: monomial
|
|
580
|
+
|
|
581
|
+
EXAMPLES::
|
|
582
|
+
|
|
583
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
584
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ, 3, order='degrevlex')
|
|
585
|
+
sage: P.monomial_quotient(3/2*x*y, x)
|
|
586
|
+
y
|
|
587
|
+
|
|
588
|
+
::
|
|
589
|
+
|
|
590
|
+
sage: P.monomial_quotient(3/2*x*y, 2*x, coeff=True)
|
|
591
|
+
3/4*y
|
|
592
|
+
|
|
593
|
+
TESTS::
|
|
594
|
+
|
|
595
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
596
|
+
sage: R.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
597
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
598
|
+
sage: P.monomial_quotient(x*y, x)
|
|
599
|
+
y
|
|
600
|
+
|
|
601
|
+
::
|
|
602
|
+
|
|
603
|
+
sage: P.monomial_quotient(x*y, R.gen())
|
|
604
|
+
y
|
|
605
|
+
|
|
606
|
+
::
|
|
607
|
+
|
|
608
|
+
sage: P.monomial_quotient(P(0), P(1))
|
|
609
|
+
0
|
|
610
|
+
|
|
611
|
+
::
|
|
612
|
+
|
|
613
|
+
sage: P.monomial_quotient(P(1), P(0))
|
|
614
|
+
Traceback (most recent call last):
|
|
615
|
+
...
|
|
616
|
+
ZeroDivisionError
|
|
617
|
+
|
|
618
|
+
::
|
|
619
|
+
|
|
620
|
+
sage: P.monomial_quotient(P(3/2), P(2/3), coeff=True)
|
|
621
|
+
9/4
|
|
622
|
+
|
|
623
|
+
::
|
|
624
|
+
|
|
625
|
+
sage: P.monomial_quotient(x, y) # Note the wrong result
|
|
626
|
+
x*y^-1
|
|
627
|
+
|
|
628
|
+
::
|
|
629
|
+
|
|
630
|
+
sage: P.monomial_quotient(x, P(1))
|
|
631
|
+
x
|
|
632
|
+
|
|
633
|
+
.. NOTE::
|
|
634
|
+
|
|
635
|
+
Assumes that the head term of f is a multiple of the head
|
|
636
|
+
term of g and return the multiplicant m. If this rule is
|
|
637
|
+
violated, funny things may happen.
|
|
638
|
+
"""
|
|
639
|
+
from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
|
|
640
|
+
|
|
641
|
+
if not f:
|
|
642
|
+
return f
|
|
643
|
+
if not g:
|
|
644
|
+
raise ZeroDivisionError
|
|
645
|
+
|
|
646
|
+
fd = f.monomial_coefficients()
|
|
647
|
+
gd = g.monomial_coefficients()
|
|
648
|
+
|
|
649
|
+
if not coeff:
|
|
650
|
+
f = next(iter(fd))
|
|
651
|
+
g = next(iter(gd))
|
|
652
|
+
coeff = self.base_ring().one()
|
|
653
|
+
else:
|
|
654
|
+
f, cf = next(iter(fd.items()))
|
|
655
|
+
g, cg = next(iter(gd.items()))
|
|
656
|
+
coeff = self.base_ring()(cf / cg)
|
|
657
|
+
|
|
658
|
+
res = f.esub(g)
|
|
659
|
+
|
|
660
|
+
return MPolynomial_polydict(self, PolyDict({res: coeff}))
|
|
661
|
+
|
|
662
|
+
def monomial_lcm(self, f, g):
|
|
663
|
+
"""
|
|
664
|
+
LCM for monomials. Coefficients are ignored.
|
|
665
|
+
|
|
666
|
+
INPUT:
|
|
667
|
+
|
|
668
|
+
- ``f`` -- monomial
|
|
669
|
+
|
|
670
|
+
- ``g`` -- monomial
|
|
671
|
+
|
|
672
|
+
OUTPUT: monomial
|
|
673
|
+
|
|
674
|
+
EXAMPLES::
|
|
675
|
+
|
|
676
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
677
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
678
|
+
sage: P.monomial_lcm(3/2*x*y, x)
|
|
679
|
+
x*y
|
|
680
|
+
|
|
681
|
+
TESTS::
|
|
682
|
+
|
|
683
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
684
|
+
sage: R.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
685
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
686
|
+
sage: P.monomial_lcm(x*y, R.gen())
|
|
687
|
+
x*y
|
|
688
|
+
|
|
689
|
+
::
|
|
690
|
+
|
|
691
|
+
sage: P.monomial_lcm(P(3/2), P(2/3))
|
|
692
|
+
1
|
|
693
|
+
|
|
694
|
+
::
|
|
695
|
+
|
|
696
|
+
sage: P.monomial_lcm(x, P(1))
|
|
697
|
+
x
|
|
698
|
+
"""
|
|
699
|
+
one = self.base_ring().one()
|
|
700
|
+
|
|
701
|
+
f, = f.monomial_coefficients()
|
|
702
|
+
g, = g.monomial_coefficients()
|
|
703
|
+
|
|
704
|
+
length = len(f)
|
|
705
|
+
|
|
706
|
+
res = {i: max(f[i], g[i])
|
|
707
|
+
for i in f.common_nonzero_positions(g)}
|
|
708
|
+
|
|
709
|
+
return self(PolyDict({ETuple(res, length): one}))
|
|
710
|
+
|
|
711
|
+
def monomial_reduce(self, f, G):
|
|
712
|
+
r"""
|
|
713
|
+
Try to find a ``g`` in ``G`` where ``g.lm()`` divides ``f``.
|
|
714
|
+
|
|
715
|
+
If found, ``(flt,g)`` is returned, ``(0,0)`` otherwise, where
|
|
716
|
+
``flt`` is ``f/g.lm()``. It is assumed that ``G`` is iterable and contains
|
|
717
|
+
ONLY elements in this ring.
|
|
718
|
+
|
|
719
|
+
INPUT:
|
|
720
|
+
|
|
721
|
+
- ``f`` -- monomial
|
|
722
|
+
|
|
723
|
+
- ``G`` -- list/set of mpolynomials
|
|
724
|
+
|
|
725
|
+
EXAMPLES::
|
|
726
|
+
|
|
727
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
728
|
+
sage: P.<x,y,z>=MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
729
|
+
sage: f = x*y^2
|
|
730
|
+
sage: G = [3/2*x^3 + y^2 + 1/2, 1/4*x*y + 2/7, P(1/2)]
|
|
731
|
+
sage: P.monomial_reduce(f,G)
|
|
732
|
+
(y, 1/4*x*y + 2/7)
|
|
733
|
+
|
|
734
|
+
::
|
|
735
|
+
|
|
736
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
737
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(Zmod(23432),3, order='degrevlex')
|
|
738
|
+
sage: f = x*y^2
|
|
739
|
+
sage: G = [3*x^3 + y^2 + 2, 4*x*y + 7, P(2)]
|
|
740
|
+
sage: P.monomial_reduce(f,G)
|
|
741
|
+
(y, 4*x*y + 7)
|
|
742
|
+
|
|
743
|
+
TESTS::
|
|
744
|
+
|
|
745
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
746
|
+
sage: P.<x,y,z>=MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
747
|
+
sage: f = x*y^2
|
|
748
|
+
sage: G = [3/2*x^3 + y^2 + 1/2, 1/4*x*y + 2/7, P(1/2)]
|
|
749
|
+
|
|
750
|
+
::
|
|
751
|
+
|
|
752
|
+
sage: P.monomial_reduce(P(0),G)
|
|
753
|
+
(0, 0)
|
|
754
|
+
|
|
755
|
+
::
|
|
756
|
+
|
|
757
|
+
sage: P.monomial_reduce(f,[P(0)])
|
|
758
|
+
(0, 0)
|
|
759
|
+
"""
|
|
760
|
+
if not f:
|
|
761
|
+
return 0, 0
|
|
762
|
+
for g in G:
|
|
763
|
+
t = g.lm()
|
|
764
|
+
try:
|
|
765
|
+
if self.monomial_divides(t, f):
|
|
766
|
+
return self.monomial_quotient(f, t), g
|
|
767
|
+
except ZeroDivisionError:
|
|
768
|
+
return 0, 0
|
|
769
|
+
return 0, 0
|
|
770
|
+
|
|
771
|
+
def monomial_divides(self, a, b):
|
|
772
|
+
"""
|
|
773
|
+
Return ``False`` if ``a`` does not divide ``b`` and ``True`` otherwise.
|
|
774
|
+
|
|
775
|
+
INPUT:
|
|
776
|
+
|
|
777
|
+
- ``a`` -- monomial
|
|
778
|
+
|
|
779
|
+
- ``b`` -- monomial
|
|
780
|
+
|
|
781
|
+
OUTPUT: boolean
|
|
782
|
+
|
|
783
|
+
EXAMPLES::
|
|
784
|
+
|
|
785
|
+
sage: P.<x,y,z> = PolynomialRing(ZZ,3, order='degrevlex')
|
|
786
|
+
sage: P.monomial_divides(x*y*z, x^3*y^2*z^4)
|
|
787
|
+
True
|
|
788
|
+
sage: P.monomial_divides(x^3*y^2*z^4, x*y*z)
|
|
789
|
+
False
|
|
790
|
+
|
|
791
|
+
TESTS::
|
|
792
|
+
|
|
793
|
+
sage: P.<x,y,z> = PolynomialRing(ZZ,3, order='degrevlex')
|
|
794
|
+
sage: P.monomial_divides(P(1), P(0))
|
|
795
|
+
True
|
|
796
|
+
sage: P.monomial_divides(P(1), x)
|
|
797
|
+
True
|
|
798
|
+
"""
|
|
799
|
+
if not b:
|
|
800
|
+
return True
|
|
801
|
+
if not a:
|
|
802
|
+
raise ZeroDivisionError
|
|
803
|
+
|
|
804
|
+
a, = a.monomial_coefficients()
|
|
805
|
+
b, = b.monomial_coefficients()
|
|
806
|
+
|
|
807
|
+
return all(b[i] >= a[i]
|
|
808
|
+
for i in b.common_nonzero_positions(a))
|
|
809
|
+
|
|
810
|
+
def monomial_pairwise_prime(self, h, g):
|
|
811
|
+
r"""
|
|
812
|
+
Return ``True`` if ``h`` and ``g`` are pairwise prime.
|
|
813
|
+
|
|
814
|
+
Both are treated as monomials.
|
|
815
|
+
|
|
816
|
+
INPUT:
|
|
817
|
+
|
|
818
|
+
- ``h`` -- monomial
|
|
819
|
+
|
|
820
|
+
- ``g`` -- monomial
|
|
821
|
+
|
|
822
|
+
OUTPUT: boolean
|
|
823
|
+
|
|
824
|
+
EXAMPLES::
|
|
825
|
+
|
|
826
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
827
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
828
|
+
sage: P.monomial_pairwise_prime(x^2*z^3, y^4)
|
|
829
|
+
True
|
|
830
|
+
|
|
831
|
+
::
|
|
832
|
+
|
|
833
|
+
sage: P.monomial_pairwise_prime(1/2*x^3*y^2, 3/4*y^3)
|
|
834
|
+
False
|
|
835
|
+
|
|
836
|
+
TESTS::
|
|
837
|
+
|
|
838
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
839
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
840
|
+
sage: Q.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
841
|
+
sage: P.monomial_pairwise_prime(x^2*z^3, Q('y^4'))
|
|
842
|
+
True
|
|
843
|
+
|
|
844
|
+
::
|
|
845
|
+
|
|
846
|
+
sage: P.monomial_pairwise_prime(1/2*x^3*y^2, Q(0))
|
|
847
|
+
True
|
|
848
|
+
|
|
849
|
+
::
|
|
850
|
+
|
|
851
|
+
sage: P.monomial_pairwise_prime(P(1/2),x)
|
|
852
|
+
False
|
|
853
|
+
"""
|
|
854
|
+
not_g = not g
|
|
855
|
+
not_h = not h
|
|
856
|
+
if not_g and not_h: # GCD(0,0) = 0
|
|
857
|
+
return False
|
|
858
|
+
if not_g or not_h: # GCD(x,0) = 1
|
|
859
|
+
return True
|
|
860
|
+
return self.monomial_lcm(g, h) == g * h
|
|
861
|
+
|
|
862
|
+
def monomial_all_divisors(self, t):
|
|
863
|
+
r"""
|
|
864
|
+
Return a list of all monomials that divide ``t``, coefficients are
|
|
865
|
+
ignored.
|
|
866
|
+
|
|
867
|
+
INPUT:
|
|
868
|
+
|
|
869
|
+
- ``t`` -- a monomial
|
|
870
|
+
|
|
871
|
+
OUTPUT: list of monomials
|
|
872
|
+
|
|
873
|
+
EXAMPLES::
|
|
874
|
+
|
|
875
|
+
sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
|
|
876
|
+
sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
|
|
877
|
+
sage: P.monomial_all_divisors(x^2*z^3)
|
|
878
|
+
[x, x^2, z, x*z, x^2*z, z^2, x*z^2, x^2*z^2, z^3, x*z^3, x^2*z^3]
|
|
879
|
+
|
|
880
|
+
ALGORITHM: addwithcarry idea by Toon Segers
|
|
881
|
+
"""
|
|
882
|
+
|
|
883
|
+
def addwithcarry(tempvector, maxvector, pos):
|
|
884
|
+
if tempvector[pos] < maxvector[pos]:
|
|
885
|
+
tempvector[pos] += 1
|
|
886
|
+
else:
|
|
887
|
+
tempvector[pos] = 0
|
|
888
|
+
tempvector = addwithcarry(tempvector, maxvector, pos + 1)
|
|
889
|
+
return tempvector
|
|
890
|
+
|
|
891
|
+
if not t.is_monomial():
|
|
892
|
+
raise TypeError("only monomials are supported")
|
|
893
|
+
|
|
894
|
+
R = self
|
|
895
|
+
one = self.base_ring().one()
|
|
896
|
+
M = list()
|
|
897
|
+
|
|
898
|
+
v, = t.monomial_coefficients()
|
|
899
|
+
maxvector = list(v)
|
|
900
|
+
|
|
901
|
+
tempvector = [0] * len(maxvector)
|
|
902
|
+
|
|
903
|
+
pos = 0
|
|
904
|
+
|
|
905
|
+
while tempvector != maxvector:
|
|
906
|
+
tempvector = addwithcarry(list(tempvector), maxvector, pos)
|
|
907
|
+
M.append(R(PolyDict({ETuple(tempvector): one})))
|
|
908
|
+
return M
|
|
909
|
+
|
|
910
|
+
def sum(self, terms):
|
|
911
|
+
r"""
|
|
912
|
+
Return a sum of elements of this multipolynomial ring.
|
|
913
|
+
|
|
914
|
+
This is method is much faster than the Python builtin :func:`sum`.
|
|
915
|
+
|
|
916
|
+
EXAMPLES::
|
|
917
|
+
|
|
918
|
+
sage: R = QQ['x']
|
|
919
|
+
sage: S = R['y, z']
|
|
920
|
+
sage: x = R.gen()
|
|
921
|
+
sage: y, z = S.gens()
|
|
922
|
+
sage: S.sum([x*y, 2*x^2*z - 2*x*y, 1 + y + z])
|
|
923
|
+
(-x + 1)*y + (2*x^2 + 1)*z + 1
|
|
924
|
+
|
|
925
|
+
Comparison with builtin :func:`sum`::
|
|
926
|
+
|
|
927
|
+
sage: sum([x*y, 2*x^2*z - 2*x*y, 1 + y + z])
|
|
928
|
+
(-x + 1)*y + (2*x^2 + 1)*z + 1
|
|
929
|
+
"""
|
|
930
|
+
elt = PolyDict({}, check=False)
|
|
931
|
+
for t in terms:
|
|
932
|
+
elt += self(t).element()
|
|
933
|
+
# NOTE: here we should be using self.element_class but
|
|
934
|
+
# polynomial rings are not yet compliant with categories...
|
|
935
|
+
from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
|
|
936
|
+
return MPolynomial_polydict(self, elt)
|
|
937
|
+
|
|
938
|
+
|
|
939
|
+
class MPolynomialRing_polydict_domain(MPolynomialRing_polydict):
|
|
940
|
+
def __init__(self, base_ring, n, names, order):
|
|
941
|
+
order = TermOrder(order, n)
|
|
942
|
+
MPolynomialRing_polydict.__init__(self, base_ring, n, names, order)
|
|
943
|
+
|
|
944
|
+
def is_field(self, proof=True):
|
|
945
|
+
if self.ngens() == 0:
|
|
946
|
+
return self.base_ring().is_field(proof)
|
|
947
|
+
return False
|