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,8 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ cdef class SymmetricReductionStrategy:
3
+ cdef list _lm
4
+ cdef list _lengths
5
+ cdef object _min_lm
6
+ cdef int _tail
7
+ cdef object _R
8
+ cdef object _parent
@@ -0,0 +1,669 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.libs.singular
3
+ r"""
4
+ Symmetric Reduction of Infinite Polynomials
5
+
6
+ :class:`~sage.rings.polynomial.symmetric_reduction.SymmetricReductionStrategy`
7
+ provides a framework for efficient symmetric reduction of Infinite
8
+ Polynomials, see :mod:`~sage.rings.polynomial.infinite_polynomial_element`.
9
+
10
+ AUTHORS:
11
+
12
+ - Simon King <simon.king@nuigalway.ie>
13
+
14
+ THEORY:
15
+
16
+ According to M. Aschenbrenner and C. Hillar [AB2007]_, Symmetric
17
+ Reduction of an element `p` of an Infinite Polynomial Ring `X` by some
18
+ other element `q` means the following:
19
+
20
+ 1. Let `M` and `N` be the leading terms of `p` and `q`.
21
+ 2. Test whether there is a permutation `P` that does not
22
+ diminish the variable indices occurring in `N`
23
+ and preserves their order, so that there is some term
24
+ `T\in X` with `T N^P = M`. If there is no such permutation,
25
+ return `p`.
26
+ 3. Replace `p` by `p-T q^P` and continue with step 1.
27
+
28
+
29
+ When reducing one polynomial `p` with respect to a list `L` of other
30
+ polynomials, there usually is a choice of order on which the
31
+ efficiency crucially depends. Also it helps to modify the polynomials
32
+ on the list in order to simplify the basic reduction steps.
33
+
34
+ The preparation of `L` may be expensive. Hence, if the same list is
35
+ used many times then it is reasonable to perform the preparation only
36
+ once. This is the background of
37
+ :class:`~sage.rings.polynomial.symmetric_reduction.SymmetricReductionStrategy`.
38
+
39
+ Our current strategy is to keep the number of terms in the polynomials
40
+ as small as possible. For this, we sort `L` by increasing number of
41
+ terms. If several elements of `L` allow for a reduction of `p`, we
42
+ choose the one with the smallest number of terms. Later on, it should
43
+ be possible to implement further strategies for choice.
44
+
45
+ When adding a new polynomial `q` to `L`, we first reduce `q` with
46
+ respect to `L`. Then, we test heuristically whether it is possible to
47
+ reduce the number of terms of the elements of `L` by reduction modulo
48
+ `q`. That way, we see best chances to keep the number of terms in
49
+ intermediate reduction steps relatively small.
50
+
51
+ EXAMPLES:
52
+
53
+ First, we create an infinite polynomial ring and one of its elements::
54
+
55
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
56
+ sage: p = y[1]*y[3] + y[1]^2*x[3]
57
+
58
+ We want to symmetrically reduce it by another polynomial. So, we put
59
+ this other polynomial into a list and create a Symmetric Reduction
60
+ Strategy object::
61
+
62
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
63
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*x[1]])
64
+ sage: S
65
+ Symmetric Reduction Strategy in
66
+ Infinite polynomial ring in x, y over Rational Field, modulo
67
+ x_1*y_2^2
68
+ sage: S.reduce(p)
69
+ x_3*y_1^2 + y_3*y_1
70
+
71
+ The preceding is correct, since any permutation that turns
72
+ ``y[2]^2*x[1]`` into a factor of ``y[1]^2*x[3]`` interchanges the
73
+ variable indices 1 and 2 -- which is not allowed in a symmetric
74
+ reduction. However, reduction by ``y[1]^2*x[2]`` works, since one can
75
+ change variable index 1 into 2 and 2 into 3. So, we add this to
76
+ ``S``::
77
+
78
+ sage: S.add_generator(y[1]^2*x[2])
79
+ sage: S
80
+ Symmetric Reduction Strategy in
81
+ Infinite polynomial ring in x, y over Rational Field, modulo
82
+ x_2*y_1^2,
83
+ x_1*y_2^2
84
+ sage: S.reduce(p) # needs sage.combinat
85
+ y_3*y_1
86
+
87
+ The next example shows that tail reduction is not done, unless it is
88
+ explicitly advised::
89
+
90
+ sage: S.reduce(x[3] + 2*x[2]*y[1]^2 + 3*y[2]^2*x[1]) # needs sage.combinat
91
+ x_3 + 2*x_2*y_1^2 + 3*x_1*y_2^2
92
+ sage: S.tailreduce(x[3] + 2*x[2]*y[1]^2 + 3*y[2]^2*x[1]) # needs sage.combinat
93
+ x_3
94
+
95
+ However, it is possible to ask for tailreduction already when the
96
+ Symmetric Reduction Strategy is created::
97
+
98
+ sage: S2 = SymmetricReductionStrategy(X, [y[2]^2*x[1],y[1]^2*x[2]], tailreduce=True)
99
+ sage: S2
100
+ Symmetric Reduction Strategy in
101
+ Infinite polynomial ring in x, y over Rational Field, modulo
102
+ x_2*y_1^2,
103
+ x_1*y_2^2
104
+ with tailreduction
105
+ sage: S2.reduce(x[3] + 2*x[2]*y[1]^2 + 3*y[2]^2*x[1]) # needs sage.combinat
106
+ x_3
107
+ """
108
+
109
+ # ****************************************************************************
110
+ # Copyright (C) 2009 Simon King <king@mathematik.nuigalway.ie>
111
+ #
112
+ # Distributed under the terms of the GNU General Public License (GPL)
113
+ #
114
+ # This code is distributed in the hope that it will be useful,
115
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
116
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
117
+ # General Public License for more details.
118
+ #
119
+ # The full text of the GPL is available at:
120
+ #
121
+ # https://www.gnu.org/licenses/
122
+ # ****************************************************************************
123
+ import sys
124
+ from sage.structure.richcmp cimport richcmp, Py_NE, Py_EQ
125
+
126
+
127
+ cdef class SymmetricReductionStrategy:
128
+ """
129
+ A framework for efficient symmetric reduction of InfinitePolynomial, see
130
+ :mod:`~sage.rings.polynomial.infinite_polynomial_element`.
131
+
132
+ INPUT:
133
+
134
+ - ``Parent`` -- an Infinite Polynomial Ring, see
135
+ :mod:`~sage.rings.polynomial.infinite_polynomial_element`
136
+ - ``L`` -- list (default: the empty list); list of elements of ``Parent``
137
+ with respect to which will be reduced
138
+ - ``good_input`` -- boolean (default: ``None``); if this optional parameter
139
+ is true, it is assumed that each element of ``L`` is symmetrically
140
+ reduced with respect to the previous elements of ``L``
141
+
142
+ EXAMPLES::
143
+
144
+ sage: X.<y> = InfinitePolynomialRing(QQ)
145
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
146
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
147
+ sage: S.reduce(y[3] + 2*y[2]*y[1]^2 + 3*y[2]^2*y[1])
148
+ y_3 + 3*y_2^2*y_1 + 2*y_2*y_1^2
149
+ sage: S.tailreduce(y[3] + 2*y[2]*y[1]^2 + 3*y[2]^2*y[1]) # needs sage.combinat
150
+ y_3
151
+ """
152
+ def __init__(self, Parent, L=None, tailreduce=False, good_input=None):
153
+ """
154
+ EXAMPLES::
155
+
156
+ sage: X.<y> = InfinitePolynomialRing(QQ)
157
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
158
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
159
+ sage: S == loads(dumps(S))
160
+ True
161
+ """
162
+ self._parent = Parent
163
+ if hasattr(Parent, '_P'):
164
+ self._R = Parent._P
165
+ else:
166
+ self._R = None
167
+ self._lm = []
168
+ self._lengths = []
169
+ self._min_lm = None
170
+ self._tail = int(tailreduce)
171
+ if not (L is None):
172
+ for p in L:
173
+ self.add_generator(p, good_input=good_input)
174
+
175
+ def __getinitargs__(self):
176
+ r"""
177
+ Used for pickling.
178
+
179
+ EXAMPLES::
180
+
181
+ sage: X.<y> = InfinitePolynomialRing(QQ)
182
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
183
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
184
+ sage: S.__getinitargs__()
185
+ (Infinite polynomial ring in y over Rational Field, [], 0, None)
186
+ """
187
+ return (self._parent, [], self._tail, None)
188
+
189
+ def __getstate__(self):
190
+ r"""
191
+ Used for pickling.
192
+
193
+ EXAMPLES::
194
+
195
+ sage: X.<y> = InfinitePolynomialRing(QQ)
196
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
197
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
198
+ sage: S.__getstate__()
199
+ ([y_2*y_1^2, y_2^2*y_1], [1, 1], y_2*y_1^2, 0, Infinite polynomial ring in y over Rational Field)
200
+ """
201
+ # Apparently, for pickling it is needed to update self._lm and
202
+ # self._min_lm before calling dumps...
203
+ R = self._parent
204
+ self._lm = [R(x) for x in self._lm] # I have no idea why -- but it seems needed
205
+
206
+ self._min_lm = R(self._min_lm)
207
+ return (self._lm, self._lengths, self._min_lm,
208
+ self._tail, self._parent)
209
+
210
+ def __setstate__(self, L): # (lm, lengths, min_lm, tail)
211
+ r"""
212
+ Used for pickling.
213
+
214
+ EXAMPLES::
215
+
216
+ sage: X.<y> = InfinitePolynomialRing(QQ)
217
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
218
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], good_input=True)
219
+ sage: S == loads(dumps(S)) # indirect doctest
220
+ True
221
+ """
222
+ self._lm = L[0]
223
+ self._lengths = L[1]
224
+ self._min_lm = L[2]
225
+ self._tail = L[3]
226
+ self._parent = L[4]
227
+ if hasattr(self._parent, '_P'):
228
+ self._R = self._parent._P
229
+ else:
230
+ self._R = None
231
+
232
+ def __richcmp__(self, other, op):
233
+ r"""
234
+ Standard comparison function.
235
+
236
+ EXAMPLES::
237
+
238
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
239
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
240
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], tailreduce=True)
241
+ sage: S == 17
242
+ False
243
+ sage: S == SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], tailreduce=False)
244
+ False
245
+ sage: S == SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]], tailreduce=True)
246
+ True
247
+ """
248
+ if not isinstance(other, SymmetricReductionStrategy):
249
+ if op in [Py_NE, Py_EQ]:
250
+ return (op == Py_NE)
251
+ else:
252
+ return NotImplemented
253
+ cdef SymmetricReductionStrategy left = self
254
+ cdef SymmetricReductionStrategy right = other
255
+ return richcmp((left._parent, left._lm, left._tail),
256
+ (right._parent, right._lm, right._tail), op)
257
+
258
+ def gens(self) -> tuple:
259
+ """
260
+ Return the tuple of Infinite Polynomials modulo which ``self`` reduces.
261
+
262
+ EXAMPLES::
263
+
264
+ sage: X.<y> = InfinitePolynomialRing(QQ)
265
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
266
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]])
267
+ sage: S
268
+ Symmetric Reduction Strategy in
269
+ Infinite polynomial ring in y over Rational Field, modulo
270
+ y_2*y_1^2,
271
+ y_2^2*y_1
272
+ sage: S.gens()
273
+ (y_2*y_1^2, y_2^2*y_1)
274
+ """
275
+ return tuple(self._lm)
276
+
277
+ def setgens(self, L):
278
+ """
279
+ Define the list of Infinite Polynomials modulo which ``self`` reduces.
280
+
281
+ INPUT:
282
+
283
+ - ``L`` -- list of elements of the underlying infinite polynomial ring
284
+
285
+ .. NOTE::
286
+
287
+ It is not tested if ``L`` is a good input. That method simply
288
+ assigns a *copy* of ``L`` to the generators of ``self``.
289
+
290
+ EXAMPLES::
291
+
292
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
293
+ sage: X.<y> = InfinitePolynomialRing(QQ)
294
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]])
295
+ sage: R = SymmetricReductionStrategy(X)
296
+ sage: R.setgens(S.gens())
297
+ sage: R
298
+ Symmetric Reduction Strategy in
299
+ Infinite polynomial ring in y over Rational Field, modulo
300
+ y_2*y_1^2,
301
+ y_2^2*y_1
302
+ sage: R.gens() is S.gens()
303
+ False
304
+ sage: R.gens() == S.gens()
305
+ True
306
+ """
307
+ self._lm = [X for X in L]
308
+
309
+ def reset(self):
310
+ """
311
+ Remove all polynomials from ``self``.
312
+
313
+ EXAMPLES::
314
+
315
+ sage: X.<y> = InfinitePolynomialRing(QQ)
316
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
317
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1],y[1]^2*y[2]])
318
+ sage: S
319
+ Symmetric Reduction Strategy in
320
+ Infinite polynomial ring in y over Rational Field, modulo
321
+ y_2*y_1^2,
322
+ y_2^2*y_1
323
+ sage: S.reset()
324
+ sage: S
325
+ Symmetric Reduction Strategy in Infinite polynomial ring in y over Rational Field
326
+ """
327
+ self._lm = []
328
+ self._lengths = []
329
+ self._min_lm = None
330
+
331
+ def __repr__(self):
332
+ """
333
+ String representation of ``self``.
334
+
335
+ EXAMPLES::
336
+
337
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
338
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
339
+ sage: S = SymmetricReductionStrategy(X, [y[2]^2*y[1], y[1]^2*y[2]], tailreduce=True)
340
+ sage: S # indirect doctest
341
+ Symmetric Reduction Strategy in Infinite polynomial ring in x, y over Rational Field, modulo
342
+ y_2*y_1^2,
343
+ y_2^2*y_1
344
+ with tailreduction
345
+ """
346
+ s = "Symmetric Reduction Strategy in %s" % self._parent
347
+ if self._lm:
348
+ s += ", modulo\n %s" % (',\n '.join(str(X) for X in self._lm))
349
+ if self._tail:
350
+ s += '\nwith tailreduction'
351
+ return s
352
+
353
+ def __call__(self, p):
354
+ """
355
+ INPUT:
356
+
357
+ A polynomial or an infinite polynomial.
358
+
359
+ OUTPUT: a polynomial whose parent ring allows for coercion of any
360
+ generator of ``self``
361
+
362
+ EXAMPLES::
363
+
364
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
365
+ sage: X.<x,y> = InfinitePolynomialRing(QQ, implementation='sparse')
366
+ sage: a, b = y[2]^2*y[1], y[1]^2*y[2]
367
+ sage: p = y[3]*x[2]*x[1]
368
+ sage: S = SymmetricReductionStrategy(X, [a,b])
369
+ sage: p._p.parent().has_coerce_map_from(a._p.parent())
370
+ False
371
+ sage: q = S(p)
372
+ sage: q.parent().has_coerce_map_from(a._p.parent())
373
+ True
374
+ sage: S(p) == S(p._p)
375
+ True
376
+ """
377
+ if hasattr(p, '_p'):
378
+ p = p._p
379
+ if self._R is None:
380
+ self._R = p.parent()
381
+ if hasattr(self._parent, '_P'):
382
+ self._parent._P = self._R
383
+ return p
384
+ if self._R.has_coerce_map_from(p.parent()):
385
+ return self._R(p)
386
+ if p.parent().has_coerce_map_from(self._R):
387
+ self._R = p.parent()
388
+ if hasattr(self._parent, '_P'):
389
+ self._parent._P = self._R
390
+ return p
391
+ # now we really need to work...
392
+ R = self._R
393
+ VarList = list(set(list(R.variable_names()) + list(p.parent().variable_names())))
394
+ VarList.sort(key=self._parent.varname_key, reverse=True)
395
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
396
+ self._R = PolynomialRing(self._parent.base_ring(), VarList,
397
+ order=self._parent._order)
398
+ if hasattr(self._parent, '_P'):
399
+ self._parent._P = self._R
400
+ return self._R(p)
401
+
402
+ def add_generator(self, p, good_input=None):
403
+ """
404
+ Add another polynomial to ``self``.
405
+
406
+ INPUT:
407
+
408
+ - ``p`` -- an element of the underlying infinite polynomial ring
409
+ - ``good_input`` -- boolean (default: ``None``); if ``True``, it is
410
+ assumed that ``p`` is reduced with respect to ``self``. Otherwise,
411
+ this reduction will be done first (which may cost some time).
412
+
413
+ .. NOTE::
414
+
415
+ Previously added polynomials may be modified. All input is
416
+ prepared in view of an efficient symmetric reduction.
417
+
418
+ EXAMPLES::
419
+
420
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
421
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
422
+ sage: S = SymmetricReductionStrategy(X)
423
+ sage: S
424
+ Symmetric Reduction Strategy in
425
+ Infinite polynomial ring in x, y over Rational Field
426
+ sage: S.add_generator(y[3] + y[1]*(x[3]+x[1]))
427
+ sage: S
428
+ Symmetric Reduction Strategy in
429
+ Infinite polynomial ring in x, y over Rational Field, modulo
430
+ x_3*y_1 + x_1*y_1 + y_3
431
+
432
+ Note that the first added polynomial will be simplified when
433
+ adding a suitable second polynomial::
434
+
435
+ sage: S.add_generator(x[2] + x[1]) # needs sage.combinat
436
+ sage: S # needs sage.combinat
437
+ Symmetric Reduction Strategy in
438
+ Infinite polynomial ring in x, y over Rational Field, modulo
439
+ y_3,
440
+ x_2 + x_1
441
+
442
+ By default, reduction is applied to any newly added
443
+ polynomial. This can be avoided by specifying the optional
444
+ parameter 'good_input'::
445
+
446
+ sage: # needs sage.combinat
447
+ sage: S.add_generator(y[2] + y[1]*x[2])
448
+ sage: S
449
+ Symmetric Reduction Strategy in
450
+ Infinite polynomial ring in x, y over Rational Field, modulo
451
+ y_3,
452
+ x_1*y_1 - y_2,
453
+ x_2 + x_1
454
+ sage: S.reduce(x[3] + x[2])
455
+ -2*x_1
456
+ sage: S.add_generator(x[3] + x[2], good_input=True)
457
+ sage: S
458
+ Symmetric Reduction Strategy in
459
+ Infinite polynomial ring in x, y over Rational Field, modulo
460
+ y_3,
461
+ x_3 + x_2,
462
+ x_1*y_1 - y_2,
463
+ x_2 + x_1
464
+
465
+ In the previous example, ``x[3] + x[2]`` is added without
466
+ being reduced to zero.
467
+ """
468
+ from sage.rings.polynomial.infinite_polynomial_element import InfinitePolynomial
469
+ p = InfinitePolynomial(self._parent, self(p))
470
+ cdef SymmetricReductionStrategy tmpStrategy
471
+ if good_input is None:
472
+ p = self.reduce(p)
473
+ if p._p == 0:
474
+ return
475
+ cdef int i = 0
476
+ cdef int l = len(self._lm)
477
+ cdef int newLength = len(p._p.coefficients())
478
+ p = p / p.lc()
479
+ if (self._min_lm is None) or (p.lm() < self._min_lm):
480
+ self._min_lm = p.lm()
481
+ while i < l and self._lengths[i] < newLength:
482
+ i += 1
483
+ self._lm.insert(i, p)
484
+ self._lengths.insert(i, newLength)
485
+ # return
486
+ i += 1
487
+ l += 1
488
+ if i < l:
489
+ tmpStrategy = SymmetricReductionStrategy(self._parent, [p],
490
+ tailreduce=False,
491
+ good_input=True)
492
+ else:
493
+ return
494
+ cdef int j
495
+ while i < l:
496
+ q = tmpStrategy.reduce(self._lm[i].lm()) + tmpStrategy.reduce(self._lm[i].tail())
497
+ if q._p == 0:
498
+ self._lm.pop(i)
499
+ self._lengths.pop(i)
500
+ l -= 1
501
+ i -= 1
502
+ else:
503
+ q_len = len(q._p.coefficients())
504
+ if q_len < self._lengths[i]:
505
+ self._lm.pop(i)
506
+ self._lengths.pop(i)
507
+ j = 0
508
+ while j < i and self._lengths[j] < q_len:
509
+ j += 1
510
+ self._lm.insert(j, q)
511
+ self._lengths.insert(j, q_len)
512
+ i += 1
513
+
514
+ def reduce(self, p, notail=False, report=None):
515
+ """
516
+ Symmetric reduction of an infinite polynomial.
517
+
518
+ INPUT:
519
+
520
+ - ``p`` -- an element of the underlying infinite polynomial ring
521
+ - ``notail`` -- boolean (default: ``False``); if ``True``, tail reduction
522
+ is avoided (but there is no guarantee that there will be no tail
523
+ reduction at all)
524
+ - ``report`` -- object (default: ``None``); if not ``None``, print
525
+ information on the progress of the computation
526
+
527
+ OUTPUT: reduction of ``p`` with respect to ``self``
528
+
529
+ .. NOTE::
530
+
531
+ If tail reduction shall be forced, use :meth:`tailreduce`.
532
+
533
+ EXAMPLES::
534
+
535
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
536
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
537
+ sage: S = SymmetricReductionStrategy(X, [y[3]], tailreduce=True)
538
+ sage: S.reduce(y[4]*x[1] + y[1]*x[4])
539
+ x_4*y_1
540
+ sage: S.reduce(y[4]*x[1] + y[1]*x[4], notail=True)
541
+ x_4*y_1 + x_1*y_4
542
+
543
+ Last, we demonstrate the ``report`` option::
544
+
545
+ sage: S = SymmetricReductionStrategy(X, [x[2] + y[1],
546
+ ....: x[2]*y[3] + x[1]*y[2] + y[4],
547
+ ....: y[3] + y[2]])
548
+ sage: S
549
+ Symmetric Reduction Strategy in
550
+ Infinite polynomial ring in x, y over Rational Field, modulo
551
+ y_3 + y_2,
552
+ x_2 + y_1,
553
+ x_1*y_2 + y_4 - y_3*y_1
554
+ sage: S.reduce(x[3] + x[1]*y[3] + x[1]*y[1], report=True)
555
+ :::>
556
+ x_1*y_1 + y_4 - y_3*y_1 - y_1
557
+
558
+ Each ':' indicates that one reduction of the leading monomial
559
+ was performed. Eventually, the '>' indicates that the
560
+ computation is finished.
561
+ """
562
+ from sage.rings.polynomial.infinite_polynomial_element import InfinitePolynomial
563
+ cdef list lml = self._lm
564
+ if not lml:
565
+ if report is not None:
566
+ print('>')
567
+ return p
568
+ if p.lm() < self._min_lm:
569
+ if report is not None:
570
+ print('>')
571
+ return p
572
+ cdef list REDUCTOR
573
+ while True:
574
+ REDUCTOR = []
575
+ for q in lml:
576
+ c, P, _ = q.symmetric_cancellation_order(p)
577
+ if c is not None and c <= 0:
578
+ REDUCTOR = [self(q ** P)]
579
+ break
580
+ if not REDUCTOR:
581
+ new_p = p
582
+ break
583
+ p = self(p) # now this is a usual polynomial
584
+ R = self._R
585
+ if hasattr(p, 'reduce'):
586
+ new_p = InfinitePolynomial(self._parent,
587
+ p.reduce([R(X) for X in REDUCTOR]))
588
+ else:
589
+ new_p = InfinitePolynomial(self._parent, p % (REDUCTOR * R))
590
+ if report is not None:
591
+ sys.stdout.write(':')
592
+ sys.stdout.flush()
593
+ if (new_p._p == p) or (new_p._p == 0):
594
+ break
595
+ p = new_p # now this is an infinite polynomial
596
+ p = new_p
597
+ if (not self._tail) or notail or (p._p == 0):
598
+ if report is not None:
599
+ print('>')
600
+ return p
601
+ # there remains to perform tail reduction
602
+ REM = p.lt()
603
+ p = p.tail()
604
+ p = self.tailreduce(p, report=report)
605
+ if report is not None:
606
+ print('>')
607
+ return p + REM
608
+
609
+ def tailreduce(self, p, report=None):
610
+ """
611
+ Symmetric reduction of an infinite polynomial, with forced tail reduction.
612
+
613
+ INPUT:
614
+
615
+ - ``p`` -- an element of the underlying infinite polynomial ring
616
+ - ``report`` -- object (default: ``None``); if not ``None``, print
617
+ information on the progress of the computation
618
+
619
+ OUTPUT:
620
+
621
+ Reduction (including the non-leading elements) of ``p`` with respect to ``self``.
622
+
623
+ EXAMPLES::
624
+
625
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
626
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
627
+ sage: S = SymmetricReductionStrategy(X, [y[3]])
628
+ sage: S.reduce(y[4]*x[1] + y[1]*x[4])
629
+ x_4*y_1 + x_1*y_4
630
+ sage: S.tailreduce(y[4]*x[1] + y[1]*x[4]) # needs sage.combinat
631
+ x_4*y_1
632
+
633
+ Last, we demonstrate the 'report' option::
634
+
635
+ sage: S = SymmetricReductionStrategy(X, [x[2] + y[1],
636
+ ....: x[2]*x[3] + x[1]*y[2] + y[4],
637
+ ....: y[3] + y[2]])
638
+ sage: S
639
+ Symmetric Reduction Strategy in
640
+ Infinite polynomial ring in x, y over Rational Field, modulo
641
+ y_3 + y_2,
642
+ x_2 + y_1,
643
+ x_1*y_2 + y_4 + y_1^2
644
+ sage: S.tailreduce(x[3] + x[1]*y[3] + x[1]*y[1], report=True) # needs sage.combinat
645
+ T[3]:::>
646
+ T[3]:>
647
+ x_1*y_1 - y_2 + y_1^2 - y_1
648
+
649
+ The protocol means the following.
650
+ * 'T[3]' means that we currently do tail reduction for a polynomial
651
+ with three terms.
652
+ * ':::>' means that there were three reductions of leading terms.
653
+ * The tail of the result of the preceding reduction still has three
654
+ terms. One reduction of leading terms was possible, and then the
655
+ final result was obtained.
656
+ """
657
+ if not self._lm:
658
+ return p
659
+ OUT = p.parent()(0)
660
+ while p._p != 0:
661
+ if report is not None:
662
+ sys.stdout.write('T[%d]' % len(p._p.coefficients()))
663
+ sys.stdout.flush()
664
+ p = self.reduce(p, notail=True, report=report)
665
+ OUT = OUT + p.lt()
666
+ p = p.tail()
667
+ if p.lm() < self._min_lm:
668
+ return OUT + p
669
+ return OUT