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,652 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Lyndon words
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software: you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
# https://www.gnu.org/licenses/
|
|
13
|
+
# ****************************************************************************
|
|
14
|
+
|
|
15
|
+
from sage.arith.misc import divisors, gcd, moebius, multinomial
|
|
16
|
+
from sage.combinat.combinat_cython import lyndon_word_iterator
|
|
17
|
+
from sage.combinat.composition import Composition, Compositions
|
|
18
|
+
from sage.combinat.necklace import _sfc
|
|
19
|
+
from sage.combinat.words.finite_word import FiniteWord_class
|
|
20
|
+
from sage.combinat.words.words import FiniteWords
|
|
21
|
+
from sage.rings.integer import Integer
|
|
22
|
+
from sage.structure.parent import Parent
|
|
23
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def LyndonWords(e=None, k=None):
|
|
27
|
+
"""
|
|
28
|
+
Return the combinatorial class of Lyndon words.
|
|
29
|
+
|
|
30
|
+
A Lyndon word `w` is a word that is lexicographically less than all of
|
|
31
|
+
its rotations. Equivalently, whenever `w` is split into two non-empty
|
|
32
|
+
substrings, `w` is lexicographically less than the right substring.
|
|
33
|
+
|
|
34
|
+
See :wikipedia:`Lyndon_word`
|
|
35
|
+
|
|
36
|
+
INPUT:
|
|
37
|
+
|
|
38
|
+
- no input at all
|
|
39
|
+
|
|
40
|
+
or
|
|
41
|
+
|
|
42
|
+
- ``e`` -- integer; size of alphabet
|
|
43
|
+
- ``k`` -- integer; length of the words
|
|
44
|
+
|
|
45
|
+
or
|
|
46
|
+
|
|
47
|
+
- ``e`` -- a composition
|
|
48
|
+
|
|
49
|
+
OUTPUT: a combinatorial class of Lyndon words
|
|
50
|
+
|
|
51
|
+
EXAMPLES::
|
|
52
|
+
|
|
53
|
+
sage: LyndonWords()
|
|
54
|
+
Lyndon words
|
|
55
|
+
|
|
56
|
+
If e is an integer, then e specifies the length of the
|
|
57
|
+
alphabet; k must also be specified in this case::
|
|
58
|
+
|
|
59
|
+
sage: LW = LyndonWords(3, 4); LW
|
|
60
|
+
Lyndon words from an alphabet of size 3 of length 4
|
|
61
|
+
sage: LW.first()
|
|
62
|
+
word: 1112
|
|
63
|
+
sage: LW.last()
|
|
64
|
+
word: 2333
|
|
65
|
+
sage: LW.random_element() # random # needs sage.libs.pari
|
|
66
|
+
word: 1232
|
|
67
|
+
sage: LW.cardinality() # needs sage.libs.pari
|
|
68
|
+
18
|
|
69
|
+
|
|
70
|
+
If e is a (weak) composition, then it returns the class of Lyndon
|
|
71
|
+
words that have evaluation e::
|
|
72
|
+
|
|
73
|
+
sage: LyndonWords([2, 0, 1]).list()
|
|
74
|
+
[word: 113]
|
|
75
|
+
sage: LyndonWords([2, 0, 1, 0, 1]).list()
|
|
76
|
+
[word: 1135, word: 1153, word: 1315]
|
|
77
|
+
sage: LyndonWords([2, 1, 1]).list()
|
|
78
|
+
[word: 1123, word: 1132, word: 1213]
|
|
79
|
+
"""
|
|
80
|
+
if e is None and k is None:
|
|
81
|
+
return LyndonWords_class()
|
|
82
|
+
elif isinstance(e, (int, Integer)):
|
|
83
|
+
if e > 0:
|
|
84
|
+
if not isinstance(k, (int, Integer)):
|
|
85
|
+
raise TypeError("k must be a nonnegative integer")
|
|
86
|
+
if k < 0:
|
|
87
|
+
raise TypeError("k must be a nonnegative integer")
|
|
88
|
+
return LyndonWords_nk(Integer(e), Integer(k))
|
|
89
|
+
elif e in Compositions():
|
|
90
|
+
return LyndonWords_evaluation(Composition(e))
|
|
91
|
+
|
|
92
|
+
raise TypeError("e must be a positive integer or a composition")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def LyndonWord(data, check=True):
|
|
96
|
+
r"""
|
|
97
|
+
Construction of a Lyndon word.
|
|
98
|
+
|
|
99
|
+
INPUT:
|
|
100
|
+
|
|
101
|
+
- ``data`` -- list
|
|
102
|
+
- ``check`` -- boolean (default: ``True``); if ``True``,
|
|
103
|
+
check that the input data represents a Lyndon word
|
|
104
|
+
|
|
105
|
+
OUTPUT: a Lyndon word
|
|
106
|
+
|
|
107
|
+
EXAMPLES::
|
|
108
|
+
|
|
109
|
+
sage: LyndonWord([1,2,2])
|
|
110
|
+
word: 122
|
|
111
|
+
sage: LyndonWord([1,2,3])
|
|
112
|
+
word: 123
|
|
113
|
+
sage: LyndonWord([2,1,2,3])
|
|
114
|
+
Traceback (most recent call last):
|
|
115
|
+
...
|
|
116
|
+
ValueError: not a Lyndon word
|
|
117
|
+
|
|
118
|
+
If ``check`` is ``False``, then no verification is done::
|
|
119
|
+
|
|
120
|
+
sage: LyndonWord([2,1,2,3], check=False)
|
|
121
|
+
word: 2123
|
|
122
|
+
"""
|
|
123
|
+
return LyndonWords()(data, check=check)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class LyndonWords_class(UniqueRepresentation, Parent):
|
|
127
|
+
r"""
|
|
128
|
+
The set of all Lyndon words.
|
|
129
|
+
"""
|
|
130
|
+
def __init__(self, alphabet=None):
|
|
131
|
+
r"""
|
|
132
|
+
INPUT:
|
|
133
|
+
|
|
134
|
+
- ``alphabet`` -- the underlying alphabet
|
|
135
|
+
|
|
136
|
+
TESTS::
|
|
137
|
+
|
|
138
|
+
sage: loads(dumps(LyndonWords())) is LyndonWords()
|
|
139
|
+
True
|
|
140
|
+
"""
|
|
141
|
+
from sage.categories.sets_cat import Sets
|
|
142
|
+
self._words = FiniteWords()
|
|
143
|
+
Parent.__init__(self, category=Sets().Infinite(), facade=(self._words))
|
|
144
|
+
|
|
145
|
+
def __call__(self, *args, **kwds):
|
|
146
|
+
r"""
|
|
147
|
+
TESTS::
|
|
148
|
+
|
|
149
|
+
sage: L = LyndonWords()
|
|
150
|
+
sage: L('aababc')
|
|
151
|
+
word: aababc
|
|
152
|
+
sage: L([2,0,1])
|
|
153
|
+
Traceback (most recent call last):
|
|
154
|
+
...
|
|
155
|
+
ValueError: not a Lyndon word
|
|
156
|
+
"""
|
|
157
|
+
w = self._words(*args, **kwds)
|
|
158
|
+
if kwds.get('check', True) and not w.is_lyndon():
|
|
159
|
+
raise ValueError("not a Lyndon word")
|
|
160
|
+
return w
|
|
161
|
+
|
|
162
|
+
def __repr__(self):
|
|
163
|
+
r"""
|
|
164
|
+
String representation.
|
|
165
|
+
|
|
166
|
+
EXAMPLES::
|
|
167
|
+
|
|
168
|
+
sage: LyndonWords()
|
|
169
|
+
Lyndon words
|
|
170
|
+
"""
|
|
171
|
+
return "Lyndon words"
|
|
172
|
+
|
|
173
|
+
def __contains__(self, w):
|
|
174
|
+
"""
|
|
175
|
+
TESTS::
|
|
176
|
+
|
|
177
|
+
sage: LW33 = LyndonWords(3,3)
|
|
178
|
+
sage: all(lw in LyndonWords() for lw in LW33)
|
|
179
|
+
True
|
|
180
|
+
"""
|
|
181
|
+
if isinstance(w, list):
|
|
182
|
+
w = self._words(w, check=False)
|
|
183
|
+
return isinstance(w, FiniteWord_class) and w.is_lyndon()
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class LyndonWords_evaluation(UniqueRepresentation, Parent):
|
|
187
|
+
r"""
|
|
188
|
+
The set of Lyndon words on a fixed multiset of letters.
|
|
189
|
+
|
|
190
|
+
EXAMPLES::
|
|
191
|
+
|
|
192
|
+
sage: L = LyndonWords([1,2,1])
|
|
193
|
+
sage: L
|
|
194
|
+
Lyndon words with evaluation [1, 2, 1]
|
|
195
|
+
sage: L.list()
|
|
196
|
+
[word: 1223, word: 1232, word: 1322]
|
|
197
|
+
"""
|
|
198
|
+
def __init__(self, e):
|
|
199
|
+
"""
|
|
200
|
+
TESTS::
|
|
201
|
+
|
|
202
|
+
sage: LW21 = LyndonWords([2,1]); LW21
|
|
203
|
+
Lyndon words with evaluation [2, 1]
|
|
204
|
+
sage: LW21 == loads(dumps(LW21))
|
|
205
|
+
True
|
|
206
|
+
"""
|
|
207
|
+
self._e = e
|
|
208
|
+
self._words = FiniteWords(len(e))
|
|
209
|
+
|
|
210
|
+
from sage.categories.enumerated_sets import EnumeratedSets
|
|
211
|
+
Parent.__init__(self,
|
|
212
|
+
category=EnumeratedSets().Finite(),
|
|
213
|
+
facade=(self._words,)
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
def __repr__(self):
|
|
217
|
+
"""
|
|
218
|
+
TESTS::
|
|
219
|
+
|
|
220
|
+
sage: repr(LyndonWords([2,1,1]))
|
|
221
|
+
'Lyndon words with evaluation [2, 1, 1]'
|
|
222
|
+
"""
|
|
223
|
+
return "Lyndon words with evaluation %s" % self._e
|
|
224
|
+
|
|
225
|
+
def __call__(self, *args, **kwds):
|
|
226
|
+
r"""
|
|
227
|
+
TESTS::
|
|
228
|
+
|
|
229
|
+
sage: L = LyndonWords([1,2,1])
|
|
230
|
+
sage: L([1,2,2,3])
|
|
231
|
+
word: 1223
|
|
232
|
+
sage: L([2,1,2,3])
|
|
233
|
+
Traceback (most recent call last):
|
|
234
|
+
...
|
|
235
|
+
ValueError: not a Lyndon word
|
|
236
|
+
sage: L([1,2])
|
|
237
|
+
Traceback (most recent call last):
|
|
238
|
+
...
|
|
239
|
+
ValueError: evaluation is not [1, 2, 1]
|
|
240
|
+
"""
|
|
241
|
+
w = self._words(*args, **kwds)
|
|
242
|
+
if kwds.get('check', True) and not w.is_lyndon():
|
|
243
|
+
raise ValueError("not a Lyndon word")
|
|
244
|
+
if kwds.get('check', True) and w.evaluation() != self._e:
|
|
245
|
+
raise ValueError("evaluation is not {}".format(self._e))
|
|
246
|
+
return w
|
|
247
|
+
|
|
248
|
+
def __contains__(self, w):
|
|
249
|
+
"""
|
|
250
|
+
EXAMPLES::
|
|
251
|
+
|
|
252
|
+
sage: [1,2,1,2] in LyndonWords([2,2])
|
|
253
|
+
False
|
|
254
|
+
sage: [1,1,2,2] in LyndonWords([2,2])
|
|
255
|
+
True
|
|
256
|
+
sage: all(lw in LyndonWords([2,1,3,1]) for lw in LyndonWords([2,1,3,1]))
|
|
257
|
+
True
|
|
258
|
+
"""
|
|
259
|
+
if isinstance(w, list):
|
|
260
|
+
w = self._words(w, check=False)
|
|
261
|
+
if isinstance(w, FiniteWord_class) and all(x in self._words.alphabet() for x in w):
|
|
262
|
+
ev_dict = w.evaluation_dict()
|
|
263
|
+
evaluation = [ev_dict.get(x, 0) for x in self._words.alphabet()]
|
|
264
|
+
return evaluation == self._e and w.is_lyndon()
|
|
265
|
+
else:
|
|
266
|
+
return False
|
|
267
|
+
|
|
268
|
+
def cardinality(self):
|
|
269
|
+
"""
|
|
270
|
+
Return the number of Lyndon words with the evaluation e.
|
|
271
|
+
|
|
272
|
+
EXAMPLES::
|
|
273
|
+
|
|
274
|
+
sage: LyndonWords([]).cardinality()
|
|
275
|
+
0
|
|
276
|
+
sage: LyndonWords([2,2]).cardinality() # needs sage.libs.pari
|
|
277
|
+
1
|
|
278
|
+
sage: LyndonWords([2,3,2]).cardinality() # needs sage.libs.pari
|
|
279
|
+
30
|
|
280
|
+
|
|
281
|
+
Check to make sure that the count matches up with the number of
|
|
282
|
+
Lyndon words generated::
|
|
283
|
+
|
|
284
|
+
sage: comps = [[],[2,2],[3,2,7],[4,2]] + Compositions(4).list()
|
|
285
|
+
sage: lws = [LyndonWords(comp) for comp in comps]
|
|
286
|
+
sage: all(lw.cardinality() == len(lw.list()) for lw in lws) # needs sage.libs.pari
|
|
287
|
+
True
|
|
288
|
+
"""
|
|
289
|
+
evaluation = self._e
|
|
290
|
+
le = list(evaluation)
|
|
291
|
+
if not evaluation:
|
|
292
|
+
return Integer(0)
|
|
293
|
+
n = sum(evaluation)
|
|
294
|
+
return sum(moebius(j) * multinomial([ni // j for ni in evaluation])
|
|
295
|
+
for j in divisors(gcd(le))) // n
|
|
296
|
+
|
|
297
|
+
def __iter__(self):
|
|
298
|
+
"""
|
|
299
|
+
An iterator for the Lyndon words with evaluation e.
|
|
300
|
+
|
|
301
|
+
EXAMPLES::
|
|
302
|
+
|
|
303
|
+
sage: LyndonWords([1]).list() #indirect doctest
|
|
304
|
+
[word: 1]
|
|
305
|
+
sage: LyndonWords([2]).list() #indirect doctest
|
|
306
|
+
[]
|
|
307
|
+
sage: LyndonWords([3]).list() #indirect doctest
|
|
308
|
+
[]
|
|
309
|
+
sage: LyndonWords([3,1]).list() #indirect doctest
|
|
310
|
+
[word: 1112]
|
|
311
|
+
sage: LyndonWords([2,2]).list() #indirect doctest
|
|
312
|
+
[word: 1122]
|
|
313
|
+
sage: LyndonWords([1,3]).list() #indirect doctest
|
|
314
|
+
[word: 1222]
|
|
315
|
+
sage: LyndonWords([3,3]).list() #indirect doctest
|
|
316
|
+
[word: 111222, word: 112122, word: 112212]
|
|
317
|
+
sage: LyndonWords([4,3]).list() #indirect doctest
|
|
318
|
+
[word: 1111222, word: 1112122, word: 1112212, word: 1121122, word: 1121212]
|
|
319
|
+
|
|
320
|
+
TESTS:
|
|
321
|
+
|
|
322
|
+
Check that :issue:`12997` is fixed::
|
|
323
|
+
|
|
324
|
+
sage: LyndonWords([0,1]).list()
|
|
325
|
+
[word: 2]
|
|
326
|
+
sage: LyndonWords([0,2]).list()
|
|
327
|
+
[]
|
|
328
|
+
sage: LyndonWords([0,0,1,0,1]).list()
|
|
329
|
+
[word: 35]
|
|
330
|
+
"""
|
|
331
|
+
if not self._e:
|
|
332
|
+
return
|
|
333
|
+
k = 0
|
|
334
|
+
while self._e[k] == 0:
|
|
335
|
+
k += 1
|
|
336
|
+
for z in _sfc(self._e[k:], equality=True):
|
|
337
|
+
yield self._words([i + k + 1 for i in z], check=False)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
class LyndonWords_nk(UniqueRepresentation, Parent):
|
|
341
|
+
r"""
|
|
342
|
+
Lyndon words of fixed length `k` over the alphabet `\{1, 2, \ldots, n\}`.
|
|
343
|
+
|
|
344
|
+
INPUT:
|
|
345
|
+
|
|
346
|
+
- ``n`` -- the size of the alphabet
|
|
347
|
+
- ``k`` -- the length of the words
|
|
348
|
+
|
|
349
|
+
EXAMPLES::
|
|
350
|
+
|
|
351
|
+
sage: L = LyndonWords(3, 4)
|
|
352
|
+
sage: L.list()
|
|
353
|
+
[word: 1112,
|
|
354
|
+
word: 1113,
|
|
355
|
+
word: 1122,
|
|
356
|
+
word: 1123,
|
|
357
|
+
...
|
|
358
|
+
word: 1333,
|
|
359
|
+
word: 2223,
|
|
360
|
+
word: 2233,
|
|
361
|
+
word: 2333]
|
|
362
|
+
"""
|
|
363
|
+
def __init__(self, n, k):
|
|
364
|
+
"""
|
|
365
|
+
Initialize ``self``.
|
|
366
|
+
|
|
367
|
+
TESTS::
|
|
368
|
+
|
|
369
|
+
sage: LW23 = LyndonWords(2,3); LW23
|
|
370
|
+
Lyndon words from an alphabet of size 2 of length 3
|
|
371
|
+
sage: LW23== loads(dumps(LW23))
|
|
372
|
+
True
|
|
373
|
+
"""
|
|
374
|
+
self._n = n
|
|
375
|
+
self._k = k
|
|
376
|
+
self._words = FiniteWords(self._n)
|
|
377
|
+
|
|
378
|
+
from sage.categories.enumerated_sets import EnumeratedSets
|
|
379
|
+
Parent.__init__(self,
|
|
380
|
+
category=EnumeratedSets().Finite(),
|
|
381
|
+
facade=(self._words,)
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
def __repr__(self):
|
|
385
|
+
"""
|
|
386
|
+
TESTS::
|
|
387
|
+
|
|
388
|
+
sage: repr(LyndonWords(2, 3))
|
|
389
|
+
'Lyndon words from an alphabet of size 2 of length 3'
|
|
390
|
+
"""
|
|
391
|
+
return "Lyndon words from an alphabet of size %s of length %s" % (self._n, self._k)
|
|
392
|
+
|
|
393
|
+
def __call__(self, *args, **kwds):
|
|
394
|
+
r"""
|
|
395
|
+
TESTS::
|
|
396
|
+
|
|
397
|
+
sage: L = LyndonWords(3,3)
|
|
398
|
+
sage: L([1,2,3])
|
|
399
|
+
word: 123
|
|
400
|
+
sage: L([2,3,4])
|
|
401
|
+
Traceback (most recent call last):
|
|
402
|
+
...
|
|
403
|
+
ValueError: 4 not in alphabet
|
|
404
|
+
sage: L([2,1,3])
|
|
405
|
+
Traceback (most recent call last):
|
|
406
|
+
...
|
|
407
|
+
ValueError: not a Lyndon word
|
|
408
|
+
sage: L([1,2,2,3,3])
|
|
409
|
+
Traceback (most recent call last):
|
|
410
|
+
...
|
|
411
|
+
ValueError: length is not k=3
|
|
412
|
+
|
|
413
|
+
Make sure that the correct length is checked (:issue:`30186`)::
|
|
414
|
+
|
|
415
|
+
sage: L = LyndonWords(2, 4)
|
|
416
|
+
sage: _ = L(L.random_element()) # needs sage.libs.pari
|
|
417
|
+
"""
|
|
418
|
+
w = self._words(*args, **kwds)
|
|
419
|
+
if kwds.get('check', True) and not w.is_lyndon():
|
|
420
|
+
raise ValueError("not a Lyndon word")
|
|
421
|
+
if kwds.get('check', True) and w.length() != self._k:
|
|
422
|
+
raise ValueError("length is not k={}".format(self._k))
|
|
423
|
+
return w
|
|
424
|
+
|
|
425
|
+
def __contains__(self, w):
|
|
426
|
+
"""
|
|
427
|
+
TESTS::
|
|
428
|
+
|
|
429
|
+
sage: LW33 = LyndonWords(3,3)
|
|
430
|
+
sage: all(lw in LW33 for lw in LW33)
|
|
431
|
+
True
|
|
432
|
+
"""
|
|
433
|
+
if isinstance(w, list):
|
|
434
|
+
w = self._words(w, check=False)
|
|
435
|
+
return isinstance(w, FiniteWord_class) and w.length() == self._k \
|
|
436
|
+
and all(x in self._words.alphabet() for x in w) and w.is_lyndon()
|
|
437
|
+
|
|
438
|
+
def cardinality(self):
|
|
439
|
+
"""
|
|
440
|
+
TESTS::
|
|
441
|
+
|
|
442
|
+
sage: [ LyndonWords(3,i).cardinality() for i in range(1, 11) ] # needs sage.libs.pari
|
|
443
|
+
[3, 3, 8, 18, 48, 116, 312, 810, 2184, 5880]
|
|
444
|
+
"""
|
|
445
|
+
if self._k == 0:
|
|
446
|
+
return Integer(1)
|
|
447
|
+
else:
|
|
448
|
+
s = Integer(0)
|
|
449
|
+
for d in divisors(self._k):
|
|
450
|
+
s += moebius(d) * self._n**(self._k // d)
|
|
451
|
+
return s // self._k
|
|
452
|
+
|
|
453
|
+
def __iter__(self):
|
|
454
|
+
"""
|
|
455
|
+
TESTS::
|
|
456
|
+
|
|
457
|
+
sage: LyndonWords(3,3).list() # indirect doctest
|
|
458
|
+
[word: 112, word: 113, word: 122, word: 123, word: 132, word: 133, word: 223, word: 233]
|
|
459
|
+
|
|
460
|
+
sage: sum(1 for lw in LyndonWords(11, 6))
|
|
461
|
+
295020
|
|
462
|
+
|
|
463
|
+
sage: sum(1 for lw in LyndonWords(1000, 1))
|
|
464
|
+
1000
|
|
465
|
+
|
|
466
|
+
sage: sum(1 for lw in LyndonWords(1, 1000))
|
|
467
|
+
0
|
|
468
|
+
|
|
469
|
+
sage: list(LyndonWords(1, 1)) # needs sage.libs.pari
|
|
470
|
+
[word: 1]
|
|
471
|
+
"""
|
|
472
|
+
W = self._words._element_classes['list']
|
|
473
|
+
for lw in lyndon_word_iterator(self._n, self._k):
|
|
474
|
+
yield W(self._words, [i + 1 for i in lw])
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def StandardBracketedLyndonWords(n, k):
|
|
478
|
+
"""
|
|
479
|
+
Return the combinatorial class of standard bracketed Lyndon words
|
|
480
|
+
from [1, ..., n] of length k.
|
|
481
|
+
|
|
482
|
+
These are in one to one correspondence with the Lyndon words and
|
|
483
|
+
form a basis for the subspace of degree k of the free Lie algebra
|
|
484
|
+
of rank n.
|
|
485
|
+
|
|
486
|
+
EXAMPLES::
|
|
487
|
+
|
|
488
|
+
sage: SBLW33 = StandardBracketedLyndonWords(3,3); SBLW33
|
|
489
|
+
Standard bracketed Lyndon words from an alphabet of size 3 of length 3
|
|
490
|
+
sage: SBLW33.first()
|
|
491
|
+
[1, [1, 2]]
|
|
492
|
+
sage: SBLW33.last()
|
|
493
|
+
[[2, 3], 3]
|
|
494
|
+
sage: SBLW33.cardinality()
|
|
495
|
+
8
|
|
496
|
+
sage: SBLW33.random_element() in SBLW33
|
|
497
|
+
True
|
|
498
|
+
"""
|
|
499
|
+
return StandardBracketedLyndonWords_nk(n, k)
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
class StandardBracketedLyndonWords_nk(UniqueRepresentation, Parent):
|
|
503
|
+
def __init__(self, n, k):
|
|
504
|
+
"""
|
|
505
|
+
TESTS::
|
|
506
|
+
|
|
507
|
+
sage: SBLW = StandardBracketedLyndonWords(3, 2)
|
|
508
|
+
sage: SBLW == loads(dumps(SBLW))
|
|
509
|
+
True
|
|
510
|
+
"""
|
|
511
|
+
self._n = n
|
|
512
|
+
self._k = k
|
|
513
|
+
self._lyndon = LyndonWords(self._n, self._k)
|
|
514
|
+
|
|
515
|
+
from sage.categories.enumerated_sets import EnumeratedSets
|
|
516
|
+
Parent.__init__(self, category=EnumeratedSets().Finite())
|
|
517
|
+
|
|
518
|
+
def __repr__(self):
|
|
519
|
+
"""
|
|
520
|
+
TESTS::
|
|
521
|
+
|
|
522
|
+
sage: repr(StandardBracketedLyndonWords(3, 3))
|
|
523
|
+
'Standard bracketed Lyndon words from an alphabet of size 3 of length 3'
|
|
524
|
+
"""
|
|
525
|
+
return "Standard bracketed Lyndon words from an alphabet of size %s of length %s" % (self._n, self._k)
|
|
526
|
+
|
|
527
|
+
def cardinality(self):
|
|
528
|
+
"""
|
|
529
|
+
EXAMPLES::
|
|
530
|
+
|
|
531
|
+
sage: StandardBracketedLyndonWords(3, 3).cardinality()
|
|
532
|
+
8
|
|
533
|
+
sage: StandardBracketedLyndonWords(3, 4).cardinality()
|
|
534
|
+
18
|
|
535
|
+
"""
|
|
536
|
+
return self._lyndon.cardinality()
|
|
537
|
+
|
|
538
|
+
def __call__(self, *args, **kwds):
|
|
539
|
+
r"""
|
|
540
|
+
EXAMPLES::
|
|
541
|
+
|
|
542
|
+
sage: S = StandardBracketedLyndonWords(3, 3)
|
|
543
|
+
sage: S([1,2,3])
|
|
544
|
+
[1, [2, 3]]
|
|
545
|
+
"""
|
|
546
|
+
return standard_bracketing(self._lyndon(*args, **kwds))
|
|
547
|
+
|
|
548
|
+
def __contains__(self, sblw):
|
|
549
|
+
"""
|
|
550
|
+
EXAMPLES::
|
|
551
|
+
|
|
552
|
+
sage: S = StandardBracketedLyndonWords(2, 3)
|
|
553
|
+
sage: [[1, 2], 2] in S
|
|
554
|
+
True
|
|
555
|
+
sage: [1, [2, 2]] in S
|
|
556
|
+
False
|
|
557
|
+
sage: [1, [2, 3]] in S
|
|
558
|
+
False
|
|
559
|
+
sage: [1, 2] in S
|
|
560
|
+
False
|
|
561
|
+
"""
|
|
562
|
+
try:
|
|
563
|
+
lw = standard_unbracketing(sblw)
|
|
564
|
+
except ValueError:
|
|
565
|
+
return False
|
|
566
|
+
return len(lw) == self._k and all(a in self._lyndon._words.alphabet() for a in lw.parent().alphabet())
|
|
567
|
+
|
|
568
|
+
def __iter__(self):
|
|
569
|
+
"""
|
|
570
|
+
EXAMPLES::
|
|
571
|
+
|
|
572
|
+
sage: StandardBracketedLyndonWords(3, 3).list()
|
|
573
|
+
[[1, [1, 2]],
|
|
574
|
+
[1, [1, 3]],
|
|
575
|
+
[[1, 2], 2],
|
|
576
|
+
[1, [2, 3]],
|
|
577
|
+
[[1, 3], 2],
|
|
578
|
+
[[1, 3], 3],
|
|
579
|
+
[2, [2, 3]],
|
|
580
|
+
[[2, 3], 3]]
|
|
581
|
+
"""
|
|
582
|
+
for x in self._lyndon:
|
|
583
|
+
yield standard_bracketing(x)
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
def standard_bracketing(lw):
|
|
587
|
+
"""
|
|
588
|
+
Return the standard bracketing of a Lyndon word ``lw``.
|
|
589
|
+
|
|
590
|
+
EXAMPLES::
|
|
591
|
+
|
|
592
|
+
sage: import sage.combinat.words.lyndon_word as lyndon_word
|
|
593
|
+
sage: [lyndon_word.standard_bracketing(u) for u in LyndonWords(3,3)]
|
|
594
|
+
[[1, [1, 2]],
|
|
595
|
+
[1, [1, 3]],
|
|
596
|
+
[[1, 2], 2],
|
|
597
|
+
[1, [2, 3]],
|
|
598
|
+
[[1, 3], 2],
|
|
599
|
+
[[1, 3], 3],
|
|
600
|
+
[2, [2, 3]],
|
|
601
|
+
[[2, 3], 3]]
|
|
602
|
+
"""
|
|
603
|
+
if len(lw) == 1:
|
|
604
|
+
return lw[0]
|
|
605
|
+
|
|
606
|
+
for i in range(1, len(lw)):
|
|
607
|
+
if lw[i:] in LyndonWords():
|
|
608
|
+
return [standard_bracketing(lw[:i]), standard_bracketing(lw[i:])]
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
def standard_unbracketing(sblw):
|
|
612
|
+
"""
|
|
613
|
+
Return flattened ``sblw`` if it is a standard bracketing of a Lyndon word,
|
|
614
|
+
otherwise raise an error.
|
|
615
|
+
|
|
616
|
+
EXAMPLES::
|
|
617
|
+
|
|
618
|
+
sage: from sage.combinat.words.lyndon_word import standard_unbracketing
|
|
619
|
+
sage: standard_unbracketing([1, [2, 3]])
|
|
620
|
+
word: 123
|
|
621
|
+
sage: standard_unbracketing([[1, 2], 3])
|
|
622
|
+
Traceback (most recent call last):
|
|
623
|
+
...
|
|
624
|
+
ValueError: not a standard bracketing of a Lyndon word
|
|
625
|
+
|
|
626
|
+
TESTS::
|
|
627
|
+
|
|
628
|
+
sage: standard_unbracketing(1) # Letters don't use brackets.
|
|
629
|
+
word: 1
|
|
630
|
+
sage: standard_unbracketing([1])
|
|
631
|
+
Traceback (most recent call last):
|
|
632
|
+
...
|
|
633
|
+
ValueError: not a standard bracketing of a Lyndon word
|
|
634
|
+
"""
|
|
635
|
+
# Nested helper function that not only returns (flattened) w, but also its
|
|
636
|
+
# right factor in the standard Lyndon factorization.
|
|
637
|
+
def standard_unbracketing_rec(w):
|
|
638
|
+
if not isinstance(w, list):
|
|
639
|
+
return [w], []
|
|
640
|
+
if len(w) != 2:
|
|
641
|
+
raise ValueError("not a standard bracketing of a Lyndon word")
|
|
642
|
+
x, t = standard_unbracketing_rec(w[0])
|
|
643
|
+
y, _ = standard_unbracketing_rec(w[1])
|
|
644
|
+
# If x = st is a standard Lyndon factorization, and y is a Lyndon word
|
|
645
|
+
# such that y <= t, then xy is standard (but not necessarily Lyndon).
|
|
646
|
+
if x < y and (len(t) == 0 or y <= t):
|
|
647
|
+
x += y
|
|
648
|
+
return x, y
|
|
649
|
+
else:
|
|
650
|
+
raise ValueError("not a standard bracketing of a Lyndon word")
|
|
651
|
+
lw, _ = standard_unbracketing_rec(sblw)
|
|
652
|
+
return FiniteWords(list(set(lw)))(lw, datatype='list', check=False)
|