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,420 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Virtual crystals
|
|
5
|
+
|
|
6
|
+
These are the crystals that are subsets of a larger ambient crystal with
|
|
7
|
+
virtual crystal operators.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Travis Scrimshaw (2013-10-16): initial implementation
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
#*****************************************************************************
|
|
15
|
+
# Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
16
|
+
#
|
|
17
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
18
|
+
#
|
|
19
|
+
# This code is distributed in the hope that it will be useful,
|
|
20
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
21
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
22
|
+
# General Public License for more details.
|
|
23
|
+
#
|
|
24
|
+
# The full text of the GPL is available at:
|
|
25
|
+
#
|
|
26
|
+
# http://www.gnu.org/licenses/
|
|
27
|
+
#****************************************************************************
|
|
28
|
+
from sage.categories.crystals import Crystals
|
|
29
|
+
from sage.categories.finite_crystals import FiniteCrystals
|
|
30
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
|
31
|
+
from sage.combinat.crystals.subcrystal import Subcrystal
|
|
32
|
+
from sage.sets.family import Family
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class VirtualCrystal(Subcrystal):
|
|
36
|
+
r"""
|
|
37
|
+
A virtual crystal `V` of an ambient crystal `\widehat{B}` is a crystal
|
|
38
|
+
formed by taking a subset of `\widehat{B}` and whose crystal structure
|
|
39
|
+
is given by
|
|
40
|
+
|
|
41
|
+
.. MATH::
|
|
42
|
+
|
|
43
|
+
e_i = \prod_{j \in \sigma_i} \widehat{e}_j^{\gamma_i}, \quad
|
|
44
|
+
f_i = \prod_{j \in \sigma_i} \widehat{f}_j^{\gamma_i},
|
|
45
|
+
|
|
46
|
+
.. MATH::
|
|
47
|
+
|
|
48
|
+
\varepsilon_i = \frac{\widehat{\varepsilon}_j}{\gamma_j}, \quad
|
|
49
|
+
\varphi_i = \frac{\widehat{\varphi}_j}{\gamma_j}, \quad
|
|
50
|
+
\operatorname{wt} = \Psi^{-1} \circ \widehat{\operatorname{wt}}
|
|
51
|
+
|
|
52
|
+
where `\sigma_i` is a subset of the index set of `B`, `\gamma_i \in \ZZ`
|
|
53
|
+
are the *scaling factors*, and `\Psi : P \to \widehat{P}` is an embedding
|
|
54
|
+
of the weight lattices. We note that for the crystal to be well-defined,
|
|
55
|
+
we must have
|
|
56
|
+
|
|
57
|
+
.. MATH::
|
|
58
|
+
|
|
59
|
+
\widehat{\varepsilon}_j = \widehat{\varepsilon|j^{\prime}},
|
|
60
|
+
\quad \widehat{\varphi}_j = \widehat{\varphi}_{j^{\prime}}
|
|
61
|
+
|
|
62
|
+
for all `j, j^{\prime} \in \sigma_i` and that the order that the Kashiwara
|
|
63
|
+
operators in the ambient space are applied does not affect the result.
|
|
64
|
+
|
|
65
|
+
INPUT:
|
|
66
|
+
|
|
67
|
+
- ``ambient`` -- the ambient crystal
|
|
68
|
+
- ``virtualization`` -- dictionary whose key `i` corresponds
|
|
69
|
+
to the set `\sigma_i`
|
|
70
|
+
- ``scaling_factors`` -- dictionary whose key `i` corresponds to
|
|
71
|
+
the scaling factor `\gamma_i`
|
|
72
|
+
- ``contained`` -- (optional) a set (or function) which specifies when an
|
|
73
|
+
element is contained in the subcrystal; the default is everything
|
|
74
|
+
possible is included
|
|
75
|
+
- ``generators`` -- (optional) the generators for the virtual crystal; the
|
|
76
|
+
default is the generators for the ambient crystal
|
|
77
|
+
- ``cartan_type`` -- (optional) the Cartan type for the virtual crystal;
|
|
78
|
+
the default is the Cartan type for the ambient crystal
|
|
79
|
+
- ``index_set`` -- (optional) the index set for the virtual crystal; the
|
|
80
|
+
default is the index set for the Cartan type
|
|
81
|
+
- ``category`` -- (optional) the category for the virtual crystal; the
|
|
82
|
+
default is the :class:`~sage.categories.crystals.Crystals` category
|
|
83
|
+
|
|
84
|
+
EXAMPLES:
|
|
85
|
+
|
|
86
|
+
We construct an example from a natural virtualization map of type `C_n`
|
|
87
|
+
in type `A_{2n-1}`::
|
|
88
|
+
|
|
89
|
+
sage: C = crystals.Tableaux(['C',2], shape=[1])
|
|
90
|
+
sage: A = crystals.Tableaux(['A',3], shape=[2,1,1])
|
|
91
|
+
sage: psi = C.crystal_morphism(A.module_generators)
|
|
92
|
+
sage: V = psi.image()
|
|
93
|
+
sage: list(V)
|
|
94
|
+
[[[1, 1], [2], [3]],
|
|
95
|
+
[[1, 2], [2], [4]],
|
|
96
|
+
[[1, 3], [3], [4]],
|
|
97
|
+
[[2, 4], [3], [4]]]
|
|
98
|
+
sage: V.digraph().is_isomorphic(C.digraph(), edge_labels=True)
|
|
99
|
+
True
|
|
100
|
+
|
|
101
|
+
We construct the virtualization of a `U_q'(\mathfrak{g})`-crystal
|
|
102
|
+
`B^{r,s}` of type `C_n^{(1)}` in type `A_{2n+1}^{(2)}`. Here it is not
|
|
103
|
+
a default folding known to Sage, so we have to explicitly state the
|
|
104
|
+
folding (since the scaling factors are not specified, they are all
|
|
105
|
+
assumed to be 1)::
|
|
106
|
+
|
|
107
|
+
sage: K = crystals.KirillovReshetikhin(['C',2,1], 1,1)
|
|
108
|
+
sage: VK = crystals.KirillovReshetikhin(['A',5,2], 1,1)
|
|
109
|
+
sage: target = VK.module_generator().f(1); target
|
|
110
|
+
[[2]]
|
|
111
|
+
sage: psi = K.crystal_morphism({K.module_generator(): target},
|
|
112
|
+
....: virtualization={0:[0,1], 1:[2], 2:[3]})
|
|
113
|
+
sage: V = psi.image()
|
|
114
|
+
sage: list(V)
|
|
115
|
+
[[[2]], [[3]], [[-2]], [[-3]]]
|
|
116
|
+
sage: V.digraph().is_isomorphic(K.digraph(), edge_labels=True)
|
|
117
|
+
True
|
|
118
|
+
|
|
119
|
+
We create an example of `B(\Lambda_n)` of type `B_n` inside
|
|
120
|
+
of `B(2\Lambda_n)` using the doubling map through the (virtual)
|
|
121
|
+
subcrystal method::
|
|
122
|
+
|
|
123
|
+
sage: BB = crystals.Tableaux(['B',3], shape=[1,1,1])
|
|
124
|
+
sage: S = BB.subcrystal(scaling_factors={1:2, 2:2, 3:2})
|
|
125
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1/2,1/2,1/2])
|
|
126
|
+
sage: S.digraph().is_isomorphic(B.digraph(), edge_labels=True)
|
|
127
|
+
True
|
|
128
|
+
|
|
129
|
+
We can also directly construct a virtual crystal using
|
|
130
|
+
:class:`VirtualCrystal` (however it is recommended to use either
|
|
131
|
+
:meth:`~sage.categories.crystals.Crystals.ParentMethods.crystal_morphism`
|
|
132
|
+
or :meth:`~sage.categories.crystals.Crystals.ParentMethods.subcrystal`)::
|
|
133
|
+
|
|
134
|
+
sage: from sage.combinat.crystals.virtual_crystal import VirtualCrystal
|
|
135
|
+
sage: A = crystals.Tableaux(['A',3], shape=[2,1,1])
|
|
136
|
+
sage: V = VirtualCrystal(A, {1:(1,3), 2:(2,)}, {1:1, 2:2}, cartan_type=['C',2])
|
|
137
|
+
sage: G = crystals.Tableaux(['C',2], shape=[1]).digraph()
|
|
138
|
+
sage: V.digraph().is_isomorphic(G, edge_labels=True)
|
|
139
|
+
True
|
|
140
|
+
|
|
141
|
+
sage: C1 = crystals.Tableaux(['A',3], shape=[1])
|
|
142
|
+
sage: C2 = crystals.Tableaux(['A',3], shape=[1,1,1])
|
|
143
|
+
sage: T = C1.tensor(C2)
|
|
144
|
+
sage: mg = T(C1.module_generators[0], C2.module_generators[0])
|
|
145
|
+
sage: V = VirtualCrystal(A, {1:(1,3), 2:(2,)}, {1:1, 2:2},
|
|
146
|
+
....: cartan_type=['C',2], generators=[mg])
|
|
147
|
+
sage: V.digraph().is_isomorphic(G, edge_labels=True)
|
|
148
|
+
True
|
|
149
|
+
|
|
150
|
+
REFERENCES:
|
|
151
|
+
|
|
152
|
+
- [FOS2009]_
|
|
153
|
+
- [OSS03]_
|
|
154
|
+
- [OSS2003]_
|
|
155
|
+
"""
|
|
156
|
+
@staticmethod
|
|
157
|
+
def __classcall_private__(cls, ambient, virtualization, scaling_factors,
|
|
158
|
+
contained=None, generators=None,
|
|
159
|
+
cartan_type=None, index_set=None, category=None):
|
|
160
|
+
"""
|
|
161
|
+
Normalize arguments to ensure a unique representation.
|
|
162
|
+
|
|
163
|
+
EXAMPLES::
|
|
164
|
+
|
|
165
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
166
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
167
|
+
sage: psi1 = B.crystal_morphism(C.module_generators)
|
|
168
|
+
sage: V1 = psi1.image()
|
|
169
|
+
sage: psi2 = B.crystal_morphism(C.module_generators, index_set=[1,2,3])
|
|
170
|
+
sage: V2 = psi2.image()
|
|
171
|
+
sage: V1 is V2
|
|
172
|
+
True
|
|
173
|
+
|
|
174
|
+
TESTS:
|
|
175
|
+
|
|
176
|
+
Check that :issue:`19481` is fixed::
|
|
177
|
+
|
|
178
|
+
sage: from sage.combinat.crystals.virtual_crystal import VirtualCrystal
|
|
179
|
+
sage: A = crystals.Tableaux(['A',3], shape=[2,1,1])
|
|
180
|
+
sage: V = VirtualCrystal(A, {1:(1,3), 2:(2,)}, {1:1, 2:2}, cartan_type=['C',2])
|
|
181
|
+
sage: V.category()
|
|
182
|
+
Category of finite crystals
|
|
183
|
+
"""
|
|
184
|
+
if cartan_type is None:
|
|
185
|
+
cartan_type = ambient.cartan_type()
|
|
186
|
+
else:
|
|
187
|
+
cartan_type = CartanType(cartan_type)
|
|
188
|
+
if index_set is None:
|
|
189
|
+
index_set = cartan_type.index_set()
|
|
190
|
+
if generators is None:
|
|
191
|
+
generators = ambient.module_generators
|
|
192
|
+
virtualization = Family(virtualization)
|
|
193
|
+
scaling_factors = Family(scaling_factors)
|
|
194
|
+
|
|
195
|
+
category = Crystals().or_subcategory(category)
|
|
196
|
+
if ambient in FiniteCrystals() or isinstance(contained, frozenset):
|
|
197
|
+
category = category.Finite()
|
|
198
|
+
|
|
199
|
+
return super().__classcall__(cls, ambient, virtualization,
|
|
200
|
+
scaling_factors, contained,
|
|
201
|
+
tuple(generators), cartan_type,
|
|
202
|
+
tuple(index_set), category)
|
|
203
|
+
|
|
204
|
+
def __init__(self, ambient, virtualization, scaling_factors,
|
|
205
|
+
contained, generators, cartan_type, index_set, category):
|
|
206
|
+
"""
|
|
207
|
+
Initialize ``self``.
|
|
208
|
+
|
|
209
|
+
EXAMPLES::
|
|
210
|
+
|
|
211
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
212
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
213
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
214
|
+
sage: V = psi.image()
|
|
215
|
+
sage: TestSuite(V).run()
|
|
216
|
+
"""
|
|
217
|
+
self._virtualization = virtualization
|
|
218
|
+
self._scaling_factors = scaling_factors
|
|
219
|
+
Subcrystal.__init__(self, ambient, contained, generators,
|
|
220
|
+
cartan_type, index_set, category)
|
|
221
|
+
|
|
222
|
+
def _repr_(self):
|
|
223
|
+
"""
|
|
224
|
+
Return a string representation of ``self``.
|
|
225
|
+
|
|
226
|
+
EXAMPLES::
|
|
227
|
+
|
|
228
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
229
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
230
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
231
|
+
sage: psi.image()
|
|
232
|
+
Virtual crystal of The crystal of tableaux of type ['D', 4] and shape(s) [[2]] of type ['B', 3]
|
|
233
|
+
"""
|
|
234
|
+
return "Virtual crystal of {} of type {}".format(self._ambient, self._cartan_type)
|
|
235
|
+
|
|
236
|
+
def __contains__(self, x):
|
|
237
|
+
"""
|
|
238
|
+
Check if ``x`` is in ``self``.
|
|
239
|
+
|
|
240
|
+
EXAMPLES::
|
|
241
|
+
|
|
242
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
243
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
244
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
245
|
+
sage: V = psi.image()
|
|
246
|
+
sage: mg = C.module_generators[0]
|
|
247
|
+
sage: mg in V
|
|
248
|
+
True
|
|
249
|
+
sage: mg.f(1) in V
|
|
250
|
+
False
|
|
251
|
+
sage: mg.f(1).f(1) in V
|
|
252
|
+
True
|
|
253
|
+
"""
|
|
254
|
+
if not Subcrystal.__contains__(self, x):
|
|
255
|
+
return False
|
|
256
|
+
if self in FiniteCrystals():
|
|
257
|
+
if isinstance(x, self._ambient.element_class):
|
|
258
|
+
if x.parent() == self:
|
|
259
|
+
x = self.element_class(self, self._ambient(x))
|
|
260
|
+
elif x.parent() == self._ambient:
|
|
261
|
+
x = self.element_class(self, self._ambient(x))
|
|
262
|
+
elif isinstance(x, self.element_class) and x.parent() != self:
|
|
263
|
+
x = self.element_class(self, x.value)
|
|
264
|
+
return x in self.list()
|
|
265
|
+
return True
|
|
266
|
+
|
|
267
|
+
def virtualization(self):
|
|
268
|
+
r"""
|
|
269
|
+
Return the virtualization sets `\sigma_i`.
|
|
270
|
+
|
|
271
|
+
EXAMPLES::
|
|
272
|
+
|
|
273
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
274
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
275
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
276
|
+
sage: V = psi.image()
|
|
277
|
+
sage: V.virtualization()
|
|
278
|
+
Finite family {1: (1,), 2: (2,), 3: (3, 4)}
|
|
279
|
+
"""
|
|
280
|
+
return self._virtualization
|
|
281
|
+
|
|
282
|
+
def scaling_factors(self):
|
|
283
|
+
r"""
|
|
284
|
+
Return the scaling factors `\gamma_i`.
|
|
285
|
+
|
|
286
|
+
EXAMPLES::
|
|
287
|
+
|
|
288
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
289
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
290
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
291
|
+
sage: V = psi.image()
|
|
292
|
+
sage: V.scaling_factors()
|
|
293
|
+
Finite family {1: 2, 2: 2, 3: 1}
|
|
294
|
+
"""
|
|
295
|
+
return self._scaling_factors
|
|
296
|
+
|
|
297
|
+
class Element(Subcrystal.Element):
|
|
298
|
+
"""
|
|
299
|
+
An element of a virtual (sub)crystal. Wraps an element in the
|
|
300
|
+
ambient crystal.
|
|
301
|
+
"""
|
|
302
|
+
|
|
303
|
+
def e(self, i):
|
|
304
|
+
"""
|
|
305
|
+
Return `e_i` of ``self``.
|
|
306
|
+
|
|
307
|
+
EXAMPLES::
|
|
308
|
+
|
|
309
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
310
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
311
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
312
|
+
sage: V = psi.image()
|
|
313
|
+
sage: mg = V.module_generators[0]
|
|
314
|
+
sage: mg.e(1)
|
|
315
|
+
sage: b = psi(B.module_generators[0].f(1))
|
|
316
|
+
sage: V(b).e(1)
|
|
317
|
+
[[1, 1]]
|
|
318
|
+
"""
|
|
319
|
+
s = []
|
|
320
|
+
P = self.parent()
|
|
321
|
+
sf = P._scaling_factors[i]
|
|
322
|
+
for j in P._virtualization[i]:
|
|
323
|
+
s += [j]*sf
|
|
324
|
+
ret = self.value.e_string(s)
|
|
325
|
+
if ret is None:
|
|
326
|
+
return None
|
|
327
|
+
return self.__class__(P, ret)
|
|
328
|
+
|
|
329
|
+
def f(self, i):
|
|
330
|
+
"""
|
|
331
|
+
Return `f_i` of ``self``.
|
|
332
|
+
|
|
333
|
+
EXAMPLES::
|
|
334
|
+
|
|
335
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
336
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
337
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
338
|
+
sage: V = psi.image()
|
|
339
|
+
sage: mg = V.module_generators[0]
|
|
340
|
+
sage: mg.f(1)
|
|
341
|
+
[[2, 2]]
|
|
342
|
+
sage: mg.f(2)
|
|
343
|
+
"""
|
|
344
|
+
s = []
|
|
345
|
+
P = self.parent()
|
|
346
|
+
sf = P._scaling_factors[i]
|
|
347
|
+
for j in P._virtualization[i]:
|
|
348
|
+
s += [j]*sf
|
|
349
|
+
ret = self.value.f_string(s)
|
|
350
|
+
if ret is None:
|
|
351
|
+
return None
|
|
352
|
+
return self.__class__(P, ret)
|
|
353
|
+
|
|
354
|
+
def epsilon(self, i):
|
|
355
|
+
r"""
|
|
356
|
+
Return `\varepsilon_i` of ``self``.
|
|
357
|
+
|
|
358
|
+
EXAMPLES::
|
|
359
|
+
|
|
360
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
361
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
362
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
363
|
+
sage: V = psi.image()
|
|
364
|
+
sage: mg = V.module_generators[0]
|
|
365
|
+
sage: mg.epsilon(2)
|
|
366
|
+
0
|
|
367
|
+
sage: mg.f(1).epsilon(1)
|
|
368
|
+
1
|
|
369
|
+
"""
|
|
370
|
+
P = self.parent()
|
|
371
|
+
return self.value.epsilon(P._virtualization[i][0]) // P._scaling_factors[i]
|
|
372
|
+
|
|
373
|
+
def phi(self, i):
|
|
374
|
+
r"""
|
|
375
|
+
Return `\varphi_i` of ``self``.
|
|
376
|
+
|
|
377
|
+
EXAMPLES::
|
|
378
|
+
|
|
379
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
380
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
381
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
382
|
+
sage: V = psi.image()
|
|
383
|
+
sage: mg = V.module_generators[0]
|
|
384
|
+
sage: mg.phi(1)
|
|
385
|
+
1
|
|
386
|
+
sage: mg.phi(2)
|
|
387
|
+
0
|
|
388
|
+
"""
|
|
389
|
+
P = self.parent()
|
|
390
|
+
return self.value.phi(P._virtualization[i][0]) // P._scaling_factors[i]
|
|
391
|
+
|
|
392
|
+
def weight(self):
|
|
393
|
+
"""
|
|
394
|
+
Return the weight of ``self``.
|
|
395
|
+
|
|
396
|
+
EXAMPLES::
|
|
397
|
+
|
|
398
|
+
sage: B = crystals.Tableaux(['B',3], shape=[1])
|
|
399
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
400
|
+
sage: psi = B.crystal_morphism(C.module_generators)
|
|
401
|
+
sage: V = psi.image()
|
|
402
|
+
sage: mg = V.module_generators[0]
|
|
403
|
+
sage: mg.weight()
|
|
404
|
+
(1, 0, 0)
|
|
405
|
+
sage: mg.f(1).weight()
|
|
406
|
+
(0, 1, 0)
|
|
407
|
+
sage: all(V(psi(x)).weight() == x.weight() for x in B)
|
|
408
|
+
True
|
|
409
|
+
"""
|
|
410
|
+
P = self.parent()
|
|
411
|
+
WLR = P.weight_lattice_realization()
|
|
412
|
+
wt = self.value.weight()
|
|
413
|
+
ac = P._ambient.weight_lattice_realization().simple_coroots()
|
|
414
|
+
La = WLR.fundamental_weights()
|
|
415
|
+
v = P._virtualization
|
|
416
|
+
sf = P._scaling_factors
|
|
417
|
+
return WLR.sum(wt.scalar(ac[v[i][0]]) // sf[i] * La[i]
|
|
418
|
+
for i in self.index_set())
|
|
419
|
+
|
|
420
|
+
# TODO: implement a devirtualization map
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Cyclic sieving phenomenon
|
|
4
|
+
|
|
5
|
+
Implementation of the Cyclic Sieving Phenomenon as described by
|
|
6
|
+
Reiner, Stanton, and White in [RSW2004]_.
|
|
7
|
+
|
|
8
|
+
We define the :func:`CyclicSievingPolynomial` of a finite set `S`
|
|
9
|
+
together with cyclic action ``cyc_act`` (of order `n`) to be the
|
|
10
|
+
unique polynomial ``P(q)`` of order < `n` such that the triple (`S`,
|
|
11
|
+
``cyc_act``, ``P(q)``) exhibits the cyclic sieving phenomenon.
|
|
12
|
+
|
|
13
|
+
AUTHORS:
|
|
14
|
+
|
|
15
|
+
- Christian Stump
|
|
16
|
+
|
|
17
|
+
REFERENCES:
|
|
18
|
+
|
|
19
|
+
.. [RSW2004] Reiner, Stanton, White - *The cyclic sieving phenomenon*,
|
|
20
|
+
Journal of Combinatorial Theory A 108 (2004)
|
|
21
|
+
"""
|
|
22
|
+
# ****************************************************************************
|
|
23
|
+
# Copyright (C) 2010 Christian Stump christian.stump@univie.ac.at
|
|
24
|
+
#
|
|
25
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
26
|
+
# https://www.gnu.org/licenses/
|
|
27
|
+
# ****************************************************************************
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
from sage.rings.integer_ring import ZZ
|
|
30
|
+
from sage.arith.functions import lcm
|
|
31
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def CyclicSievingPolynomial(L, cyc_act=None, order=None, get_order=False):
|
|
35
|
+
"""
|
|
36
|
+
Return the unique polynomial ``p`` of degree smaller than ``order`` such
|
|
37
|
+
that the triple ``(L, cyc_act, p)`` exhibits the Cyclic Sieving Phenomenon.
|
|
38
|
+
|
|
39
|
+
If ``cyc_act`` is None, ``L`` is expected to contain the orbit lengths.
|
|
40
|
+
|
|
41
|
+
INPUT:
|
|
42
|
+
|
|
43
|
+
- ``L`` -- if ``cyc_act`` is ``None``: list of orbit sizes,
|
|
44
|
+
otherwise list of objects
|
|
45
|
+
|
|
46
|
+
- ``cyc_act`` -- (default: ``None``) bijective function from ``L`` to ``L``
|
|
47
|
+
|
|
48
|
+
- ``order`` -- (default: ``None``) if set to an integer, this
|
|
49
|
+
cyclic order of ``cyc_act`` is used (must be an integer multiple
|
|
50
|
+
of the order of ``cyc_act``) otherwise, the order of ``cyc_action`` is
|
|
51
|
+
used
|
|
52
|
+
|
|
53
|
+
- ``get_order`` -- (default: ``False``) if ``True``, a tuple ``[p,n]``
|
|
54
|
+
is returned where ``p`` is as above, and ``n`` is the order
|
|
55
|
+
|
|
56
|
+
EXAMPLES::
|
|
57
|
+
|
|
58
|
+
sage: from sage.combinat.cyclic_sieving_phenomenon import CyclicSievingPolynomial
|
|
59
|
+
sage: S42 = Subsets([1,2,3,4], 2)
|
|
60
|
+
sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
|
|
61
|
+
sage: cyc_act([1,3])
|
|
62
|
+
{2, 4}
|
|
63
|
+
sage: cyc_act([1,4])
|
|
64
|
+
{1, 2}
|
|
65
|
+
sage: CyclicSievingPolynomial(S42, cyc_act)
|
|
66
|
+
q^3 + 2*q^2 + q + 2
|
|
67
|
+
sage: CyclicSievingPolynomial(S42, cyc_act, get_order=True)
|
|
68
|
+
[q^3 + 2*q^2 + q + 2, 4]
|
|
69
|
+
sage: CyclicSievingPolynomial(S42, cyc_act, order=8)
|
|
70
|
+
q^6 + 2*q^4 + q^2 + 2
|
|
71
|
+
sage: CyclicSievingPolynomial([4,2])
|
|
72
|
+
q^3 + 2*q^2 + q + 2
|
|
73
|
+
|
|
74
|
+
TESTS:
|
|
75
|
+
|
|
76
|
+
We check that :issue:`13997` is handled::
|
|
77
|
+
|
|
78
|
+
sage: CyclicSievingPolynomial(S42, cyc_act, order=8, get_order=True)
|
|
79
|
+
[q^6 + 2*q^4 + q^2 + 2, 8]
|
|
80
|
+
sage: CyclicSievingPolynomial(S42, cyc_act, order=11)
|
|
81
|
+
Traceback (most recent call last):
|
|
82
|
+
...
|
|
83
|
+
ValueError: order is not a multiple of the order of the cyclic action
|
|
84
|
+
"""
|
|
85
|
+
if cyc_act:
|
|
86
|
+
orbits = orbit_decomposition(L, cyc_act)
|
|
87
|
+
else:
|
|
88
|
+
orbits = [list(range(k)) for k in L]
|
|
89
|
+
|
|
90
|
+
R = PolynomialRing(ZZ, 'q')
|
|
91
|
+
q = R.gen()
|
|
92
|
+
p = R.zero()
|
|
93
|
+
|
|
94
|
+
orbit_sizes = {}
|
|
95
|
+
for orbit in orbits:
|
|
96
|
+
length = len(orbit)
|
|
97
|
+
if length in orbit_sizes:
|
|
98
|
+
orbit_sizes[length] += 1
|
|
99
|
+
else:
|
|
100
|
+
orbit_sizes[length] = 1
|
|
101
|
+
|
|
102
|
+
n = lcm(orbit_sizes)
|
|
103
|
+
|
|
104
|
+
if order:
|
|
105
|
+
if order.mod(n):
|
|
106
|
+
raise ValueError("order is not a multiple of the order"
|
|
107
|
+
" of the cyclic action")
|
|
108
|
+
else:
|
|
109
|
+
order = n
|
|
110
|
+
|
|
111
|
+
for i in range(n):
|
|
112
|
+
if i == 0:
|
|
113
|
+
j = sum(orbit_sizes.values())
|
|
114
|
+
else:
|
|
115
|
+
j = sum(orb for l, orb in orbit_sizes.items()
|
|
116
|
+
if not ZZ(i).mod(n // l))
|
|
117
|
+
p += j * q**i
|
|
118
|
+
|
|
119
|
+
p = p(q**(order // n))
|
|
120
|
+
|
|
121
|
+
return [p, order] if get_order else p
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def CyclicSievingCheck(L, cyc_act, f, order=None) -> bool:
|
|
125
|
+
"""
|
|
126
|
+
Return whether the triple ``(L, cyc_act, f)`` exhibits
|
|
127
|
+
the cyclic sieving phenomenon.
|
|
128
|
+
|
|
129
|
+
If ``cyc_act`` is None, ``L`` is expected to contain the orbit lengths.
|
|
130
|
+
|
|
131
|
+
INPUT:
|
|
132
|
+
|
|
133
|
+
- ``L`` -- if ``cyc_act`` is ``None``: list of orbit sizes,
|
|
134
|
+
otherwise list of objects
|
|
135
|
+
|
|
136
|
+
- ``cyc_act`` -- (default: ``None``) bijective function from ``L`` to ``L``
|
|
137
|
+
|
|
138
|
+
- ``order`` -- (default: ``None``) if set to an integer, this
|
|
139
|
+
cyclic order of ``cyc_act`` is used (must be an integer
|
|
140
|
+
multiple of the order of ``cyc_act``) otherwise, the order of
|
|
141
|
+
``cyc_action`` is used
|
|
142
|
+
|
|
143
|
+
EXAMPLES::
|
|
144
|
+
|
|
145
|
+
sage: from sage.combinat.cyclic_sieving_phenomenon import *
|
|
146
|
+
sage: from sage.combinat.q_analogues import q_binomial
|
|
147
|
+
sage: S42 = Subsets([1,2,3,4], 2)
|
|
148
|
+
sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
|
|
149
|
+
sage: cyc_act([1,3])
|
|
150
|
+
{2, 4}
|
|
151
|
+
sage: cyc_act([1,4])
|
|
152
|
+
{1, 2}
|
|
153
|
+
sage: p = q_binomial(4,2); p
|
|
154
|
+
q^4 + q^3 + 2*q^2 + q + 1
|
|
155
|
+
sage: CyclicSievingPolynomial( S42, cyc_act )
|
|
156
|
+
q^3 + 2*q^2 + q + 2
|
|
157
|
+
sage: CyclicSievingCheck( S42, cyc_act, p )
|
|
158
|
+
True
|
|
159
|
+
"""
|
|
160
|
+
p1, n = CyclicSievingPolynomial(L, cyc_act=cyc_act, order=order,
|
|
161
|
+
get_order=True)
|
|
162
|
+
R = p1.parent()
|
|
163
|
+
q = R.gen()
|
|
164
|
+
return p1 == R(f).mod(q**n - 1)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def orbit_decomposition(L, cyc_act) -> list[list]:
|
|
168
|
+
"""
|
|
169
|
+
Return the orbit decomposition of ``L`` by the action of ``cyc_act``.
|
|
170
|
+
|
|
171
|
+
INPUT:
|
|
172
|
+
|
|
173
|
+
- ``L`` -- list
|
|
174
|
+
|
|
175
|
+
- ``cyc_act`` -- bijective function from ``L`` to ``L``
|
|
176
|
+
|
|
177
|
+
OUTPUT: list of lists, the orbits under the cyc_act acting on ``L``
|
|
178
|
+
|
|
179
|
+
EXAMPLES::
|
|
180
|
+
|
|
181
|
+
sage: from sage.combinat.cyclic_sieving_phenomenon import *
|
|
182
|
+
sage: S42 = Subsets([1,2,3,4], 2); S42
|
|
183
|
+
Subsets of {1, 2, 3, 4} of size 2
|
|
184
|
+
sage: def cyc_act(S): return Set(i.mod(4) + 1 for i in S)
|
|
185
|
+
sage: cyc_act([1,3])
|
|
186
|
+
{2, 4}
|
|
187
|
+
sage: cyc_act([1,4])
|
|
188
|
+
{1, 2}
|
|
189
|
+
sage: orbits = orbit_decomposition(S42, cyc_act)
|
|
190
|
+
sage: sorted([sorted(orb, key=sorted) for orb in orbits], key=len)
|
|
191
|
+
[[{1, 3}, {2, 4}], [{1, 2}, {1, 4}, {2, 3}, {3, 4}]]
|
|
192
|
+
"""
|
|
193
|
+
orbits = []
|
|
194
|
+
L_prime = set(L)
|
|
195
|
+
while L_prime:
|
|
196
|
+
obj = L_prime.pop()
|
|
197
|
+
orbit = [obj]
|
|
198
|
+
obj = cyc_act(obj)
|
|
199
|
+
while obj in L_prime:
|
|
200
|
+
orbit.append(obj)
|
|
201
|
+
L_prime.remove(obj)
|
|
202
|
+
obj = cyc_act(obj)
|
|
203
|
+
orbits.append(orbit)
|
|
204
|
+
return orbits
|
|
Binary file
|