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,829 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ """
3
+ Integer Range
4
+
5
+ AUTHORS:
6
+
7
+ - Nicolas Borie (2010-03): First release.
8
+ - Florent Hivert (2010-03): Added a class factory + cardinality method.
9
+ - Vincent Delecroix (2012-02): add methods rank/unrank, make it compliant with
10
+ Python int.
11
+ """
12
+ # ****************************************************************************
13
+ # Copyright (C) 2010 Nicolas Borie <nicolas.borie@math.u-psud.fr>
14
+ #
15
+ # Distributed under the terms of the GNU General Public License (GPL)
16
+ # https://www.gnu.org/licenses/
17
+ # ****************************************************************************
18
+
19
+ from sage.structure.parent import Parent
20
+ from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
21
+ from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
22
+ from sage.structure.unique_representation import UniqueRepresentation
23
+ from sage.sets.finite_enumerated_set import FiniteEnumeratedSet
24
+ from sage.rings.integer import Integer
25
+ from sage.rings.integer_ring import IntegerRing
26
+ from sage.rings.infinity import Infinity, MinusInfinity, PlusInfinity
27
+
28
+
29
+ class IntegerRange(UniqueRepresentation, Parent):
30
+ r"""
31
+ The class of :class:`Integer <sage.rings.integer.Integer>` ranges.
32
+
33
+ Returns an enumerated set containing an arithmetic progression of integers.
34
+
35
+ INPUT:
36
+
37
+ - ``begin`` -- integer, Infinity or -Infinity
38
+ - ``end`` -- integer, Infinity or -Infinity
39
+ - ``step`` -- a nonzero integer (default: 1)
40
+ - ``middle_point`` -- integer inside the set (default: ``None``)
41
+
42
+ OUTPUT:
43
+
44
+ A parent in the category :class:`FiniteEnumeratedSets()
45
+ <sage.categories.finite_enumerated_sets.FiniteEnumeratedSets>` or
46
+ :class:`InfiniteEnumeratedSets()
47
+ <sage.categories.infinite_enumerated_sets.InfiniteEnumeratedSets>`
48
+ depending on the arguments defining ``self``.
49
+
50
+ ``IntegerRange(i, j)`` returns the set of `\{i, i+1, i+2, \dots , j-1\}`.
51
+ ``start`` (!) defaults to 0. When ``step`` is given, it specifies the
52
+ increment. The default increment is `1`. IntegerRange allows ``begin`` and
53
+ ``end`` to be infinite.
54
+
55
+ ``IntegerRange`` is designed to have similar interface Python
56
+ range. However, whereas ``range`` accept and returns Python ``int``,
57
+ ``IntegerRange`` deals with :class:`Integer <sage.rings.integer.Integer>`.
58
+
59
+ If ``middle_point`` is given, then the elements are generated starting
60
+ from it, in a alternating way: `\{m, m+1, m-2, m+2, m-2 \dots \}`.
61
+
62
+ EXAMPLES::
63
+
64
+ sage: list(IntegerRange(5))
65
+ [0, 1, 2, 3, 4]
66
+ sage: list(IntegerRange(2,5))
67
+ [2, 3, 4]
68
+ sage: I = IntegerRange(2,100,5); I
69
+ {2, 7, ..., 97}
70
+ sage: list(I)
71
+ [2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97]
72
+ sage: I.category()
73
+ Category of facade finite enumerated sets
74
+ sage: I[1].parent()
75
+ Integer Ring
76
+
77
+ When ``begin`` and ``end`` are both finite, ``IntegerRange(begin, end,
78
+ step)`` is the set whose list of elements is equivalent to the python
79
+ construction ``range(begin, end, step)``::
80
+
81
+ sage: list(IntegerRange(4,105,3)) == list(range(4,105,3))
82
+ True
83
+ sage: list(IntegerRange(-54,13,12)) == list(range(-54,13,12))
84
+ True
85
+
86
+ Except for the type of the numbers::
87
+
88
+ sage: type(IntegerRange(-54,13,12)[0]), type(list(range(-54,13,12))[0])
89
+ (<... 'sage.rings.integer.Integer'>, <... 'int'>)
90
+
91
+ When ``begin`` is finite and ``end`` is +Infinity, ``self`` is the infinite
92
+ arithmetic progression starting from the ``begin`` by step ``step``::
93
+
94
+ sage: I = IntegerRange(54,Infinity,3); I
95
+ {54, 57, ...}
96
+ sage: I.category()
97
+ Category of facade infinite enumerated sets
98
+ sage: p = iter(I)
99
+ sage: (next(p), next(p), next(p), next(p), next(p), next(p))
100
+ (54, 57, 60, 63, 66, 69)
101
+
102
+ sage: I = IntegerRange(54,-Infinity,-3); I
103
+ {54, 51, ...}
104
+ sage: I.category()
105
+ Category of facade infinite enumerated sets
106
+ sage: p = iter(I)
107
+ sage: (next(p), next(p), next(p), next(p), next(p), next(p))
108
+ (54, 51, 48, 45, 42, 39)
109
+
110
+ When ``begin`` and ``end`` are both infinite, you will have to specify the
111
+ extra argument ``middle_point``. ``self`` is then defined by a point
112
+ and a progression/regression setting by ``step``. The enumeration
113
+ is done this way: (let us call `m` the ``middle_point``)
114
+ `\{m, m+step, m-step, m+2step, m-2step, m+3step, \dots \}`::
115
+
116
+ sage: I = IntegerRange(-Infinity,Infinity,37,-12); I
117
+ Integer progression containing -12 with increment 37 and bounded with -Infinity and +Infinity
118
+ sage: I.category()
119
+ Category of facade infinite enumerated sets
120
+ sage: -12 in I
121
+ True
122
+ sage: -15 in I
123
+ False
124
+ sage: p = iter(I)
125
+ sage: (next(p), next(p), next(p), next(p), next(p), next(p), next(p), next(p))
126
+ (-12, 25, -49, 62, -86, 99, -123, 136)
127
+
128
+ It is also possible to use the argument ``middle_point`` for other cases, finite
129
+ or infinite. The set will be the same as if you didn't give this extra argument
130
+ but the enumeration will begin with this ``middle_point``::
131
+
132
+ sage: I = IntegerRange(123,-12,-14); I
133
+ {123, 109, ..., -3}
134
+ sage: list(I)
135
+ [123, 109, 95, 81, 67, 53, 39, 25, 11, -3]
136
+ sage: J = IntegerRange(123,-12,-14,25); J
137
+ Integer progression containing 25 with increment -14 and bounded with 123 and -12
138
+ sage: list(J)
139
+ [25, 11, 39, -3, 53, 67, 81, 95, 109, 123]
140
+
141
+ Remember that, like for range, if you define a non empty set, ``begin`` is
142
+ supposed to be included and ``end`` is supposed to be excluded. In the same
143
+ way, when you define a set with a ``middle_point``, the ``begin`` bound will
144
+ be supposed to be included and the ``end`` bound supposed to be excluded::
145
+
146
+ sage: I = IntegerRange(-100,100,10,0)
147
+ sage: J = list(range(-100,100,10))
148
+ sage: 100 in I
149
+ False
150
+ sage: 100 in J
151
+ False
152
+ sage: -100 in I
153
+ True
154
+ sage: -100 in J
155
+ True
156
+ sage: list(I)
157
+ [0, 10, -10, 20, -20, 30, -30, 40, -40, 50, -50, 60, -60, 70, -70, 80, -80, 90, -90, -100]
158
+
159
+
160
+ .. NOTE::
161
+
162
+ The input is normalized so that::
163
+
164
+ sage: IntegerRange(1, 6, 2) is IntegerRange(1, 7, 2)
165
+ True
166
+ sage: IntegerRange(1, 8, 3) is IntegerRange(1, 10, 3)
167
+ True
168
+
169
+ TESTS::
170
+
171
+ sage: # Some category automatic tests
172
+ sage: TestSuite(IntegerRange(2,100,3)).run()
173
+ sage: TestSuite(IntegerRange(564,-12,-46)).run()
174
+ sage: TestSuite(IntegerRange(2,Infinity,3)).run()
175
+ sage: TestSuite(IntegerRange(732,-Infinity,-13)).run()
176
+ sage: TestSuite(IntegerRange(-Infinity,Infinity,3,2)).run()
177
+ sage: TestSuite(IntegerRange(56,Infinity,12,80)).run()
178
+ sage: TestSuite(IntegerRange(732,-12,-2743,732)).run()
179
+ sage: # 20 random tests: range and IntegerRange give the same set for finite cases
180
+ sage: for i in range(20):
181
+ ....: begin = Integer(randint(-300,300))
182
+ ....: end = Integer(randint(-300,300))
183
+ ....: step = Integer(randint(-20,20))
184
+ ....: if step == 0:
185
+ ....: step = Integer(1)
186
+ ....: assert list(IntegerRange(begin, end, step)) == list(range(begin, end, step))
187
+ sage: # 20 random tests: range and IntegerRange with middle point for finite cases
188
+ sage: for i in range(20):
189
+ ....: begin = Integer(randint(-300,300))
190
+ ....: end = Integer(randint(-300,300))
191
+ ....: step = Integer(randint(-15,15))
192
+ ....: if step == 0:
193
+ ....: step = Integer(-3)
194
+ ....: I = IntegerRange(begin, end, step)
195
+ ....: if I.cardinality() == 0:
196
+ ....: assert len(range(begin, end, step)) == 0
197
+ ....: else:
198
+ ....: TestSuite(I).run()
199
+ ....: L1 = list(IntegerRange(begin, end, step, I.an_element()))
200
+ ....: L2 = list(range(begin, end, step))
201
+ ....: L1.sort()
202
+ ....: L2.sort()
203
+ ....: assert L1 == L2
204
+
205
+ Thanks to :issue:`8543` empty integer range are allowed::
206
+
207
+ sage: TestSuite(IntegerRange(0, 5, -1)).run()
208
+ """
209
+
210
+ @staticmethod
211
+ def __classcall_private__(cls, begin, end=None, step=Integer(1), middle_point=None):
212
+ """
213
+ TESTS::
214
+
215
+ sage: IntegerRange(2,5,0)
216
+ Traceback (most recent call last):
217
+ ...
218
+ ValueError: IntegerRange() step argument must not be zero
219
+ sage: IntegerRange(2) is IntegerRange(0, 2)
220
+ True
221
+ sage: IntegerRange(1.0) # needs sage.rings.real_mpfr
222
+ Traceback (most recent call last):
223
+ ...
224
+ TypeError: end must be Integer or Infinity, not <... 'sage.rings.real_mpfr.RealLiteral'>
225
+ """
226
+ if isinstance(begin, int):
227
+ begin = Integer(begin)
228
+ if isinstance(end, int):
229
+ end = Integer(end)
230
+ if isinstance(step, int):
231
+ step = Integer(step)
232
+
233
+ if end is None:
234
+ end = begin
235
+ begin = Integer(0)
236
+ # check of the arguments
237
+ if not isinstance(begin, (Integer, MinusInfinity, PlusInfinity)):
238
+ raise TypeError("begin must be Integer or Infinity, not %r" % type(begin))
239
+ if not isinstance(end, (Integer, MinusInfinity, PlusInfinity)):
240
+ raise TypeError("end must be Integer or Infinity, not %r" % type(end))
241
+ if not isinstance(step, Integer):
242
+ raise TypeError("step must be Integer, not %r" % type(step))
243
+ if step.is_zero():
244
+ raise ValueError("IntegerRange() step argument must not be zero")
245
+
246
+ # If begin and end are infinite, middle_point and step will defined the set.
247
+ if begin == -Infinity and end == Infinity:
248
+ if middle_point is None:
249
+ raise ValueError("Can't iterate over this set, please provide middle_point")
250
+
251
+ # If we have a middle point, we go on the special enumeration way...
252
+ if middle_point is not None:
253
+ return IntegerRangeFromMiddle(begin, end, step, middle_point)
254
+
255
+ if begin == -Infinity or begin == Infinity:
256
+ raise ValueError("Can't iterate over this set: It is impossible to begin an enumeration with plus/minus Infinity")
257
+
258
+ # Check for empty sets
259
+ if step > 0 and begin >= end or step < 0 and begin <= end:
260
+ return IntegerRangeEmpty()
261
+
262
+ if end != Infinity and end != -Infinity:
263
+ # Normalize the input
264
+ sgn = 1 if step > 0 else -1
265
+ end = begin + ((end - begin - sgn) // (step) + 1) * step
266
+ return IntegerRangeFinite(begin, end, step)
267
+ else:
268
+ return IntegerRangeInfinite(begin, step)
269
+
270
+ def _element_constructor_(self, el):
271
+ """
272
+ TESTS::
273
+
274
+ sage: S = IntegerRange(1, 10, 2)
275
+ sage: S(1) #indirect doctest
276
+ 1
277
+ sage: S(0) #indirect doctest
278
+ Traceback (most recent call last):
279
+ ...
280
+ ValueError: 0 not in {1, 3, 5, 7, 9}
281
+ """
282
+ if el in self:
283
+ if not isinstance(el, Integer):
284
+ return Integer(el)
285
+ return el
286
+ else:
287
+ raise ValueError("%s not in %s" % (el, self))
288
+
289
+ element_class = Integer
290
+
291
+
292
+ class IntegerRangeEmpty(IntegerRange, FiniteEnumeratedSet):
293
+ r"""
294
+ A singleton class for empty integer ranges.
295
+
296
+ See :class:`IntegerRange` for more details.
297
+ """
298
+
299
+ # Needed because FiniteEnumeratedSet.__classcall__ takes an argument.
300
+ @staticmethod
301
+ def __classcall__(cls, *args):
302
+ """
303
+ TESTS::
304
+
305
+ sage: from sage.sets.integer_range import IntegerRangeEmpty
306
+ sage: I = IntegerRangeEmpty(); I
307
+ {}
308
+ sage: I.category()
309
+ Category of facade finite enumerated sets
310
+ sage: TestSuite(I).run()
311
+ sage: I(0)
312
+ Traceback (most recent call last):
313
+ ...
314
+ ValueError: 0 not in {}
315
+ """
316
+ return FiniteEnumeratedSet.__classcall__(cls, ())
317
+
318
+
319
+ class IntegerRangeFinite(IntegerRange):
320
+ r"""
321
+ The class of finite enumerated sets of integers defined by finite
322
+ arithmetic progressions
323
+
324
+ See :class:`IntegerRange` for more details.
325
+ """
326
+ def __init__(self, begin, end, step=Integer(1)):
327
+ r"""
328
+ TESTS::
329
+
330
+ sage: I = IntegerRange(123,12,-4)
331
+ sage: I.category()
332
+ Category of facade finite enumerated sets
333
+ sage: TestSuite(I).run()
334
+ """
335
+ self._begin = begin
336
+ self._end = end
337
+ self._step = step
338
+ Parent.__init__(self, facade=IntegerRing(), category=FiniteEnumeratedSets())
339
+
340
+ def __contains__(self, elt):
341
+ r"""
342
+ Return ``True`` if ``elt`` is in ``self``.
343
+
344
+ EXAMPLES::
345
+
346
+ sage: I = IntegerRange(123,12,-4)
347
+ sage: 123 in I
348
+ True
349
+ sage: 127 in I
350
+ False
351
+ sage: 12 in I
352
+ False
353
+ sage: 13 in I
354
+ False
355
+ sage: 14 in I
356
+ False
357
+ sage: 15 in I
358
+ True
359
+ sage: 11 in I
360
+ False
361
+ """
362
+ if not isinstance(elt, Integer):
363
+ try:
364
+ x = Integer(elt)
365
+ if x != elt:
366
+ return False
367
+ elt = x
368
+ except (ValueError, TypeError):
369
+ return False
370
+ if abs(self._step).divides(Integer(elt)-self._begin):
371
+ return (self._begin <= elt < self._end and self._step > 0) or \
372
+ (self._begin >= elt > self._end and self._step < 0)
373
+ return False
374
+
375
+ def cardinality(self):
376
+ """
377
+ Return the cardinality of ``self``.
378
+
379
+ EXAMPLES::
380
+
381
+ sage: IntegerRange(123,12,-4).cardinality()
382
+ 28
383
+ sage: IntegerRange(-57,12,8).cardinality()
384
+ 9
385
+ sage: IntegerRange(123,12,4).cardinality()
386
+ 0
387
+ """
388
+ return (abs(self._end+self._step-self._begin)-1) // abs(self._step)
389
+
390
+ def _repr_(self):
391
+ """
392
+ EXAMPLES::
393
+
394
+ sage: IntegerRange(1,2) #indirect doctest
395
+ {1}
396
+ sage: IntegerRange(1,3) #indirect doctest
397
+ {1, 2}
398
+ sage: IntegerRange(1,5) #indirect doctest
399
+ {1, 2, 3, 4}
400
+ sage: IntegerRange(1,6) #indirect doctest
401
+ {1, ..., 5}
402
+ sage: IntegerRange(123,12,-4) #indirect doctest
403
+ {123, 119, ..., 15}
404
+ sage: IntegerRange(-57,1,3) #indirect doctest
405
+ {-57, -54, ..., 0}
406
+ """
407
+ if self.cardinality() < 6:
408
+ return "{" + ", ".join(str(x) for x in self) + "}"
409
+ if self._step == 1:
410
+ return "{%s, ..., %s}" % (self._begin, self._end - self._step)
411
+ return "{%s, %s, ..., %s}" % (self._begin, self._begin + self._step,
412
+ self._end - self._step)
413
+
414
+ def rank(self, x):
415
+ r"""
416
+ EXAMPLES::
417
+
418
+ sage: I = IntegerRange(-57,36,8)
419
+ sage: I.rank(23)
420
+ 10
421
+ sage: I.unrank(10)
422
+ 23
423
+ sage: I.rank(22)
424
+ Traceback (most recent call last):
425
+ ...
426
+ IndexError: 22 not in self
427
+ sage: I.rank(87)
428
+ Traceback (most recent call last):
429
+ ...
430
+ IndexError: 87 not in self
431
+ """
432
+ if x not in self:
433
+ raise IndexError("%s not in self" % x)
434
+ return Integer((x - self._begin)/self._step)
435
+
436
+ def __getitem__(self, i):
437
+ r"""
438
+ Return the i-th element of this integer range.
439
+
440
+ EXAMPLES::
441
+
442
+ sage: I = IntegerRange(1,13,5)
443
+ sage: I[0], I[1], I[2]
444
+ (1, 6, 11)
445
+ sage: I[3]
446
+ Traceback (most recent call last):
447
+ ...
448
+ IndexError: out of range
449
+ sage: I[-1]
450
+ 11
451
+ sage: I[-4]
452
+ Traceback (most recent call last):
453
+ ...
454
+ IndexError: out of range
455
+
456
+ sage: I = IntegerRange(13,1,-1)
457
+ sage: l = I.list()
458
+ sage: [I[i] for i in range(I.cardinality())] == l
459
+ True
460
+ sage: l.reverse()
461
+ sage: [I[i] for i in range(-1,-I.cardinality()-1,-1)] == l
462
+ True
463
+ """
464
+ if isinstance(i, slice):
465
+ raise NotImplementedError("not yet")
466
+
467
+ if isinstance(i, int):
468
+ i = Integer(i)
469
+ elif not isinstance(i, Integer):
470
+ raise ValueError("argument should be an integer")
471
+
472
+ if i < 0:
473
+ if i < -self.cardinality():
474
+ raise IndexError("out of range")
475
+ n = (self._end - self._begin)//(self._step)
476
+ return self._begin + (n+i)*self._step
477
+ else:
478
+ if i >= self.cardinality():
479
+ raise IndexError("out of range")
480
+ return self._begin + i * self._step
481
+
482
+ unrank = __getitem__
483
+
484
+ def __iter__(self):
485
+ r"""
486
+ Return an iterator over the elements of ``self``.
487
+
488
+ EXAMPLES::
489
+
490
+ sage: I = IntegerRange(123,12,-4)
491
+ sage: p = iter(I)
492
+ sage: [next(p) for i in range(8)]
493
+ [123, 119, 115, 111, 107, 103, 99, 95]
494
+ sage: I = IntegerRange(-57,12,8)
495
+ sage: p = iter(I)
496
+ sage: [next(p) for i in range(8)]
497
+ [-57, -49, -41, -33, -25, -17, -9, -1]
498
+ """
499
+ n = self._begin
500
+ if self._step > 0:
501
+ while n < self._end:
502
+ yield n
503
+ n += self._step
504
+ else:
505
+ while n > self._end:
506
+ yield n
507
+ n += self._step
508
+
509
+ def _an_element_(self):
510
+ r"""
511
+ Return an element of ``self``.
512
+
513
+ EXAMPLES::
514
+
515
+ sage: I = IntegerRange(123,12,-4)
516
+ sage: I.an_element() #indirect doctest
517
+ 115
518
+ sage: I = IntegerRange(-57,12,8)
519
+ sage: I.an_element() #indirect doctest
520
+ -41
521
+ """
522
+ p = (self._begin + 2*self._step)
523
+ if p in self:
524
+ return p
525
+ else:
526
+ return self._begin
527
+
528
+
529
+ class IntegerRangeInfinite(IntegerRange):
530
+ r""" The class of infinite enumerated sets of integers defined by infinite
531
+ arithmetic progressions.
532
+
533
+ See :class:`IntegerRange` for more details.
534
+ """
535
+ def __init__(self, begin, step=Integer(1)):
536
+ r"""
537
+ TESTS::
538
+
539
+ sage: I = IntegerRange(-57,Infinity,8)
540
+ sage: I.category()
541
+ Category of facade infinite enumerated sets
542
+ sage: TestSuite(I).run()
543
+ """
544
+ if not isinstance(begin, Integer):
545
+ raise TypeError("begin should be Integer, not %r" % type(begin))
546
+ self._begin = begin
547
+ self._step = step
548
+ Parent.__init__(self, facade=IntegerRing(), category=InfiniteEnumeratedSets())
549
+
550
+ def _repr_(self):
551
+ r"""
552
+ TESTS::
553
+
554
+ sage: IntegerRange(123,12,-4) #indirect doctest
555
+ {123, 119, ..., 15}
556
+ sage: IntegerRange(-57,1,3) #indirect doctest
557
+ {-57, -54, ..., 0}
558
+
559
+ sage: IntegerRange(-57,Infinity,8) #indirect doctest
560
+ {-57, -49, ...}
561
+ sage: IntegerRange(-112,-Infinity,-13) #indirect doctest
562
+ {-112, -125, ...}
563
+ """
564
+ return "{%s, %s, ...}" % (self._begin, self._begin+self._step)
565
+
566
+ def __contains__(self, elt):
567
+ r"""
568
+ Return ``True`` if ``elt`` is in ``self``.
569
+
570
+ EXAMPLES::
571
+
572
+ sage: I = IntegerRange(-57,Infinity,8)
573
+ sage: -57 in I
574
+ True
575
+ sage: -65 in I
576
+ False
577
+ sage: -49 in I
578
+ True
579
+ sage: 743 in I
580
+ True
581
+ """
582
+ if not isinstance(elt, Integer):
583
+ try:
584
+ elt = Integer(elt)
585
+ except (TypeError, ValueError):
586
+ return False
587
+ if abs(self._step).divides(Integer(elt)-self._begin):
588
+ return (self._step > 0 and elt >= self._begin) or \
589
+ (self._step < 0 and elt <= self._begin)
590
+ return False
591
+
592
+ def rank(self, x):
593
+ r"""
594
+ EXAMPLES::
595
+
596
+ sage: I = IntegerRange(-57,Infinity,8)
597
+ sage: I.rank(23)
598
+ 10
599
+ sage: I.unrank(10)
600
+ 23
601
+ sage: I.rank(22)
602
+ Traceback (most recent call last):
603
+ ...
604
+ IndexError: 22 not in self
605
+ """
606
+ if x not in self:
607
+ raise IndexError("%s not in self" % x)
608
+ return Integer((x - self._begin)/self._step)
609
+
610
+ def __getitem__(self, i):
611
+ r"""
612
+ Return the ``i``-th element of ``self``.
613
+
614
+ EXAMPLES::
615
+
616
+ sage: I = IntegerRange(-8,Infinity,3)
617
+ sage: I.unrank(1)
618
+ -5
619
+ """
620
+ if isinstance(i, slice):
621
+ raise NotImplementedError("not yet")
622
+
623
+ if isinstance(i, int):
624
+ i = Integer(i)
625
+ elif not isinstance(i, Integer):
626
+ raise ValueError
627
+
628
+ if i < 0:
629
+ raise IndexError("out of range")
630
+ else:
631
+ return self._begin + i * self._step
632
+
633
+ unrank = __getitem__
634
+
635
+ def __iter__(self):
636
+ r"""
637
+ Return an iterator over the elements of ``self``.
638
+
639
+ EXAMPLES::
640
+
641
+ sage: I = IntegerRange(-57,Infinity,8)
642
+ sage: p = iter(I)
643
+ sage: [next(p) for i in range(8)]
644
+ [-57, -49, -41, -33, -25, -17, -9, -1]
645
+
646
+ sage: I = IntegerRange(-112,-Infinity,-13)
647
+ sage: p = iter(I)
648
+ sage: [next(p) for i in range(8)]
649
+ [-112, -125, -138, -151, -164, -177, -190, -203]
650
+ """
651
+ n = self._begin
652
+ while True:
653
+ yield n
654
+ n += self._step
655
+
656
+ def _an_element_(self):
657
+ r"""
658
+ Return an element of ``self``.
659
+
660
+ EXAMPLES::
661
+
662
+ sage: I = IntegerRange(-57,Infinity,8)
663
+ sage: I.an_element() #indirect doctest
664
+ 191
665
+
666
+ sage: I = IntegerRange(-112,-Infinity,-13)
667
+ sage: I.an_element() #indirect doctest
668
+ -515
669
+ """
670
+ return self._begin + 31*self._step
671
+
672
+
673
+ class IntegerRangeFromMiddle(IntegerRange):
674
+ r"""
675
+ The class of finite or infinite enumerated sets defined with
676
+ an inside point, a progression and two limits.
677
+
678
+ See :class:`IntegerRange` for more details.
679
+ """
680
+ def __init__(self, begin, end, step=Integer(1), middle_point=Integer(1)):
681
+ r"""
682
+ TESTS::
683
+
684
+ sage: from sage.sets.integer_range import IntegerRangeFromMiddle
685
+ sage: I = IntegerRangeFromMiddle(-100,100,10,0)
686
+ sage: I.category()
687
+ Category of facade finite enumerated sets
688
+ sage: TestSuite(I).run()
689
+ sage: I = IntegerRangeFromMiddle(Infinity,-Infinity,-37,0)
690
+ sage: I.category()
691
+ Category of facade infinite enumerated sets
692
+ sage: TestSuite(I).run()
693
+
694
+ sage: IntegerRange(0, 5, 1, -3)
695
+ Traceback (most recent call last):
696
+ ...
697
+ ValueError: middle_point is not in the interval
698
+ """
699
+ self._begin = begin
700
+ self._end = end
701
+ self._step = step
702
+ self._middle_point = middle_point
703
+ if middle_point not in self:
704
+ raise ValueError("middle_point is not in the interval")
705
+
706
+ if (begin != Infinity and begin != -Infinity and
707
+ end != Infinity and end != -Infinity):
708
+ cat = FiniteEnumeratedSets()
709
+ else:
710
+ cat = InfiniteEnumeratedSets()
711
+
712
+ Parent.__init__(self, facade=IntegerRing(), category=cat)
713
+
714
+ def _repr_(self):
715
+ r"""
716
+ TESTS::
717
+
718
+ sage: from sage.sets.integer_range import IntegerRangeFromMiddle
719
+ sage: IntegerRangeFromMiddle(Infinity,-Infinity,-37,0) #indirect doctest
720
+ Integer progression containing 0 with increment -37 and bounded with +Infinity and -Infinity
721
+ sage: IntegerRangeFromMiddle(-100,100,10,0) #indirect doctest
722
+ Integer progression containing 0 with increment 10 and bounded with -100 and 100
723
+ """
724
+ return "Integer progression containing %s with increment %s and bounded with %s and %s" % (
725
+ self._middle_point, self._step, self._begin, self._end)
726
+
727
+ def __contains__(self, elt):
728
+ r"""
729
+ Return ``True`` if ``elt`` is in ``self``.
730
+
731
+ EXAMPLES::
732
+
733
+ sage: from sage.sets.integer_range import IntegerRangeFromMiddle
734
+ sage: I = IntegerRangeFromMiddle(-100,100,10,0)
735
+ sage: -110 in I
736
+ False
737
+ sage: -100 in I
738
+ True
739
+ sage: 30 in I
740
+ True
741
+ sage: 90 in I
742
+ True
743
+ sage: 100 in I
744
+ False
745
+ """
746
+ if not isinstance(elt, Integer):
747
+ try:
748
+ elt = Integer(elt)
749
+ except (TypeError, ValueError):
750
+ return False
751
+ if abs(self._step).divides(Integer(elt)-self._middle_point):
752
+ return (self._begin <= elt < self._end) or \
753
+ (self._begin >= elt > self._end)
754
+ return False
755
+
756
+ def next(self, elt):
757
+ r"""
758
+ Return the next element of ``elt`` in ``self``.
759
+
760
+ EXAMPLES::
761
+
762
+ sage: from sage.sets.integer_range import IntegerRangeFromMiddle
763
+ sage: I = IntegerRangeFromMiddle(-100,100,10,0)
764
+ sage: (I.next(0), I.next(10), I.next(-10), I.next(20), I.next(-100))
765
+ (10, -10, 20, -20, None)
766
+ sage: I = IntegerRangeFromMiddle(-Infinity,Infinity,10,0)
767
+ sage: (I.next(0), I.next(10), I.next(-10), I.next(20), I.next(-100))
768
+ (10, -10, 20, -20, 110)
769
+ sage: I.next(1)
770
+ Traceback (most recent call last):
771
+ ...
772
+ LookupError: 1 not in Integer progression containing 0 with increment 10 and bounded with -Infinity and +Infinity
773
+ """
774
+ if elt not in self:
775
+ raise LookupError('%r not in %r' % (elt, self))
776
+ n = self._middle_point
777
+ if (elt <= n and self._step > 0) or (elt >= n and self._step < 0):
778
+ right = 2*n-elt+self._step
779
+ if right in self:
780
+ return right
781
+ else:
782
+ left = elt-self._step
783
+ if left in self:
784
+ return left
785
+ else:
786
+ left = 2*n-elt
787
+ if left in self:
788
+ return left
789
+ else:
790
+ right = elt+self._step
791
+ if right in self:
792
+ return right
793
+
794
+ def __iter__(self):
795
+ r"""
796
+ Return an iterator over the elements of ``self``.
797
+
798
+ EXAMPLES::
799
+
800
+ sage: from sage.sets.integer_range import IntegerRangeFromMiddle
801
+ sage: I = IntegerRangeFromMiddle(Infinity,-Infinity,-37,0)
802
+ sage: p = iter(I)
803
+ sage: (next(p), next(p), next(p), next(p), next(p), next(p), next(p), next(p))
804
+ (0, -37, 37, -74, 74, -111, 111, -148)
805
+ sage: I = IntegerRangeFromMiddle(-12,214,10,0)
806
+ sage: p = iter(I)
807
+ sage: (next(p), next(p), next(p), next(p), next(p), next(p), next(p), next(p))
808
+ (0, 10, -10, 20, 30, 40, 50, 60)
809
+ """
810
+ n = self._middle_point
811
+ while n is not None:
812
+ yield n
813
+ n = self.next(n)
814
+
815
+ def _an_element_(self):
816
+ r"""
817
+ Return an element of ``self``.
818
+
819
+ EXAMPLES::
820
+
821
+ sage: from sage.sets.integer_range import IntegerRangeFromMiddle
822
+ sage: I = IntegerRangeFromMiddle(Infinity,-Infinity,-37,0)
823
+ sage: I.an_element() #indirect doctest
824
+ 0
825
+ sage: I = IntegerRangeFromMiddle(-12,214,10,0)
826
+ sage: I.an_element() #indirect doctest
827
+ 0
828
+ """
829
+ return self._middle_point