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,972 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.symbolic
|
|
3
|
+
r"""
|
|
4
|
+
Multivariate Tropical Polynomials
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Verrel Rievaldo Wijaya (2024-06): initial version
|
|
9
|
+
|
|
10
|
+
EXAMPLES::
|
|
11
|
+
|
|
12
|
+
sage: T = TropicalSemiring(QQ, use_min=True)
|
|
13
|
+
sage: R.<x,y,z> = PolynomialRing(T)
|
|
14
|
+
sage: z.parent()
|
|
15
|
+
Multivariate Tropical Polynomial Semiring in x, y, z over Rational Field
|
|
16
|
+
sage: R(2)*x + R(-1)*x + R(5)*y + R(-3)
|
|
17
|
+
(-1)*x + 5*y + (-3)
|
|
18
|
+
sage: (x+y+z)^2
|
|
19
|
+
0*x^2 + 0*x*y + 0*y^2 + 0*x*z + 0*y*z + 0*z^2
|
|
20
|
+
|
|
21
|
+
REFERENCES:
|
|
22
|
+
|
|
23
|
+
- [Bru2014]_
|
|
24
|
+
- [Fil2017]_
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# ****************************************************************************
|
|
28
|
+
# Copyright (C) 2024 Verrel Rievaldo Wijaya <verrelrievaldo@gmail.com>
|
|
29
|
+
#
|
|
30
|
+
# This program is free software: you can redistribute it and/or modify
|
|
31
|
+
# it under the terms of the GNU General Public License as published by
|
|
32
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
33
|
+
# (at your option) any later version.
|
|
34
|
+
# https://www.gnu.org/licenses/
|
|
35
|
+
# ****************************************************************************
|
|
36
|
+
|
|
37
|
+
from sage.misc.cachefunc import cached_method
|
|
38
|
+
from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
|
|
39
|
+
from sage.structure.parent import Parent
|
|
40
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class TropicalMPolynomial(MPolynomial_polydict):
|
|
44
|
+
r"""
|
|
45
|
+
A multivariate tropical polynomial.
|
|
46
|
+
|
|
47
|
+
Let `x_1, x_2, \ldots, x_n` be indeterminants. A tropical monomial is
|
|
48
|
+
any product of these variables, possibly including repetitions:
|
|
49
|
+
`x_1^{i_1}\cdots x_n^{i_n}` where `i_j \in \{0,1,\ldots\}`, for all
|
|
50
|
+
`j\in \{1,\ldots,n\}`. A multivariate tropical polynomial is a finite
|
|
51
|
+
linear combination of tropical monomials,
|
|
52
|
+
`p(x_1, \ldots, x_n) = \sum_{i=1}^n c_i x_1^{i_1}\cdots x_n^{i_n}`.
|
|
53
|
+
|
|
54
|
+
In classical arithmetic, we can rewrite the general form of a tropical
|
|
55
|
+
monomial: `x_1^{i_1}\cdots x_n^{i_n} \mapsto i_1 x_1 + \cdots + i_n x_n`.
|
|
56
|
+
Thus, the tropical polynomial can be viewed as the minimum (maximum) of
|
|
57
|
+
a finite collection of linear functions.
|
|
58
|
+
|
|
59
|
+
EXAMPLES:
|
|
60
|
+
|
|
61
|
+
Construct a multivariate tropical polynomial semiring in two variables::
|
|
62
|
+
|
|
63
|
+
sage: T = TropicalSemiring(QQ, use_min=False)
|
|
64
|
+
sage: R.<a,b> = PolynomialRing(T); R
|
|
65
|
+
Multivariate Tropical Polynomial Semiring in a, b over Rational Field
|
|
66
|
+
|
|
67
|
+
Define some multivariate tropical polynomials::
|
|
68
|
+
|
|
69
|
+
sage: p1 = R(3)*a*b + a + R(-1)*b; p1
|
|
70
|
+
3*a*b + 0*a + (-1)*b
|
|
71
|
+
sage: p2 = R(1)*a + R(1)*b + R(1)*a*b; p2
|
|
72
|
+
1*a*b + 1*a + 1*b
|
|
73
|
+
|
|
74
|
+
Some basic arithmetic operations for multivariate tropical polynomials::
|
|
75
|
+
|
|
76
|
+
sage: p1 + p2
|
|
77
|
+
3*a*b + 1*a + 1*b
|
|
78
|
+
sage: p1 * p2
|
|
79
|
+
4*a^2*b^2 + 4*a^2*b + 4*a*b^2 + 1*a^2 + 1*a*b + 0*b^2
|
|
80
|
+
sage: T(2) * p1
|
|
81
|
+
5*a*b + 2*a + 1*b
|
|
82
|
+
sage: p1(T(1),T(2))
|
|
83
|
+
6
|
|
84
|
+
|
|
85
|
+
Let us look at the different result for tropical curve and 3d graph
|
|
86
|
+
of tropical polynomial in two variables when different algebra is used.
|
|
87
|
+
First for the min-plus algebra::
|
|
88
|
+
|
|
89
|
+
sage: T = TropicalSemiring(QQ, use_min=True)
|
|
90
|
+
sage: R.<a,b> = PolynomialRing(T)
|
|
91
|
+
sage: p1 = R(3)*a*b + a + R(-1)*b
|
|
92
|
+
sage: p1.tropical_variety()
|
|
93
|
+
Tropical curve of 3*a*b + 0*a + (-1)*b
|
|
94
|
+
sage: p1.tropical_variety().plot() # needs sage.plot
|
|
95
|
+
Graphics object consisting of 3 graphics primitives
|
|
96
|
+
|
|
97
|
+
.. PLOT::
|
|
98
|
+
:width: 300 px
|
|
99
|
+
|
|
100
|
+
T = TropicalSemiring(QQ, use_min=True)
|
|
101
|
+
R = PolynomialRing(T, ('a,b'))
|
|
102
|
+
a, b = R.gen(), R.gen(1)
|
|
103
|
+
p1 = R(3)*a*b + a + R(-1)*b
|
|
104
|
+
tv1 = p1.tropical_variety()
|
|
105
|
+
sphinx_plot(tv1.plot())
|
|
106
|
+
|
|
107
|
+
Tropical polynomial in two variables will induce a function in three
|
|
108
|
+
dimension that consists of a number of surfaces::
|
|
109
|
+
|
|
110
|
+
sage: p1.plot3d() # needs sage.plot
|
|
111
|
+
Graphics3d Object
|
|
112
|
+
|
|
113
|
+
.. PLOT::
|
|
114
|
+
:width: 300 px
|
|
115
|
+
|
|
116
|
+
T = TropicalSemiring(QQ, use_min=True)
|
|
117
|
+
R = PolynomialRing(T, ('a,b'))
|
|
118
|
+
a, b = R.gen(), R.gen(1)
|
|
119
|
+
p1 = R(3)*a*b + a + R(-1)*b
|
|
120
|
+
sphinx_plot(p1.plot3d())
|
|
121
|
+
|
|
122
|
+
If we use a max-plus algebra, we will get a slightly different result::
|
|
123
|
+
|
|
124
|
+
sage: T = TropicalSemiring(QQ, use_min=False)
|
|
125
|
+
sage: R.<a,b> = PolynomialRing(T)
|
|
126
|
+
sage: p1 = R(3)*a*b + a + R(-1)*b
|
|
127
|
+
sage: p1.tropical_variety()
|
|
128
|
+
Tropical curve of 3*a*b + 0*a + (-1)*b
|
|
129
|
+
sage: p1.tropical_variety().plot() # needs sage.plot
|
|
130
|
+
Graphics object consisting of 3 graphics primitives
|
|
131
|
+
|
|
132
|
+
.. PLOT::
|
|
133
|
+
:width: 300 px
|
|
134
|
+
|
|
135
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
136
|
+
R = PolynomialRing(T, ('a,b'))
|
|
137
|
+
a, b = R.gen(), R.gen(1)
|
|
138
|
+
p1 = R(3)*a*b + a + R(-1)*b
|
|
139
|
+
tv1 = p1.tropical_variety()
|
|
140
|
+
sphinx_plot(tv1.plot())
|
|
141
|
+
|
|
142
|
+
::
|
|
143
|
+
|
|
144
|
+
sage: p1.plot3d() # needs sage.plot
|
|
145
|
+
Graphics3d Object
|
|
146
|
+
|
|
147
|
+
.. PLOT::
|
|
148
|
+
:width: 300 px
|
|
149
|
+
|
|
150
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
151
|
+
R = PolynomialRing(T, ('a,b'))
|
|
152
|
+
a, b = R.gen(), R.gen(1)
|
|
153
|
+
p1 = R(3)*a*b + a + R(-1)*b
|
|
154
|
+
sphinx_plot(p1.plot3d())
|
|
155
|
+
|
|
156
|
+
Another way to represent tropical curve is through dual subdivision,
|
|
157
|
+
which is a subdivision of Newton polytope of tropical polynomial::
|
|
158
|
+
|
|
159
|
+
sage: # needs sage.geometry.polyhedron
|
|
160
|
+
sage: p1.newton_polytope()
|
|
161
|
+
A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 3 vertices
|
|
162
|
+
sage: p1.dual_subdivision()
|
|
163
|
+
Polyhedral complex with 1 maximal cell
|
|
164
|
+
|
|
165
|
+
.. PLOT::
|
|
166
|
+
:width: 300 px
|
|
167
|
+
|
|
168
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
169
|
+
R = PolynomialRing(T, ('a,b'))
|
|
170
|
+
a, b = R.gen(), R.gen(1)
|
|
171
|
+
p1 = R(3)*a*b + a + R(-1)*b
|
|
172
|
+
sphinx_plot(p1.dual_subdivision().plot())
|
|
173
|
+
|
|
174
|
+
TESTS:
|
|
175
|
+
|
|
176
|
+
There is no subtraction defined for tropical polynomials::
|
|
177
|
+
|
|
178
|
+
sage: T = TropicalSemiring(QQ)
|
|
179
|
+
sage: R.<a,b> = PolynomialRing(T)
|
|
180
|
+
sage: a - b
|
|
181
|
+
Traceback (most recent call last):
|
|
182
|
+
...
|
|
183
|
+
ArithmeticError: cannot negate any non-infinite element
|
|
184
|
+
"""
|
|
185
|
+
def subs(self, fixed=None, **kwds):
|
|
186
|
+
r"""
|
|
187
|
+
Fix some given variables in ``self`` and return the changed
|
|
188
|
+
tropical multivariate polynomials.
|
|
189
|
+
|
|
190
|
+
.. SEEALSO::
|
|
191
|
+
|
|
192
|
+
:meth:`sage.rings.polynomial.multi_polynomial_element.MPolynomial_polydict.subs`
|
|
193
|
+
|
|
194
|
+
EXAMPLES::
|
|
195
|
+
|
|
196
|
+
sage: T = TropicalSemiring(QQ, use_min=False)
|
|
197
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
198
|
+
sage: p1 = x^2 + y + R(3)
|
|
199
|
+
sage: p1((R(4),y))
|
|
200
|
+
0*y + 8
|
|
201
|
+
sage: p1.subs({x: 4})
|
|
202
|
+
0*y + 8
|
|
203
|
+
"""
|
|
204
|
+
variables = list(self.parent().gens())
|
|
205
|
+
for i in range(len(variables)):
|
|
206
|
+
if str(variables[i]) in kwds:
|
|
207
|
+
variables[i] = kwds[str(variables[i])]
|
|
208
|
+
elif fixed:
|
|
209
|
+
if variables[i] in fixed:
|
|
210
|
+
variables[i] = fixed[variables[i]]
|
|
211
|
+
elif i in fixed:
|
|
212
|
+
variables[i] = fixed[i]
|
|
213
|
+
if len(kwds) < len(variables):
|
|
214
|
+
for i, v in enumerate(variables):
|
|
215
|
+
variables[i] = self.parent()(v)
|
|
216
|
+
return self(tuple(variables))
|
|
217
|
+
|
|
218
|
+
def plot3d(self, color='random'):
|
|
219
|
+
r"""
|
|
220
|
+
Return the 3d plot of ``self``.
|
|
221
|
+
|
|
222
|
+
Only implemented for tropical polynomial in two variables.
|
|
223
|
+
The `x`-`y` axes for this 3d plot is the same as the `x`-`y`
|
|
224
|
+
axes of the corresponding tropical curve.
|
|
225
|
+
|
|
226
|
+
OUTPUT: Graphics3d Object
|
|
227
|
+
|
|
228
|
+
EXAMPLES:
|
|
229
|
+
|
|
230
|
+
A simple tropical polynomial that consist of only one surface::
|
|
231
|
+
|
|
232
|
+
sage: T = TropicalSemiring(QQ, use_min=False)
|
|
233
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
234
|
+
sage: p1 = x^2
|
|
235
|
+
sage: p1.plot3d() # needs sage.plot
|
|
236
|
+
Graphics3d Object
|
|
237
|
+
|
|
238
|
+
.. PLOT::
|
|
239
|
+
:width: 300 px
|
|
240
|
+
|
|
241
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
242
|
+
R = PolynomialRing(T, ('x,y'))
|
|
243
|
+
x, y = R.gen(), R.gen(1)
|
|
244
|
+
p1 = x**2
|
|
245
|
+
sphinx_plot(p1.plot3d())
|
|
246
|
+
|
|
247
|
+
Tropical polynomials often have graphs that represent a combination
|
|
248
|
+
of multiple surfaces::
|
|
249
|
+
|
|
250
|
+
sage: p2 = R(3) + R(2)*x + R(2)*y + R(3)*x*y
|
|
251
|
+
sage: p2.plot3d() # needs sage.plot
|
|
252
|
+
Graphics3d Object
|
|
253
|
+
|
|
254
|
+
.. PLOT::
|
|
255
|
+
:width: 300 px
|
|
256
|
+
|
|
257
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
258
|
+
R = PolynomialRing(T, ('x,y'))
|
|
259
|
+
x, y = R.gen(), R.gen(1)
|
|
260
|
+
p2 = R(3) + R(2)*x + R(2)*y + R(3)*x*y
|
|
261
|
+
sphinx_plot(p2.plot3d())
|
|
262
|
+
|
|
263
|
+
::
|
|
264
|
+
|
|
265
|
+
sage: T = TropicalSemiring(QQ)
|
|
266
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
267
|
+
sage: p3 = R(2)*x^2 + x*y + R(2)*y^2 + x + R(-1)*y + R(3)
|
|
268
|
+
sage: p3.plot3d() # needs sage.plot
|
|
269
|
+
Graphics3d Object
|
|
270
|
+
|
|
271
|
+
.. PLOT::
|
|
272
|
+
:width: 300 px
|
|
273
|
+
|
|
274
|
+
T = TropicalSemiring(QQ)
|
|
275
|
+
R = PolynomialRing(T, ('x,y'))
|
|
276
|
+
x, y = R.gen(), R.gen(1)
|
|
277
|
+
p3 = R(2)*x**2 + x*y + R(2)*y**2 + x + R(-1)*y + R(3)
|
|
278
|
+
sphinx_plot(p3.plot3d())
|
|
279
|
+
|
|
280
|
+
TESTS::
|
|
281
|
+
|
|
282
|
+
sage: T = TropicalSemiring(QQ)
|
|
283
|
+
sage: R.<x,y,z> = PolynomialRing(T)
|
|
284
|
+
sage: p1 = x*y*z + x
|
|
285
|
+
sage: p1.plot3d() # needs sage.plot
|
|
286
|
+
Traceback (most recent call last):
|
|
287
|
+
...
|
|
288
|
+
NotImplementedError: can only plot the graph of tropical
|
|
289
|
+
multivariate polynomial in two variables
|
|
290
|
+
"""
|
|
291
|
+
from random import random
|
|
292
|
+
|
|
293
|
+
from sage.geometry.polyhedron.constructor import Polyhedron
|
|
294
|
+
from sage.plot.graphics import Graphics
|
|
295
|
+
from sage.sets.real_set import RealSet
|
|
296
|
+
from sage.symbolic.relation import solve
|
|
297
|
+
|
|
298
|
+
if len(self.parent().variable_names()) != 2:
|
|
299
|
+
raise NotImplementedError("can only plot the graph of tropical "
|
|
300
|
+
"multivariate polynomial in two variables")
|
|
301
|
+
tv = self.tropical_variety()
|
|
302
|
+
axes = tv._axes()
|
|
303
|
+
edge = set()
|
|
304
|
+
if tv.components():
|
|
305
|
+
v = tv._vars[0]
|
|
306
|
+
T = self.parent().base()
|
|
307
|
+
R = self.base_ring().base_ring()
|
|
308
|
+
|
|
309
|
+
# Find the point of curve that touch the edge of the axes
|
|
310
|
+
for comp in tv.components():
|
|
311
|
+
if len(comp[1]) == 1:
|
|
312
|
+
valid_int = RealSet(comp[1][0])
|
|
313
|
+
else:
|
|
314
|
+
valid_int = RealSet(comp[1][0]).intersection(RealSet(comp[1][1]))
|
|
315
|
+
for i, eqn in enumerate(comp[0]):
|
|
316
|
+
j = (i+1) % 2
|
|
317
|
+
if not eqn.is_numeric():
|
|
318
|
+
for k in range(2):
|
|
319
|
+
sol = solve(eqn == axes[i][k], v)
|
|
320
|
+
if sol[0].rhs() in valid_int:
|
|
321
|
+
valid_point = [R(eq.subs(**{str(v): sol[0].rhs()})) for eq in comp[0]]
|
|
322
|
+
if valid_point[j] in RealSet(axes[j]):
|
|
323
|
+
edge.add(tuple(valid_point))
|
|
324
|
+
|
|
325
|
+
# Combine the edge, vertices, and corner point
|
|
326
|
+
vertices = self.tropical_variety().vertices()
|
|
327
|
+
corner = set()
|
|
328
|
+
for i in axes[0]:
|
|
329
|
+
for j in axes[1]:
|
|
330
|
+
corner.add((i, j))
|
|
331
|
+
marks = corner | vertices | edge
|
|
332
|
+
|
|
333
|
+
# Calculate the value of polynomial at each marked point
|
|
334
|
+
variables = self.parent().gens()
|
|
335
|
+
terms = [a*variables[0]**b[0] * variables[1]**b[1] for a, b in zip(self.coefficients(), self.exponents())]
|
|
336
|
+
point_terms = {}
|
|
337
|
+
for mark in marks:
|
|
338
|
+
mark_terms = []
|
|
339
|
+
value = self(T(mark[0]), T(mark[1]))
|
|
340
|
+
value_terms = [term(T(mark[0]), T(mark[1])) for term in terms]
|
|
341
|
+
mark_terms.extend(terms[i] for i in range(len(terms))
|
|
342
|
+
if value_terms[i] == value)
|
|
343
|
+
point_terms[(R(mark[0]), R(mark[1]), value.lift())] = mark_terms
|
|
344
|
+
|
|
345
|
+
# Plot the points that attained its value at one term only
|
|
346
|
+
combined_plot = Graphics()
|
|
347
|
+
for elms in point_terms.values():
|
|
348
|
+
if len(elms) == 1:
|
|
349
|
+
poly_vert = []
|
|
350
|
+
term = elms[0]
|
|
351
|
+
for p, t in point_terms.items():
|
|
352
|
+
if term in t:
|
|
353
|
+
poly_vert.append(p)
|
|
354
|
+
t.remove(term)
|
|
355
|
+
if color == 'random':
|
|
356
|
+
rand_color = (random(), random(), random())
|
|
357
|
+
plot = Polyhedron(vertices=poly_vert).plot(color=rand_color)
|
|
358
|
+
combined_plot += plot
|
|
359
|
+
|
|
360
|
+
# Plot the remaining points
|
|
361
|
+
for remain in point_terms.values():
|
|
362
|
+
for term in remain:
|
|
363
|
+
poly_vert = []
|
|
364
|
+
for p, t in point_terms.items():
|
|
365
|
+
if term in t:
|
|
366
|
+
poly_vert.append(p)
|
|
367
|
+
t.remove(term)
|
|
368
|
+
if color == 'random':
|
|
369
|
+
rand_color = (random(), random(), random())
|
|
370
|
+
plot = Polyhedron(vertices=poly_vert).plot(color=rand_color)
|
|
371
|
+
combined_plot += plot
|
|
372
|
+
return combined_plot
|
|
373
|
+
|
|
374
|
+
def tropical_variety(self):
|
|
375
|
+
r"""
|
|
376
|
+
Return tropical roots of ``self``.
|
|
377
|
+
|
|
378
|
+
In the multivariate case, the roots can be represented by a
|
|
379
|
+
tropical variety. In two dimensions, this is known as a tropical
|
|
380
|
+
curve. For dimensions higher than two, it is referred to as a
|
|
381
|
+
tropical hypersurface.
|
|
382
|
+
|
|
383
|
+
OUTPUT: :class:`sage.rings.semirings.tropical_variety.TropicalVariety`
|
|
384
|
+
|
|
385
|
+
EXAMPLES:
|
|
386
|
+
|
|
387
|
+
Tropical curve for tropical polynomials in two variables::
|
|
388
|
+
|
|
389
|
+
sage: T = TropicalSemiring(QQ, use_min=False)
|
|
390
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
391
|
+
sage: p1 = x + y + R(0); p1
|
|
392
|
+
0*x + 0*y + 0
|
|
393
|
+
sage: p1.tropical_variety()
|
|
394
|
+
Tropical curve of 0*x + 0*y + 0
|
|
395
|
+
|
|
396
|
+
Tropical hypersurface for tropical polynomials in more than two
|
|
397
|
+
variables::
|
|
398
|
+
|
|
399
|
+
sage: T = TropicalSemiring(QQ)
|
|
400
|
+
sage: R.<x,y,z> = PolynomialRing(T)
|
|
401
|
+
sage: p1 = R(1)*x*y + R(-1/2)*x*z + R(4)*z^2; p1
|
|
402
|
+
1*x*y + (-1/2)*x*z + 4*z^2
|
|
403
|
+
sage: p1.tropical_variety()
|
|
404
|
+
Tropical surface of 1*x*y + (-1/2)*x*z + 4*z^2
|
|
405
|
+
"""
|
|
406
|
+
from sage.rings.semirings.tropical_variety import (
|
|
407
|
+
TropicalCurve,
|
|
408
|
+
TropicalSurface,
|
|
409
|
+
TropicalVariety,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
if self.parent().ngens() == 2:
|
|
413
|
+
return TropicalCurve(self)
|
|
414
|
+
if self.parent().ngens() == 3:
|
|
415
|
+
return TropicalSurface(self)
|
|
416
|
+
return TropicalVariety(self)
|
|
417
|
+
|
|
418
|
+
def newton_polytope(self):
|
|
419
|
+
r"""
|
|
420
|
+
Return the Newton polytope of ``self``.
|
|
421
|
+
|
|
422
|
+
The Newton polytope is the convex hull of all the points
|
|
423
|
+
corresponding to the exponents of the monomials of tropical
|
|
424
|
+
polynomial.
|
|
425
|
+
|
|
426
|
+
OUTPUT: :func:`~sage.geometry.polyhedron.constructor.Polyhedron`
|
|
427
|
+
|
|
428
|
+
EXAMPLES:
|
|
429
|
+
|
|
430
|
+
A Newton polytope for a two-variable tropical polynomial::
|
|
431
|
+
|
|
432
|
+
sage: # needs sage.geometry.polyhedron
|
|
433
|
+
sage: T = TropicalSemiring(QQ)
|
|
434
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
435
|
+
sage: p1 = x + y
|
|
436
|
+
sage: p1.newton_polytope()
|
|
437
|
+
A 1-dimensional polyhedron in ZZ^2 defined as the convex hull of 2 vertices
|
|
438
|
+
sage: p1.newton_polytope().Vrepresentation()
|
|
439
|
+
(A vertex at (0, 1), A vertex at (1, 0))
|
|
440
|
+
sage: p1.newton_polytope().Hrepresentation()
|
|
441
|
+
(An equation (1, 1) x - 1 == 0,
|
|
442
|
+
An inequality (0, -1) x + 1 >= 0,
|
|
443
|
+
An inequality (0, 1) x + 0 >= 0)
|
|
444
|
+
|
|
445
|
+
.. PLOT::
|
|
446
|
+
:width: 300 px
|
|
447
|
+
|
|
448
|
+
T = TropicalSemiring(QQ)
|
|
449
|
+
R = PolynomialRing(T, ('x,y'))
|
|
450
|
+
x, y = R.gen(), R.gen(1)
|
|
451
|
+
p1 = x + y
|
|
452
|
+
sphinx_plot(p1.newton_polytope().plot())
|
|
453
|
+
|
|
454
|
+
A Newton polytope in three dimension::
|
|
455
|
+
|
|
456
|
+
sage: # needs sage.geometry.polyhedron
|
|
457
|
+
sage: T = TropicalSemiring(QQ)
|
|
458
|
+
sage: R.<x,y,z> = PolynomialRing(T)
|
|
459
|
+
sage: p1 = x^2 + x*y*z + x + y + z + R(0)
|
|
460
|
+
sage: p1.newton_polytope()
|
|
461
|
+
A 3-dimensional polyhedron in ZZ^3 defined as the convex hull of 5 vertices
|
|
462
|
+
sage: p1.newton_polytope().Vrepresentation()
|
|
463
|
+
(A vertex at (0, 0, 0),
|
|
464
|
+
A vertex at (0, 0, 1),
|
|
465
|
+
A vertex at (0, 1, 0),
|
|
466
|
+
A vertex at (2, 0, 0),
|
|
467
|
+
A vertex at (1, 1, 1))
|
|
468
|
+
sage: p1.newton_polytope().Hrepresentation()
|
|
469
|
+
(An inequality (0, 1, 0) x + 0 >= 0,
|
|
470
|
+
An inequality (0, 0, 1) x + 0 >= 0,
|
|
471
|
+
An inequality (1, 0, 0) x + 0 >= 0,
|
|
472
|
+
An inequality (1, -1, -1) x + 1 >= 0,
|
|
473
|
+
An inequality (-1, -2, 1) x + 2 >= 0,
|
|
474
|
+
An inequality (-1, 1, -2) x + 2 >= 0)
|
|
475
|
+
|
|
476
|
+
.. PLOT::
|
|
477
|
+
:width: 300 px
|
|
478
|
+
|
|
479
|
+
T = TropicalSemiring(QQ)
|
|
480
|
+
R = PolynomialRing(T, ('x,y,z'))
|
|
481
|
+
x, y, z = R.gen(), R.gen(1), R.gen(2)
|
|
482
|
+
p1 = x**2 + x*y*z + x + y + z + R(0)
|
|
483
|
+
sphinx_plot(p1.newton_polytope().plot())
|
|
484
|
+
"""
|
|
485
|
+
from sage.geometry.polyhedron.constructor import Polyhedron
|
|
486
|
+
|
|
487
|
+
exponents = self.exponents()
|
|
488
|
+
return Polyhedron(exponents)
|
|
489
|
+
|
|
490
|
+
def dual_subdivision(self):
|
|
491
|
+
"""
|
|
492
|
+
Return the dual subdivision of ``self``.
|
|
493
|
+
|
|
494
|
+
Dual subdivision refers to a specific decomposition of the
|
|
495
|
+
Newton polytope of a tropical polynomial. The term "dual" is
|
|
496
|
+
used in the sense that the combinatorial structure of the
|
|
497
|
+
tropical variety is reflected in the dual subdivision.
|
|
498
|
+
Specifically, vertices of the dual subdivision correspond to
|
|
499
|
+
the intersection of multiple components. Edges of the dual
|
|
500
|
+
subdivision correspond to the individual components.
|
|
501
|
+
|
|
502
|
+
OUTPUT: :class:`~sage.geometry.polyhedral_complex.PolyhedralComplex`
|
|
503
|
+
|
|
504
|
+
EXAMPLES:
|
|
505
|
+
|
|
506
|
+
Dual subdivision of a tropical curve::
|
|
507
|
+
|
|
508
|
+
sage: # needs sage.geometry.polyhedron
|
|
509
|
+
sage: T = TropicalSemiring(QQ, use_min=False)
|
|
510
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
511
|
+
sage: p1 = R(3) + R(2)*x + R(2)*y + R(3)*x*y + x^2 + y^2
|
|
512
|
+
sage: pc = p1.dual_subdivision(); pc
|
|
513
|
+
Polyhedral complex with 4 maximal cells
|
|
514
|
+
sage: [p.Vrepresentation() for p in pc.maximal_cells_sorted()]
|
|
515
|
+
[(A vertex at (0, 0), A vertex at (0, 1), A vertex at (1, 1)),
|
|
516
|
+
(A vertex at (0, 0), A vertex at (1, 0), A vertex at (1, 1)),
|
|
517
|
+
(A vertex at (0, 1), A vertex at (0, 2), A vertex at (1, 1)),
|
|
518
|
+
(A vertex at (1, 0), A vertex at (1, 1), A vertex at (2, 0))]
|
|
519
|
+
|
|
520
|
+
.. PLOT::
|
|
521
|
+
:width: 300 px
|
|
522
|
+
|
|
523
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
524
|
+
R = PolynomialRing(T, ('x,y'))
|
|
525
|
+
x, y = R.gen(), R.gen(1)
|
|
526
|
+
p1 = R(3) + R(2)*x + R(2)*y + R(3)*x*y + x**2 + y**2
|
|
527
|
+
sphinx_plot(p1.dual_subdivision().plot())
|
|
528
|
+
|
|
529
|
+
A subdivision of a pentagonal Newton polytope::
|
|
530
|
+
|
|
531
|
+
sage: # needs sage.geometry.polyhedron
|
|
532
|
+
sage: p2 = R(3) + x^2 + R(-2)*y + R(1/2)*x^2*y + R(2)*x*y^3 + R(-1)*x^3*y^4
|
|
533
|
+
sage: pc = p2.dual_subdivision(); pc
|
|
534
|
+
Polyhedral complex with 5 maximal cells
|
|
535
|
+
sage: [p.Vrepresentation() for p in pc.maximal_cells_sorted()]
|
|
536
|
+
[(A vertex at (0, 0), A vertex at (0, 1), A vertex at (1, 3)),
|
|
537
|
+
(A vertex at (0, 0), A vertex at (1, 3), A vertex at (2, 1)),
|
|
538
|
+
(A vertex at (0, 0), A vertex at (2, 0), A vertex at (2, 1)),
|
|
539
|
+
(A vertex at (1, 3), A vertex at (2, 1), A vertex at (3, 4)),
|
|
540
|
+
(A vertex at (2, 0), A vertex at (2, 1), A vertex at (3, 4))]
|
|
541
|
+
|
|
542
|
+
.. PLOT::
|
|
543
|
+
:width: 300 px
|
|
544
|
+
|
|
545
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
546
|
+
R = PolynomialRing(T, ('x,y'))
|
|
547
|
+
x, y = R.gen(), R.gen(1)
|
|
548
|
+
p2 = R(3) + x**2 + R(-2)*y + R(1/2)*x**2*y + R(2)*x*y**3 + R(-1)*x**3*y**4
|
|
549
|
+
sphinx_plot(p2.dual_subdivision().plot())
|
|
550
|
+
|
|
551
|
+
A subdivision with many faces, not all of which are triangles::
|
|
552
|
+
|
|
553
|
+
sage: # needs sage.geometry.polyhedron
|
|
554
|
+
sage: T = TropicalSemiring(QQ)
|
|
555
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
556
|
+
sage: p3 = (R(8) + R(4)*x + R(2)*y + R(1)*x^2 + x*y + R(1)*y^2
|
|
557
|
+
....: + R(2)*x^3 + x^2*y + x*y^2 + R(4)*y^3 + R(8)*x^4
|
|
558
|
+
....: + R(4)*x^3*y + x^2*y^2 + R(2)*x*y^3 + y^4)
|
|
559
|
+
sage: pc = p3.dual_subdivision(); pc
|
|
560
|
+
Polyhedral complex with 10 maximal cells
|
|
561
|
+
sage: [p.Vrepresentation() for p in pc.maximal_cells_sorted()]
|
|
562
|
+
[(A vertex at (0, 0), A vertex at (0, 1), A vertex at (1, 0)),
|
|
563
|
+
(A vertex at (0, 1), A vertex at (0, 2), A vertex at (1, 1)),
|
|
564
|
+
(A vertex at (0, 1), A vertex at (1, 0), A vertex at (2, 0)),
|
|
565
|
+
(A vertex at (0, 1), A vertex at (1, 1), A vertex at (2, 0)),
|
|
566
|
+
(A vertex at (0, 2), A vertex at (0, 4), A vertex at (1, 1)),
|
|
567
|
+
(A vertex at (0, 4),
|
|
568
|
+
A vertex at (1, 1),
|
|
569
|
+
A vertex at (2, 1),
|
|
570
|
+
A vertex at (2, 2)),
|
|
571
|
+
(A vertex at (1, 1), A vertex at (2, 0), A vertex at (2, 1)),
|
|
572
|
+
(A vertex at (2, 0), A vertex at (2, 1), A vertex at (3, 0)),
|
|
573
|
+
(A vertex at (2, 1), A vertex at (2, 2), A vertex at (3, 0)),
|
|
574
|
+
(A vertex at (2, 2), A vertex at (3, 0), A vertex at (4, 0))]
|
|
575
|
+
|
|
576
|
+
.. PLOT::
|
|
577
|
+
:width: 300 px
|
|
578
|
+
|
|
579
|
+
T = TropicalSemiring(QQ)
|
|
580
|
+
R = PolynomialRing(T, ('x,y'))
|
|
581
|
+
x, y = R.gen(), R.gen(1)
|
|
582
|
+
p3 = (R(8) + R(4)*x + R(2)*y + R(1)*x**2 + x*y + R(1)*y**2
|
|
583
|
+
+ R(2)*x**3 + x**2*y + x*y**2 + R(4)*y**3 + R(8)*x**4
|
|
584
|
+
+ R(4)*x**3*y + x**2*y**2 + R(2)*x*y**3 + y**4)
|
|
585
|
+
sphinx_plot(p3.dual_subdivision().plot())
|
|
586
|
+
|
|
587
|
+
Dual subdivision of a tropical surface::
|
|
588
|
+
|
|
589
|
+
sage: # needs sage.geometry.polyhedron
|
|
590
|
+
sage: T = TropicalSemiring(QQ)
|
|
591
|
+
sage: R.<x,y,z> = PolynomialRing(T)
|
|
592
|
+
sage: p1 = x + y + z + x^2 + R(1)
|
|
593
|
+
sage: pc = p1.dual_subdivision(); pc
|
|
594
|
+
Polyhedral complex with 7 maximal cells
|
|
595
|
+
sage: [p.Vrepresentation() for p in pc.maximal_cells_sorted()]
|
|
596
|
+
[(A vertex at (0, 0, 0), A vertex at (0, 0, 1), A vertex at (0, 1, 0)),
|
|
597
|
+
(A vertex at (0, 0, 0), A vertex at (0, 0, 1), A vertex at (1, 0, 0)),
|
|
598
|
+
(A vertex at (0, 0, 0), A vertex at (0, 1, 0), A vertex at (1, 0, 0)),
|
|
599
|
+
(A vertex at (0, 0, 1), A vertex at (0, 1, 0), A vertex at (1, 0, 0)),
|
|
600
|
+
(A vertex at (0, 0, 1), A vertex at (0, 1, 0), A vertex at (2, 0, 0)),
|
|
601
|
+
(A vertex at (0, 0, 1), A vertex at (1, 0, 0), A vertex at (2, 0, 0)),
|
|
602
|
+
(A vertex at (0, 1, 0), A vertex at (1, 0, 0), A vertex at (2, 0, 0))]
|
|
603
|
+
|
|
604
|
+
.. PLOT::
|
|
605
|
+
:width: 300 px
|
|
606
|
+
|
|
607
|
+
T = TropicalSemiring(QQ, use_min=False)
|
|
608
|
+
R = PolynomialRing(T, ('x,y,z'))
|
|
609
|
+
x, y, z = R.gen(), R.gen(1), R.gen(2)
|
|
610
|
+
p1 = x + y + z + x**2 + R(1)
|
|
611
|
+
sphinx_plot(p1.dual_subdivision().plot())
|
|
612
|
+
|
|
613
|
+
Dual subdivision of a tropical hypersurface::
|
|
614
|
+
|
|
615
|
+
sage: # needs sage.geometry.polyhedron
|
|
616
|
+
sage: T = TropicalSemiring(QQ)
|
|
617
|
+
sage: R.<a,b,c,d> = PolynomialRing(T)
|
|
618
|
+
sage: p1 = R(2)*a*b + R(3)*a*c + R(-1)*c^2 + R(-1/3)*a*d
|
|
619
|
+
sage: pc = p1.dual_subdivision(); pc
|
|
620
|
+
Polyhedral complex with 4 maximal cells
|
|
621
|
+
sage: [p.Vrepresentation() for p in pc.maximal_cells_sorted()]
|
|
622
|
+
[(A vertex at (0, 0, 2, 0),
|
|
623
|
+
A vertex at (1, 0, 0, 1),
|
|
624
|
+
A vertex at (1, 0, 1, 0)),
|
|
625
|
+
(A vertex at (0, 0, 2, 0),
|
|
626
|
+
A vertex at (1, 0, 0, 1),
|
|
627
|
+
A vertex at (1, 1, 0, 0)),
|
|
628
|
+
(A vertex at (0, 0, 2, 0),
|
|
629
|
+
A vertex at (1, 0, 1, 0),
|
|
630
|
+
A vertex at (1, 1, 0, 0)),
|
|
631
|
+
(A vertex at (1, 0, 0, 1),
|
|
632
|
+
A vertex at (1, 0, 1, 0),
|
|
633
|
+
A vertex at (1, 1, 0, 0))]
|
|
634
|
+
"""
|
|
635
|
+
from sage.geometry.polyhedral_complex import PolyhedralComplex
|
|
636
|
+
from sage.geometry.polyhedron.constructor import Polyhedron
|
|
637
|
+
|
|
638
|
+
TV = self.tropical_variety()
|
|
639
|
+
cycles = []
|
|
640
|
+
|
|
641
|
+
if TV.dimension() == 2:
|
|
642
|
+
for indices in TV._vertices_components().values():
|
|
643
|
+
cycle = []
|
|
644
|
+
for index in indices:
|
|
645
|
+
cycle.extend(TV._keys[index[0]])
|
|
646
|
+
cycles.append(cycle)
|
|
647
|
+
else:
|
|
648
|
+
line_comps = TV.weight_vectors()[1]
|
|
649
|
+
for indices in line_comps.values():
|
|
650
|
+
cycle = []
|
|
651
|
+
for index in indices:
|
|
652
|
+
cycle.extend(TV._keys[index])
|
|
653
|
+
cycles.append(cycle)
|
|
654
|
+
|
|
655
|
+
polyhedron_lst = []
|
|
656
|
+
for cycle in cycles:
|
|
657
|
+
polyhedron = Polyhedron(vertices=cycle)
|
|
658
|
+
polyhedron_lst.append(polyhedron)
|
|
659
|
+
pc = PolyhedralComplex(polyhedron_lst)
|
|
660
|
+
return pc
|
|
661
|
+
|
|
662
|
+
def _repr_(self):
|
|
663
|
+
r"""
|
|
664
|
+
Return a string representation of ``self``.
|
|
665
|
+
|
|
666
|
+
Note that ``x`` equals ``0*x``, which is different from
|
|
667
|
+
``1*x``. Therefore, we represent monomials always together
|
|
668
|
+
with their coefficients, to avoid confusion.
|
|
669
|
+
|
|
670
|
+
EXAMPLES::
|
|
671
|
+
|
|
672
|
+
sage: T = TropicalSemiring(QQ)
|
|
673
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
674
|
+
sage: x + R(-1)*y + R(-3)
|
|
675
|
+
0*x + (-1)*y + (-3)
|
|
676
|
+
|
|
677
|
+
"""
|
|
678
|
+
if not self.monomial_coefficients():
|
|
679
|
+
return str(self.parent().base().zero())
|
|
680
|
+
try:
|
|
681
|
+
key = self.parent().term_order().sortkey
|
|
682
|
+
except AttributeError:
|
|
683
|
+
key = None
|
|
684
|
+
atomic = self.parent().base_ring()._repr_option('element_is_atomic')
|
|
685
|
+
s = self.element().poly_repr(self.parent().variable_names(),
|
|
686
|
+
atomic_coefficients=atomic,
|
|
687
|
+
sortkey=key)
|
|
688
|
+
if self.monomials()[-1].is_constant():
|
|
689
|
+
if self.monomial_coefficient(self.parent()(0)) < 0:
|
|
690
|
+
s = s.replace(" - ", " + -")
|
|
691
|
+
const = str(self.monomial_coefficient(self.parent(0)))
|
|
692
|
+
s = s.replace(f" {const}", f" ({const})")
|
|
693
|
+
return s
|
|
694
|
+
|
|
695
|
+
def _latex_(self):
|
|
696
|
+
r"""
|
|
697
|
+
Return a latex representation of ``self``.
|
|
698
|
+
|
|
699
|
+
EXAMPLES::
|
|
700
|
+
|
|
701
|
+
sage: T = TropicalSemiring(QQ)
|
|
702
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
703
|
+
sage: p1 = x^2 + R(-1)*x*y + R(-1)
|
|
704
|
+
sage: latex(p1)
|
|
705
|
+
0 x^{2} + \left(-1\right) x y + \left(-1\right)
|
|
706
|
+
sage: latex(R.zero())
|
|
707
|
+
\infty
|
|
708
|
+
"""
|
|
709
|
+
if not self.monomial_coefficients():
|
|
710
|
+
return self.parent().base().zero()._latex_()
|
|
711
|
+
s = super()._latex_()
|
|
712
|
+
if self.monomials()[-1].is_constant():
|
|
713
|
+
if self.monomial_coefficient(self.parent()(0)) < 0:
|
|
714
|
+
s = s.replace(" - ", " + -")
|
|
715
|
+
const = str(self.monomial_coefficient(self.parent(0)))
|
|
716
|
+
s = s.replace(f" {const}", f" \\left({const}\\right)")
|
|
717
|
+
return s
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
class TropicalMPolynomialSemiring(UniqueRepresentation, Parent):
|
|
721
|
+
r"""
|
|
722
|
+
The semiring of tropical polynomials in multiple variables.
|
|
723
|
+
|
|
724
|
+
This is the commutative semiring consisting of all finite linear
|
|
725
|
+
combinations of tropical monomials under (tropical) addition
|
|
726
|
+
and multiplication with coefficients in a tropical semiring.
|
|
727
|
+
|
|
728
|
+
EXAMPLES::
|
|
729
|
+
|
|
730
|
+
sage: T = TropicalSemiring(QQ)
|
|
731
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
732
|
+
sage: f = T(1)*x + T(-1)*y
|
|
733
|
+
sage: g = T(2)*x + T(-2)*y
|
|
734
|
+
sage: f + g
|
|
735
|
+
1*x + (-2)*y
|
|
736
|
+
sage: f * g
|
|
737
|
+
3*x^2 + (-1)*x*y + (-3)*y^2
|
|
738
|
+
sage: f + R.zero() == f
|
|
739
|
+
True
|
|
740
|
+
sage: f * R.zero() == R.zero()
|
|
741
|
+
True
|
|
742
|
+
sage: f * R.one() == f
|
|
743
|
+
True
|
|
744
|
+
"""
|
|
745
|
+
def __init__(self, base_semiring, n, names, order):
|
|
746
|
+
r"""
|
|
747
|
+
Initialize ``self``.
|
|
748
|
+
|
|
749
|
+
EXAMPLES::
|
|
750
|
+
|
|
751
|
+
sage: T = TropicalSemiring(QQ)
|
|
752
|
+
sage: R = PolynomialRing(T, 5, 'x')
|
|
753
|
+
sage: TestSuite(R).run()
|
|
754
|
+
"""
|
|
755
|
+
from sage.categories.semirings import Semirings
|
|
756
|
+
from sage.rings.semirings.tropical_semiring import TropicalSemiring
|
|
757
|
+
if not isinstance(base_semiring, TropicalSemiring):
|
|
758
|
+
raise ValueError(f"{base_semiring} is not a tropical semiring")
|
|
759
|
+
Parent.__init__(self, base=base_semiring, names=names, category=Semirings())
|
|
760
|
+
self._ngens = n
|
|
761
|
+
self._term_order = order
|
|
762
|
+
|
|
763
|
+
def term_order(self):
|
|
764
|
+
"""
|
|
765
|
+
Return the defined term order of ``self``.
|
|
766
|
+
|
|
767
|
+
EXAMPLES::
|
|
768
|
+
|
|
769
|
+
sage: T = TropicalSemiring(QQ)
|
|
770
|
+
sage: R.<x,y,z> = PolynomialRing(T)
|
|
771
|
+
sage: R.term_order()
|
|
772
|
+
Degree reverse lexicographic term order
|
|
773
|
+
"""
|
|
774
|
+
return self._term_order
|
|
775
|
+
|
|
776
|
+
Element = TropicalMPolynomial
|
|
777
|
+
|
|
778
|
+
def _element_constructor_(self, x):
|
|
779
|
+
r""""
|
|
780
|
+
Convert ``x`` into ``self``.
|
|
781
|
+
|
|
782
|
+
INPUT:
|
|
783
|
+
|
|
784
|
+
- ``x`` -- ``dict``, constant, or :class:`MPolynomial`
|
|
785
|
+
|
|
786
|
+
EXAMPLES::
|
|
787
|
+
|
|
788
|
+
sage: T = TropicalSemiring(QQ)
|
|
789
|
+
sage: R = PolynomialRing(T, 'x,y')
|
|
790
|
+
sage: dict1 = {(1,0):0, (0,1):-1, (1,1):3}
|
|
791
|
+
sage: p1 = R(dict1); p1
|
|
792
|
+
3*x*y + 0*x + (-1)*y
|
|
793
|
+
sage: S.<x,y> = PolynomialRing(QQ)
|
|
794
|
+
sage: f = -x*y + 1
|
|
795
|
+
sage: R(f)
|
|
796
|
+
(-1)*x*y + 1
|
|
797
|
+
|
|
798
|
+
TESTS::
|
|
799
|
+
|
|
800
|
+
sage: T = TropicalSemiring(QQ)
|
|
801
|
+
sage: R.<x,y> = PolynomialRing(T)
|
|
802
|
+
sage: S.<a,b> = PolynomialRing(T)
|
|
803
|
+
sage: R(a + b)
|
|
804
|
+
Traceback (most recent call last):
|
|
805
|
+
...
|
|
806
|
+
ValueError: can not convert 0*a + 0*b to Multivariate Tropical
|
|
807
|
+
Polynomial Semiring in x, y over Rational Field
|
|
808
|
+
"""
|
|
809
|
+
from sage.rings.polynomial.multi_polynomial import MPolynomial
|
|
810
|
+
if isinstance(x, TropicalMPolynomial):
|
|
811
|
+
if x.parent() is not self:
|
|
812
|
+
raise ValueError(f"can not convert {x} to {self}")
|
|
813
|
+
if isinstance(x, MPolynomial):
|
|
814
|
+
if x.parent().variable_names() == self.variable_names():
|
|
815
|
+
x = x.monomial_coefficients()
|
|
816
|
+
else:
|
|
817
|
+
raise ValueError(f"can not convert {x} to {self}")
|
|
818
|
+
elif (x in self.base().base_ring()) or (x in self.base()):
|
|
819
|
+
term = [0] * self.ngens()
|
|
820
|
+
x = {tuple(term): x}
|
|
821
|
+
|
|
822
|
+
if isinstance(x, dict):
|
|
823
|
+
for key, value in x.items():
|
|
824
|
+
x[key] = self.base()(value)
|
|
825
|
+
return self.element_class(self, x)
|
|
826
|
+
|
|
827
|
+
@cached_method
|
|
828
|
+
def one(self):
|
|
829
|
+
r"""
|
|
830
|
+
Return the multiplicative identity of ``self``.
|
|
831
|
+
|
|
832
|
+
EXAMPLES::
|
|
833
|
+
|
|
834
|
+
sage: T = TropicalSemiring(QQ)
|
|
835
|
+
sage: R = PolynomialRing(T, 'x,y')
|
|
836
|
+
sage: R.one()
|
|
837
|
+
0
|
|
838
|
+
"""
|
|
839
|
+
exponent = [0] * self.ngens()
|
|
840
|
+
return self.element_class(self, {tuple(exponent): self.base().one()})
|
|
841
|
+
|
|
842
|
+
@cached_method
|
|
843
|
+
def zero(self):
|
|
844
|
+
r"""
|
|
845
|
+
Return the additive identity of ``self``.
|
|
846
|
+
|
|
847
|
+
EXAMPLES::
|
|
848
|
+
|
|
849
|
+
sage: T = TropicalSemiring(QQ)
|
|
850
|
+
sage: R = PolynomialRing(T, 'x,y')
|
|
851
|
+
sage: R.zero()
|
|
852
|
+
+infinity
|
|
853
|
+
"""
|
|
854
|
+
exponent = [0] * self.ngens()
|
|
855
|
+
return self.element_class(self, {tuple(exponent): self.base().zero()})
|
|
856
|
+
|
|
857
|
+
def _repr_(self):
|
|
858
|
+
r"""
|
|
859
|
+
Return a string representation of ``self``.
|
|
860
|
+
|
|
861
|
+
EXAMPLES::
|
|
862
|
+
|
|
863
|
+
sage: T = TropicalSemiring(RR)
|
|
864
|
+
sage: R.<u,v,w> = PolynomialRing(T); R
|
|
865
|
+
Multivariate Tropical Polynomial Semiring in u, v, w over Real
|
|
866
|
+
Field with 53 bits of precision
|
|
867
|
+
"""
|
|
868
|
+
if self._ngens == 0:
|
|
869
|
+
return (f"Multivariate Tropical Polynomial Semiring in no variables"
|
|
870
|
+
f" over {self.base_ring().base_ring()}")
|
|
871
|
+
return (f"Multivariate Tropical Polynomial Semiring in {', '.join(self.variable_names())}"
|
|
872
|
+
f" over {self.base_ring().base_ring()}")
|
|
873
|
+
|
|
874
|
+
def random_element(self, degree=2, terms=None, choose_degree=False,
|
|
875
|
+
*args, **kwargs):
|
|
876
|
+
r"""
|
|
877
|
+
Return a random multivariate tropical polynomial from ``self``.
|
|
878
|
+
|
|
879
|
+
OUTPUT: :class:`TropicalMPolynomial`
|
|
880
|
+
|
|
881
|
+
.. SEEALSO::
|
|
882
|
+
|
|
883
|
+
:meth:`sage.rings.polynomial.multi_polynomial_ring_base.MPolynomialRing_base.random_element`
|
|
884
|
+
|
|
885
|
+
EXAMPLES:
|
|
886
|
+
|
|
887
|
+
A random polynomial of at most degree `d` and at most `t` terms::
|
|
888
|
+
|
|
889
|
+
sage: T = TropicalSemiring(QQ)
|
|
890
|
+
sage: R.<a,b,c> = PolynomialRing(T)
|
|
891
|
+
sage: f = R.random_element(2, 5)
|
|
892
|
+
sage: f.degree() <= 2
|
|
893
|
+
True
|
|
894
|
+
sage: f.parent() is R
|
|
895
|
+
True
|
|
896
|
+
sage: len(list(f)) <= 5
|
|
897
|
+
True
|
|
898
|
+
|
|
899
|
+
Choose degrees of monomials randomly first rather than monomials
|
|
900
|
+
uniformly random::
|
|
901
|
+
|
|
902
|
+
sage: f = R.random_element(3, 6, choose_degree=True)
|
|
903
|
+
sage: f.degree() <= 3
|
|
904
|
+
True
|
|
905
|
+
sage: f.parent() is R
|
|
906
|
+
True
|
|
907
|
+
sage: len(list(f)) <= 6
|
|
908
|
+
True
|
|
909
|
+
"""
|
|
910
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
911
|
+
R = PolynomialRing(self.base().base_ring(), self.variable_names())
|
|
912
|
+
f = R.random_element(degree=degree, terms=terms, choose_degree=choose_degree,
|
|
913
|
+
*args, **kwargs)
|
|
914
|
+
new_dict = {key: self.base()(value)
|
|
915
|
+
for key, value in f.monomial_coefficients().items()}
|
|
916
|
+
return self.element_class(self, new_dict)
|
|
917
|
+
|
|
918
|
+
def gen(self, n=0):
|
|
919
|
+
r"""
|
|
920
|
+
Return the ``n``-th generator of ``self``.
|
|
921
|
+
|
|
922
|
+
EXAMPLES::
|
|
923
|
+
|
|
924
|
+
sage: T = TropicalSemiring(QQ)
|
|
925
|
+
sage: R.<a,b,c> = PolynomialRing(T)
|
|
926
|
+
sage: R.gen()
|
|
927
|
+
0*a
|
|
928
|
+
sage: R.gen(2)
|
|
929
|
+
0*c
|
|
930
|
+
|
|
931
|
+
TESTS::
|
|
932
|
+
|
|
933
|
+
sage: R.gen(3)
|
|
934
|
+
Traceback (most recent call last):
|
|
935
|
+
...
|
|
936
|
+
IndexError: tuple index out of range
|
|
937
|
+
"""
|
|
938
|
+
return self.gens()[n]
|
|
939
|
+
|
|
940
|
+
@cached_method
|
|
941
|
+
def gens(self) -> tuple:
|
|
942
|
+
r"""
|
|
943
|
+
Return the generators of ``self``.
|
|
944
|
+
|
|
945
|
+
EXAMPLES::
|
|
946
|
+
|
|
947
|
+
sage: T = TropicalSemiring(QQ)
|
|
948
|
+
sage: R = PolynomialRing(T, 5, 'x')
|
|
949
|
+
sage: R.gens()
|
|
950
|
+
(0*x0, 0*x1, 0*x2, 0*x3, 0*x4)
|
|
951
|
+
"""
|
|
952
|
+
gens = []
|
|
953
|
+
for i in range(self.ngens()):
|
|
954
|
+
exponent = [0] * self.ngens()
|
|
955
|
+
exponent[i] = 1
|
|
956
|
+
element = self.element_class(self, {tuple(exponent): self.base().one()})
|
|
957
|
+
gens.append(element)
|
|
958
|
+
return tuple(gens)
|
|
959
|
+
|
|
960
|
+
def ngens(self):
|
|
961
|
+
r"""
|
|
962
|
+
Return the number of generators of ``self``.
|
|
963
|
+
|
|
964
|
+
EXAMPLES::
|
|
965
|
+
|
|
966
|
+
sage: T = TropicalSemiring(QQ)
|
|
967
|
+
sage: R = PolynomialRing(T, 10, 'z')
|
|
968
|
+
sage: R.ngens()
|
|
969
|
+
10
|
|
970
|
+
"""
|
|
971
|
+
from sage.rings.integer_ring import ZZ
|
|
972
|
+
return ZZ(self._ngens)
|