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,769 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Word classes
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Arnaud Bergeron
|
|
8
|
+
- Amy Glen
|
|
9
|
+
- Sébastien Labbé
|
|
10
|
+
- Franco Saliola
|
|
11
|
+
"""
|
|
12
|
+
#*****************************************************************************
|
|
13
|
+
# Copyright (C) 2008 Arnaud Bergeron <abergeron@gmail.com>,
|
|
14
|
+
# Amy Glen <amy.glen@gmail.com>,
|
|
15
|
+
# Sébastien Labbé <slabqc@gmail.com>,
|
|
16
|
+
# Franco Saliola <saliola@gmail.com>
|
|
17
|
+
#
|
|
18
|
+
# This program is free software: you can redistribute it and/or modify
|
|
19
|
+
# it under the terms of the GNU General Public License as published by
|
|
20
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
21
|
+
# (at your option) any later version.
|
|
22
|
+
# http://www.gnu.org/licenses/
|
|
23
|
+
#*****************************************************************************
|
|
24
|
+
from sage.misc.lazy_import import lazy_import
|
|
25
|
+
from sage.combinat.words.word_char import WordDatatype_char
|
|
26
|
+
from sage.combinat.words.abstract_word import Word_class
|
|
27
|
+
from sage.combinat.words.finite_word import FiniteWord_class
|
|
28
|
+
from sage.combinat.words.infinite_word import InfiniteWord_class
|
|
29
|
+
from .word_datatypes import (WordDatatype_str,
|
|
30
|
+
WordDatatype_list,
|
|
31
|
+
WordDatatype_tuple)
|
|
32
|
+
from .word_infinite_datatypes import (
|
|
33
|
+
WordDatatype_iter_with_caching,
|
|
34
|
+
WordDatatype_iter,
|
|
35
|
+
WordDatatype_callable_with_caching,
|
|
36
|
+
WordDatatype_callable)
|
|
37
|
+
from .morphic import WordDatatype_morphic
|
|
38
|
+
|
|
39
|
+
lazy_import('sage.monoids.free_monoid_element', 'FreeMonoidElement')
|
|
40
|
+
|
|
41
|
+
# TODO. Word needs to be replaced by Word. Consider renaming
|
|
42
|
+
# Word_class to Word and imbedding Word as its __call__ method.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def Word(data=None, alphabet=None, length=None, datatype=None, caching=True, RSK_data=None):
|
|
46
|
+
r"""
|
|
47
|
+
Construct a word.
|
|
48
|
+
|
|
49
|
+
INPUT:
|
|
50
|
+
|
|
51
|
+
- ``data`` -- (default: ``None``) list, string, tuple, iterator, free
|
|
52
|
+
monoid element, ``None`` (shorthand for ``[]``), or a callable defined
|
|
53
|
+
on ``[0,1,...,length]``
|
|
54
|
+
|
|
55
|
+
- ``alphabet`` -- any argument accepted by Words
|
|
56
|
+
|
|
57
|
+
- ``length`` -- (default: ``None``) this is dependent on the type of data.
|
|
58
|
+
It is ignored for words defined by lists, strings, tuples,
|
|
59
|
+
etc., because they have a naturally defined length.
|
|
60
|
+
For callables, this defines the domain of definition,
|
|
61
|
+
which is assumed to be ``[0, 1, 2, ..., length-1]``.
|
|
62
|
+
For iterators: Infinity if you know the iterator will not
|
|
63
|
+
terminate (default); ``'unknown'`` if you do not know whether the
|
|
64
|
+
iterator terminates; ``'finite'`` if you know that the iterator
|
|
65
|
+
terminates, but do not know the length.
|
|
66
|
+
|
|
67
|
+
- ``datatype`` -- (default: ``None``) ``None``, ``'list'``, ``'str'``,
|
|
68
|
+
``'tuple'``, ``'iter'``, ``'callable'``; if ``None``, then the function
|
|
69
|
+
tries to guess this from the data
|
|
70
|
+
|
|
71
|
+
- ``caching`` -- boolean (default: ``True``); whether to
|
|
72
|
+
keep a cache of the letters computed by an iterator or callable
|
|
73
|
+
|
|
74
|
+
- ``RSK_data`` -- (default: ``None``) semistandard and a
|
|
75
|
+
standard Young tableau to run the inverse RSK bijection on
|
|
76
|
+
|
|
77
|
+
.. NOTE::
|
|
78
|
+
|
|
79
|
+
Be careful when defining words using callables and iterators. It
|
|
80
|
+
appears that islice does not pickle correctly causing various errors
|
|
81
|
+
when reloading. Also, most iterators do not support copying and
|
|
82
|
+
should not support pickling by extension.
|
|
83
|
+
|
|
84
|
+
EXAMPLES:
|
|
85
|
+
|
|
86
|
+
Empty word::
|
|
87
|
+
|
|
88
|
+
sage: Word()
|
|
89
|
+
word:
|
|
90
|
+
|
|
91
|
+
Word with string::
|
|
92
|
+
|
|
93
|
+
sage: Word("abbabaab")
|
|
94
|
+
word: abbabaab
|
|
95
|
+
|
|
96
|
+
Word with string constructed from other types::
|
|
97
|
+
|
|
98
|
+
sage: Word([0,1,1,0,1,0,0,1], datatype='str')
|
|
99
|
+
word: 01101001
|
|
100
|
+
sage: Word((0,1,1,0,1,0,0,1), datatype='str')
|
|
101
|
+
word: 01101001
|
|
102
|
+
|
|
103
|
+
Word with list::
|
|
104
|
+
|
|
105
|
+
sage: Word([0,1,1,0,1,0,0,1])
|
|
106
|
+
word: 01101001
|
|
107
|
+
|
|
108
|
+
Word with list constructed from other types::
|
|
109
|
+
|
|
110
|
+
sage: Word("01101001", datatype='list')
|
|
111
|
+
word: 01101001
|
|
112
|
+
sage: Word((0,1,1,0,1,0,0,1), datatype='list')
|
|
113
|
+
word: 01101001
|
|
114
|
+
|
|
115
|
+
Word with tuple::
|
|
116
|
+
|
|
117
|
+
sage: Word((0,1,1,0,1,0,0,1))
|
|
118
|
+
word: 01101001
|
|
119
|
+
|
|
120
|
+
Word with tuple constructed from other types::
|
|
121
|
+
|
|
122
|
+
sage: Word([0,1,1,0,1,0,0,1], datatype='tuple')
|
|
123
|
+
word: 01101001
|
|
124
|
+
sage: Word("01101001", datatype='str')
|
|
125
|
+
word: 01101001
|
|
126
|
+
|
|
127
|
+
Word with iterator::
|
|
128
|
+
|
|
129
|
+
sage: from itertools import count
|
|
130
|
+
sage: Word(count())
|
|
131
|
+
word: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,...
|
|
132
|
+
sage: Word(iter("abbabaab")) # iterators default to infinite words
|
|
133
|
+
word: abbabaab
|
|
134
|
+
sage: Word(iter("abbabaab"), length='unknown')
|
|
135
|
+
word: abbabaab
|
|
136
|
+
sage: Word(iter("abbabaab"), length='finite')
|
|
137
|
+
word: abbabaab
|
|
138
|
+
|
|
139
|
+
Word with function (a 'callable')::
|
|
140
|
+
|
|
141
|
+
sage: f = lambda n : add(Integer(n).digits(2)) % 2
|
|
142
|
+
sage: Word(f)
|
|
143
|
+
word: 0110100110010110100101100110100110010110...
|
|
144
|
+
sage: Word(f, length=8)
|
|
145
|
+
word: 01101001
|
|
146
|
+
|
|
147
|
+
Word over a string with a parent::
|
|
148
|
+
|
|
149
|
+
sage: w = Word("abbabaab", alphabet='abc'); w
|
|
150
|
+
word: abbabaab
|
|
151
|
+
sage: w.parent()
|
|
152
|
+
Finite words over {'a', 'b', 'c'}
|
|
153
|
+
|
|
154
|
+
Word from a free monoid element::
|
|
155
|
+
|
|
156
|
+
sage: M.<x,y,z> = FreeMonoid(3)
|
|
157
|
+
sage: Word(x^3*y*x*z^2*x)
|
|
158
|
+
word: xxxyxzzx
|
|
159
|
+
|
|
160
|
+
The default parent is the combinatorial class of all words::
|
|
161
|
+
|
|
162
|
+
sage: w = Word("abbabaab"); w
|
|
163
|
+
word: abbabaab
|
|
164
|
+
sage: w.parent()
|
|
165
|
+
Finite words over Set of Python objects of class 'object'
|
|
166
|
+
|
|
167
|
+
We can also input a semistandard tableau and a standard tableau to
|
|
168
|
+
obtain a word from the inverse RSK algorithm using the
|
|
169
|
+
``RSK_data`` option::
|
|
170
|
+
|
|
171
|
+
sage: p = Tableau([[1,2,2],[3]]); q = Tableau([[1,2,4],[3]])
|
|
172
|
+
sage: Word(RSK_data=[p, q])
|
|
173
|
+
word: 1322
|
|
174
|
+
|
|
175
|
+
TESTS::
|
|
176
|
+
|
|
177
|
+
sage: Word(5)
|
|
178
|
+
Traceback (most recent call last):
|
|
179
|
+
...
|
|
180
|
+
ValueError: cannot guess a datatype from data (=5); please specify one
|
|
181
|
+
|
|
182
|
+
::
|
|
183
|
+
|
|
184
|
+
sage: W = Words()
|
|
185
|
+
sage: w = W('abc')
|
|
186
|
+
sage: w is W(w)
|
|
187
|
+
True
|
|
188
|
+
sage: w is Word(w, alphabet='abc')
|
|
189
|
+
False
|
|
190
|
+
"""
|
|
191
|
+
if isinstance(data, FreeMonoidElement):
|
|
192
|
+
return data.to_word(alphabet)
|
|
193
|
+
|
|
194
|
+
if RSK_data is not None:
|
|
195
|
+
#if a list of a semistandard and a standard tableau or a pair of lists
|
|
196
|
+
from sage.combinat.tableau import Tableau
|
|
197
|
+
if isinstance(RSK_data, (tuple, list)) and len(RSK_data) == 2 and \
|
|
198
|
+
all(isinstance(x, Tableau) for x in RSK_data):
|
|
199
|
+
from sage.combinat.rsk import RSK_inverse
|
|
200
|
+
return RSK_inverse(*RSK_data, output='word')
|
|
201
|
+
elif isinstance(RSK_data, (tuple, list)) and len(RSK_data) == 2 and \
|
|
202
|
+
all(isinstance(x, (list, tuple)) for x in RSK_data):
|
|
203
|
+
from sage.combinat.rsk import RSK_inverse
|
|
204
|
+
P,Q = map(Tableau, RSK_data)
|
|
205
|
+
return RSK_inverse(P, Q, 'word')
|
|
206
|
+
raise ValueError("Invalid input. Must be a pair of tableaux")
|
|
207
|
+
|
|
208
|
+
# Create the parent object
|
|
209
|
+
from .words import Words
|
|
210
|
+
parent = Words(alphabet)
|
|
211
|
+
|
|
212
|
+
return parent(data=data, length=length, datatype=datatype, caching=caching)
|
|
213
|
+
|
|
214
|
+
#######################################################################
|
|
215
|
+
# #
|
|
216
|
+
# Concrete word classes #
|
|
217
|
+
# #
|
|
218
|
+
#######################################################################
|
|
219
|
+
|
|
220
|
+
##### Finite Words #####
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class FiniteWord_char(WordDatatype_char, FiniteWord_class):
|
|
224
|
+
r"""
|
|
225
|
+
Finite word represented by an array ``unsigned char *`` (i.e. integers
|
|
226
|
+
between 0 and 255).
|
|
227
|
+
|
|
228
|
+
For any word ``w``, type ``w.<TAB>`` to see the functions that can be applied
|
|
229
|
+
to ``w``.
|
|
230
|
+
|
|
231
|
+
EXAMPLES::
|
|
232
|
+
|
|
233
|
+
sage: W = Words(range(20))
|
|
234
|
+
|
|
235
|
+
sage: w = W(list(range(1, 10)) * 2)
|
|
236
|
+
sage: type(w)
|
|
237
|
+
<class 'sage.combinat.words.word.FiniteWord_char'>
|
|
238
|
+
sage: w
|
|
239
|
+
word: 123456789123456789
|
|
240
|
+
|
|
241
|
+
sage: w.is_palindrome()
|
|
242
|
+
False
|
|
243
|
+
sage: (w*w[::-1]).is_palindrome()
|
|
244
|
+
True
|
|
245
|
+
sage: (w[:-1:]*w[::-1]).is_palindrome()
|
|
246
|
+
True
|
|
247
|
+
|
|
248
|
+
sage: w.is_lyndon()
|
|
249
|
+
False
|
|
250
|
+
sage: W(list(range(10)) + [10, 10]).is_lyndon()
|
|
251
|
+
True
|
|
252
|
+
|
|
253
|
+
sage: w.is_square_free()
|
|
254
|
+
False
|
|
255
|
+
sage: w[:-1].is_square_free()
|
|
256
|
+
True
|
|
257
|
+
|
|
258
|
+
sage: u = W([randint(0,10) for i in range(10)])
|
|
259
|
+
sage: (u*u).is_square()
|
|
260
|
+
True
|
|
261
|
+
sage: (u*u*u).is_cube()
|
|
262
|
+
True
|
|
263
|
+
|
|
264
|
+
sage: len(w.factor_set())
|
|
265
|
+
127
|
|
266
|
+
sage: w.rauzy_graph(5) # needs sage.graphs
|
|
267
|
+
Looped digraph on 9 vertices
|
|
268
|
+
|
|
269
|
+
sage: u = W([1,2,3])
|
|
270
|
+
sage: w.first_occurrence(u)
|
|
271
|
+
0
|
|
272
|
+
sage: w.first_occurrence(u, start=1)
|
|
273
|
+
9
|
|
274
|
+
|
|
275
|
+
TESTS::
|
|
276
|
+
|
|
277
|
+
sage: W = Words([0,1,2])
|
|
278
|
+
sage: w = W([0,1,1,0])
|
|
279
|
+
sage: w == loads(dumps(w))
|
|
280
|
+
True
|
|
281
|
+
"""
|
|
282
|
+
pass
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
class FiniteWord_list(WordDatatype_list, FiniteWord_class):
|
|
286
|
+
r"""
|
|
287
|
+
Finite word represented by a Python list.
|
|
288
|
+
|
|
289
|
+
For any word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
290
|
+
functions defined on `w`.
|
|
291
|
+
|
|
292
|
+
EXAMPLES::
|
|
293
|
+
|
|
294
|
+
sage: w = Word(range(10))
|
|
295
|
+
sage: w.iterated_right_palindromic_closure()
|
|
296
|
+
word: 0102010301020104010201030102010501020103...
|
|
297
|
+
|
|
298
|
+
TESTS::
|
|
299
|
+
|
|
300
|
+
sage: w = Word([0,1,1,0])
|
|
301
|
+
sage: w == loads(dumps(w))
|
|
302
|
+
True
|
|
303
|
+
"""
|
|
304
|
+
pass
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class FiniteWord_str(WordDatatype_str, FiniteWord_class):
|
|
308
|
+
r"""
|
|
309
|
+
Finite word represented by a Python str.
|
|
310
|
+
|
|
311
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
312
|
+
functions defined on `w`.
|
|
313
|
+
|
|
314
|
+
EXAMPLES::
|
|
315
|
+
|
|
316
|
+
sage: w = Word('abcdef')
|
|
317
|
+
sage: w.is_square()
|
|
318
|
+
False
|
|
319
|
+
|
|
320
|
+
TESTS::
|
|
321
|
+
|
|
322
|
+
sage: w = Word('abba')
|
|
323
|
+
sage: w == loads(dumps(w))
|
|
324
|
+
True
|
|
325
|
+
"""
|
|
326
|
+
pass
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class FiniteWord_tuple(WordDatatype_tuple, FiniteWord_class):
|
|
330
|
+
r"""
|
|
331
|
+
Finite word represented by a Python tuple.
|
|
332
|
+
|
|
333
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
334
|
+
functions defined on `w`.
|
|
335
|
+
|
|
336
|
+
EXAMPLES::
|
|
337
|
+
|
|
338
|
+
sage: w = Word(())
|
|
339
|
+
sage: w.is_empty()
|
|
340
|
+
True
|
|
341
|
+
|
|
342
|
+
TESTS::
|
|
343
|
+
|
|
344
|
+
sage: w = Word((0,1,1,0))
|
|
345
|
+
sage: w == loads(dumps(w))
|
|
346
|
+
True
|
|
347
|
+
"""
|
|
348
|
+
pass
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class FiniteWord_iter_with_caching(WordDatatype_iter_with_caching, FiniteWord_class):
|
|
352
|
+
r"""
|
|
353
|
+
Finite word represented by an iterator (with caching).
|
|
354
|
+
|
|
355
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
356
|
+
functions defined on `w`.
|
|
357
|
+
|
|
358
|
+
EXAMPLES::
|
|
359
|
+
|
|
360
|
+
sage: w = Word(iter('abcdef'))
|
|
361
|
+
sage: w.conjugate(2)
|
|
362
|
+
word: cdefab
|
|
363
|
+
|
|
364
|
+
TESTS::
|
|
365
|
+
|
|
366
|
+
sage: w = Word(iter(range(10)))
|
|
367
|
+
sage: type(w)
|
|
368
|
+
<class 'sage.combinat.words.word.FiniteWord_iter_with_caching'>
|
|
369
|
+
sage: z = loads(dumps(w))
|
|
370
|
+
sage: w == z
|
|
371
|
+
True
|
|
372
|
+
sage: type(z)
|
|
373
|
+
<class 'sage.combinat.words.word.FiniteWord_list'>
|
|
374
|
+
"""
|
|
375
|
+
pass
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
class FiniteWord_iter(WordDatatype_iter, FiniteWord_class):
|
|
379
|
+
r"""
|
|
380
|
+
Finite word represented by an iterator.
|
|
381
|
+
|
|
382
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
383
|
+
functions defined on `w`.
|
|
384
|
+
|
|
385
|
+
EXAMPLES::
|
|
386
|
+
|
|
387
|
+
sage: w = Word(iter(range(10)), caching=False)
|
|
388
|
+
sage: w
|
|
389
|
+
word: 0123456789
|
|
390
|
+
sage: w.finite_differences()
|
|
391
|
+
word: 111111111
|
|
392
|
+
|
|
393
|
+
TESTS::
|
|
394
|
+
|
|
395
|
+
sage: w = Word(iter(range(10)), caching=False)
|
|
396
|
+
sage: type(w)
|
|
397
|
+
<class 'sage.combinat.words.word.FiniteWord_iter'>
|
|
398
|
+
sage: z = loads(dumps(w))
|
|
399
|
+
sage: w == z
|
|
400
|
+
True
|
|
401
|
+
sage: type(z)
|
|
402
|
+
<class 'sage.combinat.words.word.FiniteWord_list'>
|
|
403
|
+
"""
|
|
404
|
+
pass
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
class FiniteWord_callable_with_caching(WordDatatype_callable_with_caching, FiniteWord_class):
|
|
408
|
+
r"""
|
|
409
|
+
Finite word represented by a callable (with caching).
|
|
410
|
+
|
|
411
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
412
|
+
functions defined on `w`.
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: f = lambda n : n % 3
|
|
417
|
+
sage: w = Word(f, length=32)
|
|
418
|
+
sage: w
|
|
419
|
+
word: 01201201201201201201201201201201
|
|
420
|
+
sage: w.border()
|
|
421
|
+
word: 01201201201201201201201201201
|
|
422
|
+
|
|
423
|
+
TESTS::
|
|
424
|
+
|
|
425
|
+
sage: w = Word(lambda n:n, length=10)
|
|
426
|
+
sage: type(w)
|
|
427
|
+
<class 'sage.combinat.words.word.FiniteWord_callable_with_caching'>
|
|
428
|
+
sage: z = loads(dumps(w))
|
|
429
|
+
sage: w == z
|
|
430
|
+
True
|
|
431
|
+
sage: type(z)
|
|
432
|
+
<class 'sage.combinat.words.word.FiniteWord_callable_with_caching'>
|
|
433
|
+
|
|
434
|
+
Pickle also works for concatenation of words::
|
|
435
|
+
|
|
436
|
+
sage: w = Word(range(10)) * Word('abcdef')
|
|
437
|
+
sage: type(w)
|
|
438
|
+
<class 'sage.combinat.words.word.FiniteWord_callable_with_caching'>
|
|
439
|
+
sage: z = loads(dumps(w))
|
|
440
|
+
sage: w == z
|
|
441
|
+
True
|
|
442
|
+
sage: type(z)
|
|
443
|
+
<class 'sage.combinat.words.word.FiniteWord_list'>
|
|
444
|
+
|
|
445
|
+
Pickle also works for power of words::
|
|
446
|
+
|
|
447
|
+
sage: w = Word(range(10)) ^ 2
|
|
448
|
+
sage: type(w)
|
|
449
|
+
<class 'sage.combinat.words.word.FiniteWord_callable_with_caching'>
|
|
450
|
+
sage: z = loads(dumps(w))
|
|
451
|
+
sage: w == z
|
|
452
|
+
True
|
|
453
|
+
sage: type(z)
|
|
454
|
+
<class 'sage.combinat.words.word.FiniteWord_list'>
|
|
455
|
+
"""
|
|
456
|
+
pass
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
class FiniteWord_callable(WordDatatype_callable, FiniteWord_class):
|
|
460
|
+
r"""
|
|
461
|
+
Finite word represented by a callable.
|
|
462
|
+
|
|
463
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
464
|
+
functions defined on `w`.
|
|
465
|
+
|
|
466
|
+
EXAMPLES::
|
|
467
|
+
|
|
468
|
+
sage: f = lambda n : 3 if n > 8 else 6
|
|
469
|
+
sage: w = Word(f, length=30, caching=False)
|
|
470
|
+
sage: w
|
|
471
|
+
word: 666666666333333333333333333333
|
|
472
|
+
sage: w.is_symmetric()
|
|
473
|
+
True
|
|
474
|
+
|
|
475
|
+
TESTS::
|
|
476
|
+
|
|
477
|
+
sage: w = Word(lambda n:n, length=10, caching=False)
|
|
478
|
+
sage: type(w)
|
|
479
|
+
<class 'sage.combinat.words.word.FiniteWord_callable'>
|
|
480
|
+
sage: z = loads(dumps(w))
|
|
481
|
+
sage: w == z
|
|
482
|
+
True
|
|
483
|
+
sage: type(z)
|
|
484
|
+
<class 'sage.combinat.words.word.FiniteWord_callable'>
|
|
485
|
+
"""
|
|
486
|
+
pass
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
##### Infinite Words #####
|
|
490
|
+
|
|
491
|
+
class InfiniteWord_iter_with_caching(WordDatatype_iter_with_caching, InfiniteWord_class):
|
|
492
|
+
r"""
|
|
493
|
+
Infinite word represented by an iterable (with caching).
|
|
494
|
+
|
|
495
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
496
|
+
functions defined on `w`.
|
|
497
|
+
|
|
498
|
+
Infinite words behave like a Python list : they can be sliced using
|
|
499
|
+
square braquets to define for example a prefix or a factor.
|
|
500
|
+
|
|
501
|
+
EXAMPLES::
|
|
502
|
+
|
|
503
|
+
sage: from itertools import cycle
|
|
504
|
+
sage: w = Word(cycle([9,8,4]))
|
|
505
|
+
sage: w
|
|
506
|
+
word: 9849849849849849849849849849849849849849...
|
|
507
|
+
sage: prefix = w[:23]
|
|
508
|
+
sage: prefix
|
|
509
|
+
word: 98498498498498498498498
|
|
510
|
+
sage: prefix.minimal_period()
|
|
511
|
+
3
|
|
512
|
+
|
|
513
|
+
TESTS::
|
|
514
|
+
|
|
515
|
+
sage: from itertools import count
|
|
516
|
+
sage: w = Word(count())
|
|
517
|
+
sage: type(w)
|
|
518
|
+
<class 'sage.combinat.words.word.Word_iter_with_caching'>
|
|
519
|
+
|
|
520
|
+
Pickle is not supported for infinite word defined by an iterator::
|
|
521
|
+
|
|
522
|
+
sage: try:
|
|
523
|
+
....: dumps(w)
|
|
524
|
+
....: except TypeError as e:
|
|
525
|
+
....: if "pickle" in str(e) and "generator" in str(e):
|
|
526
|
+
....: print("TypeError raised in dumps() as expected")
|
|
527
|
+
TypeError raised in dumps() as expected
|
|
528
|
+
"""
|
|
529
|
+
pass
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
class InfiniteWord_iter(WordDatatype_iter, InfiniteWord_class):
|
|
533
|
+
r"""
|
|
534
|
+
Infinite word represented by an iterable.
|
|
535
|
+
|
|
536
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
537
|
+
functions defined on `w`.
|
|
538
|
+
|
|
539
|
+
Infinite words behave like a Python list : they can be sliced using
|
|
540
|
+
square braquets to define for example a prefix or a factor.
|
|
541
|
+
|
|
542
|
+
EXAMPLES::
|
|
543
|
+
|
|
544
|
+
sage: from itertools import chain, cycle
|
|
545
|
+
sage: w = Word(chain('letsgo', cycle('forever')), caching=False)
|
|
546
|
+
sage: w
|
|
547
|
+
word: letsgoforeverforeverforeverforeverforeve...
|
|
548
|
+
sage: prefix = w[:100]
|
|
549
|
+
sage: prefix
|
|
550
|
+
word: letsgoforeverforeverforeverforeverforeve...
|
|
551
|
+
sage: prefix.is_lyndon()
|
|
552
|
+
False
|
|
553
|
+
|
|
554
|
+
TESTS::
|
|
555
|
+
|
|
556
|
+
sage: from itertools import count
|
|
557
|
+
sage: w = Word(count(), caching=False)
|
|
558
|
+
sage: type(w)
|
|
559
|
+
<class 'sage.combinat.words.word.Word_iter'>
|
|
560
|
+
|
|
561
|
+
Pickle is not supported for infinite word defined by an iterator::
|
|
562
|
+
|
|
563
|
+
sage: try:
|
|
564
|
+
....: dumps(w)
|
|
565
|
+
....: except TypeError as e:
|
|
566
|
+
....: if "pickle" in str(e) and "generator" in str(e):
|
|
567
|
+
....: print("TypeError raised in dumps() as expected")
|
|
568
|
+
TypeError raised in dumps() as expected
|
|
569
|
+
"""
|
|
570
|
+
pass
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
class InfiniteWord_callable_with_caching(WordDatatype_callable_with_caching, InfiniteWord_class):
|
|
574
|
+
r"""
|
|
575
|
+
Infinite word represented by a callable (with caching).
|
|
576
|
+
|
|
577
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
578
|
+
functions defined on `w`.
|
|
579
|
+
|
|
580
|
+
Infinite words behave like a Python list : they can be sliced using
|
|
581
|
+
square braquets to define for example a prefix or a factor.
|
|
582
|
+
|
|
583
|
+
EXAMPLES::
|
|
584
|
+
|
|
585
|
+
sage: w = Word(lambda n:n)
|
|
586
|
+
sage: factor = w[4:13]
|
|
587
|
+
sage: factor
|
|
588
|
+
word: 4,5,6,7,8,9,10,11,12
|
|
589
|
+
|
|
590
|
+
TESTS::
|
|
591
|
+
|
|
592
|
+
sage: w = Word(lambda n:n)
|
|
593
|
+
sage: type(w)
|
|
594
|
+
<class 'sage.combinat.words.word.InfiniteWord_callable_with_caching'>
|
|
595
|
+
sage: z = loads(dumps(w))
|
|
596
|
+
sage: z
|
|
597
|
+
word: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,...
|
|
598
|
+
sage: type(z)
|
|
599
|
+
<class 'sage.combinat.words.word.InfiniteWord_callable_with_caching'>
|
|
600
|
+
"""
|
|
601
|
+
pass
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
class InfiniteWord_callable(WordDatatype_callable, InfiniteWord_class):
|
|
605
|
+
r"""
|
|
606
|
+
Infinite word represented by a callable.
|
|
607
|
+
|
|
608
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
609
|
+
functions defined on `w`.
|
|
610
|
+
|
|
611
|
+
Infinite words behave like a Python list : they can be sliced using
|
|
612
|
+
square braquets to define for example a prefix or a factor.
|
|
613
|
+
|
|
614
|
+
EXAMPLES::
|
|
615
|
+
|
|
616
|
+
sage: w = Word(lambda n:n, caching=False)
|
|
617
|
+
sage: w
|
|
618
|
+
word: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,...
|
|
619
|
+
sage: w.iterated_right_palindromic_closure()
|
|
620
|
+
word: 0102010301020104010201030102010501020103...
|
|
621
|
+
|
|
622
|
+
TESTS::
|
|
623
|
+
|
|
624
|
+
sage: w = Word(lambda n:n, caching=False)
|
|
625
|
+
sage: type(w)
|
|
626
|
+
<class 'sage.combinat.words.word.InfiniteWord_callable'>
|
|
627
|
+
sage: z = loads(dumps(w))
|
|
628
|
+
sage: z
|
|
629
|
+
word: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,...
|
|
630
|
+
sage: type(z)
|
|
631
|
+
<class 'sage.combinat.words.word.InfiniteWord_callable'>
|
|
632
|
+
"""
|
|
633
|
+
pass
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
##### Words of unknown length #####
|
|
637
|
+
|
|
638
|
+
class Word_iter_with_caching(WordDatatype_iter_with_caching, Word_class):
|
|
639
|
+
r"""
|
|
640
|
+
Word of unknown length (finite or infinite) represented by an
|
|
641
|
+
iterable (with caching).
|
|
642
|
+
|
|
643
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
644
|
+
functions defined on `w`.
|
|
645
|
+
|
|
646
|
+
Words behave like a Python list : they can be sliced using
|
|
647
|
+
square braquets to define for example a prefix or a factor.
|
|
648
|
+
|
|
649
|
+
EXAMPLES::
|
|
650
|
+
|
|
651
|
+
sage: w = Word(iter([1,2,3]*1000), length='unknown')
|
|
652
|
+
sage: w
|
|
653
|
+
word: 1231231231231231231231231231231231231231...
|
|
654
|
+
sage: w.finite_differences(mod=2)
|
|
655
|
+
word: 1101101101101101101101101101101101101101...
|
|
656
|
+
|
|
657
|
+
TESTS::
|
|
658
|
+
|
|
659
|
+
sage: w = Word(iter('abcd'*100), length='unknown')
|
|
660
|
+
sage: type(w)
|
|
661
|
+
<class 'sage.combinat.words.word.Word_iter_with_caching'>
|
|
662
|
+
sage: w
|
|
663
|
+
word: abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd...
|
|
664
|
+
|
|
665
|
+
Pickle is not supported for word of unknown length defined by an iterator::
|
|
666
|
+
|
|
667
|
+
sage: try:
|
|
668
|
+
....: dumps(w)
|
|
669
|
+
....: except TypeError as e:
|
|
670
|
+
....: if "pickle" in str(e) and "generator" in str(e):
|
|
671
|
+
....: print("TypeError raised in dumps() as expected")
|
|
672
|
+
TypeError raised in dumps() as expected
|
|
673
|
+
"""
|
|
674
|
+
pass
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
class Word_iter(WordDatatype_iter, Word_class):
|
|
678
|
+
r"""
|
|
679
|
+
Word of unknown length (finite or infinite) represented by an
|
|
680
|
+
iterable.
|
|
681
|
+
|
|
682
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
683
|
+
functions defined on `w`.
|
|
684
|
+
|
|
685
|
+
Words behave like a Python list : they can be sliced using
|
|
686
|
+
square braquets to define for example a prefix or a factor.
|
|
687
|
+
|
|
688
|
+
EXAMPLES::
|
|
689
|
+
|
|
690
|
+
sage: w = Word(iter([1,1,4,9]*1000), length='unknown', caching=False)
|
|
691
|
+
sage: w
|
|
692
|
+
word: 1149114911491149114911491149114911491149...
|
|
693
|
+
sage: w.delta()
|
|
694
|
+
word: 2112112112112112112112112112112112112112...
|
|
695
|
+
|
|
696
|
+
TESTS::
|
|
697
|
+
|
|
698
|
+
sage: w = Word(iter('abcd'*100), length='unknown', caching=False)
|
|
699
|
+
sage: type(w)
|
|
700
|
+
<class 'sage.combinat.words.word.Word_iter'>
|
|
701
|
+
sage: w
|
|
702
|
+
word: abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd...
|
|
703
|
+
|
|
704
|
+
Pickle is not supported for word of unknown length defined by an iterator::
|
|
705
|
+
|
|
706
|
+
sage: try:
|
|
707
|
+
....: dumps(w)
|
|
708
|
+
....: except TypeError as e:
|
|
709
|
+
....: if "pickle" in str(e) and "generator" in str(e):
|
|
710
|
+
....: print("TypeError raised in dumps() as expected")
|
|
711
|
+
TypeError raised in dumps() as expected
|
|
712
|
+
"""
|
|
713
|
+
pass
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
##### Morphic Words #####
|
|
717
|
+
|
|
718
|
+
class FiniteWord_morphic(WordDatatype_morphic, FiniteWord_class):
|
|
719
|
+
r"""
|
|
720
|
+
Finite morphic word.
|
|
721
|
+
|
|
722
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
723
|
+
functions defined on `w`.
|
|
724
|
+
|
|
725
|
+
EXAMPLES::
|
|
726
|
+
|
|
727
|
+
sage: m = WordMorphism("a->ab,b->")
|
|
728
|
+
sage: w = m.fixed_point("a")
|
|
729
|
+
sage: w
|
|
730
|
+
word: ab
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
TESTS::
|
|
734
|
+
|
|
735
|
+
sage: m = WordMorphism("a->ab,b->")
|
|
736
|
+
sage: w = m.fixed_point("a")
|
|
737
|
+
sage: type(w)
|
|
738
|
+
<class 'sage.combinat.words.word.FiniteWord_morphic'>
|
|
739
|
+
sage: loads(dumps(w))
|
|
740
|
+
word: ab
|
|
741
|
+
"""
|
|
742
|
+
pass
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
class InfiniteWord_morphic(WordDatatype_morphic, InfiniteWord_class):
|
|
746
|
+
r"""
|
|
747
|
+
Morphic word of infinite length.
|
|
748
|
+
|
|
749
|
+
For such word `w`, type ``w.`` and hit :kbd:`Tab` key to see the list of
|
|
750
|
+
functions defined on `w`.
|
|
751
|
+
|
|
752
|
+
Infinite words behave like a Python list : they can be sliced using
|
|
753
|
+
square braquets to define for example a prefix or a factor.
|
|
754
|
+
|
|
755
|
+
EXAMPLES::
|
|
756
|
+
|
|
757
|
+
sage: m = WordMorphism('a->ab,b->a')
|
|
758
|
+
sage: w = m.fixed_point('a')
|
|
759
|
+
sage: w
|
|
760
|
+
word: abaababaabaababaababaabaababaabaababaaba...
|
|
761
|
+
|
|
762
|
+
TESTS:
|
|
763
|
+
|
|
764
|
+
Pickle is supported::
|
|
765
|
+
|
|
766
|
+
sage: loads(dumps(w))
|
|
767
|
+
word: abaababaabaababaababaabaababaabaababaaba...
|
|
768
|
+
"""
|
|
769
|
+
pass
|