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,1018 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.groups sage.modules
|
|
3
|
+
"""
|
|
4
|
+
Yokonuma-Hecke Algebras
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2015-11): initial version
|
|
9
|
+
- Travis Scrimshaw (2025-03): general type version
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# ****************************************************************************
|
|
13
|
+
# Copyright (C) 2015-2025 Travis Scrimshaw <tcscrims at gmail.com>
|
|
14
|
+
#
|
|
15
|
+
# This program is free software: you can redistribute it and/or modify
|
|
16
|
+
# it under the terms of the GNU General Public License as published by
|
|
17
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
18
|
+
# (at your option) any later version.
|
|
19
|
+
# https://www.gnu.org/licenses/
|
|
20
|
+
# ****************************************************************************
|
|
21
|
+
|
|
22
|
+
from sage.misc.cachefunc import cached_method
|
|
23
|
+
from sage.rings.integer_ring import ZZ
|
|
24
|
+
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
|
|
25
|
+
from sage.rings.rational_field import QQ
|
|
26
|
+
from sage.categories.algebras import Algebras
|
|
27
|
+
from sage.categories.rings import Rings
|
|
28
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
29
|
+
from sage.combinat.permutation import Permutations
|
|
30
|
+
from sage.sets.family import Family
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class YokonumaHeckeAlgebra(CombinatorialFreeModule):
|
|
34
|
+
r"""
|
|
35
|
+
Abstract base class for Yokonuma-Hecke algebras that
|
|
36
|
+
implements common features.
|
|
37
|
+
|
|
38
|
+
.. TODO::
|
|
39
|
+
|
|
40
|
+
Factor out the near-common features.
|
|
41
|
+
"""
|
|
42
|
+
@staticmethod
|
|
43
|
+
def __classcall_private__(cls, d, n, q=None, R=None):
|
|
44
|
+
r"""
|
|
45
|
+
Standardize input to ensure a unique representation and dispatch
|
|
46
|
+
to the correct implementation.
|
|
47
|
+
|
|
48
|
+
TESTS::
|
|
49
|
+
|
|
50
|
+
sage: Y1 = algebras.YokonumaHecke(5, 3)
|
|
51
|
+
sage: q = LaurentPolynomialRing(QQ, 'q').gen()
|
|
52
|
+
sage: Y2 = algebras.YokonumaHecke(5, 3, q)
|
|
53
|
+
sage: Y3 = algebras.YokonumaHecke(5, 3, q, q.parent())
|
|
54
|
+
sage: Y1 is Y2 and Y2 is Y3
|
|
55
|
+
True
|
|
56
|
+
"""
|
|
57
|
+
if q is None:
|
|
58
|
+
q = LaurentPolynomialRing(QQ, 'q').gen()
|
|
59
|
+
if R is None:
|
|
60
|
+
R = q.parent()
|
|
61
|
+
q = R(q)
|
|
62
|
+
if R not in Rings().Commutative():
|
|
63
|
+
raise TypeError("base ring must be a commutative ring")
|
|
64
|
+
if n not in ZZ:
|
|
65
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
|
66
|
+
n = CartanType(n)
|
|
67
|
+
return YokonumaHeckeAlgebraWeyl(d, n, q, R)
|
|
68
|
+
return YokonumaHeckeAlgebraGL(d, n, q, R)
|
|
69
|
+
|
|
70
|
+
def __init__(self, d, W, q, R, indices, category=None):
|
|
71
|
+
"""
|
|
72
|
+
Initialize ``self``.
|
|
73
|
+
|
|
74
|
+
EXAMPLES::
|
|
75
|
+
|
|
76
|
+
sage: Y = algebras.YokonumaHecke(5, 3)
|
|
77
|
+
sage: elts = Y.some_elements() + list(Y.algebra_generators())
|
|
78
|
+
sage: TestSuite(Y).run(elements=elts)
|
|
79
|
+
"""
|
|
80
|
+
self._d = d
|
|
81
|
+
self._W = W
|
|
82
|
+
self._cartan_type = W.cartan_type()
|
|
83
|
+
self._q = q
|
|
84
|
+
cat = Algebras(R).WithBasis().or_subcategory(category)
|
|
85
|
+
CombinatorialFreeModule.__init__(self, R, indices, prefix='Y',
|
|
86
|
+
category=cat)
|
|
87
|
+
self._assign_names(self.algebra_generators().keys())
|
|
88
|
+
|
|
89
|
+
def cartan_type(self):
|
|
90
|
+
r"""
|
|
91
|
+
Return the Cartan type of ``self``.
|
|
92
|
+
|
|
93
|
+
EXAMPLES::
|
|
94
|
+
|
|
95
|
+
sage: Y = algebras.YokonumaHecke(4, ['F',4])
|
|
96
|
+
sage: Y.cartan_type()
|
|
97
|
+
['F', 4]
|
|
98
|
+
"""
|
|
99
|
+
return self._cartan_type
|
|
100
|
+
|
|
101
|
+
def index_set(self):
|
|
102
|
+
r"""
|
|
103
|
+
Return the index set of ``self``, which is the index set of
|
|
104
|
+
the Cartan type of ``self``.
|
|
105
|
+
|
|
106
|
+
EXAMPLES::
|
|
107
|
+
|
|
108
|
+
sage: Y = algebras.YokonumaHecke(4, ['F',4])
|
|
109
|
+
sage: Y.index_set() == Y.cartan_type().index_set()
|
|
110
|
+
True
|
|
111
|
+
"""
|
|
112
|
+
return self._cartan_type.index_set()
|
|
113
|
+
|
|
114
|
+
def q(self):
|
|
115
|
+
r"""
|
|
116
|
+
Return the parameter `q` of ``self``.
|
|
117
|
+
|
|
118
|
+
EXAMPLES::
|
|
119
|
+
|
|
120
|
+
sage: Y = algebras.YokonumaHecke(4, ['F',4])
|
|
121
|
+
sage: Y.q()
|
|
122
|
+
q
|
|
123
|
+
sage: Y.q().parent() is Y.base_ring()
|
|
124
|
+
True
|
|
125
|
+
"""
|
|
126
|
+
return self._q
|
|
127
|
+
|
|
128
|
+
def g(self, i=None):
|
|
129
|
+
"""
|
|
130
|
+
Return the generator(s) `g_i`.
|
|
131
|
+
|
|
132
|
+
INPUT:
|
|
133
|
+
|
|
134
|
+
- ``i`` -- (default: ``None``) the generator `g_i` or if ``None``,
|
|
135
|
+
then the family of all generators `g_i`
|
|
136
|
+
|
|
137
|
+
EXAMPLES::
|
|
138
|
+
|
|
139
|
+
sage: Y = algebras.YokonumaHecke(8, 3)
|
|
140
|
+
sage: Y.g(1)
|
|
141
|
+
g[1]
|
|
142
|
+
sage: list(Y.g())
|
|
143
|
+
[g[1], g[2]]
|
|
144
|
+
|
|
145
|
+
sage: Y = algebras.YokonumaHecke(8, ['G',2])
|
|
146
|
+
sage: Y.g(1)
|
|
147
|
+
g[1]
|
|
148
|
+
sage: Y.g()
|
|
149
|
+
Finite family {1: g[1], 2: g[2]}
|
|
150
|
+
"""
|
|
151
|
+
G = self.algebra_generators()
|
|
152
|
+
if i is None:
|
|
153
|
+
I = self._W.index_set()
|
|
154
|
+
d = {i: G['g%s' % i] for i in I}
|
|
155
|
+
return Family(I, d.__getitem__)
|
|
156
|
+
return G['g%s' % i]
|
|
157
|
+
|
|
158
|
+
@cached_method
|
|
159
|
+
def gens(self) -> tuple:
|
|
160
|
+
"""
|
|
161
|
+
Return the generators of ``self``.
|
|
162
|
+
|
|
163
|
+
EXAMPLES::
|
|
164
|
+
|
|
165
|
+
sage: Y = algebras.YokonumaHecke(5, 3)
|
|
166
|
+
sage: Y.gens()
|
|
167
|
+
(g[1], g[2], t1, t2, t3)
|
|
168
|
+
|
|
169
|
+
sage: Y = algebras.YokonumaHecke(5, ['B',2])
|
|
170
|
+
sage: Y.gens()
|
|
171
|
+
(g[1], g[2], h1, h2)
|
|
172
|
+
"""
|
|
173
|
+
return tuple(self.algebra_generators())
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class YokonumaHeckeAlgebraGL(YokonumaHeckeAlgebra):
|
|
177
|
+
r"""
|
|
178
|
+
The Yokonuma-Hecke algebra `Y_{d,n}(q)` for `GL_n(\GF{d})`.
|
|
179
|
+
|
|
180
|
+
Let `R` be a commutative ring and `q` be a unit in `R`. The
|
|
181
|
+
*Yokonuma-Hecke algebra* `Y_{d,n}(q)` is the associative, unital
|
|
182
|
+
`R`-algebra generated by `t_1, t_2, \ldots, t_n, g_1, g_2, \ldots,
|
|
183
|
+
g_{n-1}` and subject to the relations:
|
|
184
|
+
|
|
185
|
+
- `g_i g_j = g_j g_i` for all `|i - j| > 1`,
|
|
186
|
+
- `g_i g_{i+1} g_i = g_{i+1} g_i g_{i+1}`,
|
|
187
|
+
- `t_i t_j = t_j t_i`,
|
|
188
|
+
- `t_j g_i = g_i t_{j s_i}`, and
|
|
189
|
+
- `t_j^d = 1`,
|
|
190
|
+
|
|
191
|
+
where `s_i` is the simple transposition `(i, i+1)`, along with
|
|
192
|
+
the quadratic relation
|
|
193
|
+
|
|
194
|
+
.. MATH::
|
|
195
|
+
|
|
196
|
+
g_i^2 = 1 + \frac{(q - q^{-1})}{d} \left( \sum_{s=0}^{d-1}
|
|
197
|
+
t_i^s t_{i+1}^{-s} \right) g_i.
|
|
198
|
+
|
|
199
|
+
Thus the Yokonuma-Hecke algebra can be considered a quotient of
|
|
200
|
+
the framed braid group `(\ZZ / d\ZZ) \wr B_n`, where `B_n` is the
|
|
201
|
+
classical braid group on `n` strands, by the quadratic relations.
|
|
202
|
+
Moreover, all of the algebra generators are invertible. In
|
|
203
|
+
particular, we have
|
|
204
|
+
|
|
205
|
+
.. MATH::
|
|
206
|
+
|
|
207
|
+
g_i^{-1} = g_i - (q - q^{-1}) e_i.
|
|
208
|
+
|
|
209
|
+
When we specialize `q = \pm 1`, we obtain the group algebra of
|
|
210
|
+
the complex reflection group `G(d, 1, n) = (\ZZ / d\ZZ) \wr S_n`.
|
|
211
|
+
Moreover for `d = 1`, the Yokonuma-Hecke algebra is equal to the
|
|
212
|
+
:class:`Iwahori-Hecke <IwahoriHeckeAlgebra>` of type `A_{n-1}`.
|
|
213
|
+
|
|
214
|
+
This was considered for more general Chevalley groups (Lie groups
|
|
215
|
+
over finite fields); see :class:`YokonumaHeckeAlgebraWeyl`.
|
|
216
|
+
|
|
217
|
+
INPUT:
|
|
218
|
+
|
|
219
|
+
- ``d`` -- the maximum power of `t`
|
|
220
|
+
- ``n`` -- the number of generators or a Cartan type
|
|
221
|
+
- ``q`` -- (optional) an invertible element in a commutative ring;
|
|
222
|
+
the default is `q \in \QQ[q,q^{-1}]`
|
|
223
|
+
- ``R`` -- (optional) a commutative ring containing ``q``; the
|
|
224
|
+
default is the parent of `q`
|
|
225
|
+
|
|
226
|
+
EXAMPLES:
|
|
227
|
+
|
|
228
|
+
We construct `Y_{4,3}` and do some computations::
|
|
229
|
+
|
|
230
|
+
sage: Y = algebras.YokonumaHecke(4, 3)
|
|
231
|
+
sage: g1, g2, t1, t2, t3 = Y.algebra_generators()
|
|
232
|
+
sage: g1 * g2
|
|
233
|
+
g[1,2]
|
|
234
|
+
sage: t1 * g1
|
|
235
|
+
t1*g[1]
|
|
236
|
+
sage: g2 * t2
|
|
237
|
+
t3*g[2]
|
|
238
|
+
sage: g2 * t3
|
|
239
|
+
t2*g[2]
|
|
240
|
+
sage: (g2 + t1) * (g1 + t2*t3)
|
|
241
|
+
g[2,1] + t2*t3*g[2] + t1*g[1] + t1*t2*t3
|
|
242
|
+
sage: g1 * g1
|
|
243
|
+
1 - (1/4*q^-1-1/4*q)*g[1] - (1/4*q^-1-1/4*q)*t1*t2^3*g[1]
|
|
244
|
+
- (1/4*q^-1-1/4*q)*t1^2*t2^2*g[1] - (1/4*q^-1-1/4*q)*t1^3*t2*g[1]
|
|
245
|
+
sage: g2 * g1 * t1
|
|
246
|
+
t3*g[2,1]
|
|
247
|
+
|
|
248
|
+
We construct the elements `e_i` and show that they are idempotents::
|
|
249
|
+
|
|
250
|
+
sage: e1 = Y.e(1); e1
|
|
251
|
+
1/4 + 1/4*t1*t2^3 + 1/4*t1^2*t2^2 + 1/4*t1^3*t2
|
|
252
|
+
sage: e1 * e1 == e1
|
|
253
|
+
True
|
|
254
|
+
sage: e2 = Y.e(2); e2
|
|
255
|
+
1/4 + 1/4*t2*t3^3 + 1/4*t2^2*t3^2 + 1/4*t2^3*t3
|
|
256
|
+
sage: e2 * e2 == e2
|
|
257
|
+
True
|
|
258
|
+
|
|
259
|
+
REFERENCES:
|
|
260
|
+
|
|
261
|
+
- [CL2013]_
|
|
262
|
+
- [CPdA2014]_
|
|
263
|
+
- [ERH2015]_
|
|
264
|
+
- [JPdA15]_
|
|
265
|
+
"""
|
|
266
|
+
def __init__(self, d, n, q, R):
|
|
267
|
+
"""
|
|
268
|
+
Initialize ``self``.
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: Y = algebras.YokonumaHecke(5, 3)
|
|
273
|
+
sage: elts = Y.some_elements() + list(Y.algebra_generators())
|
|
274
|
+
sage: TestSuite(Y).run(elements=elts)
|
|
275
|
+
"""
|
|
276
|
+
self._n = n
|
|
277
|
+
W = Permutations(n)
|
|
278
|
+
import itertools
|
|
279
|
+
C = itertools.product(*([range(d)]*n))
|
|
280
|
+
indices = list(itertools.product(C, W))
|
|
281
|
+
YokonumaHeckeAlgebra.__init__(self, d, W, q, R, indices)
|
|
282
|
+
|
|
283
|
+
def _repr_(self):
|
|
284
|
+
"""
|
|
285
|
+
Return a string representation of ``self``.
|
|
286
|
+
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: algebras.YokonumaHecke(5, 2)
|
|
290
|
+
Yokonuma-Hecke algebra of rank 5 and order 2 with q=q
|
|
291
|
+
over Univariate Laurent Polynomial Ring in q over Rational Field
|
|
292
|
+
"""
|
|
293
|
+
return "Yokonuma-Hecke algebra of rank {} and order {} with q={} over {}".format(
|
|
294
|
+
self._d, self._n, self._q, self.base_ring())
|
|
295
|
+
|
|
296
|
+
def _latex_(self):
|
|
297
|
+
r"""
|
|
298
|
+
Return a latex representation of ``self``.
|
|
299
|
+
|
|
300
|
+
EXAMPLES::
|
|
301
|
+
|
|
302
|
+
sage: Y = algebras.YokonumaHecke(5, 2)
|
|
303
|
+
sage: latex(Y)
|
|
304
|
+
\mathcal{Y}_{5,2}(q)
|
|
305
|
+
"""
|
|
306
|
+
return "\\mathcal{Y}_{%s,%s}(%s)" % (self._d, self._n, self._q)
|
|
307
|
+
|
|
308
|
+
def _repr_term(self, m):
|
|
309
|
+
"""
|
|
310
|
+
Return a string representation of the basis element indexed by ``m``.
|
|
311
|
+
|
|
312
|
+
EXAMPLES::
|
|
313
|
+
|
|
314
|
+
sage: Y = algebras.YokonumaHecke(4, 3)
|
|
315
|
+
sage: Y._repr_term( ((1, 0, 2), Permutation([3,2,1])) )
|
|
316
|
+
't1*t3^2*g[2,1,2]'
|
|
317
|
+
"""
|
|
318
|
+
def gen_str(e):
|
|
319
|
+
return '' if e == 1 else '^%s' % e
|
|
320
|
+
lhs = '*'.join('t%s' % (j+1) + gen_str(i) for j,i in enumerate(m[0]) if i > 0)
|
|
321
|
+
redword = m[1].reduced_word()
|
|
322
|
+
if not redword:
|
|
323
|
+
if not lhs:
|
|
324
|
+
return '1'
|
|
325
|
+
return lhs
|
|
326
|
+
rhs = 'g[{}]'.format(','.join(str(i) for i in redword))
|
|
327
|
+
if not lhs:
|
|
328
|
+
return rhs
|
|
329
|
+
return lhs + '*' + rhs
|
|
330
|
+
|
|
331
|
+
def _latex_term(self, m):
|
|
332
|
+
r"""
|
|
333
|
+
Return a latex representation for the basis element indexed by ``m``.
|
|
334
|
+
|
|
335
|
+
EXAMPLES::
|
|
336
|
+
|
|
337
|
+
sage: Y = algebras.YokonumaHecke(4, 3)
|
|
338
|
+
sage: Y._latex_term( ((1, 0, 2), Permutation([3,2,1])) )
|
|
339
|
+
't_{1} t_{3}^{2} g_{2} g_{1} g_{2}'
|
|
340
|
+
"""
|
|
341
|
+
def gen_str(e):
|
|
342
|
+
return '' if e == 1 else '^{%s}' % e
|
|
343
|
+
lhs = ' '.join('t_{%s}' % (j+1) + gen_str(i) for j,i in enumerate(m[0]) if i > 0)
|
|
344
|
+
redword = m[1].reduced_word()
|
|
345
|
+
if not redword:
|
|
346
|
+
if not lhs:
|
|
347
|
+
return '1'
|
|
348
|
+
return lhs
|
|
349
|
+
return lhs + ' ' + ' '.join("g_{%d}" % i for i in redword)
|
|
350
|
+
|
|
351
|
+
@cached_method
|
|
352
|
+
def algebra_generators(self):
|
|
353
|
+
"""
|
|
354
|
+
Return the algebra generators of ``self``.
|
|
355
|
+
|
|
356
|
+
EXAMPLES::
|
|
357
|
+
|
|
358
|
+
sage: Y = algebras.YokonumaHecke(5, 3)
|
|
359
|
+
sage: dict(Y.algebra_generators())
|
|
360
|
+
{'g1': g[1], 'g2': g[2], 't1': t1, 't2': t2, 't3': t3}
|
|
361
|
+
"""
|
|
362
|
+
one = self._W.one()
|
|
363
|
+
zero = [0] * self._n
|
|
364
|
+
d = {}
|
|
365
|
+
for i in range(self._n):
|
|
366
|
+
r = list(zero) # Make a copy
|
|
367
|
+
r[i] = 1
|
|
368
|
+
d['t%s' % (i+1)] = self.monomial((tuple(r), one))
|
|
369
|
+
G = self._W.group_generators()
|
|
370
|
+
for i in range(1, self._n):
|
|
371
|
+
d['g%s' % i] = self.monomial((tuple(zero), G[i]))
|
|
372
|
+
return Family(sorted(d), lambda i: d[i])
|
|
373
|
+
|
|
374
|
+
@cached_method
|
|
375
|
+
def one_basis(self):
|
|
376
|
+
"""
|
|
377
|
+
Return the index of the basis element of `1`.
|
|
378
|
+
|
|
379
|
+
EXAMPLES::
|
|
380
|
+
|
|
381
|
+
sage: Y = algebras.YokonumaHecke(5, 3)
|
|
382
|
+
sage: Y.one_basis()
|
|
383
|
+
((0, 0, 0), [1, 2, 3])
|
|
384
|
+
"""
|
|
385
|
+
one = self._W.one()
|
|
386
|
+
zero = (0,) * self._n
|
|
387
|
+
return (zero, one)
|
|
388
|
+
|
|
389
|
+
@cached_method
|
|
390
|
+
def e(self, i):
|
|
391
|
+
"""
|
|
392
|
+
Return the element `e_i`.
|
|
393
|
+
|
|
394
|
+
EXAMPLES::
|
|
395
|
+
|
|
396
|
+
sage: Y = algebras.YokonumaHecke(4, 3)
|
|
397
|
+
sage: Y.e(1)
|
|
398
|
+
1/4 + 1/4*t1*t2^3 + 1/4*t1^2*t2^2 + 1/4*t1^3*t2
|
|
399
|
+
sage: Y.e(2)
|
|
400
|
+
1/4 + 1/4*t2*t3^3 + 1/4*t2^2*t3^2 + 1/4*t2^3*t3
|
|
401
|
+
"""
|
|
402
|
+
if i < 1 or i >= self._n:
|
|
403
|
+
raise ValueError("invalid index")
|
|
404
|
+
c = ~self.base_ring()(self._d)
|
|
405
|
+
zero = [0]*self._n
|
|
406
|
+
one = self._W.one()
|
|
407
|
+
d = {}
|
|
408
|
+
for s in range(self._d):
|
|
409
|
+
r = list(zero) # Make a copy
|
|
410
|
+
r[i-1] = s
|
|
411
|
+
if s != 0:
|
|
412
|
+
r[i] = self._d - s
|
|
413
|
+
d[(tuple(r), one)] = c
|
|
414
|
+
return self._from_dict(d, remove_zeros=False)
|
|
415
|
+
|
|
416
|
+
def t(self, i=None):
|
|
417
|
+
"""
|
|
418
|
+
Return the generator(s) `t_i`.
|
|
419
|
+
|
|
420
|
+
INPUT:
|
|
421
|
+
|
|
422
|
+
- ``i`` -- (default: ``None``) the generator `t_i` or if ``None``,
|
|
423
|
+
then the family of all generators `t_i`
|
|
424
|
+
|
|
425
|
+
EXAMPLES::
|
|
426
|
+
|
|
427
|
+
sage: Y = algebras.YokonumaHecke(8, 3)
|
|
428
|
+
sage: Y.t(2)
|
|
429
|
+
t2
|
|
430
|
+
sage: list(Y.t())
|
|
431
|
+
[t1, t2, t3]
|
|
432
|
+
"""
|
|
433
|
+
G = self.algebra_generators()
|
|
434
|
+
if i is None:
|
|
435
|
+
I = tuple(range(1, self._n+1))
|
|
436
|
+
d = {i: G['t%s' % i] for i in I}
|
|
437
|
+
return Family(I, d.__getitem__)
|
|
438
|
+
return G['t%s' % i]
|
|
439
|
+
|
|
440
|
+
def product_on_basis(self, m1, m2):
|
|
441
|
+
"""
|
|
442
|
+
Return the product of the basis elements indexed by ``m1`` and ``m2``.
|
|
443
|
+
|
|
444
|
+
EXAMPLES::
|
|
445
|
+
|
|
446
|
+
sage: Y = algebras.YokonumaHecke(4, 3)
|
|
447
|
+
sage: m = ((1, 0, 2), Permutations(3)([2,1,3]))
|
|
448
|
+
sage: 4 * Y.product_on_basis(m, m)
|
|
449
|
+
-(q^-1-q)*t2^2*g[1] + 4*t1*t2 - (q^-1-q)*t1*t2*g[1]
|
|
450
|
+
- (q^-1-q)*t1^2*g[1] - (q^-1-q)*t1^3*t2^3*g[1]
|
|
451
|
+
|
|
452
|
+
Check that we apply the permutation correctly on `t_i`::
|
|
453
|
+
|
|
454
|
+
sage: Y = algebras.YokonumaHecke(4, 3)
|
|
455
|
+
sage: g1, g2, t1, t2, t3 = Y.algebra_generators()
|
|
456
|
+
sage: g21 = g2 * g1
|
|
457
|
+
sage: g21 * t1
|
|
458
|
+
t3*g[2,1]
|
|
459
|
+
"""
|
|
460
|
+
t1,g1 = m1
|
|
461
|
+
t2,g2 = m2
|
|
462
|
+
# Commute g1 and t2, then multiply t1 and t2
|
|
463
|
+
# ig1 = g1
|
|
464
|
+
t = [(t1[i] + t2[g1.index(i+1)]) % self._d for i in range(self._n)]
|
|
465
|
+
one = self._W.one()
|
|
466
|
+
if g1 == one:
|
|
467
|
+
return self.monomial((tuple(t), g2))
|
|
468
|
+
ret = self.monomial((tuple(t), g1))
|
|
469
|
+
# We have to reverse the reduced word due to Sage's convention
|
|
470
|
+
# for permutation multiplication
|
|
471
|
+
for i in g2.reduced_word():
|
|
472
|
+
ret = self.linear_combination((self._product_by_basis_gen(m, i), c)
|
|
473
|
+
for m,c in ret)
|
|
474
|
+
return ret
|
|
475
|
+
|
|
476
|
+
def _product_by_basis_gen(self, m, i):
|
|
477
|
+
r"""
|
|
478
|
+
Return the product `t g_w g_i`.
|
|
479
|
+
|
|
480
|
+
If the quadratic relation is `g_i^2 = 1 + (q - q^{-1}) e_i g_i`,
|
|
481
|
+
then we have
|
|
482
|
+
|
|
483
|
+
.. MATH::
|
|
484
|
+
|
|
485
|
+
g_w g_i = \begin{cases}
|
|
486
|
+
g_{ws_i} & \text{if } \ell(ws_i) = \ell(w) + 1, \\
|
|
487
|
+
g_{ws_i} + (q - q^{-1}) g_w e_i & \text{if }
|
|
488
|
+
\ell(w s_i) = \ell(w) - 1.
|
|
489
|
+
\end{cases}
|
|
490
|
+
|
|
491
|
+
INPUT:
|
|
492
|
+
|
|
493
|
+
- ``m`` -- a pair ``[t, w]``, where ``t`` encodes the monomial
|
|
494
|
+
and ``w`` is an element of the permutation group
|
|
495
|
+
- ``i`` -- an element of the index set
|
|
496
|
+
|
|
497
|
+
EXAMPLES::
|
|
498
|
+
|
|
499
|
+
sage: Y = algebras.YokonumaHecke(4, 3)
|
|
500
|
+
sage: m = ((1, 0, 2), Permutations(3)([2,1,3]))
|
|
501
|
+
sage: 4 * Y._product_by_basis_gen(m, 1)
|
|
502
|
+
-(q^-1-q)*t2*t3^2*g[1] + 4*t1*t3^2 - (q^-1-q)*t1*t3^2*g[1]
|
|
503
|
+
- (q^-1-q)*t1^2*t2^3*t3^2*g[1] - (q^-1-q)*t1^3*t2^2*t3^2*g[1]
|
|
504
|
+
"""
|
|
505
|
+
t, w = m
|
|
506
|
+
wi = w.apply_simple_reflection(i, side='right')
|
|
507
|
+
if not w.has_descent(i, side='right'):
|
|
508
|
+
return self.monomial((t, wi))
|
|
509
|
+
|
|
510
|
+
R = self.base_ring()
|
|
511
|
+
c = (self._q - ~self._q) * ~R(self._d)
|
|
512
|
+
d = {(t, wi): R.one()}
|
|
513
|
+
# We commute g_w and e_i and then multiply by t
|
|
514
|
+
for s in range(self._d):
|
|
515
|
+
r = list(t)
|
|
516
|
+
r[w[i-1]-1] = (r[w[i-1]-1] + s) % self._d
|
|
517
|
+
if s != 0:
|
|
518
|
+
r[w[i]-1] = (r[w[i]-1] + self._d - s) % self._d
|
|
519
|
+
d[(tuple(r), w)] = c
|
|
520
|
+
return self._from_dict(d, remove_zeros=False)
|
|
521
|
+
|
|
522
|
+
@cached_method
|
|
523
|
+
def inverse_g(self, i):
|
|
524
|
+
r"""
|
|
525
|
+
Return the inverse of the generator `g_i`.
|
|
526
|
+
|
|
527
|
+
From the quadratic relation, we have
|
|
528
|
+
|
|
529
|
+
.. MATH::
|
|
530
|
+
|
|
531
|
+
g_i^{-1} = g_i - (q - q^{-1}) e_i.
|
|
532
|
+
|
|
533
|
+
INPUT:
|
|
534
|
+
|
|
535
|
+
- ``i`` -- (default: ``None``) the inverse generator `g_i^{-1}` or
|
|
536
|
+
if ``None``, then the family of all inverse generators `g_i^{-1}`
|
|
537
|
+
|
|
538
|
+
EXAMPLES::
|
|
539
|
+
|
|
540
|
+
sage: Y = algebras.YokonumaHecke(2, 4)
|
|
541
|
+
sage: [2*Y.inverse_g(i) for i in range(1, 4)]
|
|
542
|
+
[(q^-1-q) + 2*g[1] + (q^-1-q)*t1*t2,
|
|
543
|
+
(q^-1-q) + 2*g[2] + (q^-1-q)*t2*t3,
|
|
544
|
+
(q^-1-q) + 2*g[3] + (q^-1-q)*t3*t4]
|
|
545
|
+
sage: all(Y.inverse_g(i) * Y.g(i) == Y.one() for i in range(1, 4))
|
|
546
|
+
True
|
|
547
|
+
sage: all(Y.g(i) * Y.inverse_g(i) == Y.one() for i in range(1, 4))
|
|
548
|
+
True
|
|
549
|
+
"""
|
|
550
|
+
if i is None:
|
|
551
|
+
I = self._W.index_set()
|
|
552
|
+
d = {i: self.inverse_g(i) for i in I}
|
|
553
|
+
return Family(I, d.__getitem__)
|
|
554
|
+
if i < 1 or i >= self._n:
|
|
555
|
+
raise ValueError("invalid index")
|
|
556
|
+
return self.g(i) + (~self._q - self._q) * self.e(i)
|
|
557
|
+
|
|
558
|
+
class Element(CombinatorialFreeModule.Element):
|
|
559
|
+
def __invert__(self):
|
|
560
|
+
r"""
|
|
561
|
+
Return the inverse if ``self`` is a basis element.
|
|
562
|
+
|
|
563
|
+
EXAMPLES::
|
|
564
|
+
|
|
565
|
+
sage: Y = algebras.YokonumaHecke(3, 3)
|
|
566
|
+
sage: t = prod(Y.t()); t
|
|
567
|
+
t1*t2*t3
|
|
568
|
+
sage: t.inverse() # indirect doctest
|
|
569
|
+
t1^2*t2^2*t3^2
|
|
570
|
+
sage: [3*~(t*g) for g in Y.g()]
|
|
571
|
+
[(q^-1-q)*t2*t3^2 + (q^-1-q)*t1*t3^2
|
|
572
|
+
+ (q^-1-q)*t1^2*t2^2*t3^2 + 3*t1^2*t2^2*t3^2*g[1],
|
|
573
|
+
(q^-1-q)*t1^2*t3 + (q^-1-q)*t1^2*t2
|
|
574
|
+
+ (q^-1-q)*t1^2*t2^2*t3^2 + 3*t1^2*t2^2*t3^2*g[2]]
|
|
575
|
+
sage: g = prod(Y.g())
|
|
576
|
+
sage: ~g * g == Y.one()
|
|
577
|
+
True
|
|
578
|
+
sage: g * ~g == Y.one()
|
|
579
|
+
True
|
|
580
|
+
|
|
581
|
+
sage: tp = t * Y.t(2)
|
|
582
|
+
sage: all(tp*g * ~(tp*g) == Y.one() for g in Y.g())
|
|
583
|
+
True
|
|
584
|
+
|
|
585
|
+
TESTS:
|
|
586
|
+
|
|
587
|
+
Check that :issue:`26424` is fixed::
|
|
588
|
+
|
|
589
|
+
sage: Y = algebras.YokonumaHecke(3, 3)
|
|
590
|
+
sage: t = 3 * prod(Y.t())
|
|
591
|
+
sage: ~t
|
|
592
|
+
1/3*t1^2*t2^2*t3^2
|
|
593
|
+
|
|
594
|
+
sage: ~Y.zero()
|
|
595
|
+
Traceback (most recent call last):
|
|
596
|
+
...
|
|
597
|
+
ZeroDivisionError
|
|
598
|
+
"""
|
|
599
|
+
if not self:
|
|
600
|
+
raise ZeroDivisionError
|
|
601
|
+
if len(self) != 1:
|
|
602
|
+
raise NotImplementedError("inverse only implemented for basis elements (monomials in the generators)" % self)
|
|
603
|
+
H = self.parent()
|
|
604
|
+
t, w = self.support_of_term()
|
|
605
|
+
c = ~self.coefficients()[0]
|
|
606
|
+
telt = H.monomial((tuple((H._d - e) % H._d for e in t), H._W.one()))
|
|
607
|
+
return c * H.prod(H.inverse_g(i) for i in reversed(w.reduced_word())) * telt
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
class YokonumaHeckeAlgebraWeyl(YokonumaHeckeAlgebra):
|
|
611
|
+
r"""
|
|
612
|
+
The Yokonuma-Hecke algebra associated to a Cartan type.
|
|
613
|
+
|
|
614
|
+
Let `R` be a commutative ring and `q` be a unit in `R`. Let
|
|
615
|
+
`W` be the Weyl group acting on a root lattice `Q`. The
|
|
616
|
+
*Yokonuma-Hecke algebra* `Y_{d,W}(q)` is the associative, unital
|
|
617
|
+
`R`-algebra generated by `\{h_i, g_i \mid i \in I\}`, where `I` is
|
|
618
|
+
the index set of simple roots of `Q`, and subject to the relations:
|
|
619
|
+
|
|
620
|
+
- `g_i` and `g_j` satisfy the braid relations of the corresponding
|
|
621
|
+
simple reflections `s_i` and `s_j` in `W`,
|
|
622
|
+
- `h_i h_j = h_j h_i`,
|
|
623
|
+
- `h_j g_i = g_i (s_i \cdot h_j)` with considering `h_j` as the simple
|
|
624
|
+
root `\alpha_j \in Q`, and
|
|
625
|
+
- `h_j^d = 1`,
|
|
626
|
+
|
|
627
|
+
along with the quadratic relation
|
|
628
|
+
|
|
629
|
+
.. MATH::
|
|
630
|
+
|
|
631
|
+
g_i^2 = 1 + (q - 1) e_i (1 + g_i),
|
|
632
|
+
\qquad\qquad
|
|
633
|
+
e_i := \frac{1}{d} \sum_{s=0}^{d-1} h_i^s.
|
|
634
|
+
|
|
635
|
+
In particular, we can identify the subalgebra generated by `\{h_i \mid
|
|
636
|
+
i \in I\}` with `(\ZZ / d \ZZ) \otimes_{\ZZ} Q`. The Yokonuma-Hecke
|
|
637
|
+
algebra, when `d = p^m - 1` for a prime `p` and some `m \geq 1`, can
|
|
638
|
+
be identified with functions invariant under the left *and* right actions
|
|
639
|
+
of the unipotent group `U` on `G(\GF{d})`, the semisimple Chevalley
|
|
640
|
+
(or Lie) group associated with `W`. Moreover, all of the algebra
|
|
641
|
+
generators are invertible. In particular, we have
|
|
642
|
+
|
|
643
|
+
.. MATH::
|
|
644
|
+
|
|
645
|
+
g_i^{-1} = g_i + (q^{-1} - 1) e_i (1 + g_i).
|
|
646
|
+
|
|
647
|
+
For `d = 1`, the Yokonuma-Hecke algebra is equal to the
|
|
648
|
+
:class:`Iwahori-Hecke <IwahoriHeckeAlgebra>` of `W`.
|
|
649
|
+
|
|
650
|
+
INPUT:
|
|
651
|
+
|
|
652
|
+
- ``d`` -- the maximum power of `t`
|
|
653
|
+
- ``ct`` -- the Cartan type
|
|
654
|
+
- ``q`` -- (optional) an invertible element in a commutative ring;
|
|
655
|
+
the default is `q \in \QQ[q,q^{-1}]`
|
|
656
|
+
- ``R`` -- (optional) a commutative ring containing ``q``; the
|
|
657
|
+
default is the parent of `q`
|
|
658
|
+
|
|
659
|
+
.. WARNING::
|
|
660
|
+
|
|
661
|
+
For type `A_n`, this returns the Yokonuma-Hecke algebra associated
|
|
662
|
+
to the Lie (or Chevalley) group `SL_n(\GF{d})`. For the Yokonuma-Hecke
|
|
663
|
+
algebra corresponding to the (reductive) Lie group `GL_n(\GF{d})`, use
|
|
664
|
+
:class:`YokonumaHeckeAlgebraGL`. Additionally, this uses a different
|
|
665
|
+
quadratic relation.
|
|
666
|
+
|
|
667
|
+
REFERENCES:
|
|
668
|
+
|
|
669
|
+
- [Marin2018]_
|
|
670
|
+
"""
|
|
671
|
+
def __init__(self, d, ct, q, R):
|
|
672
|
+
r"""
|
|
673
|
+
Initialize ``self``.
|
|
674
|
+
|
|
675
|
+
EXAMPLES::
|
|
676
|
+
|
|
677
|
+
sage: Y = algebras.YokonumaHecke(2, ['F',4])
|
|
678
|
+
sage: TestSuite(Y).run()
|
|
679
|
+
sage: Y = algebras.YokonumaHecke(3, ['G',2])
|
|
680
|
+
sage: elts = list(Y.gens()) + [Y.an_element()] + [sum(Y.gens())]
|
|
681
|
+
sage: TestSuite(Y).run(elements=elts) # long time
|
|
682
|
+
"""
|
|
683
|
+
from sage.categories.sets_cat import cartesian_product
|
|
684
|
+
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
|
|
685
|
+
|
|
686
|
+
self._Q = ct.root_system().root_space(IntegerModRing(d))
|
|
687
|
+
self._Qp = ct.root_system().root_lattice()
|
|
688
|
+
W = self._Qp.weyl_group(prefix='s')
|
|
689
|
+
indices = cartesian_product([self._Q, W])
|
|
690
|
+
YokonumaHeckeAlgebra.__init__(self, d, W, q, R, indices)
|
|
691
|
+
|
|
692
|
+
def _repr_(self):
|
|
693
|
+
"""
|
|
694
|
+
Return a string representation of ``self``.
|
|
695
|
+
|
|
696
|
+
EXAMPLES::
|
|
697
|
+
|
|
698
|
+
sage: algebras.YokonumaHecke(5, ['E',6])
|
|
699
|
+
Yokonuma-Hecke algebra of rank 5 for ['E', 6] with q=q
|
|
700
|
+
over Univariate Laurent Polynomial Ring in q over Rational Field
|
|
701
|
+
"""
|
|
702
|
+
return "Yokonuma-Hecke algebra of rank {} for {} with q={} over {}".format(
|
|
703
|
+
self._d, self._cartan_type, self._q, self.base_ring())
|
|
704
|
+
|
|
705
|
+
def _latex_(self):
|
|
706
|
+
r"""
|
|
707
|
+
Return a latex representation of ``self``.
|
|
708
|
+
|
|
709
|
+
EXAMPLES::
|
|
710
|
+
|
|
711
|
+
sage: Y = algebras.YokonumaHecke(5, ['E',6])
|
|
712
|
+
sage: latex(Y)
|
|
713
|
+
\mathcal{Y}_{5,E_6}(q)
|
|
714
|
+
"""
|
|
715
|
+
from sage.misc.latex import latex
|
|
716
|
+
return "\\mathcal{Y}_{%s,%s}(%s)" % (self._d, latex(self._cartan_type), self._q)
|
|
717
|
+
|
|
718
|
+
def _repr_term(self, m):
|
|
719
|
+
"""
|
|
720
|
+
Return a string representation of the basis element indexed by ``m``.
|
|
721
|
+
|
|
722
|
+
EXAMPLES::
|
|
723
|
+
|
|
724
|
+
sage: Y = algebras.YokonumaHecke(4, ['E',6])
|
|
725
|
+
sage: al = Y._Q.simple_root(1) + 3*Y._Q.simple_root(5)
|
|
726
|
+
sage: Y._repr_term((al, prod(Y._W.gens())))
|
|
727
|
+
'h1*h5^3*g[1,3,2,4,5,6]'
|
|
728
|
+
"""
|
|
729
|
+
def gen_str(e):
|
|
730
|
+
return '' if e == 1 else '^%s' % e
|
|
731
|
+
|
|
732
|
+
I = self._cartan_type.index_set()
|
|
733
|
+
lhs = '*'.join('h%s' % j + gen_str(m[0][j]) for j in I if m[0][j])
|
|
734
|
+
redword = m[1].reduced_word()
|
|
735
|
+
if not redword:
|
|
736
|
+
if not lhs:
|
|
737
|
+
return '1'
|
|
738
|
+
return lhs
|
|
739
|
+
rhs = 'g[{}]'.format(','.join(str(i) for i in redword))
|
|
740
|
+
if not lhs:
|
|
741
|
+
return rhs
|
|
742
|
+
return lhs + '*' + rhs
|
|
743
|
+
|
|
744
|
+
def _latex_term(self, m):
|
|
745
|
+
r"""
|
|
746
|
+
Return a latex representation for the basis element indexed by ``m``.
|
|
747
|
+
|
|
748
|
+
EXAMPLES::
|
|
749
|
+
|
|
750
|
+
sage: Y = algebras.YokonumaHecke(4, ['E',6])
|
|
751
|
+
sage: al = Y._Q.simple_root(1) + 3*Y._Q.simple_root(5)
|
|
752
|
+
sage: Y._latex_term((al, prod(Y._W.gens())))
|
|
753
|
+
'h_{1} h_{5}^{3} g_{1} g_{3} g_{2} g_{4} g_{5} g_{6}'
|
|
754
|
+
"""
|
|
755
|
+
def gen_str(e):
|
|
756
|
+
return '' if e == 1 else '^{%s}' % e
|
|
757
|
+
|
|
758
|
+
I = self._cartan_type.index_set()
|
|
759
|
+
lhs = ' '.join('h_{%s}' % j + gen_str(m[0][j]) for j in I if m[0][j])
|
|
760
|
+
redword = m[1].reduced_word()
|
|
761
|
+
if not redword:
|
|
762
|
+
if not lhs:
|
|
763
|
+
return '1'
|
|
764
|
+
return lhs
|
|
765
|
+
return lhs + ' ' + ' '.join("g_{%d}" % i for i in redword)
|
|
766
|
+
|
|
767
|
+
@cached_method
|
|
768
|
+
def algebra_generators(self):
|
|
769
|
+
"""
|
|
770
|
+
Return the algebra generators of ``self``.
|
|
771
|
+
|
|
772
|
+
EXAMPLES::
|
|
773
|
+
|
|
774
|
+
sage: Y = algebras.YokonumaHecke(5, ['G',2])
|
|
775
|
+
sage: dict(Y.algebra_generators())
|
|
776
|
+
{'g1': g[1], 'g2': g[2], 'h1': h1, 'h2': h2}
|
|
777
|
+
"""
|
|
778
|
+
one = self._W.one()
|
|
779
|
+
zero = self._Q.zero()
|
|
780
|
+
d = {}
|
|
781
|
+
for i, al in self._Q.simple_roots().items():
|
|
782
|
+
d['h%s' % i] = self.monomial((al, one))
|
|
783
|
+
for i, g in self._W.simple_reflections().items():
|
|
784
|
+
d['g%s' % i] = self.monomial((zero, g))
|
|
785
|
+
return Family(sorted(d), d.__getitem__)
|
|
786
|
+
|
|
787
|
+
@cached_method
|
|
788
|
+
def one_basis(self):
|
|
789
|
+
"""
|
|
790
|
+
Return the index of the basis element of `1`.
|
|
791
|
+
|
|
792
|
+
EXAMPLES::
|
|
793
|
+
|
|
794
|
+
sage: Y = algebras.YokonumaHecke(5, ['D',6])
|
|
795
|
+
sage: Y.one_basis()
|
|
796
|
+
(0, 1)
|
|
797
|
+
"""
|
|
798
|
+
return (self._Q.zero(), self._W.one())
|
|
799
|
+
|
|
800
|
+
@cached_method
|
|
801
|
+
def e(self, i=None):
|
|
802
|
+
r"""
|
|
803
|
+
Return the element(s) `e_i`.
|
|
804
|
+
|
|
805
|
+
INPUT:
|
|
806
|
+
|
|
807
|
+
- ``i`` -- (default: ``None``) the element `e_i` or if ``None``,
|
|
808
|
+
then the family of all idempotents `e_i`
|
|
809
|
+
|
|
810
|
+
EXAMPLES::
|
|
811
|
+
|
|
812
|
+
sage: Y = algebras.YokonumaHecke(4, ['B',3])
|
|
813
|
+
sage: Y.e(1)
|
|
814
|
+
1/4 + 1/4*h1 + 1/4*h1^2 + 1/4*h1^3
|
|
815
|
+
sage: Y.e(2)
|
|
816
|
+
1/4 + 1/4*h2 + 1/4*h2^2 + 1/4*h2^3
|
|
817
|
+
|
|
818
|
+
We verify that they are idempotents::
|
|
819
|
+
|
|
820
|
+
sage: all(Y.e(i)^2 == Y.e(i) for i in Y.index_set())
|
|
821
|
+
True
|
|
822
|
+
|
|
823
|
+
Another example::
|
|
824
|
+
|
|
825
|
+
sage: Y = algebras.YokonumaHecke(3, ['G',2])
|
|
826
|
+
sage: e = Y.e()
|
|
827
|
+
sage: all(e[i]^2 == e[i] for i in Y.index_set())
|
|
828
|
+
True
|
|
829
|
+
"""
|
|
830
|
+
if i is None:
|
|
831
|
+
I = self._W.index_set()
|
|
832
|
+
d = {i: self.e(i) for i in I}
|
|
833
|
+
return Family(I, d.__getitem__)
|
|
834
|
+
if i not in self._W.index_set():
|
|
835
|
+
raise ValueError("invalid index")
|
|
836
|
+
c = ~self.base_ring()(self._d)
|
|
837
|
+
al = self._Q.simple_root(i)
|
|
838
|
+
one = self._W.one()
|
|
839
|
+
d = {(k*al, one): c for k in self._Q.base_ring()}
|
|
840
|
+
return self._from_dict(d, remove_zeros=False)
|
|
841
|
+
|
|
842
|
+
def h(self, i=None):
|
|
843
|
+
r"""
|
|
844
|
+
Return the generator(s) `h_i`.
|
|
845
|
+
|
|
846
|
+
INPUT:
|
|
847
|
+
|
|
848
|
+
- ``i`` -- (default: ``None``) the generator `h_i` or if ``None``,
|
|
849
|
+
then the family of all generators `h_i`
|
|
850
|
+
|
|
851
|
+
EXAMPLES::
|
|
852
|
+
|
|
853
|
+
sage: Y = algebras.YokonumaHecke(8, ['B',3])
|
|
854
|
+
sage: Y.h(2)
|
|
855
|
+
h2
|
|
856
|
+
sage: Y.h()
|
|
857
|
+
Finite family {1: h1, 2: h2, 3: h3}
|
|
858
|
+
"""
|
|
859
|
+
G = self.algebra_generators()
|
|
860
|
+
if i is None:
|
|
861
|
+
I = self._W.index_set()
|
|
862
|
+
d = {i: G['h%s' % i] for i in I}
|
|
863
|
+
return Family(I, d.__getitem__)
|
|
864
|
+
return G['h%s' % i]
|
|
865
|
+
|
|
866
|
+
@cached_method
|
|
867
|
+
def inverse_g(self, i=None):
|
|
868
|
+
r"""
|
|
869
|
+
Return the inverse of the generator(s) `g_i`.
|
|
870
|
+
|
|
871
|
+
From the quadratic relation, we have
|
|
872
|
+
|
|
873
|
+
.. MATH::
|
|
874
|
+
|
|
875
|
+
g_i^{-1} = g_i + (q^{-1} - 1) e_i (1 + g_i).
|
|
876
|
+
|
|
877
|
+
INPUT:
|
|
878
|
+
|
|
879
|
+
- ``i`` -- (default: ``None``) the inverse generator `g_i^{-1}` or
|
|
880
|
+
if ``None``, then the family of all inverse generators `g_i^{-1}`
|
|
881
|
+
|
|
882
|
+
EXAMPLES::
|
|
883
|
+
|
|
884
|
+
sage: Y = algebras.YokonumaHecke(2, ['B',3])
|
|
885
|
+
sage: [2*Y.inverse_g(i) for i in Y.index_set()]
|
|
886
|
+
[(q^-1+1)*g[1] + (q^-1-1) + (q^-1-1)*h1*g[1] + (q^-1-1)*h1,
|
|
887
|
+
(q^-1-1) + (q^-1+1)*g[2] + (q^-1-1)*h2 + (q^-1-1)*h2*g[2],
|
|
888
|
+
(q^-1-1) + (q^-1+1)*g[3] + (q^-1-1)*h3 + (q^-1-1)*h3*g[3]]
|
|
889
|
+
sage: all(Y.inverse_g(i) * Y.g(i) == Y.one() for i in range(1, 4))
|
|
890
|
+
True
|
|
891
|
+
sage: all(Y.g(i) * Y.inverse_g(i) == Y.one() for i in range(1, 4))
|
|
892
|
+
True
|
|
893
|
+
|
|
894
|
+
sage: Y = algebras.YokonumaHecke(3, ['G',2])
|
|
895
|
+
sage: ginv = Y.inverse_g()
|
|
896
|
+
sage: all(Y.g(i) * ginv[i] == Y.one() for i in Y.index_set())
|
|
897
|
+
True
|
|
898
|
+
sage: all(ginv[i] * Y.g(i) == Y.one() for i in Y.index_set())
|
|
899
|
+
True
|
|
900
|
+
"""
|
|
901
|
+
if i is None:
|
|
902
|
+
I = self._W.index_set()
|
|
903
|
+
d = {i: self.inverse_g(i) for i in I}
|
|
904
|
+
return Family(I, d.__getitem__)
|
|
905
|
+
if i not in self._W.index_set():
|
|
906
|
+
raise ValueError("invalid index")
|
|
907
|
+
return self.g(i) + (~self._q - 1) * self.e(i) * (self.one() + self.g(i))
|
|
908
|
+
|
|
909
|
+
def product_on_basis(self, m1, m2):
|
|
910
|
+
r"""
|
|
911
|
+
Return the product of the basis elements indexed by ``m1`` and ``m2``.
|
|
912
|
+
|
|
913
|
+
EXAMPLES::
|
|
914
|
+
|
|
915
|
+
sage: Y = algebras.YokonumaHecke(4, ['C',3])
|
|
916
|
+
sage: al = Y._Q.simple_root(1) + 2*Y._Q.simple_root(3)
|
|
917
|
+
sage: w = Y._W.from_reduced_word([3,2,1,2]); w.length()
|
|
918
|
+
4
|
|
919
|
+
sage: Y.product_on_basis((Y._Q.zero(), w), (al, Y._W.one()))
|
|
920
|
+
h2^3*h3*g[3,1,2,1]
|
|
921
|
+
sage: Y.product_on_basis((al, w), (al, Y._W.one()))
|
|
922
|
+
h1*h2^3*h3^3*g[3,1,2,1]
|
|
923
|
+
sage: Y.product_on_basis((al, Y._W.one()), (al, w))
|
|
924
|
+
h1^2*g[3,1,2,1]
|
|
925
|
+
sage: 4 * Y.product_on_basis((al, w), (al, w))
|
|
926
|
+
-(1-q)*h1*g[3,1,2,3,2,1] - (1-q)*h1*g[3,1,2,3,1,2,1]
|
|
927
|
+
- (1-q)*h1*h2*h3*g[3,1,2,3,2,1] - (1-q)*h1*h2*h3*g[3,1,2,3,1,2,1]
|
|
928
|
+
- (1-q)*h1*h2^2*h3^2*g[3,1,2,3,2,1] - (1-q)*h1*h2^2*h3^2*g[3,1,2,3,1,2,1]
|
|
929
|
+
+ (3+q)*h1*h2^3*h3^3*g[3,1,2,3,2,1] - (1-q)*h1*h2^3*h3^3*g[3,1,2,3,1,2,1]
|
|
930
|
+
|
|
931
|
+
Check that we apply the permutation correctly on `h_i`::
|
|
932
|
+
|
|
933
|
+
sage: Y = algebras.YokonumaHecke(4, ['B',3])
|
|
934
|
+
sage: g1, g2, g3, h1, h2, h3 = Y.algebra_generators()
|
|
935
|
+
sage: (g2 * g1) * h1
|
|
936
|
+
h1^3*h2^3*g[2,1]
|
|
937
|
+
sage: g2 * (g1 * h1)
|
|
938
|
+
h1^3*h2^3*g[2,1]
|
|
939
|
+
"""
|
|
940
|
+
h1, g1 = m1
|
|
941
|
+
h2, g2 = m2
|
|
942
|
+
# Commute g1 and t2, then multiply h1 and h2
|
|
943
|
+
# ig1 = g1
|
|
944
|
+
h = h1 + h2.weyl_action(g1)
|
|
945
|
+
one = self._W.one()
|
|
946
|
+
if g1 == one:
|
|
947
|
+
return self.monomial((h, g2))
|
|
948
|
+
ret = self.monomial((h, g1))
|
|
949
|
+
for i in g2.reduced_word():
|
|
950
|
+
ret = self.linear_combination((self._product_by_basis_gen(m, i), c)
|
|
951
|
+
for m, c in ret)
|
|
952
|
+
return ret
|
|
953
|
+
|
|
954
|
+
def _product_by_basis_gen(self, m, i):
|
|
955
|
+
r"""
|
|
956
|
+
Return the product `t g_w g_i`.
|
|
957
|
+
|
|
958
|
+
If the quadratic relation is `g_i^2 = 1 + (q - 1) (1 + g_i) e_i`,
|
|
959
|
+
then we have
|
|
960
|
+
|
|
961
|
+
.. MATH::
|
|
962
|
+
|
|
963
|
+
g_w g_i = \begin{cases}
|
|
964
|
+
g_{ws_i} & \text{if } \ell(ws_i) = \ell(w) + 1, \\
|
|
965
|
+
g_{ws_i} + (q-1) (g_{ws_i} + g_w) e_i & \text{if }
|
|
966
|
+
\ell(w s_i) = \ell(w) - 1.
|
|
967
|
+
\end{cases}
|
|
968
|
+
|
|
969
|
+
INPUT:
|
|
970
|
+
|
|
971
|
+
- ``m`` -- a pair ``[h, w]``, where ``h`` encodes the monomial
|
|
972
|
+
and ``w`` is an element of the Weyl group
|
|
973
|
+
- ``i`` -- an element of the index set
|
|
974
|
+
|
|
975
|
+
EXAMPLES::
|
|
976
|
+
|
|
977
|
+
sage: Y = algebras.YokonumaHecke(4, ['D',4])
|
|
978
|
+
sage: m = ((1, 0, 2), Permutations(3)([2,1,3]))
|
|
979
|
+
sage: 4 * Y._product_by_basis_gen(m, 1) # not tested
|
|
980
|
+
-(q^-1-q)*t2*t3^2*g[1] + 4*t1*t3^2 - (q^-1-q)*t1*t3^2*g[1]
|
|
981
|
+
- (q^-1-q)*t1^2*t2^3*t3^2*g[1] - (q^-1-q)*t1^3*t2^2*t3^2*g[1]
|
|
982
|
+
"""
|
|
983
|
+
h, w = m
|
|
984
|
+
wi = w.apply_simple_reflection(i, side='right')
|
|
985
|
+
if not w.has_descent(i, side='right'):
|
|
986
|
+
return self.monomial((h, wi))
|
|
987
|
+
|
|
988
|
+
q = self._q
|
|
989
|
+
mon = self.monomial((h, wi))
|
|
990
|
+
# TODO: Optimize this by computing an explicit expression
|
|
991
|
+
# for the commutation of w with ei.
|
|
992
|
+
one = self.base_ring().one()
|
|
993
|
+
binomial = self.element_class(self, {(h,wi): one, (h,w): one})
|
|
994
|
+
return mon + (q-1) * binomial * self.e(i)
|
|
995
|
+
|
|
996
|
+
class Element(CombinatorialFreeModule.Element):
|
|
997
|
+
def __invert__(self):
|
|
998
|
+
r"""
|
|
999
|
+
Return the inverse if ``self`` is a basis element.
|
|
1000
|
+
|
|
1001
|
+
EXAMPLES::
|
|
1002
|
+
|
|
1003
|
+
sage: Y = algebras.YokonumaHecke(3, ['B',3])
|
|
1004
|
+
sage: all(g * ~g == Y.one() for g in Y.g())
|
|
1005
|
+
True
|
|
1006
|
+
sage: h = prod(Y.h()) * Y.h(2)
|
|
1007
|
+
sage: all(h*g * ~(h*g) == Y.one() for g in Y.g())
|
|
1008
|
+
True
|
|
1009
|
+
"""
|
|
1010
|
+
if not self:
|
|
1011
|
+
raise ZeroDivisionError
|
|
1012
|
+
if len(self) != 1:
|
|
1013
|
+
raise NotImplementedError("inverse only implemented for basis elements (monomials in the generators)" % self)
|
|
1014
|
+
H = self.parent()
|
|
1015
|
+
t, w = self.support_of_term()
|
|
1016
|
+
c = ~self.coefficients()[0]
|
|
1017
|
+
telt = H.monomial((-t, H._W.one()))
|
|
1018
|
+
return c * H.prod(H.inverse_g(i) for i in reversed(w.reduced_word())) * telt
|