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,998 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Disjoint-set data structure
4
+
5
+ The main entry point is :func:`DisjointSet` which chooses the appropriate
6
+ type to return. For more on the data structure, see :func:`DisjointSet`.
7
+
8
+ This module defines a class for mutable partitioning of a set, which
9
+ cannot be used as a key of a dictionary, a vertex of a graph, etc. For
10
+ immutable partitioning see :class:`SetPartition`.
11
+
12
+ AUTHORS:
13
+
14
+ - Sébastien Labbé (2008) - Initial version.
15
+ - Sébastien Labbé (2009-11-24) - Pickling support
16
+ - Sébastien Labbé (2010-01) - Inclusion into sage (:issue:`6775`).
17
+ - Giorgos Mousa (2024-04-22): Optimize
18
+
19
+ EXAMPLES:
20
+
21
+ Disjoint set of integers from ``0`` to ``n - 1``::
22
+
23
+ sage: s = DisjointSet(6)
24
+ sage: s
25
+ {{0}, {1}, {2}, {3}, {4}, {5}}
26
+ sage: s.union(2, 4)
27
+ sage: s.union(1, 3)
28
+ sage: s.union(5, 1)
29
+ sage: s
30
+ {{0}, {1, 3, 5}, {2, 4}}
31
+ sage: s.find(3)
32
+ 1
33
+ sage: s.find(5)
34
+ 1
35
+ sage: list(map(s.find, range(6)))
36
+ [0, 1, 2, 1, 2, 1]
37
+
38
+ Disjoint set of hashables objects::
39
+
40
+ sage: d = DisjointSet('abcde')
41
+ sage: d
42
+ {{'a'}, {'b'}, {'c'}, {'d'}, {'e'}}
43
+ sage: d.union('a', 'b')
44
+ sage: d.union('b', 'c')
45
+ sage: d.union('c', 'd')
46
+ sage: d
47
+ {{'a', 'b', 'c', 'd'}, {'e'}}
48
+ sage: d.find('c')
49
+ 'a'
50
+ """
51
+
52
+ # ****************************************************************************
53
+ # Copyright (C) 2009 Sébastien Labbé <slabqc at gmail.com>
54
+ #
55
+ # This program is free software: you can redistribute it and/or modify
56
+ # it under the terms of the GNU General Public License as published by
57
+ # the Free Software Foundation, either version 2 of the License, or
58
+ # (at your option) any later version.
59
+ # https://www.gnu.org/licenses/
60
+ # ****************************************************************************
61
+
62
+ from sage.rings.integer cimport Integer
63
+ from sage.structure.sage_object cimport SageObject
64
+ from cpython.object cimport PyObject_RichCompare
65
+ from sage.groups.perm_gps.partn_ref.data_structures cimport *
66
+ from sage.misc.lazy_import import LazyImport
67
+
68
+ SetPartition = LazyImport('sage.combinat.set_partition', 'SetPartition')
69
+
70
+
71
+ cpdef DisjointSet(arg):
72
+ r"""
73
+ Construct a disjoint set where each element of ``arg`` is in its
74
+ own set. If ``arg`` is an integer, then the disjoint set returned is
75
+ made of the integers from ``0`` to ``arg - 1``.
76
+
77
+ A disjoint-set data structure (sometimes called union-find data structure)
78
+ is a data structure that keeps track of a partitioning of a set into a
79
+ number of separate, nonoverlapping sets. It performs two operations:
80
+
81
+ - :meth:`~sage.sets.disjoint_set.DisjointSet_of_hashables.find` --
82
+ Determine which set a particular element is in.
83
+
84
+ - :meth:`~sage.sets.disjoint_set.DisjointSet_of_hashables.union` --
85
+ Combine or merge two sets into a single set.
86
+
87
+ REFERENCES:
88
+
89
+ - :wikipedia:`Disjoint-set_data_structure`
90
+
91
+ INPUT:
92
+
93
+ - ``arg`` -- nonnegative integer or an iterable of hashable objects
94
+
95
+ EXAMPLES:
96
+
97
+ From a nonnegative integer::
98
+
99
+ sage: DisjointSet(5)
100
+ {{0}, {1}, {2}, {3}, {4}}
101
+
102
+ From an iterable::
103
+
104
+ sage: DisjointSet('abcde')
105
+ {{'a'}, {'b'}, {'c'}, {'d'}, {'e'}}
106
+ sage: DisjointSet(range(6))
107
+ {{0}, {1}, {2}, {3}, {4}, {5}}
108
+ sage: DisjointSet(['yi', 45, 'cheval'])
109
+ {{'cheval'}, {'yi'}, {45}}
110
+
111
+ From a set partition (see :issue:`38693`)::
112
+
113
+ sage: # needs sage.combinat
114
+ sage: SP = SetPartition(DisjointSet(5))
115
+ sage: DisjointSet(SP)
116
+ {{0}, {1}, {2}, {3}, {4}}
117
+ sage: DisjointSet(SP) == DisjointSet(5)
118
+ True
119
+
120
+ TESTS::
121
+
122
+ sage: DisjointSet(0)
123
+ {}
124
+ sage: DisjointSet('')
125
+ {}
126
+ sage: DisjointSet([])
127
+ {}
128
+
129
+ The argument must be a nonnegative integer::
130
+
131
+ sage: DisjointSet(-1)
132
+ Traceback (most recent call last):
133
+ ...
134
+ ValueError: arg must be a nonnegative integer (-1 given)
135
+
136
+ or an iterable::
137
+
138
+ sage: DisjointSet(4.3) # needs sage.rings.real_mpfr
139
+ Traceback (most recent call last):
140
+ ...
141
+ TypeError: 'sage.rings.real_mpfr.RealLiteral' object is not iterable
142
+
143
+ Moreover, the iterable must consist of hashable::
144
+
145
+ sage: DisjointSet([{}, {}])
146
+ Traceback (most recent call last):
147
+ ...
148
+ TypeError: ...unhashable type: 'dict'...
149
+ """
150
+ if isinstance(arg, (Integer, int)):
151
+ if arg < 0:
152
+ raise ValueError('arg must be a nonnegative integer (%s given)' % arg)
153
+ return DisjointSet_of_integers(arg)
154
+ elif isinstance(arg, SetPartition):
155
+ return DisjointSet(arg.base_set())
156
+ else:
157
+ return DisjointSet_of_hashables(arg)
158
+
159
+ cdef class DisjointSet_class(SageObject):
160
+ r"""
161
+ Common class and methods for :class:`DisjointSet_of_integers` and
162
+ :class:`DisjointSet_of_hashables`.
163
+ """
164
+ def _repr_(self):
165
+ r"""
166
+ Return ``self`` as a unique ``str``.
167
+
168
+ EXAMPLES::
169
+
170
+ sage: e = DisjointSet(5)
171
+ sage: e.union(2, 4)
172
+ sage: e._repr_()
173
+ '{{0}, {1}, {2, 4}, {3}}'
174
+ sage: e = DisjointSet(5)
175
+ sage: e.union(4, 2)
176
+ sage: e._repr_()
177
+ '{{0}, {1}, {2, 4}, {3}}'
178
+
179
+ ::
180
+
181
+ sage: e = DisjointSet(range(5))
182
+ sage: e.union(2, 4)
183
+ sage: e._repr_()
184
+ '{{0}, {1}, {2, 4}, {3}}'
185
+ sage: e = DisjointSet(range(5))
186
+ sage: e.union(4, 2)
187
+ sage: e._repr_()
188
+ '{{0}, {1}, {2, 4}, {3}}'
189
+ """
190
+ res = []
191
+ for l in (<dict?>self.root_to_elements_dict()).itervalues():
192
+ l.sort()
193
+ res.append('{%s}' % ', '.join(repr(u) for u in l))
194
+ res.sort()
195
+ return '{%s}' % ', '.join(res)
196
+
197
+ def __iter__(self):
198
+ """
199
+ Iterate over elements of the set.
200
+
201
+ EXAMPLES::
202
+
203
+ sage: d = DisjointSet(4)
204
+ sage: d.union(2, 0)
205
+ sage: sorted(d)
206
+ [[0, 2], [1], [3]]
207
+ sage: d = DisjointSet('abc')
208
+ sage: sorted(d)
209
+ [['a'], ['b'], ['c']]
210
+ """
211
+ return iter((<dict?>self.root_to_elements_dict()).itervalues())
212
+
213
+ def __richcmp__(self, other, int op):
214
+ r"""
215
+ Compare the disjoint sets ``self`` and ``other``.
216
+
217
+ EXAMPLES::
218
+
219
+ sage: d = DisjointSet(5)
220
+ sage: d == d
221
+ True
222
+
223
+ ::
224
+
225
+ sage: e = DisjointSet(5)
226
+ sage: e == d
227
+ True
228
+
229
+ ::
230
+
231
+ sage: d.union(0, 3)
232
+ sage: d.union(3, 4)
233
+ sage: e.union(4, 0)
234
+ sage: e.union(3, 0)
235
+ sage: e == d
236
+ True
237
+
238
+ ::
239
+
240
+ sage: DisjointSet(3) == DisjointSet(5)
241
+ False
242
+ sage: DisjointSet(3) == 4
243
+ False
244
+
245
+ ::
246
+
247
+ sage: d = DisjointSet('abcde')
248
+ sage: e = DisjointSet('abcde')
249
+ sage: d.union('a', 'b')
250
+ sage: d.union('b', 'c')
251
+ sage: e.union('c', 'a')
252
+ sage: e == d
253
+ False
254
+ sage: e.union('a', 'b')
255
+ sage: e == d
256
+ True
257
+ """
258
+ from sage.sets.set import Set
259
+ s = Set(map(Set, self.root_to_elements_dict().values()))
260
+ try:
261
+ t = Set(map(Set, other.root_to_elements_dict().values()))
262
+ except AttributeError:
263
+ return NotImplemented
264
+ return PyObject_RichCompare(s, t, op)
265
+
266
+ def __dealloc__(self):
267
+ r"""
268
+ Deallocate ``self`` (i.e. the ``self._nodes``).
269
+
270
+ EXAMPLES::
271
+
272
+ sage: d = DisjointSet(5)
273
+ sage: del d
274
+ sage: d = DisjointSet('abc')
275
+ sage: del d
276
+ """
277
+ OP_dealloc(self._nodes)
278
+
279
+ def __reduce__(self):
280
+ r"""
281
+ Return a tuple of three elements:
282
+
283
+ - The function :func:`DisjointSet`
284
+ - Arguments for the function :func:`DisjointSet`
285
+ - The actual state of ``self``.
286
+
287
+ EXAMPLES::
288
+
289
+ sage: d = DisjointSet(5)
290
+ sage: d.__reduce__()
291
+ (<built-in function DisjointSet>, (5,), [0, 1, 2, 3, 4])
292
+
293
+ ::
294
+
295
+ sage: d.union(2, 4)
296
+ sage: d.union(1, 3)
297
+ sage: d.__reduce__()
298
+ (<built-in function DisjointSet>, (5,), [0, 1, 2, 1, 2])
299
+ """
300
+ return DisjointSet, (self._nodes.degree,), self.__getstate__()
301
+
302
+ cpdef cardinality(self):
303
+ r"""
304
+ Return the number of elements in ``self``, *not* the number of subsets.
305
+
306
+ EXAMPLES::
307
+
308
+ sage: d = DisjointSet(5)
309
+ sage: d.cardinality()
310
+ 5
311
+ sage: d.union(2, 4)
312
+ sage: d.cardinality()
313
+ 5
314
+ sage: d = DisjointSet(range(5))
315
+ sage: d.cardinality()
316
+ 5
317
+ sage: d.union(2, 4)
318
+ sage: d.cardinality()
319
+ 5
320
+ """
321
+ return self._nodes.degree
322
+
323
+ cpdef number_of_subsets(self):
324
+ r"""
325
+ Return the number of subsets in ``self``.
326
+
327
+ EXAMPLES::
328
+
329
+ sage: d = DisjointSet(5)
330
+ sage: d.number_of_subsets()
331
+ 5
332
+ sage: d.union(2, 4)
333
+ sage: d.number_of_subsets()
334
+ 4
335
+ sage: d = DisjointSet(range(5))
336
+ sage: d.number_of_subsets()
337
+ 5
338
+ sage: d.union(2, 4)
339
+ sage: d.number_of_subsets()
340
+ 4
341
+ """
342
+ return self._nodes.num_cells
343
+
344
+ cdef class DisjointSet_of_integers(DisjointSet_class):
345
+ r"""
346
+ Disjoint set of integers from ``0`` to ``n-1``.
347
+
348
+ EXAMPLES::
349
+
350
+ sage: d = DisjointSet(5)
351
+ sage: d
352
+ {{0}, {1}, {2}, {3}, {4}}
353
+ sage: d.union(2, 4)
354
+ sage: d.union(0, 2)
355
+ sage: d
356
+ {{0, 2, 4}, {1}, {3}}
357
+ sage: d.find(2)
358
+ 2
359
+
360
+ TESTS::
361
+
362
+ sage: a = DisjointSet(5)
363
+ sage: a == loads(dumps(a))
364
+ True
365
+
366
+ ::
367
+
368
+ sage: a.union(3, 4)
369
+ sage: a == loads(dumps(a))
370
+ True
371
+ """
372
+ def __init__(self, n):
373
+ r"""
374
+ Construct the ``DisjointSet`` where each element (integers from ``0``
375
+ to ``n-1``) is in its own set.
376
+
377
+ INPUT:
378
+
379
+ - ``n`` -- nonnegative integer
380
+
381
+ EXAMPLES::
382
+
383
+ sage: DisjointSet(6)
384
+ {{0}, {1}, {2}, {3}, {4}, {5}}
385
+ sage: DisjointSet(1)
386
+ {{0}}
387
+ sage: DisjointSet(0)
388
+ {}
389
+ """
390
+ self._nodes = OP_new(n)
391
+
392
+ def __getstate__(self):
393
+ r"""
394
+ Return a list of the parent of each node from ``0`` to ``n-1``.
395
+
396
+ EXAMPLES::
397
+
398
+ sage: d = DisjointSet(5)
399
+ sage: d.__getstate__()
400
+ [0, 1, 2, 3, 4]
401
+ sage: d.union(2, 3)
402
+ sage: d.__getstate__()
403
+ [0, 1, 2, 2, 4]
404
+ sage: d.union(3, 0)
405
+ sage: d.__getstate__()
406
+ [2, 1, 2, 2, 4]
407
+
408
+ Other parents are obtained when the operations are done in a
409
+ different order::
410
+
411
+ sage: d = DisjointSet(5)
412
+ sage: d.union(0, 3)
413
+ sage: d.__getstate__()
414
+ [0, 1, 2, 0, 4]
415
+ sage: d.union(2, 0)
416
+ sage: d.__getstate__()
417
+ [0, 1, 0, 0, 4]
418
+ """
419
+ cdef Py_ssize_t card = self._nodes.degree
420
+ cdef list l = [None] * card
421
+ cdef int i
422
+ for i in range(card):
423
+ l[i] = self._nodes.parent[i]
424
+ return l
425
+
426
+ def __setstate__(self, l):
427
+ r"""
428
+ Merge the nodes ``i`` and ``l[i]`` (using union) for ``i`` in
429
+ ``range(len(l))``.
430
+
431
+ INPUT:
432
+
433
+ - ``l`` -- list of nodes
434
+
435
+ EXAMPLES::
436
+
437
+ sage: d = DisjointSet(5)
438
+ sage: d.__setstate__([0, 1, 2, 3, 4])
439
+ sage: d
440
+ {{0}, {1}, {2}, {3}, {4}}
441
+
442
+ ::
443
+
444
+ sage: d = DisjointSet(5)
445
+ sage: d.__setstate__([1, 2, 3, 4, 0])
446
+ sage: d
447
+ {{0, 1, 2, 3, 4}}
448
+
449
+ ::
450
+
451
+ sage: d = DisjointSet(5)
452
+ sage: d.__setstate__([1, 1, 1])
453
+ sage: d
454
+ {{0, 1, 2}, {3}, {4}}
455
+
456
+ ::
457
+
458
+ sage: d = DisjointSet(5)
459
+ sage: d.__setstate__([3, 3, 3])
460
+ sage: d
461
+ {{0, 1, 2, 3}, {4}}
462
+ """
463
+ cdef int i, parent
464
+ for i, parent in enumerate(l):
465
+ self.union(parent, i)
466
+
467
+ cpdef int find(self, int i) except -1:
468
+ r"""
469
+ Return the representative of the set that ``i`` currently belongs to.
470
+
471
+ INPUT:
472
+
473
+ - ``i`` -- element in ``self``
474
+
475
+ EXAMPLES::
476
+
477
+ sage: e = DisjointSet(5)
478
+ sage: e.union(4, 2)
479
+ sage: e
480
+ {{0}, {1}, {2, 4}, {3}}
481
+ sage: e.find(2)
482
+ 4
483
+ sage: e.find(4)
484
+ 4
485
+ sage: e.union(1, 3)
486
+ sage: e
487
+ {{0}, {1, 3}, {2, 4}}
488
+ sage: e.find(1)
489
+ 1
490
+ sage: e.find(3)
491
+ 1
492
+ sage: e.union(3, 2)
493
+ sage: e
494
+ {{0}, {1, 2, 3, 4}}
495
+ sage: [e.find(i) for i in range(5)]
496
+ [0, 1, 1, 1, 1]
497
+ sage: e.find(2**10)
498
+ Traceback (most recent call last):
499
+ ...
500
+ ValueError: i must be between 0 and 4 (1024 given)
501
+
502
+ .. NOTE::
503
+
504
+ This method performs input checks. To avoid them you may directly
505
+ use :meth:`~sage.groups.perm_gps.partn_ref.data_structures.OP_find`.
506
+ """
507
+ card = self._nodes.degree
508
+ if i < 0 or i >= card:
509
+ raise ValueError('i must be between 0 and %s (%s given)' % (card - 1, i))
510
+ return OP_find(self._nodes, i)
511
+
512
+ cpdef void union(self, int i, int j) except *:
513
+ r"""
514
+ Combine the set of ``i`` and the set of ``j`` into one.
515
+
516
+ All elements in those two sets will share the same representative
517
+ that can be retrieved using
518
+ :meth:`~sage.sets.disjoint_set.DisjointSet_of_integers.find`.
519
+
520
+ INPUT:
521
+
522
+ - ``i`` -- element in ``self``
523
+ - ``j`` -- element in ``self``
524
+
525
+ EXAMPLES::
526
+
527
+ sage: d = DisjointSet(5)
528
+ sage: d
529
+ {{0}, {1}, {2}, {3}, {4}}
530
+ sage: d.union(0, 1)
531
+ sage: d
532
+ {{0, 1}, {2}, {3}, {4}}
533
+ sage: d.union(2, 4)
534
+ sage: d
535
+ {{0, 1}, {2, 4}, {3}}
536
+ sage: d.union(1, 4)
537
+ sage: d
538
+ {{0, 1, 2, 4}, {3}}
539
+ sage: d.union(1, 5)
540
+ Traceback (most recent call last):
541
+ ...
542
+ ValueError: j must be between 0 and 4 (5 given)
543
+
544
+ .. NOTE::
545
+
546
+ This method performs input checks. To avoid them you may directly
547
+ use :meth:`~sage.groups.perm_gps.partn_ref.data_structures.OP_join`.
548
+ """
549
+ cdef int card = self._nodes.degree
550
+ if i < 0 or i >= card:
551
+ raise ValueError('i must be between 0 and %s (%s given)' % (card - 1, i))
552
+ if j < 0 or j >= card:
553
+ raise ValueError('j must be between 0 and %s (%s given)' % (card - 1, j))
554
+ OP_join(self._nodes, i, j)
555
+
556
+ def make_set(self):
557
+ r"""
558
+ Add a new element into a new set containing only the new element.
559
+
560
+ According to :wikipedia:`Disjoint-set_data_structure#Making_new_sets` the
561
+ ``make_set`` operation adds a new element into a new set containing only
562
+ the new element. The new set is added at the end of ``self``.
563
+
564
+ EXAMPLES::
565
+
566
+ sage: d = DisjointSet(5)
567
+ sage: d.union(1, 2)
568
+ sage: d.union(0, 1)
569
+ sage: d.make_set()
570
+ sage: d
571
+ {{0, 1, 2}, {3}, {4}, {5}}
572
+ sage: d.find(1)
573
+ 1
574
+
575
+ TESTS::
576
+
577
+ sage: d = DisjointSet(0)
578
+ sage: d.make_set()
579
+ sage: d
580
+ {{0}}
581
+ """
582
+ OP_make_set(self._nodes)
583
+
584
+ cpdef root_to_elements_dict(self):
585
+ r"""
586
+ Return the dictionary where the keys are the roots of ``self`` and the
587
+ values are the elements in the same set as the root.
588
+
589
+ EXAMPLES::
590
+
591
+ sage: d = DisjointSet(5)
592
+ sage: sorted(d.root_to_elements_dict().items())
593
+ [(0, [0]), (1, [1]), (2, [2]), (3, [3]), (4, [4])]
594
+ sage: d.union(2, 3)
595
+ sage: sorted(d.root_to_elements_dict().items())
596
+ [(0, [0]), (1, [1]), (2, [2, 3]), (4, [4])]
597
+ sage: d.union(3, 0)
598
+ sage: sorted(d.root_to_elements_dict().items())
599
+ [(1, [1]), (2, [0, 2, 3]), (4, [4])]
600
+ sage: d
601
+ {{0, 2, 3}, {1}, {4}}
602
+ """
603
+ cdef dict s = {}
604
+ cdef int i, o
605
+ for i in range(self._nodes.degree):
606
+ o = OP_find(self._nodes, i)
607
+ if o not in s:
608
+ s[o] = []
609
+ s[o].append(i)
610
+ return s
611
+
612
+ cpdef element_to_root_dict(self):
613
+ r"""
614
+ Return the dictionary where the keys are the elements of ``self`` and
615
+ the values are their representative inside a list.
616
+
617
+ EXAMPLES::
618
+
619
+ sage: d = DisjointSet(5)
620
+ sage: d.union(2, 3)
621
+ sage: d.union(4, 1)
622
+ sage: e = d.element_to_root_dict()
623
+ sage: e
624
+ {0: 0, 1: 4, 2: 2, 3: 2, 4: 4}
625
+ sage: WordMorphism(e) # needs sage.combinat
626
+ WordMorphism: 0->0, 1->4, 2->2, 3->2, 4->4
627
+ """
628
+ cdef dict d = {}
629
+ cdef int i
630
+ for i in range(self._nodes.degree):
631
+ d[i] = OP_find(self._nodes, i)
632
+ return d
633
+
634
+ cpdef to_digraph(self):
635
+ r"""
636
+ Return the current digraph of ``self`` where `(a, b)` is an oriented
637
+ edge if `b` is the parent of `a`.
638
+
639
+ EXAMPLES::
640
+
641
+ sage: d = DisjointSet(5)
642
+ sage: d.union(2, 3)
643
+ sage: d.union(4, 1)
644
+ sage: d.union(3, 4)
645
+ sage: d
646
+ {{0}, {1, 2, 3, 4}}
647
+ sage: g = d.to_digraph(); g # needs sage.graphs
648
+ Looped digraph on 5 vertices
649
+ sage: g.edges(sort=True) # needs sage.graphs
650
+ [(0, 0, None), (1, 2, None), (2, 2, None), (3, 2, None), (4, 2, None)]
651
+
652
+ The result depends on the ordering of the union::
653
+
654
+ sage: d = DisjointSet(5)
655
+ sage: d.union(1, 2)
656
+ sage: d.union(1, 3)
657
+ sage: d.union(1, 4)
658
+ sage: d
659
+ {{0}, {1, 2, 3, 4}}
660
+ sage: d.to_digraph().edges(sort=True) # needs sage.graphs
661
+ [(0, 0, None), (1, 1, None), (2, 1, None), (3, 1, None), (4, 1, None)]
662
+ """
663
+ cdef dict d = {i: [self._nodes.parent[i]] for i in range(self._nodes.degree)}
664
+ from sage.graphs.digraph import DiGraph
665
+ return DiGraph(d)
666
+
667
+ cdef class DisjointSet_of_hashables(DisjointSet_class):
668
+ r"""
669
+ Disjoint set of hashables.
670
+
671
+ EXAMPLES::
672
+
673
+ sage: d = DisjointSet('abcde')
674
+ sage: d
675
+ {{'a'}, {'b'}, {'c'}, {'d'}, {'e'}}
676
+ sage: d.union('a', 'c')
677
+ sage: d
678
+ {{'a', 'c'}, {'b'}, {'d'}, {'e'}}
679
+ sage: d.find('a')
680
+ 'a'
681
+
682
+ TESTS::
683
+
684
+ sage: a = DisjointSet('abcdef')
685
+ sage: a == loads(dumps(a))
686
+ True
687
+
688
+ ::
689
+
690
+ sage: a.union('a', 'c')
691
+ sage: a == loads(dumps(a))
692
+ True
693
+ """
694
+ def __init__(self, iterable):
695
+ r"""
696
+ Construct the trivial disjoint set where each element is in its own set.
697
+
698
+ INPUT:
699
+
700
+ - ``iterable`` -- iterable of hashable objects
701
+
702
+ EXAMPLES::
703
+
704
+ sage: DisjointSet('abcde')
705
+ {{'a'}, {'b'}, {'c'}, {'d'}, {'e'}}
706
+ sage: DisjointSet(range(6))
707
+ {{0}, {1}, {2}, {3}, {4}, {5}}
708
+ sage: DisjointSet(['yi', 45, 'cheval'])
709
+ {{'cheval'}, {'yi'}, {45}}
710
+ sage: DisjointSet(set([0, 1, 2, 3, 4]))
711
+ {{0}, {1}, {2}, {3}, {4}}
712
+ """
713
+ cdef int i
714
+ self._int_to_el = []
715
+ self._el_to_int = {}
716
+ for i, e in enumerate(iterable):
717
+ self._int_to_el.append(e)
718
+ self._el_to_int[e] = i
719
+ self._nodes = OP_new(len(self._int_to_el))
720
+
721
+ def __reduce__(self):
722
+ r"""
723
+ Return a tuple of three elements:
724
+
725
+ - The function :func:`DisjointSet`
726
+ - Arguments for the function :func:`DisjointSet`
727
+ - The actual state of ``self``.
728
+
729
+ EXAMPLES::
730
+
731
+ sage: DisjointSet(range(5))
732
+ {{0}, {1}, {2}, {3}, {4}}
733
+ sage: d = _
734
+ sage: d.__reduce__()
735
+ (<built-in function DisjointSet>,
736
+ ([0, 1, 2, 3, 4],),
737
+ [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])
738
+
739
+ ::
740
+
741
+ sage: d.union(2, 4)
742
+ sage: d.union(1, 3)
743
+ sage: d.__reduce__()
744
+ (<built-in function DisjointSet>,
745
+ ([0, 1, 2, 3, 4],),
746
+ [(0, 0), (1, 1), (2, 2), (3, 1), (4, 2)])
747
+ """
748
+ return DisjointSet, (self._int_to_el,), self.__getstate__()
749
+
750
+ def __getstate__(self):
751
+ r"""
752
+ Return a list of pairs (``n``, parent of ``n``) for each node ``n``.
753
+
754
+ EXAMPLES::
755
+
756
+ sage: d = DisjointSet('abcde')
757
+ sage: d.__getstate__()
758
+ [('a', 'a'), ('b', 'b'), ('c', 'c'), ('d', 'd'), ('e', 'e')]
759
+ sage: d.union('c', 'd')
760
+ sage: d.__getstate__()
761
+ [('a', 'a'), ('b', 'b'), ('c', 'c'), ('d', 'c'), ('e', 'e')]
762
+ sage: d.union('d', 'a')
763
+ sage: d.__getstate__()
764
+ [('a', 'c'), ('b', 'b'), ('c', 'c'), ('d', 'c'), ('e', 'e')]
765
+
766
+ Other parents are obtained when the operations are done in a
767
+ different order::
768
+
769
+ sage: d = DisjointSet('abcde')
770
+ sage: d.union('d', 'c')
771
+ sage: d.__getstate__()
772
+ [('a', 'a'), ('b', 'b'), ('c', 'd'), ('d', 'd'), ('e', 'e')]
773
+ """
774
+ cdef int card = self._nodes.degree
775
+ cdef list l = [None] * card
776
+ cdef int i
777
+ for i in range(card):
778
+ l[i] = self._int_to_el[self._nodes.parent[i]]
779
+ return list(zip(self._int_to_el, l))
780
+
781
+ def __setstate__(self, l):
782
+ r"""
783
+ Merge the nodes ``a`` and ``b`` for each pair of nodes
784
+ ``(a, b)`` in ``l``.
785
+
786
+ INPUT:
787
+
788
+ - ``l`` -- list of pair of nodes
789
+
790
+ EXAMPLES::
791
+
792
+ sage: d = DisjointSet('abcde')
793
+ sage: d.__setstate__([('a', 'a'), ('b', 'b'), ('c', 'c')])
794
+ sage: d
795
+ {{'a'}, {'b'}, {'c'}, {'d'}, {'e'}}
796
+
797
+ ::
798
+
799
+ sage: d = DisjointSet('abcde')
800
+ sage: d.__setstate__([('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e')])
801
+ sage: d
802
+ {{'a', 'b', 'c', 'd', 'e'}}
803
+ """
804
+ for a, b in l:
805
+ self.union(a, b)
806
+
807
+ cpdef find(self, e):
808
+ r"""
809
+ Return the representative of the set that ``e`` currently belongs to.
810
+
811
+ INPUT:
812
+
813
+ - ``e`` -- element in ``self``
814
+
815
+ EXAMPLES::
816
+
817
+ sage: e = DisjointSet(range(5))
818
+ sage: e.union(4, 2)
819
+ sage: e
820
+ {{0}, {1}, {2, 4}, {3}}
821
+ sage: e.find(2)
822
+ 4
823
+ sage: e.find(4)
824
+ 4
825
+ sage: e.union(1,3)
826
+ sage: e
827
+ {{0}, {1, 3}, {2, 4}}
828
+ sage: e.find(1)
829
+ 1
830
+ sage: e.find(3)
831
+ 1
832
+ sage: e.union(3, 2)
833
+ sage: e
834
+ {{0}, {1, 2, 3, 4}}
835
+ sage: [e.find(i) for i in range(5)]
836
+ [0, 1, 1, 1, 1]
837
+ sage: e.find(5)
838
+ Traceback (most recent call last):
839
+ ...
840
+ KeyError: 5
841
+ """
842
+ cdef int i = <int> self._el_to_int[e]
843
+ cdef int r = <int> OP_find(self._nodes, i)
844
+ return self._int_to_el[r]
845
+
846
+ cpdef void union(self, e, f) except *:
847
+ r"""
848
+ Combine the set of ``e`` and the set of ``f`` into one.
849
+
850
+ All elements in those two sets will share the same representative
851
+ that can be retrieved using
852
+ :meth:`~sage.sets.disjoint_set.DisjointSet_of_hashables.find`.
853
+
854
+ INPUT:
855
+
856
+ - ``e`` -- element in ``self``
857
+ - ``f`` -- element in ``self``
858
+
859
+ EXAMPLES::
860
+
861
+ sage: e = DisjointSet('abcde')
862
+ sage: e
863
+ {{'a'}, {'b'}, {'c'}, {'d'}, {'e'}}
864
+ sage: e.union('a', 'b')
865
+ sage: e
866
+ {{'a', 'b'}, {'c'}, {'d'}, {'e'}}
867
+ sage: e.union('c', 'e')
868
+ sage: e
869
+ {{'a', 'b'}, {'c', 'e'}, {'d'}}
870
+ sage: e.union('b', 'e')
871
+ sage: e
872
+ {{'a', 'b', 'c', 'e'}, {'d'}}
873
+ sage: e.union('a', 2**10)
874
+ Traceback (most recent call last):
875
+ ...
876
+ KeyError: 1024
877
+ """
878
+ cdef int i = <int> self._el_to_int[e]
879
+ cdef int j = <int> self._el_to_int[f]
880
+ OP_join(self._nodes, i, j)
881
+
882
+ def make_set(self, new_elt=None):
883
+ r"""
884
+ Add a new element into a new set containing only the new element.
885
+
886
+ According to :wikipedia:`Disjoint-set_data_structure#Making_new_sets`
887
+ the ``make_set`` operation adds a new element into a new set containing
888
+ only the new element. The new set is added at the end of ``self``.
889
+
890
+ INPUT:
891
+
892
+ - ``new_elt`` -- (optional) element to add. If `None`, then an integer
893
+ is added.
894
+
895
+ EXAMPLES::
896
+
897
+ sage: e = DisjointSet('abcde')
898
+ sage: e.union('d', 'c')
899
+ sage: e.union('c', 'e')
900
+ sage: e.make_set('f')
901
+ sage: e
902
+ {{'a'}, {'b'}, {'c', 'd', 'e'}, {'f'}}
903
+ sage: e.union('f', 'b')
904
+ sage: e
905
+ {{'a'}, {'b', 'f'}, {'c', 'd', 'e'}}
906
+ sage: e.make_set('e'); e
907
+ {{'a'}, {'b', 'f'}, {'c', 'd', 'e'}}
908
+ sage: e.make_set(); e
909
+ {{'a'}, {'b', 'f'}, {'c', 'd', 'e'}, {6}}
910
+ """
911
+ if new_elt is None:
912
+ new_elt = self._nodes.degree
913
+ if new_elt not in self._int_to_el:
914
+ d = self._nodes.degree
915
+ self._int_to_el.append(new_elt)
916
+ self._el_to_int[new_elt] = d
917
+ OP_make_set(self._nodes)
918
+
919
+ cpdef root_to_elements_dict(self):
920
+ r"""
921
+ Return the dictionary where the keys are the roots of ``self`` and the
922
+ values are the elements in the same set.
923
+
924
+ EXAMPLES::
925
+
926
+ sage: d = DisjointSet(range(5))
927
+ sage: d.union(2, 3)
928
+ sage: d.union(4, 1)
929
+ sage: e = d.root_to_elements_dict()
930
+ sage: sorted(e.items())
931
+ [(0, [0]), (2, [2, 3]), (4, [1, 4])]
932
+ """
933
+ cdef dict s = {}
934
+ for e in self._int_to_el:
935
+ r = self.find(e)
936
+ if r not in s:
937
+ s[r] = []
938
+ s[r].append(e)
939
+ return s
940
+
941
+ cpdef element_to_root_dict(self):
942
+ r"""
943
+ Return the dictionary where the keys are the elements of ``self`` and
944
+ the values are their representative inside a list.
945
+
946
+ EXAMPLES::
947
+
948
+ sage: d = DisjointSet(range(5))
949
+ sage: d.union(2, 3)
950
+ sage: d.union(4, 1)
951
+ sage: e = d.element_to_root_dict()
952
+ sage: sorted(e.items())
953
+ [(0, 0), (1, 4), (2, 2), (3, 2), (4, 4)]
954
+ sage: WordMorphism(e) # needs sage.combinat
955
+ WordMorphism: 0->0, 1->4, 2->2, 3->2, 4->4
956
+ """
957
+ cdef dict d = {}
958
+ for a in self._int_to_el:
959
+ d[a] = self.find(a)
960
+ return d
961
+
962
+ cpdef to_digraph(self):
963
+ r"""
964
+ Return the current digraph of ``self`` where `(a, b)` is an oriented
965
+ edge if `b` is the parent of `a`.
966
+
967
+ EXAMPLES::
968
+
969
+ sage: d = DisjointSet(range(5))
970
+ sage: d.union(2, 3)
971
+ sage: d.union(4, 1)
972
+ sage: d.union(3, 4)
973
+ sage: d
974
+ {{0}, {1, 2, 3, 4}}
975
+ sage: g = d.to_digraph(); g # needs sage.graphs
976
+ Looped digraph on 5 vertices
977
+ sage: g.edges(sort=True) # needs sage.graphs
978
+ [(0, 0, None), (1, 2, None), (2, 2, None), (3, 2, None), (4, 2, None)]
979
+
980
+ The result depends on the ordering of the union::
981
+
982
+ sage: d = DisjointSet(range(5))
983
+ sage: d.union(1, 2)
984
+ sage: d.union(1, 3)
985
+ sage: d.union(1, 4)
986
+ sage: d
987
+ {{0}, {1, 2, 3, 4}}
988
+ sage: d.to_digraph().edges(sort=True) # needs sage.graphs
989
+ [(0, 0, None), (1, 1, None), (2, 1, None), (3, 1, None), (4, 1, None)]
990
+ """
991
+ cdef dict d = {}
992
+ cdef int i
993
+ for i in range(self._nodes.degree):
994
+ e = self._int_to_el[i]
995
+ p = self._int_to_el[self._nodes.parent[i]]
996
+ d[e] = [p]
997
+ from sage.graphs.digraph import DiGraph
998
+ return DiGraph(d)