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,695 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ Induced crystals
5
+
6
+ We construct a crystal structure on a set induced by a bijection `\Phi`.
7
+
8
+ AUTHORS:
9
+
10
+ - Travis Scrimshaw (2014-05-15): initial implementation
11
+ """
12
+
13
+ #*****************************************************************************
14
+ # Copyright (C) 2014 Travis Scrimshaw <tscrim at ucdavis.edu>
15
+ #
16
+ # Distributed under the terms of the GNU General Public License (GPL)
17
+ #
18
+ # This code is distributed in the hope that it will be useful,
19
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ # General Public License for more details.
22
+ #
23
+ # The full text of the GPL is available at:
24
+ #
25
+ # http://www.gnu.org/licenses/
26
+ #****************************************************************************
27
+
28
+ from sage.structure.unique_representation import UniqueRepresentation
29
+ from sage.structure.parent import Parent
30
+ from sage.structure.element_wrapper import ElementWrapper
31
+
32
+
33
+ class InducedCrystal(UniqueRepresentation, Parent):
34
+ r"""
35
+ A crystal induced from an injection.
36
+
37
+ Let `X` be a set and let `C` be crystal and consider any injection
38
+ `\Phi : X \to C`. We induce a crystal structure on `X` by considering
39
+ `\Phi` to be a crystal morphism.
40
+
41
+ Alternatively we can induce a crystal structure on some (sub)set of `X`
42
+ by considering an injection `\Phi : C \to X` considered as a crystal
43
+ morphism. This form is also useful when the set `X` is not explicitly
44
+ known.
45
+
46
+ INPUT:
47
+
48
+ - ``X`` -- the base set
49
+ - ``phi`` -- the map `\Phi`
50
+ - ``inverse`` -- (optional) the inverse map `\Phi^{-1}`
51
+ - ``from_crystal`` -- boolean (default: ``False``); if the induced
52
+ structure is of the second type `\Phi : C \to X`
53
+
54
+ EXAMPLES:
55
+
56
+ We construct a crystal structure of Gelfand-Tsetlin patterns by going
57
+ through their bijection with semistandard tableaux::
58
+
59
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,3))
60
+ sage: G = GelfandTsetlinPatterns(4, 3)
61
+ sage: phi = lambda x: D(x.to_tableau())
62
+ sage: phi_inv = lambda x: G(x.to_tableau())
63
+ sage: I = crystals.Induced(G, phi, phi_inv)
64
+ sage: I.digraph().is_isomorphic(D.digraph(), edge_labels=True)
65
+ True
66
+
67
+ Now we construct the above example but inducing the structure going the
68
+ other way (from tableaux to Gelfand-Tsetlin patterns). This can also
69
+ give us more information coming from the crystal. ::
70
+
71
+ sage: D2 = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
72
+ sage: G2 = GelfandTsetlinPatterns(4, 1)
73
+ sage: phi2 = lambda x: D2(x.to_tableau())
74
+ sage: phi2_inv = lambda x: G2(x.to_tableau())
75
+ sage: I2 = crystals.Induced(D2, phi2_inv, phi2, from_crystal=True)
76
+ sage: I2.module_generators
77
+ ([[0, 0, 0, 0], [0, 0, 0], [0, 0], [0]],
78
+ [[1, 0, 0, 0], [1, 0, 0], [1, 0], [1]],
79
+ [[1, 1, 0, 0], [1, 1, 0], [1, 1], [1]],
80
+ [[1, 1, 1, 0], [1, 1, 1], [1, 1], [1]],
81
+ [[1, 1, 1, 1], [1, 1, 1], [1, 1], [1]])
82
+
83
+ We check an example when the codomain is larger than the domain
84
+ (although here the crystal structure is trivial)::
85
+
86
+ sage: P = Permutations(4)
87
+ sage: D = crystals.Tableaux(['A',3], shapes=Partitions(4))
88
+ sage: T = crystals.TensorProduct(D, D)
89
+ sage: phi = lambda p: T(D(RSK(p)[0]), D(RSK(p)[1]))
90
+ sage: phi_inv = lambda d: RSK_inverse(d[0].to_tableau(), d[1].to_tableau(), output='permutation')
91
+ sage: all(phi_inv(phi(p)) == p for p in P) # Check it really is the inverse
92
+ True
93
+ sage: I = crystals.Induced(P, phi, phi_inv)
94
+ sage: I.digraph()
95
+ Digraph on 24 vertices
96
+
97
+ We construct an example without a specified inverse map::
98
+
99
+ sage: X = Words(2,4)
100
+ sage: L = crystals.Letters(['A',1])
101
+ sage: T = crystals.TensorProduct(*[L]*4)
102
+ sage: Phi = lambda x : T(*[L(i) for i in x])
103
+ sage: I = crystals.Induced(X, Phi)
104
+ sage: I.digraph()
105
+ Digraph on 16 vertices
106
+ """
107
+ @staticmethod
108
+ def __classcall_private__(cls, X, phi, inverse=None, from_crystal=False):
109
+ """
110
+ Normalize input to ensure a unique representation.
111
+
112
+ TESTS::
113
+
114
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,3))
115
+ sage: G = GelfandTsetlinPatterns(4, 3)
116
+ sage: phi = lambda x: D(x.to_tableau())
117
+ sage: phi_inv = lambda x: G(x.to_tableau())
118
+ sage: I1 = crystals.Induced(G, phi, phi_inv)
119
+ sage: I2 = crystals.Induced(G, phi, phi_inv)
120
+ sage: I1 is I2
121
+ True
122
+ """
123
+ if from_crystal:
124
+ return InducedFromCrystal(X, phi, inverse)
125
+
126
+ return super().__classcall__(cls, X, phi, inverse)
127
+
128
+ def __init__(self, X, phi, inverse):
129
+ """
130
+ Initialize ``self``.
131
+
132
+ TESTS:
133
+
134
+ Note that pickling only works when the input functions
135
+ can be pickled::
136
+
137
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
138
+ sage: G = GelfandTsetlinPatterns(4, 1)
139
+ sage: def phi(x): return D(x.to_tableau())
140
+ sage: def phi_inv(x): return G(x.to_tableau())
141
+ sage: import __main__
142
+ sage: __main__.phi = phi
143
+ sage: __main__.phi_inv = phi_inv
144
+ sage: I = crystals.Induced(G, phi, phi_inv)
145
+ sage: TestSuite(I).run()
146
+ """
147
+ try:
148
+ codomain = phi.codomain()
149
+ except AttributeError:
150
+ codomain = phi(X.an_element()).parent()
151
+
152
+ self._set = X
153
+ self._phi = phi
154
+
155
+ if inverse is None:
156
+ try:
157
+ inverse = ~self._phi
158
+ except (TypeError, ValueError):
159
+ try:
160
+ inverse = self._phi.section()
161
+ except AttributeError:
162
+ if X.cardinality() == float('inf'):
163
+ raise ValueError("the inverse map must be defined for infinite sets")
164
+ self._preimage = {}
165
+ for x in X:
166
+ y = phi(x)
167
+ if y in self._preimage:
168
+ raise ValueError("the map is not injective")
169
+ self._preimage[y] = x
170
+ inverse = self._preimage.__getitem__
171
+ self._inverse = inverse
172
+
173
+ self._cartan_type = codomain.cartan_type()
174
+ Parent.__init__(self, category=codomain.category())
175
+
176
+ self.module_generators = self
177
+
178
+ def _repr_(self):
179
+ """
180
+ Return a string representation of ``self``.
181
+
182
+ EXAMPLES::
183
+
184
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
185
+ sage: G = GelfandTsetlinPatterns(4, 1)
186
+ sage: def phi(x): return D(x.to_tableau())
187
+ sage: def phi_inv(x): return G(x.to_tableau())
188
+ sage: crystals.Induced(G, phi, phi_inv)
189
+ Crystal of Gelfand-Tsetlin patterns of width 4 and max value 1
190
+ induced by <function phi at 0x...>
191
+ """
192
+ return "Crystal of {} induced by {}".format(self._set, self._phi)
193
+
194
+ def _element_constructor_(self, x):
195
+ """
196
+ Construct an element of ``self``.
197
+
198
+ EXAMPLES::
199
+
200
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
201
+ sage: G = GelfandTsetlinPatterns(4, 1)
202
+ sage: def phi(x): return D(x.to_tableau())
203
+ sage: def phi_inv(x): return G(x.to_tableau())
204
+ sage: I = crystals.Induced(G, phi, phi_inv)
205
+ sage: I([[1,1,0,0],[1,0,0],[1,0],[1]])
206
+ [[1, 1, 0, 0], [1, 0, 0], [1, 0], [1]]
207
+ sage: I(D(3,2,1))
208
+ [[1, 1, 1, 0], [1, 1, 1], [1, 1], [1]]
209
+ sage: I([[1,1,0,0],[1,0,0],[0,1],[1]])
210
+ Traceback (most recent call last):
211
+ ...
212
+ TypeError: unable to convert [[1, 1, 0, 0], [1, 0, 0], [0, 1], [1]] to Crystal of Gelfand-Tsetlin patterns of width 4 and max value 1 induced by <function phi at 0x...>
213
+ """
214
+ if x in self._set:
215
+ return self.element_class(self, self._set(x))
216
+
217
+ try:
218
+ return self.element_class(self, self._inverse(x))
219
+ except (TypeError, ValueError, AttributeError):
220
+ raise TypeError("unable to convert {!r} to {}".format(x, self))
221
+
222
+ def __contains__(self, x):
223
+ """
224
+ Check if ``x`` is in ``self``.
225
+
226
+ EXAMPLES::
227
+
228
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
229
+ sage: G = GelfandTsetlinPatterns(4, 1)
230
+ sage: def phi(x): return D(x.to_tableau())
231
+ sage: def phi_inv(x): return G(x.to_tableau())
232
+ sage: I = crystals.Induced(G, phi, phi_inv)
233
+ sage: all(g in I for g in G)
234
+ True
235
+ sage: [[1,1,0,0],[1,0,0],[1,0],[1]] in I
236
+ True
237
+ sage: [[1,1,0,0],[1,0,0],[0,1],[1]] in I
238
+ False
239
+ """
240
+ if isinstance(x, InducedCrystal.Element):
241
+ return x.parent() == self
242
+
243
+ return x in self._set
244
+
245
+ def __iter__(self):
246
+ """
247
+ Iterate over ``self``.
248
+
249
+ EXAMPLES::
250
+
251
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
252
+ sage: G = GelfandTsetlinPatterns(4, 1)
253
+ sage: def phi(x): return D(x.to_tableau())
254
+ sage: def phi_inv(x): return G(x.to_tableau())
255
+ sage: I = crystals.Induced(G, phi, phi_inv)
256
+ sage: sorted([x for x in I])
257
+ [[[0, 0, 0, 0], [0, 0, 0], [0, 0], [0]],
258
+ [[1, 0, 0, 0], [0, 0, 0], [0, 0], [0]],
259
+ [[1, 0, 0, 0], [1, 0, 0], [0, 0], [0]],
260
+ [[1, 0, 0, 0], [1, 0, 0], [1, 0], [0]],
261
+ [[1, 0, 0, 0], [1, 0, 0], [1, 0], [1]],
262
+ [[1, 1, 0, 0], [1, 0, 0], [0, 0], [0]],
263
+ [[1, 1, 0, 0], [1, 0, 0], [1, 0], [0]],
264
+ [[1, 1, 0, 0], [1, 0, 0], [1, 0], [1]],
265
+ [[1, 1, 0, 0], [1, 1, 0], [1, 0], [0]],
266
+ [[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]],
267
+ [[1, 1, 0, 0], [1, 1, 0], [1, 1], [1]],
268
+ [[1, 1, 1, 0], [1, 1, 0], [1, 0], [0]],
269
+ [[1, 1, 1, 0], [1, 1, 0], [1, 0], [1]],
270
+ [[1, 1, 1, 0], [1, 1, 0], [1, 1], [1]],
271
+ [[1, 1, 1, 0], [1, 1, 1], [1, 1], [1]],
272
+ [[1, 1, 1, 1], [1, 1, 1], [1, 1], [1]]]
273
+ """
274
+ for x in self._set:
275
+ yield self.element_class(self, x)
276
+
277
+ def cardinality(self):
278
+ """
279
+ Return the cardinality of ``self``.
280
+
281
+ EXAMPLES::
282
+
283
+ sage: P = Permutations(4)
284
+ sage: D = crystals.Tableaux(['A',3], shapes=Partitions(4))
285
+ sage: T = crystals.TensorProduct(D, D)
286
+ sage: phi = lambda p: T(D(RSK(p)[0]), D(RSK(p)[1]))
287
+ sage: phi_inv = lambda d: RSK_inverse(d[0].to_tableau(), d[1].to_tableau(), output='permutation')
288
+ sage: I = crystals.Induced(P, phi, phi_inv)
289
+ sage: I.cardinality() == factorial(4)
290
+ True
291
+ """
292
+ return self._set.cardinality()
293
+
294
+ class Element(ElementWrapper):
295
+ """
296
+ An element of an induced crystal.
297
+ """
298
+
299
+ def e(self, i):
300
+ """
301
+ Return `e_i` of ``self``.
302
+
303
+ EXAMPLES::
304
+
305
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,3))
306
+ sage: G = GelfandTsetlinPatterns(4, 3)
307
+ sage: phi = lambda x: D(x.to_tableau())
308
+ sage: phi_inv = lambda x: G(x.to_tableau())
309
+ sage: I = crystals.Induced(G, phi, phi_inv)
310
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
311
+ sage: elt.e(1)
312
+ sage: elt.e(2)
313
+ [[1, 1, 0, 0], [1, 1, 0], [1, 1], [1]]
314
+ sage: elt.e(3)
315
+ """
316
+ P = self.parent()
317
+ ret = P._phi(self.value).e(i)
318
+ if ret is None:
319
+ return None
320
+ try:
321
+ return self.__class__(P, P._inverse(ret))
322
+ except (ValueError, TypeError, AttributeError):
323
+ return None
324
+
325
+ def f(self, i):
326
+ """
327
+ Return `f_i` of ``self``.
328
+
329
+ EXAMPLES::
330
+
331
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,3))
332
+ sage: G = GelfandTsetlinPatterns(4, 3)
333
+ sage: phi = lambda x: D(x.to_tableau())
334
+ sage: phi_inv = lambda x: G(x.to_tableau())
335
+ sage: I = crystals.Induced(G, phi, phi_inv)
336
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
337
+ sage: elt.f(1)
338
+ [[1, 1, 0, 0], [1, 1, 0], [1, 0], [0]]
339
+ sage: elt.f(2)
340
+ sage: elt.f(3)
341
+ [[1, 1, 0, 0], [1, 0, 0], [1, 0], [1]]
342
+ """
343
+ P = self.parent()
344
+ ret = P._phi(self.value).f(i)
345
+ if ret is None:
346
+ return None
347
+ try:
348
+ return self.__class__(P, P._inverse(ret))
349
+ except (ValueError, TypeError, AttributeError):
350
+ return None
351
+
352
+ def epsilon(self, i):
353
+ r"""
354
+ Return `\varepsilon_i` of ``self``.
355
+
356
+ EXAMPLES::
357
+
358
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,3))
359
+ sage: G = GelfandTsetlinPatterns(4, 3)
360
+ sage: phi = lambda x: D(x.to_tableau())
361
+ sage: phi_inv = lambda x: G(x.to_tableau())
362
+ sage: I = crystals.Induced(G, phi, phi_inv)
363
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
364
+ sage: [elt.epsilon(i) for i in I.index_set()]
365
+ [0, 1, 0]
366
+ """
367
+ return self.parent()._phi(self.value).epsilon(i)
368
+
369
+ def phi(self, i):
370
+ r"""
371
+ Return `\varphi_i` of ``self``.
372
+
373
+ EXAMPLES::
374
+
375
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,3))
376
+ sage: G = GelfandTsetlinPatterns(4, 3)
377
+ sage: phi = lambda x: D(x.to_tableau())
378
+ sage: phi_inv = lambda x: G(x.to_tableau())
379
+ sage: I = crystals.Induced(G, phi, phi_inv)
380
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
381
+ sage: [elt.phi(i) for i in I.index_set()]
382
+ [1, 0, 1]
383
+ """
384
+ return self.parent()._phi(self.value).phi(i)
385
+
386
+ def weight(self):
387
+ """
388
+ Return the weight of ``self``.
389
+
390
+ EXAMPLES::
391
+
392
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,3))
393
+ sage: G = GelfandTsetlinPatterns(4, 3)
394
+ sage: phi = lambda x: D(x.to_tableau())
395
+ sage: phi_inv = lambda x: G(x.to_tableau())
396
+ sage: I = crystals.Induced(G, phi, phi_inv)
397
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
398
+ sage: elt.weight()
399
+ (1, 0, 1, 0)
400
+ """
401
+ return self.parent()._phi(self.value).weight()
402
+
403
+
404
+ class InducedFromCrystal(UniqueRepresentation, Parent):
405
+ r"""
406
+ A crystal induced from an injection.
407
+
408
+ Alternatively we can induce a crystal structure on some (sub)set of `X`
409
+ by considering an injection `\Phi : C \to X` considered as a crystal
410
+ morphism.
411
+
412
+ .. SEEALSO::
413
+
414
+ :class:`InducedCrystal`
415
+
416
+ INPUT:
417
+
418
+ - ``X`` -- the base set
419
+ - ``phi`` -- the map `\Phi`
420
+ - ``inverse`` -- (optional) the inverse map `\Phi^{-1}`
421
+
422
+ EXAMPLES:
423
+
424
+ We construct a crystal structure on generalized permutations with a
425
+ fixed first row by using RSK::
426
+
427
+ sage: C = crystals.Tableaux(['A',3], shape=[2,1])
428
+ sage: def psi(x):
429
+ ....: ret = RSK_inverse(x.to_tableau(), Tableau([[1,1],[2]]))
430
+ ....: return (tuple(ret[0]), tuple(ret[1]))
431
+ sage: psi_inv = lambda x: C(RSK(*x)[0])
432
+ sage: I = crystals.Induced(C, psi, psi_inv, from_crystal=True)
433
+ """
434
+
435
+ def __init__(self, X, phi, inverse):
436
+ """
437
+ Initialize ``self``.
438
+
439
+ TESTS:
440
+
441
+ Note that pickling only works when the input functions
442
+ can be pickled::
443
+
444
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
445
+ sage: G = GelfandTsetlinPatterns(4, 1)
446
+ sage: def phi(x): return D(x.to_tableau())
447
+ sage: def phi_inv(x): return G(x.to_tableau())
448
+ sage: import __main__
449
+ sage: __main__.phi = phi
450
+ sage: __main__.phi_inv = phi_inv
451
+ sage: I = crystals.Induced(D, phi_inv, phi, from_crystal=True)
452
+ sage: TestSuite(I).run()
453
+ """
454
+ self._crystal = X
455
+ self._phi = phi
456
+
457
+ if inverse is None:
458
+ try:
459
+ inverse = ~self._phi
460
+ except (TypeError, ValueError):
461
+ try:
462
+ inverse = self._phi.section()
463
+ except AttributeError:
464
+ if X.cardinality() == float('inf'):
465
+ raise ValueError("the inverse map must be defined for infinite sets")
466
+ self._preimage = {}
467
+ for x in X:
468
+ y = phi(x)
469
+ if y in self._preimage:
470
+ raise ValueError("the map is not injective")
471
+ self._preimage[y] = x
472
+ inverse = self._preimage.__getitem__
473
+ self._inverse = inverse
474
+
475
+ self._cartan_type = X.cartan_type()
476
+ Parent.__init__(self, category=X.category())
477
+ self.module_generators = tuple(self.element_class(self, phi(mg))
478
+ for mg in X.module_generators)
479
+
480
+ def _repr_(self):
481
+ """
482
+ Return a string representation of ``self``.
483
+
484
+ EXAMPLES::
485
+
486
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
487
+ sage: G = GelfandTsetlinPatterns(4, 1)
488
+ sage: def phi(x): return D(x.to_tableau())
489
+ sage: def phi_inv(x): return G(x.to_tableau())
490
+ sage: crystals.Induced(D, phi_inv, phi, from_crystal=True)
491
+ Crystal induced by <function phi_inv at 0x...> from
492
+ The crystal of tableaux of type ['A', 3] and shape(s)
493
+ [[], [1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]
494
+ """
495
+ return "Crystal induced by {} from {}".format(self._phi, self._crystal)
496
+
497
+ def _element_constructor_(self, x):
498
+ """
499
+ Construct an element of ``self``.
500
+
501
+ EXAMPLES::
502
+
503
+ sage: C = crystals.Tableaux(['A',3], shape=[2,1])
504
+ sage: def psi(x):
505
+ ....: ret = RSK_inverse(x.to_tableau(), Tableau([[1,1],[2]]))
506
+ ....: return (tuple(ret[0]), tuple(ret[1]))
507
+ sage: psi_inv = lambda x: C(RSK(*x)[0])
508
+ sage: I = crystals.Induced(C, psi, psi_inv, from_crystal=True)
509
+ sage: I([[1, 1, 2], [2, 2, 1]])
510
+ ((1, 1, 2), (2, 2, 1))
511
+ sage: I(C(2,1,3))
512
+ ((1, 1, 2), (2, 3, 1))
513
+ """
514
+ if x in self._crystal:
515
+ return self.element_class(self, self._phi(self._crystal(x)))
516
+
517
+ try:
518
+ return self.element_class(self, self._phi(self._inverse(x)))
519
+ except (TypeError, ValueError, AttributeError):
520
+ raise TypeError("unable to convert {!r} to {}".format(x, self))
521
+
522
+ def __contains__(self, x):
523
+ """
524
+ Check if ``x`` is in ``self``.
525
+
526
+ EXAMPLES::
527
+
528
+ sage: C = crystals.Tableaux(['A',3], shape=[2,1])
529
+ sage: def psi(x):
530
+ ....: ret = RSK_inverse(x.to_tableau(), Tableau([[1,1],[2]]))
531
+ ....: return (tuple(ret[0]), tuple(ret[1]))
532
+ sage: psi_inv = lambda x: C(RSK(*x)[0])
533
+ sage: I = crystals.Induced(C, psi, psi_inv, from_crystal=True)
534
+ sage: ((1, 1, 2), (2, 2, 1)) in I
535
+ True
536
+ sage: ((1, 2, 2), (1, 1, 2)) in I
537
+ False
538
+ sage: ((1, 2, 3), (1, 2, 3)) in I
539
+ False
540
+ sage: ((1, 2, 2), (1, 3, 2)) in I
541
+ False
542
+ """
543
+ if isinstance(x, InducedFromCrystal.Element):
544
+ return x.parent() == self
545
+
546
+ try:
547
+ y = self._inverse(x)
548
+ return y in self._crystal and self._phi(y) == x
549
+ except (ValueError, TypeError):
550
+ return False
551
+
552
+ def __iter__(self):
553
+ """
554
+ Iterate over ``self``.
555
+
556
+ EXAMPLES::
557
+
558
+ sage: C = crystals.Tableaux(['A',2], shape=[2,1])
559
+ sage: def psi(x):
560
+ ....: ret = RSK_inverse(x.to_tableau(), Tableau([[1,1],[2]]))
561
+ ....: return (tuple(ret[0]), tuple(ret[1]))
562
+ sage: psi_inv = lambda x: C(RSK(*x)[0])
563
+ sage: I = crystals.Induced(C, psi, psi_inv, from_crystal=True)
564
+ sage: sorted(x for x in I)
565
+ [((1, 1, 2), (1, 2, 1)),
566
+ ((1, 1, 2), (2, 2, 1)),
567
+ ((1, 1, 2), (2, 3, 1)),
568
+ ((1, 1, 2), (3, 3, 1)),
569
+ ((1, 1, 2), (3, 3, 2)),
570
+ ((1, 1, 2), (1, 3, 1)),
571
+ ((1, 1, 2), (1, 3, 2)),
572
+ ((1, 1, 2), (2, 3, 2))]
573
+ """
574
+ for x in self._crystal:
575
+ yield self.element_class(self, self._phi(x))
576
+
577
+ def cardinality(self):
578
+ """
579
+ Return the cardinality of ``self``.
580
+
581
+ EXAMPLES::
582
+
583
+ sage: C = crystals.Tableaux(['A',3], shape=[2,1])
584
+ sage: def psi(x):
585
+ ....: ret = RSK_inverse(x.to_tableau(), Tableau([[1,1],[2]]))
586
+ ....: return (tuple(ret[0]), tuple(ret[1]))
587
+ sage: psi_inv = lambda x: C(RSK(*x)[0])
588
+ sage: I = crystals.Induced(C, psi, psi_inv, from_crystal=True)
589
+ sage: I.cardinality() == C.cardinality()
590
+ True
591
+ """
592
+ return self._crystal.cardinality()
593
+
594
+ class Element(ElementWrapper):
595
+ """
596
+ An element of an induced crystal.
597
+ """
598
+
599
+ def e(self, i):
600
+ """
601
+ Return `e_i` of ``self``.
602
+
603
+ EXAMPLES::
604
+
605
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
606
+ sage: G = GelfandTsetlinPatterns(4, 1)
607
+ sage: def phi(x): return G(x.to_tableau())
608
+ sage: def phi_inv(x): return D(G(x).to_tableau())
609
+ sage: I = crystals.Induced(D, phi, phi_inv, from_crystal=True)
610
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
611
+ sage: elt.e(1)
612
+ sage: elt.e(2)
613
+ [[1, 1, 0, 0], [1, 1, 0], [1, 1], [1]]
614
+ sage: elt.e(3)
615
+ """
616
+ P = self.parent()
617
+ ret = P._inverse(self.value).e(i)
618
+ if ret is None:
619
+ return None
620
+ return self.__class__(P, P._phi(ret))
621
+
622
+ def f(self, i):
623
+ """
624
+ Return `f_i` of ``self``.
625
+
626
+ EXAMPLES::
627
+
628
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
629
+ sage: G = GelfandTsetlinPatterns(4, 1)
630
+ sage: def phi(x): return G(x.to_tableau())
631
+ sage: def phi_inv(x): return D(G(x).to_tableau())
632
+ sage: I = crystals.Induced(D, phi, phi_inv, from_crystal=True)
633
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
634
+ sage: elt.f(1)
635
+ [[1, 1, 0, 0], [1, 1, 0], [1, 0], [0]]
636
+ sage: elt.f(2)
637
+ sage: elt.f(3)
638
+ [[1, 1, 0, 0], [1, 0, 0], [1, 0], [1]]
639
+ """
640
+ P = self.parent()
641
+ ret = P._inverse(self.value).f(i)
642
+ if ret is None:
643
+ return None
644
+ return self.__class__(P, P._phi(ret))
645
+
646
+ def epsilon(self, i):
647
+ r"""
648
+ Return `\varepsilon_i` of ``self``.
649
+
650
+ EXAMPLES::
651
+
652
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
653
+ sage: G = GelfandTsetlinPatterns(4, 1)
654
+ sage: def phi(x): return G(x.to_tableau())
655
+ sage: def phi_inv(x): return D(G(x).to_tableau())
656
+ sage: I = crystals.Induced(D, phi, phi_inv, from_crystal=True)
657
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
658
+ sage: [elt.epsilon(i) for i in I.index_set()]
659
+ [0, 1, 0]
660
+ """
661
+ return self.parent()._inverse(self.value).epsilon(i)
662
+
663
+ def phi(self, i):
664
+ r"""
665
+ Return `\varphi_i` of ``self``.
666
+
667
+ EXAMPLES::
668
+
669
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
670
+ sage: G = GelfandTsetlinPatterns(4, 1)
671
+ sage: def phi(x): return G(x.to_tableau())
672
+ sage: def phi_inv(x): return D(G(x).to_tableau())
673
+ sage: I = crystals.Induced(D, phi, phi_inv, from_crystal=True)
674
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
675
+ sage: [elt.epsilon(i) for i in I.index_set()]
676
+ [0, 1, 0]
677
+ """
678
+ return self.parent()._inverse(self.value).phi(i)
679
+
680
+ def weight(self):
681
+ """
682
+ Return the weight of ``self``.
683
+
684
+ EXAMPLES::
685
+
686
+ sage: D = crystals.Tableaux(['A',3], shapes=PartitionsInBox(4,1))
687
+ sage: G = GelfandTsetlinPatterns(4, 1)
688
+ sage: def phi(x): return G(x.to_tableau())
689
+ sage: def phi_inv(x): return D(G(x).to_tableau())
690
+ sage: I = crystals.Induced(D, phi, phi_inv, from_crystal=True)
691
+ sage: elt = I([[1, 1, 0, 0], [1, 1, 0], [1, 0], [1]])
692
+ sage: elt.weight()
693
+ (1, 0, 1, 0)
694
+ """
695
+ return self.parent()._inverse(self.value).weight()