passagemath-combinat 10.6.42__cp314-cp314-musllinux_1_2_x86_64.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 (400) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  3. passagemath_combinat-10.6.42.dist-info/RECORD +400 -0
  4. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  5. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  6. passagemath_combinat.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  7. passagemath_combinat.libs/libsymmetrica-81fe8739.so.3.0.0 +0 -0
  8. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  9. sage/algebras/all.py +24 -0
  10. sage/algebras/all__sagemath_combinat.py +35 -0
  11. sage/algebras/askey_wilson.py +935 -0
  12. sage/algebras/associated_graded.py +345 -0
  13. sage/algebras/cellular_basis.py +350 -0
  14. sage/algebras/cluster_algebra.py +2766 -0
  15. sage/algebras/down_up_algebra.py +860 -0
  16. sage/algebras/free_algebra.py +1698 -0
  17. sage/algebras/free_algebra_element.py +345 -0
  18. sage/algebras/free_algebra_quotient.py +405 -0
  19. sage/algebras/free_algebra_quotient_element.py +295 -0
  20. sage/algebras/free_zinbiel_algebra.py +885 -0
  21. sage/algebras/hall_algebra.py +783 -0
  22. sage/algebras/hecke_algebras/all.py +4 -0
  23. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  24. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  25. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  28. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  29. sage/algebras/jordan_algebra.py +1773 -0
  30. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  31. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  32. sage/algebras/lie_conformal_algebras/all.py +18 -0
  33. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  34. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  35. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  36. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  37. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  38. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  39. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  40. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  41. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  45. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  46. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  47. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  48. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  49. sage/algebras/nil_coxeter_algebra.py +191 -0
  50. sage/algebras/q_commuting_polynomials.py +673 -0
  51. sage/algebras/q_system.py +608 -0
  52. sage/algebras/quantum_clifford.py +959 -0
  53. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  54. sage/algebras/quantum_groups/all.py +9 -0
  55. sage/algebras/quantum_groups/fock_space.py +2219 -0
  56. sage/algebras/quantum_groups/q_numbers.py +207 -0
  57. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  58. sage/algebras/quantum_groups/representations.py +591 -0
  59. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  60. sage/algebras/quantum_oscillator.py +623 -0
  61. sage/algebras/quaternion_algebra.py +20 -0
  62. sage/algebras/quaternion_algebra_element.py +55 -0
  63. sage/algebras/rational_cherednik_algebra.py +525 -0
  64. sage/algebras/schur_algebra.py +670 -0
  65. sage/algebras/shuffle_algebra.py +1011 -0
  66. sage/algebras/splitting_algebra.py +779 -0
  67. sage/algebras/tensor_algebra.py +709 -0
  68. sage/algebras/yangian.py +1082 -0
  69. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  70. sage/all__sagemath_combinat.py +35 -0
  71. sage/combinat/SJT.py +255 -0
  72. sage/combinat/affine_permutation.py +2405 -0
  73. sage/combinat/algebraic_combinatorics.py +55 -0
  74. sage/combinat/all.py +53 -0
  75. sage/combinat/all__sagemath_combinat.py +195 -0
  76. sage/combinat/alternating_sign_matrix.py +2063 -0
  77. sage/combinat/baxter_permutations.py +346 -0
  78. sage/combinat/bijectionist.py +3220 -0
  79. sage/combinat/binary_recurrence_sequences.py +1180 -0
  80. sage/combinat/blob_algebra.py +685 -0
  81. sage/combinat/catalog_partitions.py +27 -0
  82. sage/combinat/chas/all.py +23 -0
  83. sage/combinat/chas/fsym.py +1180 -0
  84. sage/combinat/chas/wqsym.py +2601 -0
  85. sage/combinat/cluster_complex.py +326 -0
  86. sage/combinat/colored_permutations.py +2039 -0
  87. sage/combinat/colored_permutations_representations.py +964 -0
  88. sage/combinat/composition_signed.py +142 -0
  89. sage/combinat/composition_tableau.py +855 -0
  90. sage/combinat/constellation.py +1729 -0
  91. sage/combinat/core.py +751 -0
  92. sage/combinat/counting.py +12 -0
  93. sage/combinat/crystals/affine.py +742 -0
  94. sage/combinat/crystals/affine_factorization.py +518 -0
  95. sage/combinat/crystals/affinization.py +331 -0
  96. sage/combinat/crystals/alcove_path.py +2013 -0
  97. sage/combinat/crystals/all.py +22 -0
  98. sage/combinat/crystals/bkk_crystals.py +141 -0
  99. sage/combinat/crystals/catalog.py +115 -0
  100. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  101. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  102. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  103. sage/combinat/crystals/crystals.py +257 -0
  104. sage/combinat/crystals/direct_sum.py +260 -0
  105. sage/combinat/crystals/elementary_crystals.py +1251 -0
  106. sage/combinat/crystals/fast_crystals.py +441 -0
  107. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  108. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  109. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  110. sage/combinat/crystals/induced_structure.py +695 -0
  111. sage/combinat/crystals/infinity_crystals.py +730 -0
  112. sage/combinat/crystals/kac_modules.py +863 -0
  113. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  114. sage/combinat/crystals/kyoto_path_model.py +497 -0
  115. sage/combinat/crystals/letters.cpython-314-x86_64-linux-musl.so +0 -0
  116. sage/combinat/crystals/letters.pxd +79 -0
  117. sage/combinat/crystals/letters.pyx +3056 -0
  118. sage/combinat/crystals/littelmann_path.py +1518 -0
  119. sage/combinat/crystals/monomial_crystals.py +1262 -0
  120. sage/combinat/crystals/multisegments.py +462 -0
  121. sage/combinat/crystals/mv_polytopes.py +467 -0
  122. sage/combinat/crystals/pbw_crystal.py +511 -0
  123. sage/combinat/crystals/pbw_datum.cpython-314-x86_64-linux-musl.so +0 -0
  124. sage/combinat/crystals/pbw_datum.pxd +4 -0
  125. sage/combinat/crystals/pbw_datum.pyx +487 -0
  126. sage/combinat/crystals/polyhedral_realization.py +372 -0
  127. sage/combinat/crystals/spins.cpython-314-x86_64-linux-musl.so +0 -0
  128. sage/combinat/crystals/spins.pxd +21 -0
  129. sage/combinat/crystals/spins.pyx +756 -0
  130. sage/combinat/crystals/star_crystal.py +290 -0
  131. sage/combinat/crystals/subcrystal.py +464 -0
  132. sage/combinat/crystals/tensor_product.py +1177 -0
  133. sage/combinat/crystals/tensor_product_element.cpython-314-x86_64-linux-musl.so +0 -0
  134. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  135. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  136. sage/combinat/crystals/virtual_crystal.py +420 -0
  137. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  138. sage/combinat/debruijn_sequence.cpython-314-x86_64-linux-musl.so +0 -0
  139. sage/combinat/debruijn_sequence.pyx +355 -0
  140. sage/combinat/decorated_permutation.py +270 -0
  141. sage/combinat/degree_sequences.cpython-314-x86_64-linux-musl.so +0 -0
  142. sage/combinat/degree_sequences.pyx +588 -0
  143. sage/combinat/derangements.py +527 -0
  144. sage/combinat/descent_algebra.py +1008 -0
  145. sage/combinat/diagram.py +1551 -0
  146. sage/combinat/diagram_algebras.py +5886 -0
  147. sage/combinat/dyck_word.py +4349 -0
  148. sage/combinat/e_one_star.py +1623 -0
  149. sage/combinat/enumerated_sets.py +123 -0
  150. sage/combinat/expnums.cpython-314-x86_64-linux-musl.so +0 -0
  151. sage/combinat/expnums.pyx +148 -0
  152. sage/combinat/fast_vector_partitions.cpython-314-x86_64-linux-musl.so +0 -0
  153. sage/combinat/fast_vector_partitions.pyx +346 -0
  154. sage/combinat/fqsym.py +1977 -0
  155. sage/combinat/free_dendriform_algebra.py +954 -0
  156. sage/combinat/free_prelie_algebra.py +1141 -0
  157. sage/combinat/fully_commutative_elements.py +1077 -0
  158. sage/combinat/fully_packed_loop.py +1523 -0
  159. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  160. sage/combinat/gray_codes.py +311 -0
  161. sage/combinat/grossman_larson_algebras.py +667 -0
  162. sage/combinat/growth.py +4352 -0
  163. sage/combinat/hall_polynomial.py +188 -0
  164. sage/combinat/hillman_grassl.py +866 -0
  165. sage/combinat/integer_matrices.py +329 -0
  166. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  167. sage/combinat/k_tableau.py +4564 -0
  168. sage/combinat/kazhdan_lusztig.py +215 -0
  169. sage/combinat/key_polynomial.py +885 -0
  170. sage/combinat/knutson_tao_puzzles.py +2286 -0
  171. sage/combinat/lr_tableau.py +311 -0
  172. sage/combinat/matrices/all.py +24 -0
  173. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  174. sage/combinat/matrices/latin.py +2912 -0
  175. sage/combinat/misc.py +401 -0
  176. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  177. sage/combinat/ncsf_qsym/all.py +21 -0
  178. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  179. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  180. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  181. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  182. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  183. sage/combinat/ncsym/all.py +21 -0
  184. sage/combinat/ncsym/bases.py +855 -0
  185. sage/combinat/ncsym/dual.py +593 -0
  186. sage/combinat/ncsym/ncsym.py +2076 -0
  187. sage/combinat/necklace.py +551 -0
  188. sage/combinat/non_decreasing_parking_function.py +634 -0
  189. sage/combinat/nu_dyck_word.py +1474 -0
  190. sage/combinat/output.py +861 -0
  191. sage/combinat/parallelogram_polyomino.py +4326 -0
  192. sage/combinat/parking_functions.py +1602 -0
  193. sage/combinat/partition_algebra.py +1998 -0
  194. sage/combinat/partition_kleshchev.py +1982 -0
  195. sage/combinat/partition_shifting_algebras.py +584 -0
  196. sage/combinat/partition_tuple.py +3114 -0
  197. sage/combinat/path_tableaux/all.py +13 -0
  198. sage/combinat/path_tableaux/catalog.py +29 -0
  199. sage/combinat/path_tableaux/dyck_path.py +380 -0
  200. sage/combinat/path_tableaux/frieze.py +476 -0
  201. sage/combinat/path_tableaux/path_tableau.py +728 -0
  202. sage/combinat/path_tableaux/semistandard.py +510 -0
  203. sage/combinat/perfect_matching.py +779 -0
  204. sage/combinat/plane_partition.py +3300 -0
  205. sage/combinat/q_bernoulli.cpython-314-x86_64-linux-musl.so +0 -0
  206. sage/combinat/q_bernoulli.pyx +128 -0
  207. sage/combinat/quickref.py +81 -0
  208. sage/combinat/recognizable_series.py +2051 -0
  209. sage/combinat/regular_sequence.py +4316 -0
  210. sage/combinat/regular_sequence_bounded.py +543 -0
  211. sage/combinat/restricted_growth.py +81 -0
  212. sage/combinat/ribbon.py +20 -0
  213. sage/combinat/ribbon_shaped_tableau.py +489 -0
  214. sage/combinat/ribbon_tableau.py +1180 -0
  215. sage/combinat/rigged_configurations/all.py +46 -0
  216. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  217. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  218. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  219. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  222. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  223. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  224. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  225. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  226. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  227. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  228. sage/combinat/rigged_configurations/bijection.py +143 -0
  229. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  230. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  231. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  232. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  233. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  234. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  235. sage/combinat/rigged_configurations/rigged_partition.cpython-314-x86_64-linux-musl.so +0 -0
  236. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  238. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  240. sage/combinat/rsk.py +3438 -0
  241. sage/combinat/schubert_polynomial.py +508 -0
  242. sage/combinat/set_partition.py +3318 -0
  243. sage/combinat/set_partition_iterator.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/combinat/set_partition_iterator.pyx +136 -0
  245. sage/combinat/set_partition_ordered.py +1590 -0
  246. sage/combinat/sf/abreu_nigro.py +346 -0
  247. sage/combinat/sf/all.py +52 -0
  248. sage/combinat/sf/character.py +576 -0
  249. sage/combinat/sf/classical.py +319 -0
  250. sage/combinat/sf/dual.py +996 -0
  251. sage/combinat/sf/elementary.py +549 -0
  252. sage/combinat/sf/hall_littlewood.py +1028 -0
  253. sage/combinat/sf/hecke.py +336 -0
  254. sage/combinat/sf/homogeneous.py +464 -0
  255. sage/combinat/sf/jack.py +1428 -0
  256. sage/combinat/sf/k_dual.py +1458 -0
  257. sage/combinat/sf/kfpoly.py +447 -0
  258. sage/combinat/sf/llt.py +789 -0
  259. sage/combinat/sf/macdonald.py +2019 -0
  260. sage/combinat/sf/monomial.py +525 -0
  261. sage/combinat/sf/multiplicative.py +113 -0
  262. sage/combinat/sf/new_kschur.py +1786 -0
  263. sage/combinat/sf/ns_macdonald.py +964 -0
  264. sage/combinat/sf/orthogonal.py +246 -0
  265. sage/combinat/sf/orthotriang.py +355 -0
  266. sage/combinat/sf/powersum.py +963 -0
  267. sage/combinat/sf/schur.py +880 -0
  268. sage/combinat/sf/sf.py +1653 -0
  269. sage/combinat/sf/sfa.py +7053 -0
  270. sage/combinat/sf/symplectic.py +253 -0
  271. sage/combinat/sf/witt.py +721 -0
  272. sage/combinat/shifted_primed_tableau.py +2735 -0
  273. sage/combinat/shuffle.py +830 -0
  274. sage/combinat/sidon_sets.py +146 -0
  275. sage/combinat/similarity_class_type.py +1721 -0
  276. sage/combinat/sine_gordon.py +618 -0
  277. sage/combinat/six_vertex_model.py +784 -0
  278. sage/combinat/skew_partition.py +2053 -0
  279. sage/combinat/skew_tableau.py +2989 -0
  280. sage/combinat/sloane_functions.py +8935 -0
  281. sage/combinat/specht_module.py +1403 -0
  282. sage/combinat/species/all.py +48 -0
  283. sage/combinat/species/characteristic_species.py +321 -0
  284. sage/combinat/species/composition_species.py +273 -0
  285. sage/combinat/species/cycle_species.py +284 -0
  286. sage/combinat/species/empty_species.py +155 -0
  287. sage/combinat/species/functorial_composition_species.py +148 -0
  288. sage/combinat/species/generating_series.py +673 -0
  289. sage/combinat/species/library.py +148 -0
  290. sage/combinat/species/linear_order_species.py +169 -0
  291. sage/combinat/species/misc.py +83 -0
  292. sage/combinat/species/partition_species.py +290 -0
  293. sage/combinat/species/permutation_species.py +268 -0
  294. sage/combinat/species/product_species.py +423 -0
  295. sage/combinat/species/recursive_species.py +476 -0
  296. sage/combinat/species/set_species.py +192 -0
  297. sage/combinat/species/species.py +820 -0
  298. sage/combinat/species/structure.py +539 -0
  299. sage/combinat/species/subset_species.py +243 -0
  300. sage/combinat/species/sum_species.py +225 -0
  301. sage/combinat/subword.py +564 -0
  302. sage/combinat/subword_complex.py +2122 -0
  303. sage/combinat/subword_complex_c.cpython-314-x86_64-linux-musl.so +0 -0
  304. sage/combinat/subword_complex_c.pyx +119 -0
  305. sage/combinat/super_tableau.py +821 -0
  306. sage/combinat/superpartition.py +1154 -0
  307. sage/combinat/symmetric_group_algebra.py +3774 -0
  308. sage/combinat/symmetric_group_representations.py +1830 -0
  309. sage/combinat/t_sequences.py +877 -0
  310. sage/combinat/tableau.py +9506 -0
  311. sage/combinat/tableau_residues.py +860 -0
  312. sage/combinat/tableau_tuple.py +5353 -0
  313. sage/combinat/tiling.py +2432 -0
  314. sage/combinat/triangles_FHM.py +777 -0
  315. sage/combinat/tutorial.py +1857 -0
  316. sage/combinat/vector_partition.py +337 -0
  317. sage/combinat/words/abstract_word.py +1722 -0
  318. sage/combinat/words/all.py +59 -0
  319. sage/combinat/words/alphabet.py +268 -0
  320. sage/combinat/words/finite_word.py +7201 -0
  321. sage/combinat/words/infinite_word.py +113 -0
  322. sage/combinat/words/lyndon_word.py +652 -0
  323. sage/combinat/words/morphic.py +351 -0
  324. sage/combinat/words/morphism.py +3878 -0
  325. sage/combinat/words/paths.py +2932 -0
  326. sage/combinat/words/shuffle_product.py +278 -0
  327. sage/combinat/words/suffix_trees.py +1873 -0
  328. sage/combinat/words/word.py +769 -0
  329. sage/combinat/words/word_char.cpython-314-x86_64-linux-musl.so +0 -0
  330. sage/combinat/words/word_char.pyx +847 -0
  331. sage/combinat/words/word_datatypes.cpython-314-x86_64-linux-musl.so +0 -0
  332. sage/combinat/words/word_datatypes.pxd +4 -0
  333. sage/combinat/words/word_datatypes.pyx +1067 -0
  334. sage/combinat/words/word_generators.py +2026 -0
  335. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  336. sage/combinat/words/word_options.py +99 -0
  337. sage/combinat/words/words.py +2396 -0
  338. sage/data_structures/all__sagemath_combinat.py +1 -0
  339. sage/databases/all__sagemath_combinat.py +13 -0
  340. sage/databases/findstat.py +4897 -0
  341. sage/databases/oeis.py +2058 -0
  342. sage/databases/sloane.py +393 -0
  343. sage/dynamics/all__sagemath_combinat.py +14 -0
  344. sage/dynamics/cellular_automata/all.py +7 -0
  345. sage/dynamics/cellular_automata/catalog.py +34 -0
  346. sage/dynamics/cellular_automata/elementary.py +612 -0
  347. sage/dynamics/cellular_automata/glca.py +477 -0
  348. sage/dynamics/cellular_automata/solitons.py +1463 -0
  349. sage/dynamics/finite_dynamical_system.py +1249 -0
  350. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  351. sage/games/all.py +7 -0
  352. sage/games/hexad.py +704 -0
  353. sage/games/quantumino.py +591 -0
  354. sage/games/sudoku.py +889 -0
  355. sage/games/sudoku_backtrack.cpython-314-x86_64-linux-musl.so +0 -0
  356. sage/games/sudoku_backtrack.pyx +189 -0
  357. sage/groups/all__sagemath_combinat.py +1 -0
  358. sage/groups/indexed_free_group.py +489 -0
  359. sage/libs/all__sagemath_combinat.py +6 -0
  360. sage/libs/lrcalc/__init__.py +1 -0
  361. sage/libs/lrcalc/lrcalc.py +525 -0
  362. sage/libs/symmetrica/__init__.py +7 -0
  363. sage/libs/symmetrica/all.py +101 -0
  364. sage/libs/symmetrica/kostka.pxi +168 -0
  365. sage/libs/symmetrica/part.pxi +193 -0
  366. sage/libs/symmetrica/plet.pxi +42 -0
  367. sage/libs/symmetrica/sab.pxi +196 -0
  368. sage/libs/symmetrica/sb.pxi +332 -0
  369. sage/libs/symmetrica/sc.pxi +192 -0
  370. sage/libs/symmetrica/schur.pxi +956 -0
  371. sage/libs/symmetrica/symmetrica.cpython-314-x86_64-linux-musl.so +0 -0
  372. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  373. sage/libs/symmetrica/symmetrica.pyx +39 -0
  374. sage/monoids/all.py +13 -0
  375. sage/monoids/automatic_semigroup.py +1054 -0
  376. sage/monoids/free_abelian_monoid.py +315 -0
  377. sage/monoids/free_abelian_monoid_element.cpython-314-x86_64-linux-musl.so +0 -0
  378. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  379. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  380. sage/monoids/free_monoid.py +335 -0
  381. sage/monoids/free_monoid_element.py +431 -0
  382. sage/monoids/hecke_monoid.py +65 -0
  383. sage/monoids/string_monoid.py +817 -0
  384. sage/monoids/string_monoid_element.py +547 -0
  385. sage/monoids/string_ops.py +143 -0
  386. sage/monoids/trace_monoid.py +972 -0
  387. sage/rings/all__sagemath_combinat.py +2 -0
  388. sage/sat/all.py +4 -0
  389. sage/sat/boolean_polynomials.py +405 -0
  390. sage/sat/converters/__init__.py +6 -0
  391. sage/sat/converters/anf2cnf.py +14 -0
  392. sage/sat/converters/polybori.py +611 -0
  393. sage/sat/solvers/__init__.py +5 -0
  394. sage/sat/solvers/cryptominisat.py +287 -0
  395. sage/sat/solvers/dimacs.py +783 -0
  396. sage/sat/solvers/picosat.py +228 -0
  397. sage/sat/solvers/sat_lp.py +156 -0
  398. sage/sat/solvers/satsolver.cpython-314-x86_64-linux-musl.so +0 -0
  399. sage/sat/solvers/satsolver.pxd +3 -0
  400. sage/sat/solvers/satsolver.pyx +405 -0
