passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_combinat/__init__.py +3 -0
- passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
- passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
- passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
- passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
- passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
- sage/algebras/affine_nil_temperley_lieb.py +263 -0
- sage/algebras/all.py +24 -0
- sage/algebras/all__sagemath_combinat.py +35 -0
- sage/algebras/askey_wilson.py +935 -0
- sage/algebras/associated_graded.py +345 -0
- sage/algebras/cellular_basis.py +350 -0
- sage/algebras/cluster_algebra.py +2766 -0
- sage/algebras/down_up_algebra.py +860 -0
- sage/algebras/free_algebra.py +1698 -0
- sage/algebras/free_algebra_element.py +345 -0
- sage/algebras/free_algebra_quotient.py +405 -0
- sage/algebras/free_algebra_quotient_element.py +295 -0
- sage/algebras/free_zinbiel_algebra.py +885 -0
- sage/algebras/hall_algebra.py +783 -0
- sage/algebras/hecke_algebras/all.py +4 -0
- sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
- sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
- sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
- sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
- sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
- sage/algebras/iwahori_hecke_algebra.py +3095 -0
- sage/algebras/jordan_algebra.py +1773 -0
- sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
- sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
- sage/algebras/lie_conformal_algebras/all.py +18 -0
- sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
- sage/algebras/lie_conformal_algebras/examples.py +43 -0
- sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
- sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
- sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
- sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
- sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
- sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
- sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
- sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
- sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
- sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
- sage/algebras/nil_coxeter_algebra.py +191 -0
- sage/algebras/q_commuting_polynomials.py +673 -0
- sage/algebras/q_system.py +608 -0
- sage/algebras/quantum_clifford.py +959 -0
- sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
- sage/algebras/quantum_groups/all.py +9 -0
- sage/algebras/quantum_groups/fock_space.py +2219 -0
- sage/algebras/quantum_groups/q_numbers.py +207 -0
- sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
- sage/algebras/quantum_groups/representations.py +591 -0
- sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
- sage/algebras/quantum_oscillator.py +623 -0
- sage/algebras/quaternion_algebra.py +20 -0
- sage/algebras/quaternion_algebra_element.py +55 -0
- sage/algebras/rational_cherednik_algebra.py +525 -0
- sage/algebras/schur_algebra.py +670 -0
- sage/algebras/shuffle_algebra.py +1011 -0
- sage/algebras/splitting_algebra.py +779 -0
- sage/algebras/tensor_algebra.py +709 -0
- sage/algebras/yangian.py +1082 -0
- sage/algebras/yokonuma_hecke_algebra.py +1018 -0
- sage/all__sagemath_combinat.py +44 -0
- sage/combinat/SJT.py +255 -0
- sage/combinat/affine_permutation.py +2405 -0
- sage/combinat/algebraic_combinatorics.py +55 -0
- sage/combinat/all.py +53 -0
- sage/combinat/all__sagemath_combinat.py +195 -0
- sage/combinat/alternating_sign_matrix.py +2063 -0
- sage/combinat/baxter_permutations.py +346 -0
- sage/combinat/bijectionist.py +3220 -0
- sage/combinat/binary_recurrence_sequences.py +1180 -0
- sage/combinat/blob_algebra.py +685 -0
- sage/combinat/catalog_partitions.py +27 -0
- sage/combinat/chas/all.py +23 -0
- sage/combinat/chas/fsym.py +1180 -0
- sage/combinat/chas/wqsym.py +2601 -0
- sage/combinat/cluster_complex.py +326 -0
- sage/combinat/colored_permutations.py +2039 -0
- sage/combinat/colored_permutations_representations.py +964 -0
- sage/combinat/composition_signed.py +142 -0
- sage/combinat/composition_tableau.py +855 -0
- sage/combinat/constellation.py +1729 -0
- sage/combinat/core.py +751 -0
- sage/combinat/counting.py +12 -0
- sage/combinat/crystals/affine.py +742 -0
- sage/combinat/crystals/affine_factorization.py +518 -0
- sage/combinat/crystals/affinization.py +331 -0
- sage/combinat/crystals/alcove_path.py +2013 -0
- sage/combinat/crystals/all.py +22 -0
- sage/combinat/crystals/bkk_crystals.py +141 -0
- sage/combinat/crystals/catalog.py +115 -0
- sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
- sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
- sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
- sage/combinat/crystals/crystals.py +257 -0
- sage/combinat/crystals/direct_sum.py +260 -0
- sage/combinat/crystals/elementary_crystals.py +1251 -0
- sage/combinat/crystals/fast_crystals.py +441 -0
- sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
- sage/combinat/crystals/generalized_young_walls.py +1076 -0
- sage/combinat/crystals/highest_weight_crystals.py +436 -0
- sage/combinat/crystals/induced_structure.py +695 -0
- sage/combinat/crystals/infinity_crystals.py +730 -0
- sage/combinat/crystals/kac_modules.py +863 -0
- sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
- sage/combinat/crystals/kyoto_path_model.py +497 -0
- sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/letters.pxd +79 -0
- sage/combinat/crystals/letters.pyx +3056 -0
- sage/combinat/crystals/littelmann_path.py +1518 -0
- sage/combinat/crystals/monomial_crystals.py +1262 -0
- sage/combinat/crystals/multisegments.py +462 -0
- sage/combinat/crystals/mv_polytopes.py +467 -0
- sage/combinat/crystals/pbw_crystal.py +511 -0
- sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/pbw_datum.pxd +4 -0
- sage/combinat/crystals/pbw_datum.pyx +487 -0
- sage/combinat/crystals/polyhedral_realization.py +372 -0
- sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/spins.pxd +21 -0
- sage/combinat/crystals/spins.pyx +756 -0
- sage/combinat/crystals/star_crystal.py +290 -0
- sage/combinat/crystals/subcrystal.py +464 -0
- sage/combinat/crystals/tensor_product.py +1177 -0
- sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/tensor_product_element.pxd +35 -0
- sage/combinat/crystals/tensor_product_element.pyx +1870 -0
- sage/combinat/crystals/virtual_crystal.py +420 -0
- sage/combinat/cyclic_sieving_phenomenon.py +204 -0
- sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
- sage/combinat/degree_sequences.pyx +588 -0
- sage/combinat/derangements.py +527 -0
- sage/combinat/descent_algebra.py +1008 -0
- sage/combinat/diagram.py +1551 -0
- sage/combinat/diagram_algebras.py +5886 -0
- sage/combinat/dyck_word.py +4349 -0
- sage/combinat/e_one_star.py +1623 -0
- sage/combinat/enumerated_sets.py +123 -0
- sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
- sage/combinat/fast_vector_partitions.pyx +346 -0
- sage/combinat/fqsym.py +1977 -0
- sage/combinat/free_dendriform_algebra.py +954 -0
- sage/combinat/free_prelie_algebra.py +1141 -0
- sage/combinat/fully_commutative_elements.py +1077 -0
- sage/combinat/fully_packed_loop.py +1523 -0
- sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
- sage/combinat/gray_codes.py +311 -0
- sage/combinat/grossman_larson_algebras.py +667 -0
- sage/combinat/growth.py +4352 -0
- sage/combinat/hall_polynomial.py +188 -0
- sage/combinat/hillman_grassl.py +866 -0
- sage/combinat/integer_matrices.py +329 -0
- sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
- sage/combinat/k_tableau.py +4564 -0
- sage/combinat/kazhdan_lusztig.py +215 -0
- sage/combinat/key_polynomial.py +885 -0
- sage/combinat/knutson_tao_puzzles.py +2286 -0
- sage/combinat/lr_tableau.py +311 -0
- sage/combinat/matrices/all.py +24 -0
- sage/combinat/matrices/hadamard_matrix.py +3790 -0
- sage/combinat/matrices/latin.py +2912 -0
- sage/combinat/misc.py +401 -0
- sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
- sage/combinat/ncsf_qsym/all.py +21 -0
- sage/combinat/ncsf_qsym/combinatorics.py +317 -0
- sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
- sage/combinat/ncsf_qsym/ncsf.py +5637 -0
- sage/combinat/ncsf_qsym/qsym.py +4053 -0
- sage/combinat/ncsf_qsym/tutorial.py +447 -0
- sage/combinat/ncsym/all.py +21 -0
- sage/combinat/ncsym/bases.py +855 -0
- sage/combinat/ncsym/dual.py +593 -0
- sage/combinat/ncsym/ncsym.py +2076 -0
- sage/combinat/necklace.py +551 -0
- sage/combinat/non_decreasing_parking_function.py +634 -0
- sage/combinat/nu_dyck_word.py +1474 -0
- sage/combinat/output.py +861 -0
- sage/combinat/parallelogram_polyomino.py +4326 -0
- sage/combinat/parking_functions.py +1602 -0
- sage/combinat/partition_algebra.py +1998 -0
- sage/combinat/partition_kleshchev.py +1982 -0
- sage/combinat/partition_shifting_algebras.py +584 -0
- sage/combinat/partition_tuple.py +3114 -0
- sage/combinat/path_tableaux/all.py +13 -0
- sage/combinat/path_tableaux/catalog.py +29 -0
- sage/combinat/path_tableaux/dyck_path.py +380 -0
- sage/combinat/path_tableaux/frieze.py +476 -0
- sage/combinat/path_tableaux/path_tableau.py +728 -0
- sage/combinat/path_tableaux/semistandard.py +510 -0
- sage/combinat/perfect_matching.py +779 -0
- sage/combinat/plane_partition.py +3300 -0
- sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
- sage/combinat/q_bernoulli.pyx +128 -0
- sage/combinat/quickref.py +81 -0
- sage/combinat/recognizable_series.py +2051 -0
- sage/combinat/regular_sequence.py +4316 -0
- sage/combinat/regular_sequence_bounded.py +543 -0
- sage/combinat/restricted_growth.py +81 -0
- sage/combinat/ribbon.py +20 -0
- sage/combinat/ribbon_shaped_tableau.py +489 -0
- sage/combinat/ribbon_tableau.py +1180 -0
- sage/combinat/rigged_configurations/all.py +46 -0
- sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
- sage/combinat/rigged_configurations/bij_infinity.py +370 -0
- sage/combinat/rigged_configurations/bij_type_A.py +163 -0
- sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
- sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
- sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
- sage/combinat/rigged_configurations/bij_type_B.py +900 -0
- sage/combinat/rigged_configurations/bij_type_C.py +267 -0
- sage/combinat/rigged_configurations/bij_type_D.py +771 -0
- sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
- sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
- sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
- sage/combinat/rigged_configurations/bijection.py +143 -0
- sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
- sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
- sage/combinat/rigged_configurations/rc_crystal.py +461 -0
- sage/combinat/rigged_configurations/rc_infinity.py +540 -0
- sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
- sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
- sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
- sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
- sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
- sage/combinat/rsk.py +3438 -0
- sage/combinat/schubert_polynomial.py +508 -0
- sage/combinat/set_partition.py +3318 -0
- sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
- sage/combinat/set_partition_iterator.pyx +136 -0
- sage/combinat/set_partition_ordered.py +1590 -0
- sage/combinat/sf/abreu_nigro.py +346 -0
- sage/combinat/sf/all.py +52 -0
- sage/combinat/sf/character.py +576 -0
- sage/combinat/sf/classical.py +319 -0
- sage/combinat/sf/dual.py +996 -0
- sage/combinat/sf/elementary.py +549 -0
- sage/combinat/sf/hall_littlewood.py +1028 -0
- sage/combinat/sf/hecke.py +336 -0
- sage/combinat/sf/homogeneous.py +464 -0
- sage/combinat/sf/jack.py +1428 -0
- sage/combinat/sf/k_dual.py +1458 -0
- sage/combinat/sf/kfpoly.py +447 -0
- sage/combinat/sf/llt.py +789 -0
- sage/combinat/sf/macdonald.py +2019 -0
- sage/combinat/sf/monomial.py +525 -0
- sage/combinat/sf/multiplicative.py +113 -0
- sage/combinat/sf/new_kschur.py +1786 -0
- sage/combinat/sf/ns_macdonald.py +964 -0
- sage/combinat/sf/orthogonal.py +246 -0
- sage/combinat/sf/orthotriang.py +355 -0
- sage/combinat/sf/powersum.py +963 -0
- sage/combinat/sf/schur.py +880 -0
- sage/combinat/sf/sf.py +1653 -0
- sage/combinat/sf/sfa.py +7053 -0
- sage/combinat/sf/symplectic.py +253 -0
- sage/combinat/sf/witt.py +721 -0
- sage/combinat/shifted_primed_tableau.py +2735 -0
- sage/combinat/shuffle.py +830 -0
- sage/combinat/sidon_sets.py +146 -0
- sage/combinat/similarity_class_type.py +1721 -0
- sage/combinat/sine_gordon.py +618 -0
- sage/combinat/six_vertex_model.py +784 -0
- sage/combinat/skew_partition.py +2053 -0
- sage/combinat/skew_tableau.py +2989 -0
- sage/combinat/sloane_functions.py +8935 -0
- sage/combinat/specht_module.py +1403 -0
- sage/combinat/species/all.py +48 -0
- sage/combinat/species/characteristic_species.py +321 -0
- sage/combinat/species/composition_species.py +273 -0
- sage/combinat/species/cycle_species.py +284 -0
- sage/combinat/species/empty_species.py +155 -0
- sage/combinat/species/functorial_composition_species.py +148 -0
- sage/combinat/species/generating_series.py +673 -0
- sage/combinat/species/library.py +148 -0
- sage/combinat/species/linear_order_species.py +169 -0
- sage/combinat/species/misc.py +83 -0
- sage/combinat/species/partition_species.py +290 -0
- sage/combinat/species/permutation_species.py +268 -0
- sage/combinat/species/product_species.py +423 -0
- sage/combinat/species/recursive_species.py +476 -0
- sage/combinat/species/set_species.py +192 -0
- sage/combinat/species/species.py +820 -0
- sage/combinat/species/structure.py +539 -0
- sage/combinat/species/subset_species.py +243 -0
- sage/combinat/species/sum_species.py +225 -0
- sage/combinat/subword.py +564 -0
- sage/combinat/subword_complex.py +2122 -0
- sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
- sage/combinat/subword_complex_c.pyx +119 -0
- sage/combinat/super_tableau.py +821 -0
- sage/combinat/superpartition.py +1154 -0
- sage/combinat/symmetric_group_algebra.py +3774 -0
- sage/combinat/symmetric_group_representations.py +1830 -0
- sage/combinat/t_sequences.py +877 -0
- sage/combinat/tableau.py +9506 -0
- sage/combinat/tableau_residues.py +860 -0
- sage/combinat/tableau_tuple.py +5353 -0
- sage/combinat/tiling.py +2432 -0
- sage/combinat/triangles_FHM.py +777 -0
- sage/combinat/tutorial.py +1857 -0
- sage/combinat/vector_partition.py +337 -0
- sage/combinat/words/abstract_word.py +1722 -0
- sage/combinat/words/all.py +59 -0
- sage/combinat/words/alphabet.py +268 -0
- sage/combinat/words/finite_word.py +7201 -0
- sage/combinat/words/infinite_word.py +113 -0
- sage/combinat/words/lyndon_word.py +652 -0
- sage/combinat/words/morphic.py +351 -0
- sage/combinat/words/morphism.py +3878 -0
- sage/combinat/words/paths.py +2932 -0
- sage/combinat/words/shuffle_product.py +278 -0
- sage/combinat/words/suffix_trees.py +1873 -0
- sage/combinat/words/word.py +769 -0
- sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_datatypes.pxd +4 -0
- sage/combinat/words/word_datatypes.pyx +1067 -0
- sage/combinat/words/word_generators.py +2026 -0
- sage/combinat/words/word_infinite_datatypes.py +1218 -0
- sage/combinat/words/word_options.py +99 -0
- sage/combinat/words/words.py +2396 -0
- sage/data_structures/all__sagemath_combinat.py +1 -0
- sage/databases/all__sagemath_combinat.py +13 -0
- sage/databases/findstat.py +4897 -0
- sage/databases/oeis.py +2058 -0
- sage/databases/sloane.py +393 -0
- sage/dynamics/all__sagemath_combinat.py +14 -0
- sage/dynamics/cellular_automata/all.py +7 -0
- sage/dynamics/cellular_automata/catalog.py +34 -0
- sage/dynamics/cellular_automata/elementary.py +612 -0
- sage/dynamics/cellular_automata/glca.py +477 -0
- sage/dynamics/cellular_automata/solitons.py +1463 -0
- sage/dynamics/finite_dynamical_system.py +1249 -0
- sage/dynamics/finite_dynamical_system_catalog.py +382 -0
- sage/games/all.py +7 -0
- sage/games/hexad.py +704 -0
- sage/games/quantumino.py +591 -0
- sage/games/sudoku.py +889 -0
- sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
- sage/games/sudoku_backtrack.pyx +189 -0
- sage/groups/all__sagemath_combinat.py +1 -0
- sage/groups/indexed_free_group.py +489 -0
- sage/libs/all__sagemath_combinat.py +6 -0
- sage/libs/lrcalc/__init__.py +1 -0
- sage/libs/lrcalc/lrcalc.py +525 -0
- sage/libs/symmetrica/__init__.py +7 -0
- sage/libs/symmetrica/all.py +101 -0
- sage/libs/symmetrica/kostka.pxi +168 -0
- sage/libs/symmetrica/part.pxi +193 -0
- sage/libs/symmetrica/plet.pxi +42 -0
- sage/libs/symmetrica/sab.pxi +196 -0
- sage/libs/symmetrica/sb.pxi +332 -0
- sage/libs/symmetrica/sc.pxi +192 -0
- sage/libs/symmetrica/schur.pxi +956 -0
- sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
- sage/libs/symmetrica/symmetrica.pxi +1172 -0
- sage/libs/symmetrica/symmetrica.pyx +39 -0
- sage/monoids/all.py +13 -0
- sage/monoids/automatic_semigroup.py +1054 -0
- sage/monoids/free_abelian_monoid.py +315 -0
- sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
- sage/monoids/free_abelian_monoid_element.pxd +16 -0
- sage/monoids/free_abelian_monoid_element.pyx +397 -0
- sage/monoids/free_monoid.py +335 -0
- sage/monoids/free_monoid_element.py +431 -0
- sage/monoids/hecke_monoid.py +65 -0
- sage/monoids/string_monoid.py +817 -0
- sage/monoids/string_monoid_element.py +547 -0
- sage/monoids/string_ops.py +143 -0
- sage/monoids/trace_monoid.py +972 -0
- sage/rings/all__sagemath_combinat.py +2 -0
- sage/sat/all.py +4 -0
- sage/sat/boolean_polynomials.py +405 -0
- sage/sat/converters/__init__.py +6 -0
- sage/sat/converters/anf2cnf.py +14 -0
- sage/sat/converters/polybori.py +611 -0
- sage/sat/solvers/__init__.py +5 -0
- sage/sat/solvers/cryptominisat.py +287 -0
- sage/sat/solvers/dimacs.py +783 -0
- sage/sat/solvers/picosat.py +228 -0
- sage/sat/solvers/sat_lp.py +156 -0
- sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Hall Algebras
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2013-10-17): Initial version
|
|
9
|
+
"""
|
|
10
|
+
# ****************************************************************************
|
|
11
|
+
# Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
12
|
+
#
|
|
13
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
14
|
+
# https://www.gnu.org/licenses/
|
|
15
|
+
# ****************************************************************************
|
|
16
|
+
|
|
17
|
+
from sage.misc.misc_c import prod
|
|
18
|
+
from sage.misc.cachefunc import cached_method
|
|
19
|
+
from sage.categories.algebras_with_basis import AlgebrasWithBasis
|
|
20
|
+
from sage.categories.hopf_algebras_with_basis import HopfAlgebrasWithBasis
|
|
21
|
+
from sage.combinat.partition import Partition, Partitions
|
|
22
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
23
|
+
from sage.combinat.hall_polynomial import hall_polynomial
|
|
24
|
+
from sage.combinat.sf.sf import SymmetricFunctions
|
|
25
|
+
from sage.rings.integer_ring import ZZ
|
|
26
|
+
from functools import cmp_to_key, reduce
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def transpose_cmp(x, y):
|
|
30
|
+
r"""
|
|
31
|
+
Compare partitions ``x`` and ``y`` in transpose dominance order.
|
|
32
|
+
|
|
33
|
+
We say partitions `\mu` and `\lambda` satisfy `\mu \prec \lambda`
|
|
34
|
+
in transpose dominance order if for all `i \geq 1` we have:
|
|
35
|
+
|
|
36
|
+
.. MATH::
|
|
37
|
+
|
|
38
|
+
l_1 + 2 l_2 + \cdots + (i-1) l_{i-1} + i(l_i + l_{i+1} + \cdots) \leq
|
|
39
|
+
m_1 + 2 m_2 + \cdots + (i-1) m_{i-1} + i(m_i + m_{i+1} + \cdots),
|
|
40
|
+
|
|
41
|
+
where `l_k` denotes the number of appearances of `k` in
|
|
42
|
+
`\lambda`, and `m_k` denotes the number of appearances of `k`
|
|
43
|
+
in `\mu`.
|
|
44
|
+
|
|
45
|
+
Equivalently, `\mu \prec \lambda` if the conjugate of the
|
|
46
|
+
partition `\mu` dominates the conjugate of the partition
|
|
47
|
+
`\lambda`.
|
|
48
|
+
|
|
49
|
+
Since this is a partial ordering, we fallback to lex ordering
|
|
50
|
+
`\mu <_L \lambda` if we cannot compare in the transpose order.
|
|
51
|
+
|
|
52
|
+
EXAMPLES::
|
|
53
|
+
|
|
54
|
+
sage: from sage.algebras.hall_algebra import transpose_cmp
|
|
55
|
+
sage: transpose_cmp(Partition([4,3,1]), Partition([3,2,2,1]))
|
|
56
|
+
-1
|
|
57
|
+
sage: transpose_cmp(Partition([2,2,1]), Partition([3,2]))
|
|
58
|
+
1
|
|
59
|
+
sage: transpose_cmp(Partition([4,1,1]), Partition([4,1,1]))
|
|
60
|
+
0
|
|
61
|
+
"""
|
|
62
|
+
if x == y:
|
|
63
|
+
return 0
|
|
64
|
+
xexp = x.to_exp()
|
|
65
|
+
yexp = y.to_exp()
|
|
66
|
+
n = min(len(xexp), len(yexp))
|
|
67
|
+
|
|
68
|
+
def check(m, l):
|
|
69
|
+
s1 = 0
|
|
70
|
+
s2 = 0
|
|
71
|
+
for i in range(n):
|
|
72
|
+
s1 += sum(l[i:])
|
|
73
|
+
s2 += sum(m[i:])
|
|
74
|
+
if s1 > s2:
|
|
75
|
+
return False
|
|
76
|
+
return sum(l) <= sum(m)
|
|
77
|
+
if check(xexp, yexp):
|
|
78
|
+
return 1
|
|
79
|
+
if check(yexp, xexp):
|
|
80
|
+
return -1
|
|
81
|
+
if x < y:
|
|
82
|
+
return -1
|
|
83
|
+
return 1
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class HallAlgebra(CombinatorialFreeModule):
|
|
87
|
+
r"""
|
|
88
|
+
The (classical) Hall algebra.
|
|
89
|
+
|
|
90
|
+
The *(classical) Hall algebra* over a commutative ring `R` with a
|
|
91
|
+
parameter `q \in R` is defined to be the free `R`-module with
|
|
92
|
+
basis `(I_\lambda)`, where `\lambda` runs over all integer
|
|
93
|
+
partitions. The algebra structure is given by a product defined by
|
|
94
|
+
|
|
95
|
+
.. MATH::
|
|
96
|
+
|
|
97
|
+
I_\mu \cdot I_\lambda = \sum_\nu P^{\nu}_{\mu, \lambda}(q) I_\nu,
|
|
98
|
+
|
|
99
|
+
where `P^{\nu}_{\mu, \lambda}` is a Hall polynomial (see
|
|
100
|
+
:func:`~sage.combinat.hall_polynomial.hall_polynomial`). The
|
|
101
|
+
unity of this algebra is `I_{\emptyset}`.
|
|
102
|
+
|
|
103
|
+
The (classical) Hall algebra is also known as the Hall-Steinitz
|
|
104
|
+
algebra.
|
|
105
|
+
|
|
106
|
+
We can define an `R`-algebra isomorphism `\Phi` from the
|
|
107
|
+
`R`-algebra of symmetric functions (see
|
|
108
|
+
:class:`~sage.combinat.sf.sf.SymmetricFunctions`) to the
|
|
109
|
+
(classical) Hall algebra by sending the `r`-th elementary
|
|
110
|
+
symmetric function `e_r` to `q^{r(r-1)/2} I_{(1^r)}` for every
|
|
111
|
+
positive integer `r`. This isomorphism used to transport the
|
|
112
|
+
Hopf algebra structure from the `R`-algebra of symmetric functions
|
|
113
|
+
to the Hall algebra, thus making the latter a connected graded
|
|
114
|
+
Hopf algebra. If `\lambda` is a partition, then the preimage
|
|
115
|
+
of the basis element `I_{\lambda}` under this isomorphism is
|
|
116
|
+
`q^{n(\lambda)} P_{\lambda}(x; q^{-1})`, where `P_{\lambda}` denotes
|
|
117
|
+
the `\lambda`-th Hall-Littlewood `P`-function, and where
|
|
118
|
+
`n(\lambda) = \sum_i (i - 1) \lambda_i`.
|
|
119
|
+
|
|
120
|
+
See section 2.3 in [Sch2006]_, and sections II.2 and III.3
|
|
121
|
+
in [Mac1995]_ (where our `I_{\lambda}` is called `u_{\lambda}`).
|
|
122
|
+
|
|
123
|
+
EXAMPLES::
|
|
124
|
+
|
|
125
|
+
sage: R.<q> = ZZ[]
|
|
126
|
+
sage: H = HallAlgebra(R, q)
|
|
127
|
+
sage: H[2,1]*H[1,1]
|
|
128
|
+
H[3, 2] + (q+1)*H[3, 1, 1] + (q^2+q)*H[2, 2, 1] + (q^4+q^3+q^2)*H[2, 1, 1, 1]
|
|
129
|
+
sage: H[2]*H[2,1]
|
|
130
|
+
H[4, 1] + q*H[3, 2] + (q^2-1)*H[3, 1, 1] + (q^3+q^2)*H[2, 2, 1]
|
|
131
|
+
sage: H[3]*H[1,1]
|
|
132
|
+
H[4, 1] + q^2*H[3, 1, 1]
|
|
133
|
+
sage: H[3]*H[2,1]
|
|
134
|
+
H[5, 1] + q*H[4, 2] + (q^2-1)*H[4, 1, 1] + q^3*H[3, 2, 1]
|
|
135
|
+
|
|
136
|
+
We can rewrite the Hall algebra in terms of monomials of
|
|
137
|
+
the elements `I_{(1^r)}`::
|
|
138
|
+
|
|
139
|
+
sage: I = H.monomial_basis()
|
|
140
|
+
sage: H(I[2,1,1])
|
|
141
|
+
H[3, 1] + (q+1)*H[2, 2] + (2*q^2+2*q+1)*H[2, 1, 1]
|
|
142
|
+
+ (q^5+2*q^4+3*q^3+3*q^2+2*q+1)*H[1, 1, 1, 1]
|
|
143
|
+
sage: I(H[2,1,1])
|
|
144
|
+
I[3, 1] + (-q^3-q^2-q-1)*I[4]
|
|
145
|
+
|
|
146
|
+
The isomorphism between the Hall algebra and the symmetric
|
|
147
|
+
functions described above is implemented as a coercion::
|
|
148
|
+
|
|
149
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
150
|
+
sage: q = R.gen()
|
|
151
|
+
sage: H = HallAlgebra(R, q)
|
|
152
|
+
sage: e = SymmetricFunctions(R).e()
|
|
153
|
+
sage: e(H[1,1,1])
|
|
154
|
+
1/q^3*e[3]
|
|
155
|
+
|
|
156
|
+
We can also do computations with any special value of ``q``,
|
|
157
|
+
such as `0` or `1` or (most commonly) a prime power. Here
|
|
158
|
+
is an example using a prime::
|
|
159
|
+
|
|
160
|
+
sage: H = HallAlgebra(ZZ, 2)
|
|
161
|
+
sage: H[2,1]*H[1,1]
|
|
162
|
+
H[3, 2] + 3*H[3, 1, 1] + 6*H[2, 2, 1] + 28*H[2, 1, 1, 1]
|
|
163
|
+
sage: H[3,1]*H[2]
|
|
164
|
+
H[5, 1] + H[4, 2] + 6*H[3, 3] + 3*H[4, 1, 1] + 8*H[3, 2, 1]
|
|
165
|
+
sage: H[2,1,1]*H[3,1]
|
|
166
|
+
H[5, 2, 1] + 2*H[4, 3, 1] + 6*H[4, 2, 2] + 7*H[5, 1, 1, 1]
|
|
167
|
+
+ 19*H[4, 2, 1, 1] + 24*H[3, 3, 1, 1] + 48*H[3, 2, 2, 1]
|
|
168
|
+
+ 105*H[4, 1, 1, 1, 1] + 224*H[3, 2, 1, 1, 1]
|
|
169
|
+
sage: I = H.monomial_basis()
|
|
170
|
+
sage: H(I[2,1,1])
|
|
171
|
+
H[3, 1] + 3*H[2, 2] + 13*H[2, 1, 1] + 105*H[1, 1, 1, 1]
|
|
172
|
+
sage: I(H[2,1,1])
|
|
173
|
+
I[3, 1] - 15*I[4]
|
|
174
|
+
|
|
175
|
+
If `q` is set to `1`, the coercion to the symmetric functions
|
|
176
|
+
sends `I_{\lambda}` to `m_{\lambda}`::
|
|
177
|
+
|
|
178
|
+
sage: H = HallAlgebra(QQ, 1)
|
|
179
|
+
sage: H[2,1] * H[2,1]
|
|
180
|
+
H[4, 2] + 2*H[3, 3] + 2*H[4, 1, 1] + 2*H[3, 2, 1] + 6*H[2, 2, 2] + 4*H[2, 2, 1, 1]
|
|
181
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
182
|
+
sage: m[2,1] * m[2,1]
|
|
183
|
+
4*m[2, 2, 1, 1] + 6*m[2, 2, 2] + 2*m[3, 2, 1] + 2*m[3, 3] + 2*m[4, 1, 1] + m[4, 2]
|
|
184
|
+
sage: m(H[3,1])
|
|
185
|
+
m[3, 1]
|
|
186
|
+
|
|
187
|
+
We can set `q` to `0` (but should keep in mind that we don't get
|
|
188
|
+
the Schur functions this way)::
|
|
189
|
+
|
|
190
|
+
sage: H = HallAlgebra(QQ, 0)
|
|
191
|
+
sage: H[2,1] * H[2,1]
|
|
192
|
+
H[4, 2] + H[3, 3] + H[4, 1, 1] - H[3, 2, 1] - H[3, 1, 1, 1]
|
|
193
|
+
|
|
194
|
+
TESTS:
|
|
195
|
+
|
|
196
|
+
The coefficients are actually Laurent polynomials in general, so we don't
|
|
197
|
+
have to work over the fraction field of `\ZZ[q]`. This didn't work before
|
|
198
|
+
:issue:`15345`::
|
|
199
|
+
|
|
200
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
201
|
+
sage: H = HallAlgebra(R, q)
|
|
202
|
+
sage: I = H.monomial_basis()
|
|
203
|
+
sage: hi = H(I[2,1]); hi
|
|
204
|
+
H[2, 1] + (1+q+q^2)*H[1, 1, 1]
|
|
205
|
+
sage: hi.parent() is H
|
|
206
|
+
True
|
|
207
|
+
sage: h22 = H[2]*H[2]; h22
|
|
208
|
+
H[4] - (1-q)*H[3, 1] + (q+q^2)*H[2, 2]
|
|
209
|
+
sage: h22.parent() is H
|
|
210
|
+
True
|
|
211
|
+
sage: e = SymmetricFunctions(R).e()
|
|
212
|
+
sage: e(H[1,1,1])
|
|
213
|
+
(q^-3)*e[3]
|
|
214
|
+
"""
|
|
215
|
+
def __init__(self, base_ring, q, prefix='H'):
|
|
216
|
+
"""
|
|
217
|
+
Initialize ``self``.
|
|
218
|
+
|
|
219
|
+
EXAMPLES::
|
|
220
|
+
|
|
221
|
+
sage: R.<q> = ZZ[]
|
|
222
|
+
sage: H = HallAlgebra(R, q)
|
|
223
|
+
sage: TestSuite(H).run()
|
|
224
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
225
|
+
sage: q = R.gen()
|
|
226
|
+
sage: H = HallAlgebra(R, q)
|
|
227
|
+
sage: TestSuite(H).run() # long time
|
|
228
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
229
|
+
sage: H = HallAlgebra(R, q)
|
|
230
|
+
sage: TestSuite(H).run() # long time
|
|
231
|
+
"""
|
|
232
|
+
self._q = q
|
|
233
|
+
try:
|
|
234
|
+
q_inverse = q**-1
|
|
235
|
+
if q_inverse not in base_ring:
|
|
236
|
+
hopf_structure = False
|
|
237
|
+
else:
|
|
238
|
+
hopf_structure = True
|
|
239
|
+
except Exception:
|
|
240
|
+
hopf_structure = False
|
|
241
|
+
if hopf_structure:
|
|
242
|
+
category = HopfAlgebrasWithBasis(base_ring)
|
|
243
|
+
else:
|
|
244
|
+
category = AlgebrasWithBasis(base_ring)
|
|
245
|
+
CombinatorialFreeModule.__init__(self, base_ring, Partitions(),
|
|
246
|
+
prefix=prefix, bracket=False,
|
|
247
|
+
sorting_key=cmp_to_key(transpose_cmp),
|
|
248
|
+
category=category)
|
|
249
|
+
|
|
250
|
+
# Coercions
|
|
251
|
+
I = self.monomial_basis()
|
|
252
|
+
M = I.module_morphism(I._to_natural_on_basis, codomain=self,
|
|
253
|
+
triangular='upper', unitriangular=True,
|
|
254
|
+
inverse_on_support=lambda x: x.conjugate(),
|
|
255
|
+
invertible=True)
|
|
256
|
+
M.register_as_coercion()
|
|
257
|
+
(~M).register_as_coercion()
|
|
258
|
+
|
|
259
|
+
def _repr_(self):
|
|
260
|
+
"""
|
|
261
|
+
Return a string representation of ``self``.
|
|
262
|
+
|
|
263
|
+
EXAMPLES::
|
|
264
|
+
|
|
265
|
+
sage: R.<q> = ZZ[]
|
|
266
|
+
sage: HallAlgebra(R, q)
|
|
267
|
+
Hall algebra with q=q over Univariate Polynomial Ring in q over Integer Ring
|
|
268
|
+
"""
|
|
269
|
+
return "Hall algebra with q={} over {}".format(self._q, self.base_ring())
|
|
270
|
+
|
|
271
|
+
def one_basis(self):
|
|
272
|
+
"""
|
|
273
|
+
Return the index of the basis element `1`.
|
|
274
|
+
|
|
275
|
+
EXAMPLES::
|
|
276
|
+
|
|
277
|
+
sage: R.<q> = ZZ[]
|
|
278
|
+
sage: H = HallAlgebra(R, q)
|
|
279
|
+
sage: H.one_basis()
|
|
280
|
+
[]
|
|
281
|
+
"""
|
|
282
|
+
return Partition([])
|
|
283
|
+
|
|
284
|
+
def product_on_basis(self, mu, la):
|
|
285
|
+
"""
|
|
286
|
+
Return the product of the two basis elements indexed by ``mu``
|
|
287
|
+
and ``la``.
|
|
288
|
+
|
|
289
|
+
EXAMPLES::
|
|
290
|
+
|
|
291
|
+
sage: R.<q> = ZZ[]
|
|
292
|
+
sage: H = HallAlgebra(R, q)
|
|
293
|
+
sage: H.product_on_basis(Partition([1,1]), Partition([1]))
|
|
294
|
+
H[2, 1] + (q^2+q+1)*H[1, 1, 1]
|
|
295
|
+
sage: H.product_on_basis(Partition([2,1]), Partition([1,1]))
|
|
296
|
+
H[3, 2] + (q+1)*H[3, 1, 1] + (q^2+q)*H[2, 2, 1] + (q^4+q^3+q^2)*H[2, 1, 1, 1]
|
|
297
|
+
sage: H.product_on_basis(Partition([3,2]), Partition([2,1]))
|
|
298
|
+
H[5, 3] + (q+1)*H[4, 4] + q*H[5, 2, 1] + (2*q^2-1)*H[4, 3, 1]
|
|
299
|
+
+ (q^3+q^2)*H[4, 2, 2] + (q^4+q^3)*H[3, 3, 2]
|
|
300
|
+
+ (q^4-q^2)*H[4, 2, 1, 1] + (q^5+q^4-q^3-q^2)*H[3, 3, 1, 1]
|
|
301
|
+
+ (q^6+q^5)*H[3, 2, 2, 1]
|
|
302
|
+
sage: H.product_on_basis(Partition([3,1,1]), Partition([2,1]))
|
|
303
|
+
H[5, 2, 1] + q*H[4, 3, 1] + (q^2-1)*H[4, 2, 2]
|
|
304
|
+
+ (q^3+q^2)*H[3, 3, 2] + (q^2+q+1)*H[5, 1, 1, 1]
|
|
305
|
+
+ (2*q^3+q^2-q-1)*H[4, 2, 1, 1] + (q^4+2*q^3+q^2)*H[3, 3, 1, 1]
|
|
306
|
+
+ (q^5+q^4)*H[3, 2, 2, 1] + (q^6+q^5+q^4-q^2-q-1)*H[4, 1, 1, 1, 1]
|
|
307
|
+
+ (q^7+q^6+q^5)*H[3, 2, 1, 1, 1]
|
|
308
|
+
"""
|
|
309
|
+
# Check conditions for multiplying by 1
|
|
310
|
+
if len(mu) == 0:
|
|
311
|
+
return self.monomial(la)
|
|
312
|
+
if len(la) == 0:
|
|
313
|
+
return self.monomial(mu)
|
|
314
|
+
|
|
315
|
+
if all(x == 1 for x in la):
|
|
316
|
+
return self.sum_of_terms([(p, hall_polynomial(p, mu, la, self._q))
|
|
317
|
+
for p in Partitions(sum(mu) + len(la))],
|
|
318
|
+
distinct=True)
|
|
319
|
+
|
|
320
|
+
I = HallAlgebraMonomials(self.base_ring(), self._q)
|
|
321
|
+
mu = self.monomial(mu)
|
|
322
|
+
la = self.monomial(la)
|
|
323
|
+
return self(I(mu) * I(la))
|
|
324
|
+
|
|
325
|
+
def coproduct_on_basis(self, la):
|
|
326
|
+
"""
|
|
327
|
+
Return the coproduct of the basis element indexed by ``la``.
|
|
328
|
+
|
|
329
|
+
EXAMPLES::
|
|
330
|
+
|
|
331
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
332
|
+
sage: q = R.gen()
|
|
333
|
+
sage: H = HallAlgebra(R, q)
|
|
334
|
+
sage: H.coproduct_on_basis(Partition([1,1]))
|
|
335
|
+
H[] # H[1, 1] + 1/q*H[1] # H[1] + H[1, 1] # H[]
|
|
336
|
+
sage: H.coproduct_on_basis(Partition([2]))
|
|
337
|
+
H[] # H[2] + ((q-1)/q)*H[1] # H[1] + H[2] # H[]
|
|
338
|
+
sage: H.coproduct_on_basis(Partition([2,1]))
|
|
339
|
+
H[] # H[2, 1] + ((q^2-1)/q^2)*H[1] # H[1, 1] + 1/q*H[1] # H[2]
|
|
340
|
+
+ ((q^2-1)/q^2)*H[1, 1] # H[1] + 1/q*H[2] # H[1] + H[2, 1] # H[]
|
|
341
|
+
|
|
342
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
343
|
+
sage: H = HallAlgebra(R, q)
|
|
344
|
+
sage: H.coproduct_on_basis(Partition([2]))
|
|
345
|
+
H[] # H[2] - (q^-1-1)*H[1] # H[1] + H[2] # H[]
|
|
346
|
+
sage: H.coproduct_on_basis(Partition([2,1]))
|
|
347
|
+
H[] # H[2, 1] - (q^-2-1)*H[1] # H[1, 1] + (q^-1)*H[1] # H[2]
|
|
348
|
+
- (q^-2-1)*H[1, 1] # H[1] + (q^-1)*H[2] # H[1] + H[2, 1] # H[]
|
|
349
|
+
"""
|
|
350
|
+
S = self.tensor_square()
|
|
351
|
+
if all(x == 1 for x in la):
|
|
352
|
+
n = len(la)
|
|
353
|
+
return S.sum_of_terms([((Partition([1]*r), Partition([1]*(n-r))), self._q**(-r*(n-r)))
|
|
354
|
+
for r in range(n+1)], distinct=True)
|
|
355
|
+
|
|
356
|
+
I = HallAlgebraMonomials(self.base_ring(), self._q)
|
|
357
|
+
la = self.monomial(la)
|
|
358
|
+
return S(I(la).coproduct())
|
|
359
|
+
|
|
360
|
+
def antipode_on_basis(self, la):
|
|
361
|
+
"""
|
|
362
|
+
Return the antipode of the basis element indexed by ``la``.
|
|
363
|
+
|
|
364
|
+
EXAMPLES::
|
|
365
|
+
|
|
366
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
367
|
+
sage: q = R.gen()
|
|
368
|
+
sage: H = HallAlgebra(R, q)
|
|
369
|
+
sage: H.antipode_on_basis(Partition([1,1]))
|
|
370
|
+
1/q*H[2] + 1/q*H[1, 1]
|
|
371
|
+
sage: H.antipode_on_basis(Partition([2]))
|
|
372
|
+
-1/q*H[2] + ((q^2-1)/q)*H[1, 1]
|
|
373
|
+
|
|
374
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
375
|
+
sage: H = HallAlgebra(R, q)
|
|
376
|
+
sage: H.antipode_on_basis(Partition([1,1]))
|
|
377
|
+
(q^-1)*H[2] + (q^-1)*H[1, 1]
|
|
378
|
+
sage: H.antipode_on_basis(Partition([2]))
|
|
379
|
+
-(q^-1)*H[2] - (q^-1-q)*H[1, 1]
|
|
380
|
+
"""
|
|
381
|
+
if all(x == 1 for x in la):
|
|
382
|
+
r = len(la)
|
|
383
|
+
q = (-1) ** r * self._q ** (-(r * (r - 1)) // 2)
|
|
384
|
+
return self._from_dict({p: q for p in Partitions(r)})
|
|
385
|
+
|
|
386
|
+
I = HallAlgebraMonomials(self.base_ring(), self._q)
|
|
387
|
+
return self(I(self.monomial(la)).antipode())
|
|
388
|
+
|
|
389
|
+
def counit(self, x):
|
|
390
|
+
"""
|
|
391
|
+
Return the counit of the element ``x``.
|
|
392
|
+
|
|
393
|
+
EXAMPLES::
|
|
394
|
+
|
|
395
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
396
|
+
sage: q = R.gen()
|
|
397
|
+
sage: H = HallAlgebra(R, q)
|
|
398
|
+
sage: H.counit(H.an_element())
|
|
399
|
+
2
|
|
400
|
+
"""
|
|
401
|
+
return x.coefficient(self.one_basis())
|
|
402
|
+
|
|
403
|
+
def monomial_basis(self):
|
|
404
|
+
"""
|
|
405
|
+
Return the basis of the Hall algebra given by monomials in the
|
|
406
|
+
`I_{(1^r)}`.
|
|
407
|
+
|
|
408
|
+
EXAMPLES::
|
|
409
|
+
|
|
410
|
+
sage: R.<q> = ZZ[]
|
|
411
|
+
sage: H = HallAlgebra(R, q)
|
|
412
|
+
sage: H.monomial_basis()
|
|
413
|
+
Hall algebra with q=q over Univariate Polynomial Ring in q over
|
|
414
|
+
Integer Ring in the monomial basis
|
|
415
|
+
"""
|
|
416
|
+
return HallAlgebraMonomials(self.base_ring(), self._q)
|
|
417
|
+
|
|
418
|
+
def __getitem__(self, la):
|
|
419
|
+
"""
|
|
420
|
+
Return the basis element indexed by ``la``.
|
|
421
|
+
|
|
422
|
+
EXAMPLES::
|
|
423
|
+
|
|
424
|
+
sage: R.<q> = ZZ[]
|
|
425
|
+
sage: H = HallAlgebra(R, q)
|
|
426
|
+
sage: H[[]]
|
|
427
|
+
H[]
|
|
428
|
+
sage: H[2]
|
|
429
|
+
H[2]
|
|
430
|
+
sage: H[[2]]
|
|
431
|
+
H[2]
|
|
432
|
+
sage: H[2,1]
|
|
433
|
+
H[2, 1]
|
|
434
|
+
sage: H[Partition([2,1])]
|
|
435
|
+
H[2, 1]
|
|
436
|
+
sage: H[(2,1)]
|
|
437
|
+
H[2, 1]
|
|
438
|
+
"""
|
|
439
|
+
if la in ZZ:
|
|
440
|
+
return self.monomial(Partition([la]))
|
|
441
|
+
return self.monomial(Partition(la))
|
|
442
|
+
|
|
443
|
+
class Element(CombinatorialFreeModule.Element):
|
|
444
|
+
def scalar(self, y):
|
|
445
|
+
r"""
|
|
446
|
+
Return the scalar product of ``self`` and ``y``.
|
|
447
|
+
|
|
448
|
+
The scalar product is given by
|
|
449
|
+
|
|
450
|
+
.. MATH::
|
|
451
|
+
|
|
452
|
+
(I_{\lambda}, I_{\mu}) = \delta_{\lambda,\mu}
|
|
453
|
+
\frac{1}{a_{\lambda}},
|
|
454
|
+
|
|
455
|
+
where `a_{\lambda}` is given by
|
|
456
|
+
|
|
457
|
+
.. MATH::
|
|
458
|
+
|
|
459
|
+
a_{\lambda} = q^{|\lambda| + 2 n(\lambda)} \prod_k
|
|
460
|
+
\prod_{i=1}^{l_k} (1 - q^{-i})
|
|
461
|
+
|
|
462
|
+
where `n(\lambda) = \sum_i (i - 1) \lambda_i` and
|
|
463
|
+
`\lambda = (1^{l_1}, 2^{l_2}, \ldots, m^{l_m})`.
|
|
464
|
+
|
|
465
|
+
Note that `a_{\lambda}` can be interpreted as the number
|
|
466
|
+
of automorphisms of a certain object in a category
|
|
467
|
+
corresponding to `\lambda`. See Lemma 2.8 in [Sch2006]_
|
|
468
|
+
for details.
|
|
469
|
+
|
|
470
|
+
EXAMPLES::
|
|
471
|
+
|
|
472
|
+
sage: R.<q> = ZZ[]
|
|
473
|
+
sage: H = HallAlgebra(R, q)
|
|
474
|
+
sage: H[1].scalar(H[1])
|
|
475
|
+
1/(q - 1)
|
|
476
|
+
sage: H[2].scalar(H[2])
|
|
477
|
+
1/(q^2 - q)
|
|
478
|
+
sage: H[2,1].scalar(H[2,1])
|
|
479
|
+
1/(q^5 - 2*q^4 + q^3)
|
|
480
|
+
sage: H[1,1,1,1].scalar(H[1,1,1,1])
|
|
481
|
+
1/(q^16 - q^15 - q^14 + 2*q^11 - q^8 - q^7 + q^6)
|
|
482
|
+
sage: H.an_element().scalar(H.an_element())
|
|
483
|
+
(4*q^2 + 9)/(q^2 - q)
|
|
484
|
+
"""
|
|
485
|
+
q = self.parent()._q
|
|
486
|
+
f = lambda la: ~(q**(sum(la) + 2*la.weighted_size())
|
|
487
|
+
* prod(prod((1 - q**-i) for i in range(1,k+1))
|
|
488
|
+
for k in la.to_exp()))
|
|
489
|
+
y = self.parent()(y)
|
|
490
|
+
ret = q.parent().zero()
|
|
491
|
+
for mx, cx in self:
|
|
492
|
+
cy = y.coefficient(mx)
|
|
493
|
+
if cy != 0:
|
|
494
|
+
ret += cx * cy * f(mx)
|
|
495
|
+
return ret
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
class HallAlgebraMonomials(CombinatorialFreeModule):
|
|
499
|
+
r"""
|
|
500
|
+
The classical Hall algebra given in terms of monomials in the
|
|
501
|
+
`I_{(1^r)}`.
|
|
502
|
+
|
|
503
|
+
We first associate a monomial `I_{(1^{r_1})} I_{(1^{r_2})} \cdots
|
|
504
|
+
I_{(1^{r_k})}` with the composition `(r_1, r_2, \ldots, r_k)`. However
|
|
505
|
+
since `I_{(1^r)}` commutes with `I_{(1^s)}`, the basis is indexed
|
|
506
|
+
by partitions.
|
|
507
|
+
|
|
508
|
+
EXAMPLES:
|
|
509
|
+
|
|
510
|
+
We use the fraction field of `\ZZ[q]` for our initial example::
|
|
511
|
+
|
|
512
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
513
|
+
sage: q = R.gen()
|
|
514
|
+
sage: H = HallAlgebra(R, q)
|
|
515
|
+
sage: I = H.monomial_basis()
|
|
516
|
+
|
|
517
|
+
We check that the basis conversions are mutually inverse::
|
|
518
|
+
|
|
519
|
+
sage: all(H(I(H[p])) == H[p] for i in range(7) for p in Partitions(i))
|
|
520
|
+
True
|
|
521
|
+
sage: all(I(H(I[p])) == I[p] for i in range(7) for p in Partitions(i))
|
|
522
|
+
True
|
|
523
|
+
|
|
524
|
+
Since Laurent polynomials are sufficient, we run the same check with
|
|
525
|
+
the Laurent polynomial ring `\ZZ[q, q^{-1}]`::
|
|
526
|
+
|
|
527
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
528
|
+
sage: H = HallAlgebra(R, q)
|
|
529
|
+
sage: I = H.monomial_basis()
|
|
530
|
+
sage: all(H(I(H[p])) == H[p] for i in range(6) for p in Partitions(i)) # long time
|
|
531
|
+
True
|
|
532
|
+
sage: all(I(H(I[p])) == I[p] for i in range(6) for p in Partitions(i)) # long time
|
|
533
|
+
True
|
|
534
|
+
|
|
535
|
+
We can also convert to the symmetric functions. The natural basis
|
|
536
|
+
corresponds to the Hall-Littlewood basis (up to a renormalization and
|
|
537
|
+
an inversion of the `q` parameter), and this basis corresponds
|
|
538
|
+
to the elementary basis (up to a renormalization)::
|
|
539
|
+
|
|
540
|
+
sage: Sym = SymmetricFunctions(R)
|
|
541
|
+
sage: e = Sym.e()
|
|
542
|
+
sage: e(I[2,1])
|
|
543
|
+
(q^-1)*e[2, 1]
|
|
544
|
+
sage: e(I[4,2,2,1])
|
|
545
|
+
(q^-8)*e[4, 2, 2, 1]
|
|
546
|
+
sage: HLP = Sym.hall_littlewood(q).P()
|
|
547
|
+
sage: H(I[2,1])
|
|
548
|
+
H[2, 1] + (1+q+q^2)*H[1, 1, 1]
|
|
549
|
+
sage: HLP(e[2,1])
|
|
550
|
+
(1+q+q^2)*HLP[1, 1, 1] + HLP[2, 1]
|
|
551
|
+
sage: all( e(H[lam]) == q**-sum([i * x for i, x in enumerate(lam)])
|
|
552
|
+
....: * e(HLP[lam]).map_coefficients(lambda p: p(q**(-1)))
|
|
553
|
+
....: for lam in Partitions(4) )
|
|
554
|
+
True
|
|
555
|
+
|
|
556
|
+
We can also do computations using a prime power::
|
|
557
|
+
|
|
558
|
+
sage: H = HallAlgebra(ZZ, 3)
|
|
559
|
+
sage: I = H.monomial_basis()
|
|
560
|
+
sage: i_elt = I[2,1]*I[1,1]; i_elt
|
|
561
|
+
I[2, 1, 1, 1]
|
|
562
|
+
sage: H(i_elt)
|
|
563
|
+
H[4, 1] + 7*H[3, 2] + 37*H[3, 1, 1] + 136*H[2, 2, 1]
|
|
564
|
+
+ 1495*H[2, 1, 1, 1] + 62920*H[1, 1, 1, 1, 1]
|
|
565
|
+
"""
|
|
566
|
+
def __init__(self, base_ring, q, prefix='I'):
|
|
567
|
+
"""
|
|
568
|
+
Initialize ``self``.
|
|
569
|
+
|
|
570
|
+
EXAMPLES::
|
|
571
|
+
|
|
572
|
+
sage: R.<q> = ZZ[]
|
|
573
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
574
|
+
sage: TestSuite(I).run()
|
|
575
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
576
|
+
sage: q = R.gen()
|
|
577
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
578
|
+
sage: TestSuite(I).run()
|
|
579
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
580
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
581
|
+
sage: TestSuite(I).run()
|
|
582
|
+
"""
|
|
583
|
+
self._q = q
|
|
584
|
+
try:
|
|
585
|
+
q_inverse = q**-1
|
|
586
|
+
if q_inverse not in base_ring:
|
|
587
|
+
hopf_structure = False
|
|
588
|
+
else:
|
|
589
|
+
hopf_structure = True
|
|
590
|
+
except Exception:
|
|
591
|
+
hopf_structure = False
|
|
592
|
+
if hopf_structure:
|
|
593
|
+
category = HopfAlgebrasWithBasis(base_ring)
|
|
594
|
+
else:
|
|
595
|
+
category = AlgebrasWithBasis(base_ring)
|
|
596
|
+
CombinatorialFreeModule.__init__(self, base_ring, Partitions(),
|
|
597
|
+
prefix=prefix, bracket=False,
|
|
598
|
+
category=category)
|
|
599
|
+
|
|
600
|
+
# Coercions
|
|
601
|
+
if hopf_structure:
|
|
602
|
+
e = SymmetricFunctions(base_ring).e()
|
|
603
|
+
f = lambda la: q ** sum(-((r * (r - 1)) // 2) for r in la)
|
|
604
|
+
M = self.module_morphism(diagonal=f, codomain=e)
|
|
605
|
+
M.register_as_coercion()
|
|
606
|
+
(~M).register_as_coercion()
|
|
607
|
+
|
|
608
|
+
@cached_method
|
|
609
|
+
def _to_natural_on_basis(self, a):
|
|
610
|
+
"""
|
|
611
|
+
Return the basis element indexed by ``a`` converted into
|
|
612
|
+
the partition basis.
|
|
613
|
+
|
|
614
|
+
EXAMPLES::
|
|
615
|
+
|
|
616
|
+
sage: R.<q> = ZZ[]
|
|
617
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
618
|
+
sage: I._to_natural_on_basis(Partition([3]))
|
|
619
|
+
H[1, 1, 1]
|
|
620
|
+
sage: I._to_natural_on_basis(Partition([2,1,1]))
|
|
621
|
+
H[3, 1] + (q+1)*H[2, 2] + (2*q^2+2*q+1)*H[2, 1, 1]
|
|
622
|
+
+ (q^5+2*q^4+3*q^3+3*q^2+2*q+1)*H[1, 1, 1, 1]
|
|
623
|
+
"""
|
|
624
|
+
H = HallAlgebra(self.base_ring(), self._q)
|
|
625
|
+
return reduce(lambda cur,r: cur * H.monomial(Partition([1]*r)), a, H.one())
|
|
626
|
+
|
|
627
|
+
def _repr_(self):
|
|
628
|
+
"""
|
|
629
|
+
Return a string representation of ``self``.
|
|
630
|
+
|
|
631
|
+
EXAMPLES::
|
|
632
|
+
|
|
633
|
+
sage: R.<q> = ZZ[]
|
|
634
|
+
sage: HallAlgebra(R, q).monomial_basis()
|
|
635
|
+
Hall algebra with q=q over Univariate Polynomial Ring in q over
|
|
636
|
+
Integer Ring in the monomial basis
|
|
637
|
+
"""
|
|
638
|
+
return "Hall algebra with q={} over {} in the monomial basis".format(self._q, self.base_ring())
|
|
639
|
+
|
|
640
|
+
def one_basis(self):
|
|
641
|
+
"""
|
|
642
|
+
Return the index of the basis element `1`.
|
|
643
|
+
|
|
644
|
+
EXAMPLES::
|
|
645
|
+
|
|
646
|
+
sage: R.<q> = ZZ[]
|
|
647
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
648
|
+
sage: I.one_basis()
|
|
649
|
+
[]
|
|
650
|
+
"""
|
|
651
|
+
return Partition([])
|
|
652
|
+
|
|
653
|
+
def product_on_basis(self, a, b):
|
|
654
|
+
"""
|
|
655
|
+
Return the product of the two basis elements indexed by ``a``
|
|
656
|
+
and ``b``.
|
|
657
|
+
|
|
658
|
+
EXAMPLES::
|
|
659
|
+
|
|
660
|
+
sage: R.<q> = ZZ[]
|
|
661
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
662
|
+
sage: I.product_on_basis(Partition([4,2,1]), Partition([3,2,1]))
|
|
663
|
+
I[4, 3, 2, 2, 1, 1]
|
|
664
|
+
"""
|
|
665
|
+
return self.monomial(Partition(sorted(list(a) + list(b), reverse=True)))
|
|
666
|
+
|
|
667
|
+
def coproduct_on_basis(self, a):
|
|
668
|
+
"""
|
|
669
|
+
Return the coproduct of the basis element indexed by ``a``.
|
|
670
|
+
|
|
671
|
+
EXAMPLES::
|
|
672
|
+
|
|
673
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
674
|
+
sage: q = R.gen()
|
|
675
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
676
|
+
sage: I.coproduct_on_basis(Partition([1]))
|
|
677
|
+
I[] # I[1] + I[1] # I[]
|
|
678
|
+
sage: I.coproduct_on_basis(Partition([2]))
|
|
679
|
+
I[] # I[2] + 1/q*I[1] # I[1] + I[2] # I[]
|
|
680
|
+
sage: I.coproduct_on_basis(Partition([2,1]))
|
|
681
|
+
I[] # I[2, 1] + 1/q*I[1] # I[1, 1] + I[1] # I[2]
|
|
682
|
+
+ 1/q*I[1, 1] # I[1] + I[2] # I[1] + I[2, 1] # I[]
|
|
683
|
+
|
|
684
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
685
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
686
|
+
sage: I.coproduct_on_basis(Partition([2,1]))
|
|
687
|
+
I[] # I[2, 1] + (q^-1)*I[1] # I[1, 1] + I[1] # I[2]
|
|
688
|
+
+ (q^-1)*I[1, 1] # I[1] + I[2] # I[1] + I[2, 1] # I[]
|
|
689
|
+
"""
|
|
690
|
+
S = self.tensor_square()
|
|
691
|
+
return S.prod(S.sum_of_terms([((Partition([r]), Partition([n-r])), self._q**(-r*(n-r)))
|
|
692
|
+
for r in range(n+1)], distinct=True) for n in a)
|
|
693
|
+
|
|
694
|
+
def antipode_on_basis(self, a):
|
|
695
|
+
"""
|
|
696
|
+
Return the antipode of the basis element indexed by ``a``.
|
|
697
|
+
|
|
698
|
+
EXAMPLES::
|
|
699
|
+
|
|
700
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
701
|
+
sage: q = R.gen()
|
|
702
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
703
|
+
sage: I.antipode_on_basis(Partition([1]))
|
|
704
|
+
-I[1]
|
|
705
|
+
sage: I.antipode_on_basis(Partition([2]))
|
|
706
|
+
1/q*I[1, 1] - I[2]
|
|
707
|
+
sage: I.antipode_on_basis(Partition([2,1]))
|
|
708
|
+
-1/q*I[1, 1, 1] + I[2, 1]
|
|
709
|
+
|
|
710
|
+
sage: R.<q> = LaurentPolynomialRing(ZZ)
|
|
711
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
712
|
+
sage: I.antipode_on_basis(Partition([2,1]))
|
|
713
|
+
-(q^-1)*I[1, 1, 1] + I[2, 1]
|
|
714
|
+
"""
|
|
715
|
+
H = HallAlgebra(self.base_ring(), self._q)
|
|
716
|
+
cur = self.one()
|
|
717
|
+
for r in a:
|
|
718
|
+
q = (-1) ** r * self._q ** (-(r * (r - 1)) // 2)
|
|
719
|
+
cur *= self(H._from_dict({p: q for p in Partitions(r)}))
|
|
720
|
+
return cur
|
|
721
|
+
|
|
722
|
+
def counit(self, x):
|
|
723
|
+
"""
|
|
724
|
+
Return the counit of the element ``x``.
|
|
725
|
+
|
|
726
|
+
EXAMPLES::
|
|
727
|
+
|
|
728
|
+
sage: R = PolynomialRing(ZZ, 'q').fraction_field()
|
|
729
|
+
sage: q = R.gen()
|
|
730
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
731
|
+
sage: I.counit(I.an_element())
|
|
732
|
+
2
|
|
733
|
+
"""
|
|
734
|
+
return x.coefficient(self.one_basis())
|
|
735
|
+
|
|
736
|
+
def __getitem__(self, a):
|
|
737
|
+
"""
|
|
738
|
+
Return the basis element indexed by ``a``.
|
|
739
|
+
|
|
740
|
+
EXAMPLES::
|
|
741
|
+
|
|
742
|
+
sage: R.<q> = ZZ[]
|
|
743
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
744
|
+
sage: I[3,1,1] + 3*I[1,1]
|
|
745
|
+
3*I[1, 1] + I[3, 1, 1]
|
|
746
|
+
sage: I[Partition([3,2,2])]
|
|
747
|
+
I[3, 2, 2]
|
|
748
|
+
sage: I[2]
|
|
749
|
+
I[2]
|
|
750
|
+
sage: I[[2]]
|
|
751
|
+
I[2]
|
|
752
|
+
sage: I[[]]
|
|
753
|
+
I[]
|
|
754
|
+
"""
|
|
755
|
+
if a in ZZ:
|
|
756
|
+
return self.monomial(Partition([a]))
|
|
757
|
+
return self.monomial(Partition(a))
|
|
758
|
+
|
|
759
|
+
class Element(CombinatorialFreeModule.Element):
|
|
760
|
+
def scalar(self, y):
|
|
761
|
+
r"""
|
|
762
|
+
Return the scalar product of ``self`` and ``y``.
|
|
763
|
+
|
|
764
|
+
The scalar product is computed by converting into the
|
|
765
|
+
natural basis.
|
|
766
|
+
|
|
767
|
+
EXAMPLES::
|
|
768
|
+
|
|
769
|
+
sage: R.<q> = ZZ[]
|
|
770
|
+
sage: I = HallAlgebra(R, q).monomial_basis()
|
|
771
|
+
sage: I[1].scalar(I[1])
|
|
772
|
+
1/(q - 1)
|
|
773
|
+
sage: I[2].scalar(I[2])
|
|
774
|
+
1/(q^4 - q^3 - q^2 + q)
|
|
775
|
+
sage: I[2,1].scalar(I[2,1])
|
|
776
|
+
(2*q + 1)/(q^6 - 2*q^5 + 2*q^3 - q^2)
|
|
777
|
+
sage: I[1,1,1,1].scalar(I[1,1,1,1])
|
|
778
|
+
24/(q^4 - 4*q^3 + 6*q^2 - 4*q + 1)
|
|
779
|
+
sage: I.an_element().scalar(I.an_element())
|
|
780
|
+
(4*q^4 - 4*q^2 + 9)/(q^4 - q^3 - q^2 + q)
|
|
781
|
+
"""
|
|
782
|
+
H = HallAlgebra(self.parent().base_ring(), self.parent()._q)
|
|
783
|
+
return H(self).scalar(H(y))
|