passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
  3. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  4. passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
  5. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  6. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  7. passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
  8. passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
  9. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  10. sage/algebras/all.py +24 -0
  11. sage/algebras/all__sagemath_combinat.py +35 -0
  12. sage/algebras/askey_wilson.py +935 -0
  13. sage/algebras/associated_graded.py +345 -0
  14. sage/algebras/cellular_basis.py +350 -0
  15. sage/algebras/cluster_algebra.py +2766 -0
  16. sage/algebras/down_up_algebra.py +860 -0
  17. sage/algebras/free_algebra.py +1698 -0
  18. sage/algebras/free_algebra_element.py +345 -0
  19. sage/algebras/free_algebra_quotient.py +405 -0
  20. sage/algebras/free_algebra_quotient_element.py +295 -0
  21. sage/algebras/free_zinbiel_algebra.py +885 -0
  22. sage/algebras/hall_algebra.py +783 -0
  23. sage/algebras/hecke_algebras/all.py +4 -0
  24. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  25. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  28. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  29. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  30. sage/algebras/jordan_algebra.py +1773 -0
  31. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  32. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  33. sage/algebras/lie_conformal_algebras/all.py +18 -0
  34. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  35. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  36. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  37. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  38. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  39. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  40. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  41. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  45. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  46. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  47. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  48. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  49. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  50. sage/algebras/nil_coxeter_algebra.py +191 -0
  51. sage/algebras/q_commuting_polynomials.py +673 -0
  52. sage/algebras/q_system.py +608 -0
  53. sage/algebras/quantum_clifford.py +959 -0
  54. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  55. sage/algebras/quantum_groups/all.py +9 -0
  56. sage/algebras/quantum_groups/fock_space.py +2219 -0
  57. sage/algebras/quantum_groups/q_numbers.py +207 -0
  58. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  59. sage/algebras/quantum_groups/representations.py +591 -0
  60. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  61. sage/algebras/quantum_oscillator.py +623 -0
  62. sage/algebras/quaternion_algebra.py +20 -0
  63. sage/algebras/quaternion_algebra_element.py +55 -0
  64. sage/algebras/rational_cherednik_algebra.py +525 -0
  65. sage/algebras/schur_algebra.py +670 -0
  66. sage/algebras/shuffle_algebra.py +1011 -0
  67. sage/algebras/splitting_algebra.py +779 -0
  68. sage/algebras/tensor_algebra.py +709 -0
  69. sage/algebras/yangian.py +1082 -0
  70. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  71. sage/all__sagemath_combinat.py +44 -0
  72. sage/combinat/SJT.py +255 -0
  73. sage/combinat/affine_permutation.py +2405 -0
  74. sage/combinat/algebraic_combinatorics.py +55 -0
  75. sage/combinat/all.py +53 -0
  76. sage/combinat/all__sagemath_combinat.py +195 -0
  77. sage/combinat/alternating_sign_matrix.py +2063 -0
  78. sage/combinat/baxter_permutations.py +346 -0
  79. sage/combinat/bijectionist.py +3220 -0
  80. sage/combinat/binary_recurrence_sequences.py +1180 -0
  81. sage/combinat/blob_algebra.py +685 -0
  82. sage/combinat/catalog_partitions.py +27 -0
  83. sage/combinat/chas/all.py +23 -0
  84. sage/combinat/chas/fsym.py +1180 -0
  85. sage/combinat/chas/wqsym.py +2601 -0
  86. sage/combinat/cluster_complex.py +326 -0
  87. sage/combinat/colored_permutations.py +2039 -0
  88. sage/combinat/colored_permutations_representations.py +964 -0
  89. sage/combinat/composition_signed.py +142 -0
  90. sage/combinat/composition_tableau.py +855 -0
  91. sage/combinat/constellation.py +1729 -0
  92. sage/combinat/core.py +751 -0
  93. sage/combinat/counting.py +12 -0
  94. sage/combinat/crystals/affine.py +742 -0
  95. sage/combinat/crystals/affine_factorization.py +518 -0
  96. sage/combinat/crystals/affinization.py +331 -0
  97. sage/combinat/crystals/alcove_path.py +2013 -0
  98. sage/combinat/crystals/all.py +22 -0
  99. sage/combinat/crystals/bkk_crystals.py +141 -0
  100. sage/combinat/crystals/catalog.py +115 -0
  101. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  102. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  103. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  104. sage/combinat/crystals/crystals.py +257 -0
  105. sage/combinat/crystals/direct_sum.py +260 -0
  106. sage/combinat/crystals/elementary_crystals.py +1251 -0
  107. sage/combinat/crystals/fast_crystals.py +441 -0
  108. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  109. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  110. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  111. sage/combinat/crystals/induced_structure.py +695 -0
  112. sage/combinat/crystals/infinity_crystals.py +730 -0
  113. sage/combinat/crystals/kac_modules.py +863 -0
  114. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  115. sage/combinat/crystals/kyoto_path_model.py +497 -0
  116. sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
  117. sage/combinat/crystals/letters.pxd +79 -0
  118. sage/combinat/crystals/letters.pyx +3056 -0
  119. sage/combinat/crystals/littelmann_path.py +1518 -0
  120. sage/combinat/crystals/monomial_crystals.py +1262 -0
  121. sage/combinat/crystals/multisegments.py +462 -0
  122. sage/combinat/crystals/mv_polytopes.py +467 -0
  123. sage/combinat/crystals/pbw_crystal.py +511 -0
  124. sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
  125. sage/combinat/crystals/pbw_datum.pxd +4 -0
  126. sage/combinat/crystals/pbw_datum.pyx +487 -0
  127. sage/combinat/crystals/polyhedral_realization.py +372 -0
  128. sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
  129. sage/combinat/crystals/spins.pxd +21 -0
  130. sage/combinat/crystals/spins.pyx +756 -0
  131. sage/combinat/crystals/star_crystal.py +290 -0
  132. sage/combinat/crystals/subcrystal.py +464 -0
  133. sage/combinat/crystals/tensor_product.py +1177 -0
  134. sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
  135. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  136. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  137. sage/combinat/crystals/virtual_crystal.py +420 -0
  138. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  139. sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
  140. sage/combinat/debruijn_sequence.pyx +355 -0
  141. sage/combinat/decorated_permutation.py +270 -0
  142. sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
  143. sage/combinat/degree_sequences.pyx +588 -0
  144. sage/combinat/derangements.py +527 -0
  145. sage/combinat/descent_algebra.py +1008 -0
  146. sage/combinat/diagram.py +1551 -0
  147. sage/combinat/diagram_algebras.py +5886 -0
  148. sage/combinat/dyck_word.py +4349 -0
  149. sage/combinat/e_one_star.py +1623 -0
  150. sage/combinat/enumerated_sets.py +123 -0
  151. sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
  152. sage/combinat/expnums.pyx +148 -0
  153. sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
  154. sage/combinat/fast_vector_partitions.pyx +346 -0
  155. sage/combinat/fqsym.py +1977 -0
  156. sage/combinat/free_dendriform_algebra.py +954 -0
  157. sage/combinat/free_prelie_algebra.py +1141 -0
  158. sage/combinat/fully_commutative_elements.py +1077 -0
  159. sage/combinat/fully_packed_loop.py +1523 -0
  160. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  161. sage/combinat/gray_codes.py +311 -0
  162. sage/combinat/grossman_larson_algebras.py +667 -0
  163. sage/combinat/growth.py +4352 -0
  164. sage/combinat/hall_polynomial.py +188 -0
  165. sage/combinat/hillman_grassl.py +866 -0
  166. sage/combinat/integer_matrices.py +329 -0
  167. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  168. sage/combinat/k_tableau.py +4564 -0
  169. sage/combinat/kazhdan_lusztig.py +215 -0
  170. sage/combinat/key_polynomial.py +885 -0
  171. sage/combinat/knutson_tao_puzzles.py +2286 -0
  172. sage/combinat/lr_tableau.py +311 -0
  173. sage/combinat/matrices/all.py +24 -0
  174. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  175. sage/combinat/matrices/latin.py +2912 -0
  176. sage/combinat/misc.py +401 -0
  177. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  178. sage/combinat/ncsf_qsym/all.py +21 -0
  179. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  180. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  181. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  182. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  183. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  184. sage/combinat/ncsym/all.py +21 -0
  185. sage/combinat/ncsym/bases.py +855 -0
  186. sage/combinat/ncsym/dual.py +593 -0
  187. sage/combinat/ncsym/ncsym.py +2076 -0
  188. sage/combinat/necklace.py +551 -0
  189. sage/combinat/non_decreasing_parking_function.py +634 -0
  190. sage/combinat/nu_dyck_word.py +1474 -0
  191. sage/combinat/output.py +861 -0
  192. sage/combinat/parallelogram_polyomino.py +4326 -0
  193. sage/combinat/parking_functions.py +1602 -0
  194. sage/combinat/partition_algebra.py +1998 -0
  195. sage/combinat/partition_kleshchev.py +1982 -0
  196. sage/combinat/partition_shifting_algebras.py +584 -0
  197. sage/combinat/partition_tuple.py +3114 -0
  198. sage/combinat/path_tableaux/all.py +13 -0
  199. sage/combinat/path_tableaux/catalog.py +29 -0
  200. sage/combinat/path_tableaux/dyck_path.py +380 -0
  201. sage/combinat/path_tableaux/frieze.py +476 -0
  202. sage/combinat/path_tableaux/path_tableau.py +728 -0
  203. sage/combinat/path_tableaux/semistandard.py +510 -0
  204. sage/combinat/perfect_matching.py +779 -0
  205. sage/combinat/plane_partition.py +3300 -0
  206. sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
  207. sage/combinat/q_bernoulli.pyx +128 -0
  208. sage/combinat/quickref.py +81 -0
  209. sage/combinat/recognizable_series.py +2051 -0
  210. sage/combinat/regular_sequence.py +4316 -0
  211. sage/combinat/regular_sequence_bounded.py +543 -0
  212. sage/combinat/restricted_growth.py +81 -0
  213. sage/combinat/ribbon.py +20 -0
  214. sage/combinat/ribbon_shaped_tableau.py +489 -0
  215. sage/combinat/ribbon_tableau.py +1180 -0
  216. sage/combinat/rigged_configurations/all.py +46 -0
  217. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  218. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  219. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  222. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  223. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  224. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  225. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  226. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  227. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  228. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  229. sage/combinat/rigged_configurations/bijection.py +143 -0
  230. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  231. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  232. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  233. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  234. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  235. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  236. sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  238. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  240. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  241. sage/combinat/rsk.py +3438 -0
  242. sage/combinat/schubert_polynomial.py +508 -0
  243. sage/combinat/set_partition.py +3318 -0
  244. sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
  245. sage/combinat/set_partition_iterator.pyx +136 -0
  246. sage/combinat/set_partition_ordered.py +1590 -0
  247. sage/combinat/sf/abreu_nigro.py +346 -0
  248. sage/combinat/sf/all.py +52 -0
  249. sage/combinat/sf/character.py +576 -0
  250. sage/combinat/sf/classical.py +319 -0
  251. sage/combinat/sf/dual.py +996 -0
  252. sage/combinat/sf/elementary.py +549 -0
  253. sage/combinat/sf/hall_littlewood.py +1028 -0
  254. sage/combinat/sf/hecke.py +336 -0
  255. sage/combinat/sf/homogeneous.py +464 -0
  256. sage/combinat/sf/jack.py +1428 -0
  257. sage/combinat/sf/k_dual.py +1458 -0
  258. sage/combinat/sf/kfpoly.py +447 -0
  259. sage/combinat/sf/llt.py +789 -0
  260. sage/combinat/sf/macdonald.py +2019 -0
  261. sage/combinat/sf/monomial.py +525 -0
  262. sage/combinat/sf/multiplicative.py +113 -0
  263. sage/combinat/sf/new_kschur.py +1786 -0
  264. sage/combinat/sf/ns_macdonald.py +964 -0
  265. sage/combinat/sf/orthogonal.py +246 -0
  266. sage/combinat/sf/orthotriang.py +355 -0
  267. sage/combinat/sf/powersum.py +963 -0
  268. sage/combinat/sf/schur.py +880 -0
  269. sage/combinat/sf/sf.py +1653 -0
  270. sage/combinat/sf/sfa.py +7053 -0
  271. sage/combinat/sf/symplectic.py +253 -0
  272. sage/combinat/sf/witt.py +721 -0
  273. sage/combinat/shifted_primed_tableau.py +2735 -0
  274. sage/combinat/shuffle.py +830 -0
  275. sage/combinat/sidon_sets.py +146 -0
  276. sage/combinat/similarity_class_type.py +1721 -0
  277. sage/combinat/sine_gordon.py +618 -0
  278. sage/combinat/six_vertex_model.py +784 -0
  279. sage/combinat/skew_partition.py +2053 -0
  280. sage/combinat/skew_tableau.py +2989 -0
  281. sage/combinat/sloane_functions.py +8935 -0
  282. sage/combinat/specht_module.py +1403 -0
  283. sage/combinat/species/all.py +48 -0
  284. sage/combinat/species/characteristic_species.py +321 -0
  285. sage/combinat/species/composition_species.py +273 -0
  286. sage/combinat/species/cycle_species.py +284 -0
  287. sage/combinat/species/empty_species.py +155 -0
  288. sage/combinat/species/functorial_composition_species.py +148 -0
  289. sage/combinat/species/generating_series.py +673 -0
  290. sage/combinat/species/library.py +148 -0
  291. sage/combinat/species/linear_order_species.py +169 -0
  292. sage/combinat/species/misc.py +83 -0
  293. sage/combinat/species/partition_species.py +290 -0
  294. sage/combinat/species/permutation_species.py +268 -0
  295. sage/combinat/species/product_species.py +423 -0
  296. sage/combinat/species/recursive_species.py +476 -0
  297. sage/combinat/species/set_species.py +192 -0
  298. sage/combinat/species/species.py +820 -0
  299. sage/combinat/species/structure.py +539 -0
  300. sage/combinat/species/subset_species.py +243 -0
  301. sage/combinat/species/sum_species.py +225 -0
  302. sage/combinat/subword.py +564 -0
  303. sage/combinat/subword_complex.py +2122 -0
  304. sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
  305. sage/combinat/subword_complex_c.pyx +119 -0
  306. sage/combinat/super_tableau.py +821 -0
  307. sage/combinat/superpartition.py +1154 -0
  308. sage/combinat/symmetric_group_algebra.py +3774 -0
  309. sage/combinat/symmetric_group_representations.py +1830 -0
  310. sage/combinat/t_sequences.py +877 -0
  311. sage/combinat/tableau.py +9506 -0
  312. sage/combinat/tableau_residues.py +860 -0
  313. sage/combinat/tableau_tuple.py +5353 -0
  314. sage/combinat/tiling.py +2432 -0
  315. sage/combinat/triangles_FHM.py +777 -0
  316. sage/combinat/tutorial.py +1857 -0
  317. sage/combinat/vector_partition.py +337 -0
  318. sage/combinat/words/abstract_word.py +1722 -0
  319. sage/combinat/words/all.py +59 -0
  320. sage/combinat/words/alphabet.py +268 -0
  321. sage/combinat/words/finite_word.py +7201 -0
  322. sage/combinat/words/infinite_word.py +113 -0
  323. sage/combinat/words/lyndon_word.py +652 -0
  324. sage/combinat/words/morphic.py +351 -0
  325. sage/combinat/words/morphism.py +3878 -0
  326. sage/combinat/words/paths.py +2932 -0
  327. sage/combinat/words/shuffle_product.py +278 -0
  328. sage/combinat/words/suffix_trees.py +1873 -0
  329. sage/combinat/words/word.py +769 -0
  330. sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
  331. sage/combinat/words/word_char.pyx +847 -0
  332. sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
  333. sage/combinat/words/word_datatypes.pxd +4 -0
  334. sage/combinat/words/word_datatypes.pyx +1067 -0
  335. sage/combinat/words/word_generators.py +2026 -0
  336. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  337. sage/combinat/words/word_options.py +99 -0
  338. sage/combinat/words/words.py +2396 -0
  339. sage/data_structures/all__sagemath_combinat.py +1 -0
  340. sage/databases/all__sagemath_combinat.py +13 -0
  341. sage/databases/findstat.py +4897 -0
  342. sage/databases/oeis.py +2058 -0
  343. sage/databases/sloane.py +393 -0
  344. sage/dynamics/all__sagemath_combinat.py +14 -0
  345. sage/dynamics/cellular_automata/all.py +7 -0
  346. sage/dynamics/cellular_automata/catalog.py +34 -0
  347. sage/dynamics/cellular_automata/elementary.py +612 -0
  348. sage/dynamics/cellular_automata/glca.py +477 -0
  349. sage/dynamics/cellular_automata/solitons.py +1463 -0
  350. sage/dynamics/finite_dynamical_system.py +1249 -0
  351. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  352. sage/games/all.py +7 -0
  353. sage/games/hexad.py +704 -0
  354. sage/games/quantumino.py +591 -0
  355. sage/games/sudoku.py +889 -0
  356. sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
  357. sage/games/sudoku_backtrack.pyx +189 -0
  358. sage/groups/all__sagemath_combinat.py +1 -0
  359. sage/groups/indexed_free_group.py +489 -0
  360. sage/libs/all__sagemath_combinat.py +6 -0
  361. sage/libs/lrcalc/__init__.py +1 -0
  362. sage/libs/lrcalc/lrcalc.py +525 -0
  363. sage/libs/symmetrica/__init__.py +7 -0
  364. sage/libs/symmetrica/all.py +101 -0
  365. sage/libs/symmetrica/kostka.pxi +168 -0
  366. sage/libs/symmetrica/part.pxi +193 -0
  367. sage/libs/symmetrica/plet.pxi +42 -0
  368. sage/libs/symmetrica/sab.pxi +196 -0
  369. sage/libs/symmetrica/sb.pxi +332 -0
  370. sage/libs/symmetrica/sc.pxi +192 -0
  371. sage/libs/symmetrica/schur.pxi +956 -0
  372. sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
  373. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  374. sage/libs/symmetrica/symmetrica.pyx +39 -0
  375. sage/monoids/all.py +13 -0
  376. sage/monoids/automatic_semigroup.py +1054 -0
  377. sage/monoids/free_abelian_monoid.py +315 -0
  378. sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
  379. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  380. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  381. sage/monoids/free_monoid.py +335 -0
  382. sage/monoids/free_monoid_element.py +431 -0
  383. sage/monoids/hecke_monoid.py +65 -0
  384. sage/monoids/string_monoid.py +817 -0
  385. sage/monoids/string_monoid_element.py +547 -0
  386. sage/monoids/string_ops.py +143 -0
  387. sage/monoids/trace_monoid.py +972 -0
  388. sage/rings/all__sagemath_combinat.py +2 -0
  389. sage/sat/all.py +4 -0
  390. sage/sat/boolean_polynomials.py +405 -0
  391. sage/sat/converters/__init__.py +6 -0
  392. sage/sat/converters/anf2cnf.py +14 -0
  393. sage/sat/converters/polybori.py +611 -0
  394. sage/sat/solvers/__init__.py +5 -0
  395. sage/sat/solvers/cryptominisat.py +287 -0
  396. sage/sat/solvers/dimacs.py +783 -0
  397. sage/sat/solvers/picosat.py +228 -0
  398. sage/sat/solvers/sat_lp.py +156 -0
  399. sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
  400. sage/sat/solvers/satsolver.pxd +3 -0
  401. sage/sat/solvers/satsolver.pyx +405 -0
@@ -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()