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,777 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ """
3
+ Combinatorial triangles for posets and fans
4
+
5
+ This provides several classes and methods to convert between them.
6
+ Elements of the classes are polynomials in two variables `x` and `y`,
7
+ possibly with other parameters. The conversion methods amount to specific
8
+ invertible rational change-of-variables involving `x` and `y`.
9
+
10
+ These polynomial are called triangles because their supports, the sets
11
+ of exponents where their coefficients can be nonzero, have a triangular shape.
12
+
13
+ The M-triangle class is motivated by the generating series of Möbius numbers
14
+ for graded posets. A typical example is::
15
+
16
+ sage: W = SymmetricGroup(4) # needs sage.groups
17
+ sage: posets.NoncrossingPartitions(W).M_triangle() # needs sage.graphs sage.groups
18
+ M: x^3*y^3 - 6*x^2*y^3 + 6*x^2*y^2 + 10*x*y^3 - 16*x*y^2
19
+ - 5*y^3 + 6*x*y + 10*y^2 - 6*y + 1
20
+ sage: unicode_art(_) # needs sage.graphs sage.groups sage.modules
21
+ ⎛ -5 10 -6 1⎞
22
+ ⎜ 10 -16 6 0⎟
23
+ ⎜ -6 6 0 0⎟
24
+ ⎝ 1 0 0 0⎠
25
+
26
+ The F-triangle class is motivated by the generating series of pure
27
+ simplicial complexes endowed with a distinguished facet. One can also
28
+ think about complete fans endowed with a distinguished maximal
29
+ cone. A typical example is::
30
+
31
+ sage: # needs sage.graphs sage.modules
32
+ sage: C = ClusterComplex(['A',3])
33
+ sage: f = C.greedy_facet()
34
+ sage: C.F_triangle(f)
35
+ F: 5*x^3 + 5*x^2*y + 3*x*y^2 + y^3 + 10*x^2 + 8*x*y + 3*y^2 + 6*x + 3*y + 1
36
+ sage: unicode_art(_)
37
+ ⎛ 1 0 0 0⎞
38
+ ⎜ 3 3 0 0⎟
39
+ ⎜ 3 8 5 0⎟
40
+ ⎝ 1 6 10 5⎠
41
+
42
+ The H-triangles are related to the F-triangles by a relationship
43
+ similar to the classical link between the f-vector and the h-vector of a
44
+ simplicial complex.
45
+
46
+ The Gamma-triangles are related to the H-triangles by an
47
+ analog of the relationship between gamma-vectors and h-vectors of flag
48
+ simplicial complexes.
49
+ """
50
+ from sage.misc.lazy_import import lazy_import
51
+ from sage.rings.integer_ring import ZZ
52
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
53
+ from sage.structure.sage_object import SageObject
54
+
55
+ lazy_import('sage.matrix.constructor', 'matrix')
56
+
57
+
58
+ def _matrix_display(self, variables=None):
59
+ """
60
+ Return the 2-variable polynomial ``self`` as a matrix for display.
61
+
62
+ INPUT:
63
+
64
+ - ``variables`` -- (optional) choice of 2 variables
65
+
66
+ OUTPUT:
67
+
68
+ matrix
69
+
70
+ EXAMPLES::
71
+
72
+ sage: from sage.combinat.triangles_FHM import _matrix_display
73
+ sage: x, y = PolynomialRing(QQ,['x', 'y']).gens()
74
+ sage: _matrix_display(x**2+x*y+y**3) # needs sage.modules
75
+ [1 0 0]
76
+ [0 0 0]
77
+ [0 1 0]
78
+ [0 0 1]
79
+
80
+ With a specific choice of variables::
81
+
82
+ sage: x, y, z = PolynomialRing(QQ,['x','y','z']).gens()
83
+ sage: _matrix_display(x**2+z*x*y+z*y**3+z*x,[y,z]) # needs sage.modules
84
+ [ x x 0 1]
85
+ [x^2 0 0 0]
86
+ sage: _matrix_display(x**2+z*x*y+z*y**3+z*x,[x,z]) # needs sage.modules
87
+ [ y^3 y + 1 0]
88
+ [ 0 0 1]
89
+ """
90
+ support = self.exponents()
91
+ if variables is None:
92
+ ring = self.parent().base_ring()
93
+ x, y = self.parent().gens()
94
+ ix = 0
95
+ iy = 1
96
+ else:
97
+ x, y = variables
98
+ ring = self.parent()
99
+ all_vars = x.parent().gens()
100
+ ix = all_vars.index(x)
101
+ iy = all_vars.index(y)
102
+ minx = min(u[ix] for u in support)
103
+ maxy = max(u[iy] for u in support)
104
+ deltax = max(u[ix] for u in support) - minx + 1
105
+ deltay = maxy - min(u[iy] for u in support) + 1
106
+ mat = matrix(ring, deltay, deltax)
107
+ for u in support:
108
+ ex = u[ix]
109
+ ey = u[iy]
110
+ mat[maxy - ey, ex - minx] = self.coefficient({x: ex, y: ey})
111
+ return mat
112
+
113
+
114
+ class Triangle(SageObject):
115
+ """
116
+ Common class for different kinds of triangles.
117
+
118
+ This serves as a base class for F-triangles, H-triangles, M-triangles
119
+ and Gamma-triangles.
120
+
121
+ The user should use these subclasses directly.
122
+
123
+ The input is a polynomial in two variables. One can also give a
124
+ polynomial with more variables and specify two chosen variables.
125
+
126
+ EXAMPLES::
127
+
128
+ sage: from sage.combinat.triangles_FHM import Triangle
129
+ sage: x, y = polygens(ZZ, 'x,y')
130
+ sage: ht = Triangle(1+4*x+2*x*y)
131
+ sage: unicode_art(ht) # needs sage.modules
132
+ ⎛0 2⎞
133
+ ⎝1 4⎠
134
+ """
135
+
136
+ def __init__(self, poly, variables=None):
137
+ """
138
+ EXAMPLES::
139
+
140
+ sage: from sage.combinat.triangles_FHM import Triangle
141
+ sage: x, y = polygens(ZZ, 'x,y')
142
+ sage: ht = Triangle(1+2*x*y)
143
+ sage: unicode_art(ht) # needs sage.modules
144
+ ⎛0 2⎞
145
+ ⎝1 0⎠
146
+ """
147
+ if variables is None:
148
+ self._vars = poly.parent().gens()
149
+ else:
150
+ self._vars = variables
151
+ self._poly = poly
152
+ self._n = max(self._poly.degree(v) for v in self._vars)
153
+
154
+ def _ascii_art_(self):
155
+ """
156
+ Return the ascii-art representation (as a matrix).
157
+
158
+ EXAMPLES::
159
+
160
+ sage: from sage.combinat.triangles_FHM import H_triangle
161
+ sage: x, y = polygens(ZZ, 'x,y')
162
+ sage: ht = H_triangle(1+2*x*y)
163
+ sage: ascii_art(ht) # needs sage.modules
164
+ [0 2]
165
+ [1 0]
166
+ """
167
+ return self.matrix()._ascii_art_()
168
+
169
+ def _unicode_art_(self):
170
+ """
171
+ Return the unicode representation (as a matrix).
172
+
173
+ EXAMPLES::
174
+
175
+ sage: from sage.combinat.triangles_FHM import H_triangle
176
+ sage: x, y = polygens(ZZ, 'x,y')
177
+ sage: ht = H_triangle(1+2*x*y)
178
+ sage: unicode_art(ht) # needs sage.modules
179
+ ⎛0 2⎞
180
+ ⎝1 0⎠
181
+ """
182
+ return self.matrix()._unicode_art_()
183
+
184
+ def _repr_(self) -> str:
185
+ """
186
+ Return the string representation (as a polynomial).
187
+
188
+ EXAMPLES::
189
+
190
+ sage: from sage.combinat.triangles_FHM import H_triangle
191
+ sage: x, y = polygens(ZZ, 'x,y')
192
+ sage: ht = H_triangle(1+2*x*y)
193
+ sage: ht
194
+ H: 2*x*y + 1
195
+ """
196
+ return self._prefix + ": " + repr(self._poly)
197
+
198
+ def _latex_(self):
199
+ r"""
200
+ Return the LaTeX representation (as a matrix).
201
+
202
+ EXAMPLES::
203
+
204
+ sage: from sage.combinat.triangles_FHM import H_triangle
205
+ sage: x, y = polygens(ZZ, 'x,y')
206
+ sage: ht = H_triangle(1+2*x*y)
207
+ sage: latex(ht) # needs sage.modules
208
+ \left(\begin{array}{rr}
209
+ 0 & 2 \\
210
+ 1 & 0
211
+ \end{array}\right)
212
+ """
213
+ return self.matrix()._latex_()
214
+
215
+ def __eq__(self, other) -> bool:
216
+ """
217
+ Test for equality.
218
+
219
+ EXAMPLES::
220
+
221
+ sage: from sage.combinat.triangles_FHM import H_triangle
222
+ sage: x, y = polygens(ZZ, 'x,y')
223
+ sage: h1 = H_triangle(1+2*x*y)
224
+ sage: h2 = H_triangle(1+3*x*y)
225
+ sage: h1 == h1
226
+ True
227
+ sage: h1 == h2
228
+ False
229
+ """
230
+ if isinstance(other, Triangle):
231
+ return self._poly == other._poly
232
+ return self._poly == other
233
+
234
+ def __ne__(self, other) -> bool:
235
+ """
236
+ Test for unequality.
237
+
238
+ EXAMPLES::
239
+
240
+ sage: from sage.combinat.triangles_FHM import H_triangle
241
+ sage: x, y = polygens(ZZ, 'x,y')
242
+ sage: h1 = H_triangle(1+2*x*y)
243
+ sage: h2 = H_triangle(1+3*x*y)
244
+ sage: h1 != h1
245
+ False
246
+ sage: h1 != h2
247
+ True
248
+ """
249
+ return not self == other
250
+
251
+ def __call__(self, *args):
252
+ """
253
+ Return the evaluation (as a polynomial).
254
+
255
+ EXAMPLES::
256
+
257
+ sage: from sage.combinat.triangles_FHM import H_triangle
258
+ sage: x, y = polygens(ZZ, 'x,y')
259
+ sage: h = H_triangle(1+3*x*y)
260
+ sage: h(4,5)
261
+ 61
262
+ """
263
+ return self._poly(*args)
264
+
265
+ def __getitem__(self, *args):
266
+ """
267
+ Return some coefficient.
268
+
269
+ EXAMPLES::
270
+
271
+ sage: from sage.combinat.triangles_FHM import H_triangle
272
+ sage: x, y = polygens(ZZ, 'x,y')
273
+ sage: h = H_triangle(1+2*x+3*x*y)
274
+ sage: h[1,1]
275
+ 3
276
+ """
277
+ return self._poly.__getitem__(*args)
278
+
279
+ def __hash__(self):
280
+ """
281
+ Return the hash value.
282
+
283
+ EXAMPLES::
284
+
285
+ sage: from sage.combinat.triangles_FHM import H_triangle
286
+ sage: x, y = polygens(ZZ, 'x,y')
287
+ sage: h = H_triangle(1+2*x*y)
288
+ sage: g = H_triangle(1+2*x*y)
289
+ sage: hash(h) == hash(g)
290
+ True
291
+ """
292
+ return hash(self._poly)
293
+
294
+ def matrix(self):
295
+ """
296
+ Return the associated matrix for display.
297
+
298
+ EXAMPLES::
299
+
300
+ sage: from sage.combinat.triangles_FHM import H_triangle
301
+ sage: x, y = polygens(ZZ, 'x,y')
302
+ sage: h = H_triangle(1+2*x*y)
303
+ sage: h.matrix() # needs sage.modules
304
+ [0 2]
305
+ [1 0]
306
+ """
307
+ return _matrix_display(self._poly, variables=self._vars)
308
+
309
+ def polynomial(self):
310
+ """
311
+ Return the triangle as a bare polynomial.
312
+
313
+ EXAMPLES::
314
+
315
+ sage: from sage.combinat.triangles_FHM import H_triangle
316
+ sage: x, y = polygens(ZZ, 'x,y')
317
+ sage: h = H_triangle(1+2*x*y)
318
+ sage: h.polynomial()
319
+ 2*x*y + 1
320
+ """
321
+ return self._poly
322
+
323
+ def truncate(self, d):
324
+ """
325
+ Return the truncated triangle.
326
+
327
+ INPUT:
328
+
329
+ - ``d`` -- integer
330
+
331
+ As a polynomial, this means that all monomials with a power
332
+ of either `x` or `y` greater than or equal to ``d`` are dismissed.
333
+
334
+ EXAMPLES::
335
+
336
+ sage: from sage.combinat.triangles_FHM import H_triangle
337
+ sage: x, y = polygens(ZZ, 'x,y')
338
+ sage: h = H_triangle(1+2*x*y)
339
+ sage: h.truncate(2)
340
+ H: 2*x*y + 1
341
+ """
342
+ p = self._poly
343
+ for v in self._vars:
344
+ p = p.truncate(v, d)
345
+ return self.__class__(p, self._vars)
346
+
347
+
348
+ class M_triangle(Triangle):
349
+ """
350
+ Class for the M-triangles.
351
+
352
+ This is motivated by generating series of Möbius numbers of graded posets.
353
+
354
+ EXAMPLES::
355
+
356
+ sage: x, y = polygens(ZZ, 'x,y')
357
+ sage: P = Poset({2: [1]}) # needs sage.graphs
358
+ sage: P.M_triangle() # needs sage.graphs
359
+ M: x*y - y + 1
360
+ """
361
+ _prefix = 'M'
362
+
363
+ def dual(self):
364
+ """
365
+ Return the dual M-triangle.
366
+
367
+ This is the M-triangle of the dual poset, hence an involution.
368
+
369
+ When seen as a matrix, this performs a symmetry with respect to the
370
+ northwest-southeast diagonal.
371
+
372
+ EXAMPLES::
373
+
374
+ sage: from sage.combinat.triangles_FHM import M_triangle
375
+ sage: x, y = polygens(ZZ, 'x,y')
376
+ sage: mt = M_triangle(x*y - y + 1)
377
+ sage: mt.dual() == mt
378
+ True
379
+ """
380
+ x, y = self._vars
381
+ n = self._n
382
+ A = self._poly.parent()
383
+
384
+ dict_dual = {(n - dy, n - dx): coeff
385
+ for (dx, dy), coeff in self._poly.monomial_coefficients().items()}
386
+ return M_triangle(A(dict_dual), variables=(x, y))
387
+
388
+ def transmute(self):
389
+ """
390
+ Return the image of ``self`` by an involution.
391
+
392
+ OUTPUT: another M-triangle
393
+
394
+ The involution is defined by converting to an H-triangle,
395
+ transposing the matrix, and then converting back to an M-triangle.
396
+
397
+ EXAMPLES::
398
+
399
+ sage: from sage.combinat.triangles_FHM import M_triangle
400
+ sage: x, y = polygens(ZZ, 'x,y')
401
+ sage: nc3 = x^2*y^2 - 3*x*y^2 + 3*x*y + 2*y^2 - 3*y + 1
402
+ sage: m = M_triangle(nc3)
403
+ sage: m2 = m.transmute(); m2 # needs sage.libs.flint
404
+ M: 2*x^2*y^2 - 3*x*y^2 + 2*x*y + y^2 - 2*y + 1
405
+ sage: m2.transmute() == m # needs sage.libs.flint
406
+ True
407
+ """
408
+ return self.h().transpose().m()
409
+
410
+ def h(self):
411
+ """
412
+ Return the associated H-triangle.
413
+
414
+ EXAMPLES::
415
+
416
+ sage: from sage.combinat.triangles_FHM import M_triangle
417
+ sage: x, y = polygens(ZZ,'x,y')
418
+ sage: M_triangle(1-y+x*y).h()
419
+ H: x*y + 1
420
+
421
+ TESTS::
422
+
423
+ sage: h = polygen(ZZ, 'h')
424
+ sage: x, y = polygens(h.parent(),'x,y')
425
+ sage: mt = x**2*y**2+(-2*h+2)*x*y**2+(2*h-2)*x*y+(2*h-3)*y**2+(-2*h+2)*y+1
426
+ sage: M_triangle(mt, [x,y]).h()
427
+ H: x^2*y^2 + 2*x*y + (2*h - 4)*x + 1
428
+ """
429
+ x, y = self._vars
430
+ n = self._n
431
+ step = self._poly.subs({x: y / (y - 1),
432
+ y: (y - 1) * x / (1 + (y - 1) * x)})
433
+ step *= (1 + (y - 1) * x)**n
434
+ polyh = step.numerator()
435
+ return H_triangle(polyh, variables=(x, y))
436
+
437
+ def f(self):
438
+ """
439
+ Return the associated F-triangle.
440
+
441
+ EXAMPLES::
442
+
443
+ sage: from sage.combinat.triangles_FHM import M_triangle
444
+ sage: x, y = polygens(ZZ,'x,y')
445
+ sage: M_triangle(1-y+x*y).f()
446
+ F: x + y + 1
447
+
448
+ TESTS::
449
+
450
+ sage: h = polygen(ZZ, 'h')
451
+ sage: x, y = polygens(h.parent(),'x,y')
452
+ sage: mt = x**2*y**2+(-2*h+2)*x*y**2+(2*h-2)*x*y+(2*h-3)*y**2+(-2*h+2)*y+1
453
+ sage: M_triangle(mt, [x,y]).f()
454
+ F: (2*h - 3)*x^2 + 2*x*y + y^2 + (2*h - 2)*x + 2*y + 1
455
+ """
456
+ return self.h().f()
457
+
458
+
459
+ class H_triangle(Triangle):
460
+ """
461
+ Class for the H-triangles.
462
+ """
463
+ _prefix = 'H'
464
+
465
+ def transpose(self):
466
+ """
467
+ Return the transposed H-triangle.
468
+
469
+ OUTPUT: another H-triangle
470
+
471
+ This operation is an involution. When seen as a matrix, it
472
+ performs a symmetry with respect to the northwest-southeast
473
+ diagonal.
474
+
475
+ EXAMPLES::
476
+
477
+ sage: from sage.combinat.triangles_FHM import H_triangle
478
+ sage: x, y = polygens(ZZ,'x,y')
479
+ sage: H_triangle(1+x*y).transpose()
480
+ H: x*y + 1
481
+ sage: H_triangle(x^2*y^2 + 2*x*y + x + 1).transpose()
482
+ H: x^2*y^2 + x^2*y + 2*x*y + 1
483
+ """
484
+ x, y = self._vars
485
+ n = self._n
486
+ A = self._poly.parent()
487
+
488
+ dict_dual = {(n - dy, n - dx): coeff
489
+ for (dx, dy), coeff in self._poly.monomial_coefficients().items()}
490
+ return H_triangle(A(dict_dual), variables=(x, y))
491
+
492
+ def m(self):
493
+ """
494
+ Return the associated M-triangle.
495
+
496
+ EXAMPLES::
497
+
498
+ sage: from sage.combinat.triangles_FHM import H_triangle
499
+ sage: h = polygen(ZZ, 'h')
500
+ sage: x, y = polygens(h.parent(),'x,y')
501
+ sage: ht = H_triangle(x^2*y^2 + 2*x*y + 2*x*h - 4*x + 1, variables=[x,y])
502
+ sage: ht.m()
503
+ M: x^2*y^2 + (-2*h + 2)*x*y^2 + (2*h - 2)*x*y
504
+ + (2*h - 3)*y^2 + (-2*h + 2)*y + 1
505
+ """
506
+ x, y = self._vars
507
+ n = self._n
508
+ step = self._poly.subs({x: (x - 1) * y / (1 - y),
509
+ y: x / (x - 1)}) * (1 - y)**n
510
+ polym = step.numerator()
511
+ return M_triangle(polym, variables=(x, y))
512
+
513
+ def f(self):
514
+ """
515
+ Return the associated F-triangle.
516
+
517
+ EXAMPLES::
518
+
519
+ sage: from sage.combinat.triangles_FHM import H_triangle
520
+ sage: x, y = polygens(ZZ,'x,y')
521
+ sage: H_triangle(1+x*y).f()
522
+ F: x + y + 1
523
+ sage: H_triangle(x^2*y^2 + 2*x*y + x + 1).f()
524
+ F: 2*x^2 + 2*x*y + y^2 + 3*x + 2*y + 1
525
+ sage: flo = H_triangle(1+4*x+2*x**2+x*y*(4+8*x)+
526
+ ....: x**2*y**2*(6+4*x)+4*(x*y)**3+(x*y)**4).f(); flo
527
+ F: 7*x^4 + 12*x^3*y + 10*x^2*y^2 + 4*x*y^3 + y^4 + 20*x^3
528
+ + 28*x^2*y + 16*x*y^2 + 4*y^3 + 20*x^2 + 20*x*y
529
+ + 6*y^2 + 8*x + 4*y + 1
530
+ sage: flo(-1-x,-1-y) == flo
531
+ True
532
+
533
+ TESTS::
534
+
535
+ sage: x,y,h = polygens(ZZ,'x,y,h')
536
+ sage: ht = x^2*y^2 + 2*x*y + 2*x*h - 4*x + 1
537
+ sage: H_triangle(ht,[x,y]).f()
538
+ F: 2*x^2*h - 3*x^2 + 2*x*y + y^2 + 2*x*h - 2*x + 2*y + 1
539
+ """
540
+ x, y = self._vars
541
+ n = self._n
542
+ step1 = self._poly.subs({x: x / (1 + x), y: y}) * (x + 1)**n
543
+ step2 = step1.subs({x: x, y: y / x})
544
+ polyf = step2.numerator()
545
+ return F_triangle(polyf, variables=(x, y))
546
+
547
+ def gamma(self):
548
+ """
549
+ Return the associated Gamma-triangle.
550
+
551
+ In some cases, this is a more condensed way to encode
552
+ the same amount of information.
553
+
554
+ EXAMPLES::
555
+
556
+ sage: from sage.combinat.triangles_FHM import H_triangle
557
+ sage: x, y = polygen(ZZ,'x,y')
558
+ sage: ht = x**2*y**2 + 2*x*y + x + 1
559
+ sage: H_triangle(ht).gamma()
560
+ Γ: y^2 + x
561
+
562
+ sage: W = SymmetricGroup(5) # needs sage.groups
563
+ sage: P = posets.NoncrossingPartitions(W) # needs sage.graphs sage.groups
564
+ sage: P.M_triangle().h().gamma() # needs sage.graphs sage.groups
565
+ Γ: y^4 + 3*x*y^2 + 2*x^2 + 2*x*y + x
566
+ """
567
+ x, y = self._vars
568
+ n = self._n
569
+ remain = self._poly
570
+ gamma = x.parent().zero()
571
+ for k in range(n, -1, -1):
572
+ step = remain.coefficient({x: k})
573
+ gamma += x**(n - k) * step
574
+ remain -= x**(n - k) * step.homogenize(x)(x=1 + x, y=1 + x * y)
575
+ return Gamma_triangle(gamma, variables=(x, y))
576
+
577
+ def vector(self):
578
+ """
579
+ Return the h-vector as a polynomial in one variable.
580
+
581
+ This is obtained by letting `y=1`.
582
+
583
+ EXAMPLES::
584
+
585
+ sage: from sage.combinat.triangles_FHM import H_triangle
586
+ sage: x, y = polygen(ZZ,'x,y')
587
+ sage: ht = x**2*y**2 + 2*x*y + x + 1
588
+ sage: H_triangle(ht).vector()
589
+ x^2 + 3*x + 1
590
+ """
591
+ x, y = self._vars
592
+ anneau = PolynomialRing(ZZ, "x")
593
+ return anneau(self._poly.subs({y: 1}))
594
+
595
+
596
+ class F_triangle(Triangle):
597
+ """
598
+ Class for the F-triangles.
599
+ """
600
+ _prefix = 'F'
601
+
602
+ def h(self):
603
+ """
604
+ Return the associated H-triangle.
605
+
606
+ EXAMPLES::
607
+
608
+ sage: from sage.combinat.triangles_FHM import F_triangle
609
+ sage: x,y = polygens(ZZ,'x,y')
610
+ sage: ft = F_triangle(1+x+y)
611
+ sage: ft.h()
612
+ H: x*y + 1
613
+
614
+ TESTS::
615
+
616
+ sage: h = polygen(ZZ, 'h')
617
+ sage: x, y = polygens(h.parent(),'x,y')
618
+ sage: ft = 1+2*y+(2*h-2)*x+y**2+2*x*y+(2*h-3)*x**2
619
+ sage: F_triangle(ft, [x,y]).h()
620
+ H: x^2*y^2 + 2*x*y + (2*h - 4)*x + 1
621
+ """
622
+ x, y = self._vars
623
+ n = self._n
624
+ step = (1 - x)**n * self._poly.subs({x: x / (1 - x),
625
+ y: x * y / (1 - x)})
626
+ polyh = step.numerator()
627
+ return H_triangle(polyh, variables=(x, y))
628
+
629
+ def m(self):
630
+ """
631
+ Return the associated M-triangle.
632
+
633
+ EXAMPLES::
634
+
635
+ sage: from sage.combinat.triangles_FHM import H_triangle
636
+ sage: x, y = polygens(ZZ,'x,y')
637
+ sage: H_triangle(1+x*y).f()
638
+ F: x + y + 1
639
+ sage: _.m()
640
+ M: x*y - y + 1
641
+
642
+ sage: H_triangle(x^2*y^2 + 2*x*y + x + 1).f()
643
+ F: 2*x^2 + 2*x*y + y^2 + 3*x + 2*y + 1
644
+ sage: _.m()
645
+ M: x^2*y^2 - 3*x*y^2 + 3*x*y + 2*y^2 - 3*y + 1
646
+
647
+ TESTS::
648
+
649
+ sage: p = 1+4*x+2*x**2+x*y*(4+8*x)
650
+ sage: p += x**2*y**2*(6+4*x)+4*(x*y)**3+(x*y)**4
651
+ sage: flo = H_triangle(p).f(); flo
652
+ F: 7*x^4 + 12*x^3*y + 10*x^2*y^2 + 4*x*y^3 + y^4 + 20*x^3
653
+ + 28*x^2*y + 16*x*y^2 + 4*y^3 + 20*x^2 + 20*x*y
654
+ + 6*y^2 + 8*x + 4*y + 1
655
+ sage: flo.m()
656
+ M: x^4*y^4 - 8*x^3*y^4 + 8*x^3*y^3 + 20*x^2*y^4 - 36*x^2*y^3
657
+ - 20*x*y^4 + 16*x^2*y^2 + 48*x*y^3 + 7*y^4 - 36*x*y^2 - 20*y^3
658
+ + 8*x*y + 20*y^2 - 8*y + 1
659
+
660
+ sage: from sage.combinat.triangles_FHM import F_triangle
661
+ sage: h = polygen(ZZ, 'h')
662
+ sage: x, y = polygens(h.parent(),'x,y')
663
+ sage: ft = F_triangle(1+2*y+(2*h-2)*x+y**2+2*x*y+(2*h-3)*x**2,(x,y))
664
+ sage: ft.m()
665
+ M: x^2*y^2 + (-2*h + 2)*x*y^2 + (2*h - 2)*x*y
666
+ + (2*h - 3)*y^2 + (-2*h + 2)*y + 1
667
+ """
668
+ x, y = self._vars
669
+ n = self._n
670
+ step = self._poly.subs({x: y * (x - 1) / (1 - x * y),
671
+ y: x * y / (1 - x * y)})
672
+ step *= (1 - x * y)**n
673
+ polym = step.numerator()
674
+ return M_triangle(polym, variables=(x, y))
675
+
676
+ def parabolic(self):
677
+ """
678
+ Return a parabolic version of the F-triangle.
679
+
680
+ This is obtained by replacing the variable `y` by `y-1`.
681
+
682
+ EXAMPLES::
683
+
684
+ sage: from sage.combinat.triangles_FHM import H_triangle
685
+ sage: x, y = polygens(ZZ,'x,y')
686
+ sage: H_triangle(1+x*y).f()
687
+ F: x + y + 1
688
+ sage: _.parabolic()
689
+ F: x + y
690
+
691
+ TESTS::
692
+
693
+ sage: a, b = polygens(ZZ,'a,b')
694
+ sage: H_triangle(1+a*b).f()
695
+ F: a + b + 1
696
+ sage: _.parabolic()
697
+ F: a + b
698
+ """
699
+ x, y = self._vars
700
+ polyf = self._poly.subs({y: y - 1})
701
+ return F_triangle(polyf, variables=(x, y))
702
+
703
+ def vector(self):
704
+ """
705
+ Return the f-vector as a polynomial in one variable.
706
+
707
+ This is obtained by letting `y=x`.
708
+
709
+ EXAMPLES::
710
+
711
+ sage: from sage.combinat.triangles_FHM import F_triangle
712
+ sage: x, y = polygen(ZZ,'x,y')
713
+ sage: ft = 2*x^2 + 2*x*y + y^2 + 3*x + 2*y + 1
714
+ sage: F_triangle(ft).vector()
715
+ 5*x^2 + 5*x + 1
716
+ """
717
+ x, y = self._vars
718
+ anneau = PolynomialRing(ZZ, "x")
719
+ nx = anneau.gen()
720
+ return anneau(self._poly.subs({x: nx, y: nx}))
721
+
722
+
723
+ class Gamma_triangle(Triangle):
724
+ """
725
+ Class for the Gamma-triangles.
726
+ """
727
+ _prefix = 'Γ'
728
+
729
+ def h(self):
730
+ r"""
731
+ Return the associated H-triangle.
732
+
733
+ The transition between Gamma-triangles and H-triangles is defined by
734
+
735
+ .. MATH::
736
+
737
+ H(x,y) = (1+x)^d \sum_{0\leq i; 0\leq j \leq d-2i} \gamma_{i,j}
738
+ \left(\frac{x}{(1+x)^2}\right)^i \left(\frac{1+xy}{1+x}\right)^j
739
+
740
+ EXAMPLES::
741
+
742
+ sage: from sage.combinat.triangles_FHM import Gamma_triangle
743
+ sage: x, y = polygen(ZZ,'x,y')
744
+ sage: g = y**2 + x
745
+ sage: Gamma_triangle(g).h()
746
+ H: x^2*y^2 + 2*x*y + x + 1
747
+
748
+ sage: a, b = polygen(ZZ, 'a, b')
749
+ sage: x, y = polygens(a.parent(),'x,y')
750
+ sage: g = Gamma_triangle(y**3+a*x*y+b*x,(x,y))
751
+ sage: hh = g.h()
752
+ sage: hh.gamma() == g
753
+ True
754
+ """
755
+ x, y = self._vars
756
+ n = self._n
757
+ resu = (1 + x)**n * self._poly(x=x / (1 + x)**2,
758
+ y=(1 + x * y) / (1 + x))
759
+ polyh = resu.numerator()
760
+ return H_triangle(polyh, variables=(x, y))
761
+
762
+ def vector(self):
763
+ """
764
+ Return the gamma-vector as a polynomial in one variable.
765
+
766
+ This is obtained by letting `y=1`.
767
+
768
+ EXAMPLES::
769
+
770
+ sage: from sage.combinat.triangles_FHM import Gamma_triangle
771
+ sage: x, y = polygen(ZZ,'x,y')
772
+ sage: gt = y**2 + x
773
+ sage: Gamma_triangle(gt).vector()
774
+ x + 1
775
+ """
776
+ anneau = PolynomialRing(ZZ, 'x')
777
+ return anneau(self._poly(y=1))