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,989 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.libs.singular
3
+ """
4
+ Symmetric Ideals of Infinite Polynomial Rings
5
+
6
+ This module provides an implementation of ideals of polynomial rings
7
+ in a countably infinite number of variables that are invariant under
8
+ variable permutation. Such ideals are called 'Symmetric Ideals' in the
9
+ rest of this document. Our implementation is based on the theory of
10
+ M. Aschenbrenner and C. Hillar.
11
+
12
+ AUTHORS:
13
+
14
+ - Simon King <simon.king@nuigalway.ie>
15
+
16
+ EXAMPLES:
17
+
18
+ Here, we demonstrate that working in quotient rings of Infinite
19
+ Polynomial Rings works, provided that one uses symmetric Groebner
20
+ bases.
21
+ ::
22
+
23
+ sage: R.<x> = InfinitePolynomialRing(QQ)
24
+ sage: I = R.ideal([x[1]*x[2] + x[3]])
25
+
26
+ Note that ``I`` is not a symmetric Groebner basis::
27
+
28
+ sage: G = R * I.groebner_basis()
29
+ sage: G
30
+ Symmetric Ideal (x_2 - x_1, x_1^2 + x_1) of Infinite polynomial ring in x
31
+ over Rational Field
32
+ sage: Q = R.quotient(G)
33
+ sage: p = x[3]*x[1] + x[2]^2 + 3
34
+ sage: Q(p)
35
+ -2*x_1 + 3
36
+
37
+ By the second generator of ``G``, variable `x_n` is equal to `x_1` for
38
+ any positive integer `n`. By the first generator of ``G``, `x_1^3` is
39
+ equal to `x_1` in ``Q``. Indeed, we have
40
+ ::
41
+
42
+ sage: Q(p)*x[2] == Q(p)*x[1]*x[3]*x[5]
43
+ True
44
+ """
45
+ # ****************************************************************************
46
+ # Copyright (C) 2009 Simon King <king@mathematik.nuigalway.ie>
47
+ #
48
+ # Distributed under the terms of the GNU General Public License (GPL)
49
+ #
50
+ # This code is distributed in the hope that it will be useful,
51
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
52
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
53
+ # General Public License for more details.
54
+ #
55
+ # The full text of the GPL is available at:
56
+ #
57
+ # https://www.gnu.org/licenses/
58
+ # ****************************************************************************
59
+ import sys
60
+
61
+ from sage.categories.fields import Fields
62
+ from sage.misc.cachefunc import cached_method
63
+ from sage.rings.ideal import Ideal_generic
64
+ from sage.rings.integer import Integer
65
+ from sage.structure.sequence import Sequence
66
+
67
+
68
+ class SymmetricIdeal(Ideal_generic):
69
+ r"""
70
+ Ideal in an Infinite Polynomial Ring, invariant under permutation of
71
+ variable indices.
72
+
73
+ THEORY:
74
+
75
+ An Infinite Polynomial Ring with finitely many generators `x_\ast,
76
+ y_\ast, ...` over a field `F` is a free commutative `F`-algebra
77
+ generated by infinitely many 'variables' `x_0, x_1, x_2,..., y_0,
78
+ y_1, y_2,...`. We refer to the natural number `n` as the *index*
79
+ of the variable `x_n`. See more detailed description at
80
+ :mod:`~sage.rings.polynomial.infinite_polynomial_ring`
81
+
82
+
83
+ Infinite Polynomial Rings are equipped with a permutation action
84
+ by permuting positive variable indices, i.e., `x_n^P = x_{P(n)},
85
+ y_n^P=y_{P(n)}, ...` for any permutation `P`. Note that the
86
+ variables `x_0, y_0, ...` of index zero are invariant under that
87
+ action.
88
+
89
+ A *Symmetric Ideal* is an ideal in an infinite polynomial ring `X`
90
+ that is invariant under the permutation action. In other words, if
91
+ `\mathfrak S_\infty` denotes the symmetric group of `1,2,...`,
92
+ then a Symmetric Ideal is a right `X[\mathfrak
93
+ S_\infty]`-submodule of `X`.
94
+
95
+ It is known by work of Aschenbrenner and Hillar [AB2007]_ that an
96
+ Infinite Polynomial Ring `X` with a single generator `x_\ast` is
97
+ Noetherian, in the sense that any Symmetric Ideal `I\subset X` is
98
+ finitely generated modulo addition, multiplication by elements of
99
+ `X`, and permutation of variable indices (hence, it is a finitely
100
+ generated right `X[\mathfrak S_\infty]`-module).
101
+
102
+ Moreover, if `X` is equipped with a lexicographic monomial
103
+ ordering with `x_1 < x_2 < x_3 ...` then there is an algorithm of
104
+ Buchberger type that computes a Groebner basis `G` for `I` that
105
+ allows for computation of a unique normal form, that is zero
106
+ precisely for the elements of `I` -- see [AB2008]_. See
107
+ :meth:`groebner_basis` for more details.
108
+
109
+ Our implementation allows more than one generator and also
110
+ provides degree lexicographic and degree reverse lexicographic
111
+ monomial orderings -- we do, however, not guarantee termination of
112
+ the Buchberger algorithm in these cases.
113
+
114
+ EXAMPLES::
115
+
116
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
117
+ sage: I = [x[1]*y[2]*y[1] + 2*x[1]*y[2]] * X
118
+ sage: I == loads(dumps(I))
119
+ True
120
+ sage: latex(I)
121
+ \left(x_{1} y_{2} y_{1} + 2 x_{1} y_{2}\right)\Bold{Q}[x_{\ast}, y_{\ast}][\mathfrak{S}_{\infty}]
122
+
123
+ The default ordering is lexicographic. We now compute a Groebner basis::
124
+
125
+ sage: J = I.groebner_basis(); J # about 3 seconds
126
+ [x_2*x_1*y_2 - x_2*x_1*y_1, x_1*y_2*y_1 + 2*x_1*y_2,
127
+ x_2*y_2*y_1 + 2*x_2*y_1, x_2*x_1*y_1^2 + 2*x_2*x_1*y_1]
128
+
129
+ Note that even though the symmetric ideal can be generated by a
130
+ single polynomial, its reduced symmetric Groebner basis comprises
131
+ four elements. Ideal membership in ``I`` can now be tested by
132
+ commuting symmetric reduction modulo ``J``::
133
+
134
+ sage: I.reduce(J)
135
+ Symmetric Ideal (0) of Infinite polynomial ring in x, y over Rational Field
136
+
137
+ The Groebner basis is not point-wise invariant under permutation::
138
+
139
+ sage: P = Permutation([2, 1])
140
+ sage: J[2]
141
+ x_2*y_2*y_1 + 2*x_2*y_1
142
+ sage: J[2]^P
143
+ x_1*y_2*y_1 + 2*x_1*y_2
144
+ sage: J[2]^P in J
145
+ True
146
+
147
+ However, any element of ``J`` has symmetric reduction zero even
148
+ after applying a permutation. This even holds when the
149
+ permutations involve higher variable indices than the ones
150
+ occurring in ``J``::
151
+
152
+ sage: [[(p^P).reduce(J) for p in J] for P in Permutations(3)]
153
+ [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
154
+
155
+ Since ``I`` is not a Groebner basis, it is no surprise that it cannot detect
156
+ ideal membership::
157
+
158
+ sage: [p.reduce(I) for p in J]
159
+ [x_2*x_1*y_2 - x_2*x_1*y_1, 0, x_2*y_2*y_1 + 2*x_2*y_1, x_2*x_1*y_1^2 + 2*x_2*x_1*y_1]
160
+
161
+ Note that we give no guarantee that the computation of a symmetric
162
+ Groebner basis will terminate in any order different from
163
+ lexicographic.
164
+
165
+ When multiplying Symmetric Ideals or raising them to some integer
166
+ power, the permutation action is taken into account, so that the
167
+ product is indeed the product of ideals in the mathematical sense.
168
+ ::
169
+
170
+ sage: I = X * (x[1])
171
+ sage: I * I
172
+ Symmetric Ideal (x_1^2, x_2*x_1) of
173
+ Infinite polynomial ring in x, y over Rational Field
174
+ sage: I^3
175
+ Symmetric Ideal (x_1^3, x_2*x_1^2, x_2^2*x_1, x_3*x_2*x_1) of
176
+ Infinite polynomial ring in x, y over Rational Field
177
+ sage: I * I == X * (x[1]^2)
178
+ False
179
+ """
180
+
181
+ def __init__(self, ring, gens, coerce=True):
182
+ """
183
+ INPUT:
184
+
185
+ - ``ring`` -- an infinite polynomial ring
186
+ - ``gens`` -- generators of this ideal
187
+ - ``coerce`` -- boolean (default ``True``); coerce the given generators
188
+ into ``ring``
189
+
190
+ EXAMPLES::
191
+
192
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
193
+ sage: I = X * (x[1]^2 + y[2]^2, x[1]*x[2]*y[3] + x[1]*y[4]) # indirect doctest
194
+ sage: I
195
+ Symmetric Ideal (x_1^2 + y_2^2, x_2*x_1*y_3 + x_1*y_4) of Infinite polynomial ring in x, y over Rational Field
196
+ sage: from sage.rings.polynomial.symmetric_ideal import SymmetricIdeal
197
+ sage: J = SymmetricIdeal(X, [x[1]^2 + y[2]^2, x[1]*x[2]*y[3] + x[1]*y[4]])
198
+ sage: I == J
199
+ True
200
+ """
201
+ Ideal_generic.__init__(self, ring, gens, coerce=coerce)
202
+
203
+ def __repr__(self):
204
+ """
205
+ EXAMPLES::
206
+
207
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
208
+ sage: I = X * (x[1]^2 + y[2]^2, x[1]*x[2]*y[3] + x[1]*y[4])
209
+ sage: I # indirect doctest
210
+ Symmetric Ideal (x_1^2 + y_2^2, x_2*x_1*y_3 + x_1*y_4) of Infinite polynomial ring in x, y over Rational Field
211
+ """
212
+ return f"Symmetric Ideal {self._repr_short()} of {self.ring()}"
213
+
214
+ def _latex_(self):
215
+ r"""
216
+ EXAMPLES::
217
+
218
+ sage: from sage.misc.latex import latex
219
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
220
+ sage: I = X * (x[1]*y[2])
221
+ sage: latex(I) # indirect doctest
222
+ \left(x_{1} y_{2}\right)\Bold{Q}[x_{\ast}, y_{\ast}][\mathfrak{S}_{\infty}]
223
+ """
224
+ from sage.misc.latex import latex
225
+ return r'\left({}\right){}[\mathfrak{{S}}_{{\infty}}]'.format(", ".join(latex(g) for g in self.gens()), latex(self.ring()))
226
+
227
+ def _contains_(self, p):
228
+ """
229
+ Determine whether the argument belongs to ``self``.
230
+
231
+ ASSUMPTION:
232
+
233
+ ``self`` is given by a symmetric Groebner basis.
234
+
235
+ EXAMPLES::
236
+
237
+ sage: R.<x> = InfinitePolynomialRing(QQ)
238
+ sage: I = R.ideal([x[1]*x[2] + x[3]])
239
+ sage: I = R * I.groebner_basis()
240
+ sage: I
241
+ Symmetric Ideal (x_2 - x_1, x_1^2 + x_1) of
242
+ Infinite polynomial ring in x over Rational Field
243
+ sage: x[2]^2 + x[3] in I # indirect doctest
244
+ True
245
+ """
246
+ try:
247
+ return self.reduce(p) == 0
248
+ except Exception:
249
+ return False
250
+
251
+ def __mul__(self, other):
252
+ """
253
+ Product of two symmetric ideals.
254
+
255
+ Since the generators of a symmetric ideal are subject to a
256
+ permutation action, they in fact stand for a set of
257
+ polynomials. Hence, when multiplying two symmetric ideals, it
258
+ does not suffice to simply multiply the respective generators.
259
+
260
+ EXAMPLES::
261
+
262
+ sage: X.<x> = InfinitePolynomialRing(QQ)
263
+ sage: I = X * (x[1])
264
+ sage: I*I # indirect doctest
265
+ Symmetric Ideal (x_1^2, x_2*x_1) of Infinite polynomial ring in x over Rational Field
266
+ """
267
+ # determine maximal generator index
268
+ PARENT = self.ring()
269
+ if (not isinstance(other, self.__class__)) or self.ring() != other.ring():
270
+ if hasattr(other, 'gens'):
271
+ other = SymmetricIdeal(PARENT, other.gens(), coerce=True)
272
+ other = other.symmetrisation()
273
+ sN = max((X.max_index() for X in self.gens()), default=1)
274
+ oN = max((X.max_index() for X in other.gens()), default=1)
275
+
276
+ from sage.combinat.permutation import Permutation
277
+ P = Permutation(list(range(2, sN + oN + 1)) + [1])
278
+ oGen = list(other.gens())
279
+ SymL = oGen
280
+ for i in range(sN):
281
+ oGen = [X ** P for X in oGen]
282
+ SymL = SymL + oGen
283
+ # Now, SymL contains all necessary permutations of the second factor
284
+ OUT = []
285
+ for X in self.gens():
286
+ OUT.extend([X * Y for Y in SymL])
287
+ return SymmetricIdeal(PARENT, OUT, coerce=False).interreduction()
288
+
289
+ def __pow__(self, n):
290
+ """
291
+ Raise ``self`` to some power.
292
+
293
+ Since the generators of a symmetric ideal are subject to a
294
+ permutation action, they in fact stand for a set of
295
+ polynomials. Hence, when raising a symmetric ideals to some
296
+ power, it does not suffice to simply raise the generators to
297
+ the respective power.
298
+
299
+ EXAMPLES::
300
+
301
+ sage: X.<x> = InfinitePolynomialRing(QQ)
302
+ sage: I = X * (x[1])
303
+ sage: I^2 # indirect doctest
304
+ Symmetric Ideal (x_1^2, x_2*x_1) of Infinite polynomial ring in x over Rational Field
305
+ """
306
+ OUT = SymmetricIdeal(self.ring(), [1])
307
+ for i in range(n):
308
+ OUT = self * OUT
309
+ return OUT
310
+
311
+ def is_maximal(self):
312
+ """
313
+ Answer whether ``self`` is a maximal ideal.
314
+
315
+ ASSUMPTION:
316
+
317
+ ``self`` is defined by a symmetric Groebner basis.
318
+
319
+ NOTE:
320
+
321
+ It is not checked whether ``self`` is in fact a symmetric Groebner
322
+ basis. A wrong answer can result if this assumption does not
323
+ hold. A :exc:`NotImplementedError` is raised if the base ring is not
324
+ a field, since symmetric Groebner bases are not implemented in
325
+ this setting.
326
+
327
+ EXAMPLES::
328
+
329
+ sage: R.<x,y> = InfinitePolynomialRing(QQ)
330
+ sage: I = R.ideal([x[1] + y[2], x[2] - y[1]])
331
+ sage: I = R * I.groebner_basis(); I
332
+ Symmetric Ideal (y_1, x_1) of
333
+ Infinite polynomial ring in x, y over Rational Field
334
+ sage: I = R.ideal([x[1] + y[2], x[2] - y[1]])
335
+ sage: I.is_maximal()
336
+ False
337
+
338
+ The preceding answer is wrong, since it is not the case that
339
+ ``I`` is given by a symmetric Groebner basis::
340
+
341
+ sage: I = R * I.groebner_basis(); I
342
+ Symmetric Ideal (y_1, x_1) of
343
+ Infinite polynomial ring in x, y over Rational Field
344
+ sage: I.is_maximal()
345
+ True
346
+ """
347
+ if not self.base_ring().is_field():
348
+ raise NotImplementedError
349
+ if len(self.gens()) == 1 and self.is_trivial() and not self.is_zero():
350
+ return True
351
+ V = [p.variables() for p in self.gens()]
352
+ V = [x for x in V if len(x) == 1]
353
+ V = [str(x[0]).split('_')[0] for x in V]
354
+ return set(V) == set(self.ring().variable_names())
355
+
356
+ def reduce(self, I, tailreduce=False):
357
+ r"""
358
+ Symmetric reduction of ``self`` by another Symmetric Ideal or list of Infinite Polynomials,
359
+ or symmetric reduction of a given Infinite Polynomial by ``self``.
360
+
361
+ INPUT:
362
+
363
+ - ``I`` -- an Infinite Polynomial, or a Symmetric Ideal or a
364
+ list of Infinite Polynomials
365
+ - ``tailreduce`` -- boolean (default ``False``); if ``True``, the
366
+ non-leading terms will be reduced as well
367
+
368
+ OUTPUT: symmetric reduction of ``self`` with respect to ``I``
369
+
370
+ THEORY:
371
+
372
+ Reduction of an element `p` of an Infinite Polynomial Ring `X`
373
+ by some other element `q` means the following:
374
+
375
+ 1. Let `M` and `N` be the leading terms of `p` and `q`.
376
+ 2. Test whether there is a permutation `P` that does not does
377
+ not diminish the variable indices occurring in `N` and
378
+ preserves their order, so that there is some term `T\in X`
379
+ with `T N^P = M`. If there is no such permutation, return `p`
380
+ 3. Replace `p` by `p - T q^P` and continue with step 1.
381
+
382
+ EXAMPLES::
383
+
384
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
385
+ sage: I = X * (y[1]^2*y[3] + y[1]*x[3]^2)
386
+ sage: I.reduce([x[1]^2*y[2]])
387
+ Symmetric Ideal (x_3^2*y_1 + y_3*y_1^2) of
388
+ Infinite polynomial ring in x, y over Rational Field
389
+
390
+ The preceding is correct, since any permutation that turns
391
+ ``x[1]^2*y[2]`` into a factor of ``x[3]^2*y[2]`` interchanges
392
+ the variable indices 1 and 2 -- which is not allowed. However,
393
+ reduction by ``x[2]^2*y[1]`` works, since one can change
394
+ variable index 1 into 2 and 2 into 3::
395
+
396
+ sage: I.reduce([x[2]^2*y[1]])
397
+ Symmetric Ideal (y_3*y_1^2) of
398
+ Infinite polynomial ring in x, y over Rational Field
399
+
400
+ The next example shows that tail reduction is not done, unless
401
+ it is explicitly advised. The input can also be a symmetric
402
+ ideal::
403
+
404
+ sage: J = (y[2]) * X
405
+ sage: I.reduce(J)
406
+ Symmetric Ideal (x_3^2*y_1 + y_3*y_1^2) of
407
+ Infinite polynomial ring in x, y over Rational Field
408
+ sage: I.reduce(J, tailreduce=True)
409
+ Symmetric Ideal (x_3^2*y_1) of
410
+ Infinite polynomial ring in x, y over Rational Field
411
+ """
412
+ if I in self.ring(): # we want to reduce a polynomial by self
413
+ return self.ring()(I).reduce(self)
414
+ from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
415
+ if hasattr(I, 'gens'):
416
+ I = I.gens()
417
+ if (not I):
418
+ return self
419
+ I = list(I)
420
+ S = SymmetricReductionStrategy(self.ring(), I, tailreduce)
421
+ return SymmetricIdeal(self.ring(), [S.reduce(X) for X in self.gens()],
422
+ coerce=False)
423
+
424
+ def interreduction(self, tailreduce=True, sorted=False, report=None, RStrat=None):
425
+ """
426
+ Return symmetrically interreduced form of ``self``.
427
+
428
+ INPUT:
429
+
430
+ - ``tailreduce`` -- boolean (default: ``True``); if ``True``, the
431
+ interreduction is also performed on the non-leading monomials.
432
+ - ``sorted`` -- boolean (default: ``False``); if ``True``, it is assumed that the
433
+ generators of ``self`` are already increasingly sorted.
434
+ - ``report`` -- object (default ``None``); if not ``None``, some information on the
435
+ progress of computation is printed
436
+ - ``RStrat`` -- (:class:`~sage.rings.polynomial.symmetric_reduction.SymmetricReductionStrategy`,
437
+ default ``None``) A reduction strategy to which the polynomials resulting
438
+ from the interreduction will be added. If ``RStrat`` already contains some
439
+ polynomials, they will be used in the interreduction. The effect is to
440
+ compute in a quotient ring.
441
+
442
+ OUTPUT:
443
+
444
+ A Symmetric Ideal `J` (sorted list of generators) coinciding
445
+ with ``self`` as an ideal, so that any generator is symmetrically
446
+ reduced w.r.t. the other generators. Note that the leading
447
+ coefficients of the result are not necessarily 1.
448
+
449
+ EXAMPLES::
450
+
451
+ sage: X.<x> = InfinitePolynomialRing(QQ)
452
+ sage: I = X * (x[1] + x[2], x[1]*x[2])
453
+ sage: I.interreduction()
454
+ Symmetric Ideal (-x_1^2, x_2 + x_1) of
455
+ Infinite polynomial ring in x over Rational Field
456
+
457
+ Here, we show the ``report`` option::
458
+
459
+ sage: I.interreduction(report=True)
460
+ Symmetric interreduction
461
+ [1/2] >
462
+ [2/2] :>
463
+ [1/2] >
464
+ [2/2] T[1]>
465
+ >
466
+ Symmetric Ideal (-x_1^2, x_2 + x_1) of
467
+ Infinite polynomial ring in x over Rational Field
468
+
469
+ ``[m/n]`` indicates that polynomial number ``m`` is considered
470
+ and the total number of polynomials under consideration is
471
+ ``n``. '-> 0' is printed if a zero reduction occurred. The
472
+ rest of the report is as described in
473
+ :meth:`sage.rings.polynomial.symmetric_reduction.SymmetricReductionStrategy.reduce`.
474
+
475
+ Last, we demonstrate the use of the optional parameter ``RStrat``::
476
+
477
+ sage: from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
478
+ sage: R = SymmetricReductionStrategy(X); R
479
+ Symmetric Reduction Strategy in
480
+ Infinite polynomial ring in x over Rational Field
481
+ sage: I.interreduction(RStrat=R)
482
+ Symmetric Ideal (-x_1^2, x_2 + x_1) of
483
+ Infinite polynomial ring in x over Rational Field
484
+ sage: R
485
+ Symmetric Reduction Strategy in
486
+ Infinite polynomial ring in x over Rational Field, modulo
487
+ x_1^2,
488
+ x_2 + x_1
489
+ sage: R = SymmetricReductionStrategy(X, [x[1]^2])
490
+ sage: I.interreduction(RStrat=R)
491
+ Symmetric Ideal (x_2 + x_1) of Infinite polynomial ring in x over Rational Field
492
+ """
493
+ DONE = []
494
+ TODO = []
495
+ PARENT = self.ring()
496
+ for P in self.gens():
497
+ if P._p != 0:
498
+ if P.is_unit(): # self generates all of self.ring()
499
+ if RStrat is not None:
500
+ RStrat.add_generator(PARENT(1))
501
+ return SymmetricIdeal(self.ring(), [self.ring().one()],
502
+ coerce=False)
503
+ TODO.append(P)
504
+ if not sorted:
505
+ TODO = list(set(TODO))
506
+ TODO.sort()
507
+ if not hasattr(PARENT, '_P'):
508
+ VarList = set()
509
+ for P in TODO:
510
+ if P._p != 0:
511
+ if P.is_unit(): # self generates all of PARENT
512
+ if RStrat is not None:
513
+ RStrat.add_generator(PARENT.one())
514
+ return SymmetricIdeal(PARENT, [PARENT.one()],
515
+ coerce=False)
516
+ VarList = VarList.union(P._p.parent().variable_names())
517
+ VarList = list(VarList)
518
+ if not VarList:
519
+ return SymmetricIdeal(PARENT, [0])
520
+
521
+ # Now, the symmetric interreduction starts
522
+ if report is not None:
523
+ print('Symmetric interreduction')
524
+ from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
525
+ if RStrat is None:
526
+ RStrat = SymmetricReductionStrategy(self.ring(), tailreduce=tailreduce)
527
+ GroundState = RStrat.gens()
528
+ while True:
529
+ RStrat.setgens(GroundState)
530
+ DONE = []
531
+ for i in range(len(TODO)):
532
+ if report is not None:
533
+ print('[%d/%d] ' % (i + 1, len(TODO)), end="")
534
+ sys.stdout.flush()
535
+ p = RStrat.reduce(TODO[i], report=report)
536
+ if p._p != 0:
537
+ if p.is_unit(): # self generates all of self.ring()
538
+ return SymmetricIdeal(self.ring(), [self.ring().one()],
539
+ coerce=False)
540
+ RStrat.add_generator(p, good_input=True)
541
+ DONE.append(p)
542
+ else:
543
+ if report is not None:
544
+ print("-> 0")
545
+ DONE.sort()
546
+ if DONE == TODO:
547
+ break
548
+ else:
549
+ if len(TODO) == len(DONE):
550
+ import copy
551
+ bla = copy.copy(TODO)
552
+ bla.sort()
553
+ if bla == DONE:
554
+ break
555
+ TODO = DONE
556
+ return SymmetricIdeal(self.ring(), DONE, coerce=False)
557
+
558
+ def interreduced_basis(self):
559
+ """
560
+ A fully symmetrically reduced generating set (type
561
+ :class:`~sage.structure.sequence.Sequence`) of ``self``.
562
+
563
+ This does essentially the same as :meth:`interreduction` with
564
+ the option 'tailreduce', but it returns a
565
+ :class:`~sage.structure.sequence.Sequence` rather than a
566
+ :class:`~sage.rings.polynomial.symmetric_ideal.SymmetricIdeal`.
567
+
568
+ EXAMPLES::
569
+
570
+ sage: X.<x> = InfinitePolynomialRing(QQ)
571
+ sage: I = X * (x[1] + x[2], x[1]*x[2])
572
+ sage: I.interreduced_basis()
573
+ [-x_1^2, x_2 + x_1]
574
+ """
575
+ return Sequence(self.interreduction(tailreduce=True).gens(), self.ring(), check=False)
576
+
577
+ def symmetrisation(self, N=None, tailreduce=False, report=None, use_full_group=False):
578
+ """
579
+ Apply permutations to the generators of ``self`` and interreduce.
580
+
581
+ INPUT:
582
+
583
+ - ``N`` -- integer (default: ``None``); apply permutations in
584
+ `Sym(N)`. If it is not given then it will be replaced by the
585
+ maximal variable index occurring in the generators of
586
+ ``self.interreduction().squeezed()``.
587
+ - ``tailreduce`` -- boolean (default: ``False``); if ``True``, perform
588
+ tail reductions.
589
+ - ``report`` -- object (default ``None``); if not ``None``, report
590
+ on the progress of computations.
591
+ - ``use_full_group`` -- (optional) if ``True``, apply *all* elements of
592
+ `Sym(N)` to the generators of ``self`` (this is what [AB2008]_
593
+ originally suggests). The default is to apply all elementary
594
+ transpositions to the generators of ``self.squeezed()``,
595
+ interreduce, and repeat until the result stabilises, which is
596
+ often much faster than applying all of `Sym(N)`, and we are
597
+ convinced that both methods yield the same result.
598
+
599
+ OUTPUT:
600
+
601
+ A symmetrically interreduced symmetric ideal with respect to
602
+ which any `Sym(N)`-translate of a generator of ``self`` is
603
+ symmetrically reducible, where by default ``N`` is the maximal
604
+ variable index that occurs in the generators of
605
+ ``self.interreduction().squeezed()``.
606
+
607
+ NOTE:
608
+
609
+ If ``I`` is a symmetric ideal whose generators are monomials,
610
+ then ``I.symmetrisation()`` is its reduced Groebner basis. It
611
+ should be noted that without symmetrisation, monomial
612
+ generators, in general, do not form a Groebner basis.
613
+
614
+ EXAMPLES::
615
+
616
+ sage: X.<x> = InfinitePolynomialRing(QQ)
617
+ sage: I = X * (x[1] + x[2], x[1]*x[2])
618
+ sage: I.symmetrisation()
619
+ Symmetric Ideal (-x_2^2, -x_1^2, x_2 + x_1) of Infinite polynomial ring in x
620
+ over Rational Field
621
+ sage: I.symmetrisation(N=3)
622
+ Symmetric Ideal (-x_2^2, -x_1^2, -2*x_1) of Infinite polynomial ring in x
623
+ over Rational Field
624
+ sage: I.symmetrisation(N=3, use_full_group=True)
625
+ Symmetric Ideal (-x_1^2, -2*x_1) of Infinite polynomial ring in x
626
+ over Rational Field
627
+ """
628
+ newOUT = self.interreduction(tailreduce=tailreduce, report=report).squeezed()
629
+ R = self.ring()
630
+ OUT = R * ()
631
+ if N is None:
632
+ N = max((Y.max_index() for Y in newOUT.gens()), default=1)
633
+ else:
634
+ N = Integer(N)
635
+ if hasattr(R, '_max') and R._max < N:
636
+ R.gen()[N]
637
+ if report is not None:
638
+ print("Symmetrise %d polynomials at level %d" %
639
+ (len(newOUT.gens()), N))
640
+ if use_full_group:
641
+ from sage.combinat.permutation import Permutations
642
+ NewGens = []
643
+ Gens = self.gens()
644
+ for P in Permutations(N):
645
+ NewGens.extend([p**P for p in Gens])
646
+ return (NewGens * R).interreduction(tailreduce=tailreduce, report=report)
647
+ from sage.combinat.permutation import Permutation
648
+ from sage.rings.polynomial.symmetric_reduction import SymmetricReductionStrategy
649
+ RStrat = SymmetricReductionStrategy(self.ring(), OUT.gens(),
650
+ tailreduce=tailreduce)
651
+ while newOUT != OUT:
652
+ OUT = newOUT
653
+ PermutedGens = list(OUT.gens())
654
+ if report is not None:
655
+ print("Apply permutations")
656
+ for i in range(1, N):
657
+ for j in range(i + 1, N + 1):
658
+ P = Permutation((i, j))
659
+ for X in OUT.gens():
660
+ p = RStrat.reduce(X**P, report=report)
661
+ if p._p != 0:
662
+ PermutedGens.append(p)
663
+ RStrat.add_generator(p, good_input=True)
664
+ newOUT = (PermutedGens * R).interreduction(tailreduce=tailreduce,
665
+ report=report)
666
+ return OUT
667
+
668
+ def symmetric_basis(self):
669
+ """
670
+ A symmetrised generating set (type :class:`~sage.structure.sequence.Sequence`) of ``self``.
671
+
672
+ This does essentially the same as :meth:`symmetrisation` with
673
+ the option ``tailreduce``, and it returns a
674
+ :class:`~sage.structure.sequence.Sequence` rather than a
675
+ :class:`~sage.rings.polynomial.symmetric_ideal.SymmetricIdeal`.
676
+
677
+ EXAMPLES::
678
+
679
+ sage: X.<x> = InfinitePolynomialRing(QQ)
680
+ sage: I = X * (x[1] + x[2], x[1]*x[2])
681
+ sage: I.symmetric_basis()
682
+ [x_2^2, x_1^2, x_2 + x_1]
683
+ """
684
+ return Sequence(self.symmetrisation(tailreduce=True).normalisation().gens(), self.ring(), check=False)
685
+
686
+ def normalisation(self):
687
+ """
688
+ Return an ideal that coincides with ``self``, so that all generators have leading coefficient 1.
689
+
690
+ Possibly occurring zeroes are removed from the generator list.
691
+
692
+ EXAMPLES::
693
+
694
+ sage: X.<x> = InfinitePolynomialRing(QQ)
695
+ sage: I = X*(1/2*x[1] + 2/3*x[2], 0, 4/5*x[1]*x[2])
696
+ sage: I.normalisation()
697
+ Symmetric Ideal (x_2 + 3/4*x_1, x_2*x_1) of
698
+ Infinite polynomial ring in x over Rational Field
699
+ """
700
+ return SymmetricIdeal(self.ring(), [X / X.lc() for X in self.gens() if X._p != 0])
701
+
702
+ def squeezed(self):
703
+ """
704
+ Reduce the variable indices occurring in ``self``.
705
+
706
+ OUTPUT:
707
+
708
+ A Symmetric Ideal whose generators are the result of applying
709
+ :meth:`~sage.rings.polynomial.infinite_polynomial_element.InfinitePolynomial_sparse.squeezed`
710
+ to the generators of ``self``.
711
+
712
+ NOTE:
713
+
714
+ The output describes the same Symmetric Ideal as ``self``.
715
+
716
+ EXAMPLES::
717
+
718
+ sage: X.<x,y> = InfinitePolynomialRing(QQ, implementation='sparse')
719
+ sage: I = X * (x[1000]*y[100], x[50]*y[1000])
720
+ sage: I.squeezed()
721
+ Symmetric Ideal (x_2*y_1, x_1*y_2) of
722
+ Infinite polynomial ring in x, y over Rational Field
723
+ """
724
+ return SymmetricIdeal(self.ring(), [X.squeezed() for X in self.gens()])
725
+
726
+ @cached_method
727
+ def groebner_basis(self, tailreduce=False, reduced=True, algorithm=None, report=None, use_full_group=False):
728
+ """
729
+ Return a symmetric Groebner basis (type :class:`~sage.structure.sequence.Sequence`) of ``self``.
730
+
731
+ INPUT:
732
+
733
+ - ``tailreduce`` -- boolean (default: ``False``); if ``True``, use tail reduction
734
+ in intermediate computations
735
+ - ``reduced`` -- boolean (default: ``True``); if ``True``, return the reduced normalised
736
+ symmetric Groebner basis
737
+ - ``algorithm`` -- string (default: ``None``); determine the algorithm (see below for
738
+ available algorithms)
739
+ - ``report`` -- object (default ``None``); if not ``None``, print information on the
740
+ progress of computation
741
+ - ``use_full_group`` -- boolean (default: ``False``); if ``True`` then proceed as
742
+ originally suggested by [AB2008]_. Our default method should be faster; see
743
+ :meth:`symmetrisation` for more details.
744
+
745
+ The computation of symmetric Groebner bases also involves the
746
+ computation of *classical* Groebner bases, i.e., of Groebner
747
+ bases for ideals in polynomial rings with finitely many
748
+ variables. For these computations, Sage provides the following
749
+ ALGORITHMS:
750
+
751
+ ''
752
+ autoselect (default)
753
+
754
+ 'singular:groebner'
755
+ Singular's ``groebner`` command
756
+
757
+ 'singular:std'
758
+ Singular's ``std`` command
759
+
760
+ 'singular:stdhilb'
761
+ Singular's ``stdhib`` command
762
+
763
+ 'singular:stdfglm'
764
+ Singular's ``stdfglm`` command
765
+
766
+ 'singular:slimgb'
767
+ Singular's ``slimgb`` command
768
+
769
+ 'libsingular:std'
770
+ libSingular's ``std`` command
771
+
772
+ 'libsingular:slimgb'
773
+ libSingular's ``slimgb`` command
774
+
775
+ 'toy:buchberger'
776
+ Sage's toy/educational buchberger without strategy
777
+
778
+ 'toy:buchberger2'
779
+ Sage's toy/educational buchberger with strategy
780
+
781
+ 'toy:d_basis'
782
+ Sage's toy/educational d_basis algorithm
783
+
784
+ 'macaulay2:gb'
785
+ Macaulay2's ``gb`` command (if available)
786
+
787
+ 'magma:GroebnerBasis'
788
+ Magma's ``Groebnerbasis`` command (if available)
789
+
790
+
791
+ If only a system is given - e.g. 'magma' - the default algorithm is
792
+ chosen for that system.
793
+
794
+ .. NOTE::
795
+
796
+ The Singular and libSingular versions of the respective
797
+ algorithms are identical, but the former calls an external
798
+ Singular process while the later calls a C function, i.e. the
799
+ calling overhead is smaller.
800
+
801
+ EXAMPLES::
802
+
803
+ sage: X.<x,y> = InfinitePolynomialRing(QQ)
804
+ sage: I1 = X * (x[1] + x[2], x[1]*x[2])
805
+ sage: I1.groebner_basis()
806
+ [x_1]
807
+ sage: I2 = X * (y[1]^2*y[3] + y[1]*x[3])
808
+ sage: I2.groebner_basis()
809
+ [x_1*y_2 + y_2^2*y_1, x_2*y_1 + y_2*y_1^2]
810
+
811
+ Note that a symmetric Groebner basis of a principal ideal is
812
+ not necessarily formed by a single polynomial.
813
+
814
+ When using the algorithm originally suggested by Aschenbrenner
815
+ and Hillar, the result is the same, but the computation takes
816
+ much longer::
817
+
818
+ sage: I2.groebner_basis(use_full_group=True)
819
+ [x_1*y_2 + y_2^2*y_1, x_2*y_1 + y_2*y_1^2]
820
+
821
+ Last, we demonstrate how the report on the progress of
822
+ computations looks like::
823
+
824
+ sage: I1.groebner_basis(report=True, reduced=True)
825
+ Symmetric interreduction
826
+ [1/2] >
827
+ [2/2] :>
828
+ [1/2] >
829
+ [2/2] >
830
+ Symmetrise 2 polynomials at level 2
831
+ Apply permutations
832
+ >
833
+ >
834
+ Symmetric interreduction
835
+ [1/3] >
836
+ [2/3] >
837
+ [3/3] >
838
+ Apply permutations
839
+ >
840
+ :>
841
+ :>
842
+ Symmetric interreduction
843
+ [1/3] >
844
+ [2/3] >
845
+ [3/3] >
846
+ Symmetrisation done
847
+ Classical Groebner basis
848
+ -> 2 generators
849
+ Symmetric interreduction
850
+ [1/2] >
851
+ [2/2] >
852
+ Symmetrise 2 polynomials at level 3
853
+ Apply permutations
854
+ >
855
+ >
856
+ :>
857
+ ::>
858
+ :>
859
+ ::>
860
+ Symmetric interreduction
861
+ [1/4] >
862
+ [2/4] :>
863
+ -> 0
864
+ [3/4] ::>
865
+ -> 0
866
+ [4/4] :>
867
+ -> 0
868
+ [1/1] >
869
+ Apply permutations
870
+ :>
871
+ :>
872
+ :>
873
+ Symmetric interreduction
874
+ [1/1] >
875
+ Classical Groebner basis
876
+ -> 1 generators
877
+ Symmetric interreduction
878
+ [1/1] >
879
+ Symmetrise 1 polynomials at level 4
880
+ Apply permutations
881
+ >
882
+ :>
883
+ :>
884
+ >
885
+ :>
886
+ :>
887
+ Symmetric interreduction
888
+ [1/2] >
889
+ [2/2] :>
890
+ -> 0
891
+ [1/1] >
892
+ Symmetric interreduction
893
+ [1/1] >
894
+ [x_1]
895
+
896
+ The Aschenbrenner-Hillar algorithm is only guaranteed to work
897
+ if the base ring is a field. So, we raise a :exc:`TypeError` if this
898
+ is not the case::
899
+
900
+ sage: R.<x,y> = InfinitePolynomialRing(ZZ)
901
+ sage: I = R * [x[1] + x[2], y[1]]
902
+ sage: I.groebner_basis()
903
+ Traceback (most recent call last):
904
+ ...
905
+ TypeError: The base ring (= Integer Ring) must be a field
906
+
907
+ TESTS:
908
+
909
+ In an earlier version, the following examples failed::
910
+
911
+ sage: X.<y,z> = InfinitePolynomialRing(GF(5), order='degrevlex')
912
+ sage: I = ['-2*y_0^2 + 2*z_0^2 + 1',
913
+ ....: '-y_0^2 + 2*y_0*z_0 - 2*z_0^2 - 2*z_0 - 1',
914
+ ....: 'y_0*z_0 + 2*z_0^2 - 2*z_0 - 1',
915
+ ....: 'y_0^2 + 2*y_0*z_0 - 2*z_0^2 + 2*z_0 - 2',
916
+ ....: '-y_0^2 - 2*y_0*z_0 - z_0^2 + y_0 - 1'] * X
917
+ sage: I.groebner_basis() # not tested (:issue:`39537`)
918
+ [1]
919
+
920
+ sage: Y.<x,y> = InfinitePolynomialRing(GF(3), order='degrevlex',
921
+ ....: implementation='sparse')
922
+ sage: I = ['-y_3'] * Y
923
+ sage: I.groebner_basis()
924
+ [y_1]
925
+ """
926
+ # determine maximal generator index
927
+ # and construct a common parent for the generators of self
928
+ if algorithm is None:
929
+ algorithm = ''
930
+ PARENT = self.ring()
931
+ if PARENT.base_ring() not in Fields():
932
+ raise TypeError("The base ring (= %s) must be a field" % PARENT.base_ring())
933
+ OUT = self.symmetrisation(tailreduce=tailreduce, report=report,
934
+ use_full_group=use_full_group)
935
+ if report is not None:
936
+ print("Symmetrisation done")
937
+ VarList = set()
938
+ for P in OUT.gens():
939
+ if P._p != 0:
940
+ if P.is_unit():
941
+ return Sequence([PARENT(1)], PARENT, check=False)
942
+ VarList = VarList.union([str(X) for X in P.variables()])
943
+ VarList = list(VarList)
944
+ if not VarList:
945
+ return Sequence([PARENT(0)], PARENT, check=False)
946
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
947
+ N = max((int(X.split('_')[1]) for X in VarList), default=1)
948
+
949
+ while True:
950
+ if hasattr(PARENT, '_P'):
951
+ CommonR = PARENT._P
952
+ else:
953
+ VarList = set()
954
+ for P in OUT.gens():
955
+ if P._p != 0:
956
+ if P.is_unit():
957
+ return Sequence([PARENT(1)], PARENT, check=False)
958
+ VarList = VarList.union([str(X) for X in P.variables()])
959
+ VarList = list(VarList)
960
+ VarList.sort(key=PARENT.varname_key, reverse=True)
961
+ CommonR = PolynomialRing(PARENT._base, VarList, order=PARENT._order)
962
+
963
+ try: # working around one libsingular bug and one libsingular oddity
964
+ DenseIdeal = [CommonR(P._p) if ((CommonR is P._p.parent()) or CommonR.ngens() != P._p.parent().ngens()) else CommonR(repr(P._p))
965
+ for P in OUT.gens()] * CommonR
966
+ except Exception:
967
+ if report is not None:
968
+ print("working around a libsingular bug")
969
+ DenseIdeal = [repr(P._p) for P in OUT.gens()] * CommonR
970
+
971
+ if report is not None:
972
+ print("Classical Groebner basis")
973
+ if algorithm != '':
974
+ print("(using %s)" % algorithm)
975
+ newOUT = DenseIdeal.groebner_basis(algorithm) * PARENT
976
+ if report is not None:
977
+ print("->", len(newOUT.gens()), 'generators')
978
+ # Symmetrise out to the next index:
979
+ N += 1
980
+ newOUT = newOUT.symmetrisation(N=N, tailreduce=tailreduce,
981
+ report=report,
982
+ use_full_group=use_full_group)
983
+ if [X.lm() for X in OUT.gens()] == [X.lm() for X in newOUT.gens()]:
984
+ if reduced:
985
+ if tailreduce:
986
+ return Sequence(newOUT.normalisation().gens(), PARENT, check=False)
987
+ return Sequence(newOUT.interreduction(tailreduce=True, report=report).normalisation().gens(), PARENT, check=False)
988
+ return Sequence(newOUT.gens(), PARENT, check=False)
989
+ OUT = newOUT