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
sage/rings/generic.py ADDED
@@ -0,0 +1,320 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Generic data structures and algorithms for rings
4
+
5
+ AUTHORS:
6
+
7
+ - Lorenz Panny (2022): :class:`ProductTree`, :func:`prod_with_derivative`
8
+ """
9
+
10
+ from sage.misc.misc_c import prod
11
+
12
+
13
+ class ProductTree:
14
+ r"""
15
+ A simple binary product tree, i.e., a tree of ring elements in
16
+ which every node equals the product of its children.
17
+ (In particular, the *root* equals the product of all *leaves*.)
18
+
19
+ Product trees are a very useful building block for fast computer
20
+ algebra. For example, a quasilinear-time Discrete Fourier Transform
21
+ (the famous *Fast* Fourier Transform) can be implemented as follows
22
+ using the :meth:`remainders` method of this class::
23
+
24
+ sage: # needs sage.rings.finite_rings
25
+ sage: from sage.rings.generic import ProductTree
26
+ sage: F = GF(65537)
27
+ sage: a = F(1111)
28
+ sage: assert a.multiplicative_order() == 1024
29
+ sage: R.<x> = F[]
30
+ sage: ms = [x - a^i for i in range(1024)] # roots of unity
31
+ sage: ys = [F.random_element() for _ in range(1024)] # input vector
32
+ sage: tree = ProductTree(ms)
33
+ sage: zs = tree.remainders(R(ys)) # compute FFT!
34
+ sage: zs == [R(ys) % m for m in ms]
35
+ True
36
+
37
+ Similarly, the :meth:`interpolation` method can be used to implement
38
+ the inverse Fast Fourier Transform::
39
+
40
+ sage: tree.interpolation(zs).padded_list(len(ys)) == ys # needs sage.rings.finite_rings
41
+ True
42
+
43
+ This class encodes the tree as *layers*: Layer `0` is just a tuple
44
+ of the leaves. Layer `i+1` is obtained from layer `i` by replacing
45
+ each pair of two adjacent elements by their product, starting from
46
+ the left. (If the length is odd, the unpaired element at the end is
47
+ simply copied as is.) This iteration stops as soon as it yields a
48
+ layer containing only a single element (the root).
49
+
50
+ .. NOTE::
51
+
52
+ Use this class if you need the :meth:`remainders` method.
53
+ To compute just the product, :func:`prod` is likely faster.
54
+
55
+ INPUT:
56
+
57
+ - ``leaves`` -- an iterable of elements in a common ring
58
+
59
+ EXAMPLES::
60
+
61
+ sage: from sage.rings.generic import ProductTree
62
+ sage: R.<x> = GF(101)[]
63
+ sage: vs = [x - i for i in range(1,10)]
64
+ sage: tree = ProductTree(vs)
65
+ sage: tree.root()
66
+ x^9 + 56*x^8 + 62*x^7 + 44*x^6 + 47*x^5 + 42*x^4 + 15*x^3 + 11*x^2 + 12*x + 13
67
+ sage: tree.remainders(x^7 + x + 1)
68
+ [3, 30, 70, 27, 58, 72, 98, 98, 23]
69
+ sage: tree.remainders(x^100)
70
+ [1, 1, 1, 1, 1, 1, 1, 1, 1]
71
+
72
+ ::
73
+
74
+ sage: # needs sage.libs.pari
75
+ sage: vs = prime_range(100)
76
+ sage: tree = ProductTree(vs)
77
+ sage: tree.root().factor()
78
+ 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29 * 31 * 37 * 41 * 43 * 47 * 53 * 59 * 61 * 67 * 71 * 73 * 79 * 83 * 89 * 97
79
+ sage: tree.remainders(3599)
80
+ [1, 2, 4, 1, 2, 11, 12, 8, 11, 3, 3, 10, 32, 30, 27, 48, 0, 0, 48, 49, 22, 44, 30, 39, 10]
81
+
82
+ We can access the individual layers of the tree::
83
+
84
+ sage: tree.layers # needs sage.libs.pari
85
+ [(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97),
86
+ (6, 35, 143, 323, 667, 1147, 1763, 2491, 3599, 4757, 5767, 7387, 97),
87
+ (210, 46189, 765049, 4391633, 17120443, 42600829, 97),
88
+ (9699690, 3359814435017, 729345064647247, 97),
89
+ (32589158477190044730, 70746471270782959),
90
+ (2305567963945518424753102147331756070,)]
91
+ """
92
+ def __init__(self, leaves):
93
+ r"""
94
+ Initialize a product tree having the given ring elements
95
+ as its leaves.
96
+
97
+ EXAMPLES::
98
+
99
+ sage: from sage.rings.generic import ProductTree
100
+ sage: vs = prime_range(100) # needs sage.libs.pari
101
+ sage: tree = ProductTree(vs) # needs sage.libs.pari
102
+ """
103
+ V = tuple(leaves)
104
+ self.layers = [V]
105
+ while len(V) > 1:
106
+ V = tuple(prod(V[i:i+2]) for i in range(0,len(V),2))
107
+ self.layers.append(V)
108
+
109
+ def __len__(self):
110
+ r"""
111
+ Return the number of leaves of this product tree.
112
+
113
+ EXAMPLES::
114
+
115
+ sage: from sage.rings.generic import ProductTree
116
+ sage: R.<x> = GF(101)[]
117
+ sage: vs = [x - i for i in range(1,10)]
118
+ sage: tree = ProductTree(vs)
119
+ sage: len(tree)
120
+ 9
121
+ sage: len(tree) == len(vs)
122
+ True
123
+ sage: len(tree.remainders(x^2))
124
+ 9
125
+ """
126
+ return len(self.layers[0])
127
+
128
+ def __iter__(self):
129
+ r"""
130
+ Return an iterator over the leaves of this product tree.
131
+
132
+ EXAMPLES::
133
+
134
+ sage: from sage.rings.generic import ProductTree
135
+ sage: R.<x> = GF(101)[]
136
+ sage: vs = [x - i for i in range(1,10)]
137
+ sage: tree = ProductTree(vs)
138
+ sage: next(iter(tree)) == vs[0]
139
+ True
140
+ sage: list(tree) == vs
141
+ True
142
+ """
143
+ return iter(self.layers[0])
144
+
145
+ def root(self):
146
+ r"""
147
+ Return the value at the root of this product tree (i.e., the product of all leaves).
148
+
149
+ EXAMPLES::
150
+
151
+ sage: from sage.rings.generic import ProductTree
152
+ sage: R.<x> = GF(101)[]
153
+ sage: vs = [x - i for i in range(1,10)]
154
+ sage: tree = ProductTree(vs)
155
+ sage: tree.root()
156
+ x^9 + 56*x^8 + 62*x^7 + 44*x^6 + 47*x^5 + 42*x^4 + 15*x^3 + 11*x^2 + 12*x + 13
157
+ sage: tree.root() == prod(vs)
158
+ True
159
+ """
160
+ assert len(self.layers[-1]) == 1
161
+ return self.layers[-1][0]
162
+
163
+ def leaves(self):
164
+ r"""
165
+ Return a tuple containing the leaves of this product tree.
166
+
167
+ EXAMPLES::
168
+
169
+ sage: from sage.rings.generic import ProductTree
170
+ sage: R.<x> = GF(101)[]
171
+ sage: vs = [x - i for i in range(1,10)]
172
+ sage: tree = ProductTree(vs)
173
+ sage: tree.leaves()
174
+ (x + 100, x + 99, x + 98, ..., x + 93, x + 92)
175
+ sage: tree.leaves() == tuple(vs)
176
+ True
177
+ """
178
+ return self.layers[0]
179
+
180
+ def remainders(self, x):
181
+ r"""
182
+ Given a value `x`, return a list of all remainders of `x`
183
+ modulo the leaves of this product tree.
184
+
185
+ The base ring must support the ``%`` operator for this
186
+ method to work.
187
+
188
+ INPUT:
189
+
190
+ - ``x`` -- an element of the base ring of this product tree
191
+
192
+ EXAMPLES::
193
+
194
+ sage: # needs sage.libs.pari
195
+ sage: from sage.rings.generic import ProductTree
196
+ sage: vs = prime_range(100)
197
+ sage: tree = ProductTree(vs)
198
+ sage: n = 1085749272377676749812331719267
199
+ sage: tree.remainders(n)
200
+ [1, 1, 2, 1, 9, 1, 7, 15, 8, 20, 15, 6, 27, 11, 2, 6, 0, 25, 49, 5, 51, 4, 19, 74, 13]
201
+ sage: [n % v for v in vs]
202
+ [1, 1, 2, 1, 9, 1, 7, 15, 8, 20, 15, 6, 27, 11, 2, 6, 0, 25, 49, 5, 51, 4, 19, 74, 13]
203
+ """
204
+ X = [x]
205
+ for V in reversed(self.layers):
206
+ X = [X[i // 2] % V[i] for i in range(len(V))]
207
+ return X
208
+
209
+ _crt_bases = None
210
+
211
+ def interpolation(self, xs):
212
+ r"""
213
+ Given a sequence ``xs`` of values, one per leaf, return a
214
+ single element `x` which is congruent to the `i`\th value in
215
+ ``xs`` modulo the `i`\th leaf, for all `i`.
216
+
217
+ This is an explicit version of the Chinese remainder theorem;
218
+ see also :meth:`CRT`. Using this product tree is faster for
219
+ repeated calls since the required CRT bases are cached after
220
+ the first run.
221
+
222
+ The base ring must support the :func:`xgcd` function for this
223
+ method to work.
224
+
225
+ EXAMPLES::
226
+
227
+ sage: # needs sage.libs.pari
228
+ sage: from sage.rings.generic import ProductTree
229
+ sage: vs = prime_range(100)
230
+ sage: tree = ProductTree(vs)
231
+ sage: tree.interpolation([1, 1, 2, 1, 9, 1, 7, 15, 8, 20, 15, 6, 27, 11, 2, 6, 0, 25, 49, 5, 51, 4, 19, 74, 13])
232
+ 1085749272377676749812331719267
233
+
234
+ This method is faster than :func:`CRT` for repeated calls with
235
+ the same moduli::
236
+
237
+ sage: # needs sage.libs.pari
238
+ sage: vs = prime_range(1000,2000)
239
+ sage: rs = lambda: [randrange(1,100) for _ in vs]
240
+ sage: tree = ProductTree(vs)
241
+ sage: %timeit CRT(rs(), vs) # not tested
242
+ 372 µs ± 3.34 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
243
+ sage: %timeit tree.interpolation(rs()) # not tested
244
+ 146 µs ± 479 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
245
+ """
246
+ if self._crt_bases is None:
247
+ from sage.arith.misc import CRT_basis
248
+ self._crt_bases = []
249
+ for V in self.layers[:-1]:
250
+ B = tuple(CRT_basis(V[i:i+2]) for i in range(0, len(V), 2))
251
+ self._crt_bases.append(B)
252
+ if len(xs) != len(self.layers[0]):
253
+ raise ValueError('number of given elements must equal the number of leaves')
254
+ for basis, layer in zip(self._crt_bases, self.layers[1:]):
255
+ xs = [sum(c*x for c, x in zip(cs, xs[2*i:2*i+2])) % mod
256
+ for i, (cs, mod) in enumerate(zip(basis, layer))]
257
+ assert len(xs) == 1
258
+ return xs[0]
259
+
260
+
261
+ def prod_with_derivative(pairs):
262
+ r"""
263
+ Given an iterable of pairs `(f, \partial f)` of ring elements,
264
+ return the pair `(\prod f, \partial \prod f)`, assuming `\partial`
265
+ is an operator obeying the standard product rule.
266
+
267
+ This function is entirely algebraic, hence still works when the
268
+ elements `f` and `\partial f` are all passed through some ring
269
+ homomorphism first. One particularly useful instance of this is
270
+ evaluating the derivative of a product of polynomials at a point
271
+ without fully expanding the product; see the second example below.
272
+
273
+ INPUT:
274
+
275
+ - ``pairs`` -- an iterable of tuples `(f, \partial f)` of elements
276
+ of a common ring
277
+
278
+ ALGORITHM: Repeated application of the product rule.
279
+
280
+ EXAMPLES::
281
+
282
+ sage: from sage.rings.generic import prod_with_derivative
283
+ sage: R.<x> = ZZ[]
284
+ sage: fs = [x^2 + 2*x + 3, 4*x + 5, 6*x^7 + 8*x + 9]
285
+ sage: prod(fs)
286
+ 24*x^10 + 78*x^9 + 132*x^8 + 90*x^7 + 32*x^4 + 140*x^3 + 293*x^2 + 318*x + 135
287
+ sage: prod(fs).derivative()
288
+ 240*x^9 + 702*x^8 + 1056*x^7 + 630*x^6 + 128*x^3 + 420*x^2 + 586*x + 318
289
+ sage: F, dF = prod_with_derivative((f, f.derivative()) for f in fs)
290
+ sage: F
291
+ 24*x^10 + 78*x^9 + 132*x^8 + 90*x^7 + 32*x^4 + 140*x^3 + 293*x^2 + 318*x + 135
292
+ sage: dF
293
+ 240*x^9 + 702*x^8 + 1056*x^7 + 630*x^6 + 128*x^3 + 420*x^2 + 586*x + 318
294
+
295
+ The main reason for this function to exist is that it allows us to
296
+ *evaluate* the derivative of a product of polynomials at a point
297
+ `\alpha` without ever fully expanding the product *as a polynomial*::
298
+
299
+ sage: alpha = 42
300
+ sage: F(alpha)
301
+ 442943981574522759
302
+ sage: dF(alpha)
303
+ 104645261461514994
304
+ sage: us = [f(alpha) for f in fs]
305
+ sage: vs = [f.derivative()(alpha) for f in fs]
306
+ sage: prod_with_derivative(zip(us, vs))
307
+ (442943981574522759, 104645261461514994)
308
+ """
309
+ class _aux:
310
+ def __init__(self, f, df):
311
+ self.f, self.df = f, df
312
+
313
+ def __mul__(self, other):
314
+ return _aux(self.f * other.f, self.df * other.f + self.f * other.df)
315
+
316
+ def __iter__(self):
317
+ yield self.f
318
+ yield self.df
319
+
320
+ return tuple(prod(_aux(*tup) for tup in pairs))
sage/rings/homset.py ADDED
@@ -0,0 +1,332 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ """
3
+ Space of homomorphisms between two rings
4
+ """
5
+
6
+ #*****************************************************************************
7
+ # Copyright (C) 2006 William Stein <wstein@gmail.com>
8
+ #
9
+ # Distributed under the terms of the GNU General Public License (GPL)
10
+ #
11
+ # http://www.gnu.org/licenses/
12
+ #*****************************************************************************
13
+
14
+ from sage.categories.homset import HomsetWithBase
15
+ from sage.categories.rings import Rings
16
+
17
+ _Rings = Rings()
18
+
19
+ from sage.rings import morphism, quotient_ring
20
+
21
+
22
+ def is_RingHomset(H):
23
+ """
24
+ Return ``True`` if ``H`` is a space of homomorphisms between two rings.
25
+
26
+ EXAMPLES::
27
+
28
+ sage: from sage.rings.homset import is_RingHomset as is_RH
29
+ sage: is_RH(Hom(ZZ, QQ))
30
+ doctest:warning...
31
+ DeprecationWarning: the function is_RingHomset is deprecated;
32
+ use 'isinstance(..., RingHomset_generic)' instead
33
+ See https://github.com/sagemath/sage/issues/37922 for details.
34
+ True
35
+ sage: is_RH(ZZ)
36
+ False
37
+ sage: is_RH(Hom(RR, CC)) # needs sage.rings.real_mpfr
38
+ True
39
+ sage: is_RH(Hom(FreeModule(ZZ,1), FreeModule(QQ,1))) # needs sage.modules
40
+ False
41
+ """
42
+ from sage.misc.superseded import deprecation
43
+ deprecation(37922, "the function is_RingHomset is deprecated; use 'isinstance(..., RingHomset_generic)' instead")
44
+ return isinstance(H, RingHomset_generic)
45
+
46
+
47
+ def RingHomset(R, S, category=None):
48
+ """
49
+ Construct a space of homomorphisms between the rings ``R`` and ``S``.
50
+
51
+ For more on homsets, see :func:`Hom()`.
52
+
53
+ EXAMPLES::
54
+
55
+ sage: Hom(ZZ, QQ) # indirect doctest
56
+ Set of Homomorphisms from Integer Ring to Rational Field
57
+ """
58
+ if isinstance(R, quotient_ring.QuotientRing_nc):
59
+ from .polynomial.polynomial_quotient_ring import PolynomialQuotientRing_generic
60
+ if not isinstance(R, PolynomialQuotientRing_generic): # backwards compatibility
61
+ return RingHomset_quo_ring(R, S, category=category)
62
+ return RingHomset_generic(R, S, category=category)
63
+
64
+
65
+ class RingHomset_generic(HomsetWithBase):
66
+ """
67
+ A generic space of homomorphisms between two rings.
68
+
69
+ EXAMPLES::
70
+
71
+ sage: Hom(ZZ, QQ)
72
+ Set of Homomorphisms from Integer Ring to Rational Field
73
+ sage: QQ.Hom(ZZ)
74
+ Set of Homomorphisms from Rational Field to Integer Ring
75
+ """
76
+
77
+ Element = morphism.RingHomomorphism
78
+
79
+ def __init__(self, R, S, category=None):
80
+ """
81
+ Initialize ``self``.
82
+
83
+ EXAMPLES::
84
+
85
+ sage: Hom(ZZ, QQ)
86
+ Set of Homomorphisms from Integer Ring to Rational Field
87
+ """
88
+ if category is None:
89
+ category = _Rings
90
+ HomsetWithBase.__init__(self, R, S, category)
91
+
92
+ def _repr_(self):
93
+ """
94
+ Return a string representation of ``self``.
95
+
96
+ EXAMPLES::
97
+
98
+ sage: Hom(ZZ, QQ) # indirect doctest
99
+ Set of Homomorphisms from Integer Ring to Rational Field
100
+ """
101
+ return "Set of Homomorphisms from %s to %s" % (self.domain(), self.codomain())
102
+
103
+ def has_coerce_map_from(self, x):
104
+ """
105
+ The default for coercion maps between ring homomorphism spaces is
106
+ very restrictive (until more implementation work is done).
107
+
108
+ Currently this checks if the domains and the codomains are equal.
109
+
110
+ EXAMPLES::
111
+
112
+ sage: H = Hom(ZZ, QQ)
113
+ sage: H2 = Hom(QQ, ZZ)
114
+ sage: H.has_coerce_map_from(H2)
115
+ False
116
+ """
117
+ return (x.domain() == self.domain() and x.codomain() == self.codomain())
118
+
119
+ def _element_constructor_(self, x, check=True, base_map=None):
120
+ """
121
+ Construct an element of ``self`` from ``x``.
122
+
123
+ EXAMPLES::
124
+
125
+ sage: H = Hom(ZZ, QQ)
126
+ sage: phi = H([1]); phi
127
+ Ring morphism:
128
+ From: Integer Ring
129
+ To: Rational Field
130
+ Defn: 1 |--> 1
131
+ sage: H2 = Hom(QQ, QQ)
132
+ sage: phi2 = H2(phi); phi2
133
+ Ring endomorphism of Rational Field
134
+ Defn: 1 |--> 1
135
+ sage: H(phi2)
136
+ Ring morphism:
137
+ From: Integer Ring
138
+ To: Rational Field
139
+ Defn: 1 |--> 1
140
+
141
+ You can provide a morphism on the base::
142
+
143
+ sage: # needs sage.rings.finite_rings
144
+ sage: k = GF(9)
145
+ sage: z2 = k.gen()
146
+ sage: cc = k.frobenius_endomorphism()
147
+ sage: R.<x> = k[]
148
+ sage: H = Hom(R, R)
149
+ sage: phi = H([x^2], base_map=cc); phi
150
+ Ring endomorphism of Univariate Polynomial Ring in x
151
+ over Finite Field in z2 of size 3^2
152
+ Defn: x |--> x^2
153
+ with map of base ring
154
+ sage: phi(z2 * x) == z2^3 * x^2
155
+ True
156
+
157
+ sage: R.<x> = ZZ[]
158
+ sage: K.<a> = GF(7^2) # needs sage.rings.finite_rings
159
+ sage: L.<u> = K.extension(x^3 - 3) # needs sage.rings.finite_rings
160
+ sage: phi = L.hom([u^7], base_map=K.frobenius_endomorphism()) # needs sage.rings.finite_rings
161
+ sage: phi(u) == u^7 # needs sage.rings.finite_rings
162
+ True
163
+ sage: phi(a) == a^7 # needs sage.rings.finite_rings
164
+ True
165
+
166
+ TESTS::
167
+
168
+ sage: H = Hom(ZZ, QQ)
169
+ sage: H == loads(dumps(H))
170
+ True
171
+ """
172
+ from sage.categories.map import Map
173
+ # Case 0: the homomorphism is given by images of generators
174
+ if not (isinstance(x, Map) and x.category_for().is_subcategory(Rings())):
175
+ return morphism.RingHomomorphism_im_gens(self, x, base_map=base_map, check=check)
176
+ if base_map is not None:
177
+ raise ValueError("cannot specify base_map when providing a map")
178
+ # Case 1: the parent fits
179
+ if x.parent() == self:
180
+ if isinstance(x, morphism.RingHomomorphism_im_gens):
181
+ return morphism.RingHomomorphism_im_gens(self, x.im_gens())
182
+ elif isinstance(x, morphism.RingHomomorphism_cover):
183
+ return morphism.RingHomomorphism_cover(self)
184
+ elif isinstance(x, morphism.RingHomomorphism_from_base):
185
+ return morphism.RingHomomorphism_from_base(self, x.underlying_map())
186
+ # Case 2: unique extension via fraction field
187
+ try:
188
+ if (isinstance(x, morphism.RingHomomorphism_im_gens)
189
+ and x.domain().fraction_field().has_coerce_map_from(self.domain())):
190
+ return morphism.RingHomomorphism_im_gens(self, x.im_gens())
191
+ except (TypeError, ValueError):
192
+ pass
193
+ # Case 3: the homomorphism can be extended by coercion
194
+ try:
195
+ return x.extend_codomain(self.codomain()).extend_domain(self.domain())
196
+ except (TypeError, ValueError):
197
+ pass
198
+ # Case 4: the homomorphism is induced from the base ring
199
+ if (self.domain() != self.domain().base()
200
+ or self.codomain() != self.codomain().base()):
201
+ x = self.domain().base().Hom(self.codomain().base())(x)
202
+ return morphism.RingHomomorphism_from_base(self, x)
203
+ raise ValueError('cannot convert {} to an element of {}'.format(x, self))
204
+
205
+ def natural_map(self):
206
+ """
207
+ Return the natural map from the domain to the codomain.
208
+
209
+ The natural map is the coercion map from the domain ring to the
210
+ codomain ring.
211
+
212
+ EXAMPLES::
213
+
214
+ sage: H = Hom(ZZ, QQ)
215
+ sage: H.natural_map()
216
+ Natural morphism:
217
+ From: Integer Ring
218
+ To: Rational Field
219
+ """
220
+ f = self.codomain().coerce_map_from(self.domain())
221
+ if f is None:
222
+ raise TypeError("natural coercion morphism from %s to %s not defined" % (self.domain(), self.codomain()))
223
+ return f
224
+
225
+ def zero(self):
226
+ r"""
227
+ Return the zero element of this homset.
228
+
229
+ EXAMPLES:
230
+
231
+ Since a ring homomorphism maps 1 to 1, there can only be a zero
232
+ morphism when mapping to the trivial ring::
233
+
234
+ sage: Hom(ZZ, Zmod(1)).zero()
235
+ Ring morphism:
236
+ From: Integer Ring
237
+ To: Ring of integers modulo 1
238
+ Defn: 1 |--> 0
239
+ sage: Hom(ZZ, Zmod(2)).zero()
240
+ Traceback (most recent call last):
241
+ ...
242
+ ValueError: homset has no zero element
243
+ """
244
+ if not self.codomain().is_zero():
245
+ raise ValueError("homset has no zero element")
246
+ # there is only one map in this homset
247
+ return self.an_element()
248
+
249
+
250
+ class RingHomset_quo_ring(RingHomset_generic):
251
+ """
252
+ Space of ring homomorphisms where the domain is a (formal) quotient
253
+ ring.
254
+
255
+ EXAMPLES::
256
+
257
+ sage: R.<x,y> = PolynomialRing(QQ, 2)
258
+ sage: S.<a,b> = R.quotient(x^2 + y^2) # needs sage.libs.singular
259
+ sage: phi = S.hom([b,a]); phi # needs sage.libs.singular
260
+ Ring endomorphism of Quotient of Multivariate Polynomial Ring in x, y
261
+ over Rational Field by the ideal (x^2 + y^2)
262
+ Defn: a |--> b
263
+ b |--> a
264
+ sage: phi(a) # needs sage.libs.singular
265
+ b
266
+ sage: phi(b) # needs sage.libs.singular
267
+ a
268
+
269
+ TESTS:
270
+
271
+ We test pickling of a homset from a quotient.
272
+
273
+ ::
274
+
275
+ sage: # needs sage.libs.singular
276
+ sage: R.<x,y> = PolynomialRing(QQ, 2)
277
+ sage: S.<a,b> = R.quotient(x^2 + y^2)
278
+ sage: H = S.Hom(R)
279
+ sage: H == loads(dumps(H))
280
+ True
281
+
282
+ We test pickling of actual homomorphisms in a quotient::
283
+
284
+ sage: phi = S.hom([b,a]) # needs sage.libs.singular
285
+ sage: phi == loads(dumps(phi)) # needs sage.libs.singular
286
+ True
287
+ """
288
+
289
+ Element = morphism.RingHomomorphism_from_quotient
290
+
291
+ def _element_constructor_(self, x, base_map=None, check=True):
292
+ """
293
+ Construct an element of ``self`` from ``x``.
294
+
295
+ EXAMPLES::
296
+
297
+ sage: # needs sage.libs.singular
298
+ sage: R.<x,y> = PolynomialRing(QQ, 2)
299
+ sage: S.<a,b> = R.quotient(x^2 + y^2)
300
+ sage: H = S.Hom(R)
301
+ sage: phi = H([b, a]); phi
302
+ Ring morphism:
303
+ From: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
304
+ To: Multivariate Polynomial Ring in x, y over Rational Field
305
+ Defn: a |--> b
306
+ b |--> a
307
+ sage: R2.<x,y> = PolynomialRing(ZZ, 2)
308
+ sage: H2 = Hom(R2, S)
309
+ sage: H2(phi)
310
+ Composite map:
311
+ From: Multivariate Polynomial Ring in x, y over Integer Ring
312
+ To: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
313
+ Defn: Coercion map:
314
+ From: Multivariate Polynomial Ring in x, y over Integer Ring
315
+ To: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
316
+ then
317
+ Ring morphism:
318
+ From: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
319
+ To: Multivariate Polynomial Ring in x, y over Rational Field
320
+ Defn: a |--> b
321
+ b |--> a
322
+ then
323
+ Coercion map:
324
+ From: Multivariate Polynomial Ring in x, y over Rational Field
325
+ To: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2)
326
+ """
327
+ if isinstance(x, morphism.RingHomomorphism_from_quotient):
328
+ phi = x._phi()
329
+ else:
330
+ pi = self.domain().cover()
331
+ phi = pi.domain().hom(x, base_map=base_map, check=check)
332
+ return self.element_class(self, phi)