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,476 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Frieze patterns
|
|
4
|
+
|
|
5
|
+
This implements the original frieze patterns due to Conway and Coxeter.
|
|
6
|
+
Such a frieze pattern is considered as a sequence of nonnegative
|
|
7
|
+
integers following [CoCo1]_ and [CoCo2]_ using
|
|
8
|
+
:class:`sage.combinat.path_tableaux.path_tableau`.
|
|
9
|
+
|
|
10
|
+
AUTHORS:
|
|
11
|
+
|
|
12
|
+
- Bruce Westbury (2019): initial version
|
|
13
|
+
"""
|
|
14
|
+
# ****************************************************************************
|
|
15
|
+
# Copyright (C) 2019 Bruce Westbury <bruce.westbury@gmail.com>,
|
|
16
|
+
#
|
|
17
|
+
# This program is free software: you can redistribute it and/or modify
|
|
18
|
+
# it under the terms of the GNU General Public License as published by
|
|
19
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
20
|
+
# (at your option) any later version.
|
|
21
|
+
# https://www.gnu.org/licenses/
|
|
22
|
+
# ****************************************************************************
|
|
23
|
+
|
|
24
|
+
from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
|
|
25
|
+
from sage.structure.parent import Parent
|
|
26
|
+
from sage.categories.sets_cat import Sets
|
|
27
|
+
from sage.combinat.path_tableaux.path_tableau import PathTableau, PathTableaux, CylindricalDiagram
|
|
28
|
+
from sage.categories.fields import Fields
|
|
29
|
+
from sage.rings.integer_ring import ZZ
|
|
30
|
+
from sage.rings.rational_field import QQ
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class FriezePattern(PathTableau, metaclass=InheritComparisonClasscallMetaclass):
|
|
34
|
+
r"""
|
|
35
|
+
A frieze pattern.
|
|
36
|
+
|
|
37
|
+
We encode a frieze pattern as a sequence in a fixed ground field.
|
|
38
|
+
|
|
39
|
+
INPUT:
|
|
40
|
+
|
|
41
|
+
- ``fp`` -- a sequence of elements of ``field``
|
|
42
|
+
- ``field`` -- (default: ``QQ``) the ground field
|
|
43
|
+
|
|
44
|
+
EXAMPLES::
|
|
45
|
+
|
|
46
|
+
sage: t = path_tableaux.FriezePattern([1,2,1,2,3,1])
|
|
47
|
+
sage: path_tableaux.CylindricalDiagram(t)
|
|
48
|
+
[0, 1, 2, 1, 2, 3, 1, 0]
|
|
49
|
+
[ , 0, 1, 1, 3, 5, 2, 1, 0]
|
|
50
|
+
[ , , 0, 1, 4, 7, 3, 2, 1, 0]
|
|
51
|
+
[ , , , 0, 1, 2, 1, 1, 1, 1, 0]
|
|
52
|
+
[ , , , , 0, 1, 1, 2, 3, 4, 1, 0]
|
|
53
|
+
[ , , , , , 0, 1, 3, 5, 7, 2, 1, 0]
|
|
54
|
+
[ , , , , , , 0, 1, 2, 3, 1, 1, 1, 0]
|
|
55
|
+
[ , , , , , , , 0, 1, 2, 1, 2, 3, 1, 0]
|
|
56
|
+
|
|
57
|
+
sage: TestSuite(t).run()
|
|
58
|
+
|
|
59
|
+
sage: t = path_tableaux.FriezePattern([1,2,7,5,3,7,4,1])
|
|
60
|
+
sage: path_tableaux.CylindricalDiagram(t)
|
|
61
|
+
[0, 1, 2, 7, 5, 3, 7, 4, 1, 0]
|
|
62
|
+
[ , 0, 1, 4, 3, 2, 5, 3, 1, 1, 0]
|
|
63
|
+
[ , , 0, 1, 1, 1, 3, 2, 1, 2, 1, 0]
|
|
64
|
+
[ , , , 0, 1, 2, 7, 5, 3, 7, 4, 1, 0]
|
|
65
|
+
[ , , , , 0, 1, 4, 3, 2, 5, 3, 1, 1, 0]
|
|
66
|
+
[ , , , , , 0, 1, 1, 1, 3, 2, 1, 2, 1, 0]
|
|
67
|
+
[ , , , , , , 0, 1, 2, 7, 5, 3, 7, 4, 1, 0]
|
|
68
|
+
[ , , , , , , , 0, 1, 4, 3, 2, 5, 3, 1, 1, 0]
|
|
69
|
+
[ , , , , , , , , 0, 1, 1, 1, 3, 2, 1, 2, 1, 0]
|
|
70
|
+
[ , , , , , , , , , 0, 1, 2, 7, 5, 3, 7, 4, 1, 0]
|
|
71
|
+
|
|
72
|
+
sage: TestSuite(t).run()
|
|
73
|
+
|
|
74
|
+
sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
|
|
75
|
+
sage: path_tableaux.CylindricalDiagram(t)
|
|
76
|
+
[ 0, 1, 3, 4, 5, 1, 0]
|
|
77
|
+
[ , 0, 1, 5/3, 7/3, 2/3, 1, 0]
|
|
78
|
+
[ , , 0, 1, 2, 1, 3, 1, 0]
|
|
79
|
+
[ , , , 0, 1, 1, 4, 5/3, 1, 0]
|
|
80
|
+
[ , , , , 0, 1, 5, 7/3, 2, 1, 0]
|
|
81
|
+
[ , , , , , 0, 1, 2/3, 1, 1, 1, 0]
|
|
82
|
+
[ , , , , , , 0, 1, 3, 4, 5, 1, 0]
|
|
83
|
+
|
|
84
|
+
sage: TestSuite(t).run()
|
|
85
|
+
|
|
86
|
+
This constructs the examples from [HJ18]_::
|
|
87
|
+
|
|
88
|
+
sage: # needs sage.rings.number_field
|
|
89
|
+
sage: x = polygen(ZZ, 'x')
|
|
90
|
+
sage: K.<sqrt3> = NumberField(x^2 - 3)
|
|
91
|
+
sage: t = path_tableaux.FriezePattern([1, sqrt3, 2, sqrt3, 1, 1], field=K)
|
|
92
|
+
sage: path_tableaux.CylindricalDiagram(t)
|
|
93
|
+
[ 0, 1, sqrt3, 2, sqrt3, 1, 1, 0]
|
|
94
|
+
[ , 0, 1, sqrt3, 2, sqrt3, sqrt3 + 1, 1, 0]
|
|
95
|
+
[ , , 0, 1, sqrt3, 2, sqrt3 + 2, sqrt3, 1, 0]
|
|
96
|
+
[ , , , 0, 1, sqrt3, sqrt3 + 2, 2, sqrt3, 1, 0]
|
|
97
|
+
[ , , , , 0, 1, sqrt3 + 1, sqrt3, 2, sqrt3, 1, 0]
|
|
98
|
+
[ , , , , , 0, 1, 1, sqrt3, 2, sqrt3, 1, 0]
|
|
99
|
+
[ , , , , , , 0, 1, sqrt3 + 1, sqrt3 + 2, sqrt3 + 2, sqrt3 + 1, 1, 0]
|
|
100
|
+
[ , , , , , , , 0, 1, sqrt3, 2, sqrt3, 1, 1, 0]
|
|
101
|
+
sage: TestSuite(t).run()
|
|
102
|
+
|
|
103
|
+
sage: # needs sage.rings.number_field
|
|
104
|
+
sage: K.<sqrt2> = NumberField(x^2 - 2)
|
|
105
|
+
sage: t = path_tableaux.FriezePattern([1, sqrt2, 1, sqrt2, 3, 2*sqrt2, 5, 3*sqrt2, 1],
|
|
106
|
+
....: field=K)
|
|
107
|
+
sage: path_tableaux.CylindricalDiagram(t)
|
|
108
|
+
[ 0, 1, sqrt2, 1, sqrt2, 3, 2*sqrt2, 5, 3*sqrt2, 1, 0]
|
|
109
|
+
[ , 0, 1, sqrt2, 3, 5*sqrt2, 7, 9*sqrt2, 11, 2*sqrt2, 1, 0]
|
|
110
|
+
[ , , 0, 1, 2*sqrt2, 7, 5*sqrt2, 13, 8*sqrt2, 3, sqrt2, 1, 0]
|
|
111
|
+
[ , , , 0, 1, 2*sqrt2, 3, 4*sqrt2, 5, sqrt2, 1, sqrt2, 1, 0]
|
|
112
|
+
[ , , , , 0, 1, sqrt2, 3, 2*sqrt2, 1, sqrt2, 3, 2*sqrt2, 1, 0]
|
|
113
|
+
[ , , , , , 0, 1, 2*sqrt2, 3, sqrt2, 3, 5*sqrt2, 7, 2*sqrt2, 1, 0]
|
|
114
|
+
[ , , , , , , 0, 1, sqrt2, 1, 2*sqrt2, 7, 5*sqrt2, 3, sqrt2, 1, 0]
|
|
115
|
+
[ , , , , , , , 0, 1, sqrt2, 5, 9*sqrt2, 13, 4*sqrt2, 3, 2*sqrt2, 1, 0]
|
|
116
|
+
[ , , , , , , , , 0, 1, 3*sqrt2, 11, 8*sqrt2, 5, 2*sqrt2, 3, sqrt2, 1, 0]
|
|
117
|
+
[ , , , , , , , , , 0, 1, 2*sqrt2, 3, sqrt2, 1, sqrt2, 1, sqrt2, 1, 0]
|
|
118
|
+
[ , , , , , , , , , , 0, 1, sqrt2, 1, sqrt2, 3, 2*sqrt2, 5, 3*sqrt2, 1, 0]
|
|
119
|
+
sage: TestSuite(t).run()
|
|
120
|
+
"""
|
|
121
|
+
@staticmethod
|
|
122
|
+
def __classcall_private__(cls, fp, field=QQ):
|
|
123
|
+
r"""
|
|
124
|
+
This is the preprocessing for creating friezes.
|
|
125
|
+
|
|
126
|
+
EXAMPLES::
|
|
127
|
+
|
|
128
|
+
sage: path_tableaux.FriezePattern([1,2,1,2,3,1])
|
|
129
|
+
[1, 2, 1, 2, 3, 1]
|
|
130
|
+
|
|
131
|
+
TESTS::
|
|
132
|
+
|
|
133
|
+
sage: path_tableaux.FriezePattern(2)
|
|
134
|
+
Traceback (most recent call last):
|
|
135
|
+
...
|
|
136
|
+
ValueError: invalid input 2
|
|
137
|
+
|
|
138
|
+
sage: x = polygen(ZZ, 'x')
|
|
139
|
+
sage: K.<sqrt3> = NumberField(x^2 - 3) # needs sage.rings.number_field
|
|
140
|
+
sage: t = path_tableaux.FriezePattern([1,sqrt3,2,sqrt3,1,1]) # needs sage.rings.number_field
|
|
141
|
+
Traceback (most recent call last):
|
|
142
|
+
...
|
|
143
|
+
ValueError: [1, sqrt3, 2, sqrt3, 1, 1] is not a sequence in the field Rational Field
|
|
144
|
+
|
|
145
|
+
sage: path_tableaux.FriezePattern([1,2,1,2,3,1], field=Integers())
|
|
146
|
+
Traceback (most recent call last):
|
|
147
|
+
...
|
|
148
|
+
ValueError: Integer Ring must be a field
|
|
149
|
+
"""
|
|
150
|
+
if field not in Fields():
|
|
151
|
+
raise ValueError(f"{field} must be a field")
|
|
152
|
+
|
|
153
|
+
if isinstance(fp, (list, tuple)):
|
|
154
|
+
try:
|
|
155
|
+
fp = [field(a) for a in fp]
|
|
156
|
+
except TypeError:
|
|
157
|
+
raise ValueError(f"{fp} is not a sequence in the field {field}")
|
|
158
|
+
else:
|
|
159
|
+
raise ValueError(f"invalid input {fp}")
|
|
160
|
+
|
|
161
|
+
fp.insert(0, field(0))
|
|
162
|
+
fp.append(field(0))
|
|
163
|
+
return FriezePatterns(field)(tuple(fp))
|
|
164
|
+
|
|
165
|
+
def check(self):
|
|
166
|
+
r"""
|
|
167
|
+
Check that ``self`` is a valid frieze pattern.
|
|
168
|
+
|
|
169
|
+
TESTS::
|
|
170
|
+
|
|
171
|
+
sage: path_tableaux.FriezePattern([1,2,1,2,3,1]) # indirect test
|
|
172
|
+
[1, 2, 1, 2, 3, 1]
|
|
173
|
+
"""
|
|
174
|
+
# Nothing to check
|
|
175
|
+
pass
|
|
176
|
+
|
|
177
|
+
def _repr_(self):
|
|
178
|
+
r"""
|
|
179
|
+
Return the string representation of ``self``.
|
|
180
|
+
|
|
181
|
+
This removes the leading and trailing zero.
|
|
182
|
+
|
|
183
|
+
TESTS::
|
|
184
|
+
|
|
185
|
+
sage: t = path_tableaux.FriezePattern([1,2,1,2,3,1])
|
|
186
|
+
sage: repr(t) == t._repr_() # indirect test
|
|
187
|
+
True
|
|
188
|
+
"""
|
|
189
|
+
return repr(self[1:-1])
|
|
190
|
+
|
|
191
|
+
def local_rule(self, i):
|
|
192
|
+
r"""
|
|
193
|
+
Return the `i`-th local rule on ``self``.
|
|
194
|
+
|
|
195
|
+
This interprets ``self`` as a list of objects. This method first takes
|
|
196
|
+
the list of objects of length three consisting of the `(i-1)`-st,
|
|
197
|
+
`i`-th and `(i+1)`-term and applies the rule. It then replaces
|
|
198
|
+
the `i`-th object by the object returned by the rule.
|
|
199
|
+
|
|
200
|
+
EXAMPLES::
|
|
201
|
+
|
|
202
|
+
sage: t = path_tableaux.FriezePattern([1,2,1,2,3,1])
|
|
203
|
+
sage: t.local_rule(3)
|
|
204
|
+
[1, 2, 5, 2, 3, 1]
|
|
205
|
+
|
|
206
|
+
sage: t = path_tableaux.FriezePattern([1,2,1,2,3,1])
|
|
207
|
+
sage: t.local_rule(0)
|
|
208
|
+
Traceback (most recent call last):
|
|
209
|
+
...
|
|
210
|
+
ValueError: 0 is not a valid integer
|
|
211
|
+
"""
|
|
212
|
+
def _rule(x):
|
|
213
|
+
"""
|
|
214
|
+
This is the rule on a sequence of three scalars.
|
|
215
|
+
"""
|
|
216
|
+
return (x[0] * x[2] + 1) / x[1]
|
|
217
|
+
|
|
218
|
+
if not (0 < i < len(self) - 1):
|
|
219
|
+
raise ValueError(f"{i} is not a valid integer")
|
|
220
|
+
|
|
221
|
+
with self.clone() as result:
|
|
222
|
+
result[i] = _rule(self[i-1:i+2])
|
|
223
|
+
|
|
224
|
+
return result
|
|
225
|
+
|
|
226
|
+
def is_skew(self):
|
|
227
|
+
r"""
|
|
228
|
+
Return ``True`` if ``self`` is skew and ``False`` if not.
|
|
229
|
+
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: path_tableaux.FriezePattern([1,2,1,2,3,1]).is_skew()
|
|
233
|
+
False
|
|
234
|
+
|
|
235
|
+
sage: path_tableaux.FriezePattern([2,2,1,2,3,1]).is_skew()
|
|
236
|
+
True
|
|
237
|
+
"""
|
|
238
|
+
return self[1] != 1
|
|
239
|
+
|
|
240
|
+
def width(self):
|
|
241
|
+
r"""
|
|
242
|
+
Return the width of ``self``.
|
|
243
|
+
|
|
244
|
+
If the first and last terms of ``self`` are 1 then this is the
|
|
245
|
+
length of ``self`` plus two and otherwise is undefined.
|
|
246
|
+
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: path_tableaux.FriezePattern([1,2,1,2,3,1]).width()
|
|
250
|
+
8
|
|
251
|
+
|
|
252
|
+
sage: path_tableaux.FriezePattern([1,2,1,2,3,4]).width() is None
|
|
253
|
+
True
|
|
254
|
+
"""
|
|
255
|
+
if self[1] == 1 and self[-2] == 1:
|
|
256
|
+
return len(self)
|
|
257
|
+
else:
|
|
258
|
+
return None
|
|
259
|
+
|
|
260
|
+
def is_positive(self):
|
|
261
|
+
r"""
|
|
262
|
+
Return ``True`` if all elements of ``self`` are positive.
|
|
263
|
+
|
|
264
|
+
This implies that all entries of ``CylindricalDiagram(self)``
|
|
265
|
+
are positive.
|
|
266
|
+
|
|
267
|
+
.. WARNING::
|
|
268
|
+
|
|
269
|
+
There are orders on all fields. These may not be ordered fields
|
|
270
|
+
as they may not be compatible with the field operations. This
|
|
271
|
+
method is intended to be used with ordered fields only.
|
|
272
|
+
|
|
273
|
+
EXAMPLES::
|
|
274
|
+
|
|
275
|
+
sage: path_tableaux.FriezePattern([1,2,7,5,3,7,4,1]).is_positive()
|
|
276
|
+
True
|
|
277
|
+
|
|
278
|
+
sage: path_tableaux.FriezePattern([1,-3,4,5,1]).is_positive()
|
|
279
|
+
False
|
|
280
|
+
|
|
281
|
+
sage: x = polygen(ZZ, 'x')
|
|
282
|
+
sage: K.<sqrt3> = NumberField(x^2 - 3) # needs sage.rings.number_field
|
|
283
|
+
sage: path_tableaux.FriezePattern([1,sqrt3,1], K).is_positive() # needs sage.rings.number_field
|
|
284
|
+
True
|
|
285
|
+
"""
|
|
286
|
+
return all(a > 0 for a in self[1:-1])
|
|
287
|
+
|
|
288
|
+
def is_integral(self):
|
|
289
|
+
r"""
|
|
290
|
+
Return ``True`` if all entries of the frieze pattern are
|
|
291
|
+
positive integers.
|
|
292
|
+
|
|
293
|
+
EXAMPLES::
|
|
294
|
+
|
|
295
|
+
sage: path_tableaux.FriezePattern([1,2,7,5,3,7,4,1]).is_integral()
|
|
296
|
+
True
|
|
297
|
+
|
|
298
|
+
sage: path_tableaux.FriezePattern([1,3,4,5,1]).is_integral()
|
|
299
|
+
False
|
|
300
|
+
"""
|
|
301
|
+
n = len(self)
|
|
302
|
+
cd = CylindricalDiagram(self).diagram
|
|
303
|
+
return all(k in ZZ for i, a in enumerate(cd)
|
|
304
|
+
for k in a[i + 1:n + i - 2])
|
|
305
|
+
|
|
306
|
+
def triangulation(self):
|
|
307
|
+
r"""
|
|
308
|
+
Plot a regular polygon with some diagonals.
|
|
309
|
+
|
|
310
|
+
If ``self`` is positive and integral then this will be a triangulation.
|
|
311
|
+
|
|
312
|
+
.. PLOT::
|
|
313
|
+
:width: 400 px
|
|
314
|
+
|
|
315
|
+
G = path_tableaux.FriezePattern([1,2,7,5,3,7,4,1]).triangulation()
|
|
316
|
+
sphinx_plot(G)
|
|
317
|
+
|
|
318
|
+
EXAMPLES::
|
|
319
|
+
|
|
320
|
+
sage: path_tableaux.FriezePattern([1,2,7,5,3,7,4,1]).triangulation() # needs sage.plot sage.symbolic
|
|
321
|
+
Graphics object consisting of 25 graphics primitives
|
|
322
|
+
|
|
323
|
+
sage: path_tableaux.FriezePattern([1,2,1/7,5,3]).triangulation() # needs sage.plot sage.symbolic
|
|
324
|
+
Graphics object consisting of 12 graphics primitives
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
sage: x = polygen(ZZ, 'x')
|
|
328
|
+
sage: K.<sqrt2> = NumberField(x^2 - 2) # needs sage.rings.number_field
|
|
329
|
+
sage: path_tableaux.FriezePattern([1,sqrt2,1,sqrt2,3,2*sqrt2,5,3*sqrt2,1], # needs sage.plot sage.rings.number_field sage.symbolic
|
|
330
|
+
....: field=K).triangulation()
|
|
331
|
+
Graphics object consisting of 24 graphics primitives
|
|
332
|
+
"""
|
|
333
|
+
n = len(self)-1
|
|
334
|
+
cd = CylindricalDiagram(self).diagram
|
|
335
|
+
from sage.plot.plot import Graphics
|
|
336
|
+
from sage.plot.line import line
|
|
337
|
+
from sage.plot.text import text
|
|
338
|
+
from sage.functions.trig import sin, cos
|
|
339
|
+
from sage.symbolic.constants import pi
|
|
340
|
+
G = Graphics()
|
|
341
|
+
G.set_aspect_ratio(1.0)
|
|
342
|
+
|
|
343
|
+
vt = [(cos(2*theta*pi/(n)), sin(2*theta*pi/(n)))
|
|
344
|
+
for theta in range(n+1)]
|
|
345
|
+
for i, p in enumerate(vt):
|
|
346
|
+
G += text(str(i), [1.05*p[0], 1.05*p[1]])
|
|
347
|
+
|
|
348
|
+
for i, r in enumerate(cd):
|
|
349
|
+
for j, a in enumerate(r[:n]):
|
|
350
|
+
if a == 1:
|
|
351
|
+
G += line([vt[i], vt[j]])
|
|
352
|
+
|
|
353
|
+
G.axes(False)
|
|
354
|
+
return G
|
|
355
|
+
|
|
356
|
+
def plot(self, model='UHP'):
|
|
357
|
+
r"""
|
|
358
|
+
Plot the frieze as an ideal hyperbolic polygon.
|
|
359
|
+
|
|
360
|
+
This is only defined up to isometry of the hyperbolic plane.
|
|
361
|
+
|
|
362
|
+
We are identifying the boundary of the hyperbolic plane with the
|
|
363
|
+
real projective line.
|
|
364
|
+
|
|
365
|
+
The option ``model`` must be one of
|
|
366
|
+
|
|
367
|
+
* ``'UHP'`` -- (default) for the upper half plane model
|
|
368
|
+
* ``'PD'`` -- for the Poincare disk model
|
|
369
|
+
* ``'KM'`` -- for the Klein model
|
|
370
|
+
|
|
371
|
+
The hyperboloid model is not an option as this does not implement
|
|
372
|
+
boundary points.
|
|
373
|
+
|
|
374
|
+
.. PLOT::
|
|
375
|
+
:width: 400 px
|
|
376
|
+
|
|
377
|
+
t = path_tableaux.FriezePattern([1,2,7,5,3,7,4,1])
|
|
378
|
+
sphinx_plot(t.plot())
|
|
379
|
+
|
|
380
|
+
EXAMPLES::
|
|
381
|
+
|
|
382
|
+
sage: # needs sage.plot sage.symbolic
|
|
383
|
+
sage: t = path_tableaux.FriezePattern([1,2,7,5,3,7,4,1])
|
|
384
|
+
sage: t.plot()
|
|
385
|
+
Graphics object consisting of 18 graphics primitives
|
|
386
|
+
sage: t.plot(model='UHP')
|
|
387
|
+
Graphics object consisting of 18 graphics primitives
|
|
388
|
+
sage: t.plot(model='PD')
|
|
389
|
+
Traceback (most recent call last):
|
|
390
|
+
...
|
|
391
|
+
TypeError: '>' not supported between instances of 'NotANumber' and 'Pi'
|
|
392
|
+
sage: t.plot(model='KM')
|
|
393
|
+
Graphics object consisting of 18 graphics primitives
|
|
394
|
+
"""
|
|
395
|
+
from sage.geometry.hyperbolic_space.hyperbolic_interface import HyperbolicPlane
|
|
396
|
+
from sage.plot.plot import Graphics
|
|
397
|
+
models = {
|
|
398
|
+
'UHP': HyperbolicPlane().UHP(),
|
|
399
|
+
'PD': HyperbolicPlane().PD(),
|
|
400
|
+
'KM': HyperbolicPlane().KM(),
|
|
401
|
+
}
|
|
402
|
+
if model not in models:
|
|
403
|
+
raise ValueError(f"{model} must be one of ``UHP``, ``PD``, ``KM``")
|
|
404
|
+
M = models[model]
|
|
405
|
+
|
|
406
|
+
U = HyperbolicPlane().UHP()
|
|
407
|
+
cd = CylindricalDiagram(self).diagram
|
|
408
|
+
num = cd[0][:-1]
|
|
409
|
+
den = cd[1][2:]
|
|
410
|
+
vt = [M(U.get_point(x / (x+y))) for x, y in zip(num, den)]
|
|
411
|
+
gd = [M.get_geodesic(vt[i-1], vt[i]) for i in range(len(vt))]
|
|
412
|
+
return sum([a.plot() for a in gd], Graphics()).plot()
|
|
413
|
+
|
|
414
|
+
def change_ring(self, R):
|
|
415
|
+
r"""
|
|
416
|
+
Return ``self`` as a frieze pattern with coefficients in ``R``.
|
|
417
|
+
|
|
418
|
+
This assumes that there is a canonical coerce map from the base ring of ``self``
|
|
419
|
+
to ``R``.
|
|
420
|
+
|
|
421
|
+
EXAMPLES::
|
|
422
|
+
|
|
423
|
+
sage: fp = path_tableaux.FriezePattern([1,2,7,5,3,7,4,1])
|
|
424
|
+
sage: fp.change_ring(RealField()) # needs sage.rings.real_mpfr
|
|
425
|
+
[0.000000000000000, 1.00000000000000, ...
|
|
426
|
+
4.00000000000000, 1.00000000000000, 0.000000000000000]
|
|
427
|
+
sage: fp.change_ring(GF(7))
|
|
428
|
+
Traceback (most recent call last):
|
|
429
|
+
...
|
|
430
|
+
TypeError: no base extension defined
|
|
431
|
+
"""
|
|
432
|
+
if R.has_coerce_map_from(self.parent().base_ring()):
|
|
433
|
+
return FriezePattern(list(self), field=R)
|
|
434
|
+
else:
|
|
435
|
+
raise TypeError("no base extension defined")
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
class FriezePatterns(PathTableaux):
|
|
439
|
+
"""
|
|
440
|
+
The set of all frieze patterns.
|
|
441
|
+
|
|
442
|
+
EXAMPLES::
|
|
443
|
+
|
|
444
|
+
sage: P = path_tableaux.FriezePatterns(QQ)
|
|
445
|
+
sage: fp = P((1, 1, 1))
|
|
446
|
+
sage: fp
|
|
447
|
+
[1]
|
|
448
|
+
sage: path_tableaux.CylindricalDiagram(fp)
|
|
449
|
+
[1, 1, 1]
|
|
450
|
+
[ , 1, 2, 1]
|
|
451
|
+
[ , , 1, 1, 1]
|
|
452
|
+
"""
|
|
453
|
+
|
|
454
|
+
def __init__(self, field):
|
|
455
|
+
r"""
|
|
456
|
+
Initialize ``self``.
|
|
457
|
+
|
|
458
|
+
TESTS::
|
|
459
|
+
|
|
460
|
+
sage: P = path_tableaux.FriezePatterns(QQ)
|
|
461
|
+
sage: TestSuite(P).run()
|
|
462
|
+
"""
|
|
463
|
+
Parent.__init__(self, base=field, category=Sets())
|
|
464
|
+
|
|
465
|
+
def _an_element_(self):
|
|
466
|
+
"""
|
|
467
|
+
Return an element of ``self``.
|
|
468
|
+
|
|
469
|
+
EXAMPLES::
|
|
470
|
+
|
|
471
|
+
sage: path_tableaux.FriezePatterns(QQ)._an_element_()
|
|
472
|
+
[1, 1, 1]
|
|
473
|
+
"""
|
|
474
|
+
return FriezePattern((1, 1, 1))
|
|
475
|
+
|
|
476
|
+
Element = FriezePattern
|