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,711 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Class to flatten polynomial rings over polynomial ring
4
+
5
+ For example ``QQ['a','b'],['x','y']`` flattens to ``QQ['a','b','x','y']``.
6
+
7
+ EXAMPLES::
8
+
9
+ sage: R = QQ['x']['y']['s','t']['X']
10
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
11
+ sage: phi = FlatteningMorphism(R); phi
12
+ Flattening morphism:
13
+ From: Univariate Polynomial Ring in X
14
+ over Multivariate Polynomial Ring in s, t
15
+ over Univariate Polynomial Ring in y
16
+ over Univariate Polynomial Ring in x over Rational Field
17
+ To: Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
18
+ sage: phi('x*y*s + t*X').parent()
19
+ Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
20
+
21
+ Authors:
22
+
23
+ Vincent Delecroix, Ben Hutz (July 2016): initial implementation
24
+ """
25
+
26
+ # ****************************************************************************
27
+ # Copyright (C) 2016
28
+ #
29
+ # This program is free software: you can redistribute it and/or modify
30
+ # it under the terms of the GNU General Public License as published by
31
+ # the Free Software Foundation, either version 2 of the License, or
32
+ # (at your option) any later version.
33
+ # https://www.gnu.org/licenses/
34
+ # ****************************************************************************
35
+
36
+ import itertools
37
+
38
+ from sage.categories.homset import Homset
39
+ from sage.categories.morphism import Morphism
40
+ from sage.misc.cachefunc import cached_method
41
+ from .polynomial_ring_constructor import PolynomialRing
42
+ from .polynomial_ring import PolynomialRing_generic
43
+ from .multi_polynomial_ring_base import MPolynomialRing_base
44
+ from sage.rings.fraction_field import FractionField_generic
45
+ from sage.rings.fraction_field_element import FractionFieldElement
46
+ from sage.rings.polynomial.polydict import ETuple
47
+
48
+
49
+ class FlatteningMorphism(Morphism):
50
+ r"""
51
+ EXAMPLES::
52
+
53
+ sage: R = QQ['a','b']['x','y','z']['t1','t2']
54
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
55
+ sage: f = FlatteningMorphism(R)
56
+ sage: f.codomain()
57
+ Multivariate Polynomial Ring in a, b, x, y, z, t1, t2 over Rational Field
58
+ sage: p = R('(a+b)*x + (a^2-b)*t2*(z+y)')
59
+ sage: p
60
+ ((a^2 - b)*y + (a^2 - b)*z)*t2 + (a + b)*x
61
+ sage: f(p)
62
+ a^2*y*t2 + a^2*z*t2 - b*y*t2 - b*z*t2 + a*x + b*x
63
+ sage: f(p).parent()
64
+ Multivariate Polynomial Ring in a, b, x, y, z, t1, t2 over Rational Field
65
+
66
+ Also works when univariate polynomial ring are involved::
67
+
68
+ sage: R = QQ['x']['y']['s','t']['X']
69
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
70
+ sage: f = FlatteningMorphism(R)
71
+ sage: f.codomain()
72
+ Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
73
+ sage: p = R('((x^2 + 1) + (x+2)*y + x*y^3)*(s+t) + x*y*X')
74
+ sage: p
75
+ x*y*X + (x*y^3 + (x + 2)*y + x^2 + 1)*s + (x*y^3 + (x + 2)*y + x^2 + 1)*t
76
+ sage: f(p)
77
+ x*y^3*s + x*y^3*t + x^2*s + x*y*s + x^2*t + x*y*t + x*y*X + 2*y*s + 2*y*t + s + t
78
+ sage: f(p).parent()
79
+ Multivariate Polynomial Ring in x, y, s, t, X over Rational Field
80
+ """
81
+ def __init__(self, domain):
82
+ """
83
+ The Python constructor.
84
+
85
+ EXAMPLES::
86
+
87
+ sage: R = ZZ['a', 'b', 'c']['x', 'y', 'z']
88
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
89
+ sage: FlatteningMorphism(R)
90
+ Flattening morphism:
91
+ From: Multivariate Polynomial Ring in x, y, z over Multivariate Polynomial Ring in a, b, c over Integer Ring
92
+ To: Multivariate Polynomial Ring in a, b, c, x, y, z over Integer Ring
93
+
94
+ ::
95
+
96
+ sage: R = ZZ['a']['b']['c']
97
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
98
+ sage: FlatteningMorphism(R)
99
+ Flattening morphism:
100
+ From: Univariate Polynomial Ring in c over Univariate Polynomial Ring in b over Univariate Polynomial Ring in a over Integer Ring
101
+ To: Multivariate Polynomial Ring in a, b, c over Integer Ring
102
+
103
+ ::
104
+
105
+ sage: R = ZZ['a']['a','b']
106
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
107
+ sage: FlatteningMorphism(R)
108
+ Flattening morphism:
109
+ From: Multivariate Polynomial Ring in a, b over Univariate Polynomial Ring in a over Integer Ring
110
+ To: Multivariate Polynomial Ring in a, a0, b over Integer Ring
111
+
112
+ ::
113
+
114
+ sage: # needs sage.rings.number_field
115
+ sage: x = polygen(ZZ, 'x')
116
+ sage: K.<v> = NumberField(x^3 - 2)
117
+ sage: R = K['x','y']['a','b']
118
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
119
+ sage: f = FlatteningMorphism(R)
120
+ sage: f(R('v*a*x^2 + b^2 + 1/v*y'))
121
+ v*x^2*a + b^2 + (1/2*v^2)*y
122
+
123
+ ::
124
+
125
+ sage: # needs sage.rings.number_field
126
+ sage: R = QQbar['x','y']['a','b']
127
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
128
+ sage: f = FlatteningMorphism(R)
129
+ sage: f(R('QQbar(sqrt(2))*a*x^2 + b^2 + QQbar(I)*y')) # needs sage.symbolic
130
+ 1.414213562373095?*x^2*a + b^2 + I*y
131
+
132
+ ::
133
+
134
+ sage: # needs sage.rings.number_field
135
+ sage: R.<z> = PolynomialRing(QQbar, 1)
136
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
137
+ sage: f = FlatteningMorphism(R)
138
+ sage: f.domain(), f.codomain()
139
+ (Multivariate Polynomial Ring in z over Algebraic Field,
140
+ Multivariate Polynomial Ring in z over Algebraic Field)
141
+
142
+ ::
143
+
144
+ sage: # needs sage.rings.number_field
145
+ sage: R.<z> = PolynomialRing(QQbar)
146
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
147
+ sage: f = FlatteningMorphism(R)
148
+ sage: f.domain(), f.codomain()
149
+ (Univariate Polynomial Ring in z over Algebraic Field,
150
+ Univariate Polynomial Ring in z over Algebraic Field)
151
+
152
+ TESTS::
153
+
154
+ sage: Pol = QQ['x']['x0']['x']
155
+ sage: fl = FlatteningMorphism(Pol)
156
+ sage: fl
157
+ Flattening morphism:
158
+ From: Univariate Polynomial Ring in x over Univariate Polynomial Ring in x0 over Univariate Polynomial Ring in x over Rational Field
159
+ To: Multivariate Polynomial Ring in x, x0, x1 over Rational Field
160
+ sage: p = Pol([[[1,2],[3,4]],[[5,6],[7,8]]])
161
+ sage: fl.section()(fl(p)) == p
162
+ True
163
+ """
164
+ if not isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base)):
165
+ raise ValueError("domain should be a polynomial ring")
166
+
167
+ ring = domain
168
+ variables = []
169
+ intermediate_rings = []
170
+
171
+ while isinstance(ring, (PolynomialRing_generic, MPolynomialRing_base)):
172
+ intermediate_rings.append(ring)
173
+ v = ring.variable_names()
174
+ variables.extend(reversed(v))
175
+ ring = ring.base_ring()
176
+ self._intermediate_rings = intermediate_rings
177
+ variables.reverse()
178
+ for i, a in enumerate(variables):
179
+ if a in variables[:i]:
180
+ for index in itertools.count():
181
+ b = a + str(index)
182
+ if b not in variables: # not just variables[:i]!
183
+ break
184
+ variables[i] = b
185
+ if isinstance(domain, MPolynomialRing_base):
186
+ codomain = PolynomialRing(ring, variables, len(variables))
187
+ else:
188
+ codomain = PolynomialRing(ring, variables)
189
+
190
+ hom = Homset(domain, codomain, base=ring, check=False)
191
+ Morphism.__init__(self, hom)
192
+ self._repr_type_str = 'Flattening'
193
+
194
+ def _call_(self, p):
195
+ r"""
196
+ Evaluate a flattening morphism.
197
+
198
+ EXAMPLES::
199
+
200
+ sage: R = QQ['a','b','c']['x','y','z']
201
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
202
+ sage: h = FlatteningMorphism(R)('2*a*x + b*z'); h
203
+ 2*a*x + b*z
204
+ sage: h.parent()
205
+ Multivariate Polynomial Ring in a, b, c, x, y, z over Rational Field
206
+
207
+ TESTS::
208
+
209
+ sage: R = QQ['x']['y']['s','t']
210
+ sage: p = R('s*x + y*t + x^2*s + 1 + t')
211
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
212
+ sage: f = FlatteningMorphism(R)
213
+ sage: f._call_(p)
214
+ x^2*s + x*s + y*t + t + 1
215
+ """
216
+ # If we are just specializing a univariate polynomial, then
217
+ # the flattening morphism is the identity
218
+ if self.codomain().ngens() == 1:
219
+ return p
220
+
221
+ p = {(): p}
222
+
223
+ for ring in self._intermediate_rings:
224
+ new_p = {}
225
+ if isinstance(ring, PolynomialRing_generic):
226
+ for mon, pp in p.items():
227
+ assert pp.parent() is ring
228
+ for i, j in pp.monomial_coefficients().items():
229
+ new_p[(i,) + (mon)] = j
230
+ elif isinstance(ring, MPolynomialRing_base):
231
+ for mon, pp in p.items():
232
+ assert pp.parent() is ring
233
+ for mmon, q in pp.monomial_coefficients().items():
234
+ new_p[tuple(mmon) + mon] = q
235
+ else:
236
+ raise RuntimeError
237
+ p = new_p
238
+
239
+ return self.codomain()(p, check=False)
240
+
241
+ @cached_method
242
+ def section(self):
243
+ """
244
+ Inverse of this flattening morphism.
245
+
246
+ EXAMPLES::
247
+
248
+ sage: R = QQ['a','b','c']['x','y','z']
249
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
250
+ sage: h = FlatteningMorphism(R)
251
+ sage: h.section()
252
+ Unflattening morphism:
253
+ From: Multivariate Polynomial Ring in a, b, c, x, y, z over Rational Field
254
+ To: Multivariate Polynomial Ring in x, y, z
255
+ over Multivariate Polynomial Ring in a, b, c over Rational Field
256
+
257
+ ::
258
+
259
+ sage: R = ZZ['a']['b']['c']
260
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
261
+ sage: FlatteningMorphism(R).section()
262
+ Unflattening morphism:
263
+ From: Multivariate Polynomial Ring in a, b, c over Integer Ring
264
+ To: Univariate Polynomial Ring in c over Univariate Polynomial Ring in b
265
+ over Univariate Polynomial Ring in a over Integer Ring
266
+ """
267
+ return UnflatteningMorphism(self.codomain(), self.domain())
268
+
269
+ def inverse(self):
270
+ """
271
+ Return the inverse of this flattening morphism.
272
+
273
+ This is the same as calling :meth:`section`.
274
+
275
+ EXAMPLES::
276
+
277
+ sage: f = QQ['x,y']['u,v'].flattening_morphism()
278
+ sage: f.inverse()
279
+ Unflattening morphism:
280
+ From: Multivariate Polynomial Ring in x, y, u, v over Rational Field
281
+ To: Multivariate Polynomial Ring in u, v
282
+ over Multivariate Polynomial Ring in x, y over Rational Field
283
+ """
284
+ return self.section()
285
+
286
+
287
+ class UnflatteningMorphism(Morphism):
288
+ r"""
289
+ Inverses for :class:`FlatteningMorphism`.
290
+
291
+ EXAMPLES::
292
+
293
+ sage: R = QQ['c','x','y','z']
294
+ sage: S = QQ['c']['x','y','z']
295
+ sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
296
+ sage: f = UnflatteningMorphism(R, S)
297
+ sage: g = f(R('x^2 + c*y^2 - z^2'));g
298
+ x^2 + c*y^2 - z^2
299
+ sage: g.parent()
300
+ Multivariate Polynomial Ring in x, y, z
301
+ over Univariate Polynomial Ring in c over Rational Field
302
+
303
+ ::
304
+
305
+ sage: R = QQ['a','b', 'x','y']
306
+ sage: S = QQ['a','b']['x','y']
307
+ sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
308
+ sage: UnflatteningMorphism(R, S)
309
+ Unflattening morphism:
310
+ From: Multivariate Polynomial Ring in a, b, x, y over Rational Field
311
+ To: Multivariate Polynomial Ring in x, y
312
+ over Multivariate Polynomial Ring in a, b over Rational Field
313
+ """
314
+
315
+ def __init__(self, domain, codomain):
316
+ """
317
+ The Python constructor.
318
+
319
+ EXAMPLES::
320
+
321
+ sage: R = QQ['x']['y']['s','t']['X']
322
+ sage: p = R.random_element()
323
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
324
+ sage: f = FlatteningMorphism(R)
325
+ sage: g = f.section()
326
+ sage: g(f(p)) == p
327
+ True
328
+
329
+ ::
330
+
331
+ sage: R = QQ['a','b','x','y']
332
+ sage: S = ZZ['a','b']['x','z']
333
+ sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
334
+ sage: UnflatteningMorphism(R, S)
335
+ Traceback (most recent call last):
336
+ ...
337
+ ValueError: rings must have same base ring
338
+
339
+ ::
340
+
341
+ sage: R = QQ['a','b','x','y']
342
+ sage: S = QQ['a','b']['x','z','w']
343
+ sage: from sage.rings.polynomial.flatten import UnflatteningMorphism
344
+ sage: UnflatteningMorphism(R, S)
345
+ Traceback (most recent call last):
346
+ ...
347
+ ValueError: rings must have the same number of variables
348
+ """
349
+ if not isinstance(domain, MPolynomialRing_base):
350
+ raise ValueError("domain should be a multivariate polynomial ring")
351
+ if not isinstance(codomain, (PolynomialRing_generic, MPolynomialRing_base)):
352
+ raise ValueError("codomain should be a polynomial ring")
353
+
354
+ ring = codomain
355
+ intermediate_rings = []
356
+
357
+ while True:
358
+ is_polynomial_ring = isinstance(ring, PolynomialRing_generic)
359
+ if not (is_polynomial_ring or isinstance(ring, MPolynomialRing_base)):
360
+ break
361
+ intermediate_rings.append((ring, is_polynomial_ring))
362
+ ring = ring.base_ring()
363
+
364
+ if domain.base_ring() != intermediate_rings[-1][0].base_ring():
365
+ raise ValueError("rings must have same base ring")
366
+ if domain.ngens() != sum([R.ngens() for R, _ in intermediate_rings]):
367
+ raise ValueError("rings must have the same number of variables")
368
+
369
+ self._intermediate_rings = intermediate_rings
370
+
371
+ hom = Homset(domain, codomain, base=ring, check=False)
372
+ Morphism.__init__(self, hom)
373
+ self._repr_type_str = 'Unflattening'
374
+
375
+ def _call_(self, p):
376
+ """
377
+ Evaluate an unflattening morphism.
378
+
379
+ TESTS::
380
+
381
+ sage: from sage.rings.polynomial.flatten import FlatteningMorphism
382
+ sage: rings = [ZZ['x']['y']['a,b,c']]
383
+ sage: rings += [GF(4)['x','y']['a','b']] # needs sage.rings.finite_rings
384
+ sage: rings += [AA['x']['a','b']['y'], QQbar['a1','a2']['t']['X','Y']] # needs sage.rings.number_field
385
+ sage: for R in rings: # needs sage.modules
386
+ ....: f = FlatteningMorphism(R)
387
+ ....: g = f.section()
388
+ ....: for _ in range(10):
389
+ ....: p = R.random_element()
390
+ ....: assert p == g(f(p))
391
+ ....: z = R.zero()
392
+ ....: assert z == g(f(z))
393
+ """
394
+ index = [0]
395
+ for R, _ in reversed(self._intermediate_rings):
396
+ index.append(index[-1] + len(R.gens()))
397
+ newpol = [{} for _ in self._intermediate_rings]
398
+ expo = sorted(p.exponents(), key=lambda e: tuple(reversed(e)))
399
+ for i in range(len(expo)):
400
+ cur_exp = expo[i]
401
+ for l in range(len(self._intermediate_rings)):
402
+ R, univariate = self._intermediate_rings[-1 - l]
403
+ idx = index[l + 1]
404
+ sub_exp = (cur_exp[index[l]] if univariate
405
+ else cur_exp[index[l]:idx])
406
+ if l == 0:
407
+ newpol[l][sub_exp] = p[cur_exp]
408
+ else:
409
+ newpol[l][sub_exp] = newpol[l - 1]
410
+ newpol[l - 1] = {}
411
+ if (i == len(expo) - 1 or expo[i + 1][idx:] != cur_exp[idx:]):
412
+ newpol[l] = R(newpol[l], check=False)
413
+ else:
414
+ break
415
+ return R(newpol[-1], check=False)
416
+
417
+
418
+ class SpecializationMorphism(Morphism):
419
+ r"""
420
+ Morphisms to specialize parameters in (stacked) polynomial rings.
421
+
422
+ EXAMPLES::
423
+
424
+ sage: R.<c> = PolynomialRing(QQ)
425
+ sage: S.<x,y,z> = PolynomialRing(R)
426
+ sage: D = dict({c:1})
427
+ sage: from sage.rings.polynomial.flatten import SpecializationMorphism
428
+ sage: f = SpecializationMorphism(S, D)
429
+ sage: g = f(x^2 + c*y^2 - z^2); g
430
+ x^2 + y^2 - z^2
431
+ sage: g.parent()
432
+ Multivariate Polynomial Ring in x, y, z over Rational Field
433
+
434
+ ::
435
+
436
+ sage: R.<c> = PolynomialRing(QQ)
437
+ sage: S.<z> = PolynomialRing(R)
438
+ sage: from sage.rings.polynomial.flatten import SpecializationMorphism
439
+ sage: xi = SpecializationMorphism(S, {c:0}); xi
440
+ Specialization morphism:
441
+ From: Univariate Polynomial Ring in z
442
+ over Univariate Polynomial Ring in c over Rational Field
443
+ To: Univariate Polynomial Ring in z over Rational Field
444
+ sage: xi(z^2+c)
445
+ z^2
446
+
447
+ ::
448
+
449
+ sage: R1.<u,v> = PolynomialRing(QQ)
450
+ sage: R2.<a,b,c> = PolynomialRing(R1)
451
+ sage: S.<x,y,z> = PolynomialRing(R2)
452
+ sage: D = dict({a:1, b:2, x:0, u:1})
453
+ sage: from sage.rings.polynomial.flatten import SpecializationMorphism
454
+ sage: xi = SpecializationMorphism(S, D); xi
455
+ Specialization morphism:
456
+ From: Multivariate Polynomial Ring in x, y, z
457
+ over Multivariate Polynomial Ring in a, b, c
458
+ over Multivariate Polynomial Ring in u, v over Rational Field
459
+ To: Multivariate Polynomial Ring in y, z over Univariate Polynomial Ring in c
460
+ over Univariate Polynomial Ring in v over Rational Field
461
+ sage: xi(a*(x*z+y^2)*u+b*v*u*(x*z+y^2)*y^2*c+c*y^2*z^2)
462
+ 2*v*c*y^4 + c*y^2*z^2 + y^2
463
+ """
464
+
465
+ def __init__(self, domain, D):
466
+ """
467
+ The Python constructor.
468
+
469
+ EXAMPLES::
470
+
471
+ sage: S.<x,y> = PolynomialRing(QQ)
472
+ sage: D = dict({x:1})
473
+ sage: from sage.rings.polynomial.flatten import SpecializationMorphism
474
+ sage: phi = SpecializationMorphism(S, D); phi
475
+ Specialization morphism:
476
+ From: Multivariate Polynomial Ring in x, y over Rational Field
477
+ To: Univariate Polynomial Ring in y over Rational Field
478
+ sage: phi(x^2 + y^2)
479
+ y^2 + 1
480
+
481
+ ::
482
+
483
+ sage: R.<a,b,c> = PolynomialRing(ZZ)
484
+ sage: S.<x,y,z> = PolynomialRing(R)
485
+ sage: from sage.rings.polynomial.flatten import SpecializationMorphism
486
+ sage: xi = SpecializationMorphism(S, {a:1/2})
487
+ Traceback (most recent call last):
488
+ ...
489
+ TypeError: no conversion of this rational to integer
490
+
491
+ The following was fixed in :issue:`23811`::
492
+
493
+ sage: R.<c> = RR[]
494
+ sage: P.<z> = AffineSpace(R, 1)
495
+ sage: H = End(P)
496
+ sage: f = H([z^2 + c])
497
+ sage: f.specialization({c:1}) # needs sage.modules
498
+ Scheme endomorphism of
499
+ Affine Space of dimension 1 over Real Field with 53 bits of precision
500
+ Defn: Defined on coordinates by sending (z) to
501
+ (z^2 + 1.00000000000000)
502
+ """
503
+ if not isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base)):
504
+ raise TypeError("domain should be a polynomial ring")
505
+
506
+ # use only the generators that are in the stack somewhere,
507
+ # and ignore the rest
508
+ all_gens = domain.gens_dict_recursive()
509
+ new_D = {}
510
+ for gen in D:
511
+ if str(gen) in all_gens:
512
+ new_D[gen] = D[gen]
513
+ D = new_D
514
+
515
+ # _sub_specialization is a specialization morphism (recursive)
516
+ # which is applied to the base Fraction field, or None if it's
517
+ # any other base ring
518
+
519
+ self._sub_specialization = None
520
+
521
+ # We use this composition where "flat" is a flattened
522
+ # polynomial ring.
523
+ #
524
+ # phi D psi
525
+ # domain → flat → flat → R
526
+ # │ │ │
527
+ # └─────────┴───────────────┘
528
+ # _flattening_morph _eval_morph
529
+ # = phi = psi ∘ D
530
+
531
+ phi = FlatteningMorphism(domain)
532
+ flat = phi.codomain()
533
+ base = flat.base_ring()
534
+
535
+ # Change domain of D to "flat" and ensure that the values lie
536
+ # in the base ring.
537
+ D = {phi(k): base(D[k]) for k in D}
538
+
539
+ # Construct unflattened codomain R
540
+ new_vars = []
541
+ R = domain
542
+ while isinstance(R, (PolynomialRing_generic,
543
+ MPolynomialRing_base,
544
+ FractionField_generic)):
545
+ if isinstance(R, FractionField_generic):
546
+ # We've hit base_ring, so set _sub_specialization and exit the loop
547
+ field_over = R.base()
548
+ applicable_vars = {key: val for key, val in D.items()
549
+ if key not in flat.gens()}
550
+ # If there are any variables in D to set in _sub_specialization
551
+ if applicable_vars:
552
+ # Coerce the generators to be in the right ring
553
+ # This un-does changing the domain of D to be in the flat base ring
554
+ tmp = {}
555
+ for var, val in applicable_vars.items():
556
+ for gstr, gen in field_over.gens_dict_recursive().items():
557
+ if str(var) == gstr:
558
+ tmp[gen] = val
559
+ break
560
+ else:
561
+ # Should have been caught earlier
562
+ raise NameError("argument " + str(var) + " is not a generator anywhere in the polynomial tower")
563
+ applicable_vars = tmp
564
+ self._sub_specialization = FractionSpecializationMorphism(R, applicable_vars)
565
+ break
566
+ # We're still in the polynomials, so keep track of the tower
567
+ old = R.gens()
568
+ new = [t for t in old if t not in D]
569
+ force_multivariate = ((len(old) == 1) and isinstance(R, MPolynomialRing_base))
570
+ new_vars.append((new, force_multivariate, old))
571
+ R = R.base_ring()
572
+
573
+ if self._sub_specialization:
574
+ # The sub_specialization range will be different
575
+ # if it applied some variables from D
576
+ R = self._sub_specialization.codomain().fraction_field()
577
+
578
+ # Construct unflattening map psi (only defined on the variables
579
+ # of "flat" which are not involved in D)
580
+ psi = dict()
581
+ # Reconstruct the proper domain of this morphism
582
+ # based on the sub_specialization domains
583
+ new_domain = R
584
+ for new, force_multivariate, old in reversed(new_vars):
585
+ if self._sub_specialization:
586
+ if force_multivariate:
587
+ new_domain = PolynomialRing(new_domain, old, len(old))
588
+ else:
589
+ new_domain = PolynomialRing(new_domain, old)
590
+ if not new:
591
+ continue
592
+ var_names = [str(var) for var in new]
593
+ if force_multivariate:
594
+ R = PolynomialRing(R, var_names, len(var_names))
595
+ else:
596
+ R = PolynomialRing(R, var_names)
597
+ # Map variables in "new" to R
598
+ psi.update(zip([phi(w) for w in new], R.gens()))
599
+
600
+ # Fix domain of eval_morph
601
+ # (note: phi's domain is correct)
602
+ if self._sub_specialization:
603
+ phi_prime = FlatteningMorphism(new_domain)
604
+ flat_old = flat
605
+ flat = phi_prime.codomain()
606
+ base_prime = flat.base_ring()
607
+ D = {phi(k): base_prime(D[k]) for k in D}
608
+ else:
609
+ # The bottom of our tower has not changed
610
+ def flat_old(x):
611
+ return x
612
+
613
+ # Compose D with psi
614
+ vals = []
615
+ for t in flat.gens():
616
+ if t in D:
617
+ vals.append(R.coerce(D[t]))
618
+ else:
619
+ # Make sure keys are in the old domain
620
+ # or else they won't match exactly
621
+ vals.append(psi[flat_old(t)])
622
+
623
+ self._flattening_morph = phi
624
+ self._eval_morph = flat.hom(vals, R)
625
+ self._repr_type_str = 'Specialization'
626
+ Morphism.__init__(self, domain, R)
627
+
628
+ def _call_(self, p):
629
+ """
630
+ Evaluate a specialization morphism.
631
+
632
+ EXAMPLES::
633
+
634
+ sage: R.<a,b,c> = PolynomialRing(ZZ)
635
+ sage: S.<x,y,z> = PolynomialRing(R)
636
+ sage: D = dict({a:1, b:2, c:3})
637
+ sage: from sage.rings.polynomial.flatten import SpecializationMorphism
638
+ sage: xi = SpecializationMorphism(S, D)
639
+ sage: xi(a*x + b*y + c*z)
640
+ x + 2*y + 3*z
641
+ """
642
+ flat = self._flattening_morph(p)
643
+ if self._sub_specialization is not None:
644
+ # The base_ring should be a fraction field, so
645
+ # apply _sub_specialization to each coefficient
646
+ # in the flattened polynomial
647
+ tmp = {}
648
+ for exponent, coefficient in flat.monomial_coefficients().items():
649
+ # Fix the type of exponent from (a,) to a
650
+ # (necessary for R(tmp) later)
651
+ if isinstance(exponent, ETuple) and len(exponent) == 1:
652
+ exponent = exponent[0]
653
+ # Coefficient should be a fraction
654
+ tmp[exponent] = self._sub_specialization._call_(coefficient)
655
+ # tmp's parent should be the same construction as flat
656
+ # but over _sub_specialization's codomain
657
+ ring_constructor = flat.parent().construction()[0]
658
+ fraction_type = self._sub_specialization.codomain()
659
+ R = ring_constructor(fraction_type)
660
+ flat = R(tmp)
661
+ return self._eval_morph(flat)
662
+
663
+
664
+ class FractionSpecializationMorphism(Morphism):
665
+ """
666
+ A specialization morphism for fraction fields over (stacked) polynomial rings
667
+ """
668
+ def __init__(self, domain, D):
669
+ """
670
+ Initialize the morphism with a domain and dictionary of specializations.
671
+
672
+ EXAMPLES::
673
+
674
+ sage: R.<a,c> = QQ[]
675
+ sage: S.<x,y> = R[]
676
+ sage: from sage.rings.polynomial.flatten import FractionSpecializationMorphism
677
+ sage: phi = FractionSpecializationMorphism(Frac(S), {c:3})
678
+ sage: phi
679
+ Fraction Specialization morphism:
680
+ From: Fraction Field of Multivariate Polynomial Ring in x, y
681
+ over Multivariate Polynomial Ring in a, c over Rational Field
682
+ To: Fraction Field of Multivariate Polynomial Ring in x, y
683
+ over Univariate Polynomial Ring in a over Rational Field
684
+ """
685
+ if not isinstance(domain, FractionField_generic):
686
+ raise TypeError("domain must be a fraction field")
687
+ self._specialization = SpecializationMorphism(domain.base(), D)
688
+ self._repr_type_str = 'Fraction Specialization'
689
+ Morphism.__init__(self, domain, self._specialization.codomain().fraction_field())
690
+
691
+ def _call_(self, p):
692
+ """
693
+ Evaluate a fraction specialization morphism.
694
+
695
+ EXAMPLES::
696
+
697
+ sage: R.<a,b,c> = QQ[]
698
+ sage: S.<x,y,z> = R[]
699
+ sage: from sage.rings.polynomial.flatten import FractionSpecializationMorphism
700
+ sage: phi = FractionSpecializationMorphism(Frac(S), {a:3, b:2, c:-2})
701
+ sage: spec = phi((a*x + b*y) / (c*z))
702
+ sage: spec
703
+ (3*x + 2*y)/(-2*z)
704
+ sage: spec.parent()
705
+ Fraction Field of Multivariate Polynomial Ring in x, y, z over Rational Field
706
+ """
707
+ if not isinstance(p, FractionFieldElement):
708
+ raise TypeError("p must be a fraction field element")
709
+ numerator = self._specialization._call_(p.numerator())
710
+ denominator = self._specialization._call_(p.denominator())
711
+ return numerator / denominator