passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.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 (401) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
  3. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  4. passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
  5. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  6. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  7. passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
  8. passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
  9. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  10. sage/algebras/all.py +24 -0
  11. sage/algebras/all__sagemath_combinat.py +35 -0
  12. sage/algebras/askey_wilson.py +935 -0
  13. sage/algebras/associated_graded.py +345 -0
  14. sage/algebras/cellular_basis.py +350 -0
  15. sage/algebras/cluster_algebra.py +2766 -0
  16. sage/algebras/down_up_algebra.py +860 -0
  17. sage/algebras/free_algebra.py +1698 -0
  18. sage/algebras/free_algebra_element.py +345 -0
  19. sage/algebras/free_algebra_quotient.py +405 -0
  20. sage/algebras/free_algebra_quotient_element.py +295 -0
  21. sage/algebras/free_zinbiel_algebra.py +885 -0
  22. sage/algebras/hall_algebra.py +783 -0
  23. sage/algebras/hecke_algebras/all.py +4 -0
  24. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  25. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  28. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  29. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  30. sage/algebras/jordan_algebra.py +1773 -0
  31. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  32. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  33. sage/algebras/lie_conformal_algebras/all.py +18 -0
  34. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  35. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  36. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  37. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  38. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  39. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  40. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  41. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  45. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  46. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  47. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  48. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  49. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  50. sage/algebras/nil_coxeter_algebra.py +191 -0
  51. sage/algebras/q_commuting_polynomials.py +673 -0
  52. sage/algebras/q_system.py +608 -0
  53. sage/algebras/quantum_clifford.py +959 -0
  54. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  55. sage/algebras/quantum_groups/all.py +9 -0
  56. sage/algebras/quantum_groups/fock_space.py +2219 -0
  57. sage/algebras/quantum_groups/q_numbers.py +207 -0
  58. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  59. sage/algebras/quantum_groups/representations.py +591 -0
  60. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  61. sage/algebras/quantum_oscillator.py +623 -0
  62. sage/algebras/quaternion_algebra.py +20 -0
  63. sage/algebras/quaternion_algebra_element.py +55 -0
  64. sage/algebras/rational_cherednik_algebra.py +525 -0
  65. sage/algebras/schur_algebra.py +670 -0
  66. sage/algebras/shuffle_algebra.py +1011 -0
  67. sage/algebras/splitting_algebra.py +779 -0
  68. sage/algebras/tensor_algebra.py +709 -0
  69. sage/algebras/yangian.py +1082 -0
  70. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  71. sage/all__sagemath_combinat.py +44 -0
  72. sage/combinat/SJT.py +255 -0
  73. sage/combinat/affine_permutation.py +2405 -0
  74. sage/combinat/algebraic_combinatorics.py +55 -0
  75. sage/combinat/all.py +53 -0
  76. sage/combinat/all__sagemath_combinat.py +195 -0
  77. sage/combinat/alternating_sign_matrix.py +2063 -0
  78. sage/combinat/baxter_permutations.py +346 -0
  79. sage/combinat/bijectionist.py +3220 -0
  80. sage/combinat/binary_recurrence_sequences.py +1180 -0
  81. sage/combinat/blob_algebra.py +685 -0
  82. sage/combinat/catalog_partitions.py +27 -0
  83. sage/combinat/chas/all.py +23 -0
  84. sage/combinat/chas/fsym.py +1180 -0
  85. sage/combinat/chas/wqsym.py +2601 -0
  86. sage/combinat/cluster_complex.py +326 -0
  87. sage/combinat/colored_permutations.py +2039 -0
  88. sage/combinat/colored_permutations_representations.py +964 -0
  89. sage/combinat/composition_signed.py +142 -0
  90. sage/combinat/composition_tableau.py +855 -0
  91. sage/combinat/constellation.py +1729 -0
  92. sage/combinat/core.py +751 -0
  93. sage/combinat/counting.py +12 -0
  94. sage/combinat/crystals/affine.py +742 -0
  95. sage/combinat/crystals/affine_factorization.py +518 -0
  96. sage/combinat/crystals/affinization.py +331 -0
  97. sage/combinat/crystals/alcove_path.py +2013 -0
  98. sage/combinat/crystals/all.py +22 -0
  99. sage/combinat/crystals/bkk_crystals.py +141 -0
  100. sage/combinat/crystals/catalog.py +115 -0
  101. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  102. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  103. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  104. sage/combinat/crystals/crystals.py +257 -0
  105. sage/combinat/crystals/direct_sum.py +260 -0
  106. sage/combinat/crystals/elementary_crystals.py +1251 -0
  107. sage/combinat/crystals/fast_crystals.py +441 -0
  108. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  109. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  110. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  111. sage/combinat/crystals/induced_structure.py +695 -0
  112. sage/combinat/crystals/infinity_crystals.py +730 -0
  113. sage/combinat/crystals/kac_modules.py +863 -0
  114. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  115. sage/combinat/crystals/kyoto_path_model.py +497 -0
  116. sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
  117. sage/combinat/crystals/letters.pxd +79 -0
  118. sage/combinat/crystals/letters.pyx +3056 -0
  119. sage/combinat/crystals/littelmann_path.py +1518 -0
  120. sage/combinat/crystals/monomial_crystals.py +1262 -0
  121. sage/combinat/crystals/multisegments.py +462 -0
  122. sage/combinat/crystals/mv_polytopes.py +467 -0
  123. sage/combinat/crystals/pbw_crystal.py +511 -0
  124. sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
  125. sage/combinat/crystals/pbw_datum.pxd +4 -0
  126. sage/combinat/crystals/pbw_datum.pyx +487 -0
  127. sage/combinat/crystals/polyhedral_realization.py +372 -0
  128. sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
  129. sage/combinat/crystals/spins.pxd +21 -0
  130. sage/combinat/crystals/spins.pyx +756 -0
  131. sage/combinat/crystals/star_crystal.py +290 -0
  132. sage/combinat/crystals/subcrystal.py +464 -0
  133. sage/combinat/crystals/tensor_product.py +1177 -0
  134. sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
  135. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  136. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  137. sage/combinat/crystals/virtual_crystal.py +420 -0
  138. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  139. sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
  140. sage/combinat/debruijn_sequence.pyx +355 -0
  141. sage/combinat/decorated_permutation.py +270 -0
  142. sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
  143. sage/combinat/degree_sequences.pyx +588 -0
  144. sage/combinat/derangements.py +527 -0
  145. sage/combinat/descent_algebra.py +1008 -0
  146. sage/combinat/diagram.py +1551 -0
  147. sage/combinat/diagram_algebras.py +5886 -0
  148. sage/combinat/dyck_word.py +4349 -0
  149. sage/combinat/e_one_star.py +1623 -0
  150. sage/combinat/enumerated_sets.py +123 -0
  151. sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
  152. sage/combinat/expnums.pyx +148 -0
  153. sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
  154. sage/combinat/fast_vector_partitions.pyx +346 -0
  155. sage/combinat/fqsym.py +1977 -0
  156. sage/combinat/free_dendriform_algebra.py +954 -0
  157. sage/combinat/free_prelie_algebra.py +1141 -0
  158. sage/combinat/fully_commutative_elements.py +1077 -0
  159. sage/combinat/fully_packed_loop.py +1523 -0
  160. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  161. sage/combinat/gray_codes.py +311 -0
  162. sage/combinat/grossman_larson_algebras.py +667 -0
  163. sage/combinat/growth.py +4352 -0
  164. sage/combinat/hall_polynomial.py +188 -0
  165. sage/combinat/hillman_grassl.py +866 -0
  166. sage/combinat/integer_matrices.py +329 -0
  167. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  168. sage/combinat/k_tableau.py +4564 -0
  169. sage/combinat/kazhdan_lusztig.py +215 -0
  170. sage/combinat/key_polynomial.py +885 -0
  171. sage/combinat/knutson_tao_puzzles.py +2286 -0
  172. sage/combinat/lr_tableau.py +311 -0
  173. sage/combinat/matrices/all.py +24 -0
  174. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  175. sage/combinat/matrices/latin.py +2912 -0
  176. sage/combinat/misc.py +401 -0
  177. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  178. sage/combinat/ncsf_qsym/all.py +21 -0
  179. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  180. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  181. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  182. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  183. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  184. sage/combinat/ncsym/all.py +21 -0
  185. sage/combinat/ncsym/bases.py +855 -0
  186. sage/combinat/ncsym/dual.py +593 -0
  187. sage/combinat/ncsym/ncsym.py +2076 -0
  188. sage/combinat/necklace.py +551 -0
  189. sage/combinat/non_decreasing_parking_function.py +634 -0
  190. sage/combinat/nu_dyck_word.py +1474 -0
  191. sage/combinat/output.py +861 -0
  192. sage/combinat/parallelogram_polyomino.py +4326 -0
  193. sage/combinat/parking_functions.py +1602 -0
  194. sage/combinat/partition_algebra.py +1998 -0
  195. sage/combinat/partition_kleshchev.py +1982 -0
  196. sage/combinat/partition_shifting_algebras.py +584 -0
  197. sage/combinat/partition_tuple.py +3114 -0
  198. sage/combinat/path_tableaux/all.py +13 -0
  199. sage/combinat/path_tableaux/catalog.py +29 -0
  200. sage/combinat/path_tableaux/dyck_path.py +380 -0
  201. sage/combinat/path_tableaux/frieze.py +476 -0
  202. sage/combinat/path_tableaux/path_tableau.py +728 -0
  203. sage/combinat/path_tableaux/semistandard.py +510 -0
  204. sage/combinat/perfect_matching.py +779 -0
  205. sage/combinat/plane_partition.py +3300 -0
  206. sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
  207. sage/combinat/q_bernoulli.pyx +128 -0
  208. sage/combinat/quickref.py +81 -0
  209. sage/combinat/recognizable_series.py +2051 -0
  210. sage/combinat/regular_sequence.py +4316 -0
  211. sage/combinat/regular_sequence_bounded.py +543 -0
  212. sage/combinat/restricted_growth.py +81 -0
  213. sage/combinat/ribbon.py +20 -0
  214. sage/combinat/ribbon_shaped_tableau.py +489 -0
  215. sage/combinat/ribbon_tableau.py +1180 -0
  216. sage/combinat/rigged_configurations/all.py +46 -0
  217. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  218. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  219. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  222. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  223. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  224. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  225. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  226. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  227. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  228. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  229. sage/combinat/rigged_configurations/bijection.py +143 -0
  230. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  231. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  232. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  233. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  234. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  235. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  236. sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  238. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  240. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  241. sage/combinat/rsk.py +3438 -0
  242. sage/combinat/schubert_polynomial.py +508 -0
  243. sage/combinat/set_partition.py +3318 -0
  244. sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
  245. sage/combinat/set_partition_iterator.pyx +136 -0
  246. sage/combinat/set_partition_ordered.py +1590 -0
  247. sage/combinat/sf/abreu_nigro.py +346 -0
  248. sage/combinat/sf/all.py +52 -0
  249. sage/combinat/sf/character.py +576 -0
  250. sage/combinat/sf/classical.py +319 -0
  251. sage/combinat/sf/dual.py +996 -0
  252. sage/combinat/sf/elementary.py +549 -0
  253. sage/combinat/sf/hall_littlewood.py +1028 -0
  254. sage/combinat/sf/hecke.py +336 -0
  255. sage/combinat/sf/homogeneous.py +464 -0
  256. sage/combinat/sf/jack.py +1428 -0
  257. sage/combinat/sf/k_dual.py +1458 -0
  258. sage/combinat/sf/kfpoly.py +447 -0
  259. sage/combinat/sf/llt.py +789 -0
  260. sage/combinat/sf/macdonald.py +2019 -0
  261. sage/combinat/sf/monomial.py +525 -0
  262. sage/combinat/sf/multiplicative.py +113 -0
  263. sage/combinat/sf/new_kschur.py +1786 -0
  264. sage/combinat/sf/ns_macdonald.py +964 -0
  265. sage/combinat/sf/orthogonal.py +246 -0
  266. sage/combinat/sf/orthotriang.py +355 -0
  267. sage/combinat/sf/powersum.py +963 -0
  268. sage/combinat/sf/schur.py +880 -0
  269. sage/combinat/sf/sf.py +1653 -0
  270. sage/combinat/sf/sfa.py +7053 -0
  271. sage/combinat/sf/symplectic.py +253 -0
  272. sage/combinat/sf/witt.py +721 -0
  273. sage/combinat/shifted_primed_tableau.py +2735 -0
  274. sage/combinat/shuffle.py +830 -0
  275. sage/combinat/sidon_sets.py +146 -0
  276. sage/combinat/similarity_class_type.py +1721 -0
  277. sage/combinat/sine_gordon.py +618 -0
  278. sage/combinat/six_vertex_model.py +784 -0
  279. sage/combinat/skew_partition.py +2053 -0
  280. sage/combinat/skew_tableau.py +2989 -0
  281. sage/combinat/sloane_functions.py +8935 -0
  282. sage/combinat/specht_module.py +1403 -0
  283. sage/combinat/species/all.py +48 -0
  284. sage/combinat/species/characteristic_species.py +321 -0
  285. sage/combinat/species/composition_species.py +273 -0
  286. sage/combinat/species/cycle_species.py +284 -0
  287. sage/combinat/species/empty_species.py +155 -0
  288. sage/combinat/species/functorial_composition_species.py +148 -0
  289. sage/combinat/species/generating_series.py +673 -0
  290. sage/combinat/species/library.py +148 -0
  291. sage/combinat/species/linear_order_species.py +169 -0
  292. sage/combinat/species/misc.py +83 -0
  293. sage/combinat/species/partition_species.py +290 -0
  294. sage/combinat/species/permutation_species.py +268 -0
  295. sage/combinat/species/product_species.py +423 -0
  296. sage/combinat/species/recursive_species.py +476 -0
  297. sage/combinat/species/set_species.py +192 -0
  298. sage/combinat/species/species.py +820 -0
  299. sage/combinat/species/structure.py +539 -0
  300. sage/combinat/species/subset_species.py +243 -0
  301. sage/combinat/species/sum_species.py +225 -0
  302. sage/combinat/subword.py +564 -0
  303. sage/combinat/subword_complex.py +2122 -0
  304. sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
  305. sage/combinat/subword_complex_c.pyx +119 -0
  306. sage/combinat/super_tableau.py +821 -0
  307. sage/combinat/superpartition.py +1154 -0
  308. sage/combinat/symmetric_group_algebra.py +3774 -0
  309. sage/combinat/symmetric_group_representations.py +1830 -0
  310. sage/combinat/t_sequences.py +877 -0
  311. sage/combinat/tableau.py +9506 -0
  312. sage/combinat/tableau_residues.py +860 -0
  313. sage/combinat/tableau_tuple.py +5353 -0
  314. sage/combinat/tiling.py +2432 -0
  315. sage/combinat/triangles_FHM.py +777 -0
  316. sage/combinat/tutorial.py +1857 -0
  317. sage/combinat/vector_partition.py +337 -0
  318. sage/combinat/words/abstract_word.py +1722 -0
  319. sage/combinat/words/all.py +59 -0
  320. sage/combinat/words/alphabet.py +268 -0
  321. sage/combinat/words/finite_word.py +7201 -0
  322. sage/combinat/words/infinite_word.py +113 -0
  323. sage/combinat/words/lyndon_word.py +652 -0
  324. sage/combinat/words/morphic.py +351 -0
  325. sage/combinat/words/morphism.py +3878 -0
  326. sage/combinat/words/paths.py +2932 -0
  327. sage/combinat/words/shuffle_product.py +278 -0
  328. sage/combinat/words/suffix_trees.py +1873 -0
  329. sage/combinat/words/word.py +769 -0
  330. sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
  331. sage/combinat/words/word_char.pyx +847 -0
  332. sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
  333. sage/combinat/words/word_datatypes.pxd +4 -0
  334. sage/combinat/words/word_datatypes.pyx +1067 -0
  335. sage/combinat/words/word_generators.py +2026 -0
  336. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  337. sage/combinat/words/word_options.py +99 -0
  338. sage/combinat/words/words.py +2396 -0
  339. sage/data_structures/all__sagemath_combinat.py +1 -0
  340. sage/databases/all__sagemath_combinat.py +13 -0
  341. sage/databases/findstat.py +4897 -0
  342. sage/databases/oeis.py +2058 -0
  343. sage/databases/sloane.py +393 -0
  344. sage/dynamics/all__sagemath_combinat.py +14 -0
  345. sage/dynamics/cellular_automata/all.py +7 -0
  346. sage/dynamics/cellular_automata/catalog.py +34 -0
  347. sage/dynamics/cellular_automata/elementary.py +612 -0
  348. sage/dynamics/cellular_automata/glca.py +477 -0
  349. sage/dynamics/cellular_automata/solitons.py +1463 -0
  350. sage/dynamics/finite_dynamical_system.py +1249 -0
  351. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  352. sage/games/all.py +7 -0
  353. sage/games/hexad.py +704 -0
  354. sage/games/quantumino.py +591 -0
  355. sage/games/sudoku.py +889 -0
  356. sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
  357. sage/games/sudoku_backtrack.pyx +189 -0
  358. sage/groups/all__sagemath_combinat.py +1 -0
  359. sage/groups/indexed_free_group.py +489 -0
  360. sage/libs/all__sagemath_combinat.py +6 -0
  361. sage/libs/lrcalc/__init__.py +1 -0
  362. sage/libs/lrcalc/lrcalc.py +525 -0
  363. sage/libs/symmetrica/__init__.py +7 -0
  364. sage/libs/symmetrica/all.py +101 -0
  365. sage/libs/symmetrica/kostka.pxi +168 -0
  366. sage/libs/symmetrica/part.pxi +193 -0
  367. sage/libs/symmetrica/plet.pxi +42 -0
  368. sage/libs/symmetrica/sab.pxi +196 -0
  369. sage/libs/symmetrica/sb.pxi +332 -0
  370. sage/libs/symmetrica/sc.pxi +192 -0
  371. sage/libs/symmetrica/schur.pxi +956 -0
  372. sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
  373. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  374. sage/libs/symmetrica/symmetrica.pyx +39 -0
  375. sage/monoids/all.py +13 -0
  376. sage/monoids/automatic_semigroup.py +1054 -0
  377. sage/monoids/free_abelian_monoid.py +315 -0
  378. sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
  379. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  380. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  381. sage/monoids/free_monoid.py +335 -0
  382. sage/monoids/free_monoid_element.py +431 -0
  383. sage/monoids/hecke_monoid.py +65 -0
  384. sage/monoids/string_monoid.py +817 -0
  385. sage/monoids/string_monoid_element.py +547 -0
  386. sage/monoids/string_ops.py +143 -0
  387. sage/monoids/trace_monoid.py +972 -0
  388. sage/rings/all__sagemath_combinat.py +2 -0
  389. sage/sat/all.py +4 -0
  390. sage/sat/boolean_polynomials.py +405 -0
  391. sage/sat/converters/__init__.py +6 -0
  392. sage/sat/converters/anf2cnf.py +14 -0
  393. sage/sat/converters/polybori.py +611 -0
  394. sage/sat/solvers/__init__.py +5 -0
  395. sage/sat/solvers/cryptominisat.py +287 -0
  396. sage/sat/solvers/dimacs.py +783 -0
  397. sage/sat/solvers/picosat.py +228 -0
  398. sage/sat/solvers/sat_lp.py +156 -0
  399. sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
  400. sage/sat/solvers/satsolver.pxd +3 -0
  401. sage/sat/solvers/satsolver.pyx +405 -0
