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,796 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Combinations
4
+
5
+ AUTHORS:
6
+
7
+ - Mike Hansen (2007): initial implementation
8
+
9
+ - Vincent Delecroix (2011): cleaning, bug corrections, doctests
10
+
11
+ - Antoine Genitrini (2020) : new implementation of the lexicographic unranking of combinations
12
+ """
13
+ # ****************************************************************************
14
+ # Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
15
+ #
16
+ # Distributed under the terms of the GNU General Public License (GPL)
17
+ #
18
+ # This code is distributed in the hope that it will be useful,
19
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ # General Public License for more details.
22
+ #
23
+ # The full text of the GPL is available at:
24
+ #
25
+ # https://www.gnu.org/licenses/
26
+ # ****************************************************************************
27
+ import itertools
28
+
29
+ from sage.rings.integer import Integer
30
+ from sage.rings.integer_ring import ZZ
31
+ from sage.arith.misc import binomial
32
+ from .integer_vector import IntegerVectors
33
+ from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
34
+ from sage.structure.parent import Parent
35
+ from sage.misc.persist import register_unpickle_override
36
+
37
+
38
+ def Combinations(mset, k=None, *, as_tuples=False):
39
+ """
40
+ Return the combinatorial class of combinations of the multiset
41
+ ``mset``. If ``k`` is specified, then it returns the combinatorial
42
+ class of combinations of ``mset`` of size ``k``.
43
+
44
+ A *combination* of a multiset `M` is an unordered selection of `k`
45
+ objects of `M`, where every object can appear at most as many
46
+ times as it appears in `M`.
47
+
48
+ The boolean keyword ``as_tuples`` (default: ``False``) determines whether
49
+ each combination is represented as a tuple or as a list.
50
+
51
+ The combinatorial classes correctly handle the cases where ``mset`` has
52
+ duplicate elements.
53
+
54
+ EXAMPLES::
55
+
56
+ sage: C = Combinations(range(4)); C
57
+ Combinations of [0, 1, 2, 3]
58
+ sage: C.list()
59
+ [[],
60
+ [0],
61
+ [1],
62
+ [2],
63
+ [3],
64
+ [0, 1],
65
+ [0, 2],
66
+ [0, 3],
67
+ [1, 2],
68
+ [1, 3],
69
+ [2, 3],
70
+ [0, 1, 2],
71
+ [0, 1, 3],
72
+ [0, 2, 3],
73
+ [1, 2, 3],
74
+ [0, 1, 2, 3]]
75
+ sage: C.cardinality()
76
+ 16
77
+
78
+ ::
79
+
80
+ sage: C2 = Combinations(range(4),2); C2
81
+ Combinations of [0, 1, 2, 3] of length 2
82
+ sage: C2.list()
83
+ [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
84
+ sage: C2.cardinality()
85
+ 6
86
+
87
+ ::
88
+
89
+ sage: C3 = Combinations(range(4),2,as_tuples=True)
90
+ sage: C3
91
+ Combinations of [0, 1, 2, 3] of length 2
92
+ sage: C3.list()
93
+ [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
94
+ sage: C3.cardinality()
95
+ 6
96
+
97
+ ::
98
+
99
+ sage: Combinations([1,2,2,3]).list()
100
+ [[],
101
+ [1],
102
+ [2],
103
+ [3],
104
+ [1, 2],
105
+ [1, 3],
106
+ [2, 2],
107
+ [2, 3],
108
+ [1, 2, 2],
109
+ [1, 2, 3],
110
+ [2, 2, 3],
111
+ [1, 2, 2, 3]]
112
+
113
+ ::
114
+
115
+ sage: Combinations([1,2,3], 2).list()
116
+ [[1, 2], [1, 3], [2, 3]]
117
+
118
+ ::
119
+
120
+ sage: mset = [1,1,2,3,4,4,5]
121
+ sage: Combinations(mset,2).list()
122
+ [[1, 1],
123
+ [1, 2],
124
+ [1, 3],
125
+ [1, 4],
126
+ [1, 5],
127
+ [2, 3],
128
+ [2, 4],
129
+ [2, 5],
130
+ [3, 4],
131
+ [3, 5],
132
+ [4, 4],
133
+ [4, 5]]
134
+
135
+ ::
136
+
137
+ sage: mset = ["d","a","v","i","d"]
138
+ sage: Combinations(mset,3).list()
139
+ [['d', 'd', 'a'],
140
+ ['d', 'd', 'v'],
141
+ ['d', 'd', 'i'],
142
+ ['d', 'a', 'v'],
143
+ ['d', 'a', 'i'],
144
+ ['d', 'v', 'i'],
145
+ ['a', 'v', 'i']]
146
+
147
+ ::
148
+
149
+ sage: X = Combinations([1,2,3,4,5],3)
150
+ sage: [x for x in X]
151
+ [[1, 2, 3],
152
+ [1, 2, 4],
153
+ [1, 2, 5],
154
+ [1, 3, 4],
155
+ [1, 3, 5],
156
+ [1, 4, 5],
157
+ [2, 3, 4],
158
+ [2, 3, 5],
159
+ [2, 4, 5],
160
+ [3, 4, 5]]
161
+
162
+ It is possible to take combinations of Sage objects::
163
+
164
+ sage: Combinations([vector([1,1]), vector([2,2]), vector([3,3])], 2).list() # needs sage.modules
165
+ [[(1, 1), (2, 2)], [(1, 1), (3, 3)], [(2, 2), (3, 3)]]
166
+
167
+ TESTS:
168
+
169
+ Run the test suites::
170
+
171
+ sage: C = Combinations([2,3])
172
+ sage: TestSuite(C).run()
173
+ sage: C = Combinations([2,3], 1)
174
+ sage: TestSuite(C).run()
175
+
176
+ We check that the code works even for non mutable objects::
177
+
178
+ sage: l = [vector((0,0)), vector((0,1))] # needs sage.modules
179
+ sage: Combinations(l).list() # needs sage.modules
180
+ [[], [(0, 0)], [(0, 1)], [(0, 0), (0, 1)]]
181
+ """
182
+ # Check to see if everything in mset is unique
183
+ is_unique = False
184
+ if isinstance(mset, (int, Integer)):
185
+ mset = list(range(mset))
186
+ is_unique = True
187
+ elif isinstance(mset, range):
188
+ mset = list(mset)
189
+ is_unique = True
190
+ else:
191
+ mset = list(mset)
192
+ for i, e in enumerate(mset):
193
+ if mset.index(e) != i:
194
+ break
195
+ else:
196
+ is_unique = True
197
+
198
+ if is_unique:
199
+ if k is None:
200
+ return Combinations_set(mset, as_tuples=as_tuples)
201
+ else:
202
+ return Combinations_setk(mset, k, as_tuples=as_tuples)
203
+ else:
204
+ if k is None:
205
+ return Combinations_mset(mset, as_tuples=as_tuples)
206
+ else:
207
+ return Combinations_msetk(mset, k, as_tuples=as_tuples)
208
+
209
+
210
+ class Combinations_mset(Parent):
211
+ def __init__(self, mset, as_tuples=False):
212
+ """
213
+ TESTS::
214
+
215
+ sage: C = Combinations(range(4))
216
+ sage: C == loads(dumps(C))
217
+ True
218
+ """
219
+ self.mset = mset
220
+ self.as_tuples = as_tuples
221
+ Parent.__init__(self, category=FiniteEnumeratedSets())
222
+
223
+ def __contains__(self, x) -> bool:
224
+ """
225
+ EXAMPLES::
226
+
227
+ sage: c = Combinations(range(4))
228
+ sage: all( i in c for i in c )
229
+ True
230
+ sage: [3,4] in c
231
+ False
232
+ sage: [0,0] in c
233
+ False
234
+ """
235
+ try:
236
+ x = list(x)
237
+ except TypeError:
238
+ return False
239
+
240
+ return all(i in self.mset for i in x) and len(set(x)) == len(x)
241
+
242
+ def __eq__(self, other) -> bool:
243
+ """
244
+ Test for equality.
245
+
246
+ EXAMPLES::
247
+
248
+ sage: c = Combinations([1,2,2,3])
249
+ sage: c == Combinations((1,2,2,3))
250
+ True
251
+ sage: c == Combinations([3,4,4,6])
252
+ False
253
+ """
254
+ return isinstance(other, Combinations_mset) and self.mset == other.mset
255
+
256
+ def __ne__(self, other) -> bool:
257
+ """
258
+ Test for unequality.
259
+
260
+ EXAMPLES::
261
+
262
+ sage: c = Combinations([1,2,2])
263
+ sage: c != Combinations([1,2,3,3])
264
+ True
265
+ """
266
+ return not (self == other)
267
+
268
+ def __repr__(self) -> str:
269
+ """
270
+ TESTS::
271
+
272
+ sage: repr(Combinations(range(4)))
273
+ 'Combinations of [0, 1, 2, 3]'
274
+ """
275
+ return "Combinations of {}".format(self.mset)
276
+
277
+ def __iter__(self):
278
+ """
279
+ TESTS::
280
+
281
+ sage: Combinations(['a','a','b']).list() #indirect doctest
282
+ [[], ['a'], ['b'], ['a', 'a'], ['a', 'b'], ['a', 'a', 'b']]
283
+ sage: Combinations(['a','a','b'],as_tuples=True).list()
284
+ [(), ('a',), ('b',), ('a', 'a'), ('a', 'b'), ('a', 'a', 'b')]
285
+ """
286
+ for k in range(len(self.mset) + 1):
287
+ yield from Combinations_msetk(self.mset, k, as_tuples=self.as_tuples)
288
+
289
+ def cardinality(self) -> Integer:
290
+ """
291
+ TESTS::
292
+
293
+ sage: Combinations([1,2,3]).cardinality()
294
+ 8
295
+ sage: Combinations(['a','a','b']).cardinality() # needs sage.libs.gap
296
+ 6
297
+ """
298
+ return ZZ.sum(Combinations_msetk(self.mset, k).cardinality()
299
+ for k in range(len(self.mset) + 1))
300
+
301
+
302
+ class Combinations_set(Combinations_mset):
303
+ def __iter__(self):
304
+ """
305
+ EXAMPLES::
306
+
307
+ sage: Combinations([1,2,3]).list() #indirect doctest
308
+ [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
309
+ sage: Combinations([1,2,3],as_tuples=True).list()
310
+ [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
311
+ """
312
+ for k in range(len(self.mset) + 1):
313
+ yield from Combinations_setk(self.mset, k, as_tuples=self.as_tuples)
314
+
315
+ def unrank(self, r):
316
+ """
317
+ EXAMPLES::
318
+
319
+ sage: c = Combinations([1,2,3])
320
+ sage: c.list() == list(map(c.unrank, range(c.cardinality())))
321
+ True
322
+ """
323
+ k = 0
324
+ n = len(self.mset)
325
+ b = binomial(n, k)
326
+ while r >= b:
327
+ r -= b
328
+ k += 1
329
+ b = binomial(n, k)
330
+
331
+ result = [self.mset[i] for i in from_rank(r, n, k)]
332
+ return tuple(result) if self.as_tuples else result
333
+
334
+ def rank(self, x):
335
+ """
336
+ EXAMPLES::
337
+
338
+ sage: c = Combinations([1,2,3])
339
+ sage: list(range(c.cardinality())) == list(map(c.rank, c))
340
+ True
341
+ """
342
+ x = [self.mset.index(i) for i in x]
343
+ r = 0
344
+ n = len(self.mset)
345
+ for i in range(len(x)):
346
+ r += binomial(n, i)
347
+ r += rank(x, n)
348
+ return r
349
+
350
+ def cardinality(self):
351
+ """
352
+ Return the size of Combinations(set).
353
+
354
+ EXAMPLES::
355
+
356
+ sage: Combinations(range(16000)).cardinality() == 2^16000
357
+ True
358
+ """
359
+ return ZZ(2)**len(self.mset)
360
+
361
+
362
+ class Combinations_msetk(Parent):
363
+ def __init__(self, mset, k, as_tuples=False):
364
+ """
365
+ TESTS::
366
+
367
+ sage: C = Combinations([1,2,3],2)
368
+ sage: C == loads(dumps(C))
369
+ True
370
+ """
371
+ self.mset = mset
372
+ self.k = k
373
+ self.as_tuples = as_tuples
374
+ Parent.__init__(self, category=FiniteEnumeratedSets())
375
+
376
+ def __contains__(self, x) -> bool:
377
+ """
378
+ EXAMPLES::
379
+
380
+ sage: c = Combinations(range(4),2)
381
+ sage: all( i in c for i in c )
382
+ True
383
+ sage: [0,1] in c
384
+ True
385
+ sage: [0,1,2] in c
386
+ False
387
+ sage: [3,4] in c
388
+ False
389
+ sage: [0,0] in c
390
+ False
391
+ """
392
+ try:
393
+ x = list(x)
394
+ except TypeError:
395
+ return False
396
+ return x in Combinations_mset(self.mset) and len(x) == self.k
397
+
398
+ def __eq__(self, other) -> bool:
399
+ """
400
+ Test for equality.
401
+
402
+ EXAMPLES::
403
+
404
+ sage: c = Combinations([1,2,2,3],3)
405
+ sage: c == Combinations((1,2,2,3), 3)
406
+ True
407
+ sage: c == Combinations([1,2,2,3], 2)
408
+ False
409
+ """
410
+ return (isinstance(other, Combinations_msetk) and
411
+ self.mset == other.mset and self.k == other.k)
412
+
413
+ def __ne__(self, other) -> bool:
414
+ """
415
+ Test for unequality.
416
+
417
+ EXAMPLES::
418
+
419
+ sage: c = Combinations([1,2,2,3],3)
420
+ sage: c != Combinations((1,2,2,3), 2)
421
+ True
422
+ """
423
+ return not (self == other)
424
+
425
+ def __repr__(self) -> str:
426
+ """
427
+ TESTS::
428
+
429
+ sage: repr(Combinations([1,2,2,3],2))
430
+ 'Combinations of [1, 2, 2, 3] of length 2'
431
+ """
432
+ return "Combinations of {} of length {}".format(self.mset, self.k)
433
+
434
+ def __iter__(self):
435
+ """
436
+ EXAMPLES::
437
+
438
+ sage: Combinations(['a','a','b'],2).list() # indirect doctest
439
+ [['a', 'a'], ['a', 'b']]
440
+ """
441
+ items = [self.mset.index(x) for x in self.mset]
442
+ indices = sorted(set(items))
443
+ counts = [0] * len(indices)
444
+ for i in items:
445
+ counts[indices.index(i)] += 1
446
+ for iv in IntegerVectors(self.k, len(indices), outer=counts):
447
+ result = sum([[self.mset[indices[i]]] * iv[i]
448
+ for i in range(len(indices))], [])
449
+ yield tuple(result) if self.as_tuples else result
450
+
451
+ def cardinality(self) -> Integer:
452
+ """
453
+ Return the size of combinations(mset, k).
454
+
455
+ IMPLEMENTATION: Wraps GAP's NrCombinations.
456
+
457
+ EXAMPLES::
458
+
459
+ sage: mset = [1,1,2,3,4,4,5]
460
+ sage: Combinations(mset,2).cardinality() # needs sage.libs.gap
461
+ 12
462
+ """
463
+ from sage.libs.gap.libgap import libgap
464
+ items = [self.mset.index(i) for i in self.mset]
465
+ nc = libgap.function_factory('NrCombinations')
466
+ return ZZ(nc(items, ZZ(self.k)))
467
+
468
+
469
+ class Combinations_setk(Combinations_msetk):
470
+ def _iterator(self, items, n):
471
+ """
472
+ An iterator for all the n-combinations of items.
473
+
474
+ EXAMPLES::
475
+
476
+ sage: it = Combinations([1,2,3,4],3)._iterator([1,2,3,4],3)
477
+ sage: list(it)
478
+ [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
479
+ sage: it = Combinations([1,2,3,4],3,as_tuples=True)._iterator([1,2,3,4],3)
480
+ sage: list(it)
481
+ [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
482
+ """
483
+ if self.as_tuples:
484
+ yield from itertools.combinations(items, n)
485
+ else:
486
+ for combination in itertools.combinations(items, n):
487
+ yield list(combination)
488
+
489
+ def _iterator_zero(self):
490
+ """
491
+ An iterator which just returns the empty list or tuple.
492
+
493
+ EXAMPLES::
494
+
495
+ sage: it = Combinations([1,2,3,4,5],3)._iterator_zero()
496
+ sage: list(it)
497
+ [[]]
498
+ sage: it = Combinations([1,2,3,4,5],3,as_tuples=True)._iterator_zero()
499
+ sage: list(it)
500
+ [()]
501
+ """
502
+ yield () if self.as_tuples else []
503
+
504
+ def __iter__(self):
505
+ r"""
506
+ Uses Python's :func:`itertools.combinations` to iterate through all
507
+ of the combinations.
508
+
509
+ EXAMPLES::
510
+
511
+ sage: Combinations([1,2,3,4,5],3).list() # indirect doctest
512
+ [[1, 2, 3],
513
+ [1, 2, 4],
514
+ [1, 2, 5],
515
+ [1, 3, 4],
516
+ [1, 3, 5],
517
+ [1, 4, 5],
518
+ [2, 3, 4],
519
+ [2, 3, 5],
520
+ [2, 4, 5],
521
+ [3, 4, 5]]
522
+ sage: Combinations([1,2,3,4,5],3,as_tuples=True).list()
523
+ [(1, 2, 3),
524
+ (1, 2, 4),
525
+ (1, 2, 5),
526
+ (1, 3, 4),
527
+ (1, 3, 5),
528
+ (1, 4, 5),
529
+ (2, 3, 4),
530
+ (2, 3, 5),
531
+ (2, 4, 5),
532
+ (3, 4, 5)]
533
+ """
534
+ if self.k == 0:
535
+ return self._iterator_zero()
536
+ else:
537
+ return self._iterator(self.mset, self.k)
538
+
539
+ def list(self) -> list:
540
+ """
541
+ EXAMPLES::
542
+
543
+ sage: Combinations([1,2,3,4,5],3).list()
544
+ [[1, 2, 3],
545
+ [1, 2, 4],
546
+ [1, 2, 5],
547
+ [1, 3, 4],
548
+ [1, 3, 5],
549
+ [1, 4, 5],
550
+ [2, 3, 4],
551
+ [2, 3, 5],
552
+ [2, 4, 5],
553
+ [3, 4, 5]]
554
+ """
555
+ return list(self)
556
+
557
+ def unrank(self, r):
558
+ """
559
+ EXAMPLES::
560
+
561
+ sage: c = Combinations([1,2,3], 2)
562
+ sage: c.list() == list(map(c.unrank, range(c.cardinality())))
563
+ True
564
+ """
565
+ result = [self.mset[i] for i in from_rank(r, len(self.mset), self.k)]
566
+ return tuple(result) if self.as_tuples else result
567
+
568
+ def rank(self, x):
569
+ """
570
+ EXAMPLES::
571
+
572
+ sage: c = Combinations([1,2,3], 2)
573
+ sage: list(range(c.cardinality())) == list(map(c.rank, c.list()))
574
+ True
575
+ """
576
+ x = [self.mset.index(i) for i in x]
577
+ return rank(x, len(self.mset))
578
+
579
+ def cardinality(self) -> Integer:
580
+ """
581
+ Return the size of combinations(set, k).
582
+
583
+ EXAMPLES::
584
+
585
+ sage: Combinations(range(16000), 5).cardinality()
586
+ 8732673194560003200
587
+ """
588
+ return ZZ(binomial(len(self.mset), self.k))
589
+
590
+
591
+ def rank(comb, n, check=True):
592
+ """
593
+ Return the rank of ``comb`` in the subsets of ``range(n)`` of size ``k``
594
+ where ``k`` is the length of ``comb``.
595
+
596
+ The algorithm used is based on combinadics and James McCaffrey's
597
+ MSDN article. See: :wikipedia:`Combinadic`.
598
+
599
+ EXAMPLES::
600
+
601
+ sage: import sage.combinat.combination as combination
602
+ sage: combination.rank((), 3)
603
+ 0
604
+ sage: combination.rank((0,), 3)
605
+ 0
606
+ sage: combination.rank((1,), 3)
607
+ 1
608
+ sage: combination.rank((2,), 3)
609
+ 2
610
+ sage: combination.rank((0,1), 3)
611
+ 0
612
+ sage: combination.rank((0,2), 3)
613
+ 1
614
+ sage: combination.rank((1,2), 3)
615
+ 2
616
+ sage: combination.rank((0,1,2), 3)
617
+ 0
618
+
619
+ sage: combination.rank((0,1,2,3), 3)
620
+ Traceback (most recent call last):
621
+ ...
622
+ ValueError: len(comb) must be <= n
623
+ sage: combination.rank((0,0), 2)
624
+ Traceback (most recent call last):
625
+ ...
626
+ ValueError: comb must be a subword of (0,1,...,n)
627
+
628
+ sage: combination.rank([1,2], 3)
629
+ 2
630
+ sage: combination.rank([0,1,2], 3)
631
+ 0
632
+ """
633
+ k = len(comb)
634
+ if check:
635
+ if k > n:
636
+ raise ValueError("len(comb) must be <= n")
637
+ comb = [int(i) for i in comb]
638
+ for i in range(k - 1):
639
+ if comb[i + 1] <= comb[i]:
640
+ raise ValueError("comb must be a subword of (0,1,...,n)")
641
+
642
+ # Generate the combinadic from the combination
643
+
644
+ # w = [n-1-comb[i] for i in range(k)]
645
+
646
+ # Calculate the integer that is the dual of
647
+ # the lexicographic index of the combination
648
+ r = k
649
+ t = 0
650
+ for i in range(k):
651
+ t += binomial(n - 1 - comb[i], r)
652
+ r -= 1
653
+
654
+ return binomial(n, k) - t - 1
655
+
656
+
657
+ def from_rank(r, n, k):
658
+ r"""
659
+ Return the combination of rank ``r`` in the subsets of
660
+ ``range(n)`` of size ``k`` when listed in lexicographic order.
661
+
662
+ The algorithm used is based on factoradics and presented in [DGH2020]_.
663
+ It is there compared to the other from the literature.
664
+
665
+ EXAMPLES::
666
+
667
+ sage: import sage.combinat.combination as combination
668
+ sage: combination.from_rank(0,3,0)
669
+ ()
670
+ sage: combination.from_rank(0,3,1)
671
+ (0,)
672
+ sage: combination.from_rank(1,3,1)
673
+ (1,)
674
+ sage: combination.from_rank(2,3,1)
675
+ (2,)
676
+ sage: combination.from_rank(0,3,2)
677
+ (0, 1)
678
+ sage: combination.from_rank(1,3,2)
679
+ (0, 2)
680
+ sage: combination.from_rank(2,3,2)
681
+ (1, 2)
682
+ sage: combination.from_rank(0,3,3)
683
+ (0, 1, 2)
684
+
685
+ TESTS::
686
+
687
+ sage: from sage.combinat.combination import from_rank
688
+ sage: def _comb_largest(a, b, x):
689
+ ....: w = a - 1
690
+ ....: while binomial(w,b) > x:
691
+ ....: w -= 1
692
+ ....: return w
693
+ sage: def from_rank_comb_largest(r, n, k):
694
+ ....: a = n
695
+ ....: b = k
696
+ ....: x = binomial(n, k) - 1 - r # x is the 'dual' of m
697
+ ....: comb = [None] * k
698
+ ....: for i in range(k):
699
+ ....: comb[i] = _comb_largest(a, b, x)
700
+ ....: x = x - binomial(comb[i], b)
701
+ ....: a = comb[i]
702
+ ....: b = b - 1
703
+ ....: for i in range(k):
704
+ ....: comb[i] = (n - 1) - comb[i]
705
+ ....: return tuple(comb)
706
+ sage: all(from_rank(r, n, k) == from_rank_comb_largest(r, n, k) # needs sage.symbolic
707
+ ....: for n in range(10) for k in range(n+1) for r in range(binomial(n,k)))
708
+ True
709
+ """
710
+ if k < 0:
711
+ raise ValueError("k must be > 0")
712
+ if k > n:
713
+ raise ValueError("k must be <= n")
714
+ if n == 0 or k == 0:
715
+ return ()
716
+ if n < 0:
717
+ raise ValueError("n must be >= 0")
718
+ B = binomial(n, k)
719
+ if r < 0 or r >= B:
720
+ raise ValueError("r must satisfy 0 <= r < binomial(n, k)")
721
+ if k == 1:
722
+ return (r,)
723
+
724
+ n0 = n
725
+ D = [0] * k
726
+ inverse = False
727
+ if k < n0 / 2:
728
+ inverse = True
729
+ k = n - k
730
+ r = B - 1 - r
731
+
732
+ B = (B * k) // n0
733
+ m = 0
734
+ i = 0
735
+ j = 0
736
+ m2 = 0
737
+ d = 0
738
+ while d < k - 1:
739
+ if B > r:
740
+ if i < k - 2:
741
+ if n0 - 1 - m == 0:
742
+ B = 1
743
+ else:
744
+ B = (B * (k - 1 - i)) // (n0 - 1 - m)
745
+ d += 1
746
+ if inverse:
747
+ for e in range(m2, m + i):
748
+ D[j] = e
749
+ j += 1
750
+ m2 = m + i + 1
751
+ else:
752
+ D[i] = m + i
753
+ i += 1
754
+ n0 -= 1
755
+ else:
756
+ r -= B
757
+ if n0 - 1 - m == 0:
758
+ B = 1
759
+ else:
760
+ B = (B * (n0 - m - k + i)) // (n0 - 1 - m)
761
+ m += 1
762
+ if inverse:
763
+ for e in range(m2, n0 + r + i - B):
764
+ D[j] = e
765
+ j += 1
766
+ for e in range(n0 + r + i + 1 - B, n):
767
+ D[j] = e
768
+ j += 1
769
+ else:
770
+ D[k - 1] = n0 + r + k - 1 - B
771
+ return tuple(D)
772
+
773
+ ##########################################################
774
+ # Deprecations
775
+
776
+
777
+ class ChooseNK(Combinations_setk):
778
+ def __setstate__(self, state):
779
+ r"""
780
+ For unpickling old ``ChooseNK`` objects.
781
+
782
+ TESTS::
783
+
784
+ sage: loads(b"x\x9ck`J.NLO\xd5K\xce\xcfM\xca\xccK,\xd1K\xce\xc8\xcf"
785
+ ....: b"/N\x8d\xcf\xcb\xe6r\x06\xb3\xfc\xbc\xb9\n\x195\x1b\x0b"
786
+ ....: b"\x99j\x0b\x995B\x99\xe2\xf3\nY :\x8a2\xf3\xd2\x8b\xf52"
787
+ ....: b"\xf3JR\xd3S\x8b\xb8r\x13\xb3S\xe3a\x9cB\xd6PF\xd3\xd6\xa0"
788
+ ....: b"B6\xa0\xfa\xecB\xf6\x0c \xd7\x08\xc8\xe5(M\xd2\x03\x00{"
789
+ ....: b"\x82$\xd8")
790
+ Combinations of [0, 1, 2, 3, 4] of length 2
791
+ """
792
+ self.__class__ = Combinations_setk
793
+ Combinations_setk.__init__(self, list(range(state['_n'])), state['_k'])
794
+
795
+
796
+ register_unpickle_override("sage.combinat.choose_nk", "ChooseNK", ChooseNK)