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,856 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.rings.finite_rings
3
+ """
4
+ Finite field morphisms
5
+
6
+ This file provides several classes implementing:
7
+
8
+ - embeddings between finite fields
9
+
10
+ - Frobenius isomorphism on finite fields
11
+
12
+ EXAMPLES::
13
+
14
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
15
+
16
+ Construction of an embedding::
17
+
18
+ sage: k.<t> = GF(3^7)
19
+ sage: K.<T> = GF(3^21)
20
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f # random
21
+ Ring morphism:
22
+ From: Finite Field in t of size 3^7
23
+ To: Finite Field in T of size 3^21
24
+ Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
25
+
26
+ sage: f(t) # random
27
+ T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
28
+ sage: f(t) == f.im_gens()[0]
29
+ True
30
+
31
+ The map `f` has a method ``section`` which returns a partially defined
32
+ map which is the inverse of `f` on the image of `f`::
33
+
34
+ sage: g = f.section(); g # random
35
+ Section of Ring morphism:
36
+ From: Finite Field in t of size 3^7
37
+ To: Finite Field in T of size 3^21
38
+ Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
39
+ sage: a = k.random_element() # needs sage.modules
40
+ sage: g(f(a)) == a # needs sage.modules
41
+ True
42
+ sage: g(T)
43
+ Traceback (most recent call last):
44
+ ...
45
+ ValueError: T is not in the image of Ring morphism:
46
+ From: Finite Field in t of size 3^7
47
+ To: Finite Field in T of size 3^21
48
+ Defn: ...
49
+
50
+ There is no embedding of `GF(5^6)` into `GF(5^11)`::
51
+
52
+ sage: k.<t> = GF(5^6)
53
+ sage: K.<T> = GF(5^11)
54
+ sage: FiniteFieldHomomorphism_generic(Hom(k, K))
55
+ Traceback (most recent call last):
56
+ ...
57
+ ValueError: No embedding of Finite Field in t of size 5^6 into Finite Field in T of size 5^11
58
+
59
+
60
+ Construction of Frobenius endomorphisms::
61
+
62
+ sage: k.<t> = GF(7^14)
63
+ sage: Frob = k.frobenius_endomorphism(); Frob
64
+ Frobenius endomorphism t |--> t^7 on Finite Field in t of size 7^14
65
+ sage: Frob(t)
66
+ t^7
67
+
68
+ Some basic arithmetics is supported::
69
+
70
+ sage: Frob^2
71
+ Frobenius endomorphism t |--> t^(7^2) on Finite Field in t of size 7^14
72
+ sage: f = k.frobenius_endomorphism(7); f
73
+ Frobenius endomorphism t |--> t^(7^7) on Finite Field in t of size 7^14
74
+ sage: f*Frob
75
+ Frobenius endomorphism t |--> t^(7^8) on Finite Field in t of size 7^14
76
+
77
+ sage: Frob.order()
78
+ 14
79
+ sage: f.order()
80
+ 2
81
+
82
+ Note that simplifications are made automatically::
83
+
84
+ sage: Frob^16
85
+ Frobenius endomorphism t |--> t^(7^2) on Finite Field in t of size 7^14
86
+ sage: Frob^28
87
+ Identity endomorphism of Finite Field in t of size 7^14
88
+
89
+ And that comparisons work::
90
+
91
+ sage: Frob == Frob^15
92
+ True
93
+ sage: Frob^14 == Hom(k, k).identity()
94
+ True
95
+
96
+ AUTHOR:
97
+
98
+ - Xavier Caruso (2012-06-29)
99
+ """
100
+
101
+ #############################################################################
102
+ # Copyright (C) 2012 Xavier Caruso <xavier.caruso@normalesup.org>
103
+ #
104
+ # Distributed under the terms of the GNU General Public License (GPL)
105
+ #
106
+ # http://www.gnu.org/licenses/
107
+ #****************************************************************************
108
+
109
+ from sage.rings.integer cimport Integer
110
+
111
+ from sage.categories.homset import Hom
112
+ from sage.structure.element cimport Element
113
+
114
+ from sage.rings.finite_rings.finite_field_base import FiniteField as FiniteField_base
115
+ from sage.rings.morphism cimport RingHomomorphism, RingHomomorphism_im_gens, FrobeniusEndomorphism_generic
116
+ from sage.rings.finite_rings.finite_field_constructor import FiniteField
117
+
118
+ from sage.categories.map cimport Section
119
+ from sage.categories.morphism cimport Morphism
120
+
121
+ from sage.misc.cachefunc import cached_method
122
+
123
+
124
+ cdef class SectionFiniteFieldHomomorphism_generic(Section):
125
+ """
126
+ A class implementing sections of embeddings between finite fields.
127
+ """
128
+ cpdef Element _call_(self, x): # Not optimized
129
+ """
130
+ TESTS::
131
+
132
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
133
+ sage: k.<t> = GF(3^7)
134
+ sage: K.<T> = GF(3^21)
135
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
136
+ sage: g = f.section()
137
+ sage: a = k.random_element() # needs sage.modules
138
+ sage: g(f(a)) == a # needs sage.modules
139
+ True
140
+
141
+ sage: g(T)
142
+ Traceback (most recent call last):
143
+ ...
144
+ ValueError: T is not in the image of Ring morphism:
145
+ From: Finite Field in t of size 3^7
146
+ To: Finite Field in T of size 3^21
147
+ Defn: t |--> ...
148
+ """
149
+ for root, _ in x.minimal_polynomial().roots(ring=self.codomain()):
150
+ if self._inverse(root) == x:
151
+ return root
152
+ raise ValueError("%s is not in the image of %s" % (x, self._inverse))
153
+
154
+ def _repr_(self):
155
+ """
156
+ Return a string representation of this section.
157
+
158
+ EXAMPLES::
159
+
160
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
161
+ sage: k.<t> = GF(3^7)
162
+ sage: K.<T> = GF(3^21)
163
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
164
+ sage: g = f.section()
165
+ sage: g._repr_() # random
166
+ 'Section of Ring morphism:\n From: Finite Field in t of size 3^7\n To: Finite Field in T of size 3^21\n Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T'
167
+ """
168
+ return "Section of %s" % self._inverse
169
+
170
+ def _latex_(self):
171
+ r"""
172
+ Return a latex representation of this section.
173
+
174
+ EXAMPLES::
175
+
176
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
177
+ sage: k.<t> = GF(3^7)
178
+ sage: K.<T> = GF(3^21)
179
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
180
+ sage: g = f.section()
181
+ sage: g._latex_()
182
+ '\\verb"Section of "\\Bold{F}_{3^{7}} \\hookrightarrow \\Bold{F}_{3^{21}}'
183
+ """
184
+ return '\\verb"Section of "' + self._inverse._latex_()
185
+
186
+
187
+ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens):
188
+ """
189
+ A class implementing embeddings between finite fields.
190
+
191
+ TESTS::
192
+
193
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
194
+ sage: k.<t> = GF(3^7)
195
+ sage: K.<T> = GF(3^21)
196
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
197
+ sage: TestSuite(f).run()
198
+ """
199
+ def __init__(self, parent, im_gens=None, base_map=None, check=True, section_class=None):
200
+ """
201
+ TESTS::
202
+
203
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
204
+ sage: k.<t> = GF(3^7)
205
+ sage: K.<T> = GF(3^21)
206
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f # random
207
+ Ring morphism:
208
+ From: Finite Field in t of size 3^7
209
+ To: Finite Field in T of size 3^21
210
+ Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
211
+ sage: a = k.random_element() # needs sage.modules
212
+ sage: b = k.random_element() # needs sage.modules
213
+ sage: f(a) + f(b) == f(a + b) # needs sage.modules
214
+ True
215
+
216
+ sage: k.<t> = GF(3^6)
217
+ sage: K.<t> = GF(3^9)
218
+ sage: FiniteFieldHomomorphism_generic(Hom(k, K))
219
+ Traceback (most recent call last):
220
+ ...
221
+ ValueError: No embedding of Finite Field in t of size 3^6 into Finite Field in t of size 3^9
222
+
223
+ sage: FiniteFieldHomomorphism_generic(Hom(ZZ, QQ))
224
+ Traceback (most recent call last):
225
+ ...
226
+ TypeError: The domain is not a finite field or does not provide the required interface for finite fields
227
+
228
+ sage: R.<x> = k[]
229
+ sage: FiniteFieldHomomorphism_generic(Hom(k, R))
230
+ Traceback (most recent call last):
231
+ ...
232
+ TypeError: The codomain is not a finite field or does not provide the required interface for finite fields
233
+ """
234
+ domain = parent.domain()
235
+ codomain = parent.codomain()
236
+ if not isinstance(domain, FiniteField_base):
237
+ raise TypeError("The domain is not a finite field or does not provide the required interface for finite fields")
238
+ if not isinstance(codomain, FiniteField_base):
239
+ raise TypeError("The codomain is not a finite field or does not provide the required interface for finite fields")
240
+ if domain.characteristic() != codomain.characteristic() or codomain.degree() % domain.degree() != 0:
241
+ raise ValueError("No embedding of %s into %s" % (domain, codomain))
242
+ if im_gens is None:
243
+ im_gens = domain.modulus().any_root(codomain)
244
+ check=False
245
+ RingHomomorphism_im_gens.__init__(self, parent, im_gens, base_map=base_map, check=check)
246
+ if section_class is None:
247
+ self._section_class = SectionFiniteFieldHomomorphism_generic
248
+ else:
249
+ self._section_class = section_class
250
+
251
+ def __copy__(self):
252
+ """
253
+ Return a copy of this map.
254
+
255
+ TESTS::
256
+
257
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
258
+ sage: k.<t> = GF(3^7)
259
+ sage: K.<T> = GF(3^21)
260
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
261
+ sage: g = copy(f)
262
+ sage: g.section()(g(t)) == f.section()(f(t))
263
+ True
264
+
265
+ ::
266
+
267
+ sage: F = GF(2)
268
+ sage: E = GF(4)
269
+ sage: phi = E.coerce_map_from(F); phi
270
+ Ring morphism:
271
+ From: Finite Field of size 2
272
+ To: Finite Field in z2 of size 2^2
273
+ Defn: 1 |--> 1
274
+ sage: phi.section()
275
+ Section of Ring morphism:
276
+ From: Finite Field of size 2
277
+ To: Finite Field in z2 of size 2^2
278
+ Defn: 1 |--> 1
279
+ """
280
+ cdef FiniteFieldHomomorphism_generic out = super().__copy__()
281
+ out._section_class = self._section_class
282
+ return out
283
+
284
+ def _latex_(self):
285
+ r"""
286
+ Return a latex representation of this embedding.
287
+
288
+ EXAMPLES::
289
+
290
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
291
+ sage: k.<t> = GF(3^7)
292
+ sage: K.<T> = GF(3^21)
293
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
294
+ sage: f._latex_()
295
+ '\\Bold{F}_{3^{7}} \\hookrightarrow \\Bold{F}_{3^{21}}'
296
+ """
297
+ return self.domain()._latex_() + " \\hookrightarrow " + self.codomain()._latex_()
298
+
299
+ cpdef Element _call_(self, x):
300
+ """
301
+ TESTS::
302
+
303
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
304
+ sage: k.<t> = GF(3^3)
305
+ sage: K.<T> = GF(3^9)
306
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
307
+ sage: f(t) # random
308
+ 2*T^6 + 2*T^4 + T^2 + T
309
+
310
+ sage: # needs sage.modules
311
+ sage: a = k.random_element()
312
+ sage: b = k.random_element()
313
+ sage: f(a+b) == f(a) + f(b)
314
+ True
315
+ sage: f(a*b) == f(a) * f(b)
316
+ True
317
+ """
318
+ f = x.polynomial()
319
+ bm = self.base_map()
320
+ if bm is not None:
321
+ f = f.map_coefficients(bm)
322
+ return f(self.im_gens()[0])
323
+
324
+ def is_injective(self):
325
+ """
326
+ Return ``True`` since a embedding between finite fields is
327
+ always injective.
328
+
329
+ EXAMPLES::
330
+
331
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
332
+ sage: k.<t> = GF(3^3)
333
+ sage: K.<T> = GF(3^9)
334
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
335
+ sage: f.is_injective()
336
+ True
337
+ """
338
+ return True
339
+
340
+ def is_surjective(self):
341
+ """
342
+ Return ``True`` if this embedding is surjective (and hence an
343
+ isomorphism.
344
+
345
+ EXAMPLES::
346
+
347
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
348
+ sage: k.<t> = GF(3^3)
349
+ sage: K.<T> = GF(3^9)
350
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
351
+ sage: f.is_surjective()
352
+ False
353
+ sage: g = FiniteFieldHomomorphism_generic(Hom(k, k))
354
+ sage: g.is_surjective()
355
+ True
356
+ """
357
+ return self.domain().cardinality() == self.codomain().cardinality()
358
+
359
+ @cached_method
360
+ def section(self):
361
+ """
362
+ Return the ``inverse`` of this embedding.
363
+
364
+ It is a partially defined map whose domain is the codomain
365
+ of the embedding, but which is only defined on the image of
366
+ the embedding.
367
+
368
+ EXAMPLES::
369
+
370
+ sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
371
+ sage: k.<t> = GF(3^7)
372
+ sage: K.<T> = GF(3^21)
373
+ sage: f = FiniteFieldHomomorphism_generic(Hom(k, K))
374
+ sage: g = f.section(); g # random
375
+ Section of Ring morphism:
376
+ From: Finite Field in t of size 3^7
377
+ To: Finite Field in T of size 3^21
378
+ Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
379
+
380
+ sage: # needs sage.modules
381
+ sage: a = k.random_element()
382
+ sage: b = k.random_element()
383
+ sage: g(f(a) + f(b)) == a + b
384
+ True
385
+ sage: g(T)
386
+ Traceback (most recent call last):
387
+ ...
388
+ ValueError: T is not in the image of Ring morphism:
389
+ From: Finite Field in t of size 3^7
390
+ To: Finite Field in T of size 3^21
391
+ Defn: ...
392
+ """
393
+ if self.base_map() is not None:
394
+ raise NotImplementedError
395
+ return self._section_class(self)
396
+
397
+ def _inverse_image_element(self, b):
398
+ """
399
+ Return the unique ``a`` such that ``self(a) = b`` if one such exists.
400
+
401
+ This method is simply a shorthand for calling the map returned by
402
+ ``self.section()`` on ``b``.
403
+
404
+ EXAMPLES::
405
+
406
+ sage: k.<t> = GF(3^7)
407
+ sage: K.<T>, f = k.extension(3, map=True)
408
+ sage: b = f(t^2); b
409
+ 2*T^20 + 2*T^19 + T^18 + T^15 + 2*T^14 + 2*T^13 + 2*T^12 + T^8 + 2*T^6 + T^5 + 2*T^4 + T^3 + 2*T^2 + T
410
+ sage: f.inverse_image(b)
411
+ t^2
412
+ sage: f.inverse_image(T)
413
+ Traceback (most recent call last):
414
+ ...
415
+ ValueError: T is not in the image of Ring morphism:
416
+ From: Finite Field in t of size 3^7
417
+ To: Finite Field in T of size 3^21
418
+ Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
419
+ """
420
+ return self.section()(b)
421
+
422
+ def __hash__(self):
423
+ r"""
424
+ Return a hash of this morphism.
425
+
426
+ TESTS::
427
+
428
+ sage: k.<t> = GF(5^3)
429
+ sage: Frob = k.frobenius_endomorphism()
430
+ sage: embed = Frob.fixed_field()[1]
431
+ sage: hash(embed) # random
432
+ -2441354824160407762
433
+ """
434
+ return Morphism.__hash__(self)
435
+
436
+ cdef dict _extra_slots(self):
437
+ r"""
438
+ Helper function for copying and pickling.
439
+
440
+ TESTS::
441
+
442
+ sage: k.<t> = GF(5^3)
443
+ sage: Frob = k.frobenius_endomorphism()
444
+ sage: embed = Frob.fixed_field()[1]
445
+ sage: embed.__reduce__() # indirect doctest
446
+ (<built-in function unpickle_map>,
447
+ (<class 'sage.rings.finite_rings.hom_prime_finite_field.FiniteFieldHomomorphism_prime'>,
448
+ Set of field embeddings from Finite Field of size 5 to Finite Field in t of size 5^3,
449
+ {},
450
+ {'__im_gens': [1],
451
+ '_base_map': None,
452
+ '_codomain': Finite Field in t of size 5^3,
453
+ '_domain': Finite Field of size 5,
454
+ '_is_coercion': False,
455
+ '_lift': None,
456
+ '_repr_type_str': None,
457
+ '_section_class': <class 'sage.rings.finite_rings.hom_prime_finite_field.SectionFiniteFieldHomomorphism_prime'>}))
458
+ """
459
+ cdef dict slots
460
+ slots = RingHomomorphism_im_gens._extra_slots(self)
461
+ slots['_section_class'] = self._section_class
462
+ return slots
463
+
464
+ cdef _update_slots(self, dict slots):
465
+ r"""
466
+ Helper function for copying and pickling.
467
+
468
+ TESTS::
469
+
470
+ sage: k.<t> = GF(5^3)
471
+ sage: Frob = k.frobenius_endomorphism()
472
+ sage: embed = Frob.fixed_field()[1]
473
+ sage: f = loads(dumps(embed))
474
+ sage: f == embed
475
+ True
476
+ sage: f.section()
477
+ Section of Ring morphism:
478
+ From: Finite Field of size 5
479
+ To: Finite Field in t of size 5^3
480
+ Defn: 1 |--> 1
481
+ """
482
+ RingHomomorphism_im_gens._update_slots(self, slots)
483
+ self._section_class = slots['_section_class']
484
+
485
+
486
+ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic):
487
+ """
488
+ A class implementing Frobenius endomorphisms on finite fields.
489
+
490
+ TESTS::
491
+
492
+ sage: k.<a> = GF(7^11)
493
+ sage: Frob = k.frobenius_endomorphism(5)
494
+ sage: TestSuite(Frob).run()
495
+ """
496
+ def __init__(self, domain, n=1):
497
+ """
498
+ INPUT:
499
+
500
+ - ``domain`` -- a finite field
501
+
502
+ - ``n`` -- integer (default: 1)
503
+
504
+ .. NOTE::
505
+
506
+ `n` may be negative.
507
+
508
+ OUTPUT:
509
+
510
+ The `n`-th power of the absolute (arithmetic) Frobenius
511
+ endomorphism on ``domain``
512
+
513
+ TESTS::
514
+
515
+ sage: from sage.rings.finite_rings.hom_finite_field import FrobeniusEndomorphism_finite_field
516
+ sage: k.<t> = GF(5^3)
517
+ sage: FrobeniusEndomorphism_finite_field(k)
518
+ Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3
519
+ sage: FrobeniusEndomorphism_finite_field(k, 2)
520
+ Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
521
+
522
+ sage: FrobeniusEndomorphism_finite_field(k, t)
523
+ Traceback (most recent call last):
524
+ ...
525
+ TypeError: n (=t) is not an integer
526
+
527
+ sage: FrobeniusEndomorphism_finite_field(k['x'])
528
+ Traceback (most recent call last):
529
+ ...
530
+ TypeError: The domain is not a finite field or does not provide the required interface for finite fields
531
+ """
532
+ if not isinstance(domain, FiniteField_base):
533
+ raise TypeError("The domain is not a finite field or does not provide the required interface for finite fields")
534
+ try:
535
+ n = Integer(n)
536
+ except TypeError:
537
+ raise TypeError("n (=%s) is not an integer" % n)
538
+
539
+ self._degree = domain.degree()
540
+ self._power = n % self._degree
541
+ self._degree_fixed = domain.degree().gcd(self._power)
542
+ self._order = self._degree / self._degree_fixed
543
+ self._q = domain.characteristic() ** self._power
544
+ RingHomomorphism.__init__(self, Hom(domain, domain))
545
+
546
+ def _repr_(self):
547
+ """
548
+ Return a string representation of this endomorphism.
549
+
550
+ EXAMPLES::
551
+
552
+ sage: k.<t> = GF(5^3)
553
+ sage: Frob = k.frobenius_endomorphism(); Frob
554
+ Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3
555
+
556
+ sage: Frob._repr_()
557
+ 'Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3'
558
+ """
559
+ name = self.domain().variable_name()
560
+ if self._power == 0:
561
+ s = "Identity endomorphism of"
562
+ elif self._power == 1:
563
+ s = "Frobenius endomorphism %s |--> %s^%s on" % (name, name, self.domain().characteristic())
564
+ else:
565
+ s = "Frobenius endomorphism %s |--> %s^(%s^%s) on" % (name, name, self.domain().characteristic(), self._power)
566
+ s += " %s" % self.domain()
567
+ return s
568
+
569
+ def _repr_short(self):
570
+ """
571
+ Return a short string representation of this endomorphism.
572
+
573
+ EXAMPLES::
574
+
575
+ sage: k.<t> = GF(5^3)
576
+ sage: Frob = k.frobenius_endomorphism(); Frob
577
+ Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3
578
+
579
+ sage: Frob._repr_short()
580
+ 't |--> t^5'
581
+ """
582
+ name = self.domain().variable_name()
583
+ if self._power == 0:
584
+ s = "Identity"
585
+ elif self._power == 1:
586
+ s = "%s |--> %s^%s" % (name, name, self.domain().characteristic())
587
+ else:
588
+ s = "%s |--> %s^(%s^%s)" % (name, name, self.domain().characteristic(), self._power)
589
+ return s
590
+
591
+ def _latex_(self):
592
+ r"""
593
+ Return a latex representation of this endomorphism.
594
+
595
+ EXAMPLES::
596
+
597
+ sage: k.<t> = GF(5^3)
598
+ sage: Frob = k.frobenius_endomorphism()
599
+ sage: Frob._latex_()
600
+ 't \\mapsto t^{5}'
601
+ """
602
+ try:
603
+ name = self.domain().latex_variable_names()[0]
604
+ except IndexError:
605
+ name = "x"
606
+ if self._power == 0:
607
+ s = '\\verb"id"'
608
+ elif self._power == 1:
609
+ s = "%s \\mapsto %s^{%s}" % (name, name, self.domain().characteristic())
610
+ else:
611
+ s = "%s \\mapsto %s^{%s^{%s}}" % (name, name, self.domain().characteristic(), self._power)
612
+ return s
613
+
614
+ cpdef Element _call_(self, x):
615
+ """
616
+ TESTS::
617
+
618
+ sage: k.<t> = GF(5^3)
619
+ sage: Frob = k.frobenius_endomorphism()
620
+ sage: Frob(t)
621
+ 2*t^2 + 4*t + 4
622
+ sage: Frob(t) == t^5
623
+ True
624
+ """
625
+ if self.is_identity():
626
+ return x
627
+ else:
628
+ return x.pth_power(self._power)
629
+
630
+ def order(self):
631
+ """
632
+ Return the order of this endomorphism.
633
+
634
+ EXAMPLES::
635
+
636
+ sage: k.<t> = GF(5^12)
637
+ sage: Frob = k.frobenius_endomorphism()
638
+ sage: Frob.order()
639
+ 12
640
+ sage: (Frob^2).order()
641
+ 6
642
+ sage: (Frob^9).order()
643
+ 4
644
+ """
645
+ if self._order == 0:
646
+ from sage.rings.infinity import Infinity
647
+ return Infinity
648
+ else:
649
+ return Integer(self._order)
650
+
651
+ def power(self):
652
+ """
653
+ Return an integer `n` such that this endomorphism
654
+ is the `n`-th power of the absolute (arithmetic)
655
+ Frobenius.
656
+
657
+ EXAMPLES::
658
+
659
+ sage: k.<t> = GF(5^12)
660
+ sage: Frob = k.frobenius_endomorphism()
661
+ sage: Frob.power()
662
+ 1
663
+ sage: (Frob^9).power()
664
+ 9
665
+ sage: (Frob^13).power()
666
+ 1
667
+ """
668
+ return self._power
669
+
670
+ def __pow__(self, n, modulus):
671
+ """
672
+ Return the `n`-th iterate of this endomorphism.
673
+
674
+ EXAMPLES::
675
+
676
+ sage: k.<t> = GF(5^12)
677
+ sage: Frob = k.frobenius_endomorphism(); Frob
678
+ Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12
679
+ sage: Frob^2
680
+ Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^12
681
+
682
+ The result is simplified if possible::
683
+
684
+ sage: Frob^15
685
+ Frobenius endomorphism t |--> t^(5^3) on Finite Field in t of size 5^12
686
+ sage: Frob^36
687
+ Identity endomorphism of Finite Field in t of size 5^12
688
+ """
689
+ return self.__class__(self.domain(), self.power()*n)
690
+
691
+ @cached_method
692
+ def inverse(self):
693
+ """
694
+ Return the inverse of this Frobenius endomorphism.
695
+
696
+ EXAMPLES::
697
+
698
+ sage: k.<a> = GF(7^11)
699
+ sage: f = k.frobenius_endomorphism(5)
700
+ sage: (f.inverse() * f).is_identity()
701
+ True
702
+ """
703
+ return self.__class__(self.domain(), -self.power())
704
+
705
+ def _composition(self, right):
706
+ """
707
+ Return ``self`` o ``right``.
708
+
709
+ EXAMPLES::
710
+
711
+ sage: k.<t> = GF(5^12)
712
+ sage: f = k.frobenius_endomorphism(); f
713
+ Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12
714
+ sage: g = k.frobenius_endomorphism(2); g
715
+ Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^12
716
+ sage: f * g
717
+ Frobenius endomorphism t |--> t^(5^3) on Finite Field in t of size 5^12
718
+
719
+ The result is simplified if possible::
720
+
721
+ sage: f = k.frobenius_endomorphism(9)
722
+ sage: g = k.frobenius_endomorphism(10)
723
+ sage: f * g
724
+ Frobenius endomorphism t |--> t^(5^7) on Finite Field in t of size 5^12
725
+ """
726
+ if isinstance(right, FrobeniusEndomorphism_finite_field):
727
+ return self.__class__(self.domain(), self._power + right.power())
728
+ else:
729
+ return RingHomomorphism._composition(self, right)
730
+
731
+ def fixed_field(self):
732
+ """
733
+ Return the fixed field of ``self``.
734
+
735
+ OUTPUT:
736
+
737
+ - a tuple `(K, e)`, where `K` is the subfield of the domain
738
+ consisting of elements fixed by ``self`` and `e` is an
739
+ embedding of `K` into the domain.
740
+
741
+ .. NOTE::
742
+
743
+ The name of the variable used for the subfield (if it
744
+ is not a prime subfield) is suffixed by ``_fixed``.
745
+
746
+ EXAMPLES::
747
+
748
+ sage: k.<t> = GF(5^6)
749
+ sage: f = k.frobenius_endomorphism(2)
750
+ sage: kfixed, embed = f.fixed_field()
751
+ sage: kfixed
752
+ Finite Field in t_fixed of size 5^2
753
+ sage: embed # random
754
+ Ring morphism:
755
+ From: Finite Field in t_fixed of size 5^2
756
+ To: Finite Field in t of size 5^6
757
+ Defn: t_fixed |--> 4*t^5 + 2*t^4 + 4*t^2 + t
758
+
759
+ sage: tfixed = kfixed.gen()
760
+ sage: embed(tfixed) # random
761
+ 4*t^5 + 2*t^4 + 4*t^2 + t
762
+ sage: embed(tfixed) == embed.im_gens()[0]
763
+ True
764
+ """
765
+ if self._degree_fixed == 1:
766
+ k = FiniteField(self.domain().characteristic())
767
+ from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime
768
+ f = FiniteFieldHomomorphism_prime(Hom(k, self.domain()))
769
+ else:
770
+ k = FiniteField(self.domain().characteristic()**self._degree_fixed,
771
+ name=self.domain().variable_name() + "_fixed")
772
+ f = FiniteFieldHomomorphism_generic(Hom(k, self.domain()))
773
+ return k, f
774
+
775
+ def is_injective(self):
776
+ """
777
+ Return ``True`` since any power of the Frobenius endomorphism
778
+ over a finite field is always injective.
779
+
780
+ EXAMPLES::
781
+
782
+ sage: k.<t> = GF(5^3)
783
+ sage: Frob = k.frobenius_endomorphism()
784
+ sage: Frob.is_injective()
785
+ True
786
+ """
787
+ return True
788
+
789
+ def is_surjective(self):
790
+ """
791
+ Return ``True`` since any power of the Frobenius endomorphism
792
+ over a finite field is always surjective.
793
+
794
+ EXAMPLES::
795
+
796
+ sage: k.<t> = GF(5^3)
797
+ sage: Frob = k.frobenius_endomorphism()
798
+ sage: Frob.is_surjective()
799
+ True
800
+ """
801
+ return True
802
+
803
+ def is_identity(self):
804
+ """
805
+ Return ``True`` if this morphism is the identity morphism.
806
+
807
+ EXAMPLES::
808
+
809
+ sage: k.<t> = GF(5^3)
810
+ sage: Frob = k.frobenius_endomorphism()
811
+ sage: Frob.is_identity()
812
+ False
813
+ sage: (Frob^3).is_identity()
814
+ True
815
+ """
816
+ return self.power() == 0
817
+
818
+ def __hash__(self):
819
+ r"""
820
+ Return a hash of this morphism.
821
+
822
+ EXAMPLES::
823
+
824
+ sage: k.<t> = GF(5^3)
825
+ sage: Frob = k.frobenius_endomorphism()
826
+ sage: hash(Frob) # random
827
+ 383183030479672104
828
+ """
829
+ return Morphism.__hash__(self)
830
+
831
+ cdef _update_slots(self, dict slots):
832
+ r"""
833
+ Helper function for copying and pickling.
834
+
835
+ TESTS::
836
+
837
+ sage: k.<t> = GF(5^3)
838
+ sage: Frob = k.frobenius_endomorphism(2)
839
+ sage: Frob
840
+ Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
841
+
842
+ sage: phi = copy(Frob)
843
+ sage: phi
844
+ Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
845
+ sage: Frob == phi
846
+ True
847
+ """
848
+ FrobeniusEndomorphism_generic._update_slots(self, slots)
849
+ domain = self.domain()
850
+ self._degree = domain.degree()
851
+ self._degree_fixed = domain.degree().gcd(self._power)
852
+ self._order = self._degree / self._degree_fixed
853
+ self._q = domain.characteristic() ** self._power
854
+
855
+ from sage.misc.persist import register_unpickle_override
856
+ register_unpickle_override('sage.rings.finite_field_morphism', 'FiniteFieldHomomorphism_generic', FiniteFieldHomomorphism_generic)