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,652 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ """
3
+ Lyndon words
4
+ """
5
+ # ****************************************************************************
6
+ # Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>
7
+ #
8
+ # This program is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ # https://www.gnu.org/licenses/
13
+ # ****************************************************************************
14
+
15
+ from sage.arith.misc import divisors, gcd, moebius, multinomial
16
+ from sage.combinat.combinat_cython import lyndon_word_iterator
17
+ from sage.combinat.composition import Composition, Compositions
18
+ from sage.combinat.necklace import _sfc
19
+ from sage.combinat.words.finite_word import FiniteWord_class
20
+ from sage.combinat.words.words import FiniteWords
21
+ from sage.rings.integer import Integer
22
+ from sage.structure.parent import Parent
23
+ from sage.structure.unique_representation import UniqueRepresentation
24
+
25
+
26
+ def LyndonWords(e=None, k=None):
27
+ """
28
+ Return the combinatorial class of Lyndon words.
29
+
30
+ A Lyndon word `w` is a word that is lexicographically less than all of
31
+ its rotations. Equivalently, whenever `w` is split into two non-empty
32
+ substrings, `w` is lexicographically less than the right substring.
33
+
34
+ See :wikipedia:`Lyndon_word`
35
+
36
+ INPUT:
37
+
38
+ - no input at all
39
+
40
+ or
41
+
42
+ - ``e`` -- integer; size of alphabet
43
+ - ``k`` -- integer; length of the words
44
+
45
+ or
46
+
47
+ - ``e`` -- a composition
48
+
49
+ OUTPUT: a combinatorial class of Lyndon words
50
+
51
+ EXAMPLES::
52
+
53
+ sage: LyndonWords()
54
+ Lyndon words
55
+
56
+ If e is an integer, then e specifies the length of the
57
+ alphabet; k must also be specified in this case::
58
+
59
+ sage: LW = LyndonWords(3, 4); LW
60
+ Lyndon words from an alphabet of size 3 of length 4
61
+ sage: LW.first()
62
+ word: 1112
63
+ sage: LW.last()
64
+ word: 2333
65
+ sage: LW.random_element() # random # needs sage.libs.pari
66
+ word: 1232
67
+ sage: LW.cardinality() # needs sage.libs.pari
68
+ 18
69
+
70
+ If e is a (weak) composition, then it returns the class of Lyndon
71
+ words that have evaluation e::
72
+
73
+ sage: LyndonWords([2, 0, 1]).list()
74
+ [word: 113]
75
+ sage: LyndonWords([2, 0, 1, 0, 1]).list()
76
+ [word: 1135, word: 1153, word: 1315]
77
+ sage: LyndonWords([2, 1, 1]).list()
78
+ [word: 1123, word: 1132, word: 1213]
79
+ """
80
+ if e is None and k is None:
81
+ return LyndonWords_class()
82
+ elif isinstance(e, (int, Integer)):
83
+ if e > 0:
84
+ if not isinstance(k, (int, Integer)):
85
+ raise TypeError("k must be a nonnegative integer")
86
+ if k < 0:
87
+ raise TypeError("k must be a nonnegative integer")
88
+ return LyndonWords_nk(Integer(e), Integer(k))
89
+ elif e in Compositions():
90
+ return LyndonWords_evaluation(Composition(e))
91
+
92
+ raise TypeError("e must be a positive integer or a composition")
93
+
94
+
95
+ def LyndonWord(data, check=True):
96
+ r"""
97
+ Construction of a Lyndon word.
98
+
99
+ INPUT:
100
+
101
+ - ``data`` -- list
102
+ - ``check`` -- boolean (default: ``True``); if ``True``,
103
+ check that the input data represents a Lyndon word
104
+
105
+ OUTPUT: a Lyndon word
106
+
107
+ EXAMPLES::
108
+
109
+ sage: LyndonWord([1,2,2])
110
+ word: 122
111
+ sage: LyndonWord([1,2,3])
112
+ word: 123
113
+ sage: LyndonWord([2,1,2,3])
114
+ Traceback (most recent call last):
115
+ ...
116
+ ValueError: not a Lyndon word
117
+
118
+ If ``check`` is ``False``, then no verification is done::
119
+
120
+ sage: LyndonWord([2,1,2,3], check=False)
121
+ word: 2123
122
+ """
123
+ return LyndonWords()(data, check=check)
124
+
125
+
126
+ class LyndonWords_class(UniqueRepresentation, Parent):
127
+ r"""
128
+ The set of all Lyndon words.
129
+ """
130
+ def __init__(self, alphabet=None):
131
+ r"""
132
+ INPUT:
133
+
134
+ - ``alphabet`` -- the underlying alphabet
135
+
136
+ TESTS::
137
+
138
+ sage: loads(dumps(LyndonWords())) is LyndonWords()
139
+ True
140
+ """
141
+ from sage.categories.sets_cat import Sets
142
+ self._words = FiniteWords()
143
+ Parent.__init__(self, category=Sets().Infinite(), facade=(self._words))
144
+
145
+ def __call__(self, *args, **kwds):
146
+ r"""
147
+ TESTS::
148
+
149
+ sage: L = LyndonWords()
150
+ sage: L('aababc')
151
+ word: aababc
152
+ sage: L([2,0,1])
153
+ Traceback (most recent call last):
154
+ ...
155
+ ValueError: not a Lyndon word
156
+ """
157
+ w = self._words(*args, **kwds)
158
+ if kwds.get('check', True) and not w.is_lyndon():
159
+ raise ValueError("not a Lyndon word")
160
+ return w
161
+
162
+ def __repr__(self):
163
+ r"""
164
+ String representation.
165
+
166
+ EXAMPLES::
167
+
168
+ sage: LyndonWords()
169
+ Lyndon words
170
+ """
171
+ return "Lyndon words"
172
+
173
+ def __contains__(self, w):
174
+ """
175
+ TESTS::
176
+
177
+ sage: LW33 = LyndonWords(3,3)
178
+ sage: all(lw in LyndonWords() for lw in LW33)
179
+ True
180
+ """
181
+ if isinstance(w, list):
182
+ w = self._words(w, check=False)
183
+ return isinstance(w, FiniteWord_class) and w.is_lyndon()
184
+
185
+
186
+ class LyndonWords_evaluation(UniqueRepresentation, Parent):
187
+ r"""
188
+ The set of Lyndon words on a fixed multiset of letters.
189
+
190
+ EXAMPLES::
191
+
192
+ sage: L = LyndonWords([1,2,1])
193
+ sage: L
194
+ Lyndon words with evaluation [1, 2, 1]
195
+ sage: L.list()
196
+ [word: 1223, word: 1232, word: 1322]
197
+ """
198
+ def __init__(self, e):
199
+ """
200
+ TESTS::
201
+
202
+ sage: LW21 = LyndonWords([2,1]); LW21
203
+ Lyndon words with evaluation [2, 1]
204
+ sage: LW21 == loads(dumps(LW21))
205
+ True
206
+ """
207
+ self._e = e
208
+ self._words = FiniteWords(len(e))
209
+
210
+ from sage.categories.enumerated_sets import EnumeratedSets
211
+ Parent.__init__(self,
212
+ category=EnumeratedSets().Finite(),
213
+ facade=(self._words,)
214
+ )
215
+
216
+ def __repr__(self):
217
+ """
218
+ TESTS::
219
+
220
+ sage: repr(LyndonWords([2,1,1]))
221
+ 'Lyndon words with evaluation [2, 1, 1]'
222
+ """
223
+ return "Lyndon words with evaluation %s" % self._e
224
+
225
+ def __call__(self, *args, **kwds):
226
+ r"""
227
+ TESTS::
228
+
229
+ sage: L = LyndonWords([1,2,1])
230
+ sage: L([1,2,2,3])
231
+ word: 1223
232
+ sage: L([2,1,2,3])
233
+ Traceback (most recent call last):
234
+ ...
235
+ ValueError: not a Lyndon word
236
+ sage: L([1,2])
237
+ Traceback (most recent call last):
238
+ ...
239
+ ValueError: evaluation is not [1, 2, 1]
240
+ """
241
+ w = self._words(*args, **kwds)
242
+ if kwds.get('check', True) and not w.is_lyndon():
243
+ raise ValueError("not a Lyndon word")
244
+ if kwds.get('check', True) and w.evaluation() != self._e:
245
+ raise ValueError("evaluation is not {}".format(self._e))
246
+ return w
247
+
248
+ def __contains__(self, w):
249
+ """
250
+ EXAMPLES::
251
+
252
+ sage: [1,2,1,2] in LyndonWords([2,2])
253
+ False
254
+ sage: [1,1,2,2] in LyndonWords([2,2])
255
+ True
256
+ sage: all(lw in LyndonWords([2,1,3,1]) for lw in LyndonWords([2,1,3,1]))
257
+ True
258
+ """
259
+ if isinstance(w, list):
260
+ w = self._words(w, check=False)
261
+ if isinstance(w, FiniteWord_class) and all(x in self._words.alphabet() for x in w):
262
+ ev_dict = w.evaluation_dict()
263
+ evaluation = [ev_dict.get(x, 0) for x in self._words.alphabet()]
264
+ return evaluation == self._e and w.is_lyndon()
265
+ else:
266
+ return False
267
+
268
+ def cardinality(self):
269
+ """
270
+ Return the number of Lyndon words with the evaluation e.
271
+
272
+ EXAMPLES::
273
+
274
+ sage: LyndonWords([]).cardinality()
275
+ 0
276
+ sage: LyndonWords([2,2]).cardinality() # needs sage.libs.pari
277
+ 1
278
+ sage: LyndonWords([2,3,2]).cardinality() # needs sage.libs.pari
279
+ 30
280
+
281
+ Check to make sure that the count matches up with the number of
282
+ Lyndon words generated::
283
+
284
+ sage: comps = [[],[2,2],[3,2,7],[4,2]] + Compositions(4).list()
285
+ sage: lws = [LyndonWords(comp) for comp in comps]
286
+ sage: all(lw.cardinality() == len(lw.list()) for lw in lws) # needs sage.libs.pari
287
+ True
288
+ """
289
+ evaluation = self._e
290
+ le = list(evaluation)
291
+ if not evaluation:
292
+ return Integer(0)
293
+ n = sum(evaluation)
294
+ return sum(moebius(j) * multinomial([ni // j for ni in evaluation])
295
+ for j in divisors(gcd(le))) // n
296
+
297
+ def __iter__(self):
298
+ """
299
+ An iterator for the Lyndon words with evaluation e.
300
+
301
+ EXAMPLES::
302
+
303
+ sage: LyndonWords([1]).list() #indirect doctest
304
+ [word: 1]
305
+ sage: LyndonWords([2]).list() #indirect doctest
306
+ []
307
+ sage: LyndonWords([3]).list() #indirect doctest
308
+ []
309
+ sage: LyndonWords([3,1]).list() #indirect doctest
310
+ [word: 1112]
311
+ sage: LyndonWords([2,2]).list() #indirect doctest
312
+ [word: 1122]
313
+ sage: LyndonWords([1,3]).list() #indirect doctest
314
+ [word: 1222]
315
+ sage: LyndonWords([3,3]).list() #indirect doctest
316
+ [word: 111222, word: 112122, word: 112212]
317
+ sage: LyndonWords([4,3]).list() #indirect doctest
318
+ [word: 1111222, word: 1112122, word: 1112212, word: 1121122, word: 1121212]
319
+
320
+ TESTS:
321
+
322
+ Check that :issue:`12997` is fixed::
323
+
324
+ sage: LyndonWords([0,1]).list()
325
+ [word: 2]
326
+ sage: LyndonWords([0,2]).list()
327
+ []
328
+ sage: LyndonWords([0,0,1,0,1]).list()
329
+ [word: 35]
330
+ """
331
+ if not self._e:
332
+ return
333
+ k = 0
334
+ while self._e[k] == 0:
335
+ k += 1
336
+ for z in _sfc(self._e[k:], equality=True):
337
+ yield self._words([i + k + 1 for i in z], check=False)
338
+
339
+
340
+ class LyndonWords_nk(UniqueRepresentation, Parent):
341
+ r"""
342
+ Lyndon words of fixed length `k` over the alphabet `\{1, 2, \ldots, n\}`.
343
+
344
+ INPUT:
345
+
346
+ - ``n`` -- the size of the alphabet
347
+ - ``k`` -- the length of the words
348
+
349
+ EXAMPLES::
350
+
351
+ sage: L = LyndonWords(3, 4)
352
+ sage: L.list()
353
+ [word: 1112,
354
+ word: 1113,
355
+ word: 1122,
356
+ word: 1123,
357
+ ...
358
+ word: 1333,
359
+ word: 2223,
360
+ word: 2233,
361
+ word: 2333]
362
+ """
363
+ def __init__(self, n, k):
364
+ """
365
+ Initialize ``self``.
366
+
367
+ TESTS::
368
+
369
+ sage: LW23 = LyndonWords(2,3); LW23
370
+ Lyndon words from an alphabet of size 2 of length 3
371
+ sage: LW23== loads(dumps(LW23))
372
+ True
373
+ """
374
+ self._n = n
375
+ self._k = k
376
+ self._words = FiniteWords(self._n)
377
+
378
+ from sage.categories.enumerated_sets import EnumeratedSets
379
+ Parent.__init__(self,
380
+ category=EnumeratedSets().Finite(),
381
+ facade=(self._words,)
382
+ )
383
+
384
+ def __repr__(self):
385
+ """
386
+ TESTS::
387
+
388
+ sage: repr(LyndonWords(2, 3))
389
+ 'Lyndon words from an alphabet of size 2 of length 3'
390
+ """
391
+ return "Lyndon words from an alphabet of size %s of length %s" % (self._n, self._k)
392
+
393
+ def __call__(self, *args, **kwds):
394
+ r"""
395
+ TESTS::
396
+
397
+ sage: L = LyndonWords(3,3)
398
+ sage: L([1,2,3])
399
+ word: 123
400
+ sage: L([2,3,4])
401
+ Traceback (most recent call last):
402
+ ...
403
+ ValueError: 4 not in alphabet
404
+ sage: L([2,1,3])
405
+ Traceback (most recent call last):
406
+ ...
407
+ ValueError: not a Lyndon word
408
+ sage: L([1,2,2,3,3])
409
+ Traceback (most recent call last):
410
+ ...
411
+ ValueError: length is not k=3
412
+
413
+ Make sure that the correct length is checked (:issue:`30186`)::
414
+
415
+ sage: L = LyndonWords(2, 4)
416
+ sage: _ = L(L.random_element()) # needs sage.libs.pari
417
+ """
418
+ w = self._words(*args, **kwds)
419
+ if kwds.get('check', True) and not w.is_lyndon():
420
+ raise ValueError("not a Lyndon word")
421
+ if kwds.get('check', True) and w.length() != self._k:
422
+ raise ValueError("length is not k={}".format(self._k))
423
+ return w
424
+
425
+ def __contains__(self, w):
426
+ """
427
+ TESTS::
428
+
429
+ sage: LW33 = LyndonWords(3,3)
430
+ sage: all(lw in LW33 for lw in LW33)
431
+ True
432
+ """
433
+ if isinstance(w, list):
434
+ w = self._words(w, check=False)
435
+ return isinstance(w, FiniteWord_class) and w.length() == self._k \
436
+ and all(x in self._words.alphabet() for x in w) and w.is_lyndon()
437
+
438
+ def cardinality(self):
439
+ """
440
+ TESTS::
441
+
442
+ sage: [ LyndonWords(3,i).cardinality() for i in range(1, 11) ] # needs sage.libs.pari
443
+ [3, 3, 8, 18, 48, 116, 312, 810, 2184, 5880]
444
+ """
445
+ if self._k == 0:
446
+ return Integer(1)
447
+ else:
448
+ s = Integer(0)
449
+ for d in divisors(self._k):
450
+ s += moebius(d) * self._n**(self._k // d)
451
+ return s // self._k
452
+
453
+ def __iter__(self):
454
+ """
455
+ TESTS::
456
+
457
+ sage: LyndonWords(3,3).list() # indirect doctest
458
+ [word: 112, word: 113, word: 122, word: 123, word: 132, word: 133, word: 223, word: 233]
459
+
460
+ sage: sum(1 for lw in LyndonWords(11, 6))
461
+ 295020
462
+
463
+ sage: sum(1 for lw in LyndonWords(1000, 1))
464
+ 1000
465
+
466
+ sage: sum(1 for lw in LyndonWords(1, 1000))
467
+ 0
468
+
469
+ sage: list(LyndonWords(1, 1)) # needs sage.libs.pari
470
+ [word: 1]
471
+ """
472
+ W = self._words._element_classes['list']
473
+ for lw in lyndon_word_iterator(self._n, self._k):
474
+ yield W(self._words, [i + 1 for i in lw])
475
+
476
+
477
+ def StandardBracketedLyndonWords(n, k):
478
+ """
479
+ Return the combinatorial class of standard bracketed Lyndon words
480
+ from [1, ..., n] of length k.
481
+
482
+ These are in one to one correspondence with the Lyndon words and
483
+ form a basis for the subspace of degree k of the free Lie algebra
484
+ of rank n.
485
+
486
+ EXAMPLES::
487
+
488
+ sage: SBLW33 = StandardBracketedLyndonWords(3,3); SBLW33
489
+ Standard bracketed Lyndon words from an alphabet of size 3 of length 3
490
+ sage: SBLW33.first()
491
+ [1, [1, 2]]
492
+ sage: SBLW33.last()
493
+ [[2, 3], 3]
494
+ sage: SBLW33.cardinality()
495
+ 8
496
+ sage: SBLW33.random_element() in SBLW33
497
+ True
498
+ """
499
+ return StandardBracketedLyndonWords_nk(n, k)
500
+
501
+
502
+ class StandardBracketedLyndonWords_nk(UniqueRepresentation, Parent):
503
+ def __init__(self, n, k):
504
+ """
505
+ TESTS::
506
+
507
+ sage: SBLW = StandardBracketedLyndonWords(3, 2)
508
+ sage: SBLW == loads(dumps(SBLW))
509
+ True
510
+ """
511
+ self._n = n
512
+ self._k = k
513
+ self._lyndon = LyndonWords(self._n, self._k)
514
+
515
+ from sage.categories.enumerated_sets import EnumeratedSets
516
+ Parent.__init__(self, category=EnumeratedSets().Finite())
517
+
518
+ def __repr__(self):
519
+ """
520
+ TESTS::
521
+
522
+ sage: repr(StandardBracketedLyndonWords(3, 3))
523
+ 'Standard bracketed Lyndon words from an alphabet of size 3 of length 3'
524
+ """
525
+ return "Standard bracketed Lyndon words from an alphabet of size %s of length %s" % (self._n, self._k)
526
+
527
+ def cardinality(self):
528
+ """
529
+ EXAMPLES::
530
+
531
+ sage: StandardBracketedLyndonWords(3, 3).cardinality()
532
+ 8
533
+ sage: StandardBracketedLyndonWords(3, 4).cardinality()
534
+ 18
535
+ """
536
+ return self._lyndon.cardinality()
537
+
538
+ def __call__(self, *args, **kwds):
539
+ r"""
540
+ EXAMPLES::
541
+
542
+ sage: S = StandardBracketedLyndonWords(3, 3)
543
+ sage: S([1,2,3])
544
+ [1, [2, 3]]
545
+ """
546
+ return standard_bracketing(self._lyndon(*args, **kwds))
547
+
548
+ def __contains__(self, sblw):
549
+ """
550
+ EXAMPLES::
551
+
552
+ sage: S = StandardBracketedLyndonWords(2, 3)
553
+ sage: [[1, 2], 2] in S
554
+ True
555
+ sage: [1, [2, 2]] in S
556
+ False
557
+ sage: [1, [2, 3]] in S
558
+ False
559
+ sage: [1, 2] in S
560
+ False
561
+ """
562
+ try:
563
+ lw = standard_unbracketing(sblw)
564
+ except ValueError:
565
+ return False
566
+ return len(lw) == self._k and all(a in self._lyndon._words.alphabet() for a in lw.parent().alphabet())
567
+
568
+ def __iter__(self):
569
+ """
570
+ EXAMPLES::
571
+
572
+ sage: StandardBracketedLyndonWords(3, 3).list()
573
+ [[1, [1, 2]],
574
+ [1, [1, 3]],
575
+ [[1, 2], 2],
576
+ [1, [2, 3]],
577
+ [[1, 3], 2],
578
+ [[1, 3], 3],
579
+ [2, [2, 3]],
580
+ [[2, 3], 3]]
581
+ """
582
+ for x in self._lyndon:
583
+ yield standard_bracketing(x)
584
+
585
+
586
+ def standard_bracketing(lw):
587
+ """
588
+ Return the standard bracketing of a Lyndon word ``lw``.
589
+
590
+ EXAMPLES::
591
+
592
+ sage: import sage.combinat.words.lyndon_word as lyndon_word
593
+ sage: [lyndon_word.standard_bracketing(u) for u in LyndonWords(3,3)]
594
+ [[1, [1, 2]],
595
+ [1, [1, 3]],
596
+ [[1, 2], 2],
597
+ [1, [2, 3]],
598
+ [[1, 3], 2],
599
+ [[1, 3], 3],
600
+ [2, [2, 3]],
601
+ [[2, 3], 3]]
602
+ """
603
+ if len(lw) == 1:
604
+ return lw[0]
605
+
606
+ for i in range(1, len(lw)):
607
+ if lw[i:] in LyndonWords():
608
+ return [standard_bracketing(lw[:i]), standard_bracketing(lw[i:])]
609
+
610
+
611
+ def standard_unbracketing(sblw):
612
+ """
613
+ Return flattened ``sblw`` if it is a standard bracketing of a Lyndon word,
614
+ otherwise raise an error.
615
+
616
+ EXAMPLES::
617
+
618
+ sage: from sage.combinat.words.lyndon_word import standard_unbracketing
619
+ sage: standard_unbracketing([1, [2, 3]])
620
+ word: 123
621
+ sage: standard_unbracketing([[1, 2], 3])
622
+ Traceback (most recent call last):
623
+ ...
624
+ ValueError: not a standard bracketing of a Lyndon word
625
+
626
+ TESTS::
627
+
628
+ sage: standard_unbracketing(1) # Letters don't use brackets.
629
+ word: 1
630
+ sage: standard_unbracketing([1])
631
+ Traceback (most recent call last):
632
+ ...
633
+ ValueError: not a standard bracketing of a Lyndon word
634
+ """
635
+ # Nested helper function that not only returns (flattened) w, but also its
636
+ # right factor in the standard Lyndon factorization.
637
+ def standard_unbracketing_rec(w):
638
+ if not isinstance(w, list):
639
+ return [w], []
640
+ if len(w) != 2:
641
+ raise ValueError("not a standard bracketing of a Lyndon word")
642
+ x, t = standard_unbracketing_rec(w[0])
643
+ y, _ = standard_unbracketing_rec(w[1])
644
+ # If x = st is a standard Lyndon factorization, and y is a Lyndon word
645
+ # such that y <= t, then xy is standard (but not necessarily Lyndon).
646
+ if x < y and (len(t) == 0 or y <= t):
647
+ x += y
648
+ return x, y
649
+ else:
650
+ raise ValueError("not a standard bracketing of a Lyndon word")
651
+ lw, _ = standard_unbracketing_rec(sblw)
652
+ return FiniteWords(list(set(lw)))(lw, datatype='list', check=False)