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,593 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ """
4
+ Dual symmetric functions in non-commuting variables
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2013-08-04): initial version
9
+ """
10
+ # ****************************************************************************
11
+ # Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
12
+ #
13
+ # Distributed under the terms of the GNU General Public License (GPL)
14
+ # https://www.gnu.org/licenses/
15
+ # ****************************************************************************
16
+
17
+ from sage.arith.misc import factorial
18
+ from sage.categories.fields import Fields
19
+ from sage.categories.graded_hopf_algebras import GradedHopfAlgebras
20
+ from sage.categories.rings import Rings
21
+ from sage.combinat.free_module import CombinatorialFreeModule
22
+ from sage.combinat.ncsym.bases import NCSymBasis_abstract, NCSymDualBases
23
+ from sage.combinat.partition import Partition
24
+ from sage.combinat.set_partition import SetPartitions
25
+ from sage.combinat.sf.sf import SymmetricFunctions
26
+ from sage.combinat.subset import Subsets
27
+ from sage.misc.lazy_attribute import lazy_attribute
28
+ from sage.misc.misc_c import prod
29
+ from sage.structure.parent import Parent
30
+ from sage.structure.unique_representation import UniqueRepresentation
31
+
32
+
33
+ class SymmetricFunctionsNonCommutingVariablesDual(UniqueRepresentation, Parent):
34
+ r"""
35
+ The Hopf dual to the symmetric functions in non-commuting variables.
36
+
37
+ See Section 2.3 of [BZ05]_ for a study.
38
+ """
39
+
40
+ def __init__(self, R):
41
+ """
42
+ Initialize ``self``.
43
+
44
+ EXAMPLES::
45
+
46
+ sage: NCSymD1 = SymmetricFunctionsNonCommutingVariablesDual(FiniteField(23))
47
+ sage: NCSymD2 = SymmetricFunctionsNonCommutingVariablesDual(Integers(23))
48
+ sage: TestSuite(SymmetricFunctionsNonCommutingVariables(QQ).dual()).run()
49
+ """
50
+ # change the line below to assert R in Rings() once MRO issues from #15536, #15475 are resolved
51
+ assert R in Fields() or R in Rings() # side effect of this statement assures MRO exists for R
52
+ self._base = R # Won't be needed once CategoryObject won't override base_ring
53
+ category = GradedHopfAlgebras(R).Commutative()
54
+ Parent.__init__(self, category=category.WithRealizations())
55
+
56
+ # Bases
57
+ w = self.w()
58
+
59
+ # Embedding of Sym in the homogeneous bases into DNCSym in the w basis
60
+ Sym = SymmetricFunctions(self.base_ring())
61
+ Sym_h_to_w = Sym.h().module_morphism(w.sum_of_partitions,
62
+ triangular='lower',
63
+ inverse_on_support=w._set_par_to_par,
64
+ codomain=w, category=category)
65
+ Sym_h_to_w.register_as_coercion()
66
+ self.to_symmetric_function = Sym_h_to_w.section()
67
+
68
+ def _repr_(self):
69
+ r"""
70
+ EXAMPLES::
71
+
72
+ sage: SymmetricFunctionsNonCommutingVariables(ZZ).dual()
73
+ Dual symmetric functions in non-commuting variables over the Integer Ring
74
+ """
75
+ return "Dual symmetric functions in non-commuting variables over the %s" % self.base_ring()
76
+
77
+ def a_realization(self):
78
+ r"""
79
+ Return the realization of the `\mathbf{w}` basis of ``self``.
80
+
81
+ EXAMPLES::
82
+
83
+ sage: SymmetricFunctionsNonCommutingVariables(QQ).dual().a_realization()
84
+ Dual symmetric functions in non-commuting variables over the Rational Field in the w basis
85
+ """
86
+ return self.w()
87
+
88
+ _shorthands = ('w',)
89
+
90
+ def dual(self):
91
+ r"""
92
+ Return the dual Hopf algebra of the dual symmetric functions in
93
+ non-commuting variables.
94
+
95
+ EXAMPLES::
96
+
97
+ sage: NCSymD = SymmetricFunctionsNonCommutingVariables(QQ).dual()
98
+ sage: NCSymD.dual()
99
+ Symmetric functions in non-commuting variables over the Rational Field
100
+ """
101
+ from sage.combinat.ncsym.ncsym import SymmetricFunctionsNonCommutingVariables
102
+ return SymmetricFunctionsNonCommutingVariables(self.base_ring())
103
+
104
+ class w(NCSymBasis_abstract):
105
+ r"""
106
+ The dual Hopf algebra of symmetric functions in non-commuting variables
107
+ in the `\mathbf{w}` basis.
108
+
109
+ EXAMPLES::
110
+
111
+ sage: NCSymD = SymmetricFunctionsNonCommutingVariables(QQ).dual()
112
+ sage: w = NCSymD.w()
113
+
114
+ We have the embedding `\chi^*` of `Sym` into `NCSym^*` available as
115
+ a coercion::
116
+
117
+ sage: h = SymmetricFunctions(QQ).h()
118
+ sage: w(h[2,1])
119
+ w{{1}, {2, 3}} + w{{1, 2}, {3}} + w{{1, 3}, {2}}
120
+
121
+ Similarly we can pull back when we are in the image of `\chi^*`::
122
+
123
+ sage: elt = 3*(w[[1],[2,3]] + w[[1,2],[3]] + w[[1,3],[2]])
124
+ sage: h(elt)
125
+ 3*h[2, 1]
126
+ """
127
+
128
+ def __init__(self, NCSymD):
129
+ """
130
+ EXAMPLES::
131
+
132
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
133
+ sage: TestSuite(w).run()
134
+ """
135
+ def key_func_set_part(A):
136
+ return sorted(map(sorted, A))
137
+
138
+ R = NCSymD.base_ring()
139
+ category = GradedHopfAlgebras(R).Commutative()
140
+ category &= NCSymDualBases(NCSymD)
141
+ CombinatorialFreeModule.__init__(self, R, SetPartitions(),
142
+ prefix='w', bracket=False,
143
+ sorting_key=key_func_set_part,
144
+ category=category)
145
+
146
+ @lazy_attribute
147
+ def to_symmetric_function(self):
148
+ r"""
149
+ The preimage of `\chi^*` in the `\mathbf{w}` basis.
150
+
151
+ EXAMPLES::
152
+
153
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
154
+ sage: w.to_symmetric_function
155
+ Generic morphism:
156
+ From: Dual symmetric functions in non-commuting variables over the Rational Field in the w basis
157
+ To: Symmetric Functions over Rational Field in the homogeneous basis
158
+ """
159
+ return self.realization_of().to_symmetric_function
160
+
161
+ def dual_basis(self):
162
+ r"""
163
+ Return the dual basis to the `\mathbf{w}` basis.
164
+
165
+ The dual basis to the `\mathbf{w}` basis is the monomial basis
166
+ of the symmetric functions in non-commuting variables.
167
+
168
+ OUTPUT: the monomial basis of the symmetric functions in
169
+ non-commuting variables
170
+
171
+ EXAMPLES::
172
+
173
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
174
+ sage: w.dual_basis()
175
+ Symmetric functions in non-commuting variables over the Rational Field in the monomial basis
176
+ """
177
+ return self.realization_of().dual().m()
178
+
179
+ def product_on_basis(self, A, B):
180
+ r"""
181
+ The product on `\mathbf{w}` basis elements.
182
+
183
+ The product on the `\mathbf{w}` is the dual to the coproduct on the
184
+ `\mathbf{m}` basis. On the basis `\mathbf{w}` it is defined as
185
+
186
+ .. MATH::
187
+
188
+ \mathbf{w}_A \mathbf{w}_B = \sum_{S \subseteq [n]}
189
+ \mathbf{w}_{A\uparrow_S \cup B\uparrow_{S^c}}
190
+
191
+ where the sum is over all possible subsets `S` of `[n]` such that
192
+ `|S| = |A|` with a term indexed the union of `A \uparrow_S` and
193
+ `B \uparrow_{S^c}`. The notation `A \uparrow_S` represents the
194
+ unique set partition of the set `S` such that the standardization
195
+ is `A`. This product is commutative.
196
+
197
+ INPUT:
198
+
199
+ - ``A``, ``B`` -- set partitions
200
+
201
+ OUTPUT: an element of the `\mathbf{w}` basis
202
+
203
+ EXAMPLES::
204
+
205
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
206
+ sage: A = SetPartition([[1], [2,3]])
207
+ sage: B = SetPartition([[1, 2, 3]])
208
+ sage: w.product_on_basis(A, B)
209
+ w{{1}, {2, 3}, {4, 5, 6}} + w{{1}, {2, 3, 4}, {5, 6}}
210
+ + w{{1}, {2, 3, 5}, {4, 6}} + w{{1}, {2, 3, 6}, {4, 5}}
211
+ + w{{1}, {2, 4}, {3, 5, 6}} + w{{1}, {2, 4, 5}, {3, 6}}
212
+ + w{{1}, {2, 4, 6}, {3, 5}} + w{{1}, {2, 5}, {3, 4, 6}}
213
+ + w{{1}, {2, 5, 6}, {3, 4}} + w{{1}, {2, 6}, {3, 4, 5}}
214
+ + w{{1, 2, 3}, {4}, {5, 6}} + w{{1, 2, 4}, {3}, {5, 6}}
215
+ + w{{1, 2, 5}, {3}, {4, 6}} + w{{1, 2, 6}, {3}, {4, 5}}
216
+ + w{{1, 3, 4}, {2}, {5, 6}} + w{{1, 3, 5}, {2}, {4, 6}}
217
+ + w{{1, 3, 6}, {2}, {4, 5}} + w{{1, 4, 5}, {2}, {3, 6}}
218
+ + w{{1, 4, 6}, {2}, {3, 5}} + w{{1, 5, 6}, {2}, {3, 4}}
219
+ sage: B = SetPartition([[1], [2]])
220
+ sage: w.product_on_basis(A, B)
221
+ 3*w{{1}, {2}, {3}, {4, 5}} + 2*w{{1}, {2}, {3, 4}, {5}}
222
+ + 2*w{{1}, {2}, {3, 5}, {4}} + w{{1}, {2, 3}, {4}, {5}}
223
+ + w{{1}, {2, 4}, {3}, {5}} + w{{1}, {2, 5}, {3}, {4}}
224
+ sage: w.product_on_basis(A, SetPartition([]))
225
+ w{{1}, {2, 3}}
226
+ """
227
+ if not A:
228
+ return self.monomial(B)
229
+ if not B:
230
+ return self.monomial(A)
231
+
232
+ P = SetPartitions()
233
+ n = A.size()
234
+ m = n + B.size()
235
+
236
+ def unions(s):
237
+ a = sorted(s)
238
+ b = [j for j in range(1, m + 1) if j not in s]
239
+ # -1 for indexing
240
+ ret = [[a[i - 1] for i in sorted(part)] for part in A]
241
+ ret.extend([b[i - 1] for i in sorted(part)] for part in B)
242
+ return P(ret)
243
+
244
+ return self.sum_of_terms([(unions(s), 1)
245
+ for s in Subsets(m, n)])
246
+
247
+ def coproduct_on_basis(self, A):
248
+ r"""
249
+ Return the coproduct of a `\mathbf{w}` basis element.
250
+
251
+ The coproduct on the basis element `\mathbf{w}_A` is the sum over
252
+ tensor product terms `\mathbf{w}_B \otimes \mathbf{w}_C` where
253
+ `B` is the restriction of `A` to `\{1,2,\ldots,k\}` and `C` is
254
+ the restriction of `A` to `\{k+1, k+2, \ldots, n\}`.
255
+
256
+ INPUT:
257
+
258
+ - ``A`` -- set partition
259
+
260
+ OUTPUT:
261
+
262
+ - The coproduct applied to the `\mathbf{w}` dual symmetric function
263
+ in non-commuting variables indexed by ``A`` expressed in the
264
+ `\mathbf{w}` basis.
265
+
266
+ EXAMPLES::
267
+
268
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
269
+ sage: w[[1], [2,3]].coproduct()
270
+ w{} # w{{1}, {2, 3}} + w{{1}} # w{{1, 2}}
271
+ + w{{1}, {2}} # w{{1}} + w{{1}, {2, 3}} # w{}
272
+ sage: w.coproduct_on_basis(SetPartition([]))
273
+ w{} # w{}
274
+ """
275
+ n = A.size()
276
+ return self.tensor_square().sum_of_terms([
277
+ ((A.restriction(range(1, i + 1)).standardization(),
278
+ A.restriction(range(i + 1, n + 1)).standardization()), 1)
279
+ for i in range(n + 1)], distinct=True)
280
+
281
+ def antipode_on_basis(self, A):
282
+ r"""
283
+ Return the antipode applied to the basis element indexed by ``A``.
284
+
285
+ INPUT:
286
+
287
+ - ``A`` -- set partition
288
+
289
+ OUTPUT: an element in the basis ``self``
290
+
291
+ EXAMPLES::
292
+
293
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
294
+ sage: w.antipode_on_basis(SetPartition([[1],[2,3]]))
295
+ -3*w{{1}, {2}, {3}} + w{{1, 2}, {3}} + w{{1, 3}, {2}}
296
+ sage: F = w[[1,3],[5],[2,4]].coproduct()
297
+ sage: F.apply_multilinear_morphism(lambda x,y: x.antipode()*y)
298
+ 0
299
+ """
300
+ if A.size() == 0:
301
+ return self.one()
302
+ if A.size() == 1:
303
+ return -self(A)
304
+ cpr = self.coproduct_on_basis(A)
305
+ return -sum(c * self.monomial(B1) * self.antipode_on_basis(B2)
306
+ for (B1, B2), c in cpr if B2 != A)
307
+
308
+ def duality_pairing(self, x, y):
309
+ r"""
310
+ Compute the pairing between an element of ``self`` and an
311
+ element of the dual.
312
+
313
+ INPUT:
314
+
315
+ - ``x`` -- an element of the dual of symmetric functions in
316
+ non-commuting variables
317
+ - ``y`` -- an element of the symmetric functions in non-commuting
318
+ variables
319
+
320
+ OUTPUT: an element of the base ring of ``self``
321
+
322
+ EXAMPLES::
323
+
324
+ sage: DNCSym = SymmetricFunctionsNonCommutingVariablesDual(QQ)
325
+ sage: w = DNCSym.w()
326
+ sage: m = w.dual_basis()
327
+ sage: matrix([[w(A).duality_pairing(m(B)) for A in SetPartitions(3)] for B in SetPartitions(3)])
328
+ [1 0 0 0 0]
329
+ [0 1 0 0 0]
330
+ [0 0 1 0 0]
331
+ [0 0 0 1 0]
332
+ [0 0 0 0 1]
333
+ sage: (w[[1,2],[3]] + 3*w[[1,3],[2]]).duality_pairing(2*m[[1,3],[2]] + m[[1,2,3]] + 2*m[[1,2],[3]])
334
+ 8
335
+ sage: h = SymmetricFunctionsNonCommutingVariables(QQ).h()
336
+ sage: matrix([[w(A).duality_pairing(h(B)) for A in SetPartitions(3)] for B in SetPartitions(3)])
337
+ [6 2 2 2 1]
338
+ [2 2 1 1 1]
339
+ [2 1 2 1 1]
340
+ [2 1 1 2 1]
341
+ [1 1 1 1 1]
342
+ sage: (2*w[[1,3],[2]] + w[[1,2,3]] + 2*w[[1,2],[3]]).duality_pairing(h[[1,2],[3]] + 3*h[[1,3],[2]])
343
+ 32
344
+ """
345
+ x = self(x)
346
+ y = self.dual_basis()(y)
347
+ return sum(coeff * y[I] for I, coeff in x)
348
+
349
+ def sum_of_partitions(self, la):
350
+ r"""
351
+ Return the sum over all sets partitions whose shape is ``la``,
352
+ scaled by `\prod_i m_i!` where `m_i` is the multiplicity
353
+ of `i` in ``la``.
354
+
355
+ INPUT:
356
+
357
+ - ``la`` -- integer partition
358
+
359
+ OUTPUT: an element of ``self``
360
+
361
+ EXAMPLES::
362
+
363
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
364
+ sage: w.sum_of_partitions([2,1,1])
365
+ 2*w{{1}, {2}, {3, 4}} + 2*w{{1}, {2, 3}, {4}} + 2*w{{1}, {2, 4}, {3}}
366
+ + 2*w{{1, 2}, {3}, {4}} + 2*w{{1, 3}, {2}, {4}} + 2*w{{1, 4}, {2}, {3}}
367
+ """
368
+ la = Partition(la)
369
+ c = prod([factorial(i) for i in la.to_exp()])
370
+ P = SetPartitions()
371
+ return self.sum_of_terms([(P(m), c) for m in SetPartitions(sum(la), la)], distinct=True)
372
+
373
+ def _set_par_to_par(self, A):
374
+ r"""
375
+ Return the shape of ``A`` if ``A`` is the canonical standard
376
+ set partition `A_1 | A_2 | \cdots | A_k` where `|` is the pipe
377
+ operation (see
378
+ :meth:`~sage.combinat.set_partition.SetPartition.pipe()` )
379
+ and `A_i = [\lambda_i]` where `\lambda_1 \leq \lambda_2 \leq
380
+ \cdots \leq \lambda_k`. Otherwise, return ``None``.
381
+
382
+ This is the trailing term of `h_{\lambda}` mapped by `\chi` to
383
+ the `\mathbf{w}` basis and is used by the coercion framework to
384
+ construct the preimage `\chi^{-1}`.
385
+
386
+ INPUT:
387
+
388
+ - ``A`` -- set partition
389
+
390
+ EXAMPLES::
391
+
392
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
393
+ sage: w._set_par_to_par(SetPartition([[1], [2], [3,4,5]]))
394
+ [3, 1, 1]
395
+ sage: w._set_par_to_par(SetPartition([[1,2,3],[4],[5]]))
396
+ sage: w._set_par_to_par(SetPartition([[1],[2,3,4],[5]]))
397
+ sage: w._set_par_to_par(SetPartition([[1],[2,3,5],[4]]))
398
+
399
+ TESTS:
400
+
401
+ This is used in the coercion between `\mathbf{w}` and the
402
+ homogeneous symmetric functions. ::
403
+
404
+ sage: w = SymmetricFunctionsNonCommutingVariablesDual(QQ).w()
405
+ sage: h = SymmetricFunctions(QQ).h()
406
+ sage: h(w[[1,3],[2]])
407
+ Traceback (most recent call last):
408
+ ...
409
+ ValueError: w{{1, 3}, {2}} is not in the image
410
+ sage: h(w(h[2,1])) == w(h[2,1]).to_symmetric_function()
411
+ True
412
+ """
413
+ cur = 1
414
+ prev_len = 0
415
+ for p in A:
416
+ if prev_len > len(p) or list(p) != list(range(cur, cur + len(p))):
417
+ return None
418
+ prev_len = len(p)
419
+ cur += len(p)
420
+ return A.shape()
421
+
422
+ class Element(CombinatorialFreeModule.Element):
423
+ r"""
424
+ An element in the `\mathbf{w}` basis.
425
+ """
426
+
427
+ def expand(self, n, letter='x'):
428
+ r"""
429
+ Expand ``self`` written in the `\mathbf{w}` basis in `n^2`
430
+ commuting variables which satisfy the relation
431
+ `x_{ij} x_{ik} = 0` for all `i`, `j`, and `k`.
432
+
433
+ The expansion of an element of the `\mathbf{w}` basis is
434
+ given by equations (26) and (55) in [HNT06]_.
435
+
436
+ INPUT:
437
+
438
+ - ``n`` -- integer
439
+ - ``letter`` -- string (default: ``'x'``)
440
+
441
+ OUTPUT:
442
+
443
+ - The symmetric function of ``self`` expressed in the ``n*n``
444
+ non-commuting variables described by ``letter``.
445
+
446
+ REFERENCES:
447
+
448
+ .. [HNT06] \F. Hivert, J.-C. Novelli, J.-Y. Thibon.
449
+ *Commutative combinatorial Hopf algebras*. (2006).
450
+ :arxiv:`0605262v1`.
451
+
452
+ EXAMPLES::
453
+
454
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
455
+ sage: w[[1,3],[2]].expand(4)
456
+ x02*x11*x20 + x03*x11*x30 + x03*x22*x30 + x13*x22*x31
457
+
458
+ One can use a different set of variable by using the
459
+ optional argument ``letter``::
460
+
461
+ sage: w[[1,3],[2]].expand(3, letter='y')
462
+ y02*y11*y20
463
+ """
464
+ from sage.combinat.permutation import Permutations
465
+ from sage.rings.polynomial.polynomial_ring_constructor import (
466
+ PolynomialRing,
467
+ )
468
+
469
+ m = self.parent()
470
+ names = [f'{letter}{i}{j}' for i in range(n) for j in range(n)]
471
+ R = PolynomialRing(m.base_ring(), n * n, names)
472
+ x = [[R.gens()[i * n + j]
473
+ for j in range(n)] for i in range(n)]
474
+ I = R.ideal([x[i][j] * x[i][k]
475
+ for j in range(n) for k in range(n) for i in range(n)])
476
+ Q = R.quotient(I, names)
477
+ x = [[Q.gens()[i * n + j]
478
+ for j in range(n)] for i in range(n)]
479
+ P = SetPartitions()
480
+
481
+ def on_basis(A):
482
+ k = A.size()
483
+ ret = R.zero()
484
+ if n < k:
485
+ return ret
486
+
487
+ for p in Permutations(k):
488
+ if P(p.to_cycles()) == A:
489
+ # -1 for indexing
490
+ ret += R.sum(prod(x[I[i]][I[p[i] - 1]]
491
+ for i in range(k))
492
+ for I in Subsets(range(n), k))
493
+ return ret
494
+
495
+ return m._apply_module_morphism(self, on_basis, codomain=R)
496
+
497
+ def is_symmetric(self):
498
+ r"""
499
+ Determine if a `NCSym^*` function, expressed in the
500
+ `\mathbf{w}` basis, is symmetric.
501
+
502
+ A function `f` in the `\mathbf{w}` basis is a symmetric
503
+ function if it is in the image of `\chi^*`. That is to say we
504
+ have
505
+
506
+ .. MATH::
507
+
508
+ f = \sum_{\lambda} c_{\lambda} \prod_i m_i(\lambda)!
509
+ \sum_{\lambda(A) = \lambda} \mathbf{w}_A
510
+
511
+ where the second sum is over all set partitions `A` whose
512
+ shape `\lambda(A)` is equal to `\lambda` and `m_i(\mu)` is
513
+ the multiplicity of `i` in the partition `\mu`.
514
+
515
+ OUTPUT:
516
+
517
+ - ``True`` if `\lambda(A)=\lambda(B)` implies the coefficients of
518
+ `\mathbf{w}_A` and `\mathbf{w}_B` are equal, ``False`` otherwise
519
+
520
+ EXAMPLES::
521
+
522
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
523
+ sage: elt = w.sum_of_partitions([2,1,1])
524
+ sage: elt.is_symmetric()
525
+ True
526
+ sage: elt -= 3*w.sum_of_partitions([1,1])
527
+ sage: elt.is_symmetric()
528
+ True
529
+ sage: w = SymmetricFunctionsNonCommutingVariables(ZZ).dual().w()
530
+ sage: elt = w.sum_of_partitions([2,1,1]) / 2
531
+ sage: elt.is_symmetric()
532
+ False
533
+ sage: elt = w[[1,3],[2]]
534
+ sage: elt.is_symmetric()
535
+ False
536
+ sage: elt = w[[1],[2,3]] + w[[1,2],[3]] + 2*w[[1,3],[2]]
537
+ sage: elt.is_symmetric()
538
+ False
539
+ """
540
+ d = {}
541
+ R = self.base_ring()
542
+ for A, coeff in self:
543
+ la = A.shape()
544
+ exp = prod([factorial(i) for i in la.to_exp()])
545
+ if la not in d:
546
+ if coeff / exp not in R:
547
+ return False
548
+ d[la] = [coeff, 1]
549
+ else:
550
+ if d[la][0] != coeff:
551
+ return False
552
+ d[la][1] += 1
553
+ # Make sure we've seen each set partition of the shape
554
+ return all(d[la][1] == SetPartitions(la.size(), la).cardinality() for la in d)
555
+
556
+ def to_symmetric_function(self):
557
+ r"""
558
+ Take a function in the `\mathbf{w}` basis, and return its
559
+ symmetric realization, when possible, expressed in the
560
+ homogeneous basis of symmetric functions.
561
+
562
+ OUTPUT:
563
+
564
+ - If ``self`` is a symmetric function, then the expansion
565
+ in the homogeneous basis of the symmetric functions is returned.
566
+ Otherwise an error is raised.
567
+
568
+ EXAMPLES::
569
+
570
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
571
+ sage: elt = w[[1],[2,3]] + w[[1,2],[3]] + w[[1,3],[2]]
572
+ sage: elt.to_symmetric_function()
573
+ h[2, 1]
574
+ sage: elt = w.sum_of_partitions([2,1,1]) / 2
575
+ sage: elt.to_symmetric_function()
576
+ 1/2*h[2, 1, 1]
577
+
578
+ TESTS::
579
+
580
+ sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
581
+ sage: w(0).to_symmetric_function()
582
+ 0
583
+ sage: w([]).to_symmetric_function()
584
+ h[]
585
+ sage: (2*w([])).to_symmetric_function()
586
+ 2*h[]
587
+ """
588
+ if not self.is_symmetric():
589
+ raise ValueError("not a symmetric function")
590
+ h = SymmetricFunctions(self.parent().base_ring()).homogeneous()
591
+ d = {A.shape(): c for A, c in self}
592
+ return h.sum_of_terms([(AA, cc / prod(factorial(i) for i in AA.to_exp()))
593
+ for AA, cc in d.items()], distinct=True)