passagemath-combinat 10.6.42__cp314-cp314-musllinux_1_2_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  3. passagemath_combinat-10.6.42.dist-info/RECORD +400 -0
  4. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  5. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  6. passagemath_combinat.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  7. passagemath_combinat.libs/libsymmetrica-81fe8739.so.3.0.0 +0 -0
  8. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  9. sage/algebras/all.py +24 -0
  10. sage/algebras/all__sagemath_combinat.py +35 -0
  11. sage/algebras/askey_wilson.py +935 -0
  12. sage/algebras/associated_graded.py +345 -0
  13. sage/algebras/cellular_basis.py +350 -0
  14. sage/algebras/cluster_algebra.py +2766 -0
  15. sage/algebras/down_up_algebra.py +860 -0
  16. sage/algebras/free_algebra.py +1698 -0
  17. sage/algebras/free_algebra_element.py +345 -0
  18. sage/algebras/free_algebra_quotient.py +405 -0
  19. sage/algebras/free_algebra_quotient_element.py +295 -0
  20. sage/algebras/free_zinbiel_algebra.py +885 -0
  21. sage/algebras/hall_algebra.py +783 -0
  22. sage/algebras/hecke_algebras/all.py +4 -0
  23. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  24. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  25. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  28. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  29. sage/algebras/jordan_algebra.py +1773 -0
  30. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  31. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  32. sage/algebras/lie_conformal_algebras/all.py +18 -0
  33. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  34. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  35. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  36. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  37. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  38. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  39. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  40. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  41. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  45. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  46. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  47. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  48. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  49. sage/algebras/nil_coxeter_algebra.py +191 -0
  50. sage/algebras/q_commuting_polynomials.py +673 -0
  51. sage/algebras/q_system.py +608 -0
  52. sage/algebras/quantum_clifford.py +959 -0
  53. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  54. sage/algebras/quantum_groups/all.py +9 -0
  55. sage/algebras/quantum_groups/fock_space.py +2219 -0
  56. sage/algebras/quantum_groups/q_numbers.py +207 -0
  57. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  58. sage/algebras/quantum_groups/representations.py +591 -0
  59. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  60. sage/algebras/quantum_oscillator.py +623 -0
  61. sage/algebras/quaternion_algebra.py +20 -0
  62. sage/algebras/quaternion_algebra_element.py +55 -0
  63. sage/algebras/rational_cherednik_algebra.py +525 -0
  64. sage/algebras/schur_algebra.py +670 -0
  65. sage/algebras/shuffle_algebra.py +1011 -0
  66. sage/algebras/splitting_algebra.py +779 -0
  67. sage/algebras/tensor_algebra.py +709 -0
  68. sage/algebras/yangian.py +1082 -0
  69. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  70. sage/all__sagemath_combinat.py +35 -0
  71. sage/combinat/SJT.py +255 -0
  72. sage/combinat/affine_permutation.py +2405 -0
  73. sage/combinat/algebraic_combinatorics.py +55 -0
  74. sage/combinat/all.py +53 -0
  75. sage/combinat/all__sagemath_combinat.py +195 -0
  76. sage/combinat/alternating_sign_matrix.py +2063 -0
  77. sage/combinat/baxter_permutations.py +346 -0
  78. sage/combinat/bijectionist.py +3220 -0
  79. sage/combinat/binary_recurrence_sequences.py +1180 -0
  80. sage/combinat/blob_algebra.py +685 -0
  81. sage/combinat/catalog_partitions.py +27 -0
  82. sage/combinat/chas/all.py +23 -0
  83. sage/combinat/chas/fsym.py +1180 -0
  84. sage/combinat/chas/wqsym.py +2601 -0
  85. sage/combinat/cluster_complex.py +326 -0
  86. sage/combinat/colored_permutations.py +2039 -0
  87. sage/combinat/colored_permutations_representations.py +964 -0
  88. sage/combinat/composition_signed.py +142 -0
  89. sage/combinat/composition_tableau.py +855 -0
  90. sage/combinat/constellation.py +1729 -0
  91. sage/combinat/core.py +751 -0
  92. sage/combinat/counting.py +12 -0
  93. sage/combinat/crystals/affine.py +742 -0
  94. sage/combinat/crystals/affine_factorization.py +518 -0
  95. sage/combinat/crystals/affinization.py +331 -0
  96. sage/combinat/crystals/alcove_path.py +2013 -0
  97. sage/combinat/crystals/all.py +22 -0
  98. sage/combinat/crystals/bkk_crystals.py +141 -0
  99. sage/combinat/crystals/catalog.py +115 -0
  100. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  101. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  102. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  103. sage/combinat/crystals/crystals.py +257 -0
  104. sage/combinat/crystals/direct_sum.py +260 -0
  105. sage/combinat/crystals/elementary_crystals.py +1251 -0
  106. sage/combinat/crystals/fast_crystals.py +441 -0
  107. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  108. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  109. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  110. sage/combinat/crystals/induced_structure.py +695 -0
  111. sage/combinat/crystals/infinity_crystals.py +730 -0
  112. sage/combinat/crystals/kac_modules.py +863 -0
  113. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  114. sage/combinat/crystals/kyoto_path_model.py +497 -0
  115. sage/combinat/crystals/letters.cpython-314-x86_64-linux-musl.so +0 -0
  116. sage/combinat/crystals/letters.pxd +79 -0
  117. sage/combinat/crystals/letters.pyx +3056 -0
  118. sage/combinat/crystals/littelmann_path.py +1518 -0
  119. sage/combinat/crystals/monomial_crystals.py +1262 -0
  120. sage/combinat/crystals/multisegments.py +462 -0
  121. sage/combinat/crystals/mv_polytopes.py +467 -0
  122. sage/combinat/crystals/pbw_crystal.py +511 -0
  123. sage/combinat/crystals/pbw_datum.cpython-314-x86_64-linux-musl.so +0 -0
  124. sage/combinat/crystals/pbw_datum.pxd +4 -0
  125. sage/combinat/crystals/pbw_datum.pyx +487 -0
  126. sage/combinat/crystals/polyhedral_realization.py +372 -0
  127. sage/combinat/crystals/spins.cpython-314-x86_64-linux-musl.so +0 -0
  128. sage/combinat/crystals/spins.pxd +21 -0
  129. sage/combinat/crystals/spins.pyx +756 -0
  130. sage/combinat/crystals/star_crystal.py +290 -0
  131. sage/combinat/crystals/subcrystal.py +464 -0
  132. sage/combinat/crystals/tensor_product.py +1177 -0
  133. sage/combinat/crystals/tensor_product_element.cpython-314-x86_64-linux-musl.so +0 -0
  134. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  135. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  136. sage/combinat/crystals/virtual_crystal.py +420 -0
  137. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  138. sage/combinat/debruijn_sequence.cpython-314-x86_64-linux-musl.so +0 -0
  139. sage/combinat/debruijn_sequence.pyx +355 -0
  140. sage/combinat/decorated_permutation.py +270 -0
  141. sage/combinat/degree_sequences.cpython-314-x86_64-linux-musl.so +0 -0
  142. sage/combinat/degree_sequences.pyx +588 -0
  143. sage/combinat/derangements.py +527 -0
  144. sage/combinat/descent_algebra.py +1008 -0
  145. sage/combinat/diagram.py +1551 -0
  146. sage/combinat/diagram_algebras.py +5886 -0
  147. sage/combinat/dyck_word.py +4349 -0
  148. sage/combinat/e_one_star.py +1623 -0
  149. sage/combinat/enumerated_sets.py +123 -0
  150. sage/combinat/expnums.cpython-314-x86_64-linux-musl.so +0 -0
  151. sage/combinat/expnums.pyx +148 -0
  152. sage/combinat/fast_vector_partitions.cpython-314-x86_64-linux-musl.so +0 -0
  153. sage/combinat/fast_vector_partitions.pyx +346 -0
  154. sage/combinat/fqsym.py +1977 -0
  155. sage/combinat/free_dendriform_algebra.py +954 -0
  156. sage/combinat/free_prelie_algebra.py +1141 -0
  157. sage/combinat/fully_commutative_elements.py +1077 -0
  158. sage/combinat/fully_packed_loop.py +1523 -0
  159. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  160. sage/combinat/gray_codes.py +311 -0
  161. sage/combinat/grossman_larson_algebras.py +667 -0
  162. sage/combinat/growth.py +4352 -0
  163. sage/combinat/hall_polynomial.py +188 -0
  164. sage/combinat/hillman_grassl.py +866 -0
  165. sage/combinat/integer_matrices.py +329 -0
  166. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  167. sage/combinat/k_tableau.py +4564 -0
  168. sage/combinat/kazhdan_lusztig.py +215 -0
  169. sage/combinat/key_polynomial.py +885 -0
  170. sage/combinat/knutson_tao_puzzles.py +2286 -0
  171. sage/combinat/lr_tableau.py +311 -0
  172. sage/combinat/matrices/all.py +24 -0
  173. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  174. sage/combinat/matrices/latin.py +2912 -0
  175. sage/combinat/misc.py +401 -0
  176. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  177. sage/combinat/ncsf_qsym/all.py +21 -0
  178. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  179. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  180. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  181. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  182. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  183. sage/combinat/ncsym/all.py +21 -0
  184. sage/combinat/ncsym/bases.py +855 -0
  185. sage/combinat/ncsym/dual.py +593 -0
  186. sage/combinat/ncsym/ncsym.py +2076 -0
  187. sage/combinat/necklace.py +551 -0
  188. sage/combinat/non_decreasing_parking_function.py +634 -0
  189. sage/combinat/nu_dyck_word.py +1474 -0
  190. sage/combinat/output.py +861 -0
  191. sage/combinat/parallelogram_polyomino.py +4326 -0
  192. sage/combinat/parking_functions.py +1602 -0
  193. sage/combinat/partition_algebra.py +1998 -0
  194. sage/combinat/partition_kleshchev.py +1982 -0
  195. sage/combinat/partition_shifting_algebras.py +584 -0
  196. sage/combinat/partition_tuple.py +3114 -0
  197. sage/combinat/path_tableaux/all.py +13 -0
  198. sage/combinat/path_tableaux/catalog.py +29 -0
  199. sage/combinat/path_tableaux/dyck_path.py +380 -0
  200. sage/combinat/path_tableaux/frieze.py +476 -0
  201. sage/combinat/path_tableaux/path_tableau.py +728 -0
  202. sage/combinat/path_tableaux/semistandard.py +510 -0
  203. sage/combinat/perfect_matching.py +779 -0
  204. sage/combinat/plane_partition.py +3300 -0
  205. sage/combinat/q_bernoulli.cpython-314-x86_64-linux-musl.so +0 -0
  206. sage/combinat/q_bernoulli.pyx +128 -0
  207. sage/combinat/quickref.py +81 -0
  208. sage/combinat/recognizable_series.py +2051 -0
  209. sage/combinat/regular_sequence.py +4316 -0
  210. sage/combinat/regular_sequence_bounded.py +543 -0
  211. sage/combinat/restricted_growth.py +81 -0
  212. sage/combinat/ribbon.py +20 -0
  213. sage/combinat/ribbon_shaped_tableau.py +489 -0
  214. sage/combinat/ribbon_tableau.py +1180 -0
  215. sage/combinat/rigged_configurations/all.py +46 -0
  216. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  217. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  218. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  219. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  222. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  223. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  224. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  225. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  226. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  227. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  228. sage/combinat/rigged_configurations/bijection.py +143 -0
  229. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  230. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  231. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  232. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  233. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  234. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  235. sage/combinat/rigged_configurations/rigged_partition.cpython-314-x86_64-linux-musl.so +0 -0
  236. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  238. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  240. sage/combinat/rsk.py +3438 -0
  241. sage/combinat/schubert_polynomial.py +508 -0
  242. sage/combinat/set_partition.py +3318 -0
  243. sage/combinat/set_partition_iterator.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/combinat/set_partition_iterator.pyx +136 -0
  245. sage/combinat/set_partition_ordered.py +1590 -0
  246. sage/combinat/sf/abreu_nigro.py +346 -0
  247. sage/combinat/sf/all.py +52 -0
  248. sage/combinat/sf/character.py +576 -0
  249. sage/combinat/sf/classical.py +319 -0
  250. sage/combinat/sf/dual.py +996 -0
  251. sage/combinat/sf/elementary.py +549 -0
  252. sage/combinat/sf/hall_littlewood.py +1028 -0
  253. sage/combinat/sf/hecke.py +336 -0
  254. sage/combinat/sf/homogeneous.py +464 -0
  255. sage/combinat/sf/jack.py +1428 -0
  256. sage/combinat/sf/k_dual.py +1458 -0
  257. sage/combinat/sf/kfpoly.py +447 -0
  258. sage/combinat/sf/llt.py +789 -0
  259. sage/combinat/sf/macdonald.py +2019 -0
  260. sage/combinat/sf/monomial.py +525 -0
  261. sage/combinat/sf/multiplicative.py +113 -0
  262. sage/combinat/sf/new_kschur.py +1786 -0
  263. sage/combinat/sf/ns_macdonald.py +964 -0
  264. sage/combinat/sf/orthogonal.py +246 -0
  265. sage/combinat/sf/orthotriang.py +355 -0
  266. sage/combinat/sf/powersum.py +963 -0
  267. sage/combinat/sf/schur.py +880 -0
  268. sage/combinat/sf/sf.py +1653 -0
  269. sage/combinat/sf/sfa.py +7053 -0
  270. sage/combinat/sf/symplectic.py +253 -0
  271. sage/combinat/sf/witt.py +721 -0
  272. sage/combinat/shifted_primed_tableau.py +2735 -0
  273. sage/combinat/shuffle.py +830 -0
  274. sage/combinat/sidon_sets.py +146 -0
  275. sage/combinat/similarity_class_type.py +1721 -0
  276. sage/combinat/sine_gordon.py +618 -0
  277. sage/combinat/six_vertex_model.py +784 -0
  278. sage/combinat/skew_partition.py +2053 -0
  279. sage/combinat/skew_tableau.py +2989 -0
  280. sage/combinat/sloane_functions.py +8935 -0
  281. sage/combinat/specht_module.py +1403 -0
  282. sage/combinat/species/all.py +48 -0
  283. sage/combinat/species/characteristic_species.py +321 -0
  284. sage/combinat/species/composition_species.py +273 -0
  285. sage/combinat/species/cycle_species.py +284 -0
  286. sage/combinat/species/empty_species.py +155 -0
  287. sage/combinat/species/functorial_composition_species.py +148 -0
  288. sage/combinat/species/generating_series.py +673 -0
  289. sage/combinat/species/library.py +148 -0
  290. sage/combinat/species/linear_order_species.py +169 -0
  291. sage/combinat/species/misc.py +83 -0
  292. sage/combinat/species/partition_species.py +290 -0
  293. sage/combinat/species/permutation_species.py +268 -0
  294. sage/combinat/species/product_species.py +423 -0
  295. sage/combinat/species/recursive_species.py +476 -0
  296. sage/combinat/species/set_species.py +192 -0
  297. sage/combinat/species/species.py +820 -0
  298. sage/combinat/species/structure.py +539 -0
  299. sage/combinat/species/subset_species.py +243 -0
  300. sage/combinat/species/sum_species.py +225 -0
  301. sage/combinat/subword.py +564 -0
  302. sage/combinat/subword_complex.py +2122 -0
  303. sage/combinat/subword_complex_c.cpython-314-x86_64-linux-musl.so +0 -0
  304. sage/combinat/subword_complex_c.pyx +119 -0
  305. sage/combinat/super_tableau.py +821 -0
  306. sage/combinat/superpartition.py +1154 -0
  307. sage/combinat/symmetric_group_algebra.py +3774 -0
  308. sage/combinat/symmetric_group_representations.py +1830 -0
  309. sage/combinat/t_sequences.py +877 -0
  310. sage/combinat/tableau.py +9506 -0
  311. sage/combinat/tableau_residues.py +860 -0
  312. sage/combinat/tableau_tuple.py +5353 -0
  313. sage/combinat/tiling.py +2432 -0
  314. sage/combinat/triangles_FHM.py +777 -0
  315. sage/combinat/tutorial.py +1857 -0
  316. sage/combinat/vector_partition.py +337 -0
  317. sage/combinat/words/abstract_word.py +1722 -0
  318. sage/combinat/words/all.py +59 -0
  319. sage/combinat/words/alphabet.py +268 -0
  320. sage/combinat/words/finite_word.py +7201 -0
  321. sage/combinat/words/infinite_word.py +113 -0
  322. sage/combinat/words/lyndon_word.py +652 -0
  323. sage/combinat/words/morphic.py +351 -0
  324. sage/combinat/words/morphism.py +3878 -0
  325. sage/combinat/words/paths.py +2932 -0
  326. sage/combinat/words/shuffle_product.py +278 -0
  327. sage/combinat/words/suffix_trees.py +1873 -0
  328. sage/combinat/words/word.py +769 -0
  329. sage/combinat/words/word_char.cpython-314-x86_64-linux-musl.so +0 -0
  330. sage/combinat/words/word_char.pyx +847 -0
  331. sage/combinat/words/word_datatypes.cpython-314-x86_64-linux-musl.so +0 -0
  332. sage/combinat/words/word_datatypes.pxd +4 -0
  333. sage/combinat/words/word_datatypes.pyx +1067 -0
  334. sage/combinat/words/word_generators.py +2026 -0
  335. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  336. sage/combinat/words/word_options.py +99 -0
  337. sage/combinat/words/words.py +2396 -0
  338. sage/data_structures/all__sagemath_combinat.py +1 -0
  339. sage/databases/all__sagemath_combinat.py +13 -0
  340. sage/databases/findstat.py +4897 -0
  341. sage/databases/oeis.py +2058 -0
  342. sage/databases/sloane.py +393 -0
  343. sage/dynamics/all__sagemath_combinat.py +14 -0
  344. sage/dynamics/cellular_automata/all.py +7 -0
  345. sage/dynamics/cellular_automata/catalog.py +34 -0
  346. sage/dynamics/cellular_automata/elementary.py +612 -0
  347. sage/dynamics/cellular_automata/glca.py +477 -0
  348. sage/dynamics/cellular_automata/solitons.py +1463 -0
  349. sage/dynamics/finite_dynamical_system.py +1249 -0
  350. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  351. sage/games/all.py +7 -0
  352. sage/games/hexad.py +704 -0
  353. sage/games/quantumino.py +591 -0
  354. sage/games/sudoku.py +889 -0
  355. sage/games/sudoku_backtrack.cpython-314-x86_64-linux-musl.so +0 -0
  356. sage/games/sudoku_backtrack.pyx +189 -0
  357. sage/groups/all__sagemath_combinat.py +1 -0
  358. sage/groups/indexed_free_group.py +489 -0
  359. sage/libs/all__sagemath_combinat.py +6 -0
  360. sage/libs/lrcalc/__init__.py +1 -0
  361. sage/libs/lrcalc/lrcalc.py +525 -0
  362. sage/libs/symmetrica/__init__.py +7 -0
  363. sage/libs/symmetrica/all.py +101 -0
  364. sage/libs/symmetrica/kostka.pxi +168 -0
  365. sage/libs/symmetrica/part.pxi +193 -0
  366. sage/libs/symmetrica/plet.pxi +42 -0
  367. sage/libs/symmetrica/sab.pxi +196 -0
  368. sage/libs/symmetrica/sb.pxi +332 -0
  369. sage/libs/symmetrica/sc.pxi +192 -0
  370. sage/libs/symmetrica/schur.pxi +956 -0
  371. sage/libs/symmetrica/symmetrica.cpython-314-x86_64-linux-musl.so +0 -0
  372. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  373. sage/libs/symmetrica/symmetrica.pyx +39 -0
  374. sage/monoids/all.py +13 -0
  375. sage/monoids/automatic_semigroup.py +1054 -0
  376. sage/monoids/free_abelian_monoid.py +315 -0
  377. sage/monoids/free_abelian_monoid_element.cpython-314-x86_64-linux-musl.so +0 -0
  378. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  379. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  380. sage/monoids/free_monoid.py +335 -0
  381. sage/monoids/free_monoid_element.py +431 -0
  382. sage/monoids/hecke_monoid.py +65 -0
  383. sage/monoids/string_monoid.py +817 -0
  384. sage/monoids/string_monoid_element.py +547 -0
  385. sage/monoids/string_ops.py +143 -0
  386. sage/monoids/trace_monoid.py +972 -0
  387. sage/rings/all__sagemath_combinat.py +2 -0
  388. sage/sat/all.py +4 -0
  389. sage/sat/boolean_polynomials.py +405 -0
  390. sage/sat/converters/__init__.py +6 -0
  391. sage/sat/converters/anf2cnf.py +14 -0
  392. sage/sat/converters/polybori.py +611 -0
  393. sage/sat/solvers/__init__.py +5 -0
  394. sage/sat/solvers/cryptominisat.py +287 -0
  395. sage/sat/solvers/dimacs.py +783 -0
  396. sage/sat/solvers/picosat.py +228 -0
  397. sage/sat/solvers/sat_lp.py +156 -0
  398. sage/sat/solvers/satsolver.cpython-314-x86_64-linux-musl.so +0 -0
  399. sage/sat/solvers/satsolver.pxd +3 -0
  400. sage/sat/solvers/satsolver.pyx +405 -0
