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,1043 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Localization
4
+
5
+ Localization is an important ring construction tool. Whenever you have
6
+ to extend a given integral domain such that it contains the inverses
7
+ of a finite set of elements but should allow non injective homomorphic
8
+ images this construction will be needed. See the example on
9
+ Ariki-Koike algebras below for such an application.
10
+
11
+ EXAMPLES::
12
+
13
+ sage: # needs sage.modules
14
+ sage: LZ = Localization(ZZ, (5,11))
15
+ sage: m = matrix(LZ, [[5, 7], [0,11]])
16
+ sage: m.parent()
17
+ Full MatrixSpace of 2 by 2 dense matrices over Integer Ring localized at (5, 11)
18
+ sage: ~m # parent of inverse is different: see documentation of m.__invert__
19
+ [ 1/5 -7/55]
20
+ [ 0 1/11]
21
+ sage: _.parent()
22
+ Full MatrixSpace of 2 by 2 dense matrices over Rational Field
23
+ sage: mi = matrix(LZ, ~m)
24
+ sage: mi.parent()
25
+ Full MatrixSpace of 2 by 2 dense matrices over Integer Ring localized at (5, 11)
26
+ sage: mi == ~m
27
+ True
28
+
29
+ The next example defines the most general ring containing the coefficients of the irreducible
30
+ representations of the Ariki-Koike algebra corresponding to the three colored permutations on
31
+ three elements::
32
+
33
+ sage: R.<u0, u1, u2, q> = ZZ[]
34
+ sage: u = [u0, u1, u2]
35
+ sage: S = Set(u)
36
+ sage: I = S.cartesian_product(S)
37
+ sage: add_units = u + [q, q + 1] + [ui - uj for ui, uj in I if ui != uj]
38
+ sage: add_units += [q*ui - uj for ui, uj in I if ui != uj]
39
+ sage: L = R.localization(tuple(add_units)); L # needs sage.libs.pari
40
+ Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring localized at
41
+ (q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0, u2*q - u1, u1*q - u0,
42
+ u1*q - u2, u0*q - u1, u0*q - u2)
43
+
44
+ Define the representation matrices (of one of the three dimensional irreducible representations)::
45
+
46
+ sage: # needs sage.libs.pari sage.modules
47
+ sage: m1 = matrix(L, [[u1, 0, 0], [0, u0, 0], [0, 0, u0]])
48
+ sage: m2 = matrix(L, [[(u0*q - u0)/(u0 - u1), (u0*q - u1)/(u0 - u1), 0],
49
+ ....: [(-u1*q + u0)/(u0 - u1), (-u1*q + u1)/(u0 - u1), 0],
50
+ ....: [0, 0, -1]])
51
+ sage: m3 = matrix(L, [[-1, 0, 0],
52
+ ....: [0, u0*(1 - q)/(u1*q - u0), q*(u1 - u0)/(u1*q - u0)],
53
+ ....: [0, (u1*q^2 - u0)/(u1*q - u0), (u1*q^ 2 - u1*q)/(u1*q - u0)]])
54
+ sage: m1.base_ring() == L
55
+ True
56
+
57
+ Check relations of the Ariki-Koike algebra::
58
+
59
+ sage: # needs sage.libs.pari sage.modules
60
+ sage: m1*m2*m1*m2 == m2*m1*m2*m1
61
+ True
62
+ sage: m2*m3*m2 == m3*m2*m3
63
+ True
64
+ sage: m1*m3 == m3*m1
65
+ True
66
+ sage: m1**3 - (u0+u1+u2)*m1**2 + (u0*u1+u0*u2+u1*u2)*m1 - u0*u1*u2 == 0
67
+ True
68
+ sage: m2**2 - (q-1)*m2 - q == 0
69
+ True
70
+ sage: m3**2 - (q-1)*m3 - q == 0
71
+ True
72
+ sage: ~m1 in m1.parent()
73
+ True
74
+ sage: ~m2 in m2.parent()
75
+ True
76
+ sage: ~m3 in m3.parent()
77
+ True
78
+
79
+ Obtain specializations in positive characteristic::
80
+
81
+ sage: # needs sage.libs.pari sage.modules
82
+ sage: Fp = GF(17)
83
+ sage: f = L.hom((3,5,7,11), codomain=Fp); f
84
+ Ring morphism:
85
+ From: Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring localized at
86
+ (q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0, u2*q - u1,
87
+ u1*q - u0, u1*q - u2, u0*q - u1, u0*q - u2)
88
+ To: Finite Field of size 17
89
+ Defn: u0 |--> 3
90
+ u1 |--> 5
91
+ u2 |--> 7
92
+ q |--> 11
93
+ sage: mFp1 = matrix({k: f(v) for k, v in m1.dict().items()}); mFp1
94
+ [5 0 0]
95
+ [0 3 0]
96
+ [0 0 3]
97
+ sage: mFp1.base_ring()
98
+ Finite Field of size 17
99
+ sage: mFp2 = matrix({k: f(v) for k, v in m2.dict().items()}); mFp2
100
+ [ 2 3 0]
101
+ [ 9 8 0]
102
+ [ 0 0 16]
103
+ sage: mFp3 = matrix({k: f(v) for k, v in m3.dict().items()}); mFp3
104
+ [16 0 0]
105
+ [ 0 4 5]
106
+ [ 0 7 6]
107
+
108
+ Obtain specializations in characteristic 0::
109
+
110
+ sage: # needs sage.libs.pari
111
+ sage: fQ = L.hom((3,5,7,11), codomain=QQ); fQ
112
+ Ring morphism:
113
+ From: Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring
114
+ localized at (q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0,
115
+ u2*q - u1, u1*q - u0, u1*q - u2, u0*q - u1, u0*q - u2)
116
+ To: Rational Field
117
+ Defn: u0 |--> 3
118
+ u1 |--> 5
119
+ u2 |--> 7
120
+ q |--> 11
121
+
122
+ sage: # needs sage.libs.pari sage.modules sage.rings.finite_rings
123
+ sage: mQ1 = matrix({k: fQ(v) for k, v in m1.dict().items()}); mQ1
124
+ [5 0 0]
125
+ [0 3 0]
126
+ [0 0 3]
127
+ sage: mQ1.base_ring()
128
+ Rational Field
129
+ sage: mQ2 = matrix({k: fQ(v) for k, v in m2.dict().items()}); mQ2
130
+ [-15 -14 0]
131
+ [ 26 25 0]
132
+ [ 0 0 -1]
133
+ sage: mQ3 = matrix({k: fQ(v) for k, v in m3.dict().items()}); mQ3
134
+ [ -1 0 0]
135
+ [ 0 -15/26 11/26]
136
+ [ 0 301/26 275/26]
137
+
138
+ sage: # needs sage.libs.pari sage.libs.singular
139
+ sage: S.<x, y, z, t> = QQ[]
140
+ sage: T = S.quo(x + y + z)
141
+ sage: F = T.fraction_field()
142
+ sage: fF = L.hom((x, y, z, t), codomain=F); fF
143
+ Ring morphism:
144
+ From: Multivariate Polynomial Ring in u0, u1, u2, q over Integer Ring
145
+ localized at (q, q + 1, u2, u1 - u2, u1, u0 - u1, u0 - u2, u0, u2*q - u0,
146
+ u2*q - u1, u1*q - u0, u1*q - u2, u0*q - u1, u0*q - u2)
147
+ To: Fraction Field of Quotient of Multivariate Polynomial Ring in x, y, z, t
148
+ over Rational Field by the ideal (x + y + z)
149
+ Defn: u0 |--> -ybar - zbar
150
+ u1 |--> ybar
151
+ u2 |--> zbar
152
+ q |--> tbar
153
+ sage: mF1 = matrix({k: fF(v) for k, v in m1.dict().items()}); mF1 # needs sage.modules
154
+ [ ybar 0 0]
155
+ [ 0 -ybar - zbar 0]
156
+ [ 0 0 -ybar - zbar]
157
+ sage: mF1.base_ring() == F # needs sage.modules
158
+ True
159
+
160
+ TESTS::
161
+
162
+ sage: TestSuite(L).run() # needs sage.libs.pari sage.libs.singular sage.modules
163
+
164
+ AUTHORS:
165
+
166
+ - Sebastian Oehms 2019-12-09: initial version.
167
+ - Sebastian Oehms 2022-03-05: fix some corner cases and add :meth:`factor` (:issue:`33463`)
168
+ """
169
+
170
+
171
+ # ****************************************************************************
172
+ # Copyright (C) 2019 Sebastian Oehms <seb.oehms@gmail.com>
173
+ #
174
+ # This program is free software: you can redistribute it and/or modify
175
+ # it under the terms of the GNU General Public License as published by
176
+ # the Free Software Foundation, either version 2 of the License, or
177
+ # (at your option) any later version.
178
+ # https://www.gnu.org/licenses/
179
+ # ****************************************************************************
180
+
181
+
182
+ from sage.structure.unique_representation import UniqueRepresentation
183
+ from sage.categories.integral_domains import IntegralDomains
184
+ from sage.structure.parent import Parent
185
+ from sage.structure.element import IntegralDomainElement
186
+
187
+
188
+ def normalize_extra_units(base_ring, add_units, warning=True):
189
+ """
190
+ Function to normalize input data.
191
+
192
+ The given list will be replaced by a list of the involved prime factors
193
+ (if possible).
194
+
195
+ INPUT:
196
+
197
+ - ``base_ring`` -- a ring in the category of :class:`IntegralDomains`
198
+ - ``add_units`` -- list of elements from base ring
199
+ - ``warning`` -- boolean (default: ``True``); to suppress a warning which
200
+ is thrown if no normalization was possible
201
+
202
+ OUTPUT: list of all prime factors of the elements of the given list
203
+
204
+ EXAMPLES::
205
+
206
+ sage: from sage.rings.localization import normalize_extra_units
207
+ sage: normalize_extra_units(ZZ, [3, -15, 45, 9, 2, 50])
208
+ [2, 3, 5]
209
+ sage: P.<x,y,z> = ZZ[]
210
+ sage: normalize_extra_units(P, # needs sage.libs.pari
211
+ ....: [3*x, z*y**2, 2*z, 18*(x*y*z)**2, x*z, 6*x*z, 5])
212
+ [2, 3, 5, z, y, x]
213
+ sage: P.<x,y,z> = QQ[]
214
+ sage: normalize_extra_units(P, # needs sage.libs.pari
215
+ ....: [3*x, z*y**2, 2*z, 18*(x*y*z)**2, x*z, 6*x*z, 5])
216
+ [z, y, x]
217
+
218
+ sage: # needs sage.libs.singular
219
+ sage: R.<x, y> = ZZ[]
220
+ sage: Q.<a, b> = R.quo(x**2 - 5)
221
+ sage: p = b**2 - 5
222
+ sage: p == (b-a)*(b+a)
223
+ True
224
+ sage: normalize_extra_units(Q, [p]) # needs sage.libs.pari
225
+ doctest:...: UserWarning: Localization may not be represented uniquely
226
+ [b^2 - 5]
227
+ sage: normalize_extra_units(Q, [p], warning=False) # needs sage.libs.pari
228
+ [b^2 - 5]
229
+ """
230
+ # convert to base ring
231
+ add_units = [base_ring(n) for n in add_units]
232
+
233
+ # split down to prime factors if possible
234
+ add_units_result = []
235
+ for n in add_units:
236
+ try:
237
+ if n.is_unit():
238
+ continue
239
+ F = list(n.factor())
240
+ add_units_result += [f[0] for f in F]
241
+ except (NotImplementedError, AttributeError):
242
+ # if :meth:`is_unit` or :meth:`factor` are not available we can't do any more.
243
+ if warning:
244
+ from warnings import warn
245
+ warn('Localization may not be represented uniquely')
246
+ add_units_result = add_units
247
+ break
248
+
249
+ return sorted(set(add_units_result))
250
+
251
+
252
+ class LocalizationElement(IntegralDomainElement):
253
+ """
254
+ Element class for localizations of integral domains.
255
+
256
+ INPUT:
257
+
258
+ - ``parent`` -- instance of :class:`Localization`
259
+ - ``x`` -- instance of :class:`FractionFieldElement` whose parent is the
260
+ fraction field of the parent's base ring
261
+
262
+ EXAMPLES::
263
+
264
+ sage: # needs sage.libs.pari
265
+ sage: from sage.rings.localization import LocalizationElement
266
+ sage: P.<x,y,z> = GF(5)[]
267
+ sage: L = P.localization((x, y*z - x))
268
+ sage: LocalizationElement(L, 4/(y*z-x)**2)
269
+ (-1)/(y^2*z^2 - 2*x*y*z + x^2)
270
+ sage: _.parent()
271
+ Multivariate Polynomial Ring in x, y, z over Finite Field of size 5
272
+ localized at (x, y*z - x)
273
+ """
274
+
275
+ def __init__(self, parent, x):
276
+ """
277
+ Python constructor for the element class for localizations of integral domains.
278
+
279
+ EXAMPLES::
280
+
281
+ sage: from sage.rings.localization import LocalizationElement
282
+ sage: P.<x> = RR[]
283
+ sage: L = Localization(P, x**2 + x + 1) # needs sage.libs.pari
284
+ sage: l = LocalizationElement(L, (x**2+1)/(x**2+x+1)) # needs sage.libs.pari
285
+ sage: l._value == (x**2+1)/(x**2+x+1) # needs sage.libs.pari
286
+ True
287
+ """
288
+ IntegralDomainElement.__init__(self, parent)
289
+ self._value = x
290
+
291
+ def _repr_(self):
292
+ """
293
+ How to print ``self``.
294
+
295
+ EXAMPLES::
296
+
297
+ sage: # needs sage.libs.pari sage.rings.real_mpfr
298
+ sage: from sage.rings.localization import LocalizationElement
299
+ sage: P.<x> = CC[]
300
+ sage: L = Localization(P, x**2 + x + 1)
301
+ sage: l = LocalizationElement(L, (x**2+1)/(x**2+x+1))
302
+ sage: l._repr_() == str(l)
303
+ True
304
+
305
+ sage: R.<X, Y> = ZZ[]
306
+ sage: L.<x, y> = R.localization(X - Y) # needs sage.libs.singular
307
+ sage: x*y/(x-y) # needs sage.libs.singular
308
+ x*y/(x - y)
309
+ """
310
+ s = "%s" % self._value
311
+ L = self.parent()
312
+ names = L._names
313
+ if names:
314
+ n = len(names)
315
+ bnames = L.base_ring()._names
316
+ if bnames != names and n == len(bnames):
317
+ # replace separate names (see :issue:`33482`)
318
+ for i in range(n):
319
+ s = s.replace(bnames[i], names[i])
320
+ return s
321
+
322
+ def _add_(left, right):
323
+ """
324
+ Compute addition with another instance of ``self`` (via `+` operator).
325
+
326
+ EXAMPLES::
327
+
328
+ sage: L = Localization(ZZ, (5,11)) # indirect doctest
329
+ sage: L(1/5) + L(2/11)
330
+ 21/55
331
+ """
332
+ return left.parent()._fraction_to_element(left._value + right._value)
333
+
334
+ def _sub_(left, right):
335
+ """
336
+ Compute subtraction with another instance of ``self`` (via `-` operator).
337
+
338
+ EXAMPLES::
339
+
340
+ sage: L = Localization(ZZ, (5,11))
341
+ sage: L(2) - L(1/121) # indirect doctest
342
+ 241/121
343
+ """
344
+ return left.parent()._fraction_to_element(left._value - right._value)
345
+
346
+ def _mul_(left, right):
347
+ """
348
+ Compute multiplication with another instance of ``self`` (via `*` operator).
349
+
350
+ EXAMPLES::
351
+
352
+ sage: L = Localization(ZZ, (5,11))
353
+ sage: L(1/55) * L(2/25) # indirect doctest
354
+ 2/1375
355
+ """
356
+ return left.parent()._fraction_to_element(left._value * right._value)
357
+
358
+ def _div_(left, right):
359
+ """
360
+ Compute division with another instance of ``self`` (via `/` operator).
361
+
362
+ EXAMPLES::
363
+
364
+ sage: L = Localization(ZZ, (5,11))
365
+ sage: L(1/5) / L(5/11) # indirect doctest
366
+ 11/25
367
+ """
368
+ return left.parent()._fraction_to_element(left._value / right._value)
369
+
370
+ def _rmul_(self, c):
371
+ """
372
+ Compute right multiplication with an instance of the base ring of ``self`` (via `*` operator).
373
+
374
+ EXAMPLES::
375
+
376
+ sage: L = Localization(ZZ, (5,11))
377
+ sage: L(2/11) * 11 # indirect doctest
378
+ 2
379
+ """
380
+ return self.parent()._fraction_to_element(c * self._value)
381
+
382
+ def _lmul_(self, c):
383
+ """
384
+ Compute left multiplication with an instance of the base ring of ``self`` (via `*` operator).
385
+
386
+ EXAMPLES::
387
+
388
+ sage: L = Localization(ZZ, (5,11))
389
+ sage: 7 * L(3/5) # indirect doctest
390
+ 21/5
391
+ """
392
+ return self.parent()._fraction_to_element(self._value * c)
393
+
394
+ def factor(self, proof=None):
395
+ r"""
396
+ Return the factorization of this polynomial.
397
+
398
+ INPUT:
399
+
400
+ - ``proof`` -- (optional) if given it is passed to the
401
+ corresponding method of the numerator of ``self``
402
+
403
+ EXAMPLES::
404
+
405
+ sage: P.<X, Y> = QQ['x, y']
406
+ sage: L = P.localization(X - Y)
407
+ sage: x, y = L.gens() # needs sage.libs.singular
408
+ sage: p = (x^2 - y^2)/(x-y)^2 # needs sage.libs.singular
409
+ sage: p.factor() # needs sage.libs.singular
410
+ (1/(x - y)) * (x + y)
411
+ """
412
+ num = self._value.numerator()
413
+ den = self._value.denominator()
414
+ if proof is not None:
415
+ F = num.factor(proof=proof)
416
+ else:
417
+ F = num.factor()
418
+ P = self.parent()
419
+ fac = [(P(f), e) for (f, e) in F]
420
+ from sage.structure.factorization import Factorization
421
+ return Factorization(fac, unit=~P(den)*F.unit())
422
+
423
+ def _im_gens_(self, codomain, im_gens, base_map=None):
424
+ """
425
+ EXAMPLES::
426
+
427
+ sage: R.<x> = ZZ[]
428
+ sage: L = Localization(R, x**2 + 1) # needs sage.libs.pari
429
+ sage: f = L.hom([5], codomain=Localization(ZZ, 26)) # indirect doctest # needs sage.libs.pari
430
+ sage: f(x/(x**2+1)) # needs sage.libs.pari
431
+ 5/26
432
+ """
433
+ return self._value._im_gens_(codomain, im_gens, base_map=base_map)
434
+
435
+ def numerator(self):
436
+ """
437
+ Return the numerator of ``self``.
438
+
439
+ EXAMPLES::
440
+
441
+ sage: L = ZZ.localization((3,5))
442
+ sage: L(7/15).numerator()
443
+ 7
444
+ """
445
+ return self._value.numerator()
446
+
447
+ def denominator(self):
448
+ """
449
+ Return the denominator of ``self``.
450
+
451
+ EXAMPLES::
452
+
453
+ sage: L = Localization(ZZ, (3,5))
454
+ sage: L(7/15).denominator()
455
+ 15
456
+ """
457
+ return self._value.denominator()
458
+
459
+ def is_unit(self):
460
+ """
461
+ Return ``True`` if ``self`` is a unit.
462
+
463
+ EXAMPLES::
464
+
465
+ sage: # needs sage.libs.pari sage.singular
466
+ sage: P.<x,y,z> = QQ[]
467
+ sage: L = P.localization((x, y*z))
468
+ sage: L(y*z).is_unit()
469
+ True
470
+ sage: L(z).is_unit()
471
+ True
472
+ sage: L(x*y*z).is_unit()
473
+ True
474
+ """
475
+ return self.parent()._cut_off_extra_units_from_base_ring_element(self._value.numerator()).is_unit()
476
+
477
+ def inverse_of_unit(self):
478
+ """
479
+ Return the inverse of ``self``.
480
+
481
+ EXAMPLES::
482
+
483
+ sage: P.<x,y,z> = ZZ[]
484
+ sage: L = Localization(P, x*y*z)
485
+ sage: L(x*y*z).inverse_of_unit() # needs sage.libs.singular
486
+ 1/(x*y*z)
487
+ sage: L(z).inverse_of_unit() # needs sage.libs.singular
488
+ 1/z
489
+ """
490
+ parent = self.parent()
491
+ if not self.is_unit():
492
+ raise ArithmeticError("element is not a unit")
493
+ return parent.element_class(parent, ~(parent._fraction_field(self)))
494
+
495
+ def _richcmp_(self, other, op):
496
+ """
497
+ EXAMPLES::
498
+
499
+ sage: # needs sage.libs.singular
500
+ sage: P.<x,y,z> = GF(7)[]
501
+ sage: L = Localization(P, (x, y, z))
502
+ sage: L(1/x) < L(3/(x*y*z)**3)
503
+ False
504
+ sage: ~L(y*z/x) == L(x/(y*z))
505
+ True
506
+ """
507
+ sval = self._value
508
+ oval = other._value
509
+ return sval._richcmp_(oval, op)
510
+
511
+ def __hash__(self):
512
+ """
513
+ Return the hash of the corresponding fraction field element.
514
+
515
+ EXAMPLES::
516
+
517
+ sage: L = ZZ.localization(5)
518
+ sage: l5 = L(5); l7 = L(7)
519
+ sage: {l5: ~l5, l7: 7} # indirect doctest
520
+ {5: 1/5, 7: 7}
521
+ """
522
+ return hash(self._value)
523
+
524
+ def _rational_(self):
525
+ r"""
526
+ Convert ``self`` to a rational.
527
+
528
+ This is only possible if its base ring is the ring of integers.
529
+
530
+ OUTPUT: a rational
531
+
532
+ TESTS::
533
+
534
+ sage: L = ZZ.localization(5)
535
+ sage: cp3 = cyclotomic_polynomial(3).change_ring(L)
536
+ sage: cp3.splitting_field('t') # indirect doctest # needs sage.libs.pari sage.rings.number_field
537
+ Number Field in t with defining polynomial x^2 + x + 1
538
+ """
539
+ from sage.rings.rational_field import QQ
540
+ if not self._value.parent() == QQ:
541
+ raise ValueError('{} is not a rational'.format(self))
542
+ return self._value
543
+
544
+ def _integer_(self, Z=None):
545
+ r"""
546
+ Convert ``self`` to an integer.
547
+
548
+ This is only possible if its base ring is the ring of integers and
549
+ the denominator of ``self`` is one.
550
+
551
+ OUTPUT: integer
552
+
553
+ TESTS::
554
+
555
+ sage: L = ZZ.localization(5)
556
+ sage: L(5) in ZZ # indirect doctest
557
+ True
558
+ """
559
+ from sage.rings.rational_field import QQ
560
+ if not self._value.parent() == QQ:
561
+ raise ValueError('{} is not a rational'.format(self))
562
+ return self._value._integer_(Z=Z)
563
+
564
+
565
+ class Localization(Parent, UniqueRepresentation):
566
+ r"""
567
+ The localization generalizes the construction of the field of fractions of
568
+ an integral domain to an arbitrary ring. Given a (not necessarily
569
+ commutative) ring `R` and a subset `S` of `R`, there exists a ring
570
+ `R[S^{-1}]` together with the ring homomorphism `R \longrightarrow R[S^{-1}]`
571
+ that "inverts" `S`; that is, the homomorphism maps elements in `S` to unit
572
+ elements in `R[S^{-1}]` and, moreover, any ring homomorphism from `R` that
573
+ "inverts" `S` uniquely factors through `R[S^{-1}]`.
574
+
575
+ The ring `R[S^{-1}]` is called the *localization* of `R` with respect to
576
+ `S`. For example, if `R` is a commutative ring and `f` an element in `R`,
577
+ then the localization consists of elements of the form
578
+ `r/f, r\in R, n \geq 0` (to be precise, `R[f^{-1}] = R[t]/(ft-1)`).
579
+
580
+ The above text is taken from `Wikipedia`. The construction here used for
581
+ this class relies on the construction of the field of fraction and is
582
+ therefore restricted to integral domains.
583
+
584
+ Accordingly, the base ring must be in the category of ``IntegralDomains``.
585
+ Furthermore, the base ring should support
586
+ :meth:`sage.structure.element.CommutativeRingElement.divides` and the exact
587
+ division operator ``//`` (:meth:`sage.structure.element.Element.__floordiv__`)
588
+ in order to guarantee a successful application.
589
+
590
+ INPUT:
591
+
592
+ - ``base_ring`` -- a ring in the category of ``IntegralDomains``
593
+ - ``extra_units`` -- tuple of elements of ``base_ring`` which should be
594
+ turned into units
595
+ - ``category`` -- (default: ``None``) passed to :class:`Parent`
596
+ - ``warning`` -- boolean (default: ``True``); to suppress a warning which
597
+ is thrown if ``self`` cannot be represented uniquely
598
+
599
+ REFERENCES:
600
+
601
+ - :wikipedia:`Ring_(mathematics)#Localization`
602
+
603
+ EXAMPLES::
604
+
605
+ sage: L = Localization(ZZ, (3,5))
606
+ sage: 1/45 in L
607
+ True
608
+ sage: 1/43 in L
609
+ False
610
+
611
+ sage: Localization(L, (7,11))
612
+ Integer Ring localized at (3, 5, 7, 11)
613
+ sage: _.is_subring(QQ)
614
+ True
615
+
616
+ sage: L(~7)
617
+ Traceback (most recent call last):
618
+ ...
619
+ ValueError: factor 7 of denominator is not a unit
620
+
621
+ sage: Localization(Zp(7), (3, 5)) # needs sage.rings.padics
622
+ Traceback (most recent call last):
623
+ ...
624
+ ValueError: all given elements are invertible in
625
+ 7-adic Ring with capped relative precision 20
626
+
627
+ sage: # needs sage.libs.pari
628
+ sage: R.<x> = ZZ[]
629
+ sage: L = R.localization(x**2 + 1)
630
+ sage: s = (x+5)/(x**2+1)
631
+ sage: s in L
632
+ True
633
+ sage: t = (x+5)/(x**2+2)
634
+ sage: t in L
635
+ False
636
+ sage: L(t)
637
+ Traceback (most recent call last):
638
+ ...
639
+ TypeError: fraction must have unit denominator
640
+ sage: L(s) in R
641
+ False
642
+ sage: y = L(x)
643
+ sage: g = L(s)
644
+ sage: g.parent()
645
+ Univariate Polynomial Ring in x over Integer Ring localized at (x^2 + 1,)
646
+ sage: f = (y+5)/(y**2+1); f
647
+ (x + 5)/(x^2 + 1)
648
+ sage: f == g
649
+ True
650
+ sage: (y+5)/(y**2+2)
651
+ Traceback (most recent call last):
652
+ ...
653
+ ValueError: factor x^2 + 2 of denominator is not a unit
654
+
655
+ sage: Lau.<u, v> = LaurentPolynomialRing(ZZ) # needs sage.modules
656
+ sage: LauL = Lau.localization(u + 1) # needs sage.modules
657
+ sage: LauL(~u).parent() # needs sage.modules
658
+ Multivariate Polynomial Ring in u, v over Integer Ring localized at (v, u, u + 1)
659
+
660
+ More examples will be shown typing ``sage.rings.localization?``
661
+
662
+ TESTS:
663
+
664
+ Check that :issue:`33463` is fixed::
665
+
666
+ sage: R = ZZ.localization(5)
667
+ sage: R.localization(~5)
668
+ Integer Ring localized at (5,)
669
+ """
670
+
671
+ Element = LocalizationElement
672
+
673
+ def __init__(self, base_ring, extra_units, names=None, normalize=True, category=None, warning=True):
674
+ """
675
+ Python constructor of Localization.
676
+
677
+ TESTS::
678
+
679
+ sage: L = Localization(ZZ, (3, 5))
680
+ sage: TestSuite(L).run()
681
+
682
+ sage: R.<x> = ZZ[]
683
+ sage: L = R.localization(x**2 + 1) # needs sage.libs.pari
684
+ sage: TestSuite(L).run()
685
+ """
686
+ if isinstance(extra_units, tuple):
687
+ extra_units = list(extra_units)
688
+ elif not isinstance(extra_units, list):
689
+ extra_units = [extra_units]
690
+
691
+ from sage.rings.polynomial.laurent_polynomial_ring_base import LaurentPolynomialRing_generic
692
+
693
+ if isinstance(base_ring, LaurentPolynomialRing_generic):
694
+ extra_units += list(base_ring.gens())
695
+ base_ring = base_ring.polynomial_ring()
696
+
697
+ if isinstance(base_ring, Localization):
698
+ # don't allow recursive constructions
699
+ extra_units = [u for u in extra_units
700
+ if ~u not in base_ring._extra_units] # :issue:`33463`
701
+ extra_units += base_ring._extra_units
702
+ base_ring = base_ring.base_ring()
703
+
704
+ extra_units = normalize_extra_units(base_ring, extra_units, warning=warning)
705
+
706
+ if not extra_units:
707
+ raise ValueError('all given elements are invertible in %s' % (base_ring))
708
+
709
+ if category is None:
710
+ # since by construction the base ring must contain non units self must be infinite
711
+ category = IntegralDomains().Infinite()
712
+
713
+ Parent.__init__(self, base=base_ring, names=names, normalize=normalize, category=category)
714
+ self._extra_units = tuple(extra_units)
715
+ self._fraction_field = base_ring.fraction_field()
716
+ self._populate_coercion_lists_()
717
+
718
+ def _repr_(self):
719
+ """
720
+ How to print ``self``.
721
+
722
+ EXAMPLES::
723
+
724
+ sage: R.<a> = GF(3)[]
725
+ sage: Localization(R, a**2 - 1) # needs sage.libs.pari
726
+ Univariate Polynomial Ring in a over Finite Field of size 3
727
+ localized at (a + 1, a + 2)
728
+ """
729
+ return "%s localized at %s" % (self.base(), self._extra_units)
730
+
731
+ def _element_constructor_(self, x):
732
+ """
733
+ Make sure x is a valid member of self, and return the constructed element.
734
+
735
+ EXAMPLES::
736
+
737
+ sage: L = Localization(ZZ, (5, 2))
738
+ sage: L._element_constructor_(1/25)
739
+ 1/25
740
+ sage: L._element_constructor_(1/20)
741
+ 1/20
742
+ sage: L._element_constructor_(1/10)
743
+ 1/10
744
+ """
745
+ if isinstance(x, LocalizationElement):
746
+ x = x._value
747
+ else:
748
+ x = self._fraction_field(x)
749
+ return self._fraction_to_element(x)
750
+
751
+ def _is_valid_homomorphism_(self, codomain, im_gens, base_map=None):
752
+ """
753
+ EXAMPLES::
754
+
755
+ sage: R.<x> = ZZ[]
756
+ sage: L = Localization(R, x**2 + 1) # needs sage.libs.pari
757
+ sage: L.hom([5]) # indirect doctest # needs sage.libs.pari
758
+ Traceback (most recent call last):
759
+ ...
760
+ ValueError: images of some localized elements fail to be units
761
+
762
+ sage: L.hom([5], codomain=Localization(ZZ, 26)) # indirect doctest # needs sage.libs.pari
763
+ Ring morphism:
764
+ From: Univariate Polynomial Ring in x over Integer Ring
765
+ localized at (x^2 + 1,)
766
+ To: Integer Ring localized at (2, 13)
767
+ Defn: x |--> 5
768
+
769
+ TESTS::
770
+
771
+ sage: # needs sage.libs.pari
772
+ sage: phi = R.hom([5])
773
+ sage: L._is_valid_homomorphism_(ZZ, [3], base_map=phi)
774
+ Traceback (most recent call last):
775
+ ...
776
+ ValueError: given base_map is not compatible with im_gens
777
+ sage: L._is_valid_homomorphism_(ZZ, [5], base_map=phi)
778
+ Traceback (most recent call last):
779
+ ...
780
+ ValueError: images of some localized elements fail to be units
781
+ sage: phi = R.hom([5], codomain=QQ)
782
+ sage: L._is_valid_homomorphism_(ZZ, [5], base_map=phi)
783
+ Traceback (most recent call last):
784
+ ...
785
+ ValueError: codomain of base_map must be Integer Ring
786
+ sage: L._is_valid_homomorphism_(QQ, [5], base_map=phi)
787
+ True
788
+ """
789
+ B = self.base_ring()
790
+ if base_map is not None:
791
+ if base_map.domain() is not B:
792
+ raise ValueError('domain of base_map must be %s' % B)
793
+ if base_map.codomain() is not codomain.base_ring():
794
+ raise ValueError('codomain of base_map must be %s' % codomain.base_ring())
795
+ bas_gens = B.gens()
796
+ if im_gens and not all(base_map(g) == im_gens[bas_gens.index(g)] for g in bas_gens):
797
+ raise ValueError('given base_map is not compatible with im_gens')
798
+ im_gens = [base_map(g) for g in bas_gens]
799
+ if not all(base_map(au).is_unit() for au in self._extra_units):
800
+ raise ValueError('images of some localized elements fail to be units')
801
+ return B._is_valid_homomorphism_(codomain, im_gens, base_map=None)
802
+ else:
803
+ if B._is_valid_homomorphism_(codomain, im_gens, base_map=base_map):
804
+ phi = B.hom(im_gens, base_map=base_map)
805
+ if not all(phi(au).is_unit() for au in self._extra_units):
806
+ raise ValueError('images of some localized elements fail to be units')
807
+ return True
808
+ return False
809
+
810
+ def ngens(self):
811
+ """
812
+ Return the number of generators of ``self``
813
+ according to the same method for the base ring.
814
+
815
+ EXAMPLES::
816
+
817
+ sage: R.<x, y> = ZZ[]
818
+ sage: Localization(R, (x**2 + 1, y - 1)).ngens() # needs sage.libs.pari
819
+ 2
820
+
821
+ sage: Localization(ZZ, 2).ngens()
822
+ 1
823
+ """
824
+ return self.base_ring().ngens()
825
+
826
+ def gen(self, i):
827
+ """
828
+ Return the ``i``-th generator of ``self`` which is
829
+ the ``i``-th generator of the base ring.
830
+
831
+ EXAMPLES::
832
+
833
+ sage: R.<x, y> = ZZ[]
834
+ sage: R.localization((x**2 + 1, y - 1)).gen(0) # needs sage.libs.pari
835
+ x
836
+
837
+ sage: ZZ.localization(2).gen(0)
838
+ 1
839
+ """
840
+ return self(self.base_ring().gen(i))
841
+
842
+ def gens(self) -> tuple:
843
+ """
844
+ Return a tuple whose entries are the generators for this
845
+ object, in order.
846
+
847
+ EXAMPLES::
848
+
849
+ sage: R.<x, y> = ZZ[]
850
+ sage: Localization(R, (x**2 + 1, y - 1)).gens() # needs sage.libs.pari
851
+ (x, y)
852
+
853
+ sage: Localization(ZZ, 2).gens()
854
+ (1,)
855
+ """
856
+ return tuple(self(g) for g in self.base_ring().gens())
857
+
858
+ def _cut_off_extra_units_from_base_ring_element(self, x):
859
+ """
860
+ Return a factor of x not divided by any additional unit of ``self``.
861
+
862
+ INPUT:
863
+
864
+ - ``x`` -- an element of the base ring of ``self``
865
+
866
+ OUTPUT:
867
+
868
+ A factor of ``x`` not divided by any additional unit of ``self`` as element
869
+ of the base ring of ``self``.
870
+
871
+ EXAMPLES::
872
+
873
+ sage: P.<x,y,z> = QQ[]
874
+ sage: L = Localization(P, (x, y*z)) # needs sage.libs.pari
875
+ sage: L._cut_off_extra_units_from_base_ring_element(x*y*z) # needs sage.libs.pari
876
+ 1
877
+ sage: L._cut_off_extra_units_from_base_ring_element(x*z) # needs sage.libs.pari
878
+ 1
879
+
880
+ TESTS:
881
+
882
+ Check that :issue:`33463` is fixed::
883
+
884
+ sage: L = ZZ.localization(5)
885
+ sage: L(0).is_unit()
886
+ False
887
+ """
888
+ if x.is_zero() or x.numerator().is_unit():
889
+ # treat corner cases
890
+ return x
891
+ add_units = self._extra_units
892
+ res = x
893
+ for au in add_units:
894
+ if au.divides(x):
895
+ # recursion must terminate by reducing the number of factors
896
+ res = self._cut_off_extra_units_from_base_ring_element(x // au)
897
+ if res.is_unit():
898
+ return res
899
+ return res
900
+
901
+ def _fraction_to_element(self, x):
902
+ """
903
+ Check if the given element of the fraction field is contained in ``self``
904
+ and construct it as an element of ``self`` in case the answer is true.
905
+
906
+ INPUT:
907
+
908
+ - ``x`` -- an element of the fraction field of the base ring
909
+
910
+ OUTPUT: an instance of the element class of ``self`` representing `x`
911
+
912
+ EXAMPLES::
913
+
914
+ sage: # needs sage.libs.pari sage.libs.singular
915
+ sage: P.<x,y,z> = QQ[]
916
+ sage: d = x**2 + y**2 + z**2
917
+ sage: L = Localization(P, d)
918
+ sage: L._fraction_to_element((x+y+z)/d)
919
+ (x + y + z)/(x^2 + y^2 + z^2)
920
+ sage: _ in L
921
+ True
922
+
923
+ TESTS::
924
+
925
+ sage: TestSuite(L).run() # needs sage.libs.pari sage.libs.singular
926
+ """
927
+ potential_non_unit_denom = self._cut_off_extra_units_from_base_ring_element(x.denominator())
928
+ if potential_non_unit_denom.is_unit():
929
+ return self.element_class(self, x)
930
+ raise ValueError("factor %s of denominator is not a unit" % potential_non_unit_denom)
931
+
932
+ def _coerce_map_from_(self, S):
933
+ """
934
+ The only things that coerce into this ring are:
935
+
936
+ - the base ring
937
+ - other localizations
938
+
939
+ EXAMPLES::
940
+
941
+ sage: # needs sage.libs.pari sage.libs.singular
942
+ sage: P.<x,y,z> = QQ[]
943
+ sage: L = Localization(P, y*z)
944
+ sage: M = Localization(P, (x, y, z))
945
+ sage: M._coerce_map_from_(L)
946
+ True
947
+ sage: L._coerce_map_from_(M)
948
+ False
949
+ sage: Q.<u, v, w> = ZZ[]
950
+ sage: N = Localization(Q, v*w)
951
+ sage: L._coerce_map_from_(N)
952
+ True
953
+ sage: N._coerce_map_from_(M)
954
+ False
955
+ sage: O = Localization(L, x**2 + 1)
956
+ sage: O._coerce_map_from_(M)
957
+ False
958
+ sage: O._coerce_map_from_(L)
959
+ True
960
+ """
961
+ if S is self.base_ring():
962
+ return True
963
+ elif self.base_ring().has_coerce_map_from(S):
964
+ return True
965
+ elif isinstance(S, Localization):
966
+ return all(self(p).is_unit() for p in S._extra_units)
967
+
968
+ def fraction_field(self):
969
+ """
970
+ Return the fraction field of ``self``.
971
+
972
+ EXAMPLES::
973
+
974
+ sage: # needs sage.libs.pari
975
+ sage: R.<a> = GF(5)[]
976
+ sage: L = Localization(R, (a**2 - 3, a))
977
+ sage: L.fraction_field()
978
+ Fraction Field of Univariate Polynomial Ring in a over Finite Field of size 5
979
+ sage: L.is_subring(_)
980
+ True
981
+ """
982
+ return self._fraction_field
983
+
984
+ def characteristic(self):
985
+ """
986
+ Return the characteristic of ``self``.
987
+
988
+ EXAMPLES::
989
+
990
+ sage: # needs sage.libs.pari
991
+ sage: R.<a> = GF(5)[]
992
+ sage: L = R.localization((a**2 - 3, a))
993
+ sage: L.characteristic()
994
+ 5
995
+ """
996
+ return self.base_ring().characteristic()
997
+
998
+ def krull_dimension(self):
999
+ """
1000
+ Return the Krull dimension of this localization.
1001
+
1002
+ Since the current implementation just allows integral domains as base ring
1003
+ and localization at a finite set of elements the spectrum of ``self``
1004
+ is open in the irreducible spectrum of its base ring.
1005
+ Therefore, by density we may take the dimension from there.
1006
+
1007
+ EXAMPLES::
1008
+
1009
+ sage: R = ZZ.localization((2, 3))
1010
+ sage: R.krull_dimension()
1011
+ 1
1012
+ """
1013
+ return self.base_ring().krull_dimension()
1014
+
1015
+ def is_field(self, proof=True):
1016
+ """
1017
+ Return ``True`` if this ring is a field.
1018
+
1019
+ INPUT:
1020
+
1021
+ - ``proof`` -- boolean (default: ``True``); determines what to do in
1022
+ unknown cases
1023
+
1024
+ ALGORITHM:
1025
+
1026
+ If the parameter ``proof`` is set to ``True``, the returned value is
1027
+ correct but the method might throw an error. Otherwise, if it is set
1028
+ to ``False``, the method returns ``True`` if it can establish that
1029
+ ``self`` is a field and ``False`` otherwise.
1030
+
1031
+ EXAMPLES::
1032
+
1033
+ sage: R = ZZ.localization((2, 3))
1034
+ sage: R.is_field()
1035
+ False
1036
+ """
1037
+ if proof:
1038
+ try:
1039
+ if self.krull_dimension() > 0:
1040
+ return False
1041
+ except NotImplementedError:
1042
+ pass
1043
+ return super().is_field(proof=proof)