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,1071 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.combinat
3
+ """
4
+ Indexed Monoids
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2013-10-15)
9
+ """
10
+
11
+ # ****************************************************************************
12
+ # Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
13
+ #
14
+ # Distributed under the terms of the GNU General Public License (GPL)
15
+ # https://www.gnu.org/licenses/
16
+ # ****************************************************************************
17
+
18
+ from copy import copy
19
+ from sage.misc.abstract_method import abstract_method
20
+ from sage.misc.cachefunc import cached_method
21
+ from sage.structure.parent import Parent
22
+ from sage.structure.unique_representation import UniqueRepresentation
23
+ from sage.structure.element import MonoidElement
24
+ from sage.structure.indexed_generators import IndexedGenerators, parse_indices_names
25
+ from sage.structure.richcmp import op_EQ, op_NE, richcmp, rich_to_bool
26
+ import sage.data_structures.blas_dict as blas
27
+
28
+ from sage.categories.monoids import Monoids
29
+ from sage.categories.poor_man_map import PoorManMap
30
+ from sage.categories.sets_cat import Sets
31
+ from sage.rings.integer import Integer
32
+ from sage.rings.infinity import infinity
33
+ from sage.rings.integer_ring import ZZ
34
+ from sage.sets.family import Family
35
+
36
+
37
+ class IndexedMonoidElement(MonoidElement):
38
+ """
39
+ An element of an indexed monoid.
40
+
41
+ This is an abstract class which uses the (abstract) method
42
+ :meth:`_sorted_items` for all of its functions. So to implement an
43
+ element of an indexed monoid, one just needs to implement
44
+ :meth:`_sorted_items`, which returns a list of pairs ``(i, p)`` where
45
+ ``i`` is the index and ``p`` is the corresponding power, sorted in some
46
+ order. For example, in the free monoid there is no such choice, but for
47
+ the free abelian monoid, one could want lex order or have the highest
48
+ powers first.
49
+
50
+ Indexed monoid elements are ordered lexicographically with respect to
51
+ the result of :meth:`_sorted_items` (which for abelian free monoids is
52
+ influenced by the order on the indexing set).
53
+ """
54
+ def __init__(self, F, x):
55
+ """
56
+ Create the element ``x`` of an indexed free abelian monoid ``F``.
57
+
58
+ EXAMPLES::
59
+
60
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
61
+ sage: F.gen(1)
62
+ F[1]
63
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
64
+ sage: x = a^2 * b^3 * a^2 * b^4; x
65
+ F[0]^4*F[1]^7
66
+ sage: TestSuite(x).run()
67
+
68
+ sage: F = FreeMonoid(index_set=tuple('abcde'))
69
+ sage: a,b,c,d,e = F.gens()
70
+ sage: a in F
71
+ True
72
+ sage: a*b in F
73
+ True
74
+ sage: TestSuite(a*d^2*e*c*a).run()
75
+ """
76
+ MonoidElement.__init__(self, F)
77
+ self._monomial = x
78
+
79
+ @abstract_method
80
+ def _sorted_items(self):
81
+ """
82
+ Return the sorted items (i.e factors) of ``self``.
83
+
84
+ EXAMPLES::
85
+
86
+ sage: F = FreeMonoid(index_set=ZZ)
87
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
88
+ sage: x = a*b^2*e*d
89
+ sage: x._sorted_items()
90
+ ((0, 1), (1, 2), (4, 1), (3, 1))
91
+
92
+ .. SEEALSO::
93
+
94
+ :meth:`_repr_`, :meth:`_latex_`, :meth:`print_options`
95
+ """
96
+
97
+ def _repr_(self):
98
+ """
99
+ Return a string representation of ``self``.
100
+
101
+ EXAMPLES::
102
+
103
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
104
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
105
+ sage: a*b^2*e*d
106
+ F[0]*F[1]^2*F[3]*F[4]
107
+ """
108
+ if not self._monomial:
109
+ return '1'
110
+
111
+ monomial = self._sorted_items()
112
+ P = self.parent()
113
+
114
+ scalar_mult = P._print_options['scalar_mult']
115
+
116
+ exp = lambda v: f'^{v}' if v != 1 else ''
117
+ return scalar_mult.join(P._repr_generator(g) + exp(v) for g,v in monomial)
118
+
119
+ def _ascii_art_(self):
120
+ r"""
121
+ Return an ASCII art representation of ``self``.
122
+
123
+ EXAMPLES::
124
+
125
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
126
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
127
+ sage: ascii_art(a*e*d)
128
+ F *F *F
129
+ 0 3 4
130
+ sage: ascii_art(a*b^2*e*d)
131
+ 2
132
+ F *F *F *F
133
+ 0 1 3 4
134
+ """
135
+ from sage.typeset.ascii_art import AsciiArt, ascii_art, empty_ascii_art
136
+
137
+ if not self._monomial:
138
+ return AsciiArt(["1"])
139
+
140
+ monomial = self._sorted_items()
141
+ P = self.parent()
142
+ scalar_mult = P._print_options['scalar_mult']
143
+
144
+ if all(x[1] == 1 for x in monomial):
145
+ ascii_art_gen = lambda m: P._ascii_art_generator(m[0])
146
+ else:
147
+ pref = AsciiArt([P.prefix()])
148
+
149
+ def ascii_art_gen(m):
150
+ if m[1] != 1:
151
+ r = (AsciiArt([" " * len(pref)]) + ascii_art(m[1]))
152
+ else:
153
+ r = empty_ascii_art
154
+ r = r * P._ascii_art_generator(m[0])
155
+ r._baseline = r._h - 2
156
+ return r
157
+ b = ascii_art_gen(monomial[0])
158
+ for x in monomial[1:]:
159
+ b = b + AsciiArt([scalar_mult]) + ascii_art_gen(x)
160
+ return b
161
+
162
+ def _latex_(self):
163
+ r"""
164
+ Return a `\LaTeX` representation of ``self``.
165
+
166
+ EXAMPLES::
167
+
168
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
169
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
170
+ sage: latex(a*b^2*e*d)
171
+ F_{0} F_{1}^{2} F_{3} F_{4}
172
+ """
173
+ if not self._monomial:
174
+ return '1'
175
+
176
+ monomial = self._sorted_items()
177
+ P = self.parent()
178
+
179
+ scalar_mult = P._print_options['latex_scalar_mult']
180
+ if scalar_mult is None:
181
+ scalar_mult = P._print_options['scalar_mult']
182
+ if scalar_mult == "*":
183
+ scalar_mult = " "
184
+
185
+ exp = lambda v: f'^{{{v}}}' if v != 1 else ''
186
+ return scalar_mult.join(P._latex_generator(g) + exp(v) for g,v in monomial)
187
+
188
+ def __iter__(self):
189
+ """
190
+ Iterate over ``self``.
191
+
192
+ EXAMPLES::
193
+
194
+ sage: F = FreeMonoid(index_set=ZZ)
195
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
196
+ sage: list(b*a*c^3*b)
197
+ [(F[1], 1), (F[0], 1), (F[2], 3), (F[1], 1)]
198
+
199
+ ::
200
+
201
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
202
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
203
+ sage: list(b*c^3*a)
204
+ [(F[0], 1), (F[1], 1), (F[2], 3)]
205
+ """
206
+ return ((self.parent().gen(index), exp) for (index,exp) in self._sorted_items())
207
+
208
+ def _richcmp_(self, other, op):
209
+ r"""
210
+ Comparisons.
211
+
212
+ TESTS::
213
+
214
+ sage: F = FreeMonoid(index_set=ZZ)
215
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
216
+ sage: a == a
217
+ True
218
+ sage: a*e == a*e
219
+ True
220
+ sage: a*b*c^3*b*d == (a*b*c)*(c^2*b*d)
221
+ True
222
+ sage: a != b
223
+ True
224
+ sage: a*b != b*a
225
+ True
226
+ sage: a*b*c^3*b*d != (a*b*c)*(c^2*b*d)
227
+ False
228
+
229
+ sage: F = FreeMonoid(index_set=ZZ)
230
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
231
+ sage: a < b
232
+ True
233
+ sage: a*b < b*a
234
+ True
235
+ sage: a*b < a*a
236
+ False
237
+ sage: a^2*b < a*b*b
238
+ True
239
+ sage: b > a
240
+ True
241
+ sage: a*b > b*a
242
+ False
243
+ sage: a*b > a*a
244
+ True
245
+ sage: a*b <= b*a
246
+ True
247
+ sage: a*b <= b*a
248
+ True
249
+
250
+ sage: FA = FreeAbelianMonoid(index_set=ZZ)
251
+ sage: a,b,c,d,e = [FA.gen(i) for i in range(5)]
252
+ sage: a == a
253
+ True
254
+ sage: a*e == e*a
255
+ True
256
+ sage: a*b*c^3*b*d == a*d*(b^2*c^2)*c
257
+ True
258
+ sage: a != b
259
+ True
260
+ sage: a*b != a*a
261
+ True
262
+ sage: a*b*c^3*b*d != a*d*(b^2*c^2)*c
263
+ False
264
+ """
265
+ if self._monomial == other._monomial:
266
+ # Equal
267
+ return rich_to_bool(op, 0)
268
+ if op == op_EQ or op == op_NE:
269
+ # Not equal
270
+ return rich_to_bool(op, 1)
271
+ return richcmp(self.to_word_list(), other.to_word_list(), op)
272
+
273
+ def support(self):
274
+ """
275
+ Return a list of the objects indexing ``self`` with
276
+ nonzero exponents.
277
+
278
+ EXAMPLES::
279
+
280
+ sage: F = FreeMonoid(index_set=ZZ)
281
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
282
+ sage: (b*a*c^3*b).support()
283
+ [0, 1, 2]
284
+
285
+ ::
286
+
287
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
288
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
289
+ sage: (a*c^3).support()
290
+ [0, 2]
291
+ """
292
+ supp = {key for key, exp in self._sorted_items() if exp != 0}
293
+ try:
294
+ return sorted(supp, key=print_options['sorting_key'],
295
+ reverse=print_options['sorting_reverse'])
296
+ except Exception: # Sorting the output is a plus, but if we can't, no big deal
297
+ return list(supp)
298
+
299
+ def leading_support(self):
300
+ """
301
+ Return the support of the leading generator of ``self``.
302
+
303
+ EXAMPLES::
304
+
305
+ sage: F = FreeMonoid(index_set=ZZ)
306
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
307
+ sage: (b*a*c^3*a).leading_support()
308
+ 1
309
+
310
+ ::
311
+
312
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
313
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
314
+ sage: (b*c^3*a).leading_support()
315
+ 0
316
+ """
317
+ if not self:
318
+ return None
319
+ return self._sorted_items()[0][0]
320
+
321
+ def trailing_support(self):
322
+ """
323
+ Return the support of the trailing generator of ``self``.
324
+
325
+ EXAMPLES::
326
+
327
+ sage: F = FreeMonoid(index_set=ZZ)
328
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
329
+ sage: (b*a*c^3*a).trailing_support()
330
+ 0
331
+
332
+ ::
333
+
334
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
335
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
336
+ sage: (b*c^3*a).trailing_support()
337
+ 2
338
+ """
339
+ if not self:
340
+ return None
341
+ return self._sorted_items()[-1][0]
342
+
343
+ def to_word_list(self):
344
+ """
345
+ Return ``self`` as a word represented as a list whose entries
346
+ are indices of ``self``.
347
+
348
+ EXAMPLES::
349
+
350
+ sage: F = FreeMonoid(index_set=ZZ)
351
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
352
+ sage: (b*a*c^3*a).to_word_list()
353
+ [1, 0, 2, 2, 2, 0]
354
+
355
+ ::
356
+
357
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
358
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
359
+ sage: (b*c^3*a).to_word_list()
360
+ [0, 1, 2, 2, 2]
361
+ """
362
+ return [k for k,e in self._sorted_items() for dummy in range(e)]
363
+
364
+ def is_one(self) -> bool:
365
+ """
366
+ Return if ``self`` is the identity element.
367
+
368
+ EXAMPLES::
369
+
370
+ sage: F = FreeMonoid(index_set=ZZ)
371
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
372
+ sage: (b*a*c^3*a).is_one()
373
+ False
374
+ sage: F.one().is_one()
375
+ True
376
+
377
+ ::
378
+
379
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
380
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
381
+ sage: (b*c^3*a).is_one()
382
+ False
383
+ sage: F.one().is_one()
384
+ True
385
+ """
386
+ return not self._monomial
387
+
388
+
389
+ class IndexedFreeMonoidElement(IndexedMonoidElement):
390
+ """
391
+ An element of an indexed free abelian monoid.
392
+ """
393
+ def __init__(self, F, x):
394
+ """
395
+ Create the element ``x`` of an indexed free abelian monoid ``F``.
396
+
397
+ EXAMPLES::
398
+
399
+ sage: F = FreeMonoid(index_set=tuple('abcde'))
400
+ sage: x = F( [(1, 2), (0, 1), (3, 2), (0, 1)] )
401
+ sage: y = F( ((1, 2), (0, 1), [3, 2], [0, 1]) )
402
+ sage: z = F( reversed([(0, 1), (3, 2), (0, 1), (1, 2)]) )
403
+ sage: x == y and y == z
404
+ True
405
+ sage: TestSuite(x).run()
406
+ """
407
+ IndexedMonoidElement.__init__(self, F, tuple(map(tuple, x)))
408
+
409
+ def __hash__(self):
410
+ r"""
411
+ TESTS::
412
+
413
+ sage: F = FreeMonoid(index_set=tuple('abcde'))
414
+ sage: hash(F ([(1,2),(0,1)]) ) == hash(((1, 2), (0, 1)))
415
+ True
416
+ sage: hash(F ([(0,2),(1,1)]) ) == hash(((0, 2), (1, 1)))
417
+ True
418
+ """
419
+ return hash(self._monomial)
420
+
421
+ def _sorted_items(self):
422
+ """
423
+ Return the sorted items (i.e factors) of ``self``.
424
+
425
+ EXAMPLES::
426
+
427
+ sage: F = FreeMonoid(index_set=ZZ)
428
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
429
+ sage: x = a*b^2*e*d
430
+ sage: x._sorted_items()
431
+ ((0, 1), (1, 2), (4, 1), (3, 1))
432
+ sage: F.print_options(sorting_reverse=True)
433
+ sage: x._sorted_items()
434
+ ((0, 1), (1, 2), (4, 1), (3, 1))
435
+ sage: F.print_options(sorting_reverse=False) # reset to original state
436
+
437
+ .. SEEALSO::
438
+
439
+ :meth:`_repr_`, :meth:`_latex_`, :meth:`print_options`
440
+ """
441
+ return self._monomial
442
+
443
+ def _mul_(self, other):
444
+ """
445
+ Multiply ``self`` by ``other``.
446
+
447
+ EXAMPLES::
448
+
449
+ sage: F = FreeMonoid(index_set=ZZ)
450
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
451
+ sage: a*b^2*e*d
452
+ F[0]*F[1]^2*F[4]*F[3]
453
+ sage: (a*b^2*d^2) * (d^4*b*e)
454
+ F[0]*F[1]^2*F[3]^6*F[1]*F[4]
455
+ """
456
+ if not self._monomial:
457
+ return other
458
+ if not other._monomial:
459
+ return self
460
+
461
+ ret = list(self._monomial)
462
+ rhs = list(other._monomial)
463
+ if ret[-1][0] == rhs[0][0]:
464
+ rhs[0] = (rhs[0][0], rhs[0][1] + ret.pop()[1])
465
+ ret += rhs
466
+ return self.__class__(self.parent(), tuple(ret))
467
+
468
+ def __len__(self):
469
+ """
470
+ Return the length of ``self``.
471
+
472
+ EXAMPLES::
473
+
474
+ sage: F = FreeMonoid(index_set=ZZ)
475
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
476
+ sage: elt = a*c^3*b^2*a
477
+ sage: elt.length()
478
+ 7
479
+ sage: len(elt)
480
+ 7
481
+ """
482
+ return sum(exp for gen,exp in self._monomial)
483
+
484
+ length = __len__
485
+
486
+
487
+ class IndexedFreeAbelianMonoidElement(IndexedMonoidElement):
488
+ """
489
+ An element of an indexed free abelian monoid.
490
+ """
491
+ def __init__(self, F, x):
492
+ """
493
+ Create the element ``x`` of an indexed free abelian monoid ``F``.
494
+
495
+ EXAMPLES::
496
+
497
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
498
+ sage: x = F([(0, 1), (2, 2), (-1, 2)])
499
+ sage: y = F({0:1, 2:2, -1:2})
500
+ sage: z = F(reversed([(0, 1), (2, 2), (-1, 2)]))
501
+ sage: x == y and y == z
502
+ True
503
+ sage: TestSuite(x).run()
504
+ """
505
+ IndexedMonoidElement.__init__(self, F, dict(x))
506
+
507
+ def _sorted_items(self):
508
+ """
509
+ Return the sorted items (i.e factors) of ``self``.
510
+
511
+ EXAMPLES::
512
+
513
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
514
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
515
+ sage: x = a*b^2*e*d
516
+ sage: x._sorted_items()
517
+ [(0, 1), (1, 2), (3, 1), (4, 1)]
518
+ sage: F.print_options(sorting_reverse=True)
519
+ sage: x._sorted_items()
520
+ [(4, 1), (3, 1), (1, 2), (0, 1)]
521
+ sage: F.print_options(sorting_reverse=False) # reset to original state
522
+
523
+ .. SEEALSO::
524
+
525
+ :meth:`_repr_`, :meth:`_latex_`, :meth:`print_options`
526
+ """
527
+ print_options = self.parent().print_options()
528
+ v = list(self._monomial.items())
529
+ try:
530
+ v.sort(key=print_options['sorting_key'],
531
+ reverse=print_options['sorting_reverse'])
532
+ except Exception: # Sorting the output is a plus, but if we can't, no big deal
533
+ pass
534
+ return v
535
+
536
+ def __hash__(self):
537
+ r"""
538
+ TESTS::
539
+
540
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
541
+ sage: H1 = hash( F([(0,1), (2,2)]) )
542
+ sage: H2 = hash( F([(2,1)]) )
543
+ sage: H1 == H2
544
+ False
545
+ """
546
+ return hash(frozenset(self._monomial.items()))
547
+
548
+ def _mul_(self, other):
549
+ """
550
+ Multiply ``self`` by ``other``.
551
+
552
+ EXAMPLES::
553
+
554
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
555
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
556
+ sage: a*b^2*e*d
557
+ F[0]*F[1]^2*F[3]*F[4]
558
+ """
559
+ return self.__class__(self.parent(),
560
+ blas.add(self._monomial, other._monomial))
561
+
562
+ def __pow__(self, n):
563
+ """
564
+ Raise ``self`` to the power of ``n``.
565
+
566
+ EXAMPLES::
567
+
568
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
569
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
570
+ sage: x = a*b^2*e*d; x
571
+ F[0]*F[1]^2*F[3]*F[4]
572
+ sage: x^3
573
+ F[0]^3*F[1]^6*F[3]^3*F[4]^3
574
+ sage: x^0
575
+ 1
576
+ """
577
+ if not isinstance(n, (int, Integer)):
578
+ raise TypeError(f"Argument n (= {n}) must be an integer")
579
+ if n < 0:
580
+ raise ValueError(f"Argument n (= {n}) must be positive")
581
+ if n == 1:
582
+ return self
583
+ if n == 0:
584
+ return self.parent().one()
585
+ return self.__class__(self.parent(), {k:v*n for k,v in self._monomial.items()})
586
+
587
+ def __floordiv__(self, elt):
588
+ """
589
+ Cancel the element ``elt`` out of ``self``.
590
+
591
+ EXAMPLES::
592
+
593
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
594
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
595
+ sage: elt = a*b*c^3*d^2; elt
596
+ F[0]*F[1]*F[2]^3*F[3]^2
597
+ sage: elt // a
598
+ F[1]*F[2]^3*F[3]^2
599
+ sage: elt // c
600
+ F[0]*F[1]*F[2]^2*F[3]^2
601
+ sage: elt // (a*b*d^2)
602
+ F[2]^3
603
+ sage: elt // a^4
604
+ Traceback (most recent call last):
605
+ ...
606
+ ValueError: invalid cancellation
607
+ sage: elt // e^4
608
+ Traceback (most recent call last):
609
+ ...
610
+ ValueError: invalid cancellation
611
+ """
612
+ d = copy(self._monomial)
613
+ for k, v in elt._monomial.items():
614
+ if k not in d:
615
+ raise ValueError("invalid cancellation")
616
+ diff = d[k] - v
617
+ if diff < 0:
618
+ raise ValueError("invalid cancellation")
619
+ elif diff == 0:
620
+ del d[k]
621
+ else:
622
+ d[k] = diff
623
+ return self.__class__(self.parent(), d)
624
+
625
+ def divides(self, m) -> bool:
626
+ r"""
627
+ Return whether ``self`` divides ``m``.
628
+
629
+ EXAMPLES::
630
+
631
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
632
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
633
+ sage: elt = a*b*c^3*d^2
634
+ sage: a.divides(elt)
635
+ True
636
+ sage: c.divides(elt)
637
+ True
638
+ sage: (a*b*d^2).divides(elt)
639
+ True
640
+ sage: (a^4).divides(elt)
641
+ False
642
+ sage: e.divides(elt)
643
+ False
644
+ """
645
+ other = m._monomial
646
+ return all(k in other and v <= other[k] for k, v in self._monomial.items())
647
+
648
+ def __len__(self):
649
+ """
650
+ Return the length of ``self``.
651
+
652
+ EXAMPLES::
653
+
654
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
655
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
656
+ sage: elt = a*c^3*b^2*a
657
+ sage: elt.length()
658
+ 7
659
+ sage: len(elt)
660
+ 7
661
+ """
662
+ return sum(self._monomial.values())
663
+
664
+ length = __len__
665
+
666
+ def dict(self):
667
+ """
668
+ Return ``self`` as a dictionary.
669
+
670
+ EXAMPLES::
671
+
672
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
673
+ sage: a,b,c,d,e = [F.gen(i) for i in range(5)]
674
+ sage: (a*c^3).dict()
675
+ {0: 1, 2: 3}
676
+ """
677
+ return copy(self._monomial)
678
+
679
+
680
+ class IndexedMonoid(Parent, IndexedGenerators, UniqueRepresentation):
681
+ """
682
+ Base class for monoids with an indexed set of generators.
683
+
684
+ INPUT:
685
+
686
+ - ``indices`` -- the indices for the generators
687
+
688
+ For the optional arguments that control the printing, see
689
+ :class:`~sage.structure.indexed_generators.IndexedGenerators`.
690
+ """
691
+ @staticmethod
692
+ def __classcall__(cls, indices, prefix=None, names=None, **kwds):
693
+ """
694
+ TESTS::
695
+
696
+ sage: F = FreeAbelianMonoid(index_set=['a','b','c'])
697
+ sage: G = FreeAbelianMonoid(index_set=('a','b','c'))
698
+ sage: H = FreeAbelianMonoid(index_set=tuple('abc'))
699
+ sage: F is G and F is H
700
+ True
701
+
702
+ sage: F = FreeAbelianMonoid(index_set=['a','b','c'], latex_bracket=['LEFT', 'RIGHT'])
703
+ sage: F.print_options()['latex_bracket']
704
+ ('LEFT', 'RIGHT')
705
+ sage: F is G
706
+ False
707
+ sage: Groups.Commutative.free()
708
+ Traceback (most recent call last):
709
+ ...
710
+ ValueError: either the indices or names must be given
711
+ """
712
+ names, indices, prefix = parse_indices_names(names, indices, prefix, kwds)
713
+ if prefix is None:
714
+ prefix = "F"
715
+
716
+ # bracket or latex_bracket might be lists, so convert
717
+ # them to tuples so that they're hashable.
718
+ bracket = kwds.get('bracket', None)
719
+ if isinstance(bracket, list):
720
+ kwds['bracket'] = tuple(bracket)
721
+ latex_bracket = kwds.get('latex_bracket', None)
722
+ if isinstance(latex_bracket, list):
723
+ kwds['latex_bracket'] = tuple(latex_bracket)
724
+
725
+ return super().__classcall__(cls, indices, prefix,
726
+ names=names, **kwds)
727
+
728
+ def __init__(self, indices, prefix, category=None, names=None, **kwds):
729
+ """
730
+ Initialize ``self``.
731
+
732
+ EXAMPLES::
733
+
734
+ sage: F = FreeMonoid(index_set=ZZ)
735
+ sage: TestSuite(F).run()
736
+ sage: F = FreeMonoid(index_set=tuple('abcde'))
737
+ sage: TestSuite(F).run()
738
+
739
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
740
+ sage: TestSuite(F).run()
741
+ sage: F = FreeAbelianMonoid(index_set=tuple('abcde'))
742
+ sage: TestSuite(F).run()
743
+ """
744
+ self._indices = indices
745
+ category = Monoids().or_subcategory(category)
746
+ if indices.cardinality() == 0:
747
+ category = category.Finite()
748
+ else:
749
+ category = category.Infinite()
750
+ if indices in Sets().Finite():
751
+ category = category.FinitelyGeneratedAsMagma()
752
+ Parent.__init__(self, names=names, category=category)
753
+
754
+ # ignore the optional 'key' since it only affects CachedRepresentation
755
+ kwds.pop('key', None)
756
+ IndexedGenerators.__init__(self, indices, prefix, **kwds)
757
+
758
+ def _first_ngens(self, n):
759
+ """
760
+ Used by the preparser for ``F.<x> = ...``.
761
+
762
+ EXAMPLES::
763
+
764
+ sage: F = FreeMonoid(index_set=ZZ)
765
+ sage: F._first_ngens(3)
766
+ (F[0], F[1], F[-1])
767
+ """
768
+ it = iter(self._indices)
769
+ return tuple(self.gen(next(it)) for i in range(n))
770
+
771
+ def _element_constructor_(self, x=None):
772
+ """
773
+ Create an element of this abelian monoid from ``x``.
774
+
775
+ EXAMPLES::
776
+
777
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
778
+ sage: F(F.gen(2))
779
+ F[2]
780
+ sage: F([[1, 3], [-2, 12]])
781
+ F[-2]^12*F[1]^3
782
+ sage: F(-5)
783
+ F[-5]
784
+ """
785
+ if x is None:
786
+ return self.one()
787
+ if x in self._indices:
788
+ return self.gen(x)
789
+ return self.element_class(self, x)
790
+
791
+ def _an_element_(self):
792
+ """
793
+ Return an element of ``self``.
794
+
795
+ EXAMPLES::
796
+
797
+ sage: G = FreeAbelianMonoid(index_set=ZZ)
798
+ sage: G.an_element()
799
+ F[-1]^3*F[0]*F[1]^3
800
+ sage: G = FreeMonoid(index_set=tuple('ab'))
801
+ sage: G.an_element()
802
+ F['a']^2*F['b']^2
803
+ """
804
+ x = self.one()
805
+ I = self._indices
806
+ try:
807
+ x *= self.gen(I.an_element())
808
+ except Exception:
809
+ pass
810
+ try:
811
+ g = iter(self._indices)
812
+ for c in range(1,4):
813
+ x *= self.gen(next(g)) ** c
814
+ except Exception:
815
+ pass
816
+ return x
817
+
818
+ def cardinality(self):
819
+ r"""
820
+ Return the cardinality of ``self``, which is `\infty` unless this is
821
+ the trivial monoid.
822
+
823
+ EXAMPLES::
824
+
825
+ sage: F = FreeMonoid(index_set=ZZ)
826
+ sage: F.cardinality()
827
+ +Infinity
828
+ sage: F = FreeMonoid(index_set=())
829
+ sage: F.cardinality()
830
+ 1
831
+
832
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
833
+ sage: F.cardinality()
834
+ +Infinity
835
+ sage: F = FreeAbelianMonoid(index_set=())
836
+ sage: F.cardinality()
837
+ 1
838
+ """
839
+ if self._indices.cardinality() == 0:
840
+ return ZZ.one()
841
+ return infinity
842
+
843
+ @cached_method
844
+ def monoid_generators(self):
845
+ """
846
+ Return the monoid generators of ``self``.
847
+
848
+ EXAMPLES::
849
+
850
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
851
+ sage: F.monoid_generators()
852
+ Lazy family (Generator map from Integer Ring to
853
+ Free abelian monoid indexed by Integer Ring(i))_{i in Integer Ring}
854
+ sage: F = FreeAbelianMonoid(index_set=tuple('abcde'))
855
+ sage: sorted(F.monoid_generators())
856
+ [F['a'], F['b'], F['c'], F['d'], F['e']]
857
+ """
858
+ if self._indices.cardinality() == infinity:
859
+ gen = PoorManMap(self.gen, domain=self._indices, codomain=self, name="Generator map")
860
+ return Family(self._indices, gen)
861
+ return Family(self._indices, self.gen)
862
+
863
+ gens = monoid_generators
864
+
865
+
866
+ class IndexedFreeMonoid(IndexedMonoid):
867
+ """
868
+ Free monoid with an indexed set of generators.
869
+
870
+ INPUT:
871
+
872
+ - ``indices`` -- the indices for the generators
873
+
874
+ For the optional arguments that control the printing, see
875
+ :class:`~sage.structure.indexed_generators.IndexedGenerators`.
876
+
877
+ EXAMPLES::
878
+
879
+ sage: F = FreeMonoid(index_set=ZZ)
880
+ sage: F.gen(15)^3 * F.gen(2) * F.gen(15)
881
+ F[15]^3*F[2]*F[15]
882
+ sage: F.gen(1)
883
+ F[1]
884
+
885
+ Now we examine some of the printing options::
886
+
887
+ sage: F = FreeMonoid(index_set=ZZ, prefix='X', bracket=['|','>'])
888
+ sage: F.gen(2) * F.gen(12)
889
+ X|2>*X|12>
890
+ """
891
+ def _repr_(self):
892
+ """
893
+ Return a string representation of ``self``.
894
+
895
+ EXAMPLES::
896
+
897
+ sage: FreeMonoid(index_set=ZZ)
898
+ Free monoid indexed by Integer Ring
899
+ """
900
+ return f"Free monoid indexed by {self._indices}"
901
+
902
+ Element = IndexedFreeMonoidElement
903
+
904
+ @cached_method
905
+ def one(self):
906
+ """
907
+ Return the identity element of ``self``.
908
+
909
+ EXAMPLES::
910
+
911
+ sage: F = FreeMonoid(index_set=ZZ)
912
+ sage: F.one()
913
+ 1
914
+ """
915
+ return self.element_class(self, ())
916
+
917
+ def gen(self, x):
918
+ """
919
+ The generator indexed by ``x`` of ``self``.
920
+
921
+ EXAMPLES::
922
+
923
+ sage: F = FreeMonoid(index_set=ZZ)
924
+ sage: F.gen(0)
925
+ F[0]
926
+ sage: F.gen(2)
927
+ F[2]
928
+
929
+ TESTS::
930
+
931
+ sage: F = FreeMonoid(index_set=[1,2])
932
+ sage: F.gen(2)
933
+ F[2]
934
+ sage: F.gen(0)
935
+ Traceback (most recent call last):
936
+ ...
937
+ IndexError: 0 is not in the index set
938
+ """
939
+ if x not in self._indices:
940
+ raise IndexError(f"{x} is not in the index set")
941
+ try:
942
+ return self.element_class(self, ((self._indices(x), ZZ.one()),))
943
+ except (ValueError, TypeError, NotImplementedError): # Backup (e.g., if it is a string)
944
+ return self.element_class(self, ((x, ZZ.one()),))
945
+
946
+
947
+ class IndexedFreeAbelianMonoid(IndexedMonoid):
948
+ """
949
+ Free abelian monoid with an indexed set of generators.
950
+
951
+ INPUT:
952
+
953
+ - ``indices`` -- the indices for the generators
954
+
955
+ For the optional arguments that control the printing, see
956
+ :class:`~sage.structure.indexed_generators.IndexedGenerators`.
957
+
958
+ EXAMPLES::
959
+
960
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
961
+ sage: F.gen(15)^3 * F.gen(2) * F.gen(15)
962
+ F[2]*F[15]^4
963
+ sage: F.gen(1)
964
+ F[1]
965
+
966
+ Now we examine some of the printing options::
967
+
968
+ sage: F = FreeAbelianMonoid(index_set=Partitions(), prefix='A', bracket=False, scalar_mult='%')
969
+ sage: F.gen([3,1,1]) * F.gen([2,2])
970
+ A[2, 2]%A[3, 1, 1]
971
+
972
+ .. TODO::
973
+
974
+ Implement a subclass when the index sets is finite that utilizes
975
+ vectors or the polydict monomials with the index order fixed.
976
+ """
977
+ def _repr_(self):
978
+ """
979
+ Return a string representation of ``self``.
980
+
981
+ EXAMPLES::
982
+
983
+ sage: FreeAbelianMonoid(index_set=ZZ)
984
+ Free abelian monoid indexed by Integer Ring
985
+ """
986
+ return f"Free abelian monoid indexed by {self._indices}"
987
+
988
+ def _element_constructor_(self, x=None):
989
+ """
990
+ Create an element of ``self`` from ``x``.
991
+
992
+ EXAMPLES::
993
+
994
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
995
+ sage: F(F.gen(2))
996
+ F[2]
997
+ sage: F([[1, 3], [-2, 12]])
998
+ F[-2]^12*F[1]^3
999
+ sage: F({1:3, -2: 12})
1000
+ F[-2]^12*F[1]^3
1001
+
1002
+ TESTS::
1003
+
1004
+ sage: F([(1, 3), (1, 2)])
1005
+ F[1]^5
1006
+
1007
+ sage: F([(42, 0)])
1008
+ 1
1009
+ sage: F({42: 0})
1010
+ 1
1011
+ """
1012
+ if isinstance(x, (list, tuple)):
1013
+ d = {}
1014
+ for k, v in x:
1015
+ if k in d:
1016
+ d[k] += v
1017
+ else:
1018
+ d[k] = v
1019
+ x = d
1020
+ if isinstance(x, dict):
1021
+ x = {k: v for k, v in x.items() if v != 0}
1022
+ return IndexedMonoid._element_constructor_(self, x)
1023
+
1024
+ Element = IndexedFreeAbelianMonoidElement
1025
+
1026
+ @cached_method
1027
+ def one(self):
1028
+ """
1029
+ Return the identity element of ``self``.
1030
+
1031
+ EXAMPLES::
1032
+
1033
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
1034
+ sage: F.one()
1035
+ 1
1036
+ """
1037
+ return self.element_class(self, {})
1038
+
1039
+ def gen(self, x):
1040
+ """
1041
+ The generator indexed by ``x`` of ``self``.
1042
+
1043
+ EXAMPLES::
1044
+
1045
+ sage: F = FreeAbelianMonoid(index_set=ZZ)
1046
+ sage: F.gen(0)
1047
+ F[0]
1048
+ sage: F.gen(2)
1049
+ F[2]
1050
+
1051
+ TESTS::
1052
+
1053
+ sage: F = FreeAbelianMonoid(index_set=[1,2])
1054
+ sage: F.gen(2)
1055
+ F[2]
1056
+ sage: F.gen(0)
1057
+ Traceback (most recent call last):
1058
+ ...
1059
+ IndexError: 0 is not in the index set
1060
+
1061
+ sage: F = lie_algebras.VirasoroAlgebra(QQ).pbw_basis().indices(); F # needs sage.combinat sage.graphs sage.modules
1062
+ Free abelian monoid indexed by Disjoint union of Family ({'c'}, Integer Ring)
1063
+ sage: F.gen('c') # needs sage.combinat sage.graphs sage.modules
1064
+ PBW['c']
1065
+ """
1066
+ if x not in self._indices:
1067
+ raise IndexError(f"{x} is not in the index set")
1068
+ try:
1069
+ return self.element_class(self, {self._indices(x): ZZ.one()})
1070
+ except (ValueError, TypeError, NotImplementedError): # Backup (e.g., if it is a string)
1071
+ return self.element_class(self, {x: ZZ.one()})