passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.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 (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. sage/typeset/unicode_characters.py +101 -0
@@ -0,0 +1,1146 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Enumerated sets
4
+ """
5
+ # ****************************************************************************
6
+ # Copyright (C) 2009 Florent Hivert <Florent.Hivert@univ-rouen.fr>
7
+ #
8
+ # Distributed under the terms of the GNU General Public License (GPL)
9
+ # https://www.gnu.org/licenses/
10
+ # *****************************************************************************
11
+
12
+ from sage.misc.cachefunc import cached_method
13
+ from sage.misc.lazy_import import LazyImport
14
+ from sage.categories.category_with_axiom import CategoryWithAxiom
15
+ from sage.categories.sets_cat import Sets
16
+ from sage.categories.sets_cat import EmptySetError
17
+ from sage.categories.cartesian_product import CartesianProductsCategory
18
+ from sage.misc.lazy_import import lazy_import
19
+ lazy_import("sage.rings.integer", "Integer")
20
+
21
+
22
+ class EnumeratedSets(CategoryWithAxiom):
23
+ """
24
+ The category of enumerated sets.
25
+
26
+ An *enumerated set* is a *finite* or *countable* set or multiset `S`
27
+ together with a canonical enumeration of its elements;
28
+ conceptually, this is very similar to an immutable list. The main
29
+ difference lies in the names and the return type of the methods,
30
+ and of course the fact that the list of elements is not supposed to
31
+ be expanded in memory. Whenever possible one should use one of the
32
+ two sub-categories :class:`FiniteEnumeratedSets` or
33
+ :class:`InfiniteEnumeratedSets`.
34
+
35
+ The purpose of this category is threefold:
36
+
37
+ - to fix a common interface for all these sets;
38
+ - to provide a bunch of default implementations;
39
+ - to provide consistency tests.
40
+
41
+ The standard methods for an enumerated set ``S`` are:
42
+
43
+ - ``S.cardinality()`` -- the number of elements of the set. This
44
+ is the equivalent for ``len`` on a list except that the
45
+ return value is specified to be a Sage :class:`Integer` or
46
+ ``infinity``, instead of a Python ``int``.
47
+
48
+ - ``iter(S)`` -- an iterator for the elements of the set;
49
+
50
+ - ``S.list()`` -- a fresh list of the elements of the set, when
51
+ possible; raises a :exc:`NotImplementedError` if the list is
52
+ predictably too large to be expanded in memory.
53
+
54
+ - ``S.tuple()`` -- a tuple of the elements of the set, when
55
+ possible; raises a :exc:`NotImplementedError` if the tuple is
56
+ predictably too large to be expanded in memory.
57
+
58
+ - ``S.unrank(n)`` -- the ``n``-th element of the set when ``n`` is a sage
59
+ ``Integer``. This is the equivalent for ``l[n]`` on a list.
60
+
61
+ - ``S.rank(e)`` -- the position of the element ``e`` in the set;
62
+ This is equivalent to ``l.index(e)`` for a list except that
63
+ the return value is specified to be a Sage :class:`Integer`,
64
+ instead of a Python ``int``.
65
+
66
+ - ``S.first()`` -- the first object of the set; it is equivalent to
67
+ ``S.unrank(0)``.
68
+
69
+ - ``S.next(e)`` -- the object of the set which follows ``e``; it is
70
+ equivalent to ``S.unrank(S.rank(e) + 1)``.
71
+
72
+ - ``S.random_element()`` -- a random generator for an element of
73
+ the set. Unless otherwise stated, and for finite enumerated
74
+ sets, the probability is uniform.
75
+
76
+ For examples and tests see:
77
+
78
+ - ``FiniteEnumeratedSets().example()``
79
+ - ``InfiniteEnumeratedSets().example()``
80
+
81
+ EXAMPLES::
82
+
83
+ sage: EnumeratedSets()
84
+ Category of enumerated sets
85
+ sage: EnumeratedSets().super_categories()
86
+ [Category of sets]
87
+ sage: EnumeratedSets().all_super_categories()
88
+ [Category of enumerated sets, Category of sets,
89
+ Category of sets with partial maps, Category of objects]
90
+
91
+ TESTS::
92
+
93
+ sage: C = EnumeratedSets()
94
+ sage: TestSuite(C).run()
95
+ """
96
+
97
+ def super_categories(self):
98
+ """
99
+ EXAMPLES::
100
+
101
+ sage: EnumeratedSets().super_categories()
102
+ [Category of sets]
103
+ """
104
+ return [Sets()]
105
+
106
+ def additional_structure(self):
107
+ """
108
+ Return ``None``.
109
+
110
+ Indeed, morphisms of enumerated sets are not required to
111
+ preserve the enumeration.
112
+
113
+ .. SEEALSO:: :meth:`Category.additional_structure`
114
+
115
+ EXAMPLES::
116
+
117
+ sage: EnumeratedSets().additional_structure()
118
+ """
119
+ return None
120
+
121
+ def _call_(self, X):
122
+ """
123
+ Construct an object in this category from the data in ``X``.
124
+
125
+ EXAMPLES::
126
+
127
+ sage: EnumeratedSets()(Primes())
128
+ Set of all prime numbers: 2, 3, 5, 7, ...
129
+
130
+ For now, lists, tuples, sets, Sets are coerced into finite
131
+ enumerated sets::
132
+
133
+ sage: S = EnumeratedSets()([1, 2, 3]); S
134
+ {1, 2, 3}
135
+ sage: S.category()
136
+ Category of facade finite enumerated sets
137
+
138
+ sage: S = EnumeratedSets()((1, 2, 3)); S
139
+ {1, 2, 3}
140
+ sage: S = EnumeratedSets()(set([1, 2, 3])); S
141
+ {1, 2, 3}
142
+ sage: S = EnumeratedSets()(Set([1, 2, 3])); S
143
+ {1, 2, 3}
144
+ sage: S.category()
145
+ Category of finite enumerated sets
146
+
147
+ Also Python3 range are now accepted::
148
+
149
+ sage: S = EnumeratedSets()(range(4)); S
150
+ {0, 1, 2, 3}
151
+ """
152
+ import sage.sets.set
153
+ if isinstance(X, (tuple, list, set, range, sage.sets.set.Set_object_enumerated)):
154
+ return sage.sets.finite_enumerated_set.FiniteEnumeratedSet(X)
155
+ raise NotImplementedError
156
+
157
+ class ParentMethods:
158
+
159
+ def __iter__(self):
160
+ """
161
+ An iterator for the enumerated set.
162
+
163
+ ``iter(self)`` allows the combinatorial class to be treated as an
164
+ iterable. This is the default implementation from the category
165
+ ``EnumeratedSets()``; it just goes through the iterator of the set
166
+ to count the number of objects.
167
+
168
+ By decreasing order of priority, the second column of the
169
+ following array shows which method is used to define
170
+ ``__iter__``, when the methods of the first column are overloaded:
171
+
172
+ +------------------------+---------------------------------+
173
+ | Needed methods | Default ``__iterator`` provided |
174
+ +========================+=================================+
175
+ | ``first`` and ``next`` | ``_iterator_from_next`` |
176
+ +------------------------+---------------------------------+
177
+ | ``unrank`` | ``_iterator_from_unrank`` |
178
+ +------------------------+---------------------------------+
179
+ | ``list`` | ``_iterator_from_next`` |
180
+ +------------------------+---------------------------------+
181
+
182
+ It is also possible to override ``__iter__`` method itself. Then
183
+ the methods of the first column are defined using ``__iter__``
184
+
185
+ If none of these are provided, this raises
186
+ a :exc:`NotImplementedError`.
187
+
188
+ EXAMPLES:
189
+
190
+ We start with an example where nothing is implemented::
191
+
192
+ sage: class broken(UniqueRepresentation, Parent):
193
+ ....: def __init__(self):
194
+ ....: Parent.__init__(self, category = EnumeratedSets())
195
+ sage: it = iter(broken()); [next(it), next(it), next(it)]
196
+ Traceback (most recent call last):
197
+ ...
198
+ NotImplementedError: iterator called but not implemented
199
+
200
+ Here is what happens when ``first`` and ``next`` are implemented::
201
+
202
+ sage: class set_first_next(UniqueRepresentation, Parent):
203
+ ....: def __init__(self):
204
+ ....: Parent.__init__(self, category = EnumeratedSets())
205
+ ....: def first(self):
206
+ ....: return 0
207
+ ....: def next(self, elt):
208
+ ....: return elt+1
209
+ sage: it = iter(set_first_next()); [next(it), next(it), next(it)]
210
+ [0, 1, 2]
211
+
212
+ Let us try with ``unrank``::
213
+
214
+ sage: class set_unrank(UniqueRepresentation, Parent):
215
+ ....: def __init__(self):
216
+ ....: Parent.__init__(self, category = EnumeratedSets())
217
+ ....: def unrank(self, i):
218
+ ....: return i + 5
219
+ sage: it = iter(set_unrank()); [next(it), next(it), next(it)]
220
+ [5, 6, 7]
221
+
222
+ Let us finally try with ``list``::
223
+
224
+ sage: class set_list(UniqueRepresentation, Parent):
225
+ ....: def __init__(self):
226
+ ....: Parent.__init__(self, category = EnumeratedSets())
227
+ ....: def list(self):
228
+ ....: return [5, 6, 7]
229
+ sage: it = iter(set_list()); [next(it), next(it), next(it)]
230
+ [5, 6, 7]
231
+ """
232
+ # Check if .first() and .next(x) are overridden in the subclass
233
+ if ( self.first != self._first_from_iterator and
234
+ self.next != self._next_from_iterator ):
235
+ return self._iterator_from_next()
236
+ #Check to see if .unrank() is overridden in the subclass
237
+ elif self.unrank != self._unrank_from_iterator:
238
+ return self._iterator_from_unrank()
239
+ #Finally, check to see if .list() is overridden in the subclass
240
+ elif self.list != self._list_default:
241
+ return self._iterator_from_list()
242
+ else:
243
+ raise NotImplementedError("iterator called but not implemented")
244
+
245
+ def is_empty(self):
246
+ r"""
247
+ Return whether this set is empty.
248
+
249
+ EXAMPLES::
250
+
251
+ sage: F = FiniteEnumeratedSet([1,2,3])
252
+ sage: F.is_empty()
253
+ False
254
+ sage: F = FiniteEnumeratedSet([])
255
+ sage: F.is_empty()
256
+ True
257
+
258
+ TESTS::
259
+
260
+ sage: F.is_empty.__module__
261
+ 'sage.categories.enumerated_sets'
262
+ """
263
+ try:
264
+ next(iter(self))
265
+ except StopIteration:
266
+ return True
267
+ else:
268
+ return False
269
+
270
+ def iterator_range(self, start=None, stop=None, step=None):
271
+ r"""
272
+ Iterate over the range of elements of ``self`` starting
273
+ at ``start``, ending at ``stop``, and stepping by ``step``.
274
+
275
+ .. SEEALSO::
276
+
277
+ ``unrank()``, ``unrank_range()``
278
+
279
+ EXAMPLES::
280
+
281
+ sage: # needs sage.combinat
282
+ sage: P = Partitions()
283
+ sage: list(P.iterator_range(stop=5))
284
+ [[], [1], [2], [1, 1], [3]]
285
+ sage: list(P.iterator_range(0, 5))
286
+ [[], [1], [2], [1, 1], [3]]
287
+ sage: list(P.iterator_range(3, 5))
288
+ [[1, 1], [3]]
289
+ sage: list(P.iterator_range(3, 10))
290
+ [[1, 1], [3], [2, 1], [1, 1, 1], [4], [3, 1], [2, 2]]
291
+ sage: list(P.iterator_range(3, 10, 2))
292
+ [[1, 1], [2, 1], [4], [2, 2]]
293
+ sage: it = P.iterator_range(3)
294
+ sage: [next(it) for x in range(10)]
295
+ [[1, 1],
296
+ [3], [2, 1], [1, 1, 1],
297
+ [4], [3, 1], [2, 2], [2, 1, 1], [1, 1, 1, 1],
298
+ [5]]
299
+ sage: it = P.iterator_range(3, step=2)
300
+ sage: [next(it) for x in range(5)]
301
+ [[1, 1],
302
+ [2, 1],
303
+ [4], [2, 2], [1, 1, 1, 1]]
304
+ sage: next(P.iterator_range(stop=-3))
305
+ Traceback (most recent call last):
306
+ ...
307
+ NotImplementedError: cannot list an infinite set
308
+ sage: next(P.iterator_range(start=-3))
309
+ Traceback (most recent call last):
310
+ ...
311
+ NotImplementedError: cannot list an infinite set
312
+ """
313
+ if stop is None:
314
+ if start is None:
315
+ if step is None:
316
+ yield from self
317
+ return
318
+ start = 0
319
+ elif start < 0:
320
+ yield from self.tuple()[start::step]
321
+ return
322
+ if step is None:
323
+ step = 1
324
+ while True:
325
+ try:
326
+ yield self.unrank(start)
327
+ except ValueError:
328
+ return
329
+ start += step
330
+
331
+ elif stop < 0:
332
+ yield from self.tuple()[start:stop:step]
333
+ return
334
+
335
+ if start is None:
336
+ if step is None:
337
+ it = self.__iter__()
338
+ for j in range(stop):
339
+ yield next(it)
340
+ return
341
+ start = 0
342
+ elif start < 0:
343
+ yield from self.tuple()[start:stop:step]
344
+ if step is None:
345
+ step = 1
346
+ for j in range(start, stop, step):
347
+ yield self.unrank(j)
348
+
349
+ def unrank_range(self, start=None, stop=None, step=None):
350
+ """
351
+ Return the range of elements of ``self`` starting at ``start``,
352
+ ending at ``stop``, and stepping by ``step``.
353
+
354
+ .. SEEALSO::
355
+
356
+ ``unrank()``, ``iterator_range()``
357
+
358
+ EXAMPLES::
359
+
360
+ sage: # needs sage.combinat
361
+ sage: P = Partitions()
362
+ sage: P.unrank_range(stop=5)
363
+ [[], [1], [2], [1, 1], [3]]
364
+ sage: P.unrank_range(0, 5)
365
+ [[], [1], [2], [1, 1], [3]]
366
+ sage: P.unrank_range(3, 5)
367
+ [[1, 1], [3]]
368
+ sage: P.unrank_range(3, 10)
369
+ [[1, 1], [3], [2, 1], [1, 1, 1], [4], [3, 1], [2, 2]]
370
+ sage: P.unrank_range(3, 10, 2)
371
+ [[1, 1], [2, 1], [4], [2, 2]]
372
+ sage: P.unrank_range(3)
373
+ Traceback (most recent call last):
374
+ ...
375
+ NotImplementedError: cannot list an infinite set
376
+ sage: P.unrank_range(stop=-3)
377
+ Traceback (most recent call last):
378
+ ...
379
+ NotImplementedError: cannot list an infinite set
380
+ sage: P.unrank_range(start=-3)
381
+ Traceback (most recent call last):
382
+ ...
383
+ NotImplementedError: cannot list an infinite set
384
+ """
385
+ if stop is None:
386
+ return list(self.tuple()[start::step])
387
+
388
+ if stop < 0:
389
+ return list(self.tuple()[start:stop:step])
390
+
391
+ if start is not None and start < 0:
392
+ return list(self.tuple()[start:stop:step])
393
+
394
+ return list(self.iterator_range(start, stop, step))
395
+
396
+ def __getitem__(self, i):
397
+ r"""
398
+ Return the item indexed by ``i``.
399
+
400
+ .. WARNING::
401
+
402
+ This method is only meant as a convenience shorthand for
403
+ ``self.unrank(i)`` and
404
+ ``self.unrank_range(start, stop, step)`` respectively, for
405
+ casual use (e.g. in interactive sessions). Subclasses are
406
+ hereby explicitly permitted to overload ``__getitem__``
407
+ with a different semantic, typically for enumerated sets
408
+ that are naturally indexed by some `I` not of the
409
+ form `\{0, 1, \ldots\}`. In particular, generic code
410
+ *should not* use this shorthand.
411
+
412
+ EXAMPLES::
413
+
414
+ sage: # needs sage.combinat
415
+ sage: P = Partitions()
416
+ sage: P[:5]
417
+ [[], [1], [2], [1, 1], [3]]
418
+ sage: P[0:5]
419
+ [[], [1], [2], [1, 1], [3]]
420
+ sage: P[3:5]
421
+ [[1, 1], [3]]
422
+ sage: P[3:10]
423
+ [[1, 1], [3], [2, 1], [1, 1, 1], [4], [3, 1], [2, 2]]
424
+ sage: P[3:10:2]
425
+ [[1, 1], [2, 1], [4], [2, 2]]
426
+ sage: P[3:]
427
+ Traceback (most recent call last):
428
+ ...
429
+ NotImplementedError: cannot list an infinite set
430
+ sage: P[3]
431
+ [1, 1]
432
+ sage: P[-1]
433
+ Traceback (most recent call last):
434
+ ...
435
+ ValueError: infinite list
436
+
437
+ ::
438
+
439
+ sage: C = FiniteEnumeratedSets().example()
440
+ sage: C.list()
441
+ [1, 2, 3]
442
+ sage: C[1]
443
+ 2
444
+ sage: C[:]
445
+ [1, 2, 3]
446
+ sage: C[1:]
447
+ [2, 3]
448
+ sage: C[0:1:2]
449
+ [1]
450
+
451
+ sage: F = FiniteEnumeratedSet([1,2,3])
452
+ sage: F[1:]
453
+ [2, 3]
454
+ sage: F[:2]
455
+ [1, 2]
456
+ sage: F[:2:2]
457
+ [1]
458
+ sage: F[1::2]
459
+ [2]
460
+
461
+ TESTS:
462
+
463
+ Verify that an infinite index raises an error::
464
+
465
+ sage: F = FiniteEnumeratedSet([1,2,3,4,5])
466
+ sage: F[oo]
467
+ Traceback (most recent call last):
468
+ ...
469
+ TypeError: unable to coerce <class 'sage.rings.infinity.PlusInfinity'>
470
+ to an integer
471
+ """
472
+ from sage.rings.infinity import Infinity
473
+ if isinstance(i, slice):
474
+ return self.unrank_range(i.start, i.stop, i.step)
475
+ i = Integer(i)
476
+ if i < 0:
477
+ i += self.cardinality()
478
+ if i < 0:
479
+ raise IndexError("index out of range")
480
+ if i is Infinity:
481
+ raise ValueError("infinite list")
482
+ return self.unrank(i)
483
+
484
+ def __len__(self):
485
+ """
486
+ Return the number of elements of ``self``.
487
+
488
+ EXAMPLES::
489
+
490
+ sage: len(GF(5))
491
+ 5
492
+ sage: len(MatrixSpace(GF(2), 3, 3)) # needs sage.modules
493
+ 512
494
+ """
495
+ from sage.rings.infinity import Infinity
496
+ try:
497
+ c = self.cardinality()
498
+ if c is Infinity:
499
+ raise NotImplementedError('infinite set')
500
+ return int(c)
501
+ except AttributeError:
502
+ return len(self.tuple())
503
+
504
+ def tuple(self):
505
+ r"""
506
+ Return a tuple of the elements of ``self``.
507
+
508
+ The tuple of elements of ``x`` is created and cached on the first call
509
+ of ``x.tuple()``. Each following call of ``x.tuple()`` returns the same tuple.
510
+
511
+ For looping, it may be better to do ``for e in x:``, not ``for e in x.tuple():``.
512
+
513
+ If ``x`` is not known to be finite, then an exception is raised.
514
+
515
+ EXAMPLES::
516
+
517
+ sage: (GF(3)^2).tuple() # needs sage.modules
518
+ ((0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2))
519
+ sage: R = Integers(11)
520
+ sage: l = R.tuple(); l
521
+ (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
522
+ sage: l is R.tuple()
523
+ True
524
+ """
525
+ try: # shortcut
526
+ if self._list is not None:
527
+ return self._tuple_from_list()
528
+ except AttributeError:
529
+ pass
530
+
531
+ if self.list != self._list_default:
532
+ return tuple(self.list())
533
+
534
+ from sage.rings.infinity import Infinity
535
+ try:
536
+ if self.cardinality() is Infinity:
537
+ raise NotImplementedError('cannot list an infinite set')
538
+ else: # finite cardinality
539
+ return self._tuple_from_iterator()
540
+ except AttributeError:
541
+ raise NotImplementedError('unknown cardinality')
542
+ _tuple_default = tuple
543
+
544
+ def _tuple_from_iterator(self):
545
+ r"""
546
+ Return a tuple of the elements of ``self``.
547
+
548
+ This implementation of :meth:`tuple` creates the tuple of elements and caches it for
549
+ later uses.
550
+
551
+ TESTS::
552
+
553
+ sage: R = Integers(11)
554
+ sage: R._list is None
555
+ False
556
+ sage: R._tuple_from_iterator()
557
+ (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
558
+ sage: _ is R._list
559
+ True
560
+ """
561
+ # This creates one throw-away list.
562
+ self._list_from_iterator()
563
+ return self._tuple_from_list()
564
+
565
+ def _tuple_from_list(self):
566
+ r"""
567
+ Return a tuple of the elements of ``self``.
568
+
569
+ This implementation of :meth:`tuple` assumes that the tuple of elements is already
570
+ cached and just returns it.
571
+
572
+ TESTS::
573
+
574
+ sage: R = Integers(11)
575
+ sage: R.tuple()
576
+ (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
577
+ sage: R._tuple_from_list() is R.tuple()
578
+ True
579
+ """
580
+ # Implementation classes may put any Sequence type in self._list.
581
+ # Traditionally, self._list was an actual list.
582
+ # When self._list is already a tuple, calling tuple on it is a no-op.
583
+ return tuple(self._list)
584
+
585
+ def list(self):
586
+ r"""
587
+ Return a list of the elements of ``self``.
588
+
589
+ The elements of set ``x`` are created and cached on the first call
590
+ of ``x.list()``. Then each call of ``x.list()`` returns a new list
591
+ from the cached result. Thus in looping, it may be better to do
592
+ ``for e in x:``, not ``for e in x.list():``.
593
+
594
+ If ``x`` is not known to be finite, then an exception is raised.
595
+
596
+ EXAMPLES::
597
+
598
+ sage: (GF(3)^2).list() # needs sage.modules
599
+ [(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2)]
600
+ sage: R = Integers(11)
601
+ sage: R.list()
602
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
603
+ sage: l = R.list(); l
604
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
605
+ sage: l.remove(0); l
606
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
607
+ sage: R.list()
608
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
609
+
610
+ sage: C = FiniteEnumeratedSets().example()
611
+ sage: C.list()
612
+ [1, 2, 3]
613
+ """
614
+ return list(self.tuple())
615
+ _list_default = list # needed by the check system.
616
+
617
+ def _list_from_iterator(self):
618
+ r"""
619
+ Return a list of the elements of ``self`` after cached.
620
+
621
+ TESTS:
622
+
623
+ Trying to list an infinite vector space raises an error
624
+ instead of running forever (see :issue:`10470`)::
625
+
626
+ sage: (QQ^2).list() # indirect test # needs sage.modules
627
+ Traceback (most recent call last):
628
+ ...
629
+ AttributeError: 'FreeModule_ambient_field_with_category' object has no attribute 'list'...
630
+
631
+ Here we test that for an object that does not know whether it
632
+ is finite or not. Calling ``x.list()`` simply tries to create
633
+ the list (but here it fails, since the object is not
634
+ iterable). This was fixed :issue:`11350` ::
635
+
636
+ sage: R.<t,p> = QQ[]
637
+ sage: Q = R.quotient(t^2-t+1)
638
+ sage: Q.is_finite()
639
+ Traceback (most recent call last):
640
+ ...
641
+ AttributeError: 'QuotientRing_generic_with_category' object has no attribute 'is_finite'...
642
+ sage: Q.list() # indirect test
643
+ Traceback (most recent call last):
644
+ ...
645
+ AttributeError: 'QuotientRing_generic_with_category' object has no attribute 'list'...
646
+
647
+ Here is another example. We artificially create a version of
648
+ the ring of integers that does not know whether it is finite
649
+ or not::
650
+
651
+ sage: from sage.rings.integer_ring import IntegerRing_class
652
+ sage: class MyIntegers_class(IntegerRing_class):
653
+ ....: def is_finite(self):
654
+ ....: raise NotImplementedError
655
+ sage: MyIntegers = MyIntegers_class()
656
+ sage: MyIntegers.is_finite()
657
+ Traceback (most recent call last):
658
+ ...
659
+ NotImplementedError
660
+
661
+ Asking for ``list(MyIntegers)`` will also raise an exception::
662
+
663
+ sage: list(MyIntegers) # indirect test
664
+ Traceback (most recent call last):
665
+ ...
666
+ NotImplementedError
667
+ """
668
+ try:
669
+ if self._list is not None:
670
+ return list(self._list)
671
+ except AttributeError:
672
+ pass
673
+ result = tuple(self.__iter__())
674
+ try:
675
+ self._list = result
676
+ except AttributeError:
677
+ pass
678
+ return list(result)
679
+
680
+ def _first_from_iterator(self):
681
+ """
682
+ The "first" element of ``self``.
683
+
684
+ ``self.first()`` returns the first element of the set
685
+ ``self``. This is a generic implementation from the category
686
+ ``EnumeratedSets()`` which can be used when the method ``__iter__`` is
687
+ provided.
688
+
689
+ EXAMPLES::
690
+
691
+ sage: C = FiniteEnumeratedSets().example()
692
+ sage: C.first() # indirect doctest
693
+ 1
694
+ """
695
+ return next(iter(self))
696
+ first = _first_from_iterator
697
+
698
+ def _next_from_iterator(self, obj):
699
+ """
700
+ The "next" element after ``obj`` in ``self``.
701
+
702
+ ``self.next(e)`` returns the element of the set ``self`` which
703
+ follows ``e``. This is a generic implementation from the category
704
+ ``EnumeratedSets()`` which can be used when the method ``__iter__``
705
+ is provided.
706
+
707
+ Remark: this is the default (brute force) implementation
708
+ of the category ``EnumeratedSets()``. Its complexity is
709
+ `O(r)`, where `r` is the rank of ``obj``.
710
+
711
+ EXAMPLES::
712
+
713
+ sage: C = InfiniteEnumeratedSets().example()
714
+ sage: C._next_from_iterator(10) # indirect doctest
715
+ 11
716
+
717
+ TODO: specify the behavior when ``obj`` is not in ``self``.
718
+ """
719
+ it = iter(self)
720
+ el = next(it)
721
+ while el != obj:
722
+ el = next(it)
723
+ return next(it)
724
+ next = _next_from_iterator
725
+
726
+ def _unrank_from_iterator(self, r):
727
+ """
728
+ The ``r``-th element of ``self``.
729
+
730
+ ``self.unrank(r)`` returns the ``r``-th element of ``self``, where
731
+ ``r`` is an integer between ``0`` and ``n-1`` where ``n`` is the
732
+ cardinality of ``self``.
733
+
734
+ This is the default (brute force) implementation from the
735
+ category ``EnumeratedSets()`` which can be used when the
736
+ method ``__iter__`` is provided. Its complexity is `O(r)`,
737
+ where `r` is the rank of ``obj``.
738
+
739
+ EXAMPLES::
740
+
741
+ sage: C = FiniteEnumeratedSets().example()
742
+ sage: C.unrank(2) # indirect doctest
743
+ 3
744
+ sage: C._unrank_from_iterator(5)
745
+ Traceback (most recent call last):
746
+ ...
747
+ ValueError: the rank must be in the range from 0 to 2
748
+ sage: ZZ._unrank_from_iterator(-1)
749
+ Traceback (most recent call last):
750
+ ...
751
+ ValueError: the rank must be greater than or equal to 0
752
+ """
753
+ from sage.rings.integer_ring import ZZ
754
+ if r < 0:
755
+ raise ValueError("the rank must be greater than or equal to 0")
756
+ if r not in ZZ:
757
+ raise ValueError(f"{r=} must be an integer")
758
+ for counter, u in enumerate(self):
759
+ if counter == r:
760
+ return u
761
+ raise ValueError("the rank must be in the range from %s to %s" % (0,counter))
762
+ unrank = _unrank_from_iterator
763
+
764
+ def _rank_from_iterator(self, x):
765
+ """
766
+ The rank of an element of ``self``.
767
+
768
+ ``self.rank(x)`` returns the rank of `x`, that is its
769
+ position in the enumeration of ``self``. This is an
770
+ integer between ``0`` and ``n-1`` where ``n`` is the
771
+ cardinality of ``self``, or None if `x` is not in ``self``.
772
+
773
+ This is the default (brute force) implementation from the
774
+ category ``EnumeratedSets()`` which can be used when the
775
+ method ``__iter__`` is provided. Its complexity is `O(r)`,
776
+ where `r` is the rank of ``obj``. For infinite enumerated
777
+ sets, this won't terminate when `x` is not in ``self``
778
+
779
+ EXAMPLES::
780
+
781
+ sage: C = FiniteEnumeratedSets().example()
782
+ sage: list(C)
783
+ [1, 2, 3]
784
+ sage: C.rank(3) # indirect doctest
785
+ 2
786
+ sage: C.rank(5) # indirect doctest
787
+ """
788
+ counter = 0
789
+ for u in self:
790
+ if u == x:
791
+ return counter
792
+ counter += 1
793
+ return None
794
+ rank = _rank_from_iterator
795
+
796
+ def _iterator_from_list(self):
797
+ """
798
+ An iterator for the elements of ``self``.
799
+
800
+ ``iter(self)`` returns an iterator for the elements
801
+ of ``self``. This is a generic implementation from the
802
+ category ``EnumeratedSets()`` which can be used when the
803
+ method ``list`` is provided.
804
+
805
+ EXAMPLES::
806
+
807
+ sage: C = FiniteEnumeratedSets().example()
808
+ sage: it = C._iterator_from_list()
809
+ sage: [next(it), next(it), next(it)]
810
+ [1, 2, 3]
811
+ """
812
+ yield from self.tuple()
813
+
814
+ def _iterator_from_next(self):
815
+ """
816
+ An iterator for the elements of ``self``.
817
+
818
+ ``iter(self)`` returns an iterator for the element of
819
+ the set ``self``. This is a generic implementation from
820
+ the category ``EnumeratedSets()`` which can be used when
821
+ the methods ``first`` and ``next`` are provided.
822
+
823
+ EXAMPLES::
824
+
825
+ sage: C = InfiniteEnumeratedSets().example()
826
+ sage: it = C._iterator_from_next()
827
+ sage: [next(it), next(it), next(it), next(it), next(it)]
828
+ [0, 1, 2, 3, 4]
829
+ """
830
+ f = self.first()
831
+ while not (f is None or f is False):
832
+ yield f
833
+ try:
834
+ f = self.next(f)
835
+ except (TypeError, ValueError):
836
+ f = None
837
+
838
+ def _iterator_from_unrank(self):
839
+ """
840
+ An iterator for the elements of ``self``.
841
+
842
+ ``iter(self)`` returns an iterator for the elements
843
+ of the set ``self``. This is a generic implementation from
844
+ the category ``EnumeratedSets()`` which can be used when
845
+ the method ``unrank`` is provided.
846
+
847
+ EXAMPLES::
848
+
849
+ sage: C = InfiniteEnumeratedSets().example()
850
+ sage: it = C._iterator_from_unrank()
851
+ sage: [next(it), next(it), next(it), next(it), next(it)]
852
+ [0, 1, 2, 3, 4]
853
+ """
854
+ r = 0
855
+ try:
856
+ u = self.unrank(r)
857
+ except (TypeError, ValueError, IndexError):
858
+ return
859
+ yield u
860
+ while True:
861
+ r += 1
862
+ try:
863
+ u = self.unrank(r)
864
+ except (TypeError, ValueError, IndexError):
865
+ break
866
+
867
+ if u is None:
868
+ break
869
+ else:
870
+ yield u
871
+
872
+ # This @cached_method is not really needed, since the method
873
+ # an_element itself is cached. We leave it for the moment, so
874
+ # that Parents that do not yet inherit properly from categories
875
+ # (e.g. Set([1,2,3]) can use the following trick:
876
+ # _an_element_ = EnumeratedSets.ParentMethods._an_element_
877
+ @cached_method
878
+ def _an_element_from_iterator(self):
879
+ """
880
+ Return the first element of ``self`` returned by :meth:`__iter__`.
881
+
882
+ If ``self`` is empty, the exception
883
+ :class:`~sage.categories.sets_cat.EmptySetError` is raised instead.
884
+
885
+ This provides a generic implementation of the method
886
+ :meth:`_an_element_` for all parents in :class:`EnumeratedSets`.
887
+
888
+ EXAMPLES::
889
+
890
+ sage: C = FiniteEnumeratedSets().example(); C
891
+ An example of a finite enumerated set: {1,2,3}
892
+ sage: C.an_element() # indirect doctest
893
+ 1
894
+ sage: S = Set([])
895
+ sage: S.an_element()
896
+ Traceback (most recent call last):
897
+ ...
898
+ EmptySetError
899
+
900
+ TESTS::
901
+
902
+ sage: super(Parent, C)._an_element_
903
+ Cached version of <function ..._an_element_from_iterator at ...>
904
+ """
905
+ it = iter(self)
906
+ try:
907
+ return next(it)
908
+ except StopIteration:
909
+ raise EmptySetError
910
+
911
+ # Should this be implemented from first instead?
912
+ _an_element_ = _an_element_from_iterator
913
+
914
+ #FIXME: use combinatorial_class_from_iterator once class_from_iterator.patch is in
915
+ def _some_elements_from_iterator(self):
916
+ """
917
+ Return some elements in ``self``.
918
+
919
+ See :class:`TestSuite` for a typical use case.
920
+
921
+ This is a generic implementation from the category
922
+ ``EnumeratedSets()`` which can be used when the method
923
+ ``__iter__`` is provided. It returns an iterator for up to
924
+ the first 100 elements of ``self``
925
+
926
+ EXAMPLES::
927
+
928
+ sage: C = FiniteEnumeratedSets().example()
929
+ sage: list(C.some_elements()) # indirect doctest
930
+ [1, 2, 3]
931
+ """
932
+ nb = 0
933
+ for i in self:
934
+ yield i
935
+ nb += 1
936
+ if nb >= 100:
937
+ break
938
+ some_elements = _some_elements_from_iterator
939
+
940
+ def random_element(self):
941
+ """
942
+ Return a random element in ``self``.
943
+
944
+ Unless otherwise stated, and for finite enumerated sets,
945
+ the probability is uniform.
946
+
947
+ This is a generic implementation from the category
948
+ ``EnumeratedSets()``. It raises a :exc:`NotImplementedError`
949
+ since one does not know whether the set is finite.
950
+
951
+ EXAMPLES::
952
+
953
+ sage: class broken(UniqueRepresentation, Parent):
954
+ ....: def __init__(self):
955
+ ....: Parent.__init__(self, category = EnumeratedSets())
956
+ sage: broken().random_element()
957
+ Traceback (most recent call last):
958
+ ...
959
+ NotImplementedError: unknown cardinality
960
+ """
961
+ raise NotImplementedError("unknown cardinality")
962
+
963
+ def map(self, f, name=None, *, is_injective=True):
964
+ r"""
965
+ Return the image `\{f(x) | x \in \text{self}\}` of this
966
+ enumerated set by `f`, as an enumerated set.
967
+
968
+ INPUT:
969
+
970
+ - ``is_injective`` -- boolean (default: ``True``); whether to assume
971
+ that `f` is injective
972
+
973
+ EXAMPLES::
974
+
975
+ sage: R = Compositions(4).map(attrcall('partial_sums')); R
976
+ Image of Compositions of 4 by The map *.partial_sums()
977
+ from Compositions of 4
978
+ sage: R.cardinality()
979
+ 8
980
+ sage: R.list()
981
+ [[1, 2, 3, 4], [1, 2, 4], [1, 3, 4], [1, 4], [2, 3, 4], [2, 4], [3, 4], [4]]
982
+ sage: [r for r in R]
983
+ [[1, 2, 3, 4], [1, 2, 4], [1, 3, 4], [1, 4], [2, 3, 4], [2, 4], [3, 4], [4]]
984
+ sage: R.category()
985
+ Category of finite enumerated subobjects of sets
986
+
987
+ .. WARNING::
988
+
989
+ If the function is not injective, then there may be
990
+ repeated elements::
991
+
992
+ sage: P = Compositions(4)
993
+ sage: P.list()
994
+ [[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 3], [2, 1, 1], [2, 2], [3, 1], [4]]
995
+ sage: P.map(attrcall('major_index')).list()
996
+ [6, 3, 4, 1, 5, 2, 3, 0]
997
+
998
+ Pass ``is_injective=False`` to get a correct result in this case::
999
+
1000
+ sage: P.map(attrcall('major_index'), is_injective=False).list()
1001
+ [6, 3, 4, 1, 5, 2, 0]
1002
+
1003
+ TESTS::
1004
+
1005
+ sage: TestSuite(R).run(skip=['_test_an_element',
1006
+ ....: '_test_enumerated_set_contains',
1007
+ ....: '_test_some_elements'])
1008
+ """
1009
+ from sage.sets.image_set import ImageSubobject
1010
+
1011
+ image = ImageSubobject(f, self, is_injective=is_injective)
1012
+ if name:
1013
+ image.rename(name)
1014
+ return image
1015
+
1016
+ #
1017
+ # Consistency test suite for an enumerated set:
1018
+ #
1019
+ def _test_enumerated_set_contains(self, **options):
1020
+ """
1021
+ Check that the methods :meth:`.__contains__` and :meth:`.__iter__` are consistent.
1022
+
1023
+ See also :class:`TestSuite`.
1024
+
1025
+ TESTS::
1026
+
1027
+ sage: C = FiniteEnumeratedSets().example()
1028
+ sage: C._test_enumerated_set_contains()
1029
+ sage: TestSuite(C).run()
1030
+
1031
+ Let us now break the class::
1032
+
1033
+ sage: from sage.categories.examples.finite_enumerated_sets import Example
1034
+ sage: class CCls(Example):
1035
+ ....: def __contains__(self, obj):
1036
+ ....: if obj == 3:
1037
+ ....: return False
1038
+ ....: else:
1039
+ ....: return obj in C
1040
+ sage: CC = CCls()
1041
+ sage: CC._test_enumerated_set_contains()
1042
+ Traceback (most recent call last):
1043
+ ...
1044
+ AssertionError: 3 not found in An example
1045
+ of a finite enumerated set: {1,2,3}
1046
+ """
1047
+ tester = self._tester(**options)
1048
+ i = 0
1049
+ for w in self:
1050
+ tester.assertIn(w, self)
1051
+ i += 1
1052
+ if i > tester._max_runs:
1053
+ return
1054
+
1055
+ def _test_enumerated_set_iter_list(self, **options):
1056
+ """
1057
+ Check that the methods :meth:`.list` and :meth:`.__iter__` are consistent.
1058
+
1059
+ See also: :class:`TestSuite`.
1060
+
1061
+ .. NOTE::
1062
+
1063
+ This test does nothing if the cardinality of the set
1064
+ is larger than the max_runs argument.
1065
+
1066
+ EXAMPLES::
1067
+
1068
+ sage: C = FiniteEnumeratedSets().example()
1069
+ sage: C._test_enumerated_set_iter_list()
1070
+ sage: TestSuite(C).run()
1071
+
1072
+ Let us now break the class::
1073
+
1074
+ sage: from sage.categories.examples.finite_enumerated_sets import Example
1075
+ sage: class CCls(Example):
1076
+ ....: def list(self):
1077
+ ....: return [1,2,3,4]
1078
+ sage: CC = CCls()
1079
+ sage: CC._test_enumerated_set_iter_list()
1080
+ Traceback (most recent call last):
1081
+ ...
1082
+ AssertionError: 3 != 4
1083
+
1084
+ For a large enumerated set this test does nothing:
1085
+ increase tester._max_runs if you want to actually run the
1086
+ test::
1087
+
1088
+ sage: class CCls(Example):
1089
+ ....: def list(self):
1090
+ ....: return [1,2,3]
1091
+ sage: CC = CCls()
1092
+ sage: CC._test_enumerated_set_iter_list(verbose=True,max_runs=2)
1093
+ Enumerated set too big; skipping test; increase tester._max_runs
1094
+ """
1095
+ tester = self._tester(**options)
1096
+ if self.list != self._list_default:
1097
+ # TODO: if self._cardinality is self._cardinality_from_iterator
1098
+ # we could make sure to stop the counting at
1099
+ # self.max_test_enumerated_set_loop
1100
+ if self.cardinality() > tester._max_runs:
1101
+ tester.info("Enumerated set too big; skipping test; increase tester._max_runs")
1102
+ return
1103
+ ls = self.list()
1104
+ i = 0
1105
+ for obj in self:
1106
+ tester.assertEqual(obj, ls[i])
1107
+ i += 1
1108
+ tester.assertEqual(i, len(ls))
1109
+
1110
+ class ElementMethods:
1111
+
1112
+ def rank(self):
1113
+ """
1114
+ Return the rank of ``self`` in its parent.
1115
+
1116
+ See also :meth:`EnumeratedSets.ElementMethods.rank`
1117
+
1118
+ EXAMPLES::
1119
+
1120
+ sage: F = FiniteSemigroups().example(('a','b','c'))
1121
+ sage: L = list(F)
1122
+ sage: L[7].rank()
1123
+ 7
1124
+ sage: all(x.rank() == i for i,x in enumerate(L))
1125
+ True
1126
+ """
1127
+ return self.parent().rank(self)
1128
+
1129
+ Finite = LazyImport('sage.categories.finite_enumerated_sets', 'FiniteEnumeratedSets', at_startup=True)
1130
+ Infinite = LazyImport('sage.categories.infinite_enumerated_sets', 'InfiniteEnumeratedSets', at_startup=True)
1131
+
1132
+ class CartesianProducts(CartesianProductsCategory):
1133
+
1134
+ class ParentMethods:
1135
+
1136
+ def first(self):
1137
+ r"""
1138
+ Return the first element.
1139
+
1140
+ EXAMPLES::
1141
+
1142
+ sage: cartesian_product([ZZ]*10).first()
1143
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
1144
+ """
1145
+ return self._cartesian_product_of_elements(
1146
+ tuple(c.first() for c in self.cartesian_factors()))