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,728 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Quotient fields
4
+ """
5
+ #*****************************************************************************
6
+ # Copyright (C) 2008 Teresa Gomez-Diaz (CNRS) <Teresa.Gomez-Diaz@univ-mlv.fr>
7
+ #
8
+ # Distributed under the terms of the GNU General Public License (GPL)
9
+ # http://www.gnu.org/licenses/
10
+ #******************************************************************************
11
+
12
+ from sage.categories.category_singleton import Category_singleton
13
+ from sage.misc.abstract_method import abstract_method
14
+ from sage.categories.fields import Fields
15
+
16
+ from sage.structure.element import coerce_binop
17
+
18
+
19
+ class QuotientFields(Category_singleton):
20
+ """
21
+ The category of quotient fields over an integral domain.
22
+
23
+ EXAMPLES::
24
+
25
+ sage: QuotientFields()
26
+ Category of quotient fields
27
+ sage: QuotientFields().super_categories()
28
+ [Category of fields]
29
+
30
+ TESTS::
31
+
32
+ sage: TestSuite(QuotientFields()).run()
33
+ """
34
+
35
+ def super_categories(self):
36
+ """
37
+ EXAMPLES::
38
+
39
+ sage: QuotientFields().super_categories()
40
+ [Category of fields]
41
+ """
42
+ return [Fields()]
43
+
44
+ class ParentMethods:
45
+ pass
46
+
47
+ class ElementMethods:
48
+
49
+ @abstract_method
50
+ def numerator(self):
51
+ pass
52
+
53
+ @abstract_method
54
+ def denominator(self):
55
+ pass
56
+
57
+ @coerce_binop
58
+ def gcd(self, other):
59
+ """
60
+ Greatest common divisor.
61
+
62
+ .. NOTE::
63
+
64
+ In a field, the greatest common divisor is not very informative,
65
+ as it is only determined up to a unit. But in the fraction field
66
+ of an integral domain that provides both gcd and lcm, it is
67
+ possible to be a bit more specific and define the gcd uniquely
68
+ up to a unit of the base ring (rather than in the fraction
69
+ field).
70
+
71
+ AUTHOR:
72
+
73
+ - Simon King (2011-02): See :issue:`10771`
74
+
75
+ EXAMPLES::
76
+
77
+ sage: # needs sage.libs.pari
78
+ sage: R.<x> = QQ['x']
79
+ sage: p = (1+x)^3*(1+2*x^2)/(1-x^5)
80
+ sage: q = (1+x)^2*(1+3*x^2)/(1-x^4)
81
+ sage: factor(p)
82
+ (-2) * (x - 1)^-1 * (x + 1)^3 * (x^2 + 1/2) * (x^4 + x^3 + x^2 + x + 1)^-1
83
+ sage: factor(q)
84
+ (-3) * (x - 1)^-1 * (x + 1) * (x^2 + 1)^-1 * (x^2 + 1/3)
85
+ sage: gcd(p, q)
86
+ (x + 1)/(x^7 + x^5 - x^2 - 1)
87
+ sage: factor(gcd(p, q))
88
+ (x - 1)^-1 * (x + 1) * (x^2 + 1)^-1 * (x^4 + x^3 + x^2 + x + 1)^-1
89
+ sage: factor(gcd(p, 1 + x))
90
+ (x - 1)^-1 * (x + 1) * (x^4 + x^3 + x^2 + x + 1)^-1
91
+ sage: factor(gcd(1 + x, q))
92
+ (x - 1)^-1 * (x + 1) * (x^2 + 1)^-1
93
+
94
+ TESTS:
95
+
96
+ The following tests that the fraction field returns a correct gcd
97
+ even if the base ring does not provide lcm and gcd::
98
+
99
+ sage: # needs sage.libs.pari sage.rings.number_field
100
+ sage: R = ZZ.extension(x^2 + 1, names='i')
101
+ sage: i = R.1
102
+ sage: gcd(5, 3 + 4*i)
103
+ 2*i - 1
104
+ sage: P.<t> = R[]
105
+ sage: gcd(t, i)
106
+ Traceback (most recent call last):
107
+ ...
108
+ NotImplementedError: Gaussian Integers generated by i
109
+ in Number Field in i with defining polynomial x^2 + 1
110
+ does not provide a gcd implementation for univariate polynomials
111
+ sage: q = t/(t + 1); q.parent()
112
+ Fraction Field of Univariate Polynomial Ring in t over Gaussian Integers
113
+ generated by i in Number Field in i with defining polynomial x^2 + 1
114
+ sage: gcd(q, q)
115
+ 1
116
+ sage: q.gcd(0)
117
+ 1
118
+ sage: (q*0).gcd(0)
119
+ 0
120
+ """
121
+ P = self.parent()
122
+ try:
123
+ selfN = self.numerator()
124
+ selfD = self.denominator()
125
+ selfGCD = selfN.gcd(selfD)
126
+ otherN = other.numerator()
127
+ otherD = other.denominator()
128
+ otherGCD = otherN.gcd(otherD)
129
+ selfN = selfN // selfGCD
130
+ selfD = selfD // selfGCD
131
+ otherN = otherN // otherGCD
132
+ otherD = otherD // otherGCD
133
+ tmp = P(selfN.gcd(otherN))/P(selfD.lcm(otherD))
134
+ return tmp
135
+ except (AttributeError, NotImplementedError, TypeError, ValueError):
136
+ zero = P.zero()
137
+ if self == zero and other == zero:
138
+ return zero
139
+ return P.one()
140
+
141
+ @coerce_binop
142
+ def lcm(self, other):
143
+ """
144
+ Least common multiple.
145
+
146
+ In a field, the least common multiple is not very informative, as it
147
+ is only determined up to a unit. But in the fraction field of an
148
+ integral domain that provides both gcd and lcm, it is reasonable to
149
+ be a bit more specific and to define the least common multiple so
150
+ that it restricts to the usual least common multiple in the base
151
+ ring and is unique up to a unit of the base ring (rather than up to
152
+ a unit of the fraction field).
153
+
154
+ The least common multiple is easily described in terms of the
155
+ prime decomposition. A rational number can be written as a product
156
+ of primes with integer (positive or negative) powers in a unique
157
+ way. The least common multiple of two rational numbers `x` and `y`
158
+ can then be defined by specifying that the exponent of every prime
159
+ `p` in `lcm(x,y)` is the supremum of the exponents of `p` in `x`,
160
+ and the exponent of `p` in `y` (where the primes that does not
161
+ appear in the decomposition of `x` or `y` are considered to have
162
+ exponent zero).
163
+
164
+
165
+ AUTHOR:
166
+
167
+ - Simon King (2011-02): See :issue:`10771`
168
+
169
+ EXAMPLES::
170
+
171
+ sage: lcm(2/3, 1/5)
172
+ 2
173
+
174
+ Indeed `2/3 = 2^1 3^{-1} 5^0` and `1/5 = 2^0 3^0
175
+ 5^{-1}`, so `lcm(2/3,1/5)= 2^1 3^0 5^0 = 2`.
176
+
177
+ sage: lcm(1/3, 1/5)
178
+ 1
179
+ sage: lcm(1/3, 1/6)
180
+ 1/3
181
+
182
+ Some more involved examples::
183
+
184
+ sage: # needs sage.libs.pari
185
+ sage: R.<x> = QQ[]
186
+ sage: p = (1+x)^3*(1+2*x^2)/(1-x^5)
187
+ sage: q = (1+x)^2*(1+3*x^2)/(1-x^4)
188
+ sage: factor(p)
189
+ (-2) * (x - 1)^-1 * (x + 1)^3 * (x^2 + 1/2) * (x^4 + x^3 + x^2 + x + 1)^-1
190
+ sage: factor(q)
191
+ (-3) * (x - 1)^-1 * (x + 1) * (x^2 + 1)^-1 * (x^2 + 1/3)
192
+ sage: factor(lcm(p, q))
193
+ (x - 1)^-1 * (x + 1)^3 * (x^2 + 1/3) * (x^2 + 1/2)
194
+ sage: factor(lcm(p, 1 + x))
195
+ (x + 1)^3 * (x^2 + 1/2)
196
+ sage: factor(lcm(1 + x, q))
197
+ (x + 1) * (x^2 + 1/3)
198
+
199
+ TESTS:
200
+
201
+ The following tests that the fraction field returns a correct lcm
202
+ even if the base ring does not provide lcm and gcd::
203
+
204
+ sage: # needs sage.libs.pari sage.rings.number_field
205
+ sage: R = ZZ.extension(x^2+1, names='i')
206
+ sage: i = R.1
207
+ sage: P.<t> = R[]
208
+ sage: lcm(t, i)
209
+ Traceback (most recent call last):
210
+ ...
211
+ NotImplementedError: Gaussian Integers generated by i in Number Field in i
212
+ with defining polynomial x^2 + 1 does not provide a gcd implementation for
213
+ univariate polynomials
214
+ sage: q = t/(t + 1); q.parent()
215
+ Fraction Field of Univariate Polynomial Ring in t over
216
+ Gaussian Integers generated by i in Number Field in i
217
+ with defining polynomial x^2 + 1
218
+ sage: lcm(q, q)
219
+ 1
220
+ sage: q.lcm(0)
221
+ 0
222
+ sage: (q*0).lcm(0)
223
+ 0
224
+
225
+ Check that it is possible to take lcm of a rational and an integer
226
+ (:issue:`17852`)::
227
+
228
+ sage: (1/2).lcm(2)
229
+ 2
230
+ sage: type((1/2).lcm(2))
231
+ <class 'sage.rings.rational.Rational'>
232
+ """
233
+ P = self.parent()
234
+ try:
235
+ selfN = self.numerator()
236
+ selfD = self.denominator()
237
+ selfGCD = selfN.gcd(selfD)
238
+ otherN = other.numerator()
239
+ otherD = other.denominator()
240
+ otherGCD = otherN.gcd(otherD)
241
+ selfN = selfN // selfGCD
242
+ selfD = selfD // selfGCD
243
+ otherN = otherN // otherGCD
244
+ otherD = otherD // otherGCD
245
+ return P(selfN.lcm(otherN))/P(selfD.gcd(otherD))
246
+ except (AttributeError, NotImplementedError, TypeError, ValueError):
247
+ zero = P.zero()
248
+ if self == zero or other == zero:
249
+ return zero
250
+ return P.one()
251
+
252
+ @coerce_binop
253
+ def xgcd(self, other):
254
+ """
255
+ Return a triple ``(g,s,t)`` of elements of that field such that
256
+ ``g`` is the greatest common divisor of ``self`` and ``other`` and
257
+ ``g = s*self + t*other``.
258
+
259
+ .. NOTE::
260
+
261
+ In a field, the greatest common divisor is not very informative,
262
+ as it is only determined up to a unit. But in the fraction field
263
+ of an integral domain that provides both xgcd and lcm, it is
264
+ possible to be a bit more specific and define the gcd uniquely
265
+ up to a unit of the base ring (rather than in the fraction
266
+ field).
267
+
268
+ EXAMPLES::
269
+
270
+ sage: QQ(3).xgcd(QQ(2))
271
+ (1, 1, -1)
272
+ sage: QQ(3).xgcd(QQ(1/2))
273
+ (1/2, 0, 1)
274
+ sage: QQ(1/3).xgcd(QQ(2))
275
+ (1/3, 1, 0)
276
+ sage: QQ(3/2).xgcd(QQ(5/2))
277
+ (1/2, 2, -1)
278
+
279
+ sage: R.<x> = QQ['x']
280
+ sage: p = (1+x)^3*(1+2*x^2)/(1-x^5)
281
+ sage: q = (1+x)^2*(1+3*x^2)/(1-x^4)
282
+ sage: factor(p) # needs sage.libs.pari
283
+ (-2) * (x - 1)^-1 * (x + 1)^3 * (x^2 + 1/2) * (x^4 + x^3 + x^2 + x + 1)^-1
284
+ sage: factor(q) # needs sage.libs.pari
285
+ (-3) * (x - 1)^-1 * (x + 1) * (x^2 + 1)^-1 * (x^2 + 1/3)
286
+ sage: g, s, t = xgcd(p, q)
287
+ sage: g
288
+ (x + 1)/(x^7 + x^5 - x^2 - 1)
289
+ sage: g == s*p + t*q
290
+ True
291
+
292
+ An example without a well defined gcd or xgcd on its base ring::
293
+
294
+ sage: # needs sage.rings.number_field
295
+ sage: K = QuadraticField(5)
296
+ sage: O = K.maximal_order()
297
+ sage: R = PolynomialRing(O, 'x')
298
+ sage: F = R.fraction_field()
299
+ sage: x = F.gen(0)
300
+ sage: x.gcd(x+1)
301
+ 1
302
+ sage: x.xgcd(x+1)
303
+ (1, 1/x, 0)
304
+ sage: zero = F.zero()
305
+ sage: zero.gcd(x)
306
+ 1
307
+ sage: zero.xgcd(x)
308
+ (1, 0, 1/x)
309
+ sage: zero.xgcd(zero)
310
+ (0, 0, 0)
311
+ """
312
+ P = self.parent()
313
+ try:
314
+ selfN = self.numerator()
315
+ selfD = self.denominator()
316
+ selfGCD = selfN.gcd(selfD)
317
+
318
+ otherN = other.numerator()
319
+ otherD = other.denominator()
320
+ otherGCD = otherN.gcd(otherD)
321
+
322
+ selfN = selfN // selfGCD
323
+ selfD = selfD // selfGCD
324
+ otherN = otherN // otherGCD
325
+ otherD = otherD // otherGCD
326
+
327
+ lcmD = selfD.lcm(otherD)
328
+ g,s,t = selfN.xgcd(otherN)
329
+ return (P(g)/P(lcmD), P(s*selfD)/P(lcmD),P(t*otherD)/P(lcmD))
330
+ except (AttributeError, NotImplementedError, TypeError, ValueError):
331
+ zero = self.parent().zero()
332
+ one = self.parent().one()
333
+ if self != zero:
334
+ return (one, ~self, zero)
335
+ elif other != zero:
336
+ return (one, zero, ~other)
337
+ else:
338
+ return (zero, zero, zero)
339
+
340
+ def factor(self, *args, **kwds):
341
+ """
342
+ Return the factorization of ``self`` over the base ring.
343
+
344
+ INPUT:
345
+
346
+ - ``*args`` -- arbitrary arguments suitable over the base ring
347
+ - ``**kwds`` -- arbitrary keyword arguments suitable over the base ring
348
+
349
+ OUTPUT: factorization of ``self`` over the base ring
350
+
351
+ EXAMPLES::
352
+
353
+ sage: K.<x> = QQ[]
354
+ sage: f = (x^3+x)/(x-3)
355
+ sage: f.factor() # needs sage.libs.pari
356
+ (x - 3)^-1 * x * (x^2 + 1)
357
+
358
+ Here is an example to show that :issue:`7868` has been resolved::
359
+
360
+ sage: R.<x,y> = GF(2)[]
361
+ sage: f = x*y/(x+y) # needs sage.libs.singular
362
+ sage: f.factor() # needs sage.libs.singular
363
+ (x + y)^-1 * y * x
364
+ """
365
+ return (self.numerator().factor(*args, **kwds) /
366
+ self.denominator().factor(*args, **kwds))
367
+
368
+ def partial_fraction_decomposition(self, decompose_powers=True):
369
+ """
370
+ Decompose fraction field element into a whole part and a list of
371
+ fraction field elements over prime power denominators.
372
+
373
+ The sum will be equal to the original fraction.
374
+
375
+ INPUT:
376
+
377
+ - ``decompose_powers`` -- boolean (default: ``True``);
378
+ whether to decompose prime power denominators as opposed to having
379
+ a single term for each irreducible factor of the denominator
380
+
381
+ OUTPUT: partial fraction decomposition of ``self`` over the base ring
382
+
383
+ AUTHORS:
384
+
385
+ - Robert Bradshaw (2007-05-31)
386
+
387
+ EXAMPLES::
388
+
389
+ sage: # needs sage.libs.pari
390
+ sage: S.<t> = QQ[]
391
+ sage: q = 1/(t+1) + 2/(t+2) + 3/(t-3); q
392
+ (6*t^2 + 4*t - 6)/(t^3 - 7*t - 6)
393
+ sage: whole, parts = q.partial_fraction_decomposition(); parts
394
+ [3/(t - 3), 1/(t + 1), 2/(t + 2)]
395
+ sage: sum(parts) == q
396
+ True
397
+ sage: q = 1/(t^3+1) + 2/(t^2+2) + 3/(t-3)^5
398
+ sage: whole, parts = q.partial_fraction_decomposition(); parts
399
+ [1/3/(t + 1), 3/(t^5 - 15*t^4 + 90*t^3 - 270*t^2 + 405*t - 243),
400
+ (-1/3*t + 2/3)/(t^2 - t + 1), 2/(t^2 + 2)]
401
+ sage: sum(parts) == q
402
+ True
403
+ sage: q = 2*t / (t + 3)^2
404
+ sage: q.partial_fraction_decomposition()
405
+ (0, [2/(t + 3), -6/(t^2 + 6*t + 9)])
406
+ sage: for p in q.partial_fraction_decomposition()[1]:
407
+ ....: print(p.factor())
408
+ (2) * (t + 3)^-1
409
+ (-6) * (t + 3)^-2
410
+ sage: q.partial_fraction_decomposition(decompose_powers=False)
411
+ (0, [2*t/(t^2 + 6*t + 9)])
412
+
413
+ We can decompose over a given algebraic extension::
414
+
415
+ sage: R.<x> = QQ[sqrt(2)][] # needs fpylll sage.rings.number_field sage.symbolic
416
+ sage: r = 1/(x^4+1) # needs fpylll sage.rings.number_field sage.symbolic
417
+ sage: r.partial_fraction_decomposition() # needs fpylll sage.rings.number_field sage.symbolic
418
+ (0,
419
+ [(-1/4*sqrt2*x + 1/2)/(x^2 - sqrt2*x + 1),
420
+ (1/4*sqrt2*x + 1/2)/(x^2 + sqrt2*x + 1)])
421
+
422
+ sage: R.<x> = QQ[I][] # of QQ[sqrt(-1)] # needs fpylll sage.rings.number_field sage.symbolic
423
+ sage: r = 1/(x^4+1) # needs fpylll sage.rings.number_field sage.symbolic
424
+ sage: r.partial_fraction_decomposition() # needs fpylll sage.rings.number_field sage.symbolic
425
+ (0, [(-1/2*I)/(x^2 - I), 1/2*I/(x^2 + I)])
426
+
427
+ We can also ask Sage to find the least extension where the
428
+ denominator factors in linear terms::
429
+
430
+ sage: # needs sage.rings.number_field
431
+ sage: R.<x> = QQ[]
432
+ sage: r = 1/(x^4+2)
433
+ sage: N = r.denominator().splitting_field('a'); N
434
+ Number Field in a with defining polynomial x^8 - 8*x^6 + 28*x^4 + 16*x^2 + 36
435
+ sage: R1.<x1> = N[]
436
+ sage: r1 = 1/(x1^4+2)
437
+ sage: r1.partial_fraction_decomposition()
438
+ (0,
439
+ [(-1/224*a^6 + 13/448*a^4 - 5/56*a^2 - 25/224)/(x1 - 1/28*a^6 + 13/56*a^4 - 5/7*a^2 - 25/28),
440
+ (1/224*a^6 - 13/448*a^4 + 5/56*a^2 + 25/224)/(x1 + 1/28*a^6 - 13/56*a^4 + 5/7*a^2 + 25/28),
441
+ (-5/1344*a^7 + 43/1344*a^5 - 85/672*a^3 - 31/672*a)/(x1 - 5/168*a^7 + 43/168*a^5 - 85/84*a^3 - 31/84*a),
442
+ (5/1344*a^7 - 43/1344*a^5 + 85/672*a^3 + 31/672*a)/(x1 + 5/168*a^7 - 43/168*a^5 + 85/84*a^3 + 31/84*a)])
443
+
444
+ Or we may work directly over an algebraically closed field::
445
+
446
+ sage: R.<x> = QQbar[] # needs sage.rings.number_field
447
+ sage: r = 1/(x^4+1) # needs sage.rings.number_field
448
+ sage: r.partial_fraction_decomposition() # needs sage.rings.number_field
449
+ (0,
450
+ [(-0.1767766952966369? - 0.1767766952966369?*I)/(x - 0.7071067811865475? - 0.7071067811865475?*I),
451
+ (-0.1767766952966369? + 0.1767766952966369?*I)/(x - 0.7071067811865475? + 0.7071067811865475?*I),
452
+ (0.1767766952966369? - 0.1767766952966369?*I)/(x + 0.7071067811865475? - 0.7071067811865475?*I),
453
+ (0.1767766952966369? + 0.1767766952966369?*I)/(x + 0.7071067811865475? + 0.7071067811865475?*I)])
454
+
455
+ We do the best we can over inexact fields::
456
+
457
+ sage: # needs sage.rings.number_field sage.rings.real_mpfr
458
+ sage: R.<x> = RealField(20)[]
459
+ sage: q = 1/(x^2 + x + 2)^2 + 1/(x-1); q
460
+ (x^4 + 2.0000*x^3
461
+ + 5.0000*x^2 + 5.0000*x + 3.0000)/(x^5 + x^4 + 3.0000*x^3 - x^2 - 4.0000)
462
+ sage: whole, parts = q.partial_fraction_decomposition(); parts
463
+ [1.0000/(x - 1.0000),
464
+ 1.0000/(x^4 + 2.0000*x^3 + 5.0000*x^2 + 4.0000*x + 4.0000)]
465
+ sage: sum(parts)
466
+ (x^4 + 2.0000*x^3
467
+ + 5.0000*x^2 + 5.0000*x + 3.0000)/(x^5 + x^4 + 3.0000*x^3 - x^2 - 4.0000)
468
+
469
+ TESTS:
470
+
471
+ We test partial fraction for irreducible denominators::
472
+
473
+ sage: R.<x> = ZZ[]
474
+ sage: q = x^2/(x-1)
475
+ sage: q.partial_fraction_decomposition() # needs sage.libs.pari
476
+ (x + 1, [1/(x - 1)])
477
+ sage: q = x^10/(x-1)^5
478
+ sage: whole, parts = q.partial_fraction_decomposition() # needs sage.libs.pari
479
+ sage: whole + sum(parts) == q # needs sage.libs.pari
480
+ True
481
+
482
+ And also over finite fields (see :issue:`6052`, :issue:`9945`)::
483
+
484
+ sage: R.<x> = GF(2)[]
485
+ sage: q = (x+1)/(x^3+x+1)
486
+ sage: q.partial_fraction_decomposition() # needs sage.libs.pari
487
+ (0, [(x + 1)/(x^3 + x + 1)])
488
+
489
+ sage: R.<x> = GF(11)[]
490
+ sage: q = x + 1 + 1/(x+1) + x^2/(x^3 + 2*x + 9)
491
+ sage: q.partial_fraction_decomposition() # needs sage.libs.pari
492
+ (x + 1, [1/(x + 1), x^2/(x^3 + 2*x + 9)])
493
+
494
+ And even the rationals::
495
+
496
+ sage: (26/15).partial_fraction_decomposition()
497
+ (1, [1/3, 2/5])
498
+ sage: (26/75).partial_fraction_decomposition()
499
+ (-1, [2/3, 3/5, 2/25])
500
+
501
+ A larger example::
502
+
503
+ sage: S.<t> = QQ[]
504
+ sage: r = t / (t^3+1)^5
505
+ sage: r.partial_fraction_decomposition() # needs sage.libs.pari
506
+ (0,
507
+ [-35/729/(t + 1),
508
+ -35/729/(t^2 + 2*t + 1),
509
+ -25/729/(t^3 + 3*t^2 + 3*t + 1),
510
+ -4/243/(t^4 + 4*t^3 + 6*t^2 + 4*t + 1),
511
+ -1/243/(t^5 + 5*t^4 + 10*t^3 + 10*t^2 + 5*t + 1),
512
+ (35/729*t - 35/729)/(t^2 - t + 1),
513
+ (25/729*t - 8/729)/(t^4 - 2*t^3 + 3*t^2 - 2*t + 1),
514
+ (-1/81*t + 5/81)/(t^6 - 3*t^5 + 6*t^4 - 7*t^3 + 6*t^2 - 3*t + 1),
515
+ (-2/27*t + 1/9)/(t^8 - 4*t^7 + 10*t^6 - 16*t^5 + 19*t^4 - 16*t^3 + 10*t^2 - 4*t + 1),
516
+ (-2/27*t + 1/27)/(t^10 - 5*t^9 + 15*t^8 - 30*t^7 + 45*t^6 - 51*t^5 + 45*t^4 - 30*t^3 + 15*t^2 - 5*t + 1)])
517
+ sage: sum(r.partial_fraction_decomposition()[1]) == r # needs sage.libs.pari
518
+ True
519
+
520
+ Some special cases::
521
+
522
+ sage: R = Frac(QQ['x']); x = R.gen()
523
+ sage: x.partial_fraction_decomposition()
524
+ (x, [])
525
+ sage: R(0).partial_fraction_decomposition()
526
+ (0, [])
527
+ sage: R(1).partial_fraction_decomposition()
528
+ (1, [])
529
+ sage: (1/x).partial_fraction_decomposition() # needs sage.libs.pari
530
+ (0, [1/x])
531
+ sage: (1/x+1/x^3).partial_fraction_decomposition() # needs sage.libs.pari
532
+ (0, [1/x, 1/x^3])
533
+
534
+ This was fixed in :issue:`16240`::
535
+
536
+ sage: # needs sage.libs.pari
537
+ sage: R.<x> = QQ['x']
538
+ sage: p = 1/(-x + 1)
539
+ sage: whole, parts = p.partial_fraction_decomposition()
540
+ sage: p == sum(parts)
541
+ True
542
+ sage: p = 3/(-x^4 + 1)
543
+ sage: whole, parts = p.partial_fraction_decomposition()
544
+ sage: p == sum(parts)
545
+ True
546
+ sage: p = (6*x^2 - 9*x + 5)/(-x^3 + 3*x^2 - 3*x + 1)
547
+ sage: whole, parts = p.partial_fraction_decomposition()
548
+ sage: p == sum(parts)
549
+ True
550
+ """
551
+ denom = self.denominator()
552
+ whole, numer = self.numerator().quo_rem(denom)
553
+ factors = denom.factor()
554
+ if not self.parent().is_exact():
555
+ # factors not grouped in this case
556
+ all = {}
557
+ for r in factors:
558
+ all[r[0]] = 0
559
+ for r in factors:
560
+ all[r[0]] += r[1]
561
+ factors = sorted(all.items())
562
+
563
+ # TODO(robertwb): Should there be a category of univariate polynomials?
564
+ from sage.rings.fraction_field_element import FractionFieldElement_1poly_field
565
+ is_polynomial_over_field = isinstance(self, FractionFieldElement_1poly_field)
566
+
567
+ running_total = 0
568
+ parts = []
569
+ for r, e in factors:
570
+ powers = [1]
571
+ for ee in range(e):
572
+ powers.append(powers[-1] * r)
573
+ d = powers[e]
574
+ denom_div_d = denom // d
575
+ # We know the inverse exists as the two are relatively prime.
576
+ n = ((numer % d) * denom_div_d.inverse_mod(d)) % d
577
+ if not is_polynomial_over_field:
578
+ running_total += n * denom_div_d
579
+ # If the multiplicity is not one, further reduce.
580
+ if decompose_powers:
581
+ r_parts = []
582
+ for ee in range(e, 0, -1):
583
+ n, n_part = n.quo_rem(r)
584
+ if n_part:
585
+ r_parts.append(n_part/powers[ee])
586
+ parts.extend(reversed(r_parts))
587
+ else:
588
+ parts.append(n/powers[e])
589
+
590
+ if not is_polynomial_over_field:
591
+ # remainders not unique, need to re-compute whole to take into
592
+ # account this freedom
593
+ whole = (self.numerator() - running_total) // denom
594
+ return whole, parts
595
+
596
+ def derivative(self, *args):
597
+ r"""
598
+ The derivative of this rational function, with respect to variables
599
+ supplied in args.
600
+
601
+ Multiple variables and iteration counts may be supplied; see
602
+ documentation for the global derivative() function for more
603
+ details.
604
+
605
+ .. SEEALSO::
606
+
607
+ :meth:`_derivative`
608
+
609
+ EXAMPLES::
610
+
611
+ sage: F.<x> = Frac(QQ['x'])
612
+ sage: (1/x).derivative()
613
+ -1/x^2
614
+
615
+ ::
616
+
617
+ sage: (x+1/x).derivative(x, 2)
618
+ 2/x^3
619
+
620
+ ::
621
+
622
+ sage: F.<x,y> = Frac(QQ['x,y'])
623
+ sage: (1/(x+y)).derivative(x,y) # needs sage.libs.singular
624
+ 2/(x^3 + 3*x^2*y + 3*x*y^2 + y^3)
625
+ """
626
+ from sage.misc.derivative import multi_derivative
627
+ return multi_derivative(self, args)
628
+
629
+ def _derivative(self, var=None):
630
+ r"""
631
+ Return the derivative of this rational function with respect to the
632
+ variable ``var``.
633
+
634
+ Over a ring with a working gcd implementation, the derivative of a
635
+ fraction `f/g`, supposed to be given in lowest terms, is computed as
636
+ `(f'(g/d) - f(g'/d))/(g(g'/d))`, where `d` is a greatest common
637
+ divisor of `f` and `g`.
638
+
639
+ INPUT:
640
+
641
+ - ``var`` -- variable with respect to which the derivative is computed
642
+
643
+ OUTPUT: derivative of ``self`` with respect to ``var``
644
+
645
+ .. SEEALSO::
646
+
647
+ :meth:`derivative`
648
+
649
+ EXAMPLES::
650
+
651
+ sage: F.<x> = Frac(QQ['x'])
652
+ sage: t = 1/x^2
653
+ sage: t._derivative(x)
654
+ -2/x^3
655
+ sage: t.derivative()
656
+ -2/x^3
657
+
658
+ ::
659
+
660
+ sage: # needs sage.libs.singular
661
+ sage: F.<x,y> = Frac(QQ['x,y'])
662
+ sage: t = (x*y/(x+y))
663
+ sage: t._derivative(x)
664
+ y^2/(x^2 + 2*x*y + y^2)
665
+ sage: t._derivative(y)
666
+ x^2/(x^2 + 2*x*y + y^2)
667
+
668
+ TESTS::
669
+
670
+ sage: F.<t> = Frac(ZZ['t'])
671
+ sage: F(0).derivative()
672
+ 0
673
+ sage: F(2).derivative()
674
+ 0
675
+ sage: t.derivative()
676
+ 1
677
+ sage: (1+t^2).derivative()
678
+ 2*t
679
+ sage: (1/t).derivative()
680
+ -1/t^2
681
+ sage: ((t+2)/(t-1)).derivative()
682
+ -3/(t^2 - 2*t + 1)
683
+ sage: (t/(1+2*t+t^2)).derivative()
684
+ (-t + 1)/(t^3 + 3*t^2 + 3*t + 1)
685
+ """
686
+ R = self.parent()
687
+ if var in R.gens():
688
+ var = R.ring()(var)
689
+
690
+ num = self.numerator()
691
+ den = self.denominator()
692
+
693
+ if (num.is_zero()):
694
+ return R.zero()
695
+
696
+ if R.is_exact():
697
+ try:
698
+ numder = num._derivative(var)
699
+ dender = den._derivative(var)
700
+ d = den.gcd(dender)
701
+ den = den // d
702
+ dender = dender // d
703
+ tnum = numder * den - num * dender
704
+ tden = self.denominator() * den
705
+ if not tden.is_one() and tden.is_unit():
706
+ try:
707
+ tnum = tnum * tden.inverse_of_unit()
708
+ tden = R.ring().one()
709
+ except AttributeError:
710
+ pass
711
+ except NotImplementedError:
712
+ pass
713
+ return self.__class__(R, tnum, tden,
714
+ coerce=False, reduce=False)
715
+ except AttributeError:
716
+ pass
717
+ except NotImplementedError:
718
+ pass
719
+ except TypeError:
720
+ pass
721
+ num = self.numerator()
722
+ den = self.denominator()
723
+
724
+ num = num._derivative(var) * den - num * den._derivative(var)
725
+ den = den**2
726
+
727
+ return self.__class__(R, num, den,
728
+ coerce=False, reduce=False)