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,954 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs age.modules
3
+ r"""
4
+ Free dendriform algebras
5
+
6
+ AUTHORS:
7
+
8
+ - Frédéric Chapoton (2017)
9
+ """
10
+ # ****************************************************************************
11
+ # Copyright (C) 2010-2015 Frédéric Chapoton <chapoton@unistra.fr>,
12
+ #
13
+ # Distributed under the terms of the GNU General Public License (GPL)
14
+ # as published by the Free Software Foundation; either version 2 of
15
+ # the License, or (at your option) any later version.
16
+ # https://www.gnu.org/licenses/
17
+ # ****************************************************************************
18
+
19
+ from sage.categories.hopf_algebras import HopfAlgebras
20
+ from sage.combinat.free_module import CombinatorialFreeModule
21
+ from sage.combinat.words.alphabet import Alphabet
22
+ from sage.combinat.binary_tree import (BinaryTrees, BinaryTree,
23
+ LabelledBinaryTrees,
24
+ LabelledBinaryTree)
25
+ from sage.categories.pushout import (ConstructionFunctor,
26
+ CompositeConstructionFunctor,
27
+ IdentityConstructionFunctor)
28
+ from sage.categories.rings import Rings
29
+ from sage.categories.functor import Functor
30
+ from sage.misc.lazy_attribute import lazy_attribute
31
+ from sage.misc.cachefunc import cached_method
32
+ from sage.sets.family import Family
33
+ from sage.structure.coerce_exceptions import CoercionException
34
+ from sage.rings.infinity import Infinity
35
+
36
+
37
+ class FreeDendriformAlgebra(CombinatorialFreeModule):
38
+ r"""
39
+ The free dendriform algebra.
40
+
41
+ Dendriform algebras are associative algebras, where the associative
42
+ product `*` is decomposed as a sum of two binary operations
43
+
44
+ .. MATH::
45
+
46
+ x * y = x \succ y + x \prec y
47
+
48
+ that satisfy the axioms:
49
+
50
+ .. MATH::
51
+
52
+ (x \succ y) \prec z = x \succ (y \prec z),
53
+
54
+ .. MATH::
55
+
56
+ (x \prec y) \prec z = x \prec (y * z).
57
+
58
+ .. MATH::
59
+
60
+ (x * y) \succ z = x \succ (y \succ z).
61
+
62
+ The free Dendriform algebra on a given set `E` has an explicit
63
+ description using (planar) binary trees, just as the free
64
+ associative algebra can be described using words. The underlying
65
+ vector space has a basis indexed by finite binary trees endowed
66
+ with a map from their vertices to `E`. In this basis, the
67
+ associative product of two (decorated) binary trees `S * T` is the
68
+ sum over all possible ways of identifying (glueing) the rightmost path in
69
+ `S` and the leftmost path in `T`.
70
+
71
+ The decomposition of the associative product as the sum of two
72
+ binary operations `\succ` and
73
+ `\prec` is made by separating the terms according to the origin of
74
+ the root vertex. For `x \succ y`, one keeps the terms where the root
75
+ vertex comes from `y`, whereas for `x \prec y` one keeps the terms
76
+ where the root vertex comes from `x`.
77
+
78
+ The free dendriform algebra can also be considered as the free
79
+ algebra over the Dendriform operad.
80
+
81
+ .. NOTE::
82
+
83
+ The usual binary operator `*` is used for the
84
+ associative product.
85
+
86
+ EXAMPLES::
87
+
88
+ sage: F = algebras.FreeDendriform(ZZ, 'xyz')
89
+ sage: x,y,z = F.gens()
90
+ sage: (x * y) * z
91
+ B[x[., y[., z[., .]]]] + B[x[., z[y[., .], .]]] + B[y[x[., .], z[., .]]]
92
+ + B[z[x[., y[., .]], .]] + B[z[y[x[., .], .], .]]
93
+
94
+ The free dendriform algebra is associative::
95
+
96
+ sage: x * (y * z) == (x * y) * z
97
+ True
98
+
99
+ The associative product decomposes in two parts::
100
+
101
+ sage: x * y == F.prec(x, y) + F.succ(x, y)
102
+ True
103
+
104
+ The axioms hold::
105
+
106
+ sage: F.prec(F.succ(x, y), z) == F.succ(x, F.prec(y, z))
107
+ True
108
+ sage: F.prec(F.prec(x, y), z) == F.prec(x, y * z)
109
+ True
110
+ sage: F.succ(x * y, z) == F.succ(x, F.succ(y, z))
111
+ True
112
+
113
+ When there is only one generator, unlabelled trees are used instead::
114
+
115
+ sage: F1 = algebras.FreeDendriform(QQ)
116
+ sage: w = F1.gen(0); w
117
+ B[[., .]]
118
+ sage: w * w * w
119
+ B[[., [., [., .]]]] + B[[., [[., .], .]]] + B[[[., .], [., .]]]
120
+ + B[[[., [., .]], .]] + B[[[[., .], .], .]]
121
+
122
+ The set `E` can be infinite::
123
+
124
+ sage: F = algebras.FreeDendriform(QQ, ZZ)
125
+ sage: w = F.gen(1); w
126
+ B[1[., .]]
127
+ sage: x = F.gen(2); x
128
+ B[-1[., .]]
129
+ sage: w*x
130
+ B[-1[1[., .], .]] + B[1[., -1[., .]]]
131
+
132
+ REFERENCES:
133
+
134
+ - [LR1998]_
135
+ """
136
+ @staticmethod
137
+ def __classcall_private__(cls, R, names=None):
138
+ """
139
+ Normalize input to ensure a unique representation.
140
+
141
+ EXAMPLES::
142
+
143
+ sage: F1 = algebras.FreeDendriform(QQ, 'xyz')
144
+ sage: F2 = algebras.FreeDendriform(QQ, ['x','y','z'])
145
+ sage: F3 = algebras.FreeDendriform(QQ, Alphabet('xyz'))
146
+ sage: F1 is F2 and F1 is F3
147
+ True
148
+ """
149
+ if names is not None:
150
+ if ',' in names:
151
+ names = [u for u in names if u != ',']
152
+ names = Alphabet(names)
153
+
154
+ if R not in Rings():
155
+ raise TypeError("argument R must be a ring")
156
+ return super().__classcall__(cls, R, names)
157
+
158
+ def __init__(self, R, names=None):
159
+ """
160
+ Initialize ``self``.
161
+
162
+ TESTS::
163
+
164
+ sage: A = algebras.FreeDendriform(QQ, '@'); A
165
+ Free Dendriform algebra on one generator ['@'] over Rational Field
166
+ sage: TestSuite(A).run() # long time (3s)
167
+
168
+ sage: F = algebras.FreeDendriform(QQ, 'xy')
169
+ sage: TestSuite(F).run() # long time (3s)
170
+ """
171
+ if names is None:
172
+ Trees = BinaryTrees()
173
+ key = BinaryTree._sort_key
174
+ self._alphabet = Alphabet(['o'])
175
+ else:
176
+ Trees = LabelledBinaryTrees()
177
+ key = LabelledBinaryTree._sort_key
178
+ self._alphabet = names
179
+ # Here one would need LabelledBinaryTrees(names)
180
+ # so that one can restrict the labels to some fixed set
181
+
182
+ cat = HopfAlgebras(R).WithBasis().Graded().Connected()
183
+ CombinatorialFreeModule.__init__(self, R, Trees,
184
+ latex_prefix='',
185
+ sorting_key=key,
186
+ category=cat)
187
+
188
+ def variable_names(self):
189
+ r"""
190
+ Return the names of the variables.
191
+
192
+ EXAMPLES::
193
+
194
+ sage: R = algebras.FreeDendriform(QQ, 'xy')
195
+ sage: R.variable_names()
196
+ {'x', 'y'}
197
+ """
198
+ return self._alphabet
199
+
200
+ def _repr_(self):
201
+ """
202
+ Return the string representation of ``self``.
203
+
204
+ EXAMPLES::
205
+
206
+ sage: algebras.FreeDendriform(QQ, '@') # indirect doctest
207
+ Free Dendriform algebra on one generator ['@'] over Rational Field
208
+ """
209
+ n = self.algebra_generators().cardinality()
210
+ finite = bool(n < Infinity)
211
+ if not finite:
212
+ gen = "generators indexed by"
213
+ elif n == 1:
214
+ gen = "one generator"
215
+ else:
216
+ gen = "{} generators".format(n)
217
+ s = "Free Dendriform algebra on {} {} over {}"
218
+ if finite:
219
+ try:
220
+ return s.format(gen, self._alphabet.list(), self.base_ring())
221
+ except NotImplementedError:
222
+ return s.format(gen, self._alphabet, self.base_ring())
223
+ else:
224
+ return s.format(gen, self._alphabet, self.base_ring())
225
+
226
+ def gen(self, i):
227
+ r"""
228
+ Return the `i`-th generator of the algebra.
229
+
230
+ INPUT:
231
+
232
+ - ``i`` -- integer
233
+
234
+ EXAMPLES::
235
+
236
+ sage: F = algebras.FreeDendriform(ZZ, 'xyz')
237
+ sage: F.gen(0)
238
+ B[x[., .]]
239
+
240
+ sage: F.gen(4)
241
+ Traceback (most recent call last):
242
+ ...
243
+ IndexError: argument i (= 4) must be between 0 and 2
244
+ """
245
+ G = self.algebra_generators()
246
+ n = G.cardinality()
247
+ if i < 0 or not i < n:
248
+ m = "argument i (= {}) must be between 0 and {}".format(i, n - 1)
249
+ raise IndexError(m)
250
+ return G[G.keys().unrank(i)]
251
+
252
+ @cached_method
253
+ def algebra_generators(self):
254
+ r"""
255
+ Return the generators of this algebra.
256
+
257
+ These are the binary trees with just one vertex.
258
+
259
+ EXAMPLES::
260
+
261
+ sage: A = algebras.FreeDendriform(ZZ, 'fgh'); A
262
+ Free Dendriform algebra on 3 generators ['f', 'g', 'h']
263
+ over Integer Ring
264
+ sage: list(A.algebra_generators())
265
+ [B[f[., .]], B[g[., .]], B[h[., .]]]
266
+
267
+ sage: A = algebras.FreeDendriform(QQ, ['x1','x2'])
268
+ sage: list(A.algebra_generators())
269
+ [B[x1[., .]], B[x2[., .]]]
270
+ """
271
+ Trees = self.basis().keys()
272
+ return Family(self._alphabet, lambda a: self.monomial(Trees([], a)))
273
+
274
+ def change_ring(self, R):
275
+ """
276
+ Return the free dendriform algebra in the same variables over `R`.
277
+
278
+ INPUT:
279
+
280
+ - ``R`` -- a ring
281
+
282
+ EXAMPLES::
283
+
284
+ sage: A = algebras.FreeDendriform(ZZ, 'fgh')
285
+ sage: A.change_ring(QQ)
286
+ Free Dendriform algebra on 3 generators ['f', 'g', 'h'] over
287
+ Rational Field
288
+ """
289
+ return FreeDendriformAlgebra(R, names=self.variable_names())
290
+
291
+ def gens(self) -> tuple:
292
+ """
293
+ Return the generators of ``self`` (as an algebra).
294
+
295
+ EXAMPLES::
296
+
297
+ sage: A = algebras.FreeDendriform(ZZ, 'fgh')
298
+ sage: A.gens()
299
+ (B[f[., .]], B[g[., .]], B[h[., .]])
300
+ """
301
+ return tuple(self.algebra_generators())
302
+
303
+ def degree_on_basis(self, t):
304
+ """
305
+ Return the degree of a binary tree in the free Dendriform algebra.
306
+
307
+ This is the number of vertices.
308
+
309
+ EXAMPLES::
310
+
311
+ sage: A = algebras.FreeDendriform(QQ,'@')
312
+ sage: RT = A.basis().keys()
313
+ sage: u = RT([], '@')
314
+ sage: A.degree_on_basis(u.over(u))
315
+ 2
316
+ """
317
+ return t.node_number()
318
+
319
+ def _an_element_(self):
320
+ """
321
+ Return an element of ``self``.
322
+
323
+ EXAMPLES::
324
+
325
+ sage: A = algebras.FreeDendriform(QQ, 'xy')
326
+ sage: A.an_element()
327
+ B[x[., .]] + 2*B[x[., x[., .]]] + 2*B[x[x[., .], .]]
328
+ """
329
+ o = self.gen(0)
330
+ return o + 2 * o * o
331
+
332
+ def some_elements(self):
333
+ """
334
+ Return some elements of the free dendriform algebra.
335
+
336
+ EXAMPLES::
337
+
338
+ sage: A = algebras.FreeDendriform(QQ)
339
+ sage: A.some_elements()
340
+ [B[.],
341
+ B[[., .]],
342
+ B[[., [., .]]] + B[[[., .], .]],
343
+ B[.] + B[[., [., .]]] + B[[[., .], .]]]
344
+
345
+ With several generators::
346
+
347
+ sage: A = algebras.FreeDendriform(QQ, 'xy')
348
+ sage: A.some_elements()
349
+ [B[.],
350
+ B[x[., .]],
351
+ B[x[., x[., .]]] + B[x[x[., .], .]],
352
+ B[.] + B[x[., x[., .]]] + B[x[x[., .], .]]]
353
+ """
354
+ u = self.one()
355
+ o = self.gen(0)
356
+ x = o * o
357
+ y = u + x
358
+ return [u, o, x, y]
359
+
360
+ def one_basis(self):
361
+ """
362
+ Return the index of the unit.
363
+
364
+ EXAMPLES::
365
+
366
+ sage: A = algebras.FreeDendriform(QQ, '@')
367
+ sage: A.one_basis()
368
+ .
369
+ sage: A = algebras.FreeDendriform(QQ, 'xy')
370
+ sage: A.one_basis()
371
+ .
372
+ """
373
+ Trees = self.basis().keys()
374
+ return Trees(None)
375
+
376
+ def product_on_basis(self, x, y):
377
+ r"""
378
+ Return the `*` associative dendriform product of two trees.
379
+
380
+ This is the sum over all possible ways of identifying the
381
+ rightmost path in `x` and the leftmost path in `y`. Every term
382
+ corresponds to a shuffle of the vertices on the rightmost path
383
+ in `x` and the vertices on the leftmost path in `y`.
384
+
385
+ .. SEEALSO::
386
+
387
+ - :meth:`succ_product_on_basis`, :meth:`prec_product_on_basis`
388
+
389
+ EXAMPLES::
390
+
391
+ sage: A = algebras.FreeDendriform(QQ)
392
+ sage: RT = A.basis().keys()
393
+ sage: x = RT([])
394
+ sage: A.product_on_basis(x, x)
395
+ B[[., [., .]]] + B[[[., .], .]]
396
+ """
397
+ return self.sum(self.basis()[u] for u in x.dendriform_shuffle(y))
398
+
399
+ def succ_product_on_basis(self, x, y):
400
+ r"""
401
+ Return the `\succ` dendriform product of two trees.
402
+
403
+ This is the sum over all possible ways to identify the rightmost path
404
+ in `x` and the leftmost path in `y`, with the additional condition
405
+ that the root vertex of the result comes from `y`.
406
+
407
+ The usual symbol for this operation is `\succ`.
408
+
409
+ .. SEEALSO::
410
+
411
+ - :meth:`product_on_basis`, :meth:`prec_product_on_basis`
412
+
413
+ EXAMPLES::
414
+
415
+ sage: A = algebras.FreeDendriform(QQ)
416
+ sage: RT = A.basis().keys()
417
+ sage: x = RT([])
418
+ sage: A.succ_product_on_basis(x, x)
419
+ B[[[., .], .]]
420
+
421
+ TESTS::
422
+
423
+ sage: u = A.one().support()[0]
424
+ sage: A.succ_product_on_basis(u, u)
425
+ Traceback (most recent call last):
426
+ ...
427
+ ValueError: dendriform products | < | and | > | are not defined
428
+ """
429
+ if y.is_empty():
430
+ if x.is_empty():
431
+ raise ValueError("dendriform products | < | and | > | are "
432
+ "not defined")
433
+ else:
434
+ return []
435
+ if x.is_empty():
436
+ return [y]
437
+ K = self.basis().keys()
438
+ if hasattr(y, 'label'):
439
+ return self.sum(self.basis()[K([u, y[1]], y.label())]
440
+ for u in x.dendriform_shuffle(y[0]))
441
+
442
+ return self.sum(self.basis()[K([u, y[1]])]
443
+ for u in x.dendriform_shuffle(y[0]))
444
+
445
+ @lazy_attribute
446
+ def succ(self):
447
+ r"""
448
+ Return the `\succ` dendriform product.
449
+
450
+ This is the sum over all possible ways of identifying the
451
+ rightmost path in `x` and the leftmost path in `y`, with the
452
+ additional condition that the root vertex of the result comes
453
+ from `y`.
454
+
455
+ The usual symbol for this operation is `\succ`.
456
+
457
+ .. SEEALSO::
458
+
459
+ :meth:`product`, :meth:`prec`, :meth:`over`, :meth:`under`
460
+
461
+ EXAMPLES::
462
+
463
+ sage: A = algebras.FreeDendriform(QQ)
464
+ sage: RT = A.basis().keys()
465
+ sage: x = A.gen(0)
466
+ sage: A.succ(x, x)
467
+ B[[[., .], .]]
468
+ """
469
+ suc = self.succ_product_on_basis
470
+ return self._module_morphism(self._module_morphism(suc, position=0,
471
+ codomain=self),
472
+ position=1)
473
+
474
+ def prec_product_on_basis(self, x, y):
475
+ r"""
476
+ Return the `\prec` dendriform product of two trees.
477
+
478
+ This is the sum over all possible ways of identifying the
479
+ rightmost path in `x` and the leftmost path in `y`, with the
480
+ additional condition that the root vertex of the result comes
481
+ from `x`.
482
+
483
+ The usual symbol for this operation is `\prec`.
484
+
485
+ .. SEEALSO::
486
+
487
+ - :meth:`product_on_basis`, :meth:`succ_product_on_basis`
488
+
489
+ EXAMPLES::
490
+
491
+ sage: A = algebras.FreeDendriform(QQ)
492
+ sage: RT = A.basis().keys()
493
+ sage: x = RT([])
494
+ sage: A.prec_product_on_basis(x, x)
495
+ B[[., [., .]]]
496
+
497
+ TESTS::
498
+
499
+ sage: u = A.one().support()[0]
500
+ sage: A.prec_product_on_basis(u, u)
501
+ Traceback (most recent call last):
502
+ ...
503
+ ValueError: dendriform products | < | and | > | are not defined
504
+ """
505
+ if x.is_empty() and y.is_empty():
506
+ raise ValueError("dendriform products | < | and | > | are "
507
+ "not defined")
508
+ if x.is_empty():
509
+ return []
510
+ if y.is_empty():
511
+ return [x]
512
+ K = self.basis().keys()
513
+ if hasattr(y, 'label'):
514
+ return self.sum(self.basis()[K([x[0], u], x.label())]
515
+ for u in x[1].dendriform_shuffle(y))
516
+
517
+ return self.sum(self.basis()[K([x[0], u])]
518
+ for u in x[1].dendriform_shuffle(y))
519
+
520
+ @lazy_attribute
521
+ def prec(self):
522
+ r"""
523
+ Return the `\prec` dendriform product.
524
+
525
+ This is the sum over all possible ways to identify the rightmost path
526
+ in `x` and the leftmost path in `y`, with the additional condition
527
+ that the root vertex of the result comes from `x`.
528
+
529
+ The usual symbol for this operation is `\prec`.
530
+
531
+ .. SEEALSO::
532
+
533
+ :meth:`product`, :meth:`succ`, :meth:`over`, :meth:`under`
534
+
535
+ EXAMPLES::
536
+
537
+ sage: A = algebras.FreeDendriform(QQ)
538
+ sage: RT = A.basis().keys()
539
+ sage: x = A.gen(0)
540
+ sage: A.prec(x, x)
541
+ B[[., [., .]]]
542
+ """
543
+ pre = self.prec_product_on_basis
544
+ return self._module_morphism(self._module_morphism(pre, position=0,
545
+ codomain=self),
546
+ position=1)
547
+
548
+ @lazy_attribute
549
+ def over(self):
550
+ r"""
551
+ Return the over product.
552
+
553
+ The over product `x/y` is the binary tree obtained by
554
+ grafting the root of `y` at the rightmost leaf of `x`.
555
+
556
+ The usual symbol for this operation is `/`.
557
+
558
+ .. SEEALSO::
559
+
560
+ :meth:`product`, :meth:`succ`, :meth:`prec`, :meth:`under`
561
+
562
+ EXAMPLES::
563
+
564
+ sage: A = algebras.FreeDendriform(QQ)
565
+ sage: RT = A.basis().keys()
566
+ sage: x = A.gen(0)
567
+ sage: A.over(x, x)
568
+ B[[., [., .]]]
569
+ """
570
+ def ov(x, y):
571
+ return self._monomial(x.over(y))
572
+ return self._module_morphism(self._module_morphism(ov, position=0,
573
+ codomain=self),
574
+ position=1)
575
+
576
+ @lazy_attribute
577
+ def under(self):
578
+ r"""
579
+ Return the under product.
580
+
581
+ The over product `x \backslash y` is the binary tree obtained by
582
+ grafting the root of `x` at the leftmost leaf of `y`.
583
+
584
+ The usual symbol for this operation is `\backslash`.
585
+
586
+ .. SEEALSO::
587
+
588
+ :meth:`product`, :meth:`succ`, :meth:`prec`, :meth:`over`
589
+
590
+ EXAMPLES::
591
+
592
+ sage: A = algebras.FreeDendriform(QQ)
593
+ sage: RT = A.basis().keys()
594
+ sage: x = A.gen(0)
595
+ sage: A.under(x, x)
596
+ B[[[., .], .]]
597
+ """
598
+ def und(x, y):
599
+ return self._monomial(x.under(y))
600
+ return self._module_morphism(self._module_morphism(und, position=0,
601
+ codomain=self),
602
+ position=1)
603
+
604
+ def coproduct_on_basis(self, x):
605
+ """
606
+ Return the coproduct of a binary tree.
607
+
608
+ EXAMPLES::
609
+
610
+ sage: A = algebras.FreeDendriform(QQ)
611
+ sage: x = A.gen(0)
612
+ sage: ascii_art(A.coproduct(A.one())) # indirect doctest
613
+ 1 # 1
614
+
615
+ sage: ascii_art(A.coproduct(x)) # indirect doctest
616
+ 1 # B + B # 1
617
+ o o
618
+
619
+ sage: A = algebras.FreeDendriform(QQ, 'xyz')
620
+ sage: x, y, z = A.gens()
621
+ sage: w = A.under(z,A.over(x,y))
622
+ sage: A.coproduct(z)
623
+ B[.] # B[z[., .]] + B[z[., .]] # B[.]
624
+ sage: A.coproduct(w)
625
+ B[.] # B[x[z[., .], y[., .]]] + B[x[., .]] # B[z[., y[., .]]] +
626
+ B[x[., .]] # B[y[z[., .], .]] + B[x[., y[., .]]] # B[z[., .]] +
627
+ B[x[z[., .], .]] # B[y[., .]] + B[x[z[., .], y[., .]]] # B[.]
628
+ """
629
+ B = self.basis()
630
+ Trees = B.keys()
631
+ if not x.node_number():
632
+ return self.one().tensor(self.one())
633
+ L, R = list(x)
634
+ try:
635
+ root = x.label()
636
+ except AttributeError:
637
+ root = '@'
638
+ resu = self.one().tensor(self.monomial(x))
639
+ resu += sum(cL * cR *
640
+ self.monomial(Trees([LL[0], RR[0]], root)).tensor(
641
+ self.monomial(LL[1]) * self.monomial(RR[1]))
642
+ for LL, cL in self.coproduct_on_basis(L)
643
+ for RR, cR in self.coproduct_on_basis(R))
644
+ return resu
645
+
646
+ # after this line : coercion
647
+ def _element_constructor_(self, x):
648
+ r"""
649
+ Convert ``x`` into ``self``.
650
+
651
+ EXAMPLES::
652
+
653
+ sage: R = algebras.FreeDendriform(QQ, 'xy')
654
+ sage: x, y = R.gens()
655
+ sage: R(x)
656
+ B[x[., .]]
657
+ sage: R(x+4*y)
658
+ B[x[., .]] + 4*B[y[., .]]
659
+
660
+ sage: Trees = R.basis().keys()
661
+ sage: R(Trees([],'x'))
662
+ B[x[., .]]
663
+ sage: D = algebras.FreeDendriform(ZZ, 'xy')
664
+ sage: X, Y = D.gens()
665
+ sage: R(X-Y).parent()
666
+ Free Dendriform algebra on 2 generators ['x', 'y'] over Rational Field
667
+ """
668
+ if x in self.basis().keys():
669
+ return self.monomial(x)
670
+ try:
671
+ P = x.parent()
672
+ if isinstance(P, FreeDendriformAlgebra):
673
+ if P is self:
674
+ return x
675
+ return self.element_class(self, x.monomial_coefficients())
676
+ except AttributeError:
677
+ raise TypeError('not able to coerce this in this algebra')
678
+ # Ok, not a dendriform algebra element (or should not be viewed as one).
679
+
680
+ def _coerce_map_from_(self, R):
681
+ r"""
682
+ Return ``True`` if there is a coercion from ``R`` into ``self``
683
+ and ``False`` otherwise.
684
+
685
+ The things that coerce into ``self`` are
686
+
687
+ - free dendriform algebras in a subset of variables of ``self``
688
+ over a base with a coercion map into ``self.base_ring()``
689
+
690
+ EXAMPLES::
691
+
692
+ sage: F = algebras.FreeDendriform(GF(7), 'xyz'); F
693
+ Free Dendriform algebra on 3 generators ['x', 'y', 'z']
694
+ over Finite Field of size 7
695
+
696
+ Elements of the free dendriform algebra canonically coerce in::
697
+
698
+ sage: x, y, z = F.gens()
699
+ sage: F.coerce(x+y) == x+y
700
+ True
701
+
702
+ The free dendriform algebra over `\ZZ` on `x, y, z` coerces in, since
703
+ `\ZZ` coerces to `\GF{7}`::
704
+
705
+ sage: G = algebras.FreeDendriform(ZZ, 'xyz')
706
+ sage: Gx,Gy,Gz = G.gens()
707
+ sage: z = F.coerce(Gx+Gy); z
708
+ B[x[., .]] + B[y[., .]]
709
+ sage: z.parent() is F
710
+ True
711
+
712
+ However, `\GF{7}` does not coerce to `\ZZ`, so the free dendriform
713
+ algebra over `\GF{7}` does not coerce to the one over `\ZZ`::
714
+
715
+ sage: G.coerce(y)
716
+ Traceback (most recent call last):
717
+ ...
718
+ TypeError: no canonical coercion from Free Dendriform algebra
719
+ on 3 generators ['x', 'y', 'z'] over Finite Field of size
720
+ 7 to Free Dendriform algebra on 3 generators ['x', 'y', 'z']
721
+ over Integer Ring
722
+
723
+ TESTS::
724
+
725
+ sage: F = algebras.FreeDendriform(ZZ, 'xyz')
726
+ sage: G = algebras.FreeDendriform(QQ, 'xyz')
727
+ sage: H = algebras.FreeDendriform(ZZ, 'y')
728
+ sage: F._coerce_map_from_(G)
729
+ False
730
+ sage: G._coerce_map_from_(F)
731
+ True
732
+ sage: F._coerce_map_from_(H)
733
+ True
734
+ sage: F._coerce_map_from_(QQ)
735
+ False
736
+ sage: G._coerce_map_from_(QQ)
737
+ False
738
+ sage: F.has_coerce_map_from(PolynomialRing(ZZ, 3, 'x,y,z'))
739
+ False
740
+ """
741
+ # free dendriform algebras in a subset of variables
742
+ # over any base that coerces in:
743
+ if isinstance(R, FreeDendriformAlgebra):
744
+ if all(x in self.variable_names() for x in R.variable_names()):
745
+ if self.base_ring().has_coerce_map_from(R.base_ring()):
746
+ return True
747
+ return False
748
+
749
+ def construction(self):
750
+ """
751
+ Return a pair ``(F, R)``, where ``F`` is a :class:`DendriformFunctor`
752
+ and `R` is a ring, such that ``F(R)`` returns ``self``.
753
+
754
+ EXAMPLES::
755
+
756
+ sage: P = algebras.FreeDendriform(ZZ, 'x,y')
757
+ sage: x,y = P.gens()
758
+ sage: F, R = P.construction()
759
+ sage: F
760
+ Dendriform[x,y]
761
+ sage: R
762
+ Integer Ring
763
+ sage: F(ZZ) is P
764
+ True
765
+ sage: F(QQ)
766
+ Free Dendriform algebra on 2 generators ['x', 'y'] over Rational Field
767
+ """
768
+ return DendriformFunctor(self.variable_names()), self.base_ring()
769
+
770
+
771
+ class DendriformFunctor(ConstructionFunctor):
772
+ """
773
+ A constructor for dendriform algebras.
774
+
775
+ EXAMPLES::
776
+
777
+ sage: P = algebras.FreeDendriform(ZZ, 'x,y')
778
+ sage: x,y = P.gens()
779
+ sage: F = P.construction()[0]; F
780
+ Dendriform[x,y]
781
+
782
+ sage: A = GF(5)['a,b']
783
+ sage: a, b = A.gens()
784
+ sage: F(A)
785
+ Free Dendriform algebra on 2 generators ['x', 'y']
786
+ over Multivariate Polynomial Ring in a, b over Finite Field of size 5
787
+
788
+ sage: f = A.hom([a+b,a-b],A)
789
+ sage: F(f)
790
+ Generic endomorphism of Free Dendriform algebra on 2 generators ['x', 'y']
791
+ over Multivariate Polynomial Ring in a, b over Finite Field of size 5
792
+
793
+ sage: F(f)(a * F(A)(x))
794
+ (a+b)*B[x[., .]]
795
+ """
796
+ rank = 9
797
+
798
+ def __init__(self, vars):
799
+ """
800
+ EXAMPLES::
801
+
802
+ sage: F = sage.combinat.free_dendriform_algebra.DendriformFunctor(['x','y'])
803
+ sage: F
804
+ Dendriform[x,y]
805
+ sage: F(ZZ)
806
+ Free Dendriform algebra on 2 generators ['x', 'y'] over Integer Ring
807
+ """
808
+ Functor.__init__(self, Rings(), Rings())
809
+ self.vars = vars
810
+
811
+ def _apply_functor(self, R):
812
+ """
813
+ Apply the functor to an object of ``self``'s domain.
814
+
815
+ EXAMPLES::
816
+
817
+ sage: R = algebras.FreeDendriform(ZZ, 'x,y,z')
818
+ sage: F = R.construction()[0]; F
819
+ Dendriform[x,y,z]
820
+ sage: type(F)
821
+ <class 'sage.combinat.free_dendriform_algebra.DendriformFunctor'>
822
+ sage: F(ZZ) # indirect doctest
823
+ Free Dendriform algebra on 3 generators ['x', 'y', 'z'] over Integer Ring
824
+ """
825
+ return FreeDendriformAlgebra(R, self.vars)
826
+
827
+ def _apply_functor_to_morphism(self, f):
828
+ """
829
+ Apply the functor ``self`` to the ring morphism `f`.
830
+
831
+ TESTS::
832
+
833
+ sage: R = algebras.FreeDendriform(ZZ, 'x').construction()[0]
834
+ sage: R(ZZ.hom(GF(3))) # indirect doctest
835
+ Generic morphism:
836
+ From: Free Dendriform algebra on one generator ['x'] over Integer Ring
837
+ To: Free Dendriform algebra on one generator ['x'] over Finite Field of size 3
838
+ """
839
+ dom = self(f.domain())
840
+ codom = self(f.codomain())
841
+
842
+ def action(x):
843
+ return codom._from_dict({a: f(b)
844
+ for a, b in
845
+ x.monomial_coefficients().items()})
846
+ return dom.module_morphism(function=action, codomain=codom)
847
+
848
+ def __eq__(self, other):
849
+ """
850
+ EXAMPLES::
851
+
852
+ sage: F = algebras.FreeDendriform(ZZ, 'x,y,z').construction()[0]
853
+ sage: G = algebras.FreeDendriform(QQ, 'x,y,z').construction()[0]
854
+ sage: F == G
855
+ True
856
+ sage: G == loads(dumps(G))
857
+ True
858
+ sage: G = algebras.FreeDendriform(QQ, 'x,y').construction()[0]
859
+ sage: F == G
860
+ False
861
+ """
862
+ if not isinstance(other, DendriformFunctor):
863
+ return False
864
+ return self.vars == other.vars
865
+
866
+ def __ne__(self, other):
867
+ """
868
+ EXAMPLES::
869
+
870
+ sage: F = algebras.FreeDendriform(ZZ, 'x,y,z').construction()[0]
871
+ sage: G = algebras.FreeDendriform(QQ, 'x,y,z').construction()[0]
872
+ sage: F != G
873
+ False
874
+ sage: G != loads(dumps(G))
875
+ False
876
+ sage: G = algebras.FreeDendriform(QQ, 'x,y').construction()[0]
877
+ sage: F != G
878
+ True
879
+ """
880
+ return not (self == other)
881
+
882
+ def __mul__(self, other):
883
+ """
884
+ If two Dendriform functors are given in a row, form a single Dendriform functor
885
+ with all of the variables.
886
+
887
+ EXAMPLES::
888
+
889
+ sage: F = sage.combinat.free_dendriform_algebra.DendriformFunctor(['x','y'])
890
+ sage: G = sage.combinat.free_dendriform_algebra.DendriformFunctor(['t'])
891
+ sage: G * F
892
+ Dendriform[x,y,t]
893
+ """
894
+ if isinstance(other, IdentityConstructionFunctor):
895
+ return self
896
+ if isinstance(other, DendriformFunctor):
897
+ if set(self.vars).intersection(other.vars):
898
+ raise CoercionException("Overlapping variables (%s,%s)" %
899
+ (self.vars, other.vars))
900
+ return DendriformFunctor(other.vars + self.vars)
901
+ elif (isinstance(other, CompositeConstructionFunctor) and
902
+ isinstance(other.all[-1], DendriformFunctor)):
903
+ return CompositeConstructionFunctor(other.all[:-1],
904
+ self * other.all[-1])
905
+ else:
906
+ return CompositeConstructionFunctor(other, self)
907
+
908
+ def merge(self, other):
909
+ """
910
+ Merge ``self`` with another construction functor, or return ``None``.
911
+
912
+ EXAMPLES::
913
+
914
+ sage: F = sage.combinat.free_dendriform_algebra.DendriformFunctor(['x','y'])
915
+ sage: G = sage.combinat.free_dendriform_algebra.DendriformFunctor(['t'])
916
+ sage: F.merge(G)
917
+ Dendriform[x,y,t]
918
+ sage: F.merge(F)
919
+ Dendriform[x,y]
920
+
921
+ Now some actual use cases::
922
+
923
+ sage: R = algebras.FreeDendriform(ZZ, 'x,y,z')
924
+ sage: x,y,z = R.gens()
925
+ sage: 1/2 * x
926
+ 1/2*B[x[., .]]
927
+ sage: parent(1/2 * x)
928
+ Free Dendriform algebra on 3 generators ['x', 'y', 'z'] over Rational Field
929
+
930
+ sage: S = algebras.FreeDendriform(QQ, 'zt')
931
+ sage: z,t = S.gens()
932
+ sage: x + t
933
+ B[t[., .]] + B[x[., .]]
934
+ sage: parent(x + t)
935
+ Free Dendriform algebra on 4 generators ['z', 't', 'x', 'y'] over Rational Field
936
+ """
937
+ if isinstance(other, DendriformFunctor):
938
+ if self.vars == other.vars:
939
+ return self
940
+ ret = list(self.vars)
941
+ cur_vars = set(ret)
942
+ ret.extend(v for v in other.vars if v not in cur_vars)
943
+ return DendriformFunctor(Alphabet(ret))
944
+
945
+ return None
946
+
947
+ def _repr_(self) -> str:
948
+ """
949
+ TESTS::
950
+
951
+ sage: algebras.FreeDendriform(QQ,'x,y,z,t').construction()[0]
952
+ Dendriform[x,y,z,t]
953
+ """
954
+ return "Dendriform[%s]" % ','.join(self.vars)