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.
Files changed (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. 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)