passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
  3. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  4. passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
  5. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  6. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  7. passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
  8. passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
  9. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  10. sage/algebras/all.py +24 -0
  11. sage/algebras/all__sagemath_combinat.py +35 -0
  12. sage/algebras/askey_wilson.py +935 -0
  13. sage/algebras/associated_graded.py +345 -0
  14. sage/algebras/cellular_basis.py +350 -0
  15. sage/algebras/cluster_algebra.py +2766 -0
  16. sage/algebras/down_up_algebra.py +860 -0
  17. sage/algebras/free_algebra.py +1698 -0
  18. sage/algebras/free_algebra_element.py +345 -0
  19. sage/algebras/free_algebra_quotient.py +405 -0
  20. sage/algebras/free_algebra_quotient_element.py +295 -0
  21. sage/algebras/free_zinbiel_algebra.py +885 -0
  22. sage/algebras/hall_algebra.py +783 -0
  23. sage/algebras/hecke_algebras/all.py +4 -0
  24. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  25. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  28. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  29. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  30. sage/algebras/jordan_algebra.py +1773 -0
  31. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  32. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  33. sage/algebras/lie_conformal_algebras/all.py +18 -0
  34. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  35. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  36. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  37. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  38. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  39. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  40. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  41. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  45. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  46. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  47. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  48. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  49. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  50. sage/algebras/nil_coxeter_algebra.py +191 -0
  51. sage/algebras/q_commuting_polynomials.py +673 -0
  52. sage/algebras/q_system.py +608 -0
  53. sage/algebras/quantum_clifford.py +959 -0
  54. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  55. sage/algebras/quantum_groups/all.py +9 -0
  56. sage/algebras/quantum_groups/fock_space.py +2219 -0
  57. sage/algebras/quantum_groups/q_numbers.py +207 -0
  58. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  59. sage/algebras/quantum_groups/representations.py +591 -0
  60. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  61. sage/algebras/quantum_oscillator.py +623 -0
  62. sage/algebras/quaternion_algebra.py +20 -0
  63. sage/algebras/quaternion_algebra_element.py +55 -0
  64. sage/algebras/rational_cherednik_algebra.py +525 -0
  65. sage/algebras/schur_algebra.py +670 -0
  66. sage/algebras/shuffle_algebra.py +1011 -0
  67. sage/algebras/splitting_algebra.py +779 -0
  68. sage/algebras/tensor_algebra.py +709 -0
  69. sage/algebras/yangian.py +1082 -0
  70. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  71. sage/all__sagemath_combinat.py +44 -0
  72. sage/combinat/SJT.py +255 -0
  73. sage/combinat/affine_permutation.py +2405 -0
  74. sage/combinat/algebraic_combinatorics.py +55 -0
  75. sage/combinat/all.py +53 -0
  76. sage/combinat/all__sagemath_combinat.py +195 -0
  77. sage/combinat/alternating_sign_matrix.py +2063 -0
  78. sage/combinat/baxter_permutations.py +346 -0
  79. sage/combinat/bijectionist.py +3220 -0
  80. sage/combinat/binary_recurrence_sequences.py +1180 -0
  81. sage/combinat/blob_algebra.py +685 -0
  82. sage/combinat/catalog_partitions.py +27 -0
  83. sage/combinat/chas/all.py +23 -0
  84. sage/combinat/chas/fsym.py +1180 -0
  85. sage/combinat/chas/wqsym.py +2601 -0
  86. sage/combinat/cluster_complex.py +326 -0
  87. sage/combinat/colored_permutations.py +2039 -0
  88. sage/combinat/colored_permutations_representations.py +964 -0
  89. sage/combinat/composition_signed.py +142 -0
  90. sage/combinat/composition_tableau.py +855 -0
  91. sage/combinat/constellation.py +1729 -0
  92. sage/combinat/core.py +751 -0
  93. sage/combinat/counting.py +12 -0
  94. sage/combinat/crystals/affine.py +742 -0
  95. sage/combinat/crystals/affine_factorization.py +518 -0
  96. sage/combinat/crystals/affinization.py +331 -0
  97. sage/combinat/crystals/alcove_path.py +2013 -0
  98. sage/combinat/crystals/all.py +22 -0
  99. sage/combinat/crystals/bkk_crystals.py +141 -0
  100. sage/combinat/crystals/catalog.py +115 -0
  101. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  102. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  103. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  104. sage/combinat/crystals/crystals.py +257 -0
  105. sage/combinat/crystals/direct_sum.py +260 -0
  106. sage/combinat/crystals/elementary_crystals.py +1251 -0
  107. sage/combinat/crystals/fast_crystals.py +441 -0
  108. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  109. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  110. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  111. sage/combinat/crystals/induced_structure.py +695 -0
  112. sage/combinat/crystals/infinity_crystals.py +730 -0
  113. sage/combinat/crystals/kac_modules.py +863 -0
  114. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  115. sage/combinat/crystals/kyoto_path_model.py +497 -0
  116. sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
  117. sage/combinat/crystals/letters.pxd +79 -0
  118. sage/combinat/crystals/letters.pyx +3056 -0
  119. sage/combinat/crystals/littelmann_path.py +1518 -0
  120. sage/combinat/crystals/monomial_crystals.py +1262 -0
  121. sage/combinat/crystals/multisegments.py +462 -0
  122. sage/combinat/crystals/mv_polytopes.py +467 -0
  123. sage/combinat/crystals/pbw_crystal.py +511 -0
  124. sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
  125. sage/combinat/crystals/pbw_datum.pxd +4 -0
  126. sage/combinat/crystals/pbw_datum.pyx +487 -0
  127. sage/combinat/crystals/polyhedral_realization.py +372 -0
  128. sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
  129. sage/combinat/crystals/spins.pxd +21 -0
  130. sage/combinat/crystals/spins.pyx +756 -0
  131. sage/combinat/crystals/star_crystal.py +290 -0
  132. sage/combinat/crystals/subcrystal.py +464 -0
  133. sage/combinat/crystals/tensor_product.py +1177 -0
  134. sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
  135. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  136. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  137. sage/combinat/crystals/virtual_crystal.py +420 -0
  138. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  139. sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
  140. sage/combinat/debruijn_sequence.pyx +355 -0
  141. sage/combinat/decorated_permutation.py +270 -0
  142. sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
  143. sage/combinat/degree_sequences.pyx +588 -0
  144. sage/combinat/derangements.py +527 -0
  145. sage/combinat/descent_algebra.py +1008 -0
  146. sage/combinat/diagram.py +1551 -0
  147. sage/combinat/diagram_algebras.py +5886 -0
  148. sage/combinat/dyck_word.py +4349 -0
  149. sage/combinat/e_one_star.py +1623 -0
  150. sage/combinat/enumerated_sets.py +123 -0
  151. sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
  152. sage/combinat/expnums.pyx +148 -0
  153. sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
  154. sage/combinat/fast_vector_partitions.pyx +346 -0
  155. sage/combinat/fqsym.py +1977 -0
  156. sage/combinat/free_dendriform_algebra.py +954 -0
  157. sage/combinat/free_prelie_algebra.py +1141 -0
  158. sage/combinat/fully_commutative_elements.py +1077 -0
  159. sage/combinat/fully_packed_loop.py +1523 -0
  160. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  161. sage/combinat/gray_codes.py +311 -0
  162. sage/combinat/grossman_larson_algebras.py +667 -0
  163. sage/combinat/growth.py +4352 -0
  164. sage/combinat/hall_polynomial.py +188 -0
  165. sage/combinat/hillman_grassl.py +866 -0
  166. sage/combinat/integer_matrices.py +329 -0
  167. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  168. sage/combinat/k_tableau.py +4564 -0
  169. sage/combinat/kazhdan_lusztig.py +215 -0
  170. sage/combinat/key_polynomial.py +885 -0
  171. sage/combinat/knutson_tao_puzzles.py +2286 -0
  172. sage/combinat/lr_tableau.py +311 -0
  173. sage/combinat/matrices/all.py +24 -0
  174. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  175. sage/combinat/matrices/latin.py +2912 -0
  176. sage/combinat/misc.py +401 -0
  177. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  178. sage/combinat/ncsf_qsym/all.py +21 -0
  179. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  180. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  181. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  182. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  183. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  184. sage/combinat/ncsym/all.py +21 -0
  185. sage/combinat/ncsym/bases.py +855 -0
  186. sage/combinat/ncsym/dual.py +593 -0
  187. sage/combinat/ncsym/ncsym.py +2076 -0
  188. sage/combinat/necklace.py +551 -0
  189. sage/combinat/non_decreasing_parking_function.py +634 -0
  190. sage/combinat/nu_dyck_word.py +1474 -0
  191. sage/combinat/output.py +861 -0
  192. sage/combinat/parallelogram_polyomino.py +4326 -0
  193. sage/combinat/parking_functions.py +1602 -0
  194. sage/combinat/partition_algebra.py +1998 -0
  195. sage/combinat/partition_kleshchev.py +1982 -0
  196. sage/combinat/partition_shifting_algebras.py +584 -0
  197. sage/combinat/partition_tuple.py +3114 -0
  198. sage/combinat/path_tableaux/all.py +13 -0
  199. sage/combinat/path_tableaux/catalog.py +29 -0
  200. sage/combinat/path_tableaux/dyck_path.py +380 -0
  201. sage/combinat/path_tableaux/frieze.py +476 -0
  202. sage/combinat/path_tableaux/path_tableau.py +728 -0
  203. sage/combinat/path_tableaux/semistandard.py +510 -0
  204. sage/combinat/perfect_matching.py +779 -0
  205. sage/combinat/plane_partition.py +3300 -0
  206. sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
  207. sage/combinat/q_bernoulli.pyx +128 -0
  208. sage/combinat/quickref.py +81 -0
  209. sage/combinat/recognizable_series.py +2051 -0
  210. sage/combinat/regular_sequence.py +4316 -0
  211. sage/combinat/regular_sequence_bounded.py +543 -0
  212. sage/combinat/restricted_growth.py +81 -0
  213. sage/combinat/ribbon.py +20 -0
  214. sage/combinat/ribbon_shaped_tableau.py +489 -0
  215. sage/combinat/ribbon_tableau.py +1180 -0
  216. sage/combinat/rigged_configurations/all.py +46 -0
  217. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  218. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  219. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  222. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  223. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  224. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  225. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  226. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  227. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  228. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  229. sage/combinat/rigged_configurations/bijection.py +143 -0
  230. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  231. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  232. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  233. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  234. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  235. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  236. sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  238. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  240. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  241. sage/combinat/rsk.py +3438 -0
  242. sage/combinat/schubert_polynomial.py +508 -0
  243. sage/combinat/set_partition.py +3318 -0
  244. sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
  245. sage/combinat/set_partition_iterator.pyx +136 -0
  246. sage/combinat/set_partition_ordered.py +1590 -0
  247. sage/combinat/sf/abreu_nigro.py +346 -0
  248. sage/combinat/sf/all.py +52 -0
  249. sage/combinat/sf/character.py +576 -0
  250. sage/combinat/sf/classical.py +319 -0
  251. sage/combinat/sf/dual.py +996 -0
  252. sage/combinat/sf/elementary.py +549 -0
  253. sage/combinat/sf/hall_littlewood.py +1028 -0
  254. sage/combinat/sf/hecke.py +336 -0
  255. sage/combinat/sf/homogeneous.py +464 -0
  256. sage/combinat/sf/jack.py +1428 -0
  257. sage/combinat/sf/k_dual.py +1458 -0
  258. sage/combinat/sf/kfpoly.py +447 -0
  259. sage/combinat/sf/llt.py +789 -0
  260. sage/combinat/sf/macdonald.py +2019 -0
  261. sage/combinat/sf/monomial.py +525 -0
  262. sage/combinat/sf/multiplicative.py +113 -0
  263. sage/combinat/sf/new_kschur.py +1786 -0
  264. sage/combinat/sf/ns_macdonald.py +964 -0
  265. sage/combinat/sf/orthogonal.py +246 -0
  266. sage/combinat/sf/orthotriang.py +355 -0
  267. sage/combinat/sf/powersum.py +963 -0
  268. sage/combinat/sf/schur.py +880 -0
  269. sage/combinat/sf/sf.py +1653 -0
  270. sage/combinat/sf/sfa.py +7053 -0
  271. sage/combinat/sf/symplectic.py +253 -0
  272. sage/combinat/sf/witt.py +721 -0
  273. sage/combinat/shifted_primed_tableau.py +2735 -0
  274. sage/combinat/shuffle.py +830 -0
  275. sage/combinat/sidon_sets.py +146 -0
  276. sage/combinat/similarity_class_type.py +1721 -0
  277. sage/combinat/sine_gordon.py +618 -0
  278. sage/combinat/six_vertex_model.py +784 -0
  279. sage/combinat/skew_partition.py +2053 -0
  280. sage/combinat/skew_tableau.py +2989 -0
  281. sage/combinat/sloane_functions.py +8935 -0
  282. sage/combinat/specht_module.py +1403 -0
  283. sage/combinat/species/all.py +48 -0
  284. sage/combinat/species/characteristic_species.py +321 -0
  285. sage/combinat/species/composition_species.py +273 -0
  286. sage/combinat/species/cycle_species.py +284 -0
  287. sage/combinat/species/empty_species.py +155 -0
  288. sage/combinat/species/functorial_composition_species.py +148 -0
  289. sage/combinat/species/generating_series.py +673 -0
  290. sage/combinat/species/library.py +148 -0
  291. sage/combinat/species/linear_order_species.py +169 -0
  292. sage/combinat/species/misc.py +83 -0
  293. sage/combinat/species/partition_species.py +290 -0
  294. sage/combinat/species/permutation_species.py +268 -0
  295. sage/combinat/species/product_species.py +423 -0
  296. sage/combinat/species/recursive_species.py +476 -0
  297. sage/combinat/species/set_species.py +192 -0
  298. sage/combinat/species/species.py +820 -0
  299. sage/combinat/species/structure.py +539 -0
  300. sage/combinat/species/subset_species.py +243 -0
  301. sage/combinat/species/sum_species.py +225 -0
  302. sage/combinat/subword.py +564 -0
  303. sage/combinat/subword_complex.py +2122 -0
  304. sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
  305. sage/combinat/subword_complex_c.pyx +119 -0
  306. sage/combinat/super_tableau.py +821 -0
  307. sage/combinat/superpartition.py +1154 -0
  308. sage/combinat/symmetric_group_algebra.py +3774 -0
  309. sage/combinat/symmetric_group_representations.py +1830 -0
  310. sage/combinat/t_sequences.py +877 -0
  311. sage/combinat/tableau.py +9506 -0
  312. sage/combinat/tableau_residues.py +860 -0
  313. sage/combinat/tableau_tuple.py +5353 -0
  314. sage/combinat/tiling.py +2432 -0
  315. sage/combinat/triangles_FHM.py +777 -0
  316. sage/combinat/tutorial.py +1857 -0
  317. sage/combinat/vector_partition.py +337 -0
  318. sage/combinat/words/abstract_word.py +1722 -0
  319. sage/combinat/words/all.py +59 -0
  320. sage/combinat/words/alphabet.py +268 -0
  321. sage/combinat/words/finite_word.py +7201 -0
  322. sage/combinat/words/infinite_word.py +113 -0
  323. sage/combinat/words/lyndon_word.py +652 -0
  324. sage/combinat/words/morphic.py +351 -0
  325. sage/combinat/words/morphism.py +3878 -0
  326. sage/combinat/words/paths.py +2932 -0
  327. sage/combinat/words/shuffle_product.py +278 -0
  328. sage/combinat/words/suffix_trees.py +1873 -0
  329. sage/combinat/words/word.py +769 -0
  330. sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
  331. sage/combinat/words/word_char.pyx +847 -0
  332. sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
  333. sage/combinat/words/word_datatypes.pxd +4 -0
  334. sage/combinat/words/word_datatypes.pyx +1067 -0
  335. sage/combinat/words/word_generators.py +2026 -0
  336. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  337. sage/combinat/words/word_options.py +99 -0
  338. sage/combinat/words/words.py +2396 -0
  339. sage/data_structures/all__sagemath_combinat.py +1 -0
  340. sage/databases/all__sagemath_combinat.py +13 -0
  341. sage/databases/findstat.py +4897 -0
  342. sage/databases/oeis.py +2058 -0
  343. sage/databases/sloane.py +393 -0
  344. sage/dynamics/all__sagemath_combinat.py +14 -0
  345. sage/dynamics/cellular_automata/all.py +7 -0
  346. sage/dynamics/cellular_automata/catalog.py +34 -0
  347. sage/dynamics/cellular_automata/elementary.py +612 -0
  348. sage/dynamics/cellular_automata/glca.py +477 -0
  349. sage/dynamics/cellular_automata/solitons.py +1463 -0
  350. sage/dynamics/finite_dynamical_system.py +1249 -0
  351. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  352. sage/games/all.py +7 -0
  353. sage/games/hexad.py +704 -0
  354. sage/games/quantumino.py +591 -0
  355. sage/games/sudoku.py +889 -0
  356. sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
  357. sage/games/sudoku_backtrack.pyx +189 -0
  358. sage/groups/all__sagemath_combinat.py +1 -0
  359. sage/groups/indexed_free_group.py +489 -0
  360. sage/libs/all__sagemath_combinat.py +6 -0
  361. sage/libs/lrcalc/__init__.py +1 -0
  362. sage/libs/lrcalc/lrcalc.py +525 -0
  363. sage/libs/symmetrica/__init__.py +7 -0
  364. sage/libs/symmetrica/all.py +101 -0
  365. sage/libs/symmetrica/kostka.pxi +168 -0
  366. sage/libs/symmetrica/part.pxi +193 -0
  367. sage/libs/symmetrica/plet.pxi +42 -0
  368. sage/libs/symmetrica/sab.pxi +196 -0
  369. sage/libs/symmetrica/sb.pxi +332 -0
  370. sage/libs/symmetrica/sc.pxi +192 -0
  371. sage/libs/symmetrica/schur.pxi +956 -0
  372. sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
  373. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  374. sage/libs/symmetrica/symmetrica.pyx +39 -0
  375. sage/monoids/all.py +13 -0
  376. sage/monoids/automatic_semigroup.py +1054 -0
  377. sage/monoids/free_abelian_monoid.py +315 -0
  378. sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
  379. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  380. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  381. sage/monoids/free_monoid.py +335 -0
  382. sage/monoids/free_monoid_element.py +431 -0
  383. sage/monoids/hecke_monoid.py +65 -0
  384. sage/monoids/string_monoid.py +817 -0
  385. sage/monoids/string_monoid_element.py +547 -0
  386. sage/monoids/string_ops.py +143 -0
  387. sage/monoids/trace_monoid.py +972 -0
  388. sage/rings/all__sagemath_combinat.py +2 -0
  389. sage/sat/all.py +4 -0
  390. sage/sat/boolean_polynomials.py +405 -0
  391. sage/sat/converters/__init__.py +6 -0
  392. sage/sat/converters/anf2cnf.py +14 -0
  393. sage/sat/converters/polybori.py +611 -0
  394. sage/sat/solvers/__init__.py +5 -0
  395. sage/sat/solvers/cryptominisat.py +287 -0
  396. sage/sat/solvers/dimacs.py +783 -0
  397. sage/sat/solvers/picosat.py +228 -0
  398. sage/sat/solvers/sat_lp.py +156 -0
  399. sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
  400. sage/sat/solvers/satsolver.pxd +3 -0
  401. sage/sat/solvers/satsolver.pyx +405 -0
