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,728 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ r"""
3
+ Path tableaux
4
+
5
+ This is an abstract base class for using local rules to construct
6
+ rectification and the action of the cactus group [Wes2017]_.
7
+
8
+ This is a construction of the Henriques-Kamnitzer construction of
9
+ the action of the cactus group on tensor powers of a crystal. This is
10
+ also a generalisation of the Fomin growth rules, which are a version of
11
+ the operations on standard tableaux which were previously constructed
12
+ using jeu de taquin.
13
+
14
+ The basic operations are rectification, evacuation and promotion.
15
+ Rectification of standard skew tableaux agrees with the rectification
16
+ by jeu de taquin as does evacuation. Promotion agrees with promotion
17
+ by jeu de taquin on rectangular tableaux but in general they are different.
18
+
19
+ REFERENCES:
20
+
21
+ - [Wes2017]_
22
+
23
+ AUTHORS:
24
+
25
+ - Bruce Westbury (2018): initial version
26
+ """
27
+
28
+ # ****************************************************************************
29
+ # Copyright (C) 2018 Bruce Westbury <bruce.westbury@gmail.com>,
30
+ #
31
+ # This program is free software: you can redistribute it and/or modify
32
+ # it under the terms of the GNU General Public License as published by
33
+ # the Free Software Foundation, either version 2 of the License, or
34
+ # (at your option) any later version.
35
+ # https://www.gnu.org/licenses/
36
+ # ****************************************************************************
37
+
38
+ from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
39
+ from sage.misc.abstract_method import abstract_method
40
+ from sage.categories.sets_cat import Sets
41
+ from sage.structure.unique_representation import UniqueRepresentation
42
+ from sage.structure.parent import Parent
43
+ #from sage.sets.recursively_enumerated_set import RecursivelyEnumeratedSet_graded
44
+ from sage.structure.sage_object import SageObject
45
+ from sage.structure.list_clone import ClonableArray
46
+ from sage.misc.latex import latex
47
+ #from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
48
+ #from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
49
+
50
+
51
+ class PathTableau(ClonableArray, metaclass=InheritComparisonClasscallMetaclass):
52
+ r"""
53
+ This is the abstract base class for a path tableau.
54
+ """
55
+ @abstract_method
56
+ def local_rule(self, i):
57
+ r"""
58
+ This is the abstract local rule defined in any coboundary category.
59
+
60
+ This has input a list of objects. This method first takes
61
+ the list of objects of length three consisting of the `(i-1)`-st,
62
+ `i`-th and `(i+1)`-term and applies the rule. It then replaces
63
+ the `i`-th object by the object returned by the rule.
64
+
65
+ EXAMPLES::
66
+
67
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
68
+ sage: t.local_rule(3)
69
+ [0, 1, 2, 1, 2, 1, 0]
70
+ """
71
+
72
+ ################################# Book Keeping ############################
73
+
74
+ def size(self):
75
+ r"""
76
+ Return the size or length of ``self``.
77
+
78
+ EXAMPLES::
79
+
80
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
81
+ sage: t.size()
82
+ 7
83
+ """
84
+ return len(self)
85
+
86
+ def initial_shape(self):
87
+ r"""
88
+ Return the initial shape of ``self``.
89
+
90
+ EXAMPLES::
91
+
92
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
93
+ sage: t.initial_shape()
94
+ 0
95
+ """
96
+ return self[0]
97
+
98
+ def final_shape(self):
99
+ r"""
100
+ Return the final shape of ``self``.
101
+
102
+ EXAMPLES::
103
+
104
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
105
+ sage: t.final_shape()
106
+ 0
107
+ """
108
+ return self[-1]
109
+
110
+ ############################# Jeu de taquin ###############################
111
+
112
+ def promotion(self):
113
+ r"""
114
+ Return the promotion operator applied to ``self``.
115
+
116
+ EXAMPLES::
117
+
118
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
119
+ sage: t.promotion()
120
+ [0, 1, 2, 1, 0, 1, 0]
121
+ """
122
+ with self.clone() as result:
123
+ for i in range(1,self.size()-1):
124
+ result = result.local_rule(i)
125
+
126
+ return result
127
+
128
+ def evacuation(self):
129
+ r"""
130
+ Return the evacuation operator applied to ``self``.
131
+
132
+ EXAMPLES::
133
+
134
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
135
+ sage: t.evacuation()
136
+ [0, 1, 2, 3, 2, 1, 0]
137
+ """
138
+ if self.size() < 3:
139
+ return self
140
+
141
+ L = list(self)
142
+ result = []
143
+ P = self.parent()
144
+ for i in range(self.size()):
145
+ L = list(P(L).promotion())
146
+ result.append( L.pop() )
147
+ result.reverse()
148
+ return P(result)
149
+
150
+ def commutor(self, other, verbose=False):
151
+ r"""
152
+ Return the commutor of ``self`` with ``other``.
153
+
154
+ If ``verbose=True`` then the function will print
155
+ the rectangle.
156
+
157
+ EXAMPLES::
158
+
159
+ sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
160
+ sage: t2 = path_tableaux.DyckPath([0,1,2,1,0])
161
+ sage: t1.commutor(t2)
162
+ ([0, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0])
163
+ sage: t1.commutor(t2,verbose=True)
164
+ [0, 1, 2, 1, 0]
165
+ [1, 2, 3, 2, 1]
166
+ [2, 3, 4, 3, 2]
167
+ [3, 4, 5, 4, 3]
168
+ [2, 3, 4, 3, 2]
169
+ [1, 2, 3, 2, 1]
170
+ [0, 1, 2, 1, 0]
171
+ ([0, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0])
172
+
173
+ TESTS::
174
+
175
+ sage: t1 = path_tableaux.DyckPath([])
176
+ sage: t2 = path_tableaux.DyckPath([0,1,2,1,0])
177
+ sage: t1.commutor(t2)
178
+ Traceback (most recent call last):
179
+ ...
180
+ ValueError: this requires nonempty lists
181
+ sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
182
+ sage: t2 = path_tableaux.DyckPath([])
183
+ sage: t1.commutor(t2)
184
+ Traceback (most recent call last):
185
+ ...
186
+ ValueError: this requires nonempty lists
187
+ sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1])
188
+ sage: t2 = path_tableaux.DyckPath([0,1,2,1,0])
189
+ sage: t1.commutor(t2)
190
+ Traceback (most recent call last):
191
+ ...
192
+ ValueError: [0, 1, 2, 3, 2, 1], [0, 1, 2, 1, 0] is not a composable pair
193
+ """
194
+ n = self.size()
195
+ m = len(other)
196
+ if n == 0 or m == 0:
197
+ raise ValueError("this requires nonempty lists")
198
+ if n == 1 or m == 1:
199
+ return (other, self)
200
+
201
+ P = self.parent()
202
+
203
+ row = list(other)
204
+ col = list(self)
205
+ if col[-1] != row[0]:
206
+ raise ValueError("%s, %s is not a composable pair" % (self,other))
207
+
208
+ path = P(col + row[1:])
209
+
210
+ for i in range(1,n):
211
+ if verbose:
212
+ print(path[n-i:n+m-i])
213
+ for j in range(m-1):
214
+ path = path.local_rule(n+j-i)
215
+ if verbose:
216
+ print(path[:m])
217
+
218
+ return (P(path[:m]), P(path[m-1:]))
219
+
220
+ def cactus(self, i, j):
221
+ r"""
222
+ Return the action of the generator `s_{i,j}` of the cactus
223
+ group on ``self``.
224
+
225
+ INPUT:
226
+
227
+ - ``i`` -- positive integer
228
+ - ``j`` -- positive integer weakly greater than `i`
229
+
230
+ EXAMPLES::
231
+
232
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
233
+ sage: t.cactus(1,5)
234
+ [0, 1, 0, 1, 2, 1, 0]
235
+
236
+ sage: t.cactus(1,6)
237
+ [0, 1, 2, 1, 0, 1, 0]
238
+
239
+ sage: t.cactus(1,7) == t.evacuation()
240
+ True
241
+ sage: t.cactus(1,7).cactus(1,6) == t.promotion()
242
+ True
243
+
244
+ TESTS::
245
+
246
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
247
+ sage: t.cactus(1,8)
248
+ Traceback (most recent call last):
249
+ ...
250
+ ValueError: integers out of bounds
251
+ sage: t.cactus(0,3)
252
+ Traceback (most recent call last):
253
+ ...
254
+ ValueError: integers out of bounds
255
+ """
256
+ if not 0 < i <= j <= self.size():
257
+ raise ValueError("integers out of bounds")
258
+
259
+ if i == j:
260
+ return self
261
+
262
+ if i == 1:
263
+ h = list(self)[:j]
264
+ t = list(self)[j:]
265
+ T = self.parent()(h)
266
+ L = list(T.evacuation()) + t
267
+ return self.parent()(L)
268
+
269
+ return self.cactus(1,j).cactus(1,j-i+1).cactus(1,j)
270
+
271
+ ########################### Visualisation and checking ####################
272
+
273
+ def _test_involution_rule(self, **options):
274
+ """
275
+ Check that the local rule gives an involution.
276
+
277
+ TESTS::
278
+
279
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
280
+ sage: t._test_involution_rule()
281
+ """
282
+ tester = self._tester(**options)
283
+ for i in range(self.size()-2):
284
+ tester.assertEqual(self.local_rule(i+1).local_rule(i + 1), self)
285
+
286
+ def _test_involution_cactus(self, **options):
287
+ """
288
+ Check that the cactus group generators are involutions.
289
+
290
+ TESTS::
291
+
292
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
293
+ sage: t._test_involution_cactus()
294
+ """
295
+ tester = self._tester(**options)
296
+ for i in range(2, self.size()+1):
297
+ tester.assertEqual(self.cactus(1,i).cactus(1,i), self)
298
+
299
+ def _test_promotion(self, **options):
300
+ """
301
+ Check that promotion can be expressed in terms of the cactus generators.
302
+
303
+ TESTS::
304
+
305
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
306
+ sage: t._test_promotion()
307
+ """
308
+ tester = self._tester(**options)
309
+ n = self.size()
310
+ tester.assertEqual(self.cactus(1,n-1).cactus(1,n).promotion(), self)
311
+
312
+ def _test_commutation(self, **options):
313
+ """
314
+ Check the commutation relations in the presentation of the cactus group.
315
+
316
+ TESTS::
317
+
318
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
319
+ sage: t._test_commutation()
320
+ """
321
+ from itertools import combinations
322
+ tester = self._tester(**options)
323
+
324
+ n = self.size()
325
+ if n < 5:
326
+ return
327
+ for i,j,r,s in combinations(range(1,n+1), 4):
328
+ lhs = self.cactus(i, j).cactus(r, s)
329
+ rhs = self.cactus(r, s).cactus(i, j)
330
+ tester.assertEqual(lhs, rhs)
331
+
332
+ def _test_coboundary(self, **options):
333
+ """
334
+ Check the coboundary relations in the presentation of the cactus group.
335
+
336
+ TESTS::
337
+
338
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
339
+ sage: t._test_coboundary()
340
+ """
341
+ from itertools import combinations
342
+ tester = self._tester(**options)
343
+
344
+ n = self.size()
345
+ if n < 4:
346
+ return
347
+ for i,j,r,s in combinations(range(1,n+3), 4):
348
+ lhs = self.cactus(i, s-2).cactus(j-1, r-1)
349
+ rhs = self.cactus(i+s-r-1, i+s-j-1).cactus(i, s-2)
350
+ tester.assertEqual(lhs, rhs)
351
+
352
+ def orbit(self):
353
+ r"""
354
+ Return the orbit of ``self`` under the action of the cactus group.
355
+
356
+ EXAMPLES::
357
+
358
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
359
+ sage: t.orbit()
360
+ {[0, 1, 0, 1, 0, 1, 0],
361
+ [0, 1, 0, 1, 2, 1, 0],
362
+ [0, 1, 2, 1, 0, 1, 0],
363
+ [0, 1, 2, 1, 2, 1, 0],
364
+ [0, 1, 2, 3, 2, 1, 0]}
365
+ """
366
+ orb = set()
367
+ rec = set([self])
368
+ while rec:
369
+ new = set()
370
+ for a in rec:
371
+ for i in range(2, self.size()):
372
+ b = a.cactus(1, i)
373
+ if (b not in orb) and (b not in rec):
374
+ new.add(b)
375
+ orb = orb.union(rec)
376
+ rec = new.copy()
377
+
378
+ return orb
379
+
380
+ def dual_equivalence_graph(self):
381
+ r"""
382
+ Return the graph with vertices the orbit of ``self``
383
+ and edges given by the action of the cactus group generators.
384
+
385
+ In most implementations the generators `s_{i,i+1}` will act
386
+ as the identity operators. The usual dual equivalence graphs
387
+ are given by replacing the label `i,i+2` by `i` and removing
388
+ edges with other labels.
389
+
390
+ EXAMPLES::
391
+
392
+ sage: s = path_tableaux.DyckPath([0,1,2,3,2,3,2,1,0])
393
+ sage: s.dual_equivalence_graph().adjacency_matrix() # needs sage.graphs sage.modules
394
+ [0 1 1 1 0 1 0 1 1 0 0 0 0 0]
395
+ [1 0 1 1 1 1 1 0 1 0 0 1 1 0]
396
+ [1 1 0 1 1 1 0 1 0 1 1 1 0 0]
397
+ [1 1 1 0 1 0 1 1 1 1 0 1 1 0]
398
+ [0 1 1 1 0 0 1 0 0 1 1 0 1 1]
399
+ [1 1 1 0 0 0 1 1 1 1 1 0 1 0]
400
+ [0 1 0 1 1 1 0 1 0 1 1 1 0 1]
401
+ [1 0 1 1 0 1 1 0 1 1 1 1 1 0]
402
+ [1 1 0 1 0 1 0 1 0 1 0 1 1 0]
403
+ [0 0 1 1 1 1 1 1 1 0 0 1 1 1]
404
+ [0 0 1 0 1 1 1 1 0 0 0 1 1 1]
405
+ [0 1 1 1 0 0 1 1 1 1 1 0 1 1]
406
+ [0 1 0 1 1 1 0 1 1 1 1 1 0 1]
407
+ [0 0 0 0 1 0 1 0 0 1 1 1 1 0]
408
+ sage: s = path_tableaux.DyckPath([0,1,2,3,2,1,0])
409
+ sage: s.dual_equivalence_graph().edges(sort=True) # needs sage.graphs
410
+ [([0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 2, 1, 0], '4,7'),
411
+ ([0, 1, 0, 1, 0, 1, 0], [0, 1, 2, 1, 0, 1, 0], '2,5'),
412
+ ([0, 1, 0, 1, 0, 1, 0], [0, 1, 2, 1, 2, 1, 0], '2,7'),
413
+ ([0, 1, 0, 1, 2, 1, 0], [0, 1, 2, 1, 0, 1, 0], '2,6'),
414
+ ([0, 1, 0, 1, 2, 1, 0], [0, 1, 2, 1, 2, 1, 0], '1,4'),
415
+ ([0, 1, 0, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0], '2,7'),
416
+ ([0, 1, 2, 1, 0, 1, 0], [0, 1, 2, 1, 2, 1, 0], '4,7'),
417
+ ([0, 1, 2, 1, 0, 1, 0], [0, 1, 2, 3, 2, 1, 0], '3,7'),
418
+ ([0, 1, 2, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0], '3,6')]
419
+ """
420
+ from sage.graphs.graph import Graph
421
+ from itertools import combinations
422
+
423
+ G = Graph()
424
+ orb = self.orbit()
425
+
426
+ for a in orb:
427
+ for i,j in combinations(range(1,self.size()+1),2):
428
+ b = a.cactus(i,j)
429
+ if a != b:
430
+ G.add_edge(a,b,"%d,%d" % (i,j))
431
+ return G
432
+
433
+
434
+ class PathTableaux(UniqueRepresentation,Parent):
435
+ """
436
+ The abstract parent class for PathTableau.
437
+ """
438
+
439
+ def __init__(self):
440
+ """
441
+ Initialize ``self``.
442
+
443
+ TESTS::
444
+
445
+ sage: t = path_tableaux.DyckPaths()
446
+ sage: TestSuite(t).run()
447
+
448
+ sage: f = path_tableaux.FriezePatterns(QQ)
449
+ sage: TestSuite(f).run()
450
+ """
451
+ Parent.__init__(self, category=Sets())
452
+
453
+ def _element_constructor_(self, *args, **kwds):
454
+ r"""
455
+ Construct an object as an element of ``self``, if possible.
456
+
457
+ TESTS::
458
+
459
+ sage: path_tableaux.DyckPath([0,1,2,1,0]) # indirect doctest
460
+ [0, 1, 2, 1, 0]
461
+ """
462
+ return self.element_class(self, *args, **kwds)
463
+
464
+
465
+ class CylindricalDiagram(SageObject):
466
+ r"""
467
+ Cylindrical growth diagrams.
468
+
469
+ EXAMPLES::
470
+
471
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
472
+ sage: path_tableaux.CylindricalDiagram(t)
473
+ [0, 1, 2, 3, 2, 1, 0]
474
+ [ , 0, 1, 2, 1, 0, 1, 0]
475
+ [ , , 0, 1, 0, 1, 2, 1, 0]
476
+ [ , , , 0, 1, 2, 3, 2, 1, 0]
477
+ [ , , , , 0, 1, 2, 1, 0, 1, 0]
478
+ [ , , , , , 0, 1, 0, 1, 2, 1, 0]
479
+ [ , , , , , , 0, 1, 2, 3, 2, 1, 0]
480
+ """
481
+
482
+ def __init__(self, T):
483
+ """
484
+ Initialize ``self`` from the
485
+ :class:`~sage.combinat.path_tableaux.path_tableau.PathTableau`
486
+ object ``T``.
487
+
488
+ TESTS::
489
+
490
+ sage: T = path_tableaux.DyckPath([0,1,2,3,2,1,0])
491
+ sage: D = path_tableaux.CylindricalDiagram(T)
492
+ sage: TestSuite(D).run()
493
+
494
+ sage: path_tableaux.CylindricalDiagram(2)
495
+ Traceback (most recent call last):
496
+ ...
497
+ ValueError: 2 must be a path tableau
498
+ """
499
+ if not isinstance(T, PathTableau):
500
+ raise ValueError('{0} must be a path tableau'.format(str(T)))
501
+ n = len(T)
502
+ result = [[None]*(2*n-1)] * n
503
+ for i in range(n):
504
+ result[i] = [""]*i + list(T)
505
+ T = T.promotion()
506
+
507
+ self.path_tableau = T
508
+ self.diagram = result
509
+
510
+ def _repr_(self):
511
+ r"""
512
+ Return a string representation of ``self``.
513
+
514
+ TESTS::
515
+
516
+ sage: cd = path_tableaux.CylindricalDiagram(path_tableaux.DyckPath([0,1,2,1,2,1,0]))
517
+ sage: repr(cd) == cd._repr_() # indirect test
518
+ True
519
+
520
+ sage: cd = path_tableaux.CylindricalDiagram(path_tableaux.FriezePattern([1,3,4,5,1]))
521
+ sage: repr(cd) == cd._repr_() # indirect test
522
+ True
523
+
524
+ sage: print(path_tableaux.DyckPath([0,1,2,1,2,1,0])) # indirect test
525
+ [0, 1, 2, 1, 2, 1, 0]
526
+
527
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
528
+ sage: path_tableaux.CylindricalDiagram(t)
529
+ [0, 1, 2, 3, 2, 1, 0]
530
+ [ , 0, 1, 2, 1, 0, 1, 0]
531
+ [ , , 0, 1, 0, 1, 2, 1, 0]
532
+ [ , , , 0, 1, 2, 3, 2, 1, 0]
533
+ [ , , , , 0, 1, 2, 1, 0, 1, 0]
534
+ [ , , , , , 0, 1, 0, 1, 2, 1, 0]
535
+ [ , , , , , , 0, 1, 2, 3, 2, 1, 0]
536
+ """
537
+ data = [[str(x) for x in row] for row in self.diagram]
538
+ if not data[0]:
539
+ data[0] = [''] # Put sometime there
540
+ max_width = max(max(len(x) for x in row) for row in data if row)
541
+ return '\n'.join('[' + ', '.join(' '*(max_width-len(x)) + x for x in row)
542
+ + ']' for row in data)
543
+
544
+ def __eq__(self, other):
545
+ """
546
+ Check equality.
547
+
548
+ EXAMPLES::
549
+
550
+ sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
551
+ sage: T1 = path_tableaux.CylindricalDiagram(t1)
552
+ sage: t2 = path_tableaux.DyckPath([0,1,2,1,2,1,0])
553
+ sage: T2 = path_tableaux.CylindricalDiagram(t2)
554
+ sage: T1 == T2
555
+ False
556
+ sage: T1 == path_tableaux.CylindricalDiagram(t1)
557
+ True
558
+ """
559
+ return isinstance(other, CylindricalDiagram) and self.diagram == other.diagram
560
+
561
+ def __ne__(self, other):
562
+ """
563
+ Check inequality.
564
+
565
+ EXAMPLES::
566
+
567
+ sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
568
+ sage: T1 = path_tableaux.CylindricalDiagram(t1)
569
+ sage: t2 = path_tableaux.DyckPath([0,1,2,1,2,1,0])
570
+ sage: T2 = path_tableaux.CylindricalDiagram(t2)
571
+ sage: T1 != T2
572
+ True
573
+ sage: T1 != path_tableaux.CylindricalDiagram(t1)
574
+ False
575
+ """
576
+ return not (self == other)
577
+
578
+ def _latex_(self):
579
+ r"""
580
+ Return a `\LaTeX` representation of ``self``.
581
+
582
+ EXAMPLES::
583
+
584
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
585
+ sage: latex(path_tableaux.CylindricalDiagram(t))
586
+ \begin{array}{ccccccccccccc}
587
+ 0 & 1 & 2 & 3 & 2 & 1 & 0\\
588
+ & 0 & 1 & 2 & 1 & 0 & 1 & 0\\
589
+ & & 0 & 1 & 0 & 1 & 2 & 1 & 0\\
590
+ & & & 0 & 1 & 2 & 3 & 2 & 1 & 0\\
591
+ & & & & 0 & 1 & 2 & 1 & 0 & 1 & 0\\
592
+ & & & & & 0 & 1 & 0 & 1 & 2 & 1 & 0\\
593
+ & & & & & & 0 & 1 & 2 & 3 & 2 & 1 & 0
594
+ \end{array}
595
+
596
+ sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
597
+ sage: latex(path_tableaux.CylindricalDiagram(t))
598
+ \begin{array}{ccccccccccccc}
599
+ 0 & 1 & 3 & 4 & 5 & 1 & 0\\
600
+ & 0 & 1 & \frac{5}{3} & \frac{7}{3} & \frac{2}{3} & 1 & 0\\
601
+ & & 0 & 1 & 2 & 1 & 3 & 1 & 0\\
602
+ & & & 0 & 1 & 1 & 4 & \frac{5}{3} & 1 & 0\\
603
+ & & & & 0 & 1 & 5 & \frac{7}{3} & 2 & 1 & 0\\
604
+ & & & & & 0 & 1 & \frac{2}{3} & 1 & 1 & 1 & 0\\
605
+ & & & & & & 0 & 1 & 3 & 4 & 5 & 1 & 0
606
+ \end{array}
607
+ """
608
+ D = self.diagram
609
+ m = len(D[-1])
610
+ result = "\\begin{array}{"+"c"*m + "}\n"
611
+ result += "\\\\ \n".join( " & ".join(latex(a) for a in x) for x in D )
612
+ result += "\n \\end{array}\n"
613
+ return result
614
+
615
+ def __len__(self):
616
+ r"""
617
+ Return the length of ``self``.
618
+
619
+ TESTS::
620
+
621
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
622
+ sage: len(path_tableaux.CylindricalDiagram(t))
623
+ 7
624
+ """
625
+ return len(self.diagram)
626
+
627
+ def _ascii_art_(self):
628
+ r"""
629
+ Return an ascii art representation of ``self``.
630
+
631
+ TESTS::
632
+
633
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
634
+ sage: ascii_art(path_tableaux.CylindricalDiagram(t))
635
+ 0 1 2 3 2 1 0
636
+ 0 1 2 1 0 1 0
637
+ 0 1 0 1 2 1 0
638
+ 0 1 2 3 2 1 0
639
+ 0 1 2 1 0 1 0
640
+ 0 1 0 1 2 1 0
641
+ 0 1 2 3 2 1 0
642
+
643
+ sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
644
+ sage: ascii_art(path_tableaux.CylindricalDiagram(t))
645
+ 0 1 3 4 5 1 0
646
+ 0 1 5/3 7/3 2/3 1 0
647
+ 0 1 2 1 3 1 0
648
+ 0 1 1 4 5/3 1 0
649
+ 0 1 5 7/3 2 1 0
650
+ 0 1 2/3 1 1 1 0
651
+ 0 1 3 4 5 1 0
652
+ """
653
+ from sage.typeset.ascii_art import ascii_art
654
+ from sage.misc.misc_c import prod
655
+ data = [[ascii_art(x) for x in row] for row in self.diagram]
656
+ if not data[0]:
657
+ data[0] = [ascii_art('')] # Put sometime there
658
+ max_width = max(max(len(x) for x in row) for row in data if row)
659
+ return prod((sum((ascii_art(' '*(max_width-len(x)+1)) + x for x in row), ascii_art(''))
660
+ for row in data), ascii_art(''))
661
+
662
+ def _unicode_art_(self):
663
+ r"""
664
+ Return a unicode art representation of ``self``.
665
+
666
+ TESTS::
667
+
668
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
669
+ sage: unicode_art(path_tableaux.CylindricalDiagram(t))
670
+ 0 1 2 3 2 1 0
671
+ 0 1 2 1 0 1 0
672
+ 0 1 0 1 2 1 0
673
+ 0 1 2 3 2 1 0
674
+ 0 1 2 1 0 1 0
675
+ 0 1 0 1 2 1 0
676
+ 0 1 2 3 2 1 0
677
+
678
+ sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
679
+ sage: unicode_art(path_tableaux.CylindricalDiagram(t))
680
+ 0 1 3 4 5 1 0
681
+ 0 1 5/3 7/3 2/3 1 0
682
+ 0 1 2 1 3 1 0
683
+ 0 1 1 4 5/3 1 0
684
+ 0 1 5 7/3 2 1 0
685
+ 0 1 2/3 1 1 1 0
686
+ 0 1 3 4 5 1 0
687
+ """
688
+ from sage.typeset.unicode_art import unicode_art
689
+ from sage.misc.misc_c import prod
690
+ data = [[unicode_art(x) for x in row] for row in self.diagram]
691
+ if not data[0]:
692
+ data[0] = [unicode_art('')] # Put sometime there
693
+ max_width = max(max(len(x) for x in row) for row in data if row)
694
+ return prod((sum((unicode_art(' '*(max_width-len(x)+1)) + x for x in row), unicode_art(''))
695
+ for row in data), unicode_art(''))
696
+
697
+ def pp(self):
698
+ r"""
699
+ A pretty print utility method.
700
+
701
+ EXAMPLES::
702
+
703
+ sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
704
+ sage: path_tableaux.CylindricalDiagram(t).pp()
705
+ 0 1 2 3 2 1 0
706
+ 0 1 2 1 0 1 0
707
+ 0 1 0 1 2 1 0
708
+ 0 1 2 3 2 1 0
709
+ 0 1 2 1 0 1 0
710
+ 0 1 0 1 2 1 0
711
+ 0 1 2 3 2 1 0
712
+
713
+ sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
714
+ sage: path_tableaux.CylindricalDiagram(t).pp()
715
+ 0 1 3 4 5 1 0
716
+ 0 1 5/3 7/3 2/3 1 0
717
+ 0 1 2 1 3 1 0
718
+ 0 1 1 4 5/3 1 0
719
+ 0 1 5 7/3 2 1 0
720
+ 0 1 2/3 1 1 1 0
721
+ 0 1 3 4 5 1 0
722
+ """
723
+ data = [[str(x) for x in row] for row in self.diagram]
724
+ if not data[0]:
725
+ data[0] = [''] # Put sometime there
726
+ max_width = max(max(len(x) for x in row) for row in data if row)
727
+ print('\n'.join(' '.join(' '*(max_width-len(x)) + x for x in row)
728
+ for row in data))