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,885 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ """
4
+ Free Zinbiel Algebras
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2015-09): initial version
9
+ """
10
+
11
+ # ****************************************************************************
12
+ # Copyright (C) 2015 Travis Scrimshaw <tscrimsh at umn.edu>
13
+ #
14
+ # This program is free software: you can redistribute it and/or modify
15
+ # it under the terms of the GNU General Public License as published by
16
+ # the Free Software Foundation, either version 2 of the License, or
17
+ # (at your option) any later version.
18
+ # https://www.gnu.org/licenses/
19
+ # ****************************************************************************
20
+ from sage.misc.cachefunc import cached_method
21
+ from sage.categories.magmatic_algebras import MagmaticAlgebras
22
+ from sage.categories.magmas import Magmas
23
+ from sage.categories.pushout import (ConstructionFunctor,
24
+ CompositeConstructionFunctor,
25
+ IdentityConstructionFunctor)
26
+ from sage.categories.coalgebras_with_basis import CoalgebrasWithBasis
27
+ from sage.categories.rings import Rings
28
+ from sage.categories.functor import Functor
29
+ from sage.categories.sets_cat import Sets
30
+ from sage.combinat.free_module import CombinatorialFreeModule
31
+ from sage.combinat.words.words import Words
32
+ from sage.combinat.words.alphabet import Alphabet
33
+ from sage.sets.family import Family
34
+ from sage.structure.coerce_exceptions import CoercionException
35
+
36
+
37
+ class FreeZinbielAlgebra(CombinatorialFreeModule):
38
+ r"""
39
+ The free Zinbiel algebra on `n` generators.
40
+
41
+ Let `R` be a ring. A *Zinbiel algebra* is a non-associative
42
+ algebra with multiplication `\circ` that satisfies
43
+
44
+ .. MATH::
45
+
46
+ (a \circ b) \circ c = a \circ (b \circ c) + a \circ (c \circ b).
47
+
48
+ Zinbiel algebras were first introduced by Loday (see [Lod1995]_ and
49
+ [LV2012]_) as the Koszul dual to Leibniz algebras (hence the name
50
+ coined by Lemaire).
51
+
52
+ By default, the convention above is used. The opposite product,
53
+ which satisfy the opposite axiom, can be used instead by setting
54
+ the ``side`` parameter to ``'>'`` instead of the default value ``'<'``.
55
+
56
+ Zinbiel algebras are divided power algebras, in that for
57
+
58
+ .. MATH::
59
+
60
+ x^{\circ n} = \bigl(x \circ (x \circ \cdots \circ( x \circ x) \cdots
61
+ ) \bigr)
62
+
63
+ we have
64
+
65
+ .. MATH::
66
+
67
+ x^{\circ m} \circ x^{\circ n} = \binom{n+m-1}{m} x^{n+m}
68
+
69
+ and
70
+
71
+ .. MATH::
72
+
73
+ \underbrace{\bigl( ( x \circ \cdots \circ x \circ (x \circ x) \cdots
74
+ ) \bigr)}_{n+1 \text{ times}} = n! x^n.
75
+
76
+ .. NOTE::
77
+
78
+ This implies that Zinbiel algebras are not power associative.
79
+
80
+ To every Zinbiel algebra, we can construct a corresponding commutative
81
+ associative algebra by using the symmetrized product:
82
+
83
+ .. MATH::
84
+
85
+ a * b = a \circ b + b \circ a.
86
+
87
+ The free Zinbiel algebra on `n` generators is isomorphic as `R`-modules
88
+ to the reduced tensor algebra `\bar{T}(R^n)` with the product
89
+
90
+ .. MATH::
91
+
92
+ (x_0 x_1 \cdots x_p) \circ (x_{p+1} x_{p+2} \cdots x_{p+q})
93
+ = \sum_{\sigma \in S_{p,q}} x_0 (x_{\sigma(1)} x_{\sigma(2)}
94
+ \cdots x_{\sigma(p+q)},
95
+
96
+ where `S_{p,q}` is the set of `(p,q)`-shuffles.
97
+
98
+ The free Zinbiel algebra is free as a divided power algebra. Moreover,
99
+ the corresponding commutative algebra is isomorphic to the (non-unital)
100
+ shuffle algebra.
101
+
102
+ INPUT:
103
+
104
+ - ``R`` -- a ring
105
+ - ``n`` -- (optional) the number of generators
106
+ - ``names`` -- the generator names
107
+
108
+ .. WARNING::
109
+
110
+ Currently the basis is indexed by all finite words over the variables,
111
+ including the empty word. This is a slight abuse as it is supposed
112
+ to be indexed by all non-empty words.
113
+
114
+ EXAMPLES:
115
+
116
+ We create the free Zinbiel algebra and check the defining relation::
117
+
118
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
119
+ sage: (x*y)*z
120
+ Z[xyz] + Z[xzy]
121
+ sage: x*(y*z) + x*(z*y)
122
+ Z[xyz] + Z[xzy]
123
+
124
+ We see that the Zinbiel algebra is not associative, not even
125
+ power associative::
126
+
127
+ sage: x*(y*z)
128
+ Z[xyz]
129
+ sage: x*(x*x)
130
+ Z[xxx]
131
+ sage: (x*x)*x
132
+ 2*Z[xxx]
133
+
134
+ We verify that it is a divided power algebra::
135
+
136
+ sage: (x*(x*x)) * (x*(x*(x*x)))
137
+ 15*Z[xxxxxxx]
138
+ sage: binomial(3+4-1,4)
139
+ 15
140
+ sage: (x*(x*(x*x))) * (x*(x*x))
141
+ 20*Z[xxxxxxx]
142
+ sage: binomial(3+4-1,3)
143
+ 20
144
+ sage: ((x*x)*x)*x
145
+ 6*Z[xxxx]
146
+ sage: (((x*x)*x)*x)*x
147
+ 24*Z[xxxxx]
148
+
149
+ A few tests with the opposite convention for the product::
150
+
151
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ, side='>')
152
+ sage: (x*y)*z
153
+ Z[xyz]
154
+ sage: x*(y*z)
155
+ Z[xyz] + Z[yxz]
156
+
157
+ TESTS::
158
+
159
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
160
+ sage: Z.basis().keys()
161
+ Finite words over {'x', 'y', 'z'}
162
+
163
+ sage: A = algebras.FreeZinbiel(QQ,'z2,z3')
164
+ sage: x, y = A.gens()
165
+ sage: x*y
166
+ Z[z2,z3]
167
+
168
+ REFERENCES:
169
+
170
+ - :wikipedia:`Zinbiel_algebra`
171
+
172
+ - [Lod1995]_
173
+
174
+ - [LV2012]_
175
+ """
176
+ @staticmethod
177
+ def __classcall_private__(cls, R, n=None, names=None,
178
+ prefix=None, side=None):
179
+ """
180
+ Standardize input to ensure a unique representation.
181
+
182
+ TESTS::
183
+
184
+ sage: Z1.<x,y,z> = algebras.FreeZinbiel(QQ)
185
+ sage: Z2.<x,y,z> = algebras.FreeZinbiel(QQ, 3)
186
+ sage: Z3 = algebras.FreeZinbiel(QQ, 3, 'x,y,z')
187
+ sage: Z4.<x,y,z> = algebras.FreeZinbiel(QQ, 'x,y,z')
188
+ sage: Z1 is Z2 and Z1 is Z3 and Z1 is Z4
189
+ True
190
+
191
+ sage: algebras.FreeZinbiel(QQ, ['x', 'y'])
192
+ Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
193
+ sage: algebras.FreeZinbiel(QQ, ('x', 'y'))
194
+ Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
195
+
196
+ sage: Z = algebras.FreeZinbiel(QQ, ZZ)
197
+ """
198
+ if isinstance(n, (list, tuple)):
199
+ names = n
200
+ n = len(names)
201
+ elif isinstance(n, str):
202
+ names = n.split(',')
203
+ n = len(names)
204
+ elif isinstance(names, str):
205
+ names = names.split(',')
206
+ elif n is None:
207
+ n = len(names)
208
+ if R not in Rings():
209
+ raise TypeError("argument R must be a ring")
210
+ if prefix is None:
211
+ prefix = 'Z'
212
+ if side is None:
213
+ side = '<'
214
+ if side not in ['<', '>']:
215
+ raise ValueError("side must be either '<' or '>'")
216
+ if names is None:
217
+ return super().__classcall__(cls, R, n, None, prefix, side)
218
+ return super().__classcall__(cls, R, n, tuple(names), prefix, side)
219
+
220
+ def __init__(self, R, n, names, prefix, side):
221
+ """
222
+ Initialize ``self``.
223
+
224
+ EXAMPLES::
225
+
226
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
227
+ sage: TestSuite(Z).run()
228
+
229
+ sage: Z = algebras.FreeZinbiel(QQ, ZZ)
230
+ sage: G = Z.algebra_generators()
231
+ sage: TestSuite(Z).run(elements=[Z.an_element(), G[1], G[1]*G[2]*G[0]])
232
+
233
+ TESTS::
234
+
235
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(5)
236
+ Traceback (most recent call last):
237
+ ...
238
+ TypeError: argument R must be a ring
239
+
240
+ sage: algebras.FreeZinbiel(QQ, ['x', 'y'], prefix='f')
241
+ Free Zinbiel algebra on generators (f[x], f[y]) over Rational Field
242
+ """
243
+ if R not in Rings():
244
+ raise TypeError("argument R must be a ring")
245
+ if names is None:
246
+ indices = Words(Alphabet(n), infinite=False)
247
+ self._n = None
248
+ else:
249
+ indices = Words(Alphabet(n, names=names), infinite=False)
250
+ self._n = n
251
+ self._side = side
252
+ if side == '<':
253
+ self.product_on_basis = self.product_on_basis_left
254
+ else:
255
+ self.product_on_basis = self.product_on_basis_right
256
+ cat = MagmaticAlgebras(R).WithBasis().Graded()
257
+ cat &= CoalgebrasWithBasis(R)
258
+ CombinatorialFreeModule.__init__(self, R, indices, prefix=prefix,
259
+ category=cat)
260
+ if self._n is not None:
261
+ self._assign_names(names)
262
+
263
+ def _repr_term(self, t):
264
+ """
265
+ Return a string representation of the basis element indexed by ``t``.
266
+
267
+ EXAMPLES::
268
+
269
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
270
+ sage: Z._repr_term(Z._indices('xyzxxy'))
271
+ 'Z[xyzxxy]'
272
+ """
273
+ return "{!s}[{!s}]".format(self._print_options['prefix'], repr(t)[6:])
274
+
275
+ def _repr_(self):
276
+ """
277
+ Return a string representation of ``self``.
278
+
279
+ EXAMPLES::
280
+
281
+ sage: Z.<x,y> = algebras.FreeZinbiel(QQ)
282
+ sage: Z
283
+ Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
284
+
285
+ sage: Z = algebras.FreeZinbiel(QQ, ZZ)
286
+ sage: Z
287
+ Free Zinbiel algebra on generators indexed by Integer Ring over Rational Field
288
+ """
289
+ if self._n is None:
290
+ return "Free Zinbiel algebra on generators indexed by {} over {}".format(
291
+ self._indices.alphabet(), self.base_ring())
292
+ return "Free Zinbiel algebra on generators {} over {}".format(
293
+ self.gens(), self.base_ring())
294
+
295
+ def side(self):
296
+ """
297
+ Return the choice of side for the product.
298
+
299
+ This is either ``'<'`` or ``'>'``.
300
+
301
+ EXAMPLES::
302
+
303
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
304
+ sage: Z.side()
305
+ '<'
306
+ """
307
+ return self._side
308
+
309
+ @cached_method
310
+ def algebra_generators(self):
311
+ """
312
+ Return the algebra generators of ``self``.
313
+
314
+ EXAMPLES::
315
+
316
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
317
+ sage: list(Z.algebra_generators())
318
+ [Z[x], Z[y], Z[z]]
319
+ """
320
+ if self._n is None:
321
+ A = self._indices.alphabet()
322
+ else:
323
+ A = self.variable_names()
324
+ return Family(A, lambda g: self.monomial(self._indices([g])))
325
+
326
+ def change_ring(self, R):
327
+ """
328
+ Return the free Zinbiel algebra in the same variables over ``R``.
329
+
330
+ INPUT:
331
+
332
+ - ``R`` -- a ring
333
+
334
+ The same side convention is used for the product.
335
+
336
+ EXAMPLES::
337
+
338
+ sage: A = algebras.FreeZinbiel(ZZ, 'f,g,h')
339
+ sage: A.change_ring(QQ)
340
+ Free Zinbiel algebra on generators (Z[f], Z[g], Z[h])
341
+ over Rational Field
342
+ """
343
+ A = self.variable_names()
344
+ return FreeZinbielAlgebra(R, n=len(A), names=A, side=self._side)
345
+
346
+ @cached_method
347
+ def gens(self) -> tuple:
348
+ """
349
+ Return the generators of ``self``.
350
+
351
+ EXAMPLES::
352
+
353
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
354
+ sage: Z.gens()
355
+ (Z[x], Z[y], Z[z])
356
+ """
357
+ if self._n is None:
358
+ return self.algebra_generators()
359
+ return tuple(self.algebra_generators())
360
+
361
+ def degree_on_basis(self, t):
362
+ """
363
+ Return the degree of a word in the free Zinbiel algebra.
364
+
365
+ This is the length.
366
+
367
+ EXAMPLES::
368
+
369
+ sage: A = algebras.FreeZinbiel(QQ, 'x,y')
370
+ sage: W = A.basis().keys()
371
+ sage: A.degree_on_basis(W('xy'))
372
+ 2
373
+ """
374
+ return len(t)
375
+
376
+ def product_on_basis_left(self, x, y):
377
+ """
378
+ Return the product < of the basis elements indexed by ``x`` and ``y``.
379
+
380
+ This is one half of the shuffle product, where the first letter
381
+ comes from the first letter of the first argument.
382
+
383
+ INPUT:
384
+
385
+ - ``x``, ``y`` -- two words
386
+
387
+ EXAMPLES::
388
+
389
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
390
+ sage: (x*y)*z # indirect doctest
391
+ Z[xyz] + Z[xzy]
392
+
393
+ TESTS::
394
+
395
+ sage: Z.<x,y> = algebras.FreeZinbiel(QQ)
396
+ sage: Z.product_on_basis(Word(), Word('y'))
397
+ Z[y]
398
+ """
399
+ if not x:
400
+ return self.monomial(y)
401
+ x0 = self._indices([x[0]])
402
+ return self.sum_of_monomials(x0 + sh for sh in x[1:].shuffle(y))
403
+
404
+ def product_on_basis_right(self, x, y):
405
+ """
406
+ Return the product > of the basis elements indexed by ``x`` and ``y``.
407
+
408
+ This is one half of the shuffle product, where the last letter
409
+ comes from the last letter of the second argument.
410
+
411
+ INPUT:
412
+
413
+ - ``x``, ``y`` -- two words
414
+
415
+ EXAMPLES::
416
+
417
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ, side='>')
418
+ sage: (x*y)*z # indirect doctest
419
+ Z[xyz]
420
+
421
+ TESTS::
422
+
423
+ sage: Z.<x,y> = algebras.FreeZinbiel(QQ, side='>')
424
+ sage: Z.product_on_basis(Word('x'), Word())
425
+ Z[x]
426
+ """
427
+ if not y:
428
+ return self.monomial(x)
429
+ yf = self._indices([y[-1]])
430
+ return self.sum_of_monomials(sh + yf for sh in x.shuffle(y[:-1]))
431
+
432
+ def coproduct_on_basis(self, w):
433
+ """
434
+ Return the coproduct of the element of the basis indexed by
435
+ the word ``w``.
436
+
437
+ The coproduct is given by deconcatenation.
438
+
439
+ INPUT:
440
+
441
+ - ``w`` -- a word
442
+
443
+ EXAMPLES::
444
+
445
+ sage: F = algebras.FreeZinbiel(QQ,['a','b'])
446
+ sage: F.coproduct_on_basis(Word('a'))
447
+ Z[] # Z[a] + Z[a] # Z[]
448
+ sage: F.coproduct_on_basis(Word('aba'))
449
+ Z[] # Z[aba] + Z[a] # Z[ba] + Z[ab] # Z[a] + Z[aba] # Z[]
450
+ sage: F.coproduct_on_basis(Word())
451
+ Z[] # Z[]
452
+
453
+ TESTS::
454
+
455
+ sage: F = algebras.FreeZinbiel(QQ,['a','b'])
456
+ sage: S = F.an_element(); S
457
+ Z[] + 2*Z[a] + 3*Z[b] + Z[bab]
458
+ sage: F.coproduct(S)
459
+ Z[] # Z[] + 2*Z[] # Z[a] + 3*Z[] # Z[b] + Z[] # Z[bab] +
460
+ 2*Z[a] # Z[] + 3*Z[b] # Z[] + Z[b] # Z[ab] + Z[ba] # Z[b] +
461
+ Z[bab] # Z[]
462
+ """
463
+ TS = self.tensor_square()
464
+ return TS.sum_of_monomials((w[:i], w[i:]) for i in range(len(w) + 1))
465
+
466
+ def counit(self, S):
467
+ """
468
+ Return the counit of ``S``.
469
+
470
+ EXAMPLES::
471
+
472
+ sage: F = algebras.FreeZinbiel(QQ,['a','b'])
473
+ sage: S = F.an_element(); S
474
+ Z[] + 2*Z[a] + 3*Z[b] + Z[bab]
475
+ sage: F.counit(S)
476
+ 1
477
+ """
478
+ W = self.basis().keys()
479
+ return S.coefficient(W())
480
+
481
+ def _element_constructor_(self, x):
482
+ r"""
483
+ Convert ``x`` into ``self``.
484
+
485
+ EXAMPLES::
486
+
487
+ sage: R = algebras.FreeZinbiel(QQ, 'x,y')
488
+ sage: x, y = R.gens()
489
+ sage: R(x)
490
+ Z[x]
491
+ sage: R(x+4*y)
492
+ Z[x] + 4*Z[y]
493
+
494
+ sage: W = R.basis().keys()
495
+ sage: R(W('x'))
496
+ Z[x]
497
+ sage: D = algebras.FreeZinbiel(ZZ, 'x,y')
498
+ sage: X, Y = D.gens()
499
+ sage: R(X-Y).parent()
500
+ Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
501
+
502
+ TESTS::
503
+
504
+ sage: R.<x,y> = algebras.FreeZinbiel(QQ)
505
+ sage: S.<z> = algebras.FreeZinbiel(GF(3))
506
+ sage: R(z)
507
+ Traceback (most recent call last):
508
+ ...
509
+ TypeError: not able to convert this to this algebra
510
+ """
511
+ if x in self.basis().keys():
512
+ return self.monomial(x)
513
+ try:
514
+ P = x.parent()
515
+ except AttributeError:
516
+ raise TypeError('not able to convert this to this algebra')
517
+ if isinstance(P, FreeZinbielAlgebra) and self._coerce_map_from_(P):
518
+ if self._side == P._side:
519
+ return self.element_class(self,
520
+ x.monomial_coefficients(copy=False))
521
+ else:
522
+ dic = x.monomial_coefficients(copy=False)
523
+ # canonical isomorphism when switching side
524
+ return self.element_class(self,
525
+ {w.reversal(): cf
526
+ for w, cf in dic.items()})
527
+ else:
528
+ raise TypeError('not able to convert this to this algebra')
529
+ # Ok, not a Zinbiel algebra element (or should not be viewed as one).
530
+
531
+ def _coerce_map_from_(self, R):
532
+ r"""
533
+ Return ``True`` if there is a coercion from ``R`` into ``self``
534
+ and ``False`` otherwise.
535
+
536
+ The things that coerce into ``self`` are
537
+
538
+ - free Zinbiel algebras whose set `E` of labels is
539
+ a subset of the corresponding ``self`` of ``set``, and whose base
540
+ ring has a coercion map into ``self.base_ring()``
541
+
542
+ EXAMPLES::
543
+
544
+ sage: F = algebras.FreeZinbiel(GF(7), 'x,y,z'); F
545
+ Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
546
+ over Finite Field of size 7
547
+
548
+ Elements of the free Zinbiel algebra canonically coerce in::
549
+
550
+ sage: x, y, z = F.gens()
551
+ sage: F.coerce(x+y) == x+y
552
+ True
553
+
554
+ The free Zinbiel algebra over `\ZZ` on `x, y, z` coerces in, since
555
+ `\ZZ` coerces to `\GF{7}`::
556
+
557
+ sage: G = algebras.FreeZinbiel(ZZ, 'x,y,z')
558
+ sage: Gx,Gy,Gz = G.gens()
559
+ sage: z = F.coerce(Gx+Gy); z
560
+ Z[x] + Z[y]
561
+ sage: z.parent() is F
562
+ True
563
+
564
+ However, `\GF{7}` does not coerce to `\ZZ`, so the free Zinbiel
565
+ algebra over `\GF{7}` does not coerce to the one over `\ZZ`::
566
+
567
+ sage: G.coerce(y)
568
+ Traceback (most recent call last):
569
+ ...
570
+ TypeError: no canonical coercion from Free Zinbiel algebra on
571
+ generators (Z[x], Z[y], Z[z]) over Finite Field of size 7 to
572
+ Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
573
+ over Integer Ring
574
+
575
+ TESTS::
576
+
577
+ sage: F = algebras.FreeZinbiel(ZZ, 'x,y,z')
578
+ sage: G = algebras.FreeZinbiel(QQ, 'x,y,z')
579
+ sage: H = algebras.FreeZinbiel(ZZ, 'y')
580
+ sage: F._coerce_map_from_(G)
581
+ False
582
+ sage: G._coerce_map_from_(F)
583
+ True
584
+ sage: F._coerce_map_from_(H)
585
+ True
586
+ sage: F._coerce_map_from_(QQ) is None
587
+ True
588
+ sage: G._coerce_map_from_(QQ) is None
589
+ True
590
+ sage: F.has_coerce_map_from(PolynomialRing(ZZ, 3, 'x,y,z'))
591
+ False
592
+
593
+ sage: I = algebras.FreeZinbiel(ZZ, ZZ)
594
+ sage: F._coerce_map_from_(I)
595
+ False
596
+ sage: I._coerce_map_from_(F)
597
+ False
598
+ """
599
+ # free Zinbiel algebras in a subset of variables
600
+ # over any base that coerces in:
601
+ if isinstance(R, FreeZinbielAlgebra):
602
+ if self._n is None or R._n is None:
603
+ return False
604
+ return (all(x in self.variable_names()
605
+ for x in R.variable_names()) and
606
+ self.base_ring().has_coerce_map_from(R.base_ring()))
607
+ return super()._coerce_map_from_(R)
608
+
609
+ def construction(self):
610
+ """
611
+ Return a pair ``(F, R)``, where ``F`` is a :class:`ZinbielFunctor`
612
+ and ``R`` is a ring, such that ``F(R)`` returns ``self``.
613
+
614
+ EXAMPLES::
615
+
616
+ sage: P = algebras.FreeZinbiel(ZZ, 'x,y')
617
+ sage: x,y = P.gens()
618
+ sage: F, R = P.construction()
619
+ sage: F
620
+ Zinbiel[x,y]
621
+ sage: R
622
+ Integer Ring
623
+ sage: F(ZZ) is P
624
+ True
625
+ sage: F(QQ)
626
+ Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
627
+ """
628
+ if self._n is None:
629
+ A = self._indices.alphabet()
630
+ else:
631
+ A = self.variable_names()
632
+ return ZinbielFunctor(A, side=self._side), self.base_ring()
633
+
634
+
635
+ class ZinbielFunctor(ConstructionFunctor):
636
+ """
637
+ A constructor for free Zinbiel algebras.
638
+
639
+ EXAMPLES::
640
+
641
+ sage: P = algebras.FreeZinbiel(ZZ, 'x,y')
642
+ sage: x,y = P.gens()
643
+ sage: F = P.construction()[0]; F
644
+ Zinbiel[x,y]
645
+
646
+ sage: A = GF(5)['a,b']
647
+ sage: a, b = A.gens()
648
+ sage: F(A)
649
+ Free Zinbiel algebra on generators (Z[x], Z[y])
650
+ over Multivariate Polynomial Ring in a, b over Finite Field of size 5
651
+
652
+ sage: f = A.hom([a+b,a-b],A)
653
+ sage: F(f)
654
+ Generic endomorphism of Free Zinbiel algebra on generators (Z[x], Z[y])
655
+ over Multivariate Polynomial Ring in a, b over Finite Field of size 5
656
+
657
+ sage: F(f)(a * F(A)(x))
658
+ (a+b)*Z[x]
659
+ """
660
+ rank = 9
661
+
662
+ def __init__(self, variables, side):
663
+ """
664
+ EXAMPLES::
665
+
666
+ sage: functor = sage.algebras.free_zinbiel_algebra.ZinbielFunctor
667
+ sage: F = functor(['x','y'], '<'); F
668
+ Zinbiel[x,y]
669
+ sage: F(ZZ)
670
+ Free Zinbiel algebra on generators (Z[x], Z[y]) over Integer Ring
671
+ """
672
+ Functor.__init__(self, Rings(), Magmas())
673
+ self.vars = variables
674
+ self._side = side
675
+ self._finite_vars = bool(isinstance(variables, (list, tuple)) or variables in Sets().Finite())
676
+
677
+ def _apply_functor(self, R):
678
+ """
679
+ Apply the functor to an object of ``self``'s domain.
680
+
681
+ EXAMPLES::
682
+
683
+ sage: R = algebras.FreeZinbiel(ZZ, 'x,y,z')
684
+ sage: F = R.construction()[0]; F
685
+ Zinbiel[x,y,z]
686
+ sage: type(F)
687
+ <class 'sage.algebras.free_zinbiel_algebra.ZinbielFunctor'>
688
+ sage: F(ZZ) # indirect doctest
689
+ Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
690
+ over Integer Ring
691
+
692
+ sage: R = algebras.FreeZinbiel(QQ, ZZ)
693
+ sage: F = R.construction()[0]; F
694
+ Zinbiel[Integer Ring]
695
+ sage: F(ZZ) # indirect doctest
696
+ Free Zinbiel algebra on generators indexed by Integer Ring over Integer Ring
697
+ """
698
+ if self._finite_vars:
699
+ return FreeZinbielAlgebra(R, len(self.vars), self.vars,
700
+ side=self._side)
701
+ return FreeZinbielAlgebra(R, self.vars, side=self._side)
702
+
703
+ def _apply_functor_to_morphism(self, f):
704
+ """
705
+ Apply the functor ``self`` to the ring morphism `f`.
706
+
707
+ TESTS::
708
+
709
+ sage: R = algebras.FreeZinbiel(ZZ, 'x').construction()[0]
710
+ sage: R(ZZ.hom(GF(3))) # indirect doctest
711
+ Generic morphism:
712
+ From: Free Zinbiel algebra on generators (Z[x],)
713
+ over Integer Ring
714
+ To: Free Zinbiel algebra on generators (Z[x],)
715
+ over Finite Field of size 3
716
+ """
717
+ dom = self(f.domain())
718
+ codom = self(f.codomain())
719
+
720
+ def action(x):
721
+ return codom._from_dict({a: f(b)
722
+ for a, b in x.monomial_coefficients(copy=False).items()})
723
+ return dom.module_morphism(function=action, codomain=codom)
724
+
725
+ def __eq__(self, other):
726
+ """
727
+ EXAMPLES::
728
+
729
+ sage: F = algebras.FreeZinbiel(ZZ, 'x,y,z').construction()[0]
730
+ sage: G = algebras.FreeZinbiel(QQ, 'x,y,z').construction()[0]
731
+ sage: F == G
732
+ True
733
+ sage: G == loads(dumps(G))
734
+ True
735
+ sage: G = algebras.FreeZinbiel(QQ, 'x,y').construction()[0]
736
+ sage: F == G
737
+ False
738
+ """
739
+ if not isinstance(other, ZinbielFunctor):
740
+ return False
741
+ return self.vars == other.vars and self._side == other._side
742
+
743
+ def __hash__(self):
744
+ """
745
+ Return the hash of ``self``.
746
+
747
+ EXAMPLES::
748
+
749
+ sage: F = algebras.FreeZinbiel(ZZ, 'x,y,z').construction()[0]
750
+ sage: G = algebras.FreeZinbiel(QQ, 'x,y,z').construction()[0]
751
+ sage: hash(F) == hash(G)
752
+ True
753
+ """
754
+ return hash(repr(self))
755
+
756
+ def __mul__(self, other):
757
+ """
758
+ If two Zinbiel functors are given in a row, form a single
759
+ Zinbiel functor with all of the variables.
760
+
761
+ EXAMPLES::
762
+
763
+ sage: from sage.algebras.free_zinbiel_algebra import ZinbielFunctor as functor
764
+ sage: F = functor(['x','y'], '<')
765
+ sage: G = functor(['t'], '<')
766
+ sage: G * F
767
+ Zinbiel[x,y,t]
768
+
769
+ With an infinite generating set::
770
+
771
+ sage: H = functor(ZZ, '<')
772
+ sage: H * G
773
+ Traceback (most recent call last):
774
+ ...
775
+ CoercionException: Unable to determine overlap for infinite sets
776
+ sage: G * H
777
+ Traceback (most recent call last):
778
+ ...
779
+ CoercionException: Unable to determine overlap for infinite sets
780
+ """
781
+ if isinstance(other, IdentityConstructionFunctor):
782
+ return self
783
+ if isinstance(other, ZinbielFunctor):
784
+ if self._side != other._side:
785
+ raise CoercionException("detection of distinct sides")
786
+ if not self._finite_vars or not other._finite_vars:
787
+ raise CoercionException("Unable to determine overlap for infinite sets")
788
+ if set(self.vars).intersection(other.vars):
789
+ raise CoercionException("Overlapping variables (%s,%s)" %
790
+ (self.vars, other.vars))
791
+ return ZinbielFunctor(other.vars + self.vars, self._side)
792
+ elif (isinstance(other, CompositeConstructionFunctor) and
793
+ isinstance(other.all[-1], ZinbielFunctor)):
794
+ return CompositeConstructionFunctor(other.all[:-1],
795
+ self * other.all[-1])
796
+ else:
797
+ return CompositeConstructionFunctor(other, self)
798
+
799
+ def merge(self, other):
800
+ """
801
+ Merge ``self`` with another construction functor, or return ``None``.
802
+
803
+ EXAMPLES::
804
+
805
+ sage: functor = sage.algebras.free_zinbiel_algebra.ZinbielFunctor
806
+ sage: F = functor(['x','y'], '<')
807
+ sage: G = functor(['t'], '<')
808
+ sage: F.merge(G)
809
+ Zinbiel[x,y,t]
810
+ sage: F.merge(F)
811
+ Zinbiel[x,y]
812
+
813
+ With an infinite generating set::
814
+
815
+ sage: H = functor(ZZ, '<')
816
+ sage: H.merge(H) is H
817
+ True
818
+ sage: H.merge(F) is None
819
+ True
820
+ sage: F.merge(H) is None
821
+ True
822
+
823
+ Now some actual use cases::
824
+
825
+ sage: R = algebras.FreeZinbiel(ZZ, 'x,y,z')
826
+ sage: x,y,z = R.gens()
827
+ sage: 1/2 * x
828
+ 1/2*Z[x]
829
+ sage: parent(1/2 * x)
830
+ Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
831
+ over Rational Field
832
+
833
+ sage: S = algebras.FreeZinbiel(QQ, 'z,t')
834
+ sage: z,t = S.gens()
835
+ sage: x * t
836
+ Z[xt]
837
+ sage: parent(x * t)
838
+ Free Zinbiel algebra on generators (Z[z], Z[t], Z[x], Z[y])
839
+ over Rational Field
840
+
841
+ TESTS:
842
+
843
+ Using the other side convention::
844
+
845
+ sage: F = functor(['x','y'], '>')
846
+ sage: G = functor(['t'], '>')
847
+ sage: H = functor(['t'], '<')
848
+ sage: F.merge(G)
849
+ Zinbiel[x,y,t]
850
+ sage: F.merge(H)
851
+ Traceback (most recent call last):
852
+ ...
853
+ TypeError: cannot merge free Zinbiel algebras with distinct sides
854
+ """
855
+ if isinstance(other, ZinbielFunctor):
856
+ if self._side != other._side:
857
+ raise TypeError('cannot merge free Zinbiel algebras '
858
+ 'with distinct sides')
859
+ if self.vars == other.vars:
860
+ return self
861
+
862
+ def check(x):
863
+ return isinstance(x, (list, tuple)) or x in Sets().Finite()
864
+ if not check(self.vars) or not check(other.vars):
865
+ return None
866
+ ret = list(self.vars)
867
+ cur_vars = set(ret)
868
+ ret.extend(v for v in other.vars if v not in cur_vars)
869
+ return ZinbielFunctor(ret, self._side)
870
+
871
+ return None
872
+
873
+ def _repr_(self) -> str:
874
+ """
875
+ TESTS::
876
+
877
+ sage: algebras.FreeZinbiel(QQ,'x,y,z,t').construction()[0]
878
+ Zinbiel[x,y,z,t]
879
+
880
+ sage: algebras.FreeZinbiel(QQ, ZZ).construction()[0]
881
+ Zinbiel[Integer Ring]
882
+ """
883
+ if self._finite_vars:
884
+ return "Zinbiel[%s]" % ','.join(self.vars)
885
+ return "Zinbiel[{}]".format(self.vars)