passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.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 (401) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
  3. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  4. passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
  5. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  6. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  7. passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
  8. passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
  9. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  10. sage/algebras/all.py +24 -0
  11. sage/algebras/all__sagemath_combinat.py +35 -0
  12. sage/algebras/askey_wilson.py +935 -0
  13. sage/algebras/associated_graded.py +345 -0
  14. sage/algebras/cellular_basis.py +350 -0
  15. sage/algebras/cluster_algebra.py +2766 -0
  16. sage/algebras/down_up_algebra.py +860 -0
  17. sage/algebras/free_algebra.py +1698 -0
  18. sage/algebras/free_algebra_element.py +345 -0
  19. sage/algebras/free_algebra_quotient.py +405 -0
  20. sage/algebras/free_algebra_quotient_element.py +295 -0
  21. sage/algebras/free_zinbiel_algebra.py +885 -0
  22. sage/algebras/hall_algebra.py +783 -0
  23. sage/algebras/hecke_algebras/all.py +4 -0
  24. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  25. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  28. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  29. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  30. sage/algebras/jordan_algebra.py +1773 -0
  31. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  32. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  33. sage/algebras/lie_conformal_algebras/all.py +18 -0
  34. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  35. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  36. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  37. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  38. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  39. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  40. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  41. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  45. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  46. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  47. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  48. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  49. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  50. sage/algebras/nil_coxeter_algebra.py +191 -0
  51. sage/algebras/q_commuting_polynomials.py +673 -0
  52. sage/algebras/q_system.py +608 -0
  53. sage/algebras/quantum_clifford.py +959 -0
  54. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  55. sage/algebras/quantum_groups/all.py +9 -0
  56. sage/algebras/quantum_groups/fock_space.py +2219 -0
  57. sage/algebras/quantum_groups/q_numbers.py +207 -0
  58. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  59. sage/algebras/quantum_groups/representations.py +591 -0
  60. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  61. sage/algebras/quantum_oscillator.py +623 -0
  62. sage/algebras/quaternion_algebra.py +20 -0
  63. sage/algebras/quaternion_algebra_element.py +55 -0
  64. sage/algebras/rational_cherednik_algebra.py +525 -0
  65. sage/algebras/schur_algebra.py +670 -0
  66. sage/algebras/shuffle_algebra.py +1011 -0
  67. sage/algebras/splitting_algebra.py +779 -0
  68. sage/algebras/tensor_algebra.py +709 -0
  69. sage/algebras/yangian.py +1082 -0
  70. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  71. sage/all__sagemath_combinat.py +44 -0
  72. sage/combinat/SJT.py +255 -0
  73. sage/combinat/affine_permutation.py +2405 -0
  74. sage/combinat/algebraic_combinatorics.py +55 -0
  75. sage/combinat/all.py +53 -0
  76. sage/combinat/all__sagemath_combinat.py +195 -0
  77. sage/combinat/alternating_sign_matrix.py +2063 -0
  78. sage/combinat/baxter_permutations.py +346 -0
  79. sage/combinat/bijectionist.py +3220 -0
  80. sage/combinat/binary_recurrence_sequences.py +1180 -0
  81. sage/combinat/blob_algebra.py +685 -0
  82. sage/combinat/catalog_partitions.py +27 -0
  83. sage/combinat/chas/all.py +23 -0
  84. sage/combinat/chas/fsym.py +1180 -0
  85. sage/combinat/chas/wqsym.py +2601 -0
  86. sage/combinat/cluster_complex.py +326 -0
  87. sage/combinat/colored_permutations.py +2039 -0
  88. sage/combinat/colored_permutations_representations.py +964 -0
  89. sage/combinat/composition_signed.py +142 -0
  90. sage/combinat/composition_tableau.py +855 -0
  91. sage/combinat/constellation.py +1729 -0
  92. sage/combinat/core.py +751 -0
  93. sage/combinat/counting.py +12 -0
  94. sage/combinat/crystals/affine.py +742 -0
  95. sage/combinat/crystals/affine_factorization.py +518 -0
  96. sage/combinat/crystals/affinization.py +331 -0
  97. sage/combinat/crystals/alcove_path.py +2013 -0
  98. sage/combinat/crystals/all.py +22 -0
  99. sage/combinat/crystals/bkk_crystals.py +141 -0
  100. sage/combinat/crystals/catalog.py +115 -0
  101. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  102. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  103. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  104. sage/combinat/crystals/crystals.py +257 -0
  105. sage/combinat/crystals/direct_sum.py +260 -0
  106. sage/combinat/crystals/elementary_crystals.py +1251 -0
  107. sage/combinat/crystals/fast_crystals.py +441 -0
  108. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  109. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  110. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  111. sage/combinat/crystals/induced_structure.py +695 -0
  112. sage/combinat/crystals/infinity_crystals.py +730 -0
  113. sage/combinat/crystals/kac_modules.py +863 -0
  114. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  115. sage/combinat/crystals/kyoto_path_model.py +497 -0
  116. sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
  117. sage/combinat/crystals/letters.pxd +79 -0
  118. sage/combinat/crystals/letters.pyx +3056 -0
  119. sage/combinat/crystals/littelmann_path.py +1518 -0
  120. sage/combinat/crystals/monomial_crystals.py +1262 -0
  121. sage/combinat/crystals/multisegments.py +462 -0
  122. sage/combinat/crystals/mv_polytopes.py +467 -0
  123. sage/combinat/crystals/pbw_crystal.py +511 -0
  124. sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
  125. sage/combinat/crystals/pbw_datum.pxd +4 -0
  126. sage/combinat/crystals/pbw_datum.pyx +487 -0
  127. sage/combinat/crystals/polyhedral_realization.py +372 -0
  128. sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
  129. sage/combinat/crystals/spins.pxd +21 -0
  130. sage/combinat/crystals/spins.pyx +756 -0
  131. sage/combinat/crystals/star_crystal.py +290 -0
  132. sage/combinat/crystals/subcrystal.py +464 -0
  133. sage/combinat/crystals/tensor_product.py +1177 -0
  134. sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
  135. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  136. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  137. sage/combinat/crystals/virtual_crystal.py +420 -0
  138. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  139. sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
  140. sage/combinat/debruijn_sequence.pyx +355 -0
  141. sage/combinat/decorated_permutation.py +270 -0
  142. sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
  143. sage/combinat/degree_sequences.pyx +588 -0
  144. sage/combinat/derangements.py +527 -0
  145. sage/combinat/descent_algebra.py +1008 -0
  146. sage/combinat/diagram.py +1551 -0
  147. sage/combinat/diagram_algebras.py +5886 -0
  148. sage/combinat/dyck_word.py +4349 -0
  149. sage/combinat/e_one_star.py +1623 -0
  150. sage/combinat/enumerated_sets.py +123 -0
  151. sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
  152. sage/combinat/expnums.pyx +148 -0
  153. sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
  154. sage/combinat/fast_vector_partitions.pyx +346 -0
  155. sage/combinat/fqsym.py +1977 -0
  156. sage/combinat/free_dendriform_algebra.py +954 -0
  157. sage/combinat/free_prelie_algebra.py +1141 -0
  158. sage/combinat/fully_commutative_elements.py +1077 -0
  159. sage/combinat/fully_packed_loop.py +1523 -0
  160. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  161. sage/combinat/gray_codes.py +311 -0
  162. sage/combinat/grossman_larson_algebras.py +667 -0
  163. sage/combinat/growth.py +4352 -0
  164. sage/combinat/hall_polynomial.py +188 -0
  165. sage/combinat/hillman_grassl.py +866 -0
  166. sage/combinat/integer_matrices.py +329 -0
  167. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  168. sage/combinat/k_tableau.py +4564 -0
  169. sage/combinat/kazhdan_lusztig.py +215 -0
  170. sage/combinat/key_polynomial.py +885 -0
  171. sage/combinat/knutson_tao_puzzles.py +2286 -0
  172. sage/combinat/lr_tableau.py +311 -0
  173. sage/combinat/matrices/all.py +24 -0
  174. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  175. sage/combinat/matrices/latin.py +2912 -0
  176. sage/combinat/misc.py +401 -0
  177. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  178. sage/combinat/ncsf_qsym/all.py +21 -0
  179. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  180. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  181. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  182. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  183. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  184. sage/combinat/ncsym/all.py +21 -0
  185. sage/combinat/ncsym/bases.py +855 -0
  186. sage/combinat/ncsym/dual.py +593 -0
  187. sage/combinat/ncsym/ncsym.py +2076 -0
  188. sage/combinat/necklace.py +551 -0
  189. sage/combinat/non_decreasing_parking_function.py +634 -0
  190. sage/combinat/nu_dyck_word.py +1474 -0
  191. sage/combinat/output.py +861 -0
  192. sage/combinat/parallelogram_polyomino.py +4326 -0
  193. sage/combinat/parking_functions.py +1602 -0
  194. sage/combinat/partition_algebra.py +1998 -0
  195. sage/combinat/partition_kleshchev.py +1982 -0
  196. sage/combinat/partition_shifting_algebras.py +584 -0
  197. sage/combinat/partition_tuple.py +3114 -0
  198. sage/combinat/path_tableaux/all.py +13 -0
  199. sage/combinat/path_tableaux/catalog.py +29 -0
  200. sage/combinat/path_tableaux/dyck_path.py +380 -0
  201. sage/combinat/path_tableaux/frieze.py +476 -0
  202. sage/combinat/path_tableaux/path_tableau.py +728 -0
  203. sage/combinat/path_tableaux/semistandard.py +510 -0
  204. sage/combinat/perfect_matching.py +779 -0
  205. sage/combinat/plane_partition.py +3300 -0
  206. sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
  207. sage/combinat/q_bernoulli.pyx +128 -0
  208. sage/combinat/quickref.py +81 -0
  209. sage/combinat/recognizable_series.py +2051 -0
  210. sage/combinat/regular_sequence.py +4316 -0
  211. sage/combinat/regular_sequence_bounded.py +543 -0
  212. sage/combinat/restricted_growth.py +81 -0
  213. sage/combinat/ribbon.py +20 -0
  214. sage/combinat/ribbon_shaped_tableau.py +489 -0
  215. sage/combinat/ribbon_tableau.py +1180 -0
  216. sage/combinat/rigged_configurations/all.py +46 -0
  217. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  218. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  219. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  222. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  223. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  224. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  225. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  226. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  227. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  228. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  229. sage/combinat/rigged_configurations/bijection.py +143 -0
  230. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  231. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  232. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  233. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  234. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  235. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  236. sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  238. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  240. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  241. sage/combinat/rsk.py +3438 -0
  242. sage/combinat/schubert_polynomial.py +508 -0
  243. sage/combinat/set_partition.py +3318 -0
  244. sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
  245. sage/combinat/set_partition_iterator.pyx +136 -0
  246. sage/combinat/set_partition_ordered.py +1590 -0
  247. sage/combinat/sf/abreu_nigro.py +346 -0
  248. sage/combinat/sf/all.py +52 -0
  249. sage/combinat/sf/character.py +576 -0
  250. sage/combinat/sf/classical.py +319 -0
  251. sage/combinat/sf/dual.py +996 -0
  252. sage/combinat/sf/elementary.py +549 -0
  253. sage/combinat/sf/hall_littlewood.py +1028 -0
  254. sage/combinat/sf/hecke.py +336 -0
  255. sage/combinat/sf/homogeneous.py +464 -0
  256. sage/combinat/sf/jack.py +1428 -0
  257. sage/combinat/sf/k_dual.py +1458 -0
  258. sage/combinat/sf/kfpoly.py +447 -0
  259. sage/combinat/sf/llt.py +789 -0
  260. sage/combinat/sf/macdonald.py +2019 -0
  261. sage/combinat/sf/monomial.py +525 -0
  262. sage/combinat/sf/multiplicative.py +113 -0
  263. sage/combinat/sf/new_kschur.py +1786 -0
  264. sage/combinat/sf/ns_macdonald.py +964 -0
  265. sage/combinat/sf/orthogonal.py +246 -0
  266. sage/combinat/sf/orthotriang.py +355 -0
  267. sage/combinat/sf/powersum.py +963 -0
  268. sage/combinat/sf/schur.py +880 -0
  269. sage/combinat/sf/sf.py +1653 -0
  270. sage/combinat/sf/sfa.py +7053 -0
  271. sage/combinat/sf/symplectic.py +253 -0
  272. sage/combinat/sf/witt.py +721 -0
  273. sage/combinat/shifted_primed_tableau.py +2735 -0
  274. sage/combinat/shuffle.py +830 -0
  275. sage/combinat/sidon_sets.py +146 -0
  276. sage/combinat/similarity_class_type.py +1721 -0
  277. sage/combinat/sine_gordon.py +618 -0
  278. sage/combinat/six_vertex_model.py +784 -0
  279. sage/combinat/skew_partition.py +2053 -0
  280. sage/combinat/skew_tableau.py +2989 -0
  281. sage/combinat/sloane_functions.py +8935 -0
  282. sage/combinat/specht_module.py +1403 -0
  283. sage/combinat/species/all.py +48 -0
  284. sage/combinat/species/characteristic_species.py +321 -0
  285. sage/combinat/species/composition_species.py +273 -0
  286. sage/combinat/species/cycle_species.py +284 -0
  287. sage/combinat/species/empty_species.py +155 -0
  288. sage/combinat/species/functorial_composition_species.py +148 -0
  289. sage/combinat/species/generating_series.py +673 -0
  290. sage/combinat/species/library.py +148 -0
  291. sage/combinat/species/linear_order_species.py +169 -0
  292. sage/combinat/species/misc.py +83 -0
  293. sage/combinat/species/partition_species.py +290 -0
  294. sage/combinat/species/permutation_species.py +268 -0
  295. sage/combinat/species/product_species.py +423 -0
  296. sage/combinat/species/recursive_species.py +476 -0
  297. sage/combinat/species/set_species.py +192 -0
  298. sage/combinat/species/species.py +820 -0
  299. sage/combinat/species/structure.py +539 -0
  300. sage/combinat/species/subset_species.py +243 -0
  301. sage/combinat/species/sum_species.py +225 -0
  302. sage/combinat/subword.py +564 -0
  303. sage/combinat/subword_complex.py +2122 -0
  304. sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
  305. sage/combinat/subword_complex_c.pyx +119 -0
  306. sage/combinat/super_tableau.py +821 -0
  307. sage/combinat/superpartition.py +1154 -0
  308. sage/combinat/symmetric_group_algebra.py +3774 -0
  309. sage/combinat/symmetric_group_representations.py +1830 -0
  310. sage/combinat/t_sequences.py +877 -0
  311. sage/combinat/tableau.py +9506 -0
  312. sage/combinat/tableau_residues.py +860 -0
  313. sage/combinat/tableau_tuple.py +5353 -0
  314. sage/combinat/tiling.py +2432 -0
  315. sage/combinat/triangles_FHM.py +777 -0
  316. sage/combinat/tutorial.py +1857 -0
  317. sage/combinat/vector_partition.py +337 -0
  318. sage/combinat/words/abstract_word.py +1722 -0
  319. sage/combinat/words/all.py +59 -0
  320. sage/combinat/words/alphabet.py +268 -0
  321. sage/combinat/words/finite_word.py +7201 -0
  322. sage/combinat/words/infinite_word.py +113 -0
  323. sage/combinat/words/lyndon_word.py +652 -0
  324. sage/combinat/words/morphic.py +351 -0
  325. sage/combinat/words/morphism.py +3878 -0
  326. sage/combinat/words/paths.py +2932 -0
  327. sage/combinat/words/shuffle_product.py +278 -0
  328. sage/combinat/words/suffix_trees.py +1873 -0
  329. sage/combinat/words/word.py +769 -0
  330. sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
  331. sage/combinat/words/word_char.pyx +847 -0
  332. sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
  333. sage/combinat/words/word_datatypes.pxd +4 -0
  334. sage/combinat/words/word_datatypes.pyx +1067 -0
  335. sage/combinat/words/word_generators.py +2026 -0
  336. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  337. sage/combinat/words/word_options.py +99 -0
  338. sage/combinat/words/words.py +2396 -0
  339. sage/data_structures/all__sagemath_combinat.py +1 -0
  340. sage/databases/all__sagemath_combinat.py +13 -0
  341. sage/databases/findstat.py +4897 -0
  342. sage/databases/oeis.py +2058 -0
  343. sage/databases/sloane.py +393 -0
  344. sage/dynamics/all__sagemath_combinat.py +14 -0
  345. sage/dynamics/cellular_automata/all.py +7 -0
  346. sage/dynamics/cellular_automata/catalog.py +34 -0
  347. sage/dynamics/cellular_automata/elementary.py +612 -0
  348. sage/dynamics/cellular_automata/glca.py +477 -0
  349. sage/dynamics/cellular_automata/solitons.py +1463 -0
  350. sage/dynamics/finite_dynamical_system.py +1249 -0
  351. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  352. sage/games/all.py +7 -0
  353. sage/games/hexad.py +704 -0
  354. sage/games/quantumino.py +591 -0
  355. sage/games/sudoku.py +889 -0
  356. sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
  357. sage/games/sudoku_backtrack.pyx +189 -0
  358. sage/groups/all__sagemath_combinat.py +1 -0
  359. sage/groups/indexed_free_group.py +489 -0
  360. sage/libs/all__sagemath_combinat.py +6 -0
  361. sage/libs/lrcalc/__init__.py +1 -0
  362. sage/libs/lrcalc/lrcalc.py +525 -0
  363. sage/libs/symmetrica/__init__.py +7 -0
  364. sage/libs/symmetrica/all.py +101 -0
  365. sage/libs/symmetrica/kostka.pxi +168 -0
  366. sage/libs/symmetrica/part.pxi +193 -0
  367. sage/libs/symmetrica/plet.pxi +42 -0
  368. sage/libs/symmetrica/sab.pxi +196 -0
  369. sage/libs/symmetrica/sb.pxi +332 -0
  370. sage/libs/symmetrica/sc.pxi +192 -0
  371. sage/libs/symmetrica/schur.pxi +956 -0
  372. sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
  373. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  374. sage/libs/symmetrica/symmetrica.pyx +39 -0
  375. sage/monoids/all.py +13 -0
  376. sage/monoids/automatic_semigroup.py +1054 -0
  377. sage/monoids/free_abelian_monoid.py +315 -0
  378. sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
  379. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  380. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  381. sage/monoids/free_monoid.py +335 -0
  382. sage/monoids/free_monoid_element.py +431 -0
  383. sage/monoids/hecke_monoid.py +65 -0
  384. sage/monoids/string_monoid.py +817 -0
  385. sage/monoids/string_monoid_element.py +547 -0
  386. sage/monoids/string_ops.py +143 -0
  387. sage/monoids/trace_monoid.py +972 -0
  388. sage/rings/all__sagemath_combinat.py +2 -0
  389. sage/sat/all.py +4 -0
  390. sage/sat/boolean_polynomials.py +405 -0
  391. sage/sat/converters/__init__.py +6 -0
  392. sage/sat/converters/anf2cnf.py +14 -0
  393. sage/sat/converters/polybori.py +611 -0
  394. sage/sat/solvers/__init__.py +5 -0
  395. sage/sat/solvers/cryptominisat.py +287 -0
  396. sage/sat/solvers/dimacs.py +783 -0
  397. sage/sat/solvers/picosat.py +228 -0
  398. sage/sat/solvers/sat_lp.py +156 -0
  399. sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
  400. sage/sat/solvers/satsolver.pxd +3 -0
  401. sage/sat/solvers/satsolver.pyx +405 -0
