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,576 @@
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}^{(2)}`
5
+
6
+ Part of the (internal) classes which runs the bijection between rigged
7
+ configurations and KR tableaux of type `D_{n+1}^{(2)}`.
8
+
9
+ AUTHORS:
10
+
11
+ - Travis Scrimshaw (2011-04-15): Initial version
12
+
13
+ TESTS::
14
+
15
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 2], [[2,1]])
16
+ sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import KRTToRCBijectionTypeDTwisted
17
+ sage: bijection = KRTToRCBijectionTypeDTwisted(KRT(pathlist=[[-1,2]]))
18
+ sage: TestSuite(bijection).run()
19
+ sage: RC = RiggedConfigurations(['D', 4, 2], [[2, 1]])
20
+ sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import RCToKRTBijectionTypeDTwisted
21
+ sage: bijection = RCToKRTBijectionTypeDTwisted(RC())
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_A2_even import KRTToRCBijectionTypeA2Even
42
+ from sage.combinat.rigged_configurations.bij_type_A2_even import RCToKRTBijectionTypeA2Even
43
+ from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
44
+ from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
45
+
46
+
47
+ class KRTToRCBijectionTypeDTwisted(KRTToRCBijectionTypeD, KRTToRCBijectionTypeA2Even):
48
+ r"""
49
+ Specific implementation of the bijection from KR tableaux to rigged
50
+ configurations for type `D_{n+1}^{(2)}`.
51
+
52
+ This inherits from type `C_n^{(1)}` and `D_n^{(1)}` because we use the
53
+ same methods in some places.
54
+ """
55
+
56
+ def run(self, verbose=False):
57
+ """
58
+ Run the bijection from a tensor product of KR tableaux to a rigged
59
+ configuration for type `D_{n+1}^{(2)}`.
60
+
61
+ INPUT:
62
+
63
+ - ``tp_krt`` -- a tensor product of KR tableaux
64
+
65
+ - ``verbose`` -- (default: ``False``) display each step in the
66
+ bijection
67
+
68
+ EXAMPLES::
69
+
70
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 2], [[3,1]])
71
+ sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import KRTToRCBijectionTypeDTwisted
72
+ sage: KRTToRCBijectionTypeDTwisted(KRT(pathlist=[[-1,3,2]])).run()
73
+ <BLANKLINE>
74
+ -1[ ]-1
75
+ <BLANKLINE>
76
+ 0[ ]0
77
+ <BLANKLINE>
78
+ 1[ ]1
79
+ <BLANKLINE>
80
+ """
81
+ if verbose:
82
+ from sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element \
83
+ import TensorProductOfKirillovReshetikhinTableauxElement
84
+
85
+ for cur_crystal in reversed(self.tp_krt):
86
+ r = cur_crystal.parent().r()
87
+ # Iterate through the columns
88
+ for col_number, cur_column in enumerate(reversed(cur_crystal.to_array(False))):
89
+ self.cur_path.insert(0, []) # Prepend an empty list
90
+
91
+ # Check to see if we are a spinor column
92
+ if r == self.n:
93
+ if verbose:
94
+ print("====================")
95
+ print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
96
+ print("--------------------")
97
+ print(repr(self.ret_rig_con))
98
+ print("--------------------\n")
99
+ print("Applying doubling map")
100
+ self.doubling_map()
101
+
102
+ self.cur_dims.insert(0, [0, 1])
103
+
104
+ for letter in reversed(cur_column):
105
+ self.cur_dims[0][0] += 1
106
+ val = letter.value # Convert from a CrystalOfLetter to an Integer
107
+
108
+ if verbose:
109
+ print("====================")
110
+ print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
111
+ print("--------------------")
112
+ print(repr(self.ret_rig_con))
113
+ print("--------------------\n")
114
+
115
+ # Build the next state
116
+ self.cur_path[0].insert(0, [letter]) # Prepend the value
117
+ self.next_state(val)
118
+
119
+ # Check to see if we are a spinor column
120
+ if r == self.n:
121
+ if verbose:
122
+ print("====================")
123
+ print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
124
+ print("--------------------")
125
+ print(repr(self.ret_rig_con))
126
+ print("--------------------\n")
127
+ print("Applying halving map")
128
+ self.halving_map()
129
+
130
+ # If we've split off a column, we need to merge the current column
131
+ # to the current crystal tableau
132
+ if col_number > 0:
133
+ for i, letter_singleton in enumerate(self.cur_path[0]):
134
+ self.cur_path[1][i].insert(0, letter_singleton[0])
135
+ self.cur_dims[1][1] += 1
136
+ self.cur_path.pop(0)
137
+ self.cur_dims.pop(0)
138
+
139
+ # And perform the inverse column splitting map on the RC
140
+ for a in range(self.n):
141
+ self._update_vacancy_nums(a)
142
+
143
+ self.ret_rig_con.set_immutable() # Return it to immutable
144
+ return self.ret_rig_con
145
+
146
+ def next_state(self, val):
147
+ r"""
148
+ Build the next state for type `D_{n+1}^{(2)}`.
149
+
150
+ TESTS::
151
+
152
+ sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 2], [[2,1]])
153
+ sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import KRTToRCBijectionTypeDTwisted
154
+ sage: bijection = KRTToRCBijectionTypeDTwisted(KRT(pathlist=[[-1,2]]))
155
+ sage: bijection.cur_path.insert(0, [])
156
+ sage: bijection.cur_dims.insert(0, [0, 1])
157
+ sage: bijection.cur_path[0].insert(0, [2])
158
+ sage: bijection.next_state(2)
159
+ """
160
+ n = self.n
161
+ tableau_height = len(self.cur_path[0]) - 1
162
+
163
+ if val == 'E':
164
+ KRTToRCBijectionTypeA2Even.next_state(self, val)
165
+ return
166
+ elif val > 0:
167
+ # If it is a regular value, we follow the A_n rules
168
+ KRTToRCBijectionTypeA.next_state(self, val)
169
+ if tableau_height >= n - 1:
170
+ self._correct_vacancy_nums()
171
+ return
172
+
173
+ pos_val = -val
174
+
175
+ if pos_val == 0:
176
+ if len(self.ret_rig_con[pos_val - 1]) > 0:
177
+ max_width = self.ret_rig_con[n-1][0]
178
+ else:
179
+ max_width = 1
180
+ max_width = self.ret_rig_con[n-1].insert_cell(max_width)
181
+ width_n = max_width + 1
182
+
183
+ # Follow regular A_n rules
184
+ for a in reversed(range(tableau_height, n-1)):
185
+ max_width = self.ret_rig_con[a].insert_cell(max_width)
186
+ self._update_vacancy_nums(a + 1)
187
+ self._update_partition_values(a + 1)
188
+ self._update_vacancy_nums(tableau_height)
189
+ if tableau_height >= n - 1:
190
+ self._correct_vacancy_nums()
191
+ self._update_partition_values(tableau_height)
192
+ if tableau_height > 0:
193
+ self._update_vacancy_nums(tableau_height-1)
194
+ self._update_partition_values(tableau_height-1)
195
+
196
+ # Make the new string at n quasi-singular
197
+ p = self.ret_rig_con[n-1]
198
+ num_rows = len(p)
199
+ for i in range(num_rows):
200
+ if p._list[i] == width_n:
201
+ j = i+1
202
+ while j < num_rows and p._list[j] == width_n \
203
+ and p.vacancy_numbers[j] == p.rigging[j]:
204
+ j += 1
205
+ p.rigging[j-1] -= 1
206
+ break
207
+ return
208
+
209
+ case_S = [None] * n
210
+ pos_val = -val
211
+
212
+ # Always add a cell to the first singular value in the first
213
+ # tableau we are updating.
214
+ if len(self.ret_rig_con[pos_val - 1]) > 0:
215
+ max_width = self.ret_rig_con[pos_val - 1][0]
216
+ else:
217
+ max_width = 1
218
+
219
+ # Add cells similar to type A_n but we move to the right until we
220
+ # reach the value of n-1
221
+ for a in range(pos_val - 1, n-1):
222
+ max_width = self.ret_rig_con[a].insert_cell(max_width)
223
+ case_S[a] = max_width
224
+
225
+ # Special case for n
226
+ # If we find a quasi-singular string first, then we are in case (Q, S)
227
+ # otherwise we will find a singular string and insert 2 cells
228
+ partition = self.ret_rig_con[n-1]
229
+ num_rows = len(partition)
230
+ case_QS = False
231
+ for i in range(num_rows + 1):
232
+ if i == num_rows:
233
+ max_width = 0
234
+ if case_QS:
235
+ partition._list.append(1)
236
+ partition.vacancy_numbers.append(None)
237
+ # Go through our partition until we find a length of greater than 1
238
+ j = len(partition._list) - 1
239
+ while j >= 0 and partition._list[j] == 1:
240
+ j -= 1
241
+ partition.rigging.insert(j + 1, None)
242
+ width_n = 1
243
+ else:
244
+ # Go through our partition until we find a length of greater than 2
245
+ j = len(partition._list) - 1
246
+ while j >= 0 and partition._list[j] <= 2:
247
+ j -= 1
248
+ partition._list.insert(j+1, 2)
249
+ partition.vacancy_numbers.insert(j+1, None)
250
+ partition.rigging.insert(j+1, None)
251
+ break
252
+ elif partition._list[i] <= max_width:
253
+ if partition.vacancy_numbers[i] == partition.rigging[i]:
254
+ max_width = partition._list[i]
255
+ if case_QS:
256
+ partition._list[i] += 1
257
+ width_n = partition._list[i]
258
+ partition.rigging[i] = None
259
+ else:
260
+ j = i - 1
261
+ while j >= 0 and partition._list[j] <= max_width + 2:
262
+ partition.rigging[j+1] = partition.rigging[j] # Shuffle it along
263
+ j -= 1
264
+ partition._list.pop(i)
265
+ partition._list.insert(j+1, max_width + 2)
266
+ partition.rigging[j+1] = None
267
+ break
268
+ elif partition.vacancy_numbers[i] - 1 == partition.rigging[i] and not case_QS:
269
+ case_QS = True
270
+ partition._list[i] += 1
271
+ partition.rigging[i] = None
272
+ # No need to set max_width here since we will find a singular string
273
+
274
+ # Now go back following the regular C_n (ish) rules
275
+ for a in reversed(range(tableau_height, n-1)):
276
+ if case_S[a] == max_width:
277
+ self._insert_cell_case_S(self.ret_rig_con[a])
278
+ else:
279
+ max_width = self.ret_rig_con[a].insert_cell(max_width)
280
+ self._update_vacancy_nums(a + 1)
281
+ self._update_partition_values(a + 1)
282
+
283
+ # Update the final rigged partitions
284
+ self._update_vacancy_nums(tableau_height)
285
+ if tableau_height >= n - 1:
286
+ self._correct_vacancy_nums()
287
+ self._update_partition_values(tableau_height)
288
+
289
+ if pos_val <= tableau_height:
290
+ for a in range(pos_val-1, tableau_height):
291
+ self._update_vacancy_nums(a)
292
+ self._update_partition_values(a)
293
+ if pos_val > 1:
294
+ self._update_vacancy_nums(pos_val - 2)
295
+ self._update_partition_values(pos_val - 2)
296
+ elif tableau_height > 0:
297
+ self._update_vacancy_nums(tableau_height - 1)
298
+ self._update_partition_values(tableau_height - 1)
299
+
300
+ if case_QS:
301
+ # Make the new string quasi-singular
302
+ num_rows = len(partition)
303
+ for i in range(num_rows):
304
+ if partition._list[i] == width_n:
305
+ j = i+1
306
+ while j < num_rows and partition._list[j] == width_n \
307
+ and partition.vacancy_numbers[j] == partition.rigging[j]:
308
+ j += 1
309
+ partition.rigging[j-1] -= 1
310
+ break
311
+
312
+
313
+ class RCToKRTBijectionTypeDTwisted(RCToKRTBijectionTypeD, RCToKRTBijectionTypeA2Even):
314
+ r"""
315
+ Specific implementation of the bijection from rigged configurations to
316
+ tensor products of KR tableaux for type `D_{n+1}^{(2)}`.
317
+ """
318
+
319
+ def run(self, verbose=False, build_graph=False):
320
+ """
321
+ Run the bijection from rigged configurations to tensor product of KR
322
+ tableaux for type `D_{n+1}^{(2)}`.
323
+
324
+ INPUT:
325
+
326
+ - ``verbose`` -- boolean (default: ``False``); display each step in the
327
+ bijection
328
+ - ``build_graph`` -- boolean (default: ``False``); build the graph of each
329
+ step of the bijection
330
+
331
+ EXAMPLES::
332
+
333
+ sage: RC = RiggedConfigurations(['D', 4, 2], [[3, 1]])
334
+ sage: x = RC(partition_list=[[],[1],[1]])
335
+ sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import RCToKRTBijectionTypeDTwisted
336
+ sage: RCToKRTBijectionTypeDTwisted(x).run()
337
+ [[1], [3], [-2]]
338
+ sage: bij = RCToKRTBijectionTypeDTwisted(x)
339
+ sage: bij.run(build_graph=True)
340
+ [[1], [3], [-2]]
341
+ sage: bij._graph
342
+ Digraph on 6 vertices
343
+ """
344
+ from sage.combinat.crystals.letters import CrystalOfLetters
345
+ letters = CrystalOfLetters(self.rigged_con.parent()._cartan_type.classical())
346
+
347
+ # This is technically bad, but because the first thing we do is append
348
+ # an empty list to ret_crystal_path, we correct this. We do it this
349
+ # way so that we do not have to remove an empty list after the
350
+ # bijection has been performed.
351
+ ret_crystal_path = []
352
+
353
+ for dim in self.rigged_con.parent().dims:
354
+ ret_crystal_path.append([])
355
+
356
+ # Iterate over each column
357
+ for dummy_var in range(dim[1]):
358
+ # Split off a new column if necessary
359
+ if self.cur_dims[0][1] > 1:
360
+ self.cur_dims[0][1] -= 1
361
+ self.cur_dims.insert(0, [dim[0], 1])
362
+
363
+ # Perform the corresponding splitting map on rigged configurations
364
+ # All it does is update the vacancy numbers on the RC side
365
+ for a in range(self.n):
366
+ self._update_vacancy_numbers(a)
367
+
368
+ if build_graph:
369
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
370
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), 'ls'])
371
+
372
+ # Check to see if we are a spinor
373
+ if dim[0] == self.n:
374
+ if verbose:
375
+ print("====================")
376
+ print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
377
+ print("--------------------")
378
+ print(ret_crystal_path)
379
+ print("--------------------\n")
380
+ print("Applying doubling map")
381
+ self.doubling_map()
382
+
383
+ if build_graph:
384
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
385
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), '2x'])
386
+
387
+ while self.cur_dims[0][0] > 0:
388
+ if verbose:
389
+ print("====================")
390
+ print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
391
+ print("--------------------")
392
+ print(ret_crystal_path)
393
+ print("--------------------\n")
394
+
395
+ self.cur_dims[0][0] -= 1 # This takes care of the indexing
396
+ b = self.next_state(self.cur_dims[0][0])
397
+
398
+ # Make sure we have a crystal letter
399
+ ret_crystal_path[-1].append(letters(b)) # Append the rank
400
+
401
+ if build_graph:
402
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
403
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
404
+
405
+ self.cur_dims.pop(0) # Pop off the leading column
406
+
407
+ # Check to see if we were a spinor
408
+ if dim[0] == self.n:
409
+ if verbose:
410
+ print("====================")
411
+ print(repr(self.rigged_con.parent()(*self.cur_partitions)))
412
+ print("--------------------")
413
+ print(ret_crystal_path)
414
+ print("--------------------\n")
415
+ print("Applying halving map")
416
+ self.halving_map()
417
+
418
+ if build_graph:
419
+ y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
420
+ self._graph.append([self._graph[-1][1], (y, len(self._graph)), '1/2x'])
421
+
422
+ if build_graph:
423
+ self._graph.pop(0) # Remove the dummy at the start
424
+ from sage.graphs.digraph import DiGraph
425
+ from sage.graphs.dot2tex_utils import have_dot2tex
426
+ self._graph = DiGraph(self._graph)
427
+ if have_dot2tex():
428
+ self._graph.set_latex_options(format='dot2tex', edge_labels=True)
429
+
430
+ return self.KRT(pathlist=ret_crystal_path)
431
+
432
+ def next_state(self, height):
433
+ r"""
434
+ Build the next state for type `D_{n+1}^{(2)}`.
435
+
436
+ TESTS::
437
+
438
+ sage: RC = RiggedConfigurations(['D', 4, 2], [[2, 1]])
439
+ sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import RCToKRTBijectionTypeDTwisted
440
+ sage: bijection = RCToKRTBijectionTypeDTwisted(RC(partition_list=[[2],[2,2],[2,2]]))
441
+ sage: bijection.next_state(0)
442
+ -1
443
+ """
444
+ n = self.n
445
+ ell = [None] * (2*n)
446
+ case_S = [False] * n
447
+ case_Q = False
448
+ b = None
449
+
450
+ # Calculate the rank and ell values
451
+
452
+ last_size = 0
453
+ for a in range(height, n-1):
454
+ ell[a] = self._find_singular_string(self.cur_partitions[a], last_size)
455
+
456
+ if ell[a] is None:
457
+ b = a + 1
458
+ break
459
+ else:
460
+ last_size = self.cur_partitions[a][ell[a]]
461
+
462
+ if b is None:
463
+ partition = self.cur_partitions[n-1]
464
+ # Modified version of _find_singular_string()
465
+ for i in reversed(range(len(partition))):
466
+ if partition[i] >= last_size:
467
+ if partition.vacancy_numbers[i] == partition.rigging[i]:
468
+ if partition[i] == 1:
469
+ b = 'E'
470
+ else:
471
+ last_size = partition[i]
472
+ case_S[n-1] = True
473
+ ell[2*n-1] = i
474
+ break
475
+ elif partition.vacancy_numbers[i] - 1 == partition.rigging[i] and not case_Q:
476
+ case_Q = True
477
+ # Check if it is singular as well
478
+ block_size = partition[i]
479
+ for j in reversed(range(i)):
480
+ if partition[j] != block_size:
481
+ break
482
+ elif partition.vacancy_numbers[j] == partition.rigging[j]:
483
+ case_Q = False
484
+ break
485
+ if case_Q:
486
+ last_size = partition[i] + 1
487
+ ell[n-1] = i
488
+
489
+ if ell[2*n-1] is None:
490
+ if not case_Q:
491
+ b = n
492
+ else:
493
+ b = 0
494
+
495
+ if b is None:
496
+ # Now go back
497
+ for a in reversed(range(n-1)):
498
+ if a >= height and self.cur_partitions[a][ell[a]] == last_size:
499
+ ell[n+a] = ell[a]
500
+ case_S[a] = True
501
+ else:
502
+ ell[n+a] = self._find_singular_string(self.cur_partitions[a], last_size)
503
+
504
+ if ell[n + a] is None:
505
+ b = -(a + 2)
506
+ break
507
+ else:
508
+ last_size = self.cur_partitions[a][ell[n + a]]
509
+
510
+ if b is None:
511
+ b = -1
512
+
513
+ # Determine the new rigged configuration by removing boxes from the
514
+ # selected string and then making the new string singular
515
+ if case_S[0]:
516
+ row_num = None
517
+ row_num_bar = self.cur_partitions[0].remove_cell(ell[n], 2)
518
+ else:
519
+ row_num = self.cur_partitions[0].remove_cell(ell[0])
520
+ row_num_bar = self.cur_partitions[0].remove_cell(ell[n])
521
+ for a in range(1, n-1):
522
+ if case_S[a]:
523
+ row_num_next = None
524
+ row_num_bar_next = self.cur_partitions[a].remove_cell(ell[n+a], 2)
525
+ else:
526
+ row_num_next = self.cur_partitions[a].remove_cell(ell[a])
527
+ row_num_bar_next = self.cur_partitions[a].remove_cell(ell[n+a])
528
+
529
+ self._update_vacancy_numbers(a - 1)
530
+ if row_num is not None:
531
+ self.cur_partitions[a-1].rigging[row_num] = self.cur_partitions[a-1].vacancy_numbers[row_num]
532
+ if row_num_bar is not None:
533
+ self.cur_partitions[a-1].rigging[row_num_bar] = self.cur_partitions[a-1].vacancy_numbers[row_num_bar]
534
+ row_num = row_num_next
535
+ row_num_bar = row_num_bar_next
536
+
537
+ if case_Q:
538
+ row_num_next = self.cur_partitions[n-1].remove_cell(ell[n-1])
539
+ if case_S[n-1]:
540
+ row_num_bar_next = self.cur_partitions[n-1].remove_cell(ell[2*n-1])
541
+ else:
542
+ row_num_bar_next = None
543
+ elif case_S[n-1]:
544
+ row_num_next = None
545
+ row_num_bar_next = self.cur_partitions[n-1].remove_cell(ell[2*n-1], 2)
546
+ else:
547
+ row_num_next = None
548
+ row_num_bar_next = None
549
+
550
+ self._update_vacancy_numbers(n - 2)
551
+ if row_num is not None:
552
+ self.cur_partitions[n-2].rigging[row_num] = self.cur_partitions[n-2].vacancy_numbers[row_num]
553
+ if row_num_bar is not None:
554
+ self.cur_partitions[n-2].rigging[row_num_bar] = self.cur_partitions[n-2].vacancy_numbers[row_num_bar]
555
+
556
+ self._update_vacancy_numbers(n - 1)
557
+ if height == n:
558
+ self._correct_vacancy_nums()
559
+ if row_num_next is not None:
560
+ self.cur_partitions[n-1].rigging[row_num_next] = self.cur_partitions[n-1].vacancy_numbers[row_num_next]
561
+ if row_num_bar_next is not None:
562
+ if case_Q:
563
+ vac_num = self.cur_partitions[n-1].vacancy_numbers[row_num_bar_next]
564
+ self.cur_partitions[n-1].rigging[row_num_bar_next] = vac_num
565
+ block_len = self.cur_partitions[n-1][row_num_bar_next]
566
+ j = row_num_bar_next + 1
567
+ length = len(self.cur_partitions[n-1])
568
+ # Find the place for the quasisingular rigging
569
+ while j < length and self.cur_partitions[n-1][j] == block_len \
570
+ and self.cur_partitions[n-1].rigging[j] == vac_num:
571
+ j += 1
572
+ self.cur_partitions[n-1].rigging[j-1] = vac_num - 1
573
+ else:
574
+ self.cur_partitions[n-1].rigging[row_num_bar_next] = self.cur_partitions[n-1].vacancy_numbers[row_num_bar_next]
575
+
576
+ return b