passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_combinat/__init__.py +3 -0
- passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
- passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
- passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
- passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
- passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
- sage/algebras/affine_nil_temperley_lieb.py +263 -0
- sage/algebras/all.py +24 -0
- sage/algebras/all__sagemath_combinat.py +35 -0
- sage/algebras/askey_wilson.py +935 -0
- sage/algebras/associated_graded.py +345 -0
- sage/algebras/cellular_basis.py +350 -0
- sage/algebras/cluster_algebra.py +2766 -0
- sage/algebras/down_up_algebra.py +860 -0
- sage/algebras/free_algebra.py +1698 -0
- sage/algebras/free_algebra_element.py +345 -0
- sage/algebras/free_algebra_quotient.py +405 -0
- sage/algebras/free_algebra_quotient_element.py +295 -0
- sage/algebras/free_zinbiel_algebra.py +885 -0
- sage/algebras/hall_algebra.py +783 -0
- sage/algebras/hecke_algebras/all.py +4 -0
- sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
- sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
- sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
- sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
- sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
- sage/algebras/iwahori_hecke_algebra.py +3095 -0
- sage/algebras/jordan_algebra.py +1773 -0
- sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
- sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
- sage/algebras/lie_conformal_algebras/all.py +18 -0
- sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
- sage/algebras/lie_conformal_algebras/examples.py +43 -0
- sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
- sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
- sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
- sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
- sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
- sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
- sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
- sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
- sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
- sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
- sage/algebras/nil_coxeter_algebra.py +191 -0
- sage/algebras/q_commuting_polynomials.py +673 -0
- sage/algebras/q_system.py +608 -0
- sage/algebras/quantum_clifford.py +959 -0
- sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
- sage/algebras/quantum_groups/all.py +9 -0
- sage/algebras/quantum_groups/fock_space.py +2219 -0
- sage/algebras/quantum_groups/q_numbers.py +207 -0
- sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
- sage/algebras/quantum_groups/representations.py +591 -0
- sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
- sage/algebras/quantum_oscillator.py +623 -0
- sage/algebras/quaternion_algebra.py +20 -0
- sage/algebras/quaternion_algebra_element.py +55 -0
- sage/algebras/rational_cherednik_algebra.py +525 -0
- sage/algebras/schur_algebra.py +670 -0
- sage/algebras/shuffle_algebra.py +1011 -0
- sage/algebras/splitting_algebra.py +779 -0
- sage/algebras/tensor_algebra.py +709 -0
- sage/algebras/yangian.py +1082 -0
- sage/algebras/yokonuma_hecke_algebra.py +1018 -0
- sage/all__sagemath_combinat.py +44 -0
- sage/combinat/SJT.py +255 -0
- sage/combinat/affine_permutation.py +2405 -0
- sage/combinat/algebraic_combinatorics.py +55 -0
- sage/combinat/all.py +53 -0
- sage/combinat/all__sagemath_combinat.py +195 -0
- sage/combinat/alternating_sign_matrix.py +2063 -0
- sage/combinat/baxter_permutations.py +346 -0
- sage/combinat/bijectionist.py +3220 -0
- sage/combinat/binary_recurrence_sequences.py +1180 -0
- sage/combinat/blob_algebra.py +685 -0
- sage/combinat/catalog_partitions.py +27 -0
- sage/combinat/chas/all.py +23 -0
- sage/combinat/chas/fsym.py +1180 -0
- sage/combinat/chas/wqsym.py +2601 -0
- sage/combinat/cluster_complex.py +326 -0
- sage/combinat/colored_permutations.py +2039 -0
- sage/combinat/colored_permutations_representations.py +964 -0
- sage/combinat/composition_signed.py +142 -0
- sage/combinat/composition_tableau.py +855 -0
- sage/combinat/constellation.py +1729 -0
- sage/combinat/core.py +751 -0
- sage/combinat/counting.py +12 -0
- sage/combinat/crystals/affine.py +742 -0
- sage/combinat/crystals/affine_factorization.py +518 -0
- sage/combinat/crystals/affinization.py +331 -0
- sage/combinat/crystals/alcove_path.py +2013 -0
- sage/combinat/crystals/all.py +22 -0
- sage/combinat/crystals/bkk_crystals.py +141 -0
- sage/combinat/crystals/catalog.py +115 -0
- sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
- sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
- sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
- sage/combinat/crystals/crystals.py +257 -0
- sage/combinat/crystals/direct_sum.py +260 -0
- sage/combinat/crystals/elementary_crystals.py +1251 -0
- sage/combinat/crystals/fast_crystals.py +441 -0
- sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
- sage/combinat/crystals/generalized_young_walls.py +1076 -0
- sage/combinat/crystals/highest_weight_crystals.py +436 -0
- sage/combinat/crystals/induced_structure.py +695 -0
- sage/combinat/crystals/infinity_crystals.py +730 -0
- sage/combinat/crystals/kac_modules.py +863 -0
- sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
- sage/combinat/crystals/kyoto_path_model.py +497 -0
- sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/letters.pxd +79 -0
- sage/combinat/crystals/letters.pyx +3056 -0
- sage/combinat/crystals/littelmann_path.py +1518 -0
- sage/combinat/crystals/monomial_crystals.py +1262 -0
- sage/combinat/crystals/multisegments.py +462 -0
- sage/combinat/crystals/mv_polytopes.py +467 -0
- sage/combinat/crystals/pbw_crystal.py +511 -0
- sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/pbw_datum.pxd +4 -0
- sage/combinat/crystals/pbw_datum.pyx +487 -0
- sage/combinat/crystals/polyhedral_realization.py +372 -0
- sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/spins.pxd +21 -0
- sage/combinat/crystals/spins.pyx +756 -0
- sage/combinat/crystals/star_crystal.py +290 -0
- sage/combinat/crystals/subcrystal.py +464 -0
- sage/combinat/crystals/tensor_product.py +1177 -0
- sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
- sage/combinat/crystals/tensor_product_element.pxd +35 -0
- sage/combinat/crystals/tensor_product_element.pyx +1870 -0
- sage/combinat/crystals/virtual_crystal.py +420 -0
- sage/combinat/cyclic_sieving_phenomenon.py +204 -0
- sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
- sage/combinat/degree_sequences.pyx +588 -0
- sage/combinat/derangements.py +527 -0
- sage/combinat/descent_algebra.py +1008 -0
- sage/combinat/diagram.py +1551 -0
- sage/combinat/diagram_algebras.py +5886 -0
- sage/combinat/dyck_word.py +4349 -0
- sage/combinat/e_one_star.py +1623 -0
- sage/combinat/enumerated_sets.py +123 -0
- sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
- sage/combinat/fast_vector_partitions.pyx +346 -0
- sage/combinat/fqsym.py +1977 -0
- sage/combinat/free_dendriform_algebra.py +954 -0
- sage/combinat/free_prelie_algebra.py +1141 -0
- sage/combinat/fully_commutative_elements.py +1077 -0
- sage/combinat/fully_packed_loop.py +1523 -0
- sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
- sage/combinat/gray_codes.py +311 -0
- sage/combinat/grossman_larson_algebras.py +667 -0
- sage/combinat/growth.py +4352 -0
- sage/combinat/hall_polynomial.py +188 -0
- sage/combinat/hillman_grassl.py +866 -0
- sage/combinat/integer_matrices.py +329 -0
- sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
- sage/combinat/k_tableau.py +4564 -0
- sage/combinat/kazhdan_lusztig.py +215 -0
- sage/combinat/key_polynomial.py +885 -0
- sage/combinat/knutson_tao_puzzles.py +2286 -0
- sage/combinat/lr_tableau.py +311 -0
- sage/combinat/matrices/all.py +24 -0
- sage/combinat/matrices/hadamard_matrix.py +3790 -0
- sage/combinat/matrices/latin.py +2912 -0
- sage/combinat/misc.py +401 -0
- sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
- sage/combinat/ncsf_qsym/all.py +21 -0
- sage/combinat/ncsf_qsym/combinatorics.py +317 -0
- sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
- sage/combinat/ncsf_qsym/ncsf.py +5637 -0
- sage/combinat/ncsf_qsym/qsym.py +4053 -0
- sage/combinat/ncsf_qsym/tutorial.py +447 -0
- sage/combinat/ncsym/all.py +21 -0
- sage/combinat/ncsym/bases.py +855 -0
- sage/combinat/ncsym/dual.py +593 -0
- sage/combinat/ncsym/ncsym.py +2076 -0
- sage/combinat/necklace.py +551 -0
- sage/combinat/non_decreasing_parking_function.py +634 -0
- sage/combinat/nu_dyck_word.py +1474 -0
- sage/combinat/output.py +861 -0
- sage/combinat/parallelogram_polyomino.py +4326 -0
- sage/combinat/parking_functions.py +1602 -0
- sage/combinat/partition_algebra.py +1998 -0
- sage/combinat/partition_kleshchev.py +1982 -0
- sage/combinat/partition_shifting_algebras.py +584 -0
- sage/combinat/partition_tuple.py +3114 -0
- sage/combinat/path_tableaux/all.py +13 -0
- sage/combinat/path_tableaux/catalog.py +29 -0
- sage/combinat/path_tableaux/dyck_path.py +380 -0
- sage/combinat/path_tableaux/frieze.py +476 -0
- sage/combinat/path_tableaux/path_tableau.py +728 -0
- sage/combinat/path_tableaux/semistandard.py +510 -0
- sage/combinat/perfect_matching.py +779 -0
- sage/combinat/plane_partition.py +3300 -0
- sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
- sage/combinat/q_bernoulli.pyx +128 -0
- sage/combinat/quickref.py +81 -0
- sage/combinat/recognizable_series.py +2051 -0
- sage/combinat/regular_sequence.py +4316 -0
- sage/combinat/regular_sequence_bounded.py +543 -0
- sage/combinat/restricted_growth.py +81 -0
- sage/combinat/ribbon.py +20 -0
- sage/combinat/ribbon_shaped_tableau.py +489 -0
- sage/combinat/ribbon_tableau.py +1180 -0
- sage/combinat/rigged_configurations/all.py +46 -0
- sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
- sage/combinat/rigged_configurations/bij_infinity.py +370 -0
- sage/combinat/rigged_configurations/bij_type_A.py +163 -0
- sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
- sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
- sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
- sage/combinat/rigged_configurations/bij_type_B.py +900 -0
- sage/combinat/rigged_configurations/bij_type_C.py +267 -0
- sage/combinat/rigged_configurations/bij_type_D.py +771 -0
- sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
- sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
- sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
- sage/combinat/rigged_configurations/bijection.py +143 -0
- sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
- sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
- sage/combinat/rigged_configurations/rc_crystal.py +461 -0
- sage/combinat/rigged_configurations/rc_infinity.py +540 -0
- sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
- sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
- sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
- sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
- sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
- sage/combinat/rsk.py +3438 -0
- sage/combinat/schubert_polynomial.py +508 -0
- sage/combinat/set_partition.py +3318 -0
- sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
- sage/combinat/set_partition_iterator.pyx +136 -0
- sage/combinat/set_partition_ordered.py +1590 -0
- sage/combinat/sf/abreu_nigro.py +346 -0
- sage/combinat/sf/all.py +52 -0
- sage/combinat/sf/character.py +576 -0
- sage/combinat/sf/classical.py +319 -0
- sage/combinat/sf/dual.py +996 -0
- sage/combinat/sf/elementary.py +549 -0
- sage/combinat/sf/hall_littlewood.py +1028 -0
- sage/combinat/sf/hecke.py +336 -0
- sage/combinat/sf/homogeneous.py +464 -0
- sage/combinat/sf/jack.py +1428 -0
- sage/combinat/sf/k_dual.py +1458 -0
- sage/combinat/sf/kfpoly.py +447 -0
- sage/combinat/sf/llt.py +789 -0
- sage/combinat/sf/macdonald.py +2019 -0
- sage/combinat/sf/monomial.py +525 -0
- sage/combinat/sf/multiplicative.py +113 -0
- sage/combinat/sf/new_kschur.py +1786 -0
- sage/combinat/sf/ns_macdonald.py +964 -0
- sage/combinat/sf/orthogonal.py +246 -0
- sage/combinat/sf/orthotriang.py +355 -0
- sage/combinat/sf/powersum.py +963 -0
- sage/combinat/sf/schur.py +880 -0
- sage/combinat/sf/sf.py +1653 -0
- sage/combinat/sf/sfa.py +7053 -0
- sage/combinat/sf/symplectic.py +253 -0
- sage/combinat/sf/witt.py +721 -0
- sage/combinat/shifted_primed_tableau.py +2735 -0
- sage/combinat/shuffle.py +830 -0
- sage/combinat/sidon_sets.py +146 -0
- sage/combinat/similarity_class_type.py +1721 -0
- sage/combinat/sine_gordon.py +618 -0
- sage/combinat/six_vertex_model.py +784 -0
- sage/combinat/skew_partition.py +2053 -0
- sage/combinat/skew_tableau.py +2989 -0
- sage/combinat/sloane_functions.py +8935 -0
- sage/combinat/specht_module.py +1403 -0
- sage/combinat/species/all.py +48 -0
- sage/combinat/species/characteristic_species.py +321 -0
- sage/combinat/species/composition_species.py +273 -0
- sage/combinat/species/cycle_species.py +284 -0
- sage/combinat/species/empty_species.py +155 -0
- sage/combinat/species/functorial_composition_species.py +148 -0
- sage/combinat/species/generating_series.py +673 -0
- sage/combinat/species/library.py +148 -0
- sage/combinat/species/linear_order_species.py +169 -0
- sage/combinat/species/misc.py +83 -0
- sage/combinat/species/partition_species.py +290 -0
- sage/combinat/species/permutation_species.py +268 -0
- sage/combinat/species/product_species.py +423 -0
- sage/combinat/species/recursive_species.py +476 -0
- sage/combinat/species/set_species.py +192 -0
- sage/combinat/species/species.py +820 -0
- sage/combinat/species/structure.py +539 -0
- sage/combinat/species/subset_species.py +243 -0
- sage/combinat/species/sum_species.py +225 -0
- sage/combinat/subword.py +564 -0
- sage/combinat/subword_complex.py +2122 -0
- sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
- sage/combinat/subword_complex_c.pyx +119 -0
- sage/combinat/super_tableau.py +821 -0
- sage/combinat/superpartition.py +1154 -0
- sage/combinat/symmetric_group_algebra.py +3774 -0
- sage/combinat/symmetric_group_representations.py +1830 -0
- sage/combinat/t_sequences.py +877 -0
- sage/combinat/tableau.py +9506 -0
- sage/combinat/tableau_residues.py +860 -0
- sage/combinat/tableau_tuple.py +5353 -0
- sage/combinat/tiling.py +2432 -0
- sage/combinat/triangles_FHM.py +777 -0
- sage/combinat/tutorial.py +1857 -0
- sage/combinat/vector_partition.py +337 -0
- sage/combinat/words/abstract_word.py +1722 -0
- sage/combinat/words/all.py +59 -0
- sage/combinat/words/alphabet.py +268 -0
- sage/combinat/words/finite_word.py +7201 -0
- sage/combinat/words/infinite_word.py +113 -0
- sage/combinat/words/lyndon_word.py +652 -0
- sage/combinat/words/morphic.py +351 -0
- sage/combinat/words/morphism.py +3878 -0
- sage/combinat/words/paths.py +2932 -0
- sage/combinat/words/shuffle_product.py +278 -0
- sage/combinat/words/suffix_trees.py +1873 -0
- sage/combinat/words/word.py +769 -0
- sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_datatypes.pxd +4 -0
- sage/combinat/words/word_datatypes.pyx +1067 -0
- sage/combinat/words/word_generators.py +2026 -0
- sage/combinat/words/word_infinite_datatypes.py +1218 -0
- sage/combinat/words/word_options.py +99 -0
- sage/combinat/words/words.py +2396 -0
- sage/data_structures/all__sagemath_combinat.py +1 -0
- sage/databases/all__sagemath_combinat.py +13 -0
- sage/databases/findstat.py +4897 -0
- sage/databases/oeis.py +2058 -0
- sage/databases/sloane.py +393 -0
- sage/dynamics/all__sagemath_combinat.py +14 -0
- sage/dynamics/cellular_automata/all.py +7 -0
- sage/dynamics/cellular_automata/catalog.py +34 -0
- sage/dynamics/cellular_automata/elementary.py +612 -0
- sage/dynamics/cellular_automata/glca.py +477 -0
- sage/dynamics/cellular_automata/solitons.py +1463 -0
- sage/dynamics/finite_dynamical_system.py +1249 -0
- sage/dynamics/finite_dynamical_system_catalog.py +382 -0
- sage/games/all.py +7 -0
- sage/games/hexad.py +704 -0
- sage/games/quantumino.py +591 -0
- sage/games/sudoku.py +889 -0
- sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
- sage/games/sudoku_backtrack.pyx +189 -0
- sage/groups/all__sagemath_combinat.py +1 -0
- sage/groups/indexed_free_group.py +489 -0
- sage/libs/all__sagemath_combinat.py +6 -0
- sage/libs/lrcalc/__init__.py +1 -0
- sage/libs/lrcalc/lrcalc.py +525 -0
- sage/libs/symmetrica/__init__.py +7 -0
- sage/libs/symmetrica/all.py +101 -0
- sage/libs/symmetrica/kostka.pxi +168 -0
- sage/libs/symmetrica/part.pxi +193 -0
- sage/libs/symmetrica/plet.pxi +42 -0
- sage/libs/symmetrica/sab.pxi +196 -0
- sage/libs/symmetrica/sb.pxi +332 -0
- sage/libs/symmetrica/sc.pxi +192 -0
- sage/libs/symmetrica/schur.pxi +956 -0
- sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
- sage/libs/symmetrica/symmetrica.pxi +1172 -0
- sage/libs/symmetrica/symmetrica.pyx +39 -0
- sage/monoids/all.py +13 -0
- sage/monoids/automatic_semigroup.py +1054 -0
- sage/monoids/free_abelian_monoid.py +315 -0
- sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
- sage/monoids/free_abelian_monoid_element.pxd +16 -0
- sage/monoids/free_abelian_monoid_element.pyx +397 -0
- sage/monoids/free_monoid.py +335 -0
- sage/monoids/free_monoid_element.py +431 -0
- sage/monoids/hecke_monoid.py +65 -0
- sage/monoids/string_monoid.py +817 -0
- sage/monoids/string_monoid_element.py +547 -0
- sage/monoids/string_ops.py +143 -0
- sage/monoids/trace_monoid.py +972 -0
- sage/rings/all__sagemath_combinat.py +2 -0
- sage/sat/all.py +4 -0
- sage/sat/boolean_polynomials.py +405 -0
- sage/sat/converters/__init__.py +6 -0
- sage/sat/converters/anf2cnf.py +14 -0
- sage/sat/converters/polybori.py +611 -0
- sage/sat/solvers/__init__.py +5 -0
- sage/sat/solvers/cryptominisat.py +287 -0
- sage/sat/solvers/dimacs.py +783 -0
- sage/sat/solvers/picosat.py +228 -0
- sage/sat/solvers/sat_lp.py +156 -0
- sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,954 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs age.modules
|
|
3
|
+
r"""
|
|
4
|
+
Free dendriform algebras
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Frédéric Chapoton (2017)
|
|
9
|
+
"""
|
|
10
|
+
# ****************************************************************************
|
|
11
|
+
# Copyright (C) 2010-2015 Frédéric Chapoton <chapoton@unistra.fr>,
|
|
12
|
+
#
|
|
13
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
14
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
15
|
+
# the License, or (at your option) any later version.
|
|
16
|
+
# https://www.gnu.org/licenses/
|
|
17
|
+
# ****************************************************************************
|
|
18
|
+
|
|
19
|
+
from sage.categories.hopf_algebras import HopfAlgebras
|
|
20
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
21
|
+
from sage.combinat.words.alphabet import Alphabet
|
|
22
|
+
from sage.combinat.binary_tree import (BinaryTrees, BinaryTree,
|
|
23
|
+
LabelledBinaryTrees,
|
|
24
|
+
LabelledBinaryTree)
|
|
25
|
+
from sage.categories.pushout import (ConstructionFunctor,
|
|
26
|
+
CompositeConstructionFunctor,
|
|
27
|
+
IdentityConstructionFunctor)
|
|
28
|
+
from sage.categories.rings import Rings
|
|
29
|
+
from sage.categories.functor import Functor
|
|
30
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
31
|
+
from sage.misc.cachefunc import cached_method
|
|
32
|
+
from sage.sets.family import Family
|
|
33
|
+
from sage.structure.coerce_exceptions import CoercionException
|
|
34
|
+
from sage.rings.infinity import Infinity
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class FreeDendriformAlgebra(CombinatorialFreeModule):
|
|
38
|
+
r"""
|
|
39
|
+
The free dendriform algebra.
|
|
40
|
+
|
|
41
|
+
Dendriform algebras are associative algebras, where the associative
|
|
42
|
+
product `*` is decomposed as a sum of two binary operations
|
|
43
|
+
|
|
44
|
+
.. MATH::
|
|
45
|
+
|
|
46
|
+
x * y = x \succ y + x \prec y
|
|
47
|
+
|
|
48
|
+
that satisfy the axioms:
|
|
49
|
+
|
|
50
|
+
.. MATH::
|
|
51
|
+
|
|
52
|
+
(x \succ y) \prec z = x \succ (y \prec z),
|
|
53
|
+
|
|
54
|
+
.. MATH::
|
|
55
|
+
|
|
56
|
+
(x \prec y) \prec z = x \prec (y * z).
|
|
57
|
+
|
|
58
|
+
.. MATH::
|
|
59
|
+
|
|
60
|
+
(x * y) \succ z = x \succ (y \succ z).
|
|
61
|
+
|
|
62
|
+
The free Dendriform algebra on a given set `E` has an explicit
|
|
63
|
+
description using (planar) binary trees, just as the free
|
|
64
|
+
associative algebra can be described using words. The underlying
|
|
65
|
+
vector space has a basis indexed by finite binary trees endowed
|
|
66
|
+
with a map from their vertices to `E`. In this basis, the
|
|
67
|
+
associative product of two (decorated) binary trees `S * T` is the
|
|
68
|
+
sum over all possible ways of identifying (glueing) the rightmost path in
|
|
69
|
+
`S` and the leftmost path in `T`.
|
|
70
|
+
|
|
71
|
+
The decomposition of the associative product as the sum of two
|
|
72
|
+
binary operations `\succ` and
|
|
73
|
+
`\prec` is made by separating the terms according to the origin of
|
|
74
|
+
the root vertex. For `x \succ y`, one keeps the terms where the root
|
|
75
|
+
vertex comes from `y`, whereas for `x \prec y` one keeps the terms
|
|
76
|
+
where the root vertex comes from `x`.
|
|
77
|
+
|
|
78
|
+
The free dendriform algebra can also be considered as the free
|
|
79
|
+
algebra over the Dendriform operad.
|
|
80
|
+
|
|
81
|
+
.. NOTE::
|
|
82
|
+
|
|
83
|
+
The usual binary operator `*` is used for the
|
|
84
|
+
associative product.
|
|
85
|
+
|
|
86
|
+
EXAMPLES::
|
|
87
|
+
|
|
88
|
+
sage: F = algebras.FreeDendriform(ZZ, 'xyz')
|
|
89
|
+
sage: x,y,z = F.gens()
|
|
90
|
+
sage: (x * y) * z
|
|
91
|
+
B[x[., y[., z[., .]]]] + B[x[., z[y[., .], .]]] + B[y[x[., .], z[., .]]]
|
|
92
|
+
+ B[z[x[., y[., .]], .]] + B[z[y[x[., .], .], .]]
|
|
93
|
+
|
|
94
|
+
The free dendriform algebra is associative::
|
|
95
|
+
|
|
96
|
+
sage: x * (y * z) == (x * y) * z
|
|
97
|
+
True
|
|
98
|
+
|
|
99
|
+
The associative product decomposes in two parts::
|
|
100
|
+
|
|
101
|
+
sage: x * y == F.prec(x, y) + F.succ(x, y)
|
|
102
|
+
True
|
|
103
|
+
|
|
104
|
+
The axioms hold::
|
|
105
|
+
|
|
106
|
+
sage: F.prec(F.succ(x, y), z) == F.succ(x, F.prec(y, z))
|
|
107
|
+
True
|
|
108
|
+
sage: F.prec(F.prec(x, y), z) == F.prec(x, y * z)
|
|
109
|
+
True
|
|
110
|
+
sage: F.succ(x * y, z) == F.succ(x, F.succ(y, z))
|
|
111
|
+
True
|
|
112
|
+
|
|
113
|
+
When there is only one generator, unlabelled trees are used instead::
|
|
114
|
+
|
|
115
|
+
sage: F1 = algebras.FreeDendriform(QQ)
|
|
116
|
+
sage: w = F1.gen(0); w
|
|
117
|
+
B[[., .]]
|
|
118
|
+
sage: w * w * w
|
|
119
|
+
B[[., [., [., .]]]] + B[[., [[., .], .]]] + B[[[., .], [., .]]]
|
|
120
|
+
+ B[[[., [., .]], .]] + B[[[[., .], .], .]]
|
|
121
|
+
|
|
122
|
+
The set `E` can be infinite::
|
|
123
|
+
|
|
124
|
+
sage: F = algebras.FreeDendriform(QQ, ZZ)
|
|
125
|
+
sage: w = F.gen(1); w
|
|
126
|
+
B[1[., .]]
|
|
127
|
+
sage: x = F.gen(2); x
|
|
128
|
+
B[-1[., .]]
|
|
129
|
+
sage: w*x
|
|
130
|
+
B[-1[1[., .], .]] + B[1[., -1[., .]]]
|
|
131
|
+
|
|
132
|
+
REFERENCES:
|
|
133
|
+
|
|
134
|
+
- [LR1998]_
|
|
135
|
+
"""
|
|
136
|
+
@staticmethod
|
|
137
|
+
def __classcall_private__(cls, R, names=None):
|
|
138
|
+
"""
|
|
139
|
+
Normalize input to ensure a unique representation.
|
|
140
|
+
|
|
141
|
+
EXAMPLES::
|
|
142
|
+
|
|
143
|
+
sage: F1 = algebras.FreeDendriform(QQ, 'xyz')
|
|
144
|
+
sage: F2 = algebras.FreeDendriform(QQ, ['x','y','z'])
|
|
145
|
+
sage: F3 = algebras.FreeDendriform(QQ, Alphabet('xyz'))
|
|
146
|
+
sage: F1 is F2 and F1 is F3
|
|
147
|
+
True
|
|
148
|
+
"""
|
|
149
|
+
if names is not None:
|
|
150
|
+
if ',' in names:
|
|
151
|
+
names = [u for u in names if u != ',']
|
|
152
|
+
names = Alphabet(names)
|
|
153
|
+
|
|
154
|
+
if R not in Rings():
|
|
155
|
+
raise TypeError("argument R must be a ring")
|
|
156
|
+
return super().__classcall__(cls, R, names)
|
|
157
|
+
|
|
158
|
+
def __init__(self, R, names=None):
|
|
159
|
+
"""
|
|
160
|
+
Initialize ``self``.
|
|
161
|
+
|
|
162
|
+
TESTS::
|
|
163
|
+
|
|
164
|
+
sage: A = algebras.FreeDendriform(QQ, '@'); A
|
|
165
|
+
Free Dendriform algebra on one generator ['@'] over Rational Field
|
|
166
|
+
sage: TestSuite(A).run() # long time (3s)
|
|
167
|
+
|
|
168
|
+
sage: F = algebras.FreeDendriform(QQ, 'xy')
|
|
169
|
+
sage: TestSuite(F).run() # long time (3s)
|
|
170
|
+
"""
|
|
171
|
+
if names is None:
|
|
172
|
+
Trees = BinaryTrees()
|
|
173
|
+
key = BinaryTree._sort_key
|
|
174
|
+
self._alphabet = Alphabet(['o'])
|
|
175
|
+
else:
|
|
176
|
+
Trees = LabelledBinaryTrees()
|
|
177
|
+
key = LabelledBinaryTree._sort_key
|
|
178
|
+
self._alphabet = names
|
|
179
|
+
# Here one would need LabelledBinaryTrees(names)
|
|
180
|
+
# so that one can restrict the labels to some fixed set
|
|
181
|
+
|
|
182
|
+
cat = HopfAlgebras(R).WithBasis().Graded().Connected()
|
|
183
|
+
CombinatorialFreeModule.__init__(self, R, Trees,
|
|
184
|
+
latex_prefix='',
|
|
185
|
+
sorting_key=key,
|
|
186
|
+
category=cat)
|
|
187
|
+
|
|
188
|
+
def variable_names(self):
|
|
189
|
+
r"""
|
|
190
|
+
Return the names of the variables.
|
|
191
|
+
|
|
192
|
+
EXAMPLES::
|
|
193
|
+
|
|
194
|
+
sage: R = algebras.FreeDendriform(QQ, 'xy')
|
|
195
|
+
sage: R.variable_names()
|
|
196
|
+
{'x', 'y'}
|
|
197
|
+
"""
|
|
198
|
+
return self._alphabet
|
|
199
|
+
|
|
200
|
+
def _repr_(self):
|
|
201
|
+
"""
|
|
202
|
+
Return the string representation of ``self``.
|
|
203
|
+
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: algebras.FreeDendriform(QQ, '@') # indirect doctest
|
|
207
|
+
Free Dendriform algebra on one generator ['@'] over Rational Field
|
|
208
|
+
"""
|
|
209
|
+
n = self.algebra_generators().cardinality()
|
|
210
|
+
finite = bool(n < Infinity)
|
|
211
|
+
if not finite:
|
|
212
|
+
gen = "generators indexed by"
|
|
213
|
+
elif n == 1:
|
|
214
|
+
gen = "one generator"
|
|
215
|
+
else:
|
|
216
|
+
gen = "{} generators".format(n)
|
|
217
|
+
s = "Free Dendriform algebra on {} {} over {}"
|
|
218
|
+
if finite:
|
|
219
|
+
try:
|
|
220
|
+
return s.format(gen, self._alphabet.list(), self.base_ring())
|
|
221
|
+
except NotImplementedError:
|
|
222
|
+
return s.format(gen, self._alphabet, self.base_ring())
|
|
223
|
+
else:
|
|
224
|
+
return s.format(gen, self._alphabet, self.base_ring())
|
|
225
|
+
|
|
226
|
+
def gen(self, i):
|
|
227
|
+
r"""
|
|
228
|
+
Return the `i`-th generator of the algebra.
|
|
229
|
+
|
|
230
|
+
INPUT:
|
|
231
|
+
|
|
232
|
+
- ``i`` -- integer
|
|
233
|
+
|
|
234
|
+
EXAMPLES::
|
|
235
|
+
|
|
236
|
+
sage: F = algebras.FreeDendriform(ZZ, 'xyz')
|
|
237
|
+
sage: F.gen(0)
|
|
238
|
+
B[x[., .]]
|
|
239
|
+
|
|
240
|
+
sage: F.gen(4)
|
|
241
|
+
Traceback (most recent call last):
|
|
242
|
+
...
|
|
243
|
+
IndexError: argument i (= 4) must be between 0 and 2
|
|
244
|
+
"""
|
|
245
|
+
G = self.algebra_generators()
|
|
246
|
+
n = G.cardinality()
|
|
247
|
+
if i < 0 or not i < n:
|
|
248
|
+
m = "argument i (= {}) must be between 0 and {}".format(i, n - 1)
|
|
249
|
+
raise IndexError(m)
|
|
250
|
+
return G[G.keys().unrank(i)]
|
|
251
|
+
|
|
252
|
+
@cached_method
|
|
253
|
+
def algebra_generators(self):
|
|
254
|
+
r"""
|
|
255
|
+
Return the generators of this algebra.
|
|
256
|
+
|
|
257
|
+
These are the binary trees with just one vertex.
|
|
258
|
+
|
|
259
|
+
EXAMPLES::
|
|
260
|
+
|
|
261
|
+
sage: A = algebras.FreeDendriform(ZZ, 'fgh'); A
|
|
262
|
+
Free Dendriform algebra on 3 generators ['f', 'g', 'h']
|
|
263
|
+
over Integer Ring
|
|
264
|
+
sage: list(A.algebra_generators())
|
|
265
|
+
[B[f[., .]], B[g[., .]], B[h[., .]]]
|
|
266
|
+
|
|
267
|
+
sage: A = algebras.FreeDendriform(QQ, ['x1','x2'])
|
|
268
|
+
sage: list(A.algebra_generators())
|
|
269
|
+
[B[x1[., .]], B[x2[., .]]]
|
|
270
|
+
"""
|
|
271
|
+
Trees = self.basis().keys()
|
|
272
|
+
return Family(self._alphabet, lambda a: self.monomial(Trees([], a)))
|
|
273
|
+
|
|
274
|
+
def change_ring(self, R):
|
|
275
|
+
"""
|
|
276
|
+
Return the free dendriform algebra in the same variables over `R`.
|
|
277
|
+
|
|
278
|
+
INPUT:
|
|
279
|
+
|
|
280
|
+
- ``R`` -- a ring
|
|
281
|
+
|
|
282
|
+
EXAMPLES::
|
|
283
|
+
|
|
284
|
+
sage: A = algebras.FreeDendriform(ZZ, 'fgh')
|
|
285
|
+
sage: A.change_ring(QQ)
|
|
286
|
+
Free Dendriform algebra on 3 generators ['f', 'g', 'h'] over
|
|
287
|
+
Rational Field
|
|
288
|
+
"""
|
|
289
|
+
return FreeDendriformAlgebra(R, names=self.variable_names())
|
|
290
|
+
|
|
291
|
+
def gens(self) -> tuple:
|
|
292
|
+
"""
|
|
293
|
+
Return the generators of ``self`` (as an algebra).
|
|
294
|
+
|
|
295
|
+
EXAMPLES::
|
|
296
|
+
|
|
297
|
+
sage: A = algebras.FreeDendriform(ZZ, 'fgh')
|
|
298
|
+
sage: A.gens()
|
|
299
|
+
(B[f[., .]], B[g[., .]], B[h[., .]])
|
|
300
|
+
"""
|
|
301
|
+
return tuple(self.algebra_generators())
|
|
302
|
+
|
|
303
|
+
def degree_on_basis(self, t):
|
|
304
|
+
"""
|
|
305
|
+
Return the degree of a binary tree in the free Dendriform algebra.
|
|
306
|
+
|
|
307
|
+
This is the number of vertices.
|
|
308
|
+
|
|
309
|
+
EXAMPLES::
|
|
310
|
+
|
|
311
|
+
sage: A = algebras.FreeDendriform(QQ,'@')
|
|
312
|
+
sage: RT = A.basis().keys()
|
|
313
|
+
sage: u = RT([], '@')
|
|
314
|
+
sage: A.degree_on_basis(u.over(u))
|
|
315
|
+
2
|
|
316
|
+
"""
|
|
317
|
+
return t.node_number()
|
|
318
|
+
|
|
319
|
+
def _an_element_(self):
|
|
320
|
+
"""
|
|
321
|
+
Return an element of ``self``.
|
|
322
|
+
|
|
323
|
+
EXAMPLES::
|
|
324
|
+
|
|
325
|
+
sage: A = algebras.FreeDendriform(QQ, 'xy')
|
|
326
|
+
sage: A.an_element()
|
|
327
|
+
B[x[., .]] + 2*B[x[., x[., .]]] + 2*B[x[x[., .], .]]
|
|
328
|
+
"""
|
|
329
|
+
o = self.gen(0)
|
|
330
|
+
return o + 2 * o * o
|
|
331
|
+
|
|
332
|
+
def some_elements(self):
|
|
333
|
+
"""
|
|
334
|
+
Return some elements of the free dendriform algebra.
|
|
335
|
+
|
|
336
|
+
EXAMPLES::
|
|
337
|
+
|
|
338
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
339
|
+
sage: A.some_elements()
|
|
340
|
+
[B[.],
|
|
341
|
+
B[[., .]],
|
|
342
|
+
B[[., [., .]]] + B[[[., .], .]],
|
|
343
|
+
B[.] + B[[., [., .]]] + B[[[., .], .]]]
|
|
344
|
+
|
|
345
|
+
With several generators::
|
|
346
|
+
|
|
347
|
+
sage: A = algebras.FreeDendriform(QQ, 'xy')
|
|
348
|
+
sage: A.some_elements()
|
|
349
|
+
[B[.],
|
|
350
|
+
B[x[., .]],
|
|
351
|
+
B[x[., x[., .]]] + B[x[x[., .], .]],
|
|
352
|
+
B[.] + B[x[., x[., .]]] + B[x[x[., .], .]]]
|
|
353
|
+
"""
|
|
354
|
+
u = self.one()
|
|
355
|
+
o = self.gen(0)
|
|
356
|
+
x = o * o
|
|
357
|
+
y = u + x
|
|
358
|
+
return [u, o, x, y]
|
|
359
|
+
|
|
360
|
+
def one_basis(self):
|
|
361
|
+
"""
|
|
362
|
+
Return the index of the unit.
|
|
363
|
+
|
|
364
|
+
EXAMPLES::
|
|
365
|
+
|
|
366
|
+
sage: A = algebras.FreeDendriform(QQ, '@')
|
|
367
|
+
sage: A.one_basis()
|
|
368
|
+
.
|
|
369
|
+
sage: A = algebras.FreeDendriform(QQ, 'xy')
|
|
370
|
+
sage: A.one_basis()
|
|
371
|
+
.
|
|
372
|
+
"""
|
|
373
|
+
Trees = self.basis().keys()
|
|
374
|
+
return Trees(None)
|
|
375
|
+
|
|
376
|
+
def product_on_basis(self, x, y):
|
|
377
|
+
r"""
|
|
378
|
+
Return the `*` associative dendriform product of two trees.
|
|
379
|
+
|
|
380
|
+
This is the sum over all possible ways of identifying the
|
|
381
|
+
rightmost path in `x` and the leftmost path in `y`. Every term
|
|
382
|
+
corresponds to a shuffle of the vertices on the rightmost path
|
|
383
|
+
in `x` and the vertices on the leftmost path in `y`.
|
|
384
|
+
|
|
385
|
+
.. SEEALSO::
|
|
386
|
+
|
|
387
|
+
- :meth:`succ_product_on_basis`, :meth:`prec_product_on_basis`
|
|
388
|
+
|
|
389
|
+
EXAMPLES::
|
|
390
|
+
|
|
391
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
392
|
+
sage: RT = A.basis().keys()
|
|
393
|
+
sage: x = RT([])
|
|
394
|
+
sage: A.product_on_basis(x, x)
|
|
395
|
+
B[[., [., .]]] + B[[[., .], .]]
|
|
396
|
+
"""
|
|
397
|
+
return self.sum(self.basis()[u] for u in x.dendriform_shuffle(y))
|
|
398
|
+
|
|
399
|
+
def succ_product_on_basis(self, x, y):
|
|
400
|
+
r"""
|
|
401
|
+
Return the `\succ` dendriform product of two trees.
|
|
402
|
+
|
|
403
|
+
This is the sum over all possible ways to identify the rightmost path
|
|
404
|
+
in `x` and the leftmost path in `y`, with the additional condition
|
|
405
|
+
that the root vertex of the result comes from `y`.
|
|
406
|
+
|
|
407
|
+
The usual symbol for this operation is `\succ`.
|
|
408
|
+
|
|
409
|
+
.. SEEALSO::
|
|
410
|
+
|
|
411
|
+
- :meth:`product_on_basis`, :meth:`prec_product_on_basis`
|
|
412
|
+
|
|
413
|
+
EXAMPLES::
|
|
414
|
+
|
|
415
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
416
|
+
sage: RT = A.basis().keys()
|
|
417
|
+
sage: x = RT([])
|
|
418
|
+
sage: A.succ_product_on_basis(x, x)
|
|
419
|
+
B[[[., .], .]]
|
|
420
|
+
|
|
421
|
+
TESTS::
|
|
422
|
+
|
|
423
|
+
sage: u = A.one().support()[0]
|
|
424
|
+
sage: A.succ_product_on_basis(u, u)
|
|
425
|
+
Traceback (most recent call last):
|
|
426
|
+
...
|
|
427
|
+
ValueError: dendriform products | < | and | > | are not defined
|
|
428
|
+
"""
|
|
429
|
+
if y.is_empty():
|
|
430
|
+
if x.is_empty():
|
|
431
|
+
raise ValueError("dendriform products | < | and | > | are "
|
|
432
|
+
"not defined")
|
|
433
|
+
else:
|
|
434
|
+
return []
|
|
435
|
+
if x.is_empty():
|
|
436
|
+
return [y]
|
|
437
|
+
K = self.basis().keys()
|
|
438
|
+
if hasattr(y, 'label'):
|
|
439
|
+
return self.sum(self.basis()[K([u, y[1]], y.label())]
|
|
440
|
+
for u in x.dendriform_shuffle(y[0]))
|
|
441
|
+
|
|
442
|
+
return self.sum(self.basis()[K([u, y[1]])]
|
|
443
|
+
for u in x.dendriform_shuffle(y[0]))
|
|
444
|
+
|
|
445
|
+
@lazy_attribute
|
|
446
|
+
def succ(self):
|
|
447
|
+
r"""
|
|
448
|
+
Return the `\succ` dendriform product.
|
|
449
|
+
|
|
450
|
+
This is the sum over all possible ways of identifying the
|
|
451
|
+
rightmost path in `x` and the leftmost path in `y`, with the
|
|
452
|
+
additional condition that the root vertex of the result comes
|
|
453
|
+
from `y`.
|
|
454
|
+
|
|
455
|
+
The usual symbol for this operation is `\succ`.
|
|
456
|
+
|
|
457
|
+
.. SEEALSO::
|
|
458
|
+
|
|
459
|
+
:meth:`product`, :meth:`prec`, :meth:`over`, :meth:`under`
|
|
460
|
+
|
|
461
|
+
EXAMPLES::
|
|
462
|
+
|
|
463
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
464
|
+
sage: RT = A.basis().keys()
|
|
465
|
+
sage: x = A.gen(0)
|
|
466
|
+
sage: A.succ(x, x)
|
|
467
|
+
B[[[., .], .]]
|
|
468
|
+
"""
|
|
469
|
+
suc = self.succ_product_on_basis
|
|
470
|
+
return self._module_morphism(self._module_morphism(suc, position=0,
|
|
471
|
+
codomain=self),
|
|
472
|
+
position=1)
|
|
473
|
+
|
|
474
|
+
def prec_product_on_basis(self, x, y):
|
|
475
|
+
r"""
|
|
476
|
+
Return the `\prec` dendriform product of two trees.
|
|
477
|
+
|
|
478
|
+
This is the sum over all possible ways of identifying the
|
|
479
|
+
rightmost path in `x` and the leftmost path in `y`, with the
|
|
480
|
+
additional condition that the root vertex of the result comes
|
|
481
|
+
from `x`.
|
|
482
|
+
|
|
483
|
+
The usual symbol for this operation is `\prec`.
|
|
484
|
+
|
|
485
|
+
.. SEEALSO::
|
|
486
|
+
|
|
487
|
+
- :meth:`product_on_basis`, :meth:`succ_product_on_basis`
|
|
488
|
+
|
|
489
|
+
EXAMPLES::
|
|
490
|
+
|
|
491
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
492
|
+
sage: RT = A.basis().keys()
|
|
493
|
+
sage: x = RT([])
|
|
494
|
+
sage: A.prec_product_on_basis(x, x)
|
|
495
|
+
B[[., [., .]]]
|
|
496
|
+
|
|
497
|
+
TESTS::
|
|
498
|
+
|
|
499
|
+
sage: u = A.one().support()[0]
|
|
500
|
+
sage: A.prec_product_on_basis(u, u)
|
|
501
|
+
Traceback (most recent call last):
|
|
502
|
+
...
|
|
503
|
+
ValueError: dendriform products | < | and | > | are not defined
|
|
504
|
+
"""
|
|
505
|
+
if x.is_empty() and y.is_empty():
|
|
506
|
+
raise ValueError("dendriform products | < | and | > | are "
|
|
507
|
+
"not defined")
|
|
508
|
+
if x.is_empty():
|
|
509
|
+
return []
|
|
510
|
+
if y.is_empty():
|
|
511
|
+
return [x]
|
|
512
|
+
K = self.basis().keys()
|
|
513
|
+
if hasattr(y, 'label'):
|
|
514
|
+
return self.sum(self.basis()[K([x[0], u], x.label())]
|
|
515
|
+
for u in x[1].dendriform_shuffle(y))
|
|
516
|
+
|
|
517
|
+
return self.sum(self.basis()[K([x[0], u])]
|
|
518
|
+
for u in x[1].dendriform_shuffle(y))
|
|
519
|
+
|
|
520
|
+
@lazy_attribute
|
|
521
|
+
def prec(self):
|
|
522
|
+
r"""
|
|
523
|
+
Return the `\prec` dendriform product.
|
|
524
|
+
|
|
525
|
+
This is the sum over all possible ways to identify the rightmost path
|
|
526
|
+
in `x` and the leftmost path in `y`, with the additional condition
|
|
527
|
+
that the root vertex of the result comes from `x`.
|
|
528
|
+
|
|
529
|
+
The usual symbol for this operation is `\prec`.
|
|
530
|
+
|
|
531
|
+
.. SEEALSO::
|
|
532
|
+
|
|
533
|
+
:meth:`product`, :meth:`succ`, :meth:`over`, :meth:`under`
|
|
534
|
+
|
|
535
|
+
EXAMPLES::
|
|
536
|
+
|
|
537
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
538
|
+
sage: RT = A.basis().keys()
|
|
539
|
+
sage: x = A.gen(0)
|
|
540
|
+
sage: A.prec(x, x)
|
|
541
|
+
B[[., [., .]]]
|
|
542
|
+
"""
|
|
543
|
+
pre = self.prec_product_on_basis
|
|
544
|
+
return self._module_morphism(self._module_morphism(pre, position=0,
|
|
545
|
+
codomain=self),
|
|
546
|
+
position=1)
|
|
547
|
+
|
|
548
|
+
@lazy_attribute
|
|
549
|
+
def over(self):
|
|
550
|
+
r"""
|
|
551
|
+
Return the over product.
|
|
552
|
+
|
|
553
|
+
The over product `x/y` is the binary tree obtained by
|
|
554
|
+
grafting the root of `y` at the rightmost leaf of `x`.
|
|
555
|
+
|
|
556
|
+
The usual symbol for this operation is `/`.
|
|
557
|
+
|
|
558
|
+
.. SEEALSO::
|
|
559
|
+
|
|
560
|
+
:meth:`product`, :meth:`succ`, :meth:`prec`, :meth:`under`
|
|
561
|
+
|
|
562
|
+
EXAMPLES::
|
|
563
|
+
|
|
564
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
565
|
+
sage: RT = A.basis().keys()
|
|
566
|
+
sage: x = A.gen(0)
|
|
567
|
+
sage: A.over(x, x)
|
|
568
|
+
B[[., [., .]]]
|
|
569
|
+
"""
|
|
570
|
+
def ov(x, y):
|
|
571
|
+
return self._monomial(x.over(y))
|
|
572
|
+
return self._module_morphism(self._module_morphism(ov, position=0,
|
|
573
|
+
codomain=self),
|
|
574
|
+
position=1)
|
|
575
|
+
|
|
576
|
+
@lazy_attribute
|
|
577
|
+
def under(self):
|
|
578
|
+
r"""
|
|
579
|
+
Return the under product.
|
|
580
|
+
|
|
581
|
+
The over product `x \backslash y` is the binary tree obtained by
|
|
582
|
+
grafting the root of `x` at the leftmost leaf of `y`.
|
|
583
|
+
|
|
584
|
+
The usual symbol for this operation is `\backslash`.
|
|
585
|
+
|
|
586
|
+
.. SEEALSO::
|
|
587
|
+
|
|
588
|
+
:meth:`product`, :meth:`succ`, :meth:`prec`, :meth:`over`
|
|
589
|
+
|
|
590
|
+
EXAMPLES::
|
|
591
|
+
|
|
592
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
593
|
+
sage: RT = A.basis().keys()
|
|
594
|
+
sage: x = A.gen(0)
|
|
595
|
+
sage: A.under(x, x)
|
|
596
|
+
B[[[., .], .]]
|
|
597
|
+
"""
|
|
598
|
+
def und(x, y):
|
|
599
|
+
return self._monomial(x.under(y))
|
|
600
|
+
return self._module_morphism(self._module_morphism(und, position=0,
|
|
601
|
+
codomain=self),
|
|
602
|
+
position=1)
|
|
603
|
+
|
|
604
|
+
def coproduct_on_basis(self, x):
|
|
605
|
+
"""
|
|
606
|
+
Return the coproduct of a binary tree.
|
|
607
|
+
|
|
608
|
+
EXAMPLES::
|
|
609
|
+
|
|
610
|
+
sage: A = algebras.FreeDendriform(QQ)
|
|
611
|
+
sage: x = A.gen(0)
|
|
612
|
+
sage: ascii_art(A.coproduct(A.one())) # indirect doctest
|
|
613
|
+
1 # 1
|
|
614
|
+
|
|
615
|
+
sage: ascii_art(A.coproduct(x)) # indirect doctest
|
|
616
|
+
1 # B + B # 1
|
|
617
|
+
o o
|
|
618
|
+
|
|
619
|
+
sage: A = algebras.FreeDendriform(QQ, 'xyz')
|
|
620
|
+
sage: x, y, z = A.gens()
|
|
621
|
+
sage: w = A.under(z,A.over(x,y))
|
|
622
|
+
sage: A.coproduct(z)
|
|
623
|
+
B[.] # B[z[., .]] + B[z[., .]] # B[.]
|
|
624
|
+
sage: A.coproduct(w)
|
|
625
|
+
B[.] # B[x[z[., .], y[., .]]] + B[x[., .]] # B[z[., y[., .]]] +
|
|
626
|
+
B[x[., .]] # B[y[z[., .], .]] + B[x[., y[., .]]] # B[z[., .]] +
|
|
627
|
+
B[x[z[., .], .]] # B[y[., .]] + B[x[z[., .], y[., .]]] # B[.]
|
|
628
|
+
"""
|
|
629
|
+
B = self.basis()
|
|
630
|
+
Trees = B.keys()
|
|
631
|
+
if not x.node_number():
|
|
632
|
+
return self.one().tensor(self.one())
|
|
633
|
+
L, R = list(x)
|
|
634
|
+
try:
|
|
635
|
+
root = x.label()
|
|
636
|
+
except AttributeError:
|
|
637
|
+
root = '@'
|
|
638
|
+
resu = self.one().tensor(self.monomial(x))
|
|
639
|
+
resu += sum(cL * cR *
|
|
640
|
+
self.monomial(Trees([LL[0], RR[0]], root)).tensor(
|
|
641
|
+
self.monomial(LL[1]) * self.monomial(RR[1]))
|
|
642
|
+
for LL, cL in self.coproduct_on_basis(L)
|
|
643
|
+
for RR, cR in self.coproduct_on_basis(R))
|
|
644
|
+
return resu
|
|
645
|
+
|
|
646
|
+
# after this line : coercion
|
|
647
|
+
def _element_constructor_(self, x):
|
|
648
|
+
r"""
|
|
649
|
+
Convert ``x`` into ``self``.
|
|
650
|
+
|
|
651
|
+
EXAMPLES::
|
|
652
|
+
|
|
653
|
+
sage: R = algebras.FreeDendriform(QQ, 'xy')
|
|
654
|
+
sage: x, y = R.gens()
|
|
655
|
+
sage: R(x)
|
|
656
|
+
B[x[., .]]
|
|
657
|
+
sage: R(x+4*y)
|
|
658
|
+
B[x[., .]] + 4*B[y[., .]]
|
|
659
|
+
|
|
660
|
+
sage: Trees = R.basis().keys()
|
|
661
|
+
sage: R(Trees([],'x'))
|
|
662
|
+
B[x[., .]]
|
|
663
|
+
sage: D = algebras.FreeDendriform(ZZ, 'xy')
|
|
664
|
+
sage: X, Y = D.gens()
|
|
665
|
+
sage: R(X-Y).parent()
|
|
666
|
+
Free Dendriform algebra on 2 generators ['x', 'y'] over Rational Field
|
|
667
|
+
"""
|
|
668
|
+
if x in self.basis().keys():
|
|
669
|
+
return self.monomial(x)
|
|
670
|
+
try:
|
|
671
|
+
P = x.parent()
|
|
672
|
+
if isinstance(P, FreeDendriformAlgebra):
|
|
673
|
+
if P is self:
|
|
674
|
+
return x
|
|
675
|
+
return self.element_class(self, x.monomial_coefficients())
|
|
676
|
+
except AttributeError:
|
|
677
|
+
raise TypeError('not able to coerce this in this algebra')
|
|
678
|
+
# Ok, not a dendriform algebra element (or should not be viewed as one).
|
|
679
|
+
|
|
680
|
+
def _coerce_map_from_(self, R):
|
|
681
|
+
r"""
|
|
682
|
+
Return ``True`` if there is a coercion from ``R`` into ``self``
|
|
683
|
+
and ``False`` otherwise.
|
|
684
|
+
|
|
685
|
+
The things that coerce into ``self`` are
|
|
686
|
+
|
|
687
|
+
- free dendriform algebras in a subset of variables of ``self``
|
|
688
|
+
over a base with a coercion map into ``self.base_ring()``
|
|
689
|
+
|
|
690
|
+
EXAMPLES::
|
|
691
|
+
|
|
692
|
+
sage: F = algebras.FreeDendriform(GF(7), 'xyz'); F
|
|
693
|
+
Free Dendriform algebra on 3 generators ['x', 'y', 'z']
|
|
694
|
+
over Finite Field of size 7
|
|
695
|
+
|
|
696
|
+
Elements of the free dendriform algebra canonically coerce in::
|
|
697
|
+
|
|
698
|
+
sage: x, y, z = F.gens()
|
|
699
|
+
sage: F.coerce(x+y) == x+y
|
|
700
|
+
True
|
|
701
|
+
|
|
702
|
+
The free dendriform algebra over `\ZZ` on `x, y, z` coerces in, since
|
|
703
|
+
`\ZZ` coerces to `\GF{7}`::
|
|
704
|
+
|
|
705
|
+
sage: G = algebras.FreeDendriform(ZZ, 'xyz')
|
|
706
|
+
sage: Gx,Gy,Gz = G.gens()
|
|
707
|
+
sage: z = F.coerce(Gx+Gy); z
|
|
708
|
+
B[x[., .]] + B[y[., .]]
|
|
709
|
+
sage: z.parent() is F
|
|
710
|
+
True
|
|
711
|
+
|
|
712
|
+
However, `\GF{7}` does not coerce to `\ZZ`, so the free dendriform
|
|
713
|
+
algebra over `\GF{7}` does not coerce to the one over `\ZZ`::
|
|
714
|
+
|
|
715
|
+
sage: G.coerce(y)
|
|
716
|
+
Traceback (most recent call last):
|
|
717
|
+
...
|
|
718
|
+
TypeError: no canonical coercion from Free Dendriform algebra
|
|
719
|
+
on 3 generators ['x', 'y', 'z'] over Finite Field of size
|
|
720
|
+
7 to Free Dendriform algebra on 3 generators ['x', 'y', 'z']
|
|
721
|
+
over Integer Ring
|
|
722
|
+
|
|
723
|
+
TESTS::
|
|
724
|
+
|
|
725
|
+
sage: F = algebras.FreeDendriform(ZZ, 'xyz')
|
|
726
|
+
sage: G = algebras.FreeDendriform(QQ, 'xyz')
|
|
727
|
+
sage: H = algebras.FreeDendriform(ZZ, 'y')
|
|
728
|
+
sage: F._coerce_map_from_(G)
|
|
729
|
+
False
|
|
730
|
+
sage: G._coerce_map_from_(F)
|
|
731
|
+
True
|
|
732
|
+
sage: F._coerce_map_from_(H)
|
|
733
|
+
True
|
|
734
|
+
sage: F._coerce_map_from_(QQ)
|
|
735
|
+
False
|
|
736
|
+
sage: G._coerce_map_from_(QQ)
|
|
737
|
+
False
|
|
738
|
+
sage: F.has_coerce_map_from(PolynomialRing(ZZ, 3, 'x,y,z'))
|
|
739
|
+
False
|
|
740
|
+
"""
|
|
741
|
+
# free dendriform algebras in a subset of variables
|
|
742
|
+
# over any base that coerces in:
|
|
743
|
+
if isinstance(R, FreeDendriformAlgebra):
|
|
744
|
+
if all(x in self.variable_names() for x in R.variable_names()):
|
|
745
|
+
if self.base_ring().has_coerce_map_from(R.base_ring()):
|
|
746
|
+
return True
|
|
747
|
+
return False
|
|
748
|
+
|
|
749
|
+
def construction(self):
|
|
750
|
+
"""
|
|
751
|
+
Return a pair ``(F, R)``, where ``F`` is a :class:`DendriformFunctor`
|
|
752
|
+
and `R` is a ring, such that ``F(R)`` returns ``self``.
|
|
753
|
+
|
|
754
|
+
EXAMPLES::
|
|
755
|
+
|
|
756
|
+
sage: P = algebras.FreeDendriform(ZZ, 'x,y')
|
|
757
|
+
sage: x,y = P.gens()
|
|
758
|
+
sage: F, R = P.construction()
|
|
759
|
+
sage: F
|
|
760
|
+
Dendriform[x,y]
|
|
761
|
+
sage: R
|
|
762
|
+
Integer Ring
|
|
763
|
+
sage: F(ZZ) is P
|
|
764
|
+
True
|
|
765
|
+
sage: F(QQ)
|
|
766
|
+
Free Dendriform algebra on 2 generators ['x', 'y'] over Rational Field
|
|
767
|
+
"""
|
|
768
|
+
return DendriformFunctor(self.variable_names()), self.base_ring()
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
class DendriformFunctor(ConstructionFunctor):
|
|
772
|
+
"""
|
|
773
|
+
A constructor for dendriform algebras.
|
|
774
|
+
|
|
775
|
+
EXAMPLES::
|
|
776
|
+
|
|
777
|
+
sage: P = algebras.FreeDendriform(ZZ, 'x,y')
|
|
778
|
+
sage: x,y = P.gens()
|
|
779
|
+
sage: F = P.construction()[0]; F
|
|
780
|
+
Dendriform[x,y]
|
|
781
|
+
|
|
782
|
+
sage: A = GF(5)['a,b']
|
|
783
|
+
sage: a, b = A.gens()
|
|
784
|
+
sage: F(A)
|
|
785
|
+
Free Dendriform algebra on 2 generators ['x', 'y']
|
|
786
|
+
over Multivariate Polynomial Ring in a, b over Finite Field of size 5
|
|
787
|
+
|
|
788
|
+
sage: f = A.hom([a+b,a-b],A)
|
|
789
|
+
sage: F(f)
|
|
790
|
+
Generic endomorphism of Free Dendriform algebra on 2 generators ['x', 'y']
|
|
791
|
+
over Multivariate Polynomial Ring in a, b over Finite Field of size 5
|
|
792
|
+
|
|
793
|
+
sage: F(f)(a * F(A)(x))
|
|
794
|
+
(a+b)*B[x[., .]]
|
|
795
|
+
"""
|
|
796
|
+
rank = 9
|
|
797
|
+
|
|
798
|
+
def __init__(self, vars):
|
|
799
|
+
"""
|
|
800
|
+
EXAMPLES::
|
|
801
|
+
|
|
802
|
+
sage: F = sage.combinat.free_dendriform_algebra.DendriformFunctor(['x','y'])
|
|
803
|
+
sage: F
|
|
804
|
+
Dendriform[x,y]
|
|
805
|
+
sage: F(ZZ)
|
|
806
|
+
Free Dendriform algebra on 2 generators ['x', 'y'] over Integer Ring
|
|
807
|
+
"""
|
|
808
|
+
Functor.__init__(self, Rings(), Rings())
|
|
809
|
+
self.vars = vars
|
|
810
|
+
|
|
811
|
+
def _apply_functor(self, R):
|
|
812
|
+
"""
|
|
813
|
+
Apply the functor to an object of ``self``'s domain.
|
|
814
|
+
|
|
815
|
+
EXAMPLES::
|
|
816
|
+
|
|
817
|
+
sage: R = algebras.FreeDendriform(ZZ, 'x,y,z')
|
|
818
|
+
sage: F = R.construction()[0]; F
|
|
819
|
+
Dendriform[x,y,z]
|
|
820
|
+
sage: type(F)
|
|
821
|
+
<class 'sage.combinat.free_dendriform_algebra.DendriformFunctor'>
|
|
822
|
+
sage: F(ZZ) # indirect doctest
|
|
823
|
+
Free Dendriform algebra on 3 generators ['x', 'y', 'z'] over Integer Ring
|
|
824
|
+
"""
|
|
825
|
+
return FreeDendriformAlgebra(R, self.vars)
|
|
826
|
+
|
|
827
|
+
def _apply_functor_to_morphism(self, f):
|
|
828
|
+
"""
|
|
829
|
+
Apply the functor ``self`` to the ring morphism `f`.
|
|
830
|
+
|
|
831
|
+
TESTS::
|
|
832
|
+
|
|
833
|
+
sage: R = algebras.FreeDendriform(ZZ, 'x').construction()[0]
|
|
834
|
+
sage: R(ZZ.hom(GF(3))) # indirect doctest
|
|
835
|
+
Generic morphism:
|
|
836
|
+
From: Free Dendriform algebra on one generator ['x'] over Integer Ring
|
|
837
|
+
To: Free Dendriform algebra on one generator ['x'] over Finite Field of size 3
|
|
838
|
+
"""
|
|
839
|
+
dom = self(f.domain())
|
|
840
|
+
codom = self(f.codomain())
|
|
841
|
+
|
|
842
|
+
def action(x):
|
|
843
|
+
return codom._from_dict({a: f(b)
|
|
844
|
+
for a, b in
|
|
845
|
+
x.monomial_coefficients().items()})
|
|
846
|
+
return dom.module_morphism(function=action, codomain=codom)
|
|
847
|
+
|
|
848
|
+
def __eq__(self, other):
|
|
849
|
+
"""
|
|
850
|
+
EXAMPLES::
|
|
851
|
+
|
|
852
|
+
sage: F = algebras.FreeDendriform(ZZ, 'x,y,z').construction()[0]
|
|
853
|
+
sage: G = algebras.FreeDendriform(QQ, 'x,y,z').construction()[0]
|
|
854
|
+
sage: F == G
|
|
855
|
+
True
|
|
856
|
+
sage: G == loads(dumps(G))
|
|
857
|
+
True
|
|
858
|
+
sage: G = algebras.FreeDendriform(QQ, 'x,y').construction()[0]
|
|
859
|
+
sage: F == G
|
|
860
|
+
False
|
|
861
|
+
"""
|
|
862
|
+
if not isinstance(other, DendriformFunctor):
|
|
863
|
+
return False
|
|
864
|
+
return self.vars == other.vars
|
|
865
|
+
|
|
866
|
+
def __ne__(self, other):
|
|
867
|
+
"""
|
|
868
|
+
EXAMPLES::
|
|
869
|
+
|
|
870
|
+
sage: F = algebras.FreeDendriform(ZZ, 'x,y,z').construction()[0]
|
|
871
|
+
sage: G = algebras.FreeDendriform(QQ, 'x,y,z').construction()[0]
|
|
872
|
+
sage: F != G
|
|
873
|
+
False
|
|
874
|
+
sage: G != loads(dumps(G))
|
|
875
|
+
False
|
|
876
|
+
sage: G = algebras.FreeDendriform(QQ, 'x,y').construction()[0]
|
|
877
|
+
sage: F != G
|
|
878
|
+
True
|
|
879
|
+
"""
|
|
880
|
+
return not (self == other)
|
|
881
|
+
|
|
882
|
+
def __mul__(self, other):
|
|
883
|
+
"""
|
|
884
|
+
If two Dendriform functors are given in a row, form a single Dendriform functor
|
|
885
|
+
with all of the variables.
|
|
886
|
+
|
|
887
|
+
EXAMPLES::
|
|
888
|
+
|
|
889
|
+
sage: F = sage.combinat.free_dendriform_algebra.DendriformFunctor(['x','y'])
|
|
890
|
+
sage: G = sage.combinat.free_dendriform_algebra.DendriformFunctor(['t'])
|
|
891
|
+
sage: G * F
|
|
892
|
+
Dendriform[x,y,t]
|
|
893
|
+
"""
|
|
894
|
+
if isinstance(other, IdentityConstructionFunctor):
|
|
895
|
+
return self
|
|
896
|
+
if isinstance(other, DendriformFunctor):
|
|
897
|
+
if set(self.vars).intersection(other.vars):
|
|
898
|
+
raise CoercionException("Overlapping variables (%s,%s)" %
|
|
899
|
+
(self.vars, other.vars))
|
|
900
|
+
return DendriformFunctor(other.vars + self.vars)
|
|
901
|
+
elif (isinstance(other, CompositeConstructionFunctor) and
|
|
902
|
+
isinstance(other.all[-1], DendriformFunctor)):
|
|
903
|
+
return CompositeConstructionFunctor(other.all[:-1],
|
|
904
|
+
self * other.all[-1])
|
|
905
|
+
else:
|
|
906
|
+
return CompositeConstructionFunctor(other, self)
|
|
907
|
+
|
|
908
|
+
def merge(self, other):
|
|
909
|
+
"""
|
|
910
|
+
Merge ``self`` with another construction functor, or return ``None``.
|
|
911
|
+
|
|
912
|
+
EXAMPLES::
|
|
913
|
+
|
|
914
|
+
sage: F = sage.combinat.free_dendriform_algebra.DendriformFunctor(['x','y'])
|
|
915
|
+
sage: G = sage.combinat.free_dendriform_algebra.DendriformFunctor(['t'])
|
|
916
|
+
sage: F.merge(G)
|
|
917
|
+
Dendriform[x,y,t]
|
|
918
|
+
sage: F.merge(F)
|
|
919
|
+
Dendriform[x,y]
|
|
920
|
+
|
|
921
|
+
Now some actual use cases::
|
|
922
|
+
|
|
923
|
+
sage: R = algebras.FreeDendriform(ZZ, 'x,y,z')
|
|
924
|
+
sage: x,y,z = R.gens()
|
|
925
|
+
sage: 1/2 * x
|
|
926
|
+
1/2*B[x[., .]]
|
|
927
|
+
sage: parent(1/2 * x)
|
|
928
|
+
Free Dendriform algebra on 3 generators ['x', 'y', 'z'] over Rational Field
|
|
929
|
+
|
|
930
|
+
sage: S = algebras.FreeDendriform(QQ, 'zt')
|
|
931
|
+
sage: z,t = S.gens()
|
|
932
|
+
sage: x + t
|
|
933
|
+
B[t[., .]] + B[x[., .]]
|
|
934
|
+
sage: parent(x + t)
|
|
935
|
+
Free Dendriform algebra on 4 generators ['z', 't', 'x', 'y'] over Rational Field
|
|
936
|
+
"""
|
|
937
|
+
if isinstance(other, DendriformFunctor):
|
|
938
|
+
if self.vars == other.vars:
|
|
939
|
+
return self
|
|
940
|
+
ret = list(self.vars)
|
|
941
|
+
cur_vars = set(ret)
|
|
942
|
+
ret.extend(v for v in other.vars if v not in cur_vars)
|
|
943
|
+
return DendriformFunctor(Alphabet(ret))
|
|
944
|
+
|
|
945
|
+
return None
|
|
946
|
+
|
|
947
|
+
def _repr_(self) -> str:
|
|
948
|
+
"""
|
|
949
|
+
TESTS::
|
|
950
|
+
|
|
951
|
+
sage: algebras.FreeDendriform(QQ,'x,y,z,t').construction()[0]
|
|
952
|
+
Dendriform[x,y,z,t]
|
|
953
|
+
"""
|
|
954
|
+
return "Dendriform[%s]" % ','.join(self.vars)
|