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,487 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ PBW data
5
+
6
+ This contains helper classes and functions which encode PBW data
7
+ in finite type.
8
+
9
+ AUTHORS:
10
+
11
+ - Dinakar Muthiah (2015-05): initial version
12
+ - Travis Scrimshaw (2016-06): simplified code and converted to Cython
13
+ """
14
+
15
+ # ****************************************************************************
16
+ # Copyright (C) 2015 Dinakar Muthiah <muthiah at ualberta.ca>
17
+ # Travis Scrimshaw <tscrimsh at umn.edu>
18
+ #
19
+ # This program is free software: you can redistribute it and/or modify
20
+ # it under the terms of the GNU General Public License as published by
21
+ # the Free Software Foundation, either version 2 of the License, or
22
+ # (at your option) any later version.
23
+ # https://www.gnu.org/licenses/
24
+ # ****************************************************************************
25
+
26
+ # from sage.misc.lazy_attribute import lazy_attribute
27
+ from sage.misc.cachefunc import cached_method
28
+ from sage.combinat.root_system.cartan_type import CartanType
29
+ from sage.combinat.root_system.root_system import RootSystem
30
+ from sage.combinat.root_system.braid_move_calculator import BraidMoveCalculator
31
+
32
+ cimport cython
33
+
34
+
35
+ class PBWDatum():
36
+ """
37
+ Helper class which represents a PBW datum.
38
+ """
39
+ def __init__(self, parent, long_word, lusztig_datum):
40
+ """
41
+ Initialize ``self``.
42
+
43
+ EXAMPLES::
44
+
45
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
46
+ sage: P = PBWData("A2")
47
+ sage: L = PBWDatum(P, (1,2,1), (1,4,7))
48
+ sage: TestSuite(L).run(skip='_test_pickling')
49
+ """
50
+ self.parent = parent
51
+ self.long_word = tuple(long_word)
52
+ self.lusztig_datum = tuple(lusztig_datum)
53
+
54
+ def __repr__(self):
55
+ """
56
+ Return a string representation of ``self``.
57
+
58
+ EXAMPLES::
59
+
60
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
61
+ sage: P = PBWData("A2")
62
+ sage: PBWDatum(P, (1,2,1), (1,4,7))
63
+ PBW Datum element of type ['A', 2] with long word (1, 2, 1)
64
+ and Lusztig datum (1, 4, 7)
65
+ """
66
+ return_str = "PBW Datum element of type {cartan_type} with ".format(
67
+ cartan_type=self.parent.cartan_type)
68
+ return_str += "long word {long_word} and Lusztig datum {lusztig_datum}".format(
69
+ long_word=self.long_word,
70
+ lusztig_datum=self.lusztig_datum)
71
+ return return_str
72
+
73
+ def __eq__(self, other_PBWDatum):
74
+ """
75
+ Check equality.
76
+
77
+ EXAMPLES::
78
+
79
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
80
+ sage: P = PBWData("A2")
81
+ sage: L1 = PBWDatum(P, (1,2,1), (1,4,7))
82
+ sage: L2 = PBWDatum(P, (1,2,1), (1,4,7))
83
+ sage: L1 == L2
84
+ True
85
+ """
86
+ return (self.parent == other_PBWDatum.parent and
87
+ self.long_word == other_PBWDatum.long_word and
88
+ self.lusztig_datum == other_PBWDatum.lusztig_datum)
89
+
90
+ def is_equivalent_to(self, other_pbw_datum):
91
+ r"""
92
+ Return whether ``self`` is equivalent to ``other_pbw_datum``.
93
+ modulo the tropical Plücker relations.
94
+
95
+ EXAMPLES::
96
+
97
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
98
+ sage: P = PBWData("A2")
99
+ sage: L1 = PBWDatum(P, (1,2,1), (1,0,1))
100
+ sage: L2 = PBWDatum(P, (2,1,2), (0,1,0))
101
+ sage: L1.is_equivalent_to(L2)
102
+ True
103
+ sage: L1 == L2
104
+ False
105
+ """
106
+ other_long_word = other_pbw_datum.long_word
107
+ other_lusztig_datum = other_pbw_datum.lusztig_datum
108
+ equiv_pbw_datum = self.convert_to_new_long_word(other_long_word)
109
+ return equiv_pbw_datum.lusztig_datum == other_lusztig_datum
110
+
111
+ def convert_to_long_word_with_first_letter(self, i):
112
+ r"""
113
+ Return a new PBWDatum equivalent to ``self``
114
+ whose long word begins with ``i``.
115
+
116
+ EXAMPLES::
117
+
118
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
119
+ sage: P = PBWData("A3")
120
+ sage: datum = PBWDatum(P, (1,2,1,3,2,1), (1,0,1,4,2,3))
121
+ sage: datum.convert_to_long_word_with_first_letter(1)
122
+ PBW Datum element of type ['A', 3] with long word (1, 2, 3, 1, 2, 1)
123
+ and Lusztig datum (1, 0, 4, 1, 2, 3)
124
+ sage: datum.convert_to_long_word_with_first_letter(2)
125
+ PBW Datum element of type ['A', 3] with long word (2, 1, 2, 3, 2, 1)
126
+ and Lusztig datum (0, 1, 0, 4, 2, 3)
127
+ sage: datum.convert_to_long_word_with_first_letter(3)
128
+ PBW Datum element of type ['A', 3] with long word (3, 1, 2, 3, 1, 2)
129
+ and Lusztig datum (8, 1, 0, 4, 1, 2)
130
+ """
131
+ return self.convert_to_new_long_word(self.parent._long_word_begin_with(i))
132
+
133
+ def convert_to_new_long_word(self, new_long_word):
134
+ r"""
135
+ Return a new PBWDatum equivalent to ``self``
136
+ whose long word is ``new_long_word``.
137
+
138
+ EXAMPLES::
139
+
140
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
141
+ sage: P = PBWData("A2")
142
+ sage: datum = PBWDatum(P, (1,2,1), (1,0,1))
143
+ sage: new_datum = datum.convert_to_new_long_word((2,1,2))
144
+ sage: new_datum.long_word
145
+ (2, 1, 2)
146
+ sage: new_datum.lusztig_datum
147
+ (0, 1, 0)
148
+ """
149
+ return self.parent.convert_to_new_long_word(self, new_long_word)
150
+
151
+ def weight(self):
152
+ """
153
+ Return the weight of ``self``.
154
+
155
+ EXAMPLES::
156
+
157
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
158
+ sage: P = PBWData("A2")
159
+ sage: L = PBWDatum(P, (1,2,1), (1,1,1))
160
+ sage: L.weight()
161
+ -2*alpha[1] - 2*alpha[2]
162
+ """
163
+ root_list = self.parent._root_list_from(tuple(self.long_word))
164
+ R = self.parent.root_lattice
165
+ return R.linear_combination((root_list[i], -coeff)
166
+ for i, coeff in enumerate(self.lusztig_datum))
167
+
168
+ def star(self):
169
+ """
170
+ Return the starred version of ``self``, i.e.,
171
+ with reversed ``long_word`` and ``lusztig_datum``
172
+
173
+ EXAMPLES::
174
+
175
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
176
+ sage: P = PBWData("A2")
177
+ sage: L1 = PBWDatum(P, (1,2,1), (1,2,3))
178
+ sage: L1.star() == PBWDatum(P, (2,1,2), (3,2,1))
179
+ True
180
+ """
181
+ aut = self.parent.cartan_type.opposition_automorphism()
182
+ reversed_long_word = [aut[i] for i in reversed(self.long_word)]
183
+ reversed_lusztig_datum = reversed(self.lusztig_datum)
184
+ return PBWDatum(self.parent, reversed_long_word, reversed_lusztig_datum)
185
+
186
+
187
+ class PBWData(): # UniqueRepresentation?
188
+ """
189
+ Helper class for the set of PBW data.
190
+ """
191
+ def __init__(self, cartan_type):
192
+ """
193
+ Initialize ``self``.
194
+
195
+ EXAMPLES::
196
+
197
+ sage: from sage.combinat.crystals.pbw_datum import PBWData
198
+ sage: P = PBWData(["A",2])
199
+ sage: TestSuite(P).run(skip='_test_pickling')
200
+ """
201
+ self.cartan_type = CartanType(cartan_type)
202
+ self.root_system = RootSystem(self.cartan_type)
203
+ self.root_lattice = self.root_system.root_lattice()
204
+ self.weyl_group = self.root_lattice.weyl_group()
205
+ self._braid_move_calc = BraidMoveCalculator(self.weyl_group)
206
+
207
+ def convert_to_new_long_word(self, pbw_datum, new_long_word):
208
+ """
209
+ Convert the PBW datum ``pbw_datum`` from its long word to
210
+ ``new_long_word``.
211
+
212
+ EXAMPLES::
213
+
214
+ sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
215
+ sage: P = PBWData("A2")
216
+ sage: datum = PBWDatum(P, (1,2,1), (1,0,1))
217
+ sage: new_datum = P.convert_to_new_long_word(datum,(2,1,2))
218
+ sage: new_datum
219
+ PBW Datum element of type ['A', 2] with long word (2, 1, 2)
220
+ and Lusztig datum (0, 1, 0)
221
+ sage: new_datum.long_word
222
+ (2, 1, 2)
223
+ sage: new_datum.lusztig_datum
224
+ (0, 1, 0)
225
+ """
226
+ assert pbw_datum.parent is self
227
+ chain = self._braid_move_calc.chain_of_reduced_words(pbw_datum.long_word,
228
+ new_long_word)
229
+ cdef list enhanced_braid_chain = enhance_braid_move_chain(chain, self.cartan_type)
230
+ new_lusztig_datum = compute_new_lusztig_datum(enhanced_braid_chain,
231
+ pbw_datum.lusztig_datum)
232
+ return PBWDatum(self, new_long_word, new_lusztig_datum)
233
+
234
+ @cached_method
235
+ def _root_list_from(self, reduced_word):
236
+ """
237
+ Return the list of positive roots in the order determined by
238
+ ``reduced_word``.
239
+
240
+ .. WARNING::
241
+
242
+ No error checking is done to verify that ``reduced_word``
243
+ is reduced.
244
+
245
+ INPUT:
246
+
247
+ - ``reduced_word`` -- tuple corresponding to a reduced word
248
+
249
+ EXAMPLES::
250
+
251
+ sage: from sage.combinat.crystals.pbw_datum import PBWData
252
+ sage: P = PBWData(["A",2])
253
+ sage: P._root_list_from((1,2,1))
254
+ [alpha[1], alpha[1] + alpha[2], alpha[2]]
255
+ """
256
+ al = self.root_lattice.simple_roots()
257
+ cur = []
258
+ for i in reversed(reduced_word):
259
+ cur = [al[i]] + [x.simple_reflection(i) for x in cur]
260
+ return cur
261
+
262
+ @cached_method
263
+ def _long_word_begin_with(self, i):
264
+ """
265
+ Return a reduced expression of the long word which begins with ``i``.
266
+
267
+ EXAMPLES::
268
+
269
+ sage: from sage.combinat.crystals.pbw_datum import PBWData
270
+ sage: P = PBWData(["C",3])
271
+ sage: P._long_word_begin_with(1)
272
+ (1, 3, 2, 3, 1, 2, 3, 1, 2)
273
+ sage: P._long_word_begin_with(2)
274
+ (2, 3, 2, 3, 1, 2, 3, 2, 1)
275
+ sage: P._long_word_begin_with(3)
276
+ (3, 2, 3, 1, 2, 3, 1, 2, 1)
277
+ """
278
+ si = self.weyl_group.simple_reflection(i)
279
+ w0 = self.weyl_group.long_element()
280
+ return tuple([i] + (si * w0).reduced_word())
281
+
282
+
283
+ # enhanced_braid_chain is an ugly data structure.
284
+ @cython.boundscheck(False)
285
+ @cython.wraparound(False)
286
+ cpdef tuple compute_new_lusztig_datum(list enhanced_braid_chain, initial_lusztig_datum):
287
+ """
288
+ Return the Lusztig datum obtained by applying tropical Plücker
289
+ relations along ``enhanced_braid_chain`` starting with
290
+ ``initial_lusztig_datum``.
291
+
292
+ EXAMPLES::
293
+
294
+ sage: from sage.combinat.root_system.braid_move_calculator import BraidMoveCalculator
295
+ sage: from sage.combinat.crystals.pbw_datum import enhance_braid_move_chain
296
+ sage: from sage.combinat.crystals.pbw_datum import compute_new_lusztig_datum
297
+ sage: ct = CartanType(['A', 2])
298
+ sage: W = CoxeterGroup(ct)
299
+ sage: B = BraidMoveCalculator(W)
300
+ sage: chain = B.chain_of_reduced_words((1,2,1),(2,1,2))
301
+ sage: enhanced_braid_chain = enhance_braid_move_chain(chain, ct)
302
+ sage: compute_new_lusztig_datum(enhanced_braid_chain,(1,0,1))
303
+ (0, 1, 0)
304
+
305
+ TESTS::
306
+
307
+ sage: from sage.combinat.root_system.braid_move_calculator import BraidMoveCalculator
308
+ sage: from sage.combinat.crystals.pbw_datum import enhance_braid_move_chain
309
+ sage: from sage.combinat.crystals.pbw_datum import compute_new_lusztig_datum
310
+ sage: ct = CartanType(['A', 2])
311
+ sage: W = CoxeterGroup(ct)
312
+ sage: B = BraidMoveCalculator(W)
313
+ sage: chain = B.chain_of_reduced_words((1,2,1), (2,1,2))
314
+ sage: enhanced_braid_chain = enhance_braid_move_chain(chain, ct)
315
+ sage: compute_new_lusztig_datum(enhanced_braid_chain,(1,0,1)) == (0,1,0)
316
+ True
317
+ """
318
+ cdef tuple interval_of_change
319
+ # Does not currently check that len(initial_lusztig_datum) is appropriate
320
+ cdef list new_lusztig_datum = list(initial_lusztig_datum) # shallow copy
321
+ cdef int i
322
+ for i in range(1, len(enhanced_braid_chain)):
323
+ interval_of_change, type_data = enhanced_braid_chain[i]
324
+ a, b = interval_of_change
325
+ old_interval_datum = new_lusztig_datum[a:b]
326
+ new_interval_datum = tropical_plucker_relation(type_data, old_interval_datum)
327
+ new_lusztig_datum[a:b] = new_interval_datum
328
+ return tuple(new_lusztig_datum)
329
+
330
+
331
+ # The tropical Plücker relations
332
+ @cython.boundscheck(False)
333
+ @cython.wraparound(False)
334
+ cpdef tuple tropical_plucker_relation(tuple a, lusztig_datum):
335
+ r"""
336
+ Apply the tropical Plücker relation of type ``a`` to ``lusztig_datum``.
337
+
338
+ The relations are obtained by tropicalizing the relations in
339
+ Proposition 7.1 of [BZ01]_.
340
+
341
+ INPUT:
342
+
343
+ - ``a`` -- a pair ``(x, y)`` of the off-diagonal entries of a
344
+ `2 \times 2` Cartan matrix
345
+
346
+ EXAMPLES::
347
+
348
+ sage: from sage.combinat.crystals.pbw_datum import tropical_plucker_relation
349
+ sage: tropical_plucker_relation((0,0), (2,3))
350
+ (3, 2)
351
+ sage: tropical_plucker_relation((-1,-1), (1,2,3))
352
+ (4, 1, 2)
353
+ sage: tropical_plucker_relation((-1,-2), (1,2,3,4))
354
+ (8, 1, 2, 3)
355
+ sage: tropical_plucker_relation((-2,-1), (1,2,3,4))
356
+ (6, 1, 2, 3)
357
+ """
358
+ if a == (0, 0): # A1xA1
359
+ t1, t2 = lusztig_datum
360
+ return (t2, t1)
361
+ elif a == (-1, -1): # A2
362
+ t1,t2,t3 = lusztig_datum
363
+ return (t2+t3-min(t1,t3),
364
+ min(t1,t3),
365
+ t1+t2-min(t1,t3))
366
+ elif a == (-1, -2): # B2
367
+ t1,t2,t3,t4 = lusztig_datum
368
+ pi1 = min(t1+t2,min(t1,t3)+t4)
369
+ pi2 = min(2*t1+t2,2*min(t1,t3)+t4)
370
+ return (t2+2*t3+t4-pi2,
371
+ pi2-pi1,
372
+ 2*pi1-pi2,
373
+ t1+t2+t3-pi1)
374
+ elif a == (-1, -3): # G2
375
+ t1,t2,t3,t4,t5,t6 = lusztig_datum
376
+ pi1 = min(t1+t2+2*t3+t4,
377
+ t1+t2+2*min(t3,t5)+t6,
378
+ min(t1,t3)+t4+2*t5+t6)
379
+ pi2 = min(2*t1+2*t2+3*t3+t4,
380
+ 2*t1+2*t2+3*min(t3,t5)+t6,
381
+ 2*min(t1,t3)+2*t4+3*t5+t6,
382
+ t1+t2+t4+2*t5+t6+min(t1+t3,2*t3,t3+t5,t1+t5))
383
+ pi3 = min(3*t1+2*t2+3*t3+t4,
384
+ 3*t1+2*t2+3*min(t3,t5)+t6,
385
+ 3*min(t1,t3)+2*t4+3*t5+t6,
386
+ 2*t1+t2+t4+2*t5+t6+min(t1+t3,2*t3,t3+t5,t1+t5))
387
+ pi4 = min(2*t1+2*t2+3*t3+t4+min(t1+t2+3*t3+t4,
388
+ t1+t2+3*min(t3,t5)+t6,
389
+ min(t1+t3,2*t3,t3+t5,t1+t5)+t4+2*t5+t6),
390
+ 2*t6+3*min(t1+t2+2*min(t3,t5),min(t1,t3)+t4+2*t5))
391
+ return (t2+3*t3+2*t4+3*t5+t6-pi3,
392
+ pi3-pi2,
393
+ 3*pi2-pi3-pi4,
394
+ pi4-pi1-pi2,
395
+ 3*pi1-pi4,
396
+ t1+t2+2*t3+t4+t5-pi1)
397
+ else: # (-1,-2) and (-1,-3)
398
+ reversed_lusztig_datum = tuple(reversed(lusztig_datum))
399
+ return tuple(reversed(tropical_plucker_relation((a[1], a[0]),
400
+ reversed_lusztig_datum)))
401
+
402
+
403
+ # Maybe we need to be more specific, and pass not the Cartan type, but the root lattice?
404
+ # TODO: Move to PBW_data?
405
+ @cython.boundscheck(False)
406
+ @cython.wraparound(False)
407
+ cpdef list enhance_braid_move_chain(braid_move_chain, cartan_type):
408
+ r"""
409
+ Return a list of tuples that records the data of the long words in
410
+ ``braid_move_chain`` plus the data of the intervals where the braid moves
411
+ occur and the data of the off-diagonal entries of the `2 \times 2` Cartan
412
+ submatrices of each braid move.
413
+
414
+ INPUT:
415
+
416
+ - ``braid_move_chain`` -- a chain of reduced words in the Weyl group
417
+ of ``cartan_type``
418
+ - ``cartan_type`` -- a finite Cartan type
419
+
420
+ OUTPUT:
421
+
422
+ A list of 2-tuples
423
+ ``(interval_of_change, cartan_sub_matrix)`` where
424
+
425
+ - ``interval_of_change`` is the (half-open) interval of indices where
426
+ the braid move occurs; this is ``None`` for the first tuple
427
+ - ``cartan_sub_matrix`` is the off-diagonal entries of the `2 \times 2`
428
+ submatrix of the Cartan matrix corresponding to the braid move;
429
+ this is ``None`` for the first tuple
430
+
431
+ For a matrix::
432
+
433
+ [2 a]
434
+ [b 2]
435
+
436
+ the ``cartan_sub_matrix`` is the pair ``(a, b)``.
437
+
438
+ TESTS::
439
+
440
+ sage: from sage.combinat.crystals.pbw_datum import enhance_braid_move_chain
441
+ sage: braid_chain = [(1, 2, 1, 3, 2, 1),
442
+ ....: (1, 2, 3, 1, 2, 1),
443
+ ....: (1, 2, 3, 2, 1, 2),
444
+ ....: (1, 3, 2, 3, 1, 2),
445
+ ....: (3, 1, 2, 3, 1, 2),
446
+ ....: (3, 1, 2, 1, 3, 2),
447
+ ....: (3, 2, 1, 2, 3, 2),
448
+ ....: (3, 2, 1, 3, 2, 3)]
449
+ sage: enhanced_chain = enhance_braid_move_chain(braid_chain, CartanType(["A",5]))
450
+ sage: enhanced_chain[0]
451
+ (None, None)
452
+ sage: enhanced_chain[7]
453
+ ((3, 6), (-1, -1))
454
+ """
455
+ cdef int i, j
456
+ cdef int k, pos, first, last
457
+ cdef tuple cartan_sub_matrix
458
+ cdef list output_list = []
459
+ output_list.append( (None, None) )
460
+ cdef tuple previous_word = <tuple> (braid_move_chain[0])
461
+ cdef tuple current_word
462
+ cartan_matrix = cartan_type.cartan_matrix()
463
+ cdef int ell = len(previous_word)
464
+ # TODO - Optimize this by avoiding calls to here?
465
+ # This likely could be done when performing chain_of_reduced_words
466
+ # Things in here get called the most (about 50x more than enhance_braid_move_chain)
467
+ for pos in range(1, len(braid_move_chain)):
468
+ # This gets the smallest contiguous half-open interval [a, b)
469
+ # that contains the indices where current_word and previous_word differ.
470
+ current_word = <tuple> (braid_move_chain[pos])
471
+ for k in range(ell):
472
+ i = previous_word[k]
473
+ j = current_word[k]
474
+ if i != j:
475
+ i -= 1 # -1 for indexing
476
+ j -= 1 # -1 for indexing
477
+ first = k
478
+ break
479
+ for k in range(ell-1, k-1, -1):
480
+ if previous_word[k] != current_word[k]:
481
+ last = k + 1
482
+ break
483
+
484
+ cartan_sub_matrix = (cartan_matrix[i, j], cartan_matrix[j, i])
485
+ output_list.append(((first, last), cartan_sub_matrix))
486
+ previous_word = current_word
487
+ return output_list