@@ -0,0 +1,508 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ r"""
4
+ Schubert polynomials
5
+
6
+ See :wikipedia:`Schubert_polynomial` and
7
+ `SymmetricFunctions.com <https://www.symmetricfunctions.com/schubert.htm#schubert>`_.
8
+ Schubert polynomials are representatives of cohomology classes in flag varieties.
9
+ In `n` variables, they are indexed by permutations `w \in S_n`. They also form
10
+ a basis for the coinvariant ring of the `S_n` action on
11
+ `\ZZ[x_1, x_2, \ldots, x_n]`.
12
+
13
+ EXAMPLES::
14
+
15
+ sage: X = SchubertPolynomialRing(ZZ)
16
+ sage: w = [1,2,5,4,3]; # a list representing an element of `S_5`
17
+ sage: X(w)
18
+ X[1, 2, 5, 4, 3]
19
+
20
+ This can be expanded in terms of polynomial variables::
21
+
22
+ sage: X(w).expand()
23
+ x0^2*x1 + x0*x1^2 + x0^2*x2 + 2*x0*x1*x2 + x1^2*x2
24
+ + x0*x2^2 + x1*x2^2 + x0^2*x3 + x0*x1*x3 + x1^2*x3
25
+ + x0*x2*x3 + x1*x2*x3 + x2^2*x3
26
+
27
+ We can also convert back from polynomial variables. For example,
28
+ the longest permutation is a single term. In `S_5`, this is the
29
+ element (in one line notation) `w_0 = 54321`::
30
+
31
+ sage: w0 = [5,4,3,2,1]
32
+ sage: R.<x0, x1, x2, x3, x4> = PolynomialRing(ZZ)
33
+ sage: Sw0 = X(x0^4*x1^3*x2^2*x3); Sw0
34
+ X[5, 4, 3, 2, 1]
35
+
36
+ The polynomials also have the property that if the indexing permutation `w` is
37
+ multiplied by a simple transposition `s_i = (i, i+1)` such that the length of
38
+ `w` is more than the length of `ws_i`, then the Schubert
39
+ polynomial of the permutation `ws_i` is computed by applying the divided
40
+ difference operator :meth:`~SchubertPolynomial_class.divided_difference` to
41
+ the polynomial indexed by `w`. For example, applying the divided difference
42
+ operator `\partial_2` to the Schubert polynomial `\mathfrak{S}_{w_0}`::
43
+
44
+ sage: Sw0.divided_difference(2)
45
+ X[5, 3, 4, 2, 1]
46
+
47
+ We can also check the properties listed in :wikipedia:`Schubert_polynomial`::
48
+
49
+ sage: X([1,2,3,4,5]) # the identity in one-line notation
50
+ X[1]
51
+ sage: X([1,3,2,4,5]).expand() # the transposition swapping 2 and 3
52
+ x0 + x1
53
+ sage: X([2,4,5,3,1]).expand()
54
+ x0^2*x1^2*x2*x3 + x0^2*x1*x2^2*x3 + x0*x1^2*x2^2*x3
55
+
56
+ sage: w = [4,5,1,2,3]
57
+ sage: s = SymmetricFunctions(QQ).schur()
58
+ sage: s[3,3].expand(2)
59
+ x0^3*x1^3
60
+ sage: X(w).expand()
61
+ x0^3*x1^3
62
+ """
63
+ # ****************************************************************************
64
+ # Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
65
+ #
66
+ # Distributed under the terms of the GNU General Public License (GPL)
67
+ #
68
+ # This code is distributed in the hope that it will be useful,
69
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
70
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
71
+ # General Public License for more details.
72
+ #
73
+ # The full text of the GPL is available at:
74
+ #
75
+ # https://www.gnu.org/licenses/
76
+ # ****************************************************************************
77
+
78
+ from sage.categories.graded_algebras_with_basis import GradedAlgebrasWithBasis
79
+ from sage.combinat.free_module import CombinatorialFreeModule
80
+ from sage.combinat.key_polynomial import KeyPolynomial
81
+ from sage.combinat.permutation import Permutations, Permutation
82
+ from sage.misc.cachefunc import cached_method
83
+ from sage.misc.lazy_import import lazy_import
84
+ from sage.rings.integer import Integer
85
+ from sage.rings.integer_ring import ZZ
86
+ from sage.rings.polynomial.infinite_polynomial_element import InfinitePolynomial
87
+ from sage.rings.polynomial.multi_polynomial import MPolynomial
88
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
89
+
90
+ lazy_import('sage.libs.symmetrica', 'all', as_='symmetrica')
91
+
92
+
93
+ def SchubertPolynomialRing(R):
94
+ """
95
+ Return the Schubert polynomial ring over ``R`` on the X basis.
96
+
97
+ This is the basis made of the Schubert polynomials.
98
+
99
+ EXAMPLES::
100
+
101
+ sage: X = SchubertPolynomialRing(ZZ); X
102
+ Schubert polynomial ring with X basis over Integer Ring
103
+ sage: TestSuite(X).run()
104
+ sage: X(1)
105
+ X[1]
106
+ sage: X([1,2,3])*X([2,1,3])
107
+ X[2, 1]
108
+ sage: X([2,1,3])*X([2,1,3])
109
+ X[3, 1, 2]
110
+ sage: X([2,1,3])+X([3,1,2,4])
111
+ X[2, 1] + X[3, 1, 2]
112
+ sage: a = X([2,1,3])+X([3,1,2,4])
113
+ sage: a^2
114
+ X[3, 1, 2] + 2*X[4, 1, 2, 3] + X[5, 1, 2, 3, 4]
115
+ """
116
+ return SchubertPolynomialRing_xbasis(R)
117
+
118
+
119
+ class SchubertPolynomial_class(CombinatorialFreeModule.Element):
120
+ def expand(self):
121
+ """
122
+ EXAMPLES::
123
+
124
+ sage: X = SchubertPolynomialRing(ZZ)
125
+ sage: X([2,1,3]).expand()
126
+ x0
127
+ sage: [X(p).expand() for p in Permutations(3)]
128
+ [1, x0 + x1, x0, x0*x1, x0^2, x0^2*x1]
129
+
130
+ TESTS:
131
+
132
+ Calling .expand() should always return an element of an
133
+ MPolynomialRing::
134
+
135
+ sage: X = SchubertPolynomialRing(ZZ)
136
+ sage: f = X([1]); f
137
+ X[1]
138
+ sage: type(f.expand())
139
+ <class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
140
+ sage: f.expand()
141
+ 1
142
+ sage: f = X([1,2])
143
+ sage: type(f.expand())
144
+ <class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
145
+ sage: f = X([1,3,2,4])
146
+ sage: type(f.expand())
147
+ <class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
148
+
149
+ Now we check for correct handling of the empty
150
+ permutation (:issue:`23443`)::
151
+
152
+ sage: X([1]).expand() * X([2,1]).expand()
153
+ x0
154
+ """
155
+ p = symmetrica.t_SCHUBERT_POLYNOM(self)
156
+ if not isinstance(p, MPolynomial):
157
+ R = PolynomialRing(self.parent().base_ring(), 1, 'x0')
158
+ p = R(p)
159
+ return p
160
+
161
+ def divided_difference(self, i, algorithm='sage'):
162
+ r"""
163
+ Return the ``i``-th divided difference operator, applied to ``self``.
164
+
165
+ Here, ``i`` can be either a permutation or a positive integer.
166
+
167
+ INPUT:
168
+
169
+ - ``i`` -- permutation or positive integer
170
+
171
+ - ``algorithm`` -- (default: ``'sage'``) either ``'sage'``
172
+ or ``'symmetrica'``; this determines which software is
173
+ called for the computation
174
+
175
+ OUTPUT:
176
+
177
+ The result of applying the ``i``-th divided difference
178
+ operator to ``self``.
179
+
180
+ If `i` is a positive integer, then the `i`-th divided
181
+ difference operator `\delta_i` is the linear operator sending
182
+ each polynomial `f = f(x_1, x_2, \ldots, x_n)` (in
183
+ `n \geq i+1` variables) to the polynomial
184
+
185
+ .. MATH::
186
+
187
+ \frac{f - f_i}{x_i - x_{i+1}}, \qquad \text{ where }
188
+ f_i = f(x_1, x_2, ..., x_{i-1}, x_{i+1}, x_i,
189
+ x_{i+1}, ..., x_n) .
190
+
191
+ If `\sigma` is a permutation in the `n`-th symmetric group,
192
+ then the `\sigma`-th divided difference operator `\delta_\sigma`
193
+ is the composition
194
+ `\delta_{i_1} \delta_{i_2} \cdots \delta_{i_k}`, where
195
+ `\sigma = s_{i_1} \circ s_{i_2} \circ \cdots \circ s_{i_k}` is
196
+ any reduced expression for `\sigma` (the precise choice of
197
+ reduced expression is immaterial).
198
+
199
+ .. NOTE::
200
+
201
+ The :meth:`expand` method results in a polynomial
202
+ in `n` variables named ``x0, x1, ..., x(n-1)`` rather than
203
+ `x_1, x_2, \ldots, x_n`.
204
+ The variable named ``xi`` corresponds to `x_{i+1}`.
205
+ Thus, ``self.divided_difference(i)`` involves the variables
206
+ ``x(i-1)`` and ``xi`` getting switched (in the numerator).
207
+
208
+ EXAMPLES::
209
+
210
+ sage: X = SchubertPolynomialRing(ZZ)
211
+ sage: a = X([3,2,1])
212
+ sage: a.divided_difference(1)
213
+ X[2, 3, 1]
214
+ sage: a.divided_difference([3,2,1])
215
+ X[1]
216
+ sage: a.divided_difference(5)
217
+ 0
218
+
219
+ Any divided difference of `0` is `0`::
220
+
221
+ sage: X.zero().divided_difference(2)
222
+ 0
223
+
224
+ This is compatible when a permutation is given as input::
225
+
226
+ sage: a = X([3,2,4,1])
227
+ sage: a.divided_difference([2,3,1])
228
+ 0
229
+ sage: a.divided_difference(1).divided_difference(2)
230
+ 0
231
+
232
+ ::
233
+
234
+ sage: a = X([4,3,2,1])
235
+ sage: a.divided_difference([2,3,1])
236
+ X[3, 2, 4, 1]
237
+ sage: a.divided_difference(1).divided_difference(2)
238
+ X[3, 2, 4, 1]
239
+ sage: a.divided_difference([4,1,3,2])
240
+ X[1, 4, 2, 3]
241
+ sage: b = X([4, 1, 3, 2])
242
+ sage: b.divided_difference(1).divided_difference(2)
243
+ X[1, 3, 4, 2]
244
+ sage: b.divided_difference(1).divided_difference(2).divided_difference(3)
245
+ X[1, 3, 2]
246
+ sage: b.divided_difference(1).divided_difference(2).divided_difference(3).divided_difference(2)
247
+ X[1]
248
+ sage: b.divided_difference(1).divided_difference(2).divided_difference(3).divided_difference(3)
249
+ 0
250
+ sage: b.divided_difference(1).divided_difference(2).divided_difference(1)
251
+ 0
252
+
253
+ TESTS:
254
+
255
+ Check that :issue:`23403` is fixed::
256
+
257
+ sage: X = SchubertPolynomialRing(ZZ)
258
+ sage: a = X([3,2,4,1])
259
+ sage: a.divided_difference(2)
260
+ 0
261
+ sage: a.divided_difference([3,2,1])
262
+ 0
263
+ sage: a.divided_difference(0)
264
+ Traceback (most recent call last):
265
+ ...
266
+ ValueError: cannot apply \delta_{0} to a (= X[3, 2, 4, 1])
267
+ """
268
+ if not self: # if self is 0
269
+ return self
270
+ Perms = Permutations()
271
+ if i in ZZ:
272
+ if algorithm == "sage":
273
+ if i <= 0:
274
+ raise ValueError(r"cannot apply \delta_{%s} to a (= %s)" % (i, self))
275
+ # The operator `\delta_i` sends the Schubert
276
+ # polynomial `X_\pi` (where `\pi` is a finitely supported
277
+ # permutation of `\{1, 2, 3, \ldots\}`) to:
278
+ # - the Schubert polynomial X_\sigma`, where `\sigma` is
279
+ # obtained from `\pi` by switching the values at `i` and `i+1`,
280
+ # if `i` is a descent of `\pi` (that is, `\pi(i) > \pi(i+1)`);
281
+ # - `0` otherwise.
282
+ # Notice that distinct `\pi`s lead to distinct `\sigma`s,
283
+ # so we can use `_from_dict` here.
284
+ res_dict = {}
285
+ for pi, coeff in self:
286
+ pi = pi[:]
287
+ n = len(pi)
288
+ if n <= i:
289
+ continue
290
+ if pi[i - 1] < pi[i]:
291
+ continue
292
+ pi[i - 1], pi[i] = pi[i], pi[i - 1]
293
+ pi = Perms(pi).remove_extra_fixed_points()
294
+ res_dict[pi] = coeff
295
+ return self.parent()._from_dict(res_dict)
296
+ else: # if algorithm == "symmetrica":
297
+ return symmetrica.divdiff_schubert(i, self)
298
+ elif i in Perms:
299
+ if algorithm == "sage":
300
+ i = Permutation(i)
301
+ redw = i.reduced_word()
302
+ res_dict = {}
303
+ for pi, coeff in self:
304
+ next_pi = False
305
+ pi = pi[:]
306
+ n = len(pi)
307
+ for j in redw:
308
+ if n <= j:
309
+ next_pi = True
310
+ break
311
+ if pi[j - 1] < pi[j]:
312
+ next_pi = True
313
+ break
314
+ pi[j - 1], pi[j] = pi[j], pi[j - 1]
315
+ if next_pi:
316
+ continue
317
+ pi = Perms(pi).remove_extra_fixed_points()
318
+ res_dict[pi] = coeff
319
+ return self.parent()._from_dict(res_dict)
320
+ else: # if algorithm == "symmetrica":
321
+ return symmetrica.divdiff_perm_schubert(i, self)
322
+ else:
323
+ raise TypeError("i must either be an integer or permutation")
324
+
325
+ def scalar_product(self, x):
326
+ """
327
+ Return the standard scalar product of ``self`` and ``x``.
328
+
329
+ EXAMPLES::
330
+
331
+ sage: X = SchubertPolynomialRing(ZZ)
332
+ sage: a = X([3,2,4,1])
333
+ sage: a.scalar_product(a)
334
+ 0
335
+ sage: b = X([4,3,2,1])
336
+ sage: b.scalar_product(a)
337
+ X[1, 3, 4, 6, 2, 5]
338
+ sage: Permutation([1, 3, 4, 6, 2, 5, 7]).to_lehmer_code()
339
+ [0, 1, 1, 2, 0, 0, 0]
340
+ sage: s = SymmetricFunctions(ZZ).schur()
341
+ sage: c = s([2,1,1])
342
+ sage: b.scalar_product(a).expand()
343
+ x0^2*x1*x2 + x0*x1^2*x2 + x0*x1*x2^2 + x0^2*x1*x3 + x0*x1^2*x3
344
+ + x0^2*x2*x3 + 3*x0*x1*x2*x3 + x1^2*x2*x3 + x0*x2^2*x3 + x1*x2^2*x3
345
+ + x0*x1*x3^2 + x0*x2*x3^2 + x1*x2*x3^2
346
+ sage: c.expand(4)
347
+ x0^2*x1*x2 + x0*x1^2*x2 + x0*x1*x2^2 + x0^2*x1*x3 + x0*x1^2*x3
348
+ + x0^2*x2*x3 + 3*x0*x1*x2*x3 + x1^2*x2*x3 + x0*x2^2*x3 + x1*x2^2*x3
349
+ + x0*x1*x3^2 + x0*x2*x3^2 + x1*x2*x3^2
350
+ """
351
+ if isinstance(x, SchubertPolynomial_class):
352
+ return symmetrica.scalarproduct_schubert(self, x)
353
+ else:
354
+ raise TypeError("x must be a Schubert polynomial")
355
+
356
+ def multiply_variable(self, i):
357
+ """
358
+ Return the Schubert polynomial obtained by multiplying ``self``
359
+ by the variable `x_i`.
360
+
361
+ EXAMPLES::
362
+
363
+ sage: X = SchubertPolynomialRing(ZZ)
364
+ sage: a = X([3,2,4,1])
365
+ sage: a.multiply_variable(0)
366
+ X[4, 2, 3, 1]
367
+ sage: a.multiply_variable(1)
368
+ X[3, 4, 2, 1]
369
+ sage: a.multiply_variable(2)
370
+ X[3, 2, 5, 1, 4] - X[3, 4, 2, 1] - X[4, 2, 3, 1]
371
+ sage: a.multiply_variable(3)
372
+ X[3, 2, 4, 5, 1]
373
+ """
374
+ if isinstance(i, Integer):
375
+ return symmetrica.mult_schubert_variable(self, i)
376
+ else:
377
+ raise TypeError("i must be an integer")
378
+
379
+
380
+ class SchubertPolynomialRing_xbasis(CombinatorialFreeModule):
381
+
382
+ Element = SchubertPolynomial_class
383
+
384
+ def __init__(self, R):
385
+ """
386
+ EXAMPLES::
387
+
388
+ sage: X = SchubertPolynomialRing(QQ)
389
+ sage: X == loads(dumps(X))
390
+ True
391
+ """
392
+ self._name = "Schubert polynomial ring with X basis"
393
+ self._repr_option_bracket = False
394
+ CombinatorialFreeModule.__init__(self, R, Permutations(),
395
+ category=GradedAlgebrasWithBasis(R),
396
+ prefix='X')
397
+
398
+ @cached_method
399
+ def one_basis(self):
400
+ """
401
+ Return the index of the unit of this algebra.
402
+
403
+ EXAMPLES::
404
+
405
+ sage: X = SchubertPolynomialRing(QQ)
406
+ sage: X.one() # indirect doctest
407
+ X[1]
408
+ """
409
+ return self._indices([1])
410
+
411
+ def _element_constructor_(self, x):
412
+ """
413
+ Coerce x into ``self``.
414
+
415
+ EXAMPLES::
416
+
417
+ sage: X = SchubertPolynomialRing(QQ)
418
+ sage: X._element_constructor_([2,1,3])
419
+ X[2, 1]
420
+ sage: X._element_constructor_(Permutation([2,1,3]))
421
+ X[2, 1]
422
+
423
+ sage: R.<x1, x2, x3> = QQ[]
424
+ sage: X(x1^2*x2)
425
+ X[3, 2, 1]
426
+
427
+ sage: S.<x> = InfinitePolynomialRing(QQ)
428
+ sage: X(x[0]^2*x[1])
429
+ X[3, 2, 1]
430
+ sage: X(x[0]*x[1]^2*x[2]^2*x[3] + x[0]^2*x[1]^2*x[2]*x[3] + x[0]^2*x[1]*x[2]^2*x[3])
431
+ X[2, 4, 5, 3, 1]
432
+
433
+ sage: from sage.combinat.key_polynomial import KeyPolynomialBasis
434
+ sage: k = KeyPolynomialBasis(QQ)
435
+ sage: X(k([3,2,1]))
436
+ X[4, 3, 2, 1]
437
+
438
+ TESTS:
439
+
440
+ We check that :issue:`12924` is fixed::
441
+
442
+ sage: X = SchubertPolynomialRing(QQ)
443
+ sage: X._element_constructor_([1,2,1])
444
+ Traceback (most recent call last):
445
+ ...
446
+ ValueError: the input [1, 2, 1] is not a valid permutation
447
+
448
+ Now we check for correct handling of the empty
449
+ permutation (:issue:`23443`)::
450
+
451
+ sage: X([])
452
+ X[1]
453
+
454
+ Check the round trip from key polynomials::
455
+
456
+ sage: k = KeyPolynomials(ZZ)
457
+ sage: X = SchubertPolynomialRing(ZZ)
458
+ sage: it = iter(Permutations())
459
+ sage: for _ in range(50):
460
+ ....: P = next(it)
461
+ ....: assert X(k(X(P))) == X(P), P
462
+ """
463
+ if isinstance(x, list):
464
+ # checking the input to avoid symmetrica crashing Sage, see trac 12924
465
+ if x not in Permutations():
466
+ raise ValueError(f"the input {x} is not a valid permutation")
467
+ perm = Permutation(x).remove_extra_fixed_points()
468
+ return self._from_dict({perm: self.base_ring().one()})
469
+ elif isinstance(x, Permutation):
470
+ perm = x.remove_extra_fixed_points()
471
+ return self._from_dict({perm: self.base_ring().one()})
472
+ elif isinstance(x, MPolynomial):
473
+ return symmetrica.t_POLYNOM_SCHUBERT(x)
474
+ elif isinstance(x, InfinitePolynomial):
475
+ R = x.polynomial().parent()
476
+ # massage the term order to be what symmetrica expects
477
+ S = PolynomialRing(R.base_ring(),
478
+ names=list(map(repr, reversed(R.gens()))))
479
+ return symmetrica.t_POLYNOM_SCHUBERT(S(x.polynomial()))
480
+ elif isinstance(x, KeyPolynomial):
481
+ return self(x.expand())
482
+ else:
483
+ raise TypeError
484
+
485
+ def some_elements(self):
486
+ """
487
+ Return some elements.
488
+
489
+ EXAMPLES::
490
+
491
+ sage: X = SchubertPolynomialRing(QQ)
492
+ sage: X.some_elements()
493
+ [X[1], X[1] + 2*X[2, 1], -X[3, 2, 1] + X[4, 2, 1, 3]]
494
+ """
495
+ return [self.one(), self([1]) + 2 * self([2, 1]),
496
+ self([4, 2, 1, 3]) - self([3, 2, 1])]
497
+
498
+ def product_on_basis(self, left, right):
499
+ """
500
+ EXAMPLES::
501
+
502
+ sage: p1 = Permutation([3,2,1])
503
+ sage: p2 = Permutation([2,1,3])
504
+ sage: X = SchubertPolynomialRing(QQ)
505
+ sage: X.product_on_basis(p1,p2)
506
+ X[4, 2, 1, 3]
507
+ """
508
+ return symmetrica.mult_schubert_schubert(left, right)