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,756 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ Spin crystals
5
+
6
+ These are the crystals associated with the three spin
7
+ representations: the spin representations of odd orthogonal groups
8
+ (or rather their double covers); and the `+` and `-` spin
9
+ representations of the even orthogonal groups.
10
+
11
+ We follow Kashiwara and Nakashima (Journal of Algebra 165, 1994) in
12
+ representing the elements of the spin crystal by sequences of signs
13
+ `\pm`.
14
+ """
15
+ # TODO: Do we want the following two representations?
16
+ #
17
+ # Two other representations are available as attributes
18
+ #:meth:`Spin.internal_repn` and :meth:`Spin.signature` of the crystal element.
19
+ #
20
+ #- A numerical internal representation, an integer `n` such that if `n-1`
21
+ # is written in binary and the `1`'s are replaced by ``-``, the `0`'s by
22
+ # ``+``
23
+ #
24
+ #- The signature, which is a list in which ``+`` is replaced by `+1` and
25
+ # ``-`` by `-1`.
26
+
27
+
28
+ # ****************************************************************************
29
+ # Copyright (C) 2007 Anne Schilling <anne at math.ucdavis.edu>
30
+ # Nicolas Thiery <nthiery at users.sf.net>
31
+ # Daniel Bump <bump at match.stanford.edu>
32
+ # 2019 Travis Scrimshaw <tcscrims at gmail.com>
33
+ #
34
+ # Distributed under the terms of the GNU General Public License (GPL)
35
+ #
36
+ # This code is distributed in the hope that it will be useful,
37
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
38
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
39
+ # General Public License for more details.
40
+ #
41
+ # The full text of the GPL is available at:
42
+ #
43
+ # https://www.gnu.org/licenses/
44
+ # ***************************************************************************
45
+
46
+ from cpython.object cimport Py_EQ, Py_NE, Py_LE, Py_GE, Py_LT, Py_GT
47
+ from cysignals.memory cimport sig_malloc, sig_free
48
+ from sage.misc.lazy_attribute import lazy_attribute
49
+ from sage.structure.unique_representation import UniqueRepresentation
50
+ from sage.structure.parent cimport Parent
51
+ from sage.structure.element cimport Element, parent
52
+ from sage.categories.classical_crystals import ClassicalCrystals
53
+ from sage.combinat.root_system.cartan_type import CartanType
54
+ from sage.combinat.tableau import Tableau
55
+ from sage.rings.integer_ring import ZZ
56
+ from sage.typeset.ascii_art import AsciiArt
57
+ from sage.typeset.unicode_art import UnicodeArt
58
+
59
+
60
+ #########################
61
+ # Type B spin
62
+ #########################
63
+
64
+ def CrystalOfSpins(ct):
65
+ r"""
66
+ Return the spin crystal of the given type `B`.
67
+
68
+ This is a combinatorial model for the crystal with highest weight
69
+ `\Lambda_n` (the `n`-th fundamental weight). It has
70
+ `2^n` elements, here called Spins. See also
71
+ :func:`~sage.combinat.crystals.letters.CrystalOfLetters`,
72
+ :func:`~sage.combinat.crystals.spins.CrystalOfSpinsPlus`,
73
+ and :func:`~sage.combinat.crystals.spins.CrystalOfSpinsMinus`.
74
+
75
+ INPUT:
76
+
77
+ - ``['B', n]`` -- a Cartan type `B_n`
78
+
79
+ EXAMPLES::
80
+
81
+ sage: C = crystals.Spins(['B',3])
82
+ sage: C.list()
83
+ [+++, ++-, +-+, -++, +--, -+-, --+, ---]
84
+ sage: C.cartan_type()
85
+ ['B', 3]
86
+
87
+ ::
88
+
89
+ sage: [x.signature() for x in C]
90
+ ['+++', '++-', '+-+', '-++', '+--', '-+-', '--+', '---']
91
+
92
+ TESTS::
93
+
94
+ sage: crystals.TensorProduct(C,C,generators=[[C.list()[0],C.list()[0]]]).cardinality()
95
+ 35
96
+ """
97
+ ct = CartanType(ct)
98
+ if ct[0] == 'B':
99
+ return GenericCrystalOfSpins(ct, Spin_crystal_type_B_element, "spins")
100
+ else:
101
+ raise NotImplementedError
102
+
103
+
104
+ #########################
105
+ # Type D spins
106
+ #########################
107
+
108
+ def CrystalOfSpinsPlus(ct):
109
+ r"""
110
+ Return the plus spin crystal of the given type D.
111
+
112
+ This is the crystal with highest weight `\Lambda_n` (the
113
+ `n`-th fundamental weight).
114
+
115
+ INPUT:
116
+
117
+ - ``['D', n]`` -- a Cartan type `D_n`
118
+
119
+ EXAMPLES::
120
+
121
+ sage: D = crystals.SpinsPlus(['D',4])
122
+ sage: D.list()
123
+ [++++, ++--, +-+-, -++-, +--+, -+-+, --++, ----]
124
+
125
+ ::
126
+
127
+ sage: [x.signature() for x in D]
128
+ ['++++', '++--', '+-+-', '-++-', '+--+', '-+-+', '--++', '----']
129
+
130
+ TESTS::
131
+
132
+ sage: TestSuite(D).run()
133
+ """
134
+ ct = CartanType(ct)
135
+ if ct[0] == 'D':
136
+ return GenericCrystalOfSpins(ct, Spin_crystal_type_D_element, "plus")
137
+ else:
138
+ raise NotImplementedError
139
+
140
+
141
+ def CrystalOfSpinsMinus(ct):
142
+ r"""
143
+ Return the minus spin crystal of the given type D.
144
+
145
+ This is the crystal with highest weight `\Lambda_{n-1}`
146
+ (the `(n-1)`-st fundamental weight).
147
+
148
+ INPUT:
149
+
150
+ - ``['D', n]`` -- a Cartan type `D_n`
151
+
152
+ EXAMPLES::
153
+
154
+ sage: E = crystals.SpinsMinus(['D',4])
155
+ sage: E.list()
156
+ [+++-, ++-+, +-++, -+++, +---, -+--, --+-, ---+]
157
+ sage: [x.signature() for x in E]
158
+ ['+++-', '++-+', '+-++', '-+++', '+---', '-+--', '--+-', '---+']
159
+
160
+ TESTS::
161
+
162
+ sage: len(crystals.TensorProduct(E,E,generators=[[E[0],E[0]]]).list())
163
+ 35
164
+ sage: D = crystals.SpinsPlus(['D',4])
165
+ sage: len(crystals.TensorProduct(D,E,generators=[[D.list()[0],E.list()[0]]]).list())
166
+ 56
167
+ """
168
+ ct = CartanType(ct)
169
+ if ct[0] == 'D':
170
+ return GenericCrystalOfSpins(ct, Spin_crystal_type_D_element, "minus")
171
+ else:
172
+ raise NotImplementedError
173
+
174
+
175
+ class GenericCrystalOfSpins(UniqueRepresentation, Parent):
176
+ """
177
+ A generic crystal of spins.
178
+ """
179
+ def __init__(self, ct, element_class, case):
180
+ """
181
+ EXAMPLES::
182
+
183
+ sage: E = crystals.SpinsMinus(['D',4])
184
+ sage: TestSuite(E).run()
185
+ """
186
+ self._cartan_type = CartanType(ct)
187
+ if case == "spins":
188
+ self.rename("The crystal of spins for type %s" % ct)
189
+ elif case == "plus":
190
+ self.rename("The plus crystal of spins for type %s" % ct)
191
+ else:
192
+ self.rename("The minus crystal of spins for type %s" % ct)
193
+
194
+ self.Element = element_class
195
+ Parent.__init__(self, category=ClassicalCrystals())
196
+
197
+ if case == "minus":
198
+ generator = [1]*(ct[1]-1)
199
+ generator.append(-1)
200
+ else:
201
+ generator = [1]*ct[1]
202
+ self.module_generators = (self.element_class(self, tuple(generator)),)
203
+
204
+ def _element_constructor_(self, value):
205
+ """
206
+ Construct an element of ``self`` from ``value``.
207
+
208
+ EXAMPLES::
209
+
210
+ sage: C = crystals.Spins(['B',3])
211
+ sage: x = C((1,1,1)); x
212
+ +++
213
+ sage: y = C([1,1,1]); y
214
+ +++
215
+ sage: x == y
216
+ True
217
+ """
218
+ return self.element_class(self, tuple(value))
219
+
220
+ @lazy_attribute
221
+ def _digraph_closure(self):
222
+ """
223
+ The transitive closure of the digraph associated to ``self``.
224
+
225
+ EXAMPLES::
226
+
227
+ sage: crystals.Spins(['B',4])._digraph_closure
228
+ Transitive closure of : Digraph on 16 vertices
229
+ """
230
+ return self.digraph().transitive_closure()
231
+
232
+ def lt_elements(self, x, y):
233
+ r"""
234
+ Return ``True`` if and only if there is a path from ``x`` to ``y``
235
+ in the crystal graph.
236
+
237
+ Because the crystal graph is classical, it is a directed acyclic
238
+ graph which can be interpreted as a poset. This function implements
239
+ the comparison function of this poset.
240
+
241
+ EXAMPLES::
242
+
243
+ sage: C = crystals.Spins(['B',3])
244
+ sage: x = C([1,1,1])
245
+ sage: y = C([-1,-1,-1])
246
+ sage: C.lt_elements(x, y)
247
+ True
248
+ sage: C.lt_elements(y, x)
249
+ False
250
+ sage: C.lt_elements(x, x)
251
+ False
252
+ """
253
+ if parent(x) is not self or parent(y) is not self:
254
+ raise ValueError("both elements must be in this crystal")
255
+ return self._digraph_closure.has_edge(x, y)
256
+
257
+
258
+ cdef class Spin(Element):
259
+ """
260
+ A spin letter in the crystal of spins.
261
+
262
+ EXAMPLES::
263
+
264
+ sage: C = crystals.Spins(['B',3])
265
+ sage: c = C([1,1,1])
266
+ sage: c
267
+ +++
268
+ sage: c.parent()
269
+ The crystal of spins for type ['B', 3]
270
+
271
+ sage: D = crystals.Spins(['B',4])
272
+ sage: a = C([1,1,1])
273
+ sage: b = C([-1,-1,-1])
274
+ sage: c = D([1,1,1,1])
275
+ sage: a == a
276
+ True
277
+ sage: a == b
278
+ False
279
+ sage: b == c
280
+ False
281
+ """
282
+ # cdef bint* self._value # A + is a 0/False and a - is a 1/True
283
+
284
+ def __init__(self, parent, tuple val):
285
+ """
286
+ Initialize ``self``.
287
+
288
+ TESTS::
289
+
290
+ sage: C = crystals.Spins(['B',3])
291
+ sage: c = C([1,1,1])
292
+ sage: TestSuite(c).run()
293
+ """
294
+ cdef int i
295
+ self._n = parent.cartan_type().rank()
296
+ self._value = <bint*>sig_malloc(self._n*sizeof(bint))
297
+ for i in range(self._n):
298
+ self._value[i] = (val[i] != 1)
299
+ Element.__init__(self, parent)
300
+
301
+ cdef Spin _new_c(self, bint* value):
302
+ r"""
303
+ Fast creation of a spin element.
304
+ """
305
+ cdef Spin ret = type(self).__new__(type(self))
306
+ ret._parent = self._parent
307
+ ret._n = self._n
308
+ ret._value = value
309
+ ret._hash = 0
310
+ return ret
311
+
312
+ def __dealloc__(self):
313
+ """
314
+ Deallocate ``self``.
315
+
316
+ TESTS::
317
+
318
+ sage: C = crystals.Spins(['B',3])
319
+ sage: c = C([1,1,1])
320
+ sage: del c
321
+ """
322
+ sig_free(self._value)
323
+
324
+ def __hash__(self):
325
+ """
326
+ Return the hash of ``self``.
327
+
328
+ TESTS::
329
+
330
+ sage: C = crystals.Spins(['B',3])
331
+ sage: len(set(C)) == len(set([hash(x) for x in C]))
332
+ True
333
+ """
334
+ cdef int i
335
+ if self._hash == 0:
336
+ self._hash = hash(tuple([-1 if self._value[i] else 1 for i in range(self._n)]))
337
+ return self._hash
338
+
339
+ def __reduce__(self):
340
+ r"""
341
+ Used to pickle ``self``.
342
+
343
+ EXAMPLES::
344
+
345
+ sage: C = crystals.Spins(['B',3])
346
+ sage: a = C([1,-1,1])
347
+ sage: a.__reduce__()
348
+ (The crystal of spins for type ['B', 3], ((1, -1, 1),))
349
+ """
350
+ tup = tuple([-1 if self._value[i] else 1 for i in range(self._n)])
351
+ return (self._parent, (tup,))
352
+
353
+ cpdef _richcmp_(left, right, int op):
354
+ """
355
+ Return ``True`` if ``left`` compares with ``right`` based on ``op``.
356
+
357
+ EXAMPLES::
358
+
359
+ sage: C = crystals.Spins(['B',3])
360
+ sage: x = C([1,1,1])
361
+ sage: y = C([-1,-1,-1])
362
+ sage: x < y
363
+ True
364
+ sage: x >= y
365
+ False
366
+ sage: x < x
367
+ False
368
+ sage: x <= x
369
+ True
370
+ sage: x != y
371
+ True
372
+ sage: x == y
373
+ False
374
+ """
375
+ cdef Spin self, x
376
+ cdef int i
377
+ self = left
378
+ x = right
379
+ if op == Py_EQ:
380
+ for i in range(self._n):
381
+ if self._value[i] != x._value[i]:
382
+ return False
383
+ return True
384
+ if op == Py_NE:
385
+ for i in range(self._n):
386
+ if self._value[i] != x._value[i]:
387
+ return True
388
+ return False
389
+ if op == Py_LT:
390
+ return self._parent._digraph_closure.has_edge(self, x)
391
+ if op == Py_GT:
392
+ return x._parent._digraph_closure.has_edge(x, self)
393
+ if op == Py_LE:
394
+ return self == x or self._parent._digraph_closure.has_edge(self, x)
395
+ if op == Py_GE:
396
+ return self == x or x._parent._digraph_closure.has_edge(x, self)
397
+ return False
398
+
399
+ @property
400
+ def value(self):
401
+ r"""
402
+ Return ``self`` as a tuple with `+1` and `-1`.
403
+
404
+ EXAMPLES::
405
+
406
+ sage: C = crystals.Spins(['B',3])
407
+ sage: C([1,1,1]).value
408
+ (1, 1, 1)
409
+ sage: C([1,1,-1]).value
410
+ (1, 1, -1)
411
+ """
412
+ cdef int i
413
+ one = ZZ.one()
414
+ return tuple([-one if self._value[i] else one for i in range(self._n)])
415
+
416
+ def signature(self):
417
+ """
418
+ Return the signature of ``self``.
419
+
420
+ EXAMPLES::
421
+
422
+ sage: C = crystals.Spins(['B',3])
423
+ sage: C([1,1,1]).signature()
424
+ '+++'
425
+ sage: C([1,1,-1]).signature()
426
+ '++-'
427
+ """
428
+ cdef int i
429
+ cdef str sword = ""
430
+ for i in range(self._n):
431
+ sword += "+" if self._value[i] != 1 else "-"
432
+ return sword
433
+
434
+ _repr_ = signature
435
+
436
+ def _repr_diagram(self):
437
+ """
438
+ Return a representation of ``self`` as a diagram.
439
+
440
+ EXAMPLES::
441
+
442
+ sage: C = crystals.Spins(['B',3])
443
+ sage: b = C([1,1,-1])
444
+ sage: print(b._repr_diagram())
445
+ +
446
+ +
447
+ -
448
+ """
449
+ return '\n'.join(self.signature())
450
+
451
+ def _ascii_art_(self):
452
+ """
453
+ Return an ascii art representation of ``self``.
454
+
455
+ EXAMPLES::
456
+
457
+ sage: C = crystals.Spins(['B',3])
458
+ sage: b = C([1,1,-1])
459
+ sage: ascii_art(b)
460
+ +
461
+ +
462
+ -
463
+ """
464
+ return AsciiArt(list(self.signature()))
465
+
466
+ def _unicode_art_(self):
467
+ """
468
+ Return a unicode art representation of ``self``.
469
+
470
+ EXAMPLES::
471
+
472
+ sage: C = crystals.Spins(['B',3])
473
+ sage: b = C([1,1,-1])
474
+ sage: unicode_art(b)
475
+ +
476
+ +
477
+ -
478
+ """
479
+ return UnicodeArt(list(self.signature()))
480
+
481
+ def pp(self):
482
+ """
483
+ Pretty print ``self`` as a column.
484
+
485
+ EXAMPLES::
486
+
487
+ sage: C = crystals.Spins(['B',3])
488
+ sage: b = C([1,1,-1])
489
+ sage: b.pp()
490
+ +
491
+ +
492
+ -
493
+ """
494
+ print(self._repr_diagram())
495
+
496
+ def _latex_(self):
497
+ r"""
498
+ Give the latex output of a spin column.
499
+
500
+ EXAMPLES::
501
+
502
+ sage: C = crystals.Spins(['B',3])
503
+ sage: b = C([1,1,-1])
504
+ sage: print(b._latex_())
505
+ {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
506
+ \raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
507
+ \lr{-}\\\cline{1-1}
508
+ \lr{+}\\\cline{1-1}
509
+ \lr{+}\\\cline{1-1}
510
+ \end{array}$}
511
+ }
512
+ """
513
+ return Tableau([[i] for i in reversed(self.signature())])._latex_()
514
+
515
+ def weight(self):
516
+ """
517
+ Return the weight of ``self``.
518
+
519
+ EXAMPLES::
520
+
521
+ sage: [v.weight() for v in crystals.Spins(['B',3])]
522
+ [(1/2, 1/2, 1/2), (1/2, 1/2, -1/2),
523
+ (1/2, -1/2, 1/2), (-1/2, 1/2, 1/2),
524
+ (1/2, -1/2, -1/2), (-1/2, 1/2, -1/2),
525
+ (-1/2, -1/2, 1/2), (-1/2, -1/2, -1/2)]
526
+ """
527
+ WLR = self._parent.weight_lattice_realization()
528
+ cdef int i
529
+ mone = -WLR.base_ring().one()
530
+ # The ambient space is indexed by 0,...,n-1
531
+ return WLR._from_dict({i: mone**int(self._value[i]) / 2 for i in range(self._n)},
532
+ remove_zeros=False, coerce=False)
533
+
534
+ cdef class Spin_crystal_type_B_element(Spin):
535
+ r"""
536
+ Type B spin representation crystal element
537
+ """
538
+ cpdef Spin e(self, int i):
539
+ r"""
540
+ Return the action of `e_i` on ``self``.
541
+
542
+ EXAMPLES::
543
+
544
+ sage: C = crystals.Spins(['B',3])
545
+ sage: [[C[m].e(i) for i in range(1,4)] for m in range(8)]
546
+ [[None, None, None], [None, None, +++], [None, ++-, None], [+-+, None, None],
547
+ [None, None, +-+], [+--, None, -++], [None, -+-, None], [None, None, --+]]
548
+ """
549
+ if i < 1 or i > self._n:
550
+ raise ValueError("i is not in the index set")
551
+ cdef int j
552
+ cdef bint* ret
553
+ if i == self._n:
554
+ if self._value[i-1]:
555
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
556
+ for j in range(self._n):
557
+ ret[j] = self._value[j]
558
+ ret[i-1] = False
559
+ return self._new_c(ret)
560
+ return None
561
+
562
+ if self._value[i-1] and not self._value[i]:
563
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
564
+ for j in range(self._n):
565
+ ret[j] = self._value[j]
566
+ ret[i-1] = False
567
+ ret[i] = True
568
+ return self._new_c(ret)
569
+ return None
570
+
571
+ cpdef Spin f(self, int i):
572
+ r"""
573
+ Return the action of `f_i` on ``self``.
574
+
575
+ EXAMPLES::
576
+
577
+ sage: C = crystals.Spins(['B',3])
578
+ sage: [[C[m].f(i) for i in range(1,4)] for m in range(8)]
579
+ [[None, None, ++-], [None, +-+, None], [-++, None, +--], [None, None, -+-],
580
+ [-+-, None, None], [None, --+, None], [None, None, ---], [None, None, None]]
581
+ """
582
+ if i < 1 or i > self._n:
583
+ raise ValueError("i is not in the index set")
584
+ cdef int j
585
+ cdef bint* ret
586
+ if i == self._n:
587
+ if not self._value[i-1]:
588
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
589
+ for j in range(self._n):
590
+ ret[j] = self._value[j]
591
+ ret[i-1] = True
592
+ return self._new_c(ret)
593
+ return None
594
+
595
+ if self._value[i] and not self._value[i-1]:
596
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
597
+ for j in range(self._n):
598
+ ret[j] = self._value[j]
599
+ ret[i-1] = True
600
+ ret[i] = False
601
+ return self._new_c(ret)
602
+ return None
603
+
604
+ cpdef int epsilon(self, int i) noexcept:
605
+ r"""
606
+ Return `\varepsilon_i` of ``self``.
607
+
608
+ EXAMPLES::
609
+
610
+ sage: C = crystals.Spins(['B',3])
611
+ sage: [[C[m].epsilon(i) for i in range(1,4)] for m in range(8)]
612
+ [[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0],
613
+ [0, 0, 1], [1, 0, 1], [0, 1, 0], [0, 0, 1]]
614
+ """
615
+ if i < 1 or i > self._n:
616
+ raise ValueError("i is not in the index set")
617
+ if i == self._n:
618
+ return self._value[i-1]
619
+ return self._value[i-1] and not self._value[i]
620
+
621
+ cpdef int phi(self, int i) noexcept:
622
+ r"""
623
+ Return `\varphi_i` of ``self``.
624
+
625
+ EXAMPLES::
626
+
627
+ sage: C = crystals.Spins(['B',3])
628
+ sage: [[C[m].phi(i) for i in range(1,4)] for m in range(8)]
629
+ [[0, 0, 1], [0, 1, 0], [1, 0, 1], [0, 0, 1],
630
+ [1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 0]]
631
+ """
632
+ if i < 1 or i > self._n:
633
+ raise ValueError("i is not in the index set")
634
+ if i == self._n:
635
+ return not self._value[i-1]
636
+ return self._value[i] and not self._value[i-1]
637
+
638
+ cdef class Spin_crystal_type_D_element(Spin):
639
+ r"""
640
+ Type D spin representation crystal element
641
+ """
642
+ cpdef Spin e(self, int i):
643
+ r"""
644
+ Return the action of `e_i` on ``self``.
645
+
646
+ EXAMPLES::
647
+
648
+ sage: D = crystals.SpinsPlus(['D',4])
649
+ sage: [[D.list()[m].e(i) for i in range(1,4)] for m in range(8)]
650
+ [[None, None, None], [None, None, None], [None, ++--, None], [+-+-, None, None],
651
+ [None, None, +-+-], [+--+, None, -++-], [None, -+-+, None], [None, None, None]]
652
+
653
+ ::
654
+
655
+ sage: E = crystals.SpinsMinus(['D',4])
656
+ sage: [[E[m].e(i) for i in range(1,4)] for m in range(8)]
657
+ [[None, None, None], [None, None, +++-], [None, ++-+, None], [+-++, None, None],
658
+ [None, None, None], [+---, None, None], [None, -+--, None], [None, None, --+-]]
659
+ """
660
+ if i < 1 or i > self._n:
661
+ raise ValueError("i is not in the index set")
662
+ cdef int j
663
+ cdef bint* ret
664
+ if i == self._n:
665
+ if self._value[i-1] and self._value[i-2]:
666
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
667
+ for j in range(self._n):
668
+ ret[j] = self._value[j]
669
+ ret[i-1] = False
670
+ ret[i-2] = False
671
+ return self._new_c(ret)
672
+ return None
673
+
674
+ if self._value[i-1] and not self._value[i]:
675
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
676
+ for j in range(self._n):
677
+ ret[j] = self._value[j]
678
+ ret[i-1] = False
679
+ ret[i] = True
680
+ return self._new_c(ret)
681
+ return None
682
+
683
+ cpdef Spin f(self, int i):
684
+ r"""
685
+ Return the action of `f_i` on ``self``.
686
+
687
+ EXAMPLES::
688
+
689
+ sage: D = crystals.SpinsPlus(['D',4])
690
+ sage: [[D.list()[m].f(i) for i in range(1,4)] for m in range(8)]
691
+ [[None, None, None], [None, +-+-, None], [-++-, None, +--+], [None, None, -+-+],
692
+ [-+-+, None, None], [None, --++, None], [None, None, None], [None, None, None]]
693
+
694
+ ::
695
+
696
+ sage: E = crystals.SpinsMinus(['D',4])
697
+ sage: [[E[m].f(i) for i in range(1,4)] for m in range(8)]
698
+ [[None, None, ++-+], [None, +-++, None], [-+++, None, None], [None, None, None],
699
+ [-+--, None, None], [None, --+-, None], [None, None, ---+], [None, None, None]]
700
+ """
701
+ if i < 1 or i > self._n:
702
+ raise ValueError("i is not in the index set")
703
+ cdef int j
704
+ cdef bint* ret
705
+ if i == self._n:
706
+ if not self._value[i-1] and not self._value[i-2]:
707
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
708
+ for j in range(self._n):
709
+ ret[j] = self._value[j]
710
+ ret[i-1] = True
711
+ ret[i-2] = True
712
+ return self._new_c(ret)
713
+ return None
714
+
715
+ if self._value[i] and not self._value[i-1]:
716
+ ret = <bint*>sig_malloc(self._n*sizeof(bint))
717
+ for j in range(self._n):
718
+ ret[j] = self._value[j]
719
+ ret[i-1] = True
720
+ ret[i] = False
721
+ return self._new_c(ret)
722
+ return None
723
+
724
+ cpdef int epsilon(self, int i) noexcept:
725
+ r"""
726
+ Return `\varepsilon_i` of ``self``.
727
+
728
+ EXAMPLES::
729
+
730
+ sage: C = crystals.SpinsMinus(['D',4])
731
+ sage: [[C[m].epsilon(i) for i in C.index_set()] for m in range(8)]
732
+ [[0, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0],
733
+ [0, 0, 0, 1], [1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0]]
734
+ """
735
+ if i < 1 or i > self._n:
736
+ raise ValueError("i is not in the index set")
737
+ if i == self._n:
738
+ return self._value[i-1] and self._value[i-2]
739
+ return self._value[i-1] and not self._value[i]
740
+
741
+ cpdef int phi(self, int i) noexcept:
742
+ r"""
743
+ Return `\varphi_i` of ``self``.
744
+
745
+ EXAMPLES::
746
+
747
+ sage: C = crystals.SpinsPlus(['D',4])
748
+ sage: [[C[m].phi(i) for i in C.index_set()] for m in range(8)]
749
+ [[0, 0, 0, 1], [0, 1, 0, 0], [1, 0, 1, 0], [0, 0, 1, 0],
750
+ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0]]
751
+ """
752
+ if i < 1 or i > self._n:
753
+ raise ValueError("i is not in the index set")
754
+ if i == self._n:
755
+ return not self._value[i - 1] and not self._value[i - 2]
756
+ return self._value[i] and not self._value[i - 1]