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,1468 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Function Fields
4
+
5
+ A function field (of one variable) is a finitely generated field extension of
6
+ transcendence degree one. In Sage, a function field can be a rational function
7
+ field or a finite extension of a function field.
8
+
9
+ EXAMPLES:
10
+
11
+ We create a rational function field::
12
+
13
+ sage: # needs sage.rings.finite_rings
14
+ sage: K.<x> = FunctionField(GF(5^2,'a')); K
15
+ Rational function field in x over Finite Field in a of size 5^2
16
+ sage: K.genus()
17
+ 0
18
+ sage: f = (x^2 + x + 1) / (x^3 + 1)
19
+ sage: f
20
+ (x^2 + x + 1)/(x^3 + 1)
21
+ sage: f^3
22
+ (x^6 + 3*x^5 + x^4 + 2*x^3 + x^2 + 3*x + 1)/(x^9 + 3*x^6 + 3*x^3 + 1)
23
+
24
+ Then we create an extension of the rational function field, and do some
25
+ simple arithmetic in it::
26
+
27
+ sage: # needs sage.rings.finite_rings sage.rings.function_field
28
+ sage: R.<y> = K[]
29
+ sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x)); L
30
+ Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
31
+ sage: y^2
32
+ y^2
33
+ sage: y^3
34
+ 2*x*y + (x^4 + 1)/x
35
+ sage: a = 1/y; a
36
+ (x/(x^4 + 1))*y^2 + 3*x^2/(x^4 + 1)
37
+ sage: a * y
38
+ 1
39
+
40
+ We next make an extension of the above function field, illustrating
41
+ that arithmetic with a tower of three fields is fully supported::
42
+
43
+ sage: # needs sage.rings.finite_rings sage.rings.function_field
44
+ sage: S.<t> = L[]
45
+ sage: M.<t> = L.extension(t^2 - x*y)
46
+ sage: M
47
+ Function field in t defined by t^2 + 4*x*y
48
+ sage: t^2
49
+ x*y
50
+ sage: 1/t
51
+ ((1/(x^4 + 1))*y^2 + 3*x/(x^4 + 1))*t
52
+ sage: M.base_field()
53
+ Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
54
+ sage: M.base_field().base_field()
55
+ Rational function field in x over Finite Field in a of size 5^2
56
+
57
+ It is also possible to construct function fields over an imperfect base field::
58
+
59
+ sage: N.<u> = FunctionField(K) # needs sage.rings.finite_rings
60
+
61
+ and inseparable extension function fields::
62
+
63
+ sage: J.<x> = FunctionField(GF(5)); J
64
+ Rational function field in x over Finite Field of size 5
65
+ sage: T.<v> = J[]
66
+ sage: O.<v> = J.extension(v^5 - x); O # needs sage.rings.function_field
67
+ Function field in v defined by v^5 + 4*x
68
+
69
+ Function fields over the rational field are supported::
70
+
71
+ sage: # needs sage.rings.function_field
72
+ sage: F.<x> = FunctionField(QQ)
73
+ sage: R.<Y> = F[]
74
+ sage: L.<y> = F.extension(Y^2 - x^8 - 1)
75
+ sage: O = L.maximal_order()
76
+ sage: I = O.ideal(x, y - 1)
77
+ sage: P = I.place()
78
+ sage: D = P.divisor()
79
+ sage: D.basis_function_space()
80
+ [1]
81
+ sage: (2*D).basis_function_space()
82
+ [1]
83
+ sage: (3*D).basis_function_space()
84
+ [1]
85
+ sage: (4*D).basis_function_space()
86
+ [1, 1/x^4*y + 1/x^4]
87
+
88
+ sage: # needs sage.rings.function_field
89
+ sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
90
+ sage: F.<y> = K.extension(Y^3 - x^2*(x^2 + x + 1)^2)
91
+ sage: O = F.maximal_order()
92
+ sage: I = O.ideal(y)
93
+ sage: I.divisor()
94
+ 2*Place (x, y, (1/(x^3 + x^2 + x))*y^2)
95
+ + 2*Place (x^2 + x + 1, y, (1/(x^3 + x^2 + x))*y^2)
96
+
97
+ sage: # needs sage.rings.function_field
98
+ sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
99
+ sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
100
+ sage: O = L.maximal_order()
101
+ sage: I = O.ideal(y)
102
+ sage: I.divisor()
103
+ - Place (x, x*y)
104
+ + Place (x^2 + 1, x*y)
105
+
106
+ Function fields over the algebraic field are supported::
107
+
108
+ sage: # needs sage.rings.function_field sage.rings.number_field
109
+ sage: K.<x> = FunctionField(QQbar); _.<Y> = K[]
110
+ sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
111
+ sage: O = L.maximal_order()
112
+ sage: I = O.ideal(y)
113
+ sage: I.divisor()
114
+ Place (x - I, x*y)
115
+ - Place (x, x*y)
116
+ + Place (x + I, x*y)
117
+ sage: pl = I.divisor().support()[0]
118
+ sage: m = L.completion(pl, prec=5)
119
+ sage: m(x)
120
+ I + s + O(s^5)
121
+ sage: m(y) # long time (4s)
122
+ -2*s + (-4 - I)*s^2 + (-15 - 4*I)*s^3 + (-75 - 23*I)*s^4 + (-413 - 154*I)*s^5 + O(s^6)
123
+ sage: m(y)^2 + m(y) + m(x) + 1/m(x) # long time (8s)
124
+ O(s^5)
125
+
126
+ TESTS::
127
+
128
+ sage: TestSuite(J).run()
129
+ sage: TestSuite(K).run(max_runs=256) # long time (10s) # needs sage.rings.function_field sage.rings.number_field
130
+ sage: TestSuite(L).run(max_runs=8) # long time (25s) # needs sage.rings.function_field sage.rings.number_field
131
+
132
+ sage: # needs sage.rings.finite_rings sage.rings.function_field
133
+ sage: TestSuite(M).run(max_runs=8) # long time (35s)
134
+ sage: TestSuite(N).run(max_runs=8, skip='_test_derivation') # long time (15s)
135
+ sage: TestSuite(O).run()
136
+ sage: TestSuite(R).run()
137
+ sage: TestSuite(S).run() # long time (4s)
138
+
139
+ Global function fields
140
+ ----------------------
141
+
142
+ A global function field in Sage is an extension field of a rational function field
143
+ over a *finite* constant field by an irreducible separable polynomial over the
144
+ rational function field.
145
+
146
+ EXAMPLES:
147
+
148
+ A fundamental computation for a global or any function field is to get a basis
149
+ of its maximal order and maximal infinite order, and then do arithmetic with
150
+ ideals of those maximal orders::
151
+
152
+ sage: # needs sage.rings.function_field
153
+ sage: K.<x> = FunctionField(GF(3)); _.<t> = K[]
154
+ sage: L.<y> = K.extension(t^4 + t - x^5)
155
+ sage: O = L.maximal_order()
156
+ sage: O.basis()
157
+ (1, y, 1/x*y^2 + 1/x*y, 1/x^3*y^3 + 2/x^3*y^2 + 1/x^3*y)
158
+ sage: I = O.ideal(x,y); I
159
+ Ideal (x, y) of Maximal order of Function field in y defined by y^4 + y + 2*x^5
160
+ sage: J = I^-1
161
+ sage: J.basis_matrix()
162
+ [ 1 0 0 0]
163
+ [1/x 1/x 0 0]
164
+ [ 0 0 1 0]
165
+ [ 0 0 0 1]
166
+ sage: L.maximal_order_infinite().basis()
167
+ (1, 1/x^2*y, 1/x^3*y^2, 1/x^4*y^3)
168
+
169
+ As an example of the most sophisticated computations that Sage can do with a
170
+ global function field, we compute all the Weierstrass places of the Klein
171
+ quartic over `\GF{2}` and gap numbers for ordinary places::
172
+
173
+ sage: # needs sage.rings.function_field
174
+ sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
175
+ sage: L.<y> = K.extension(Y^3 + x^3*Y + x)
176
+ sage: L.genus()
177
+ 3
178
+ sage: L.weierstrass_places() # needs sage.modules
179
+ [Place (1/x, 1/x^3*y^2 + 1/x),
180
+ Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1),
181
+ Place (x, y),
182
+ Place (x + 1, (x^3 + 1)*y + x + 1),
183
+ Place (x^3 + x + 1, y + 1),
184
+ Place (x^3 + x + 1, y + x^2),
185
+ Place (x^3 + x + 1, y + x^2 + 1),
186
+ Place (x^3 + x^2 + 1, y + x),
187
+ Place (x^3 + x^2 + 1, y + x^2 + 1),
188
+ Place (x^3 + x^2 + 1, y + x^2 + x + 1)]
189
+ sage: L.gaps() # needs sage.modules
190
+ [1, 2, 3]
191
+
192
+ The gap numbers for Weierstrass places are of course not ordinary::
193
+
194
+ sage: # needs sage.rings.function_field
195
+ sage: p1,p2,p3 = L.weierstrass_places()[:3]
196
+ sage: p1.gaps()
197
+ [1, 2, 4]
198
+ sage: p2.gaps()
199
+ [1, 2, 4]
200
+ sage: p3.gaps()
201
+ [1, 2, 4]
202
+
203
+ AUTHORS:
204
+
205
+ - William Stein (2010): initial version
206
+
207
+ - Robert Bradshaw (2010-05-30): added is_finite()
208
+
209
+ - Julian Rüth (2011-06-08, 2011-09-14, 2014-06-23, 2014-06-24, 2016-11-13):
210
+ fixed hom(), extension(); use @cached_method; added derivation(); added
211
+ support for relative vector spaces; fixed conversion to base fields
212
+
213
+ - Maarten Derickx (2011-09-11): added doctests
214
+
215
+ - Syed Ahmad Lavasani (2011-12-16): added genus(), is_RationalFunctionField()
216
+
217
+ - Simon King (2014-10-29): Use the same generator names for a function field
218
+ extension and the underlying polynomial ring.
219
+
220
+ - Kwankyu Lee (2017-04-30): added global function fields
221
+
222
+ - Brent Baccala (2019-12-20): added function fields over number fields and QQbar
223
+
224
+ - Sebastian A. Spindler (2024-03-06): implemented Hilbert symbols for global
225
+ function fields
226
+ """
227
+
228
+ # *****************************************************************************
229
+ # Copyright (C) 2010 William Stein <wstein@gmail.com>
230
+ # 2010 Robert Bradshaw <robertwb@math.washington.edu>
231
+ # 2011-2018 Julian Rüth <julian.rueth@gmail.com>
232
+ # 2011 Maarten Derickx <m.derickx.student@gmail.com>
233
+ # 2011 Syed Ahmad Lavasani
234
+ # 2013-2014 Simon King
235
+ # 2017 Dean Bisogno
236
+ # 2017 Alyson Deines
237
+ # 2017-2019 David Roe
238
+ # 2017-2022 Kwankyu Lee
239
+ # 2018 Marc Mezzarobba
240
+ # 2018 Wilfried Luebbe
241
+ # 2019 Brent Baccala
242
+ # 2022 Frédéric Chapoton
243
+ # 2022 Gonzalo Tornaría
244
+ #
245
+ # Distributed under the terms of the GNU General Public License (GPL)
246
+ # as published by the Free Software Foundation; either version 2 of
247
+ # the License, or (at your option) any later version.
248
+ # https://www.gnu.org/licenses/
249
+ # *****************************************************************************
250
+
251
+ from sage.misc.cachefunc import cached_method
252
+ from sage.misc.lazy_import import LazyImport
253
+ from sage.rings.ring import Field
254
+ from sage.categories.homset import Hom
255
+ from sage.categories.function_fields import FunctionFields
256
+ from sage.structure.category_object import CategoryObject
257
+
258
+
259
+ def is_FunctionField(x):
260
+ """
261
+ Return ``True`` if ``x`` is a function field.
262
+
263
+ EXAMPLES::
264
+
265
+ sage: from sage.rings.function_field.function_field import is_FunctionField
266
+ sage: is_FunctionField(QQ)
267
+ doctest:warning...
268
+ DeprecationWarning: The function is_FunctionField is deprecated; use '... in FunctionFields()' instead.
269
+ See https://github.com/sagemath/sage/issues/38289 for details.
270
+ False
271
+ sage: is_FunctionField(FunctionField(QQ, 't'))
272
+ True
273
+ """
274
+ from sage.misc.superseded import deprecation
275
+ deprecation(38289,
276
+ "The function is_FunctionField is deprecated; "
277
+ "use '... in FunctionFields()' instead.")
278
+ if isinstance(x, FunctionField):
279
+ return True
280
+ return x in FunctionFields()
281
+
282
+
283
+ class FunctionField(Field):
284
+ """
285
+ Abstract base class for all function fields.
286
+
287
+ INPUT:
288
+
289
+ - ``base_field`` -- field; the base of this function field
290
+
291
+ - ``names`` -- string that gives the name of the generator
292
+
293
+ EXAMPLES::
294
+
295
+ sage: K.<x> = FunctionField(QQ)
296
+ sage: K
297
+ Rational function field in x over Rational Field
298
+ """
299
+ _differentials_space = LazyImport('sage.rings.function_field.differential', 'DifferentialsSpace')
300
+
301
+ def __init__(self, base_field, names, category=FunctionFields()):
302
+ """
303
+ Initialize.
304
+
305
+ TESTS::
306
+
307
+ sage: K.<x> = FunctionField(QQ)
308
+ sage: TestSuite(K).run() # long time (3s)
309
+ """
310
+ Field.__init__(self, base_field, names=names, category=category)
311
+
312
+ # allow conversion into the constant base field
313
+ from .maps import FunctionFieldConversionToConstantBaseField
314
+ to_constant_base_field = FunctionFieldConversionToConstantBaseField(Hom(self, self.constant_base_field()))
315
+ # the conversion map must not keep the field alive if that is the only reference to it
316
+ to_constant_base_field._make_weak_references()
317
+ self.constant_base_field().register_conversion(to_constant_base_field)
318
+
319
+ def is_perfect(self):
320
+ r"""
321
+ Return whether the field is perfect, i.e., its characteristic `p` is zero
322
+ or every element has a `p`-th root.
323
+
324
+ EXAMPLES::
325
+
326
+ sage: FunctionField(QQ, 'x').is_perfect()
327
+ True
328
+ sage: FunctionField(GF(2), 'x').is_perfect()
329
+ False
330
+ """
331
+ return self.characteristic() == 0
332
+
333
+ def some_elements(self):
334
+ """
335
+ Return some elements in this function field.
336
+
337
+ EXAMPLES::
338
+
339
+ sage: K.<x> = FunctionField(QQ)
340
+ sage: K.some_elements()
341
+ [1,
342
+ x,
343
+ 2*x,
344
+ x/(x^2 + 2*x + 1),
345
+ 1/x^2,
346
+ x/(x^2 - 1),
347
+ x/(x^2 + 1),
348
+ 1/2*x/(x^2 + 1),
349
+ 0,
350
+ 1/x,
351
+ ...]
352
+
353
+ ::
354
+
355
+ sage: R.<y> = K[]
356
+ sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
357
+ sage: L.some_elements() # needs sage.rings.function_field
358
+ [1,
359
+ y,
360
+ 1/x*y,
361
+ ((x + 1)/(x^2 - 2*x + 1))*y - 2*x/(x^2 - 2*x + 1),
362
+ 1/x,
363
+ (1/(x - 1))*y,
364
+ (1/(x + 1))*y,
365
+ (1/2/(x + 1))*y,
366
+ 0,
367
+ ...]
368
+ """
369
+ elements = []
370
+
371
+ polynomials = [self(f) for f in self._ring.some_elements()]
372
+
373
+ for numerator in polynomials:
374
+ for denominator in polynomials:
375
+ if denominator:
376
+ some_element = numerator/denominator
377
+ if some_element not in elements:
378
+ elements.append(some_element)
379
+
380
+ return elements
381
+
382
+ def characteristic(self):
383
+ """
384
+ Return the characteristic of the function field.
385
+
386
+ EXAMPLES::
387
+
388
+ sage: K.<x> = FunctionField(QQ)
389
+ sage: K.characteristic()
390
+ 0
391
+ sage: K.<x> = FunctionField(QQbar) # needs sage.rings.number_field
392
+ sage: K.characteristic()
393
+ 0
394
+ sage: K.<x> = FunctionField(GF(7))
395
+ sage: K.characteristic()
396
+ 7
397
+ sage: R.<y> = K[]
398
+ sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
399
+ sage: L.characteristic() # needs sage.rings.function_field
400
+ 7
401
+ """
402
+ return self.constant_base_field().characteristic()
403
+
404
+ def is_finite(self):
405
+ """
406
+ Return whether the function field is finite, which is false.
407
+
408
+ EXAMPLES::
409
+
410
+ sage: R.<t> = FunctionField(QQ)
411
+ sage: R.is_finite()
412
+ False
413
+ sage: R.<t> = FunctionField(GF(7))
414
+ sage: R.is_finite()
415
+ False
416
+ """
417
+ return False
418
+
419
+ def is_global(self):
420
+ """
421
+ Return whether the function field is global, that is, whether
422
+ the constant field is finite.
423
+
424
+ EXAMPLES::
425
+
426
+ sage: R.<t> = FunctionField(QQ)
427
+ sage: R.is_global()
428
+ False
429
+ sage: R.<t> = FunctionField(QQbar) # needs sage.rings.number_field
430
+ sage: R.is_global()
431
+ False
432
+ sage: R.<t> = FunctionField(GF(7))
433
+ sage: R.is_global()
434
+ True
435
+ """
436
+ return self.constant_base_field().is_finite()
437
+
438
+ def extension(self, f, names=None):
439
+ """
440
+ Create an extension `K(y)` of this function field `K` extended with
441
+ a root `y` of the univariate polynomial `f` over `K`.
442
+
443
+ INPUT:
444
+
445
+ - ``f`` -- univariate polynomial over `K`
446
+
447
+ - ``names`` -- string or tuple of length 1 that names the variable `y`
448
+
449
+ OUTPUT: a function field
450
+
451
+ EXAMPLES::
452
+
453
+ sage: K.<x> = FunctionField(QQ); R.<y> = K[]
454
+ sage: K.extension(y^5 - x^3 - 3*x + x*y) # needs sage.rings.function_field
455
+ Function field in y defined by y^5 + x*y - x^3 - 3*x
456
+
457
+ A nonintegral defining polynomial::
458
+
459
+ sage: K.<t> = FunctionField(QQ); R.<y> = K[]
460
+ sage: K.extension(y^3 + (1/t)*y + t^3/(t+1), 'z') # needs sage.rings.function_field
461
+ Function field in z defined by z^3 + 1/t*z + t^3/(t + 1)
462
+
463
+ The defining polynomial need not be monic or integral::
464
+
465
+ sage: K.extension(t*y^3 + (1/t)*y + t^3/(t+1)) # needs sage.rings.function_field
466
+ Function field in y defined by t*y^3 + 1/t*y + t^3/(t + 1)
467
+ """
468
+ from . import constructor
469
+ return constructor.FunctionFieldExtension(f, names)
470
+
471
+ def order_with_basis(self, basis, check=True):
472
+ """
473
+ Return the order with given basis over the maximal order of
474
+ the base field.
475
+
476
+ INPUT:
477
+
478
+ - ``basis`` -- list of elements of this function field
479
+
480
+ - ``check`` -- boolean (default: ``True``); if ``True``, check that the
481
+ basis is really linearly independent and that the module it spans is
482
+ closed under multiplication, and contains the identity element.
483
+
484
+ OUTPUT: an order in the function field
485
+
486
+ EXAMPLES::
487
+
488
+ sage: K.<x> = FunctionField(QQ); R.<y> = K[]
489
+ sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1) # needs sage.rings.function_field
490
+ sage: O = L.order_with_basis([1, y, y^2]); O # needs sage.rings.function_field
491
+ Order in Function field in y defined by y^3 + x^3 + 4*x + 1
492
+ sage: O.basis() # needs sage.rings.function_field
493
+ (1, y, y^2)
494
+
495
+ Note that 1 does not need to be an element of the basis, as long it is in the module spanned by it::
496
+
497
+ sage: O = L.order_with_basis([1+y, y, y^2]); O # needs sage.rings.function_field
498
+ Order in Function field in y defined by y^3 + x^3 + 4*x + 1
499
+ sage: O.basis() # needs sage.rings.function_field
500
+ (y + 1, y, y^2)
501
+
502
+ The following error is raised when the module spanned by the basis is not closed under multiplication::
503
+
504
+ sage: O = L.order_with_basis([1, x^2 + x*y, (2/3)*y^2]); O # needs sage.rings.function_field
505
+ Traceback (most recent call last):
506
+ ...
507
+ ValueError: the module generated by basis (1, x*y + x^2, 2/3*y^2) must be closed under multiplication
508
+
509
+ and this happens when the identity is not in the module spanned by the basis::
510
+
511
+ sage: O = L.order_with_basis([x, x^2 + x*y, (2/3)*y^2]) # needs sage.rings.function_field
512
+ Traceback (most recent call last):
513
+ ...
514
+ ValueError: the identity element must be in the module spanned by basis (x, x*y + x^2, 2/3*y^2)
515
+ """
516
+ from .order_basis import FunctionFieldOrder_basis
517
+ return FunctionFieldOrder_basis(tuple([self(a) for a in basis]), check=check)
518
+
519
+ def order(self, x, check=True):
520
+ """
521
+ Return the order generated by ``x`` over the base maximal order.
522
+
523
+ INPUT:
524
+
525
+ - ``x`` -- element or list of elements of the function field
526
+
527
+ - ``check`` -- boolean; if ``True``, check that ``x`` really generates an order
528
+
529
+ EXAMPLES::
530
+
531
+ sage: # needs sage.rings.function_field
532
+ sage: K.<x> = FunctionField(QQ); R.<y> = K[]
533
+ sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1)
534
+ sage: O = L.order(y); O # needs sage.modules
535
+ Order in Function field in y defined by y^3 + x^3 + 4*x + 1
536
+ sage: O.basis() # needs sage.modules
537
+ (1, y, y^2)
538
+
539
+ sage: Z = K.order(x); Z # needs sage.rings.function_field
540
+ Order in Rational function field in x over Rational Field
541
+ sage: Z.basis() # needs sage.rings.function_field
542
+ (1,)
543
+
544
+ Orders with multiple generators are not yet supported::
545
+
546
+ sage: Z = K.order([x, x^2]); Z # needs sage.rings.function_field
547
+ Traceback (most recent call last):
548
+ ...
549
+ NotImplementedError
550
+ """
551
+ if not isinstance(x, (list, tuple)):
552
+ x = [x]
553
+ if len(x) == 1:
554
+ g = x[0]
555
+ basis = [self(1)]
556
+ for i in range(self.degree()-1):
557
+ basis.append(basis[-1]*g)
558
+ else:
559
+ raise NotImplementedError
560
+ return self.order_with_basis(basis, check=check)
561
+
562
+ def order_infinite_with_basis(self, basis, check=True):
563
+ """
564
+ Return the order with given basis over the maximal infinite order of
565
+ the base field.
566
+
567
+ INPUT:
568
+
569
+ - ``basis`` -- list of elements of the function field
570
+
571
+ - ``check`` -- boolean (default: ``True``); if ``True``, check that the basis
572
+ is really linearly independent and that the module it spans is closed
573
+ under multiplication, and contains the identity element.
574
+
575
+ EXAMPLES::
576
+
577
+ sage: # needs sage.rings.function_field
578
+ sage: K.<x> = FunctionField(QQ); R.<y> = K[]
579
+ sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1)
580
+ sage: O = L.order_infinite_with_basis([1, 1/x*y, 1/x^2*y^2]); O
581
+ Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
582
+ sage: O.basis()
583
+ (1, 1/x*y, 1/x^2*y^2)
584
+
585
+ Note that 1 does not need to be an element of the basis, as long it is
586
+ in the module spanned by it::
587
+
588
+ sage: O = L.order_infinite_with_basis([1+1/x*y,1/x*y, 1/x^2*y^2]); O # needs sage.rings.function_field
589
+ Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
590
+ sage: O.basis() # needs sage.rings.function_field
591
+ (1/x*y + 1, 1/x*y, 1/x^2*y^2)
592
+
593
+ The following error is raised when the module spanned by the basis is
594
+ not closed under multiplication::
595
+
596
+ sage: O = L.order_infinite_with_basis([1,y, 1/x^2*y^2]); O # needs sage.rings.function_field
597
+ Traceback (most recent call last):
598
+ ...
599
+ ValueError: the module generated by basis (1, y, 1/x^2*y^2) must be closed under multiplication
600
+
601
+ and this happens when the identity is not in the module spanned by the
602
+ basis::
603
+
604
+ sage: O = L.order_infinite_with_basis([1/x,1/x*y, 1/x^2*y^2]) # needs sage.rings.function_field
605
+ Traceback (most recent call last):
606
+ ...
607
+ ValueError: the identity element must be in the module spanned by basis (1/x, 1/x*y, 1/x^2*y^2)
608
+ """
609
+ from .order_basis import FunctionFieldOrderInfinite_basis
610
+ return FunctionFieldOrderInfinite_basis(tuple([self(g) for g in basis]), check=check)
611
+
612
+ def order_infinite(self, x, check=True):
613
+ """
614
+ Return the order generated by ``x`` over the maximal infinite order.
615
+
616
+ INPUT:
617
+
618
+ - ``x`` -- element or a list of elements of the function field
619
+
620
+ - ``check`` -- boolean; if ``True``, check that ``x`` really generates an order
621
+
622
+ EXAMPLES::
623
+
624
+ sage: K.<x> = FunctionField(QQ); R.<y> = K[]
625
+ sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1) # needs sage.rings.function_field
626
+ sage: L.order_infinite(y) # not implemented # needs sage.rings.function_field
627
+
628
+ sage: Z = K.order(x); Z # needs sage.modules
629
+ Order in Rational function field in x over Rational Field
630
+ sage: Z.basis() # needs sage.modules
631
+ (1,)
632
+
633
+ Orders with multiple generators, not yet supported::
634
+
635
+ sage: Z = K.order_infinite([x, x^2]); Z
636
+ Traceback (most recent call last):
637
+ ...
638
+ NotImplementedError
639
+ """
640
+ if not isinstance(x, (list, tuple)):
641
+ x = [x]
642
+ if len(x) == 1:
643
+ g = x[0]
644
+ basis = [self(1)]
645
+ for i in range(self.degree()-1):
646
+ basis.append(basis[-1]*g)
647
+ else:
648
+ raise NotImplementedError
649
+ return self.order_infinite_with_basis(tuple(basis), check=check)
650
+
651
+ def _coerce_map_from_(self, source):
652
+ """
653
+ Return ``True`` if there is a coerce map from ``R`` to the function field.
654
+
655
+ INPUT:
656
+
657
+ - ``source`` -- ring
658
+
659
+ EXAMPLES::
660
+
661
+ sage: # needs sage.rings.function_field
662
+ sage: K.<x> = FunctionField(QQ); R.<y> = K[]
663
+ sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1)
664
+ sage: L.equation_order()
665
+ Order in Function field in y defined by y^3 + x^3 + 4*x + 1
666
+ sage: L._coerce_map_from_(L.equation_order())
667
+ Conversion map:
668
+ From: Order in Function field in y defined by y^3 + x^3 + 4*x + 1
669
+ To: Function field in y defined by y^3 + x^3 + 4*x + 1
670
+ sage: L._coerce_map_from_(GF(7))
671
+
672
+ sage: K.<x> = FunctionField(QQ)
673
+ sage: L.<x> = FunctionField(GaussianIntegers().fraction_field()) # needs sage.rings.number_field
674
+ sage: L.has_coerce_map_from(K) # needs sage.rings.number_field
675
+ True
676
+
677
+ sage: K.<x> = FunctionField(QQ)
678
+ sage: R.<y> = K[]
679
+ sage: L.<y> = K.extension(y^3 + 1) # needs sage.rings.function_field
680
+ sage: K.<x> = FunctionField(GaussianIntegers().fraction_field()) # needs sage.rings.number_field
681
+ sage: R.<y> = K[]
682
+ sage: M.<y> = K.extension(y^3 + 1) # needs sage.rings.function_field
683
+ sage: M.has_coerce_map_from(L) # not tested (the constant field including into a function field is not yet known to be injective), needs sage.rings.function_field
684
+ True
685
+
686
+ sage: K.<x> = FunctionField(QQ)
687
+ sage: R.<I> = K[]
688
+ sage: L.<I> = K.extension(I^2 + 1) # needs sage.rings.function_field
689
+ sage: M.<x> = FunctionField(GaussianIntegers().fraction_field()) # needs sage.rings.number_field
690
+ sage: M.has_coerce_map_from(L) # needs sage.rings.function_field sage.rings.number_field
691
+ True
692
+
693
+ Check that :issue:`31072` is fixed::
694
+
695
+ sage: L.<t> = FunctionField(QQ)
696
+ sage: L(Sequence([1, 2]))
697
+ 2*t + 1
698
+ """
699
+ from .order import FunctionFieldOrder_base
700
+ if isinstance(source, FunctionFieldOrder_base):
701
+ K = source.fraction_field()
702
+ if K is self:
703
+ return self._generic_coerce_map(source)
704
+ source_to_K = K.coerce_map_from(source)
705
+ K_to_self = self.coerce_map_from(K)
706
+ if source_to_K and K_to_self:
707
+ return K_to_self * source_to_K
708
+ if isinstance(source, CategoryObject) and source in FunctionFields():
709
+ if source.base_field() is source:
710
+ if self.base_field() is self:
711
+ # source and self are rational function fields
712
+ if source.variable_name() == self.variable_name():
713
+ # ... in the same variable
714
+ base_coercion = self.constant_field().coerce_map_from(source.constant_field())
715
+ if base_coercion is not None:
716
+ return source.hom([self.gen()], base_morphism=base_coercion)
717
+ else:
718
+ # source is an extensions of rational function fields
719
+ base_coercion = self.coerce_map_from(source.base_field())
720
+ if base_coercion is not None and base_coercion.is_injective():
721
+ # the base field of source coerces into the base field of self
722
+ self_polynomial = source.polynomial().map_coefficients(base_coercion)
723
+ # try to find a root of the defining polynomial in self
724
+ if self_polynomial(self.gen()) == 0:
725
+ # The defining polynomial of source has a root in self,
726
+ # therefore there is a map. To be sure that it is
727
+ # canonical, we require a root of the defining polynomial
728
+ # of self to be a root of the defining polynomial of
729
+ # source (and that the variables are named equally):
730
+ if source.variable_name() == self.variable_name():
731
+ return source.hom([self.gen()], base_morphism=base_coercion)
732
+
733
+ try:
734
+ sourcegen_in_self = self(source.variable_name())
735
+ except TypeError:
736
+ pass
737
+ else:
738
+ if self_polynomial(sourcegen_in_self) == 0:
739
+ # The defining polynomial of source has a root in self,
740
+ # therefore there is a map. To be sure that it is
741
+ # canonical, we require the names of the roots to match
742
+ return source.hom([sourcegen_in_self], base_morphism=base_coercion)
743
+
744
+ def _test_derivation(self, **options):
745
+ """
746
+ Test the correctness of the derivations of the function field.
747
+
748
+ EXAMPLES::
749
+
750
+ sage: K.<x> = FunctionField(QQ)
751
+ sage: TestSuite(K).run() # indirect doctest, long time (3s)
752
+ """
753
+ tester = self._tester(**options)
754
+ S = tester.some_elements()
755
+ K = self.constant_base_field().some_elements()
756
+ try:
757
+ d = self.derivation()
758
+ except ImportError:
759
+ return
760
+ from itertools import product
761
+ # Non-zero
762
+ tester.assertFalse(d.is_zero())
763
+ # Well-defined
764
+ if hasattr(self, "polynomial"):
765
+ f = self.polynomial()
766
+ tester.assertEqual(0, d(f))
767
+ # Leibniz's law
768
+ for x,y in tester.some_elements(product(S, S)):
769
+ tester.assertEqual(d(x*y), x*d(y) + d(x)*y)
770
+ # Linearity
771
+ for x,y in tester.some_elements(product(S, S)):
772
+ tester.assertEqual(d(x+y), d(x) + d(y))
773
+ for c,x in tester.some_elements(product(K, S)):
774
+ tester.assertEqual(d(c*x), c*d(x))
775
+ # Constants map to zero
776
+ for c in tester.some_elements(K):
777
+ tester.assertEqual(d(c), 0)
778
+
779
+ def _convert_map_from_(self, R):
780
+ """
781
+ Return a conversion from ``R`` to this function field if one exists.
782
+
783
+ INPUT:
784
+
785
+ - ``R`` -- ring
786
+
787
+ EXAMPLES::
788
+
789
+ sage: K.<x> = FunctionField(QQ)
790
+ sage: R.<y> = K[]
791
+ sage: L.<y> = K.extension(y^3 + x^3 + 4*x + 1) # needs sage.rings.function_field
792
+ sage: K(L(x)) # indirect doctest # needs sage.rings.function_field
793
+ x
794
+ """
795
+ try:
796
+ from .function_field_polymod import FunctionField_polymod
797
+ except ImportError:
798
+ FunctionField_polymod = ()
799
+ if isinstance(R, FunctionField_polymod):
800
+ base_conversion = self.convert_map_from(R.base_field())
801
+ if base_conversion is not None:
802
+ from sage.categories.morphism import SetMorphism
803
+ return base_conversion * SetMorphism(R.Hom(R.base_field()), R._to_base_field)
804
+
805
+ def _intermediate_fields(self, base):
806
+ """
807
+ Return the fields which lie in between base and the function field in
808
+ the tower of function fields.
809
+
810
+ INPUT:
811
+
812
+ - ``base`` -- function field, either this field or a field from which
813
+ this field has been created as an extension
814
+
815
+ OUTPUT: list of fields; the first entry is this field, the last entry is ``base``
816
+
817
+ EXAMPLES::
818
+
819
+ sage: K.<x> = FunctionField(QQ)
820
+ sage: K._intermediate_fields(K)
821
+ [Rational function field in x over Rational Field]
822
+
823
+ sage: R.<y> = K[]
824
+ sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
825
+ sage: L._intermediate_fields(K) # needs sage.rings.function_field
826
+ [Function field in y defined by y^2 - x,
827
+ Rational function field in x over Rational Field]
828
+
829
+ sage: # needs sage.rings.function_field
830
+ sage: R.<z> = L[]
831
+ sage: M.<z> = L.extension(z^2 - y)
832
+ sage: M._intermediate_fields(L)
833
+ [Function field in z defined by z^2 - y,
834
+ Function field in y defined by y^2 - x]
835
+ sage: M._intermediate_fields(K)
836
+ [Function field in z defined by z^2 - y,
837
+ Function field in y defined by y^2 - x,
838
+ Rational function field in x over Rational Field]
839
+
840
+ TESTS::
841
+
842
+ sage: K._intermediate_fields(M) # needs sage.rings.function_field
843
+ Traceback (most recent call last):
844
+ ...
845
+ ValueError: field has not been constructed as a finite extension of base
846
+ sage: K._intermediate_fields(QQ)
847
+ Traceback (most recent call last):
848
+ ...
849
+ TypeError: base must be a function field
850
+ """
851
+ if base not in FunctionFields():
852
+ raise TypeError("base must be a function field")
853
+
854
+ ret = [self]
855
+ while ret[-1] is not base:
856
+ ret.append(ret[-1].base_field())
857
+ if ret[-1] is ret[-2]:
858
+ raise ValueError("field has not been constructed as a finite extension of base")
859
+ return ret
860
+
861
+ def rational_function_field(self):
862
+ r"""
863
+ Return the rational function field from which this field has been
864
+ created as an extension.
865
+
866
+ EXAMPLES::
867
+
868
+ sage: K.<x> = FunctionField(QQ)
869
+ sage: K.rational_function_field()
870
+ Rational function field in x over Rational Field
871
+
872
+ sage: R.<y> = K[]
873
+ sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field
874
+ sage: L.rational_function_field() # needs sage.rings.function_field
875
+ Rational function field in x over Rational Field
876
+
877
+ sage: R.<z> = L[] # needs sage.rings.function_field
878
+ sage: M.<z> = L.extension(z^2 - y) # needs sage.rings.function_field
879
+ sage: M.rational_function_field() # needs sage.rings.function_field
880
+ Rational function field in x over Rational Field
881
+ """
882
+ from .function_field_rational import RationalFunctionField
883
+
884
+ return self if isinstance(self, RationalFunctionField) else self.base_field().rational_function_field()
885
+
886
+ def valuation(self, prime):
887
+ r"""
888
+ Return the discrete valuation on this function field defined by
889
+ ``prime``.
890
+
891
+ INPUT:
892
+
893
+ - ``prime`` -- a place of the function field, a valuation on a subring,
894
+ or a valuation on another function field together with information
895
+ for isomorphisms to and from that function field
896
+
897
+ EXAMPLES:
898
+
899
+ We create valuations that correspond to finite rational places of a
900
+ function field::
901
+
902
+ sage: K.<x> = FunctionField(QQ)
903
+ sage: v = K.valuation(1); v # needs sage.rings.function_field
904
+ (x - 1)-adic valuation
905
+ sage: v(x) # needs sage.rings.function_field
906
+ 0
907
+ sage: v(x - 1) # needs sage.rings.function_field
908
+ 1
909
+
910
+ A place can also be specified with an irreducible polynomial::
911
+
912
+ sage: v = K.valuation(x - 1); v # needs sage.rings.function_field
913
+ (x - 1)-adic valuation
914
+
915
+ Similarly, for a finite non-rational place::
916
+
917
+ sage: v = K.valuation(x^2 + 1); v # needs sage.rings.function_field
918
+ (x^2 + 1)-adic valuation
919
+ sage: v(x^2 + 1) # needs sage.rings.function_field
920
+ 1
921
+ sage: v(x) # needs sage.rings.function_field
922
+ 0
923
+
924
+ Or for the infinite place::
925
+
926
+ sage: v = K.valuation(1/x); v # needs sage.rings.function_field
927
+ Valuation at the infinite place
928
+ sage: v(x) # needs sage.rings.function_field
929
+ -1
930
+
931
+ Instead of specifying a generator of a place, we can define a valuation on a
932
+ rational function field by giving a discrete valuation on the underlying
933
+ polynomial ring::
934
+
935
+ sage: # needs sage.rings.function_field
936
+ sage: R.<x> = QQ[]
937
+ sage: u = valuations.GaussValuation(R, valuations.TrivialValuation(QQ))
938
+ sage: w = u.augmentation(x - 1, 1)
939
+ sage: v = K.valuation(w); v
940
+ (x - 1)-adic valuation
941
+
942
+ Note that this allows us to specify valuations which do not correspond to a
943
+ place of the function field::
944
+
945
+ sage: w = valuations.GaussValuation(R, QQ.valuation(2)) # needs sage.rings.function_field
946
+ sage: v = K.valuation(w); v # needs sage.rings.function_field
947
+ 2-adic valuation
948
+
949
+ The same is possible for valuations with `v(1/x) > 0` by passing in an
950
+ extra pair of parameters, an isomorphism between this function field and an
951
+ isomorphic function field. That way you can, for example, indicate that the
952
+ valuation is to be understood as a valuation on `K[1/x]`, i.e., after
953
+ applying the substitution `x \mapsto 1/x` (here, the inverse map is also `x
954
+ \mapsto 1/x`)::
955
+
956
+ sage: # needs sage.rings.function_field
957
+ sage: w = valuations.GaussValuation(R, QQ.valuation(2)).augmentation(x, 1)
958
+ sage: w = K.valuation(w)
959
+ sage: v = K.valuation((w, K.hom([~K.gen()]), K.hom([~K.gen()]))); v
960
+ Valuation on rational function field
961
+ induced by [ Gauss valuation induced by 2-adic valuation, v(x) = 1 ]
962
+ (in Rational function field in x over Rational Field after x |--> 1/x)
963
+
964
+ Note that classical valuations at finite places or the infinite place are
965
+ always normalized such that the uniformizing element has valuation 1::
966
+
967
+ sage: # needs sage.rings.function_field
968
+ sage: K.<t> = FunctionField(GF(3))
969
+ sage: M.<x> = FunctionField(K)
970
+ sage: v = M.valuation(x^3 - t)
971
+ sage: v(x^3 - t)
972
+ 1
973
+
974
+ However, if such a valuation comes out of a base change of the ground
975
+ field, this is not the case anymore. In the example below, the unique
976
+ extension of ``v`` to ``L`` still has valuation 1 on `x^3 - t` but it has
977
+ valuation ``1/3`` on its uniformizing element `x - w`::
978
+
979
+ sage: # needs sage.rings.function_field
980
+ sage: R.<w> = K[]
981
+ sage: L.<w> = K.extension(w^3 - t)
982
+ sage: N.<x> = FunctionField(L)
983
+ sage: w = v.extension(N) # missing factorization, :issue:`16572`
984
+ Traceback (most recent call last):
985
+ ...
986
+ NotImplementedError
987
+ sage: w(x^3 - t) # not tested
988
+ 1
989
+ sage: w(x - w) # not tested
990
+ 1/3
991
+
992
+ There are several ways to create valuations on extensions of rational
993
+ function fields::
994
+
995
+ sage: K.<x> = FunctionField(QQ)
996
+ sage: R.<y> = K[]
997
+ sage: L.<y> = K.extension(y^2 - x); L # needs sage.rings.function_field
998
+ Function field in y defined by y^2 - x
999
+
1000
+ A place that has a unique extension can just be defined downstairs::
1001
+
1002
+ sage: v = L.valuation(x); v # needs sage.geometry.polyhedron sage.rings.function_field
1003
+ (x)-adic valuation
1004
+ """
1005
+ from sage.rings.function_field.valuation import FunctionFieldValuation
1006
+ return FunctionFieldValuation(self, prime)
1007
+
1008
+ def space_of_differentials(self):
1009
+ """
1010
+ Return the space of differentials attached to the function field.
1011
+
1012
+ EXAMPLES::
1013
+
1014
+ sage: K.<t> = FunctionField(QQ)
1015
+ sage: K.space_of_differentials() # needs sage.modules
1016
+ Space of differentials of Rational function field in t over Rational Field
1017
+
1018
+ sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
1019
+ sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
1020
+ sage: L.space_of_differentials() # needs sage.rings.function_field
1021
+ Space of differentials of Function field in y
1022
+ defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
1023
+ """
1024
+ return self._differentials_space(self)
1025
+
1026
+ def space_of_holomorphic_differentials(self):
1027
+ """
1028
+ Return the space of holomorphic differentials of this function field.
1029
+
1030
+ EXAMPLES::
1031
+
1032
+ sage: K.<t> = FunctionField(QQ)
1033
+ sage: K.space_of_holomorphic_differentials() # needs sage.libs.pari sage.modules
1034
+ (Vector space of dimension 0 over Rational Field,
1035
+ Linear map:
1036
+ From: Vector space of dimension 0 over Rational Field
1037
+ To: Space of differentials of Rational function field in t over Rational Field,
1038
+ Section of linear map:
1039
+ From: Space of differentials of Rational function field in t over Rational Field
1040
+ To: Vector space of dimension 0 over Rational Field)
1041
+
1042
+ sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
1043
+ sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
1044
+ sage: L.space_of_holomorphic_differentials() # needs sage.rings.function_field
1045
+ (Vector space of dimension 4 over Finite Field of size 5,
1046
+ Linear map:
1047
+ From: Vector space of dimension 4 over Finite Field of size 5
1048
+ To: Space of differentials of Function field in y
1049
+ defined by y^3 + (4*x^3 + 1)/(x^3 + 3),
1050
+ Section of linear map:
1051
+ From: Space of differentials of Function field in y
1052
+ defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
1053
+ To: Vector space of dimension 4 over Finite Field of size 5)
1054
+ """
1055
+ return self.divisor_group().zero().differential_space()
1056
+
1057
+ space_of_differentials_of_first_kind = space_of_holomorphic_differentials
1058
+
1059
+ def basis_of_holomorphic_differentials(self):
1060
+ """
1061
+ Return a basis of the space of holomorphic differentials of this function field.
1062
+
1063
+ EXAMPLES::
1064
+
1065
+ sage: K.<t> = FunctionField(QQ)
1066
+ sage: K.basis_of_holomorphic_differentials() # needs sage.libs.pari sage.modules
1067
+ []
1068
+
1069
+ sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
1070
+ sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
1071
+ sage: L.basis_of_holomorphic_differentials() # needs sage.rings.function_field
1072
+ [((x/(x^3 + 4))*y) d(x),
1073
+ ((1/(x^3 + 4))*y) d(x),
1074
+ ((x/(x^3 + 4))*y^2) d(x),
1075
+ ((1/(x^3 + 4))*y^2) d(x)]
1076
+ """
1077
+ return self.divisor_group().zero().basis_differential_space()
1078
+
1079
+ basis_of_differentials_of_first_kind = basis_of_holomorphic_differentials
1080
+
1081
+ def divisor_group(self):
1082
+ """
1083
+ Return the group of divisors attached to the function field.
1084
+
1085
+ EXAMPLES::
1086
+
1087
+ sage: K.<t> = FunctionField(QQ)
1088
+ sage: K.divisor_group() # needs sage.modules
1089
+ Divisor group of Rational function field in t over Rational Field
1090
+
1091
+ sage: _.<Y> = K[]
1092
+ sage: L.<y> = K.extension(Y^3 - (t^3 - 1)/(t^3 - 2)) # needs sage.rings.function_field
1093
+ sage: L.divisor_group() # needs sage.rings.function_field
1094
+ Divisor group of Function field in y defined by y^3 + (-t^3 + 1)/(t^3 - 2)
1095
+
1096
+ sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
1097
+ sage: L.<y> = K.extension(Y^3 - (x^3 - 1)/(x^3 - 2)) # needs sage.rings.function_field
1098
+ sage: L.divisor_group() # needs sage.rings.function_field
1099
+ Divisor group of Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
1100
+ """
1101
+ from .divisor import DivisorGroup
1102
+ return DivisorGroup(self)
1103
+
1104
+ def place_set(self):
1105
+ """
1106
+ Return the set of all places of the function field.
1107
+
1108
+ EXAMPLES::
1109
+
1110
+ sage: K.<t> = FunctionField(GF(7))
1111
+ sage: K.place_set()
1112
+ Set of places of Rational function field in t over Finite Field of size 7
1113
+
1114
+ sage: K.<t> = FunctionField(QQ)
1115
+ sage: K.place_set()
1116
+ Set of places of Rational function field in t over Rational Field
1117
+
1118
+ sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
1119
+ sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field
1120
+ sage: L.place_set() # needs sage.rings.function_field
1121
+ Set of places of Function field in y defined by y^2 + y + (x^2 + 1)/x
1122
+ """
1123
+ from .place import PlaceSet
1124
+ return PlaceSet(self)
1125
+
1126
+ @cached_method
1127
+ def completion(self, place, name=None, prec=None, gen_name=None):
1128
+ """
1129
+ Return the completion of the function field at the place.
1130
+
1131
+ INPUT:
1132
+
1133
+ - ``place`` -- place
1134
+
1135
+ - ``name`` -- string; name of the series variable
1136
+
1137
+ - ``prec`` -- positive integer; default precision
1138
+
1139
+ - ``gen_name`` -- string; name of the generator of the residue field;
1140
+ used only when the place is non-rational
1141
+
1142
+ EXAMPLES::
1143
+
1144
+ sage: # needs sage.rings.function_field
1145
+ sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
1146
+ sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
1147
+ sage: p = L.places_finite()[0]
1148
+ sage: m = L.completion(p); m
1149
+ Completion map:
1150
+ From: Function field in y defined by y^2 + y + (x^2 + 1)/x
1151
+ To: Laurent Series Ring in s over Finite Field of size 2
1152
+ sage: m(x, 10)
1153
+ s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
1154
+ sage: m(y, 10)
1155
+ s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
1156
+
1157
+ sage: # needs sage.rings.function_field
1158
+ sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
1159
+ sage: L.<y> = K.extension(Y^2 + Y + x + 1/x)
1160
+ sage: p = L.places_finite()[0]
1161
+ sage: m = L.completion(p); m
1162
+ Completion map:
1163
+ From: Function field in y defined by y^2 + y + (x^2 + 1)/x
1164
+ To: Laurent Series Ring in s over Finite Field of size 2
1165
+ sage: m(x, 10)
1166
+ s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
1167
+ sage: m(y, 10)
1168
+ s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
1169
+
1170
+ sage: K.<x> = FunctionField(GF(2))
1171
+ sage: p = K.places_finite()[0]; p # needs sage.libs.pari
1172
+ Place (x)
1173
+ sage: m = K.completion(p); m # needs sage.rings.function_field
1174
+ Completion map:
1175
+ From: Rational function field in x over Finite Field of size 2
1176
+ To: Laurent Series Ring in s over Finite Field of size 2
1177
+ sage: m(1/(x+1)) # needs sage.rings.function_field
1178
+ 1 + s + s^2 + s^3 + s^4 + s^5 + s^6 + s^7 + s^8 + s^9 + s^10 + s^11 + s^12
1179
+ + s^13 + s^14 + s^15 + s^16 + s^17 + s^18 + s^19 + O(s^20)
1180
+
1181
+ sage: p = K.place_infinite(); p
1182
+ Place (1/x)
1183
+ sage: m = K.completion(p); m # needs sage.rings.function_field
1184
+ Completion map:
1185
+ From: Rational function field in x over Finite Field of size 2
1186
+ To: Laurent Series Ring in s over Finite Field of size 2
1187
+ sage: m(x) # needs sage.rings.function_field
1188
+ s^-1 + O(s^19)
1189
+
1190
+ sage: m = K.completion(p, prec=infinity); m # needs sage.combinat sage.rings.function_field
1191
+ Completion map:
1192
+ From: Rational function field in x over Finite Field of size 2
1193
+ To: Lazy Laurent Series Ring in s over Finite Field of size 2
1194
+ sage: f = m(x); f # needs sage.combinat sage.rings.function_field
1195
+ s^-1 + ...
1196
+ sage: f.coefficient(100) # needs sage.combinat sage.rings.function_field
1197
+ 0
1198
+
1199
+ sage: # needs sage.rings.function_field
1200
+ sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
1201
+ sage: L.<y> = K.extension(Y^2 - x)
1202
+ sage: O = L.maximal_order()
1203
+ sage: decomp = O.decomposition(K.maximal_order().ideal(x - 1))
1204
+ sage: pls = (decomp[0][0].place(), decomp[1][0].place())
1205
+ sage: m = L.completion(pls[0]); m
1206
+ Completion map:
1207
+ From: Function field in y defined by y^2 - x
1208
+ To: Laurent Series Ring in s over Rational Field
1209
+ sage: xe = m(x)
1210
+ sage: ye = m(y)
1211
+ sage: ye^2 - xe == 0
1212
+ True
1213
+
1214
+ sage: # needs sage.rings.function_field
1215
+ sage: decomp2 = O.decomposition(K.maximal_order().ideal(x^2 + 1))
1216
+ sage: pls2 = decomp2[0][0].place()
1217
+ sage: m = L.completion(pls2); m
1218
+ Completion map:
1219
+ From: Function field in y defined by y^2 - x
1220
+ To: Laurent Series Ring in s over
1221
+ Number Field in a with defining polynomial x^4 + 2*x^2 + 4*x + 2
1222
+ sage: xe = m(x)
1223
+ sage: ye = m(y)
1224
+ sage: ye^2 - xe == 0
1225
+ True
1226
+ """
1227
+ from .maps import FunctionFieldCompletion
1228
+ return FunctionFieldCompletion(self, place, name=name, prec=prec, gen_name=gen_name)
1229
+
1230
+ def hilbert_symbol(self, a, b, P):
1231
+ r"""
1232
+ Return the Hilbert symbol `(a,b)_{F_P}` for the local field `F_P`.
1233
+
1234
+ The local field `F_P` is the completion of this function field `F`
1235
+ at the place `P`.
1236
+
1237
+ INPUT:
1238
+
1239
+ - ``a``, ``b`` -- elements of this function field
1240
+
1241
+ - ``P`` -- a place of this function field
1242
+
1243
+ The Hilbert symbol `(a,b)_{F_P}` is `0` if `a` or `b` is zero.
1244
+ Otherwise it takes the value `1` if the quaternion algebra
1245
+ defined by `(a,b)` over `F_P` is split, and `-1` if said
1246
+ algebra is a division ring.
1247
+
1248
+ ALGORITHM:
1249
+
1250
+ For the valuation `\nu = \nu_P` of `F`, we compute the valuations
1251
+ `\nu(a)` and `\nu(b)` as well as elements `a_0` and `b_0` of the
1252
+ residue field such that for a uniformizer `\pi` at `P`,
1253
+ `a\pi^{-\nu(a))}` respectively `b\pi^{-\nu(b)}` has the residue class
1254
+ `a_0` respectively `b_0` modulo `\pi`. Then the Hilbert symbol is
1255
+ computed by formula 12.4.10 in [Voi2021]_.
1256
+
1257
+ Currently only implemented for global function fields.
1258
+
1259
+ EXAMPLES::
1260
+
1261
+ sage: # needs sage.libs.pari
1262
+ sage: K.<x> = FunctionField(GF(17))
1263
+ sage: P = K.places()[0]; P
1264
+ Place (1/x)
1265
+ sage: a = (5*x + 6)/(x + 15)
1266
+ sage: b = 7/x
1267
+ sage: K.hilbert_symbol(a, b, P) # needs sage.libs.singular
1268
+ -1
1269
+ sage: Q = K.places()[7]; Q
1270
+ Place (x + 6)
1271
+ sage: c = 15*x + 12
1272
+ sage: d = 16/(x + 13)
1273
+ sage: K.hilbert_symbol(c, d, Q) # needs sage.libs.singular
1274
+ 1
1275
+
1276
+ Check that the Hilbert symbol is symmetric and bimultiplicative::
1277
+
1278
+ sage: # needs sage.libs.pari sage.libs.singular
1279
+ sage: K.<x> = FunctionField(GF(5)); R.<T> = PolynomialRing(K)
1280
+ sage: f = ((x^2 + 2*x + 2)*T^5 + (4*x^2 + 2*x + 3)*T^4 + 3*T^3 + 4*T^2
1281
+ ....: + (2/(x^2 + 4*x + 1))*T + 3*x^2 + 2*x + 4)
1282
+ sage: L.<y> = K.extension(f)
1283
+ sage: a = L.random_element()
1284
+ sage: b = L.random_element()
1285
+ sage: c = L.random_element()
1286
+ sage: P = L.places_above(K.places()[0])[1]
1287
+ sage: Q = L.places_above(K.places()[1])[0]
1288
+ sage: hP_a_c = L.hilbert_symbol(a, c, P)
1289
+ sage: hP_a_c == L.hilbert_symbol(c, a, P)
1290
+ True
1291
+ sage: L.hilbert_symbol(a, b, P) * hP_a_c == L.hilbert_symbol(a, b*c, P)
1292
+ True
1293
+ sage: hP_a_c * L.hilbert_symbol(b, c, P) == L.hilbert_symbol(a*b, c, P)
1294
+ True
1295
+ sage: hQ_a_c = L.hilbert_symbol(a, c, Q)
1296
+ sage: hQ_a_c == L.hilbert_symbol(c, a, Q)
1297
+ True
1298
+ sage: L.hilbert_symbol(a, b, Q) * hQ_a_c == L.hilbert_symbol(a, b*c, Q)
1299
+ True
1300
+ sage: hQ_a_c * L.hilbert_symbol(b, c, Q) == L.hilbert_symbol(a*b, c, Q)
1301
+ True
1302
+ """
1303
+ if not self.is_global():
1304
+ raise NotImplementedError('only supported for global function fields')
1305
+
1306
+ if self.characteristic() == 2:
1307
+ raise ValueError('Hilbert symbol is only defined for'
1308
+ ' odd characteristic function fields')
1309
+
1310
+ if not (a in self and b in self):
1311
+ raise ValueError('a and b must be elements of the function field')
1312
+
1313
+ if a.is_zero() or b.is_zero():
1314
+ return 0
1315
+
1316
+ # Compute the completion map to precision 1 for computation of the
1317
+ # valuations v(a), v(b) as well as the elements a0, b0
1318
+ try:
1319
+ sigma = self.completion(P, prec=1, gen_name='i')
1320
+ except AttributeError:
1321
+ raise ValueError('P must be a place of the function field F')
1322
+
1323
+ # Apply the completion map to a to get v(a) and a0
1324
+ ser_a = sigma(a)
1325
+ v_a = ser_a.valuation()
1326
+ a0 = ser_a.coefficients()[0]
1327
+
1328
+ # Apply the completion map to b to get v(b) and b0
1329
+ ser_b = sigma(b)
1330
+ v_b = ser_b.valuation()
1331
+ b0 = ser_b.coefficients()[0]
1332
+
1333
+ # Get the residue field of the completion together with the necessary exponent
1334
+ k = sigma.codomain().base_ring()
1335
+ e = (k.order() - 1) // 2
1336
+
1337
+ # Use Euler's criterion to compute the powers of Legendre symbols
1338
+ a_rd_pw = a0**(v_b * e)
1339
+ b_rd_pw = b0**(v_a * e)
1340
+
1341
+ # Finally, put the result together and transform it into the correct output
1342
+ res = k(-1)**(v_a * v_b * e) * a_rd_pw * b_rd_pw
1343
+
1344
+ from sage.rings.integer import Integer
1345
+ return Integer(1) if res.is_one() else Integer(-1)
1346
+
1347
+ def extension_constant_field(self, k):
1348
+ """
1349
+ Return the constant field extension with constant field `k`.
1350
+
1351
+ INPUT:
1352
+
1353
+ - ``k`` -- an extension field of the constant field of this function field
1354
+
1355
+ EXAMPLES::
1356
+
1357
+ sage: # needs sage.rings.function_field
1358
+ sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
1359
+ sage: F.<y> = K.extension(Y^2 + Y + x + 1/x)
1360
+ sage: E = F.extension_constant_field(GF(2^4))
1361
+ sage: E
1362
+ Function field in y defined by y^2 + y + (x^2 + 1)/x over its base
1363
+ sage: E.constant_base_field()
1364
+ Finite Field in z4 of size 2^4
1365
+ """
1366
+ from .extensions import ConstantFieldExtension
1367
+ return ConstantFieldExtension(self, k)
1368
+
1369
+ @cached_method
1370
+ def jacobian(self, model=None, base_div=None, **kwds):
1371
+ """
1372
+ Return the Jacobian of the function field.
1373
+
1374
+ INPUT:
1375
+
1376
+ - ``model`` -- (default: ``'hess'``) model to use for arithmetic
1377
+
1378
+ - ``base_div`` -- an effective divisor
1379
+
1380
+ The degree of the base divisor should satisfy certain degree condition
1381
+ corresponding to the model used. The following table lists these
1382
+ conditions. Let `g` be the genus of the function field.
1383
+
1384
+ - ``hess``: ideal-based arithmetic; requires base divisor of degree `g`
1385
+
1386
+ - ``km_large``: Khuri-Makdisi's large model; requires base divisor of
1387
+ degree at least `2g + 1`
1388
+
1389
+ - ``km_medium``: Khuri-Makdisi's medium model; requires base divisor of
1390
+ degree at least `2g + 1`
1391
+
1392
+ - ``km_small``: Khuri-Makdisi's small model requires base divisor of
1393
+ degree at least `g + 1`
1394
+
1395
+ We assume the function field has a rational place. If a base divisor is
1396
+ not given, one is constructed using an arbitrary rational place.
1397
+
1398
+ EXAMPLES::
1399
+
1400
+ sage: # needs sage.schemes
1401
+ sage: A.<x,y> = AffineSpace(GF(5), 2)
1402
+ sage: C = Curve(y^2*(x^3 - 1) - (x^3 - 2))
1403
+ sage: F = C.function_field()
1404
+ sage: F.jacobian()
1405
+ Jacobian of Function field in y defined by (x^3 + 4)*y^2 + 4*x^3 + 2 (Hess model)
1406
+
1407
+ TESTS:
1408
+
1409
+ sage: # needs sage.schemes
1410
+ sage: A.<x,y> = AffineSpace(QQ, 2)
1411
+ sage: C = Curve(y^2 - x^3 - 1, A).projective_closure()
1412
+ sage: C.jacobian(model='hess')
1413
+ Traceback (most recent call last):
1414
+ ...
1415
+ ValueError: failed to obtain a rational place; provide a base divisor
1416
+ """
1417
+ from .place import FunctionFieldPlace
1418
+
1419
+ if model is None:
1420
+ model = 'hess'
1421
+
1422
+ if base_div is None:
1423
+ try:
1424
+ base_place = self.get_place(1)
1425
+ except AttributeError:
1426
+ raise ValueError('failed to obtain a rational place; provide a base divisor')
1427
+ if base_place is None:
1428
+ raise ValueError('the function field has no rational place')
1429
+ # appropriate base divisor is constructed below.
1430
+ else:
1431
+ if isinstance(base_div, FunctionFieldPlace):
1432
+ base_div = base_div.divisor()
1433
+
1434
+ g = self.genus()
1435
+ curve = kwds.get('curve')
1436
+
1437
+ if model.startswith('km'):
1438
+ from .jacobian_khuri_makdisi import Jacobian
1439
+ if model == 'km' or model.endswith('large'):
1440
+ if base_div is None:
1441
+ base_div = (2*g + 1) * base_place
1442
+ if not base_div.degree() >= 2*g + 1:
1443
+ raise ValueError("Khuri-Makdisi large model requires base divisor of degree "
1444
+ "at least 2*g + 1 for genus g")
1445
+ return Jacobian(self, base_div, model='large', curve=curve)
1446
+ elif model.endswith('medium'):
1447
+ if base_div is None:
1448
+ base_div = (2*g + 1) * base_place
1449
+ if not base_div.degree() >= 2*g + 1:
1450
+ raise ValueError("Khuri-Makdisi medium model requires base divisor of degree "
1451
+ "at least 2*g + 1 for genus g")
1452
+ return Jacobian(self, base_div, model='medium', curve=curve)
1453
+ elif model.endswith('small'):
1454
+ if base_div is None:
1455
+ base_div = (g + 1) * base_place
1456
+ if not base_div.degree() >= g + 1:
1457
+ raise ValueError("Khuri-Makdisi small model requires base divisor of degree "
1458
+ "at least g + 1 for genus g")
1459
+ return Jacobian(self, base_div, model='small', curve=curve)
1460
+ elif model == 'hess':
1461
+ from .jacobian_hess import Jacobian
1462
+ if base_div is None:
1463
+ base_div = g * base_place
1464
+ if base_div.degree() != g:
1465
+ raise ValueError("Hess model requires base divisor of degree g for genus g")
1466
+ return Jacobian(self, base_div, curve=curve)
1467
+
1468
+ raise ValueError("unknown model")