passagemath-combinat 10.6.42__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_combinat/__init__.py +3 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +400 -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-0e7fc84e.so.10.5.0 +0 -0
- passagemath_combinat.libs/libsymmetrica-81fe8739.so.3.0.0 +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 +35 -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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +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.cpython-314-x86_64-linux-musl.so +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Boundedness of `k`-Regular Sequences
|
|
5
|
+
|
|
6
|
+
This module contains a collection of algorithms to check for boundedness.
|
|
7
|
+
This is done
|
|
8
|
+
- based on eigenvalues and
|
|
9
|
+
- by the criterion presented in [MS1977a]_.
|
|
10
|
+
|
|
11
|
+
Various
|
|
12
|
+
=======
|
|
13
|
+
|
|
14
|
+
.. SEEALSO::
|
|
15
|
+
|
|
16
|
+
:mod:`sage.combinat.regular_sequence`,
|
|
17
|
+
:mod:`recognizable series <sage.combinat.recognizable_series>`,
|
|
18
|
+
:mod:`sage.rings.cfinite_sequence`,
|
|
19
|
+
:mod:`sage.combinat.binary_recurrence_sequences`.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
AUTHORS:
|
|
23
|
+
|
|
24
|
+
- Gabriel Lipnik (2017)
|
|
25
|
+
|
|
26
|
+
ACKNOWLEDGEMENT:
|
|
27
|
+
|
|
28
|
+
- Gabriel Lipnik is supported by the
|
|
29
|
+
Austrian Science Fund (FWF): P 24644-N26.
|
|
30
|
+
"""
|
|
31
|
+
#*****************************************************************************
|
|
32
|
+
# Copyright (C) 2017 Gabriel Lipnik <devel@gabriellipnik.at>
|
|
33
|
+
#
|
|
34
|
+
# This program is free software: You can redistribute it and/or modify
|
|
35
|
+
# it under the terms of the GNU General Public License as published by
|
|
36
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
37
|
+
# (at your option) any later version.
|
|
38
|
+
# http://www.gnu.org/licenses/
|
|
39
|
+
#*****************************************************************************
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def multiply_reduce(A, B):
|
|
43
|
+
r"""
|
|
44
|
+
Return the matrix `A\cdot B` with entries `\min{(A\cdot B)_{ij},2}`.
|
|
45
|
+
|
|
46
|
+
INPUT:
|
|
47
|
+
|
|
48
|
+
- ``A`` -- an `m \times n` matrix
|
|
49
|
+
- ``B`` -- an `n \times p` matrix
|
|
50
|
+
|
|
51
|
+
OUTPUT:
|
|
52
|
+
|
|
53
|
+
An `m \times p` matrix with entries `\min{(A\cdot B)_{ij},2}`.
|
|
54
|
+
|
|
55
|
+
EXAMPLES::
|
|
56
|
+
|
|
57
|
+
sage: from sage.combinat.regular_sequence_bounded import multiply_reduce
|
|
58
|
+
sage: A = Matrix([[2, 0], [0, 2]])
|
|
59
|
+
sage: B = Matrix([[-2, 0], [0, 2]])
|
|
60
|
+
sage: A*B
|
|
61
|
+
[-4 0]
|
|
62
|
+
[ 0 4]
|
|
63
|
+
sage: multiply_reduce(A, B)
|
|
64
|
+
[-4 0]
|
|
65
|
+
[ 0 2]
|
|
66
|
+
|
|
67
|
+
::
|
|
68
|
+
|
|
69
|
+
sage: A = Matrix([[1, 2, 3], [-1, -2, -3], [1, 2, 3]])
|
|
70
|
+
sage: B = Matrix([[1, 2, 3], [2, 3, 4], [1, 2, 3]])
|
|
71
|
+
sage: A*B
|
|
72
|
+
[ 8 14 20]
|
|
73
|
+
[ -8 -14 -20]
|
|
74
|
+
[ 8 14 20]
|
|
75
|
+
sage: multiply_reduce(A, B)
|
|
76
|
+
[ 2 2 2]
|
|
77
|
+
[ -8 -14 -20]
|
|
78
|
+
[ 2 2 2]
|
|
79
|
+
"""
|
|
80
|
+
return (A*B).apply_map(lambda m: min(m, 2))
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def construct_phi(matrices):
|
|
84
|
+
r"""
|
|
85
|
+
Return the set `\phi(S)` as defined in [MS1977a]_.
|
|
86
|
+
|
|
87
|
+
INPUT:
|
|
88
|
+
|
|
89
|
+
- ``matrices`` -- a list of non-negative square matrices
|
|
90
|
+
in the same dimension
|
|
91
|
+
|
|
92
|
+
OUTPUT:
|
|
93
|
+
|
|
94
|
+
A list of matrices.
|
|
95
|
+
|
|
96
|
+
EXAMPLES::
|
|
97
|
+
|
|
98
|
+
sage: from sage.combinat.regular_sequence_bounded import construct_phi
|
|
99
|
+
sage: L = [Matrix([[2, 2], [1, 3]]), Matrix([[0, 2], [1, 1]])]
|
|
100
|
+
sage: construct_phi(L)
|
|
101
|
+
[
|
|
102
|
+
[2 2] [2 2] [0 2]
|
|
103
|
+
[2 2], [1 2], [1 1]
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
::
|
|
107
|
+
|
|
108
|
+
sage: L = [Matrix([[42, 1, 0], [5, 0, 1], [0, 0, 1]]), Matrix([[0, 1, 1],
|
|
109
|
+
....: [4, 1, 1], [1, 2, 2]]), Matrix([[5, 1, 1], [1, 7, 1], [0, 1, 32]])]
|
|
110
|
+
sage: construct_phi(L)
|
|
111
|
+
[
|
|
112
|
+
[2 2 1] [1 2 2] [2 2 2] [2 2 2] [2 2 2] [2 2 2] [2 0 2] [2 2 2]
|
|
113
|
+
[2 2 1] [2 2 2] [2 2 2] [2 2 2] [2 2 2] [2 2 2] [2 2 2] [2 1 2]
|
|
114
|
+
[0 0 1], [2 2 2], [2 2 2], [0 1 2], [2 0 2], [0 0 1], [2 1 2], [2 1 2],
|
|
115
|
+
<BLANKLINE>
|
|
116
|
+
[2 1 2] [2 2 2] [2 2 2] [2 2 2] [2 1 1] [2 2 2] [0 1 1] [2 1 0]
|
|
117
|
+
[2 2 2] [1 2 2] [2 2 2] [2 2 2] [1 2 1] [2 1 2] [2 1 1] [2 0 1]
|
|
118
|
+
[2 2 2], [1 2 2], [1 2 2], [2 1 2], [0 1 2], [2 0 2], [1 2 2], [0 0 1]
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
TESTS::
|
|
122
|
+
|
|
123
|
+
sage: L = [Matrix([[20, 1, 0], [2, 0, 0], [117, 0, 8]]),
|
|
124
|
+
....: Matrix([[0, 2, 1], [1, 0, 0], [1,1,2]]), Matrix([[8, 1, 0],
|
|
125
|
+
....: [0, 0, 3], [0, 1, 0]])]
|
|
126
|
+
sage: construct_phi(L)
|
|
127
|
+
[
|
|
128
|
+
[2 1 0] [2 2 2] [2 1 2] [2 2 2] [2 2 2] [2 0 2] [1 2 2] [2 1 2]
|
|
129
|
+
[2 0 0] [2 2 2] [2 2 2] [2 2 2] [0 2 0] [2 2 2] [2 2 2] [0 2 1]
|
|
130
|
+
[2 0 2], [2 2 2], [2 1 0], [2 0 0], [0 0 2], [2 2 2], [1 0 0], [2 2 2],
|
|
131
|
+
<BLANKLINE>
|
|
132
|
+
[2 2 2] [2 2 2] [2 2 0] [2 2 2] [0 2 2] [2 0 2] [2 1 2] [2 2 2]
|
|
133
|
+
[0 1 2] [2 2 2] [2 2 0] [0 2 2] [2 2 2] [2 1 0] [2 0 2] [2 2 2]
|
|
134
|
+
[2 2 2], [2 0 2], [2 2 2], [2 2 2], [2 2 2], [2 1 2], [2 2 2], [2 1 0],
|
|
135
|
+
<BLANKLINE>
|
|
136
|
+
[2 2 2] [2 2 0] [2 2 2] [0 1 2] [2 2 2] [1 2 2] [2 2 0] [2 2 2]
|
|
137
|
+
[2 2 0] [2 2 2] [2 0 0] [2 1 0] [2 2 2] [0 2 2] [2 0 2] [2 2 2]
|
|
138
|
+
[2 2 0], [2 2 0], [2 2 2], [2 2 2], [0 1 2], [2 2 2], [2 0 0], [2 1 2],
|
|
139
|
+
<BLANKLINE>
|
|
140
|
+
[2 2 0] [2 2 2] [2 2 2] [2 1 0] [2 2 2] [2 2 2] [2 2 2] [2 0 2]
|
|
141
|
+
[2 2 2] [2 2 0] [1 2 2] [0 0 2] [2 0 0] [2 2 2] [2 2 2] [2 2 0]
|
|
142
|
+
[2 2 2], [2 2 2], [2 2 2], [0 1 0], [2 0 2], [0 2 1], [2 2 0], [2 2 2],
|
|
143
|
+
<BLANKLINE>
|
|
144
|
+
[2 2 2] [2 2 2] [2 2 2] [0 2 1] [2 2 2] [2 2 2] [2 2 2]
|
|
145
|
+
[2 0 2] [0 0 2] [2 2 2] [1 0 0] [2 0 2] [2 1 2] [2 2 2]
|
|
146
|
+
[2 2 2], [0 2 0], [0 2 2], [1 1 2], [2 0 0], [2 2 2], [1 2 2]
|
|
147
|
+
]
|
|
148
|
+
"""
|
|
149
|
+
from sage.arith.srange import srange
|
|
150
|
+
length = len(matrices)
|
|
151
|
+
|
|
152
|
+
def get_immutable(M):
|
|
153
|
+
M.set_immutable()
|
|
154
|
+
return M
|
|
155
|
+
|
|
156
|
+
phi = set(get_immutable(M.apply_map(lambda m: min(m, 2))) for M in matrices)
|
|
157
|
+
for counter in range(1000000):
|
|
158
|
+
phi.update([get_immutable(multiply_reduce(A, B)) for A in matrices for B in phi])
|
|
159
|
+
if len(phi) == length:
|
|
160
|
+
return list(phi)
|
|
161
|
+
else:
|
|
162
|
+
length = len(phi)
|
|
163
|
+
raise RuntimeError('Phi too large.')
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def is_integer_valued(matrices):
|
|
167
|
+
r"""
|
|
168
|
+
Return whether every matrix in ``matrices`` is integer-valued.
|
|
169
|
+
|
|
170
|
+
INPUT:
|
|
171
|
+
|
|
172
|
+
- ``matrices`` -- a list of square matrices in the same dimension
|
|
173
|
+
|
|
174
|
+
OUTPUT:
|
|
175
|
+
|
|
176
|
+
A boolean.
|
|
177
|
+
|
|
178
|
+
EXAMPLES::
|
|
179
|
+
|
|
180
|
+
sage: from sage.combinat.regular_sequence_bounded import is_integer_valued
|
|
181
|
+
sage: matrices = [Matrix([[1, 2], [-1, 0]]), Matrix([[42, -42], [0, 0]])]
|
|
182
|
+
sage: is_integer_valued(matrices)
|
|
183
|
+
True
|
|
184
|
+
|
|
185
|
+
::
|
|
186
|
+
|
|
187
|
+
sage: matrices = [Matrix([[1, pi], [-1, 0]])] # needs sage.symbolic
|
|
188
|
+
sage: is_integer_valued(matrices) # needs sage.symbolic
|
|
189
|
+
False
|
|
190
|
+
|
|
191
|
+
::
|
|
192
|
+
|
|
193
|
+
sage: matrices = [Matrix([[1, 1/2], [2/4, 0]])]
|
|
194
|
+
sage: is_integer_valued(matrices)
|
|
195
|
+
False
|
|
196
|
+
|
|
197
|
+
::
|
|
198
|
+
|
|
199
|
+
sage: matrices = [Matrix([[1, 4/2], [-1, 0]])]
|
|
200
|
+
sage: is_integer_valued(matrices)
|
|
201
|
+
True
|
|
202
|
+
"""
|
|
203
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
204
|
+
from sage.rings.integer_ring import ZZ
|
|
205
|
+
M = MatrixSpace(ZZ, matrices[0].nrows(), matrices[0].ncols())
|
|
206
|
+
return all(mat in M for mat in matrices)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def is_non_negative(matrices):
|
|
210
|
+
r"""
|
|
211
|
+
Return whether every matrix in ``matrices`` is non-negative.
|
|
212
|
+
|
|
213
|
+
INPUT:
|
|
214
|
+
|
|
215
|
+
- ``matrices`` -- a list of square matrices in the same dimension
|
|
216
|
+
|
|
217
|
+
OUTPUT:
|
|
218
|
+
|
|
219
|
+
A boolean.
|
|
220
|
+
|
|
221
|
+
EXAMPLES::
|
|
222
|
+
|
|
223
|
+
sage: from sage.combinat.regular_sequence_bounded import is_non_negative
|
|
224
|
+
sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[42, -42], [0, 0]])]
|
|
225
|
+
sage: is_non_negative(matrices)
|
|
226
|
+
False
|
|
227
|
+
|
|
228
|
+
::
|
|
229
|
+
|
|
230
|
+
sage: matrices = [Matrix([[0]])]
|
|
231
|
+
sage: is_non_negative(matrices)
|
|
232
|
+
True
|
|
233
|
+
|
|
234
|
+
::
|
|
235
|
+
|
|
236
|
+
sage: matrices = [Matrix([[1, 1/2], [2/4, 0]])]
|
|
237
|
+
sage: is_non_negative(matrices)
|
|
238
|
+
True
|
|
239
|
+
"""
|
|
240
|
+
return all(min(mat.list()) >= 0 for mat in matrices)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def is_bounded_via_mandel_simon_algorithm(matrices):
|
|
244
|
+
r"""
|
|
245
|
+
Return whether the semigroup generated whether the semigroup of all
|
|
246
|
+
possible products of ``matrices`` is finite/bounded.
|
|
247
|
+
|
|
248
|
+
INPUT:
|
|
249
|
+
|
|
250
|
+
- ``matrices`` -- a list of non-negative square matrices
|
|
251
|
+
in the same dimension
|
|
252
|
+
|
|
253
|
+
OUTPUT:
|
|
254
|
+
|
|
255
|
+
A boolean.
|
|
256
|
+
|
|
257
|
+
ALGORITHM:
|
|
258
|
+
|
|
259
|
+
A criterion based on [MS1977a]_ is used here.
|
|
260
|
+
|
|
261
|
+
EXAMPLES::
|
|
262
|
+
|
|
263
|
+
sage: from sage.combinat.regular_sequence_bounded import is_bounded_via_mandel_simon_algorithm
|
|
264
|
+
sage: J = [Matrix([[1, 0, 1], [0, 1, 1], [0, 0, 0]])]
|
|
265
|
+
sage: is_bounded_via_mandel_simon_algorithm(J)
|
|
266
|
+
True
|
|
267
|
+
|
|
268
|
+
::
|
|
269
|
+
|
|
270
|
+
sage: from sage.combinat.regular_sequence_bounded import is_bounded_via_mandel_simon_algorithm
|
|
271
|
+
sage: K = [Matrix([[1, 1], [1, 1]])]
|
|
272
|
+
sage: is_bounded_via_mandel_simon_algorithm(K)
|
|
273
|
+
False
|
|
274
|
+
|
|
275
|
+
::
|
|
276
|
+
|
|
277
|
+
sage: L = [Matrix([[1, 0], [0, 1]]), Matrix([[1, 0], [0, 0]])]
|
|
278
|
+
sage: is_bounded_via_mandel_simon_algorithm(L)
|
|
279
|
+
True
|
|
280
|
+
|
|
281
|
+
::
|
|
282
|
+
|
|
283
|
+
sage: M = [Matrix([[1, 0], [0, 2]]), Matrix([[1, 0], [0, 0]])]
|
|
284
|
+
sage: is_bounded_via_mandel_simon_algorithm(M)
|
|
285
|
+
False
|
|
286
|
+
|
|
287
|
+
Non-integer-valued input::
|
|
288
|
+
|
|
289
|
+
sage: N = [Matrix([[0.5, 0], [1, 0]])]
|
|
290
|
+
sage: is_bounded_via_mandel_simon_algorithm(N)
|
|
291
|
+
Traceback (most recent call last):
|
|
292
|
+
...
|
|
293
|
+
ValueError: Not all matrices are integer-valued.
|
|
294
|
+
"""
|
|
295
|
+
if not is_integer_valued(matrices):
|
|
296
|
+
raise ValueError('Not all matrices are integer-valued.')
|
|
297
|
+
|
|
298
|
+
phi = construct_phi(matrices)
|
|
299
|
+
return not any(multiply_reduce(M, M) == M and not M**2 == M**3
|
|
300
|
+
for M in phi)
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def has_bounded_matrix_powers(matrices) -> bool:
|
|
304
|
+
r"""
|
|
305
|
+
Return whether `M^n` is bounded for `n \to \infty`
|
|
306
|
+
for all `M` in ``matrices``.
|
|
307
|
+
|
|
308
|
+
INPUT:
|
|
309
|
+
|
|
310
|
+
- ``matrices`` -- a list of square matrices
|
|
311
|
+
|
|
312
|
+
ALGORITHM:
|
|
313
|
+
|
|
314
|
+
Eigenvalues are used for the check.
|
|
315
|
+
|
|
316
|
+
EXAMPLES:
|
|
317
|
+
|
|
318
|
+
Maximum of the absolute value of the eigenvalues `=1`,
|
|
319
|
+
algebraic multiplicity equals geometric multiplicity
|
|
320
|
+
for all eigenvalues with absolute value `=1`::
|
|
321
|
+
|
|
322
|
+
sage: from sage.combinat.regular_sequence_bounded import has_bounded_matrix_powers
|
|
323
|
+
sage: matrices = [Matrix([[-1, 1, 1], [-1, 1, 1], [1, -1, 1]]),
|
|
324
|
+
....: Matrix([[-1, 1, 1], [-1, 0, 0], [1, 1, 1]])]
|
|
325
|
+
sage: has_bounded_matrix_powers(matrices) # needs sage.rings.number_field
|
|
326
|
+
True
|
|
327
|
+
|
|
328
|
+
Maximum of the absolute value of the eigenvalues `>1`::
|
|
329
|
+
|
|
330
|
+
sage: matrices = [Matrix([[1, 1], [1/2, -1]])]
|
|
331
|
+
sage: has_bounded_matrix_powers(matrices) # needs sage.rings.number_field
|
|
332
|
+
False
|
|
333
|
+
|
|
334
|
+
Maximum of the absolute value of the eigenvalues `=1`,
|
|
335
|
+
algebraic and geometric multiplicities different for eigenvalue `1`::
|
|
336
|
+
|
|
337
|
+
sage: matrices = [Matrix([[1,1],[0,1]])]
|
|
338
|
+
sage: has_bounded_matrix_powers(matrices) # needs sage.rings.number_field
|
|
339
|
+
False
|
|
340
|
+
|
|
341
|
+
Maximum of the absolute value of the eigenvalues `<1`::
|
|
342
|
+
|
|
343
|
+
sage: matrices = [Matrix([[1, -1], [1/2, -1]])]
|
|
344
|
+
sage: has_bounded_matrix_powers(matrices) # needs sage.rings.number_field
|
|
345
|
+
True
|
|
346
|
+
"""
|
|
347
|
+
return all(abs(eVn[0]) < 1 or
|
|
348
|
+
(abs(eVn[0]) == 1 and len(eVn[1]) == eVn[2])
|
|
349
|
+
for mat in matrices
|
|
350
|
+
for eVn in mat.eigenvectors_right())
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def make_positive(matrices) -> list:
|
|
354
|
+
r"""
|
|
355
|
+
Return a list of non-negative matrices
|
|
356
|
+
|
|
357
|
+
INPUT:
|
|
358
|
+
|
|
359
|
+
- ``matrices`` -- a list of matrices where every matrix is either
|
|
360
|
+
non-negative or non-positive.
|
|
361
|
+
|
|
362
|
+
OUTPUT:
|
|
363
|
+
|
|
364
|
+
A list of matrices containing every non-negative matrix of ``matrices``,
|
|
365
|
+
and `-M` if `M` is a non-positive matrix of ``matrices``.
|
|
366
|
+
|
|
367
|
+
EXAMPLES::
|
|
368
|
+
|
|
369
|
+
sage: from sage.combinat.regular_sequence_bounded import make_positive
|
|
370
|
+
sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[42, 42], [0, 0]])]
|
|
371
|
+
sage: make_positive(matrices)
|
|
372
|
+
[
|
|
373
|
+
[1 2] [42 42]
|
|
374
|
+
[1 0], [ 0 0]
|
|
375
|
+
]
|
|
376
|
+
|
|
377
|
+
::
|
|
378
|
+
|
|
379
|
+
sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[-42, -42], [0, 0]])]
|
|
380
|
+
sage: make_positive(matrices)
|
|
381
|
+
[
|
|
382
|
+
[1 2] [42 42]
|
|
383
|
+
[1 0], [ 0 0]
|
|
384
|
+
]
|
|
385
|
+
|
|
386
|
+
::
|
|
387
|
+
|
|
388
|
+
sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[42, -42], [0, 0]])]
|
|
389
|
+
sage: make_positive(matrices)
|
|
390
|
+
Traceback (most recent call last):
|
|
391
|
+
...
|
|
392
|
+
ValueError: There is a matrix which is neither non-negative nor non-positive.
|
|
393
|
+
"""
|
|
394
|
+
from sage.arith.srange import srange
|
|
395
|
+
|
|
396
|
+
def do(mat):
|
|
397
|
+
if is_non_negative(mat):
|
|
398
|
+
return mat
|
|
399
|
+
elif is_non_negative(-mat):
|
|
400
|
+
return -mat
|
|
401
|
+
else:
|
|
402
|
+
raise ValueError('There is a matrix which is neither non-negative nor non-positive.')
|
|
403
|
+
|
|
404
|
+
return list(do(mat) for mat in matrices)
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
def regular_sequence_is_bounded(S):
|
|
408
|
+
r"""
|
|
409
|
+
Return whether this `k`-regular sequence is bounded.
|
|
410
|
+
|
|
411
|
+
INPUT:
|
|
412
|
+
|
|
413
|
+
- ``S`` -- a `k`-regular sequence
|
|
414
|
+
|
|
415
|
+
OUTPUT:
|
|
416
|
+
|
|
417
|
+
A boolean.
|
|
418
|
+
|
|
419
|
+
EXAMPLES:
|
|
420
|
+
|
|
421
|
+
Thue--Morse Sequence::
|
|
422
|
+
|
|
423
|
+
sage: from sage.combinat.regular_sequence_bounded import regular_sequence_is_bounded
|
|
424
|
+
sage: Seq2 = RegularSequenceRing(2, ZZ)
|
|
425
|
+
sage: TM = Seq2([Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [1, 0]])],
|
|
426
|
+
....: left=vector([1, 0]), right=vector([0, 1]))
|
|
427
|
+
sage: regular_sequence_is_bounded(TM)
|
|
428
|
+
True
|
|
429
|
+
|
|
430
|
+
Binary Sum of Digits::
|
|
431
|
+
|
|
432
|
+
sage: SD = Seq2([Matrix([[1, 0], [0, 1]]), Matrix([[0, -1], [1, 2]])],
|
|
433
|
+
....: left=vector([0, 1]), right=vector([1, 0]))
|
|
434
|
+
sage: regular_sequence_is_bounded(SD) # needs sage.rings.number_field
|
|
435
|
+
False
|
|
436
|
+
|
|
437
|
+
Sequence of All Natural Numbers::
|
|
438
|
+
|
|
439
|
+
sage: N = Seq2([Matrix([[2, 0], [2, 1]]), Matrix([[0, 1], [-2, 3]])],
|
|
440
|
+
....: left=vector([1, 0]), right=vector([0, 1]))
|
|
441
|
+
sage: regular_sequence_is_bounded(N) # needs sage.rings.number_field
|
|
442
|
+
False
|
|
443
|
+
|
|
444
|
+
Indicator Function of Even Integers::
|
|
445
|
+
|
|
446
|
+
sage: E = Seq2([Matrix([[0, 1], [0, 1]]), Matrix([[0, 0], [0, 1]])],
|
|
447
|
+
....: left=vector([1, 0]), right=vector([1, 1]))
|
|
448
|
+
sage: regular_sequence_is_bounded(E) # needs sage.rings.number_field
|
|
449
|
+
True
|
|
450
|
+
|
|
451
|
+
Indicator Function of Odd Integers::
|
|
452
|
+
|
|
453
|
+
sage: O = Seq2([Matrix([[0, 0], [0, 1]]), Matrix([[0, 1], [0, 1]])],
|
|
454
|
+
....: left=vector([1, 0]), right=vector([0, 1]))
|
|
455
|
+
sage: regular_sequence_is_bounded(O) # needs sage.rings.number_field
|
|
456
|
+
True
|
|
457
|
+
|
|
458
|
+
Number of Odd Entries in Pascal's Triangle::
|
|
459
|
+
|
|
460
|
+
sage: U = Seq2([Matrix([[3, 0], [6, 1]]), Matrix([[0, 1], [-6, 5]])],
|
|
461
|
+
....: left=vector([1, 0]), right=vector([0, 1]))
|
|
462
|
+
sage: regular_sequence_is_bounded(U) # needs sage.rings.number_field
|
|
463
|
+
False
|
|
464
|
+
|
|
465
|
+
Counting '10' in the Binary Representation::
|
|
466
|
+
|
|
467
|
+
sage: C = Seq2([Matrix([[0, 1, 0, 0], [0, 0, 0, 1],
|
|
468
|
+
....: [-1, 0, 1, 1], [0, 0, 0, 1]]),
|
|
469
|
+
....: Matrix([[0, 0, 1, 0], [0, 1, 0, 0],
|
|
470
|
+
....: [0, 0, 1, 0], [-1, 0, 1, 1]])],
|
|
471
|
+
....: left=vector([1, 0, 0, 0]),
|
|
472
|
+
....: right=vector([0, 0, 1, 0]))
|
|
473
|
+
sage: regular_sequence_is_bounded(C) # needs sage.rings.number_field
|
|
474
|
+
False
|
|
475
|
+
|
|
476
|
+
Numbers Starting with '10'::
|
|
477
|
+
|
|
478
|
+
sage: D = Seq2([Matrix([[0, 1, 0, 0], [0, 0, 1, 0],
|
|
479
|
+
....: [0, -2, 3, 0], [0, -2, 2, 1]]),
|
|
480
|
+
....: Matrix([[2, 0, 0, 0], [0, 0, 0, 1],
|
|
481
|
+
....: [0, 2, 0, 1], [0, -2, 0, 3]])],
|
|
482
|
+
....: left=vector([1, 0, 0, 0]),
|
|
483
|
+
....: right=vector([2, 2, 2, 5]))
|
|
484
|
+
sage: regular_sequence_is_bounded(D) # needs sage.rings.number_field
|
|
485
|
+
False
|
|
486
|
+
|
|
487
|
+
Signum Function::
|
|
488
|
+
|
|
489
|
+
sage: S = Seq2([Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [0, 1]])],
|
|
490
|
+
....: left=vector([1, 0]), right=vector([0, 1]))
|
|
491
|
+
sage: regular_sequence_is_bounded(S) # needs sage.rings.number_field
|
|
492
|
+
True
|
|
493
|
+
|
|
494
|
+
Number of Digits from the Right to the First '1'::
|
|
495
|
+
|
|
496
|
+
sage: S = Seq2([Matrix([[0, 1, 0], [-1, 2, 0], [0, 0, 1]]),
|
|
497
|
+
....: Matrix([[0, 0, 1], [0, 0, 2], [0, 0, 1]])],
|
|
498
|
+
....: left=vector([1, 0, 0]), right=vector([0, 0, 1]))
|
|
499
|
+
sage: regular_sequence_is_bounded(S) # needs sage.rings.number_field
|
|
500
|
+
False
|
|
501
|
+
|
|
502
|
+
TESTS::
|
|
503
|
+
|
|
504
|
+
sage: S = Seq2((Matrix([[0, 1, 0], [0, 0, 1], [-1, 2, 0]]),
|
|
505
|
+
....: Matrix([[-1, 0, 0], [-3/4, -1/4, 3/4], [-1/4, 1/4, -3/4]])),
|
|
506
|
+
....: left=vector([1, 0, 0]), right=vector([-4, -4, -4]))
|
|
507
|
+
sage: regular_sequence_is_bounded(S) # needs sage.rings.number_field
|
|
508
|
+
False
|
|
509
|
+
|
|
510
|
+
::
|
|
511
|
+
|
|
512
|
+
sage: S = Seq2((Matrix([[1, 0], [1, 0]]), Matrix([[0, 1],[1, 0]])),
|
|
513
|
+
....: left = vector([1, 1]), right = vector([1, 0]),
|
|
514
|
+
....: allow_degenerated_sequence=True)
|
|
515
|
+
sage: regular_sequence_is_bounded(S) # needs sage.rings.number_field
|
|
516
|
+
True
|
|
517
|
+
"""
|
|
518
|
+
from sage.arith.srange import srange
|
|
519
|
+
|
|
520
|
+
matrices = list(S.mu)
|
|
521
|
+
length = len(matrices)
|
|
522
|
+
try:
|
|
523
|
+
return is_bounded_via_mandel_simon_algorithm(make_positive(matrices))
|
|
524
|
+
except ValueError:
|
|
525
|
+
pass
|
|
526
|
+
|
|
527
|
+
matrices = list(S.minimized().mu)
|
|
528
|
+
if not has_bounded_matrix_powers(matrices):
|
|
529
|
+
return False
|
|
530
|
+
|
|
531
|
+
matricesProd = list(ell*em for ell in matrices for em in matrices
|
|
532
|
+
if ell != em)
|
|
533
|
+
if not has_bounded_matrix_powers(matricesProd):
|
|
534
|
+
return False
|
|
535
|
+
|
|
536
|
+
try:
|
|
537
|
+
if not is_bounded_via_mandel_simon_algorithm(make_positive(matricesProd)):
|
|
538
|
+
return False
|
|
539
|
+
except ValueError:
|
|
540
|
+
pass
|
|
541
|
+
|
|
542
|
+
raise RuntimeError('It is not decidable with this implementation ' +
|
|
543
|
+
'whether the sequence is bounded or not.')
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Restricted growth arrays
|
|
4
|
+
|
|
5
|
+
These combinatorial objects are in bijection with set partitions.
|
|
6
|
+
"""
|
|
7
|
+
#*****************************************************************************
|
|
8
|
+
# Copyright (C) 2008 Mike Hansen <mhansen@gmail.com>,
|
|
9
|
+
#
|
|
10
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
11
|
+
#
|
|
12
|
+
# This code is distributed in the hope that it will be useful,
|
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
15
|
+
# General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# The full text of the GPL is available at:
|
|
18
|
+
#
|
|
19
|
+
# http://www.gnu.org/licenses/
|
|
20
|
+
#*****************************************************************************
|
|
21
|
+
from sage.combinat.combinat import bell_number
|
|
22
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
23
|
+
from sage.structure.parent import Parent
|
|
24
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
25
|
+
import copy
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class RestrictedGrowthArrays(UniqueRepresentation, Parent):
|
|
29
|
+
def __init__(self, n):
|
|
30
|
+
"""
|
|
31
|
+
EXAMPLES::
|
|
32
|
+
|
|
33
|
+
sage: from sage.combinat.restricted_growth import RestrictedGrowthArrays
|
|
34
|
+
sage: R = RestrictedGrowthArrays(3)
|
|
35
|
+
sage: R == loads(dumps(R))
|
|
36
|
+
True
|
|
37
|
+
sage: TestSuite(R).run(skip=['_test_an_element', # needs sage.libs.flint
|
|
38
|
+
....: '_test_enumerated_set_contains', '_test_some_elements'])
|
|
39
|
+
"""
|
|
40
|
+
self._n = n
|
|
41
|
+
self._name = "Restricted growth arrays of size %s" % n
|
|
42
|
+
Parent.__init__(self, category=FiniteEnumeratedSets())
|
|
43
|
+
|
|
44
|
+
def __iter__(self):
|
|
45
|
+
"""
|
|
46
|
+
EXAMPLES::
|
|
47
|
+
|
|
48
|
+
sage: from sage.combinat.restricted_growth import RestrictedGrowthArrays
|
|
49
|
+
sage: R = RestrictedGrowthArrays(3)
|
|
50
|
+
sage: R.list()
|
|
51
|
+
[[1, 0, 0], [2, 0, 1], [2, 1, 0], [2, 1, 1], [3, 1, 2]]
|
|
52
|
+
"""
|
|
53
|
+
n = self._n
|
|
54
|
+
a = [1] + [0] * (n - 1)
|
|
55
|
+
m = [0] + [1] * (n - 1)
|
|
56
|
+
while True:
|
|
57
|
+
yield copy.copy(a)
|
|
58
|
+
# Search for maximum i with a[i] != m[i]
|
|
59
|
+
i = n - 1
|
|
60
|
+
while a[i] == m[i] and i >= 0:
|
|
61
|
+
i -= 1
|
|
62
|
+
if i == 0:
|
|
63
|
+
break
|
|
64
|
+
# Update arrays a and m
|
|
65
|
+
a[i] += 1
|
|
66
|
+
a[0] = a[i] + 1 if a[i] == m[i] else m[i]
|
|
67
|
+
mi = a[0]
|
|
68
|
+
for j in range(i + 1, n):
|
|
69
|
+
a[j] = 0
|
|
70
|
+
m[j] = mi
|
|
71
|
+
|
|
72
|
+
def cardinality(self):
|
|
73
|
+
"""
|
|
74
|
+
EXAMPLES::
|
|
75
|
+
|
|
76
|
+
sage: from sage.combinat.restricted_growth import RestrictedGrowthArrays
|
|
77
|
+
sage: R = RestrictedGrowthArrays(6)
|
|
78
|
+
sage: R.cardinality() # needs sage.libs.flint
|
|
79
|
+
203
|
|
80
|
+
"""
|
|
81
|
+
return bell_number(self._n)
|
sage/combinat/ribbon.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Ribbons
|
|
4
|
+
"""
|
|
5
|
+
#*****************************************************************************
|
|
6
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
#
|
|
10
|
+
# This code is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# The full text of the GPL is available at:
|
|
16
|
+
#
|
|
17
|
+
# http://www.gnu.org/licenses/
|
|
18
|
+
#*****************************************************************************
|
|
19
|
+
|
|
20
|
+
from .ribbon_shaped_tableau import RibbonShapedTableau, StandardRibbonShapedTableaux
|