@@ -0,0 +1,784 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ r"""
3
+ Six vertex model
4
+ """
5
+
6
+ from sage.structure.parent import Parent
7
+ from sage.structure.unique_representation import UniqueRepresentation
8
+ from sage.structure.list_clone import ClonableArray
9
+ from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
10
+ from sage.combinat.combinatorial_map import combinatorial_map
11
+
12
+
13
+ class SixVertexConfiguration(ClonableArray):
14
+ """
15
+ A configuration in the six vertex model.
16
+ """
17
+
18
+ def check(self):
19
+ """
20
+ Check if ``self`` is a valid 6 vertex configuration.
21
+
22
+ EXAMPLES::
23
+
24
+ sage: M = SixVertexModel(3, boundary_conditions='ice')
25
+ sage: M[0].check()
26
+ """
27
+ if self not in self.parent():
28
+ raise ValueError("invalid configuration")
29
+
30
+ def _repr_(self):
31
+ """
32
+ Return a string representation of ``self``.
33
+
34
+ EXAMPLES::
35
+
36
+ sage: M = SixVertexModel(3, boundary_conditions='ice')
37
+ sage: M[0]
38
+ ^ ^ ^
39
+ | | |
40
+ --> # <- # <- # <--
41
+ | ^ ^
42
+ V | |
43
+ --> # -> # <- # <--
44
+ | | ^
45
+ V V |
46
+ --> # -> # -> # <--
47
+ | | |
48
+ V V V
49
+ """
50
+ # List are in the order of URDL
51
+ ascii = [[r' V ', ' -', r' ^ ', '- '], # LR
52
+ [r' | ', ' <', r' ^ ', '- '], # LU
53
+ [r' V ', ' <', r' | ', '- '], # LD
54
+ [r' | ', ' <', r' | ', '> '], # UD
55
+ [r' | ', ' -', r' ^ ', '> '], # UR
56
+ [r' V ', ' -', r' | ', '> ']] # RD
57
+ ret = ' '
58
+ # Do the top line
59
+ for entry in self[0]:
60
+ if entry == 1 or entry == 3 or entry == 4:
61
+ ret += ' ^ '
62
+ else:
63
+ ret += ' | '
64
+
65
+ # Do the meat of the ascii art
66
+ for row in self:
67
+ ret += '\n '
68
+ # Do the top row
69
+ for entry in row:
70
+ ret += ascii[entry][0]
71
+ ret += '\n'
72
+
73
+ # Do the left-most entry
74
+ if row[0] == 0 or row[0] == 1 or row[0] == 2:
75
+ ret += '<-'
76
+ else:
77
+ ret += '--'
78
+
79
+ # Do the middle row
80
+ for entry in row:
81
+ ret += ascii[entry][3] + '#' + ascii[entry][1]
82
+
83
+ # Do the right-most entry
84
+ if row[-1] == 0 or row[-1] == 4 or row[-1] == 5:
85
+ ret += '->'
86
+ else:
87
+ ret += '--'
88
+
89
+ # Do the bottom row
90
+ ret += '\n '
91
+ for entry in row:
92
+ ret += ascii[entry][2]
93
+
94
+ # Do the bottom line
95
+ ret += '\n '
96
+ for entry in self[-1]:
97
+ if entry == 2 or entry == 3 or entry == 5:
98
+ ret += ' V '
99
+ else:
100
+ ret += ' | '
101
+
102
+ return ret
103
+
104
+ def to_signed_matrix(self):
105
+ """
106
+ Return the signed matrix of ``self``.
107
+
108
+ The signed matrix corresponding to a six vertex configuration is
109
+ given by `0` if there is a cross flow, a `1` if the outward arrows
110
+ are vertical and `-1` if the outward arrows are horizontal.
111
+
112
+ EXAMPLES::
113
+
114
+ sage: M = SixVertexModel(3, boundary_conditions='ice')
115
+ sage: [x.to_signed_matrix() for x in M] # needs sage.modules
116
+ [
117
+ [1 0 0] [1 0 0] [ 0 1 0] [0 1 0] [0 1 0] [0 0 1] [0 0 1]
118
+ [0 1 0] [0 0 1] [ 1 -1 1] [1 0 0] [0 0 1] [1 0 0] [0 1 0]
119
+ [0 0 1], [0 1 0], [ 0 1 0], [0 0 1], [1 0 0], [0 1 0], [1 0 0]
120
+ ]
121
+ """
122
+ from sage.matrix.constructor import matrix
123
+ # verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
124
+
125
+ def matrix_sign(x):
126
+ if x == 0:
127
+ return -1
128
+ if x == 3:
129
+ return 1
130
+ return 0
131
+ return matrix([[matrix_sign(r) for r in row] for row in self])
132
+
133
+ def plot(self, color='sign'):
134
+ """
135
+ Return a plot of ``self``.
136
+
137
+ INPUT:
138
+
139
+ - ``color`` -- can be any of the following:
140
+
141
+ * ``4`` -- use 4 colors: black, red, blue, and green with each
142
+ corresponding to up, right, down, and left respectively
143
+ * ``2`` -- use 2 colors: red for horizontal, blue for vertical arrows
144
+ * ``'sign'`` -- use red for right and down arrows, blue for left
145
+ and up arrows
146
+ * a list of 4 colors for each direction
147
+ * a function which takes a direction and a boolean corresponding
148
+ to the sign
149
+
150
+ EXAMPLES::
151
+
152
+ sage: M = SixVertexModel(2, boundary_conditions='ice')
153
+ sage: print(M[0].plot().description()) # needs sage.plot
154
+ Arrow from (-1.0,0.0) to (0.0,0.0)
155
+ Arrow from (-1.0,1.0) to (0.0,1.0)
156
+ Arrow from (0.0,0.0) to (0.0,-1.0)
157
+ Arrow from (0.0,0.0) to (1.0,0.0)
158
+ Arrow from (0.0,1.0) to (0.0,0.0)
159
+ Arrow from (0.0,1.0) to (0.0,2.0)
160
+ Arrow from (1.0,0.0) to (1.0,-1.0)
161
+ Arrow from (1.0,0.0) to (1.0,1.0)
162
+ Arrow from (1.0,1.0) to (0.0,1.0)
163
+ Arrow from (1.0,1.0) to (1.0,2.0)
164
+ Arrow from (2.0,0.0) to (1.0,0.0)
165
+ Arrow from (2.0,1.0) to (1.0,1.0)
166
+ """
167
+ from sage.plot.graphics import Graphics
168
+ from sage.plot.arrow import arrow
169
+
170
+ if color == 4:
171
+ color_list = ['black', 'red', 'blue', 'green']
172
+ cfunc = lambda d,pm: color_list[d]
173
+ elif color == 2:
174
+ cfunc = lambda d,pm: 'red' if d % 2 == 0 else 'blue'
175
+ elif color == 1 or color is None:
176
+ cfunc = lambda d,pm: 'black'
177
+ elif color == 'sign':
178
+ cfunc = lambda d,pm: 'red' if pm else 'blue' # RD are True
179
+ elif isinstance(color, (list, tuple)):
180
+ cfunc = lambda d,pm: color[d]
181
+ else:
182
+ cfunc = color
183
+
184
+ G = Graphics()
185
+ for j,row in enumerate(reversed(self)):
186
+ for i,entry in enumerate(row):
187
+ if entry == 0: # LR
188
+ G += arrow((i,j+1), (i,j), color=cfunc(2, True))
189
+ G += arrow((i,j), (i+1,j), color=cfunc(1, True))
190
+ if j == 0:
191
+ G += arrow((i,j-1), (i,j), color=cfunc(0, False))
192
+ if i == 0:
193
+ G += arrow((i,j), (i-1,j), color=cfunc(3, False))
194
+ elif entry == 1: # LU
195
+ G += arrow((i,j), (i,j+1), color=cfunc(0, False))
196
+ G += arrow((i+1,j), (i,j), color=cfunc(3, False))
197
+ if j == 0:
198
+ G += arrow((i,j-1), (i,j), color=cfunc(0, False))
199
+ if i == 0:
200
+ G += arrow((i,j), (i-1,j), color=cfunc(3, False))
201
+ elif entry == 2: # LD
202
+ G += arrow((i,j+1), (i,j), color=cfunc(2, True))
203
+ G += arrow((i+1,j), (i,j), color=cfunc(3, False))
204
+ if j == 0:
205
+ G += arrow((i,j), (i,j-1), color=cfunc(2, True))
206
+ if i == 0:
207
+ G += arrow((i,j), (i-1,j), color=cfunc(3, False))
208
+ elif entry == 3: # UD
209
+ G += arrow((i,j), (i,j+1), color=cfunc(0, False))
210
+ G += arrow((i+1,j), (i,j), color=cfunc(3, False))
211
+ if j == 0:
212
+ G += arrow((i,j), (i,j-1), color=cfunc(2, True))
213
+ if i == 0:
214
+ G += arrow((i-1,j), (i,j), color=cfunc(1, True))
215
+ elif entry == 4: # UR
216
+ G += arrow((i,j), (i,j+1), color=cfunc(0, False))
217
+ G += arrow((i,j), (i+1,j), color=cfunc(1, True))
218
+ if j == 0:
219
+ G += arrow((i,j-1), (i,j), color=cfunc(0, False))
220
+ if i == 0:
221
+ G += arrow((i-1,j), (i,j), color=cfunc(1, True))
222
+ elif entry == 5: # RD
223
+ G += arrow((i,j+1), (i,j), color=cfunc(2, True))
224
+ G += arrow((i,j), (i+1,j), color=cfunc(1, True))
225
+ if j == 0:
226
+ G += arrow((i,j), (i,j-1), color=cfunc(2, True))
227
+ if i == 0:
228
+ G += arrow((i-1,j), (i,j), color=cfunc(1, True))
229
+ G.axes(False)
230
+ return G
231
+
232
+ def energy(self, epsilon):
233
+ r"""
234
+ Return the energy of the configuration.
235
+
236
+ The energy of a configuration `\nu` is defined as
237
+
238
+ .. MATH::
239
+
240
+ E(\nu) = n_0 \epsilon_0 + n_1 \epsilon_1 + \cdots + n_5 \epsilon_5
241
+
242
+ where `n_i` is the number of vertices of type `i` and
243
+ `\epsilon_i` is the `i`-th energy constant.
244
+
245
+ .. NOTE::
246
+
247
+ We number our configurations as:
248
+
249
+ 0. LR
250
+ 1. LU
251
+ 2. LD
252
+ 3. UD
253
+ 4. UR
254
+ 5. RD
255
+
256
+ which differs from :wikipedia:`Ice-type_model`.
257
+
258
+ EXAMPLES::
259
+
260
+ sage: M = SixVertexModel(3, boundary_conditions='ice')
261
+ sage: nu = M[2]; nu
262
+ ^ ^ ^
263
+ | | |
264
+ --> # -> # <- # <--
265
+ ^ | ^
266
+ | V |
267
+ --> # <- # -> # <--
268
+ | ^ |
269
+ V | V
270
+ --> # -> # <- # <--
271
+ | | |
272
+ V V V
273
+ sage: nu.energy([1,2,1,2,1,2])
274
+ 15
275
+
276
+ A KDP energy::
277
+
278
+ sage: nu.energy([1,1,0,1,0,1])
279
+ 7
280
+
281
+ A Rys `F` energy::
282
+
283
+ sage: nu.energy([0,1,1,0,1,1])
284
+ 4
285
+
286
+ The zero field assumption::
287
+
288
+ sage: nu.energy([1,2,3,1,3,2])
289
+ 15
290
+ """
291
+ if len(epsilon) != 6:
292
+ raise ValueError("there must be 6 energy constants")
293
+ return sum(epsilon[entry] for row in self for entry in row)
294
+
295
+
296
+ class SixVertexModel(UniqueRepresentation, Parent):
297
+ """
298
+ The six vertex model.
299
+
300
+ We model a configuration by indicating which configuration by the
301
+ following six configurations which are determined by the two outgoing
302
+ arrows in the Up, Right, Down, Left directions:
303
+
304
+ 1. LR::
305
+
306
+ |
307
+ V
308
+ <-- # -->
309
+ ^
310
+ |
311
+
312
+ 2. LU::
313
+
314
+ ^
315
+ |
316
+ <-- # <--
317
+ ^
318
+ |
319
+
320
+ 3. LD::
321
+
322
+ |
323
+ V
324
+ <-- # <--
325
+ |
326
+ V
327
+
328
+ 4. UD::
329
+
330
+ ^
331
+ |
332
+ --> # <--
333
+ |
334
+ V
335
+
336
+ 5. UR::
337
+
338
+ ^
339
+ |
340
+ --> # -->
341
+ ^
342
+ |
343
+ 6. RD::
344
+
345
+ |
346
+ V
347
+ --> # -->
348
+ |
349
+ V
350
+
351
+ INPUT:
352
+
353
+ - ``n`` -- the number of rows
354
+ - ``m`` -- (optional) the number of columns, if not specified, then
355
+ the number of columns is the number of rows
356
+ - ``boundary_conditions`` -- (optional) a quadruple of tuples whose
357
+ entries are either:
358
+
359
+ * ``True`` for an inward arrow,
360
+ * ``False`` for an outward arrow, or
361
+ * ``None`` for no boundary condition.
362
+
363
+ There are also the following predefined boundary conditions:
364
+
365
+ * ``'ice'`` -- the top and bottom boundary conditions are outward and the
366
+ left and right boundary conditions are inward; this gives the square
367
+ ice model. Also called domain wall boundary conditions.
368
+ * ``'domain wall'`` -- same as ``'ice'``.
369
+ * ``'alternating'`` -- the boundary conditions alternate between inward
370
+ and outward.
371
+ * ``'free'`` -- there are no boundary conditions.
372
+
373
+ EXAMPLES:
374
+
375
+ Here are the six types of vertices that can be created::
376
+
377
+ sage: M = SixVertexModel(1)
378
+ sage: list(M)
379
+ [
380
+ | ^ | ^ ^ |
381
+ V | V | | V
382
+ <-- # --> <-- # <-- <-- # <-- --> # <-- --> # --> --> # -->
383
+ ^ ^ | | ^ |
384
+ | , | , V , V , | , V
385
+ ]
386
+
387
+ When using the square ice model, it is known that the number of
388
+ configurations is equal to the number of alternating sign matrices::
389
+
390
+ sage: M = SixVertexModel(1, boundary_conditions='ice')
391
+ sage: len(M)
392
+ 1
393
+ sage: M = SixVertexModel(4, boundary_conditions='ice')
394
+ sage: len(M)
395
+ 42
396
+ sage: all(len(SixVertexModel(n, boundary_conditions='ice')) # needs sage.modules
397
+ ....: == AlternatingSignMatrices(n).cardinality() for n in range(1, 7))
398
+ True
399
+
400
+ An example with a specified non-standard boundary condition and
401
+ non-rectangular shape::
402
+
403
+ sage: M = SixVertexModel(2, 1, [[None], [True,True], [None], [None,None]])
404
+ sage: list(M)
405
+ [
406
+ ^ ^ | ^
407
+ | | V |
408
+ <-- # <-- <-- # <-- <-- # <-- --> # <--
409
+ ^ ^ | |
410
+ | | V V
411
+ <-- # <-- --> # <-- <-- # <-- <-- # <--
412
+ ^ | | |
413
+ | , V , V , V
414
+ ]
415
+
416
+ REFERENCES:
417
+
418
+ - :wikipedia:`Vertex_model`
419
+ - :wikipedia:`Ice-type_model`
420
+ """
421
+ @staticmethod
422
+ def __classcall_private__(cls, n, m=None, boundary_conditions=None):
423
+ """
424
+ Normalize input to ensure a unique representation.
425
+
426
+ EXAMPLES::
427
+
428
+ sage: M1 = SixVertexModel(1, boundary_conditions=[[False],[True],[False],[True]])
429
+ sage: M2 = SixVertexModel(1, 1, ((False,),(True,),(False,),(True,)))
430
+ sage: M1 is M2
431
+ True
432
+ """
433
+ if m is None:
434
+ m = n
435
+ if boundary_conditions is None or boundary_conditions == 'free':
436
+ boundary_conditions = ((None,)*m, (None,)*n)*2
437
+ elif boundary_conditions == 'alternating':
438
+ bdry = True
439
+ cond = []
440
+ for dummy in range(2):
441
+ val = []
442
+ for _ in range(m):
443
+ val.append(bdry)
444
+ bdry = not bdry
445
+ cond.append(tuple(val))
446
+ val = []
447
+ for k in range(n):
448
+ val.append(bdry)
449
+ bdry = not bdry
450
+ cond.append(tuple(val))
451
+ boundary_conditions = tuple(cond)
452
+ elif boundary_conditions == 'ice' or boundary_conditions == 'domain wall':
453
+ if m == n:
454
+ return SquareIceModel(n)
455
+ boundary_conditions = ((False,)*m, (True,)*n)*2
456
+ else:
457
+ boundary_conditions = tuple(tuple(x) for x in boundary_conditions)
458
+ return super().__classcall__(cls, n, m, boundary_conditions)
459
+
460
+ def __init__(self, n, m, boundary_conditions):
461
+ """
462
+ Initialize ``self``.
463
+
464
+ EXAMPLES::
465
+
466
+ sage: M = SixVertexModel(2, boundary_conditions='ice')
467
+ sage: TestSuite(M).run()
468
+ """
469
+ self._nrows = n
470
+ self._ncols = m
471
+ self._bdry_cond = boundary_conditions # Ordered URDL
472
+ Parent.__init__(self, category=FiniteEnumeratedSets())
473
+
474
+ def _repr_(self):
475
+ """
476
+ Return a string representation of ``self``.
477
+
478
+ EXAMPLES::
479
+
480
+ sage: SixVertexModel(2, boundary_conditions='ice')
481
+ The six vertex model on a 2 by 2 grid
482
+ """
483
+ return "The six vertex model on a {} by {} grid".format(self._nrows, self._ncols)
484
+
485
+ def _repr_option(self, key):
486
+ """
487
+ Metadata about the ``_repr_()`` output.
488
+
489
+ See :meth:`sage.structure.parent._repr_option` for details.
490
+
491
+ EXAMPLES::
492
+
493
+ sage: M = SixVertexModel(2, boundary_conditions='ice')
494
+ sage: M._repr_option('element_ascii_art')
495
+ True
496
+ """
497
+ if key == 'element_ascii_art':
498
+ return True
499
+ return Parent._repr_option(self, key)
500
+
501
+ def _element_constructor_(self, x):
502
+ """
503
+ Construct an element of ``self``.
504
+
505
+ EXAMPLES::
506
+
507
+ sage: M = SixVertexModel(2, boundary_conditions='ice')
508
+ sage: M([[3,1],[5,3]])
509
+ ^ ^
510
+ | |
511
+ --> # <- # <--
512
+ | ^
513
+ V |
514
+ --> # -> # <--
515
+ | |
516
+ V V
517
+ """
518
+ if isinstance(x, SixVertexConfiguration):
519
+ if x.parent() is not self:
520
+ return self.element_class(self, tuple(x))
521
+ return x
522
+
523
+ verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
524
+ elt = []
525
+ for row in x:
526
+ elt.append([])
527
+ for entry in row:
528
+ if entry in verts:
529
+ elt[-1].append(verts.index(entry))
530
+ elif entry in range(6):
531
+ elt[-1].append(entry)
532
+ else:
533
+ raise ValueError("invalid entry")
534
+ elt[-1] = tuple(elt[-1])
535
+ return self.element_class(self, tuple(elt))
536
+
537
+ Element = SixVertexConfiguration
538
+
539
+ def __iter__(self):
540
+ """
541
+ Iterate through ``self``.
542
+
543
+ EXAMPLES::
544
+
545
+ sage: M = SixVertexModel(2, boundary_conditions='ice')
546
+ sage: list(M)
547
+ [
548
+ ^ ^ ^ ^
549
+ | | | |
550
+ --> # <- # <-- --> # -> # <--
551
+ | ^ ^ |
552
+ V | | V
553
+ --> # -> # <-- --> # <- # <--
554
+ | | | |
555
+ V V , V V
556
+ ]
557
+ """
558
+ # Boundary conditions ordered URDL
559
+ # The top row boundary condition of True is a downward arrow
560
+ # The left condition of True is a right arrow
561
+ # verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
562
+ next_top = [False, False, True, True, False, True]
563
+ next_left = [True, False, False, False, True, True]
564
+ check_top = [True, False, True, False, False, True]
565
+ check_left = [False, False, False, True, True, True]
566
+
567
+ bdry = [self._bdry_cond[0]]
568
+ lbd = list(self._bdry_cond[3]) + [None] # Dummy
569
+ left = [[lbd[0]]]
570
+ cur = [[-1]]
571
+ n = self._nrows
572
+ m = self._ncols
573
+ # [[3, 1], [5, 3]]
574
+ # [[4, 3], [3, 2]]
575
+
576
+ while cur:
577
+ # If we're at the last row
578
+ if len(cur) > n:
579
+ cur.pop()
580
+ left.pop()
581
+ # Check if all our bottom boundary conditions are satisfied
582
+ if all(x is not self._bdry_cond[2][i]
583
+ for i, x in enumerate(bdry[-1])):
584
+ yield self.element_class(self, tuple(tuple(x) for x in cur))
585
+ bdry.pop()
586
+
587
+ # Find the next row
588
+ row = cur[-1]
589
+ l = left[-1]
590
+ i = len(cur) - 1
591
+ while row:
592
+ row[-1] += 1
593
+ # Check to see if we have more vertices
594
+ if row[-1] > 5:
595
+ row.pop()
596
+ l.pop()
597
+ continue
598
+ # Check to see if we can add the vertex
599
+ if (check_left[row[-1]] is l[-1] or l[-1] is None) \
600
+ and (check_top[row[-1]] is bdry[-1][len(row)-1]
601
+ or bdry[-1][len(row)-1] is None):
602
+ if len(row) != m:
603
+ l.append(next_left[row[-1]])
604
+ row.append(-1)
605
+ # Check the right bdry condition since we are at the rightmost entry
606
+ elif next_left[row[-1]] is not self._bdry_cond[1][i]:
607
+ bdry.append([next_top[x] for x in row])
608
+ cur.append([-1])
609
+ left.append([lbd[i+1]])
610
+ break
611
+
612
+ # If we've killed this row, backup
613
+ if len(row) == 0:
614
+ cur.pop()
615
+ bdry.pop()
616
+ left.pop()
617
+
618
+ def boundary_conditions(self):
619
+ """
620
+ Return the boundary conditions of ``self``.
621
+
622
+ EXAMPLES::
623
+
624
+ sage: M = SixVertexModel(2, boundary_conditions='ice')
625
+ sage: M.boundary_conditions()
626
+ ((False, False), (True, True), (False, False), (True, True))
627
+ """
628
+ return self._bdry_cond
629
+
630
+ def partition_function(self, beta, epsilon):
631
+ r"""
632
+ Return the partition function of ``self``.
633
+
634
+ The partition function of a 6 vertex model is defined by:
635
+
636
+ .. MATH::
637
+
638
+ Z = \sum_{\nu} e^{-\beta E(\nu)}
639
+
640
+ where we sum over all configurations and `E` is the energy function.
641
+ The constant `\beta` is known as the *inverse temperature* and is
642
+ equal to `1 / k_B T` where `k_B` is Boltzmann's constant and `T` is
643
+ the system's temperature.
644
+
645
+ INPUT:
646
+
647
+ - ``beta`` -- the inverse temperature constant `\beta`
648
+ - ``epsilon`` -- the energy constants, see
649
+ :meth:`~sage.combinat.six_vertex_model.SixVertexConfiguration.energy()`
650
+
651
+ EXAMPLES::
652
+
653
+ sage: M = SixVertexModel(3, boundary_conditions='ice')
654
+ sage: M.partition_function(2, [1,2,1,2,1,2]) # needs sage.symbolic
655
+ e^(-24) + 2*e^(-28) + e^(-30) + 2*e^(-32) + e^(-36)
656
+
657
+ REFERENCES:
658
+
659
+ :wikipedia:`Partition_function_(statistical_mechanics)`
660
+ """
661
+ from sage.functions.log import exp
662
+ return sum(exp(-beta * nu.energy(epsilon)) for nu in self)
663
+
664
+
665
+ class SquareIceModel(SixVertexModel):
666
+ r"""
667
+ The square ice model.
668
+
669
+ The square ice model is a 6 vertex model on an `n \times n` grid with
670
+ the boundary conditions that the top and bottom boundaries are pointing
671
+ outward and the left and right boundaries are pointing inward. These
672
+ boundary conditions are also called domain wall boundary conditions.
673
+
674
+ Configurations of the 6 vertex model with domain wall boundary conditions
675
+ are in bijection with alternating sign matrices.
676
+ """
677
+
678
+ def __init__(self, n):
679
+ """
680
+ Initialize ``self``.
681
+
682
+ EXAMPLES::
683
+
684
+ sage: M = SixVertexModel(3, boundary_conditions='ice')
685
+ sage: TestSuite(M).run()
686
+ """
687
+ boundary_conditions = ((False,)*n, (True,)*n)*2
688
+ SixVertexModel.__init__(self, n, n, boundary_conditions)
689
+
690
+ def from_alternating_sign_matrix(self, asm):
691
+ """
692
+ Return a configuration from the alternating sign matrix ``asm``.
693
+
694
+ EXAMPLES::
695
+
696
+ sage: M = SixVertexModel(3, boundary_conditions='ice')
697
+ sage: asm = AlternatingSignMatrix([[0,1,0],[1,-1,1],[0,1,0]]) # needs sage.modules
698
+ sage: M.from_alternating_sign_matrix(asm) # needs sage.modules
699
+ ^ ^ ^
700
+ | | |
701
+ --> # -> # <- # <--
702
+ ^ | ^
703
+ | V |
704
+ --> # <- # -> # <--
705
+ | ^ |
706
+ V | V
707
+ --> # -> # <- # <--
708
+ | | |
709
+ V V V
710
+
711
+ TESTS::
712
+
713
+ sage: M = SixVertexModel(5, boundary_conditions='ice')
714
+ sage: ASM = AlternatingSignMatrices(5) # needs sage.modules
715
+ sage: all(M.from_alternating_sign_matrix(x.to_alternating_sign_matrix()) == x # needs sage.modules
716
+ ....: for x in M)
717
+ True
718
+ sage: all(M.from_alternating_sign_matrix(x).to_alternating_sign_matrix() == x # needs sage.modules
719
+ ....: for x in ASM)
720
+ True
721
+ """
722
+ if asm.parent().size() != self._nrows:
723
+ raise ValueError("mismatched size")
724
+
725
+ #verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
726
+ ret = []
727
+ bdry = [False]*self._nrows # False = up
728
+ for row in asm.to_matrix():
729
+ cur = []
730
+ right = True # True = right
731
+ for j,entry in enumerate(row):
732
+ if entry == -1:
733
+ cur.append(0)
734
+ right = True
735
+ bdry[j] = False
736
+ elif entry == 1:
737
+ cur.append(3)
738
+ right = False
739
+ bdry[j] = True
740
+ else: # entry == 0
741
+ if bdry[j]:
742
+ if right:
743
+ cur.append(5)
744
+ else:
745
+ cur.append(2)
746
+ else:
747
+ if right:
748
+ cur.append(4)
749
+ else:
750
+ cur.append(1)
751
+ ret.append(tuple(cur))
752
+ return self.element_class(self, tuple(ret))
753
+
754
+ class Element(SixVertexConfiguration):
755
+ """
756
+ An element in the square ice model.
757
+ """
758
+ @combinatorial_map(name='to alternating sign matrix')
759
+ def to_alternating_sign_matrix(self):
760
+ """
761
+ Return an alternating sign matrix of ``self``.
762
+
763
+ .. SEEALSO::
764
+
765
+ :meth:`~sage.combinat.six_vertex_model.SixVertexConfiguration.to_signed_matrix()`
766
+
767
+ EXAMPLES::
768
+
769
+ sage: M = SixVertexModel(4, boundary_conditions='ice')
770
+ sage: M[6].to_alternating_sign_matrix() # needs sage.modules
771
+ [1 0 0 0]
772
+ [0 0 0 1]
773
+ [0 0 1 0]
774
+ [0 1 0 0]
775
+ sage: M[7].to_alternating_sign_matrix() # needs sage.modules
776
+ [ 0 1 0 0]
777
+ [ 1 -1 1 0]
778
+ [ 0 1 -1 1]
779
+ [ 0 0 1 0]
780
+ """
781
+ from sage.combinat.alternating_sign_matrix import AlternatingSignMatrix # AlternatingSignMatrices
782
+ # ASM = AlternatingSignMatrices(self.parent()._nrows)
783
+ # return ASM(self.to_signed_matrix())
784
+ return AlternatingSignMatrix(self.to_signed_matrix())