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.
- passagemath_combinat/__init__.py +3 -0
- passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
- passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
- passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
- passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
- passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
- sage/algebras/affine_nil_temperley_lieb.py +263 -0
- sage/algebras/all.py +24 -0
- sage/algebras/all__sagemath_combinat.py +35 -0
- sage/algebras/askey_wilson.py +935 -0
- sage/algebras/associated_graded.py +345 -0
- sage/algebras/cellular_basis.py +350 -0
- sage/algebras/cluster_algebra.py +2766 -0
- sage/algebras/down_up_algebra.py +860 -0
- sage/algebras/free_algebra.py +1698 -0
- sage/algebras/free_algebra_element.py +345 -0
- sage/algebras/free_algebra_quotient.py +405 -0
- sage/algebras/free_algebra_quotient_element.py +295 -0
- sage/algebras/free_zinbiel_algebra.py +885 -0
- sage/algebras/hall_algebra.py +783 -0
- sage/algebras/hecke_algebras/all.py +4 -0
- sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
- sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
- sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
- sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
- sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
- sage/algebras/iwahori_hecke_algebra.py +3095 -0
- sage/algebras/jordan_algebra.py +1773 -0
- sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
- sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
- sage/algebras/lie_conformal_algebras/all.py +18 -0
- sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
- sage/algebras/lie_conformal_algebras/examples.py +43 -0
- sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
- sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
- sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
- sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
- sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
- sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
- sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
- sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
- sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
- sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
- sage/algebras/nil_coxeter_algebra.py +191 -0
- sage/algebras/q_commuting_polynomials.py +673 -0
- sage/algebras/q_system.py +608 -0
- sage/algebras/quantum_clifford.py +959 -0
- sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
- sage/algebras/quantum_groups/all.py +9 -0
- sage/algebras/quantum_groups/fock_space.py +2219 -0
- sage/algebras/quantum_groups/q_numbers.py +207 -0
- sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
- sage/algebras/quantum_groups/representations.py +591 -0
- sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
- sage/algebras/quantum_oscillator.py +623 -0
- sage/algebras/quaternion_algebra.py +20 -0
- sage/algebras/quaternion_algebra_element.py +55 -0
- sage/algebras/rational_cherednik_algebra.py +525 -0
- sage/algebras/schur_algebra.py +670 -0
- sage/algebras/shuffle_algebra.py +1011 -0
- sage/algebras/splitting_algebra.py +779 -0
- sage/algebras/tensor_algebra.py +709 -0
- sage/algebras/yangian.py +1082 -0
- sage/algebras/yokonuma_hecke_algebra.py +1018 -0
- sage/all__sagemath_combinat.py +44 -0
- sage/combinat/SJT.py +255 -0
- sage/combinat/affine_permutation.py +2405 -0
- sage/combinat/algebraic_combinatorics.py +55 -0
- sage/combinat/all.py +53 -0
- sage/combinat/all__sagemath_combinat.py +195 -0
- sage/combinat/alternating_sign_matrix.py +2063 -0
- sage/combinat/baxter_permutations.py +346 -0
- sage/combinat/bijectionist.py +3220 -0
- sage/combinat/binary_recurrence_sequences.py +1180 -0
- sage/combinat/blob_algebra.py +685 -0
- sage/combinat/catalog_partitions.py +27 -0
- sage/combinat/chas/all.py +23 -0
- sage/combinat/chas/fsym.py +1180 -0
- sage/combinat/chas/wqsym.py +2601 -0
- sage/combinat/cluster_complex.py +326 -0
- sage/combinat/colored_permutations.py +2039 -0
- sage/combinat/colored_permutations_representations.py +964 -0
- sage/combinat/composition_signed.py +142 -0
- sage/combinat/composition_tableau.py +855 -0
- sage/combinat/constellation.py +1729 -0
- sage/combinat/core.py +751 -0
- sage/combinat/counting.py +12 -0
- sage/combinat/crystals/affine.py +742 -0
- sage/combinat/crystals/affine_factorization.py +518 -0
- sage/combinat/crystals/affinization.py +331 -0
- sage/combinat/crystals/alcove_path.py +2013 -0
- sage/combinat/crystals/all.py +22 -0
- sage/combinat/crystals/bkk_crystals.py +141 -0
- sage/combinat/crystals/catalog.py +115 -0
- sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
- sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
- sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
- sage/combinat/crystals/crystals.py +257 -0
- sage/combinat/crystals/direct_sum.py +260 -0
- sage/combinat/crystals/elementary_crystals.py +1251 -0
- sage/combinat/crystals/fast_crystals.py +441 -0
- sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
- sage/combinat/crystals/generalized_young_walls.py +1076 -0
- sage/combinat/crystals/highest_weight_crystals.py +436 -0
- sage/combinat/crystals/induced_structure.py +695 -0
- sage/combinat/crystals/infinity_crystals.py +730 -0
- sage/combinat/crystals/kac_modules.py +863 -0
- sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
- sage/combinat/crystals/kyoto_path_model.py +497 -0
- sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/letters.pxd +79 -0
- sage/combinat/crystals/letters.pyx +3056 -0
- sage/combinat/crystals/littelmann_path.py +1518 -0
- sage/combinat/crystals/monomial_crystals.py +1262 -0
- sage/combinat/crystals/multisegments.py +462 -0
- sage/combinat/crystals/mv_polytopes.py +467 -0
- sage/combinat/crystals/pbw_crystal.py +511 -0
- sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/pbw_datum.pxd +4 -0
- sage/combinat/crystals/pbw_datum.pyx +487 -0
- sage/combinat/crystals/polyhedral_realization.py +372 -0
- sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/spins.pxd +21 -0
- sage/combinat/crystals/spins.pyx +756 -0
- sage/combinat/crystals/star_crystal.py +290 -0
- sage/combinat/crystals/subcrystal.py +464 -0
- sage/combinat/crystals/tensor_product.py +1177 -0
- sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/tensor_product_element.pxd +35 -0
- sage/combinat/crystals/tensor_product_element.pyx +1870 -0
- sage/combinat/crystals/virtual_crystal.py +420 -0
- sage/combinat/cyclic_sieving_phenomenon.py +204 -0
- sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
- sage/combinat/degree_sequences.pyx +588 -0
- sage/combinat/derangements.py +527 -0
- sage/combinat/descent_algebra.py +1008 -0
- sage/combinat/diagram.py +1551 -0
- sage/combinat/diagram_algebras.py +5886 -0
- sage/combinat/dyck_word.py +4349 -0
- sage/combinat/e_one_star.py +1623 -0
- sage/combinat/enumerated_sets.py +123 -0
- sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
- sage/combinat/fast_vector_partitions.pyx +346 -0
- sage/combinat/fqsym.py +1977 -0
- sage/combinat/free_dendriform_algebra.py +954 -0
- sage/combinat/free_prelie_algebra.py +1141 -0
- sage/combinat/fully_commutative_elements.py +1077 -0
- sage/combinat/fully_packed_loop.py +1523 -0
- sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
- sage/combinat/gray_codes.py +311 -0
- sage/combinat/grossman_larson_algebras.py +667 -0
- sage/combinat/growth.py +4352 -0
- sage/combinat/hall_polynomial.py +188 -0
- sage/combinat/hillman_grassl.py +866 -0
- sage/combinat/integer_matrices.py +329 -0
- sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
- sage/combinat/k_tableau.py +4564 -0
- sage/combinat/kazhdan_lusztig.py +215 -0
- sage/combinat/key_polynomial.py +885 -0
- sage/combinat/knutson_tao_puzzles.py +2286 -0
- sage/combinat/lr_tableau.py +311 -0
- sage/combinat/matrices/all.py +24 -0
- sage/combinat/matrices/hadamard_matrix.py +3790 -0
- sage/combinat/matrices/latin.py +2912 -0
- sage/combinat/misc.py +401 -0
- sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
- sage/combinat/ncsf_qsym/all.py +21 -0
- sage/combinat/ncsf_qsym/combinatorics.py +317 -0
- sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
- sage/combinat/ncsf_qsym/ncsf.py +5637 -0
- sage/combinat/ncsf_qsym/qsym.py +4053 -0
- sage/combinat/ncsf_qsym/tutorial.py +447 -0
- sage/combinat/ncsym/all.py +21 -0
- sage/combinat/ncsym/bases.py +855 -0
- sage/combinat/ncsym/dual.py +593 -0
- sage/combinat/ncsym/ncsym.py +2076 -0
- sage/combinat/necklace.py +551 -0
- sage/combinat/non_decreasing_parking_function.py +634 -0
- sage/combinat/nu_dyck_word.py +1474 -0
- sage/combinat/output.py +861 -0
- sage/combinat/parallelogram_polyomino.py +4326 -0
- sage/combinat/parking_functions.py +1602 -0
- sage/combinat/partition_algebra.py +1998 -0
- sage/combinat/partition_kleshchev.py +1982 -0
- sage/combinat/partition_shifting_algebras.py +584 -0
- sage/combinat/partition_tuple.py +3114 -0
- sage/combinat/path_tableaux/all.py +13 -0
- sage/combinat/path_tableaux/catalog.py +29 -0
- sage/combinat/path_tableaux/dyck_path.py +380 -0
- sage/combinat/path_tableaux/frieze.py +476 -0
- sage/combinat/path_tableaux/path_tableau.py +728 -0
- sage/combinat/path_tableaux/semistandard.py +510 -0
- sage/combinat/perfect_matching.py +779 -0
- sage/combinat/plane_partition.py +3300 -0
- sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
- sage/combinat/q_bernoulli.pyx +128 -0
- sage/combinat/quickref.py +81 -0
- sage/combinat/recognizable_series.py +2051 -0
- sage/combinat/regular_sequence.py +4316 -0
- sage/combinat/regular_sequence_bounded.py +543 -0
- sage/combinat/restricted_growth.py +81 -0
- sage/combinat/ribbon.py +20 -0
- sage/combinat/ribbon_shaped_tableau.py +489 -0
- sage/combinat/ribbon_tableau.py +1180 -0
- sage/combinat/rigged_configurations/all.py +46 -0
- sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
- sage/combinat/rigged_configurations/bij_infinity.py +370 -0
- sage/combinat/rigged_configurations/bij_type_A.py +163 -0
- sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
- sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
- sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
- sage/combinat/rigged_configurations/bij_type_B.py +900 -0
- sage/combinat/rigged_configurations/bij_type_C.py +267 -0
- sage/combinat/rigged_configurations/bij_type_D.py +771 -0
- sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
- sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
- sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
- sage/combinat/rigged_configurations/bijection.py +143 -0
- sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
- sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
- sage/combinat/rigged_configurations/rc_crystal.py +461 -0
- sage/combinat/rigged_configurations/rc_infinity.py +540 -0
- sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
- sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
- sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
- sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
- sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
- sage/combinat/rsk.py +3438 -0
- sage/combinat/schubert_polynomial.py +508 -0
- sage/combinat/set_partition.py +3318 -0
- sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
- sage/combinat/set_partition_iterator.pyx +136 -0
- sage/combinat/set_partition_ordered.py +1590 -0
- sage/combinat/sf/abreu_nigro.py +346 -0
- sage/combinat/sf/all.py +52 -0
- sage/combinat/sf/character.py +576 -0
- sage/combinat/sf/classical.py +319 -0
- sage/combinat/sf/dual.py +996 -0
- sage/combinat/sf/elementary.py +549 -0
- sage/combinat/sf/hall_littlewood.py +1028 -0
- sage/combinat/sf/hecke.py +336 -0
- sage/combinat/sf/homogeneous.py +464 -0
- sage/combinat/sf/jack.py +1428 -0
- sage/combinat/sf/k_dual.py +1458 -0
- sage/combinat/sf/kfpoly.py +447 -0
- sage/combinat/sf/llt.py +789 -0
- sage/combinat/sf/macdonald.py +2019 -0
- sage/combinat/sf/monomial.py +525 -0
- sage/combinat/sf/multiplicative.py +113 -0
- sage/combinat/sf/new_kschur.py +1786 -0
- sage/combinat/sf/ns_macdonald.py +964 -0
- sage/combinat/sf/orthogonal.py +246 -0
- sage/combinat/sf/orthotriang.py +355 -0
- sage/combinat/sf/powersum.py +963 -0
- sage/combinat/sf/schur.py +880 -0
- sage/combinat/sf/sf.py +1653 -0
- sage/combinat/sf/sfa.py +7053 -0
- sage/combinat/sf/symplectic.py +253 -0
- sage/combinat/sf/witt.py +721 -0
- sage/combinat/shifted_primed_tableau.py +2735 -0
- sage/combinat/shuffle.py +830 -0
- sage/combinat/sidon_sets.py +146 -0
- sage/combinat/similarity_class_type.py +1721 -0
- sage/combinat/sine_gordon.py +618 -0
- sage/combinat/six_vertex_model.py +784 -0
- sage/combinat/skew_partition.py +2053 -0
- sage/combinat/skew_tableau.py +2989 -0
- sage/combinat/sloane_functions.py +8935 -0
- sage/combinat/specht_module.py +1403 -0
- sage/combinat/species/all.py +48 -0
- sage/combinat/species/characteristic_species.py +321 -0
- sage/combinat/species/composition_species.py +273 -0
- sage/combinat/species/cycle_species.py +284 -0
- sage/combinat/species/empty_species.py +155 -0
- sage/combinat/species/functorial_composition_species.py +148 -0
- sage/combinat/species/generating_series.py +673 -0
- sage/combinat/species/library.py +148 -0
- sage/combinat/species/linear_order_species.py +169 -0
- sage/combinat/species/misc.py +83 -0
- sage/combinat/species/partition_species.py +290 -0
- sage/combinat/species/permutation_species.py +268 -0
- sage/combinat/species/product_species.py +423 -0
- sage/combinat/species/recursive_species.py +476 -0
- sage/combinat/species/set_species.py +192 -0
- sage/combinat/species/species.py +820 -0
- sage/combinat/species/structure.py +539 -0
- sage/combinat/species/subset_species.py +243 -0
- sage/combinat/species/sum_species.py +225 -0
- sage/combinat/subword.py +564 -0
- sage/combinat/subword_complex.py +2122 -0
- sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
- sage/combinat/subword_complex_c.pyx +119 -0
- sage/combinat/super_tableau.py +821 -0
- sage/combinat/superpartition.py +1154 -0
- sage/combinat/symmetric_group_algebra.py +3774 -0
- sage/combinat/symmetric_group_representations.py +1830 -0
- sage/combinat/t_sequences.py +877 -0
- sage/combinat/tableau.py +9506 -0
- sage/combinat/tableau_residues.py +860 -0
- sage/combinat/tableau_tuple.py +5353 -0
- sage/combinat/tiling.py +2432 -0
- sage/combinat/triangles_FHM.py +777 -0
- sage/combinat/tutorial.py +1857 -0
- sage/combinat/vector_partition.py +337 -0
- sage/combinat/words/abstract_word.py +1722 -0
- sage/combinat/words/all.py +59 -0
- sage/combinat/words/alphabet.py +268 -0
- sage/combinat/words/finite_word.py +7201 -0
- sage/combinat/words/infinite_word.py +113 -0
- sage/combinat/words/lyndon_word.py +652 -0
- sage/combinat/words/morphic.py +351 -0
- sage/combinat/words/morphism.py +3878 -0
- sage/combinat/words/paths.py +2932 -0
- sage/combinat/words/shuffle_product.py +278 -0
- sage/combinat/words/suffix_trees.py +1873 -0
- sage/combinat/words/word.py +769 -0
- sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_datatypes.pxd +4 -0
- sage/combinat/words/word_datatypes.pyx +1067 -0
- sage/combinat/words/word_generators.py +2026 -0
- sage/combinat/words/word_infinite_datatypes.py +1218 -0
- sage/combinat/words/word_options.py +99 -0
- sage/combinat/words/words.py +2396 -0
- sage/data_structures/all__sagemath_combinat.py +1 -0
- sage/databases/all__sagemath_combinat.py +13 -0
- sage/databases/findstat.py +4897 -0
- sage/databases/oeis.py +2058 -0
- sage/databases/sloane.py +393 -0
- sage/dynamics/all__sagemath_combinat.py +14 -0
- sage/dynamics/cellular_automata/all.py +7 -0
- sage/dynamics/cellular_automata/catalog.py +34 -0
- sage/dynamics/cellular_automata/elementary.py +612 -0
- sage/dynamics/cellular_automata/glca.py +477 -0
- sage/dynamics/cellular_automata/solitons.py +1463 -0
- sage/dynamics/finite_dynamical_system.py +1249 -0
- sage/dynamics/finite_dynamical_system_catalog.py +382 -0
- sage/games/all.py +7 -0
- sage/games/hexad.py +704 -0
- sage/games/quantumino.py +591 -0
- sage/games/sudoku.py +889 -0
- sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
- sage/games/sudoku_backtrack.pyx +189 -0
- sage/groups/all__sagemath_combinat.py +1 -0
- sage/groups/indexed_free_group.py +489 -0
- sage/libs/all__sagemath_combinat.py +6 -0
- sage/libs/lrcalc/__init__.py +1 -0
- sage/libs/lrcalc/lrcalc.py +525 -0
- sage/libs/symmetrica/__init__.py +7 -0
- sage/libs/symmetrica/all.py +101 -0
- sage/libs/symmetrica/kostka.pxi +168 -0
- sage/libs/symmetrica/part.pxi +193 -0
- sage/libs/symmetrica/plet.pxi +42 -0
- sage/libs/symmetrica/sab.pxi +196 -0
- sage/libs/symmetrica/sb.pxi +332 -0
- sage/libs/symmetrica/sc.pxi +192 -0
- sage/libs/symmetrica/schur.pxi +956 -0
- sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
- sage/libs/symmetrica/symmetrica.pxi +1172 -0
- sage/libs/symmetrica/symmetrica.pyx +39 -0
- sage/monoids/all.py +13 -0
- sage/monoids/automatic_semigroup.py +1054 -0
- sage/monoids/free_abelian_monoid.py +315 -0
- sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
- sage/monoids/free_abelian_monoid_element.pxd +16 -0
- sage/monoids/free_abelian_monoid_element.pyx +397 -0
- sage/monoids/free_monoid.py +335 -0
- sage/monoids/free_monoid_element.py +431 -0
- sage/monoids/hecke_monoid.py +65 -0
- sage/monoids/string_monoid.py +817 -0
- sage/monoids/string_monoid_element.py +547 -0
- sage/monoids/string_ops.py +143 -0
- sage/monoids/trace_monoid.py +972 -0
- sage/rings/all__sagemath_combinat.py +2 -0
- sage/sat/all.py +4 -0
- sage/sat/boolean_polynomials.py +405 -0
- sage/sat/converters/__init__.py +6 -0
- sage/sat/converters/anf2cnf.py +14 -0
- sage/sat/converters/polybori.py +611 -0
- sage/sat/solvers/__init__.py +5 -0
- sage/sat/solvers/cryptominisat.py +287 -0
- sage/sat/solvers/dimacs.py +783 -0
- sage/sat/solvers/picosat.py +228 -0
- sage/sat/solvers/sat_lp.py +156 -0
- sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Elements of Free Monoids
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- David Kohel (2005-09-29)
|
|
8
|
+
|
|
9
|
+
Elements of free monoids are represented internally as lists of
|
|
10
|
+
pairs of integers.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# ****************************************************************************
|
|
14
|
+
# Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu>
|
|
15
|
+
#
|
|
16
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
17
|
+
#
|
|
18
|
+
# This code is distributed in the hope that it will be useful,
|
|
19
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
20
|
+
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
21
|
+
#
|
|
22
|
+
# See the GNU General Public License for more details; the full text
|
|
23
|
+
# is available at:
|
|
24
|
+
#
|
|
25
|
+
# https://www.gnu.org/licenses/
|
|
26
|
+
# ****************************************************************************
|
|
27
|
+
|
|
28
|
+
from sage.rings.integer import Integer
|
|
29
|
+
from sage.structure.element import MonoidElement
|
|
30
|
+
from sage.structure.richcmp import richcmp, richcmp_not_equal
|
|
31
|
+
from sage.rings.semirings.non_negative_integer_semiring import NN
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def is_FreeMonoidElement(x):
|
|
35
|
+
from sage.misc.superseded import deprecation
|
|
36
|
+
deprecation(38184,
|
|
37
|
+
"The function is_FreeMonoidElement is deprecated; "
|
|
38
|
+
"use 'isinstance(..., FreeMonoidElement)' instead.")
|
|
39
|
+
return isinstance(x, FreeMonoidElement)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class FreeMonoidElement(MonoidElement):
|
|
43
|
+
"""
|
|
44
|
+
Element of a free monoid.
|
|
45
|
+
|
|
46
|
+
EXAMPLES::
|
|
47
|
+
|
|
48
|
+
sage: a = FreeMonoid(5, 'a').gens()
|
|
49
|
+
sage: x = a[0]*a[1]*a[4]**3
|
|
50
|
+
sage: x**3
|
|
51
|
+
a0*a1*a4^3*a0*a1*a4^3*a0*a1*a4^3
|
|
52
|
+
sage: x**0
|
|
53
|
+
1
|
|
54
|
+
sage: x**(-1)
|
|
55
|
+
Traceback (most recent call last):
|
|
56
|
+
...
|
|
57
|
+
NotImplementedError
|
|
58
|
+
"""
|
|
59
|
+
def __init__(self, F, x, check=True):
|
|
60
|
+
"""
|
|
61
|
+
Create the element `x` of the FreeMonoid `F`.
|
|
62
|
+
|
|
63
|
+
This should typically be called by a FreeMonoid.
|
|
64
|
+
"""
|
|
65
|
+
MonoidElement.__init__(self, F)
|
|
66
|
+
if isinstance(x, (int, Integer)):
|
|
67
|
+
if x == 1:
|
|
68
|
+
self._element_list = []
|
|
69
|
+
else:
|
|
70
|
+
raise TypeError("argument x (= %s) is of the wrong type" % x)
|
|
71
|
+
elif isinstance(x, list):
|
|
72
|
+
if check:
|
|
73
|
+
x2 = []
|
|
74
|
+
for v in x:
|
|
75
|
+
if not (isinstance(v, tuple) and len(v) == 2):
|
|
76
|
+
raise TypeError("x (= %s) must be a list of 2-tuples or 1" % x)
|
|
77
|
+
if not (isinstance(v[0], (int, Integer)) and
|
|
78
|
+
isinstance(v[1], (int, Integer))):
|
|
79
|
+
raise TypeError("x (= %s) must be a list of 2-tuples of integers or 1" % x)
|
|
80
|
+
if len(x2) > 0 and v[0] == x2[len(x2)-1][0]:
|
|
81
|
+
x2[len(x2)-1] = (v[0], v[1]+x2[len(x2)-1][1])
|
|
82
|
+
else:
|
|
83
|
+
x2.append(v)
|
|
84
|
+
self._element_list = x2
|
|
85
|
+
else:
|
|
86
|
+
self._element_list = list(x) # make copy, so user can't accidentally change monoid.
|
|
87
|
+
|
|
88
|
+
else:
|
|
89
|
+
# TODO: should have some other checks here...
|
|
90
|
+
raise TypeError("argument x (= %s) is of the wrong type" % x)
|
|
91
|
+
|
|
92
|
+
def __hash__(self):
|
|
93
|
+
r"""
|
|
94
|
+
TESTS::
|
|
95
|
+
|
|
96
|
+
sage: R.<x,y> = FreeMonoid(2)
|
|
97
|
+
sage: hash(x) == hash(((0, 1),))
|
|
98
|
+
True
|
|
99
|
+
sage: hash(y) == hash(((1, 1),))
|
|
100
|
+
True
|
|
101
|
+
sage: hash(x*y) == hash(((0, 1), (1, 1)))
|
|
102
|
+
True
|
|
103
|
+
"""
|
|
104
|
+
return hash(tuple(self._element_list))
|
|
105
|
+
|
|
106
|
+
def __iter__(self):
|
|
107
|
+
"""
|
|
108
|
+
Return an iterator which yields tuples of variable and exponent.
|
|
109
|
+
|
|
110
|
+
EXAMPLES::
|
|
111
|
+
|
|
112
|
+
sage: a = FreeMonoid(5, 'a').gens()
|
|
113
|
+
sage: list(a[0]*a[1]*a[4]**3*a[0])
|
|
114
|
+
[(a0, 1), (a1, 1), (a4, 3), (a0, 1)]
|
|
115
|
+
"""
|
|
116
|
+
gens = self.parent().gens()
|
|
117
|
+
return ((gens[index], exponent)
|
|
118
|
+
for (index, exponent) in self._element_list)
|
|
119
|
+
|
|
120
|
+
def _repr_(self):
|
|
121
|
+
s = ""
|
|
122
|
+
v = self._element_list
|
|
123
|
+
x = self.parent().variable_names()
|
|
124
|
+
for i in range(len(v)):
|
|
125
|
+
if len(s) > 0:
|
|
126
|
+
s += "*"
|
|
127
|
+
g = x[int(v[i][0])]
|
|
128
|
+
e = v[i][1]
|
|
129
|
+
if e == 1:
|
|
130
|
+
s += "%s" % g
|
|
131
|
+
else:
|
|
132
|
+
s += f"{g}^{e}"
|
|
133
|
+
if len(s) == 0:
|
|
134
|
+
s = "1"
|
|
135
|
+
return s
|
|
136
|
+
|
|
137
|
+
def _latex_(self) -> str:
|
|
138
|
+
r"""
|
|
139
|
+
Return latex representation of ``self``.
|
|
140
|
+
|
|
141
|
+
EXAMPLES::
|
|
142
|
+
|
|
143
|
+
sage: F = FreeMonoid(3, 'a')
|
|
144
|
+
sage: z = F([(0,5),(1,2),(0,10),(0,2),(1,2)])
|
|
145
|
+
sage: z._latex_()
|
|
146
|
+
'a_{0}^{5}a_{1}^{2}a_{0}^{12}a_{1}^{2}'
|
|
147
|
+
sage: F.<alpha,beta,gamma> = FreeMonoid(3)
|
|
148
|
+
sage: latex(alpha*beta*gamma)
|
|
149
|
+
\alpha \beta \gamma
|
|
150
|
+
|
|
151
|
+
Check that :issue:`14509` is fixed::
|
|
152
|
+
|
|
153
|
+
sage: # needs sage.symbolic
|
|
154
|
+
sage: K.< alpha,b > = FreeAlgebra(SR)
|
|
155
|
+
sage: latex(alpha*b)
|
|
156
|
+
\alpha b
|
|
157
|
+
sage: latex(b*alpha)
|
|
158
|
+
b \alpha
|
|
159
|
+
sage: "%s" % latex(alpha*b)
|
|
160
|
+
'\\alpha b'
|
|
161
|
+
"""
|
|
162
|
+
s = ""
|
|
163
|
+
v = self._element_list
|
|
164
|
+
x = self.parent().latex_variable_names()
|
|
165
|
+
for i in range(len(v)):
|
|
166
|
+
g = x[int(v[i][0])]
|
|
167
|
+
e = v[i][1]
|
|
168
|
+
if e == 1:
|
|
169
|
+
s += f"{g} "
|
|
170
|
+
else:
|
|
171
|
+
s += f"{g}^{{{e}}}"
|
|
172
|
+
s = s.rstrip(" ") # strip the trailing whitespace caused by adding a space after each element name
|
|
173
|
+
if len(s) == 0:
|
|
174
|
+
s = "1"
|
|
175
|
+
return s
|
|
176
|
+
|
|
177
|
+
def __call__(self, *x, **kwds):
|
|
178
|
+
"""
|
|
179
|
+
EXAMPLES::
|
|
180
|
+
|
|
181
|
+
sage: M.<x,y> = FreeMonoid(2)
|
|
182
|
+
sage: (x*y).substitute(x=1)
|
|
183
|
+
y
|
|
184
|
+
|
|
185
|
+
sage: M.<a> = FreeMonoid(1)
|
|
186
|
+
sage: a.substitute(a=5)
|
|
187
|
+
5
|
|
188
|
+
|
|
189
|
+
sage: M.<x,y,z> = FreeMonoid(3)
|
|
190
|
+
sage: (x*y).subs(x=1,y=2,z=14)
|
|
191
|
+
2
|
|
192
|
+
sage: (x*y).subs({x:z,y:z})
|
|
193
|
+
z^2
|
|
194
|
+
|
|
195
|
+
It is still possible to substitute elements
|
|
196
|
+
that have no common parent::
|
|
197
|
+
|
|
198
|
+
sage: M1 = MatrixSpace(ZZ,1,2) # needs sage.modules
|
|
199
|
+
sage: M2 = MatrixSpace(ZZ,2,1) # needs sage.modules
|
|
200
|
+
sage: (x*y).subs({x: M1([1,2]), y: M2([3,4])}) # needs sage.modules
|
|
201
|
+
[11]
|
|
202
|
+
|
|
203
|
+
TESTS::
|
|
204
|
+
|
|
205
|
+
sage: M.<x,y> = FreeMonoid(2)
|
|
206
|
+
sage: (x*y)(QQ(4),QQ(5)).parent()
|
|
207
|
+
Rational Field
|
|
208
|
+
|
|
209
|
+
The codomain is by default the first parent::
|
|
210
|
+
|
|
211
|
+
sage: M.one()(QQ(4),QQ(5)).parent()
|
|
212
|
+
Rational Field
|
|
213
|
+
|
|
214
|
+
unless there is no variable and no substitution::
|
|
215
|
+
|
|
216
|
+
sage: M = FreeMonoid(0, [])
|
|
217
|
+
sage: M.one()().parent()
|
|
218
|
+
Free monoid on 0 generators ()
|
|
219
|
+
|
|
220
|
+
AUTHORS:
|
|
221
|
+
|
|
222
|
+
- Joel B. Mohler (2007-10-27)
|
|
223
|
+
"""
|
|
224
|
+
if kwds and x:
|
|
225
|
+
raise ValueError("must not specify both a keyword and positional argument")
|
|
226
|
+
|
|
227
|
+
P = self.parent()
|
|
228
|
+
|
|
229
|
+
if kwds:
|
|
230
|
+
x = self.gens()
|
|
231
|
+
gens_dict = {name: i for i, name in enumerate(P.variable_names())}
|
|
232
|
+
for key, value in kwds.items():
|
|
233
|
+
if key in gens_dict:
|
|
234
|
+
x[gens_dict[key]] = value
|
|
235
|
+
|
|
236
|
+
if x and isinstance(x[0], tuple):
|
|
237
|
+
x = x[0]
|
|
238
|
+
|
|
239
|
+
if len(x) != self.parent().ngens():
|
|
240
|
+
raise ValueError("must specify as many values as generators in parent")
|
|
241
|
+
|
|
242
|
+
# if no substitution, do nothing
|
|
243
|
+
if not x:
|
|
244
|
+
return self
|
|
245
|
+
|
|
246
|
+
try:
|
|
247
|
+
# This will land in the parent of the first element
|
|
248
|
+
result = x[0].parent().one()
|
|
249
|
+
except (AttributeError, TypeError):
|
|
250
|
+
# unless the parent has no unit
|
|
251
|
+
result = NN.one()
|
|
252
|
+
for var_index, exponent in self._element_list:
|
|
253
|
+
replacement = x[var_index]
|
|
254
|
+
if exponent > 1:
|
|
255
|
+
result *= replacement ** exponent
|
|
256
|
+
elif exponent == 1:
|
|
257
|
+
result *= replacement
|
|
258
|
+
return result
|
|
259
|
+
|
|
260
|
+
def _mul_(self, y):
|
|
261
|
+
"""
|
|
262
|
+
Multiply two elements ``self`` and ``y`` of the
|
|
263
|
+
free monoid.
|
|
264
|
+
|
|
265
|
+
EXAMPLES::
|
|
266
|
+
|
|
267
|
+
sage: a = FreeMonoid(5, 'a').gens()
|
|
268
|
+
sage: x = a[0] * a[1] * a[4]**3
|
|
269
|
+
sage: y = a[4] * a[0] * a[1]
|
|
270
|
+
sage: x*y
|
|
271
|
+
a0*a1*a4^4*a0*a1
|
|
272
|
+
"""
|
|
273
|
+
M = self.parent()
|
|
274
|
+
z = M(1)
|
|
275
|
+
x_elt = self._element_list
|
|
276
|
+
y_elt = y._element_list
|
|
277
|
+
if not x_elt:
|
|
278
|
+
z._element_list = y_elt
|
|
279
|
+
elif not y_elt:
|
|
280
|
+
z._element_list = x_elt
|
|
281
|
+
else:
|
|
282
|
+
k = len(x_elt)-1
|
|
283
|
+
if x_elt[k][0] != y_elt[0][0]:
|
|
284
|
+
z._element_list = x_elt + y_elt
|
|
285
|
+
else:
|
|
286
|
+
m = (y_elt[0][0], x_elt[k][1]+y_elt[0][1])
|
|
287
|
+
z._element_list = x_elt[:k] + [m] + y_elt[1:]
|
|
288
|
+
return z
|
|
289
|
+
|
|
290
|
+
def __invert__(self):
|
|
291
|
+
"""
|
|
292
|
+
EXAMPLES::
|
|
293
|
+
|
|
294
|
+
sage: a = FreeMonoid(5, 'a').gens()
|
|
295
|
+
sage: x = a[0]*a[1]*a[4]**3
|
|
296
|
+
sage: x**(-1)
|
|
297
|
+
Traceback (most recent call last):
|
|
298
|
+
...
|
|
299
|
+
NotImplementedError
|
|
300
|
+
"""
|
|
301
|
+
raise NotImplementedError
|
|
302
|
+
|
|
303
|
+
def __len__(self) -> int:
|
|
304
|
+
"""
|
|
305
|
+
Return the degree of the monoid element ``self``, where each
|
|
306
|
+
generator of the free monoid is given degree `1`.
|
|
307
|
+
|
|
308
|
+
For example, the length of the identity is `0`, and the
|
|
309
|
+
length of `x_0^2x_1` is `3`.
|
|
310
|
+
|
|
311
|
+
EXAMPLES::
|
|
312
|
+
|
|
313
|
+
sage: F = FreeMonoid(3, 'a')
|
|
314
|
+
sage: z = F(1)
|
|
315
|
+
sage: len(z)
|
|
316
|
+
0
|
|
317
|
+
sage: a = F.gens()
|
|
318
|
+
sage: len(a[0]**2 * a[1])
|
|
319
|
+
3
|
|
320
|
+
"""
|
|
321
|
+
return sum(x[1] for x in self._element_list)
|
|
322
|
+
|
|
323
|
+
def _richcmp_(self, other, op) -> bool:
|
|
324
|
+
"""
|
|
325
|
+
Compare two free monoid elements with the same parents.
|
|
326
|
+
|
|
327
|
+
The ordering is first by increasing length, then lexicographically
|
|
328
|
+
on the underlying word.
|
|
329
|
+
|
|
330
|
+
EXAMPLES::
|
|
331
|
+
|
|
332
|
+
sage: S = FreeMonoid(3, 'a')
|
|
333
|
+
sage: (x,y,z) = S.gens()
|
|
334
|
+
sage: x * y < y * x
|
|
335
|
+
True
|
|
336
|
+
|
|
337
|
+
sage: a = FreeMonoid(5, 'a').gens()
|
|
338
|
+
sage: x = a[0]*a[1]*a[4]**3
|
|
339
|
+
sage: x < x
|
|
340
|
+
False
|
|
341
|
+
sage: x == x
|
|
342
|
+
True
|
|
343
|
+
sage: x >= x*x
|
|
344
|
+
False
|
|
345
|
+
"""
|
|
346
|
+
m = sum(i for x, i in self._element_list)
|
|
347
|
+
n = sum(i for x, i in other._element_list)
|
|
348
|
+
if m != n:
|
|
349
|
+
return richcmp_not_equal(m, n, op)
|
|
350
|
+
v = tuple([x for x, i in self._element_list for j in range(i)])
|
|
351
|
+
w = tuple([x for x, i in other._element_list for j in range(i)])
|
|
352
|
+
return richcmp(v, w, op)
|
|
353
|
+
|
|
354
|
+
def _acted_upon_(self, x, self_on_left):
|
|
355
|
+
"""
|
|
356
|
+
Return the action of the integer 1 on this element.
|
|
357
|
+
|
|
358
|
+
EXAMPLES::
|
|
359
|
+
|
|
360
|
+
sage: M.<x,y,z>=FreeMonoid(3)
|
|
361
|
+
sage: 1*x
|
|
362
|
+
x
|
|
363
|
+
"""
|
|
364
|
+
if x == 1:
|
|
365
|
+
return self
|
|
366
|
+
return None
|
|
367
|
+
|
|
368
|
+
def to_word(self, alph=None):
|
|
369
|
+
"""
|
|
370
|
+
Return ``self`` as a word.
|
|
371
|
+
|
|
372
|
+
INPUT:
|
|
373
|
+
|
|
374
|
+
- ``alph`` -- (optional) the alphabet which the result should
|
|
375
|
+
be specified in
|
|
376
|
+
|
|
377
|
+
EXAMPLES::
|
|
378
|
+
|
|
379
|
+
sage: M.<x,y,z> = FreeMonoid(3)
|
|
380
|
+
sage: a = x * x * y * x
|
|
381
|
+
sage: w = a.to_word(); w
|
|
382
|
+
word: xxyx
|
|
383
|
+
sage: w.to_monoid_element() == a
|
|
384
|
+
True
|
|
385
|
+
|
|
386
|
+
.. SEEALSO::
|
|
387
|
+
|
|
388
|
+
:meth:`to_list`
|
|
389
|
+
"""
|
|
390
|
+
from sage.combinat.words.finite_word import Words
|
|
391
|
+
gens = self.parent().gens()
|
|
392
|
+
if alph is None:
|
|
393
|
+
alph = gens
|
|
394
|
+
alph = [str(c) for c in alph]
|
|
395
|
+
W = Words(alph, infinite=False)
|
|
396
|
+
return W(sum([[alph[gens.index(i[0])]] * i[1] for i in self], []))
|
|
397
|
+
|
|
398
|
+
def to_list(self, indices=False) -> list:
|
|
399
|
+
r"""
|
|
400
|
+
Return ``self`` as a list of generators.
|
|
401
|
+
|
|
402
|
+
If ``self`` equals `x_{i_1} x_{i_2} \cdots x_{i_n}`, with
|
|
403
|
+
`x_{i_1}, x_{i_2}, \ldots, x_{i_n}` being some of the
|
|
404
|
+
generators of the free monoid, then this method returns
|
|
405
|
+
the list `[x_{i_1}, x_{i_2}, \ldots, x_{i_n}]`.
|
|
406
|
+
|
|
407
|
+
If the optional argument ``indices`` is set to ``True``,
|
|
408
|
+
then the list `[i_1, i_2, \ldots, i_n]` is returned instead.
|
|
409
|
+
|
|
410
|
+
EXAMPLES::
|
|
411
|
+
|
|
412
|
+
sage: M.<x,y,z> = FreeMonoid(3)
|
|
413
|
+
sage: a = x * x * y * x
|
|
414
|
+
sage: w = a.to_list(); w
|
|
415
|
+
[x, x, y, x]
|
|
416
|
+
sage: M.prod(w) == a
|
|
417
|
+
True
|
|
418
|
+
sage: w = a.to_list(indices=True); w
|
|
419
|
+
[0, 0, 1, 0]
|
|
420
|
+
sage: a = M.one()
|
|
421
|
+
sage: a.to_list()
|
|
422
|
+
[]
|
|
423
|
+
|
|
424
|
+
.. SEEALSO::
|
|
425
|
+
|
|
426
|
+
:meth:`to_word`
|
|
427
|
+
"""
|
|
428
|
+
if not indices:
|
|
429
|
+
return sum(([i[0]] * i[1] for i in list(self)), [])
|
|
430
|
+
gens = self.parent().gens()
|
|
431
|
+
return sum(([gens.index(i[0])] * i[1] for i in list(self)), [])
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.groups
|
|
3
|
+
"""
|
|
4
|
+
Hecke Monoids
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2015 Nicolas M. Thiéry <nthiery at users.sf.net>
|
|
8
|
+
#
|
|
9
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
10
|
+
# https://www.gnu.org/licenses/
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
from sage.misc.cachefunc import cached_function
|
|
13
|
+
from sage.sets.finite_set_maps import FiniteSetMaps
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@cached_function
|
|
17
|
+
def HeckeMonoid(W):
|
|
18
|
+
r"""
|
|
19
|
+
Return the `0`-Hecke monoid of the Coxeter group `W`.
|
|
20
|
+
|
|
21
|
+
INPUT:
|
|
22
|
+
|
|
23
|
+
- ``W`` -- a finite Coxeter group
|
|
24
|
+
|
|
25
|
+
Let `s_1,\ldots,s_n` be the simple reflections of `W`. The 0-Hecke
|
|
26
|
+
monoid is the monoid generated by projections `\pi_1,\ldots,\pi_n`
|
|
27
|
+
satisfying the same braid and commutation relations as the `s_i`.
|
|
28
|
+
It is of same cardinality as `W`.
|
|
29
|
+
|
|
30
|
+
.. NOTE::
|
|
31
|
+
|
|
32
|
+
This is currently a very basic implementation as the submonoid
|
|
33
|
+
of sorting maps on `W` generated by the simple projections of
|
|
34
|
+
`W`. It's only functional for `W` finite.
|
|
35
|
+
|
|
36
|
+
.. SEEALSO::
|
|
37
|
+
|
|
38
|
+
- :class:`CoxeterGroups`
|
|
39
|
+
- :class:`CoxeterGroups.ParentMethods.simple_projections`
|
|
40
|
+
- :class:`IwahoriHeckeAlgebra`
|
|
41
|
+
|
|
42
|
+
EXAMPLES::
|
|
43
|
+
|
|
44
|
+
sage: from sage.monoids.hecke_monoid import HeckeMonoid
|
|
45
|
+
sage: W = SymmetricGroup(4)
|
|
46
|
+
sage: H = HeckeMonoid(W); H
|
|
47
|
+
0-Hecke monoid of the Symmetric group of order 4! as a permutation group
|
|
48
|
+
sage: pi = H.monoid_generators(); pi
|
|
49
|
+
Finite family {1: ..., 2: ..., 3: ...}
|
|
50
|
+
sage: all(pi[i]^2 == pi[i] for i in pi.keys())
|
|
51
|
+
True
|
|
52
|
+
sage: pi[1] * pi[2] * pi[1] == pi[2] * pi[1] * pi[2]
|
|
53
|
+
True
|
|
54
|
+
sage: pi[2] * pi[3] * pi[2] == pi[3] * pi[2] * pi[3]
|
|
55
|
+
True
|
|
56
|
+
sage: pi[1] * pi[3] == pi[3] * pi[1]
|
|
57
|
+
True
|
|
58
|
+
sage: H.cardinality()
|
|
59
|
+
24
|
|
60
|
+
"""
|
|
61
|
+
ambient_monoid = FiniteSetMaps(W, action='right')
|
|
62
|
+
pi = W.simple_projections(length_increasing=True).map(ambient_monoid)
|
|
63
|
+
H = ambient_monoid.submonoid(pi)
|
|
64
|
+
H.rename("0-Hecke monoid of the %s" % W)
|
|
65
|
+
return H
|