passagemath-combinat 10.6.42__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_combinat/__init__.py +3 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +400 -0
- passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
- passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
- passagemath_combinat.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_combinat.libs/libsymmetrica-81fe8739.so.3.0.0 +0 -0
- sage/algebras/affine_nil_temperley_lieb.py +263 -0
- sage/algebras/all.py +24 -0
- sage/algebras/all__sagemath_combinat.py +35 -0
- sage/algebras/askey_wilson.py +935 -0
- sage/algebras/associated_graded.py +345 -0
- sage/algebras/cellular_basis.py +350 -0
- sage/algebras/cluster_algebra.py +2766 -0
- sage/algebras/down_up_algebra.py +860 -0
- sage/algebras/free_algebra.py +1698 -0
- sage/algebras/free_algebra_element.py +345 -0
- sage/algebras/free_algebra_quotient.py +405 -0
- sage/algebras/free_algebra_quotient_element.py +295 -0
- sage/algebras/free_zinbiel_algebra.py +885 -0
- sage/algebras/hall_algebra.py +783 -0
- sage/algebras/hecke_algebras/all.py +4 -0
- sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
- sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
- sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
- sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
- sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
- sage/algebras/iwahori_hecke_algebra.py +3095 -0
- sage/algebras/jordan_algebra.py +1773 -0
- sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
- sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
- sage/algebras/lie_conformal_algebras/all.py +18 -0
- sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
- sage/algebras/lie_conformal_algebras/examples.py +43 -0
- sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
- sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
- sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
- sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
- sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
- sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
- sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
- sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
- sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
- sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
- sage/algebras/nil_coxeter_algebra.py +191 -0
- sage/algebras/q_commuting_polynomials.py +673 -0
- sage/algebras/q_system.py +608 -0
- sage/algebras/quantum_clifford.py +959 -0
- sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
- sage/algebras/quantum_groups/all.py +9 -0
- sage/algebras/quantum_groups/fock_space.py +2219 -0
- sage/algebras/quantum_groups/q_numbers.py +207 -0
- sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
- sage/algebras/quantum_groups/representations.py +591 -0
- sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
- sage/algebras/quantum_oscillator.py +623 -0
- sage/algebras/quaternion_algebra.py +20 -0
- sage/algebras/quaternion_algebra_element.py +55 -0
- sage/algebras/rational_cherednik_algebra.py +525 -0
- sage/algebras/schur_algebra.py +670 -0
- sage/algebras/shuffle_algebra.py +1011 -0
- sage/algebras/splitting_algebra.py +779 -0
- sage/algebras/tensor_algebra.py +709 -0
- sage/algebras/yangian.py +1082 -0
- sage/algebras/yokonuma_hecke_algebra.py +1018 -0
- sage/all__sagemath_combinat.py +35 -0
- sage/combinat/SJT.py +255 -0
- sage/combinat/affine_permutation.py +2405 -0
- sage/combinat/algebraic_combinatorics.py +55 -0
- sage/combinat/all.py +53 -0
- sage/combinat/all__sagemath_combinat.py +195 -0
- sage/combinat/alternating_sign_matrix.py +2063 -0
- sage/combinat/baxter_permutations.py +346 -0
- sage/combinat/bijectionist.py +3220 -0
- sage/combinat/binary_recurrence_sequences.py +1180 -0
- sage/combinat/blob_algebra.py +685 -0
- sage/combinat/catalog_partitions.py +27 -0
- sage/combinat/chas/all.py +23 -0
- sage/combinat/chas/fsym.py +1180 -0
- sage/combinat/chas/wqsym.py +2601 -0
- sage/combinat/cluster_complex.py +326 -0
- sage/combinat/colored_permutations.py +2039 -0
- sage/combinat/colored_permutations_representations.py +964 -0
- sage/combinat/composition_signed.py +142 -0
- sage/combinat/composition_tableau.py +855 -0
- sage/combinat/constellation.py +1729 -0
- sage/combinat/core.py +751 -0
- sage/combinat/counting.py +12 -0
- sage/combinat/crystals/affine.py +742 -0
- sage/combinat/crystals/affine_factorization.py +518 -0
- sage/combinat/crystals/affinization.py +331 -0
- sage/combinat/crystals/alcove_path.py +2013 -0
- sage/combinat/crystals/all.py +22 -0
- sage/combinat/crystals/bkk_crystals.py +141 -0
- sage/combinat/crystals/catalog.py +115 -0
- sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
- sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
- sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
- sage/combinat/crystals/crystals.py +257 -0
- sage/combinat/crystals/direct_sum.py +260 -0
- sage/combinat/crystals/elementary_crystals.py +1251 -0
- sage/combinat/crystals/fast_crystals.py +441 -0
- sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
- sage/combinat/crystals/generalized_young_walls.py +1076 -0
- sage/combinat/crystals/highest_weight_crystals.py +436 -0
- sage/combinat/crystals/induced_structure.py +695 -0
- sage/combinat/crystals/infinity_crystals.py +730 -0
- sage/combinat/crystals/kac_modules.py +863 -0
- sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
- sage/combinat/crystals/kyoto_path_model.py +497 -0
- sage/combinat/crystals/letters.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/letters.pxd +79 -0
- sage/combinat/crystals/letters.pyx +3056 -0
- sage/combinat/crystals/littelmann_path.py +1518 -0
- sage/combinat/crystals/monomial_crystals.py +1262 -0
- sage/combinat/crystals/multisegments.py +462 -0
- sage/combinat/crystals/mv_polytopes.py +467 -0
- sage/combinat/crystals/pbw_crystal.py +511 -0
- sage/combinat/crystals/pbw_datum.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/pbw_datum.pxd +4 -0
- sage/combinat/crystals/pbw_datum.pyx +487 -0
- sage/combinat/crystals/polyhedral_realization.py +372 -0
- sage/combinat/crystals/spins.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/spins.pxd +21 -0
- sage/combinat/crystals/spins.pyx +756 -0
- sage/combinat/crystals/star_crystal.py +290 -0
- sage/combinat/crystals/subcrystal.py +464 -0
- sage/combinat/crystals/tensor_product.py +1177 -0
- sage/combinat/crystals/tensor_product_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/tensor_product_element.pxd +35 -0
- sage/combinat/crystals/tensor_product_element.pyx +1870 -0
- sage/combinat/crystals/virtual_crystal.py +420 -0
- sage/combinat/cyclic_sieving_phenomenon.py +204 -0
- sage/combinat/debruijn_sequence.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/degree_sequences.pyx +588 -0
- sage/combinat/derangements.py +527 -0
- sage/combinat/descent_algebra.py +1008 -0
- sage/combinat/diagram.py +1551 -0
- sage/combinat/diagram_algebras.py +5886 -0
- sage/combinat/dyck_word.py +4349 -0
- sage/combinat/e_one_star.py +1623 -0
- sage/combinat/enumerated_sets.py +123 -0
- sage/combinat/expnums.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/fast_vector_partitions.pyx +346 -0
- sage/combinat/fqsym.py +1977 -0
- sage/combinat/free_dendriform_algebra.py +954 -0
- sage/combinat/free_prelie_algebra.py +1141 -0
- sage/combinat/fully_commutative_elements.py +1077 -0
- sage/combinat/fully_packed_loop.py +1523 -0
- sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
- sage/combinat/gray_codes.py +311 -0
- sage/combinat/grossman_larson_algebras.py +667 -0
- sage/combinat/growth.py +4352 -0
- sage/combinat/hall_polynomial.py +188 -0
- sage/combinat/hillman_grassl.py +866 -0
- sage/combinat/integer_matrices.py +329 -0
- sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
- sage/combinat/k_tableau.py +4564 -0
- sage/combinat/kazhdan_lusztig.py +215 -0
- sage/combinat/key_polynomial.py +885 -0
- sage/combinat/knutson_tao_puzzles.py +2286 -0
- sage/combinat/lr_tableau.py +311 -0
- sage/combinat/matrices/all.py +24 -0
- sage/combinat/matrices/hadamard_matrix.py +3790 -0
- sage/combinat/matrices/latin.py +2912 -0
- sage/combinat/misc.py +401 -0
- sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
- sage/combinat/ncsf_qsym/all.py +21 -0
- sage/combinat/ncsf_qsym/combinatorics.py +317 -0
- sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
- sage/combinat/ncsf_qsym/ncsf.py +5637 -0
- sage/combinat/ncsf_qsym/qsym.py +4053 -0
- sage/combinat/ncsf_qsym/tutorial.py +447 -0
- sage/combinat/ncsym/all.py +21 -0
- sage/combinat/ncsym/bases.py +855 -0
- sage/combinat/ncsym/dual.py +593 -0
- sage/combinat/ncsym/ncsym.py +2076 -0
- sage/combinat/necklace.py +551 -0
- sage/combinat/non_decreasing_parking_function.py +634 -0
- sage/combinat/nu_dyck_word.py +1474 -0
- sage/combinat/output.py +861 -0
- sage/combinat/parallelogram_polyomino.py +4326 -0
- sage/combinat/parking_functions.py +1602 -0
- sage/combinat/partition_algebra.py +1998 -0
- sage/combinat/partition_kleshchev.py +1982 -0
- sage/combinat/partition_shifting_algebras.py +584 -0
- sage/combinat/partition_tuple.py +3114 -0
- sage/combinat/path_tableaux/all.py +13 -0
- sage/combinat/path_tableaux/catalog.py +29 -0
- sage/combinat/path_tableaux/dyck_path.py +380 -0
- sage/combinat/path_tableaux/frieze.py +476 -0
- sage/combinat/path_tableaux/path_tableau.py +728 -0
- sage/combinat/path_tableaux/semistandard.py +510 -0
- sage/combinat/perfect_matching.py +779 -0
- sage/combinat/plane_partition.py +3300 -0
- sage/combinat/q_bernoulli.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/q_bernoulli.pyx +128 -0
- sage/combinat/quickref.py +81 -0
- sage/combinat/recognizable_series.py +2051 -0
- sage/combinat/regular_sequence.py +4316 -0
- sage/combinat/regular_sequence_bounded.py +543 -0
- sage/combinat/restricted_growth.py +81 -0
- sage/combinat/ribbon.py +20 -0
- sage/combinat/ribbon_shaped_tableau.py +489 -0
- sage/combinat/ribbon_tableau.py +1180 -0
- sage/combinat/rigged_configurations/all.py +46 -0
- sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
- sage/combinat/rigged_configurations/bij_infinity.py +370 -0
- sage/combinat/rigged_configurations/bij_type_A.py +163 -0
- sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
- sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
- sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
- sage/combinat/rigged_configurations/bij_type_B.py +900 -0
- sage/combinat/rigged_configurations/bij_type_C.py +267 -0
- sage/combinat/rigged_configurations/bij_type_D.py +771 -0
- sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
- sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
- sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
- sage/combinat/rigged_configurations/bijection.py +143 -0
- sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
- sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
- sage/combinat/rigged_configurations/rc_crystal.py +461 -0
- sage/combinat/rigged_configurations/rc_infinity.py +540 -0
- sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
- sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
- sage/combinat/rigged_configurations/rigged_partition.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
- sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
- sage/combinat/rsk.py +3438 -0
- sage/combinat/schubert_polynomial.py +508 -0
- sage/combinat/set_partition.py +3318 -0
- sage/combinat/set_partition_iterator.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/set_partition_iterator.pyx +136 -0
- sage/combinat/set_partition_ordered.py +1590 -0
- sage/combinat/sf/abreu_nigro.py +346 -0
- sage/combinat/sf/all.py +52 -0
- sage/combinat/sf/character.py +576 -0
- sage/combinat/sf/classical.py +319 -0
- sage/combinat/sf/dual.py +996 -0
- sage/combinat/sf/elementary.py +549 -0
- sage/combinat/sf/hall_littlewood.py +1028 -0
- sage/combinat/sf/hecke.py +336 -0
- sage/combinat/sf/homogeneous.py +464 -0
- sage/combinat/sf/jack.py +1428 -0
- sage/combinat/sf/k_dual.py +1458 -0
- sage/combinat/sf/kfpoly.py +447 -0
- sage/combinat/sf/llt.py +789 -0
- sage/combinat/sf/macdonald.py +2019 -0
- sage/combinat/sf/monomial.py +525 -0
- sage/combinat/sf/multiplicative.py +113 -0
- sage/combinat/sf/new_kschur.py +1786 -0
- sage/combinat/sf/ns_macdonald.py +964 -0
- sage/combinat/sf/orthogonal.py +246 -0
- sage/combinat/sf/orthotriang.py +355 -0
- sage/combinat/sf/powersum.py +963 -0
- sage/combinat/sf/schur.py +880 -0
- sage/combinat/sf/sf.py +1653 -0
- sage/combinat/sf/sfa.py +7053 -0
- sage/combinat/sf/symplectic.py +253 -0
- sage/combinat/sf/witt.py +721 -0
- sage/combinat/shifted_primed_tableau.py +2735 -0
- sage/combinat/shuffle.py +830 -0
- sage/combinat/sidon_sets.py +146 -0
- sage/combinat/similarity_class_type.py +1721 -0
- sage/combinat/sine_gordon.py +618 -0
- sage/combinat/six_vertex_model.py +784 -0
- sage/combinat/skew_partition.py +2053 -0
- sage/combinat/skew_tableau.py +2989 -0
- sage/combinat/sloane_functions.py +8935 -0
- sage/combinat/specht_module.py +1403 -0
- sage/combinat/species/all.py +48 -0
- sage/combinat/species/characteristic_species.py +321 -0
- sage/combinat/species/composition_species.py +273 -0
- sage/combinat/species/cycle_species.py +284 -0
- sage/combinat/species/empty_species.py +155 -0
- sage/combinat/species/functorial_composition_species.py +148 -0
- sage/combinat/species/generating_series.py +673 -0
- sage/combinat/species/library.py +148 -0
- sage/combinat/species/linear_order_species.py +169 -0
- sage/combinat/species/misc.py +83 -0
- sage/combinat/species/partition_species.py +290 -0
- sage/combinat/species/permutation_species.py +268 -0
- sage/combinat/species/product_species.py +423 -0
- sage/combinat/species/recursive_species.py +476 -0
- sage/combinat/species/set_species.py +192 -0
- sage/combinat/species/species.py +820 -0
- sage/combinat/species/structure.py +539 -0
- sage/combinat/species/subset_species.py +243 -0
- sage/combinat/species/sum_species.py +225 -0
- sage/combinat/subword.py +564 -0
- sage/combinat/subword_complex.py +2122 -0
- sage/combinat/subword_complex_c.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/subword_complex_c.pyx +119 -0
- sage/combinat/super_tableau.py +821 -0
- sage/combinat/superpartition.py +1154 -0
- sage/combinat/symmetric_group_algebra.py +3774 -0
- sage/combinat/symmetric_group_representations.py +1830 -0
- sage/combinat/t_sequences.py +877 -0
- sage/combinat/tableau.py +9506 -0
- sage/combinat/tableau_residues.py +860 -0
- sage/combinat/tableau_tuple.py +5353 -0
- sage/combinat/tiling.py +2432 -0
- sage/combinat/triangles_FHM.py +777 -0
- sage/combinat/tutorial.py +1857 -0
- sage/combinat/vector_partition.py +337 -0
- sage/combinat/words/abstract_word.py +1722 -0
- sage/combinat/words/all.py +59 -0
- sage/combinat/words/alphabet.py +268 -0
- sage/combinat/words/finite_word.py +7201 -0
- sage/combinat/words/infinite_word.py +113 -0
- sage/combinat/words/lyndon_word.py +652 -0
- sage/combinat/words/morphic.py +351 -0
- sage/combinat/words/morphism.py +3878 -0
- sage/combinat/words/paths.py +2932 -0
- sage/combinat/words/shuffle_product.py +278 -0
- sage/combinat/words/suffix_trees.py +1873 -0
- sage/combinat/words/word.py +769 -0
- sage/combinat/words/word_char.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/words/word_datatypes.pxd +4 -0
- sage/combinat/words/word_datatypes.pyx +1067 -0
- sage/combinat/words/word_generators.py +2026 -0
- sage/combinat/words/word_infinite_datatypes.py +1218 -0
- sage/combinat/words/word_options.py +99 -0
- sage/combinat/words/words.py +2396 -0
- sage/data_structures/all__sagemath_combinat.py +1 -0
- sage/databases/all__sagemath_combinat.py +13 -0
- sage/databases/findstat.py +4897 -0
- sage/databases/oeis.py +2058 -0
- sage/databases/sloane.py +393 -0
- sage/dynamics/all__sagemath_combinat.py +14 -0
- sage/dynamics/cellular_automata/all.py +7 -0
- sage/dynamics/cellular_automata/catalog.py +34 -0
- sage/dynamics/cellular_automata/elementary.py +612 -0
- sage/dynamics/cellular_automata/glca.py +477 -0
- sage/dynamics/cellular_automata/solitons.py +1463 -0
- sage/dynamics/finite_dynamical_system.py +1249 -0
- sage/dynamics/finite_dynamical_system_catalog.py +382 -0
- sage/games/all.py +7 -0
- sage/games/hexad.py +704 -0
- sage/games/quantumino.py +591 -0
- sage/games/sudoku.py +889 -0
- sage/games/sudoku_backtrack.cpython-314-x86_64-linux-musl.so +0 -0
- sage/games/sudoku_backtrack.pyx +189 -0
- sage/groups/all__sagemath_combinat.py +1 -0
- sage/groups/indexed_free_group.py +489 -0
- sage/libs/all__sagemath_combinat.py +6 -0
- sage/libs/lrcalc/__init__.py +1 -0
- sage/libs/lrcalc/lrcalc.py +525 -0
- sage/libs/symmetrica/__init__.py +7 -0
- sage/libs/symmetrica/all.py +101 -0
- sage/libs/symmetrica/kostka.pxi +168 -0
- sage/libs/symmetrica/part.pxi +193 -0
- sage/libs/symmetrica/plet.pxi +42 -0
- sage/libs/symmetrica/sab.pxi +196 -0
- sage/libs/symmetrica/sb.pxi +332 -0
- sage/libs/symmetrica/sc.pxi +192 -0
- sage/libs/symmetrica/schur.pxi +956 -0
- sage/libs/symmetrica/symmetrica.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/symmetrica/symmetrica.pxi +1172 -0
- sage/libs/symmetrica/symmetrica.pyx +39 -0
- sage/monoids/all.py +13 -0
- sage/monoids/automatic_semigroup.py +1054 -0
- sage/monoids/free_abelian_monoid.py +315 -0
- sage/monoids/free_abelian_monoid_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/monoids/free_abelian_monoid_element.pxd +16 -0
- sage/monoids/free_abelian_monoid_element.pyx +397 -0
- sage/monoids/free_monoid.py +335 -0
- sage/monoids/free_monoid_element.py +431 -0
- sage/monoids/hecke_monoid.py +65 -0
- sage/monoids/string_monoid.py +817 -0
- sage/monoids/string_monoid_element.py +547 -0
- sage/monoids/string_ops.py +143 -0
- sage/monoids/trace_monoid.py +972 -0
- sage/rings/all__sagemath_combinat.py +2 -0
- sage/sat/all.py +4 -0
- sage/sat/boolean_polynomials.py +405 -0
- sage/sat/converters/__init__.py +6 -0
- sage/sat/converters/anf2cnf.py +14 -0
- sage/sat/converters/polybori.py +611 -0
- sage/sat/solvers/__init__.py +5 -0
- sage/sat/solvers/cryptominisat.py +287 -0
- sage/sat/solvers/dimacs.py +783 -0
- sage/sat/solvers/picosat.py +228 -0
- sage/sat/solvers/sat_lp.py +156 -0
- sage/sat/solvers/satsolver.cpython-314-x86_64-linux-musl.so +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,673 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.groups sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
`q`-Commuting Polynomials
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2022-08-23): Initial version
|
|
9
|
+
- Travis Scrimshaw (2023-02-10): Added Laurent polynomials
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# ****************************************************************************
|
|
13
|
+
# Copyright (C) 2022-2023 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.misc.latex import latex
|
|
24
|
+
from sage.sets.family import Family
|
|
25
|
+
from sage.rings.infinity import infinity
|
|
26
|
+
from sage.rings.integer_ring import ZZ
|
|
27
|
+
from sage.categories.algebras import Algebras
|
|
28
|
+
from sage.categories.commutative_rings import CommutativeRings
|
|
29
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
30
|
+
from sage.monoids.free_abelian_monoid import FreeAbelianMonoid
|
|
31
|
+
from sage.groups.free_group import FreeGroup
|
|
32
|
+
from sage.modules.free_module import FreeModule
|
|
33
|
+
from sage.matrix.constructor import matrix
|
|
34
|
+
from sage.structure.element import Matrix
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class qCommutingPolynomials_generic(CombinatorialFreeModule):
|
|
38
|
+
r"""
|
|
39
|
+
Base class for algebra of `q`-commuting (Laurent, etc.) polynomials.
|
|
40
|
+
|
|
41
|
+
Let `R` be a commutative ring, and fix an element `q \in R`. Let
|
|
42
|
+
`B = (B_{xy})_{x,y \in I}` be a skew-symmetric bilinear form with
|
|
43
|
+
index set `I`. Let `R[I]_{q,B}` denote the polynomial ring in the variables
|
|
44
|
+
`I` such that we have the `q`-*commuting* relation for `x, y \in I`:
|
|
45
|
+
|
|
46
|
+
.. MATH::
|
|
47
|
+
|
|
48
|
+
y x = q^{B_{xy}} \cdot x y.
|
|
49
|
+
|
|
50
|
+
This is a graded `R`-algebra with a natural basis given by monomials
|
|
51
|
+
written in increasing order with respect to some total order on `I`.
|
|
52
|
+
"""
|
|
53
|
+
@staticmethod
|
|
54
|
+
def __classcall__(cls, q, n=None, B=None, base_ring=None, names=None):
|
|
55
|
+
r"""
|
|
56
|
+
Normalize input to ensure a unique representation.
|
|
57
|
+
|
|
58
|
+
EXAMPLES::
|
|
59
|
+
|
|
60
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
61
|
+
sage: R1.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
62
|
+
sage: R2 = algebras.qCommutingPolynomials(q, base_ring=q.parent(), names='x,y,z')
|
|
63
|
+
sage: R3 = algebras.qCommutingPolynomials(q, names=['x', 'y', 'z'])
|
|
64
|
+
sage: R1 is R2 is R3
|
|
65
|
+
True
|
|
66
|
+
"""
|
|
67
|
+
if base_ring is not None:
|
|
68
|
+
q = base_ring(q)
|
|
69
|
+
|
|
70
|
+
if B is None and isinstance(n, Matrix):
|
|
71
|
+
n, B = B, n
|
|
72
|
+
|
|
73
|
+
if names is None:
|
|
74
|
+
raise ValueError("the names of the variables must be given")
|
|
75
|
+
from sage.structure.category_object import normalize_names
|
|
76
|
+
if n is None:
|
|
77
|
+
if isinstance(names, str):
|
|
78
|
+
n = names.count(',') + 1
|
|
79
|
+
else:
|
|
80
|
+
n = len(names)
|
|
81
|
+
names = normalize_names(n, names)
|
|
82
|
+
n = len(names)
|
|
83
|
+
if B is None:
|
|
84
|
+
B = matrix.zero(ZZ, n)
|
|
85
|
+
for i in range(n):
|
|
86
|
+
for j in range(i+1, n):
|
|
87
|
+
B[i, j] = 1
|
|
88
|
+
B[j, i] = -1
|
|
89
|
+
B.set_immutable()
|
|
90
|
+
else:
|
|
91
|
+
if not B.is_skew_symmetric():
|
|
92
|
+
raise ValueError("the matrix must be skew symmetric")
|
|
93
|
+
B = B.change_ring(ZZ)
|
|
94
|
+
B.set_immutable()
|
|
95
|
+
return super().__classcall__(cls, q=q, B=B, names=names)
|
|
96
|
+
|
|
97
|
+
def __init__(self, q, B, indices, names):
|
|
98
|
+
r"""
|
|
99
|
+
Initialize ``self``.
|
|
100
|
+
|
|
101
|
+
EXAMPLES::
|
|
102
|
+
|
|
103
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
104
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
105
|
+
sage: TestSuite(R).run()
|
|
106
|
+
"""
|
|
107
|
+
self._q = q
|
|
108
|
+
self._B = B
|
|
109
|
+
base_ring = q.parent()
|
|
110
|
+
if base_ring not in CommutativeRings():
|
|
111
|
+
raise ValueError("the base ring must be a commutative ring")
|
|
112
|
+
category = Algebras(base_ring).WithBasis().Graded()
|
|
113
|
+
CombinatorialFreeModule.__init__(self, base_ring, indices,
|
|
114
|
+
bracket=False, prefix='',
|
|
115
|
+
sorting_key=qCommutingPolynomials_generic._term_key,
|
|
116
|
+
names=names, category=category)
|
|
117
|
+
|
|
118
|
+
@staticmethod
|
|
119
|
+
def _term_key(x):
|
|
120
|
+
r"""
|
|
121
|
+
Compute a key for ``x`` for comparisons.
|
|
122
|
+
|
|
123
|
+
EXAMPLES::
|
|
124
|
+
|
|
125
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
126
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
127
|
+
sage: elt = (x*y^3*z^2).leading_support()
|
|
128
|
+
sage: R._term_key(elt)
|
|
129
|
+
(6, [2, 3, 1])
|
|
130
|
+
"""
|
|
131
|
+
L = x.list()
|
|
132
|
+
L.reverse()
|
|
133
|
+
return (sum(L), L)
|
|
134
|
+
|
|
135
|
+
def gen(self, i):
|
|
136
|
+
r"""
|
|
137
|
+
Return the ``i``-generator of ``self``.
|
|
138
|
+
|
|
139
|
+
EXAMPLES::
|
|
140
|
+
|
|
141
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
142
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
143
|
+
sage: R.gen(0)
|
|
144
|
+
x
|
|
145
|
+
sage: R.gen(2)
|
|
146
|
+
z
|
|
147
|
+
"""
|
|
148
|
+
return self.monomial(self._indices.gen(i))
|
|
149
|
+
|
|
150
|
+
@cached_method
|
|
151
|
+
def gens(self) -> tuple:
|
|
152
|
+
r"""
|
|
153
|
+
Return the generators of ``self``.
|
|
154
|
+
|
|
155
|
+
EXAMPLES::
|
|
156
|
+
|
|
157
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
158
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
159
|
+
sage: R.gens()
|
|
160
|
+
(x, y, z)
|
|
161
|
+
"""
|
|
162
|
+
return tuple([self.monomial(g) for g in self._indices.gens()])
|
|
163
|
+
|
|
164
|
+
@cached_method
|
|
165
|
+
def algebra_generators(self):
|
|
166
|
+
r"""
|
|
167
|
+
Return the algebra generators of ``self``.
|
|
168
|
+
|
|
169
|
+
EXAMPLES::
|
|
170
|
+
|
|
171
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
172
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
173
|
+
sage: R.algebra_generators()
|
|
174
|
+
Finite family {'x': x, 'y': y, 'z': z}
|
|
175
|
+
"""
|
|
176
|
+
d = {v: self.gen(i) for i, v in enumerate(self.variable_names())}
|
|
177
|
+
return Family(self.variable_names(), d.__getitem__, name='generator')
|
|
178
|
+
|
|
179
|
+
def degree_on_basis(self, m):
|
|
180
|
+
r"""
|
|
181
|
+
Return the degree of the monomial index by ``m``.
|
|
182
|
+
|
|
183
|
+
EXAMPLES::
|
|
184
|
+
|
|
185
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
186
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
187
|
+
sage: R.degree_on_basis(R.one_basis())
|
|
188
|
+
0
|
|
189
|
+
sage: f = (x + y)^3 + z^3
|
|
190
|
+
sage: f.degree()
|
|
191
|
+
3
|
|
192
|
+
"""
|
|
193
|
+
return sum(m.list())
|
|
194
|
+
|
|
195
|
+
def dimension(self):
|
|
196
|
+
r"""
|
|
197
|
+
Return the dimension of ``self``, which is `\infty`.
|
|
198
|
+
|
|
199
|
+
EXAMPLES::
|
|
200
|
+
|
|
201
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
202
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
203
|
+
sage: R.dimension()
|
|
204
|
+
+Infinity
|
|
205
|
+
"""
|
|
206
|
+
return infinity
|
|
207
|
+
|
|
208
|
+
def q(self):
|
|
209
|
+
"""
|
|
210
|
+
Return the parameter `q`.
|
|
211
|
+
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
215
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
216
|
+
sage: R.q() == q
|
|
217
|
+
True
|
|
218
|
+
"""
|
|
219
|
+
return self._q
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
class qCommutingPolynomials(qCommutingPolynomials_generic):
|
|
223
|
+
r"""
|
|
224
|
+
The algebra of `q`-commuting polynomials.
|
|
225
|
+
|
|
226
|
+
Let `R` be a commutative ring, and fix an element `q \in R`. Let
|
|
227
|
+
`B = (B_{xy})_{x,y \in I}` be a skew-symmetric bilinear form with
|
|
228
|
+
index set `I`. Let `R[I]_{q,B}` denote the polynomial ring in the variables
|
|
229
|
+
`I` such that we have the `q`-*commuting* relation for `x, y \in I`:
|
|
230
|
+
|
|
231
|
+
.. MATH::
|
|
232
|
+
|
|
233
|
+
y x = q^{B_{xy}} \cdot x y.
|
|
234
|
+
|
|
235
|
+
This is a graded `R`-algebra with a natural basis given by monomials
|
|
236
|
+
written in increasing order with respect to some total order on `I`.
|
|
237
|
+
|
|
238
|
+
When `B_{xy} = 1` and `B_{yx} = -1` for all `x < y`, then we have
|
|
239
|
+
a `q`-analog of the classical binomial coefficient theorem:
|
|
240
|
+
|
|
241
|
+
.. MATH::
|
|
242
|
+
|
|
243
|
+
(x + y)^n = \sum_{k=0}^n \binom{n}{k}_q x^k y^{n-k}.
|
|
244
|
+
|
|
245
|
+
EXAMPLES::
|
|
246
|
+
|
|
247
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
248
|
+
sage: R.<x,y> = algebras.qCommutingPolynomials(q)
|
|
249
|
+
|
|
250
|
+
We verify a case of the `q`-binomial theorem::
|
|
251
|
+
|
|
252
|
+
sage: f = (x + y)^10
|
|
253
|
+
sage: all(f[b] == q_binomial(10, b.list()[0]) for b in f.support())
|
|
254
|
+
True
|
|
255
|
+
|
|
256
|
+
We now do a computation with a non-standard `B` matrix::
|
|
257
|
+
|
|
258
|
+
sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
|
|
259
|
+
sage: B
|
|
260
|
+
[ 0 1 2]
|
|
261
|
+
[-1 0 3]
|
|
262
|
+
[-2 -3 0]
|
|
263
|
+
sage: q = ZZ['q'].gen()
|
|
264
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q, B)
|
|
265
|
+
sage: y * x
|
|
266
|
+
q*x*y
|
|
267
|
+
sage: z * x
|
|
268
|
+
q^2*x*z
|
|
269
|
+
sage: z * y
|
|
270
|
+
q^3*y*z
|
|
271
|
+
|
|
272
|
+
sage: f = (x + z)^10
|
|
273
|
+
sage: all(f[b] == q_binomial(10, b.list()[0], q^2) for b in f.support())
|
|
274
|
+
True
|
|
275
|
+
|
|
276
|
+
sage: f = (y + z)^10
|
|
277
|
+
sage: all(f[b] == q_binomial(10, b.list()[1], q^3) for b in f.support())
|
|
278
|
+
True
|
|
279
|
+
"""
|
|
280
|
+
def __init__(self, q, B, names):
|
|
281
|
+
r"""
|
|
282
|
+
Initialize ``self``.
|
|
283
|
+
|
|
284
|
+
EXAMPLES::
|
|
285
|
+
|
|
286
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
287
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
288
|
+
sage: TestSuite(R).run()
|
|
289
|
+
"""
|
|
290
|
+
indices = FreeAbelianMonoid(len(names), names)
|
|
291
|
+
qCommutingPolynomials_generic.__init__(self, q, B, indices, indices.variable_names())
|
|
292
|
+
|
|
293
|
+
def _repr_(self):
|
|
294
|
+
r"""
|
|
295
|
+
Return a string representation of ``self``.
|
|
296
|
+
|
|
297
|
+
EXAMPLES::
|
|
298
|
+
|
|
299
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
300
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
301
|
+
sage: R
|
|
302
|
+
q-commuting polynomial ring in x, y, z over Fraction Field of
|
|
303
|
+
Univariate Polynomial Ring in q over Integer Ring with matrix:
|
|
304
|
+
[ 0 1 1]
|
|
305
|
+
[-1 0 1]
|
|
306
|
+
[-1 -1 0]
|
|
307
|
+
"""
|
|
308
|
+
names = ", ".join(self.variable_names())
|
|
309
|
+
return "{}-commuting polynomial ring in {} over {} with matrix:\n{}".format(self._q, names, self.base_ring(), self._B)
|
|
310
|
+
|
|
311
|
+
def _latex_(self):
|
|
312
|
+
r"""
|
|
313
|
+
Return a latex representation of ``self``.
|
|
314
|
+
|
|
315
|
+
EXAMPLES::
|
|
316
|
+
|
|
317
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
318
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
319
|
+
sage: latex(R)
|
|
320
|
+
\mathrm{Frac}(\Bold{Z}[q])[x, y, z]_{q}
|
|
321
|
+
"""
|
|
322
|
+
names = ", ".join(self.variable_names())
|
|
323
|
+
return "{}[{}]_{{{}}}".format(latex(self.base_ring()), names, self._q)
|
|
324
|
+
|
|
325
|
+
@cached_method
|
|
326
|
+
def one_basis(self):
|
|
327
|
+
r"""
|
|
328
|
+
Return the basis index of the element `1`.
|
|
329
|
+
|
|
330
|
+
EXAMPLES::
|
|
331
|
+
|
|
332
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
333
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
334
|
+
sage: R.one_basis()
|
|
335
|
+
1
|
|
336
|
+
"""
|
|
337
|
+
return self._indices.one()
|
|
338
|
+
|
|
339
|
+
def product_on_basis(self, x, y):
|
|
340
|
+
r"""
|
|
341
|
+
Return the product of two monomials given by ``x`` and ``y``.
|
|
342
|
+
|
|
343
|
+
EXAMPLES::
|
|
344
|
+
|
|
345
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
346
|
+
sage: R.<x,y> = algebras.qCommutingPolynomials(q)
|
|
347
|
+
sage: R.product_on_basis(x.leading_support(), y.leading_support())
|
|
348
|
+
x*y
|
|
349
|
+
sage: R.product_on_basis(y.leading_support(), x.leading_support())
|
|
350
|
+
q*x*y
|
|
351
|
+
|
|
352
|
+
sage: x * y
|
|
353
|
+
x*y
|
|
354
|
+
sage: y * x
|
|
355
|
+
q*x*y
|
|
356
|
+
sage: y^2 * x
|
|
357
|
+
q^2*x*y^2
|
|
358
|
+
sage: y * x^2
|
|
359
|
+
q^2*x^2*y
|
|
360
|
+
sage: x * y * x
|
|
361
|
+
q*x^2*y
|
|
362
|
+
sage: y^2 * x^2
|
|
363
|
+
q^4*x^2*y^2
|
|
364
|
+
sage: (x + y)^2
|
|
365
|
+
x^2 + (q+1)*x*y + y^2
|
|
366
|
+
sage: (x + y)^3
|
|
367
|
+
x^3 + (q^2+q+1)*x^2*y + (q^2+q+1)*x*y^2 + y^3
|
|
368
|
+
sage: (x + y)^4
|
|
369
|
+
x^4 + (q^3+q^2+q+1)*x^3*y + (q^4+q^3+2*q^2+q+1)*x^2*y^2 + (q^3+q^2+q+1)*x*y^3 + y^4
|
|
370
|
+
|
|
371
|
+
With a non-standard `B` matrix::
|
|
372
|
+
|
|
373
|
+
sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
|
|
374
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
375
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q, B=B)
|
|
376
|
+
sage: x * y
|
|
377
|
+
x*y
|
|
378
|
+
sage: y * x^2
|
|
379
|
+
q^2*x^2*y
|
|
380
|
+
sage: z^2 * x
|
|
381
|
+
q^4*x*z^2
|
|
382
|
+
sage: z^2 * x^3
|
|
383
|
+
q^12*x^3*z^2
|
|
384
|
+
sage: z^2 * y
|
|
385
|
+
q^6*y*z^2
|
|
386
|
+
sage: z^2 * y^3
|
|
387
|
+
q^18*y^3*z^2
|
|
388
|
+
"""
|
|
389
|
+
# Special case for multiplying by 1
|
|
390
|
+
if x == self.one_basis():
|
|
391
|
+
return self.monomial(y)
|
|
392
|
+
if y == self.one_basis():
|
|
393
|
+
return self.monomial(x)
|
|
394
|
+
|
|
395
|
+
Lx = x.list()
|
|
396
|
+
Ly = y.list()
|
|
397
|
+
|
|
398
|
+
# This could be made more efficient
|
|
399
|
+
B = self._B
|
|
400
|
+
qpow = sum(exp * sum(B[j, i] * val for j, val in enumerate(Ly[:i])) for i, exp in enumerate(Lx) if exp)
|
|
401
|
+
return self.term(x * y, self._q ** qpow)
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
class qCommutingLaurentPolynomials(qCommutingPolynomials_generic):
|
|
405
|
+
r"""
|
|
406
|
+
The algebra of `q`-commuting Laurent polynomials.
|
|
407
|
+
|
|
408
|
+
Let `R` be a commutative ring, and fix an element `q \in R`. Let
|
|
409
|
+
`B = (B_{xy})_{x,y \in I}` be a skew-symmetric bilinear form with
|
|
410
|
+
index set `I`. Let `R[I]_{q,B}` denote the Laurent polynomial ring in
|
|
411
|
+
the variables `I` such that we have the `q`-*commuting* relation
|
|
412
|
+
for `x, y \in I`:
|
|
413
|
+
|
|
414
|
+
.. MATH::
|
|
415
|
+
|
|
416
|
+
y x = q^{B_{xy}} \cdot x y.
|
|
417
|
+
|
|
418
|
+
This is a graded `R`-algebra with a natural basis given by monomials
|
|
419
|
+
written in increasing order with respect to some total order on `I`.
|
|
420
|
+
|
|
421
|
+
EXAMPLES::
|
|
422
|
+
|
|
423
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
424
|
+
sage: R.<x,y> = algebras.qCommutingLaurentPolynomials(q)
|
|
425
|
+
|
|
426
|
+
We verify a case of the `q`-binomial theorem using inverse variables::
|
|
427
|
+
|
|
428
|
+
sage: f = (x^-1 + y^-1)^10
|
|
429
|
+
sage: all(f[b] == q_binomial(10, -b.list()[0]) for b in f.support())
|
|
430
|
+
True
|
|
431
|
+
|
|
432
|
+
We now do a computation with a non-standard `B` matrix::
|
|
433
|
+
|
|
434
|
+
sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
|
|
435
|
+
sage: B
|
|
436
|
+
[ 0 1 2]
|
|
437
|
+
[-1 0 3]
|
|
438
|
+
[-2 -3 0]
|
|
439
|
+
sage: q = ZZ['q'].gen()
|
|
440
|
+
sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q, B)
|
|
441
|
+
sage: y^-1 * x
|
|
442
|
+
1/q*x*y^-1
|
|
443
|
+
sage: z^-1 * x
|
|
444
|
+
1/q^2*x*z^-1
|
|
445
|
+
sage: z^-1 * y^-1
|
|
446
|
+
q^3*y^-1*z^-1
|
|
447
|
+
|
|
448
|
+
sage: f = (x + z^-1)^10
|
|
449
|
+
sage: all(f[b] == q_binomial(10, b.list()[0], q^-2) for b in f.support())
|
|
450
|
+
True
|
|
451
|
+
|
|
452
|
+
sage: f = (y^-1 + z^-1)^10
|
|
453
|
+
sage: all(f[b] == q_binomial(10, -b.list()[1], q^3) for b in f.support())
|
|
454
|
+
True
|
|
455
|
+
"""
|
|
456
|
+
def __init__(self, q, B, names):
|
|
457
|
+
r"""
|
|
458
|
+
Initialize ``self``.
|
|
459
|
+
|
|
460
|
+
EXAMPLES::
|
|
461
|
+
|
|
462
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
463
|
+
sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q)
|
|
464
|
+
sage: TestSuite(R).run()
|
|
465
|
+
"""
|
|
466
|
+
indices = FreeModule(ZZ, len(names))
|
|
467
|
+
self._display_group = FreeGroup(names=names, abelian=True, bracket=False)
|
|
468
|
+
qCommutingPolynomials_generic.__init__(self, q, B, indices, names)
|
|
469
|
+
|
|
470
|
+
def _repr_(self):
|
|
471
|
+
r"""
|
|
472
|
+
Return a string representation of ``self``.
|
|
473
|
+
|
|
474
|
+
EXAMPLES::
|
|
475
|
+
|
|
476
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
477
|
+
sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q)
|
|
478
|
+
sage: R
|
|
479
|
+
q-commuting Laurent polynomial ring in x, y, z over Fraction Field of
|
|
480
|
+
Univariate Polynomial Ring in q over Integer Ring with matrix:
|
|
481
|
+
[ 0 1 1]
|
|
482
|
+
[-1 0 1]
|
|
483
|
+
[-1 -1 0]
|
|
484
|
+
"""
|
|
485
|
+
names = ", ".join(self.variable_names())
|
|
486
|
+
return "{}-commuting Laurent polynomial ring in {} over {} with matrix:\n{}".format(self._q, names, self.base_ring(), self._B)
|
|
487
|
+
|
|
488
|
+
def _latex_(self):
|
|
489
|
+
r"""
|
|
490
|
+
Return a latex representation of ``self``.
|
|
491
|
+
|
|
492
|
+
EXAMPLES::
|
|
493
|
+
|
|
494
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
495
|
+
sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q)
|
|
496
|
+
sage: latex(R)
|
|
497
|
+
\mathrm{Frac}(\Bold{Z}[q])[x^{\pm}, y^{\pm}, z^{\pm}]_{q}
|
|
498
|
+
"""
|
|
499
|
+
from sage.misc.latex import latex
|
|
500
|
+
names = ", ".join(r"{}^{{\pm}}".format(v) for v in self.variable_names())
|
|
501
|
+
return "{}[{}]_{{{}}}".format(latex(self.base_ring()), names, self._q)
|
|
502
|
+
|
|
503
|
+
def _repr_term(self, m):
|
|
504
|
+
r"""
|
|
505
|
+
Return a latex representation of the basis element indexed by ``m``.
|
|
506
|
+
|
|
507
|
+
EXAMPLES::
|
|
508
|
+
|
|
509
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
510
|
+
sage: R.<w,x,y,z> = algebras.qCommutingLaurentPolynomials(q)
|
|
511
|
+
sage: R._repr_term(R._indices([1,-2,0,3]))
|
|
512
|
+
'w*x^-2*z^3'
|
|
513
|
+
sage: R._repr_term(R.zero())
|
|
514
|
+
'1'
|
|
515
|
+
sage: q^3 * R.one()
|
|
516
|
+
q^3
|
|
517
|
+
"""
|
|
518
|
+
if not m:
|
|
519
|
+
return '1'
|
|
520
|
+
G = self._display_group
|
|
521
|
+
return repr(G.prod(g ** val for g, val in zip(G.gens(), m) if val != 0))
|
|
522
|
+
|
|
523
|
+
def _latex_term(self, m):
|
|
524
|
+
r"""
|
|
525
|
+
Return a latex representation of the basis element indexed by ``m``.
|
|
526
|
+
|
|
527
|
+
EXAMPLES::
|
|
528
|
+
|
|
529
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
530
|
+
sage: R.<w,x,y,z> = algebras.qCommutingLaurentPolynomials(q)
|
|
531
|
+
sage: R._latex_term(R._indices([1,-2,0,3]))
|
|
532
|
+
w x^{-2} z^{3}
|
|
533
|
+
sage: R._latex_term(R.zero())
|
|
534
|
+
'1'
|
|
535
|
+
sage: latex(q^3 * R.one())
|
|
536
|
+
q^{3}
|
|
537
|
+
"""
|
|
538
|
+
if not m:
|
|
539
|
+
return '1'
|
|
540
|
+
G = self._display_group
|
|
541
|
+
return latex(G.prod(g ** val for g, val in zip(G.gens(), m) if val != 0))
|
|
542
|
+
|
|
543
|
+
@cached_method
|
|
544
|
+
def one_basis(self):
|
|
545
|
+
r"""
|
|
546
|
+
Return the basis index of the element `1`.
|
|
547
|
+
|
|
548
|
+
EXAMPLES::
|
|
549
|
+
|
|
550
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
551
|
+
sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
|
|
552
|
+
sage: R.one_basis()
|
|
553
|
+
1
|
|
554
|
+
"""
|
|
555
|
+
return self._indices.zero()
|
|
556
|
+
|
|
557
|
+
def product_on_basis(self, x, y):
|
|
558
|
+
r"""
|
|
559
|
+
Return the product of two monomials given by ``x`` and ``y``.
|
|
560
|
+
|
|
561
|
+
EXAMPLES::
|
|
562
|
+
|
|
563
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
564
|
+
sage: R.<x,y> = algebras.qCommutingLaurentPolynomials(q)
|
|
565
|
+
sage: R.product_on_basis(x.leading_support(), y.leading_support())
|
|
566
|
+
x*y
|
|
567
|
+
sage: R.product_on_basis(y.leading_support(), x.leading_support())
|
|
568
|
+
q*x*y
|
|
569
|
+
|
|
570
|
+
sage: x * y
|
|
571
|
+
x*y
|
|
572
|
+
sage: y * x
|
|
573
|
+
q*x*y
|
|
574
|
+
sage: y^2 * x
|
|
575
|
+
q^2*x*y^2
|
|
576
|
+
sage: y * x^2
|
|
577
|
+
q^2*x^2*y
|
|
578
|
+
sage: y^-2 * x
|
|
579
|
+
1/q^2*x*y^-2
|
|
580
|
+
sage: y * x^-2
|
|
581
|
+
1/q^2*x^-2*y
|
|
582
|
+
sage: x * y * x
|
|
583
|
+
q*x^2*y
|
|
584
|
+
sage: x * y * ~x
|
|
585
|
+
1/q*y
|
|
586
|
+
sage: y^2 * x^2
|
|
587
|
+
q^4*x^2*y^2
|
|
588
|
+
sage: y^-2 * x^2
|
|
589
|
+
1/q^4*x^2*y^-2
|
|
590
|
+
sage: y^-2 * x^-2
|
|
591
|
+
q^4*x^-2*y^-2
|
|
592
|
+
sage: (x + y)^4
|
|
593
|
+
x^4 + (q^3+q^2+q+1)*x^3*y + (q^4+q^3+2*q^2+q+1)*x^2*y^2 + (q^3+q^2+q+1)*x*y^3 + y^4
|
|
594
|
+
|
|
595
|
+
With a non-standard `B` matrix::
|
|
596
|
+
|
|
597
|
+
sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
|
|
598
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
599
|
+
sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q, B=B)
|
|
600
|
+
sage: x * y
|
|
601
|
+
x*y
|
|
602
|
+
sage: y * x^2
|
|
603
|
+
q^2*x^2*y
|
|
604
|
+
sage: z^2 * x
|
|
605
|
+
q^4*x*z^2
|
|
606
|
+
sage: z^2 * x^3
|
|
607
|
+
q^12*x^3*z^2
|
|
608
|
+
sage: z^2 * y
|
|
609
|
+
q^6*y*z^2
|
|
610
|
+
sage: z^2 * y^3
|
|
611
|
+
q^18*y^3*z^2
|
|
612
|
+
sage: x * y^-1
|
|
613
|
+
x*y^-1
|
|
614
|
+
sage: y * x^-2
|
|
615
|
+
1/q^2*x^-2*y
|
|
616
|
+
sage: z^-2 * x
|
|
617
|
+
1/q^4*x*z^-2
|
|
618
|
+
sage: z^-2 * x^-3
|
|
619
|
+
q^12*x^-3*z^-2
|
|
620
|
+
sage: z^2 * y^-1
|
|
621
|
+
1/q^6*y^-1*z^2
|
|
622
|
+
sage: z^2 * y^-3
|
|
623
|
+
1/q^18*y^-3*z^2
|
|
624
|
+
"""
|
|
625
|
+
# Special case for multiplying by 1
|
|
626
|
+
if x == self.one_basis():
|
|
627
|
+
return self.monomial(y)
|
|
628
|
+
if y == self.one_basis():
|
|
629
|
+
return self.monomial(x)
|
|
630
|
+
|
|
631
|
+
# This could be made more efficient
|
|
632
|
+
B = self._B
|
|
633
|
+
qpow = sum(exp * sum(B[j, i] * y[j] for j in range(i)) for i, exp in enumerate(x) if exp)
|
|
634
|
+
ret = x + y
|
|
635
|
+
ret.set_immutable()
|
|
636
|
+
return self.term(ret, self._q ** qpow)
|
|
637
|
+
|
|
638
|
+
class Element(qCommutingPolynomials_generic.Element):
|
|
639
|
+
def __invert__(self):
|
|
640
|
+
r"""
|
|
641
|
+
Return the (multiplicative) inverse of ``self``.
|
|
642
|
+
|
|
643
|
+
EXAMPLES::
|
|
644
|
+
|
|
645
|
+
sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
|
|
646
|
+
sage: q = ZZ['q'].fraction_field().gen()
|
|
647
|
+
sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q, B=B)
|
|
648
|
+
sage: ~x
|
|
649
|
+
x^-1
|
|
650
|
+
sage: ~(x * y^-2)
|
|
651
|
+
1/q^2*x^-1*y^2
|
|
652
|
+
sage: for a, b in cartesian_product([R.gens(), R.gens()]):
|
|
653
|
+
....: elt = a * b
|
|
654
|
+
....: assert ~elt * elt == R.one(), elt
|
|
655
|
+
....: assert elt * ~elt == R.one(), elt
|
|
656
|
+
sage: elt = x^2 * y^-3 * z
|
|
657
|
+
sage: ~elt
|
|
658
|
+
1/q^11*x^-2*y^3*z^-1
|
|
659
|
+
sage: elt * ~elt == ~elt * elt == R.one()
|
|
660
|
+
True
|
|
661
|
+
"""
|
|
662
|
+
if len(self._monomial_coefficients) == 1:
|
|
663
|
+
P = self.parent()
|
|
664
|
+
B = P._B
|
|
665
|
+
q = P._q
|
|
666
|
+
m, c = next(iter(self._monomial_coefficients.items()))
|
|
667
|
+
ret = -m
|
|
668
|
+
n = len(m)
|
|
669
|
+
qpow = sum(exp * sum(B[j, i] * m[j] for j in range(i+1, n))
|
|
670
|
+
for i, exp in enumerate(m) if exp)
|
|
671
|
+
ret.set_immutable()
|
|
672
|
+
return P.term(ret, ~c * q**-qpow)
|
|
673
|
+
return super().__invert__()
|