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,405 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
"""
|
|
4
|
+
Finite dimensional free algebra quotients
|
|
5
|
+
|
|
6
|
+
REMARK:
|
|
7
|
+
|
|
8
|
+
This implementation only works for finite dimensional quotients, since
|
|
9
|
+
a list of basis monomials and the multiplication matrices need to be
|
|
10
|
+
explicitly provided.
|
|
11
|
+
|
|
12
|
+
The homogeneous part of a quotient of a free algebra over a field by a
|
|
13
|
+
finitely generated homogeneous twosided ideal is available in a
|
|
14
|
+
different implementation. See
|
|
15
|
+
:mod:`~sage.algebras.letterplace.free_algebra_letterplace` and
|
|
16
|
+
:mod:`~sage.rings.quotient_ring`.
|
|
17
|
+
|
|
18
|
+
TESTS:
|
|
19
|
+
|
|
20
|
+
::
|
|
21
|
+
|
|
22
|
+
sage: n = 2
|
|
23
|
+
sage: A = FreeAlgebra(QQ,n,'x')
|
|
24
|
+
sage: F = A.monoid()
|
|
25
|
+
sage: i, j = F.gens()
|
|
26
|
+
sage: mons = [F(1), i, j, i*j]
|
|
27
|
+
sage: r = len(mons)
|
|
28
|
+
sage: M = MatrixSpace(QQ,r)
|
|
29
|
+
sage: mats = [M([0,1,0,0, -1,0,0,0, 0,0,0,-1, 0,0,1,0]),
|
|
30
|
+
....: M([0,0,1,0, 0,0,0,1, -1,0,0,0, 0,-1,0,0]) ]
|
|
31
|
+
sage: H2.<i,j> = A.quotient(mons, mats)
|
|
32
|
+
sage: H2 == loads(dumps(H2))
|
|
33
|
+
True
|
|
34
|
+
sage: i == loads(dumps(i))
|
|
35
|
+
True
|
|
36
|
+
|
|
37
|
+
Test comparison by equality::
|
|
38
|
+
|
|
39
|
+
sage: HQ = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0]
|
|
40
|
+
sage: HZ = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)[0]
|
|
41
|
+
sage: HQ == HQ
|
|
42
|
+
True
|
|
43
|
+
sage: HQ == HZ
|
|
44
|
+
False
|
|
45
|
+
sage: HZ == QQ
|
|
46
|
+
False
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
# ****************************************************************************
|
|
50
|
+
# Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu>
|
|
51
|
+
#
|
|
52
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
53
|
+
#
|
|
54
|
+
# This code is distributed in the hope that it will be useful,
|
|
55
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
56
|
+
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
57
|
+
#
|
|
58
|
+
# See the GNU General Public License for more details; the full text
|
|
59
|
+
# is available at:
|
|
60
|
+
#
|
|
61
|
+
# https://www.gnu.org/licenses/
|
|
62
|
+
# ****************************************************************************
|
|
63
|
+
|
|
64
|
+
from sage.algebras.free_algebra import FreeAlgebra_generic
|
|
65
|
+
from sage.algebras.free_algebra_quotient_element import FreeAlgebraQuotientElement
|
|
66
|
+
from sage.categories.algebras import Algebras
|
|
67
|
+
from sage.misc.lazy_import import lazy_import
|
|
68
|
+
from sage.modules.free_module import FreeModule
|
|
69
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
70
|
+
from sage.structure.parent import Parent
|
|
71
|
+
|
|
72
|
+
lazy_import('sage.algebras.letterplace.free_algebra_letterplace', 'FreeAlgebra_letterplace')
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class FreeAlgebraQuotient(UniqueRepresentation, Parent):
|
|
76
|
+
@staticmethod
|
|
77
|
+
def __classcall__(cls, A, mons, mats, names):
|
|
78
|
+
"""
|
|
79
|
+
Used to support unique representation.
|
|
80
|
+
|
|
81
|
+
EXAMPLES::
|
|
82
|
+
|
|
83
|
+
sage: H = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0] # indirect doctest
|
|
84
|
+
sage: H1 = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0]
|
|
85
|
+
sage: H is H1
|
|
86
|
+
True
|
|
87
|
+
"""
|
|
88
|
+
new_mats = []
|
|
89
|
+
for M in mats:
|
|
90
|
+
M = M.parent()(M)
|
|
91
|
+
M.set_immutable()
|
|
92
|
+
new_mats.append(M)
|
|
93
|
+
return super().__classcall__(cls, A, tuple(mons),
|
|
94
|
+
tuple(new_mats), tuple(names))
|
|
95
|
+
|
|
96
|
+
Element = FreeAlgebraQuotientElement
|
|
97
|
+
|
|
98
|
+
def __init__(self, A, mons, mats, names):
|
|
99
|
+
"""
|
|
100
|
+
Return a quotient algebra defined via the action of a free algebra
|
|
101
|
+
A on a (finitely generated) free module.
|
|
102
|
+
|
|
103
|
+
The input for the quotient algebra is a list of monomials (in
|
|
104
|
+
the underlying monoid for A) which form a free basis for the
|
|
105
|
+
module of A, and a list of matrices, which give the action of
|
|
106
|
+
the free generators of A on this monomial basis.
|
|
107
|
+
|
|
108
|
+
EXAMPLES:
|
|
109
|
+
|
|
110
|
+
Quaternion algebra defined in terms of three generators::
|
|
111
|
+
|
|
112
|
+
sage: n = 3
|
|
113
|
+
sage: A = FreeAlgebra(QQ,n,'i')
|
|
114
|
+
sage: F = A.monoid()
|
|
115
|
+
sage: i, j, k = F.gens()
|
|
116
|
+
sage: mons = [F(1), i, j, k]
|
|
117
|
+
sage: M = MatrixSpace(QQ,4)
|
|
118
|
+
sage: mats = [M([0,1,0,0, -1,0,0,0, 0,0,0,-1, 0,0,1,0]),
|
|
119
|
+
....: M([0,0,1,0, 0,0,0,1, -1,0,0,0, 0,-1,0,0]),
|
|
120
|
+
....: M([0,0,0,1, 0,0,-1,0, 0,1,0,0, -1,0,0,0]) ]
|
|
121
|
+
sage: H3.<i,j,k> = FreeAlgebraQuotient(A,mons,mats)
|
|
122
|
+
sage: x = 1 + i + j + k
|
|
123
|
+
sage: x
|
|
124
|
+
1 + i + j + k
|
|
125
|
+
sage: x**128
|
|
126
|
+
-170141183460469231731687303715884105728
|
|
127
|
+
+ 170141183460469231731687303715884105728*i
|
|
128
|
+
+ 170141183460469231731687303715884105728*j
|
|
129
|
+
+ 170141183460469231731687303715884105728*k
|
|
130
|
+
|
|
131
|
+
Same algebra defined in terms of two generators, with some penalty
|
|
132
|
+
on already slow arithmetic.
|
|
133
|
+
|
|
134
|
+
::
|
|
135
|
+
|
|
136
|
+
sage: n = 2
|
|
137
|
+
sage: A = FreeAlgebra(QQ,n,'x')
|
|
138
|
+
sage: F = A.monoid()
|
|
139
|
+
sage: i, j = F.gens()
|
|
140
|
+
sage: mons = [ F(1), i, j, i*j ]
|
|
141
|
+
sage: r = len(mons)
|
|
142
|
+
sage: M = MatrixSpace(QQ,r)
|
|
143
|
+
sage: mats = [M([0,1,0,0, -1,0,0,0, 0,0,0,-1, 0,0,1,0]),
|
|
144
|
+
....: M([0,0,1,0, 0,0,0,1, -1,0,0,0, 0,-1,0,0]) ]
|
|
145
|
+
sage: H2.<i,j> = A.quotient(mons,mats)
|
|
146
|
+
sage: k = i*j
|
|
147
|
+
sage: x = 1 + i + j + k
|
|
148
|
+
sage: x
|
|
149
|
+
1 + i + j + i*j
|
|
150
|
+
sage: x**128
|
|
151
|
+
-170141183460469231731687303715884105728
|
|
152
|
+
+ 170141183460469231731687303715884105728*i
|
|
153
|
+
+ 170141183460469231731687303715884105728*j
|
|
154
|
+
+ 170141183460469231731687303715884105728*i*j
|
|
155
|
+
|
|
156
|
+
TESTS::
|
|
157
|
+
|
|
158
|
+
sage: TestSuite(H2).run()
|
|
159
|
+
"""
|
|
160
|
+
if not isinstance(A, (FreeAlgebra_generic, FreeAlgebra_letterplace)):
|
|
161
|
+
raise TypeError("argument A must be a free algebra")
|
|
162
|
+
R = A.base_ring()
|
|
163
|
+
n = A.ngens()
|
|
164
|
+
assert n == len(mats)
|
|
165
|
+
self.__free_algebra = A
|
|
166
|
+
self.__ngens = n
|
|
167
|
+
self.__dim = len(mons)
|
|
168
|
+
self.__module = FreeModule(R, self.__dim)
|
|
169
|
+
self.__matrix_action = mats
|
|
170
|
+
self.__monomial_basis = mons # elements of free monoid
|
|
171
|
+
Parent.__init__(self, base=R, names=names,
|
|
172
|
+
normalize=True, category=Algebras(R))
|
|
173
|
+
|
|
174
|
+
def _element_constructor_(self, x):
|
|
175
|
+
"""
|
|
176
|
+
EXAMPLES::
|
|
177
|
+
|
|
178
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
179
|
+
sage: H(i) is i
|
|
180
|
+
True
|
|
181
|
+
sage: a = H._element_constructor_(1); a
|
|
182
|
+
1
|
|
183
|
+
sage: a in H
|
|
184
|
+
True
|
|
185
|
+
sage: a = H._element_constructor_([1,2,3,4]); a
|
|
186
|
+
1 + 2*i + 3*j + 4*k
|
|
187
|
+
"""
|
|
188
|
+
return self.element_class(self, x)
|
|
189
|
+
|
|
190
|
+
def _coerce_map_from_(self, S):
|
|
191
|
+
"""
|
|
192
|
+
EXAMPLES::
|
|
193
|
+
|
|
194
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
195
|
+
sage: H._coerce_map_from_(H)
|
|
196
|
+
True
|
|
197
|
+
sage: H._coerce_map_from_(QQ)
|
|
198
|
+
True
|
|
199
|
+
sage: H._coerce_map_from_(GF(7))
|
|
200
|
+
False
|
|
201
|
+
"""
|
|
202
|
+
return S == self or self.__free_algebra.has_coerce_map_from(S)
|
|
203
|
+
|
|
204
|
+
def _repr_(self) -> str:
|
|
205
|
+
"""
|
|
206
|
+
EXAMPLES::
|
|
207
|
+
|
|
208
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
209
|
+
sage: H._repr_()
|
|
210
|
+
"Free algebra quotient on 3 generators ('i', 'j', 'k') and dimension 4 over Rational Field"
|
|
211
|
+
"""
|
|
212
|
+
R = self.base_ring()
|
|
213
|
+
n = self.__ngens
|
|
214
|
+
r = self.__module.dimension()
|
|
215
|
+
x = self.variable_names()
|
|
216
|
+
return f"Free algebra quotient on {n} generators {x} and dimension {r} over {R}"
|
|
217
|
+
|
|
218
|
+
def gen(self, i):
|
|
219
|
+
"""
|
|
220
|
+
Return the ``i``-th generator of the algebra.
|
|
221
|
+
|
|
222
|
+
EXAMPLES::
|
|
223
|
+
|
|
224
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
225
|
+
sage: H.gen(0)
|
|
226
|
+
i
|
|
227
|
+
sage: H.gen(2)
|
|
228
|
+
k
|
|
229
|
+
|
|
230
|
+
An :exc:`IndexError` is raised if an invalid generator is requested::
|
|
231
|
+
|
|
232
|
+
sage: H.gen(3)
|
|
233
|
+
Traceback (most recent call last):
|
|
234
|
+
...
|
|
235
|
+
IndexError: argument i (= 3) must be between 0 and 2
|
|
236
|
+
|
|
237
|
+
Negative indexing into the generators is not supported::
|
|
238
|
+
|
|
239
|
+
sage: H.gen(-1)
|
|
240
|
+
Traceback (most recent call last):
|
|
241
|
+
...
|
|
242
|
+
IndexError: argument i (= -1) must be between 0 and 2
|
|
243
|
+
"""
|
|
244
|
+
n = self.__ngens
|
|
245
|
+
if i < 0 or not i < n:
|
|
246
|
+
raise IndexError(f"argument i (= {i}) must be between 0 and {n - 1}")
|
|
247
|
+
one = self.base_ring().one()
|
|
248
|
+
F = self.__free_algebra.monoid()
|
|
249
|
+
return self.element_class(self, {F.gen(i): one})
|
|
250
|
+
|
|
251
|
+
def gens(self) -> tuple:
|
|
252
|
+
"""
|
|
253
|
+
Return the tuple of generators of ``self``.
|
|
254
|
+
|
|
255
|
+
EXAMPLES::
|
|
256
|
+
|
|
257
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
258
|
+
sage: H.gens()
|
|
259
|
+
(i, j, k)
|
|
260
|
+
"""
|
|
261
|
+
one = self.base_ring().one()
|
|
262
|
+
F = self.__free_algebra.monoid()
|
|
263
|
+
return tuple(self.element_class(self, {F.gen(i): one})
|
|
264
|
+
for i in range(self.__ngens))
|
|
265
|
+
|
|
266
|
+
def ngens(self):
|
|
267
|
+
"""
|
|
268
|
+
Return the number of generators of the algebra.
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].ngens()
|
|
273
|
+
3
|
|
274
|
+
"""
|
|
275
|
+
return self.__ngens
|
|
276
|
+
|
|
277
|
+
def dimension(self):
|
|
278
|
+
"""
|
|
279
|
+
Return the rank of the algebra (as a free module).
|
|
280
|
+
|
|
281
|
+
EXAMPLES::
|
|
282
|
+
|
|
283
|
+
sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].dimension()
|
|
284
|
+
4
|
|
285
|
+
"""
|
|
286
|
+
return self.__dim
|
|
287
|
+
|
|
288
|
+
def matrix_action(self):
|
|
289
|
+
"""
|
|
290
|
+
Return the matrix action used to define the algebra.
|
|
291
|
+
|
|
292
|
+
EXAMPLES::
|
|
293
|
+
|
|
294
|
+
sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].matrix_action()
|
|
295
|
+
(
|
|
296
|
+
[ 0 1 0 0] [ 0 0 1 0] [ 0 0 0 1]
|
|
297
|
+
[-1 0 0 0] [ 0 0 0 1] [ 0 0 -1 0]
|
|
298
|
+
[ 0 0 0 -1] [-1 0 0 0] [ 0 1 0 0]
|
|
299
|
+
[ 0 0 1 0], [ 0 -1 0 0], [-1 0 0 0]
|
|
300
|
+
)
|
|
301
|
+
"""
|
|
302
|
+
return self.__matrix_action
|
|
303
|
+
|
|
304
|
+
def monomial_basis(self):
|
|
305
|
+
"""
|
|
306
|
+
The free monoid of generators of the algebra as elements of a free
|
|
307
|
+
monoid.
|
|
308
|
+
|
|
309
|
+
EXAMPLES::
|
|
310
|
+
|
|
311
|
+
sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].monomial_basis()
|
|
312
|
+
(1, i0, i1, i2)
|
|
313
|
+
"""
|
|
314
|
+
return self.__monomial_basis
|
|
315
|
+
|
|
316
|
+
def rank(self):
|
|
317
|
+
"""
|
|
318
|
+
Return the rank of the algebra (as a free module).
|
|
319
|
+
|
|
320
|
+
EXAMPLES::
|
|
321
|
+
|
|
322
|
+
sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].rank()
|
|
323
|
+
4
|
|
324
|
+
"""
|
|
325
|
+
return self.__dim
|
|
326
|
+
|
|
327
|
+
def module(self):
|
|
328
|
+
"""
|
|
329
|
+
Return the free module of the algebra.
|
|
330
|
+
|
|
331
|
+
EXAMPLES::
|
|
332
|
+
|
|
333
|
+
sage: H = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0]; H
|
|
334
|
+
Free algebra quotient on 3 generators ('i', 'j', 'k') and dimension 4 over Rational Field
|
|
335
|
+
sage: H.module()
|
|
336
|
+
Vector space of dimension 4 over Rational Field
|
|
337
|
+
"""
|
|
338
|
+
return self.__module
|
|
339
|
+
|
|
340
|
+
def monoid(self):
|
|
341
|
+
"""
|
|
342
|
+
Return the free monoid of generators of the algebra.
|
|
343
|
+
|
|
344
|
+
EXAMPLES::
|
|
345
|
+
|
|
346
|
+
sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].monoid()
|
|
347
|
+
Free monoid on 3 generators (i0, i1, i2)
|
|
348
|
+
"""
|
|
349
|
+
return self.__free_algebra.monoid()
|
|
350
|
+
|
|
351
|
+
def free_algebra(self):
|
|
352
|
+
"""
|
|
353
|
+
Return the free algebra generating the algebra.
|
|
354
|
+
|
|
355
|
+
EXAMPLES::
|
|
356
|
+
|
|
357
|
+
sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].free_algebra()
|
|
358
|
+
Free Algebra on 3 generators (i0, i1, i2) over Rational Field
|
|
359
|
+
"""
|
|
360
|
+
return self.__free_algebra
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def hamilton_quatalg(R):
|
|
364
|
+
"""
|
|
365
|
+
Hamilton quaternion algebra over the commutative ring ``R``,
|
|
366
|
+
constructed as a free algebra quotient.
|
|
367
|
+
|
|
368
|
+
INPUT:
|
|
369
|
+
|
|
370
|
+
- ``R`` -- a commutative ring
|
|
371
|
+
|
|
372
|
+
OUTPUT:
|
|
373
|
+
|
|
374
|
+
- ``Q`` -- quaternion algebra
|
|
375
|
+
- ``gens`` -- generators for ``Q``
|
|
376
|
+
|
|
377
|
+
EXAMPLES::
|
|
378
|
+
|
|
379
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)
|
|
380
|
+
sage: H
|
|
381
|
+
Free algebra quotient on 3 generators ('i', 'j', 'k') and dimension 4
|
|
382
|
+
over Integer Ring
|
|
383
|
+
sage: i^2
|
|
384
|
+
-1
|
|
385
|
+
sage: i in H
|
|
386
|
+
True
|
|
387
|
+
|
|
388
|
+
Note that there is another vastly more efficient model for
|
|
389
|
+
quaternion algebras in Sage; the one here is mainly for testing
|
|
390
|
+
purposes::
|
|
391
|
+
|
|
392
|
+
sage: R.<i,j,k> = QuaternionAlgebra(QQ,-1,-1) # much fast than the above # needs sage.libs.singular
|
|
393
|
+
"""
|
|
394
|
+
from sage.algebras.free_algebra import FreeAlgebra
|
|
395
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
396
|
+
A = FreeAlgebra(R, 3, 'i')
|
|
397
|
+
F = A.monoid()
|
|
398
|
+
i, j, k = F.gens()
|
|
399
|
+
mons = [F.one(), i, j, k]
|
|
400
|
+
M = MatrixSpace(R, 4)
|
|
401
|
+
mats = [M([0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0]),
|
|
402
|
+
M([0, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, 0, 0]),
|
|
403
|
+
M([0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0])]
|
|
404
|
+
H3 = FreeAlgebraQuotient(A, mons, mats, names=('i', 'j', 'k'))
|
|
405
|
+
return H3, H3.gens()
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
"""
|
|
4
|
+
Free algebra quotient elements
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
- William Stein (2011-11-19): improved doctest coverage to 100%
|
|
8
|
+
- David Kohel (2005-09): initial version
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
#*****************************************************************************
|
|
12
|
+
# Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu>
|
|
13
|
+
#
|
|
14
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
15
|
+
#
|
|
16
|
+
# This code is distributed in the hope that it will be useful,
|
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
18
|
+
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
19
|
+
#
|
|
20
|
+
# See the GNU General Public License for more details; the full text
|
|
21
|
+
# is available at:
|
|
22
|
+
#
|
|
23
|
+
# http://www.gnu.org/licenses/
|
|
24
|
+
#*****************************************************************************
|
|
25
|
+
|
|
26
|
+
from sage.misc.repr import repr_lincomb
|
|
27
|
+
from sage.structure.element import RingElement, AlgebraElement
|
|
28
|
+
from sage.structure.parent_gens import localvars
|
|
29
|
+
from sage.structure.richcmp import richcmp
|
|
30
|
+
from sage.rings.integer import Integer
|
|
31
|
+
from sage.modules.free_module_element import FreeModuleElement
|
|
32
|
+
from sage.monoids.free_monoid_element import FreeMonoidElement
|
|
33
|
+
from sage.algebras.free_algebra_element import FreeAlgebraElement
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def is_FreeAlgebraQuotientElement(x):
|
|
37
|
+
"""
|
|
38
|
+
EXAMPLES::
|
|
39
|
+
|
|
40
|
+
sage: from sage.algebras.free_algebra_quotient import hamilton_quatalg
|
|
41
|
+
sage: from sage.algebras.free_algebra_quotient_element import is_FreeAlgebraQuotientElement
|
|
42
|
+
sage: H, (i,j,k) = hamilton_quatalg(QQ)
|
|
43
|
+
sage: is_FreeAlgebraQuotientElement(i)
|
|
44
|
+
doctest:warning...
|
|
45
|
+
DeprecationWarning: The function is_FreeAlgebraQuotientElement is deprecated;
|
|
46
|
+
use 'isinstance(..., FreeAlgebraQuotientElement)' instead.
|
|
47
|
+
See https://github.com/sagemath/sage/issues/38184 for details.
|
|
48
|
+
True
|
|
49
|
+
|
|
50
|
+
Of course this is testing the data type::
|
|
51
|
+
|
|
52
|
+
sage: is_FreeAlgebraQuotientElement(1)
|
|
53
|
+
False
|
|
54
|
+
sage: is_FreeAlgebraQuotientElement(H(1))
|
|
55
|
+
True
|
|
56
|
+
"""
|
|
57
|
+
from sage.misc.superseded import deprecation
|
|
58
|
+
deprecation(38184,
|
|
59
|
+
"The function is_FreeAlgebraQuotientElement is deprecated; "
|
|
60
|
+
"use 'isinstance(..., FreeAlgebraQuotientElement)' instead.")
|
|
61
|
+
return isinstance(x, FreeAlgebraQuotientElement)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class FreeAlgebraQuotientElement(AlgebraElement):
|
|
65
|
+
def __init__(self, A, x):
|
|
66
|
+
"""
|
|
67
|
+
Create the element x of the FreeAlgebraQuotient A.
|
|
68
|
+
|
|
69
|
+
EXAMPLES::
|
|
70
|
+
|
|
71
|
+
sage: from sage.algebras.free_algebra_quotient import FreeAlgebraQuotientElement
|
|
72
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)
|
|
73
|
+
sage: FreeAlgebraQuotientElement(H, i)
|
|
74
|
+
i
|
|
75
|
+
sage: a = FreeAlgebraQuotientElement(H, 1); a
|
|
76
|
+
1
|
|
77
|
+
sage: a in H
|
|
78
|
+
True
|
|
79
|
+
|
|
80
|
+
TESTS::
|
|
81
|
+
|
|
82
|
+
sage: TestSuite(i).run()
|
|
83
|
+
"""
|
|
84
|
+
AlgebraElement.__init__(self, A)
|
|
85
|
+
Q = self.parent()
|
|
86
|
+
|
|
87
|
+
if isinstance(x, FreeAlgebraQuotientElement) and x.parent() == Q:
|
|
88
|
+
self.__vector = Q.module()(x.vector())
|
|
89
|
+
return
|
|
90
|
+
if isinstance(x, (Integer, int)):
|
|
91
|
+
self.__vector = Q.module().gen(0) * x
|
|
92
|
+
return
|
|
93
|
+
elif isinstance(x, FreeModuleElement) and x.parent() is Q.module():
|
|
94
|
+
self.__vector = x
|
|
95
|
+
return
|
|
96
|
+
elif isinstance(x, FreeModuleElement) and x.parent() == A.module():
|
|
97
|
+
self.__vector = x
|
|
98
|
+
return
|
|
99
|
+
R = A.base_ring()
|
|
100
|
+
M = A.module()
|
|
101
|
+
F = A.monoid()
|
|
102
|
+
B = A.monomial_basis()
|
|
103
|
+
|
|
104
|
+
if isinstance(x, (Integer, int)):
|
|
105
|
+
self.__vector = x*M.gen(0)
|
|
106
|
+
elif isinstance(x, RingElement) and not isinstance(x, AlgebraElement) and x in R:
|
|
107
|
+
self.__vector = x * M.gen(0)
|
|
108
|
+
elif isinstance(x, FreeMonoidElement) and x.parent() is F:
|
|
109
|
+
if x in B:
|
|
110
|
+
self.__vector = M.gen(B.index(x))
|
|
111
|
+
else:
|
|
112
|
+
raise AttributeError("argument x (= %s) is not in monomial basis" % x)
|
|
113
|
+
elif isinstance(x, list) and len(x) == A.dimension():
|
|
114
|
+
try:
|
|
115
|
+
self.__vector = M(x)
|
|
116
|
+
except TypeError:
|
|
117
|
+
raise TypeError("argument x (= %s) is of the wrong type" % x)
|
|
118
|
+
elif isinstance(x, FreeAlgebraElement) and x.parent() is A.free_algebra():
|
|
119
|
+
# Need to do more work here to include monomials not
|
|
120
|
+
# represented in the monomial basis.
|
|
121
|
+
self.__vector = M(0)
|
|
122
|
+
for m, c in x._FreeAlgebraElement__monomial_coefficients.items():
|
|
123
|
+
self.__vector += c*M.gen(B.index(m))
|
|
124
|
+
elif isinstance(x, dict):
|
|
125
|
+
self.__vector = M(0)
|
|
126
|
+
for m, c in x.items():
|
|
127
|
+
self.__vector += c*M.gen(B.index(m))
|
|
128
|
+
elif isinstance(x, AlgebraElement) and x.parent().ambient_algebra() is A:
|
|
129
|
+
self.__vector = x.ambient_algebra_element().vector()
|
|
130
|
+
else:
|
|
131
|
+
raise TypeError("argument x (= %s) is of the wrong type" % x)
|
|
132
|
+
|
|
133
|
+
def _repr_(self):
|
|
134
|
+
"""
|
|
135
|
+
EXAMPLES::
|
|
136
|
+
|
|
137
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)
|
|
138
|
+
sage: i._repr_()
|
|
139
|
+
'i'
|
|
140
|
+
"""
|
|
141
|
+
Q = self.parent()
|
|
142
|
+
M = Q.monoid()
|
|
143
|
+
with localvars(M, Q.variable_names()):
|
|
144
|
+
cffs = list(self.__vector)
|
|
145
|
+
mons = Q.monomial_basis()
|
|
146
|
+
return repr_lincomb(zip(mons, cffs), strip_one=True)
|
|
147
|
+
|
|
148
|
+
def _latex_(self):
|
|
149
|
+
r"""
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
153
|
+
sage: ((2/3)*i - j)._latex_()
|
|
154
|
+
'\\frac{2}{3} i - j'
|
|
155
|
+
"""
|
|
156
|
+
Q = self.parent()
|
|
157
|
+
M = Q.monoid()
|
|
158
|
+
with localvars(M, Q.variable_names()):
|
|
159
|
+
cffs = tuple(self.__vector)
|
|
160
|
+
mons = Q.monomial_basis()
|
|
161
|
+
return repr_lincomb(zip(mons, cffs), is_latex=True, strip_one=True)
|
|
162
|
+
|
|
163
|
+
def vector(self):
|
|
164
|
+
"""
|
|
165
|
+
Return underlying vector representation of this element.
|
|
166
|
+
|
|
167
|
+
EXAMPLES::
|
|
168
|
+
|
|
169
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
170
|
+
sage: ((2/3)*i - j).vector()
|
|
171
|
+
(0, 2/3, -1, 0)
|
|
172
|
+
"""
|
|
173
|
+
return self.__vector
|
|
174
|
+
|
|
175
|
+
def _richcmp_(self, right, op):
|
|
176
|
+
"""
|
|
177
|
+
Compare two quotient algebra elements; done by comparing the
|
|
178
|
+
underlying vector representatives.
|
|
179
|
+
|
|
180
|
+
EXAMPLES::
|
|
181
|
+
|
|
182
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
183
|
+
sage: i > j
|
|
184
|
+
True
|
|
185
|
+
sage: i == i
|
|
186
|
+
True
|
|
187
|
+
sage: i == 1
|
|
188
|
+
False
|
|
189
|
+
sage: i + j == j + i
|
|
190
|
+
True
|
|
191
|
+
"""
|
|
192
|
+
return richcmp(self.vector(), right.vector(), op)
|
|
193
|
+
|
|
194
|
+
def __neg__(self):
|
|
195
|
+
"""
|
|
196
|
+
Return negative of ``self``.
|
|
197
|
+
|
|
198
|
+
EXAMPLES::
|
|
199
|
+
|
|
200
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
201
|
+
sage: -i
|
|
202
|
+
-i
|
|
203
|
+
sage: -(2/3*i - 3/7*j + k)
|
|
204
|
+
-2/3*i + 3/7*j - k
|
|
205
|
+
"""
|
|
206
|
+
y = self.parent()(0)
|
|
207
|
+
y.__vector = -self.__vector
|
|
208
|
+
return y
|
|
209
|
+
|
|
210
|
+
def _add_(self, y):
|
|
211
|
+
"""
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
215
|
+
sage: 2/3*i + 4*j + k
|
|
216
|
+
2/3*i + 4*j + k
|
|
217
|
+
"""
|
|
218
|
+
A = self.parent()
|
|
219
|
+
z = A(0)
|
|
220
|
+
z.__vector = self.__vector + y.__vector
|
|
221
|
+
return z
|
|
222
|
+
|
|
223
|
+
def _sub_(self, y):
|
|
224
|
+
"""
|
|
225
|
+
EXAMPLES::
|
|
226
|
+
|
|
227
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
228
|
+
sage: 2/3*i - 4*j
|
|
229
|
+
2/3*i - 4*j
|
|
230
|
+
sage: a = 2/3*i - 4*j; a
|
|
231
|
+
2/3*i - 4*j
|
|
232
|
+
sage: a - a
|
|
233
|
+
0
|
|
234
|
+
"""
|
|
235
|
+
A = self.parent()
|
|
236
|
+
z = A(0)
|
|
237
|
+
z.__vector = self.__vector - y.__vector
|
|
238
|
+
return z
|
|
239
|
+
|
|
240
|
+
def _mul_(self, y):
|
|
241
|
+
"""
|
|
242
|
+
EXAMPLES::
|
|
243
|
+
|
|
244
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
245
|
+
sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10)
|
|
246
|
+
-5459/25 + 40*i - 12*j + 340*k
|
|
247
|
+
|
|
248
|
+
Double check that the above is actually right::
|
|
249
|
+
|
|
250
|
+
sage: R.<i,j,k> = QuaternionAlgebra(QQ,-1,-1) # needs sage.libs.singular
|
|
251
|
+
sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10) # needs sage.libs.singular
|
|
252
|
+
-5459/25 + 40*i - 12*j + 340*k
|
|
253
|
+
"""
|
|
254
|
+
A = self.parent()
|
|
255
|
+
|
|
256
|
+
def monomial_product(X, w, m):
|
|
257
|
+
mats = X._FreeAlgebraQuotient__matrix_action
|
|
258
|
+
for j, k in m._element_list:
|
|
259
|
+
M = mats[int(j)]
|
|
260
|
+
for _ in range(k):
|
|
261
|
+
w *= M
|
|
262
|
+
return w
|
|
263
|
+
u = self.__vector.__copy__()
|
|
264
|
+
v = y.__vector
|
|
265
|
+
z = A(0)
|
|
266
|
+
B = A.monomial_basis()
|
|
267
|
+
for i in range(A.dimension()):
|
|
268
|
+
c = v[i]
|
|
269
|
+
if c != 0:
|
|
270
|
+
z.__vector += monomial_product(A,c*u,B[i])
|
|
271
|
+
return z
|
|
272
|
+
|
|
273
|
+
def _rmul_(self, c):
|
|
274
|
+
"""
|
|
275
|
+
EXAMPLES::
|
|
276
|
+
|
|
277
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
278
|
+
sage: 3 * (-1+i-2*j+k)
|
|
279
|
+
-3 + 3*i - 6*j + 3*k
|
|
280
|
+
sage: (-1+i-2*j+k)._rmul_(3)
|
|
281
|
+
-3 + 3*i - 6*j + 3*k
|
|
282
|
+
"""
|
|
283
|
+
return self.parent([c*a for a in self.__vector])
|
|
284
|
+
|
|
285
|
+
def _lmul_(self, c):
|
|
286
|
+
"""
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
|
|
290
|
+
sage: (-1+i-2*j+k) * 3
|
|
291
|
+
-3 + 3*i - 6*j + 3*k
|
|
292
|
+
sage: (-1+i-2*j+k)._lmul_(3)
|
|
293
|
+
-3 + 3*i - 6*j + 3*k
|
|
294
|
+
"""
|
|
295
|
+
return self.parent([a*c for a in self.__vector])
|