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,979 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ """
3
+ Quotient Ring Elements
4
+
5
+ AUTHORS:
6
+
7
+ - William Stein
8
+ """
9
+
10
+ # ****************************************************************************
11
+ # Copyright (C) 2005 William Stein <wstein@gmail.com>
12
+ #
13
+ # This program is free software: you can redistribute it and/or modify
14
+ # it under the terms of the GNU General Public License as published by
15
+ # the Free Software Foundation, either version 2 of the License, or
16
+ # (at your option) any later version.
17
+ # https://www.gnu.org/licenses/
18
+ # ****************************************************************************
19
+
20
+ from sage.structure.element import RingElement
21
+ from sage.structure.richcmp import richcmp, rich_to_bool
22
+
23
+ try:
24
+ from sage.features import FeatureNotPresentError
25
+ except ImportError:
26
+ class FeatureNotPresentError(BaseException):
27
+ pass
28
+
29
+ try:
30
+ from sage.interfaces.singular import singular as singular_default
31
+ except (ImportError, FeatureNotPresentError):
32
+ singular_default = None
33
+
34
+
35
+ class QuotientRingElement(RingElement):
36
+ """
37
+ An element of a quotient ring `R/I`.
38
+
39
+ INPUT:
40
+
41
+ - ``parent`` -- the ring `R/I`
42
+
43
+ - ``rep`` -- a representative of the element in `R`; this is used
44
+ as the internal representation of the element
45
+
46
+ - ``reduce`` -- boolean (default: ``True``); if ``True``, then the
47
+ internal representation of the element is ``rep`` reduced modulo
48
+ the ideal `I`
49
+
50
+ EXAMPLES::
51
+
52
+ sage: R.<x> = PolynomialRing(ZZ)
53
+ sage: S.<xbar> = R.quo((4 + 3*x + x^2, 1 + x^2)); S
54
+ Quotient of Univariate Polynomial Ring in x over Integer Ring
55
+ by the ideal (x^2 + 3*x + 4, x^2 + 1)
56
+ sage: v = S.gens(); v
57
+ (xbar,)
58
+
59
+ ::
60
+
61
+ sage: loads(v[0].dumps()) == v[0]
62
+ True
63
+
64
+ ::
65
+
66
+ sage: R.<x,y> = PolynomialRing(QQ, 2)
67
+ sage: S = R.quo(x^2 + y^2); S
68
+ Quotient of Multivariate Polynomial Ring in x, y over Rational Field
69
+ by the ideal (x^2 + y^2)
70
+ sage: S.gens() # needs sage.libs.singular
71
+ (xbar, ybar)
72
+
73
+ We name each of the generators.
74
+
75
+ ::
76
+
77
+ sage: # needs sage.libs.singular
78
+ sage: S.<a,b> = R.quotient(x^2 + y^2)
79
+ sage: a
80
+ a
81
+ sage: b
82
+ b
83
+ sage: a^2 + b^2 == 0
84
+ True
85
+ sage: b.lift()
86
+ y
87
+ sage: (a^3 + b^2).lift()
88
+ -x*y^2 + y^2
89
+ """
90
+ def __init__(self, parent, rep, reduce=True):
91
+ """
92
+ An element of a quotient ring `R/I`. See
93
+ ``QuotientRingElement`` for full documentation.
94
+
95
+ EXAMPLES::
96
+
97
+ sage: R.<x> = PolynomialRing(ZZ)
98
+ sage: S.<xbar> = R.quo((4 + 3*x + x^2, 1 + x^2)); S
99
+ Quotient of Univariate Polynomial Ring in x over Integer Ring
100
+ by the ideal (x^2 + 3*x + 4, x^2 + 1)
101
+ sage: v = S.gens(); v
102
+ (xbar,)
103
+ """
104
+ RingElement.__init__(self, parent)
105
+ self.__rep = rep
106
+ if reduce:
107
+ self._reduce_()
108
+
109
+ def _reduce_(self):
110
+ """
111
+ Reduce the element modulo the defining ideal of the quotient
112
+ ring. This internal method replaces the cached representative
113
+ by one in reduced form.
114
+
115
+ (Note that this has nothing to do with pickling.)
116
+
117
+ TESTS::
118
+
119
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
120
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
121
+ sage: a._reduce_() # needs sage.libs.singular
122
+ sage: a._QuotientRingElement__rep # needs sage.libs.singular
123
+ x
124
+ """
125
+ I = self.parent().defining_ideal()
126
+ self.__rep = I.reduce(self.__rep)
127
+
128
+ def lift(self):
129
+ """
130
+ If ``self`` is an element of `R/I`, then return ``self`` as an
131
+ element of `R`.
132
+
133
+ EXAMPLES::
134
+
135
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
136
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
137
+ sage: a.lift() # needs sage.libs.singular
138
+ x
139
+ sage: (3/5*(a + a^2 + b^2)).lift() # needs sage.libs.singular
140
+ 3/5*x
141
+ """
142
+ return self.__rep
143
+
144
+ def __bool__(self):
145
+ """
146
+ Return ``True`` if quotient ring element is nonzero in the
147
+ quotient ring `R/I`, by determining whether the element
148
+ is in `I`.
149
+
150
+ EXAMPLES::
151
+
152
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
153
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
154
+ sage: bool(a) # indirect doctest # needs sage.libs.singular
155
+ True
156
+ sage: bool(S(0)) # needs sage.libs.singular
157
+ False
158
+
159
+ TESTS::
160
+
161
+ sage: bool(a - a) # needs sage.libs.singular
162
+ False
163
+ """
164
+ return self.__rep not in self.parent().defining_ideal()
165
+
166
+ def is_unit(self):
167
+ """
168
+ Return ``True`` if ``self`` is a unit in the quotient ring.
169
+
170
+ EXAMPLES::
171
+
172
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(1 - x*y); type(a) # needs sage.libs.singular
173
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
174
+ sage: a*b # needs sage.libs.singular
175
+ 1
176
+ sage: S(2).is_unit() # needs sage.libs.singular
177
+ True
178
+
179
+ Check that :issue:`29469` is fixed::
180
+
181
+ sage: a.is_unit() # needs sage.libs.singular
182
+ True
183
+ sage: (a+b).is_unit() # needs sage.libs.singular
184
+ False
185
+ """
186
+ if self.__rep.is_unit():
187
+ return True
188
+ from sage.categories.fields import Fields
189
+ if self.parent() in Fields():
190
+ return not self.is_zero()
191
+ try:
192
+ self.__invert__()
193
+ return True
194
+ except ArithmeticError:
195
+ return False
196
+ raise NotImplementedError
197
+
198
+ def _repr_(self):
199
+ """
200
+ String representation.
201
+
202
+ TESTS::
203
+
204
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
205
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
206
+ sage: a-2*a*b # indirect doctest # needs sage.libs.singular
207
+ -2*a*b + a
208
+
209
+ In :issue:`11068`, the case of quotient rings without
210
+ assigned names has been covered as well::
211
+
212
+ sage: # needs sage.libs.singular
213
+ sage: S = SteenrodAlgebra(2)
214
+ sage: I = S * [S.0 + S.1] * S
215
+ sage: Q = S.quo(I)
216
+ sage: Q.0
217
+ Sq(1)
218
+ """
219
+ from sage.structure.parent_gens import localvars
220
+ P = self.parent()
221
+ R = P.cover_ring()
222
+ # We print by temporarily (and safely!) changing the variable
223
+ # names of the covering structure R to those of P.
224
+ # These names get changed back, since we're using "with".
225
+ # However, it may occur that no variable names are assigned.
226
+ # That holds, in particular, if there are infinitely many
227
+ # generators, as for Steenrod algebras.
228
+ try:
229
+ P.variable_names()
230
+ except ValueError:
231
+ return str(self.__rep)
232
+ with localvars(R, P.variable_names(), normalize=False):
233
+ return str(self.__rep)
234
+
235
+ def _latex_(self):
236
+ """
237
+ Return the LaTeX representation as a string.
238
+
239
+ EXAMPLES::
240
+
241
+ sage: R = PolynomialRing(QQ, 'a, b, c')
242
+ sage: a = R.gen(0)
243
+ sage: I = R.ideal(a**2 + a + 1)
244
+ sage: S = R.quotient(I, names=R.variable_names())
245
+ sage: a = S.gen(0) # needs sage.libs.singular
246
+ sage: latex(a)
247
+ a
248
+ """
249
+ from sage.structure.parent_gens import localvars
250
+ P = self.parent()
251
+ R = P.cover_ring()
252
+ # see _repr_ above for the idea
253
+ try:
254
+ P.variable_names()
255
+ except ValueError:
256
+ return self.__rep._latex_()
257
+ with localvars(R, P.variable_names(), normalize=False):
258
+ return self.__rep._latex_()
259
+
260
+ def __pari__(self):
261
+ """
262
+ The Pari representation of this quotient element.
263
+
264
+ Since Pari does not support quotients by non-principal ideals,
265
+ this function will raise an error in that case.
266
+
267
+ EXAMPLES::
268
+
269
+ sage: R.<x,y> = QQ[]
270
+ sage: I = R.ideal(x^3, y^3)
271
+ sage: S.<xb,yb> = R.quo(I) # needs sage.libs.singular
272
+ sage: pari(xb) # needs sage.libs.pari sage.libs.singular
273
+ Traceback (most recent call last):
274
+ ...
275
+ ValueError: Pari does not support quotients by non-principal ideals
276
+
277
+ Note that the quotient does work in the case that the ideal is principal::
278
+
279
+ sage: I = R.ideal(x^3 + y^3)
280
+ sage: S.<xb,yb> = R.quo(I) # needs sage.libs.singular
281
+ sage: pari(xb)^4 # needs sage.libs.pari sage.libs.singular
282
+ Mod(-y^3*x, x^3 + y^3)
283
+ sage: pari(yb)^4 # needs sage.libs.pari sage.libs.singular
284
+ Mod(y^4, x^3 + y^3)
285
+ """
286
+ gens = self.parent().defining_ideal().gens()
287
+ if len(gens) != 1:
288
+ raise ValueError("Pari does not support quotients by non-principal ideals")
289
+ return self.__rep.__pari__().Mod(gens[0])
290
+
291
+ def _add_(self, right):
292
+ """
293
+ Add quotient ring element ``self`` to another quotient ring
294
+ element, ``right``. If the quotient is `R/I`, the addition is
295
+ carried out in `R` and then reduced to `R/I`.
296
+
297
+ EXAMPLES::
298
+
299
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
300
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
301
+ sage: a + b # needs sage.libs.singular
302
+ a + b
303
+
304
+ TESTS::
305
+
306
+ sage: a._add_(b) # needs sage.libs.singular
307
+ a + b
308
+ """
309
+ return self.__class__(self.parent(), self.__rep + right.__rep)
310
+
311
+ def _sub_(self, right):
312
+ """
313
+ Subtract quotient ring element ``right`` from quotient ring
314
+ element ``self``. If the quotient is `R/I`, the subtraction is
315
+ carried out in `R` and then reduced to `R/I`.
316
+
317
+ EXAMPLES::
318
+
319
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
320
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
321
+ sage: a - b # needs sage.libs.singular
322
+ a - b
323
+
324
+ TESTS::
325
+
326
+ sage: a._sub_(b) # needs sage.libs.singular
327
+ a - b
328
+ """
329
+ return self.__class__(self.parent(), self.__rep - right.__rep)
330
+
331
+ def _mul_(self, right):
332
+ """
333
+ Multiply quotient ring element ``self`` by another quotient ring
334
+ element, ``right``. If the quotient is `R/I`, the multiplication is
335
+ carried out in `R` and then reduced to `R/I`.
336
+
337
+ EXAMPLES::
338
+
339
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
340
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
341
+ sage: a * b # needs sage.libs.singular
342
+ a*b
343
+
344
+ TESTS::
345
+
346
+ sage: a._mul_(b) # needs sage.libs.singular
347
+ a*b
348
+ sage: a._mul_(a) # needs sage.libs.singular
349
+ -b^2
350
+ """
351
+ return self.__class__(self.parent(), self.__rep * right.__rep)
352
+
353
+ def _div_(self, right):
354
+ """
355
+ Divide quotient ring element ``self`` by another quotient ring
356
+ element, ``right``. If the quotient is `R/I`, the division is
357
+ carried out in `R` and then reduced to `R/I`.
358
+
359
+ EXAMPLES::
360
+
361
+ sage: R.<x,y> = QQ[]
362
+ sage: I = R.ideal([x^2 + 1, y^3 - 2])
363
+ sage: S.<i,cuberoot> = R.quotient(I) # needs sage.libs.singular
364
+ sage: 1/(1+i) # needs sage.libs.singular
365
+ -1/2*i + 1/2
366
+
367
+ Confirm via symbolic computation::
368
+
369
+ sage: 1/(1+sqrt(-1)) # needs sage.symbolic
370
+ -1/2*I + 1/2
371
+
372
+ Another more complicated quotient::
373
+
374
+ sage: b = 1/(i+cuberoot); b # needs sage.libs.singular
375
+ 1/5*i*cuberoot^2 - 2/5*i*cuberoot + 2/5*cuberoot^2 - 1/5*i + 1/5*cuberoot - 2/5
376
+ sage: b*(i+cuberoot) # needs sage.libs.singular
377
+ 1
378
+
379
+
380
+ Another really easy example::
381
+
382
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
383
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
384
+ sage: a / S(2) # needs sage.libs.singular
385
+ 1/2*a
386
+ sage: (a*b)._div_(b) # needs sage.libs.singular
387
+ a
388
+
389
+ An example in which we try to divide in a ring that is not a
390
+ field::
391
+
392
+ sage: R.<x,y> = QQ[]
393
+ sage: I = R.ideal([x^2 - 1, y^3 - 2])
394
+ sage: S.<a,cuberoot> = R.quotient(I) # needs sage.libs.singular
395
+ sage: 1/cuberoot # needs sage.libs.singular
396
+ 1/2*cuberoot^2
397
+ sage: 1/a # needs sage.libs.singular
398
+ a
399
+
400
+ Check that :issue:`13670` is fixed (i.e. that the error message
401
+ actually describes what happens when the result of division is not defined)::
402
+
403
+ sage: R.<x1,x2> = QQ[]
404
+ sage: S = R.quotient_ring( R.ideal(x2**2 + x1 - 2, x1**2 - 1) )
405
+ sage: 1 / S(x1 + x2) # needs sage.libs.singular
406
+ Traceback (most recent call last):
407
+ ...
408
+ ArithmeticError: Division failed. The numerator is not a multiple of the denominator.
409
+
410
+ An example over a polynomial ring over a polynomial ring,
411
+ which doesn't work (yet; obviously, this could be made to work
412
+ by converting to a single polynomial quotient ring
413
+ internally)::
414
+
415
+ sage: R.<x> = QQ[]
416
+ sage: S.<y,z> = R[]
417
+ sage: Z.<ybar,zbar> = S.quotient([y^2 - 2, z^2 - 3]) # needs sage.libs.singular
418
+ Traceback (most recent call last):
419
+ ...
420
+ TypeError: Can only reduce polynomials over fields.
421
+ """
422
+ # Special case: if self==0 (and right is nonzero), just return self.
423
+ if not self:
424
+ if not right:
425
+ raise ZeroDivisionError
426
+ return self
427
+
428
+ # We are computing L/R modulo the ideal.
429
+ (L, R) = (self.__rep, right.__rep)
430
+ P = self.parent()
431
+ I = P.defining_ideal()
432
+
433
+ if not hasattr(I, 'groebner_basis'):
434
+ # Try something very naive -- somebody will improve this
435
+ # in the future.
436
+ try:
437
+ return L * R.inverse_mod(I)
438
+ except NotImplementedError:
439
+ if R.is_unit():
440
+ return L * ~R
441
+ else:
442
+ raise
443
+
444
+ # Now the parent is a polynomial ring, so we have an algorithm
445
+ # at our disposal.
446
+
447
+ # Our algorithm is to write L in terms of R and a Groebner
448
+ # basis for the defining ideal. We compute a Groebner basis
449
+ # here explicitly purely for efficiency reasons, since it
450
+ # makes the implicit Groebner basis computation of [R]+B
451
+ # that is done in the lift command below faster.
452
+
453
+ B = I.groebner_basis()
454
+ try:
455
+ XY = L.lift((R,) + tuple(B))
456
+ except ValueError:
457
+ raise ArithmeticError("Division failed. The numerator is not "
458
+ "a multiple of the denominator.")
459
+ return P(XY[0])
460
+
461
+ def _im_gens_(self, codomain, im_gens, base_map=None):
462
+ """
463
+ Return the image of ``self`` in ``codomain`` under the map
464
+ that sends ``self.parent().gens()`` to ``im_gens``.
465
+
466
+ INPUT:
467
+
468
+ - ``codomain`` -- a ring
469
+
470
+ - ``im_gens`` -- tuple of elements `f(x)` in ``codomain``,
471
+ one for each `x` in ``self.parent().gens()``, that define
472
+ a homomorphism `f` from ``self.parent()`` to ``codomain``
473
+
474
+ OUTPUT:
475
+
476
+ The image of ``self`` in ``codomain`` under the above
477
+ homomorphism `f`.
478
+
479
+ EXAMPLES:
480
+
481
+ Ring homomorphisms whose domain is the fraction field of a
482
+ quotient ring work correctly (see :issue:`16135`)::
483
+
484
+ sage: # needs sage.libs.singular
485
+ sage: R.<x, y> = QQ[]
486
+ sage: K = R.quotient(x^2 - y^3).fraction_field()
487
+ sage: L.<t> = FunctionField(QQ)
488
+ sage: f = K.hom((t^3, t^2))
489
+ sage: list(map(f, K.gens()))
490
+ [t^3, t^2]
491
+ sage: xbar, ybar = K.gens()
492
+ sage: f(1/ybar)
493
+ 1/t^2
494
+ sage: f(xbar/ybar)
495
+ t
496
+ """
497
+ return self.lift()._im_gens_(codomain, im_gens, base_map=base_map)
498
+
499
+ def __int__(self):
500
+ """
501
+ Try to convert ``self`` (an element of `R/I`) to an integer by
502
+ converting its lift in `R` to an integer. Return a TypeError
503
+ if no such conversion can be found.
504
+
505
+ EXAMPLES::
506
+
507
+ sage: # needs sage.libs.singular
508
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
509
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
510
+ sage: int(S(-3)) # indirect doctest
511
+ -3
512
+ sage: type(int(S(-3)))
513
+ <... 'int'>
514
+ sage: int(a)
515
+ Traceback (most recent call last):
516
+ ...
517
+ TypeError: unable to convert non-constant polynomial x to <class 'int'>
518
+ """
519
+ return int(self.lift())
520
+
521
+ def _integer_(self, Z):
522
+ """
523
+ EXAMPLES::
524
+
525
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
526
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
527
+ sage: ZZ(S(-3)) # needs sage.libs.singular
528
+ -3
529
+
530
+ TESTS::
531
+
532
+ sage: type(ZZ(S(-3))) # needs sage.libs.singular
533
+ <class 'sage.rings.integer.Integer'>
534
+ """
535
+ return Z(self.lift())
536
+
537
+ def _rational_(self):
538
+ """
539
+ EXAMPLES::
540
+
541
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
542
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
543
+ sage: QQ(S(-2/3)) # needs sage.libs.singular
544
+ -2/3
545
+
546
+ TESTS::
547
+
548
+ sage: type(S(-2/3)._rational_()) # needs sage.libs.singular
549
+ <class 'sage.rings.rational.Rational'>
550
+ """
551
+ from sage.rings.rational_field import QQ
552
+ return QQ(self.lift())
553
+
554
+ def __neg__(self):
555
+ """
556
+ EXAMPLES::
557
+
558
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
559
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
560
+ sage: -a # indirect doctest # needs sage.libs.singular
561
+ -a
562
+ sage: -(a+b) # needs sage.libs.singular
563
+ -a - b
564
+ """
565
+ return self.__class__(self.parent(), -self.__rep)
566
+
567
+ def __pos__(self):
568
+ """
569
+ TESTS::
570
+
571
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
572
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
573
+ sage: (a+b).__pos__() # needs sage.libs.singular
574
+ a + b
575
+ sage: c = a+b; c.__pos__() is c # needs sage.libs.singular
576
+ True
577
+ """
578
+ return self
579
+
580
+ def __invert__(self):
581
+ """
582
+ EXAMPLES::
583
+
584
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
585
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
586
+ sage: ~S(2/3) # needs sage.libs.singular
587
+ 3/2
588
+
589
+ TESTS::
590
+
591
+ sage: S(2/3).__invert__() # needs sage.libs.singular
592
+ 3/2
593
+
594
+ Note that a is not invertible as an element of R::
595
+
596
+ sage: a.__invert__() # needs sage.libs.singular
597
+ Traceback (most recent call last):
598
+ ...
599
+ ArithmeticError: element is non-invertible
600
+ """
601
+ try:
602
+ inv = self.__rep.inverse_mod(self.parent().defining_ideal())
603
+ except NotImplementedError:
604
+ return self.parent().one()/self
605
+ return self.__class__(self.parent(), inv)
606
+
607
+ def __float__(self):
608
+ """
609
+ EXAMPLES::
610
+
611
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
612
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
613
+ sage: float(S(2/3)) # needs sage.libs.singular
614
+ 0.6666666666666666
615
+ sage: float(a) # needs sage.libs.singular
616
+ Traceback (most recent call last):
617
+ ...
618
+ TypeError: unable to convert non-constant polynomial x to <class 'float'>
619
+ """
620
+ return float(self.lift())
621
+
622
+ def __hash__(self):
623
+ r"""
624
+ TESTS::
625
+
626
+ sage: # needs sage.libs.singular
627
+ sage: R.<x,y> = QQ[]
628
+ sage: S.<a,b> = R.quo(x^2 + y^2)
629
+ sage: c = a*a + b
630
+ sage: hash(a) != hash(b)
631
+ True
632
+ """
633
+ return hash(self.__rep)
634
+
635
+ def _richcmp_(self, other, op):
636
+ """
637
+ EXAMPLES::
638
+
639
+ sage: # needs sage.libs.singular
640
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
641
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
642
+ sage: a > b # indirect doctest
643
+ True
644
+ sage: b > a
645
+ False
646
+ sage: a == loads(dumps(a))
647
+ True
648
+
649
+ TESTS::
650
+
651
+ sage: a == (a+1-1) # needs sage.libs.singular
652
+ True
653
+ sage: a > b # needs sage.libs.singular
654
+ True
655
+
656
+ See :issue:`7797`::
657
+
658
+ sage: # needs sage.combinat sage.libs.singular sage.modules
659
+ sage: F.<x,y,z> = FreeAlgebra(QQ, implementation='letterplace')
660
+ sage: I = F * [x*y + y*z, x^2 + x*y - y*x - y^2] * F
661
+ sage: Q = F.quo(I)
662
+ sage: Q.0^4 # indirect doctest
663
+ ybar*zbar*zbar*xbar + ybar*zbar*zbar*ybar + ybar*zbar*zbar*zbar
664
+
665
+ The issue from :issue:`8005` was most likely fixed as part of
666
+ :issue:`9138`::
667
+
668
+ sage: # needs sage.libs.singular
669
+ sage: F = GF(5)
670
+ sage: R.<x,y> = F[]
671
+ sage: I = Ideal(R, [x, y])
672
+ sage: S.<x1,y1> = QuotientRing(R, I)
673
+ sage: x1^4
674
+ 0
675
+ """
676
+ # A containment test is not implemented for univariate polynomial
677
+ # ideals. There are cases in which one would not like to add
678
+ # elements of different degrees. The whole quotient stuff relies
679
+ # in I.reduce(x) returning a normal form of x with respect to I.
680
+ # Hence, we will not use more than that.
681
+
682
+ # Since we have to compute normal forms anyway, it makes sense
683
+ # to use it for comparison in the case of an inequality as well.
684
+ if self.__rep == other.__rep:
685
+ # Use a shortpath, so that we avoid expensive reductions
686
+ return rich_to_bool(op, 0)
687
+ I = self.parent().defining_ideal()
688
+ return richcmp(I.reduce(self.__rep), I.reduce(other.__rep), op)
689
+
690
+ def lt(self):
691
+ """
692
+ Return the leading term of this quotient ring element.
693
+
694
+ EXAMPLES::
695
+
696
+ sage: # needs sage.libs.singular
697
+ sage: R.<x,y,z> = PolynomialRing(GF(7), 3, order='lex')
698
+ sage: I = sage.rings.ideal.FieldIdeal(R)
699
+ sage: Q = R.quo(I)
700
+ sage: f = Q(z*y + 2*x)
701
+ sage: f.lt()
702
+ 2*xbar
703
+
704
+ TESTS::
705
+
706
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
707
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
708
+ sage: (a + 3*a*b + b).lt() # needs sage.libs.singular
709
+ 3*a*b
710
+ """
711
+ return self.__class__(self.parent(), self.__rep.lt())
712
+
713
+ def lm(self):
714
+ """
715
+ Return the leading monomial of this quotient ring element.
716
+
717
+ EXAMPLES::
718
+
719
+ sage: # needs sage.libs.singular
720
+ sage: R.<x,y,z> = PolynomialRing(GF(7), 3, order='lex')
721
+ sage: I = sage.rings.ideal.FieldIdeal(R)
722
+ sage: Q = R.quo(I)
723
+ sage: f = Q(z*y + 2*x)
724
+ sage: f.lm()
725
+ xbar
726
+
727
+ TESTS::
728
+
729
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
730
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
731
+ sage: (a+3*a*b+b).lm() # needs sage.libs.singular
732
+ a*b
733
+ """
734
+ return self.__class__(self.parent(), self.__rep.lm())
735
+
736
+ def lc(self):
737
+ """
738
+ Return the leading coefficient of this quotient ring element.
739
+
740
+ EXAMPLES::
741
+
742
+ sage: # needs sage.libs.singular
743
+ sage: R.<x,y,z> = PolynomialRing(GF(7), 3, order='lex')
744
+ sage: I = sage.rings.ideal.FieldIdeal(R)
745
+ sage: Q = R.quo(I)
746
+ sage: f = Q(z*y + 2*x)
747
+ sage: f.lc()
748
+ 2
749
+
750
+ TESTS::
751
+
752
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a) # needs sage.libs.singular
753
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
754
+ sage: (a + 3*a*b + b).lc() # needs sage.libs.singular
755
+ 3
756
+ """
757
+ return self.__rep.lc()
758
+
759
+ def variables(self):
760
+ """
761
+ Return all variables occurring in ``self``.
762
+
763
+ OUTPUT:
764
+
765
+ A tuple of linear monomials, one for each variable occurring
766
+ in ``self``.
767
+
768
+ EXAMPLES::
769
+
770
+ sage: # needs sage.libs.singular
771
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
772
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
773
+ sage: a.variables()
774
+ (a,)
775
+ sage: b.variables()
776
+ (b,)
777
+ sage: s = a^2 + b^2 + 1; s
778
+ 1
779
+ sage: s.variables()
780
+ ()
781
+ sage: (a + b).variables()
782
+ (a, b)
783
+ """
784
+ return tuple(self.__class__(self.parent(), v) for v in self.__rep.variables())
785
+
786
+ def monomials(self):
787
+ """
788
+ Return the monomials in ``self``.
789
+
790
+ OUTPUT: list of monomials
791
+
792
+ EXAMPLES::
793
+
794
+ sage: # needs sage.libs.singular
795
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
796
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
797
+ sage: a.monomials()
798
+ [a]
799
+ sage: (a + a*b).monomials()
800
+ [a*b, a]
801
+ sage: R.zero().monomials()
802
+ []
803
+ """
804
+ return [self.__class__(self.parent(), m) for m in self.__rep.monomials()]
805
+
806
+ def _singular_(self, singular=None):
807
+ """
808
+ Return Singular representation of ``self``.
809
+
810
+ INPUT:
811
+
812
+ - ``singular`` -- a non-standard interpreter may be provided
813
+
814
+ EXAMPLES::
815
+
816
+ sage: # needs sage.libs.singular
817
+ sage: P.<x,y> = PolynomialRing(GF(2), 2)
818
+ sage: I = sage.rings.ideal.FieldIdeal(P)
819
+ sage: Q = P.quo(I)
820
+ sage: Q._singular_()
821
+ polynomial ring, over a field, global ordering
822
+ // coefficients: ZZ/2...
823
+ // number of vars : 2
824
+ // block 1 : ordering dp
825
+ // : names x y
826
+ // block 2 : ordering C
827
+ // quotient ring from ideal
828
+ _[1]=x2+x
829
+ _[2]=y2+y
830
+ sage: xbar = Q(x); xbar
831
+ xbar
832
+ sage: xbar._singular_()
833
+ x
834
+ sage: Q(xbar._singular_()) # a round-trip
835
+ xbar
836
+
837
+ TESTS::
838
+
839
+ sage: # needs sage.libs.singular
840
+ sage: R.<x,y> = QQ[]; S.<a,b> = R.quo(x^2 + y^2); type(a)
841
+ <class 'sage.rings.quotient_ring.QuotientRing_generic_with_category.element_class'>
842
+ sage: (a - 2/3*b)._singular_()
843
+ x-2/3*y
844
+ sage: S((a - 2/3*b)._singular_())
845
+ a - 2/3*b
846
+ """
847
+ if singular is None:
848
+ singular = singular_default
849
+ if singular is None:
850
+ raise ImportError("could not import singular")
851
+ return self.__rep._singular_(singular)
852
+
853
+ def _magma_init_(self, magma):
854
+ """
855
+ Return the Magma representation of this quotient ring element.
856
+
857
+ EXAMPLES::
858
+
859
+ sage: # needs sage.libs.singular
860
+ sage: P.<x,y> = PolynomialRing(GF(2))
861
+ sage: Q = P.quotient(sage.rings.ideal.FieldIdeal(P))
862
+ sage: xbar, ybar = Q.gens()
863
+ sage: magma(xbar) # optional - magma
864
+ x
865
+ sage: xbar._magma_init_(magma) # optional - magma
866
+ '_sage_[...]!_sage_ref...'
867
+ """
868
+ g = magma(self.__rep)
869
+ R = magma(self.parent())
870
+ return '{}!{}'.format(R.name(), g._ref())
871
+
872
+ def _macaulay2_(self, macaulay2=None):
873
+ """
874
+ The Macaulay2 element corresponding to this polynomial.
875
+
876
+ EXAMPLES::
877
+
878
+ sage: # needs sage.libs.singular
879
+ sage: R.<x,y> = PolynomialRing(GF(7), 2)
880
+ sage: Q = R.quotient([x^2 - y])
881
+ sage: x, y = Q.gens()
882
+ sage: f = (x^3 + 2*y^2*x)^7; f
883
+ 2*xbar*ybar^17 + xbar*ybar^10
884
+ sage: mf = macaulay2(f); mf # optional - macaulay2
885
+ 17 10
886
+ 2x*y + x*y
887
+ sage: mf.sage() # optional - macaulay2
888
+ 2*x*y^17 + x*y^10
889
+ sage: mf.sage() == f # optional - macaulay2
890
+ True
891
+ sage: Q(mf) # optional - macaulay2
892
+ 2*xbar*ybar^17 + xbar*ybar^10
893
+
894
+ In Macaulay2, the variable names for a quotient ring are inherited from
895
+ the variable names of the ambient ring. This is in contrast to Sage's
896
+ default behaviour in which the variable names for the quotient ring are
897
+ obtained by appending ``bar`` to the variable names of the ambient
898
+ ring. This can be controlled using the ``names`` argument of the
899
+ ``quotient`` method.
900
+
901
+ ::
902
+
903
+ sage: # needs sage.libs.singular
904
+ sage: R.<x,y> = PolynomialRing(GF(7), 2)
905
+ sage: Q = R.quotient([x^2 - y], names=R.gens())
906
+ sage: x, y = Q.gens()
907
+ sage: f = (x^3 + 2*y^2*x)^7; f
908
+ 2*x*y^17 + x*y^10
909
+ sage: macaulay2(f) # optional - macaulay2
910
+ 17 10
911
+ 2x*y + x*y
912
+ sage: _.sage() # optional - macaulay2
913
+ 2*x*y^17 + x*y^10
914
+
915
+ TESTS:
916
+
917
+ Check that changing the currently defined global variables (`x`, `y`,
918
+ ...) in Macaulay2 does not affect the result of this conversion::
919
+
920
+ sage: # needs sage.libs.singular
921
+ sage: R.<x,y> = PolynomialRing(GF(7), 2)
922
+ sage: Q = R.quotient([x^2 - y], names=R.gens())
923
+ sage: x, y = Q.gens()
924
+ sage: f = (x^3 + 2*y^2*x)^7
925
+ sage: macaulay2(f) # optional - macaulay2
926
+ 17 10
927
+ 2x*y + x*y
928
+ sage: macaulay2.use(R.quotient([x, y])) # optional - macaulay2
929
+ sage: macaulay2(f) # optional - macaulay2
930
+ 17 10
931
+ 2x*y + x*y
932
+ """
933
+ if macaulay2 is None:
934
+ from sage.interfaces.macaulay2 import macaulay2 as m2_default
935
+ macaulay2 = m2_default
936
+ m2_parent = self.parent()._macaulay2_(macaulay2)
937
+ macaulay2.use(m2_parent)
938
+ return macaulay2.substitute(repr(self.lift()), m2_parent)
939
+
940
+ def reduce(self, G):
941
+ r"""
942
+ Reduce this quotient ring element by a set of quotient ring
943
+ elements ``G``.
944
+
945
+ INPUT:
946
+
947
+ - ``G`` -- list of quotient ring elements
948
+
949
+ .. WARNING::
950
+
951
+ This method is not guaranteed to return unique minimal results.
952
+ For quotients of polynomial rings, use
953
+ :meth:`~sage.rings.polynomial.multi_polynomial_ideal.MPolynomialIdeal.reduce`
954
+ on the ideal generated by ``G``, instead.
955
+
956
+ EXAMPLES::
957
+
958
+ sage: # needs sage.libs.singular
959
+ sage: P.<a,b,c,d,e> = PolynomialRing(GF(2), 5, order='lex')
960
+ sage: I1 = ideal([a*b + c*d + 1, a*c*e + d*e,
961
+ ....: a*b*e + c*e, b*c + c*d*e + 1])
962
+ sage: Q = P.quotient(sage.rings.ideal.FieldIdeal(P))
963
+ sage: I2 = ideal([Q(f) for f in I1.gens()])
964
+ sage: f = Q((a*b + c*d + 1)^2 + e)
965
+ sage: f.reduce(I2.gens())
966
+ ebar
967
+
968
+ Notice that the result above is not minimal::
969
+
970
+ sage: I2.reduce(f) # needs sage.libs.singular
971
+ 0
972
+ """
973
+ try:
974
+ G = [f.lift() for f in G]
975
+ except TypeError:
976
+ pass
977
+ # reduction w.r.t. the defining ideal is performed in the
978
+ # constructor
979
+ return self.__class__(self.parent(), self.__rep.reduce(G))