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,885 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
"""
|
|
4
|
+
Free Zinbiel Algebras
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2015-09): initial version
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
# Copyright (C) 2015 Travis Scrimshaw <tscrimsh at umn.edu>
|
|
13
|
+
#
|
|
14
|
+
# This program is free software: you can redistribute it and/or modify
|
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
|
16
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
17
|
+
# (at your option) any later version.
|
|
18
|
+
# https://www.gnu.org/licenses/
|
|
19
|
+
# ****************************************************************************
|
|
20
|
+
from sage.misc.cachefunc import cached_method
|
|
21
|
+
from sage.categories.magmatic_algebras import MagmaticAlgebras
|
|
22
|
+
from sage.categories.magmas import Magmas
|
|
23
|
+
from sage.categories.pushout import (ConstructionFunctor,
|
|
24
|
+
CompositeConstructionFunctor,
|
|
25
|
+
IdentityConstructionFunctor)
|
|
26
|
+
from sage.categories.coalgebras_with_basis import CoalgebrasWithBasis
|
|
27
|
+
from sage.categories.rings import Rings
|
|
28
|
+
from sage.categories.functor import Functor
|
|
29
|
+
from sage.categories.sets_cat import Sets
|
|
30
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
31
|
+
from sage.combinat.words.words import Words
|
|
32
|
+
from sage.combinat.words.alphabet import Alphabet
|
|
33
|
+
from sage.sets.family import Family
|
|
34
|
+
from sage.structure.coerce_exceptions import CoercionException
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class FreeZinbielAlgebra(CombinatorialFreeModule):
|
|
38
|
+
r"""
|
|
39
|
+
The free Zinbiel algebra on `n` generators.
|
|
40
|
+
|
|
41
|
+
Let `R` be a ring. A *Zinbiel algebra* is a non-associative
|
|
42
|
+
algebra with multiplication `\circ` that satisfies
|
|
43
|
+
|
|
44
|
+
.. MATH::
|
|
45
|
+
|
|
46
|
+
(a \circ b) \circ c = a \circ (b \circ c) + a \circ (c \circ b).
|
|
47
|
+
|
|
48
|
+
Zinbiel algebras were first introduced by Loday (see [Lod1995]_ and
|
|
49
|
+
[LV2012]_) as the Koszul dual to Leibniz algebras (hence the name
|
|
50
|
+
coined by Lemaire).
|
|
51
|
+
|
|
52
|
+
By default, the convention above is used. The opposite product,
|
|
53
|
+
which satisfy the opposite axiom, can be used instead by setting
|
|
54
|
+
the ``side`` parameter to ``'>'`` instead of the default value ``'<'``.
|
|
55
|
+
|
|
56
|
+
Zinbiel algebras are divided power algebras, in that for
|
|
57
|
+
|
|
58
|
+
.. MATH::
|
|
59
|
+
|
|
60
|
+
x^{\circ n} = \bigl(x \circ (x \circ \cdots \circ( x \circ x) \cdots
|
|
61
|
+
) \bigr)
|
|
62
|
+
|
|
63
|
+
we have
|
|
64
|
+
|
|
65
|
+
.. MATH::
|
|
66
|
+
|
|
67
|
+
x^{\circ m} \circ x^{\circ n} = \binom{n+m-1}{m} x^{n+m}
|
|
68
|
+
|
|
69
|
+
and
|
|
70
|
+
|
|
71
|
+
.. MATH::
|
|
72
|
+
|
|
73
|
+
\underbrace{\bigl( ( x \circ \cdots \circ x \circ (x \circ x) \cdots
|
|
74
|
+
) \bigr)}_{n+1 \text{ times}} = n! x^n.
|
|
75
|
+
|
|
76
|
+
.. NOTE::
|
|
77
|
+
|
|
78
|
+
This implies that Zinbiel algebras are not power associative.
|
|
79
|
+
|
|
80
|
+
To every Zinbiel algebra, we can construct a corresponding commutative
|
|
81
|
+
associative algebra by using the symmetrized product:
|
|
82
|
+
|
|
83
|
+
.. MATH::
|
|
84
|
+
|
|
85
|
+
a * b = a \circ b + b \circ a.
|
|
86
|
+
|
|
87
|
+
The free Zinbiel algebra on `n` generators is isomorphic as `R`-modules
|
|
88
|
+
to the reduced tensor algebra `\bar{T}(R^n)` with the product
|
|
89
|
+
|
|
90
|
+
.. MATH::
|
|
91
|
+
|
|
92
|
+
(x_0 x_1 \cdots x_p) \circ (x_{p+1} x_{p+2} \cdots x_{p+q})
|
|
93
|
+
= \sum_{\sigma \in S_{p,q}} x_0 (x_{\sigma(1)} x_{\sigma(2)}
|
|
94
|
+
\cdots x_{\sigma(p+q)},
|
|
95
|
+
|
|
96
|
+
where `S_{p,q}` is the set of `(p,q)`-shuffles.
|
|
97
|
+
|
|
98
|
+
The free Zinbiel algebra is free as a divided power algebra. Moreover,
|
|
99
|
+
the corresponding commutative algebra is isomorphic to the (non-unital)
|
|
100
|
+
shuffle algebra.
|
|
101
|
+
|
|
102
|
+
INPUT:
|
|
103
|
+
|
|
104
|
+
- ``R`` -- a ring
|
|
105
|
+
- ``n`` -- (optional) the number of generators
|
|
106
|
+
- ``names`` -- the generator names
|
|
107
|
+
|
|
108
|
+
.. WARNING::
|
|
109
|
+
|
|
110
|
+
Currently the basis is indexed by all finite words over the variables,
|
|
111
|
+
including the empty word. This is a slight abuse as it is supposed
|
|
112
|
+
to be indexed by all non-empty words.
|
|
113
|
+
|
|
114
|
+
EXAMPLES:
|
|
115
|
+
|
|
116
|
+
We create the free Zinbiel algebra and check the defining relation::
|
|
117
|
+
|
|
118
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
119
|
+
sage: (x*y)*z
|
|
120
|
+
Z[xyz] + Z[xzy]
|
|
121
|
+
sage: x*(y*z) + x*(z*y)
|
|
122
|
+
Z[xyz] + Z[xzy]
|
|
123
|
+
|
|
124
|
+
We see that the Zinbiel algebra is not associative, not even
|
|
125
|
+
power associative::
|
|
126
|
+
|
|
127
|
+
sage: x*(y*z)
|
|
128
|
+
Z[xyz]
|
|
129
|
+
sage: x*(x*x)
|
|
130
|
+
Z[xxx]
|
|
131
|
+
sage: (x*x)*x
|
|
132
|
+
2*Z[xxx]
|
|
133
|
+
|
|
134
|
+
We verify that it is a divided power algebra::
|
|
135
|
+
|
|
136
|
+
sage: (x*(x*x)) * (x*(x*(x*x)))
|
|
137
|
+
15*Z[xxxxxxx]
|
|
138
|
+
sage: binomial(3+4-1,4)
|
|
139
|
+
15
|
|
140
|
+
sage: (x*(x*(x*x))) * (x*(x*x))
|
|
141
|
+
20*Z[xxxxxxx]
|
|
142
|
+
sage: binomial(3+4-1,3)
|
|
143
|
+
20
|
|
144
|
+
sage: ((x*x)*x)*x
|
|
145
|
+
6*Z[xxxx]
|
|
146
|
+
sage: (((x*x)*x)*x)*x
|
|
147
|
+
24*Z[xxxxx]
|
|
148
|
+
|
|
149
|
+
A few tests with the opposite convention for the product::
|
|
150
|
+
|
|
151
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ, side='>')
|
|
152
|
+
sage: (x*y)*z
|
|
153
|
+
Z[xyz]
|
|
154
|
+
sage: x*(y*z)
|
|
155
|
+
Z[xyz] + Z[yxz]
|
|
156
|
+
|
|
157
|
+
TESTS::
|
|
158
|
+
|
|
159
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
160
|
+
sage: Z.basis().keys()
|
|
161
|
+
Finite words over {'x', 'y', 'z'}
|
|
162
|
+
|
|
163
|
+
sage: A = algebras.FreeZinbiel(QQ,'z2,z3')
|
|
164
|
+
sage: x, y = A.gens()
|
|
165
|
+
sage: x*y
|
|
166
|
+
Z[z2,z3]
|
|
167
|
+
|
|
168
|
+
REFERENCES:
|
|
169
|
+
|
|
170
|
+
- :wikipedia:`Zinbiel_algebra`
|
|
171
|
+
|
|
172
|
+
- [Lod1995]_
|
|
173
|
+
|
|
174
|
+
- [LV2012]_
|
|
175
|
+
"""
|
|
176
|
+
@staticmethod
|
|
177
|
+
def __classcall_private__(cls, R, n=None, names=None,
|
|
178
|
+
prefix=None, side=None):
|
|
179
|
+
"""
|
|
180
|
+
Standardize input to ensure a unique representation.
|
|
181
|
+
|
|
182
|
+
TESTS::
|
|
183
|
+
|
|
184
|
+
sage: Z1.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
185
|
+
sage: Z2.<x,y,z> = algebras.FreeZinbiel(QQ, 3)
|
|
186
|
+
sage: Z3 = algebras.FreeZinbiel(QQ, 3, 'x,y,z')
|
|
187
|
+
sage: Z4.<x,y,z> = algebras.FreeZinbiel(QQ, 'x,y,z')
|
|
188
|
+
sage: Z1 is Z2 and Z1 is Z3 and Z1 is Z4
|
|
189
|
+
True
|
|
190
|
+
|
|
191
|
+
sage: algebras.FreeZinbiel(QQ, ['x', 'y'])
|
|
192
|
+
Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
|
|
193
|
+
sage: algebras.FreeZinbiel(QQ, ('x', 'y'))
|
|
194
|
+
Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
|
|
195
|
+
|
|
196
|
+
sage: Z = algebras.FreeZinbiel(QQ, ZZ)
|
|
197
|
+
"""
|
|
198
|
+
if isinstance(n, (list, tuple)):
|
|
199
|
+
names = n
|
|
200
|
+
n = len(names)
|
|
201
|
+
elif isinstance(n, str):
|
|
202
|
+
names = n.split(',')
|
|
203
|
+
n = len(names)
|
|
204
|
+
elif isinstance(names, str):
|
|
205
|
+
names = names.split(',')
|
|
206
|
+
elif n is None:
|
|
207
|
+
n = len(names)
|
|
208
|
+
if R not in Rings():
|
|
209
|
+
raise TypeError("argument R must be a ring")
|
|
210
|
+
if prefix is None:
|
|
211
|
+
prefix = 'Z'
|
|
212
|
+
if side is None:
|
|
213
|
+
side = '<'
|
|
214
|
+
if side not in ['<', '>']:
|
|
215
|
+
raise ValueError("side must be either '<' or '>'")
|
|
216
|
+
if names is None:
|
|
217
|
+
return super().__classcall__(cls, R, n, None, prefix, side)
|
|
218
|
+
return super().__classcall__(cls, R, n, tuple(names), prefix, side)
|
|
219
|
+
|
|
220
|
+
def __init__(self, R, n, names, prefix, side):
|
|
221
|
+
"""
|
|
222
|
+
Initialize ``self``.
|
|
223
|
+
|
|
224
|
+
EXAMPLES::
|
|
225
|
+
|
|
226
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
227
|
+
sage: TestSuite(Z).run()
|
|
228
|
+
|
|
229
|
+
sage: Z = algebras.FreeZinbiel(QQ, ZZ)
|
|
230
|
+
sage: G = Z.algebra_generators()
|
|
231
|
+
sage: TestSuite(Z).run(elements=[Z.an_element(), G[1], G[1]*G[2]*G[0]])
|
|
232
|
+
|
|
233
|
+
TESTS::
|
|
234
|
+
|
|
235
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(5)
|
|
236
|
+
Traceback (most recent call last):
|
|
237
|
+
...
|
|
238
|
+
TypeError: argument R must be a ring
|
|
239
|
+
|
|
240
|
+
sage: algebras.FreeZinbiel(QQ, ['x', 'y'], prefix='f')
|
|
241
|
+
Free Zinbiel algebra on generators (f[x], f[y]) over Rational Field
|
|
242
|
+
"""
|
|
243
|
+
if R not in Rings():
|
|
244
|
+
raise TypeError("argument R must be a ring")
|
|
245
|
+
if names is None:
|
|
246
|
+
indices = Words(Alphabet(n), infinite=False)
|
|
247
|
+
self._n = None
|
|
248
|
+
else:
|
|
249
|
+
indices = Words(Alphabet(n, names=names), infinite=False)
|
|
250
|
+
self._n = n
|
|
251
|
+
self._side = side
|
|
252
|
+
if side == '<':
|
|
253
|
+
self.product_on_basis = self.product_on_basis_left
|
|
254
|
+
else:
|
|
255
|
+
self.product_on_basis = self.product_on_basis_right
|
|
256
|
+
cat = MagmaticAlgebras(R).WithBasis().Graded()
|
|
257
|
+
cat &= CoalgebrasWithBasis(R)
|
|
258
|
+
CombinatorialFreeModule.__init__(self, R, indices, prefix=prefix,
|
|
259
|
+
category=cat)
|
|
260
|
+
if self._n is not None:
|
|
261
|
+
self._assign_names(names)
|
|
262
|
+
|
|
263
|
+
def _repr_term(self, t):
|
|
264
|
+
"""
|
|
265
|
+
Return a string representation of the basis element indexed by ``t``.
|
|
266
|
+
|
|
267
|
+
EXAMPLES::
|
|
268
|
+
|
|
269
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
270
|
+
sage: Z._repr_term(Z._indices('xyzxxy'))
|
|
271
|
+
'Z[xyzxxy]'
|
|
272
|
+
"""
|
|
273
|
+
return "{!s}[{!s}]".format(self._print_options['prefix'], repr(t)[6:])
|
|
274
|
+
|
|
275
|
+
def _repr_(self):
|
|
276
|
+
"""
|
|
277
|
+
Return a string representation of ``self``.
|
|
278
|
+
|
|
279
|
+
EXAMPLES::
|
|
280
|
+
|
|
281
|
+
sage: Z.<x,y> = algebras.FreeZinbiel(QQ)
|
|
282
|
+
sage: Z
|
|
283
|
+
Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
|
|
284
|
+
|
|
285
|
+
sage: Z = algebras.FreeZinbiel(QQ, ZZ)
|
|
286
|
+
sage: Z
|
|
287
|
+
Free Zinbiel algebra on generators indexed by Integer Ring over Rational Field
|
|
288
|
+
"""
|
|
289
|
+
if self._n is None:
|
|
290
|
+
return "Free Zinbiel algebra on generators indexed by {} over {}".format(
|
|
291
|
+
self._indices.alphabet(), self.base_ring())
|
|
292
|
+
return "Free Zinbiel algebra on generators {} over {}".format(
|
|
293
|
+
self.gens(), self.base_ring())
|
|
294
|
+
|
|
295
|
+
def side(self):
|
|
296
|
+
"""
|
|
297
|
+
Return the choice of side for the product.
|
|
298
|
+
|
|
299
|
+
This is either ``'<'`` or ``'>'``.
|
|
300
|
+
|
|
301
|
+
EXAMPLES::
|
|
302
|
+
|
|
303
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
304
|
+
sage: Z.side()
|
|
305
|
+
'<'
|
|
306
|
+
"""
|
|
307
|
+
return self._side
|
|
308
|
+
|
|
309
|
+
@cached_method
|
|
310
|
+
def algebra_generators(self):
|
|
311
|
+
"""
|
|
312
|
+
Return the algebra generators of ``self``.
|
|
313
|
+
|
|
314
|
+
EXAMPLES::
|
|
315
|
+
|
|
316
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
317
|
+
sage: list(Z.algebra_generators())
|
|
318
|
+
[Z[x], Z[y], Z[z]]
|
|
319
|
+
"""
|
|
320
|
+
if self._n is None:
|
|
321
|
+
A = self._indices.alphabet()
|
|
322
|
+
else:
|
|
323
|
+
A = self.variable_names()
|
|
324
|
+
return Family(A, lambda g: self.monomial(self._indices([g])))
|
|
325
|
+
|
|
326
|
+
def change_ring(self, R):
|
|
327
|
+
"""
|
|
328
|
+
Return the free Zinbiel algebra in the same variables over ``R``.
|
|
329
|
+
|
|
330
|
+
INPUT:
|
|
331
|
+
|
|
332
|
+
- ``R`` -- a ring
|
|
333
|
+
|
|
334
|
+
The same side convention is used for the product.
|
|
335
|
+
|
|
336
|
+
EXAMPLES::
|
|
337
|
+
|
|
338
|
+
sage: A = algebras.FreeZinbiel(ZZ, 'f,g,h')
|
|
339
|
+
sage: A.change_ring(QQ)
|
|
340
|
+
Free Zinbiel algebra on generators (Z[f], Z[g], Z[h])
|
|
341
|
+
over Rational Field
|
|
342
|
+
"""
|
|
343
|
+
A = self.variable_names()
|
|
344
|
+
return FreeZinbielAlgebra(R, n=len(A), names=A, side=self._side)
|
|
345
|
+
|
|
346
|
+
@cached_method
|
|
347
|
+
def gens(self) -> tuple:
|
|
348
|
+
"""
|
|
349
|
+
Return the generators of ``self``.
|
|
350
|
+
|
|
351
|
+
EXAMPLES::
|
|
352
|
+
|
|
353
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
354
|
+
sage: Z.gens()
|
|
355
|
+
(Z[x], Z[y], Z[z])
|
|
356
|
+
"""
|
|
357
|
+
if self._n is None:
|
|
358
|
+
return self.algebra_generators()
|
|
359
|
+
return tuple(self.algebra_generators())
|
|
360
|
+
|
|
361
|
+
def degree_on_basis(self, t):
|
|
362
|
+
"""
|
|
363
|
+
Return the degree of a word in the free Zinbiel algebra.
|
|
364
|
+
|
|
365
|
+
This is the length.
|
|
366
|
+
|
|
367
|
+
EXAMPLES::
|
|
368
|
+
|
|
369
|
+
sage: A = algebras.FreeZinbiel(QQ, 'x,y')
|
|
370
|
+
sage: W = A.basis().keys()
|
|
371
|
+
sage: A.degree_on_basis(W('xy'))
|
|
372
|
+
2
|
|
373
|
+
"""
|
|
374
|
+
return len(t)
|
|
375
|
+
|
|
376
|
+
def product_on_basis_left(self, x, y):
|
|
377
|
+
"""
|
|
378
|
+
Return the product < of the basis elements indexed by ``x`` and ``y``.
|
|
379
|
+
|
|
380
|
+
This is one half of the shuffle product, where the first letter
|
|
381
|
+
comes from the first letter of the first argument.
|
|
382
|
+
|
|
383
|
+
INPUT:
|
|
384
|
+
|
|
385
|
+
- ``x``, ``y`` -- two words
|
|
386
|
+
|
|
387
|
+
EXAMPLES::
|
|
388
|
+
|
|
389
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
|
|
390
|
+
sage: (x*y)*z # indirect doctest
|
|
391
|
+
Z[xyz] + Z[xzy]
|
|
392
|
+
|
|
393
|
+
TESTS::
|
|
394
|
+
|
|
395
|
+
sage: Z.<x,y> = algebras.FreeZinbiel(QQ)
|
|
396
|
+
sage: Z.product_on_basis(Word(), Word('y'))
|
|
397
|
+
Z[y]
|
|
398
|
+
"""
|
|
399
|
+
if not x:
|
|
400
|
+
return self.monomial(y)
|
|
401
|
+
x0 = self._indices([x[0]])
|
|
402
|
+
return self.sum_of_monomials(x0 + sh for sh in x[1:].shuffle(y))
|
|
403
|
+
|
|
404
|
+
def product_on_basis_right(self, x, y):
|
|
405
|
+
"""
|
|
406
|
+
Return the product > of the basis elements indexed by ``x`` and ``y``.
|
|
407
|
+
|
|
408
|
+
This is one half of the shuffle product, where the last letter
|
|
409
|
+
comes from the last letter of the second argument.
|
|
410
|
+
|
|
411
|
+
INPUT:
|
|
412
|
+
|
|
413
|
+
- ``x``, ``y`` -- two words
|
|
414
|
+
|
|
415
|
+
EXAMPLES::
|
|
416
|
+
|
|
417
|
+
sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ, side='>')
|
|
418
|
+
sage: (x*y)*z # indirect doctest
|
|
419
|
+
Z[xyz]
|
|
420
|
+
|
|
421
|
+
TESTS::
|
|
422
|
+
|
|
423
|
+
sage: Z.<x,y> = algebras.FreeZinbiel(QQ, side='>')
|
|
424
|
+
sage: Z.product_on_basis(Word('x'), Word())
|
|
425
|
+
Z[x]
|
|
426
|
+
"""
|
|
427
|
+
if not y:
|
|
428
|
+
return self.monomial(x)
|
|
429
|
+
yf = self._indices([y[-1]])
|
|
430
|
+
return self.sum_of_monomials(sh + yf for sh in x.shuffle(y[:-1]))
|
|
431
|
+
|
|
432
|
+
def coproduct_on_basis(self, w):
|
|
433
|
+
"""
|
|
434
|
+
Return the coproduct of the element of the basis indexed by
|
|
435
|
+
the word ``w``.
|
|
436
|
+
|
|
437
|
+
The coproduct is given by deconcatenation.
|
|
438
|
+
|
|
439
|
+
INPUT:
|
|
440
|
+
|
|
441
|
+
- ``w`` -- a word
|
|
442
|
+
|
|
443
|
+
EXAMPLES::
|
|
444
|
+
|
|
445
|
+
sage: F = algebras.FreeZinbiel(QQ,['a','b'])
|
|
446
|
+
sage: F.coproduct_on_basis(Word('a'))
|
|
447
|
+
Z[] # Z[a] + Z[a] # Z[]
|
|
448
|
+
sage: F.coproduct_on_basis(Word('aba'))
|
|
449
|
+
Z[] # Z[aba] + Z[a] # Z[ba] + Z[ab] # Z[a] + Z[aba] # Z[]
|
|
450
|
+
sage: F.coproduct_on_basis(Word())
|
|
451
|
+
Z[] # Z[]
|
|
452
|
+
|
|
453
|
+
TESTS::
|
|
454
|
+
|
|
455
|
+
sage: F = algebras.FreeZinbiel(QQ,['a','b'])
|
|
456
|
+
sage: S = F.an_element(); S
|
|
457
|
+
Z[] + 2*Z[a] + 3*Z[b] + Z[bab]
|
|
458
|
+
sage: F.coproduct(S)
|
|
459
|
+
Z[] # Z[] + 2*Z[] # Z[a] + 3*Z[] # Z[b] + Z[] # Z[bab] +
|
|
460
|
+
2*Z[a] # Z[] + 3*Z[b] # Z[] + Z[b] # Z[ab] + Z[ba] # Z[b] +
|
|
461
|
+
Z[bab] # Z[]
|
|
462
|
+
"""
|
|
463
|
+
TS = self.tensor_square()
|
|
464
|
+
return TS.sum_of_monomials((w[:i], w[i:]) for i in range(len(w) + 1))
|
|
465
|
+
|
|
466
|
+
def counit(self, S):
|
|
467
|
+
"""
|
|
468
|
+
Return the counit of ``S``.
|
|
469
|
+
|
|
470
|
+
EXAMPLES::
|
|
471
|
+
|
|
472
|
+
sage: F = algebras.FreeZinbiel(QQ,['a','b'])
|
|
473
|
+
sage: S = F.an_element(); S
|
|
474
|
+
Z[] + 2*Z[a] + 3*Z[b] + Z[bab]
|
|
475
|
+
sage: F.counit(S)
|
|
476
|
+
1
|
|
477
|
+
"""
|
|
478
|
+
W = self.basis().keys()
|
|
479
|
+
return S.coefficient(W())
|
|
480
|
+
|
|
481
|
+
def _element_constructor_(self, x):
|
|
482
|
+
r"""
|
|
483
|
+
Convert ``x`` into ``self``.
|
|
484
|
+
|
|
485
|
+
EXAMPLES::
|
|
486
|
+
|
|
487
|
+
sage: R = algebras.FreeZinbiel(QQ, 'x,y')
|
|
488
|
+
sage: x, y = R.gens()
|
|
489
|
+
sage: R(x)
|
|
490
|
+
Z[x]
|
|
491
|
+
sage: R(x+4*y)
|
|
492
|
+
Z[x] + 4*Z[y]
|
|
493
|
+
|
|
494
|
+
sage: W = R.basis().keys()
|
|
495
|
+
sage: R(W('x'))
|
|
496
|
+
Z[x]
|
|
497
|
+
sage: D = algebras.FreeZinbiel(ZZ, 'x,y')
|
|
498
|
+
sage: X, Y = D.gens()
|
|
499
|
+
sage: R(X-Y).parent()
|
|
500
|
+
Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
|
|
501
|
+
|
|
502
|
+
TESTS::
|
|
503
|
+
|
|
504
|
+
sage: R.<x,y> = algebras.FreeZinbiel(QQ)
|
|
505
|
+
sage: S.<z> = algebras.FreeZinbiel(GF(3))
|
|
506
|
+
sage: R(z)
|
|
507
|
+
Traceback (most recent call last):
|
|
508
|
+
...
|
|
509
|
+
TypeError: not able to convert this to this algebra
|
|
510
|
+
"""
|
|
511
|
+
if x in self.basis().keys():
|
|
512
|
+
return self.monomial(x)
|
|
513
|
+
try:
|
|
514
|
+
P = x.parent()
|
|
515
|
+
except AttributeError:
|
|
516
|
+
raise TypeError('not able to convert this to this algebra')
|
|
517
|
+
if isinstance(P, FreeZinbielAlgebra) and self._coerce_map_from_(P):
|
|
518
|
+
if self._side == P._side:
|
|
519
|
+
return self.element_class(self,
|
|
520
|
+
x.monomial_coefficients(copy=False))
|
|
521
|
+
else:
|
|
522
|
+
dic = x.monomial_coefficients(copy=False)
|
|
523
|
+
# canonical isomorphism when switching side
|
|
524
|
+
return self.element_class(self,
|
|
525
|
+
{w.reversal(): cf
|
|
526
|
+
for w, cf in dic.items()})
|
|
527
|
+
else:
|
|
528
|
+
raise TypeError('not able to convert this to this algebra')
|
|
529
|
+
# Ok, not a Zinbiel algebra element (or should not be viewed as one).
|
|
530
|
+
|
|
531
|
+
def _coerce_map_from_(self, R):
|
|
532
|
+
r"""
|
|
533
|
+
Return ``True`` if there is a coercion from ``R`` into ``self``
|
|
534
|
+
and ``False`` otherwise.
|
|
535
|
+
|
|
536
|
+
The things that coerce into ``self`` are
|
|
537
|
+
|
|
538
|
+
- free Zinbiel algebras whose set `E` of labels is
|
|
539
|
+
a subset of the corresponding ``self`` of ``set``, and whose base
|
|
540
|
+
ring has a coercion map into ``self.base_ring()``
|
|
541
|
+
|
|
542
|
+
EXAMPLES::
|
|
543
|
+
|
|
544
|
+
sage: F = algebras.FreeZinbiel(GF(7), 'x,y,z'); F
|
|
545
|
+
Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
|
|
546
|
+
over Finite Field of size 7
|
|
547
|
+
|
|
548
|
+
Elements of the free Zinbiel algebra canonically coerce in::
|
|
549
|
+
|
|
550
|
+
sage: x, y, z = F.gens()
|
|
551
|
+
sage: F.coerce(x+y) == x+y
|
|
552
|
+
True
|
|
553
|
+
|
|
554
|
+
The free Zinbiel algebra over `\ZZ` on `x, y, z` coerces in, since
|
|
555
|
+
`\ZZ` coerces to `\GF{7}`::
|
|
556
|
+
|
|
557
|
+
sage: G = algebras.FreeZinbiel(ZZ, 'x,y,z')
|
|
558
|
+
sage: Gx,Gy,Gz = G.gens()
|
|
559
|
+
sage: z = F.coerce(Gx+Gy); z
|
|
560
|
+
Z[x] + Z[y]
|
|
561
|
+
sage: z.parent() is F
|
|
562
|
+
True
|
|
563
|
+
|
|
564
|
+
However, `\GF{7}` does not coerce to `\ZZ`, so the free Zinbiel
|
|
565
|
+
algebra over `\GF{7}` does not coerce to the one over `\ZZ`::
|
|
566
|
+
|
|
567
|
+
sage: G.coerce(y)
|
|
568
|
+
Traceback (most recent call last):
|
|
569
|
+
...
|
|
570
|
+
TypeError: no canonical coercion from Free Zinbiel algebra on
|
|
571
|
+
generators (Z[x], Z[y], Z[z]) over Finite Field of size 7 to
|
|
572
|
+
Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
|
|
573
|
+
over Integer Ring
|
|
574
|
+
|
|
575
|
+
TESTS::
|
|
576
|
+
|
|
577
|
+
sage: F = algebras.FreeZinbiel(ZZ, 'x,y,z')
|
|
578
|
+
sage: G = algebras.FreeZinbiel(QQ, 'x,y,z')
|
|
579
|
+
sage: H = algebras.FreeZinbiel(ZZ, 'y')
|
|
580
|
+
sage: F._coerce_map_from_(G)
|
|
581
|
+
False
|
|
582
|
+
sage: G._coerce_map_from_(F)
|
|
583
|
+
True
|
|
584
|
+
sage: F._coerce_map_from_(H)
|
|
585
|
+
True
|
|
586
|
+
sage: F._coerce_map_from_(QQ) is None
|
|
587
|
+
True
|
|
588
|
+
sage: G._coerce_map_from_(QQ) is None
|
|
589
|
+
True
|
|
590
|
+
sage: F.has_coerce_map_from(PolynomialRing(ZZ, 3, 'x,y,z'))
|
|
591
|
+
False
|
|
592
|
+
|
|
593
|
+
sage: I = algebras.FreeZinbiel(ZZ, ZZ)
|
|
594
|
+
sage: F._coerce_map_from_(I)
|
|
595
|
+
False
|
|
596
|
+
sage: I._coerce_map_from_(F)
|
|
597
|
+
False
|
|
598
|
+
"""
|
|
599
|
+
# free Zinbiel algebras in a subset of variables
|
|
600
|
+
# over any base that coerces in:
|
|
601
|
+
if isinstance(R, FreeZinbielAlgebra):
|
|
602
|
+
if self._n is None or R._n is None:
|
|
603
|
+
return False
|
|
604
|
+
return (all(x in self.variable_names()
|
|
605
|
+
for x in R.variable_names()) and
|
|
606
|
+
self.base_ring().has_coerce_map_from(R.base_ring()))
|
|
607
|
+
return super()._coerce_map_from_(R)
|
|
608
|
+
|
|
609
|
+
def construction(self):
|
|
610
|
+
"""
|
|
611
|
+
Return a pair ``(F, R)``, where ``F`` is a :class:`ZinbielFunctor`
|
|
612
|
+
and ``R`` is a ring, such that ``F(R)`` returns ``self``.
|
|
613
|
+
|
|
614
|
+
EXAMPLES::
|
|
615
|
+
|
|
616
|
+
sage: P = algebras.FreeZinbiel(ZZ, 'x,y')
|
|
617
|
+
sage: x,y = P.gens()
|
|
618
|
+
sage: F, R = P.construction()
|
|
619
|
+
sage: F
|
|
620
|
+
Zinbiel[x,y]
|
|
621
|
+
sage: R
|
|
622
|
+
Integer Ring
|
|
623
|
+
sage: F(ZZ) is P
|
|
624
|
+
True
|
|
625
|
+
sage: F(QQ)
|
|
626
|
+
Free Zinbiel algebra on generators (Z[x], Z[y]) over Rational Field
|
|
627
|
+
"""
|
|
628
|
+
if self._n is None:
|
|
629
|
+
A = self._indices.alphabet()
|
|
630
|
+
else:
|
|
631
|
+
A = self.variable_names()
|
|
632
|
+
return ZinbielFunctor(A, side=self._side), self.base_ring()
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
class ZinbielFunctor(ConstructionFunctor):
|
|
636
|
+
"""
|
|
637
|
+
A constructor for free Zinbiel algebras.
|
|
638
|
+
|
|
639
|
+
EXAMPLES::
|
|
640
|
+
|
|
641
|
+
sage: P = algebras.FreeZinbiel(ZZ, 'x,y')
|
|
642
|
+
sage: x,y = P.gens()
|
|
643
|
+
sage: F = P.construction()[0]; F
|
|
644
|
+
Zinbiel[x,y]
|
|
645
|
+
|
|
646
|
+
sage: A = GF(5)['a,b']
|
|
647
|
+
sage: a, b = A.gens()
|
|
648
|
+
sage: F(A)
|
|
649
|
+
Free Zinbiel algebra on generators (Z[x], Z[y])
|
|
650
|
+
over Multivariate Polynomial Ring in a, b over Finite Field of size 5
|
|
651
|
+
|
|
652
|
+
sage: f = A.hom([a+b,a-b],A)
|
|
653
|
+
sage: F(f)
|
|
654
|
+
Generic endomorphism of Free Zinbiel algebra on generators (Z[x], Z[y])
|
|
655
|
+
over Multivariate Polynomial Ring in a, b over Finite Field of size 5
|
|
656
|
+
|
|
657
|
+
sage: F(f)(a * F(A)(x))
|
|
658
|
+
(a+b)*Z[x]
|
|
659
|
+
"""
|
|
660
|
+
rank = 9
|
|
661
|
+
|
|
662
|
+
def __init__(self, variables, side):
|
|
663
|
+
"""
|
|
664
|
+
EXAMPLES::
|
|
665
|
+
|
|
666
|
+
sage: functor = sage.algebras.free_zinbiel_algebra.ZinbielFunctor
|
|
667
|
+
sage: F = functor(['x','y'], '<'); F
|
|
668
|
+
Zinbiel[x,y]
|
|
669
|
+
sage: F(ZZ)
|
|
670
|
+
Free Zinbiel algebra on generators (Z[x], Z[y]) over Integer Ring
|
|
671
|
+
"""
|
|
672
|
+
Functor.__init__(self, Rings(), Magmas())
|
|
673
|
+
self.vars = variables
|
|
674
|
+
self._side = side
|
|
675
|
+
self._finite_vars = bool(isinstance(variables, (list, tuple)) or variables in Sets().Finite())
|
|
676
|
+
|
|
677
|
+
def _apply_functor(self, R):
|
|
678
|
+
"""
|
|
679
|
+
Apply the functor to an object of ``self``'s domain.
|
|
680
|
+
|
|
681
|
+
EXAMPLES::
|
|
682
|
+
|
|
683
|
+
sage: R = algebras.FreeZinbiel(ZZ, 'x,y,z')
|
|
684
|
+
sage: F = R.construction()[0]; F
|
|
685
|
+
Zinbiel[x,y,z]
|
|
686
|
+
sage: type(F)
|
|
687
|
+
<class 'sage.algebras.free_zinbiel_algebra.ZinbielFunctor'>
|
|
688
|
+
sage: F(ZZ) # indirect doctest
|
|
689
|
+
Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
|
|
690
|
+
over Integer Ring
|
|
691
|
+
|
|
692
|
+
sage: R = algebras.FreeZinbiel(QQ, ZZ)
|
|
693
|
+
sage: F = R.construction()[0]; F
|
|
694
|
+
Zinbiel[Integer Ring]
|
|
695
|
+
sage: F(ZZ) # indirect doctest
|
|
696
|
+
Free Zinbiel algebra on generators indexed by Integer Ring over Integer Ring
|
|
697
|
+
"""
|
|
698
|
+
if self._finite_vars:
|
|
699
|
+
return FreeZinbielAlgebra(R, len(self.vars), self.vars,
|
|
700
|
+
side=self._side)
|
|
701
|
+
return FreeZinbielAlgebra(R, self.vars, side=self._side)
|
|
702
|
+
|
|
703
|
+
def _apply_functor_to_morphism(self, f):
|
|
704
|
+
"""
|
|
705
|
+
Apply the functor ``self`` to the ring morphism `f`.
|
|
706
|
+
|
|
707
|
+
TESTS::
|
|
708
|
+
|
|
709
|
+
sage: R = algebras.FreeZinbiel(ZZ, 'x').construction()[0]
|
|
710
|
+
sage: R(ZZ.hom(GF(3))) # indirect doctest
|
|
711
|
+
Generic morphism:
|
|
712
|
+
From: Free Zinbiel algebra on generators (Z[x],)
|
|
713
|
+
over Integer Ring
|
|
714
|
+
To: Free Zinbiel algebra on generators (Z[x],)
|
|
715
|
+
over Finite Field of size 3
|
|
716
|
+
"""
|
|
717
|
+
dom = self(f.domain())
|
|
718
|
+
codom = self(f.codomain())
|
|
719
|
+
|
|
720
|
+
def action(x):
|
|
721
|
+
return codom._from_dict({a: f(b)
|
|
722
|
+
for a, b in x.monomial_coefficients(copy=False).items()})
|
|
723
|
+
return dom.module_morphism(function=action, codomain=codom)
|
|
724
|
+
|
|
725
|
+
def __eq__(self, other):
|
|
726
|
+
"""
|
|
727
|
+
EXAMPLES::
|
|
728
|
+
|
|
729
|
+
sage: F = algebras.FreeZinbiel(ZZ, 'x,y,z').construction()[0]
|
|
730
|
+
sage: G = algebras.FreeZinbiel(QQ, 'x,y,z').construction()[0]
|
|
731
|
+
sage: F == G
|
|
732
|
+
True
|
|
733
|
+
sage: G == loads(dumps(G))
|
|
734
|
+
True
|
|
735
|
+
sage: G = algebras.FreeZinbiel(QQ, 'x,y').construction()[0]
|
|
736
|
+
sage: F == G
|
|
737
|
+
False
|
|
738
|
+
"""
|
|
739
|
+
if not isinstance(other, ZinbielFunctor):
|
|
740
|
+
return False
|
|
741
|
+
return self.vars == other.vars and self._side == other._side
|
|
742
|
+
|
|
743
|
+
def __hash__(self):
|
|
744
|
+
"""
|
|
745
|
+
Return the hash of ``self``.
|
|
746
|
+
|
|
747
|
+
EXAMPLES::
|
|
748
|
+
|
|
749
|
+
sage: F = algebras.FreeZinbiel(ZZ, 'x,y,z').construction()[0]
|
|
750
|
+
sage: G = algebras.FreeZinbiel(QQ, 'x,y,z').construction()[0]
|
|
751
|
+
sage: hash(F) == hash(G)
|
|
752
|
+
True
|
|
753
|
+
"""
|
|
754
|
+
return hash(repr(self))
|
|
755
|
+
|
|
756
|
+
def __mul__(self, other):
|
|
757
|
+
"""
|
|
758
|
+
If two Zinbiel functors are given in a row, form a single
|
|
759
|
+
Zinbiel functor with all of the variables.
|
|
760
|
+
|
|
761
|
+
EXAMPLES::
|
|
762
|
+
|
|
763
|
+
sage: from sage.algebras.free_zinbiel_algebra import ZinbielFunctor as functor
|
|
764
|
+
sage: F = functor(['x','y'], '<')
|
|
765
|
+
sage: G = functor(['t'], '<')
|
|
766
|
+
sage: G * F
|
|
767
|
+
Zinbiel[x,y,t]
|
|
768
|
+
|
|
769
|
+
With an infinite generating set::
|
|
770
|
+
|
|
771
|
+
sage: H = functor(ZZ, '<')
|
|
772
|
+
sage: H * G
|
|
773
|
+
Traceback (most recent call last):
|
|
774
|
+
...
|
|
775
|
+
CoercionException: Unable to determine overlap for infinite sets
|
|
776
|
+
sage: G * H
|
|
777
|
+
Traceback (most recent call last):
|
|
778
|
+
...
|
|
779
|
+
CoercionException: Unable to determine overlap for infinite sets
|
|
780
|
+
"""
|
|
781
|
+
if isinstance(other, IdentityConstructionFunctor):
|
|
782
|
+
return self
|
|
783
|
+
if isinstance(other, ZinbielFunctor):
|
|
784
|
+
if self._side != other._side:
|
|
785
|
+
raise CoercionException("detection of distinct sides")
|
|
786
|
+
if not self._finite_vars or not other._finite_vars:
|
|
787
|
+
raise CoercionException("Unable to determine overlap for infinite sets")
|
|
788
|
+
if set(self.vars).intersection(other.vars):
|
|
789
|
+
raise CoercionException("Overlapping variables (%s,%s)" %
|
|
790
|
+
(self.vars, other.vars))
|
|
791
|
+
return ZinbielFunctor(other.vars + self.vars, self._side)
|
|
792
|
+
elif (isinstance(other, CompositeConstructionFunctor) and
|
|
793
|
+
isinstance(other.all[-1], ZinbielFunctor)):
|
|
794
|
+
return CompositeConstructionFunctor(other.all[:-1],
|
|
795
|
+
self * other.all[-1])
|
|
796
|
+
else:
|
|
797
|
+
return CompositeConstructionFunctor(other, self)
|
|
798
|
+
|
|
799
|
+
def merge(self, other):
|
|
800
|
+
"""
|
|
801
|
+
Merge ``self`` with another construction functor, or return ``None``.
|
|
802
|
+
|
|
803
|
+
EXAMPLES::
|
|
804
|
+
|
|
805
|
+
sage: functor = sage.algebras.free_zinbiel_algebra.ZinbielFunctor
|
|
806
|
+
sage: F = functor(['x','y'], '<')
|
|
807
|
+
sage: G = functor(['t'], '<')
|
|
808
|
+
sage: F.merge(G)
|
|
809
|
+
Zinbiel[x,y,t]
|
|
810
|
+
sage: F.merge(F)
|
|
811
|
+
Zinbiel[x,y]
|
|
812
|
+
|
|
813
|
+
With an infinite generating set::
|
|
814
|
+
|
|
815
|
+
sage: H = functor(ZZ, '<')
|
|
816
|
+
sage: H.merge(H) is H
|
|
817
|
+
True
|
|
818
|
+
sage: H.merge(F) is None
|
|
819
|
+
True
|
|
820
|
+
sage: F.merge(H) is None
|
|
821
|
+
True
|
|
822
|
+
|
|
823
|
+
Now some actual use cases::
|
|
824
|
+
|
|
825
|
+
sage: R = algebras.FreeZinbiel(ZZ, 'x,y,z')
|
|
826
|
+
sage: x,y,z = R.gens()
|
|
827
|
+
sage: 1/2 * x
|
|
828
|
+
1/2*Z[x]
|
|
829
|
+
sage: parent(1/2 * x)
|
|
830
|
+
Free Zinbiel algebra on generators (Z[x], Z[y], Z[z])
|
|
831
|
+
over Rational Field
|
|
832
|
+
|
|
833
|
+
sage: S = algebras.FreeZinbiel(QQ, 'z,t')
|
|
834
|
+
sage: z,t = S.gens()
|
|
835
|
+
sage: x * t
|
|
836
|
+
Z[xt]
|
|
837
|
+
sage: parent(x * t)
|
|
838
|
+
Free Zinbiel algebra on generators (Z[z], Z[t], Z[x], Z[y])
|
|
839
|
+
over Rational Field
|
|
840
|
+
|
|
841
|
+
TESTS:
|
|
842
|
+
|
|
843
|
+
Using the other side convention::
|
|
844
|
+
|
|
845
|
+
sage: F = functor(['x','y'], '>')
|
|
846
|
+
sage: G = functor(['t'], '>')
|
|
847
|
+
sage: H = functor(['t'], '<')
|
|
848
|
+
sage: F.merge(G)
|
|
849
|
+
Zinbiel[x,y,t]
|
|
850
|
+
sage: F.merge(H)
|
|
851
|
+
Traceback (most recent call last):
|
|
852
|
+
...
|
|
853
|
+
TypeError: cannot merge free Zinbiel algebras with distinct sides
|
|
854
|
+
"""
|
|
855
|
+
if isinstance(other, ZinbielFunctor):
|
|
856
|
+
if self._side != other._side:
|
|
857
|
+
raise TypeError('cannot merge free Zinbiel algebras '
|
|
858
|
+
'with distinct sides')
|
|
859
|
+
if self.vars == other.vars:
|
|
860
|
+
return self
|
|
861
|
+
|
|
862
|
+
def check(x):
|
|
863
|
+
return isinstance(x, (list, tuple)) or x in Sets().Finite()
|
|
864
|
+
if not check(self.vars) or not check(other.vars):
|
|
865
|
+
return None
|
|
866
|
+
ret = list(self.vars)
|
|
867
|
+
cur_vars = set(ret)
|
|
868
|
+
ret.extend(v for v in other.vars if v not in cur_vars)
|
|
869
|
+
return ZinbielFunctor(ret, self._side)
|
|
870
|
+
|
|
871
|
+
return None
|
|
872
|
+
|
|
873
|
+
def _repr_(self) -> str:
|
|
874
|
+
"""
|
|
875
|
+
TESTS::
|
|
876
|
+
|
|
877
|
+
sage: algebras.FreeZinbiel(QQ,'x,y,z,t').construction()[0]
|
|
878
|
+
Zinbiel[x,y,z,t]
|
|
879
|
+
|
|
880
|
+
sage: algebras.FreeZinbiel(QQ, ZZ).construction()[0]
|
|
881
|
+
Zinbiel[Integer Ring]
|
|
882
|
+
"""
|
|
883
|
+
if self._finite_vars:
|
|
884
|
+
return "Zinbiel[%s]" % ','.join(self.vars)
|
|
885
|
+
return "Zinbiel[{}]".format(self.vars)
|