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,964 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ """
4
+ Non-symmetric Macdonald polynomials
5
+ """
6
+ import copy
7
+
8
+ from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
9
+ from sage.combinat.backtrack import GenericBacktracker
10
+ from sage.combinat.combinat import CombinatorialObject
11
+ from sage.combinat.combination import Combinations
12
+ from sage.combinat.permutation import Permutation
13
+ from sage.combinat.words.word import Word
14
+ from sage.misc.misc_c import prod
15
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
16
+ from sage.rings.rational_field import QQ
17
+ from sage.structure.parent import Parent
18
+ from sage.structure.unique_representation import UniqueRepresentation
19
+
20
+
21
+ class LatticeDiagram(CombinatorialObject):
22
+ def boxes(self):
23
+ """
24
+ EXAMPLES::
25
+
26
+ sage: a = LatticeDiagram([3,0,2])
27
+ sage: a.boxes()
28
+ [(1, 1), (1, 2), (1, 3), (3, 1), (3, 2)]
29
+ sage: a = LatticeDiagram([2, 1, 3, 0, 0, 2])
30
+ sage: a.boxes()
31
+ [(1, 1), (1, 2), (2, 1), (3, 1), (3, 2), (3, 3), (6, 1), (6, 2)]
32
+ """
33
+ res = []
34
+ for i in range(1, len(self) + 1):
35
+ res += [(i, j + 1) for j in range(self[i])]
36
+ return res
37
+
38
+ def __getitem__(self, i):
39
+ """
40
+ Return the `i`-th entry of ``self``.
41
+
42
+ Note that the indexing for lattice diagrams starts at `1`.
43
+
44
+ EXAMPLES::
45
+
46
+ sage: a = LatticeDiagram([3,0,2])
47
+ sage: a[1]
48
+ 3
49
+ sage: a[0]
50
+ Traceback (most recent call last):
51
+ ...
52
+ ValueError: indexing starts at 1
53
+ sage: a[-1]
54
+ 2
55
+ """
56
+ if i == 0:
57
+ raise ValueError("indexing starts at 1")
58
+ elif i < 0:
59
+ i += 1
60
+ return self._list[i - 1]
61
+
62
+ def leg(self, i, j):
63
+ """
64
+ Return the leg of the box ``(i,j)`` in ``self``.
65
+
66
+ EXAMPLES::
67
+
68
+ sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
69
+ sage: a.leg(5,2)
70
+ [(5, 3)]
71
+ """
72
+ return [(i, k) for k in range(j + 1, self[i] + 1)]
73
+
74
+ def arm_left(self, i, j):
75
+ """
76
+ Return the left arm of the box ``(i,j)`` in ``self``.
77
+
78
+ EXAMPLES::
79
+
80
+ sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
81
+ sage: a.arm_left(5,2)
82
+ [(1, 2), (3, 2)]
83
+ """
84
+ return [(ip, j) for ip in range(1, i) if j <= self[ip] <= self[i]]
85
+
86
+ def arm_right(self, i, j):
87
+ """
88
+ Return the right arm of the box ``(i,j)`` in ``self``.
89
+
90
+ EXAMPLES::
91
+
92
+ sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
93
+ sage: a.arm_right(5,2)
94
+ [(8, 1)]
95
+ """
96
+ return [(ip, j - 1) for ip in range(i + 1, len(self) + 1)
97
+ if j - 1 <= self[ip] < self[i]]
98
+
99
+ def arm(self, i, j):
100
+ """
101
+ Return the arm of the box ``(i,j)`` in ``self``.
102
+
103
+ EXAMPLES::
104
+
105
+ sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
106
+ sage: a.arm(5,2)
107
+ [(1, 2), (3, 2), (8, 1)]
108
+ """
109
+ return self.arm_left(i, j) + self.arm_right(i, j)
110
+
111
+ def l(self, i, j):
112
+ """
113
+ Return ``self[i] - j``.
114
+
115
+ EXAMPLES::
116
+
117
+ sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
118
+ sage: a.l(5,2)
119
+ 1
120
+ """
121
+ return self[i] - j
122
+
123
+ def a(self, i, j):
124
+ """
125
+ Return the length of the arm of the box ``(i,j)`` in ``self``.
126
+
127
+ EXAMPLES::
128
+
129
+ sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
130
+ sage: a.a(5,2)
131
+ 3
132
+ """
133
+ return len(self.arm(i, j))
134
+
135
+ def size(self):
136
+ """
137
+ Return the number of boxes in ``self``.
138
+
139
+ EXAMPLES::
140
+
141
+ sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
142
+ sage: a.size()
143
+ 22
144
+ """
145
+ return sum(self._list)
146
+
147
+ def flip(self):
148
+ """
149
+ Return the flip of ``self``, where flip is defined as follows. Let
150
+ ``r = max(self)``. Then ``self.flip()[i] = r - self[i]``.
151
+
152
+ EXAMPLES::
153
+
154
+ sage: a = LatticeDiagram([3,0,2])
155
+ sage: a.flip()
156
+ [0, 3, 1]
157
+ """
158
+ r = max(self)
159
+ return LatticeDiagram([r - i for i in self])
160
+
161
+ def boxes_same_and_lower_right(self, ii, jj):
162
+ """
163
+ Return an iterator of the boxes of ``self`` that are in row ``jj``
164
+ but not identical with ``(ii, jj)``, or lie in the row
165
+ ``jj - 1`` (the row directly below ``jj``; this might be the
166
+ basement) and strictly to the right of ``(ii, jj)``.
167
+
168
+ EXAMPLES::
169
+
170
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
171
+ sage: a = a.shape()
172
+ sage: list(a.boxes_same_and_lower_right(1,1))
173
+ [(2, 1), (3, 1), (6, 1), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0)]
174
+ sage: list(a.boxes_same_and_lower_right(1,2))
175
+ [(3, 2), (6, 2), (2, 1), (3, 1), (6, 1)]
176
+ sage: list(a.boxes_same_and_lower_right(3,3))
177
+ [(6, 2)]
178
+ sage: list(a.boxes_same_and_lower_right(2,3))
179
+ [(3, 3), (3, 2), (6, 2)]
180
+ """
181
+ # Add all of the boxes in the same row
182
+ for i in range(1, len(self) + 1):
183
+ if self[i] >= jj and i != ii:
184
+ yield (i, jj)
185
+
186
+ for i in range(ii + 1, len(self) + 1):
187
+ if self[i] >= jj - 1:
188
+ yield (i, jj - 1)
189
+
190
+
191
+ class AugmentedLatticeDiagramFilling(CombinatorialObject):
192
+ def __init__(self, l, pi=None):
193
+ """
194
+ EXAMPLES::
195
+
196
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
197
+ sage: a == loads(dumps(a))
198
+ True
199
+ sage: pi = Permutation([2,3,1]).to_permutation_group_element()
200
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]],pi)
201
+ sage: a == loads(dumps(a))
202
+ True
203
+ """
204
+ if pi is None:
205
+ pi = Permutation([1]).to_permutation_group_element()
206
+ self._list = [[pi(i + 1)] + li for i, li in enumerate(l)]
207
+
208
+ def __getitem__(self, i):
209
+ """
210
+ EXAMPLES::
211
+
212
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
213
+ sage: a[0]
214
+ Traceback (most recent call last):
215
+ ...
216
+ ValueError: indexing starts at 1
217
+ sage: a[1,0]
218
+ 1
219
+ sage: a[2,0]
220
+ 2
221
+ sage: a[3,2]
222
+ 4
223
+ sage: a[3][2]
224
+ 4
225
+ """
226
+ if isinstance(i, tuple):
227
+ i, j = i
228
+ return self._list[i - 1][j]
229
+ if i < 1:
230
+ raise ValueError("indexing starts at 1")
231
+ return self._list[i - 1]
232
+
233
+ def shape(self):
234
+ """
235
+ Return the shape of ``self``.
236
+
237
+ EXAMPLES::
238
+
239
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
240
+ sage: a.shape()
241
+ [2, 1, 3, 0, 0, 2]
242
+ """
243
+ return LatticeDiagram([max(0, len(self[i]) - 1)
244
+ for i in range(1, len(self) + 1)])
245
+
246
+ def __contains__(self, ij):
247
+ """
248
+ Return ``True`` if the box ``(i,j) (= ij)`` is in ``self``. Note that this
249
+ does not include the basement row.
250
+
251
+ EXAMPLES::
252
+
253
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
254
+ sage: (1,1) in a
255
+ True
256
+ sage: (1,0) in a
257
+ False
258
+ """
259
+ i, j = ij
260
+ return 0 < i <= len(self) and 0 < j <= len(self[i])
261
+
262
+ def are_attacking(self, i, j, ii, jj):
263
+ """
264
+ Return ``True`` if the boxes ``(i,j)`` and ``(ii,jj)`` in ``self`` are attacking.
265
+
266
+ EXAMPLES::
267
+
268
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
269
+ sage: all( a.are_attacking(i,j,ii,jj) for (i,j),(ii,jj) in a.attacking_boxes())
270
+ True
271
+ sage: a.are_attacking(1,1,3,2)
272
+ False
273
+ """
274
+ # If the two boxes are at the same height,
275
+ # then they are attacking
276
+ if j == jj:
277
+ return True
278
+
279
+ # Make it so that the lower box is in position i,j
280
+ if jj < j:
281
+ i, j, ii, jj = ii, jj, i, j
282
+
283
+ # If the lower box is one row below and
284
+ # strictly to the right, then they are
285
+ # attacking.
286
+ return j == jj - 1 and i > ii
287
+
288
+ def boxes(self):
289
+ """
290
+ Return a list of the coordinates of the boxes of ``self``, including
291
+ the 'basement row'.
292
+
293
+ EXAMPLES::
294
+
295
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
296
+ sage: a.boxes()
297
+ [(1, 1),
298
+ (1, 2),
299
+ (2, 1),
300
+ (3, 1),
301
+ (3, 2),
302
+ (3, 3),
303
+ (6, 1),
304
+ (6, 2),
305
+ (1, 0),
306
+ (2, 0),
307
+ (3, 0),
308
+ (4, 0),
309
+ (5, 0),
310
+ (6, 0)]
311
+ """
312
+ return self.shape().boxes() + [(i, 0)
313
+ for i in range(1, len(self.shape()) + 1)]
314
+
315
+ def attacking_boxes(self):
316
+ """
317
+ Return a list of pairs of boxes in ``self`` that are attacking.
318
+
319
+ EXAMPLES::
320
+
321
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
322
+ sage: a.attacking_boxes()[:5]
323
+ [((1, 1), (2, 1)),
324
+ ((1, 1), (3, 1)),
325
+ ((1, 1), (6, 1)),
326
+ ((1, 1), (2, 0)),
327
+ ((1, 1), (3, 0))]
328
+ """
329
+ boxes = self.boxes()
330
+ res = []
331
+ for (i, j), (ii, jj) in Combinations(boxes, 2):
332
+ if self.are_attacking(i, j, ii, jj):
333
+ res.append(((i, j), (ii, jj)))
334
+ return res
335
+
336
+ def is_non_attacking(self):
337
+ """
338
+ Return ``True`` if ``self`` is non-attacking.
339
+
340
+ EXAMPLES::
341
+
342
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
343
+ sage: a.is_non_attacking()
344
+ True
345
+ sage: a = AugmentedLatticeDiagramFilling([[1, 1, 1], [2, 3], [3]])
346
+ sage: a.is_non_attacking()
347
+ False
348
+ sage: a = AugmentedLatticeDiagramFilling([[2,2],[1]])
349
+ sage: a.is_non_attacking()
350
+ False
351
+ sage: pi = Permutation([2,1]).to_permutation_group_element()
352
+ sage: a = AugmentedLatticeDiagramFilling([[2,2],[1]],pi)
353
+ sage: a.is_non_attacking()
354
+ True
355
+ """
356
+ for a, b in self.attacking_boxes():
357
+ if self[a] == self[b]:
358
+ return False
359
+ return True
360
+
361
+ def weight(self):
362
+ """
363
+ Return the weight of ``self``.
364
+
365
+ EXAMPLES::
366
+
367
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
368
+ sage: a.weight()
369
+ [1, 2, 1, 1, 2, 1]
370
+ """
371
+ ed = self.reading_word().evaluation_dict()
372
+ entries = list(ed)
373
+ m = max(entries) + 1 if entries else -1
374
+ return [ed.get(k, 0) for k in range(1, m)]
375
+
376
+ def descents(self):
377
+ """
378
+ Return a list of the descents of ``self``.
379
+
380
+ EXAMPLES::
381
+
382
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
383
+ sage: a.descents()
384
+ [(1, 2), (3, 2)]
385
+ """
386
+ res = []
387
+ for i, j in self.shape().boxes():
388
+ if self[i, j] > self[i, j - 1]:
389
+ res.append((i, j))
390
+ return res
391
+
392
+ def maj(self):
393
+ """
394
+ Return the major index of ``self``.
395
+
396
+ EXAMPLES::
397
+
398
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
399
+ sage: a.maj()
400
+ 3
401
+ """
402
+ res = 0
403
+ shape = self.shape()
404
+ for i, j in self.descents():
405
+ res += shape.l(i, j) + 1
406
+ return res
407
+
408
+ def reading_order(self):
409
+ """
410
+ Return a list of coordinates of the boxes in ``self``, starting from
411
+ the top right, and reading from right to left.
412
+
413
+ Note that this includes the 'basement row' of ``self``.
414
+
415
+ EXAMPLES::
416
+
417
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
418
+ sage: a.reading_order()
419
+ [(3, 3),
420
+ (6, 2),
421
+ (3, 2),
422
+ (1, 2),
423
+ (6, 1),
424
+ (3, 1),
425
+ (2, 1),
426
+ (1, 1),
427
+ (6, 0),
428
+ (5, 0),
429
+ (4, 0),
430
+ (3, 0),
431
+ (2, 0),
432
+ (1, 0)]
433
+ """
434
+ boxes = self.boxes()
435
+
436
+ def fn(ij):
437
+ return (-ij[1], -ij[0])
438
+ boxes.sort(key=fn)
439
+ return boxes
440
+
441
+ def reading_word(self):
442
+ """
443
+ Return the reading word of ``self``, obtained by reading the boxes
444
+ entries of ``self`` from right to left, starting in the upper right.
445
+
446
+ EXAMPLES::
447
+
448
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
449
+ sage: a.reading_word()
450
+ word: 25465321
451
+ """
452
+ w = [self[i, j] for i, j in self.reading_order() if j > 0]
453
+ return Word(w)
454
+
455
+ def inversions(self):
456
+ """
457
+ Return a list of the inversions of ``self``.
458
+
459
+ EXAMPLES::
460
+
461
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
462
+ sage: a.inversions()[:5]
463
+ [((6, 2), (3, 2)),
464
+ ((1, 2), (6, 1)),
465
+ ((1, 2), (3, 1)),
466
+ ((1, 2), (2, 1)),
467
+ ((6, 1), (3, 1))]
468
+ sage: len(a.inversions())
469
+ 25
470
+ """
471
+ atboxes = [set(x) for x in self.attacking_boxes()]
472
+ res = []
473
+ order = self.reading_order()
474
+ for a in range(len(order)):
475
+ i, j = order[a]
476
+ for b in range(a + 1, len(order)):
477
+ ii, jj = order[b]
478
+ if self[i, j] > self[ii, jj] and set(((i, j), (ii, jj))) in atboxes:
479
+ res.append(((i, j), (ii, jj)))
480
+ return res
481
+
482
+ def _inv_aux(self):
483
+ """
484
+ EXAMPLES::
485
+
486
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
487
+ sage: a._inv_aux()
488
+ 7
489
+ """
490
+ res = 0
491
+ shape = self.shape()
492
+ for i in range(1, len(self) + 1):
493
+ for j in range(i + 1, len(self) + 1):
494
+ if shape[i] <= shape[j]:
495
+ res += 1
496
+ return res
497
+
498
+ def inv(self):
499
+ """
500
+ Return ``self``'s inversion statistic.
501
+
502
+ EXAMPLES::
503
+
504
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
505
+ sage: a.inv()
506
+ 15
507
+ """
508
+ res = len(self.inversions())
509
+ res -= sum(self.shape().a(i, j) for i, j in self.descents())
510
+ res -= self._inv_aux()
511
+ return res
512
+
513
+ def coinv(self):
514
+ """
515
+ Return ``self``'s co-inversion statistic.
516
+
517
+ EXAMPLES::
518
+
519
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
520
+ sage: a.coinv()
521
+ 2
522
+ """
523
+ shape = self.shape()
524
+ return sum(shape.a(i, j) for i, j in shape.boxes()) - self.inv()
525
+
526
+ def coeff(self, q, t):
527
+ """
528
+ Return the coefficient in front of ``self`` in the HHL formula for the
529
+ expansion of the non-symmetric Macdonald polynomial
530
+ E(self.shape()).
531
+
532
+ EXAMPLES::
533
+
534
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
535
+ sage: q,t = var('q,t') # needs sage.symbolic
536
+ sage: a.coeff(q,t) # needs sage.symbolic
537
+ (t - 1)^4/((q^2*t^3 - 1)^2*(q*t^2 - 1)^2)
538
+ """
539
+ res = 1
540
+ shape = self.shape()
541
+ for i, j in shape.boxes():
542
+ if self[i, j] != self[i, j - 1]:
543
+ res *= (1 - t) / (1 - q**(shape.l(i, j) + 1)
544
+ * t**(shape.a(i, j) + 1))
545
+ return res
546
+
547
+ def coeff_integral(self, q, t):
548
+ """
549
+ Return the coefficient in front of ``self`` in the HHL formula for the
550
+ expansion of the integral non-symmetric Macdonald polynomial
551
+ E(self.shape())
552
+
553
+ EXAMPLES::
554
+
555
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
556
+ sage: q,t = var('q,t') # needs sage.symbolic
557
+ sage: a.coeff_integral(q,t) # needs sage.symbolic
558
+ (q^2*t^3 - 1)^2*(q*t^2 - 1)^2*(t - 1)^4
559
+ """
560
+ res = 1
561
+ shape = self.shape()
562
+ for i, j in shape.boxes():
563
+ if self[i, j] != self[i, j - 1]:
564
+ res *= (1 - q**(shape.l(i, j) + 1) * t**(shape.a(i, j) + 1))
565
+ for i, j in shape.boxes():
566
+ if self[i, j] == self[i, j - 1]:
567
+ res *= (1 - t)
568
+ return res
569
+
570
+ def permuted_filling(self, sigma):
571
+ """
572
+ EXAMPLES::
573
+
574
+ sage: pi=Permutation([2,1,4,3]).to_permutation_group_element()
575
+ sage: fill=[[2],[1,2,3],[],[3,1]]
576
+ sage: AugmentedLatticeDiagramFilling(fill).permuted_filling(pi)
577
+ [[2, 1], [1, 2, 1, 4], [4], [3, 4, 2]]
578
+ """
579
+ new_filling = []
580
+ for col in self:
581
+ nc = [sigma(x) for x in col]
582
+ nc.pop(0)
583
+ new_filling.append(nc)
584
+ return AugmentedLatticeDiagramFilling(new_filling, sigma)
585
+
586
+
587
+ def NonattackingFillings(shape, pi=None):
588
+ """
589
+ Returning the finite set of nonattacking fillings of a
590
+ given shape.
591
+
592
+ EXAMPLES::
593
+
594
+ sage: NonattackingFillings([0,1,2])
595
+ Nonattacking fillings of [0, 1, 2]
596
+ sage: NonattackingFillings([0,1,2]).list()
597
+ [[[1], [2, 1], [3, 2, 1]],
598
+ [[1], [2, 1], [3, 2, 2]],
599
+ [[1], [2, 1], [3, 2, 3]],
600
+ [[1], [2, 1], [3, 3, 1]],
601
+ [[1], [2, 1], [3, 3, 2]],
602
+ [[1], [2, 1], [3, 3, 3]],
603
+ [[1], [2, 2], [3, 1, 1]],
604
+ [[1], [2, 2], [3, 1, 2]],
605
+ [[1], [2, 2], [3, 1, 3]],
606
+ [[1], [2, 2], [3, 3, 1]],
607
+ [[1], [2, 2], [3, 3, 2]],
608
+ [[1], [2, 2], [3, 3, 3]]]
609
+ """
610
+ return NonattackingFillings_shape(tuple(shape), pi)
611
+
612
+
613
+ class NonattackingFillings_shape(Parent, UniqueRepresentation):
614
+ def __init__(self, shape, pi=None):
615
+ """
616
+ EXAMPLES::
617
+
618
+ sage: n = NonattackingFillings([0,1,2])
619
+ sage: n == loads(dumps(n))
620
+ True
621
+ """
622
+ self.pi = pi
623
+ self._shape = LatticeDiagram(shape)
624
+ self._name = "Nonattacking fillings of %s" % list(shape)
625
+ Parent.__init__(self, category=FiniteEnumeratedSets())
626
+
627
+ def __repr__(self):
628
+ """
629
+ EXAMPLES::
630
+
631
+ sage: NonattackingFillings([0,1,2])
632
+ Nonattacking fillings of [0, 1, 2]
633
+ """
634
+ return self._name
635
+
636
+ def flip(self):
637
+ """
638
+ Return the nonattacking fillings of the flipped shape.
639
+
640
+ EXAMPLES::
641
+
642
+ sage: NonattackingFillings([0,1,2]).flip()
643
+ Nonattacking fillings of [2, 1, 0]
644
+ """
645
+ return NonattackingFillings(list(self._shape.flip()), self.pi)
646
+
647
+ def __iter__(self):
648
+ """
649
+ EXAMPLES::
650
+
651
+ sage: NonattackingFillings([0,1,2]).list() #indirect doctest
652
+ [[[1], [2, 1], [3, 2, 1]],
653
+ [[1], [2, 1], [3, 2, 2]],
654
+ [[1], [2, 1], [3, 2, 3]],
655
+ [[1], [2, 1], [3, 3, 1]],
656
+ [[1], [2, 1], [3, 3, 2]],
657
+ [[1], [2, 1], [3, 3, 3]],
658
+ [[1], [2, 2], [3, 1, 1]],
659
+ [[1], [2, 2], [3, 1, 2]],
660
+ [[1], [2, 2], [3, 1, 3]],
661
+ [[1], [2, 2], [3, 3, 1]],
662
+ [[1], [2, 2], [3, 3, 2]],
663
+ [[1], [2, 2], [3, 3, 3]]]
664
+ sage: len(_)
665
+ 12
666
+
667
+ TESTS::
668
+
669
+ sage: NonattackingFillings([3,2,1,1]).cardinality()
670
+ 3
671
+ sage: NonattackingFillings([3,2,1,2]).cardinality()
672
+ 4
673
+ sage: NonattackingFillings([1,2,3]).cardinality()
674
+ 12
675
+ sage: NonattackingFillings([2,2,2]).cardinality()
676
+ 1
677
+ sage: NonattackingFillings([1,2,3,2]).cardinality()
678
+ 24
679
+ """
680
+ if sum(self._shape) == 0:
681
+ yield AugmentedLatticeDiagramFilling([[] for _ in self._shape],
682
+ self.pi)
683
+ return
684
+
685
+ for z in NonattackingBacktracker(self._shape, self.pi):
686
+ yield AugmentedLatticeDiagramFilling(z, self.pi)
687
+
688
+
689
+ class NonattackingBacktracker(GenericBacktracker):
690
+ def __init__(self, shape, pi=None):
691
+ """
692
+ EXAMPLES::
693
+
694
+ sage: from sage.combinat.sf.ns_macdonald import NonattackingBacktracker
695
+ sage: n = NonattackingBacktracker(LatticeDiagram([0,1,2]))
696
+ sage: n._ending_position
697
+ (3, 2)
698
+ sage: n._initial_state
699
+ (2, 1)
700
+ """
701
+ self._shape = shape
702
+ self._n = sum(shape)
703
+ self._initial_data = [[None] * s for s in shape]
704
+ if pi is None:
705
+ pi = Permutation([1]).to_permutation_group_element()
706
+ self.pi = pi
707
+
708
+ # The ending position will be at the highest box
709
+ # which is farthest right
710
+ ending_row = max(shape)
711
+ ending_col = len(shape) - list(reversed(list(shape))).index(ending_row)
712
+ self._ending_position = (ending_col, ending_row)
713
+
714
+ # Get the lowest box that is farthest left
715
+ starting_row = 1
716
+ nonzero = [i for i in shape if i != 0]
717
+ starting_col = list(shape).index(nonzero[0]) + 1
718
+
719
+ GenericBacktracker.__init__(self, self._initial_data, (starting_col, starting_row))
720
+
721
+ def _rec(self, obj, state):
722
+ """
723
+ EXAMPLES::
724
+
725
+ sage: from sage.combinat.sf.ns_macdonald import NonattackingBacktracker
726
+ sage: n = NonattackingBacktracker(LatticeDiagram([0,1,2]))
727
+ sage: len(list(n))
728
+ 12
729
+ sage: obj = [ [], [None], [None, None]]
730
+ sage: state = 2, 1
731
+ sage: list(n._rec(obj, state))
732
+ [([[], [1], [None, None]], (3, 1), False),
733
+ ([[], [2], [None, None]], (3, 1), False)]
734
+ """
735
+ # We need to set the i,j^th entry.
736
+ i, j = state
737
+
738
+ # Get the next state
739
+ new_state = self.get_next_pos(i, j)
740
+ yld = bool(new_state is None)
741
+
742
+ for k in range(1, len(self._shape) + 1):
743
+ # We check to make sure that k does not
744
+ # violate any of the attacking conditions
745
+ if j == 1 and any(self.pi(x + 1) == k
746
+ for x in range(i, len(self._shape))):
747
+ continue
748
+ if any(obj[ii - 1][jj - 1] == k for ii, jj in
749
+ self._shape.boxes_same_and_lower_right(i, j) if jj != 0):
750
+ continue
751
+
752
+ # Fill in the in the i,j box with k+1
753
+ obj[i - 1][j - 1] = k
754
+
755
+ # Yield the object
756
+ yield copy.deepcopy(obj), new_state, yld
757
+
758
+ def get_next_pos(self, ii, jj):
759
+ """
760
+ EXAMPLES::
761
+
762
+ sage: from sage.combinat.sf.ns_macdonald import NonattackingBacktracker
763
+ sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
764
+ sage: n = NonattackingBacktracker(a.shape())
765
+ sage: n.get_next_pos(1, 1)
766
+ (2, 1)
767
+ sage: n.get_next_pos(6, 1)
768
+ (1, 2)
769
+ sage: n = NonattackingBacktracker(LatticeDiagram([2,2,2]))
770
+ sage: n.get_next_pos(3, 1)
771
+ (1, 2)
772
+ """
773
+ if (ii, jj) == self._ending_position:
774
+ return None
775
+
776
+ for i in range(ii + 1, len(self._shape) + 1):
777
+ if self._shape[i] >= jj:
778
+ return i, jj
779
+
780
+ for i in range(1, ii + 1):
781
+ if self._shape[i] >= jj + 1:
782
+ return i, jj + 1
783
+
784
+ raise ValueError("we should never be here")
785
+
786
+
787
+ def _check_muqt(mu, q, t, pi=None):
788
+ """
789
+ EXAMPLES::
790
+
791
+ sage: from sage.combinat.sf.ns_macdonald import _check_muqt
792
+ sage: P, q, t, n, R, x = _check_muqt([0,0,1],None,None)
793
+ sage: P
794
+ Fraction Field of Multivariate Polynomial Ring in q, t over Rational Field
795
+ sage: q
796
+ q
797
+ sage: t
798
+ t
799
+ sage: n
800
+ Nonattacking fillings of [0, 0, 1]
801
+ sage: R
802
+ Multivariate Polynomial Ring in x0, x1, x2 over Fraction Field of Multivariate Polynomial Ring in q, t over Rational Field
803
+ sage: x
804
+ (x0, x1, x2)
805
+
806
+ ::
807
+
808
+ sage: q,t = var('q,t') # needs sage.symbolic
809
+ sage: P, q, t, n, R, x = _check_muqt([0,0,1],q,None) # needs sage.symbolic
810
+ Traceback (most recent call last):
811
+ ...
812
+ ValueError: you must specify either both q and t or neither of them
813
+
814
+ ::
815
+
816
+ sage: P, q, t, n, R, x = _check_muqt([0,0,1],q,2) # needs sage.symbolic
817
+ Traceback (most recent call last):
818
+ ...
819
+ ValueError: the parents of q and t must be the same
820
+ """
821
+ if q is None and t is None:
822
+ P = PolynomialRing(QQ, 'q,t').fraction_field()
823
+ q, t = P.gens()
824
+ elif q is not None and t is not None:
825
+ if q.parent() != t.parent():
826
+ raise ValueError("the parents of q and t must be the same")
827
+ P = q.parent()
828
+ else:
829
+ raise ValueError("you must specify either both q and t or neither of them")
830
+ n = NonattackingFillings(mu, pi)
831
+ R = PolynomialRing(P, len(n._shape), 'x')
832
+ x = R.gens()
833
+ return P, q, t, n, R, x
834
+
835
+
836
+ def E(mu, q=None, t=None, pi=None):
837
+ """
838
+ Return the non-symmetric Macdonald polynomial in type A
839
+ corresponding to a shape ``mu``, with basement permuted according to
840
+ ``pi``.
841
+
842
+ Note that if both `q` and `t` are specified, then they must have
843
+ the same parent.
844
+
845
+ REFERENCE:
846
+
847
+ - J. Haglund, M. Haiman, N. Loehr.
848
+ *A combinatorial formula for non-symmetric Macdonald polynomials*.
849
+ :arxiv:`math/0601693v3`.
850
+
851
+ .. SEEALSO::
852
+
853
+ :class:`~sage.combinat.root_system.non_symmetric_macdonald_polynomials.NonSymmetricMacdonaldPolynomials`
854
+ for a type free implementation where the polynomials are
855
+ constructed recursively by the application of intertwining
856
+ operators.
857
+
858
+ EXAMPLES::
859
+
860
+ sage: from sage.combinat.sf.ns_macdonald import E
861
+ sage: E([0,0,0])
862
+ 1
863
+ sage: E([1,0,0])
864
+ x0
865
+ sage: E([0,1,0])
866
+ (t - 1)/(q*t^2 - 1)*x0 + x1
867
+ sage: E([0,0,1])
868
+ (t - 1)/(q*t - 1)*x0 + (t - 1)/(q*t - 1)*x1 + x2
869
+ sage: E([1,1,0])
870
+ x0*x1
871
+ sage: E([1,0,1])
872
+ (t - 1)/(q*t^2 - 1)*x0*x1 + x0*x2
873
+ sage: E([0,1,1])
874
+ (t - 1)/(q*t - 1)*x0*x1 + (t - 1)/(q*t - 1)*x0*x2 + x1*x2
875
+ sage: E([2,0,0])
876
+ x0^2 + (q*t - q)/(q*t - 1)*x0*x1 + (q*t - q)/(q*t - 1)*x0*x2
877
+ sage: E([0,2,0])
878
+ (t - 1)/(q^2*t^2 - 1)*x0^2 + (q^2*t^3 - q^2*t^2 + q*t^2 - 2*q*t + q - t + 1)/(q^3*t^3 - q^2*t^2 - q*t + 1)*x0*x1 + x1^2 + (q*t^2 - 2*q*t + q)/(q^3*t^3 - q^2*t^2 - q*t + 1)*x0*x2 + (q*t - q)/(q*t - 1)*x1*x2
879
+ """
880
+ P, q, t, n, R, x = _check_muqt(mu, q, t, pi)
881
+ res = 0
882
+ for a in n:
883
+ weight = a.weight()
884
+ res += q**a.maj() * t**a.coinv() * a.coeff(q, t) * prod(x[i]**weight[i] for i in range(len(weight)))
885
+ return res
886
+
887
+
888
+ def E_integral(mu, q=None, t=None, pi=None):
889
+ """
890
+ Return the integral form for the non-symmetric Macdonald
891
+ polynomial in type A corresponding to a shape mu.
892
+
893
+ Note that if both q and t are specified, then they must have the
894
+ same parent.
895
+
896
+ REFERENCE:
897
+
898
+ - J. Haglund, M. Haiman, N. Loehr.
899
+ *A combinatorial formula for non-symmetric Macdonald polynomials*.
900
+ :arxiv:`math/0601693v3`.
901
+
902
+ EXAMPLES::
903
+
904
+ sage: from sage.combinat.sf.ns_macdonald import E_integral
905
+ sage: E_integral([0,0,0])
906
+ 1
907
+ sage: E_integral([1,0,0])
908
+ (-t + 1)*x0
909
+ sage: E_integral([0,1,0])
910
+ (-q*t^2 + 1)*x0 + (-t + 1)*x1
911
+ sage: E_integral([0,0,1])
912
+ (-q*t + 1)*x0 + (-q*t + 1)*x1 + (-t + 1)*x2
913
+ sage: E_integral([1,1,0])
914
+ (t^2 - 2*t + 1)*x0*x1
915
+ sage: E_integral([1,0,1])
916
+ (q*t^3 - q*t^2 - t + 1)*x0*x1 + (t^2 - 2*t + 1)*x0*x2
917
+ sage: E_integral([0,1,1])
918
+ (q^2*t^3 + q*t^4 - q*t^3 - q*t^2 - q*t - t^2 + t + 1)*x0*x1 + (q*t^2 - q*t - t + 1)*x0*x2 + (t^2 - 2*t + 1)*x1*x2
919
+ sage: E_integral([2,0,0])
920
+ (t^2 - 2*t + 1)*x0^2 + (q^2*t^2 - q^2*t - q*t + q)*x0*x1 + (q^2*t^2 - q^2*t - q*t + q)*x0*x2
921
+ sage: E_integral([0,2,0])
922
+ (q^2*t^3 - q^2*t^2 - t + 1)*x0^2 + (q^4*t^3 - q^3*t^2 - q^2*t + q*t^2 - q*t + q - t + 1)*x0*x1 + (t^2 - 2*t + 1)*x1^2 + (q^4*t^3 - q^3*t^2 - q^2*t + q)*x0*x2 + (q^2*t^2 - q^2*t - q*t + q)*x1*x2
923
+ """
924
+ P, q, t, n, R, x = _check_muqt(mu, q, t, pi)
925
+ res = 0
926
+ for a in n:
927
+ weight = a.weight()
928
+ res += q**a.maj() * t**a.coinv() * a.coeff_integral(q, t) * prod(x[i]**weight[i] for i in range(len(weight)))
929
+ return res
930
+
931
+
932
+ def Ht(mu, q=None, t=None, pi=None):
933
+ """
934
+ Return the symmetric Macdonald polynomial using the Haiman,
935
+ Haglund, and Loehr formula.
936
+
937
+ Note that if both `q` and `t` are specified, then they must have the
938
+ same parent.
939
+
940
+ REFERENCE:
941
+
942
+ - J. Haglund, M. Haiman, N. Loehr.
943
+ *A combinatorial formula for non-symmetric Macdonald polynomials*.
944
+ :arxiv:`math/0601693v3`.
945
+
946
+ EXAMPLES::
947
+
948
+ sage: from sage.combinat.sf.ns_macdonald import Ht
949
+ sage: HHt = SymmetricFunctions(QQ['q','t'].fraction_field()).macdonald().Ht()
950
+ sage: Ht([0,0,1])
951
+ x0 + x1 + x2
952
+ sage: HHt([1]).expand(3)
953
+ x0 + x1 + x2
954
+ sage: Ht([0,0,2])
955
+ x0^2 + (q + 1)*x0*x1 + x1^2 + (q + 1)*x0*x2 + (q + 1)*x1*x2 + x2^2
956
+ sage: HHt([2]).expand(3)
957
+ x0^2 + (q + 1)*x0*x1 + x1^2 + (q + 1)*x0*x2 + (q + 1)*x1*x2 + x2^2
958
+ """
959
+ P, q, t, n, R, x = _check_muqt(mu, q, t, pi)
960
+ res = 0
961
+ for a in n:
962
+ weight = a.weight()
963
+ res += q**a.maj() * t**a.inv() * prod(x[i]**weight[i] for i in range(len(weight)))
964
+ return res