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,947 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Multivariate Polynomial Rings over Generic Rings
4
+
5
+ Sage implements multivariate polynomial rings through several
6
+ backends. This generic implementation uses the classes ``PolyDict``
7
+ and ``ETuple`` to construct a dictionary with exponent tuples as keys
8
+ and coefficients as values.
9
+
10
+ AUTHORS:
11
+
12
+ - David Joyner and William Stein
13
+
14
+ - Kiran S. Kedlaya (2006-02-12): added Macaulay2 analogues of Singular
15
+ features
16
+
17
+ - Martin Albrecht (2006-04-21): reorganize class hierarchy for singular
18
+ rep
19
+
20
+ - Martin Albrecht (2007-04-20): reorganized class hierarchy to support
21
+ Pyrex implementations
22
+
23
+ - Robert Bradshaw (2007-08-15): Coercions from rings in a subset of
24
+ the variables.
25
+
26
+ EXAMPLES:
27
+
28
+ We construct the Frobenius morphism on `\GF{5}[x,y,z]` over
29
+ `\GF{5}`::
30
+
31
+ sage: R.<x,y,z> = GF(5)[]
32
+ sage: frob = R.hom([x^5, y^5, z^5])
33
+ sage: frob(x^2 + 2*y - z^4)
34
+ -z^20 + x^10 + 2*y^5
35
+ sage: frob((x + 2*y)^3) # needs sage.rings.finite_rings
36
+ x^15 + x^10*y^5 + 2*x^5*y^10 - 2*y^15
37
+ sage: (x^5 + 2*y^5)^3 # needs sage.rings.finite_rings
38
+ x^15 + x^10*y^5 + 2*x^5*y^10 - 2*y^15
39
+
40
+ We make a polynomial ring in one variable over a polynomial ring in
41
+ two variables::
42
+
43
+ sage: R.<x, y> = PolynomialRing(QQ, 2)
44
+ sage: S.<t> = PowerSeriesRing(R)
45
+ sage: t*(x+y)
46
+ (x + y)*t
47
+
48
+ TESTS::
49
+
50
+ sage: PolynomialRing(GF(5), 3, 'xyz').objgens()
51
+ (Multivariate Polynomial Ring in x, y, z over Finite Field of size 5,
52
+ (x, y, z))
53
+ """
54
+ # ****************************************************************************
55
+ # Copyright (C) 2005 William Stein <wstein@gmail.com>
56
+ #
57
+ # This program is free software: you can redistribute it and/or modify
58
+ # it under the terms of the GNU General Public License as published by
59
+ # the Free Software Foundation, either version 2 of the License, or
60
+ # (at your option) any later version.
61
+ # https://www.gnu.org/licenses/
62
+ # ****************************************************************************
63
+
64
+ import sage.rings.fraction_field_element as fraction_field_element
65
+
66
+ from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base, is_MPolynomialRing
67
+ from sage.rings.polynomial.polynomial_singular_interface import PolynomialRing_singular_repr
68
+ from sage.rings.polynomial.polydict import PolyDict, ETuple
69
+ from sage.rings.polynomial.term_order import TermOrder
70
+ import sage.interfaces.abc
71
+
72
+ try:
73
+ from cypari2.gen import Gen as pari_gen
74
+ except ImportError:
75
+ pari_gen = ()
76
+
77
+ from sage.structure.element import Element
78
+
79
+
80
+ class MPolynomialRing_macaulay2_repr:
81
+ """
82
+ A mixin class for polynomial rings that support conversion to Macaulay2.
83
+ """
84
+ def _macaulay2_init_(self, macaulay2=None):
85
+ """
86
+ EXAMPLES::
87
+
88
+ sage: PolynomialRing(QQ, 'x', 2, implementation='generic')._macaulay2_init_() # optional - macaulay2
89
+ 'sage...[symbol x0,symbol x1, MonomialSize=>16, MonomialOrder=>GRevLex]'
90
+ """
91
+ if macaulay2 is None:
92
+ from sage.interfaces.macaulay2 import macaulay2 as m2_default
93
+ macaulay2 = m2_default
94
+ return macaulay2._macaulay2_input_ring(self.base_ring(), self.gens(),
95
+ self.term_order().macaulay2_str())
96
+
97
+
98
+ class MPolynomialRing_polydict(MPolynomialRing_macaulay2_repr, PolynomialRing_singular_repr, MPolynomialRing_base):
99
+ """
100
+ Multivariable polynomial ring.
101
+
102
+ EXAMPLES::
103
+
104
+ sage: R = PolynomialRing(Integers(12), 'x', 5); R
105
+ Multivariate Polynomial Ring in x0, x1, x2, x3, x4 over Ring of integers modulo 12
106
+ sage: loads(R.dumps()) == R
107
+ True
108
+ """
109
+ from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict as Element_hidden
110
+ # should be just Element, once polynomial use new coercion framework
111
+
112
+ def __init__(self, base_ring, n, names, order):
113
+ from sage.rings.polynomial.polynomial_singular_interface import can_convert_to_singular
114
+ order = TermOrder(order, n)
115
+ # MPolynomialRing_base.__init__() normally initialises the base ring,
116
+ # but it also needs the generators to construct a coercion map from the
117
+ # base ring, and the base ring must be set to initialise the generators.
118
+ # We set the base ring manually to break this circular dependency.
119
+ self._base = base_ring
120
+ # Construct the generators
121
+ v = [0] * n
122
+ one = base_ring.one()
123
+ self._gens = []
124
+ for i in range(n):
125
+ v[i] = 1 # int's!
126
+ self._gens.append(self.Element_hidden(self, {tuple(v): one}))
127
+ v[i] = 0
128
+ self._gens = tuple(self._gens)
129
+ self._zero_tuple = tuple(v)
130
+ MPolynomialRing_base.__init__(self, base_ring, n, names, order)
131
+ self._has_singular = can_convert_to_singular(self)
132
+
133
+ def _monomial_order_function(self):
134
+ return self.__monomial_order_function
135
+
136
+ def __eq__(self, other):
137
+ """
138
+ Check whether ``self`` is equal to ``other``.
139
+
140
+ EXAMPLES::
141
+
142
+ sage: R = PolynomialRing(Integers(10), 'x', 4)
143
+ sage: loads(R.dumps()) == R
144
+ True
145
+ """
146
+ if not isinstance(other, MPolynomialRing_base):
147
+ return False
148
+ return ((self.base_ring(), self.ngens(),
149
+ self.variable_names(), self.term_order()) ==
150
+ (other.base_ring(), other.ngens(),
151
+ other.variable_names(), other.term_order()))
152
+
153
+ def __ne__(self, other):
154
+ """
155
+ Check whether ``self`` is not equal to ``other``.
156
+
157
+ EXAMPLES::
158
+
159
+ sage: R = PolynomialRing(Integers(8), 'x', 3)
160
+ sage: loads(R.dumps()) != R
161
+ False
162
+ """
163
+ return not (self == other)
164
+
165
+ def __hash__(self):
166
+ """
167
+ Compute the hash of ``self``.
168
+
169
+ EXAMPLES::
170
+
171
+ sage: h = hash(PolynomialRing(Integers(8), 'x', 3))
172
+ """
173
+ return hash((self.base_ring(), self.ngens(),
174
+ self.variable_names(), self.term_order()))
175
+
176
+ def __call__(self, x=0, check=True):
177
+ """
178
+ Convert ``x`` to an element of this multivariate polynomial ring,
179
+ possibly non-canonically.
180
+
181
+ EXAMPLES:
182
+
183
+ We create a Macaulay2 multivariate polynomial via ideal
184
+ arithmetic, then convert it into R.
185
+
186
+ ::
187
+
188
+ sage: R.<x,y> = PolynomialRing(QQ, 2)
189
+ sage: I = R.ideal([x^3 + y, y])
190
+ sage: S = I._macaulay2_() # optional - macaulay2
191
+ sage: T = S*S*S # optional - macaulay2
192
+ sage: U = T.gens().entries().flatten() # optional - macaulay2
193
+ sage: f = U[2]; f # optional - macaulay2
194
+ 6 3 2 3
195
+ x y + 2x y + y
196
+ sage: R(f.external_string()) # optional - macaulay2
197
+ x^6*y + 2*x^3*y^2 + y^3
198
+
199
+ Some other subtle conversions. We create polynomial rings in 2
200
+ variables over the rationals, integers, and a finite field.
201
+
202
+ ::
203
+
204
+ sage: R.<x,y> = QQ[]
205
+ sage: S.<x,y> = ZZ[]
206
+ sage: T.<x,y> = GF(7)[]
207
+
208
+ We convert from integer polynomials to rational polynomials,
209
+ and back::
210
+
211
+ sage: f = R(S.0^2 - 4*S.1^3); f
212
+ -4*y^3 + x^2
213
+ sage: parent(f)
214
+ Multivariate Polynomial Ring in x, y over Rational Field
215
+ sage: parent(S(f))
216
+ Multivariate Polynomial Ring in x, y over Integer Ring
217
+
218
+ We convert from polynomials over the finite field.
219
+
220
+ ::
221
+
222
+ sage: f = R(T.0^2 - 4*T.1^3); f
223
+ 3*y^3 + x^2
224
+ sage: parent(f)
225
+ Multivariate Polynomial Ring in x, y over Rational Field
226
+
227
+ We dump and load the polynomial ring S::
228
+
229
+ sage: S2 = loads(dumps(S))
230
+ sage: S2 == S
231
+ True
232
+
233
+ Coerce works and gets the right parent.
234
+
235
+ ::
236
+
237
+ sage: parent(S2.coerce(S.0)) is S2
238
+ True
239
+
240
+ Conversion to reduce modulo a prime between rings with different
241
+ variable names::
242
+
243
+ sage: R.<x,y> = PolynomialRing(QQ,2)
244
+ sage: S.<a,b> = PolynomialRing(GF(7),2)
245
+ sage: f = x^2 + 2/3*y^3
246
+ sage: S(f)
247
+ 3*b^3 + a^2
248
+
249
+ Conversion from symbolic variables::
250
+
251
+ sage: # needs sage.symbolic
252
+ sage: x,y,z = var('x,y,z')
253
+ sage: R = QQ['x,y,z']
254
+ sage: type(x)
255
+ <class 'sage.symbolic.expression.Expression'>
256
+ sage: type(R(x))
257
+ <class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
258
+ sage: f = R(x^3 + y^3 - z^3); f
259
+ x^3 + y^3 - z^3
260
+ sage: type(f)
261
+ <class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
262
+ sage: parent(f)
263
+ Multivariate Polynomial Ring in x, y, z over Rational Field
264
+
265
+ A more complicated symbolic and computational mix. Behind the
266
+ scenes Singular and Maxima are doing the real work.
267
+
268
+ ::
269
+
270
+ sage: # needs sage.symbolic
271
+ sage: R = QQ['x,y,z']
272
+ sage: f = (x^3 + y^3 - z^3)^10; f
273
+ (x^3 + y^3 - z^3)^10
274
+ sage: g = R(f); parent(g)
275
+ Multivariate Polynomial Ring in x, y, z over Rational Field
276
+ sage: (f - g).expand()
277
+ 0
278
+
279
+ It intelligently handles conversions from polynomial rings in a subset
280
+ of the variables too.
281
+
282
+ ::
283
+
284
+ sage: R = GF(5)['x,y,z']
285
+ sage: S = ZZ['y']
286
+ sage: R(7*S.0)
287
+ 2*y
288
+ sage: T = ZZ['x,z']
289
+ sage: R(2*T.0 + 6*T.1 + T.0*T.1^2)
290
+ x*z^2 + 2*x + z
291
+
292
+ ::
293
+
294
+ sage: R = QQ['t,x,y,z']
295
+ sage: S.<x> = ZZ['x']
296
+ sage: T.<z> = S['z']
297
+ sage: T
298
+ Univariate Polynomial Ring in z over Univariate Polynomial Ring in x over Integer Ring
299
+ sage: f = (x+3*z+5)^2; f
300
+ 9*z^2 + (6*x + 30)*z + x^2 + 10*x + 25
301
+ sage: R(f)
302
+ x^2 + 6*x*z + 9*z^2 + 10*x + 30*z + 25
303
+
304
+ Arithmetic with a constant from a base ring::
305
+
306
+ sage: R.<u,v> = QQ[]
307
+ sage: S.<x,y> = R[]
308
+ sage: u^3*x^2 + v*y
309
+ u^3*x^2 + v*y
310
+
311
+ Stacked polynomial rings convert into constants if possible. First,
312
+ the univariate case::
313
+
314
+ sage: R.<x> = QQ[]
315
+ sage: S.<u,v> = R[]
316
+ sage: S(u + 2)
317
+ u + 2
318
+ sage: S(u + 2).degree()
319
+ 1
320
+ sage: S(x + 3)
321
+ x + 3
322
+ sage: S(x + 3).degree()
323
+ 0
324
+
325
+ Second, the multivariate case::
326
+
327
+ sage: R.<x,y> = QQ[]
328
+ sage: S.<u,v> = R[]
329
+ sage: S(x + 2*y)
330
+ x + 2*y
331
+ sage: S(u + 2*v)
332
+ u + 2*v
333
+
334
+ Conversion from strings::
335
+
336
+ sage: R.<x,y> = QQ[]
337
+ sage: R('x+(1/2)*y^2')
338
+ 1/2*y^2 + x
339
+ sage: S.<u,v> = ZZ[]
340
+ sage: S('u^2 + u*v + v^2')
341
+ u^2 + u*v + v^2
342
+
343
+ Foreign polynomial rings convert into the highest ring; the point
344
+ here is that an element of T could convert to an element of R or an
345
+ element of S; it is anticipated that an element of T is more likely
346
+ to be "the right thing" and is historically consistent.
347
+
348
+ ::
349
+
350
+ sage: R.<x,y> = QQ[]
351
+ sage: S.<u,v> = R[]
352
+ sage: T.<a,b> = QQ[]
353
+ sage: S(a + b)
354
+ u + v
355
+
356
+ TESTS:
357
+
358
+ Check if we still allow nonsense (see :issue:`7951`)::
359
+
360
+ sage: P = PolynomialRing(QQ, 0, '')
361
+ sage: P('pi') # needs sage.symbolic
362
+ Traceback (most recent call last):
363
+ ...
364
+ TypeError: unable to convert pi to a rational
365
+
366
+ Check that it is possible to convert strings to iterated
367
+ polynomial rings (see :issue:`13327`)::
368
+
369
+ sage: Rm = QQ["a"]["b, c"]
370
+ sage: Rm("a*b")
371
+ a*b
372
+ sage: parent(_) is Rm
373
+ True
374
+
375
+ Check that conversion from PARI works correctly (see
376
+ :issue:`17974`)::
377
+
378
+ sage: # needs sage.libs.pari
379
+ sage: A.<a> = PolynomialRing(QQ)
380
+ sage: B.<d,e> = PolynomialRing(A)
381
+ sage: f = pari(a*d)
382
+ sage: B(f)
383
+ a*d
384
+ sage: f = pari(a*d - (a+1)*d*e^3 + a*d^2)
385
+ sage: B(f)
386
+ (-a - 1)*d*e^3 + a*d^2 + a*d
387
+ sage: A.<a,b> = PolynomialRing(QQ)
388
+ sage: B.<d,e> = PolynomialRing(A)
389
+ sage: f = pari(a*d)
390
+ sage: B(f)
391
+ a*d
392
+
393
+ It is possible to convert `f` into `B` by using ``f.sage()``,
394
+ but this requires specifying a ``locals`` argument::
395
+
396
+ sage: # needs sage.libs.pari
397
+ sage: f
398
+ d*a
399
+ sage: f.sage()
400
+ Traceback (most recent call last):
401
+ ...
402
+ NameError: name 'd' is not defined
403
+ sage: f.sage(locals={'a': a, 'd': d})
404
+ a*d
405
+
406
+ Check that :issue:`21999` is fixed::
407
+
408
+ sage: R = QQbar['s,t'] # needs sage.rings.number_field
409
+ sage: type(R({(1,2): 3}).coefficients()[0]) # needs sage.rings.number_field
410
+ <class 'sage.rings.qqbar.AlgebraicNumber'>
411
+ """
412
+ from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
413
+ import sage.rings.polynomial.polynomial_element as polynomial_element
414
+
415
+ # handle constants that coerce into self.base_ring() first, if possible
416
+ if isinstance(x, Element) and x.parent() is self.base_ring():
417
+ # A Constant multi-polynomial
418
+ return self({self._zero_tuple: x})
419
+
420
+ try:
421
+ y = self.base_ring().coerce(x)
422
+ return MPolynomial_polydict(self, {self._zero_tuple: y})
423
+ except TypeError:
424
+ pass
425
+
426
+ from .multi_polynomial import MPolynomial_libsingular
427
+
428
+ if isinstance(x, MPolynomial_polydict):
429
+ P = x.parent()
430
+
431
+ if P is self:
432
+ return x
433
+
434
+ if P == self:
435
+ return MPolynomial_polydict(self, x.element().dict())
436
+
437
+ if self.base_ring().has_coerce_map_from(P):
438
+ # it might be in the base ring (i.e. a poly ring over a poly ring)
439
+ c = self.base_ring()(x)
440
+ return MPolynomial_polydict(self, {self._zero_tuple: c})
441
+
442
+ if len(P.variable_names()) == len(self.variable_names()):
443
+ # Map the variables in some crazy way (but in order,
444
+ # of course). This is here since R(blah) is supposed
445
+ # to be "make an element of R if at all possible with
446
+ # no guarantees that this is mathematically solid."
447
+ K = self.base_ring()
448
+ D = x.element().dict()
449
+ for i, a in D.items():
450
+ D[i] = K(a)
451
+ return MPolynomial_polydict(self, D)
452
+
453
+ if (set(P.variable_names()).issubset(set(self.variable_names()))
454
+ and self.base_ring().has_coerce_map_from(P.base_ring())):
455
+ # If the named variables are a superset of the input, map the variables by name
456
+ return MPolynomial_polydict(self, self._extract_polydict(x))
457
+
458
+ return MPolynomial_polydict(self,
459
+ x._mpoly_dict_recursive(self.variable_names(),
460
+ self.base_ring()))
461
+
462
+ elif isinstance(x, MPolynomial_libsingular):
463
+ P = x.parent()
464
+ if P == self:
465
+ return MPolynomial_polydict(self, x.monomial_coefficients())
466
+
467
+ if self.base_ring().has_coerce_map_from(P):
468
+ # it might be in the base ring (i.e. a poly ring over a poly ring)
469
+ c = self.base_ring()(x)
470
+ return MPolynomial_polydict(self, {self._zero_tuple: c})
471
+
472
+ if len(P.variable_names()) == len(self.variable_names()):
473
+ # Map the variables in some crazy way (but in order,
474
+ # of course). This is here since R(blah) is supposed
475
+ # to be "make an element of R if at all possible with
476
+ # no guarantees that this is mathematically solid."
477
+ K = self.base_ring()
478
+ D = x.monomial_coefficients()
479
+ for i, a in D.items():
480
+ D[i] = K(a)
481
+ return MPolynomial_polydict(self, D)
482
+
483
+ if (set(P.variable_names()).issubset(set(self.variable_names()))
484
+ and self.base_ring().has_coerce_map_from(P.base_ring())):
485
+ # If the named variables are a superset of the input, map the variables by name
486
+ return MPolynomial_polydict(self, self._extract_polydict(x))
487
+
488
+ return MPolynomial_polydict(self,
489
+ x._mpoly_dict_recursive(self.variable_names(),
490
+ self.base_ring()))
491
+
492
+ if isinstance(x, polynomial_element.Polynomial):
493
+ return MPolynomial_polydict(self,
494
+ x._mpoly_dict_recursive(self.variable_names(),
495
+ self.base_ring()))
496
+
497
+ if isinstance(x, PolyDict):
498
+ return MPolynomial_polydict(self, x)
499
+
500
+ if isinstance(x, dict):
501
+ K = self.base_ring()
502
+ return MPolynomial_polydict(self, {i: K(a) for i, a in x.items()})
503
+
504
+ if (isinstance(x, fraction_field_element.FractionFieldElement)
505
+ and x.parent().ring() == self):
506
+ if x.denominator() == 1:
507
+ return x.numerator()
508
+
509
+ raise TypeError("unable to coerce since the denominator is not 1")
510
+
511
+ if isinstance(x, sage.interfaces.abc.SingularElement) and self._has_singular:
512
+ self._singular_().set_ring()
513
+ try:
514
+ return x.sage_poly(self)
515
+ except TypeError:
516
+ raise TypeError("unable to coerce singular object")
517
+
518
+ if hasattr(x, '_polynomial_'):
519
+ return x._polynomial_(self)
520
+
521
+ if isinstance(x, str):
522
+ from sage.misc.sage_eval import sage_eval
523
+ try:
524
+ x = sage_eval(x, self.gens_dict_recursive())
525
+ except NameError:
526
+ raise TypeError("unable to evaluate {!r} in {}".format(x, self))
527
+ return self(x)
528
+
529
+ if isinstance(x, sage.interfaces.abc.Macaulay2Element):
530
+ try:
531
+ s = x.sage_polystring()
532
+ if len(s) == 0:
533
+ raise TypeError
534
+ # NOTE: It's CRUCIAL to use the eval command as follows,
535
+ # i.e., with the gen dict as the third arg and the second
536
+ # empty. Otherwise pickling won't work after calls to this eval!!!
537
+ # This took a while to figure out!
538
+ return self(eval(s, {}, self.gens_dict()))
539
+ except (AttributeError, TypeError, NameError, SyntaxError):
540
+ raise TypeError("Unable to coerce macaulay2 object")
541
+ return MPolynomial_polydict(self, x)
542
+
543
+ if isinstance(x, pari_gen) and x.type() == 't_POL':
544
+ # This recursive approach is needed because PARI
545
+ # represents multivariate polynomials as iterated
546
+ # univariate polynomials. Below, v is the variable
547
+ # with highest priority, and the x[i] are expressions
548
+ # in the remaining variables.
549
+ d = x.poldegree()
550
+ if d.type() == 't_INFINITY':
551
+ return self.zero()
552
+ v = self.gens_dict_recursive()[str(x.variable())]
553
+ return sum(self(x[i]) * v ** i for i in range(d + 1))
554
+
555
+ if isinstance(x, dict):
556
+ return MPolynomial_polydict(self, x)
557
+
558
+ c = self.base_ring()(x)
559
+ return MPolynomial_polydict(self, {self._zero_tuple: c})
560
+
561
+ # The following methods are handy for implementing Groebner
562
+ # basis algorithms. They do only superficial type/sanity checks
563
+ # and should be called carefully.
564
+
565
+ def monomial_quotient(self, f, g, coeff=False):
566
+ r"""
567
+ Return ``f/g``, where both ``f`` and ``g`` are treated as monomials.
568
+
569
+ Coefficients are ignored by default.
570
+
571
+ INPUT:
572
+
573
+ - ``f`` -- monomial
574
+
575
+ - ``g`` -- monomial
576
+
577
+ - ``coeff`` -- divide coefficients as well (default: ``False``)
578
+
579
+ OUTPUT: monomial
580
+
581
+ EXAMPLES::
582
+
583
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
584
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ, 3, order='degrevlex')
585
+ sage: P.monomial_quotient(3/2*x*y, x)
586
+ y
587
+
588
+ ::
589
+
590
+ sage: P.monomial_quotient(3/2*x*y, 2*x, coeff=True)
591
+ 3/4*y
592
+
593
+ TESTS::
594
+
595
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
596
+ sage: R.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
597
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
598
+ sage: P.monomial_quotient(x*y, x)
599
+ y
600
+
601
+ ::
602
+
603
+ sage: P.monomial_quotient(x*y, R.gen())
604
+ y
605
+
606
+ ::
607
+
608
+ sage: P.monomial_quotient(P(0), P(1))
609
+ 0
610
+
611
+ ::
612
+
613
+ sage: P.monomial_quotient(P(1), P(0))
614
+ Traceback (most recent call last):
615
+ ...
616
+ ZeroDivisionError
617
+
618
+ ::
619
+
620
+ sage: P.monomial_quotient(P(3/2), P(2/3), coeff=True)
621
+ 9/4
622
+
623
+ ::
624
+
625
+ sage: P.monomial_quotient(x, y) # Note the wrong result
626
+ x*y^-1
627
+
628
+ ::
629
+
630
+ sage: P.monomial_quotient(x, P(1))
631
+ x
632
+
633
+ .. NOTE::
634
+
635
+ Assumes that the head term of f is a multiple of the head
636
+ term of g and return the multiplicant m. If this rule is
637
+ violated, funny things may happen.
638
+ """
639
+ from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
640
+
641
+ if not f:
642
+ return f
643
+ if not g:
644
+ raise ZeroDivisionError
645
+
646
+ fd = f.monomial_coefficients()
647
+ gd = g.monomial_coefficients()
648
+
649
+ if not coeff:
650
+ f = next(iter(fd))
651
+ g = next(iter(gd))
652
+ coeff = self.base_ring().one()
653
+ else:
654
+ f, cf = next(iter(fd.items()))
655
+ g, cg = next(iter(gd.items()))
656
+ coeff = self.base_ring()(cf / cg)
657
+
658
+ res = f.esub(g)
659
+
660
+ return MPolynomial_polydict(self, PolyDict({res: coeff}))
661
+
662
+ def monomial_lcm(self, f, g):
663
+ """
664
+ LCM for monomials. Coefficients are ignored.
665
+
666
+ INPUT:
667
+
668
+ - ``f`` -- monomial
669
+
670
+ - ``g`` -- monomial
671
+
672
+ OUTPUT: monomial
673
+
674
+ EXAMPLES::
675
+
676
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
677
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
678
+ sage: P.monomial_lcm(3/2*x*y, x)
679
+ x*y
680
+
681
+ TESTS::
682
+
683
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
684
+ sage: R.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
685
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
686
+ sage: P.monomial_lcm(x*y, R.gen())
687
+ x*y
688
+
689
+ ::
690
+
691
+ sage: P.monomial_lcm(P(3/2), P(2/3))
692
+ 1
693
+
694
+ ::
695
+
696
+ sage: P.monomial_lcm(x, P(1))
697
+ x
698
+ """
699
+ one = self.base_ring().one()
700
+
701
+ f, = f.monomial_coefficients()
702
+ g, = g.monomial_coefficients()
703
+
704
+ length = len(f)
705
+
706
+ res = {i: max(f[i], g[i])
707
+ for i in f.common_nonzero_positions(g)}
708
+
709
+ return self(PolyDict({ETuple(res, length): one}))
710
+
711
+ def monomial_reduce(self, f, G):
712
+ r"""
713
+ Try to find a ``g`` in ``G`` where ``g.lm()`` divides ``f``.
714
+
715
+ If found, ``(flt,g)`` is returned, ``(0,0)`` otherwise, where
716
+ ``flt`` is ``f/g.lm()``. It is assumed that ``G`` is iterable and contains
717
+ ONLY elements in this ring.
718
+
719
+ INPUT:
720
+
721
+ - ``f`` -- monomial
722
+
723
+ - ``G`` -- list/set of mpolynomials
724
+
725
+ EXAMPLES::
726
+
727
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
728
+ sage: P.<x,y,z>=MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
729
+ sage: f = x*y^2
730
+ sage: G = [3/2*x^3 + y^2 + 1/2, 1/4*x*y + 2/7, P(1/2)]
731
+ sage: P.monomial_reduce(f,G)
732
+ (y, 1/4*x*y + 2/7)
733
+
734
+ ::
735
+
736
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
737
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(Zmod(23432),3, order='degrevlex')
738
+ sage: f = x*y^2
739
+ sage: G = [3*x^3 + y^2 + 2, 4*x*y + 7, P(2)]
740
+ sage: P.monomial_reduce(f,G)
741
+ (y, 4*x*y + 7)
742
+
743
+ TESTS::
744
+
745
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
746
+ sage: P.<x,y,z>=MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
747
+ sage: f = x*y^2
748
+ sage: G = [3/2*x^3 + y^2 + 1/2, 1/4*x*y + 2/7, P(1/2)]
749
+
750
+ ::
751
+
752
+ sage: P.monomial_reduce(P(0),G)
753
+ (0, 0)
754
+
755
+ ::
756
+
757
+ sage: P.monomial_reduce(f,[P(0)])
758
+ (0, 0)
759
+ """
760
+ if not f:
761
+ return 0, 0
762
+ for g in G:
763
+ t = g.lm()
764
+ try:
765
+ if self.monomial_divides(t, f):
766
+ return self.monomial_quotient(f, t), g
767
+ except ZeroDivisionError:
768
+ return 0, 0
769
+ return 0, 0
770
+
771
+ def monomial_divides(self, a, b):
772
+ """
773
+ Return ``False`` if ``a`` does not divide ``b`` and ``True`` otherwise.
774
+
775
+ INPUT:
776
+
777
+ - ``a`` -- monomial
778
+
779
+ - ``b`` -- monomial
780
+
781
+ OUTPUT: boolean
782
+
783
+ EXAMPLES::
784
+
785
+ sage: P.<x,y,z> = PolynomialRing(ZZ,3, order='degrevlex')
786
+ sage: P.monomial_divides(x*y*z, x^3*y^2*z^4)
787
+ True
788
+ sage: P.monomial_divides(x^3*y^2*z^4, x*y*z)
789
+ False
790
+
791
+ TESTS::
792
+
793
+ sage: P.<x,y,z> = PolynomialRing(ZZ,3, order='degrevlex')
794
+ sage: P.monomial_divides(P(1), P(0))
795
+ True
796
+ sage: P.monomial_divides(P(1), x)
797
+ True
798
+ """
799
+ if not b:
800
+ return True
801
+ if not a:
802
+ raise ZeroDivisionError
803
+
804
+ a, = a.monomial_coefficients()
805
+ b, = b.monomial_coefficients()
806
+
807
+ return all(b[i] >= a[i]
808
+ for i in b.common_nonzero_positions(a))
809
+
810
+ def monomial_pairwise_prime(self, h, g):
811
+ r"""
812
+ Return ``True`` if ``h`` and ``g`` are pairwise prime.
813
+
814
+ Both are treated as monomials.
815
+
816
+ INPUT:
817
+
818
+ - ``h`` -- monomial
819
+
820
+ - ``g`` -- monomial
821
+
822
+ OUTPUT: boolean
823
+
824
+ EXAMPLES::
825
+
826
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
827
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
828
+ sage: P.monomial_pairwise_prime(x^2*z^3, y^4)
829
+ True
830
+
831
+ ::
832
+
833
+ sage: P.monomial_pairwise_prime(1/2*x^3*y^2, 3/4*y^3)
834
+ False
835
+
836
+ TESTS::
837
+
838
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
839
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
840
+ sage: Q.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
841
+ sage: P.monomial_pairwise_prime(x^2*z^3, Q('y^4'))
842
+ True
843
+
844
+ ::
845
+
846
+ sage: P.monomial_pairwise_prime(1/2*x^3*y^2, Q(0))
847
+ True
848
+
849
+ ::
850
+
851
+ sage: P.monomial_pairwise_prime(P(1/2),x)
852
+ False
853
+ """
854
+ not_g = not g
855
+ not_h = not h
856
+ if not_g and not_h: # GCD(0,0) = 0
857
+ return False
858
+ if not_g or not_h: # GCD(x,0) = 1
859
+ return True
860
+ return self.monomial_lcm(g, h) == g * h
861
+
862
+ def monomial_all_divisors(self, t):
863
+ r"""
864
+ Return a list of all monomials that divide ``t``, coefficients are
865
+ ignored.
866
+
867
+ INPUT:
868
+
869
+ - ``t`` -- a monomial
870
+
871
+ OUTPUT: list of monomials
872
+
873
+ EXAMPLES::
874
+
875
+ sage: from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict_domain
876
+ sage: P.<x,y,z> = MPolynomialRing_polydict_domain(QQ,3, order='degrevlex')
877
+ sage: P.monomial_all_divisors(x^2*z^3)
878
+ [x, x^2, z, x*z, x^2*z, z^2, x*z^2, x^2*z^2, z^3, x*z^3, x^2*z^3]
879
+
880
+ ALGORITHM: addwithcarry idea by Toon Segers
881
+ """
882
+
883
+ def addwithcarry(tempvector, maxvector, pos):
884
+ if tempvector[pos] < maxvector[pos]:
885
+ tempvector[pos] += 1
886
+ else:
887
+ tempvector[pos] = 0
888
+ tempvector = addwithcarry(tempvector, maxvector, pos + 1)
889
+ return tempvector
890
+
891
+ if not t.is_monomial():
892
+ raise TypeError("only monomials are supported")
893
+
894
+ R = self
895
+ one = self.base_ring().one()
896
+ M = list()
897
+
898
+ v, = t.monomial_coefficients()
899
+ maxvector = list(v)
900
+
901
+ tempvector = [0] * len(maxvector)
902
+
903
+ pos = 0
904
+
905
+ while tempvector != maxvector:
906
+ tempvector = addwithcarry(list(tempvector), maxvector, pos)
907
+ M.append(R(PolyDict({ETuple(tempvector): one})))
908
+ return M
909
+
910
+ def sum(self, terms):
911
+ r"""
912
+ Return a sum of elements of this multipolynomial ring.
913
+
914
+ This is method is much faster than the Python builtin :func:`sum`.
915
+
916
+ EXAMPLES::
917
+
918
+ sage: R = QQ['x']
919
+ sage: S = R['y, z']
920
+ sage: x = R.gen()
921
+ sage: y, z = S.gens()
922
+ sage: S.sum([x*y, 2*x^2*z - 2*x*y, 1 + y + z])
923
+ (-x + 1)*y + (2*x^2 + 1)*z + 1
924
+
925
+ Comparison with builtin :func:`sum`::
926
+
927
+ sage: sum([x*y, 2*x^2*z - 2*x*y, 1 + y + z])
928
+ (-x + 1)*y + (2*x^2 + 1)*z + 1
929
+ """
930
+ elt = PolyDict({}, check=False)
931
+ for t in terms:
932
+ elt += self(t).element()
933
+ # NOTE: here we should be using self.element_class but
934
+ # polynomial rings are not yet compliant with categories...
935
+ from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
936
+ return MPolynomial_polydict(self, elt)
937
+
938
+
939
+ class MPolynomialRing_polydict_domain(MPolynomialRing_polydict):
940
+ def __init__(self, base_ring, n, names, order):
941
+ order = TermOrder(order, n)
942
+ MPolynomialRing_polydict.__init__(self, base_ring, n, names, order)
943
+
944
+ def is_field(self, proof=True):
945
+ if self.ngens() == 0:
946
+ return self.base_ring().is_field(proof)
947
+ return False