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
sage/games/quantumino.py
ADDED
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Family Games America's Quantumino solver
|
|
5
|
+
|
|
6
|
+
This module allows to solve the `Quantumino puzzle
|
|
7
|
+
<http://familygamesamerica.com/mainsite/consumers/productview.php?pro_id=274&search=quantumino>`_
|
|
8
|
+
made by Family Games America (see also `this video
|
|
9
|
+
<http://www.youtube.com/watch?v=jX_VKzakZi8>`_ on Youtube). This puzzle was
|
|
10
|
+
left at the dinner room of the Laboratoire de Combinatoire Informatique
|
|
11
|
+
Mathématique in Montreal by Franco Saliola during winter 2011.
|
|
12
|
+
|
|
13
|
+
The solution uses the dancing links code which is in Sage and is based on
|
|
14
|
+
the more general code available in the module :mod:`sage.combinat.tiling`.
|
|
15
|
+
Dancing links were originally introduced by Donald Knuth in 2000
|
|
16
|
+
(:arxiv:`cs/0011047`). In particular,
|
|
17
|
+
Knuth used dancing links to solve tilings of a region by 2D pentaminos.
|
|
18
|
+
Here we extend the method for 3D pentaminos.
|
|
19
|
+
|
|
20
|
+
This module defines two classes :
|
|
21
|
+
|
|
22
|
+
- :class:`sage.games.quantumino.QuantuminoState` class, to represent a
|
|
23
|
+
state of the Quantumino game, i.e. a solution or a partial solution.
|
|
24
|
+
|
|
25
|
+
- :class:`sage.games.quantumino.QuantuminoSolver` class, to find, enumerate
|
|
26
|
+
and count the number of solutions of the Quantumino game where one of the
|
|
27
|
+
piece is put aside.
|
|
28
|
+
|
|
29
|
+
AUTHOR:
|
|
30
|
+
|
|
31
|
+
- Sébastien Labbé, April 28th, 2011
|
|
32
|
+
|
|
33
|
+
DESCRIPTION (from [1]):
|
|
34
|
+
|
|
35
|
+
"
|
|
36
|
+
Pentamino games have been taken to a whole different level; a 3-D
|
|
37
|
+
level, with this colorful creation! Using the original pentamino
|
|
38
|
+
arrangements of 5 connected squares which date from 1907, players are
|
|
39
|
+
encouraged to "think inside the box" as they try to fit 16 of the 17
|
|
40
|
+
3-D pentamino pieces inside the playing perimeters. Remove a different
|
|
41
|
+
piece each time you play for an entirely new challenge! Thousands of
|
|
42
|
+
solutions to be found!
|
|
43
|
+
Quantumino hands-on educational tool where players learn how shapes
|
|
44
|
+
can be transformed or arranged into predefined shapes and spaces.
|
|
45
|
+
Includes:
|
|
46
|
+
1 wooden frame, 17 wooden blocks, instruction booklet.
|
|
47
|
+
Age: 8+
|
|
48
|
+
"
|
|
49
|
+
|
|
50
|
+
EXAMPLES:
|
|
51
|
+
|
|
52
|
+
Here are the 17 wooden blocks of the Quantumino puzzle numbered from 0 to 16 in
|
|
53
|
+
the following 3d picture. They will show up in 3D in your default (=Jmol)
|
|
54
|
+
viewer::
|
|
55
|
+
|
|
56
|
+
sage: from sage.games.quantumino import show_pentaminos
|
|
57
|
+
sage: show_pentaminos() # needs sage.plot
|
|
58
|
+
Graphics3d Object
|
|
59
|
+
|
|
60
|
+
To solve the puzzle where the pentamino numbered 12 is put aside::
|
|
61
|
+
|
|
62
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
63
|
+
sage: s = next(QuantuminoSolver(12).solve()) # long time (10 s)
|
|
64
|
+
sage: s # long time (<1s)
|
|
65
|
+
Quantumino state where the following pentamino is put aside :
|
|
66
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 1, 0), (1, 1, 1), (2, 1, 1)], Color: blue
|
|
67
|
+
sage: s.show3d() # long time (<1s) # needs sage.plot
|
|
68
|
+
Graphics3d Object
|
|
69
|
+
|
|
70
|
+
To remove the frame::
|
|
71
|
+
|
|
72
|
+
sage: s.show3d().show(frame=False) # long time (<1s) # needs sage.plot
|
|
73
|
+
|
|
74
|
+
To solve the puzzle where the pentamino numbered 7 is put aside::
|
|
75
|
+
|
|
76
|
+
sage: s = next(QuantuminoSolver(7).solve()) # long time (10 s)
|
|
77
|
+
sage: s # long time (<1s)
|
|
78
|
+
Quantumino state where the following pentamino is put aside :
|
|
79
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 2, 1), (1, 0, 0)], Color: orange
|
|
80
|
+
sage: s.show3d() # long time (<1s) # needs sage.plot
|
|
81
|
+
Graphics3d Object
|
|
82
|
+
|
|
83
|
+
The solution is iterable. This may be used to explicitly list the positions of each
|
|
84
|
+
pentamino::
|
|
85
|
+
|
|
86
|
+
sage: for p in s: p # long time (<1s)
|
|
87
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
88
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
89
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
90
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
91
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
92
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
93
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
94
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
95
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
96
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
97
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
98
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
99
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
100
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
101
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
102
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
103
|
+
|
|
104
|
+
To get all the solutions, use the iterator returned by the ``solve``
|
|
105
|
+
method. Note that finding the first solution is the most time consuming
|
|
106
|
+
because it needs to create the complete data to describe the problem::
|
|
107
|
+
|
|
108
|
+
sage: it = QuantuminoSolver(7).solve()
|
|
109
|
+
sage: next(it) # not tested (10s)
|
|
110
|
+
Quantumino state where the following pentamino is put aside :
|
|
111
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 2, 1), (1, 0, 0)], Color: orange
|
|
112
|
+
sage: next(it) # not tested (0.001s)
|
|
113
|
+
Quantumino state where the following pentamino is put aside :
|
|
114
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 2, 1), (1, 0, 0)], Color: orange
|
|
115
|
+
sage: next(it) # not tested (0.001s)
|
|
116
|
+
Quantumino state where the following pentamino is put aside :
|
|
117
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 2, 1), (1, 0, 0)], Color: orange
|
|
118
|
+
|
|
119
|
+
To get the solution inside other boxes::
|
|
120
|
+
|
|
121
|
+
sage: s = next(QuantuminoSolver(7, box=(4,4,5)).solve()) # not tested (2s)
|
|
122
|
+
sage: s.show3d() # not tested (<1s) # needs sage.plot
|
|
123
|
+
|
|
124
|
+
::
|
|
125
|
+
|
|
126
|
+
sage: s = next(QuantuminoSolver(7, box=(2,2,20)).solve()) # not tested (1s)
|
|
127
|
+
sage: s.show3d() # not tested (<1s) # needs sage.plot
|
|
128
|
+
|
|
129
|
+
If there are no solution, a StopIteration error is raised::
|
|
130
|
+
|
|
131
|
+
sage: next(QuantuminoSolver(7, box=(3,3,3)).solve())
|
|
132
|
+
Traceback (most recent call last):
|
|
133
|
+
...
|
|
134
|
+
StopIteration
|
|
135
|
+
|
|
136
|
+
The implementation allows a lot of introspection. From the
|
|
137
|
+
:class:`~sage.combinat.tiling.TilingSolver` object,
|
|
138
|
+
it is possible to retrieve the rows that are passed to the DLX
|
|
139
|
+
solver and count them. It is also possible to get an instance of the DLX
|
|
140
|
+
solver to play with it::
|
|
141
|
+
|
|
142
|
+
sage: q = QuantuminoSolver(0)
|
|
143
|
+
sage: T = q.tiling_solver()
|
|
144
|
+
sage: T
|
|
145
|
+
Tiling solver of 16 pieces into a box of size 80
|
|
146
|
+
Rotation allowed: True
|
|
147
|
+
Reflection allowed: False
|
|
148
|
+
Reusing pieces allowed: False
|
|
149
|
+
sage: rows = T.rows() # not tested (10 s)
|
|
150
|
+
sage: len(rows) # not tested (but fast)
|
|
151
|
+
5484
|
|
152
|
+
sage: x = T.dlx_solver() # long time (10 s)
|
|
153
|
+
sage: x # long time (fast)
|
|
154
|
+
Dancing links solver for 96 columns and 5484 rows
|
|
155
|
+
|
|
156
|
+
TESTS:
|
|
157
|
+
|
|
158
|
+
We check that all pentaminos are equal to their canonical translate::
|
|
159
|
+
|
|
160
|
+
sage: from sage.games.quantumino import pentaminos
|
|
161
|
+
sage: all(p == p.canonical() for p in pentaminos)
|
|
162
|
+
True
|
|
163
|
+
|
|
164
|
+
REFERENCES:
|
|
165
|
+
|
|
166
|
+
- [1] `Family Games America's Quantumino
|
|
167
|
+
<http://familygamesamerica.com/mainsite/consumers/productview.php?pro_id=274&search=quantumino>`_
|
|
168
|
+
- [2] `Quantumino - How to Play <http://www.youtube.com/watch?v=jX_VKzakZi8>`_ on Youtube
|
|
169
|
+
- [3] Knuth, Donald (2000). *Dancing links*. :arxiv:`cs/0011047`.
|
|
170
|
+
"""
|
|
171
|
+
# ****************************************************************************
|
|
172
|
+
# Copyright (C) 2011 Sebastien Labbe <slabqc@gmail.com>
|
|
173
|
+
#
|
|
174
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
175
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
176
|
+
# the License, or (at your option) any later version.
|
|
177
|
+
# https://www.gnu.org/licenses/
|
|
178
|
+
# ****************************************************************************
|
|
179
|
+
|
|
180
|
+
from sage.structure.sage_object import SageObject
|
|
181
|
+
from sage.misc.lazy_import import lazy_import
|
|
182
|
+
lazy_import("sage.plot.all", "Graphics")
|
|
183
|
+
lazy_import("sage.plot.plot3d.platonic", "cube")
|
|
184
|
+
lazy_import("sage.plot.plot3d.shapes2", "text3d")
|
|
185
|
+
from sage.modules.free_module_element import vector
|
|
186
|
+
from sage.combinat.tiling import Polyomino, TilingSolver
|
|
187
|
+
|
|
188
|
+
################################################
|
|
189
|
+
# Example: The family games america: Quantumino
|
|
190
|
+
################################################
|
|
191
|
+
pentaminos = []
|
|
192
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (1,2,0), (1,1,1)], color='deeppink'))
|
|
193
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,0,1), (2,0,0), (2,1,0)], color='deeppink'))
|
|
194
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (1,2,0), (0,0,1)], color='green'))
|
|
195
|
+
pentaminos.append(Polyomino([(0,0,0), (0,1,0), (0,2,0), (1,0,0), (1,0,1)], color='green'))
|
|
196
|
+
pentaminos.append(Polyomino([(0,1,0), (1,0,1), (1,1,0), (1,1,1), (1,2,0)], color='red'))
|
|
197
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (1,0,1), (2,0,1)], color='red'))
|
|
198
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (1,2,0), (1,2,1)], color='orange'))
|
|
199
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (0,1,0), (0,2,0), (0,2,1)], color='orange'))
|
|
200
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (0,1,0), (1,1,0), (0,0,1)], color='yellow'))
|
|
201
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (1,1,1), (0,0,1)], color='yellow'))
|
|
202
|
+
pentaminos.append(Polyomino([(0,0,0), (0,1,0), (1,1,0), (0,2,0), (1,1,1)], color='midnightblue'))
|
|
203
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (1,0,1), (1,2,0)], color='darkblue'))
|
|
204
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (1,1,1), (2,1,1)], color='blue'))
|
|
205
|
+
pentaminos.append(Polyomino([(0,0,0), (0,1,0), (1,1,0), (1,1,1), (1,2,1)], color='blue'))
|
|
206
|
+
pentaminos.append(Polyomino([(0,0,0), (1,0,0), (1,1,0), (2,1,0), (2,1,1)], color='purple'))
|
|
207
|
+
pentaminos.append(Polyomino([(0,0,0), (0,1,0), (1,1,0), (1,2,0), (1,2,1)], color='purple'))
|
|
208
|
+
pentaminos.append(Polyomino([(0,1,0), (1,0,0), (1,1,0), (1,1,1), (1,2,0)], color='gray'))
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def show_pentaminos(box=(5, 8, 2)):
|
|
212
|
+
r"""
|
|
213
|
+
Show the 17 3-D pentaminos included in the game and the `5 \times 8
|
|
214
|
+
\times 2` box where 16 of them must fit.
|
|
215
|
+
|
|
216
|
+
INPUT:
|
|
217
|
+
|
|
218
|
+
- ``box`` -- tuple of size three (default: ``(5,8,2)``),
|
|
219
|
+
size of the box
|
|
220
|
+
|
|
221
|
+
OUTPUT: 3D Graphic object
|
|
222
|
+
|
|
223
|
+
EXAMPLES::
|
|
224
|
+
|
|
225
|
+
sage: from sage.games.quantumino import show_pentaminos
|
|
226
|
+
sage: show_pentaminos() # not tested (1s)
|
|
227
|
+
|
|
228
|
+
To remove the frame do::
|
|
229
|
+
|
|
230
|
+
sage: show_pentaminos().show(frame=False) # not tested (1s)
|
|
231
|
+
"""
|
|
232
|
+
G = Graphics()
|
|
233
|
+
for i, p in enumerate(pentaminos):
|
|
234
|
+
x = 4 * (i % 4)
|
|
235
|
+
y = 4 * (i // 4)
|
|
236
|
+
q = p + (x, y, 0)
|
|
237
|
+
G += q.show3d()
|
|
238
|
+
G += text3d(str(i), (x, y, 2))
|
|
239
|
+
G += cube(color='gray',opacity=0.5).scale(box).translate((17, 6, 0))
|
|
240
|
+
|
|
241
|
+
# hack to set the aspect ratio to 1
|
|
242
|
+
a, b = G.bounding_box()
|
|
243
|
+
a, b = map(vector, (a, b))
|
|
244
|
+
G.frame_aspect_ratio(tuple(b - a))
|
|
245
|
+
|
|
246
|
+
return G
|
|
247
|
+
|
|
248
|
+
##############################
|
|
249
|
+
# Class QuantuminoState
|
|
250
|
+
##############################
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
class QuantuminoState(SageObject):
|
|
254
|
+
r"""
|
|
255
|
+
A state of the Quantumino puzzle.
|
|
256
|
+
|
|
257
|
+
Used to represent a solution or a partial solution of the Quantumino
|
|
258
|
+
puzzle.
|
|
259
|
+
|
|
260
|
+
INPUT:
|
|
261
|
+
|
|
262
|
+
- ``pentos`` -- list of 16 3d pentamino representing the (partial)
|
|
263
|
+
solution
|
|
264
|
+
- ``aside`` -- 3d polyomino, the unused 3D pentamino
|
|
265
|
+
- ``box`` -- tuple of size three (default: ``(5,8,2)``),
|
|
266
|
+
size of the box
|
|
267
|
+
|
|
268
|
+
EXAMPLES::
|
|
269
|
+
|
|
270
|
+
sage: from sage.games.quantumino import pentaminos, QuantuminoState
|
|
271
|
+
sage: p = pentaminos[0]
|
|
272
|
+
sage: q = pentaminos[5]
|
|
273
|
+
sage: r = pentaminos[11]
|
|
274
|
+
sage: S = QuantuminoState([p,q], r)
|
|
275
|
+
sage: S
|
|
276
|
+
Quantumino state where the following pentamino is put aside :
|
|
277
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 2, 0)], Color: darkblue
|
|
278
|
+
|
|
279
|
+
::
|
|
280
|
+
|
|
281
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
282
|
+
sage: next(QuantuminoSolver(3).solve()) # not tested (1.5s)
|
|
283
|
+
Quantumino state where the following pentamino is put aside :
|
|
284
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (1, 0, 0), (1, 0, 1)], Color: green
|
|
285
|
+
"""
|
|
286
|
+
def __init__(self, pentos, aside, box=(5, 8, 2)):
|
|
287
|
+
r"""
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: from sage.games.quantumino import pentaminos, QuantuminoState
|
|
291
|
+
sage: p = pentaminos[0]
|
|
292
|
+
sage: q = pentaminos[5]
|
|
293
|
+
sage: QuantuminoState([p], q)
|
|
294
|
+
Quantumino state where the following pentamino is put aside :
|
|
295
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 0, 1), (1, 1, 0), (2, 0, 1)], Color: red
|
|
296
|
+
"""
|
|
297
|
+
assert all(isinstance(p, Polyomino) for p in pentos), "pentos must be an iterable of Polyomino"
|
|
298
|
+
assert isinstance(aside, Polyomino), "aside must be a Polyomino"
|
|
299
|
+
self._pentos = pentos
|
|
300
|
+
self._aside = aside
|
|
301
|
+
self._box = box
|
|
302
|
+
|
|
303
|
+
def __repr__(self):
|
|
304
|
+
r"""
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: from sage.games.quantumino import pentaminos, QuantuminoState
|
|
308
|
+
sage: p = pentaminos[0]
|
|
309
|
+
sage: q = pentaminos[5]
|
|
310
|
+
sage: QuantuminoState([p], q)
|
|
311
|
+
Quantumino state where the following pentamino is put aside :
|
|
312
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 0, 1), (1, 1, 0), (2, 0, 1)], Color: red
|
|
313
|
+
"""
|
|
314
|
+
return "Quantumino state where the following pentamino is put aside :\n%s" % self._aside
|
|
315
|
+
|
|
316
|
+
def __iter__(self):
|
|
317
|
+
r"""
|
|
318
|
+
EXAMPLES::
|
|
319
|
+
|
|
320
|
+
sage: from sage.games.quantumino import pentaminos, QuantuminoState
|
|
321
|
+
sage: p = pentaminos[0]
|
|
322
|
+
sage: q = pentaminos[5]
|
|
323
|
+
sage: r = pentaminos[11]
|
|
324
|
+
sage: S = QuantuminoState([p,q], r)
|
|
325
|
+
sage: for a in S: a
|
|
326
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 1, 0), (1, 1, 1), (1, 2, 0)], Color: deeppink
|
|
327
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 0, 1), (1, 1, 0), (2, 0, 1)], Color: red
|
|
328
|
+
"""
|
|
329
|
+
return iter(self._pentos)
|
|
330
|
+
|
|
331
|
+
def list(self):
|
|
332
|
+
r"""
|
|
333
|
+
Return the list of 3d polyomino making the solution.
|
|
334
|
+
|
|
335
|
+
EXAMPLES::
|
|
336
|
+
|
|
337
|
+
sage: from sage.games.quantumino import pentaminos, QuantuminoState
|
|
338
|
+
sage: p = pentaminos[0]
|
|
339
|
+
sage: q = pentaminos[5]
|
|
340
|
+
sage: r = pentaminos[11]
|
|
341
|
+
sage: S = QuantuminoState([p,q], r)
|
|
342
|
+
sage: L = S.list()
|
|
343
|
+
sage: L[0]
|
|
344
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 1, 0), (1, 1, 1), (1, 2, 0)], Color: deeppink
|
|
345
|
+
sage: L[1]
|
|
346
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 0, 1), (1, 1, 0), (2, 0, 1)], Color: red
|
|
347
|
+
"""
|
|
348
|
+
return list(self)
|
|
349
|
+
|
|
350
|
+
def show3d(self, size=0.85):
|
|
351
|
+
r"""
|
|
352
|
+
Return the solution as a 3D Graphic object.
|
|
353
|
+
|
|
354
|
+
OUTPUT: 3D Graphic Object
|
|
355
|
+
|
|
356
|
+
EXAMPLES::
|
|
357
|
+
|
|
358
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
359
|
+
sage: s = next(QuantuminoSolver(0).solve()) # not tested (1.5s)
|
|
360
|
+
sage: G = s.show3d() # not tested (<1s)
|
|
361
|
+
sage: type(G) # not tested
|
|
362
|
+
<class 'sage.plot.plot3d.base.Graphics3dGroup'>
|
|
363
|
+
|
|
364
|
+
To remove the frame::
|
|
365
|
+
|
|
366
|
+
sage: G.show(frame=False) # not tested
|
|
367
|
+
|
|
368
|
+
To see the solution with Tachyon viewer::
|
|
369
|
+
|
|
370
|
+
sage: G.show(viewer='tachyon', frame=False) # not tested
|
|
371
|
+
"""
|
|
372
|
+
G = Graphics()
|
|
373
|
+
for p in self:
|
|
374
|
+
G += p.show3d(size=size)
|
|
375
|
+
aside_pento = self._aside.canonical() + (2,-4,0)
|
|
376
|
+
G += aside_pento.show3d(size=size)
|
|
377
|
+
|
|
378
|
+
# the box to fill
|
|
379
|
+
half_box = tuple(a/2 for a in self._box)
|
|
380
|
+
b = cube(color='gray',opacity=0.2).scale(self._box).translate(half_box)
|
|
381
|
+
b = b.translate((0, -.5, -.5))
|
|
382
|
+
G += b
|
|
383
|
+
|
|
384
|
+
# hack to set the aspect ratio to 1
|
|
385
|
+
a,b = G.bounding_box()
|
|
386
|
+
a,b = map(vector, (a,b))
|
|
387
|
+
G.frame_aspect_ratio(tuple(b-a))
|
|
388
|
+
|
|
389
|
+
return G
|
|
390
|
+
|
|
391
|
+
##############################
|
|
392
|
+
# Class QuantuminoSolver
|
|
393
|
+
##############################
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
class QuantuminoSolver(SageObject):
|
|
397
|
+
r"""
|
|
398
|
+
Return the Quantumino solver for the given box where one of the
|
|
399
|
+
pentamino is put aside.
|
|
400
|
+
|
|
401
|
+
INPUT:
|
|
402
|
+
|
|
403
|
+
- ``aside`` -- integer, from 0 to 16, the aside pentamino
|
|
404
|
+
- ``box`` -- tuple of size three (default: ``(5,8,2)``),
|
|
405
|
+
size of the box
|
|
406
|
+
|
|
407
|
+
EXAMPLES::
|
|
408
|
+
|
|
409
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
410
|
+
sage: QuantuminoSolver(9)
|
|
411
|
+
Quantumino solver for the box (5, 8, 2)
|
|
412
|
+
Aside pentamino number: 9
|
|
413
|
+
sage: QuantuminoSolver(12, box=(5,4,4))
|
|
414
|
+
Quantumino solver for the box (5, 4, 4)
|
|
415
|
+
Aside pentamino number: 12
|
|
416
|
+
"""
|
|
417
|
+
def __init__(self, aside, box=(5, 8, 2)):
|
|
418
|
+
r"""
|
|
419
|
+
Constructor.
|
|
420
|
+
|
|
421
|
+
EXAMPLES::
|
|
422
|
+
|
|
423
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
424
|
+
sage: QuantuminoSolver(9)
|
|
425
|
+
Quantumino solver for the box (5, 8, 2)
|
|
426
|
+
Aside pentamino number: 9
|
|
427
|
+
"""
|
|
428
|
+
if not (0 <= aside < 17):
|
|
429
|
+
raise ValueError(f"aside (={aside}) must be between 0 and 16")
|
|
430
|
+
self._aside = aside
|
|
431
|
+
self._box = box
|
|
432
|
+
|
|
433
|
+
def __repr__(self):
|
|
434
|
+
r"""
|
|
435
|
+
String representation.
|
|
436
|
+
|
|
437
|
+
EXAMPLES::
|
|
438
|
+
|
|
439
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
440
|
+
sage: QuantuminoSolver(0)
|
|
441
|
+
Quantumino solver for the box (5, 8, 2)
|
|
442
|
+
Aside pentamino number: 0
|
|
443
|
+
"""
|
|
444
|
+
s = "Quantumino solver for the box %s\n" % (self._box, )
|
|
445
|
+
s += "Aside pentamino number: %s" % self._aside
|
|
446
|
+
return s
|
|
447
|
+
|
|
448
|
+
def tiling_solver(self):
|
|
449
|
+
r"""
|
|
450
|
+
Return the Tiling solver of the Quantumino Game where one of the
|
|
451
|
+
pentamino is put aside.
|
|
452
|
+
|
|
453
|
+
EXAMPLES::
|
|
454
|
+
|
|
455
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
456
|
+
sage: QuantuminoSolver(0).tiling_solver()
|
|
457
|
+
Tiling solver of 16 pieces into a box of size 80
|
|
458
|
+
Rotation allowed: True
|
|
459
|
+
Reflection allowed: False
|
|
460
|
+
Reusing pieces allowed: False
|
|
461
|
+
sage: QuantuminoSolver(14).tiling_solver()
|
|
462
|
+
Tiling solver of 16 pieces into a box of size 80
|
|
463
|
+
Rotation allowed: True
|
|
464
|
+
Reflection allowed: False
|
|
465
|
+
Reusing pieces allowed: False
|
|
466
|
+
sage: QuantuminoSolver(14, box=(5,4,4)).tiling_solver()
|
|
467
|
+
Tiling solver of 16 pieces into a box of size 80
|
|
468
|
+
Rotation allowed: True
|
|
469
|
+
Reflection allowed: False
|
|
470
|
+
Reusing pieces allowed: False
|
|
471
|
+
"""
|
|
472
|
+
pieces = pentaminos[:self._aside] + pentaminos[self._aside+1:]
|
|
473
|
+
return TilingSolver(pieces, box=self._box)
|
|
474
|
+
|
|
475
|
+
def solve(self, partial=None):
|
|
476
|
+
r"""
|
|
477
|
+
Return an iterator over the solutions where one of the pentamino is
|
|
478
|
+
put aside.
|
|
479
|
+
|
|
480
|
+
INPUT:
|
|
481
|
+
|
|
482
|
+
- ``partial`` -- string (default: ``None``), whether to
|
|
483
|
+
include partial (incomplete) solutions. It can be one of the
|
|
484
|
+
following:
|
|
485
|
+
|
|
486
|
+
- ``None`` -- include only complete solution
|
|
487
|
+
- ``'common'`` -- common part between two consecutive solutions
|
|
488
|
+
- ``'incremental'`` -- one piece change at a time
|
|
489
|
+
|
|
490
|
+
OUTPUT: iterator of :class:`QuantuminoState`
|
|
491
|
+
|
|
492
|
+
EXAMPLES:
|
|
493
|
+
|
|
494
|
+
Get one solution::
|
|
495
|
+
|
|
496
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
497
|
+
sage: s = next(QuantuminoSolver(8).solve()) # long time (9s)
|
|
498
|
+
sage: s # long time (fast)
|
|
499
|
+
Quantumino state where the following pentamino is put aside :
|
|
500
|
+
Polyomino: [(0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (1, 1, 0)], Color: yellow
|
|
501
|
+
sage: s.show3d() # long time (< 1s)
|
|
502
|
+
Graphics3d Object
|
|
503
|
+
|
|
504
|
+
The explicit solution::
|
|
505
|
+
|
|
506
|
+
sage: for p in s: p # long time (fast)
|
|
507
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
508
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
509
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
510
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
511
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
512
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
513
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
514
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
515
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
516
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
517
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
518
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
519
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
520
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
521
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
522
|
+
Polyomino: [(...), (...), (...), (...), (...)], Color: ...
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
Enumerate the solutions::
|
|
526
|
+
|
|
527
|
+
sage: it = QuantuminoSolver(0).solve()
|
|
528
|
+
sage: next(it) # not tested
|
|
529
|
+
Quantumino state where the following pentamino is put aside :
|
|
530
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 1, 0), (1, 1, 1), (1, 2, 0)], Color: deeppink
|
|
531
|
+
sage: next(it) # not tested
|
|
532
|
+
Quantumino state where the following pentamino is put aside :
|
|
533
|
+
Polyomino: [(0, 0, 0), (1, 0, 0), (1, 1, 0), (1, 1, 1), (1, 2, 0)], Color: deeppink
|
|
534
|
+
|
|
535
|
+
With the partial solutions included, one can see the evolution
|
|
536
|
+
between consecutive solutions (an animation would be better)::
|
|
537
|
+
|
|
538
|
+
sage: it = QuantuminoSolver(0).solve(partial='common')
|
|
539
|
+
sage: next(it).show3d() # not tested (2s)
|
|
540
|
+
sage: next(it).show3d() # not tested (< 1s)
|
|
541
|
+
sage: next(it).show3d() # not tested (< 1s)
|
|
542
|
+
|
|
543
|
+
Generalizations of the game inside different boxes::
|
|
544
|
+
|
|
545
|
+
sage: next(QuantuminoSolver(7, (4,4,5)).solve()) # long time (2s)
|
|
546
|
+
Quantumino state where the following pentamino is put aside :
|
|
547
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 2, 1), (1, 0, 0)], Color: orange
|
|
548
|
+
sage: next(QuantuminoSolver(7, (2,2,20)).solve()) # long time (1s)
|
|
549
|
+
Quantumino state where the following pentamino is put aside :
|
|
550
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 2, 1), (1, 0, 0)], Color: orange
|
|
551
|
+
sage: next(QuantuminoSolver(3, (2,2,20)).solve()) # long time (1s)
|
|
552
|
+
Quantumino state where the following pentamino is put aside :
|
|
553
|
+
Polyomino: [(0, 0, 0), (0, 1, 0), (0, 2, 0), (1, 0, 0), (1, 0, 1)], Color: green
|
|
554
|
+
|
|
555
|
+
If the volume of the box is not 80, there is no solution::
|
|
556
|
+
|
|
557
|
+
sage: next(QuantuminoSolver(7, box=(3,3,9)).solve())
|
|
558
|
+
Traceback (most recent call last):
|
|
559
|
+
...
|
|
560
|
+
StopIteration
|
|
561
|
+
|
|
562
|
+
If the box is too small, there is no solution::
|
|
563
|
+
|
|
564
|
+
sage: next(QuantuminoSolver(4, box=(40,2,1)).solve())
|
|
565
|
+
Traceback (most recent call last):
|
|
566
|
+
...
|
|
567
|
+
StopIteration
|
|
568
|
+
"""
|
|
569
|
+
T = self.tiling_solver()
|
|
570
|
+
aside = pentaminos[self._aside]
|
|
571
|
+
for pentos in T.solve(partial=partial):
|
|
572
|
+
yield QuantuminoState(pentos, aside, self._box)
|
|
573
|
+
|
|
574
|
+
def number_of_solutions(self):
|
|
575
|
+
r"""
|
|
576
|
+
Return the number of solutions.
|
|
577
|
+
|
|
578
|
+
OUTPUT: integer
|
|
579
|
+
|
|
580
|
+
EXAMPLES::
|
|
581
|
+
|
|
582
|
+
sage: from sage.games.quantumino import QuantuminoSolver
|
|
583
|
+
sage: QuantuminoSolver(4, box=(3,2,2)).number_of_solutions()
|
|
584
|
+
0
|
|
585
|
+
|
|
586
|
+
This computation takes several days::
|
|
587
|
+
|
|
588
|
+
sage: QuantuminoSolver(0).number_of_solutions() # not tested
|
|
589
|
+
??? hundreds of millions ???
|
|
590
|
+
"""
|
|
591
|
+
return self.tiling_solver().number_of_solutions()
|