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,420 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ Virtual crystals
5
+
6
+ These are the crystals that are subsets of a larger ambient crystal with
7
+ virtual crystal operators.
8
+
9
+ AUTHORS:
10
+
11
+ - Travis Scrimshaw (2013-10-16): initial implementation
12
+ """
13
+
14
+ #*****************************************************************************
15
+ # Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
16
+ #
17
+ # Distributed under the terms of the GNU General Public License (GPL)
18
+ #
19
+ # This code is distributed in the hope that it will be useful,
20
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22
+ # General Public License for more details.
23
+ #
24
+ # The full text of the GPL is available at:
25
+ #
26
+ # http://www.gnu.org/licenses/
27
+ #****************************************************************************
28
+ from sage.categories.crystals import Crystals
29
+ from sage.categories.finite_crystals import FiniteCrystals
30
+ from sage.combinat.root_system.cartan_type import CartanType
31
+ from sage.combinat.crystals.subcrystal import Subcrystal
32
+ from sage.sets.family import Family
33
+
34
+
35
+ class VirtualCrystal(Subcrystal):
36
+ r"""
37
+ A virtual crystal `V` of an ambient crystal `\widehat{B}` is a crystal
38
+ formed by taking a subset of `\widehat{B}` and whose crystal structure
39
+ is given by
40
+
41
+ .. MATH::
42
+
43
+ e_i = \prod_{j \in \sigma_i} \widehat{e}_j^{\gamma_i}, \quad
44
+ f_i = \prod_{j \in \sigma_i} \widehat{f}_j^{\gamma_i},
45
+
46
+ .. MATH::
47
+
48
+ \varepsilon_i = \frac{\widehat{\varepsilon}_j}{\gamma_j}, \quad
49
+ \varphi_i = \frac{\widehat{\varphi}_j}{\gamma_j}, \quad
50
+ \operatorname{wt} = \Psi^{-1} \circ \widehat{\operatorname{wt}}
51
+
52
+ where `\sigma_i` is a subset of the index set of `B`, `\gamma_i \in \ZZ`
53
+ are the *scaling factors*, and `\Psi : P \to \widehat{P}` is an embedding
54
+ of the weight lattices. We note that for the crystal to be well-defined,
55
+ we must have
56
+
57
+ .. MATH::
58
+
59
+ \widehat{\varepsilon}_j = \widehat{\varepsilon|j^{\prime}},
60
+ \quad \widehat{\varphi}_j = \widehat{\varphi}_{j^{\prime}}
61
+
62
+ for all `j, j^{\prime} \in \sigma_i` and that the order that the Kashiwara
63
+ operators in the ambient space are applied does not affect the result.
64
+
65
+ INPUT:
66
+
67
+ - ``ambient`` -- the ambient crystal
68
+ - ``virtualization`` -- dictionary whose key `i` corresponds
69
+ to the set `\sigma_i`
70
+ - ``scaling_factors`` -- dictionary whose key `i` corresponds to
71
+ the scaling factor `\gamma_i`
72
+ - ``contained`` -- (optional) a set (or function) which specifies when an
73
+ element is contained in the subcrystal; the default is everything
74
+ possible is included
75
+ - ``generators`` -- (optional) the generators for the virtual crystal; the
76
+ default is the generators for the ambient crystal
77
+ - ``cartan_type`` -- (optional) the Cartan type for the virtual crystal;
78
+ the default is the Cartan type for the ambient crystal
79
+ - ``index_set`` -- (optional) the index set for the virtual crystal; the
80
+ default is the index set for the Cartan type
81
+ - ``category`` -- (optional) the category for the virtual crystal; the
82
+ default is the :class:`~sage.categories.crystals.Crystals` category
83
+
84
+ EXAMPLES:
85
+
86
+ We construct an example from a natural virtualization map of type `C_n`
87
+ in type `A_{2n-1}`::
88
+
89
+ sage: C = crystals.Tableaux(['C',2], shape=[1])
90
+ sage: A = crystals.Tableaux(['A',3], shape=[2,1,1])
91
+ sage: psi = C.crystal_morphism(A.module_generators)
92
+ sage: V = psi.image()
93
+ sage: list(V)
94
+ [[[1, 1], [2], [3]],
95
+ [[1, 2], [2], [4]],
96
+ [[1, 3], [3], [4]],
97
+ [[2, 4], [3], [4]]]
98
+ sage: V.digraph().is_isomorphic(C.digraph(), edge_labels=True)
99
+ True
100
+
101
+ We construct the virtualization of a `U_q'(\mathfrak{g})`-crystal
102
+ `B^{r,s}` of type `C_n^{(1)}` in type `A_{2n+1}^{(2)}`. Here it is not
103
+ a default folding known to Sage, so we have to explicitly state the
104
+ folding (since the scaling factors are not specified, they are all
105
+ assumed to be 1)::
106
+
107
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1,1)
108
+ sage: VK = crystals.KirillovReshetikhin(['A',5,2], 1,1)
109
+ sage: target = VK.module_generator().f(1); target
110
+ [[2]]
111
+ sage: psi = K.crystal_morphism({K.module_generator(): target},
112
+ ....: virtualization={0:[0,1], 1:[2], 2:[3]})
113
+ sage: V = psi.image()
114
+ sage: list(V)
115
+ [[[2]], [[3]], [[-2]], [[-3]]]
116
+ sage: V.digraph().is_isomorphic(K.digraph(), edge_labels=True)
117
+ True
118
+
119
+ We create an example of `B(\Lambda_n)` of type `B_n` inside
120
+ of `B(2\Lambda_n)` using the doubling map through the (virtual)
121
+ subcrystal method::
122
+
123
+ sage: BB = crystals.Tableaux(['B',3], shape=[1,1,1])
124
+ sage: S = BB.subcrystal(scaling_factors={1:2, 2:2, 3:2})
125
+ sage: B = crystals.Tableaux(['B',3], shape=[1/2,1/2,1/2])
126
+ sage: S.digraph().is_isomorphic(B.digraph(), edge_labels=True)
127
+ True
128
+
129
+ We can also directly construct a virtual crystal using
130
+ :class:`VirtualCrystal` (however it is recommended to use either
131
+ :meth:`~sage.categories.crystals.Crystals.ParentMethods.crystal_morphism`
132
+ or :meth:`~sage.categories.crystals.Crystals.ParentMethods.subcrystal`)::
133
+
134
+ sage: from sage.combinat.crystals.virtual_crystal import VirtualCrystal
135
+ sage: A = crystals.Tableaux(['A',3], shape=[2,1,1])
136
+ sage: V = VirtualCrystal(A, {1:(1,3), 2:(2,)}, {1:1, 2:2}, cartan_type=['C',2])
137
+ sage: G = crystals.Tableaux(['C',2], shape=[1]).digraph()
138
+ sage: V.digraph().is_isomorphic(G, edge_labels=True)
139
+ True
140
+
141
+ sage: C1 = crystals.Tableaux(['A',3], shape=[1])
142
+ sage: C2 = crystals.Tableaux(['A',3], shape=[1,1,1])
143
+ sage: T = C1.tensor(C2)
144
+ sage: mg = T(C1.module_generators[0], C2.module_generators[0])
145
+ sage: V = VirtualCrystal(A, {1:(1,3), 2:(2,)}, {1:1, 2:2},
146
+ ....: cartan_type=['C',2], generators=[mg])
147
+ sage: V.digraph().is_isomorphic(G, edge_labels=True)
148
+ True
149
+
150
+ REFERENCES:
151
+
152
+ - [FOS2009]_
153
+ - [OSS03]_
154
+ - [OSS2003]_
155
+ """
156
+ @staticmethod
157
+ def __classcall_private__(cls, ambient, virtualization, scaling_factors,
158
+ contained=None, generators=None,
159
+ cartan_type=None, index_set=None, category=None):
160
+ """
161
+ Normalize arguments to ensure a unique representation.
162
+
163
+ EXAMPLES::
164
+
165
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
166
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
167
+ sage: psi1 = B.crystal_morphism(C.module_generators)
168
+ sage: V1 = psi1.image()
169
+ sage: psi2 = B.crystal_morphism(C.module_generators, index_set=[1,2,3])
170
+ sage: V2 = psi2.image()
171
+ sage: V1 is V2
172
+ True
173
+
174
+ TESTS:
175
+
176
+ Check that :issue:`19481` is fixed::
177
+
178
+ sage: from sage.combinat.crystals.virtual_crystal import VirtualCrystal
179
+ sage: A = crystals.Tableaux(['A',3], shape=[2,1,1])
180
+ sage: V = VirtualCrystal(A, {1:(1,3), 2:(2,)}, {1:1, 2:2}, cartan_type=['C',2])
181
+ sage: V.category()
182
+ Category of finite crystals
183
+ """
184
+ if cartan_type is None:
185
+ cartan_type = ambient.cartan_type()
186
+ else:
187
+ cartan_type = CartanType(cartan_type)
188
+ if index_set is None:
189
+ index_set = cartan_type.index_set()
190
+ if generators is None:
191
+ generators = ambient.module_generators
192
+ virtualization = Family(virtualization)
193
+ scaling_factors = Family(scaling_factors)
194
+
195
+ category = Crystals().or_subcategory(category)
196
+ if ambient in FiniteCrystals() or isinstance(contained, frozenset):
197
+ category = category.Finite()
198
+
199
+ return super().__classcall__(cls, ambient, virtualization,
200
+ scaling_factors, contained,
201
+ tuple(generators), cartan_type,
202
+ tuple(index_set), category)
203
+
204
+ def __init__(self, ambient, virtualization, scaling_factors,
205
+ contained, generators, cartan_type, index_set, category):
206
+ """
207
+ Initialize ``self``.
208
+
209
+ EXAMPLES::
210
+
211
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
212
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
213
+ sage: psi = B.crystal_morphism(C.module_generators)
214
+ sage: V = psi.image()
215
+ sage: TestSuite(V).run()
216
+ """
217
+ self._virtualization = virtualization
218
+ self._scaling_factors = scaling_factors
219
+ Subcrystal.__init__(self, ambient, contained, generators,
220
+ cartan_type, index_set, category)
221
+
222
+ def _repr_(self):
223
+ """
224
+ Return a string representation of ``self``.
225
+
226
+ EXAMPLES::
227
+
228
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
229
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
230
+ sage: psi = B.crystal_morphism(C.module_generators)
231
+ sage: psi.image()
232
+ Virtual crystal of The crystal of tableaux of type ['D', 4] and shape(s) [[2]] of type ['B', 3]
233
+ """
234
+ return "Virtual crystal of {} of type {}".format(self._ambient, self._cartan_type)
235
+
236
+ def __contains__(self, x):
237
+ """
238
+ Check if ``x`` is in ``self``.
239
+
240
+ EXAMPLES::
241
+
242
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
243
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
244
+ sage: psi = B.crystal_morphism(C.module_generators)
245
+ sage: V = psi.image()
246
+ sage: mg = C.module_generators[0]
247
+ sage: mg in V
248
+ True
249
+ sage: mg.f(1) in V
250
+ False
251
+ sage: mg.f(1).f(1) in V
252
+ True
253
+ """
254
+ if not Subcrystal.__contains__(self, x):
255
+ return False
256
+ if self in FiniteCrystals():
257
+ if isinstance(x, self._ambient.element_class):
258
+ if x.parent() == self:
259
+ x = self.element_class(self, self._ambient(x))
260
+ elif x.parent() == self._ambient:
261
+ x = self.element_class(self, self._ambient(x))
262
+ elif isinstance(x, self.element_class) and x.parent() != self:
263
+ x = self.element_class(self, x.value)
264
+ return x in self.list()
265
+ return True
266
+
267
+ def virtualization(self):
268
+ r"""
269
+ Return the virtualization sets `\sigma_i`.
270
+
271
+ EXAMPLES::
272
+
273
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
274
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
275
+ sage: psi = B.crystal_morphism(C.module_generators)
276
+ sage: V = psi.image()
277
+ sage: V.virtualization()
278
+ Finite family {1: (1,), 2: (2,), 3: (3, 4)}
279
+ """
280
+ return self._virtualization
281
+
282
+ def scaling_factors(self):
283
+ r"""
284
+ Return the scaling factors `\gamma_i`.
285
+
286
+ EXAMPLES::
287
+
288
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
289
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
290
+ sage: psi = B.crystal_morphism(C.module_generators)
291
+ sage: V = psi.image()
292
+ sage: V.scaling_factors()
293
+ Finite family {1: 2, 2: 2, 3: 1}
294
+ """
295
+ return self._scaling_factors
296
+
297
+ class Element(Subcrystal.Element):
298
+ """
299
+ An element of a virtual (sub)crystal. Wraps an element in the
300
+ ambient crystal.
301
+ """
302
+
303
+ def e(self, i):
304
+ """
305
+ Return `e_i` of ``self``.
306
+
307
+ EXAMPLES::
308
+
309
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
310
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
311
+ sage: psi = B.crystal_morphism(C.module_generators)
312
+ sage: V = psi.image()
313
+ sage: mg = V.module_generators[0]
314
+ sage: mg.e(1)
315
+ sage: b = psi(B.module_generators[0].f(1))
316
+ sage: V(b).e(1)
317
+ [[1, 1]]
318
+ """
319
+ s = []
320
+ P = self.parent()
321
+ sf = P._scaling_factors[i]
322
+ for j in P._virtualization[i]:
323
+ s += [j]*sf
324
+ ret = self.value.e_string(s)
325
+ if ret is None:
326
+ return None
327
+ return self.__class__(P, ret)
328
+
329
+ def f(self, i):
330
+ """
331
+ Return `f_i` of ``self``.
332
+
333
+ EXAMPLES::
334
+
335
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
336
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
337
+ sage: psi = B.crystal_morphism(C.module_generators)
338
+ sage: V = psi.image()
339
+ sage: mg = V.module_generators[0]
340
+ sage: mg.f(1)
341
+ [[2, 2]]
342
+ sage: mg.f(2)
343
+ """
344
+ s = []
345
+ P = self.parent()
346
+ sf = P._scaling_factors[i]
347
+ for j in P._virtualization[i]:
348
+ s += [j]*sf
349
+ ret = self.value.f_string(s)
350
+ if ret is None:
351
+ return None
352
+ return self.__class__(P, ret)
353
+
354
+ def epsilon(self, i):
355
+ r"""
356
+ Return `\varepsilon_i` of ``self``.
357
+
358
+ EXAMPLES::
359
+
360
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
361
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
362
+ sage: psi = B.crystal_morphism(C.module_generators)
363
+ sage: V = psi.image()
364
+ sage: mg = V.module_generators[0]
365
+ sage: mg.epsilon(2)
366
+ 0
367
+ sage: mg.f(1).epsilon(1)
368
+ 1
369
+ """
370
+ P = self.parent()
371
+ return self.value.epsilon(P._virtualization[i][0]) // P._scaling_factors[i]
372
+
373
+ def phi(self, i):
374
+ r"""
375
+ Return `\varphi_i` of ``self``.
376
+
377
+ EXAMPLES::
378
+
379
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
380
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
381
+ sage: psi = B.crystal_morphism(C.module_generators)
382
+ sage: V = psi.image()
383
+ sage: mg = V.module_generators[0]
384
+ sage: mg.phi(1)
385
+ 1
386
+ sage: mg.phi(2)
387
+ 0
388
+ """
389
+ P = self.parent()
390
+ return self.value.phi(P._virtualization[i][0]) // P._scaling_factors[i]
391
+
392
+ def weight(self):
393
+ """
394
+ Return the weight of ``self``.
395
+
396
+ EXAMPLES::
397
+
398
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
399
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
400
+ sage: psi = B.crystal_morphism(C.module_generators)
401
+ sage: V = psi.image()
402
+ sage: mg = V.module_generators[0]
403
+ sage: mg.weight()
404
+ (1, 0, 0)
405
+ sage: mg.f(1).weight()
406
+ (0, 1, 0)
407
+ sage: all(V(psi(x)).weight() == x.weight() for x in B)
408
+ True
409
+ """
410
+ P = self.parent()
411
+ WLR = P.weight_lattice_realization()
412
+ wt = self.value.weight()
413
+ ac = P._ambient.weight_lattice_realization().simple_coroots()
414
+ La = WLR.fundamental_weights()
415
+ v = P._virtualization
416
+ sf = P._scaling_factors
417
+ return WLR.sum(wt.scalar(ac[v[i][0]]) // sf[i] * La[i]
418
+ for i in self.index_set())
419
+
420
+ # TODO: implement a devirtualization map
@@ -0,0 +1,204 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ r"""
3
+ Cyclic sieving phenomenon
4
+
5
+ Implementation of the Cyclic Sieving Phenomenon as described by
6
+ Reiner, Stanton, and White in [RSW2004]_.
7
+
8
+ We define the :func:`CyclicSievingPolynomial` of a finite set `S`
9
+ together with cyclic action ``cyc_act`` (of order `n`) to be the
10
+ unique polynomial ``P(q)`` of order < `n` such that the triple (`S`,
11
+ ``cyc_act``, ``P(q)``) exhibits the cyclic sieving phenomenon.
12
+
13
+ AUTHORS:
14
+
15
+ - Christian Stump
16
+
17
+ REFERENCES:
18
+
19
+ .. [RSW2004] Reiner, Stanton, White - *The cyclic sieving phenomenon*,
20
+ Journal of Combinatorial Theory A 108 (2004)
21
+ """
22
+ # ****************************************************************************
23
+ # Copyright (C) 2010 Christian Stump christian.stump@univie.ac.at
24
+ #
25
+ # Distributed under the terms of the GNU General Public License (GPL)
26
+ # https://www.gnu.org/licenses/
27
+ # ****************************************************************************
28
+ from __future__ import annotations
29
+ from sage.rings.integer_ring import ZZ
30
+ from sage.arith.functions import lcm
31
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
32
+
33
+
34
+ def CyclicSievingPolynomial(L, cyc_act=None, order=None, get_order=False):
35
+ """
36
+ Return the unique polynomial ``p`` of degree smaller than ``order`` such
37
+ that the triple ``(L, cyc_act, p)`` exhibits the Cyclic Sieving Phenomenon.
38
+
39
+ If ``cyc_act`` is None, ``L`` is expected to contain the orbit lengths.
40
+
41
+ INPUT:
42
+
43
+ - ``L`` -- if ``cyc_act`` is ``None``: list of orbit sizes,
44
+ otherwise list of objects
45
+
46
+ - ``cyc_act`` -- (default: ``None``) bijective function from ``L`` to ``L``
47
+
48
+ - ``order`` -- (default: ``None``) if set to an integer, this
49
+ cyclic order of ``cyc_act`` is used (must be an integer multiple
50
+ of the order of ``cyc_act``) otherwise, the order of ``cyc_action`` is
51
+ used
52
+
53
+ - ``get_order`` -- (default: ``False``) if ``True``, a tuple ``[p,n]``
54
+ is returned where ``p`` is as above, and ``n`` is the order
55
+
56
+ EXAMPLES::
57
+
58
+ sage: from sage.combinat.cyclic_sieving_phenomenon import CyclicSievingPolynomial
59
+ sage: S42 = Subsets([1,2,3,4], 2)
60
+ sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
61
+ sage: cyc_act([1,3])
62
+ {2, 4}
63
+ sage: cyc_act([1,4])
64
+ {1, 2}
65
+ sage: CyclicSievingPolynomial(S42, cyc_act)
66
+ q^3 + 2*q^2 + q + 2
67
+ sage: CyclicSievingPolynomial(S42, cyc_act, get_order=True)
68
+ [q^3 + 2*q^2 + q + 2, 4]
69
+ sage: CyclicSievingPolynomial(S42, cyc_act, order=8)
70
+ q^6 + 2*q^4 + q^2 + 2
71
+ sage: CyclicSievingPolynomial([4,2])
72
+ q^3 + 2*q^2 + q + 2
73
+
74
+ TESTS:
75
+
76
+ We check that :issue:`13997` is handled::
77
+
78
+ sage: CyclicSievingPolynomial(S42, cyc_act, order=8, get_order=True)
79
+ [q^6 + 2*q^4 + q^2 + 2, 8]
80
+ sage: CyclicSievingPolynomial(S42, cyc_act, order=11)
81
+ Traceback (most recent call last):
82
+ ...
83
+ ValueError: order is not a multiple of the order of the cyclic action
84
+ """
85
+ if cyc_act:
86
+ orbits = orbit_decomposition(L, cyc_act)
87
+ else:
88
+ orbits = [list(range(k)) for k in L]
89
+
90
+ R = PolynomialRing(ZZ, 'q')
91
+ q = R.gen()
92
+ p = R.zero()
93
+
94
+ orbit_sizes = {}
95
+ for orbit in orbits:
96
+ length = len(orbit)
97
+ if length in orbit_sizes:
98
+ orbit_sizes[length] += 1
99
+ else:
100
+ orbit_sizes[length] = 1
101
+
102
+ n = lcm(orbit_sizes)
103
+
104
+ if order:
105
+ if order.mod(n):
106
+ raise ValueError("order is not a multiple of the order"
107
+ " of the cyclic action")
108
+ else:
109
+ order = n
110
+
111
+ for i in range(n):
112
+ if i == 0:
113
+ j = sum(orbit_sizes.values())
114
+ else:
115
+ j = sum(orb for l, orb in orbit_sizes.items()
116
+ if not ZZ(i).mod(n // l))
117
+ p += j * q**i
118
+
119
+ p = p(q**(order // n))
120
+
121
+ return [p, order] if get_order else p
122
+
123
+
124
+ def CyclicSievingCheck(L, cyc_act, f, order=None) -> bool:
125
+ """
126
+ Return whether the triple ``(L, cyc_act, f)`` exhibits
127
+ the cyclic sieving phenomenon.
128
+
129
+ If ``cyc_act`` is None, ``L`` is expected to contain the orbit lengths.
130
+
131
+ INPUT:
132
+
133
+ - ``L`` -- if ``cyc_act`` is ``None``: list of orbit sizes,
134
+ otherwise list of objects
135
+
136
+ - ``cyc_act`` -- (default: ``None``) bijective function from ``L`` to ``L``
137
+
138
+ - ``order`` -- (default: ``None``) if set to an integer, this
139
+ cyclic order of ``cyc_act`` is used (must be an integer
140
+ multiple of the order of ``cyc_act``) otherwise, the order of
141
+ ``cyc_action`` is used
142
+
143
+ EXAMPLES::
144
+
145
+ sage: from sage.combinat.cyclic_sieving_phenomenon import *
146
+ sage: from sage.combinat.q_analogues import q_binomial
147
+ sage: S42 = Subsets([1,2,3,4], 2)
148
+ sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
149
+ sage: cyc_act([1,3])
150
+ {2, 4}
151
+ sage: cyc_act([1,4])
152
+ {1, 2}
153
+ sage: p = q_binomial(4,2); p
154
+ q^4 + q^3 + 2*q^2 + q + 1
155
+ sage: CyclicSievingPolynomial( S42, cyc_act )
156
+ q^3 + 2*q^2 + q + 2
157
+ sage: CyclicSievingCheck( S42, cyc_act, p )
158
+ True
159
+ """
160
+ p1, n = CyclicSievingPolynomial(L, cyc_act=cyc_act, order=order,
161
+ get_order=True)
162
+ R = p1.parent()
163
+ q = R.gen()
164
+ return p1 == R(f).mod(q**n - 1)
165
+
166
+
167
+ def orbit_decomposition(L, cyc_act) -> list[list]:
168
+ """
169
+ Return the orbit decomposition of ``L`` by the action of ``cyc_act``.
170
+
171
+ INPUT:
172
+
173
+ - ``L`` -- list
174
+
175
+ - ``cyc_act`` -- bijective function from ``L`` to ``L``
176
+
177
+ OUTPUT: list of lists, the orbits under the cyc_act acting on ``L``
178
+
179
+ EXAMPLES::
180
+
181
+ sage: from sage.combinat.cyclic_sieving_phenomenon import *
182
+ sage: S42 = Subsets([1,2,3,4], 2); S42
183
+ Subsets of {1, 2, 3, 4} of size 2
184
+ sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
185
+ sage: cyc_act([1,3])
186
+ {2, 4}
187
+ sage: cyc_act([1,4])
188
+ {1, 2}
189
+ sage: orbits = orbit_decomposition(S42, cyc_act)
190
+ sage: sorted([sorted(orb, key=sorted) for orb in orbits], key=len)
191
+ [[{1, 3}, {2, 4}], [{1, 2}, {1, 4}, {2, 3}, {3, 4}]]
192
+ """
193
+ orbits = []
194
+ L_prime = set(L)
195
+ while L_prime:
196
+ obj = L_prime.pop()
197
+ orbit = [obj]
198
+ obj = cyc_act(obj)
199
+ while obj in L_prime:
200
+ orbit.append(obj)
201
+ L_prime.remove(obj)
202
+ obj = cyc_act(obj)
203
+ orbits.append(orbit)
204
+ return orbits