@@ -0,0 +1,1262 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ Crystals of modified Nakajima monomials
5
+
6
+ Let `Y_{i,k}`, for `i \in I` and `k \in \ZZ`, be a commuting set of
7
+ variables, and let `\boldsymbol{1}` be a new variable which commutes with
8
+ each `Y_{i,k}`. (Here, `I` represents the index set of a Cartan datum.) One
9
+ may endow the structure of a crystal on the set `\widehat{\mathcal{M}}` of
10
+ monomials of the form
11
+
12
+ .. MATH::
13
+
14
+ M = \prod_{(i,k) \in I\times \ZZ_{\ge0}} Y_{i,k}^{y_i(k)}\boldsymbol{1}.
15
+
16
+ Elements of `\widehat{\mathcal{M}}` are called *modified Nakajima monomials*.
17
+ We will omit the `\boldsymbol{1}` from the end of a monomial if there exists
18
+ at least one `y_i(k) \neq 0`. The crystal structure on this set is defined by
19
+
20
+ .. MATH::
21
+
22
+ \begin{aligned}
23
+ \mathrm{wt}(M) &= \sum_{i\in I} \Bigl( \sum_{k\ge 0} y_i(k) \Bigr) \Lambda_i, \\
24
+ \varphi_i(M) &= \max\Bigl\{ \sum_{0\le j \le k} y_i(j) : k\ge 0 \Bigr\}, \\
25
+ \varepsilon_i(M) &= \varphi_i(M) - \langle h_i, \mathrm{wt}(M) \rangle, \\
26
+ k_f = k_f(M) &= \min\Bigl\{ k\ge 0 : \varphi_i(M) = \sum_{0\le j\le k} y_i(j) \Bigr\}, \\
27
+ k_e = k_e(M) &= \max\Bigl\{ k\ge 0 : \varphi_i(M) = \sum_{0\le j\le k} y_i(j) \Bigr\},
28
+ \end{aligned}
29
+
30
+ where `\{h_i : i \in I\}` and `\{\Lambda_i : i \in I \}` are the simple
31
+ coroots and fundamental weights, respectively. With a chosen set of integers
32
+ `C = (c_{ij})_{i\neq j}` such that `c_{ij}+c_{ji} =1`, one defines
33
+
34
+ .. MATH::
35
+
36
+ A_{i,k} = Y_{i,k} Y_{i,k+1} \prod_{j\neq i} Y_{j,k+c_{ji}}^{a_{ji}},
37
+
38
+ where `(a_{ij})` is a Cartan matrix. Then
39
+
40
+ .. MATH::
41
+
42
+ \begin{aligned}
43
+ e_iM &= \begin{cases} 0 & \text{if } \varepsilon_i(M) = 0, \\
44
+ A_{i,k_e}M & \text{if } \varepsilon_i(M) > 0, \end{cases} \\
45
+ f_iM &= A_{i,k_f}^{-1} M.
46
+ \end{aligned}
47
+
48
+ It is shown in [KKS2007]_ that the connected component of `\widehat{\mathcal{M}}`
49
+ containing the element `\boldsymbol{1}`, which we denote by
50
+ `\mathcal{M}(\infty)`, is crystal isomorphic to the crystal `B(\infty)`.
51
+
52
+ Let `\widetilde{\mathcal{M}}` be `\widehat{\mathcal{M}}` as a set, and with
53
+ crystal structure defined as on `\widehat{\mathcal{M}}` with the exception
54
+ that
55
+
56
+ .. MATH::
57
+
58
+ f_iM = \begin{cases} 0 & \text{if } \varphi_i(M) = 0, \\
59
+ A_{i,k_f}^{-1}M & \text{if } \varphi_i(M) > 0. \end{cases}
60
+
61
+ Then Kashiwara [Ka2003]_ showed that the connected component in
62
+ `\widetilde{\mathcal{M}}` containing a monomial `M` such that `e_iM = 0`, for
63
+ all `i \in I`, is crystal isomorphic to the irreducible highest weight
64
+ crystal `B(\mathrm{wt}(M))`.
65
+
66
+ WARNING:
67
+
68
+ Monomial crystals depend on the choice of positive integers
69
+ `C = (c_{ij})_{i\neq j}` satisfying the condition `c_{ij}+c_{ji}=1`.
70
+ We have chosen such integers uniformly such that `c_{ij} = 1` if
71
+ `i < j` and `c_{ij} = 0` if `i>j`.
72
+
73
+ AUTHORS:
74
+
75
+ - Arthur Lubovsky: initial version
76
+ - Ben Salisbury: initial version
77
+ """
78
+
79
+ # *****************************************************************************
80
+ # Copyright (C) 2013
81
+ #
82
+ # Arthur Lubovsky (alubovsky at albany dot edu)
83
+ # Ben Salisbury (ben dot salisbury at cmich dot edu)
84
+ #
85
+ # Distributed under the terms of the GNU General Public License (GPL)
86
+ # https://www.gnu.org/licenses/
87
+ # *****************************************************************************
88
+
89
+ from copy import copy
90
+ from sage.structure.element import Element
91
+ from sage.structure.parent import Parent
92
+ from sage.structure.unique_representation import UniqueRepresentation
93
+ from sage.categories.classical_crystals import ClassicalCrystals
94
+ from sage.categories.highest_weight_crystals import HighestWeightCrystals
95
+ from sage.categories.regular_crystals import RegularCrystals
96
+ from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
97
+ from sage.combinat.root_system.cartan_type import CartanType
98
+ from sage.combinat.root_system.root_system import RootSystem
99
+ from sage.rings.infinity import Infinity
100
+ from sage.rings.integer_ring import ZZ
101
+ from sage.matrix.matrix_space import MatrixSpace
102
+
103
+
104
+ class NakajimaMonomial(Element):
105
+ r"""
106
+ An element of the monomial crystal.
107
+
108
+ Monomials of the form `Y_{i_1,k_1}^{y_1} \cdots Y_{i_t,k_t}^{y_t}`,
109
+ where `i_1, \dots, i_t` are elements of the index set, `k_1, \dots, k_t`
110
+ are nonnegative integers, and `y_1, \dots, y_t` are integers.
111
+
112
+ EXAMPLES::
113
+
114
+ sage: M = crystals.infinity.NakajimaMonomials(['B',3,1])
115
+ sage: mg = M.module_generators[0]
116
+ sage: mg
117
+ 1
118
+ sage: mg.f_string([1,3,2,0,1,2,3,0,0,1])
119
+ Y(0,0)^-1 Y(0,1)^-1 Y(0,2)^-1 Y(0,3)^-1 Y(1,0)^-3
120
+ Y(1,1)^-2 Y(1,2) Y(2,0)^3 Y(2,2) Y(3,0) Y(3,2)^-1
121
+
122
+ An example using the `A` variables::
123
+
124
+ sage: M = crystals.infinity.NakajimaMonomials("A3")
125
+ sage: M.set_variables('A')
126
+ sage: mg = M.module_generators[0]
127
+ sage: mg.f_string([1,2,3,2,1])
128
+ A(1,0)^-1 A(1,1)^-1 A(2,0)^-2 A(3,0)^-1
129
+ sage: mg.f_string([3,2,1])
130
+ A(1,2)^-1 A(2,1)^-1 A(3,0)^-1
131
+ sage: M.set_variables('Y')
132
+ """
133
+
134
+ def __init__(self, parent, Y, A):
135
+ r"""
136
+ INPUT:
137
+
138
+ - ``d`` -- dictionary of with pairs of the form ``{(i,k): y}``
139
+
140
+ EXAMPLES::
141
+
142
+ sage: M = crystals.infinity.NakajimaMonomials("C5")
143
+ sage: mg = M.module_generators[0]
144
+ sage: TestSuite(mg).run()
145
+ """
146
+ self._Y = Y
147
+ self._A = A
148
+ Element.__init__(self, parent)
149
+
150
+ def _repr_(self):
151
+ r"""
152
+ Return a string representation of ``self``.
153
+
154
+ EXAMPLES::
155
+
156
+ sage: M = crystals.infinity.NakajimaMonomials(['A',5,2])
157
+ sage: x = M({(1,0):1, (2,2):-2, (0,5):10}); x
158
+ Y(0,5)^10 Y(1,0) Y(2,2)^-2
159
+ sage: M.set_variables('A')
160
+ sage: x
161
+ A(1,0)^-2 A(1,1)^-2 A(2,0)^-4 A(2,1)^-2 A(3,0)^-2
162
+ sage: M.set_variables('Y')
163
+ """
164
+ return getattr(self, '_repr_' + self.parent()._variable)()
165
+
166
+ def _repr_Y(self):
167
+ r"""
168
+ Return a string representation of ``self`` in the `Y` variables.
169
+
170
+ EXAMPLES::
171
+
172
+ sage: M = crystals.infinity.NakajimaMonomials(['A',5,2])
173
+ sage: M({(1,0):1,(2,2):-2,(0,5):10})
174
+ Y(0,5)^10 Y(1,0) Y(2,2)^-2
175
+ """
176
+ if not self._Y:
177
+ return "1"
178
+
179
+ L = sorted(self._Y.items(), key=lambda x: (x[0][0], x[0][1]))
180
+ exp = lambda e: "^{}".format(e) if e != 1 else ""
181
+ return ' '.join("Y({},{})".format(mon[0][0], mon[0][1]) + exp(mon[1])
182
+ for mon in L)
183
+
184
+ def _repr_A(self):
185
+ r"""
186
+ Return a string representation of ``self`` in the `A` variables.
187
+
188
+ EXAMPLES::
189
+
190
+ sage: M = crystals.infinity.NakajimaMonomials(['B',4,1])
191
+ sage: m = M.module_generators[0].f_string([4,2,1])
192
+ sage: m._repr_A()
193
+ 'A(1,1)^-1 A(2,0)^-1 A(4,0)^-1'
194
+ """
195
+ try:
196
+ Y = {(i,0): c for i,c in self.parent().hw}
197
+ except Exception:
198
+ Y = {}
199
+
200
+ if not Y and not self._A:
201
+ return "1"
202
+
203
+ L = sorted(Y.items(), key=lambda x: (x[0][0], x[0][1]))
204
+ exp = lambda e: "^{}".format(e) if e != 1 else ""
205
+ ret = ' '.join("Y({},{})".format(mon[0][0], mon[0][1]) + exp(mon[1])
206
+ for mon in L)
207
+ if not self._A:
208
+ return ret
209
+ if Y:
210
+ ret += ' '
211
+ L = sorted(self._A.items(), key=lambda x: (x[0][0], x[0][1]))
212
+ return ret + ' '.join("A({},{})".format(mon[0][0], mon[0][1]) + exp(mon[1])
213
+ for mon in L)
214
+
215
+ def __hash__(self):
216
+ r"""
217
+ TESTS::
218
+
219
+ sage: M = crystals.infinity.NakajimaMonomials(['C',5])
220
+ sage: m1 = M.module_generators[0].f(1)
221
+ sage: m2 = M.module_generators[0].f(2)
222
+ sage: hash(m1) != hash(m2)
223
+ True
224
+ """
225
+ return hash(frozenset(tuple(self._Y.items())))
226
+
227
+ def __eq__(self, other):
228
+ r"""
229
+ EXAMPLES::
230
+
231
+ sage: M = crystals.infinity.NakajimaMonomials(['C',5])
232
+ sage: m1 = M.module_generators[0].f(1)
233
+ sage: m2 = M.module_generators[0].f(2)
234
+ sage: m1.__eq__(m2)
235
+ False
236
+ sage: m1.__eq__(m1)
237
+ True
238
+ """
239
+ if isinstance(other, NakajimaMonomial):
240
+ return self._Y == other._Y
241
+ return self._Y == other
242
+
243
+ def __ne__(self, other):
244
+ r"""
245
+ EXAMPLES::
246
+
247
+ sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights()
248
+ sage: M = crystals.NakajimaMonomials(['A',2],La[1]+La[2])
249
+ sage: m0 = M.module_generators[0]
250
+ sage: m = M.module_generators[0].f(1).f(2).f(2).f(1)
251
+ sage: m.__ne__(m0)
252
+ True
253
+ sage: m.__ne__(m)
254
+ False
255
+ """
256
+ return not self == other
257
+
258
+ def __lt__(self, other):
259
+ r"""
260
+ EXAMPLES::
261
+
262
+ sage: M = crystals.infinity.NakajimaMonomials(['F',4])
263
+ sage: mg = M.module_generators[0]
264
+ sage: m = mg.f(4)
265
+ sage: m.__lt__(mg)
266
+ False
267
+ sage: mg.__lt__(m)
268
+ False
269
+ """
270
+ return False
271
+
272
+ def _latex_(self):
273
+ r"""
274
+ Return a `\LaTeX` representation of ``self``.
275
+
276
+ EXAMPLES::
277
+
278
+ sage: M = crystals.infinity.NakajimaMonomials(['G',2,1])
279
+ sage: x = M.module_generators[0].f_string([1,0,2])
280
+ sage: latex(x)
281
+ Y_{0,0}^{-1} Y_{1,0}^{-1} Y_{1,1}^{2} Y_{2,0} Y_{2,1}^{-1}
282
+ sage: M.set_variables('A')
283
+ sage: latex(x)
284
+ A_{0,0}^{-1} A_{1,0}^{-1} A_{2,0}^{-1}
285
+ sage: M.set_variables('Y')
286
+ """
287
+ return getattr(self, '_latex_' + self.parent()._variable)()
288
+
289
+ def _latex_Y(self):
290
+ r"""
291
+ Return a `\LaTeX` representation of ``self`` in the `Y` variables.
292
+
293
+ EXAMPLES::
294
+
295
+ sage: M = crystals.infinity.NakajimaMonomials(['G',2,1])
296
+ sage: M.module_generators[0].f_string([1,0,2])._latex_Y()
297
+ 'Y_{0,0}^{-1} Y_{1,0}^{-1} Y_{1,1}^{2} Y_{2,0} Y_{2,1}^{-1} '
298
+ """
299
+ if not self._Y:
300
+ return "\\boldsymbol{1}"
301
+
302
+ L = sorted(self._Y.items(), key=lambda x:(x[0][0],x[0][1]))
303
+ return_str = ''
304
+ for x in L:
305
+ if x[1] != 1:
306
+ return_str += "Y_{%s,%s}" % (x[0][0],x[0][1]) + "^{%s} " % x[1]
307
+ else:
308
+ return_str += "Y_{%s,%s} " % (x[0][0],x[0][1])
309
+ return return_str
310
+
311
+ def _latex_A(self):
312
+ r"""
313
+ Return a `\LaTeX` representation of ``self`` in the `A` variables.
314
+
315
+ EXAMPLES::
316
+
317
+ sage: M = crystals.infinity.NakajimaMonomials(['C',4,1])
318
+ sage: m = M.module_generators[0].f_string([4,2,3])
319
+ sage: m._latex_A()
320
+ 'A_{2,0}^{-1} A_{3,1}^{-1} A_{4,0}^{-1} '
321
+ """
322
+ try:
323
+ Y = {(i,0): c for i,c in self.parent().hw}
324
+ except Exception:
325
+ Y = {}
326
+
327
+ if not Y and not self._A:
328
+ return "\\boldsymbol{1}"
329
+
330
+ L = sorted(Y.items(), key=lambda x:(x[0][0],x[0][1]))
331
+ return_str = ''
332
+ for x in L:
333
+ if x[1] != 1:
334
+ return_str += "Y_{%s,%s}" % (x[0][0],x[0][1]) + "^{%s} " % x[1]
335
+ else:
336
+ return_str += "Y_{%s,%s} " % (x[0][0],x[0][1])
337
+ L = sorted(self._A.items(), key=lambda x:(x[0][0],x[0][1]))
338
+ for x in L:
339
+ if x[1] != 1:
340
+ return_str += "A_{%s,%s}" % (x[0][0],x[0][1]) + "^{%s} " % x[1]
341
+ else:
342
+ return_str += "A_{%s,%s} " % (x[0][0],x[0][1])
343
+ return return_str
344
+
345
+ def _classical_weight(self):
346
+ r"""
347
+ Return the weight of ``self`` as an element of the classical version of
348
+ ``self.parent().weight_lattice_realization``.
349
+
350
+ EXAMPLES::
351
+
352
+ sage: M = crystals.infinity.NakajimaMonomials(['D',4,2])
353
+ sage: m = M.module_generators[0].f_string([0,3,2,0,1])
354
+ sage: m._classical_weight()
355
+ -2*Lambda[0] + Lambda[1]
356
+
357
+ sage: M = crystals.infinity.NakajimaMonomials(['E',6])
358
+ sage: m = M.module_generators[0].f_string([1,5,2,6,3])
359
+ sage: m._classical_weight()
360
+ (-1/2, -3/2, 3/2, 1/2, -1/2, 1/2, 1/2, -1/2)
361
+ """
362
+ P = self.parent().weight_lattice_realization()
363
+ La = P.fundamental_weights()
364
+ return P(sum(v*La[k[0]] for k,v in self._Y.items()))
365
+
366
+ def weight_in_root_lattice(self):
367
+ r"""
368
+ Return the weight of ``self`` as an element of the root lattice.
369
+
370
+ EXAMPLES::
371
+
372
+ sage: M = crystals.infinity.NakajimaMonomials(['F',4])
373
+ sage: m = M.module_generators[0].f_string([3,3,1,2,4])
374
+ sage: m.weight_in_root_lattice()
375
+ -alpha[1] - alpha[2] - 2*alpha[3] - alpha[4]
376
+
377
+ sage: M = crystals.infinity.NakajimaMonomials(['B',3,1])
378
+ sage: mg = M.module_generators[0]
379
+ sage: m = mg.f_string([1,3,2,0,1,2,3,0,0,1])
380
+ sage: m.weight_in_root_lattice()
381
+ -3*alpha[0] - 3*alpha[1] - 2*alpha[2] - 2*alpha[3]
382
+
383
+ sage: M = crystals.infinity.NakajimaMonomials(['C',3,1])
384
+ sage: m = M.module_generators[0].f_string([3,0,1,2,0])
385
+ sage: m.weight_in_root_lattice()
386
+ -2*alpha[0] - alpha[1] - alpha[2] - alpha[3]
387
+ """
388
+ Q = RootSystem(self.parent().cartan_type()).root_lattice()
389
+ al = Q.simple_roots()
390
+ return Q.sum(e*al[k[0]] for k,e in self._A.items())
391
+
392
+ def weight(self):
393
+ r"""
394
+ Return the weight of ``self`` as an element of the weight lattice.
395
+
396
+ EXAMPLES::
397
+
398
+ sage: C = crystals.infinity.NakajimaMonomials(['A',1,1])
399
+ sage: v = C.highest_weight_vector()
400
+ sage: v.f(1).weight() + v.f(0).weight()
401
+ -delta
402
+
403
+ sage: M = crystals.infinity.NakajimaMonomials(['A',4,2])
404
+ sage: m = M.highest_weight_vector().f_string([1,2,0,1])
405
+ sage: m.weight()
406
+ 2*Lambda[0] - Lambda[1] - delta
407
+ """
408
+ P = self.parent().weight_lattice_realization()
409
+ return P(self.weight_in_root_lattice())
410
+
411
+ def epsilon(self, i):
412
+ r"""
413
+ Return the value of `\varepsilon_i` on ``self``.
414
+
415
+ INPUT:
416
+
417
+ - ``i`` -- an element of the index set
418
+
419
+ EXAMPLES::
420
+
421
+ sage: M = crystals.infinity.NakajimaMonomials(['G',2,1])
422
+ sage: m = M.module_generators[0].f(2)
423
+ sage: [m.epsilon(i) for i in M.index_set()]
424
+ [0, 0, 1]
425
+
426
+ sage: M = crystals.infinity.NakajimaMonomials(['C',4,1])
427
+ sage: m = M.module_generators[0].f_string([4,2,3])
428
+ sage: [m.epsilon(i) for i in M.index_set()]
429
+ [0, 0, 0, 1, 0]
430
+ """
431
+ if i not in self.parent().index_set():
432
+ raise ValueError("i must be an element of the index set")
433
+ h = self.parent().weight_lattice_realization().simple_coroots()
434
+ return self.phi(i) - self._classical_weight().scalar(h[i])
435
+
436
+ def phi(self, i):
437
+ r"""
438
+ Return the value of `\varphi_i` on ``self``.
439
+
440
+ INPUT:
441
+
442
+ - ``i`` -- an element of the index set
443
+
444
+ EXAMPLES::
445
+
446
+ sage: M = crystals.infinity.NakajimaMonomials(['D',4,3])
447
+ sage: m = M.module_generators[0].f(1)
448
+ sage: [m.phi(i) for i in M.index_set()]
449
+ [1, -1, 1]
450
+
451
+ sage: M = crystals.infinity.NakajimaMonomials(['C',4,1])
452
+ sage: m = M.module_generators[0].f_string([4,2,3])
453
+ sage: [m.phi(i) for i in M.index_set()]
454
+ [0, 1, -1, 2, -1]
455
+ """
456
+ if i not in self.parent().index_set():
457
+ raise ValueError("i must be an element of the index set")
458
+ if not self._Y or all(x[0] != i for x in self._Y):
459
+ return ZZ.zero()
460
+
461
+ d = copy(self._Y)
462
+ K = max(x[1] for x in d if x[0] == i)
463
+ for a in range(K):
464
+ if (i,a) in d:
465
+ continue
466
+ else:
467
+ d[(i,a)] = 0
468
+ S = sorted((x for x in d.items() if x[0][0] == i), key=lambda x: x[0][1])
469
+ return max(sum(S[k][1] for k in range(s)) for s in range(1,len(S)+1))
470
+
471
+ def _ke(self, i):
472
+ r"""
473
+ Return the value `k_e` with respect to ``i`` and ``self``.
474
+
475
+ INPUT:
476
+
477
+ - ``i`` -- an element of the index set
478
+
479
+ EXAMPLES::
480
+
481
+ sage: M = crystals.infinity.NakajimaMonomials(['D',4,3])
482
+ sage: m = M.module_generators[0].f(1)
483
+ sage: [m._ke(i) for i in M.index_set()]
484
+ [+Infinity, 0, +Infinity]
485
+ """
486
+ h = self.parent().weight_lattice_realization().simple_coroots()
487
+ phi = self.phi(i)
488
+ if phi == self._classical_weight().scalar(h[i]): # self.epsilon(i) == 0
489
+ return Infinity
490
+
491
+ d = copy(self._Y)
492
+ K = max(x[1] for x in d if x[0] == i)
493
+ for a in range(K):
494
+ if (i,a) in d:
495
+ continue
496
+ else:
497
+ d[(i,a)] = 0
498
+ total = ZZ.zero()
499
+ L = []
500
+ S = sorted((x for x in d.items() if x[0][0] == i), key=lambda x: x[0][1])
501
+ for var,exp in S:
502
+ total += exp
503
+ if total == phi:
504
+ L.append(var[1])
505
+
506
+ return max(L) if L else ZZ.zero()
507
+
508
+ def _kf(self, i):
509
+ r"""
510
+ Return the value `k_f` with respect to ``i`` and ``self``.
511
+
512
+ INPUT:
513
+
514
+ - ``i`` -- an element of the index set
515
+
516
+ EXAMPLES::
517
+
518
+ sage: M = crystals.infinity.NakajimaMonomials(['F',4,1])
519
+ sage: m = M.module_generators[0].f_string([0,1,4,3])
520
+ sage: [m._kf(i) for i in M.index_set()]
521
+ [0, 0, 2, 0, 0]
522
+ """
523
+ if all(i != x[0] for x in self._Y):
524
+ return ZZ.zero()
525
+
526
+ d = copy(self._Y)
527
+ K = max(key[1] for key in d if key[0] == i)
528
+ for a in range(K):
529
+ if (i,a) in d:
530
+ continue
531
+ else:
532
+ d[(i,a)] = 0
533
+ S = sorted((x for x in d.items() if x[0][0] == i), key=lambda x: x[0][1])
534
+ sum = 0
535
+ phi = self.phi(i)
536
+ for var,exp in S:
537
+ sum += exp
538
+ if sum == phi:
539
+ return var[1]
540
+
541
+ def e(self, i):
542
+ r"""
543
+ Return the action of `e_i` on ``self``.
544
+
545
+ INPUT:
546
+
547
+ - ``i`` -- an element of the index set
548
+
549
+ EXAMPLES::
550
+
551
+ sage: M = crystals.infinity.NakajimaMonomials(['E',7,1])
552
+ sage: m = M.module_generators[0].f_string([0,1,4,3])
553
+ sage: [m.e(i) for i in M.index_set()]
554
+ [None,
555
+ None,
556
+ None,
557
+ Y(0,0)^-1 Y(1,1)^-1 Y(2,1) Y(3,0) Y(3,1) Y(4,0)^-1 Y(4,1)^-1 Y(5,0),
558
+ None,
559
+ None,
560
+ None,
561
+ None]
562
+
563
+ sage: M = crystals.infinity.NakajimaMonomials("C5")
564
+ sage: m = M.module_generators[0].f_string([1,3])
565
+ sage: [m.e(i) for i in M.index_set()]
566
+ [Y(2,1) Y(3,0)^-1 Y(3,1)^-1 Y(4,0),
567
+ None,
568
+ Y(1,0)^-1 Y(1,1)^-1 Y(2,0),
569
+ None,
570
+ None]
571
+
572
+ sage: M = crystals.infinity.NakajimaMonomials(['D',4,1])
573
+ sage: M.set_variables('A')
574
+ sage: m = M.module_generators[0].f_string([4,2,3,0])
575
+ sage: [m.e(i) for i in M.index_set()]
576
+ [A(2,1)^-1 A(3,1)^-1 A(4,0)^-1,
577
+ None,
578
+ None,
579
+ A(0,2)^-1 A(2,1)^-1 A(4,0)^-1,
580
+ None]
581
+ sage: M.set_variables('Y')
582
+ """
583
+ if i not in self.parent().index_set():
584
+ raise ValueError("i must be an element of the index set")
585
+ if self.epsilon(i) == 0:
586
+ return None
587
+
588
+ newdict = copy(self._Y)
589
+ ke = self._ke(i)
590
+ Aik = {(i, ke): 1, (i, ke+1): 1}
591
+ ct = self.parent().cartan_type()
592
+ cm = ct.cartan_matrix()
593
+ shift = 0
594
+ if self.parent().cartan_type().is_finite():
595
+ shift = 1
596
+ for j_index,j in enumerate(self.parent().index_set()):
597
+ if i == j:
598
+ continue
599
+ c = self.parent()._c[j_index,i-shift]
600
+ if cm[j_index,i-shift] != 0:
601
+ Aik[(j, ke+c)] = cm[j_index,i-shift]
602
+ # Multiply by Aik
603
+ for key,value in Aik.items():
604
+ if key in newdict:
605
+ if newdict[key] == -value: # The result would be a 0 exponent
606
+ del newdict[key]
607
+ else:
608
+ newdict[key] += value
609
+ else:
610
+ newdict[key] = value
611
+ A = copy(self._A)
612
+ A[(i,ke)] = A.get((i,ke),0) + 1
613
+ if not A[(i,ke)]:
614
+ del A[(i,ke)]
615
+ return self.__class__(self.parent(), newdict, A)
616
+
617
+ def f(self, i):
618
+ r"""
619
+ Return the action of `f_i` on ``self``.
620
+
621
+ INPUT:
622
+
623
+ - ``i`` -- an element of the index set
624
+
625
+ EXAMPLES::
626
+
627
+ sage: M = crystals.infinity.NakajimaMonomials("B4")
628
+ sage: m = M.module_generators[0].f_string([1,3,4])
629
+ sage: [m.f(i) for i in M.index_set()]
630
+ [Y(1,0)^-2 Y(1,1)^-2 Y(2,0)^2 Y(2,1) Y(3,0)^-1 Y(4,0) Y(4,1)^-1,
631
+ Y(1,0)^-1 Y(1,1)^-1 Y(1,2) Y(2,0) Y(2,2)^-1 Y(3,0)^-1 Y(3,1) Y(4,0) Y(4,1)^-1,
632
+ Y(1,0)^-1 Y(1,1)^-1 Y(2,0) Y(2,1)^2 Y(3,0)^-2 Y(3,1)^-1 Y(4,0)^3 Y(4,1)^-1,
633
+ Y(1,0)^-1 Y(1,1)^-1 Y(2,0) Y(2,1) Y(3,0)^-1 Y(3,1) Y(4,1)^-2]
634
+ """
635
+ if i not in self.parent().index_set():
636
+ raise ValueError("i must be an element of the index set")
637
+ newdict = copy(self._Y)
638
+ kf = self._kf(i)
639
+ Aik = {(i, kf): -1, (i, kf+1): -1}
640
+ ct = self.parent().cartan_type()
641
+ cm = ct.cartan_matrix()
642
+ shift = 0
643
+ if ct.is_finite():
644
+ shift = 1
645
+ for j_index,j in enumerate(self.parent().index_set()):
646
+ if i == j:
647
+ continue
648
+ c = self.parent()._c[j_index,i-shift]
649
+ if cm[j_index,i-shift] != 0:
650
+ Aik[(j, kf+c)] = -cm[j_index,i-shift]
651
+ # Multiply by Aik
652
+ for key,value in Aik.items():
653
+ if key in newdict:
654
+ if newdict[key] == -value: # The result would be a 0 exponent
655
+ del newdict[key]
656
+ else:
657
+ newdict[key] += value
658
+ else:
659
+ newdict[key] = value
660
+ A = copy(self._A)
661
+ A[(i,kf)] = A.get((i,kf),0) - 1
662
+ if not A[(i,kf)]:
663
+ del A[(i,kf)]
664
+ return self.__class__(self.parent(), newdict, A)
665
+
666
+
667
+ class InfinityCrystalOfNakajimaMonomials(UniqueRepresentation, Parent):
668
+ r"""
669
+ Crystal `B(\infty)` in terms of (modified) Nakajima monomials.
670
+
671
+ Let `Y_{i,k}`, for `i \in I` and `k \in \ZZ`, be a commuting set of
672
+ variables, and let `\boldsymbol{1}` be a new variable which commutes
673
+ with each `Y_{i,k}`. (Here, `I` represents the index set of a Cartan
674
+ datum.) One may endow the structure of a crystal on the
675
+ set `\widehat{\mathcal{M}}` of monomials of the form
676
+
677
+ .. MATH::
678
+
679
+ M = \prod_{(i,k) \in I\times \ZZ_{\ge0}} Y_{i,k}^{y_i(k)}\boldsymbol{1}.
680
+
681
+ Elements of `\widehat{\mathcal{M}}` are called
682
+ *modified Nakajima monomials*. We will omit the `\boldsymbol{1}`
683
+ from the end of a monomial if there exists at least one `y_i(k) \neq 0`.
684
+ The crystal structure on this set is defined by
685
+
686
+ .. MATH::
687
+
688
+ \begin{aligned}
689
+ \mathrm{wt}(M) & = \sum_{i\in I} \Bigl( \sum_{k \ge 0}
690
+ y_i(k) \Bigr) \Lambda_i, \\
691
+ \varphi_i(M) & = \max\Bigl\{ \sum_{0 \le j \le k} y_i(j) :
692
+ k \ge 0 \Bigr\}, \\
693
+ \varepsilon_i(M) & = \varphi_i(M) -
694
+ \langle h_i, \mathrm{wt}(M) \rangle, \\
695
+ k_f = k_f(M) & = \min\Bigl\{ k \ge 0 :
696
+ \varphi_i(M) = \sum_{0 \le j \le k} y_i(j) \Bigr\}, \\
697
+ k_e = k_e(M) & = \max\Bigl\{ k \ge 0 :
698
+ \varphi_i(M) = \sum_{0 \le j \le k} y_i(j) \Bigr\},
699
+ \end{aligned}
700
+
701
+ where `\{h_i : i \in I\}` and `\{\Lambda_i : i \in I \}` are the simple
702
+ coroots and fundamental weights, respectively. With a chosen set of
703
+ nonnegative integers `C = (c_{ij})_{i\neq j}` such that
704
+ `c_{ij} + c_{ji} = 1`, one defines
705
+
706
+ .. MATH::
707
+
708
+ A_{i,k} = Y_{i,k} Y_{i,k+1} \prod_{j\neq i} Y_{j,k+c_{ji}}^{a_{ji}},
709
+
710
+ where `(a_{ij})_{i,j \in I}` is a Cartan matrix. Then
711
+
712
+ .. MATH::
713
+
714
+ \begin{aligned}
715
+ e_iM &= \begin{cases} 0 & \text{if } \varepsilon_i(M) = 0, \\
716
+ A_{i,k_e}M & \text{if } \varepsilon_i(M) > 0, \end{cases} \\
717
+ f_iM &= A_{i,k_f}^{-1} M.
718
+ \end{aligned}
719
+
720
+ It is shown in [KKS2007]_ that the connected component of
721
+ `\widehat{\mathcal{M}}` containing the element `\boldsymbol{1}`,
722
+ which we denote by `\mathcal{M}(\infty)`, is crystal isomorphic
723
+ to the crystal `B(\infty)`.
724
+
725
+ INPUT:
726
+
727
+ - ``cartan_type`` -- a Cartan type
728
+
729
+ - ``c`` -- (optional) the matrix `(c_{ij})_{i,j \in I}` such that
730
+ `c_{ii} = 0` for all `i \in I`, `c_{ij} \in \ZZ_{>0}` for all
731
+ `i,j \in I`, and `c_{ij} + c_{ji} = 1` for all `i \neq j`; the
732
+ default is `c_{ij} = 0` if `i < j` and `0` otherwise
733
+
734
+ EXAMPLES::
735
+
736
+ sage: B = crystals.infinity.Tableaux("C3")
737
+ sage: S = B.subcrystal(max_depth=4)
738
+ sage: G = B.digraph(subset=S) # long time
739
+ sage: M = crystals.infinity.NakajimaMonomials("C3") # long time
740
+ sage: T = M.subcrystal(max_depth=4) # long time
741
+ sage: H = M.digraph(subset=T) # long time
742
+ sage: G.is_isomorphic(H,edge_labels=True) # long time
743
+ True
744
+
745
+ sage: M = crystals.infinity.NakajimaMonomials(['A',2,1])
746
+ sage: T = M.subcrystal(max_depth=3)
747
+ sage: H = M.digraph(subset=T) # long time
748
+ sage: Y = crystals.infinity.GeneralizedYoungWalls(2)
749
+ sage: YS = Y.subcrystal(max_depth=3)
750
+ sage: YG = Y.digraph(subset=YS) # long time
751
+ sage: YG.is_isomorphic(H,edge_labels=True) # long time
752
+ True
753
+
754
+ sage: M = crystals.infinity.NakajimaMonomials("D4")
755
+ sage: B = crystals.infinity.Tableaux("D4")
756
+ sage: MS = M.subcrystal(max_depth=3)
757
+ sage: BS = B.subcrystal(max_depth=3)
758
+ sage: MG = M.digraph(subset=MS) # long time
759
+ sage: BG = B.digraph(subset=BS) # long time
760
+ sage: BG.is_isomorphic(MG,edge_labels=True) # long time
761
+ True
762
+ """
763
+ @staticmethod
764
+ def _normalize_c(c, n):
765
+ """
766
+ Normalize the input ``c``.
767
+
768
+ EXAMPLES::
769
+
770
+ sage: from sage.combinat.crystals.monomial_crystals import InfinityCrystalOfNakajimaMonomials
771
+ sage: InfinityCrystalOfNakajimaMonomials._normalize_c(None, 4)
772
+ [0 1 1 1]
773
+ [0 0 1 1]
774
+ [0 0 0 1]
775
+ [0 0 0 0]
776
+ sage: c = matrix([[0,1,1],[0,0,0],[0,1,0]]); c
777
+ [0 1 1]
778
+ [0 0 0]
779
+ [0 1 0]
780
+ sage: c.is_mutable()
781
+ True
782
+ sage: C = InfinityCrystalOfNakajimaMonomials._normalize_c(c, 3); C
783
+ [0 1 1]
784
+ [0 0 0]
785
+ [0 1 0]
786
+ sage: C.is_mutable()
787
+ False
788
+
789
+ TESTS::
790
+
791
+ sage: c = matrix([[0,1],[0,1]])
792
+ sage: C = InfinityCrystalOfNakajimaMonomials._normalize_c(c, 2)
793
+ Traceback (most recent call last):
794
+ ...
795
+ ValueError: the c matrix must have 0s on the diagonal
796
+ sage: c = matrix([[0,2],[-1,0]])
797
+ sage: C = InfinityCrystalOfNakajimaMonomials._normalize_c(c, 2)
798
+ Traceback (most recent call last):
799
+ ...
800
+ ValueError: the c matrix must have nonnegative entries
801
+ sage: c = matrix([[0,1],[1,0]])
802
+ sage: C = InfinityCrystalOfNakajimaMonomials._normalize_c(c, 2)
803
+ Traceback (most recent call last):
804
+ ...
805
+ ValueError: transpose entries do not sum to 1
806
+ """
807
+ if c is None:
808
+ # Default is i < j <=> c_{ij} = 1 (0 otherwise)
809
+ c = [[1 if i < j else 0 for j in range(n)] for i in range(n)]
810
+ MS = MatrixSpace(ZZ, n, n)
811
+ c = MS(c)
812
+ c.set_immutable()
813
+ if any(c[i,i] != 0 for i in range(n)):
814
+ raise ValueError("the c matrix must have 0s on the diagonal")
815
+ if any(c[i,j] + c[j,i] != 1 for i in range(n) for j in range(i)):
816
+ raise ValueError("transpose entries do not sum to 1")
817
+ if any(c[i,j] < 0 or c[j,i] < 0 for i in range(n) for j in range(i)):
818
+ raise ValueError("the c matrix must have nonnegative entries")
819
+ return c
820
+
821
+ @staticmethod
822
+ def __classcall_private__(cls, ct, c=None):
823
+ r"""
824
+ Normalize input to ensure a unique representation.
825
+
826
+ INPUT:
827
+
828
+ - ``ct`` -- a Cartan type
829
+
830
+ EXAMPLES::
831
+
832
+ sage: M = crystals.infinity.NakajimaMonomials("E8")
833
+ sage: M1 = crystals.infinity.NakajimaMonomials(['E',8])
834
+ sage: M2 = crystals.infinity.NakajimaMonomials(CartanType(['E',8]))
835
+ sage: M is M1 is M2
836
+ True
837
+ """
838
+ cartan_type = CartanType(ct)
839
+ n = len(cartan_type.index_set())
840
+ c = InfinityCrystalOfNakajimaMonomials._normalize_c(c, n)
841
+ M = super().__classcall__(cls, cartan_type, c)
842
+ M.set_variables('Y')
843
+ return M
844
+
845
+ def __init__(self, ct, c, category=None):
846
+ r"""
847
+ EXAMPLES::
848
+
849
+ sage: Minf = crystals.infinity.NakajimaMonomials(['A',3])
850
+ sage: TestSuite(Minf).run() # long time
851
+ """
852
+ self._cartan_type = ct
853
+ self._c = c
854
+ self._variable = 'Y'
855
+
856
+ if category is None:
857
+ category = (HighestWeightCrystals(), InfiniteEnumeratedSets())
858
+ Parent.__init__(self, category=category)
859
+ self.module_generators = (self.element_class(self, {}, {}),)
860
+
861
+ def _element_constructor_(self, Y=None, A=None):
862
+ r"""
863
+ Construct an element of ``self`` from ``Y``.
864
+
865
+ INPUT:
866
+
867
+ - ``Y`` -- dictionary whose key is a pair and whose value
868
+ is an integer
869
+ - ``A`` -- dictionary whose key is a pair and whose value
870
+ is an integer
871
+
872
+ EXAMPLES::
873
+
874
+ sage: M = crystals.infinity.NakajimaMonomials(['D',4,1])
875
+ sage: m = M({(1,0):-1,(1,1):-1,(2,0):1})
876
+ sage: m
877
+ Y(1,0)^-1 Y(1,1)^-1 Y(2,0)
878
+
879
+ sage: M = crystals.infinity.NakajimaMonomials(['A',2,1])
880
+ sage: m = M(A={(0,1): -1, (1,1): -2, (2,0): -1, (2,1): -1})
881
+ sage: m._repr_A()
882
+ 'A(0,1)^-1 A(1,1)^-2 A(2,0)^-1 A(2,1)^-1'
883
+ sage: m
884
+ Y(0,2)^2 Y(1,2)^-1 Y(2,0)^-1 Y(2,1) Y(2,2)^-1
885
+ sage: m == M.highest_weight_vector().f_string([2,0,1,2,1])
886
+ True
887
+ """
888
+ if A is None:
889
+ if Y is None:
890
+ return self.module_generators[0]
891
+ # This is a crude way to determine the A, but it works
892
+ hw,path = self.element_class(self, Y, {}).to_highest_weight()
893
+ hw._A = {}
894
+ return hw.f_string(reversed(path))
895
+ elif Y is None or Y == 0:
896
+ # The Y == 0 check is because the parent's __call__ has that
897
+ # as the first default value
898
+ ct = self.cartan_type()
899
+ cm = ct.cartan_matrix()
900
+ I = self.index_set()
901
+ shift = 0
902
+ if ct.is_finite():
903
+ shift = 1
904
+ Y = {}
905
+ for k,v in A.items():
906
+ Y[k] = Y.get(k, 0) + v
907
+ Y[(k[0],k[1]+1)] = Y.get((k[0],k[1]+1), 0) + v
908
+ for j_index,j in enumerate(I):
909
+ if k[0] == j:
910
+ continue
911
+ c = self._c[j_index,k[0]-shift]
912
+ if cm[j_index,k[0]-shift] != 0:
913
+ Y[(j,k[1]+c)] = Y.get((j,k[1]+c), 0) + v*cm[j_index,k[0]-shift]
914
+ for k in list(Y):
915
+ if Y[k] == 0:
916
+ del Y[k]
917
+ return self.element_class(self, Y, A)
918
+
919
+ def _repr_(self):
920
+ r"""
921
+ EXAMPLES::
922
+
923
+ sage: M = crystals.infinity.NakajimaMonomials(['D',4,1])
924
+ sage: m = M({(1,0):-1,(1,1):-1,(2,0):1})
925
+ sage: m
926
+ Y(1,0)^-1 Y(1,1)^-1 Y(2,0)
927
+ """
928
+ return "Infinity Crystal of modified Nakajima monomials of type {}".format(self._cartan_type)
929
+
930
+ def c(self):
931
+ """
932
+ Return the matrix `c_{ij}` of ``self``.
933
+
934
+ EXAMPLES::
935
+
936
+ sage: La = RootSystem(['B',3]).weight_lattice().fundamental_weights()
937
+ sage: M = crystals.NakajimaMonomials(La[1]+La[2])
938
+ sage: M.c()
939
+ [0 1 1]
940
+ [0 0 1]
941
+ [0 0 0]
942
+
943
+ sage: c = Matrix([[0,0,1],[1,0,0],[0,1,0]])
944
+ sage: La = RootSystem(['A',2,1]).weight_lattice(extended=True).fundamental_weights()
945
+ sage: M = crystals.NakajimaMonomials(2*La[1], c=c)
946
+ sage: M.c() == c
947
+ True
948
+ """
949
+ return self._c
950
+
951
+ def cardinality(self):
952
+ r"""
953
+ Return the cardinality of ``self``, which is always `\infty`.
954
+
955
+ EXAMPLES::
956
+
957
+ sage: M = crystals.infinity.NakajimaMonomials(['A',5,2])
958
+ sage: M.cardinality()
959
+ +Infinity
960
+ """
961
+ return Infinity
962
+
963
+ def set_variables(self, letter):
964
+ r"""
965
+ Set the type of monomials to use for the element output.
966
+
967
+ If the `A` variables are used, the output is written as
968
+ `\prod_{i\in I} Y_{i,0}^{\lambda_i} \prod_{i,k} A_{i,k}^{c_{i,k}}`, where
969
+ `\sum_{i \in I} \lambda_i \Lambda_i` is the corresponding
970
+ dominant weight.
971
+
972
+ INPUT:
973
+
974
+ - ``letter`` -- can be one of the following:
975
+
976
+ * ``'Y'`` -- use `Y_{i,k}`, corresponds to fundamental weights
977
+ * ``'A'`` -- use `A_{i,k}`, corresponds to simple roots
978
+
979
+ EXAMPLES::
980
+
981
+ sage: M = crystals.infinity.NakajimaMonomials(['A', 4])
982
+ sage: elt = M.highest_weight_vector().f_string([2,1,3,2,3,2,4,3])
983
+ sage: elt
984
+ Y(1,2) Y(2,0)^-1 Y(2,2)^-1 Y(3,0)^-1 Y(3,2)^-1 Y(4,0)
985
+ sage: M.set_variables('A')
986
+ sage: elt
987
+ A(1,1)^-1 A(2,0)^-1 A(2,1)^-2 A(3,0)^-2 A(3,1)^-1 A(4,0)^-1
988
+ sage: M.set_variables('Y')
989
+
990
+ ::
991
+
992
+ sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights()
993
+ sage: M = crystals.NakajimaMonomials(La[1]+La[2])
994
+ sage: lw = M.lowest_weight_vectors()[0]
995
+ sage: lw
996
+ Y(1,2)^-1 Y(2,1)^-1
997
+ sage: M.set_variables('A')
998
+ sage: lw
999
+ Y(1,0) Y(2,0) A(1,0)^-1 A(1,1)^-1 A(2,0)^-2
1000
+ sage: M.set_variables('Y')
1001
+ """
1002
+ if letter not in ['Y', 'A']:
1003
+ raise ValueError("invalid monomial type")
1004
+ self._variable = letter
1005
+
1006
+ def get_variables(self):
1007
+ """
1008
+ Return the type of monomials to use for the element output.
1009
+
1010
+ EXAMPLES::
1011
+
1012
+ sage: M = crystals.infinity.NakajimaMonomials(['A', 4])
1013
+ sage: M.get_variables()
1014
+ 'Y'
1015
+ """
1016
+ return self._variable
1017
+
1018
+ Element = NakajimaMonomial
1019
+
1020
+
1021
+ class CrystalOfNakajimaMonomialsElement(NakajimaMonomial):
1022
+ r"""
1023
+ Element class for
1024
+ :class:`~sage.combinat.crystals.monomial_crystals.CrystalOfNakajimaMonomials`.
1025
+
1026
+ The `f_i` operators need to be modified from the version in
1027
+ :class:`~sage.combinat.crystals.monomial_crystalsNakajimaMonomial`
1028
+ in order to create irreducible highest weight realizations.
1029
+ This modified `f_i` is defined as
1030
+
1031
+ .. MATH::
1032
+
1033
+ f_iM = \begin{cases} 0 & \text{if } \varphi_i(M) = 0, \\
1034
+ A_{i,k_f}^{-1}M & \text{if } \varphi_i(M) > 0. \end{cases}
1035
+
1036
+ EXAMPLES::
1037
+
1038
+ sage: La = RootSystem(['A',5,2]).weight_lattice(extended=True).fundamental_weights()
1039
+ sage: M = crystals.NakajimaMonomials(['A',5,2],3*La[0])
1040
+ sage: m = M.module_generators[0].f(0); m
1041
+ Y(0,0)^2 Y(0,1)^-1 Y(2,0)
1042
+ sage: TestSuite(m).run()
1043
+ """
1044
+
1045
+ def f(self, i):
1046
+ r"""
1047
+ Return the action of `f_i` on ``self``.
1048
+
1049
+ INPUT:
1050
+
1051
+ - ``i`` -- an element of the index set
1052
+
1053
+ EXAMPLES::
1054
+
1055
+ sage: La = RootSystem(['A',5,2]).weight_lattice(extended=True).fundamental_weights()
1056
+ sage: M = crystals.NakajimaMonomials(['A',5,2],3*La[0])
1057
+ sage: m = M.module_generators[0]
1058
+ sage: [m.f(i) for i in M.index_set()]
1059
+ [Y(0,0)^2 Y(0,1)^-1 Y(2,0), None, None, None]
1060
+
1061
+ ::
1062
+
1063
+ sage: M = crystals.infinity.NakajimaMonomials("E8")
1064
+ sage: M.set_variables('A')
1065
+ sage: m = M.module_generators[0].f_string([4,2,3,8])
1066
+ sage: m
1067
+ A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1
1068
+ sage: [m.f(i) for i in M.index_set()]
1069
+ [A(1,2)^-1 A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
1070
+ A(2,0)^-1 A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
1071
+ A(2,1)^-1 A(3,0)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
1072
+ A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(4,1)^-1 A(8,0)^-1,
1073
+ A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(5,0)^-1 A(8,0)^-1,
1074
+ A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(6,0)^-1 A(8,0)^-1,
1075
+ A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(7,1)^-1 A(8,0)^-1,
1076
+ A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-2]
1077
+ sage: M.set_variables('Y')
1078
+ """
1079
+ if self.phi(i) == 0:
1080
+ return None
1081
+ return super().f(i)
1082
+
1083
+ def weight(self):
1084
+ r"""
1085
+ Return the weight of ``self`` as an element of the weight lattice.
1086
+
1087
+ EXAMPLES::
1088
+
1089
+ sage: La = RootSystem("A2").weight_lattice().fundamental_weights()
1090
+ sage: M = crystals.NakajimaMonomials("A2",La[1]+La[2])
1091
+ sage: M.module_generators[0].weight()
1092
+ (2, 1, 0)
1093
+ """
1094
+ P = self.parent().weight_lattice_realization()
1095
+ return P(self.weight_in_root_lattice()) + P(self.parent().hw)
1096
+
1097
+
1098
+ class CrystalOfNakajimaMonomials(InfinityCrystalOfNakajimaMonomials):
1099
+ r"""
1100
+ Let `\widetilde{\mathcal{M}}` be `\widehat{\mathcal{M}}` as a set, and with
1101
+ crystal structure defined as on `\widehat{\mathcal{M}}` with the exception
1102
+ that
1103
+
1104
+ .. MATH::
1105
+
1106
+ f_iM = \begin{cases} 0 & \text{if } \varphi_i(M) = 0, \\
1107
+ A_{i,k_f}^{-1}M & \text{if } \varphi_i(M) > 0. \end{cases}
1108
+
1109
+ Then Kashiwara [Ka2003]_ showed that the connected component in
1110
+ `\widetilde{\mathcal{M}}` containing a monomial `M` such that `e_iM = 0`,
1111
+ for all `i \in I`, is crystal isomorphic to the irreducible highest weight
1112
+ crystal `B(\mathrm{wt}(M))`.
1113
+
1114
+ INPUT:
1115
+
1116
+ - ``ct`` -- a Cartan type
1117
+
1118
+ - ``La`` -- an element of the weight lattice
1119
+
1120
+ EXAMPLES::
1121
+
1122
+ sage: La = RootSystem("A2").weight_lattice().fundamental_weights()
1123
+ sage: M = crystals.NakajimaMonomials("A2",La[1]+La[2])
1124
+ sage: B = crystals.Tableaux("A2",shape=[2,1])
1125
+ sage: GM = M.digraph()
1126
+ sage: GB = B.digraph()
1127
+ sage: GM.is_isomorphic(GB,edge_labels=True)
1128
+ True
1129
+
1130
+ sage: La = RootSystem("G2").weight_lattice().fundamental_weights()
1131
+ sage: M = crystals.NakajimaMonomials("G2",La[1]+La[2])
1132
+ sage: B = crystals.Tableaux("G2",shape=[2,1])
1133
+ sage: GM = M.digraph()
1134
+ sage: GB = B.digraph()
1135
+ sage: GM.is_isomorphic(GB,edge_labels=True)
1136
+ True
1137
+
1138
+ sage: La = RootSystem("B2").weight_lattice().fundamental_weights()
1139
+ sage: M = crystals.NakajimaMonomials(['B',2],La[1]+La[2])
1140
+ sage: B = crystals.Tableaux("B2",shape=[3/2,1/2])
1141
+ sage: GM = M.digraph()
1142
+ sage: GB = B.digraph()
1143
+ sage: GM.is_isomorphic(GB,edge_labels=True)
1144
+ True
1145
+
1146
+ sage: La = RootSystem(['A',3,1]).weight_lattice(extended=True).fundamental_weights()
1147
+ sage: M = crystals.NakajimaMonomials(['A',3,1],La[0]+La[2])
1148
+ sage: B = crystals.GeneralizedYoungWalls(3,La[0]+La[2])
1149
+ sage: SM = M.subcrystal(max_depth=4)
1150
+ sage: SB = B.subcrystal(max_depth=4)
1151
+ sage: GM = M.digraph(subset=SM) # long time
1152
+ sage: GB = B.digraph(subset=SB) # long time
1153
+ sage: GM.is_isomorphic(GB,edge_labels=True) # long time
1154
+ True
1155
+
1156
+ sage: La = RootSystem(['A',5,2]).weight_lattice(extended=True).fundamental_weights()
1157
+ sage: LA = RootSystem(['A',5,2]).weight_space().fundamental_weights()
1158
+ sage: M = crystals.NakajimaMonomials(['A',5,2],3*La[0])
1159
+ sage: B = crystals.LSPaths(3*LA[0])
1160
+ sage: SM = M.subcrystal(max_depth=4)
1161
+ sage: SB = B.subcrystal(max_depth=4)
1162
+ sage: GM = M.digraph(subset=SM)
1163
+ sage: GB = B.digraph(subset=SB)
1164
+ sage: GM.is_isomorphic(GB,edge_labels=True)
1165
+ True
1166
+
1167
+ sage: c = matrix([[0,1,0],[0,0,1],[1,0,0]])
1168
+ sage: La = RootSystem(['A',2,1]).weight_lattice(extended=True).fundamental_weights()
1169
+ sage: M = crystals.NakajimaMonomials(2*La[1], c=c)
1170
+ sage: sorted(M.subcrystal(max_depth=3), key=str)
1171
+ [Y(0,0) Y(0,1) Y(1,0) Y(2,1)^-1,
1172
+ Y(0,0) Y(0,1)^2 Y(1,1)^-1 Y(2,0) Y(2,1)^-1,
1173
+ Y(0,0) Y(0,2)^-1 Y(1,0) Y(1,1) Y(2,1)^-1 Y(2,2),
1174
+ Y(0,1) Y(0,2)^-1 Y(1,1)^-1 Y(2,0)^2 Y(2,2),
1175
+ Y(0,1) Y(1,0) Y(1,1)^-1 Y(2,0),
1176
+ Y(0,1)^2 Y(1,1)^-2 Y(2,0)^2,
1177
+ Y(0,2)^-1 Y(1,0) Y(2,0) Y(2,2),
1178
+ Y(1,0) Y(1,3) Y(2,0) Y(2,3)^-1,
1179
+ Y(1,0)^2]
1180
+ """
1181
+ @staticmethod
1182
+ def __classcall_private__(cls, cartan_type, La=None, c=None):
1183
+ r"""
1184
+ Normalize input to ensure a unique representation.
1185
+
1186
+ EXAMPLES::
1187
+
1188
+ sage: La = RootSystem(['E',8,1]).weight_lattice(extended=True).fundamental_weights()
1189
+ sage: M = crystals.NakajimaMonomials(['E',8,1],La[0]+La[8])
1190
+ sage: M1 = crystals.NakajimaMonomials(CartanType(['E',8,1]),La[0]+La[8])
1191
+ sage: M2 = crystals.NakajimaMonomials(['E',8,1],M.Lambda()[0] + M.Lambda()[8])
1192
+ sage: M is M1 is M2
1193
+ True
1194
+ """
1195
+ if La is None:
1196
+ La = cartan_type
1197
+ cartan_type = La.parent().cartan_type()
1198
+ cartan_type = CartanType(cartan_type)
1199
+ if cartan_type.is_affine():
1200
+ La = RootSystem(cartan_type).weight_lattice(extended=True)(La)
1201
+ else:
1202
+ La = RootSystem(cartan_type).weight_lattice()(La)
1203
+ n = len(cartan_type.index_set())
1204
+ c = InfinityCrystalOfNakajimaMonomials._normalize_c(c, n)
1205
+ return super().__classcall__(cls, cartan_type, La, c)
1206
+
1207
+ def __init__(self, ct, La, c):
1208
+ r"""
1209
+ EXAMPLES::
1210
+
1211
+ sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights()
1212
+ sage: M = crystals.NakajimaMonomials(['A',2], La[1]+La[2])
1213
+ sage: TestSuite(M).run()
1214
+
1215
+ sage: La = RootSystem(['C',2,1]).weight_lattice(extended=True).fundamental_weights()
1216
+ sage: M = crystals.NakajimaMonomials(['C',2,1], La[0])
1217
+ sage: TestSuite(M).run(max_runs=100)
1218
+ """
1219
+ if ct.is_finite():
1220
+ cat = ClassicalCrystals()
1221
+ else:
1222
+ cat = (RegularCrystals(), HighestWeightCrystals(), InfiniteEnumeratedSets())
1223
+ InfinityCrystalOfNakajimaMonomials.__init__(self, ct, c, cat)
1224
+ self._cartan_type = ct
1225
+ self.hw = La
1226
+ gen = {(i,0): c for i,c in La}
1227
+ self.module_generators = (self.element_class(self, gen, {}),)
1228
+
1229
+ def _repr_(self):
1230
+ r"""
1231
+ Return a string representation of ``self``.
1232
+
1233
+ EXAMPLES::
1234
+
1235
+ sage: La = RootSystem(['C',3,1]).weight_lattice(extended=True).fundamental_weights()
1236
+ sage: M = crystals.NakajimaMonomials(['C',3,1],La[0]+5*La[3])
1237
+ sage: M
1238
+ Highest weight crystal of modified Nakajima monomials of Cartan type ['C', 3, 1] and highest weight Lambda[0] + 5*Lambda[3]
1239
+ """
1240
+ return "Highest weight crystal of modified Nakajima monomials of Cartan type {1!s} and highest weight {0!s}".format(self.hw, self._cartan_type)
1241
+
1242
+ def cardinality(self):
1243
+ r"""
1244
+ Return the cardinality of ``self``.
1245
+
1246
+ EXAMPLES::
1247
+
1248
+ sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights()
1249
+ sage: M = crystals.NakajimaMonomials(['A',2], La[1])
1250
+ sage: M.cardinality()
1251
+ 3
1252
+
1253
+ sage: La = RootSystem(['D',4,2]).weight_lattice(extended=True).fundamental_weights()
1254
+ sage: M = crystals.NakajimaMonomials(['D',4,2], La[1])
1255
+ sage: M.cardinality()
1256
+ +Infinity
1257
+ """
1258
+ if not self.cartan_type().is_finite():
1259
+ return Infinity
1260
+ return super(InfinityCrystalOfNakajimaMonomials, self).cardinality()
1261
+
1262
+ Element = CrystalOfNakajimaMonomialsElement