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,355 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
De Bruijn sequences
|
|
4
|
+
|
|
5
|
+
A De Bruijn sequence is defined as the shortest cyclic sequence that
|
|
6
|
+
incorporates all substrings of a certain length of an alphabet.
|
|
7
|
+
|
|
8
|
+
For instance, the `2^3=8` binary strings of length 3 are all included in the
|
|
9
|
+
following string::
|
|
10
|
+
|
|
11
|
+
sage: DeBruijnSequences(2,3).an_element()
|
|
12
|
+
[0, 0, 0, 1, 0, 1, 1, 1]
|
|
13
|
+
|
|
14
|
+
They can be obtained as a subsequence of the *cyclic* De Bruijn sequence of
|
|
15
|
+
parameters `k=2` and `n=3`::
|
|
16
|
+
|
|
17
|
+
sage: seq = DeBruijnSequences(2,3).an_element()
|
|
18
|
+
sage: print(Word(seq).string_rep())
|
|
19
|
+
00010111
|
|
20
|
+
sage: shift = lambda i: [(i+j)%2**3 for j in range(3)]
|
|
21
|
+
sage: for i in range(2**3):
|
|
22
|
+
....: w = Word([b if j in shift(i) else '*' for j, b in enumerate(seq)])
|
|
23
|
+
....: print(w.string_rep())
|
|
24
|
+
000*****
|
|
25
|
+
*001****
|
|
26
|
+
**010***
|
|
27
|
+
***101**
|
|
28
|
+
****011*
|
|
29
|
+
*****111
|
|
30
|
+
0*****11
|
|
31
|
+
00*****1
|
|
32
|
+
|
|
33
|
+
This sequence is of length `k^n`, which is best possible as it is the number of
|
|
34
|
+
`k`-ary strings of length `n`. One can equivalently define a De Bruijn sequence
|
|
35
|
+
of parameters `k` and `n` as a cyclic sequence of length `k^n` in which all
|
|
36
|
+
substring of length `n` are different.
|
|
37
|
+
|
|
38
|
+
See also :wikipedia:`De_Bruijn_sequence`.
|
|
39
|
+
|
|
40
|
+
TESTS:
|
|
41
|
+
|
|
42
|
+
Checking the sequences generated are indeed valid::
|
|
43
|
+
|
|
44
|
+
sage: for n in range(1, 7):
|
|
45
|
+
....: for k in range(1, 7):
|
|
46
|
+
....: D = DeBruijnSequences(k, n)
|
|
47
|
+
....: if not D.an_element() in D:
|
|
48
|
+
....: print("Something's dead wrong (n=%s, k=%s)!" %(n,k))
|
|
49
|
+
....: break
|
|
50
|
+
|
|
51
|
+
AUTHOR:
|
|
52
|
+
|
|
53
|
+
- Eviatar Bach (2011): initial version
|
|
54
|
+
|
|
55
|
+
- Nathann Cohen (2011): Some work on the documentation and defined the
|
|
56
|
+
``__contain__`` method
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
# ******************************************************************************
|
|
60
|
+
# Copyright (C) 2011 Eviatar Bach <eviatarbach@gmail.com>
|
|
61
|
+
#
|
|
62
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
63
|
+
# https://www.gnu.org/licenses/
|
|
64
|
+
# ******************************************************************************
|
|
65
|
+
|
|
66
|
+
from sage.data_structures.bitset_base cimport *
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def debruijn_sequence(int k, int n):
|
|
70
|
+
"""
|
|
71
|
+
The generating function for De Bruijn sequences. This avoids the object
|
|
72
|
+
creation, so is significantly faster than accessing from DeBruijnSequence.
|
|
73
|
+
For more information, see the documentation there. The algorithm used is
|
|
74
|
+
from Frank Ruskey's "Combinatorial Generation".
|
|
75
|
+
|
|
76
|
+
INPUT:
|
|
77
|
+
|
|
78
|
+
- ``k`` -- arity; must be an integer
|
|
79
|
+
|
|
80
|
+
- ``n`` -- substring length; must be an integer
|
|
81
|
+
|
|
82
|
+
EXAMPLES::
|
|
83
|
+
|
|
84
|
+
sage: from sage.combinat.debruijn_sequence import debruijn_sequence
|
|
85
|
+
sage: debruijn_sequence(3, 1)
|
|
86
|
+
[0, 1, 2]
|
|
87
|
+
"""
|
|
88
|
+
global a, sequence
|
|
89
|
+
if k == 1:
|
|
90
|
+
return [0]
|
|
91
|
+
a = [0] * k * n
|
|
92
|
+
sequence = []
|
|
93
|
+
gen(1, 1, k, n)
|
|
94
|
+
return sequence
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
cdef gen(int t, int p, k, n):
|
|
98
|
+
"""
|
|
99
|
+
The internal generation function. This should not be accessed by the
|
|
100
|
+
user.
|
|
101
|
+
"""
|
|
102
|
+
cdef int j
|
|
103
|
+
if t > n:
|
|
104
|
+
if n % p == 0:
|
|
105
|
+
for j in range(1, p + 1):
|
|
106
|
+
sequence.append(a[j])
|
|
107
|
+
else:
|
|
108
|
+
a[t] = a[t - p]
|
|
109
|
+
gen(t + 1, p, k, n)
|
|
110
|
+
for j in range((a[t - p] + 1), (k)):
|
|
111
|
+
a[t] = j
|
|
112
|
+
gen(t + 1, t, k, n)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def is_debruijn_sequence(seq, k, n):
|
|
116
|
+
r"""
|
|
117
|
+
Given a sequence of integer elements in `0, \ldots, k-1`, tests whether it
|
|
118
|
+
corresponds to a De Bruijn sequence of parameters `k` and `n`.
|
|
119
|
+
|
|
120
|
+
INPUT:
|
|
121
|
+
|
|
122
|
+
- ``seq`` -- sequence of elements in `0, \ldots, k-1`
|
|
123
|
+
|
|
124
|
+
- ``n``, ``k`` -- integers
|
|
125
|
+
|
|
126
|
+
EXAMPLES::
|
|
127
|
+
|
|
128
|
+
sage: from sage.combinat.debruijn_sequence import is_debruijn_sequence
|
|
129
|
+
sage: s = DeBruijnSequences(2, 3).an_element()
|
|
130
|
+
sage: is_debruijn_sequence(s, 2, 3)
|
|
131
|
+
True
|
|
132
|
+
sage: is_debruijn_sequence(s + [0], 2, 3)
|
|
133
|
+
False
|
|
134
|
+
sage: is_debruijn_sequence([1] + s[1:], 2, 3)
|
|
135
|
+
False
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
if k == 1:
|
|
139
|
+
return seq == [0]
|
|
140
|
+
|
|
141
|
+
# The implementation is pretty straightforward.
|
|
142
|
+
|
|
143
|
+
# The variable "current" is the integer representing the value of a
|
|
144
|
+
# substring of length n. We iterate over all the possible substrings from
|
|
145
|
+
# left to right, and keep track of the values met so far with the bitset
|
|
146
|
+
# "seen".
|
|
147
|
+
|
|
148
|
+
cdef int i
|
|
149
|
+
cdef list s = seq
|
|
150
|
+
cdef int nn = n
|
|
151
|
+
cdef int kk = k
|
|
152
|
+
|
|
153
|
+
cdef int k_p_n = kk ** nn
|
|
154
|
+
|
|
155
|
+
cdef bitset_t seen
|
|
156
|
+
|
|
157
|
+
# Checking if the length is correct
|
|
158
|
+
if len(s) != kk ** nn:
|
|
159
|
+
return False
|
|
160
|
+
|
|
161
|
+
# Initializing the bitset
|
|
162
|
+
bitset_init(seen, k_p_n)
|
|
163
|
+
bitset_set_first_n(seen, 0)
|
|
164
|
+
|
|
165
|
+
# We initialize "current" to correspond to the word formed by the (n-1) last elements
|
|
166
|
+
cdef int current = 0
|
|
167
|
+
|
|
168
|
+
for i in range(n - 1):
|
|
169
|
+
current = kk * current + s[-n + i + 1]
|
|
170
|
+
|
|
171
|
+
answer = True
|
|
172
|
+
|
|
173
|
+
# Main loop, stopping if the same word has been met twice
|
|
174
|
+
for i in s:
|
|
175
|
+
current = (kk * current + i) % k_p_n
|
|
176
|
+
|
|
177
|
+
if bitset_in(seen, current) or i < 0 or i >= k:
|
|
178
|
+
answer = False
|
|
179
|
+
break
|
|
180
|
+
|
|
181
|
+
bitset_set(seen, current)
|
|
182
|
+
|
|
183
|
+
bitset_free(seen)
|
|
184
|
+
|
|
185
|
+
return answer
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
from sage.categories.finite_sets import FiniteSets
|
|
189
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
190
|
+
from sage.structure.parent import Parent
|
|
191
|
+
|
|
192
|
+
from sage.rings.integer cimport Integer
|
|
193
|
+
from sage.rings.integer_ring import ZZ
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class DeBruijnSequences(UniqueRepresentation, Parent):
|
|
197
|
+
r"""
|
|
198
|
+
Represent the De Bruijn sequences of given parameters `k` and `n`.
|
|
199
|
+
|
|
200
|
+
A De Bruijn sequence of parameters `k` and `n` is defined as the shortest
|
|
201
|
+
cyclic sequence that incorporates all substrings of length `n` a `k`-ary
|
|
202
|
+
alphabet.
|
|
203
|
+
|
|
204
|
+
This class can be used to generate the lexicographically smallest De Bruijn
|
|
205
|
+
sequence, to count the number of existing De Bruijn sequences or to test
|
|
206
|
+
whether a given sequence is De Bruijn.
|
|
207
|
+
|
|
208
|
+
INPUT:
|
|
209
|
+
|
|
210
|
+
- ``k`` -- a natural number to define arity; the letters used are the
|
|
211
|
+
integers `0, \ldots, k-1`
|
|
212
|
+
|
|
213
|
+
- ``n`` -- a natural number that defines the length of the substring
|
|
214
|
+
|
|
215
|
+
EXAMPLES:
|
|
216
|
+
|
|
217
|
+
Obtaining a De Bruijn sequence::
|
|
218
|
+
|
|
219
|
+
sage: seq = DeBruijnSequences(2, 3).an_element()
|
|
220
|
+
sage: seq
|
|
221
|
+
[0, 0, 0, 1, 0, 1, 1, 1]
|
|
222
|
+
|
|
223
|
+
Testing whether it is indeed one::
|
|
224
|
+
|
|
225
|
+
sage: seq in DeBruijnSequences(2, 3)
|
|
226
|
+
True
|
|
227
|
+
|
|
228
|
+
The total number for these parameters::
|
|
229
|
+
|
|
230
|
+
sage: DeBruijnSequences(2, 3).cardinality()
|
|
231
|
+
2
|
|
232
|
+
|
|
233
|
+
.. NOTE::
|
|
234
|
+
|
|
235
|
+
This function only generates one De Bruijn sequence (the smallest
|
|
236
|
+
lexicographically). Support for generating all possible ones may be
|
|
237
|
+
added in the future.
|
|
238
|
+
|
|
239
|
+
TESTS:
|
|
240
|
+
|
|
241
|
+
Setting ``k`` to 1 will return 0:
|
|
242
|
+
|
|
243
|
+
::
|
|
244
|
+
|
|
245
|
+
sage: DeBruijnSequences(1, 3).an_element()
|
|
246
|
+
[0]
|
|
247
|
+
|
|
248
|
+
Setting ``n`` to 1 will return the alphabet::
|
|
249
|
+
|
|
250
|
+
sage: DeBruijnSequences(3, 1).an_element()
|
|
251
|
+
[0, 1, 2]
|
|
252
|
+
|
|
253
|
+
The test suite::
|
|
254
|
+
|
|
255
|
+
sage: d = DeBruijnSequences(2, 3)
|
|
256
|
+
sage: TestSuite(d).run()
|
|
257
|
+
"""
|
|
258
|
+
def __init__(self, k, n):
|
|
259
|
+
"""
|
|
260
|
+
Constructor.
|
|
261
|
+
|
|
262
|
+
This checks the consistency of the given arguments.
|
|
263
|
+
|
|
264
|
+
TESTS:
|
|
265
|
+
|
|
266
|
+
Setting ``n`` or ``k`` to anything under 1 will return
|
|
267
|
+
a :exc:`ValueError`::
|
|
268
|
+
|
|
269
|
+
sage: DeBruijnSequences(3, 0).an_element()
|
|
270
|
+
Traceback (most recent call last):
|
|
271
|
+
...
|
|
272
|
+
ValueError: k and n cannot be under 1
|
|
273
|
+
|
|
274
|
+
Setting ``n`` or ``k`` to any type except an integer will return a
|
|
275
|
+
:exc:`TypeError`::
|
|
276
|
+
|
|
277
|
+
sage: DeBruijnSequences(2.5, 3).an_element()
|
|
278
|
+
Traceback (most recent call last):
|
|
279
|
+
...
|
|
280
|
+
TypeError: k and n must be integers
|
|
281
|
+
"""
|
|
282
|
+
Parent.__init__(self, category=FiniteSets())
|
|
283
|
+
if n < 1 or k < 1:
|
|
284
|
+
raise ValueError('k and n cannot be under 1')
|
|
285
|
+
if (not isinstance(n, (Integer, int)) or
|
|
286
|
+
not isinstance(k, (Integer, int))):
|
|
287
|
+
raise TypeError('k and n must be integers')
|
|
288
|
+
|
|
289
|
+
self.k = k
|
|
290
|
+
self.n = n
|
|
291
|
+
|
|
292
|
+
def _repr_(self):
|
|
293
|
+
"""
|
|
294
|
+
Provides a string representation of the object's parameter.
|
|
295
|
+
|
|
296
|
+
EXAMPLES::
|
|
297
|
+
|
|
298
|
+
sage: repr(DeBruijnSequences(4, 50))
|
|
299
|
+
'De Bruijn sequences with arity 4 and substring length 50'
|
|
300
|
+
"""
|
|
301
|
+
return ("De Bruijn sequences with arity %s and substring length %s"
|
|
302
|
+
% (self.k, self.n))
|
|
303
|
+
|
|
304
|
+
def _an_element_(self):
|
|
305
|
+
"""
|
|
306
|
+
Return the lexicographically smallest De Bruijn sequence with the given
|
|
307
|
+
parameters.
|
|
308
|
+
|
|
309
|
+
ALGORITHM:
|
|
310
|
+
|
|
311
|
+
The algorithm is described in the book "Combinatorial Generation" by
|
|
312
|
+
Frank Ruskey. This program is based on a Ruby implementation by Jonas
|
|
313
|
+
Elfström, which is based on the C program by Joe Sadawa.
|
|
314
|
+
|
|
315
|
+
EXAMPLES::
|
|
316
|
+
|
|
317
|
+
sage: DeBruijnSequences(2, 3).an_element()
|
|
318
|
+
[0, 0, 0, 1, 0, 1, 1, 1]
|
|
319
|
+
"""
|
|
320
|
+
return debruijn_sequence(self.k, self.n)
|
|
321
|
+
|
|
322
|
+
def __contains__(self, seq):
|
|
323
|
+
r"""
|
|
324
|
+
Test whether the given sequence is a De Bruijn sequence with
|
|
325
|
+
the current object's parameters.
|
|
326
|
+
|
|
327
|
+
INPUT:
|
|
328
|
+
|
|
329
|
+
- ``seq`` -- a sequence of integers
|
|
330
|
+
|
|
331
|
+
EXAMPLES::
|
|
332
|
+
|
|
333
|
+
sage: Sequences = DeBruijnSequences(2, 3)
|
|
334
|
+
sage: Sequences.an_element() in Sequences
|
|
335
|
+
True
|
|
336
|
+
"""
|
|
337
|
+
return is_debruijn_sequence(seq, self.k, self.n)
|
|
338
|
+
|
|
339
|
+
def cardinality(self):
|
|
340
|
+
"""
|
|
341
|
+
Return the number of distinct De Bruijn sequences for the object's
|
|
342
|
+
parameters.
|
|
343
|
+
|
|
344
|
+
EXAMPLES::
|
|
345
|
+
|
|
346
|
+
sage: DeBruijnSequences(2, 5).cardinality()
|
|
347
|
+
2048
|
|
348
|
+
|
|
349
|
+
ALGORITHM:
|
|
350
|
+
|
|
351
|
+
The formula for cardinality is `k!^{k^{n-1}}/k^n` [Ros2002]_.
|
|
352
|
+
"""
|
|
353
|
+
k = ZZ(self.k)
|
|
354
|
+
n = ZZ(self.n)
|
|
355
|
+
return (k.factorial() ** (k ** (n - 1))) // (k**n)
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Decorated permutations
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Martin Rubey (2020): Initial version
|
|
8
|
+
"""
|
|
9
|
+
# ****************************************************************************
|
|
10
|
+
# Copyright (C) 2020 Martin Rubey <martin.rubey at tuwien.ac.at>
|
|
11
|
+
#
|
|
12
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
13
|
+
#
|
|
14
|
+
# This code is distributed in the hope that it will be useful, but
|
|
15
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
17
|
+
# General Public License for more details.
|
|
18
|
+
#
|
|
19
|
+
# The full text of the GPL is available at:
|
|
20
|
+
#
|
|
21
|
+
# https://www.gnu.org/licenses/
|
|
22
|
+
# ****************************************************************************
|
|
23
|
+
from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
|
|
24
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
25
|
+
from sage.structure.parent import Parent
|
|
26
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
27
|
+
from sage.arith.misc import factorial
|
|
28
|
+
from sage.rings.integer import Integer
|
|
29
|
+
from sage.combinat.permutation import Permutations
|
|
30
|
+
from sage.combinat.subset import Subsets
|
|
31
|
+
from sage.combinat.colored_permutations import SignedPermutations
|
|
32
|
+
from sage.structure.list_clone import ClonableArray
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class DecoratedPermutation(ClonableArray,
|
|
36
|
+
metaclass=InheritComparisonClasscallMetaclass):
|
|
37
|
+
r"""
|
|
38
|
+
A decorated permutation.
|
|
39
|
+
|
|
40
|
+
A decorated permutation is a signed permutation where all
|
|
41
|
+
non-fixed points have positive sign.
|
|
42
|
+
"""
|
|
43
|
+
@staticmethod
|
|
44
|
+
def __classcall_private__(cls, pi):
|
|
45
|
+
"""
|
|
46
|
+
Create a decorated permutation.
|
|
47
|
+
|
|
48
|
+
EXAMPLES::
|
|
49
|
+
|
|
50
|
+
sage: DecoratedPermutation([2, 1, 3])
|
|
51
|
+
[2, 1, 3]
|
|
52
|
+
|
|
53
|
+
sage: DecoratedPermutation([2, 1, -3])
|
|
54
|
+
[2, 1, -3]
|
|
55
|
+
|
|
56
|
+
TESTS:
|
|
57
|
+
|
|
58
|
+
Check that hashing and comparison works::
|
|
59
|
+
|
|
60
|
+
sage: S = DecoratedPermutations(3)
|
|
61
|
+
sage: elt1 = S([2, 1, -3])
|
|
62
|
+
sage: elt2 = DecoratedPermutation([2, 1, -3])
|
|
63
|
+
sage: elt1 == elt2
|
|
64
|
+
True
|
|
65
|
+
|
|
66
|
+
sage: elt1 == [2, 1, -3]
|
|
67
|
+
False
|
|
68
|
+
|
|
69
|
+
sage: elt2 = DecoratedPermutation([2, 1, 3])
|
|
70
|
+
sage: elt1 != elt2
|
|
71
|
+
True
|
|
72
|
+
|
|
73
|
+
sage: hash(elt1) # random
|
|
74
|
+
915443076393556996
|
|
75
|
+
"""
|
|
76
|
+
pi = list(pi)
|
|
77
|
+
return DecoratedPermutations(len(pi))(pi)
|
|
78
|
+
|
|
79
|
+
def __init__(self, parent, pi, check=True):
|
|
80
|
+
"""
|
|
81
|
+
Initialize ``self``.
|
|
82
|
+
|
|
83
|
+
EXAMPLES::
|
|
84
|
+
|
|
85
|
+
sage: S = DecoratedPermutations(3)
|
|
86
|
+
sage: elt = S([2, 1, -3])
|
|
87
|
+
sage: TestSuite(elt).run()
|
|
88
|
+
"""
|
|
89
|
+
ClonableArray.__init__(self, parent, pi, check=check)
|
|
90
|
+
|
|
91
|
+
def check(self):
|
|
92
|
+
"""
|
|
93
|
+
Check that ``self`` is a valid decorated permutation.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: S = DecoratedPermutations(3)
|
|
98
|
+
sage: elt = S([2, 1, -3])
|
|
99
|
+
sage: elt.check()
|
|
100
|
+
sage: elt = S([2, -1, 3])
|
|
101
|
+
Traceback (most recent call last):
|
|
102
|
+
...
|
|
103
|
+
ValueError: invalid decorated permutation
|
|
104
|
+
"""
|
|
105
|
+
if self not in self.parent():
|
|
106
|
+
raise ValueError("{} is not a decorated permutation".format(self))
|
|
107
|
+
|
|
108
|
+
def size(self):
|
|
109
|
+
"""
|
|
110
|
+
Return the size of the decorated permutation.
|
|
111
|
+
|
|
112
|
+
EXAMPLES::
|
|
113
|
+
|
|
114
|
+
sage: DecoratedPermutation([2, 1, -3]).size()
|
|
115
|
+
3
|
|
116
|
+
"""
|
|
117
|
+
return len(self)
|
|
118
|
+
|
|
119
|
+
def to_signed_permutation(self):
|
|
120
|
+
"""
|
|
121
|
+
Return ``self`` as a signed permutation.
|
|
122
|
+
|
|
123
|
+
EXAMPLES::
|
|
124
|
+
|
|
125
|
+
sage: DecoratedPermutation([2, 1, -3]).to_signed_permutation()
|
|
126
|
+
[2, 1, -3]
|
|
127
|
+
"""
|
|
128
|
+
return SignedPermutations(len(self))(list(self))
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class DecoratedPermutations(UniqueRepresentation, Parent):
|
|
132
|
+
r"""
|
|
133
|
+
Class of all decorated permutations of `n`.
|
|
134
|
+
|
|
135
|
+
A decorated permutation is a signed permutation where all
|
|
136
|
+
non-fixed points have positive sign.
|
|
137
|
+
|
|
138
|
+
INPUT:
|
|
139
|
+
|
|
140
|
+
- ``n`` -- integer; the size of the decorated permutations
|
|
141
|
+
|
|
142
|
+
EXAMPLES:
|
|
143
|
+
|
|
144
|
+
This will create an instance to manipulate the decorated
|
|
145
|
+
permutations of size 3::
|
|
146
|
+
|
|
147
|
+
sage: S = DecoratedPermutations(3); S
|
|
148
|
+
Decorated permutations of size 3
|
|
149
|
+
sage: S.cardinality()
|
|
150
|
+
16
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
def __init__(self, n):
|
|
154
|
+
r"""
|
|
155
|
+
Initialize ``self``.
|
|
156
|
+
|
|
157
|
+
TESTS::
|
|
158
|
+
|
|
159
|
+
sage: S = DecoratedPermutations(4)
|
|
160
|
+
sage: TestSuite(S).run()
|
|
161
|
+
"""
|
|
162
|
+
self._n = n
|
|
163
|
+
Parent.__init__(self, category=FiniteEnumeratedSets())
|
|
164
|
+
|
|
165
|
+
def _repr_(self):
|
|
166
|
+
r"""
|
|
167
|
+
Return a string representation of ``self``.
|
|
168
|
+
|
|
169
|
+
TESTS::
|
|
170
|
+
|
|
171
|
+
sage: DecoratedPermutations(4)
|
|
172
|
+
Decorated permutations of size 4
|
|
173
|
+
"""
|
|
174
|
+
return "Decorated permutations of size %s" % self._n
|
|
175
|
+
|
|
176
|
+
def __contains__(self, pi):
|
|
177
|
+
"""
|
|
178
|
+
Check if ``pi`` is in ``self``.
|
|
179
|
+
|
|
180
|
+
TESTS::
|
|
181
|
+
|
|
182
|
+
sage: S = DecoratedPermutations(3)
|
|
183
|
+
sage: [2, 1, -3] in S
|
|
184
|
+
True
|
|
185
|
+
sage: [2, -1, 3] in S
|
|
186
|
+
False
|
|
187
|
+
"""
|
|
188
|
+
if isinstance(pi, DecoratedPermutation):
|
|
189
|
+
return len(pi) == self._n
|
|
190
|
+
|
|
191
|
+
values = list(pi)
|
|
192
|
+
if len(values) != self._n:
|
|
193
|
+
return False
|
|
194
|
+
abs_values = [abs(v) for v in values]
|
|
195
|
+
for i, (v, abs_v) in enumerate(zip(values, abs_values), 1):
|
|
196
|
+
if i != abs_v and v < 0:
|
|
197
|
+
return False
|
|
198
|
+
return sorted(abs_values) == list(range(1, self._n + 1))
|
|
199
|
+
|
|
200
|
+
def _element_constructor_(self, pi, check=True):
|
|
201
|
+
"""
|
|
202
|
+
Construct an element of ``self``.
|
|
203
|
+
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: S = DecoratedPermutations(3)
|
|
207
|
+
sage: elt = S([2, 1, -3])
|
|
208
|
+
sage: elt.parent() is S
|
|
209
|
+
True
|
|
210
|
+
"""
|
|
211
|
+
if isinstance(pi, DecoratedPermutation):
|
|
212
|
+
if pi.parent() is self:
|
|
213
|
+
return pi
|
|
214
|
+
raise ValueError("cannot convert between decorated permutations of different sizes")
|
|
215
|
+
|
|
216
|
+
pi = tuple(pi)
|
|
217
|
+
if check and pi not in self:
|
|
218
|
+
raise ValueError('invalid decorated permutation')
|
|
219
|
+
return self.element_class(self, pi)
|
|
220
|
+
|
|
221
|
+
Element = DecoratedPermutation
|
|
222
|
+
|
|
223
|
+
def _an_element_(self):
|
|
224
|
+
"""
|
|
225
|
+
Return an element of ``self``.
|
|
226
|
+
|
|
227
|
+
EXAMPLES::
|
|
228
|
+
|
|
229
|
+
sage: S = DecoratedPermutations(3)
|
|
230
|
+
sage: S._an_element_()
|
|
231
|
+
[1, 2, 3]
|
|
232
|
+
"""
|
|
233
|
+
return self.element_class(self, list(range(1, self._n + 1)))
|
|
234
|
+
|
|
235
|
+
def cardinality(self):
|
|
236
|
+
r"""
|
|
237
|
+
Return the cardinality of ``self``.
|
|
238
|
+
|
|
239
|
+
The number of decorated permutations of size `n` is equal to
|
|
240
|
+
|
|
241
|
+
.. MATH::
|
|
242
|
+
|
|
243
|
+
\sum_{k=0^n} \frac{n!}{k!}
|
|
244
|
+
|
|
245
|
+
EXAMPLES::
|
|
246
|
+
|
|
247
|
+
sage: [DecoratedPermutations(n).cardinality() for n in range(11)]
|
|
248
|
+
[1, 2, 5, 16, 65, 326, 1957, 13700, 109601, 986410, 9864101]
|
|
249
|
+
"""
|
|
250
|
+
return Integer(sum(factorial(self._n) // factorial(k)
|
|
251
|
+
for k in range(self._n + 1)))
|
|
252
|
+
|
|
253
|
+
def __iter__(self):
|
|
254
|
+
r"""
|
|
255
|
+
Iterator on the decorated permutations of size `n`.
|
|
256
|
+
|
|
257
|
+
TESTS::
|
|
258
|
+
|
|
259
|
+
sage: S = DecoratedPermutations(2); S.list()
|
|
260
|
+
[[1, 2], [-1, 2], [1, -2], [-1, -2], [2, 1]]
|
|
261
|
+
sage: sum(1 for a in S)
|
|
262
|
+
5
|
|
263
|
+
"""
|
|
264
|
+
for sigma in Permutations(self._n):
|
|
265
|
+
F = sigma.fixed_points()
|
|
266
|
+
for X in Subsets(F):
|
|
267
|
+
tau = list(sigma)
|
|
268
|
+
for i in X:
|
|
269
|
+
tau[i - 1] = -tau[i - 1]
|
|
270
|
+
yield DecoratedPermutations(self._n)(tau)
|
|
Binary file
|