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,771 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ Bijection classes for type `D_n^{(1)}`
5
+
6
+ Part of the (internal) classes which runs the bijection between rigged
7
+ configurations and KR tableaux of type `D_n^{(1)}`.
8
+
9
+ AUTHORS:
10
+
11
+ - Travis Scrimshaw (2011-04-15): Initial version
12
+
13
+ TESTS::
14
+
15
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
16
+ sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
17
+ sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[3, 2]]))
18
+ sage: TestSuite(bijection).run()
19
+ sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]])
20
+ sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
21
+ sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[]]))
22
+ sage: TestSuite(bijection).run()
23
+ """
24
+
25
+ # ****************************************************************************
26
+ # Copyright (C) 2011, 2012 Travis Scrimshaw <tscrim@ucdavis.edu>
27
+ #
28
+ # Distributed under the terms of the GNU General Public License (GPL)
29
+ #
30
+ # This code is distributed in the hope that it will be useful,
31
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
32
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33
+ # General Public License for more details.
34
+ #
35
+ # The full text of the GPL is available at:
36
+ #
37
+ # https://www.gnu.org/licenses/
38
+ # ****************************************************************************
39
+
40
+ from sage.combinat.rigged_configurations.bij_type_A import KRTToRCBijectionTypeA
41
+ from sage.combinat.rigged_configurations.bij_type_A import RCToKRTBijectionTypeA
42
+
43
+
44
+ class KRTToRCBijectionTypeD(KRTToRCBijectionTypeA):
45
+ r"""
46
+ Specific implementation of the bijection from KR tableaux to rigged
47
+ configurations for type `D_n^{(1)}`.
48
+
49
+ This inherits from type `A_n^{(1)}` because we use the same methods in
50
+ some places.
51
+ """
52
+
53
+ def run(self, verbose=False):
54
+ """
55
+ Run the bijection from a tensor product of KR tableaux to a rigged
56
+ configuration for type `D_n^{(1)}`.
57
+
58
+ INPUT:
59
+
60
+ - ``tp_krt`` -- a tensor product of KR tableaux
61
+
62
+ - ``verbose`` -- (default: ``False``) display each step in the
63
+ bijection
64
+
65
+ EXAMPLES::
66
+
67
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
68
+ sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
69
+ sage: KRTToRCBijectionTypeD(KRT(pathlist=[[-3,2]])).run()
70
+ <BLANKLINE>
71
+ -1[ ]-1
72
+ <BLANKLINE>
73
+ 2[ ]2
74
+ <BLANKLINE>
75
+ -1[ ]-1
76
+ <BLANKLINE>
77
+ -1[ ]-1
78
+ <BLANKLINE>
79
+ """
80
+ if verbose:
81
+ from sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element \
82
+ import TensorProductOfKirillovReshetikhinTableauxElement
83
+
84
+ for cur_crystal in reversed(self.tp_krt):
85
+ r = cur_crystal.parent().r()
86
+ # Iterate through the columns
87
+ for col_number, cur_column in enumerate(reversed(cur_crystal.to_array(False))):
88
+ self.cur_path.insert(0, []) # Prepend an empty list
89
+
90
+ # Check to see if we are a spinor column
91
+ if r >= self.n-1:
92
+ if verbose:
93
+ print("====================")
94
+ print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
95
+ print("--------------------")
96
+ print(repr(self.ret_rig_con))
97
+ print("--------------------\n")
98
+ print("Applying doubling map")
99
+ self.doubling_map()
100
+
101
+ self.cur_dims.insert(0, [0, 1])
102
+
103
+ for letter in reversed(cur_column):
104
+ # This check is needed for the n-1 spin column
105
+ if self.cur_dims[0][0] < r:
106
+ self.cur_dims[0][0] += 1
107
+ val = letter.value # Convert from a CrystalOfLetter to an Integer
108
+
109
+ if verbose:
110
+ print("====================")
111
+ print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
112
+ print("--------------------")
113
+ print(repr(self.ret_rig_con))
114
+ print("--------------------\n")
115
+
116
+ # Build the next state
117
+ self.cur_path[0].insert(0, [letter]) # Prepend the value
118
+ self.next_state(val)
119
+
120
+ # Check to see if we are a spinor column
121
+ if r >= self.n-1:
122
+ if verbose:
123
+ print("====================")
124
+ print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
125
+ print("--------------------")
126
+ print(repr(self.ret_rig_con))
127
+ print("--------------------\n")
128
+ print("Applying halving map")
129
+ self.halving_map()
130
+
131
+ # If we've split off a column, we need to merge the current column
132
+ # to the current crystal tableau
133
+ if col_number > 0:
134
+ for i, letter_singleton in enumerate(self.cur_path[0]):
135
+ self.cur_path[1][i].insert(0, letter_singleton[0])
136
+ self.cur_dims[1][1] += 1
137
+ self.cur_path.pop(0)
138
+ self.cur_dims.pop(0)
139
+
140
+ # And perform the inverse column splitting map on the RC
141
+ for a in range(self.n):
142
+ self._update_vacancy_nums(a)
143
+
144
+ self.ret_rig_con.set_immutable() # Return it to immutable
145
+ return self.ret_rig_con
146
+
147
+ def next_state(self, val):
148
+ r"""
149
+ Build the next state for type `D_n^{(1)}`.
150
+
151
+ TESTS::
152
+
153
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
154
+ sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
155
+ sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[5,3]]))
156
+ sage: bijection.cur_path.insert(0, [])
157
+ sage: bijection.cur_dims.insert(0, [0, 1])
158
+ sage: bijection.cur_path[0].insert(0, [3])
159
+ sage: bijection.next_state(3)
160
+ """
161
+ # Note that type D_n only contains the (absolute) values between 1 and n
162
+ # (unlike type A_n which is 1 to n+1). Thus we only need to subtract 1
163
+ # to match the indices.
164
+ # Also note that we must subtract 1 from n to match the indices as well.
165
+ n = self.n
166
+ tableau_height = len(self.cur_path[0]) - 1
167
+
168
+ # If it is a regular value, we follow the A_n rules
169
+ if val > 0:
170
+ KRTToRCBijectionTypeA.next_state(self, val)
171
+
172
+ # If we are inserting n-1 (which will only update nu[a] for a <=
173
+ # n-1), we need to update the vacancy number of nu[n] as well
174
+ if val == n - 1:
175
+ self._update_vacancy_nums(val)
176
+ if tableau_height >= n - 2:
177
+ self._correct_vacancy_nums()
178
+ return
179
+
180
+ pos_val = -val
181
+
182
+ if pos_val == n:
183
+ # Special case for `\overline{n}` and adding to make height `n`
184
+ # where we only update the vacancy numbers
185
+ # This only occurs with `r = n - 1`
186
+ if self.cur_dims[0][0] == n - 1 and tableau_height == n - 1:
187
+ self._update_vacancy_nums(n-2)
188
+ self._update_vacancy_nums(n-1)
189
+ self._correct_vacancy_nums()
190
+ return
191
+
192
+ if len(self.ret_rig_con[n - 1]) > 0:
193
+ max_width = self.ret_rig_con[n - 1][0] + 1
194
+ else:
195
+ max_width = 1
196
+
197
+ # Update the last one and skip a rigged partition
198
+ max_width = self.ret_rig_con[n - 1].insert_cell(max_width)
199
+
200
+ for a in reversed(range(tableau_height, n - 2)):
201
+ max_width = self.ret_rig_con[a].insert_cell(max_width)
202
+ self._update_vacancy_nums(a + 1)
203
+ self._update_partition_values(a + 1)
204
+
205
+ # Update all other effected remaining values
206
+
207
+ self._update_vacancy_nums(n - 1)
208
+ if tableau_height >= n - 2:
209
+ self._correct_vacancy_nums()
210
+ self._update_partition_values(n - 1)
211
+
212
+ self._update_vacancy_nums(tableau_height)
213
+ self._update_partition_values(tableau_height)
214
+
215
+ if tableau_height > 0:
216
+ self._update_vacancy_nums(tableau_height - 1)
217
+ self._update_partition_values(tableau_height - 1)
218
+
219
+ self._update_vacancy_nums(n - 2)
220
+ return
221
+
222
+ # Always add a cell to the first singular value in the first
223
+ # tableau we are updating.
224
+ if len(self.ret_rig_con[pos_val - 1]) > 0:
225
+ max_width = self.ret_rig_con[pos_val - 1][0] + 1
226
+ else:
227
+ max_width = 1
228
+ # Special case for `\overline{n-1}` to take the larger of the last two
229
+ if pos_val == n - 1 and len(self.ret_rig_con[n - 1]) > 0 and \
230
+ self.ret_rig_con[n - 1][0] + 1 > max_width:
231
+ max_width = self.ret_rig_con[n - 1][0] + 1
232
+
233
+ # Add cells similar to type A_n but we move to the right until we reach
234
+ # the value of n-2
235
+ for a in range(pos_val - 1, n - 2):
236
+ max_width = self.ret_rig_con[a].insert_cell(max_width)
237
+
238
+ # Handle the special behavior near values of n
239
+ if tableau_height <= n - 2:
240
+ max_width2 = self.ret_rig_con[n - 2].insert_cell(max_width)
241
+ max_width = self.ret_rig_con[n - 1].insert_cell(max_width)
242
+ max_width = min(max_width2, max_width)
243
+ elif pos_val <= self.cur_dims[0][0]:
244
+ # Special case when the height will become n
245
+ max_width = self.ret_rig_con[self.cur_dims[0][0] - 1].insert_cell(max_width)
246
+
247
+ # Go back following the regular A_n rules
248
+ if tableau_height <= n - 3:
249
+ max_width = self.ret_rig_con[n - 3].insert_cell(max_width)
250
+
251
+ self._update_vacancy_nums(n - 2)
252
+ self._update_vacancy_nums(n - 1)
253
+ if tableau_height >= n - 2:
254
+ self._correct_vacancy_nums()
255
+ self._update_partition_values(n - 2)
256
+ self._update_partition_values(n - 1)
257
+
258
+ for a in reversed(range(tableau_height, n - 3)):
259
+ max_width = self.ret_rig_con[a].insert_cell(max_width)
260
+ self._update_vacancy_nums(a + 1)
261
+ self._update_partition_values(a + 1)
262
+
263
+ # Update the final rigged partitions
264
+ if tableau_height < n - 2:
265
+ self._update_vacancy_nums(tableau_height)
266
+ self._update_partition_values(tableau_height)
267
+
268
+ if pos_val <= tableau_height:
269
+ for a in range(pos_val - 1, tableau_height):
270
+ self._update_vacancy_nums(a)
271
+ self._update_partition_values(a)
272
+ if pos_val > 1:
273
+ self._update_vacancy_nums(pos_val-2)
274
+ self._update_partition_values(pos_val-2)
275
+ elif 0 < tableau_height:
276
+ self._update_vacancy_nums(tableau_height - 1)
277
+ self._update_partition_values(tableau_height - 1)
278
+ elif pos_val <= n - 1:
279
+ for a in range(pos_val - 1, n - 2):
280
+ self._update_vacancy_nums(a)
281
+ self._update_partition_values(a)
282
+ if pos_val > 1:
283
+ self._update_vacancy_nums(pos_val-2)
284
+ self._update_partition_values(pos_val-2)
285
+
286
+ def _correct_vacancy_nums(self):
287
+ r"""
288
+ Correct the vacancy numbers with special considerations for spinor
289
+ columns.
290
+
291
+ This should only be called when we are going to have a (left-most)
292
+ spinor column of height `n-1` or `n` in type `D^{(1)_n`.
293
+
294
+ This is a correction for the spinor column where we consider the
295
+ weight `\overline{\Lambda_k}` where `k = n-1,n` during the spinor
296
+ bijection. This adds 1 to each of the respective vacancy numbers
297
+ to account for this.
298
+
299
+ TESTS::
300
+
301
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
302
+ sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
303
+ sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]]))
304
+ sage: bijection.doubling_map()
305
+ sage: bijection.cur_path.insert(0, [])
306
+ sage: bijection.cur_dims.insert(0, [0, 1])
307
+ sage: bijection.cur_path[0].insert(0, [2])
308
+ sage: bijection.next_state(2) # indirect doctest
309
+ sage: bijection.ret_rig_con
310
+ <BLANKLINE>
311
+ -2[ ]-2
312
+ <BLANKLINE>
313
+ (/)
314
+ <BLANKLINE>
315
+ (/)
316
+ <BLANKLINE>
317
+ (/)
318
+ <BLANKLINE>
319
+ """
320
+ pos = self.n - 2
321
+ if self.cur_dims[0][0] == len(self.cur_path[0]):
322
+ # The current r value is never greater than the height of the current column
323
+ # Thus if we do not enter into this if block, then r < height and
324
+ # we adjust the (n-1)-th partition.
325
+ pos += 1
326
+
327
+ for i in range(len(self.ret_rig_con[pos]._list)):
328
+ self.ret_rig_con[pos].vacancy_numbers[i] += 1
329
+
330
+ def doubling_map(self):
331
+ r"""
332
+ Perform the doubling map of the rigged configuration at the current
333
+ state of the bijection.
334
+
335
+ This is the map `B(\Lambda) \hookrightarrow B(2 \Lambda)` which
336
+ doubles each of the rigged partitions and updates the vacancy numbers
337
+ accordingly.
338
+
339
+ TESTS::
340
+
341
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[4,1]])
342
+ sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
343
+ sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]]))
344
+ sage: bijection.cur_path.insert(0, [])
345
+ sage: bijection.cur_dims.insert(0, [0, 1])
346
+ sage: bijection.cur_path[0].insert(0, [2])
347
+ sage: bijection.next_state(2)
348
+ sage: bijection.ret_rig_con
349
+ <BLANKLINE>
350
+ -2[ ]-2
351
+ <BLANKLINE>
352
+ (/)
353
+ <BLANKLINE>
354
+ (/)
355
+ <BLANKLINE>
356
+ (/)
357
+ <BLANKLINE>
358
+ sage: bijection.cur_dims
359
+ [[0, 1]]
360
+ sage: bijection.doubling_map()
361
+ sage: bijection.ret_rig_con
362
+ <BLANKLINE>
363
+ -4[ ][ ]-4
364
+ <BLANKLINE>
365
+ (/)
366
+ <BLANKLINE>
367
+ (/)
368
+ <BLANKLINE>
369
+ (/)
370
+ <BLANKLINE>
371
+ sage: bijection.cur_dims
372
+ [[0, 2]]
373
+ """
374
+ for i in range(len(self.cur_dims)):
375
+ self.cur_dims[i][1] *= 2
376
+ for i in range(len(self.ret_rig_con)):
377
+ for j in range(len(self.ret_rig_con[i])):
378
+ self.ret_rig_con[i]._list[j] *= 2
379
+ self.ret_rig_con[i].rigging[j] *= 2
380
+ self.ret_rig_con[i].vacancy_numbers[j] *= 2
381
+
382
+ def halving_map(self):
383
+ r"""
384
+ Perform the halving map of the rigged configuration at the current
385
+ state of the bijection.
386
+
387
+ This is the inverse map to `B(\Lambda) \hookrightarrow B(2 \Lambda)`
388
+ which halves each of the rigged partitions and updates the vacancy
389
+ numbers accordingly.
390
+
391
+ TESTS::
392
+
393
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[4,1]])
394
+ sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
395
+ sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]]))
396
+ sage: bijection.cur_path.insert(0, [])
397
+ sage: bijection.cur_dims.insert(0, [0, 1])
398
+ sage: bijection.cur_path[0].insert(0, [2])
399
+ sage: bijection.next_state(2)
400
+ sage: test = bijection.ret_rig_con
401
+ sage: bijection.doubling_map()
402
+ sage: bijection.halving_map()
403
+ sage: test == bijection.ret_rig_con
404
+ True
405
+ """
406
+ # Skip the first column since it is a spinor
407
+ for i in range(1, len(self.cur_dims)):
408
+ self.cur_dims[i][1] //= 2
409
+ for i in range(len(self.ret_rig_con)):
410
+ for j in range(len(self.ret_rig_con[i])):
411
+ self.ret_rig_con[i]._list[j] //= 2
412
+ self.ret_rig_con[i].rigging[j] //= 2
413
+ self.ret_rig_con[i].vacancy_numbers[j] //= 2
414
+
415
+
416
+ class RCToKRTBijectionTypeD(RCToKRTBijectionTypeA):
417
+ r"""
418
+ Specific implementation of the bijection from rigged configurations to tensor products of KR tableaux for type `D_n^{(1)}`.
419
+ """
420
+
421
+ def run(self, verbose=False, build_graph=False):
422
+ """
423
+ Run the bijection from rigged configurations to tensor product of KR
424
+ tableaux for type `D_n^{(1)}`.
425
+
426
+ INPUT:
427
+
428
+ - ``verbose`` -- boolean (default: ``False``); display each step in the
429
+ bijection
430
+ - ``build_graph`` -- boolean (default: ``False``); build the graph of each
431
+ step of the bijection
432
+
433
+ EXAMPLES::
434
+
435
+ sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]])
436
+ sage: x = RC(partition_list=[[1],[1],[1],[1]])
437
+ sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
438
+ sage: RCToKRTBijectionTypeD(x).run()
439
+ [[2], [-3]]
440
+ sage: bij = RCToKRTBijectionTypeD(x)
441
+ sage: bij.run(build_graph=True)
442
+ [[2], [-3]]
443
+ sage: bij._graph
444
+ Digraph on 3 vertices
445
+ """
446
+ from sage.combinat.crystals.letters import CrystalOfLetters
447
+ letters = CrystalOfLetters(self.rigged_con.parent()._cartan_type.classical())
448
+
449
+ # This is technically bad, but because the first thing we do is append
450
+ # an empty list to ret_crystal_path, we correct this. We do it this
451
+ # way so that we do not have to remove an empty list after the
452
+ # bijection has been performed.
453
+ ret_crystal_path = []
454
+
455
+ for dim in self.rigged_con.parent().dims:
456
+ ret_crystal_path.append([])
457
+
458
+ # Iterate over each column
459
+ for dummy_var in range(dim[1]):
460
+ # Split off a new column if necessary
461
+ if self.cur_dims[0][1] > 1:
462
+ self.cur_dims[0][1] -= 1
463
+ self.cur_dims.insert(0, [dim[0], 1])
464
+
465
+ # Perform the corresponding splitting map on rigged configurations
466
+ # All it does is update the vacancy numbers on the RC side
467
+ for a in range(self.n):
468
+ self._update_vacancy_numbers(a)
469
+
470
+ if build_graph:
471
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
472
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), 'ls'])
473
+
474
+ # Check to see if we are a spinor
475
+ if dim[0] >= self.n - 1:
476
+ if verbose:
477
+ print("====================")
478
+ print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
479
+ print("--------------------")
480
+ print(ret_crystal_path)
481
+ print("--------------------\n")
482
+ print("Applying doubling map")
483
+ self.doubling_map()
484
+
485
+ if build_graph:
486
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
487
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), '2x'])
488
+
489
+ if dim[0] == self.n - 1:
490
+ if verbose:
491
+ print("====================")
492
+ print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
493
+ print("--------------------")
494
+ print(ret_crystal_path)
495
+ print("--------------------\n")
496
+ b = self.next_state(self.n)
497
+ if b == self.n:
498
+ b = -self.n
499
+ ret_crystal_path[-1].append(letters(b)) # Append the rank
500
+
501
+ if build_graph:
502
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
503
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
504
+
505
+ while self.cur_dims[0][0] > 0:
506
+ if verbose:
507
+ print("====================")
508
+ print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
509
+ print("--------------------")
510
+ print(ret_crystal_path)
511
+ print("--------------------\n")
512
+
513
+ self.cur_dims[0][0] -= 1 # This takes care of the indexing
514
+ b = self.next_state(self.cur_dims[0][0])
515
+
516
+ # Corrections for spinor
517
+ if dim[0] == self.n and b == -self.n \
518
+ and self.cur_dims[0][0] == self.n - 1:
519
+ b = -(self.n-1)
520
+
521
+ # Make sure we have a crystal letter
522
+ ret_crystal_path[-1].append(letters(b)) # Append the rank
523
+
524
+ if build_graph:
525
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
526
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
527
+
528
+ self.cur_dims.pop(0) # Pop off the leading column
529
+
530
+ # Check to see if we were a spinor
531
+ if dim[0] >= self.n-1:
532
+ if verbose:
533
+ print("====================")
534
+ print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
535
+ print("--------------------")
536
+ print(ret_crystal_path)
537
+ print("--------------------\n")
538
+ print("Applying halving map")
539
+ self.halving_map()
540
+
541
+ if build_graph:
542
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
543
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), '1/2x'])
544
+
545
+ if build_graph:
546
+ self._graph.pop(0) # Remove the dummy at the start
547
+ from sage.graphs.digraph import DiGraph
548
+ from sage.graphs.dot2tex_utils import have_dot2tex
549
+ self._graph = DiGraph(self._graph, format='list_of_edges')
550
+ if have_dot2tex():
551
+ self._graph.set_latex_options(format='dot2tex', edge_labels=True)
552
+
553
+ return self.KRT(pathlist=ret_crystal_path)
554
+
555
+ def next_state(self, height):
556
+ r"""
557
+ Build the next state for type `D_n^{(1)}`.
558
+
559
+ TESTS::
560
+
561
+ sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]])
562
+ sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
563
+ sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[1,1],[1],[1]]))
564
+ sage: bijection.next_state(0)
565
+ 1
566
+ """
567
+ n = self.n
568
+ ell = [None] * (2 * n - 2) # No `\bar{\ell}^{n-1}` and `\bar{\ell}^n`
569
+ b = None
570
+
571
+ # Calculate the rank and ell values
572
+
573
+ last_size = 0
574
+ for a in range(height, n - 2):
575
+ ell[a] = self._find_singular_string(self.cur_partitions[a], last_size)
576
+
577
+ if ell[a] is None:
578
+ b = a + 1
579
+ break
580
+ else:
581
+ last_size = self.cur_partitions[a][ell[a]]
582
+
583
+ if height == n:
584
+ # Special case from height `n` spinor with `r = n-1`
585
+ ell[n - 2] = self._find_singular_string(self.cur_partitions[n - 2], last_size)
586
+ if ell[n - 2] is not None:
587
+ last_size = self.cur_partitions[n - 2][ell[n - 2]]
588
+ else:
589
+ b = -n
590
+ elif height == n - 1:
591
+ # Special case for height `n-1` spinor
592
+ ell[n - 1] = self._find_singular_string(self.cur_partitions[n - 1], last_size)
593
+ if ell[n - 1] is not None:
594
+ last_size = self.cur_partitions[n - 1][ell[n - 1]]
595
+ else:
596
+ b = n
597
+ elif b is None:
598
+ # Do the special cases when we've reached n - 2
599
+ ell[n - 2] = self._find_singular_string(self.cur_partitions[n - 2], last_size)
600
+ ell[n - 1] = self._find_singular_string(self.cur_partitions[n - 1], last_size)
601
+
602
+ if ell[n - 2] is not None:
603
+ temp_size = self.cur_partitions[n - 2][ell[n - 2]]
604
+ if ell[n - 1] is not None:
605
+ last_size = self.cur_partitions[n - 1][ell[n - 1]]
606
+ last_size = max(temp_size, last_size)
607
+ else:
608
+ b = n
609
+ else:
610
+ if ell[n - 1] is not None:
611
+ b = -n
612
+ else:
613
+ b = n - 1
614
+
615
+ if b is None:
616
+ # Now go back
617
+ for a in reversed(range(n - 2)):
618
+ # Modified form of _find_singular_string
619
+ end = ell[a]
620
+ if a < height:
621
+ end = len(self.cur_partitions[a])
622
+ for i in reversed(range(end)):
623
+ if self.cur_partitions[a][i] >= last_size and \
624
+ self.cur_partitions[a].vacancy_numbers[i] == self.cur_partitions[a].rigging[i]:
625
+ ell[n + a] = i
626
+ break
627
+
628
+ if ell[n + a] is None:
629
+ b = -(a + 2)
630
+ break
631
+ else:
632
+ last_size = self.cur_partitions[a][ell[n + a]]
633
+
634
+ if b is None:
635
+ b = -1
636
+
637
+ # Determine the new rigged configuration by removing a box from the selected
638
+ # string and then making the new string singular
639
+ ret_row = self.cur_partitions[0].remove_cell(ell[0])
640
+ ret_row_bar = self.cur_partitions[0].remove_cell(ell[n])
641
+ for a in range(1, n - 2):
642
+ ret_row_next = self.cur_partitions[a].remove_cell(ell[a])
643
+ ret_row_bar_next = self.cur_partitions[a].remove_cell(ell[n + a])
644
+
645
+ self._update_vacancy_numbers(a - 1)
646
+ if ret_row is not None:
647
+ self.cur_partitions[a - 1].rigging[ret_row] = \
648
+ self.cur_partitions[a - 1].vacancy_numbers[ret_row]
649
+ if ret_row_bar is not None:
650
+ self.cur_partitions[a - 1].rigging[ret_row_bar] = \
651
+ self.cur_partitions[a - 1].vacancy_numbers[ret_row_bar]
652
+
653
+ ret_row = ret_row_next
654
+ ret_row_bar = ret_row_bar_next
655
+
656
+ # Special behavior for all a > n-3
657
+ ret_row_next = self.cur_partitions[n - 2].remove_cell(ell[n - 2])
658
+ ret_row_bar_next = self.cur_partitions[n - 1].remove_cell(ell[n - 1])
659
+
660
+ self._update_vacancy_numbers(n - 3)
661
+ if ret_row is not None:
662
+ self.cur_partitions[n - 3].rigging[ret_row] = \
663
+ self.cur_partitions[n - 3].vacancy_numbers[ret_row]
664
+ if ret_row_bar is not None:
665
+ self.cur_partitions[n - 3].rigging[ret_row_bar] = \
666
+ self.cur_partitions[n - 3].vacancy_numbers[ret_row_bar]
667
+
668
+ self._update_vacancy_numbers(n - 2)
669
+ if ret_row_next is not None:
670
+ self.cur_partitions[n - 2].rigging[ret_row_next] = \
671
+ self.cur_partitions[n - 2].vacancy_numbers[ret_row_next]
672
+
673
+ self._update_vacancy_numbers(n - 1)
674
+ if height >= n - 1:
675
+ self._correct_vacancy_nums()
676
+ if ret_row_bar_next is not None:
677
+ self.cur_partitions[n - 1].rigging[ret_row_bar_next] = \
678
+ self.cur_partitions[n - 1].vacancy_numbers[ret_row_bar_next]
679
+
680
+ return b
681
+
682
+ def doubling_map(self):
683
+ r"""
684
+ Perform the doubling map of the rigged configuration at the current
685
+ state of the bijection.
686
+
687
+ This is the map `B(\Lambda) \hookrightarrow B(2 \Lambda)` which
688
+ doubles each of the rigged partitions and updates the vacancy numbers
689
+ accordingly.
690
+
691
+ TESTS::
692
+
693
+ sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]])
694
+ sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
695
+ sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]]))
696
+ sage: bijection.cur_partitions
697
+ [(/)
698
+ , (/)
699
+ , (/)
700
+ , -1[ ]-1
701
+ ]
702
+ sage: bijection.doubling_map()
703
+ sage: bijection.cur_partitions
704
+ [(/)
705
+ , (/)
706
+ , (/)
707
+ , -2[ ][ ]-2
708
+ ]
709
+ """
710
+ # Skip the first column since it is a spinor
711
+ for i in range(1, len(self.cur_dims)):
712
+ self.cur_dims[i][1] *= 2
713
+ for partition in self.cur_partitions:
714
+ for j in range(len(partition)):
715
+ partition._list[j] *= 2
716
+ partition.rigging[j] *= 2
717
+ partition.vacancy_numbers[j] *= 2
718
+
719
+ def halving_map(self):
720
+ r"""
721
+ Perform the halving map of the rigged configuration at the current
722
+ state of the bijection.
723
+
724
+ This is the inverse map to `B(\Lambda) \hookrightarrow B(2 \Lambda)`
725
+ which halves each of the rigged partitions and updates the vacancy
726
+ numbers accordingly.
727
+
728
+ TESTS::
729
+
730
+ sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]])
731
+ sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
732
+ sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]]))
733
+ sage: test = bijection.cur_partitions
734
+ sage: bijection.doubling_map()
735
+ sage: bijection.halving_map()
736
+ sage: test == bijection.cur_partitions
737
+ True
738
+ """
739
+ for i in range(len(self.cur_dims)):
740
+ self.cur_dims[i][1] //= 2
741
+ for partition in self.cur_partitions:
742
+ for j in range(len(partition)):
743
+ partition._list[j] //= 2
744
+ partition.rigging[j] //= 2
745
+ partition.vacancy_numbers[j] //= 2
746
+
747
+ def _correct_vacancy_nums(self):
748
+ r"""
749
+ Correct the vacancy numbers with special considerations for spinor
750
+ columns.
751
+
752
+ This should only be called when we are going to have a (left-most)
753
+ spinor column of height `n-1` or `n`.
754
+
755
+ This is a correction for the spinor column where we consider the
756
+ weight `\overline{\Lambda_k}` where `k = n-1,n` during the spinor
757
+ bijection. This adds 1 to each of the respective vacancy numbers
758
+ to account for this.
759
+
760
+ TESTS::
761
+
762
+ sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]])
763
+ sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
764
+ sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]]))
765
+ sage: bijection.doubling_map()
766
+ sage: bijection.next_state(4) # indirect doctest
767
+ -4
768
+ """
769
+ n = self.n
770
+ for i in range(len(self.cur_partitions[n-1]._list)):
771
+ self.cur_partitions[n-1].vacancy_numbers[i] += 1