@@ -0,0 +1,510 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ r"""
3
+ Semistandard tableaux
4
+
5
+ This is an implementation of the abstract base class
6
+ :class:`sage.combinat.path_tableaux.path_tableau.PathTableau`.
7
+
8
+ This implementation is for semistandard tableaux, represented as a chain of partitions
9
+ (essentially, the Gelfand-Tsetlin pattern).
10
+ This generalises the jeu de taquin operations of rectification, promotion, evacuation from
11
+ standard tableaux to semistandard tableaux. The local rule is the Bender-Knuth involution.
12
+
13
+ EXAMPLES::
14
+
15
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1],
16
+ ....: [3,3,2,1], [4,3,3,1,0]])
17
+ sage: pt.promotion()
18
+ [(), (2,), (3, 1), (3, 2, 1), (4, 3, 1, 0), (4, 3, 3, 1, 0)]
19
+ sage: pt.evacuation()
20
+ [(), (2,), (4, 0), (4, 2, 0), (4, 3, 1, 0), (4, 3, 3, 1, 0)]
21
+
22
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1],
23
+ ....: [3,3,2,1], [9/2,3,3,1,0]])
24
+ sage: pt.promotion()
25
+ [(), (2,), (3, 1), (3, 2, 1), (9/2, 3, 1, 0), (9/2, 3, 3, 1, 0)]
26
+ sage: pt.evacuation()
27
+ [(), (5/2,), (9/2, 0), (9/2, 2, 0), (9/2, 3, 1, 0), (9/2, 3, 3, 1, 0)]
28
+
29
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [4,2], [5,4,1]])
30
+ sage: path_tableaux.CylindricalDiagram(pt)
31
+ [ (), (3,), (4, 2), (5, 4, 1)]
32
+ [ , (), (3,), (5, 2), (5, 4, 1)]
33
+ [ , , (), (4,), (4, 3), (5, 4, 1)]
34
+ [ , , , (), (3,), (5, 1), (5, 4, 1)]
35
+
36
+ sage: pt2 = path_tableaux.SemistandardPathTableau([[3,2], [3,3,1],
37
+ ....: [3,3,2,1], [4,3,3,1,0]])
38
+ sage: pt1 = path_tableaux.SemistandardPathTableau([[], [3], [3,2]])
39
+ sage: pt1.commutor(pt2)
40
+ ([(), (2,), (2, 2), (4, 2, 0)], [(4, 2, 0), (4, 3, 2, 0), (4, 3, 3, 1, 0)])
41
+ sage: pt1.commutor(pt2,verbose=True)
42
+ [(3, 2), (3, 3, 1), (3, 3, 2, 1), (4, 3, 3, 1, 0)]
43
+ [(3,), (3, 2), (3, 2, 2), (4, 3, 2, 0)]
44
+ [(), (2,), (2, 2), (4, 2, 0)]
45
+ ([(), (2,), (2, 2), (4, 2, 0)], [(4, 2, 0), (4, 3, 2, 0), (4, 3, 3, 1, 0)])
46
+
47
+ sage: st = SkewTableau([[None, None, None, 4, 4, 5, 6, 7], [None, 2, 4, 6, 7, 7, 7],
48
+ ....: [None, 4, 5, 8, 8, 9], [None, 6, 7, 10], [None, 8, 8, 11],
49
+ ....: [None], [4]])
50
+ sage: pt = path_tableaux.SemistandardPathTableau(st)
51
+ sage: bk = [SkewTableau(st.bender_knuth_involution(i+1)) for i in range(10)]
52
+ sage: lr = [pt.local_rule(i+1) for i in range(10)]
53
+ sage: [r.to_tableau() for r in lr] == bk
54
+ True
55
+
56
+ TESTS::
57
+
58
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1], [3,3,2,1], [4,3,3,1,0]])
59
+ sage: TestSuite(pt).run()
60
+
61
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1], [7/2,3,2,1], [4,3,3,1,0]])
62
+ sage: TestSuite(pt).run()
63
+ Failure in _test_jdt_promotion:
64
+ Traceback (most recent call last):
65
+ ...
66
+ The following tests failed: _test_jdt_promotion
67
+
68
+ sage: pt = path_tableaux.SemistandardPathTableau([[3,2], [3,3,1], [3,3,2,1], [4,3,3,1,0]])
69
+ sage: pt.promotion()
70
+ [(3, 2), (3, 2, 2), (4, 3, 2, 0), (4, 3, 3, 1, 0)]
71
+
72
+ AUTHORS:
73
+
74
+ - Bruce Westbury (2020): initial version
75
+ """
76
+
77
+ #*****************************************************************************
78
+ # Copyright (C) 2020 Bruce Westbury <bruce.westbury@gmail.com>,
79
+ #
80
+ # This program is free software: you can redistribute it and/or modify
81
+ # it under the terms of the GNU General Public License as published by
82
+ # the Free Software Foundation, either version 2 of the License, or
83
+ # (at your option) any later version.
84
+ # https://www.gnu.org/licenses/
85
+ # ****************************************************************************
86
+
87
+ from sage.combinat.path_tableaux.path_tableau import PathTableau, PathTableaux
88
+ from sage.combinat.combinatorial_map import combinatorial_map
89
+ from sage.combinat.skew_tableau import SkewTableau, SkewTableaux
90
+ from sage.combinat.tableau import Tableau
91
+ from sage.combinat.gelfand_tsetlin_patterns import GelfandTsetlinPattern
92
+ from sage.combinat.partition import _Partitions
93
+ from sage.rings.semirings.non_negative_integer_semiring import NN
94
+
95
+ ###############################################################################
96
+
97
+
98
+ class SemistandardPathTableau(PathTableau):
99
+ r"""
100
+ An instance is a sequence of lists. Usually the entries will be nonnegative integers
101
+ in which case this is the chain of partitions of a (skew) semistandard tableau.
102
+ In general the entries are elements of an ordered abelian group; each list is weakly
103
+ decreasing and successive lists are interleaved.
104
+
105
+ INPUT:
106
+
107
+ Can be any of the following
108
+
109
+ * a sequence of partitions
110
+ * a sequence of lists/tuples
111
+ * a semistandard tableau
112
+ * a semistandard skew tableau
113
+ * a Gelfand-Tsetlin pattern
114
+
115
+ EXAMPLES::
116
+
117
+ sage: path_tableaux.SemistandardPathTableau([[], [2], [2,1]])
118
+ [(), (2,), (2, 1)]
119
+
120
+ sage: gt = GelfandTsetlinPattern([[2,1], [2]])
121
+ sage: path_tableaux.SemistandardPathTableau(gt)
122
+ [(), (2,), (2, 1)]
123
+
124
+ sage: st = SemistandardTableau([[1,1], [2]])
125
+ sage: path_tableaux.SemistandardPathTableau(st)
126
+ [(), (2,), (2, 1)]
127
+
128
+ sage: st = SkewTableau([[1,1], [2]])
129
+ sage: path_tableaux.SemistandardPathTableau(st)
130
+ [(), (2,), (2, 1)]
131
+
132
+ sage: st = SkewTableau([[None,1,1], [2]])
133
+ sage: path_tableaux.SemistandardPathTableau(st)
134
+ [(1,), (3, 0), (3, 1, 0)]
135
+
136
+ sage: path_tableaux.SemistandardPathTableau([[], [5/2], [7/2,2]])
137
+ [(), (5/2,), (7/2, 2)]
138
+
139
+ sage: path_tableaux.SemistandardPathTableau([[], [2.5], [3.5,2]])
140
+ [(), (2.5...,), (3.5..., 2)]
141
+ """
142
+
143
+ @staticmethod
144
+ def __classcall_private__(cls, st, check=True):
145
+ r"""
146
+ Ensure that a tableau is only ever constructed as an
147
+ ``element_class`` call of an appropriate parent.
148
+
149
+ EXAMPLES::
150
+
151
+ sage: t = path_tableaux.SemistandardPathTableau([[], [2]])
152
+ sage: t.parent()
153
+ <sage.combinat.path_tableaux.semistandard.SemistandardPathTableaux_with_category object at ...>
154
+ """
155
+ return SemistandardPathTableaux()(st, check=check)
156
+
157
+ def __init__(self, parent, st, check=True):
158
+ r"""
159
+ Initialize a semistandard tableau.
160
+
161
+ TESTS::
162
+
163
+ sage: path_tableaux.SemistandardPathTableau([(), 3, (3, 2)])
164
+ Traceback (most recent call last):
165
+ ...
166
+ ValueError: [(), 3, (3, 2)] is not a sequence of lists
167
+ """
168
+ w = None
169
+
170
+ if isinstance(st, SemistandardPathTableau):
171
+ w = list(st)
172
+
173
+ elif isinstance(st, GelfandTsetlinPattern):
174
+ w = list(st)
175
+ w.reverse()
176
+ w = [(), *w]
177
+
178
+ elif isinstance(st, (Tableau,SkewTableau)):
179
+ w = st.to_chain()
180
+
181
+ elif isinstance(st, (list,tuple)):
182
+ if any(not isinstance(a,(list,tuple)) for a in st):
183
+ raise ValueError(f"{st} is not a sequence of lists")
184
+ w = st
185
+
186
+ else:
187
+ raise ValueError(f"invalid input {st} is of type {type(st)}")
188
+
189
+ # Pad with zeroes, if necessary
190
+ m = max(len(a)-i for i,a in enumerate(w))
191
+ w = [list(a)+[0]*(m+i-len(a)) for i,a in enumerate(w)]
192
+ # Convert to immutable
193
+ w = tuple([tuple(a) for a in w])
194
+
195
+ PathTableau.__init__(self, parent, w, check=check)
196
+
197
+ def check(self):
198
+ """
199
+ Check that ``self`` is a valid path.
200
+
201
+ EXAMPLES::
202
+
203
+ sage: path_tableaux.SemistandardPathTableau([[], [3], [2,2]]) # indirect doctest
204
+ Traceback (most recent call last):
205
+ ...
206
+ ValueError: [(), (3,), (2, 2)] does not satisfy
207
+ the required inequalities in row 1
208
+
209
+ sage: path_tableaux.SemistandardPathTableau([[], [3/2], [2,5/2]]) # indirect doctest
210
+ Traceback (most recent call last):
211
+ ...
212
+ ValueError: [(), (3/2,), (2, 5/2)] does not satisfy
213
+ the required inequalities in row 1
214
+
215
+
216
+ TESTS::
217
+
218
+ sage: path_tableaux.SemistandardPathTableau([[], [2], [1,2]])
219
+ Traceback (most recent call last):
220
+ ...
221
+ ValueError: [(), (2,), (1, 2)] does not satisfy the required inequalities in row 1
222
+
223
+ sage: path_tableaux.SemistandardPathTableau([[], [2], [1,2]], check=False)
224
+ [(), (2,), (1, 2)]
225
+ """
226
+ for i in range(1,len(self)-1):
227
+ if not all(r >= s for r,s in zip(self[i+1],self[i])):
228
+ raise ValueError(f"{self} does not satisfy the required inequalities in row {i}")
229
+ if not all(r >= s for r,s in zip(self[i],self[i+1][1:])):
230
+ raise ValueError(f"{self} does not satisfy the required inequalities in row {i}")
231
+
232
+ def size(self):
233
+ r"""
234
+ Return the size or length of ``self``.
235
+
236
+ EXAMPLES::
237
+
238
+ sage: path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1], [3,3,2,1]]).size()
239
+ 5
240
+ """
241
+ return len(self)
242
+
243
+ def is_skew(self):
244
+ """
245
+ Return ``True`` if ``self`` is skew.
246
+
247
+ EXAMPLES::
248
+
249
+ sage: path_tableaux.SemistandardPathTableau([[], [2]]).is_skew()
250
+ False
251
+ sage: path_tableaux.SemistandardPathTableau([[2,1]]).is_skew()
252
+ True
253
+ """
254
+ return bool(self[0])
255
+
256
+ def is_integral(self) -> bool:
257
+ """
258
+ Return ``True`` if all entries are nonnegative integers.
259
+
260
+ EXAMPLES::
261
+
262
+ sage: path_tableaux.SemistandardPathTableau([[], [3], [3,2]]).is_integral()
263
+ True
264
+ sage: path_tableaux.SemistandardPathTableau([[], [5/2], [7/2,2]]).is_integral()
265
+ False
266
+ sage: path_tableaux.SemistandardPathTableau([[], [3], [3,-2]]).is_integral()
267
+ False
268
+ """
269
+ return all(i in NN for a in self for i in a)
270
+
271
+ def local_rule(self, i):
272
+ r"""
273
+ This is the Bender-Knuth involution.
274
+
275
+ This is implemented by toggling the entries of the `i`-th list.
276
+ The allowed range for ``i`` is ``0 < i < len(self)-1`` so any row except
277
+ the first and last can be changed.
278
+
279
+ EXAMPLES::
280
+
281
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2],
282
+ ....: [3,3,1], [3,3,2,1]])
283
+ sage: pt.local_rule(1)
284
+ [(), (2,), (3, 2), (3, 3, 1), (3, 3, 2, 1)]
285
+ sage: pt.local_rule(2)
286
+ [(), (3,), (3, 2), (3, 3, 1), (3, 3, 2, 1)]
287
+ sage: pt.local_rule(3)
288
+ [(), (3,), (3, 2), (3, 2, 2), (3, 3, 2, 1)]
289
+
290
+ TESTS::
291
+
292
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2],
293
+ ....: [3,3,1], [3,3,2,1]])
294
+ sage: pt.local_rule(0)
295
+ Traceback (most recent call last):
296
+ ...
297
+ ValueError: 0 is not defined on [(), (3,), (3, 2), (3, 3, 1), (3, 3, 2, 1)]
298
+ sage: pt.local_rule(4)
299
+ Traceback (most recent call last):
300
+ ...
301
+ ValueError: 4 is not defined on [(), (3,), (3, 2), (3, 3, 1), (3, 3, 2, 1)]
302
+ """
303
+ def toggle(i, j):
304
+ """
305
+ Return the toggle of entry 'self[i][j]'.
306
+ """
307
+
308
+ if j == 0:
309
+ left = self[i+1][0]
310
+ else:
311
+ left = min(self[i+1][j], self[i-1][j-1])
312
+ if j == len(self[i])-1:
313
+ right = self[i+1][j+1]
314
+ else:
315
+ right = max(self[i+1][j+1], self[i-1][j])
316
+
317
+ return left + right - self[i][j]
318
+
319
+ if not 0 < i < self.size()-1:
320
+ raise ValueError(f"{i} is not defined on {self}")
321
+
322
+ with self.clone() as result:
323
+ result[i] = tuple([toggle(i,k) for k in range(len(self[i]))])
324
+
325
+ return result
326
+
327
+ def rectify(self, inner=None, verbose=False):
328
+ """
329
+ Rectify ``self``.
330
+
331
+ This gives the usual rectification of a skew standard tableau and gives a
332
+ generalisation to skew semistandard tableaux. The usual construction uses
333
+ jeu de taquin but here we use the Bender-Knuth involutions.
334
+
335
+ EXAMPLES::
336
+
337
+ sage: st = SkewTableau([[None, None, None, 4], [None, None, 1, 6],
338
+ ....: [None, None, 5], [2, 3]])
339
+ sage: path_tableaux.SemistandardPathTableau(st).rectify()
340
+ [(), (1,), (1, 1), (2, 1, 0), (3, 1, 0, 0), (3, 2, 0, 0, 0), (4, 2, 0, 0, 0, 0)]
341
+ sage: path_tableaux.SemistandardPathTableau(st).rectify(verbose=True)
342
+ [[(3, 2, 2), (3, 3, 2, 0), (3, 3, 2, 1, 0), (3, 3, 2, 2, 0, 0),
343
+ (4, 3, 2, 2, 0, 0, 0), (4, 3, 3, 2, 0, 0, 0, 0), (4, 4, 3, 2, 0, 0, 0, 0, 0)],
344
+ [(3, 2), (3, 3, 0), (3, 3, 1, 0), (3, 3, 2, 0, 0), (4, 3, 2, 0, 0, 0),
345
+ (4, 3, 3, 0, 0, 0, 0), (4, 4, 3, 0, 0, 0, 0, 0)],
346
+ [(3,), (3, 1), (3, 1, 1), (3, 2, 1, 0), (4, 2, 1, 0, 0), (4, 3, 1, 0, 0, 0),
347
+ (4, 4, 1, 0, 0, 0, 0)],
348
+ [(), (1,), (1, 1), (2, 1, 0), (3, 1, 0, 0), (3, 2, 0, 0, 0), (4, 2, 0, 0, 0, 0)]]
349
+
350
+ TESTS::
351
+
352
+ sage: S = SemistandardSkewTableaux([[5,3,3], [3,1]], [3,2,2])
353
+ sage: LHS = [path_tableaux.SemistandardPathTableau(st.rectify()) for st in S]
354
+ sage: RHS = [path_tableaux.SemistandardPathTableau(st).rectify() for st in S]
355
+ sage: LHS == RHS
356
+ True
357
+
358
+ sage: st = SkewTableau([[None, None, None, 4], [None, None, 1, 6],
359
+ ....: [None, None, 5], [2, 3]])
360
+ sage: pt = path_tableaux.SemistandardPathTableau(st)
361
+ sage: SP = [path_tableaux.SemistandardPathTableau(it)
362
+ ....: for it in StandardTableaux([3,2,2])]
363
+ sage: len(set(pt.rectify(inner=ip) for ip in SP))
364
+ 1
365
+ """
366
+ if not self.is_skew():
367
+ return self
368
+
369
+ n = len(self)
370
+ pp = self[0]
371
+ P = self.parent()
372
+
373
+ if inner is None:
374
+ initial = [pp[:r] for r in range(len(pp))]
375
+ elif _Partitions(inner[-1]) == _Partitions(pp):
376
+ initial = list(inner)[:-1]
377
+ else:
378
+ raise ValueError(f"the final shape{inner[-1]} must agree with the initial shape {pp}")
379
+
380
+ r = len(initial)
381
+ path = P.element_class(P, initial + list(self))
382
+ if verbose:
383
+ rect = [self]
384
+
385
+ for i in range(r):
386
+ for j in range(n-1):
387
+ path = path.local_rule(r+j-i)
388
+ if verbose:
389
+ rect.append(P.element_class(P, list(path)[r-i-1:r+n-i-1]))
390
+
391
+ if verbose:
392
+ return rect
393
+ else:
394
+ return P.element_class(P, list(path)[:n])
395
+
396
+ @combinatorial_map(name='to semistandard tableau')
397
+ def to_tableau(self):
398
+ r"""
399
+ Convert ``self`` to a :class:`SemistandardTableau`.
400
+
401
+ The :class:`SemistandardSkewTableau` is not implemented so this returns a :class:`SkewTableau`
402
+
403
+ EXAMPLES::
404
+
405
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1],
406
+ ....: [3,3,2,1], [4,3,3,1,0]])
407
+ sage: pt.to_tableau()
408
+ [[1, 1, 1, 5], [2, 2, 3], [3, 4, 5], [4]]
409
+
410
+ TESTS::
411
+
412
+ sage: SST = SemistandardTableaux(shape=[5,5,3], eval=[2,2,3,4,2])
413
+ sage: all(st == path_tableaux.SemistandardPathTableau(st).to_tableau() # needs sage.modules
414
+ ....: for st in SST)
415
+ True
416
+ """
417
+ from sage.combinat.tableau import from_chain
418
+
419
+ if not self.is_integral():
420
+ raise ValueError(f"{self} must have all entries nonnegative integers")
421
+
422
+ lt = [[i for i in a if i > 0] for a in self]
423
+ if self.is_skew():
424
+ return SkewTableaux().from_chain(lt)
425
+ else:
426
+ return from_chain(lt)
427
+
428
+ @combinatorial_map(name='to Gelfand-Tsetlin pattern')
429
+ def to_pattern(self):
430
+ r"""
431
+ Convert ``self`` to a Gelfand-Tsetlin pattern.
432
+
433
+ EXAMPLES::
434
+
435
+ sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1],
436
+ ....: [3,3,2,1], [4,3,3,1]])
437
+ sage: pt.to_pattern()
438
+ [[4, 3, 3, 1, 0], [3, 3, 2, 1], [3, 3, 1], [3, 2], [3]]
439
+
440
+ TESTS::
441
+
442
+ sage: pt = path_tableaux.SemistandardPathTableau([[3,2], [3,3,1], [3,3,2,1], [4,3,3,1]])
443
+ sage: pt.to_pattern()
444
+ Traceback (most recent call last):
445
+ ...
446
+ ValueError: [(3, 2), (3, 3, 1), (3, 3, 2, 1), (4, 3, 3, 1, 0)] cannot be a skew tableau
447
+
448
+ sage: GT = GelfandTsetlinPatterns(top_row=[5,5,3])
449
+ sage: all(gt == path_tableaux.SemistandardPathTableau(gt).to_pattern() for gt in GT)
450
+ True
451
+
452
+ sage: GT = GelfandTsetlinPatterns(top_row=[5,5,3])
453
+ sage: all(gt.to_tableau() == path_tableaux.SemistandardPathTableau(gt).to_tableau() for gt in GT)
454
+ True
455
+ """
456
+ if self.is_skew():
457
+ raise ValueError(f"{self} cannot be a skew tableau")
458
+
459
+ lt = list(self)
460
+ lt.reverse()
461
+ if not lt[-1]:
462
+ lt.pop()
463
+
464
+ return GelfandTsetlinPattern([list(a) for a in lt])
465
+
466
+ def _test_jdt_promotion(self, **options):
467
+ """
468
+ Check that promotion agrees with :meth:`Tableau.promotion_inverse`
469
+ constructed using jeu de taquin.
470
+
471
+ TESTS::
472
+
473
+ sage: pt = path_tableaux.SemistandardPathTableau([(), (1,), (2,1), (4,2),
474
+ ....: (4,3,1), (4,3,3)])
475
+ sage: pt._test_jdt_promotion()
476
+
477
+ sage: pt = path_tableaux.SemistandardPathTableau([(), (1,), (2,1), (4,2),
478
+ ....: (4,3,1), (9/2,3,3)])
479
+ sage: pt._test_jdt_promotion()
480
+ Traceback (most recent call last):
481
+ ...
482
+ ValueError: [(), (1,), (2, 1), (4, 2, 0), (4, 3, 1, 0), (9/2, 3, 3, 0, 0)]
483
+ must have all entries nonnegative integers
484
+ """
485
+ if not self.is_integral():
486
+ raise ValueError(f"{self} must have all entries nonnegative integers")
487
+
488
+ tester = self._tester(**options)
489
+ LHS = self.promotion().to_tableau()
490
+ RHS = self.to_tableau().promotion_inverse(len(self)-2)
491
+ tester.assertEqual(LHS,RHS)
492
+
493
+
494
+ class SemistandardPathTableaux(PathTableaux):
495
+ """
496
+ The parent class for :class:`SemistandardPathTableau`.
497
+ """
498
+
499
+ def _an_element_(self):
500
+ """
501
+ Return an element of ``self``.
502
+
503
+ EXAMPLES::
504
+
505
+ sage: path_tableaux.SemistandardPathTableaux()._an_element_()
506
+ [(), (2,), (2, 1)]
507
+ """
508
+ return SemistandardPathTableau([[], [2], [2,1]])
509
+
510
+ Element = SemistandardPathTableau