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,685 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ r"""
4
+ Blob algebras
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2020-05-16): Initial version
9
+ """
10
+
11
+ # ****************************************************************************
12
+ # Copyright (C) 2020 Travis Scrimshaw <tcscrims at gmail.com>
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
+
21
+ from sage.categories.algebras import Algebras
22
+ from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
23
+ from sage.combinat.diagram_algebras import (TemperleyLiebDiagrams, diagram_latex,
24
+ TL_diagram_ascii_art)
25
+ from sage.combinat.dyck_word import DyckWords
26
+ from sage.combinat.free_module import CombinatorialFreeModule
27
+ from sage.combinat.subset import powerset
28
+ from sage.misc.cachefunc import cached_method
29
+ from sage.rings.integer import Integer
30
+ from sage.structure.element import Element, get_coercion_model
31
+ from sage.structure.parent import Parent
32
+ from sage.structure.richcmp import richcmp
33
+ from sage.structure.unique_representation import UniqueRepresentation
34
+
35
+
36
+ class BlobDiagram(Element):
37
+ r"""
38
+ A blob diagram.
39
+
40
+ A blob diagram consists of a perfect matching of the set
41
+ `\{1, \ldots, n\} \sqcup \{-1, \ldots, -n\}` such that the result
42
+ is a noncrossing matching (a :class:`Temperley-Lieb diagram
43
+ <sage.combinat.diagram_algebras.TemperleyLiebDiagram>`), divided
44
+ into two sets of pairs: one for the pairs with blobs and one for
45
+ those without. The blobed pairs must either be either the leftmost
46
+ propagating strand or to the left of it and not nested.
47
+ """
48
+
49
+ def __init__(self, parent, marked, unmarked):
50
+ r"""
51
+ Initialize ``self``.
52
+
53
+ TESTS::
54
+
55
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
56
+ sage: BD4 = BlobDiagrams(4)
57
+ sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
58
+ sage: TestSuite(B).run()
59
+ """
60
+ Element.__init__(self, parent)
61
+ self.marked = tuple(sorted([tuple(sorted(pair)) for pair in marked]))
62
+ self.unmarked = tuple(sorted([tuple(sorted(pair)) for pair in unmarked]))
63
+
64
+ def _repr_(self):
65
+ r"""
66
+ Return a string representation of ``self``.
67
+
68
+ EXAMPLES::
69
+
70
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
71
+ sage: BD4 = BlobDiagrams(4)
72
+ sage: BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
73
+ ({{-3, 1}}, {{-4, 2}, {-2, -1}, {3, 4}})
74
+ """
75
+ return '({{{}}}, {{{}}})'.format(', '.join('{' + repr(X)[1:-1] + '}'
76
+ for X in self.marked),
77
+ ', '.join('{' + repr(X)[1:-1] + '}'
78
+ for X in self.unmarked))
79
+
80
+ def __hash__(self):
81
+ r"""
82
+ Return the hash of ``self``.
83
+
84
+ EXAMPLES::
85
+
86
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
87
+ sage: BD4 = BlobDiagrams(4)
88
+ sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
89
+ sage: hash(B) in [hash(D) for D in BD4]
90
+ True
91
+ sage: len(set([hash(D) for D in BD4])) == len(BD4)
92
+ True
93
+ """
94
+ return hash((self.marked, self.unmarked))
95
+
96
+ def _richcmp_(self, other, op):
97
+ r"""
98
+ Compare ``self`` to ``other`` with operation ``op``.
99
+
100
+ EXAMPLES::
101
+
102
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
103
+ sage: BD4 = BlobDiagrams(4)
104
+ sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
105
+ sage: any(B == D for D in BD4)
106
+ True
107
+ sage: B2 = BD4([], [[1,-3], [2,-4], [3,4], [-1,-2]])
108
+ sage: B == B2
109
+ False
110
+ sage: B != B2
111
+ True
112
+ sage: sorted(BlobDiagrams(3))
113
+ [({}, {{-3, -2}, {-1, 1}, {2, 3}}),
114
+ ({}, {{-3, -2}, {-1, 3}, {1, 2}}),
115
+ ({}, {{-3, 1}, {-2, -1}, {2, 3}}),
116
+ ({}, {{-3, 3}, {-2, -1}, {1, 2}}),
117
+ ({}, {{-3, 3}, {-2, 2}, {-1, 1}}),
118
+ ({{-3, 1}}, {{-2, -1}, {2, 3}}),
119
+ ({{-3, 3}}, {{-2, -1}, {1, 2}}),
120
+ ({{-2, -1}}, {{-3, 1}, {2, 3}}),
121
+ ({{-2, -1}}, {{-3, 3}, {1, 2}}),
122
+ ({{-1, 1}}, {{-3, -2}, {2, 3}}),
123
+ ({{-1, 1}}, {{-3, 3}, {-2, 2}}),
124
+ ({{-1, 3}}, {{-3, -2}, {1, 2}}),
125
+ ({{1, 2}}, {{-3, -2}, {-1, 3}}),
126
+ ({{1, 2}}, {{-3, 3}, {-2, -1}}),
127
+ ({{-3, 1}, {-2, -1}}, {{2, 3}}),
128
+ ({{-3, 3}, {-2, -1}}, {{1, 2}}),
129
+ ({{-3, 3}, {1, 2}}, {{-2, -1}}),
130
+ ({{-2, -1}, {1, 2}}, {{-3, 3}}),
131
+ ({{-1, 3}, {1, 2}}, {{-3, -2}}),
132
+ ({{-3, 3}, {-2, -1}, {1, 2}}, {})]
133
+ """
134
+ return richcmp((len(self.marked), self.marked, self.unmarked),
135
+ (len(other.marked), other.marked, other.unmarked),
136
+ op)
137
+
138
+ def temperley_lieb_diagram(self):
139
+ r"""
140
+ Return the Temperley-Lieb diagram corresponding to ``self``.
141
+
142
+ EXAMPLES::
143
+
144
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
145
+ sage: BD4 = BlobDiagrams(4)
146
+ sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
147
+ sage: B.temperley_lieb_diagram()
148
+ {{-4, 2}, {-3, 1}, {-2, -1}, {3, 4}}
149
+ """
150
+ return self.parent()._TL_diagrams(self.marked + self.unmarked)
151
+
152
+
153
+ class BlobDiagrams(Parent, UniqueRepresentation):
154
+ r"""
155
+ The set of all blob diagrams.
156
+ """
157
+
158
+ def __init__(self, n):
159
+ r"""
160
+ Initialize ``self``.
161
+
162
+ TESTS::
163
+
164
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
165
+ sage: BD4 = BlobDiagrams(4)
166
+ sage: TestSuite(BD4).run()
167
+ """
168
+ self._n = Integer(n)
169
+ self._TL_diagrams = TemperleyLiebDiagrams(n)
170
+ Parent.__init__(self, category=FiniteEnumeratedSets())
171
+
172
+ def _repr_(self):
173
+ r"""
174
+ Return a string representation of ``self``.
175
+
176
+ EXAMPLES::
177
+
178
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
179
+ sage: BlobDiagrams(4)
180
+ Blob diagrams of order 4
181
+ """
182
+ return f"Blob diagrams of order {self._n}"
183
+
184
+ def cardinality(self):
185
+ r"""
186
+ Return the cardinality of ``self``.
187
+
188
+ EXAMPLES::
189
+
190
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
191
+ sage: BD4 = BlobDiagrams(4)
192
+ sage: BD4.cardinality()
193
+ 70
194
+ """
195
+ return (2 * self._n).binomial(self._n)
196
+
197
+ def order(self):
198
+ r"""
199
+ Return the order of ``self``.
200
+
201
+ EXAMPLES::
202
+
203
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
204
+ sage: BD4 = BlobDiagrams(4)
205
+ sage: BD4.order()
206
+ 4
207
+ """
208
+ return self._n
209
+
210
+ @cached_method
211
+ def base_set(self):
212
+ r"""
213
+ Return the base set of ``self``.
214
+
215
+ EXAMPLES::
216
+
217
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
218
+ sage: BD4 = BlobDiagrams(4)
219
+ sage: sorted(BD4.base_set())
220
+ [-4, -3, -2, -1, 1, 2, 3, 4]
221
+ """
222
+ return frozenset(range(1, self._n + 1)).union(range(-self._n, 0))
223
+
224
+ def _element_constructor_(self, marked, unmarked=None):
225
+ r"""
226
+ Construct an element of ``self``.
227
+
228
+ EXAMPLES::
229
+
230
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
231
+ sage: BD4 = BlobDiagrams(4)
232
+ sage: BD4([[1,-3]], [[-1,-2], [2,3], [-4,4]])
233
+ ({{-3, 1}}, {{-4, 4}, {-2, -1}, {2, 3}})
234
+ sage: BD4([[(1,-3)], ([-1,-2], (2,3), [-4,4])])
235
+ ({{-3, 1}}, {{-4, 4}, {-2, -1}, {2, 3}})
236
+ """
237
+ if unmarked is None:
238
+ marked, unmarked = marked
239
+ ret = self.element_class(self, marked, unmarked)
240
+ if ret not in self:
241
+ raise ValueError("not a blob diagram of order {}".format(self._n))
242
+ return ret
243
+
244
+ def __contains__(self, X):
245
+ r"""
246
+ Check if ``X`` is contained in ``self``.
247
+
248
+ EXAMPLES::
249
+
250
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
251
+ sage: BD4 = BlobDiagrams(4)
252
+ sage: BD4([[1,-3], [-1,-2]], [[2,-4], [3,4]]) # indirect doctest
253
+ ({{-3, 1}, {-2, -1}}, {{-4, 2}, {3, 4}})
254
+ sage: BD4([[1,4], [-1,-2], [-3,-4]], [[2,3]]) # indirect doctest
255
+ ({{-4, -3}, {-2, -1}, {1, 4}}, {{2, 3}})
256
+
257
+ sage: BD4([[1,-2], [-1,-3]], [[2,-4], [3,4]]) # crossing strands
258
+ Traceback (most recent call last):
259
+ ...
260
+ ValueError: not a blob diagram of order 4
261
+ sage: BD4([[1,-4], [-1,-2]], [[2,-3], [3,4]]) # crossing strands
262
+ Traceback (most recent call last):
263
+ ...
264
+ ValueError: not a blob diagram of order 4
265
+ sage: BD4([[1,-2], [-1,-3]], [[3,-4], [2,4]]) # crossing strands
266
+ Traceback (most recent call last):
267
+ ...
268
+ ValueError: not a blob diagram of order 4
269
+ sage: BD4([[1,-3], [-1,-2], [3,4]], [[2,-4]]) # trapped blob cup
270
+ Traceback (most recent call last):
271
+ ...
272
+ ValueError: not a blob diagram of order 4
273
+ sage: BD4([[-1,3], [1,2], [-3,-4]], [[-2,4]]) # trapped blob cap
274
+ Traceback (most recent call last):
275
+ ...
276
+ ValueError: not a blob diagram of order 4
277
+ sage: BD4([[1,4], [-1,-2], [-3,-4], [2,3]], []) # nested blob cup
278
+ Traceback (most recent call last):
279
+ ...
280
+ ValueError: not a blob diagram of order 4
281
+ sage: BD4([[-1,-4], [1,2], [3,4], [-2,-3]], []) # nested blob cap
282
+ Traceback (most recent call last):
283
+ ...
284
+ ValueError: not a blob diagram of order 4
285
+ sage: BD4([[3,-3]], [[1,-1],[2,-2],[4,-4]]) # trapped propagating line
286
+ Traceback (most recent call last):
287
+ ...
288
+ ValueError: not a blob diagram of order 4
289
+ """
290
+ if not isinstance(X, BlobDiagram):
291
+ return False
292
+ # Check that it is a Temperley-Lieb diagram
293
+ TL = X.marked + X.unmarked # the TL diagram
294
+ if TL not in self._TL_diagrams:
295
+ return False
296
+ # Check left escaping
297
+ for x, y in X.marked:
298
+ if x > 0: # Must be a cup
299
+ for P in TL:
300
+ if P[1] < 0: # P is a cap
301
+ continue
302
+ if P[1] < x:
303
+ if P[0] < 0: # A propagating line to the left
304
+ return False
305
+ else: # Note that P[1] != x
306
+ if 0 < P[0] < x: # A nesting line
307
+ return False
308
+ elif y < 0: # Must be a cap
309
+ for P in TL:
310
+ if P[0] > 0: # P is a cup
311
+ continue
312
+ if P[0] > y:
313
+ if P[1] > 0: # A propagating line to the left
314
+ return False
315
+ else: # Note that P[0] != y
316
+ if 0 > P[1] > y: # A nesting line
317
+ return False
318
+ else: # Must be a propagating line
319
+ if any(P[0] < 0 and P[1] > 0 and P[1] < y for P in TL):
320
+ return False
321
+ return True
322
+
323
+ def __iter__(self):
324
+ r"""
325
+ Iterate over ``self``.
326
+
327
+ EXAMPLES::
328
+
329
+ sage: from sage.combinat.blob_algebra import BlobDiagrams
330
+ sage: BD3 = BlobDiagrams(3)
331
+ sage: sorted(BD3)
332
+ [({}, {{-3, -2}, {-1, 1}, {2, 3}}),
333
+ ({}, {{-3, -2}, {-1, 3}, {1, 2}}),
334
+ ({}, {{-3, 1}, {-2, -1}, {2, 3}}),
335
+ ({}, {{-3, 3}, {-2, -1}, {1, 2}}),
336
+ ({}, {{-3, 3}, {-2, 2}, {-1, 1}}),
337
+ ({{-3, 1}}, {{-2, -1}, {2, 3}}),
338
+ ({{-3, 3}}, {{-2, -1}, {1, 2}}),
339
+ ({{-2, -1}}, {{-3, 1}, {2, 3}}),
340
+ ({{-2, -1}}, {{-3, 3}, {1, 2}}),
341
+ ({{-1, 1}}, {{-3, -2}, {2, 3}}),
342
+ ({{-1, 1}}, {{-3, 3}, {-2, 2}}),
343
+ ({{-1, 3}}, {{-3, -2}, {1, 2}}),
344
+ ({{1, 2}}, {{-3, -2}, {-1, 3}}),
345
+ ({{1, 2}}, {{-3, 3}, {-2, -1}}),
346
+ ({{-3, 1}, {-2, -1}}, {{2, 3}}),
347
+ ({{-3, 3}, {-2, -1}}, {{1, 2}}),
348
+ ({{-3, 3}, {1, 2}}, {{-2, -1}}),
349
+ ({{-2, -1}, {1, 2}}, {{-3, 3}}),
350
+ ({{-1, 3}, {1, 2}}, {{-3, -2}}),
351
+ ({{-3, 3}, {-2, -1}, {1, 2}}, {})]
352
+ """
353
+ for D in DyckWords(self._n):
354
+ markable = set()
355
+ unmarked = []
356
+ unpaired = []
357
+ # Determine the pairing and which pairings are markable
358
+ for i,d in enumerate(D):
359
+ if i >= self._n:
360
+ i = -2*self._n + i
361
+ else:
362
+ i += 1
363
+ if d == 1:
364
+ unpaired.append(i)
365
+ else: # d == 0
366
+ m = unpaired.pop()
367
+ if not unpaired:
368
+ markable.add((m, i))
369
+ else:
370
+ unmarked.append((m, i))
371
+ for X in powerset(markable):
372
+ yield self.element_class(self, X, unmarked + list(markable.difference(X)))
373
+
374
+ Element = BlobDiagram
375
+
376
+
377
+ class BlobAlgebra(CombinatorialFreeModule):
378
+ r"""
379
+ The blob algebra.
380
+
381
+ The *blob algebra* (also known as the Temperley-Lieb algebra of type `B`
382
+ in [ILZ2018]_, but is a quotient of the Temperley-Lieb algebra of type `B`
383
+ defined in [Graham1985]_) is a diagram-type algebra introduced in
384
+ [MS1994]_ whose basis consists of :class:`Temperley-Lieb diagrams
385
+ <sage.combinat.diagram_algebras.TemperleyLiebDiagram>`, noncrossing
386
+ perfect matchings, that may contain blobs on strands that can be
387
+ deformed so that the blob touches the left side (which we can think of
388
+ as a frozen pole).
389
+
390
+ The form we give here has 3 parameters, the natural one from the
391
+ :class:`Temperley-Lieb algebra <sage.combinat.diagram_algebras.TemperleyLiebAlgebra>`,
392
+ one for the idempotent relation, and one for a loop with a blob.
393
+
394
+ INPUT:
395
+
396
+ - ``k`` -- the order
397
+ - ``q1`` -- the loop parameter
398
+ - ``q2`` -- the idempotent parameter
399
+ - ``q3`` -- the blob loop parameter
400
+
401
+ EXAMPLES::
402
+
403
+ sage: R.<q,r,s> = ZZ[]
404
+ sage: B4 = algebras.Blob(4, q, r, s)
405
+ sage: B = sorted(B4.basis())
406
+ sage: B[14]
407
+ B({{-4, -3}}, {{-2, -1}, {1, 2}, {3, 4}})
408
+ sage: B[40]
409
+ B({{3, 4}}, {{-4, -3}, {-2, -1}, {1, 2}})
410
+ sage: B[14] * B[40]
411
+ q*r*s*B({}, {{-4, -3}, {-2, -1}, {1, 2}, {3, 4}})
412
+
413
+ REFERENCES:
414
+
415
+ - [MS1994]_
416
+ - [ILZ2018]_
417
+ """
418
+ @staticmethod
419
+ def __classcall_private__(cls, k, q1, q2, q3, base_ring=None, prefix='B'):
420
+ r"""
421
+ Normalize input to ensure a unique representation.
422
+
423
+ TESTS::
424
+
425
+ sage: R.<q,r,s> = ZZ[]
426
+ sage: B3 = algebras.Blob(3, q, r, s)
427
+ sage: Bp = algebras.Blob(3, q, r, s, R, prefix='B')
428
+ sage: B3 is Bp
429
+ True
430
+ """
431
+ if base_ring is None:
432
+ base_ring = get_coercion_model().common_parent(q1, q2, q3)
433
+ q1 = base_ring(q1)
434
+ q2 = base_ring(q2)
435
+ q3 = base_ring(q3)
436
+ return super().__classcall__(cls, k, q1, q2, q3, base_ring, prefix)
437
+
438
+ def __init__(self, k, q1, q2, q3, base_ring, prefix):
439
+ r"""
440
+ Initialize ``self``.
441
+
442
+ TESTS::
443
+
444
+ sage: R.<q,r,s> = ZZ[]
445
+ sage: B4 = algebras.Blob(4, q, r, s)
446
+ sage: TestSuite(B4).run()
447
+
448
+ sage: B3 = algebras.Blob(3, q, r, s)
449
+ sage: B = list(B3.basis())
450
+ sage: TestSuite(B3).run(elements=B) # long time
451
+ """
452
+ self._q1 = q1
453
+ self._q2 = q2
454
+ self._q3 = q3
455
+ diagrams = BlobDiagrams(k)
456
+ cat = Algebras(base_ring.category()).FiniteDimensional().WithBasis()
457
+ CombinatorialFreeModule.__init__(self, base_ring, diagrams, category=cat,
458
+ prefix=prefix, bracket=False)
459
+
460
+ def _ascii_art_term(self, diagram):
461
+ r"""
462
+ Return an ascii art representation of ``diagram``.
463
+
464
+ EXAMPLES::
465
+
466
+ sage: R.<q,r,s> = ZZ[]
467
+ sage: B2 = algebras.Blob(2, q, r, s)
468
+ sage: x = B2.an_element()
469
+ sage: ascii_art(x) # indirect doctest
470
+ o o o o o o
471
+ 2* `-` + 3* `-` + 2* `0`
472
+ .-. .0. .-.
473
+ o o o o o o
474
+ """
475
+ return TL_diagram_ascii_art(diagram.marked+diagram.unmarked, use_unicode=False,
476
+ blobs=diagram.marked)
477
+
478
+ def _unicode_art_term(self, diagram):
479
+ r"""
480
+ Return a unicode art representation of ``diagram``.
481
+
482
+ EXAMPLES::
483
+
484
+ sage: R.<q,r,s> = ZZ[]
485
+ sage: B2 = algebras.Blob(2, q, r, s)
486
+ sage: x = B2.an_element()
487
+ sage: unicode_art(x) # indirect doctest
488
+ ⚬ ⚬ ⚬ ⚬ ⚬ ⚬
489
+ 2* ╰─╯ + 3* ╰─╯ + 2* ╰●╯
490
+ ╭─╮ ╭●╮ ╭─╮
491
+ ⚬ ⚬ ⚬ ⚬ ⚬ ⚬
492
+ """
493
+ return TL_diagram_ascii_art(diagram.marked+diagram.unmarked, use_unicode=True,
494
+ blobs=diagram.marked)
495
+
496
+ def _latex_term(self, diagram):
497
+ r"""
498
+ Return a latex representation of ``diagram``.
499
+
500
+ EXAMPLES::
501
+
502
+ sage: R.<q,r,s> = ZZ[]
503
+ sage: B2 = algebras.Blob(2, q, r, s)
504
+ sage: latex(B2.an_element()) # indirect doctest
505
+ 2 \begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}]
506
+ \tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt]
507
+ \node[vertex] (G--2) at (1.5, -1) [shape = circle, draw] {};
508
+ \node[vertex] (G--1) at (0.0, -1) [shape = circle, draw] {};
509
+ \node[vertex] (G-1) at (0.0, 1) [shape = circle, draw] {};
510
+ \node[vertex] (G-2) at (1.5, 1) [shape = circle, draw] {};
511
+ \draw[] (G--2) .. controls +(-0.5, 0.5) and +(0.5, 0.5) .. (G--1);
512
+ \draw[] (G-1) .. controls +(0.5, -0.5) and +(-0.5, -0.5) .. (G-2);
513
+ \end{tikzpicture}
514
+ + 3 \begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}]
515
+ \tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt]
516
+ \node[vertex] (G--2) at (1.5, -1) [shape = circle, draw] {};
517
+ \node[vertex] (G--1) at (0.0, -1) [shape = circle, draw] {};
518
+ \node[vertex] (G-1) at (0.0, 1) [shape = circle, draw] {};
519
+ \node[vertex] (G-2) at (1.5, 1) [shape = circle, draw] {};
520
+ \draw[blue,very thick] (G--2) .. controls +(-0.5, 0.5) and +(0.5, 0.5) .. node[midway,circle,fill,scale=0.6] {} (G--1);
521
+ \draw[] (G-1) .. controls +(0.5, -0.5) and +(-0.5, -0.5) .. (G-2);
522
+ \end{tikzpicture}
523
+ + 2 \begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}]
524
+ \tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt]
525
+ \node[vertex] (G-1) at (0.0, 1) [shape = circle, draw] {};
526
+ \node[vertex] (G-2) at (1.5, 1) [shape = circle, draw] {};
527
+ \node[vertex] (G--2) at (1.5, -1) [shape = circle, draw] {};
528
+ \node[vertex] (G--1) at (0.0, -1) [shape = circle, draw] {};
529
+ \draw[blue,very thick] (G-1) .. controls +(0.5, -0.5) and +(-0.5, -0.5) .. node[midway,circle,fill,scale=0.6] {} (G-2);
530
+ \draw[] (G--2) .. controls +(-0.5, 0.5) and +(0.5, 0.5) .. (G--1);
531
+ \end{tikzpicture}
532
+ """
533
+ def edge_options(P):
534
+ if P[1] < P[0]:
535
+ P = [P[1], P[0]]
536
+ if tuple(P) in diagram.marked:
537
+ return 'blue,very thick'
538
+ return ''
539
+
540
+ def edge_additions(P):
541
+ if P[1] < P[0]:
542
+ P = [P[1], P[0]]
543
+ if tuple(P) in diagram.marked:
544
+ return 'node[midway,circle,fill,scale=0.6] {} '
545
+ return ''
546
+ return diagram_latex(diagram.marked+diagram.unmarked,
547
+ edge_options=edge_options,
548
+ edge_additions=edge_additions)
549
+
550
+ def order(self):
551
+ r"""
552
+ Return the order of ``self``.
553
+
554
+ The order of a partition algebra is defined as half of the number
555
+ of nodes in the diagrams.
556
+
557
+ EXAMPLES::
558
+
559
+ sage: R.<q,r,s> = ZZ[]
560
+ sage: B4 = algebras.Blob(4, q, r, s)
561
+ sage: B4.order()
562
+ 4
563
+ """
564
+ return self._indices.order()
565
+
566
+ @cached_method
567
+ def one_basis(self):
568
+ r"""
569
+ Return the index of the basis element `1`.
570
+
571
+ EXAMPLES::
572
+
573
+ sage: R.<q,r,s> = ZZ[]
574
+ sage: B4 = algebras.Blob(4, q, r, s)
575
+ sage: B4.one_basis()
576
+ ({}, {{-4, 4}, {-3, 3}, {-2, 2}, {-1, 1}})
577
+ """
578
+ B = self._indices
579
+ return B.element_class(B, [], [[i, -i] for i in range(1, self.order()+1)])
580
+
581
+ def product_on_basis(self, top, bot):
582
+ r"""
583
+ Return the product of the basis elements indexed by ``top``
584
+ and ``bot``.
585
+
586
+ EXAMPLES::
587
+
588
+ sage: R.<q,r,s> = ZZ[]
589
+ sage: B4 = algebras.Blob(4, q, r, s)
590
+ sage: B = B4.basis()
591
+ sage: BD = sorted(B.keys())
592
+ sage: BD[14]
593
+ ({{-4, -3}}, {{-2, -1}, {1, 2}, {3, 4}})
594
+ sage: BD[40]
595
+ ({{3, 4}}, {{-4, -3}, {-2, -1}, {1, 2}})
596
+ sage: B4.product_on_basis(BD[14], BD[40])
597
+ q*r*s*B({}, {{-4, -3}, {-2, -1}, {1, 2}, {3, 4}})
598
+ sage: all(len((x*y).support()) == 1 for x in B for y in B)
599
+ True
600
+ """
601
+ ret_lists = [[], []]
602
+ coeff = self.base_ring().one()
603
+ top_marked = set(top.marked)
604
+ top_unmarked = set(top.unmarked)
605
+ bot_marked = set(bot.marked)
606
+ bot_unmarked = set(bot.unmarked)
607
+
608
+ for top_set, is_unmarked in [(top_marked, 0), (top_unmarked, 1)]:
609
+ while top_set:
610
+ # We are starting a new strand
611
+ cur, stop = top_set.pop() # note that cur < stop
612
+ unmarked = is_unmarked
613
+ #print(top_set, unmarked, cur, stop)
614
+ if cur > 0: # Both are anchored to the top
615
+ ret_lists[unmarked].append((cur, stop))
616
+ continue
617
+ anchored = bool(stop > 0) # Possibly only stop is anchored
618
+
619
+ # Follow the path from cur until we either reach stop or
620
+ # we break out of the loop because both ends are anchored
621
+ while anchored or cur != stop:
622
+ #print(anchored, unmarked, cur, stop)
623
+ cur = -cur # Move cur to the bottom diagram
624
+ for X in bot_marked:
625
+ if cur in X:
626
+ if unmarked:
627
+ unmarked = 0
628
+ else:
629
+ coeff *= self._q2
630
+ prev = cur
631
+ cur = X[1-X.index(prev)]
632
+ bot_marked.remove(X)
633
+ break
634
+ for X in bot_unmarked:
635
+ if cur in X:
636
+ prev = cur
637
+ cur = X[1-X.index(prev)]
638
+ bot_unmarked.remove(X)
639
+ break
640
+ if cur < 0: # cur is anchored at the bottom
641
+ if anchored:
642
+ ret_lists[unmarked].append((stop, cur))
643
+ break
644
+ else:
645
+ anchored = True
646
+ stop, cur = cur, stop # stop is now anchored to the bottom
647
+ continue
648
+ cur = -cur # bring cur back to the top diagram
649
+ for X in top_marked:
650
+ if cur in X:
651
+ if unmarked:
652
+ unmarked = 0
653
+ else:
654
+ coeff *= self._q2
655
+ prev = cur
656
+ cur = X[1-X.index(prev)]
657
+ top_marked.remove(X)
658
+ break
659
+ for X in top_unmarked:
660
+ if cur in X:
661
+ prev = cur
662
+ cur = X[1-X.index(prev)]
663
+ top_unmarked.remove(X)
664
+ break
665
+ if cur > 0: # cur is anchored at the top
666
+ if anchored:
667
+ ret_lists[unmarked].append((stop, cur))
668
+ break
669
+ else:
670
+ anchored = True
671
+ stop, cur = cur, stop # stop is now anchored to the top
672
+ if cur == stop: # We have found a (marked) loop
673
+ if unmarked:
674
+ coeff *= self._q1
675
+ else:
676
+ coeff *= self._q3
677
+ # Everything remaining in the bottom sets are just anchored
678
+ # at the bottom, (i.e., are of the form {-i, -j}).
679
+ ret_lists[0].extend(bot_marked)
680
+ ret_lists[1].extend(bot_unmarked)
681
+
682
+ if coeff == 0:
683
+ return self.zero()
684
+ diagram = self._indices.element_class(self._indices, ret_lists[0], ret_lists[1])
685
+ return self._from_dict({diagram: coeff}, remove_zeros=False)