@@ -0,0 +1,123 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ """
3
+ Enumerated sets
4
+
5
+ Basic enumerated sets
6
+ ---------------------
7
+
8
+ - :class:`~sage.combinat.subset.Subsets`, :class:`~sage.combinat.combination.Combinations`
9
+ - :class:`~sage.combinat.permutation.Arrangements`, :class:`~sage.combinat.tuple.Tuples`
10
+ - :class:`~sage.sets.finite_enumerated_set.FiniteEnumeratedSet`
11
+ - :class:`~DisjointUnionEnumeratedSets`
12
+
13
+ Integer lists
14
+ -------------
15
+
16
+ - :ref:`sage.combinat.partition`
17
+ - :ref:`sage.combinat.composition`
18
+ - :class:`~sage.combinat.composition_signed.SignedCompositions`
19
+ - :class:`IntegerListsLex`
20
+ - :ref:`sage.combinat.superpartition`
21
+
22
+ - :class:`~sage.combinat.integer_vector.IntegerVectors`
23
+ - :func:`~sage.combinat.integer_vector_weighted.WeightedIntegerVectors`
24
+ - :class:`~sage.combinat.integer_vectors_mod_permgroup.IntegerVectorsModPermutationGroup`
25
+
26
+ - :ref:`sage.combinat.parking_functions`
27
+ - :ref:`sage.combinat.non_decreasing_parking_function`
28
+
29
+ - :ref:`sage.combinat.sidon_sets`
30
+
31
+ Words
32
+ -----
33
+
34
+ - :class:`Words`
35
+ - :ref:`sage.combinat.subword`
36
+ - :ref:`sage.combinat.necklace`
37
+ - :ref:`sage.combinat.words.lyndon_word`
38
+ - :ref:`sage.combinat.dyck_word`
39
+ - :ref:`sage.combinat.debruijn_sequence`
40
+ - :ref:`sage.combinat.shuffle`
41
+
42
+ Permutations and arrangements
43
+ -----------------------------
44
+
45
+ - :ref:`sage.combinat.permutation`
46
+ - :ref:`sage.combinat.permutation_cython`
47
+ - :ref:`sage.combinat.affine_permutation`
48
+ - :class:`~sage.combinat.permutation.Arrangements`
49
+ - :ref:`sage.combinat.derangements`
50
+ - :ref:`sage.combinat.baxter_permutations`
51
+
52
+ .. SEEALSO::
53
+
54
+ - :class:`SymmetricGroup`, :func:`PermutationGroup`, :ref:`sage.groups.perm_gps.permutation_groups_catalog`
55
+ - :class:`FiniteSetMaps`
56
+ - :ref:`sage.combinat.integer_vectors_mod_permgroup`
57
+ - :ref:`sage.combinat.rsk`
58
+
59
+ Polyominoes
60
+ -----------
61
+
62
+ - :ref:`sage.combinat.parallelogram_polyomino`
63
+
64
+ Integer matrices and arrays
65
+ ---------------------------
66
+
67
+ - :ref:`sage.combinat.integer_matrices`
68
+ - :ref:`sage.combinat.matrices.hadamard_matrix`
69
+ - :ref:`sage.combinat.matrices.latin`
70
+ - :ref:`sage.combinat.alternating_sign_matrix`
71
+ - :ref:`sage.combinat.six_vertex_model`
72
+ - :ref:`sage.combinat.similarity_class_type`
73
+ - :ref:`sage.combinat.restricted_growth`
74
+ - :ref:`sage.combinat.vector_partition`
75
+
76
+ Subsets and set partitions
77
+ --------------------------
78
+
79
+ - :class:`~sage.combinat.subset.Subsets`, :class:`~sage.combinat.combination.Combinations`
80
+ - :class:`~sage.combinat.subsets_pairwise.PairwiseCompatibleSubsets`
81
+ - :ref:`sage.combinat.subsets_hereditary`
82
+ - :ref:`sage.combinat.set_partition_ordered`
83
+ - :ref:`sage.combinat.set_partition`
84
+ - :ref:`sage.combinat.diagram_algebras`
85
+ - :class:`~sage.combinat.multiset_partition_into_sets_ordered.OrderedMultisetPartitionsIntoSets`,
86
+ :class:`~sage.combinat.multiset_partition_into_sets_ordered.OrderedMultisetPartitionIntoSets`
87
+
88
+ Trees
89
+ -----
90
+
91
+ - :ref:`sage.combinat.abstract_tree`
92
+ - :ref:`sage.combinat.ordered_tree`
93
+ - :ref:`sage.combinat.binary_tree`
94
+ - :ref:`sage.combinat.rooted_tree`
95
+
96
+ Enumerated sets related to graphs
97
+ ---------------------------------
98
+
99
+ - :ref:`sage.combinat.degree_sequences`
100
+ - :ref:`sage.combinat.graph_path`
101
+ - :ref:`sage.combinat.perfect_matching`
102
+
103
+ Miscellaneous enumerated sets
104
+ -----------------------------
105
+
106
+ - :class:`~sage.combinat.integer_lists.invlex.IntegerListsLex`
107
+ - :class:`~sage.combinat.integer_vectors_mod_permgroup.IntegerVectorsModPermutationGroup`
108
+ - :ref:`sage.combinat.gray_codes`
109
+ - :class:`~sage.combinat.gelfand_tsetlin_patterns.GelfandTsetlinPattern`, :class:`~sage.combinat.gelfand_tsetlin_patterns.GelfandTsetlinPatterns`
110
+ - :class:`~sage.combinat.knutson_tao_puzzles.KnutsonTaoPuzzleSolver`
111
+ - :func:`LatticePolytope`
112
+
113
+ Backtracking solvers
114
+ --------------------
115
+
116
+ - :func:`~sage.sets.recursively_enumerated_set.RecursivelyEnumeratedSet`
117
+ - :class:`~sage.combinat.backtrack.GenericBacktracker`
118
+ - :mod:`sage.parallel.map_reduce`
119
+ - :ref:`sage.combinat.tiling`
120
+ - :ref:`sage.combinat.dlx`
121
+ - :ref:`sage.combinat.matrices.dlxcpp`
122
+
123
+ """
@@ -0,0 +1,148 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ r"""
3
+ Bell and Uppuluri-Carpenter numbers
4
+
5
+ AUTHORS:
6
+
7
+ - Nick Alexander
8
+ """
9
+
10
+ from cysignals.memory cimport check_allocarray, sig_free
11
+ from sage.libs.gmp.mpz cimport *
12
+ from sage.rings.integer cimport Integer
13
+
14
+
15
+ def expnums(int n, int aa):
16
+ r"""
17
+ Compute the first `n` exponential numbers around
18
+ `aa`, starting with the zero-th.
19
+
20
+ INPUT:
21
+
22
+ - ``n`` -- C machine int
23
+
24
+ - ``aa`` -- C machine int
25
+
26
+ OUTPUT: list of length `n`
27
+
28
+ ALGORITHM: We use the same integer addition algorithm as GAP. This
29
+ is an extension of Bell's triangle to the general case of
30
+ exponential numbers. The recursion performs `O(n^2)`
31
+ additions, but the running time is dominated by the cost of the
32
+ last integer addition, because the growth of the integer results of
33
+ partial computations is exponential in `n`. The algorithm
34
+ stores `O(n)` integers, but each is exponential in
35
+ `n`.
36
+
37
+ EXAMPLES::
38
+
39
+ sage: expnums(10, 1)
40
+ [1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147]
41
+
42
+ ::
43
+
44
+ sage: expnums(10, -1)
45
+ [1, -1, 0, 1, 1, -2, -9, -9, 50, 267]
46
+
47
+ ::
48
+
49
+ sage: expnums(1, 1)
50
+ [1]
51
+ sage: expnums(0, 1)
52
+ []
53
+ sage: expnums(-1, 0)
54
+ []
55
+
56
+ AUTHORS:
57
+
58
+ - Nick Alexander
59
+ """
60
+ if n < 1:
61
+ return []
62
+
63
+ cdef Integer z
64
+ if n == 1:
65
+ z = Integer.__new__(Integer)
66
+ mpz_set_si(z.value, 1)
67
+ return [z]
68
+
69
+ n = n - 1
70
+
71
+ r = []
72
+ z = Integer.__new__(Integer)
73
+ mpz_set_si(z.value, 1)
74
+ r.append(z)
75
+
76
+ z = Integer.__new__(Integer)
77
+ mpz_set_si(z.value, aa)
78
+ r.append(z)
79
+
80
+ cdef mpz_t *bell
81
+ bell = <mpz_t *>check_allocarray(n + 1, sizeof(mpz_t))
82
+ cdef mpz_t a
83
+ mpz_init_set_si(a, aa)
84
+ mpz_init_set_si(bell[1], aa)
85
+ cdef int i
86
+ cdef int k
87
+ for i in range(1, n):
88
+ mpz_init(bell[i+1])
89
+ mpz_mul(bell[i+1], a, bell[1])
90
+ for k in range(i):
91
+ mpz_add(bell[i-k], bell[i-k], bell[i-k+1])
92
+
93
+ z = Integer.__new__(Integer)
94
+ mpz_set(z.value, bell[1])
95
+ r.append(z)
96
+
97
+ for i in range(1, n + 1):
98
+ mpz_clear(bell[i])
99
+ sig_free(bell)
100
+
101
+ return r
102
+
103
+ # The following code is from GAP 4.4.9.
104
+ ###################################################
105
+ # InstallGlobalFunction(Bell,function ( n )
106
+ # local bell, k, i;
107
+ # bell := [ 1 ];
108
+ # for i in [1..n-1] do
109
+ # bell[i+1] := bell[1];
110
+ # for k in [0..i-1] do
111
+ # bell[i-k] := bell[i-k] + bell[i-k+1];
112
+ # od;
113
+ # od;
114
+ # return bell[1];
115
+ # end);
116
+
117
+
118
+ def expnums2(n, aa):
119
+ r"""
120
+ A vanilla python (but compiled via Cython) implementation of
121
+ expnums.
122
+
123
+ We Compute the first `n` exponential numbers around
124
+ `aa`, starting with the zero-th.
125
+
126
+ EXAMPLES::
127
+
128
+ sage: from sage.combinat.expnums import expnums2
129
+ sage: expnums2(10, 1)
130
+ [1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147]
131
+ """
132
+ if n < 1:
133
+ return []
134
+ if n == 1:
135
+ return [Integer(1)]
136
+
137
+ n = n - 1
138
+ r = [Integer(1), Integer(aa)]
139
+
140
+ bell = [Integer(0)] * (n+1)
141
+ a = aa
142
+ bell[1] = aa
143
+ for i in range(1, n):
144
+ bell[i+1] = a * bell[1]
145
+ for k in range(i):
146
+ bell[i-k] = bell[i-k] + bell[i-k+1]
147
+ r.append(bell[1])
148
+ return r
@@ -0,0 +1,346 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ r"""
3
+ Brent Yorgey's fast algorithm for integer vector (multiset) partitions
4
+
5
+ ALGORITHM:
6
+
7
+ Brent Yorgey, Generating Multiset Partitions, The Monad Reader, Issue 8,
8
+ September 2007, p. 5.
9
+
10
+ https://wiki.haskell.org/The_Monad.Reader/Previous_issues
11
+
12
+ AUTHORS:
13
+
14
+ - D\. K\. Sunko (2020-02-19): initial version
15
+ - F\. Chapoton (2020-02-22): conversion to iterators and shorter doctests and
16
+ doc tweaks
17
+ - T\. Scrimshaw (2020-03-06): Cython optimizations and doc tweaks
18
+ """
19
+ ################################################################################
20
+ # Copyright (C) 2020 Denis Sunko <dks@phy.hr> #
21
+ # Copyright (C) 2020 Frédéric Chapoton <chapoton@math.unistra.fr> #
22
+ # Copyright (C) 2020 Travis Scrimshaw <tscrims@gmail.com> #
23
+ # #
24
+ # This program is free software: you can redistribute it and/or modify #
25
+ # it under the terms of the GNU General Public License as published by #
26
+ # the Free Software Foundation, either version 2 of the License, or #
27
+ # (at your option) any later version. The text of the license is found at #
28
+ # https://www.gnu.org/licenses/ #
29
+ ################################################################################
30
+ #
31
+ # To understand the code below, consult the ALGORITHM.
32
+
33
+ cdef list vector_halve(list v):
34
+ r"""
35
+ Return the vector halfway (lexicographically) between ``v`` and zero.
36
+
37
+ Internal part of :func:`fast_vector_partitions`.
38
+
39
+ INPUT:
40
+
41
+ - ``v`` -- list of nonnegative integers, understood as a vector
42
+
43
+ OUTPUT:
44
+
45
+ A list, understood as the integer vector halfway down the list of
46
+ lexicographically ordered vectors between ``v`` and zero.
47
+
48
+ EXAMPLES::
49
+
50
+ sage: from sage.combinat.fast_vector_partitions import vector_halve # not tested
51
+ sage: vector_halve([1, 2, 3, 4, 5, 6, 7, 8, 9]) # not tested
52
+ [0, 2, 3, 4, 5, 6, 7, 8, 9]
53
+ sage: vector_halve([2, 4, 6, 8, 5, 6, 7, 8, 9]) # not tested
54
+ [1, 2, 3, 4, 2, 6, 7, 8, 9]
55
+
56
+ .. NOTE::
57
+
58
+ For vectors, ``v = a + b`` implies ``v = b + a``, which means that a
59
+ downward search for such splittings, starting with ``v = v + 0``, need
60
+ only look as far as some "v / 2", given precise meaning here.
61
+
62
+ A similar logic is to stop the search for divisors of ``N`` at
63
+ ``sqrt(N)``, halving the exponents in the prime decomposition.
64
+ However, here "v / 2" does not mean halving each coordinate.
65
+ """
66
+ cdef list result = list(v) # make a copy
67
+ cdef Py_ssize_t i, vv
68
+ for i in range(len(v)):
69
+ vv = <Py_ssize_t> v[i]
70
+ result[i] = vv // 2
71
+ if vv % 2:
72
+ # the less significant part is just copied
73
+ return result
74
+ return result
75
+
76
+
77
+ def recursive_within_from_to(list m, list s, list e, bint useS, bint useE):
78
+ r"""
79
+ Iterate over a lexicographically ordered list of lists ``v`` satisfying
80
+ ``e <= v <= s`` and ``v <|= m`` as vectors.
81
+
82
+ Internal part of :func:`fast_vector_partitions`.
83
+
84
+ INPUT:
85
+
86
+ - ``m`` -- list of nonnegative integers, understood as a vector
87
+ - ``s`` -- list of nonnegative integers, understood as a vector
88
+ - ``e`` -- list of nonnegative integers, understood as a vector
89
+ - ``useS`` -- boolean
90
+ - ``useE`` -- boolean
91
+
92
+ EXAMPLES::
93
+
94
+ sage: from sage.combinat.fast_vector_partitions import recursive_within_from_to
95
+ sage: list(recursive_within_from_to([1, 2, 3],[1, 2, 2],[1, 1, 1],True,True))
96
+ [[1, 2, 2], [1, 2, 1], [1, 2, 0], [1, 1, 3], [1, 1, 2], [1, 1, 1]]
97
+
98
+ .. NOTE::
99
+
100
+ The flags ``useS`` and ``useE`` are used to implement the condition
101
+ efficiently. Because testing it loops over the vector, re-testing
102
+ at each step as the vector is parsed is inefficient: all but the last
103
+ comparison have been done cumulatively already. This code tests
104
+ only for the last one, using the flags to accumulate information
105
+ from previous calls.
106
+
107
+ .. WARNING::
108
+
109
+ Expects to be called with ``s <|= m``.
110
+
111
+ Expects to be called first with ``useS == useE == True``.
112
+ """
113
+ cdef Py_ssize_t start, end, x
114
+ cdef bint useSS, useEE
115
+
116
+ if useS:
117
+ start = <Py_ssize_t> s[0]
118
+ else:
119
+ start = <Py_ssize_t> m[0]
120
+
121
+ if useE:
122
+ end = <Py_ssize_t> e[0]
123
+ else:
124
+ end = 0
125
+
126
+ if len(m) == 1:
127
+ # We use this style of Cython code for now in order to get this to convert
128
+ # to an optimized pure C for loop. See Cython github issue #532.
129
+ # for x in range(start, end - 1, -1):
130
+ for x from start >= x >= end by 1:
131
+ yield [x] # we know the answer for singletons
132
+ else:
133
+ # We use this style of Cython code for now in order to get this to convert
134
+ # to an optimized pure C for loop. See Cython github issue #532.
135
+ # for x in range(start, end - 1, -1):
136
+ for x from start >= x >= end by 1:
137
+ useSS = useS and x == <Py_ssize_t> s[0]
138
+ useEE = useE and x == <Py_ssize_t> e[0]
139
+ for o in recursive_within_from_to(m[1:], s[1:], e[1:], useSS, useEE):
140
+ yield [x] + o
141
+
142
+
143
+ def within_from_to(list m, list s, list e):
144
+ r"""
145
+ Iterate over a lexicographically ordered list of lists ``v`` satisfying
146
+ ``e <= v <= s`` and ``v <|= m`` as vectors.
147
+
148
+ Internal part of :func:`fast_vector_partitions`.
149
+
150
+ INPUT:
151
+
152
+ - ``m`` -- list of nonnegative integers, understood as a vector
153
+ - ``s`` -- list of nonnegative integers, understood as a vector
154
+ - ``e`` -- list of nonnegative integers, understood as a vector
155
+
156
+ EXAMPLES::
157
+
158
+ sage: from sage.combinat.fast_vector_partitions import within_from_to
159
+ sage: list(within_from_to([1, 2, 3], [1, 2, 2], [1, 1, 1]))
160
+ [[1, 2, 2], [1, 2, 1], [1, 2, 0], [1, 1, 3], [1, 1, 2], [1, 1, 1]]
161
+
162
+ .. NOTE::
163
+
164
+ The input ``s`` will be "clipped" internally if it does not satisfy
165
+ the condition ``s <|= m``.
166
+
167
+ To understand the input check, some line art is helpful. Assume
168
+ that ``(a,b)`` are the two least significant coordinates of some
169
+ vector. Say::
170
+
171
+ e = (2,3), s = (7,6), m = (9,8).
172
+
173
+ In the figure, these values are denoted by ``E``, ``S``, and ``M``,
174
+ while the letter ``X`` stands for all other allowed values of
175
+ ``v = (a,b)``::
176
+
177
+ b ^
178
+ |
179
+ 8 --------X---X---X---X---X-----------M
180
+ | |
181
+ 7 - X X X X X |
182
+ | |
183
+ 6 - X X X X X S |
184
+ | |
185
+ 5 - X X X X X X |
186
+ | |
187
+ 4 - X X X X X X |
188
+ | |
189
+ 3 - E X X X X X |
190
+ | |
191
+ 2 - X X X X X |
192
+ | |
193
+ 1 - X X X X X |
194
+ | |
195
+ 0 ----|---|---X---X---X---X---X---|---|--->
196
+ 0 1 2 3 4 5 6 7 8 9 a
197
+
198
+ If ``S`` moves horizontally, the full-height columns fill the box in
199
+ until ``S`` reaches ``M``, at which point it remains the limit in the
200
+ b-direction as it moves out of the box, while M takes over as the
201
+ limit in the a-direction, so the ``M``-column remains filled only up to
202
+ ``S``, no matter how much ``S`` moves further to the right.
203
+
204
+ If ``S`` moves vertically, its column will be filled to the top of the
205
+ box, but it remains the relevant limit in the a-direction, while ``M``
206
+ takes over in the b-direction as ``S`` goes out of the box upwards.
207
+
208
+ Both behaviors are captured by using the smaller coordinate of ``S``
209
+ and ``M``, whenever ``S`` is outside the box defined by M. The input
210
+ will be "clipped" accordingly in that case.
211
+
212
+ .. WARNING::
213
+
214
+ The "clipping" behavior is transparent to the user, but may be
215
+ puzzling when comparing outputs with the function
216
+ :func:`recursive_within_from_to` which has no input protection.
217
+ """
218
+ cdef list ss = s
219
+ # if s is not in the box defined by m, we must clip:
220
+ cdef Py_ssize_t i, j
221
+ for i in range(len(m)): # should have the same length as s
222
+ if s[i] > m[i]:
223
+ ss = list(ss) # make a copy
224
+ ss[i] = m[i]
225
+ for j in range(i+1, len(m)):
226
+ if ss[j] > m[j]:
227
+ ss[j] = m[j]
228
+ break
229
+ if e > ss:
230
+ return
231
+ yield from recursive_within_from_to(m, ss, e, True, True)
232
+
233
+
234
+ cdef inline list vector_sub(list a, list b):
235
+ """
236
+ Return ``a - b`` considered as vectors.
237
+
238
+ This assumes ``len(b) >= len(a)``.
239
+ """
240
+ cdef Py_ssize_t i
241
+ cdef list ret = []
242
+ for i in range(len(a)):
243
+ ret.append((<Py_ssize_t> a[i]) - (<Py_ssize_t> b[i]))
244
+ return ret
245
+
246
+
247
+ def recursive_vector_partitions(list v, list vL):
248
+ r"""
249
+ Iterate over a lexicographically ordered list of lists, each list
250
+ representing a vector partition of ``v``, such that no part of any
251
+ partition is lexicographically smaller than ``vL``.
252
+
253
+ Internal part of :func:`fast_vector_partitions`.
254
+
255
+ INPUT:
256
+
257
+ - ``v`` -- list of nonnegative integers, understood as a vector
258
+ - ``vL`` -- list of nonnegative integers, understood as a vector
259
+
260
+ EXAMPLES::
261
+
262
+ sage: from sage.combinat.fast_vector_partitions import recursive_vector_partitions
263
+ sage: list(recursive_vector_partitions([2, 2, 2],[1, 1, 1]))
264
+ [[[2, 2, 2]], [[1, 1, 1], [1, 1, 1]]]
265
+ sage: list(recursive_vector_partitions([2, 2, 2],[1, 1, 0]))
266
+ [[[2, 2, 2]], [[1, 1, 1], [1, 1, 1]], [[1, 1, 0], [1, 1, 2]]]
267
+ sage: list(recursive_vector_partitions([2, 2, 2],[1, 0, 1]))
268
+ [[[2, 2, 2]],
269
+ [[1, 1, 1], [1, 1, 1]],
270
+ [[1, 1, 0], [1, 1, 2]],
271
+ [[1, 0, 2], [1, 2, 0]],
272
+ [[1, 0, 1], [1, 2, 1]]]
273
+ """
274
+ cdef list v_minus_vv, pp, vv
275
+ yield [v]
276
+ for vv in within_from_to(v, vector_halve(v), vL):
277
+ v_minus_vv = vector_sub(v, vv)
278
+ for pp in recursive_vector_partitions(v_minus_vv, vv):
279
+ yield [vv] + pp
280
+
281
+
282
+ def fast_vector_partitions(v, min_vals=None):
283
+ r"""
284
+ Brent Yorgey's fast algorithm for integer vector (multiset) partitions.
285
+
286
+ INPUT:
287
+
288
+ - ``v`` -- list of nonnegative integers, understood as the vector
289
+ to be partitioned
290
+
291
+ - ``min_vals`` -- (optional) list of nonnegative integers, of same
292
+ length as ``v``
293
+
294
+ OUTPUT: list of lists, each representing a vector partition of ``v``
295
+
296
+ If ``min_vals`` is given, only partitions with parts ``p >= min_vals`` in
297
+ the lexicographic ordering will appear.
298
+
299
+ If ``min_vals`` is given and ``len(min_vals) != len(v)``, an error
300
+ is raised.
301
+
302
+ EXAMPLES:
303
+
304
+ The older the computer, the more impressive the comparison::
305
+
306
+ sage: from sage.combinat.fast_vector_partitions import fast_vector_partitions
307
+ sage: fastvparts = list(fast_vector_partitions([3, 3, 3]))
308
+ sage: vparts = list(VectorPartitions([3, 3, 3]))
309
+ sage: vparts == fastvparts[::-1]
310
+ True
311
+ sage: len(fastvparts)
312
+ 686
313
+ sage: list(fast_vector_partitions([1, 2, 3], min_vals=[0, 1, 1]))
314
+ [[[1, 2, 3]],
315
+ [[0, 2, 3], [1, 0, 0]],
316
+ [[0, 2, 2], [1, 0, 1]],
317
+ [[0, 2, 1], [1, 0, 2]],
318
+ [[0, 2, 0], [1, 0, 3]],
319
+ [[0, 1, 3], [1, 1, 0]],
320
+ [[0, 1, 2], [1, 1, 1]],
321
+ [[0, 1, 1], [1, 1, 2]],
322
+ [[0, 1, 1], [0, 1, 2], [1, 0, 0]],
323
+ [[0, 1, 1], [0, 1, 1], [1, 0, 1]]]
324
+ sage: L1 = list(fast_vector_partitions([5, 7, 6], min_vals=[1, 3, 2]))
325
+ sage: L1 == list(VectorPartitions([5, 7, 6], min=[1, 3, 2]))[::-1]
326
+ True
327
+
328
+ .. NOTE::
329
+
330
+ The partitions are returned as an iterator.
331
+
332
+ In this documentation, ``a <|= b`` means ``a[i] <= b[i]`` for all ``i``
333
+ (notation following B. Yorgey's paper). It is the monomial partial
334
+ ordering in Dickson's lemma: ``a <|= b`` iff ``x^a`` divides ``x^b`` as
335
+ monomials.
336
+
337
+ .. WARNING::
338
+
339
+ The ordering of the partitions is reversed with respect to the output of
340
+ Sage class :class:`~sage.combinat.vector_partition.VectorPartitions`.
341
+ """
342
+ if min_vals is None:
343
+ min_vals = (len(v) - 1) * [0] + [1] # lexicographically smallest vector > 0
344
+ if len(v) != len(min_vals):
345
+ raise ValueError("the length of v and min_vals must be equal")
346
+ return recursive_vector_partitions(list(v), list(min_vals))