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,1176 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.rings.finite_rings
3
+ """
4
+ Base class for finite field elements
5
+
6
+ AUTHORS:
7
+
8
+ - David Roe (2010-01-14): factored out of sage.structure.element
9
+ - Sebastian Oehms (2018-07-19): added :meth:`conjugate` (see :issue:`26761`)
10
+ """
11
+
12
+ # ****************************************************************************
13
+ # Copyright (C) 2010 David Roe <roed@math.harvard.edu>
14
+ #
15
+ # This program is free software: you can redistribute it and/or modify
16
+ # it under the terms of the GNU General Public License as published by
17
+ # the Free Software Foundation, either version 2 of the License, or
18
+ # (at your option) any later version.
19
+ # https://www.gnu.org/licenses/
20
+ # ****************************************************************************
21
+
22
+ from sage.structure.element cimport Element
23
+ from sage.structure.parent cimport Parent
24
+ from sage.rings.integer_ring import ZZ
25
+ from sage.rings.integer import Integer
26
+
27
+
28
+ def is_FiniteFieldElement(x):
29
+ """
30
+ Return ``True`` if ``x`` is a finite field element.
31
+
32
+ This function is deprecated.
33
+
34
+ EXAMPLES::
35
+
36
+ sage: from sage.rings.finite_rings.element_base import is_FiniteFieldElement
37
+ sage: is_FiniteFieldElement(1)
38
+ doctest:...: DeprecationWarning: the function is_FiniteFieldElement is deprecated; use isinstance(x, sage.structure.element.FieldElement) and x.parent().is_finite() instead
39
+ See https://github.com/sagemath/sage/issues/32664 for details.
40
+ False
41
+ sage: is_FiniteFieldElement(IntegerRing())
42
+ False
43
+ sage: is_FiniteFieldElement(GF(5)(2))
44
+ True
45
+ """
46
+ from sage.misc.superseded import deprecation
47
+ deprecation(32664, "the function is_FiniteFieldElement is deprecated; use isinstance(x, sage.structure.element.FieldElement) and x.parent().is_finite() instead")
48
+
49
+ from sage.rings.finite_rings.finite_field_base import FiniteField
50
+ return isinstance(x, Element) and isinstance(x.parent(), FiniteField)
51
+
52
+
53
+ cdef class FiniteRingElement(CommutativeRingElement):
54
+ def _nth_root_common(self, n, all, algorithm, cunningham):
55
+ """
56
+ This function exists to reduce code duplication between finite field
57
+ `n`-th roots and ``integer_mod`` `n`-th roots. It assumes that ``self``
58
+ is a field element.
59
+
60
+ The inputs are described there.
61
+
62
+ TESTS::
63
+
64
+ sage: a = Zmod(17)(13)
65
+ sage: sorted(a._nth_root_common(4, True, "Johnston", False))
66
+ [3, 5, 12, 14]
67
+ sage: sorted(a._nth_root_common(4, True, "Johnston", cunningham=True)) # optional - cunningham_tables
68
+ [3, 5, 12, 14]
69
+
70
+ Test various prime powers::
71
+
72
+ sage: p = 5^5*10000000100 + 1
73
+ sage: a = GF(p)(3)**(5^7)
74
+ sage: for e in range(20):
75
+ ....: r = a._nth_root_common(5^e, False, "Johnston", False)
76
+ ....: assert r**(5^e) == a
77
+
78
+ Test very large modulus (assumed impossible to factor in reasonable time)::
79
+
80
+ sage: p = 2^1024 + 643
81
+ sage: a = GF(p, proof=False)(3)**(29*283*3539)
82
+ sage: r = a._nth_root_common(29*283*3539*12345, False, "Johnston", False)
83
+ sage: r**(29*283*3539*12345) == a
84
+ True
85
+ """
86
+ K = self.parent()
87
+ q = K.order()
88
+ gcd = n.gcd(q-1)
89
+ if self.is_one():
90
+ if gcd == 1:
91
+ return [self] if all else self
92
+ nthroot = K.zeta(gcd)
93
+ return [nthroot**a for a in range(gcd)] if all else nthroot
94
+ if gcd == q-1:
95
+ if all:
96
+ return []
97
+ raise ValueError("no nth root")
98
+ gcd, alpha, _ = n.xgcd(q-1) # gcd = alpha*n + beta*(q-1), so 1/n = alpha/gcd (mod q-1)
99
+ if gcd == 1:
100
+ return [self**alpha] if all else self**alpha
101
+
102
+ n = gcd
103
+ q1overn = (q-1)//n
104
+ if self**q1overn != 1:
105
+ if all:
106
+ return []
107
+ raise ValueError("no nth root")
108
+ self = self**alpha
109
+ if cunningham:
110
+ from sage.rings.factorint import factor_cunningham
111
+ F = factor_cunningham(n)
112
+ else:
113
+ F = n.factor()
114
+ from sage.groups.generic import discrete_log
115
+ if algorithm is None or algorithm == 'Johnston':
116
+ # In the style of the Adleman-Manders-Miller algorithm,
117
+ # we will use small order elements instead of a multiplicative
118
+ # generator, which can be expensive to compute.
119
+ for r, v in F:
120
+ # 0 < v <= k
121
+ k, h = (q-1).val_unit(r)
122
+ hinv = (-h).inverse_mod(r**v)
123
+ z = h * hinv
124
+ x = (1 + z) // r**v
125
+ if k == v:
126
+ self = self**x
127
+ else:
128
+ # We need an element of order r^k (g^h in Johnston's article)
129
+ # self^x differs from the actual nth root by an element of
130
+ # order dividing r^(k-v)
131
+ gh = K.zeta(r**k)
132
+ t = discrete_log(self**h, gh**(r**v), r**(k-v), operation='*')
133
+ self = self**x * gh**(-hinv*t)
134
+ if all:
135
+ nthroot = K.zeta(n)
136
+ L = [self]
137
+ for i in range(1, n):
138
+ self *= nthroot
139
+ L.append(self)
140
+ return L
141
+ return self
142
+ else:
143
+ raise ValueError("unknown algorithm")
144
+
145
+ def to_bytes(self, byteorder='big'):
146
+ r"""
147
+ Return an array of bytes representing an integer.
148
+
149
+ Internally relies on the python ``int.to_bytes()`` method.
150
+ Length of byte array is determined from the field's order.
151
+
152
+ INPUT:
153
+
154
+ - ``byteorder`` -- string (default: ``'big'``); determines the byte order of
155
+ ``input_bytes``; can only be ``'big'`` or ``'little'``
156
+
157
+ EXAMPLES::
158
+
159
+ sage: F = GF(65537)
160
+ sage: a = F(8726)
161
+ sage: a.to_bytes()
162
+ b'\x00"\x16'
163
+ sage: a.to_bytes(byteorder='little')
164
+ b'\x16"\x00'
165
+ """
166
+ length = (self.parent().order().nbits() + 7) // 8
167
+ return int(self).to_bytes(length=length, byteorder=byteorder)
168
+
169
+ def canonical_associate(self):
170
+ """
171
+ Return a canonical associate.
172
+
173
+ Implemented here because not all finite field elements inherit from FieldElement.
174
+
175
+ EXAMPLES::
176
+
177
+ sage: GF(7)(1).canonical_associate()
178
+ (1, 1)
179
+ sage: GF(7)(3).canonical_associate()
180
+ (1, 3)
181
+ sage: GF(7)(0).canonical_associate()
182
+ (0, 1)
183
+ sage: IntegerModRing(15)(7).canonical_associate()
184
+ NotImplemented
185
+ """
186
+ R = self.parent()
187
+ if R.is_field():
188
+ if self.is_zero():
189
+ return (R.zero(), R.one())
190
+ return (R.one(), self)
191
+ return NotImplemented
192
+
193
+
194
+ cdef class FinitePolyExtElement(FiniteRingElement):
195
+ """
196
+ Elements represented as polynomials modulo a given ideal.
197
+
198
+ TESTS::
199
+
200
+ sage: k.<a> = GF(64)
201
+ sage: TestSuite(a).run()
202
+ """
203
+ def _im_gens_(self, codomain, im_gens, base_map=None):
204
+ """
205
+ Used for applying homomorphisms of finite fields.
206
+
207
+ EXAMPLES::
208
+
209
+ sage: k.<a> = FiniteField(73^2)
210
+ sage: K.<b> = FiniteField(73^4)
211
+ sage: phi = k.hom([ b^(73*73+1) ]) # indirect doctest
212
+ sage: phi(0)
213
+ 0
214
+ sage: phi(a)
215
+ 7*b^3 + 13*b^2 + 65*b + 71
216
+
217
+ sage: phi(a+3)
218
+ 7*b^3 + 13*b^2 + 65*b + 1
219
+ """
220
+ ## NOTE: see the note in sage/rings/number_field_element.pyx,
221
+ ## in the comments for _im_gens_ there -- something analogous
222
+ ## applies here.
223
+ f = self.polynomial()
224
+ if base_map is not None:
225
+ Cx = codomain['x']
226
+ f = Cx([base_map(c) for c in f])
227
+ return codomain(f(im_gens[0]))
228
+
229
+ def minpoly(self, var='x', algorithm='pari'):
230
+ """
231
+ Return the minimal polynomial of this element
232
+ (over the corresponding prime subfield).
233
+
234
+ INPUT:
235
+
236
+ - ``var`` -- string (default: ``'x'``)
237
+
238
+ - ``algorithm`` -- string (default: ``'pari'``):
239
+
240
+ - ``'pari'`` -- use pari's minpoly
241
+
242
+ - ``'matrix'`` -- return the minpoly computed from the matrix of
243
+ left multiplication by self
244
+
245
+ EXAMPLES::
246
+
247
+ sage: from sage.rings.finite_rings.element_base import FinitePolyExtElement
248
+ sage: k.<a> = FiniteField(19^2)
249
+ sage: parent(a)
250
+ Finite Field in a of size 19^2
251
+ sage: b=a**20
252
+ sage: p=FinitePolyExtElement.minpoly(b,"x", algorithm='pari')
253
+ sage: q=FinitePolyExtElement.minpoly(b,"x", algorithm='matrix')
254
+ sage: q == p
255
+ True
256
+ sage: p
257
+ x + 17
258
+ """
259
+ if self.polynomial().degree() == 0:
260
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
261
+ R = PolynomialRing(self.parent().prime_subfield(), var)
262
+ return R.gen() - self.polynomial()[0]
263
+
264
+ if algorithm == 'pari':
265
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
266
+ R = PolynomialRing(self.parent().prime_subfield(), var)
267
+ return R(self.__pari__().minpoly('x').lift())
268
+
269
+ if algorithm == 'matrix':
270
+ return self.matrix().minpoly(var)
271
+
272
+ raise ValueError("unknown algorithm '%s'" % algorithm)
273
+
274
+ # We have two names for the same method
275
+ # for compatibility with sage.matrix
276
+ def minimal_polynomial(self, var='x'):
277
+ """
278
+ Return the minimal polynomial of this element
279
+ (over the corresponding prime subfield).
280
+
281
+ EXAMPLES::
282
+
283
+ sage: k.<a> = FiniteField(3^4)
284
+ sage: parent(a)
285
+ Finite Field in a of size 3^4
286
+ sage: b=a**20;p=charpoly(b,"y");p
287
+ y^4 + 2*y^2 + 1
288
+ sage: factor(p)
289
+ (y^2 + 1)^2
290
+ sage: b.minimal_polynomial('y')
291
+ y^2 + 1
292
+ """
293
+ return self.minpoly(var)
294
+
295
+ def __getitem__(self, n):
296
+ r"""
297
+ Return the `n`-th coefficient of this finite field element when
298
+ written as a polynomial in the generator.
299
+
300
+ EXAMPLES::
301
+
302
+ sage: x = polygen(GF(19))
303
+ sage: F.<i> = GF(19^2, modulus=x^2+1)
304
+ sage: a = 5 + 7*i
305
+ sage: a[0]
306
+ 5
307
+ sage: a[1]
308
+ 7
309
+
310
+ ::
311
+
312
+ sage: b = F(11)
313
+ sage: b[0]
314
+ 11
315
+ sage: b[1]
316
+ 0
317
+
318
+ TESTS::
319
+
320
+ sage: # needs sage.modules
321
+ sage: F,t = GF(random_prime(99)^randrange(2,99), 't').objgen()
322
+ sage: a = F.random_element()
323
+ sage: all(a[i] == a.polynomial()[i] for i in range(F.degree()))
324
+ True
325
+ sage: a == sum(a[i]*t^i for i in range(F.degree()))
326
+ True
327
+ """
328
+ if n < 0 or n >= self.parent().degree():
329
+ raise IndexError("index must lie between 0 and the degree minus 1")
330
+ return self.polynomial()[n]
331
+
332
+ def list(self):
333
+ r"""
334
+ Return the list of coefficients (in little-endian) of this
335
+ finite field element when written as a polynomial in the
336
+ generator.
337
+
338
+ Equivalent to calling ``list()`` on this element.
339
+
340
+ EXAMPLES::
341
+
342
+ sage: x = polygen(GF(71))
343
+ sage: F.<u> = GF(71^7, modulus=x^7 + x + 1)
344
+ sage: a = 3 + u + 3*u^2 + 3*u^3 + 7*u^4
345
+ sage: a.list()
346
+ [3, 1, 3, 3, 7, 0, 0]
347
+ sage: a.list() == list(a) == [a[i] for i in range(F.degree())]
348
+ True
349
+
350
+ The coefficients returned are those of a fully reduced
351
+ representative of the finite field element::
352
+
353
+ sage: b = u^777
354
+ sage: b.list()
355
+ [9, 69, 4, 27, 40, 10, 56]
356
+ sage: (u.polynomial()^777).list()
357
+ [0, 0, 0, 0, ..., 0, 1]
358
+
359
+ TESTS::
360
+
361
+ sage: # needs sage.modules
362
+ sage: R.<x> = GF(17)[]
363
+ sage: F.<t> = GF(17^60)
364
+ sage: a = F.random_element()
365
+ sage: a == R(a.list())(t)
366
+ True
367
+ sage: list(a) == a.list()
368
+ True
369
+ """
370
+ return self.polynomial().padded_list(self.parent().degree())
371
+
372
+ def __iter__(self):
373
+ r"""
374
+ Return an iterator over the coefficients of this finite field
375
+ element, in the same order as :meth:`list`.
376
+
377
+ EXAMPLES::
378
+
379
+ sage: x = polygen(GF(19))
380
+ sage: F.<i> = GF(19^2, modulus=x^2+1)
381
+ sage: a = 5 + 7*i
382
+ sage: it = iter(a)
383
+ sage: next(it)
384
+ 5
385
+ sage: next(it)
386
+ 7
387
+ sage: next(it)
388
+ Traceback (most recent call last):
389
+ ...
390
+ StopIteration
391
+ sage: list(a) # implicit doctest
392
+ [5, 7]
393
+ sage: tuple(a) # implicit doctest
394
+ (5, 7)
395
+ sage: b = F(11)
396
+ sage: list(b) # implicit doctest
397
+ [11, 0]
398
+ sage: tuple(b) # implicit doctest
399
+ (11, 0)
400
+ sage: list(b.polynomial())
401
+ [11]
402
+
403
+ TESTS::
404
+
405
+ sage: # needs sage.modules
406
+ sage: F = GF(random_prime(333)^randrange(111,999),'t')
407
+ sage: a = F.random_element()
408
+ sage: list(a) == a.list() # implicit doctest
409
+ True
410
+
411
+ ::
412
+
413
+ sage: # needs sage.modules
414
+ sage: F.<t> = GF(17^60)
415
+ sage: a = F.random_element()
416
+ sage: a == sum(c*t^i for i,c in enumerate(a)) # implicit doctest
417
+ True
418
+
419
+ ::
420
+
421
+ sage: # needs sage.modules
422
+ sage: F.<t> = GF((2^127 - 1)^10, 't')
423
+ sage: a = F.random_element()
424
+ sage: a == sum(c*t^i for i,c in enumerate(a)) # implicit doctest
425
+ True
426
+ """
427
+ return iter(self.list())
428
+
429
+ def _vector_(self, reverse=False):
430
+ """
431
+ Return a vector matching this element in the vector space attached
432
+ to the parent. The most significant coefficient is to the right.
433
+
434
+ INPUT:
435
+
436
+ - ``reverse`` -- reverse the order of the bits
437
+ from little endian to big endian
438
+
439
+ EXAMPLES::
440
+
441
+ sage: # needs sage.modules
442
+ sage: k.<a> = GF(2^16)
443
+ sage: e = a^2 + 1
444
+ sage: v = vector(e)
445
+ sage: v
446
+ (1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
447
+ sage: k(v)
448
+ a^2 + 1
449
+
450
+ sage: # needs sage.modules
451
+ sage: k.<a> = GF(3^16)
452
+ sage: e = 2*a^2 + 1
453
+ sage: v = vector(e)
454
+ sage: v
455
+ (1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
456
+ sage: k(v)
457
+ 2*a^2 + 1
458
+
459
+ You can also compute the vector in the other order::
460
+
461
+ sage: e._vector_(reverse=True) # needs sage.modules
462
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1)
463
+ """
464
+ # vector(foo) might pass in ZZ
465
+ if isinstance(reverse, Parent):
466
+ raise TypeError("Base field is fixed to prime subfield.")
467
+
468
+ k = self.parent()
469
+ ret = self.polynomial().padded_list(k.degree())
470
+
471
+ if reverse:
472
+ ret.reverse()
473
+ return k.vector_space(map=False)(ret)
474
+
475
+ def matrix(self, reverse=False):
476
+ r"""
477
+ Return the matrix of left multiplication by the element on
478
+ the power basis `1, x, x^2, \ldots, x^{d-1}` for the field
479
+ extension.
480
+
481
+ Thus the \emph{columns} of this matrix give the images
482
+ of each of the `x^i`.
483
+
484
+ INPUT:
485
+
486
+ - ``reverse`` -- if ``True``, act on vectors in reversed order
487
+
488
+ EXAMPLES::
489
+
490
+ sage: # needs sage.modules
491
+ sage: k.<a> = GF(2^4)
492
+ sage: b = k.random_element()
493
+ sage: vector(a*b) == a.matrix() * vector(b)
494
+ True
495
+ sage: (a*b)._vector_(reverse=True) == a.matrix(reverse=True) * b._vector_(reverse=True)
496
+ True
497
+ """
498
+ K = self.parent()
499
+ a = K.gen()
500
+ x = K(1)
501
+ d = K.degree()
502
+
503
+ columns = []
504
+
505
+ for i in range(d):
506
+ columns.append( (self * x)._vector_(reverse=reverse) )
507
+ x *= a
508
+
509
+ if reverse:
510
+ columns.reverse()
511
+
512
+ from sage.matrix.matrix_space import MatrixSpace
513
+ M = MatrixSpace(K.base_ring(), d)
514
+
515
+ return M(columns).transpose()
516
+
517
+ def _latex_(self):
518
+ r"""
519
+ Return the latex representation of ``self``, which is just the
520
+ latex representation of the polynomial representation of ``self``.
521
+
522
+ EXAMPLES::
523
+
524
+ sage: k.<b> = GF(5^2); k
525
+ Finite Field in b of size 5^2
526
+ sage: b._latex_()
527
+ 'b'
528
+ sage: (b^2+1)._latex_()
529
+ 'b + 4'
530
+ """
531
+ if self.parent().degree()>1:
532
+ return self.polynomial()._latex_()
533
+ return str(self)
534
+
535
+ def __pari__(self, var=None):
536
+ r"""
537
+ Return PARI representation of this finite field element.
538
+
539
+ INPUT:
540
+
541
+ - ``var`` -- (default: ``None``) optional variable string
542
+
543
+ EXAMPLES::
544
+
545
+ sage: k.<a> = GF(5^3)
546
+ sage: a.__pari__()
547
+ a
548
+ sage: a.__pari__('b')
549
+ b
550
+ sage: t = 3*a^2 + 2*a + 4
551
+ sage: t_string = t._pari_init_('y')
552
+ sage: t_string
553
+ 'Mod(Mod(3, 5)*y^2 + Mod(2, 5)*y + Mod(4, 5), Mod(1, 5)*y^3 + Mod(3, 5)*y + Mod(3, 5))'
554
+ sage: type(t_string)
555
+ <... 'str'>
556
+ sage: t_element = t.__pari__('b')
557
+ sage: t_element
558
+ 3*b^2 + 2*b + 4
559
+ sage: type(t_element)
560
+ <class 'cypari2.gen.Gen'>
561
+ """
562
+ if var is None:
563
+ var = self.parent().variable_name()
564
+ ffgen = self._parent.modulus()._pari_with_name(var).ffgen()
565
+ polypari = self.polynomial()._pari_with_name()
566
+ # Add ffgen - ffgen to ensure that we really get an FFELT
567
+ return polypari.subst("x", ffgen) + ffgen - ffgen
568
+
569
+ def _pari_init_(self, var=None):
570
+ r"""
571
+ Return a string that defines this element when evaluated in PARI.
572
+
573
+ INPUT:
574
+
575
+ - ``var`` -- (default: ``None``) a string for a new variable name to use
576
+
577
+ EXAMPLES::
578
+
579
+ sage: S.<b> = GF(5^2); S
580
+ Finite Field in b of size 5^2
581
+ sage: b._pari_init_()
582
+ 'Mod(Mod(1, 5)*b, Mod(1, 5)*b^2 + Mod(4, 5)*b + Mod(2, 5))'
583
+ sage: (2*b+3)._pari_init_()
584
+ 'Mod(Mod(2, 5)*b + Mod(3, 5), Mod(1, 5)*b^2 + Mod(4, 5)*b + Mod(2, 5))'
585
+
586
+ TESTS:
587
+
588
+ The following tests against a bug fixed in :issue:`11530`::
589
+
590
+ sage: F.<d> = GF(3^4)
591
+ sage: F.modulus()
592
+ x^4 + 2*x^3 + 2
593
+ sage: d._pari_init_()
594
+ 'Mod(Mod(1, 3)*d, Mod(1, 3)*d^4 + Mod(2, 3)*d^3 + Mod(2, 3))'
595
+ sage: (d^2+2*d+1)._pari_init_("p")
596
+ 'Mod(Mod(1, 3)*p^2 + Mod(2, 3)*p + Mod(1, 3), Mod(1, 3)*p^4 + Mod(2, 3)*p^3 + Mod(2, 3))'
597
+ sage: d.__pari__()
598
+ d
599
+
600
+ sage: K.<M> = GF(2^8)
601
+ sage: K.modulus()
602
+ x^8 + x^4 + x^3 + x^2 + 1
603
+ sage: (M^3+1)._pari_init_()
604
+ 'Mod(Mod(1, 2)*M^3 + Mod(1, 2), Mod(1, 2)*M^8 + Mod(1, 2)*M^4 + Mod(1, 2)*M^3 + Mod(1, 2)*M^2 + Mod(1, 2))'
605
+ sage: M._pari_init_(var='foo')
606
+ 'Mod(Mod(1, 2)*foo, Mod(1, 2)*foo^8 + Mod(1, 2)*foo^4 + Mod(1, 2)*foo^3 + Mod(1, 2)*foo^2 + Mod(1, 2))'
607
+ """
608
+ if var is None:
609
+ var = self.parent().variable_name()
610
+ g = self.parent().modulus()._pari_with_name(var)
611
+ f = self.polynomial()._pari_with_name(var)
612
+ return 'Mod({0}, {1})'.format(f, g)
613
+
614
+ def charpoly(self, var='x', algorithm='pari'):
615
+ """
616
+ Return the characteristic polynomial of ``self`` as a polynomial with given variable.
617
+
618
+ INPUT:
619
+
620
+ - ``var`` -- string (default: ``'x'``)
621
+
622
+ - ``algorithm`` -- string (default: ``'pari'``):
623
+
624
+ - ``'pari'`` -- use pari's charpoly
625
+
626
+ - ``'matrix'`` -- return the charpoly computed from the matrix of
627
+ left multiplication by ``self``
628
+
629
+ The result is not cached.
630
+
631
+ EXAMPLES::
632
+
633
+ sage: from sage.rings.finite_rings.element_base import FinitePolyExtElement
634
+ sage: k.<a> = FiniteField(19^2)
635
+ sage: parent(a)
636
+ Finite Field in a of size 19^2
637
+ sage: b = a**20
638
+ sage: p = FinitePolyExtElement.charpoly(b, "x", algorithm='pari')
639
+ sage: q = FinitePolyExtElement.charpoly(b, "x", algorithm='matrix') # needs sage.modules
640
+ sage: q == p # needs sage.modules
641
+ True
642
+ sage: p
643
+ x^2 + 15*x + 4
644
+ sage: factor(p)
645
+ (x + 17)^2
646
+ sage: b.minpoly('x')
647
+ x + 17
648
+ """
649
+ if algorithm == 'pari':
650
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
651
+ R = PolynomialRing(self.parent().prime_subfield(), var)
652
+ return R(self.__pari__().charpoly('x').lift())
653
+
654
+ if algorithm == 'matrix':
655
+ return self.matrix().charpoly(var)
656
+
657
+ raise ValueError("unknown algorithm '%s'" % algorithm)
658
+
659
+ def norm(self):
660
+ """
661
+ Return the norm of ``self`` down to the prime subfield.
662
+
663
+ This is the product of the Galois conjugates of ``self``.
664
+
665
+ EXAMPLES::
666
+
667
+ sage: S.<b> = GF(5^2); S
668
+ Finite Field in b of size 5^2
669
+ sage: b.norm()
670
+ 2
671
+ sage: b.charpoly('t')
672
+ t^2 + 4*t + 2
673
+
674
+ Next we consider a cubic extension::
675
+
676
+ sage: S.<a> = GF(5^3); S
677
+ Finite Field in a of size 5^3
678
+ sage: a.norm()
679
+ 2
680
+ sage: a.charpoly('t')
681
+ t^3 + 3*t + 3
682
+ sage: a * a^5 * (a^25)
683
+ 2
684
+ """
685
+ f = self.charpoly('x')
686
+ n = f[0]
687
+ return -n if f.degree() % 2 else n
688
+
689
+ def trace(self):
690
+ """
691
+ Return the trace of this element, which is the sum of the
692
+ Galois conjugates.
693
+
694
+ EXAMPLES::
695
+
696
+ sage: S.<a> = GF(5^3); S
697
+ Finite Field in a of size 5^3
698
+ sage: a.trace()
699
+ 0
700
+ sage: a.charpoly('t')
701
+ t^3 + 3*t + 3
702
+ sage: a + a^5 + a^25
703
+ 0
704
+ sage: z = a^2 + a + 1
705
+ sage: z.trace()
706
+ 2
707
+ sage: z.charpoly('t')
708
+ t^3 + 3*t^2 + 2*t + 2
709
+ sage: z + z^5 + z^25
710
+ 2
711
+ """
712
+ return self.parent().prime_subfield()(self.__pari__().trace().lift())
713
+
714
+ def multiplicative_order(self):
715
+ r"""
716
+ Return the multiplicative order of this field element.
717
+
718
+ EXAMPLES::
719
+
720
+ sage: S.<a> = GF(5^3); S
721
+ Finite Field in a of size 5^3
722
+ sage: a.multiplicative_order()
723
+ 124
724
+ sage: (a^8).multiplicative_order()
725
+ 31
726
+ sage: S(0).multiplicative_order()
727
+ Traceback (most recent call last):
728
+ ...
729
+ ArithmeticError: Multiplicative order of 0 not defined.
730
+ """
731
+ if self.is_zero():
732
+ raise ArithmeticError("Multiplicative order of 0 not defined.")
733
+ n = self._parent.order() - 1
734
+ F = self._parent.factored_unit_order()[0]
735
+ order = Integer(1)
736
+ for p, e in F:
737
+ # Determine the power of p that divides the order.
738
+ a = self**(n//(p**e))
739
+ while a != 1:
740
+ order = order * p
741
+ a = a**p
742
+
743
+ return order
744
+
745
+ def additive_order(self):
746
+ """
747
+ Return the additive order of this finite field element.
748
+
749
+ EXAMPLES::
750
+
751
+ sage: k.<a> = FiniteField(2^12, 'a')
752
+ sage: b = a^3 + a + 1
753
+ sage: b.additive_order()
754
+ 2
755
+ sage: k(0).additive_order()
756
+ 1
757
+ """
758
+ if self.is_zero():
759
+ return Integer(1)
760
+ return self.parent().characteristic()
761
+
762
+ def is_square(self):
763
+ """
764
+ Return ``True`` if and only if this element is a perfect square.
765
+
766
+ EXAMPLES::
767
+
768
+ sage: k.<a> = FiniteField(9, impl='givaro', modulus='primitive') # needs sage.libs.linbox
769
+ sage: a.is_square() # needs sage.libs.linbox
770
+ False
771
+ sage: (a**2).is_square() # needs sage.libs.linbox
772
+ True
773
+ sage: k.<a> = FiniteField(4, impl='ntl', modulus='primitive') # needs sage.libs.ntl
774
+ sage: (a**2).is_square() # needs sage.libs.ntl
775
+ True
776
+ sage: k.<a> = FiniteField(17^5, impl='pari_ffelt', modulus='primitive') # needs sage.libs.pari
777
+ sage: a.is_square() # needs sage.libs.pari
778
+ False
779
+ sage: (a**2).is_square() # needs sage.libs.pari
780
+ True
781
+
782
+ ::
783
+
784
+ sage: k(0).is_square() # needs sage.libs.linbox
785
+ True
786
+ """
787
+ K = self.parent()
788
+ if K.characteristic() == 2:
789
+ return True
790
+ n = K.order() - 1
791
+ a = self**(n // 2)
792
+ return a == 1 or a == 0
793
+
794
+ def square_root(self, extend=False, all=False):
795
+ """
796
+ The square root function.
797
+
798
+ INPUT:
799
+
800
+ - ``extend`` -- boolean (default: ``True``); if ``True``, return a
801
+ square root in an extension ring, if necessary. Otherwise, raise a
802
+ :exc:`ValueError` if the root is not in the base ring.
803
+
804
+ .. WARNING::
805
+
806
+ This option is not implemented!
807
+
808
+ - ``all`` -- boolean (default: ``False``); if ``True``, return all
809
+ square roots of ``self``, instead of just one
810
+
811
+ .. WARNING::
812
+
813
+ The ``'extend'`` option is not implemented (yet).
814
+
815
+ EXAMPLES::
816
+
817
+ sage: F = FiniteField(7^2, 'a')
818
+ sage: F(2).square_root()
819
+ 4
820
+ sage: F(3).square_root()
821
+ 2*a + 6
822
+ sage: F(3).square_root()**2
823
+ 3
824
+ sage: F(4).square_root()
825
+ 2
826
+ sage: K = FiniteField(7^3, 'alpha', impl='pari_ffelt')
827
+ sage: K(3).square_root()
828
+ Traceback (most recent call last):
829
+ ...
830
+ ValueError: must be a perfect square.
831
+ """
832
+ try:
833
+ return self.nth_root(2, extend=extend, all=all)
834
+ except ValueError:
835
+ raise ValueError("must be a perfect square.")
836
+
837
+ def sqrt(self, extend=False, all=False):
838
+ """
839
+ See :meth:`square_root`.
840
+
841
+ EXAMPLES::
842
+
843
+ sage: k.<a> = GF(3^17)
844
+ sage: (a^3 - a - 1).sqrt()
845
+ a^16 + 2*a^15 + a^13 + 2*a^12 + a^10 + 2*a^9 + 2*a^8 + a^7 + a^6 + 2*a^5 + a^4 + 2*a^2 + 2*a + 2
846
+ """
847
+ return self.square_root(extend=extend, all=all)
848
+
849
+ def nth_root(self, n, extend=False, all=False, algorithm=None, cunningham=False):
850
+ r"""
851
+ Return an `n`-th root of ``self``.
852
+
853
+ INPUT:
854
+
855
+ - ``n`` -- integer `\geq 1`
856
+
857
+ - ``extend`` -- boolean (default: ``False``); if ``True``, return an
858
+ `n`-th root in an extension ring, if necessary. Otherwise, raise a
859
+ :exc:`ValueError` if the root is not in the base ring. Warning:
860
+ this option is not implemented!
861
+
862
+ - ``all`` -- boolean (default: ``False``); if ``True``, return all `n`-th
863
+ roots of ``self``, instead of just one
864
+
865
+ - ``algorithm`` -- string (default: ``None``); ``'Johnston'`` is the
866
+ only currently supported option. For IntegerMod elements, the problem
867
+ is reduced to the prime modulus case using CRT and `p`-adic logs,
868
+ and then this algorithm used.
869
+
870
+ OUTPUT:
871
+
872
+ If ``self`` has an `n`-th root, returns one (if ``all`` is ``False``) or a
873
+ list of all of them (if ``all`` is ``True``).
874
+ Otherwise, raises a :exc:`ValueError` (if ``extend`` is ``False``)
875
+ or a :exc:`NotImplementedError` (if ``extend`` is ``True``).
876
+
877
+ .. warning::
878
+
879
+ The ``extend`` option is not implemented (yet).
880
+
881
+ EXAMPLES::
882
+
883
+ sage: K = GF(31)
884
+ sage: a = K(22)
885
+ sage: K(22).nth_root(7)
886
+ 13
887
+ sage: K(25).nth_root(5)
888
+ 5
889
+ sage: K(23).nth_root(3)
890
+ 29
891
+
892
+ sage: K.<a> = GF(625)
893
+ sage: (3*a^2+a+1).nth_root(13)**13
894
+ 3*a^2 + a + 1
895
+
896
+ sage: k.<a> = GF(29^2)
897
+ sage: b = a^2 + 5*a + 1
898
+ sage: b.nth_root(11)
899
+ 3*a + 20
900
+ sage: b.nth_root(5)
901
+ Traceback (most recent call last):
902
+ ...
903
+ ValueError: no nth root
904
+ sage: b.nth_root(5, all = True)
905
+ []
906
+ sage: b.nth_root(3, all = True)
907
+ [14*a + 18, 10*a + 13, 5*a + 27]
908
+
909
+ sage: k.<a> = GF(29^5)
910
+ sage: b = a^2 + 5*a + 1
911
+ sage: b.nth_root(5)
912
+ 19*a^4 + 2*a^3 + 2*a^2 + 16*a + 3
913
+ sage: b.nth_root(7)
914
+ Traceback (most recent call last):
915
+ ...
916
+ ValueError: no nth root
917
+ sage: b.nth_root(4, all=True)
918
+ []
919
+
920
+ TESTS::
921
+
922
+ sage: for p in [2,3,5,7,11]: # long time, random because of PARI warnings
923
+ ....: for n in [2,5,10]:
924
+ ....: q = p^n
925
+ ....: K.<a> = GF(q)
926
+ ....: for r in (q-1).divisors():
927
+ ....: if r == 1: continue
928
+ ....: x = K.random_element()
929
+ ....: y = x^r
930
+ ....: assert y.nth_root(r)^r == y
931
+ ....: assert (y^41).nth_root(41*r)^(41*r) == y^41
932
+ ....: assert (y^307).nth_root(307*r)^(307*r) == y^307
933
+ sage: k.<a> = GF(4)
934
+ sage: a.nth_root(0,all=True)
935
+ []
936
+ sage: k(1).nth_root(0,all=True)
937
+ [a, a + 1, 1]
938
+
939
+ ALGORITHM:
940
+
941
+ The default is currently an algorithm described in [Joh1999]_.
942
+
943
+ AUTHOR:
944
+
945
+ - David Roe (2010-02-13)
946
+ """
947
+ if self.is_zero():
948
+ if n <= 0:
949
+ if all:
950
+ return []
951
+ raise ValueError
952
+ return [self] if all else self
953
+ if n < 0:
954
+ self = ~self
955
+ n = -n
956
+ elif n == 0:
957
+ if self == 1:
958
+ if all:
959
+ return [a for a in self.parent().list() if a != 0]
960
+ return self
961
+ else:
962
+ if all:
963
+ return []
964
+ raise ValueError
965
+ if extend:
966
+ raise NotImplementedError
967
+ n = Integer(n)
968
+ return self._nth_root_common(n, all, algorithm, cunningham)
969
+
970
+ def pth_power(self, int k=1):
971
+ """
972
+ Return the `(p^k)`-th power of self, where `p` is the
973
+ characteristic of the field.
974
+
975
+ INPUT:
976
+
977
+ - ``k`` -- integer (default: 1, must fit in C int type)
978
+
979
+ Note that if `k` is negative, then this computes the appropriate root.
980
+
981
+ EXAMPLES::
982
+
983
+ sage: F.<a> = GF(29^2)
984
+ sage: z = a^2 + 5*a + 1
985
+ sage: z.pth_power()
986
+ 19*a + 20
987
+ sage: z.pth_power(10)
988
+ 10*a + 28
989
+ sage: z.pth_power(-10) == z
990
+ True
991
+ sage: F.<b> = GF(2^12)
992
+ sage: y = b^3 + b + 1
993
+ sage: y == (y.pth_power(-3))^(2^3)
994
+ True
995
+ sage: y.pth_power(2)
996
+ b^7 + b^6 + b^5 + b^4 + b^3 + b
997
+ """
998
+ p = self.additive_order()
999
+ n = self.parent().degree()
1000
+ return self**(p**(k % n))
1001
+
1002
+ frobenius = pth_power
1003
+
1004
+ def pth_root(self, int k=1):
1005
+ """
1006
+ Return the `(p^k)`-th root of self, where `p` is the characteristic
1007
+ of the field.
1008
+
1009
+ INPUT:
1010
+
1011
+ - ``k`` -- integer (default: 1, must fit in C int type)
1012
+
1013
+ Note that if `k` is negative, then this computes the appropriate power.
1014
+
1015
+ EXAMPLES::
1016
+
1017
+ sage: F.<b> = GF(2^12)
1018
+ sage: y = b^3 + b + 1
1019
+ sage: y == (y.pth_root(3))^(2^3)
1020
+ True
1021
+ sage: y.pth_root(2)
1022
+ b^11 + b^10 + b^9 + b^7 + b^5 + b^4 + b^2 + b
1023
+ """
1024
+ return self.pth_power(-k)
1025
+
1026
+ def conjugate(self):
1027
+ """
1028
+ This methods returns the result of the Frobenius morphism
1029
+ in the case where the field is a quadratic extension, say
1030
+ `GF(q^2)`, where `q=p^k` is a prime power and `p` the
1031
+ characteristic of the field.
1032
+
1033
+ OUTPUT:
1034
+
1035
+ Instance of this class representing the image under
1036
+ the Frobenius morphisms.
1037
+
1038
+ EXAMPLES::
1039
+
1040
+ sage: F.<a> = GF(16)
1041
+ sage: b = a.conjugate(); b
1042
+ a + 1
1043
+ sage: a == b.conjugate()
1044
+ True
1045
+
1046
+ sage: F.<a> = GF(27)
1047
+ sage: a.conjugate()
1048
+ Traceback (most recent call last):
1049
+ ...
1050
+ TypeError: cardinality of the field must be a square number
1051
+
1052
+ TESTS:
1053
+
1054
+ Check that :issue:`26761` is fixed::
1055
+
1056
+ sage: # needs sage.libs.gap
1057
+ sage: G32 = GU(3,2)
1058
+ sage: g1, g2 = G32.gens()
1059
+ sage: m1 = g1.matrix()
1060
+ sage: m1.is_unitary()
1061
+ True
1062
+ sage: G32(m1) == g1
1063
+ True
1064
+ """
1065
+ k2 = self.parent().degree()
1066
+ if k2 % 2:
1067
+ raise TypeError("cardinality of the field must be a square number")
1068
+ k = k2 / 2
1069
+
1070
+ return self.pth_power(k=k)
1071
+
1072
+ def to_integer(self, reverse=False):
1073
+ r"""
1074
+ Return an integer representation of this finite field element
1075
+ obtained by lifting its representative polynomial to `\ZZ` and
1076
+ evaluating it at the characteristic `p`.
1077
+
1078
+ If ``reverse`` is set to ``True`` (default: ``False``),
1079
+ the list of coefficients is reversed prior to evaluation.
1080
+
1081
+ Inverse of :meth:`sage.rings.finite_rings.finite_field_base.FiniteField.from_integer`.
1082
+
1083
+ EXAMPLES::
1084
+
1085
+ sage: F.<t> = GF(7^5)
1086
+ sage: F(5).to_integer()
1087
+ 5
1088
+ sage: t.to_integer()
1089
+ 7
1090
+ sage: (t^2).to_integer()
1091
+ 49
1092
+ sage: (t^2+1).to_integer()
1093
+ 50
1094
+ sage: (t^2+t+1).to_integer()
1095
+ 57
1096
+
1097
+ ::
1098
+
1099
+ sage: F.<t> = GF(2^8)
1100
+ sage: u = F.from_integer(0xd1)
1101
+ sage: bin(u.to_integer(False))
1102
+ '0b11010001'
1103
+ sage: bin(u.to_integer(True))
1104
+ '0b10001011'
1105
+
1106
+ TESTS::
1107
+
1108
+ sage: # needs sage.modules
1109
+ sage: p = random_prime(2^99)
1110
+ sage: k = randrange(2,10)
1111
+ sage: F.<t> = GF((p, k))
1112
+ sage: rev = bool(randrange(2))
1113
+ sage: u = F.random_element()
1114
+ sage: 0 <= u.to_integer(rev) < F.cardinality()
1115
+ True
1116
+ sage: F.from_integer(u.to_integer(rev), rev) == u
1117
+ True
1118
+ sage: n = randrange(F.cardinality())
1119
+ sage: F.from_integer(n, rev).to_integer(rev) == n
1120
+ True
1121
+ """
1122
+ if not reverse:
1123
+ try:
1124
+ return self._integer_representation()
1125
+ except AttributeError:
1126
+ pass
1127
+ p = self.parent().characteristic()
1128
+ f = self.polynomial().change_ring(ZZ)
1129
+ if reverse:
1130
+ f = f.reverse(self.parent().degree() - 1)
1131
+ return f(p)
1132
+
1133
+ def to_bytes(self, byteorder='big'):
1134
+ r"""
1135
+ Return an array of bytes representing an integer.
1136
+
1137
+ Internally relies on the python ``int.to_bytes()`` method.
1138
+ Length of byte array is determined from the field's order.
1139
+
1140
+ INPUT:
1141
+
1142
+ - ``byteorder`` -- string (default: ``'big'``); determines the byte order of
1143
+ the output; can only be ``'big'`` or ``'little'``
1144
+
1145
+ EXAMPLES::
1146
+
1147
+ sage: F.<z5> = GF(3^5)
1148
+ sage: a = z5^4 + 2*z5^3 + 1
1149
+ sage: a.to_bytes()
1150
+ b'\x88'
1151
+
1152
+ ::
1153
+
1154
+ sage: F.<z3> = GF(163^3)
1155
+ sage: a = 136*z3^2 + 10*z3 + 125
1156
+ sage: a.to_bytes()
1157
+ b'7)\xa3'
1158
+ """
1159
+ length = (self.parent().order().nbits() + 7) // 8
1160
+ return self.to_integer().to_bytes(length=length, byteorder=byteorder)
1161
+
1162
+ cdef class Cache_base(SageObject):
1163
+ cpdef FinitePolyExtElement fetch_int(self, number):
1164
+ r"""
1165
+ Given an integer less than `p^n` with base `2`
1166
+ representation `a_0 + a_1 \cdot 2 + \cdots + a_k 2^k`, this returns
1167
+ `a_0 + a_1 x + \cdots + a_k x^k`, where `x` is the
1168
+ generator of this finite field.
1169
+
1170
+ EXAMPLES::
1171
+
1172
+ sage: k.<a> = GF(2^48)
1173
+ sage: k._cache.fetch_int(2^33 + 2 + 1) # needs sage.libs.ntl
1174
+ a^33 + a + 1
1175
+ """
1176
+ raise NotImplementedError("this must be implemented by subclasses")