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,756 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Spin crystals
|
|
5
|
+
|
|
6
|
+
These are the crystals associated with the three spin
|
|
7
|
+
representations: the spin representations of odd orthogonal groups
|
|
8
|
+
(or rather their double covers); and the `+` and `-` spin
|
|
9
|
+
representations of the even orthogonal groups.
|
|
10
|
+
|
|
11
|
+
We follow Kashiwara and Nakashima (Journal of Algebra 165, 1994) in
|
|
12
|
+
representing the elements of the spin crystal by sequences of signs
|
|
13
|
+
`\pm`.
|
|
14
|
+
"""
|
|
15
|
+
# TODO: Do we want the following two representations?
|
|
16
|
+
#
|
|
17
|
+
# Two other representations are available as attributes
|
|
18
|
+
#:meth:`Spin.internal_repn` and :meth:`Spin.signature` of the crystal element.
|
|
19
|
+
#
|
|
20
|
+
#- A numerical internal representation, an integer `n` such that if `n-1`
|
|
21
|
+
# is written in binary and the `1`'s are replaced by ``-``, the `0`'s by
|
|
22
|
+
# ``+``
|
|
23
|
+
#
|
|
24
|
+
#- The signature, which is a list in which ``+`` is replaced by `+1` and
|
|
25
|
+
# ``-`` by `-1`.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# ****************************************************************************
|
|
29
|
+
# Copyright (C) 2007 Anne Schilling <anne at math.ucdavis.edu>
|
|
30
|
+
# Nicolas Thiery <nthiery at users.sf.net>
|
|
31
|
+
# Daniel Bump <bump at match.stanford.edu>
|
|
32
|
+
# 2019 Travis Scrimshaw <tcscrims at gmail.com>
|
|
33
|
+
#
|
|
34
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
35
|
+
#
|
|
36
|
+
# This code is distributed in the hope that it will be useful,
|
|
37
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
38
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
39
|
+
# General Public License for more details.
|
|
40
|
+
#
|
|
41
|
+
# The full text of the GPL is available at:
|
|
42
|
+
#
|
|
43
|
+
# https://www.gnu.org/licenses/
|
|
44
|
+
# ***************************************************************************
|
|
45
|
+
|
|
46
|
+
from cpython.object cimport Py_EQ, Py_NE, Py_LE, Py_GE, Py_LT, Py_GT
|
|
47
|
+
from cysignals.memory cimport sig_malloc, sig_free
|
|
48
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
49
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
50
|
+
from sage.structure.parent cimport Parent
|
|
51
|
+
from sage.structure.element cimport Element, parent
|
|
52
|
+
from sage.categories.classical_crystals import ClassicalCrystals
|
|
53
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
|
54
|
+
from sage.combinat.tableau import Tableau
|
|
55
|
+
from sage.rings.integer_ring import ZZ
|
|
56
|
+
from sage.typeset.ascii_art import AsciiArt
|
|
57
|
+
from sage.typeset.unicode_art import UnicodeArt
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
#########################
|
|
61
|
+
# Type B spin
|
|
62
|
+
#########################
|
|
63
|
+
|
|
64
|
+
def CrystalOfSpins(ct):
|
|
65
|
+
r"""
|
|
66
|
+
Return the spin crystal of the given type `B`.
|
|
67
|
+
|
|
68
|
+
This is a combinatorial model for the crystal with highest weight
|
|
69
|
+
`\Lambda_n` (the `n`-th fundamental weight). It has
|
|
70
|
+
`2^n` elements, here called Spins. See also
|
|
71
|
+
:func:`~sage.combinat.crystals.letters.CrystalOfLetters`,
|
|
72
|
+
:func:`~sage.combinat.crystals.spins.CrystalOfSpinsPlus`,
|
|
73
|
+
and :func:`~sage.combinat.crystals.spins.CrystalOfSpinsMinus`.
|
|
74
|
+
|
|
75
|
+
INPUT:
|
|
76
|
+
|
|
77
|
+
- ``['B', n]`` -- a Cartan type `B_n`
|
|
78
|
+
|
|
79
|
+
EXAMPLES::
|
|
80
|
+
|
|
81
|
+
sage: C = crystals.Spins(['B',3])
|
|
82
|
+
sage: C.list()
|
|
83
|
+
[+++, ++-, +-+, -++, +--, -+-, --+, ---]
|
|
84
|
+
sage: C.cartan_type()
|
|
85
|
+
['B', 3]
|
|
86
|
+
|
|
87
|
+
::
|
|
88
|
+
|
|
89
|
+
sage: [x.signature() for x in C]
|
|
90
|
+
['+++', '++-', '+-+', '-++', '+--', '-+-', '--+', '---']
|
|
91
|
+
|
|
92
|
+
TESTS::
|
|
93
|
+
|
|
94
|
+
sage: crystals.TensorProduct(C,C,generators=[[C.list()[0],C.list()[0]]]).cardinality()
|
|
95
|
+
35
|
|
96
|
+
"""
|
|
97
|
+
ct = CartanType(ct)
|
|
98
|
+
if ct[0] == 'B':
|
|
99
|
+
return GenericCrystalOfSpins(ct, Spin_crystal_type_B_element, "spins")
|
|
100
|
+
else:
|
|
101
|
+
raise NotImplementedError
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
#########################
|
|
105
|
+
# Type D spins
|
|
106
|
+
#########################
|
|
107
|
+
|
|
108
|
+
def CrystalOfSpinsPlus(ct):
|
|
109
|
+
r"""
|
|
110
|
+
Return the plus spin crystal of the given type D.
|
|
111
|
+
|
|
112
|
+
This is the crystal with highest weight `\Lambda_n` (the
|
|
113
|
+
`n`-th fundamental weight).
|
|
114
|
+
|
|
115
|
+
INPUT:
|
|
116
|
+
|
|
117
|
+
- ``['D', n]`` -- a Cartan type `D_n`
|
|
118
|
+
|
|
119
|
+
EXAMPLES::
|
|
120
|
+
|
|
121
|
+
sage: D = crystals.SpinsPlus(['D',4])
|
|
122
|
+
sage: D.list()
|
|
123
|
+
[++++, ++--, +-+-, -++-, +--+, -+-+, --++, ----]
|
|
124
|
+
|
|
125
|
+
::
|
|
126
|
+
|
|
127
|
+
sage: [x.signature() for x in D]
|
|
128
|
+
['++++', '++--', '+-+-', '-++-', '+--+', '-+-+', '--++', '----']
|
|
129
|
+
|
|
130
|
+
TESTS::
|
|
131
|
+
|
|
132
|
+
sage: TestSuite(D).run()
|
|
133
|
+
"""
|
|
134
|
+
ct = CartanType(ct)
|
|
135
|
+
if ct[0] == 'D':
|
|
136
|
+
return GenericCrystalOfSpins(ct, Spin_crystal_type_D_element, "plus")
|
|
137
|
+
else:
|
|
138
|
+
raise NotImplementedError
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def CrystalOfSpinsMinus(ct):
|
|
142
|
+
r"""
|
|
143
|
+
Return the minus spin crystal of the given type D.
|
|
144
|
+
|
|
145
|
+
This is the crystal with highest weight `\Lambda_{n-1}`
|
|
146
|
+
(the `(n-1)`-st fundamental weight).
|
|
147
|
+
|
|
148
|
+
INPUT:
|
|
149
|
+
|
|
150
|
+
- ``['D', n]`` -- a Cartan type `D_n`
|
|
151
|
+
|
|
152
|
+
EXAMPLES::
|
|
153
|
+
|
|
154
|
+
sage: E = crystals.SpinsMinus(['D',4])
|
|
155
|
+
sage: E.list()
|
|
156
|
+
[+++-, ++-+, +-++, -+++, +---, -+--, --+-, ---+]
|
|
157
|
+
sage: [x.signature() for x in E]
|
|
158
|
+
['+++-', '++-+', '+-++', '-+++', '+---', '-+--', '--+-', '---+']
|
|
159
|
+
|
|
160
|
+
TESTS::
|
|
161
|
+
|
|
162
|
+
sage: len(crystals.TensorProduct(E,E,generators=[[E[0],E[0]]]).list())
|
|
163
|
+
35
|
|
164
|
+
sage: D = crystals.SpinsPlus(['D',4])
|
|
165
|
+
sage: len(crystals.TensorProduct(D,E,generators=[[D.list()[0],E.list()[0]]]).list())
|
|
166
|
+
56
|
|
167
|
+
"""
|
|
168
|
+
ct = CartanType(ct)
|
|
169
|
+
if ct[0] == 'D':
|
|
170
|
+
return GenericCrystalOfSpins(ct, Spin_crystal_type_D_element, "minus")
|
|
171
|
+
else:
|
|
172
|
+
raise NotImplementedError
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class GenericCrystalOfSpins(UniqueRepresentation, Parent):
|
|
176
|
+
"""
|
|
177
|
+
A generic crystal of spins.
|
|
178
|
+
"""
|
|
179
|
+
def __init__(self, ct, element_class, case):
|
|
180
|
+
"""
|
|
181
|
+
EXAMPLES::
|
|
182
|
+
|
|
183
|
+
sage: E = crystals.SpinsMinus(['D',4])
|
|
184
|
+
sage: TestSuite(E).run()
|
|
185
|
+
"""
|
|
186
|
+
self._cartan_type = CartanType(ct)
|
|
187
|
+
if case == "spins":
|
|
188
|
+
self.rename("The crystal of spins for type %s" % ct)
|
|
189
|
+
elif case == "plus":
|
|
190
|
+
self.rename("The plus crystal of spins for type %s" % ct)
|
|
191
|
+
else:
|
|
192
|
+
self.rename("The minus crystal of spins for type %s" % ct)
|
|
193
|
+
|
|
194
|
+
self.Element = element_class
|
|
195
|
+
Parent.__init__(self, category=ClassicalCrystals())
|
|
196
|
+
|
|
197
|
+
if case == "minus":
|
|
198
|
+
generator = [1]*(ct[1]-1)
|
|
199
|
+
generator.append(-1)
|
|
200
|
+
else:
|
|
201
|
+
generator = [1]*ct[1]
|
|
202
|
+
self.module_generators = (self.element_class(self, tuple(generator)),)
|
|
203
|
+
|
|
204
|
+
def _element_constructor_(self, value):
|
|
205
|
+
"""
|
|
206
|
+
Construct an element of ``self`` from ``value``.
|
|
207
|
+
|
|
208
|
+
EXAMPLES::
|
|
209
|
+
|
|
210
|
+
sage: C = crystals.Spins(['B',3])
|
|
211
|
+
sage: x = C((1,1,1)); x
|
|
212
|
+
+++
|
|
213
|
+
sage: y = C([1,1,1]); y
|
|
214
|
+
+++
|
|
215
|
+
sage: x == y
|
|
216
|
+
True
|
|
217
|
+
"""
|
|
218
|
+
return self.element_class(self, tuple(value))
|
|
219
|
+
|
|
220
|
+
@lazy_attribute
|
|
221
|
+
def _digraph_closure(self):
|
|
222
|
+
"""
|
|
223
|
+
The transitive closure of the digraph associated to ``self``.
|
|
224
|
+
|
|
225
|
+
EXAMPLES::
|
|
226
|
+
|
|
227
|
+
sage: crystals.Spins(['B',4])._digraph_closure
|
|
228
|
+
Transitive closure of : Digraph on 16 vertices
|
|
229
|
+
"""
|
|
230
|
+
return self.digraph().transitive_closure()
|
|
231
|
+
|
|
232
|
+
def lt_elements(self, x, y):
|
|
233
|
+
r"""
|
|
234
|
+
Return ``True`` if and only if there is a path from ``x`` to ``y``
|
|
235
|
+
in the crystal graph.
|
|
236
|
+
|
|
237
|
+
Because the crystal graph is classical, it is a directed acyclic
|
|
238
|
+
graph which can be interpreted as a poset. This function implements
|
|
239
|
+
the comparison function of this poset.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: C = crystals.Spins(['B',3])
|
|
244
|
+
sage: x = C([1,1,1])
|
|
245
|
+
sage: y = C([-1,-1,-1])
|
|
246
|
+
sage: C.lt_elements(x, y)
|
|
247
|
+
True
|
|
248
|
+
sage: C.lt_elements(y, x)
|
|
249
|
+
False
|
|
250
|
+
sage: C.lt_elements(x, x)
|
|
251
|
+
False
|
|
252
|
+
"""
|
|
253
|
+
if parent(x) is not self or parent(y) is not self:
|
|
254
|
+
raise ValueError("both elements must be in this crystal")
|
|
255
|
+
return self._digraph_closure.has_edge(x, y)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
cdef class Spin(Element):
|
|
259
|
+
"""
|
|
260
|
+
A spin letter in the crystal of spins.
|
|
261
|
+
|
|
262
|
+
EXAMPLES::
|
|
263
|
+
|
|
264
|
+
sage: C = crystals.Spins(['B',3])
|
|
265
|
+
sage: c = C([1,1,1])
|
|
266
|
+
sage: c
|
|
267
|
+
+++
|
|
268
|
+
sage: c.parent()
|
|
269
|
+
The crystal of spins for type ['B', 3]
|
|
270
|
+
|
|
271
|
+
sage: D = crystals.Spins(['B',4])
|
|
272
|
+
sage: a = C([1,1,1])
|
|
273
|
+
sage: b = C([-1,-1,-1])
|
|
274
|
+
sage: c = D([1,1,1,1])
|
|
275
|
+
sage: a == a
|
|
276
|
+
True
|
|
277
|
+
sage: a == b
|
|
278
|
+
False
|
|
279
|
+
sage: b == c
|
|
280
|
+
False
|
|
281
|
+
"""
|
|
282
|
+
# cdef bint* self._value # A + is a 0/False and a - is a 1/True
|
|
283
|
+
|
|
284
|
+
def __init__(self, parent, tuple val):
|
|
285
|
+
"""
|
|
286
|
+
Initialize ``self``.
|
|
287
|
+
|
|
288
|
+
TESTS::
|
|
289
|
+
|
|
290
|
+
sage: C = crystals.Spins(['B',3])
|
|
291
|
+
sage: c = C([1,1,1])
|
|
292
|
+
sage: TestSuite(c).run()
|
|
293
|
+
"""
|
|
294
|
+
cdef int i
|
|
295
|
+
self._n = parent.cartan_type().rank()
|
|
296
|
+
self._value = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
297
|
+
for i in range(self._n):
|
|
298
|
+
self._value[i] = (val[i] != 1)
|
|
299
|
+
Element.__init__(self, parent)
|
|
300
|
+
|
|
301
|
+
cdef Spin _new_c(self, bint* value):
|
|
302
|
+
r"""
|
|
303
|
+
Fast creation of a spin element.
|
|
304
|
+
"""
|
|
305
|
+
cdef Spin ret = type(self).__new__(type(self))
|
|
306
|
+
ret._parent = self._parent
|
|
307
|
+
ret._n = self._n
|
|
308
|
+
ret._value = value
|
|
309
|
+
ret._hash = 0
|
|
310
|
+
return ret
|
|
311
|
+
|
|
312
|
+
def __dealloc__(self):
|
|
313
|
+
"""
|
|
314
|
+
Deallocate ``self``.
|
|
315
|
+
|
|
316
|
+
TESTS::
|
|
317
|
+
|
|
318
|
+
sage: C = crystals.Spins(['B',3])
|
|
319
|
+
sage: c = C([1,1,1])
|
|
320
|
+
sage: del c
|
|
321
|
+
"""
|
|
322
|
+
sig_free(self._value)
|
|
323
|
+
|
|
324
|
+
def __hash__(self):
|
|
325
|
+
"""
|
|
326
|
+
Return the hash of ``self``.
|
|
327
|
+
|
|
328
|
+
TESTS::
|
|
329
|
+
|
|
330
|
+
sage: C = crystals.Spins(['B',3])
|
|
331
|
+
sage: len(set(C)) == len(set([hash(x) for x in C]))
|
|
332
|
+
True
|
|
333
|
+
"""
|
|
334
|
+
cdef int i
|
|
335
|
+
if self._hash == 0:
|
|
336
|
+
self._hash = hash(tuple([-1 if self._value[i] else 1 for i in range(self._n)]))
|
|
337
|
+
return self._hash
|
|
338
|
+
|
|
339
|
+
def __reduce__(self):
|
|
340
|
+
r"""
|
|
341
|
+
Used to pickle ``self``.
|
|
342
|
+
|
|
343
|
+
EXAMPLES::
|
|
344
|
+
|
|
345
|
+
sage: C = crystals.Spins(['B',3])
|
|
346
|
+
sage: a = C([1,-1,1])
|
|
347
|
+
sage: a.__reduce__()
|
|
348
|
+
(The crystal of spins for type ['B', 3], ((1, -1, 1),))
|
|
349
|
+
"""
|
|
350
|
+
tup = tuple([-1 if self._value[i] else 1 for i in range(self._n)])
|
|
351
|
+
return (self._parent, (tup,))
|
|
352
|
+
|
|
353
|
+
cpdef _richcmp_(left, right, int op):
|
|
354
|
+
"""
|
|
355
|
+
Return ``True`` if ``left`` compares with ``right`` based on ``op``.
|
|
356
|
+
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: C = crystals.Spins(['B',3])
|
|
360
|
+
sage: x = C([1,1,1])
|
|
361
|
+
sage: y = C([-1,-1,-1])
|
|
362
|
+
sage: x < y
|
|
363
|
+
True
|
|
364
|
+
sage: x >= y
|
|
365
|
+
False
|
|
366
|
+
sage: x < x
|
|
367
|
+
False
|
|
368
|
+
sage: x <= x
|
|
369
|
+
True
|
|
370
|
+
sage: x != y
|
|
371
|
+
True
|
|
372
|
+
sage: x == y
|
|
373
|
+
False
|
|
374
|
+
"""
|
|
375
|
+
cdef Spin self, x
|
|
376
|
+
cdef int i
|
|
377
|
+
self = left
|
|
378
|
+
x = right
|
|
379
|
+
if op == Py_EQ:
|
|
380
|
+
for i in range(self._n):
|
|
381
|
+
if self._value[i] != x._value[i]:
|
|
382
|
+
return False
|
|
383
|
+
return True
|
|
384
|
+
if op == Py_NE:
|
|
385
|
+
for i in range(self._n):
|
|
386
|
+
if self._value[i] != x._value[i]:
|
|
387
|
+
return True
|
|
388
|
+
return False
|
|
389
|
+
if op == Py_LT:
|
|
390
|
+
return self._parent._digraph_closure.has_edge(self, x)
|
|
391
|
+
if op == Py_GT:
|
|
392
|
+
return x._parent._digraph_closure.has_edge(x, self)
|
|
393
|
+
if op == Py_LE:
|
|
394
|
+
return self == x or self._parent._digraph_closure.has_edge(self, x)
|
|
395
|
+
if op == Py_GE:
|
|
396
|
+
return self == x or x._parent._digraph_closure.has_edge(x, self)
|
|
397
|
+
return False
|
|
398
|
+
|
|
399
|
+
@property
|
|
400
|
+
def value(self):
|
|
401
|
+
r"""
|
|
402
|
+
Return ``self`` as a tuple with `+1` and `-1`.
|
|
403
|
+
|
|
404
|
+
EXAMPLES::
|
|
405
|
+
|
|
406
|
+
sage: C = crystals.Spins(['B',3])
|
|
407
|
+
sage: C([1,1,1]).value
|
|
408
|
+
(1, 1, 1)
|
|
409
|
+
sage: C([1,1,-1]).value
|
|
410
|
+
(1, 1, -1)
|
|
411
|
+
"""
|
|
412
|
+
cdef int i
|
|
413
|
+
one = ZZ.one()
|
|
414
|
+
return tuple([-one if self._value[i] else one for i in range(self._n)])
|
|
415
|
+
|
|
416
|
+
def signature(self):
|
|
417
|
+
"""
|
|
418
|
+
Return the signature of ``self``.
|
|
419
|
+
|
|
420
|
+
EXAMPLES::
|
|
421
|
+
|
|
422
|
+
sage: C = crystals.Spins(['B',3])
|
|
423
|
+
sage: C([1,1,1]).signature()
|
|
424
|
+
'+++'
|
|
425
|
+
sage: C([1,1,-1]).signature()
|
|
426
|
+
'++-'
|
|
427
|
+
"""
|
|
428
|
+
cdef int i
|
|
429
|
+
cdef str sword = ""
|
|
430
|
+
for i in range(self._n):
|
|
431
|
+
sword += "+" if self._value[i] != 1 else "-"
|
|
432
|
+
return sword
|
|
433
|
+
|
|
434
|
+
_repr_ = signature
|
|
435
|
+
|
|
436
|
+
def _repr_diagram(self):
|
|
437
|
+
"""
|
|
438
|
+
Return a representation of ``self`` as a diagram.
|
|
439
|
+
|
|
440
|
+
EXAMPLES::
|
|
441
|
+
|
|
442
|
+
sage: C = crystals.Spins(['B',3])
|
|
443
|
+
sage: b = C([1,1,-1])
|
|
444
|
+
sage: print(b._repr_diagram())
|
|
445
|
+
+
|
|
446
|
+
+
|
|
447
|
+
-
|
|
448
|
+
"""
|
|
449
|
+
return '\n'.join(self.signature())
|
|
450
|
+
|
|
451
|
+
def _ascii_art_(self):
|
|
452
|
+
"""
|
|
453
|
+
Return an ascii art representation of ``self``.
|
|
454
|
+
|
|
455
|
+
EXAMPLES::
|
|
456
|
+
|
|
457
|
+
sage: C = crystals.Spins(['B',3])
|
|
458
|
+
sage: b = C([1,1,-1])
|
|
459
|
+
sage: ascii_art(b)
|
|
460
|
+
+
|
|
461
|
+
+
|
|
462
|
+
-
|
|
463
|
+
"""
|
|
464
|
+
return AsciiArt(list(self.signature()))
|
|
465
|
+
|
|
466
|
+
def _unicode_art_(self):
|
|
467
|
+
"""
|
|
468
|
+
Return a unicode art representation of ``self``.
|
|
469
|
+
|
|
470
|
+
EXAMPLES::
|
|
471
|
+
|
|
472
|
+
sage: C = crystals.Spins(['B',3])
|
|
473
|
+
sage: b = C([1,1,-1])
|
|
474
|
+
sage: unicode_art(b)
|
|
475
|
+
+
|
|
476
|
+
+
|
|
477
|
+
-
|
|
478
|
+
"""
|
|
479
|
+
return UnicodeArt(list(self.signature()))
|
|
480
|
+
|
|
481
|
+
def pp(self):
|
|
482
|
+
"""
|
|
483
|
+
Pretty print ``self`` as a column.
|
|
484
|
+
|
|
485
|
+
EXAMPLES::
|
|
486
|
+
|
|
487
|
+
sage: C = crystals.Spins(['B',3])
|
|
488
|
+
sage: b = C([1,1,-1])
|
|
489
|
+
sage: b.pp()
|
|
490
|
+
+
|
|
491
|
+
+
|
|
492
|
+
-
|
|
493
|
+
"""
|
|
494
|
+
print(self._repr_diagram())
|
|
495
|
+
|
|
496
|
+
def _latex_(self):
|
|
497
|
+
r"""
|
|
498
|
+
Give the latex output of a spin column.
|
|
499
|
+
|
|
500
|
+
EXAMPLES::
|
|
501
|
+
|
|
502
|
+
sage: C = crystals.Spins(['B',3])
|
|
503
|
+
sage: b = C([1,1,-1])
|
|
504
|
+
sage: print(b._latex_())
|
|
505
|
+
{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
506
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
507
|
+
\lr{-}\\\cline{1-1}
|
|
508
|
+
\lr{+}\\\cline{1-1}
|
|
509
|
+
\lr{+}\\\cline{1-1}
|
|
510
|
+
\end{array}$}
|
|
511
|
+
}
|
|
512
|
+
"""
|
|
513
|
+
return Tableau([[i] for i in reversed(self.signature())])._latex_()
|
|
514
|
+
|
|
515
|
+
def weight(self):
|
|
516
|
+
"""
|
|
517
|
+
Return the weight of ``self``.
|
|
518
|
+
|
|
519
|
+
EXAMPLES::
|
|
520
|
+
|
|
521
|
+
sage: [v.weight() for v in crystals.Spins(['B',3])]
|
|
522
|
+
[(1/2, 1/2, 1/2), (1/2, 1/2, -1/2),
|
|
523
|
+
(1/2, -1/2, 1/2), (-1/2, 1/2, 1/2),
|
|
524
|
+
(1/2, -1/2, -1/2), (-1/2, 1/2, -1/2),
|
|
525
|
+
(-1/2, -1/2, 1/2), (-1/2, -1/2, -1/2)]
|
|
526
|
+
"""
|
|
527
|
+
WLR = self._parent.weight_lattice_realization()
|
|
528
|
+
cdef int i
|
|
529
|
+
mone = -WLR.base_ring().one()
|
|
530
|
+
# The ambient space is indexed by 0,...,n-1
|
|
531
|
+
return WLR._from_dict({i: mone**int(self._value[i]) / 2 for i in range(self._n)},
|
|
532
|
+
remove_zeros=False, coerce=False)
|
|
533
|
+
|
|
534
|
+
cdef class Spin_crystal_type_B_element(Spin):
|
|
535
|
+
r"""
|
|
536
|
+
Type B spin representation crystal element
|
|
537
|
+
"""
|
|
538
|
+
cpdef Spin e(self, int i):
|
|
539
|
+
r"""
|
|
540
|
+
Return the action of `e_i` on ``self``.
|
|
541
|
+
|
|
542
|
+
EXAMPLES::
|
|
543
|
+
|
|
544
|
+
sage: C = crystals.Spins(['B',3])
|
|
545
|
+
sage: [[C[m].e(i) for i in range(1,4)] for m in range(8)]
|
|
546
|
+
[[None, None, None], [None, None, +++], [None, ++-, None], [+-+, None, None],
|
|
547
|
+
[None, None, +-+], [+--, None, -++], [None, -+-, None], [None, None, --+]]
|
|
548
|
+
"""
|
|
549
|
+
if i < 1 or i > self._n:
|
|
550
|
+
raise ValueError("i is not in the index set")
|
|
551
|
+
cdef int j
|
|
552
|
+
cdef bint* ret
|
|
553
|
+
if i == self._n:
|
|
554
|
+
if self._value[i-1]:
|
|
555
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
556
|
+
for j in range(self._n):
|
|
557
|
+
ret[j] = self._value[j]
|
|
558
|
+
ret[i-1] = False
|
|
559
|
+
return self._new_c(ret)
|
|
560
|
+
return None
|
|
561
|
+
|
|
562
|
+
if self._value[i-1] and not self._value[i]:
|
|
563
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
564
|
+
for j in range(self._n):
|
|
565
|
+
ret[j] = self._value[j]
|
|
566
|
+
ret[i-1] = False
|
|
567
|
+
ret[i] = True
|
|
568
|
+
return self._new_c(ret)
|
|
569
|
+
return None
|
|
570
|
+
|
|
571
|
+
cpdef Spin f(self, int i):
|
|
572
|
+
r"""
|
|
573
|
+
Return the action of `f_i` on ``self``.
|
|
574
|
+
|
|
575
|
+
EXAMPLES::
|
|
576
|
+
|
|
577
|
+
sage: C = crystals.Spins(['B',3])
|
|
578
|
+
sage: [[C[m].f(i) for i in range(1,4)] for m in range(8)]
|
|
579
|
+
[[None, None, ++-], [None, +-+, None], [-++, None, +--], [None, None, -+-],
|
|
580
|
+
[-+-, None, None], [None, --+, None], [None, None, ---], [None, None, None]]
|
|
581
|
+
"""
|
|
582
|
+
if i < 1 or i > self._n:
|
|
583
|
+
raise ValueError("i is not in the index set")
|
|
584
|
+
cdef int j
|
|
585
|
+
cdef bint* ret
|
|
586
|
+
if i == self._n:
|
|
587
|
+
if not self._value[i-1]:
|
|
588
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
589
|
+
for j in range(self._n):
|
|
590
|
+
ret[j] = self._value[j]
|
|
591
|
+
ret[i-1] = True
|
|
592
|
+
return self._new_c(ret)
|
|
593
|
+
return None
|
|
594
|
+
|
|
595
|
+
if self._value[i] and not self._value[i-1]:
|
|
596
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
597
|
+
for j in range(self._n):
|
|
598
|
+
ret[j] = self._value[j]
|
|
599
|
+
ret[i-1] = True
|
|
600
|
+
ret[i] = False
|
|
601
|
+
return self._new_c(ret)
|
|
602
|
+
return None
|
|
603
|
+
|
|
604
|
+
cpdef int epsilon(self, int i) noexcept:
|
|
605
|
+
r"""
|
|
606
|
+
Return `\varepsilon_i` of ``self``.
|
|
607
|
+
|
|
608
|
+
EXAMPLES::
|
|
609
|
+
|
|
610
|
+
sage: C = crystals.Spins(['B',3])
|
|
611
|
+
sage: [[C[m].epsilon(i) for i in range(1,4)] for m in range(8)]
|
|
612
|
+
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0],
|
|
613
|
+
[0, 0, 1], [1, 0, 1], [0, 1, 0], [0, 0, 1]]
|
|
614
|
+
"""
|
|
615
|
+
if i < 1 or i > self._n:
|
|
616
|
+
raise ValueError("i is not in the index set")
|
|
617
|
+
if i == self._n:
|
|
618
|
+
return self._value[i-1]
|
|
619
|
+
return self._value[i-1] and not self._value[i]
|
|
620
|
+
|
|
621
|
+
cpdef int phi(self, int i) noexcept:
|
|
622
|
+
r"""
|
|
623
|
+
Return `\varphi_i` of ``self``.
|
|
624
|
+
|
|
625
|
+
EXAMPLES::
|
|
626
|
+
|
|
627
|
+
sage: C = crystals.Spins(['B',3])
|
|
628
|
+
sage: [[C[m].phi(i) for i in range(1,4)] for m in range(8)]
|
|
629
|
+
[[0, 0, 1], [0, 1, 0], [1, 0, 1], [0, 0, 1],
|
|
630
|
+
[1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 0]]
|
|
631
|
+
"""
|
|
632
|
+
if i < 1 or i > self._n:
|
|
633
|
+
raise ValueError("i is not in the index set")
|
|
634
|
+
if i == self._n:
|
|
635
|
+
return not self._value[i-1]
|
|
636
|
+
return self._value[i] and not self._value[i-1]
|
|
637
|
+
|
|
638
|
+
cdef class Spin_crystal_type_D_element(Spin):
|
|
639
|
+
r"""
|
|
640
|
+
Type D spin representation crystal element
|
|
641
|
+
"""
|
|
642
|
+
cpdef Spin e(self, int i):
|
|
643
|
+
r"""
|
|
644
|
+
Return the action of `e_i` on ``self``.
|
|
645
|
+
|
|
646
|
+
EXAMPLES::
|
|
647
|
+
|
|
648
|
+
sage: D = crystals.SpinsPlus(['D',4])
|
|
649
|
+
sage: [[D.list()[m].e(i) for i in range(1,4)] for m in range(8)]
|
|
650
|
+
[[None, None, None], [None, None, None], [None, ++--, None], [+-+-, None, None],
|
|
651
|
+
[None, None, +-+-], [+--+, None, -++-], [None, -+-+, None], [None, None, None]]
|
|
652
|
+
|
|
653
|
+
::
|
|
654
|
+
|
|
655
|
+
sage: E = crystals.SpinsMinus(['D',4])
|
|
656
|
+
sage: [[E[m].e(i) for i in range(1,4)] for m in range(8)]
|
|
657
|
+
[[None, None, None], [None, None, +++-], [None, ++-+, None], [+-++, None, None],
|
|
658
|
+
[None, None, None], [+---, None, None], [None, -+--, None], [None, None, --+-]]
|
|
659
|
+
"""
|
|
660
|
+
if i < 1 or i > self._n:
|
|
661
|
+
raise ValueError("i is not in the index set")
|
|
662
|
+
cdef int j
|
|
663
|
+
cdef bint* ret
|
|
664
|
+
if i == self._n:
|
|
665
|
+
if self._value[i-1] and self._value[i-2]:
|
|
666
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
667
|
+
for j in range(self._n):
|
|
668
|
+
ret[j] = self._value[j]
|
|
669
|
+
ret[i-1] = False
|
|
670
|
+
ret[i-2] = False
|
|
671
|
+
return self._new_c(ret)
|
|
672
|
+
return None
|
|
673
|
+
|
|
674
|
+
if self._value[i-1] and not self._value[i]:
|
|
675
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
676
|
+
for j in range(self._n):
|
|
677
|
+
ret[j] = self._value[j]
|
|
678
|
+
ret[i-1] = False
|
|
679
|
+
ret[i] = True
|
|
680
|
+
return self._new_c(ret)
|
|
681
|
+
return None
|
|
682
|
+
|
|
683
|
+
cpdef Spin f(self, int i):
|
|
684
|
+
r"""
|
|
685
|
+
Return the action of `f_i` on ``self``.
|
|
686
|
+
|
|
687
|
+
EXAMPLES::
|
|
688
|
+
|
|
689
|
+
sage: D = crystals.SpinsPlus(['D',4])
|
|
690
|
+
sage: [[D.list()[m].f(i) for i in range(1,4)] for m in range(8)]
|
|
691
|
+
[[None, None, None], [None, +-+-, None], [-++-, None, +--+], [None, None, -+-+],
|
|
692
|
+
[-+-+, None, None], [None, --++, None], [None, None, None], [None, None, None]]
|
|
693
|
+
|
|
694
|
+
::
|
|
695
|
+
|
|
696
|
+
sage: E = crystals.SpinsMinus(['D',4])
|
|
697
|
+
sage: [[E[m].f(i) for i in range(1,4)] for m in range(8)]
|
|
698
|
+
[[None, None, ++-+], [None, +-++, None], [-+++, None, None], [None, None, None],
|
|
699
|
+
[-+--, None, None], [None, --+-, None], [None, None, ---+], [None, None, None]]
|
|
700
|
+
"""
|
|
701
|
+
if i < 1 or i > self._n:
|
|
702
|
+
raise ValueError("i is not in the index set")
|
|
703
|
+
cdef int j
|
|
704
|
+
cdef bint* ret
|
|
705
|
+
if i == self._n:
|
|
706
|
+
if not self._value[i-1] and not self._value[i-2]:
|
|
707
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
708
|
+
for j in range(self._n):
|
|
709
|
+
ret[j] = self._value[j]
|
|
710
|
+
ret[i-1] = True
|
|
711
|
+
ret[i-2] = True
|
|
712
|
+
return self._new_c(ret)
|
|
713
|
+
return None
|
|
714
|
+
|
|
715
|
+
if self._value[i] and not self._value[i-1]:
|
|
716
|
+
ret = <bint*>sig_malloc(self._n*sizeof(bint))
|
|
717
|
+
for j in range(self._n):
|
|
718
|
+
ret[j] = self._value[j]
|
|
719
|
+
ret[i-1] = True
|
|
720
|
+
ret[i] = False
|
|
721
|
+
return self._new_c(ret)
|
|
722
|
+
return None
|
|
723
|
+
|
|
724
|
+
cpdef int epsilon(self, int i) noexcept:
|
|
725
|
+
r"""
|
|
726
|
+
Return `\varepsilon_i` of ``self``.
|
|
727
|
+
|
|
728
|
+
EXAMPLES::
|
|
729
|
+
|
|
730
|
+
sage: C = crystals.SpinsMinus(['D',4])
|
|
731
|
+
sage: [[C[m].epsilon(i) for i in C.index_set()] for m in range(8)]
|
|
732
|
+
[[0, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0],
|
|
733
|
+
[0, 0, 0, 1], [1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0]]
|
|
734
|
+
"""
|
|
735
|
+
if i < 1 or i > self._n:
|
|
736
|
+
raise ValueError("i is not in the index set")
|
|
737
|
+
if i == self._n:
|
|
738
|
+
return self._value[i-1] and self._value[i-2]
|
|
739
|
+
return self._value[i-1] and not self._value[i]
|
|
740
|
+
|
|
741
|
+
cpdef int phi(self, int i) noexcept:
|
|
742
|
+
r"""
|
|
743
|
+
Return `\varphi_i` of ``self``.
|
|
744
|
+
|
|
745
|
+
EXAMPLES::
|
|
746
|
+
|
|
747
|
+
sage: C = crystals.SpinsPlus(['D',4])
|
|
748
|
+
sage: [[C[m].phi(i) for i in C.index_set()] for m in range(8)]
|
|
749
|
+
[[0, 0, 0, 1], [0, 1, 0, 0], [1, 0, 1, 0], [0, 0, 1, 0],
|
|
750
|
+
[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0]]
|
|
751
|
+
"""
|
|
752
|
+
if i < 1 or i > self._n:
|
|
753
|
+
raise ValueError("i is not in the index set")
|
|
754
|
+
if i == self._n:
|
|
755
|
+
return not self._value[i - 1] and not self._value[i - 2]
|
|
756
|
+
return self._value[i] and not self._value[i - 1]
|