passagemath-flint 10.6.1rc10__cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_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 (360) hide show
  1. passagemath_flint-10.6.1rc10.dist-info/METADATA +122 -0
  2. passagemath_flint-10.6.1rc10.dist-info/RECORD +360 -0
  3. passagemath_flint-10.6.1rc10.dist-info/WHEEL +6 -0
  4. passagemath_flint-10.6.1rc10.dist-info/top_level.txt +2 -0
  5. passagemath_flint.libs/libflint-3701249d.so.21.0.0 +0 -0
  6. passagemath_flint.libs/libgf2x-fbd36f80.so.3.0.0 +0 -0
  7. passagemath_flint.libs/libgfortran-8a9a71bc.so.5.0.0 +0 -0
  8. passagemath_flint.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  9. passagemath_flint.libs/libgsl-e3525837.so.28.0.0 +0 -0
  10. passagemath_flint.libs/libmpfi-ad12a86d.so.0.0.0 +0 -0
  11. passagemath_flint.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  12. passagemath_flint.libs/libntl-1004113e.so.44.0.1 +0 -0
  13. passagemath_flint.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  14. sage/all__sagemath_flint.py +29 -0
  15. sage/combinat/all__sagemath_flint.py +1 -0
  16. sage/combinat/posets/all__sagemath_flint.py +1 -0
  17. sage/combinat/posets/hasse_cython_flint.cpython-311-aarch64-linux-gnu.so +0 -0
  18. sage/combinat/posets/hasse_cython_flint.pyx +194 -0
  19. sage/data_structures/all__sagemath_flint.py +1 -0
  20. sage/data_structures/bounded_integer_sequences.cpython-311-aarch64-linux-gnu.so +0 -0
  21. sage/data_structures/bounded_integer_sequences.pxd +62 -0
  22. sage/data_structures/bounded_integer_sequences.pyx +1418 -0
  23. sage/graphs/all__sagemath_flint.py +1 -0
  24. sage/graphs/chrompoly.cpython-311-aarch64-linux-gnu.so +0 -0
  25. sage/graphs/chrompoly.pyx +555 -0
  26. sage/graphs/matchpoly.cpython-311-aarch64-linux-gnu.so +0 -0
  27. sage/graphs/matchpoly.pyx +412 -0
  28. sage/libs/all__sagemath_flint.py +17 -0
  29. sage/libs/arb/__init__.py +1 -0
  30. sage/libs/arb/acb.pxd +154 -0
  31. sage/libs/arb/acb_calc.pxd +9 -0
  32. sage/libs/arb/acb_elliptic.pxd +25 -0
  33. sage/libs/arb/acb_hypgeom.pxd +74 -0
  34. sage/libs/arb/acb_mat.pxd +62 -0
  35. sage/libs/arb/acb_modular.pxd +17 -0
  36. sage/libs/arb/acb_poly.pxd +216 -0
  37. sage/libs/arb/arb.pxd +240 -0
  38. sage/libs/arb/arb_fmpz_poly.pxd +21 -0
  39. sage/libs/arb/arb_hypgeom.pxd +83 -0
  40. sage/libs/arb/arb_wrap.h +34 -0
  41. sage/libs/arb/arf.pxd +131 -0
  42. sage/libs/arb/arith.cpython-311-aarch64-linux-gnu.so +0 -0
  43. sage/libs/arb/arith.pyx +87 -0
  44. sage/libs/arb/bernoulli.pxd +6 -0
  45. sage/libs/arb/mag.pxd +77 -0
  46. sage/libs/arb/types.pxd +37 -0
  47. sage/libs/flint/__init__.py +1 -0
  48. sage/libs/flint/acb.pxd +270 -0
  49. sage/libs/flint/acb_calc.pxd +22 -0
  50. sage/libs/flint/acb_dft.pxd +51 -0
  51. sage/libs/flint/acb_dirichlet.pxd +112 -0
  52. sage/libs/flint/acb_elliptic.pxd +42 -0
  53. sage/libs/flint/acb_hypgeom.pxd +169 -0
  54. sage/libs/flint/acb_macros.pxd +9 -0
  55. sage/libs/flint/acb_mat.pxd +136 -0
  56. sage/libs/flint/acb_mat_macros.pxd +10 -0
  57. sage/libs/flint/acb_modular.pxd +62 -0
  58. sage/libs/flint/acb_poly.pxd +251 -0
  59. sage/libs/flint/acb_poly_macros.pxd +8 -0
  60. sage/libs/flint/acb_theta.pxd +124 -0
  61. sage/libs/flint/acf.pxd +32 -0
  62. sage/libs/flint/aprcl.pxd +84 -0
  63. sage/libs/flint/arb.pxd +382 -0
  64. sage/libs/flint/arb_calc.pxd +31 -0
  65. sage/libs/flint/arb_fmpz_poly.pxd +34 -0
  66. sage/libs/flint/arb_fpwrap.pxd +215 -0
  67. sage/libs/flint/arb_hypgeom.pxd +147 -0
  68. sage/libs/flint/arb_macros.pxd +9 -0
  69. sage/libs/flint/arb_mat.pxd +140 -0
  70. sage/libs/flint/arb_mat_macros.pxd +10 -0
  71. sage/libs/flint/arb_poly.pxd +237 -0
  72. sage/libs/flint/arf.pxd +167 -0
  73. sage/libs/flint/arith.cpython-311-aarch64-linux-gnu.so +0 -0
  74. sage/libs/flint/arith.pxd +76 -0
  75. sage/libs/flint/arith.pyx +77 -0
  76. sage/libs/flint/arith_sage.cpython-311-aarch64-linux-gnu.so +0 -0
  77. sage/libs/flint/arith_sage.pyx +308 -0
  78. sage/libs/flint/bernoulli.pxd +28 -0
  79. sage/libs/flint/bool_mat.pxd +52 -0
  80. sage/libs/flint/ca.pxd +203 -0
  81. sage/libs/flint/ca_ext.pxd +34 -0
  82. sage/libs/flint/ca_field.pxd +32 -0
  83. sage/libs/flint/ca_mat.pxd +117 -0
  84. sage/libs/flint/ca_poly.pxd +104 -0
  85. sage/libs/flint/ca_vec.pxd +46 -0
  86. sage/libs/flint/calcium.pxd +27 -0
  87. sage/libs/flint/d_mat.pxd +39 -0
  88. sage/libs/flint/d_vec.pxd +32 -0
  89. sage/libs/flint/dirichlet.pxd +57 -0
  90. sage/libs/flint/dlog.pxd +53 -0
  91. sage/libs/flint/double_extras.pxd +24 -0
  92. sage/libs/flint/double_interval.pxd +36 -0
  93. sage/libs/flint/fexpr.pxd +104 -0
  94. sage/libs/flint/fexpr_builtin.pxd +20 -0
  95. sage/libs/flint/fft.pxd +66 -0
  96. sage/libs/flint/flint.pxd +36 -0
  97. sage/libs/flint/flint_ntl_wrap.h +35 -0
  98. sage/libs/flint/flint_sage.cpython-311-aarch64-linux-gnu.so +0 -0
  99. sage/libs/flint/flint_sage.pyx +163 -0
  100. sage/libs/flint/flint_wrap.h +190 -0
  101. sage/libs/flint/fmpq.pxd +137 -0
  102. sage/libs/flint/fmpq_mat.pxd +105 -0
  103. sage/libs/flint/fmpq_mat_macros.pxd +10 -0
  104. sage/libs/flint/fmpq_mpoly.pxd +165 -0
  105. sage/libs/flint/fmpq_mpoly_factor.pxd +30 -0
  106. sage/libs/flint/fmpq_poly.pxd +241 -0
  107. sage/libs/flint/fmpq_poly_macros.pxd +9 -0
  108. sage/libs/flint/fmpq_poly_sage.cpython-311-aarch64-linux-gnu.so +0 -0
  109. sage/libs/flint/fmpq_poly_sage.pxd +31 -0
  110. sage/libs/flint/fmpq_poly_sage.pyx +48 -0
  111. sage/libs/flint/fmpq_vec.pxd +27 -0
  112. sage/libs/flint/fmpz.pxd +256 -0
  113. sage/libs/flint/fmpz_extras.pxd +32 -0
  114. sage/libs/flint/fmpz_factor.pxd +42 -0
  115. sage/libs/flint/fmpz_factor_sage.cpython-311-aarch64-linux-gnu.so +0 -0
  116. sage/libs/flint/fmpz_factor_sage.pxd +4 -0
  117. sage/libs/flint/fmpz_factor_sage.pyx +29 -0
  118. sage/libs/flint/fmpz_lll.pxd +49 -0
  119. sage/libs/flint/fmpz_macros.pxd +8 -0
  120. sage/libs/flint/fmpz_mat.pxd +184 -0
  121. sage/libs/flint/fmpz_mat_macros.pxd +10 -0
  122. sage/libs/flint/fmpz_mod.pxd +46 -0
  123. sage/libs/flint/fmpz_mod_mat.pxd +71 -0
  124. sage/libs/flint/fmpz_mod_mpoly.pxd +161 -0
  125. sage/libs/flint/fmpz_mod_mpoly_factor.pxd +28 -0
  126. sage/libs/flint/fmpz_mod_poly.pxd +249 -0
  127. sage/libs/flint/fmpz_mod_poly_factor.pxd +46 -0
  128. sage/libs/flint/fmpz_mod_vec.pxd +27 -0
  129. sage/libs/flint/fmpz_mpoly.pxd +224 -0
  130. sage/libs/flint/fmpz_mpoly_factor.pxd +29 -0
  131. sage/libs/flint/fmpz_mpoly_q.pxd +57 -0
  132. sage/libs/flint/fmpz_poly.cpython-311-aarch64-linux-gnu.so +0 -0
  133. sage/libs/flint/fmpz_poly.pxd +407 -0
  134. sage/libs/flint/fmpz_poly.pyx +19 -0
  135. sage/libs/flint/fmpz_poly_factor.pxd +33 -0
  136. sage/libs/flint/fmpz_poly_macros.pxd +8 -0
  137. sage/libs/flint/fmpz_poly_mat.pxd +71 -0
  138. sage/libs/flint/fmpz_poly_q.pxd +55 -0
  139. sage/libs/flint/fmpz_poly_sage.cpython-311-aarch64-linux-gnu.so +0 -0
  140. sage/libs/flint/fmpz_poly_sage.pxd +20 -0
  141. sage/libs/flint/fmpz_poly_sage.pyx +500 -0
  142. sage/libs/flint/fmpz_vec.pxd +80 -0
  143. sage/libs/flint/fmpzi.pxd +52 -0
  144. sage/libs/flint/fq.pxd +97 -0
  145. sage/libs/flint/fq_default.pxd +84 -0
  146. sage/libs/flint/fq_default_mat.pxd +70 -0
  147. sage/libs/flint/fq_default_poly.pxd +97 -0
  148. sage/libs/flint/fq_default_poly_factor.pxd +39 -0
  149. sage/libs/flint/fq_embed.pxd +28 -0
  150. sage/libs/flint/fq_mat.pxd +83 -0
  151. sage/libs/flint/fq_nmod.pxd +95 -0
  152. sage/libs/flint/fq_nmod_embed.pxd +28 -0
  153. sage/libs/flint/fq_nmod_mat.pxd +83 -0
  154. sage/libs/flint/fq_nmod_mpoly.pxd +130 -0
  155. sage/libs/flint/fq_nmod_mpoly_factor.pxd +28 -0
  156. sage/libs/flint/fq_nmod_poly.pxd +202 -0
  157. sage/libs/flint/fq_nmod_poly_factor.pxd +47 -0
  158. sage/libs/flint/fq_nmod_vec.pxd +33 -0
  159. sage/libs/flint/fq_poly.pxd +204 -0
  160. sage/libs/flint/fq_poly_factor.pxd +47 -0
  161. sage/libs/flint/fq_vec.pxd +33 -0
  162. sage/libs/flint/fq_zech.pxd +99 -0
  163. sage/libs/flint/fq_zech_embed.pxd +28 -0
  164. sage/libs/flint/fq_zech_mat.pxd +78 -0
  165. sage/libs/flint/fq_zech_poly.pxd +198 -0
  166. sage/libs/flint/fq_zech_poly_factor.pxd +47 -0
  167. sage/libs/flint/fq_zech_vec.pxd +33 -0
  168. sage/libs/flint/gr.pxd +174 -0
  169. sage/libs/flint/gr_generic.pxd +215 -0
  170. sage/libs/flint/gr_mat.pxd +161 -0
  171. sage/libs/flint/gr_mpoly.pxd +68 -0
  172. sage/libs/flint/gr_poly.pxd +276 -0
  173. sage/libs/flint/gr_special.pxd +237 -0
  174. sage/libs/flint/gr_vec.pxd +120 -0
  175. sage/libs/flint/hypgeom.pxd +24 -0
  176. sage/libs/flint/long_extras.pxd +23 -0
  177. sage/libs/flint/mag.pxd +131 -0
  178. sage/libs/flint/mag_macros.pxd +8 -0
  179. sage/libs/flint/mpf_mat.pxd +36 -0
  180. sage/libs/flint/mpf_vec.pxd +34 -0
  181. sage/libs/flint/mpfr_mat.pxd +27 -0
  182. sage/libs/flint/mpfr_vec.pxd +25 -0
  183. sage/libs/flint/mpn_extras.pxd +41 -0
  184. sage/libs/flint/mpoly.pxd +72 -0
  185. sage/libs/flint/nf.pxd +19 -0
  186. sage/libs/flint/nf_elem.pxd +74 -0
  187. sage/libs/flint/nmod.pxd +35 -0
  188. sage/libs/flint/nmod_mat.pxd +104 -0
  189. sage/libs/flint/nmod_mpoly.pxd +144 -0
  190. sage/libs/flint/nmod_mpoly_factor.pxd +28 -0
  191. sage/libs/flint/nmod_poly.pxd +339 -0
  192. sage/libs/flint/nmod_poly_factor.pxd +44 -0
  193. sage/libs/flint/nmod_poly_linkage.pxi +710 -0
  194. sage/libs/flint/nmod_poly_mat.pxd +76 -0
  195. sage/libs/flint/nmod_vec.pxd +40 -0
  196. sage/libs/flint/ntl_interface.pxd +17 -0
  197. sage/libs/flint/padic.pxd +93 -0
  198. sage/libs/flint/padic_mat.pxd +64 -0
  199. sage/libs/flint/padic_poly.pxd +88 -0
  200. sage/libs/flint/partitions.pxd +23 -0
  201. sage/libs/flint/perm.pxd +26 -0
  202. sage/libs/flint/profiler.pxd +24 -0
  203. sage/libs/flint/qadic.pxd +77 -0
  204. sage/libs/flint/qfb.pxd +44 -0
  205. sage/libs/flint/qqbar.pxd +172 -0
  206. sage/libs/flint/qsieve.cpython-311-aarch64-linux-gnu.so +0 -0
  207. sage/libs/flint/qsieve.pxd +41 -0
  208. sage/libs/flint/qsieve.pyx +21 -0
  209. sage/libs/flint/qsieve_sage.cpython-311-aarch64-linux-gnu.so +0 -0
  210. sage/libs/flint/qsieve_sage.pyx +67 -0
  211. sage/libs/flint/thread_pool.pxd +25 -0
  212. sage/libs/flint/types.pxd +2076 -0
  213. sage/libs/flint/ulong_extras.cpython-311-aarch64-linux-gnu.so +0 -0
  214. sage/libs/flint/ulong_extras.pxd +141 -0
  215. sage/libs/flint/ulong_extras.pyx +21 -0
  216. sage/libs/flint/ulong_extras_sage.cpython-311-aarch64-linux-gnu.so +0 -0
  217. sage/libs/flint/ulong_extras_sage.pyx +21 -0
  218. sage/matrix/all__sagemath_flint.py +1 -0
  219. sage/matrix/change_ring.cpython-311-aarch64-linux-gnu.so +0 -0
  220. sage/matrix/change_ring.pyx +43 -0
  221. sage/matrix/matrix_complex_ball_dense.cpython-311-aarch64-linux-gnu.so +0 -0
  222. sage/matrix/matrix_complex_ball_dense.pxd +14 -0
  223. sage/matrix/matrix_complex_ball_dense.pyx +973 -0
  224. sage/matrix/matrix_cyclo_dense.cpython-311-aarch64-linux-gnu.so +0 -0
  225. sage/matrix/matrix_cyclo_dense.pxd +16 -0
  226. sage/matrix/matrix_cyclo_dense.pyx +1761 -0
  227. sage/matrix/matrix_integer_dense.cpython-311-aarch64-linux-gnu.so +0 -0
  228. sage/matrix/matrix_integer_dense.pxd +32 -0
  229. sage/matrix/matrix_integer_dense.pyx +5801 -0
  230. sage/matrix/matrix_integer_dense_hnf.py +1294 -0
  231. sage/matrix/matrix_integer_dense_saturation.py +346 -0
  232. sage/matrix/matrix_integer_sparse.cpython-311-aarch64-linux-gnu.so +0 -0
  233. sage/matrix/matrix_integer_sparse.pxd +9 -0
  234. sage/matrix/matrix_integer_sparse.pyx +1090 -0
  235. sage/matrix/matrix_rational_dense.cpython-311-aarch64-linux-gnu.so +0 -0
  236. sage/matrix/matrix_rational_dense.pxd +23 -0
  237. sage/matrix/matrix_rational_dense.pyx +2995 -0
  238. sage/matrix/matrix_rational_sparse.cpython-311-aarch64-linux-gnu.so +0 -0
  239. sage/matrix/matrix_rational_sparse.pxd +11 -0
  240. sage/matrix/matrix_rational_sparse.pyx +789 -0
  241. sage/matrix/misc_flint.cpython-311-aarch64-linux-gnu.so +0 -0
  242. sage/matrix/misc_flint.pyx +109 -0
  243. sage/modular/all__sagemath_flint.py +1 -0
  244. sage/modular/modform/all__sagemath_flint.py +1 -0
  245. sage/modular/modform/eis_series_cython.cpython-311-aarch64-linux-gnu.so +0 -0
  246. sage/modular/modform/eis_series_cython.pyx +226 -0
  247. sage/modular/modsym/all__sagemath_flint.py +1 -0
  248. sage/modular/modsym/apply.cpython-311-aarch64-linux-gnu.so +0 -0
  249. sage/modular/modsym/apply.pxd +6 -0
  250. sage/modular/modsym/apply.pyx +113 -0
  251. sage/modular/modsym/heilbronn.cpython-311-aarch64-linux-gnu.so +0 -0
  252. sage/modular/modsym/heilbronn.pyx +966 -0
  253. sage/modular/pollack_stevens/all__sagemath_flint.py +1 -0
  254. sage/modular/pollack_stevens/dist.cpython-311-aarch64-linux-gnu.so +0 -0
  255. sage/modular/pollack_stevens/dist.pxd +38 -0
  256. sage/modular/pollack_stevens/dist.pyx +1439 -0
  257. sage/quivers/algebra.py +691 -0
  258. sage/quivers/algebra_elements.cpython-311-aarch64-linux-gnu.so +0 -0
  259. sage/quivers/algebra_elements.pxd +97 -0
  260. sage/quivers/algebra_elements.pxi +1324 -0
  261. sage/quivers/algebra_elements.pyx +1424 -0
  262. sage/quivers/all.py +1 -0
  263. sage/quivers/ar_quiver.py +917 -0
  264. sage/quivers/homspace.py +640 -0
  265. sage/quivers/morphism.py +1282 -0
  266. sage/quivers/path_semigroup.py +1155 -0
  267. sage/quivers/paths.cpython-311-aarch64-linux-gnu.so +0 -0
  268. sage/quivers/paths.pxd +13 -0
  269. sage/quivers/paths.pyx +809 -0
  270. sage/quivers/representation.py +2975 -0
  271. sage/rings/all__sagemath_flint.py +37 -0
  272. sage/rings/cif.py +4 -0
  273. sage/rings/complex_arb.cpython-311-aarch64-linux-gnu.so +0 -0
  274. sage/rings/complex_arb.pxd +29 -0
  275. sage/rings/complex_arb.pyx +5176 -0
  276. sage/rings/complex_interval.cpython-311-aarch64-linux-gnu.so +0 -0
  277. sage/rings/complex_interval.pxd +30 -0
  278. sage/rings/complex_interval.pyx +2475 -0
  279. sage/rings/complex_interval_field.py +711 -0
  280. sage/rings/convert/all.py +1 -0
  281. sage/rings/convert/mpfi.cpython-311-aarch64-linux-gnu.so +0 -0
  282. sage/rings/convert/mpfi.pxd +6 -0
  283. sage/rings/convert/mpfi.pyx +576 -0
  284. sage/rings/factorint_flint.cpython-311-aarch64-linux-gnu.so +0 -0
  285. sage/rings/factorint_flint.pyx +99 -0
  286. sage/rings/fraction_field_FpT.cpython-311-aarch64-linux-gnu.so +0 -0
  287. sage/rings/fraction_field_FpT.pxd +28 -0
  288. sage/rings/fraction_field_FpT.pyx +2043 -0
  289. sage/rings/imaginary_unit.py +5 -0
  290. sage/rings/monomials.py +73 -0
  291. sage/rings/number_field/S_unit_solver.py +2870 -0
  292. sage/rings/number_field/all__sagemath_flint.py +7 -0
  293. sage/rings/number_field/bdd_height.py +664 -0
  294. sage/rings/number_field/class_group.py +762 -0
  295. sage/rings/number_field/galois_group.py +1307 -0
  296. sage/rings/number_field/homset.py +612 -0
  297. sage/rings/number_field/maps.py +687 -0
  298. sage/rings/number_field/morphism.py +272 -0
  299. sage/rings/number_field/number_field.py +12820 -0
  300. sage/rings/number_field/number_field_element.cpython-311-aarch64-linux-gnu.so +0 -0
  301. sage/rings/number_field/number_field_element.pxd +59 -0
  302. sage/rings/number_field/number_field_element.pyx +5735 -0
  303. sage/rings/number_field/number_field_element_quadratic.cpython-311-aarch64-linux-gnu.so +0 -0
  304. sage/rings/number_field/number_field_element_quadratic.pxd +34 -0
  305. sage/rings/number_field/number_field_element_quadratic.pyx +3185 -0
  306. sage/rings/number_field/number_field_ideal_rel.py +925 -0
  307. sage/rings/number_field/number_field_morphisms.cpython-311-aarch64-linux-gnu.so +0 -0
  308. sage/rings/number_field/number_field_morphisms.pyx +781 -0
  309. sage/rings/number_field/number_field_rel.py +2734 -0
  310. sage/rings/number_field/order.py +2981 -0
  311. sage/rings/number_field/order_ideal.py +804 -0
  312. sage/rings/number_field/selmer_group.py +715 -0
  313. sage/rings/number_field/small_primes_of_degree_one.py +242 -0
  314. sage/rings/number_field/splitting_field.py +606 -0
  315. sage/rings/number_field/structure.py +380 -0
  316. sage/rings/number_field/unit_group.py +721 -0
  317. sage/rings/padics/all__sagemath_flint.py +3 -0
  318. sage/rings/polynomial/all__sagemath_flint.py +1 -0
  319. sage/rings/polynomial/complex_roots.py +312 -0
  320. sage/rings/polynomial/evaluation_flint.cpython-311-aarch64-linux-gnu.so +0 -0
  321. sage/rings/polynomial/evaluation_flint.pxd +7 -0
  322. sage/rings/polynomial/evaluation_flint.pyx +68 -0
  323. sage/rings/polynomial/hilbert.cpython-311-aarch64-linux-gnu.so +0 -0
  324. sage/rings/polynomial/hilbert.pyx +602 -0
  325. sage/rings/polynomial/polynomial_complex_arb.cpython-311-aarch64-linux-gnu.so +0 -0
  326. sage/rings/polynomial/polynomial_complex_arb.pxd +7 -0
  327. sage/rings/polynomial/polynomial_complex_arb.pyx +963 -0
  328. sage/rings/polynomial/polynomial_integer_dense_flint.cpython-311-aarch64-linux-gnu.so +0 -0
  329. sage/rings/polynomial/polynomial_integer_dense_flint.pxd +13 -0
  330. sage/rings/polynomial/polynomial_integer_dense_flint.pyx +1881 -0
  331. sage/rings/polynomial/polynomial_number_field.cpython-311-aarch64-linux-gnu.so +0 -0
  332. sage/rings/polynomial/polynomial_number_field.pyx +345 -0
  333. sage/rings/polynomial/polynomial_rational_flint.cpython-311-aarch64-linux-gnu.so +0 -0
  334. sage/rings/polynomial/polynomial_rational_flint.pxd +20 -0
  335. sage/rings/polynomial/polynomial_rational_flint.pyx +2598 -0
  336. sage/rings/polynomial/polynomial_zmod_flint.cpython-311-aarch64-linux-gnu.so +0 -0
  337. sage/rings/polynomial/polynomial_zmod_flint.pxd +20 -0
  338. sage/rings/polynomial/polynomial_zmod_flint.pyx +1063 -0
  339. sage/rings/polynomial/real_roots.cpython-311-aarch64-linux-gnu.so +0 -0
  340. sage/rings/polynomial/real_roots.pxd +81 -0
  341. sage/rings/polynomial/real_roots.pyx +4704 -0
  342. sage/rings/polynomial/refine_root.cpython-311-aarch64-linux-gnu.so +0 -0
  343. sage/rings/polynomial/refine_root.pyx +142 -0
  344. sage/rings/polynomial/weil/all.py +4 -0
  345. sage/rings/polynomial/weil/power_sums.h +46 -0
  346. sage/rings/polynomial/weil/weil_polynomials.cpython-311-aarch64-linux-gnu.so +0 -0
  347. sage/rings/polynomial/weil/weil_polynomials.pyx +596 -0
  348. sage/rings/qqbar.py +9025 -0
  349. sage/rings/real_arb.cpython-311-aarch64-linux-gnu.so +0 -0
  350. sage/rings/real_arb.pxd +21 -0
  351. sage/rings/real_arb.pyx +4065 -0
  352. sage/rings/real_interval_absolute.cpython-311-aarch64-linux-gnu.so +0 -0
  353. sage/rings/real_interval_absolute.pyx +1073 -0
  354. sage/rings/real_mpfi.cpython-311-aarch64-linux-gnu.so +0 -0
  355. sage/rings/real_mpfi.pyx +5428 -0
  356. sage/schemes/all__sagemath_flint.py +1 -0
  357. sage/schemes/elliptic_curves/all__sagemath_flint.py +1 -0
  358. sage/schemes/elliptic_curves/descent_two_isogeny.cpython-311-aarch64-linux-gnu.so +0 -0
  359. sage/schemes/elliptic_curves/descent_two_isogeny.pyx +1387 -0
  360. sage/schemes/elliptic_curves/descent_two_isogeny_pari.pxd +5 -0
@@ -0,0 +1,721 @@
1
+ # sage_setup: distribution = sagemath-flint
2
+ # sage.doctest: needs sage.libs.pari
3
+ r"""
4
+ Units and `S`-unit groups of number fields
5
+
6
+ EXAMPLES::
7
+
8
+ sage: x = polygen(QQ)
9
+ sage: K.<a> = NumberField(x^4 - 8*x^2 + 36)
10
+ sage: UK = UnitGroup(K); UK
11
+ Unit group with structure C4 x Z of
12
+ Number Field in a with defining polynomial x^4 - 8*x^2 + 36
13
+
14
+ The first generator is a primitive root of unity in the field::
15
+
16
+ sage: UK.gens()
17
+ (u0, u1)
18
+ sage: UK.gens_values() # random
19
+ [-1/12*a^3 + 1/6*a, 1/24*a^3 + 1/4*a^2 - 1/12*a - 1]
20
+ sage: UK.gen(0).value()
21
+ 1/12*a^3 - 1/6*a
22
+
23
+ sage: UK.gen(0)
24
+ u0
25
+ sage: UK.gen(0) + K.one() # coerce abstract generator into number field
26
+ 1/12*a^3 - 1/6*a + 1
27
+
28
+ sage: [u.multiplicative_order() for u in UK.gens()]
29
+ [4, +Infinity]
30
+ sage: UK.rank()
31
+ 1
32
+ sage: UK.ngens()
33
+ 2
34
+
35
+ Units in the field can be converted into elements of the unit group represented
36
+ as elements of an abstract multiplicative group::
37
+
38
+ sage: UK(1)
39
+ 1
40
+ sage: UK(-1)
41
+ u0^2
42
+ sage: [UK(u) for u in (x^4 - 1).roots(K, multiplicities=False)]
43
+ [1, u0^2, u0, u0^3]
44
+
45
+ sage: UK.fundamental_units() # random
46
+ [1/24*a^3 + 1/4*a^2 - 1/12*a - 1]
47
+ sage: torsion_gen = UK.torsion_generator(); torsion_gen
48
+ u0
49
+ sage: torsion_gen.value()
50
+ 1/12*a^3 - 1/6*a
51
+ sage: UK.zeta_order()
52
+ 4
53
+ sage: UK.roots_of_unity()
54
+ [1/12*a^3 - 1/6*a, -1, -1/12*a^3 + 1/6*a, 1]
55
+
56
+ Exp and log functions provide maps between units as field elements and exponent
57
+ vectors with respect to the generators::
58
+
59
+ sage: u = UK.exp([13,10]); u # random
60
+ -41/8*a^3 - 55/4*a^2 + 41/4*a + 55
61
+ sage: UK.log(u)
62
+ (1, 10)
63
+ sage: u = UK.fundamental_units()[0]
64
+ sage: [UK.log(u^k) == (0,k) for k in range(10)]
65
+ [True, True, True, True, True, True, True, True, True, True]
66
+ sage: all(UK.log(u^k) == (0,k) for k in range(10))
67
+ True
68
+
69
+ sage: K.<a> = NumberField(x^5 - 2,'a')
70
+ sage: UK = UnitGroup(K)
71
+ sage: UK.rank()
72
+ 2
73
+ sage: UK.fundamental_units()
74
+ [a^3 + a^2 - 1, a - 1]
75
+
76
+ `S`-unit groups may be constructed, where `S` is a set of primes::
77
+
78
+ sage: K.<a> = NumberField(x^6 + 2)
79
+ sage: S = K.ideal(3).prime_factors(); S
80
+ [Fractional ideal (3, a + 1), Fractional ideal (3, a - 1)]
81
+ sage: SUK = UnitGroup(K,S=tuple(S)); SUK
82
+ S-unit group with structure C2 x Z x Z x Z x Z of
83
+ Number Field in a with defining polynomial x^6 + 2
84
+ with S = (Fractional ideal (3, a + 1), Fractional ideal (3, a - 1))
85
+ sage: SUK.primes()
86
+ (Fractional ideal (3, a + 1), Fractional ideal (3, a - 1))
87
+ sage: SUK.rank()
88
+ 4
89
+ sage: SUK.gens_values()
90
+ [-1, a^2 + 1, -a^5 - a^4 + a^2 + a + 1, a + 1, a - 1]
91
+ sage: u = 9*prod(SUK.gens_values()); u
92
+ -18*a^5 - 18*a^4 - 18*a^3 - 9*a^2 + 9*a + 27
93
+ sage: SUK.log(u)
94
+ (1, 3, 1, 7, 7)
95
+ sage: u == SUK.exp((1,3,1,7,7))
96
+ True
97
+
98
+ A relative number field example::
99
+
100
+ sage: L.<a, b> = NumberField([x^2 + x + 1, x^4 + 1])
101
+ sage: UL = L.unit_group(); UL
102
+ Unit group with structure C24 x Z x Z x Z of
103
+ Number Field in a with defining polynomial x^2 + x + 1 over its base field
104
+ sage: UL.gens_values() # random
105
+ [-b^3*a - b^3, -b^3*a + b, (-b^3 - b^2 - b)*a - b - 1, (-b^3 - 1)*a - b^2 + b - 1]
106
+ sage: UL.zeta_order()
107
+ 24
108
+ sage: UL.roots_of_unity()
109
+ [-b*a,
110
+ -b^2*a - b^2,
111
+ -b^3,
112
+ -a,
113
+ -b*a - b,
114
+ -b^2,
115
+ b^3*a,
116
+ -a - 1,
117
+ -b,
118
+ b^2*a,
119
+ b^3*a + b^3,
120
+ -1,
121
+ b*a,
122
+ b^2*a + b^2,
123
+ b^3,
124
+ a,
125
+ b*a + b,
126
+ b^2,
127
+ -b^3*a,
128
+ a + 1,
129
+ b,
130
+ -b^2*a,
131
+ -b^3*a - b^3,
132
+ 1]
133
+
134
+ A relative extension example, which worked thanks to the code review by F.W.Clarke::
135
+
136
+ sage: PQ.<X> = QQ[]
137
+ sage: F.<a, b> = NumberField([X^2 - 2, X^2 - 3])
138
+ sage: PF.<Y> = F[]
139
+ sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b)
140
+ sage: K.unit_group()
141
+ Unit group with structure C2 x Z x Z x Z x Z x Z x Z x Z of Number Field in c
142
+ with defining polynomial Y^2 + (-2*b - 3)*a - 2*b - 6 over its base field
143
+
144
+ TESTS::
145
+
146
+ sage: UK == loads(dumps(UK))
147
+ True
148
+ sage: UL == loads(dumps(UL))
149
+ True
150
+
151
+ AUTHOR:
152
+
153
+ - John Cremona
154
+ """
155
+ # ****************************************************************************
156
+ # Copyright (C) 2009 William Stein, John Cremona
157
+ #
158
+ # Distributed under the terms of the GNU General Public License (GPL)
159
+ #
160
+ # This code is distributed in the hope that it will be useful,
161
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
162
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
163
+ # General Public License for more details.
164
+ #
165
+ # The full text of the GPL is available at:
166
+ #
167
+ # https://www.gnu.org/licenses/
168
+ # ****************************************************************************
169
+
170
+ from sage.groups.abelian_gps.values import AbelianGroupWithValues_class
171
+ from sage.structure.proof.proof import get_flag
172
+ from sage.libs.pari import pari
173
+ from sage.misc.misc_c import prod
174
+ from sage.rings.integer_ring import ZZ
175
+
176
+
177
+ class UnitGroup(AbelianGroupWithValues_class):
178
+ """
179
+ The unit group or an `S`-unit group of a number field.
180
+
181
+ TESTS::
182
+
183
+ sage: x = polygen(QQ)
184
+ sage: K.<a> = NumberField(x^4 + 23)
185
+ sage: UK = K.unit_group()
186
+ sage: u = UK.an_element(); u
187
+ u0*u1
188
+ sage: u.value()
189
+ -1/4*a^3 + 7/4*a^2 - 17/4*a + 19/4
190
+
191
+ sage: x = polygen(QQ)
192
+ sage: K.<a> = NumberField(x^4 + 23)
193
+ sage: K.unit_group().gens_values() # random
194
+ [-1, 1/4*a^3 - 7/4*a^2 + 17/4*a - 19/4]
195
+
196
+ sage: x = polygen(QQ)
197
+ sage: U = NumberField(x^2 + x + 23899, 'a').unit_group(); U
198
+ Unit group with structure C2 of Number Field in a with defining polynomial x^2 + x + 23899
199
+ sage: U.ngens()
200
+ 1
201
+
202
+ sage: K.<z> = CyclotomicField(13)
203
+ sage: UK = K.unit_group()
204
+ sage: UK.ngens()
205
+ 6
206
+ sage: UK.gen(5)
207
+ u5
208
+ sage: UK.gen(5).value()
209
+ -z^7 - z
210
+
211
+ An S-unit group::
212
+
213
+ sage: SUK = UnitGroup(K,S=21); SUK
214
+ S-unit group with structure C26 x Z x Z x Z x Z x Z x Z x Z x Z x Z x Z of
215
+ Cyclotomic Field of order 13 and degree 12 with
216
+ S = (Fractional ideal (3, z^3 - z - 1),
217
+ Fractional ideal (3, z^3 + z^2 + z - 1),
218
+ Fractional ideal (3, z^3 + z^2 - 1),
219
+ Fractional ideal (3, z^3 - z^2 - z - 1),
220
+ Fractional ideal (7))
221
+ sage: SUK.rank()
222
+ 10
223
+ sage: SUK.zeta_order()
224
+ 26
225
+ sage: SUK.log(21*z)
226
+ (25, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1)
227
+ """
228
+ # This structure is not a parent in the usual sense. The
229
+ # "elements" are NumberFieldElement_absolute. Instead, they should
230
+ # derive from AbelianGroupElement and coerce into
231
+ # NumberFieldElement_absolute.
232
+
233
+ def __init__(self, number_field, proof=True, S=None):
234
+ """
235
+ Create a unit group of a number field.
236
+
237
+ INPUT:
238
+
239
+ - ``number_field`` -- a number field
240
+ - ``proof`` -- boolean (default: ``True``); proof flag
241
+ - ``S`` -- tuple of prime ideals, or an ideal, or a single
242
+ ideal or element from which an ideal can be constructed, in
243
+ which case the support is used. If ``None``, the global unit
244
+ group is constructed; otherwise, the `S`-unit group is
245
+ constructed.
246
+
247
+ The ``proof`` flag is passed to PARI via the :pari:`pari_bnf` function
248
+ which computes the unit group. See the documentation for the
249
+ ``number_field`` module.
250
+
251
+ EXAMPLES::
252
+
253
+ sage: x = polygen(QQ)
254
+ sage: K.<a> = NumberField(x^2-38)
255
+ sage: UK = K.unit_group(); UK
256
+ Unit group with structure C2 x Z of Number Field in a with defining polynomial x^2 - 38
257
+ sage: UK.gens()
258
+ (u0, u1)
259
+ sage: UK.gens_values()
260
+ [-1, -6*a + 37]
261
+
262
+ sage: K.<a> = QuadraticField(-3)
263
+ sage: UK = K.unit_group(); UK
264
+ Unit group with structure C6 of Number Field in a with defining polynomial x^2 + 3 with a = 1.732050807568878?*I
265
+ sage: UK.gens()
266
+ (u,)
267
+ sage: UK.gens_values()
268
+ [-1/2*a + 1/2]
269
+
270
+ sage: K.<z> = CyclotomicField(13)
271
+ sage: UK = K.unit_group(); UK
272
+ Unit group with structure C26 x Z x Z x Z x Z x Z of Cyclotomic Field of order 13 and degree 12
273
+ sage: UK.gens()
274
+ (u0, u1, u2, u3, u4, u5)
275
+ sage: UK.gens_values() # random
276
+ [-z^11, z^5 + z^3, z^6 + z^5, z^9 + z^7 + z^5, z^9 + z^5 + z^4 + 1, z^5 + z]
277
+ sage: SUK = UnitGroup(K,S=2); SUK
278
+ S-unit group with structure C26 x Z x Z x Z x Z x Z x Z of
279
+ Cyclotomic Field of order 13 and degree 12 with S = (Fractional ideal (2),)
280
+
281
+ TESTS:
282
+
283
+ Number fields defined by non-monic and non-integral
284
+ polynomials are supported (:issue:`252`);
285
+ the representation depends on the PARI version::
286
+
287
+ sage: K.<a> = NumberField(7/9*x^3 + 7/3*x^2 - 56*x + 123)
288
+ sage: K.unit_group()
289
+ Unit group with structure C2 x Z x Z of
290
+ Number Field in a with defining polynomial 7/9*x^3 + 7/3*x^2 - 56*x + 123
291
+ sage: UnitGroup(K, S=tuple(K.primes_above(7)))
292
+ S-unit group with structure C2 x Z x Z x Z of
293
+ Number Field in a with defining polynomial 7/9*x^3 + 7/3*x^2 - 56*x + 123
294
+ with S = (Fractional ideal (...),)
295
+ sage: K.primes_above(7)[0] in (7/225*a^2 - 7/75*a - 42/25, 28/225*a^2 + 77/75*a - 133/25)
296
+ True
297
+
298
+ Conversion from unit group to a number field and back
299
+ gives the right results (:issue:`25874`)::
300
+
301
+ sage: # needs sage.libs.linbox
302
+ sage: K = QuadraticField(-3).composite_fields(QuadraticField(2))[0]
303
+ sage: U = K.unit_group()
304
+ sage: tuple(U(K(u)) for u in U.gens()) == U.gens()
305
+ True
306
+ sage: US = K.S_unit_group(3)
307
+ sage: tuple(US(K(u)) for u in US.gens()) == US.gens()
308
+ True
309
+
310
+ Bug :issue:`36386` (pari stack overflow while expanding units)::
311
+
312
+ sage: d = 12936642
313
+ sage: K = QuadraticField(d)
314
+ sage: K.unit_group(proof=False)
315
+ Unit group with structure C2 x Z of Number Field in a with defining polynomial x^2 - 12936642 with a = 3596.754370262167?
316
+ """
317
+ proof = get_flag(proof, "number_field")
318
+ K = number_field
319
+ pK = K.pari_bnf(proof)
320
+ self.__number_field = K
321
+ self.__pari_number_field = pK
322
+
323
+ # process the parameter S:
324
+ if not S:
325
+ S = self.__S = ()
326
+ else:
327
+ if isinstance(S, list):
328
+ S = tuple(S)
329
+ if not isinstance(S, tuple):
330
+ try:
331
+ S = tuple(K.ideal(S).prime_factors())
332
+ except (NameError, TypeError, ValueError):
333
+ raise ValueError("Cannot make a set of primes from %s" % (S,))
334
+ else:
335
+ try:
336
+ S = tuple(K.ideal(P) for P in S)
337
+ except (NameError, TypeError, ValueError):
338
+ raise ValueError("Cannot make a set of primes from %s" % (S,))
339
+ if not all(P.is_prime() for P in S):
340
+ raise ValueError("Not all elements of %s are prime ideals" % (S,))
341
+ self.__S = S
342
+ self.__pS = pS = [P.pari_prime() for P in S]
343
+
344
+ # compute the fundamental units via pari:
345
+ fu = [K(u, check=False) for u in pK.bnf_get_fu()]
346
+ self.__nfu = len(fu)
347
+
348
+ # compute the additional S-unit generators:
349
+ if S:
350
+ self.__S_unit_data = pK.bnfunits(pS)
351
+ # TODO: converting the factored matrix representation of bnfunits into polynomial
352
+ # form is a *big* waste of time
353
+ su = [pK.nfbasistoalg(pK.nffactorback(z)) for z in self.__S_unit_data[0][0:len(S)]]
354
+ su = [K(u, check=False) for u in su]
355
+ else:
356
+ su = []
357
+
358
+ self.__nfu = len(fu) # number of fundamental units
359
+ self.__nsu = len(su) # number of S-units
360
+ self.__ntu = pK.bnf_get_tu()[0] # order of torsion
361
+ self.__rank = self.__nfu + self.__nsu
362
+
363
+ # Put the torsion unit first, then fundamental units then S-units
364
+ gens = [K(pK.bnf_get_tu()[1], check=False)] + fu + su
365
+
366
+ # Construct the abstract group:
367
+ gens_orders = tuple([ZZ(self.__ntu)]+[ZZ(0)]*(self.__rank))
368
+ AbelianGroupWithValues_class.__init__(self, gens_orders, 'u', gens, number_field)
369
+
370
+ def _element_constructor_(self, u):
371
+ """
372
+ Return the abstract group element corresponding to the unit u.
373
+
374
+ INPUT:
375
+
376
+ - ``u`` -- any object from which an element of the unit group's number
377
+ field `K` may be constructed; an error is raised if an element of `K`
378
+ cannot be constructed from u, or if the element constructed is not a
379
+ unit
380
+
381
+ EXAMPLES::
382
+
383
+ sage: x = polygen(QQ)
384
+ sage: K.<a> = NumberField(x^2-38)
385
+ sage: UK = UnitGroup(K)
386
+ sage: UK(1)
387
+ 1
388
+ sage: UK(-1)
389
+ u0
390
+ sage: UK.gens()
391
+ (u0, u1)
392
+ sage: UK.gens_values()
393
+ [-1, -6*a + 37]
394
+ sage: UK.ngens()
395
+ 2
396
+ sage: [UK(u) for u in UK.gens()]
397
+ [u0, u1]
398
+ sage: [UK(u).exponents() for u in UK.gens()]
399
+ [(1, 0), (0, 1)]
400
+ sage: UK(a)
401
+ Traceback (most recent call last):
402
+ ...
403
+ ValueError: a is not a unit
404
+ """
405
+ K = self.__number_field
406
+ pK = self.__pari_number_field
407
+ try:
408
+ u = K(u)
409
+ except TypeError:
410
+ raise ValueError("%s is not an element of %s" % (u,K))
411
+ if self.__S:
412
+ m = pK.bnfisunit(pari(u), self.__S_unit_data).mattranspose()
413
+ if m.ncols() == 0:
414
+ raise ValueError("%s is not an S-unit" % u)
415
+ else:
416
+ if not u.is_integral() or u.norm().abs() != 1:
417
+ raise ValueError("%s is not a unit" % u)
418
+ m = pK.bnfisunit(pari(u)).mattranspose()
419
+
420
+ # convert column matrix to a list:
421
+ m = [ZZ(m[0,i].sage()) for i in range(m.ncols())]
422
+
423
+ # NOTE: pari ordering for the units is (S-units, fundamental units, torsion unit)
424
+ m = [m[-1]] + m[self.__nsu:-1] + m[:self.__nsu]
425
+
426
+ return self.element_class(self, m)
427
+
428
+ def rank(self):
429
+ """
430
+ Return the rank of the unit group.
431
+
432
+ EXAMPLES::
433
+
434
+ sage: K.<z> = CyclotomicField(13)
435
+ sage: UnitGroup(K).rank()
436
+ 5
437
+ sage: SUK = UnitGroup(K, S=2); SUK.rank()
438
+ 6
439
+ """
440
+ return self.ngens()-1
441
+
442
+ def _repr_(self):
443
+ """
444
+ Return string representation of this unit group.
445
+
446
+ EXAMPLES::
447
+
448
+ sage: x = polygen(QQ)
449
+ sage: U = UnitGroup(NumberField(x^3 - 2, 'a'))
450
+ sage: U
451
+ Unit group with structure C2 x Z of Number Field in a with defining polynomial x^3 - 2
452
+ sage: U._repr_()
453
+ 'Unit group with structure C2 x Z of Number Field in a with defining polynomial x^3 - 2'
454
+ sage: UnitGroup(NumberField(x^3 - 2, 'a'), S=2)
455
+ S-unit group with structure C2 x Z x Z of
456
+ Number Field in a with defining polynomial x^3 - 2
457
+ with S = (Fractional ideal (a),)
458
+ """
459
+ if self.__S:
460
+ return 'S-unit group with structure %s of %s with S = %s' % (
461
+ self._group_notation(self.gens_orders()),
462
+ self.number_field(),
463
+ self.primes())
464
+ return 'Unit group with structure %s of %s' % (
465
+ self._group_notation(self.gens_orders()),
466
+ self.number_field())
467
+
468
+ def fundamental_units(self):
469
+ """
470
+ Return generators for the free part of the unit group, as a list.
471
+
472
+ EXAMPLES::
473
+
474
+ sage: x = polygen(QQ)
475
+ sage: K.<a> = NumberField(x^4 + 23)
476
+ sage: U = UnitGroup(K)
477
+ sage: U.fundamental_units() # random
478
+ [1/4*a^3 - 7/4*a^2 + 17/4*a - 19/4]
479
+ """
480
+ return self.gens_values()[1:]
481
+
482
+ def roots_of_unity(self):
483
+ """
484
+ Return all the roots of unity in this unit group, primitive or not.
485
+
486
+ EXAMPLES::
487
+
488
+ sage: x = polygen(QQ)
489
+ sage: K.<b> = NumberField(x^2 + 1)
490
+ sage: U = UnitGroup(K)
491
+ sage: zs = U.roots_of_unity(); zs
492
+ [b, -1, -b, 1]
493
+ sage: [ z**U.zeta_order() for z in zs ]
494
+ [1, 1, 1, 1]
495
+ """
496
+ z = self.gen(0).value()
497
+ n = self.__ntu
498
+ return [z**k for k in range(1, n + 1)]
499
+
500
+ def torsion_generator(self):
501
+ """
502
+ Return a generator for the torsion part of the unit group.
503
+
504
+ EXAMPLES::
505
+
506
+ sage: x = polygen(QQ)
507
+ sage: K.<a> = NumberField(x^4 - x^2 + 4)
508
+ sage: U = UnitGroup(K)
509
+ sage: U.torsion_generator()
510
+ u0
511
+ sage: U.torsion_generator().value() # random
512
+ -1/4*a^3 - 1/4*a + 1/2
513
+ """
514
+ return self.gen(0)
515
+
516
+ def zeta_order(self):
517
+ """
518
+ Return the order of the torsion part of the unit group.
519
+
520
+ EXAMPLES::
521
+
522
+ sage: x = polygen(QQ)
523
+ sage: K.<a> = NumberField(x^4 - x^2 + 4)
524
+ sage: U = UnitGroup(K)
525
+ sage: U.zeta_order()
526
+ 6
527
+ """
528
+ return self.__ntu
529
+
530
+ def zeta(self, n=2, all=False):
531
+ """
532
+ Return one, or a list of all, primitive `n`-th root of unity in this unit group.
533
+
534
+ EXAMPLES::
535
+
536
+ sage: x = polygen(QQ)
537
+ sage: K.<z> = NumberField(x^2 + 3)
538
+ sage: U = UnitGroup(K)
539
+ sage: U.zeta(1)
540
+ 1
541
+ sage: U.zeta(2)
542
+ -1
543
+ sage: U.zeta(2, all=True)
544
+ [-1]
545
+ sage: U.zeta(3)
546
+ -1/2*z - 1/2
547
+ sage: U.zeta(3, all=True)
548
+ [-1/2*z - 1/2, 1/2*z - 1/2]
549
+ sage: U.zeta(4)
550
+ Traceback (most recent call last):
551
+ ...
552
+ ValueError: n (=4) does not divide order of generator
553
+
554
+ sage: r.<x> = QQ[]
555
+ sage: K.<b> = NumberField(x^2 + 1)
556
+ sage: U = UnitGroup(K)
557
+ sage: U.zeta(4)
558
+ b
559
+ sage: U.zeta(4,all=True)
560
+ [b, -b]
561
+ sage: U.zeta(3)
562
+ Traceback (most recent call last):
563
+ ...
564
+ ValueError: n (=3) does not divide order of generator
565
+ sage: U.zeta(3, all=True)
566
+ []
567
+ """
568
+ N = self.__ntu
569
+ K = self.number_field()
570
+ n = ZZ(n)
571
+ if n <= 0:
572
+ raise ValueError("n (=%s) must be positive" % n)
573
+ if n == 1:
574
+ if all:
575
+ return [K(1)]
576
+ else:
577
+ return K(1)
578
+ elif n == 2:
579
+ if all:
580
+ return [K(-1)]
581
+ else:
582
+ return K(-1)
583
+ if n.divides(N):
584
+ z = self.torsion_generator().value() ** (N//n)
585
+ if all:
586
+ return [z**i for i in n.coprime_integers(n)]
587
+ else:
588
+ return z
589
+ else:
590
+ if all:
591
+ return []
592
+ else:
593
+ raise ValueError("n (=%s) does not divide order of generator" % n)
594
+
595
+ def number_field(self):
596
+ """
597
+ Return the number field associated with this unit group.
598
+
599
+ EXAMPLES::
600
+
601
+ sage: U = UnitGroup(QuadraticField(-23, 'w')); U
602
+ Unit group with structure C2 of
603
+ Number Field in w with defining polynomial x^2 + 23 with w = 4.795831523312720?*I
604
+ sage: U.number_field()
605
+ Number Field in w with defining polynomial x^2 + 23 with w = 4.795831523312720?*I
606
+ """
607
+ return self.__number_field
608
+
609
+ def primes(self):
610
+ """
611
+ Return the (possibly empty) list of primes associated with this S-unit group.
612
+
613
+ EXAMPLES::
614
+
615
+ sage: K.<a> = QuadraticField(-23)
616
+ sage: S = tuple(K.ideal(3).prime_factors()); S
617
+ (Fractional ideal (3, 1/2*a - 1/2), Fractional ideal (3, 1/2*a + 1/2))
618
+ sage: U = UnitGroup(K,S=tuple(S)); U
619
+ S-unit group with structure C2 x Z x Z of
620
+ Number Field in a with defining polynomial x^2 + 23 with a = 4.795831523312720?*I
621
+ with S = (Fractional ideal (3, 1/2*a - 1/2), Fractional ideal (3, 1/2*a + 1/2))
622
+ sage: U.primes() == S
623
+ True
624
+ """
625
+ return self.__S
626
+
627
+ def log(self, u):
628
+ r"""
629
+ Return the exponents of the unit `u` with respect to group generators.
630
+
631
+ INPUT:
632
+
633
+ - ``u`` -- any object from which an element of the unit group's number
634
+ field `K` may be constructed; an error is raised if an element of `K`
635
+ cannot be constructed from `u`, or if the element constructed is not a
636
+ unit
637
+
638
+ OUTPUT: list of integers giving the exponents of `u` with
639
+ respect to the unit group's basis
640
+
641
+ EXAMPLES::
642
+
643
+ sage: x = polygen(QQ)
644
+ sage: K.<z> = CyclotomicField(13)
645
+ sage: UK = UnitGroup(K)
646
+ sage: [UK.log(u) for u in UK.gens()]
647
+ [(1, 0, 0, 0, 0, 0),
648
+ (0, 1, 0, 0, 0, 0),
649
+ (0, 0, 1, 0, 0, 0),
650
+ (0, 0, 0, 1, 0, 0),
651
+ (0, 0, 0, 0, 1, 0),
652
+ (0, 0, 0, 0, 0, 1)]
653
+ sage: vec = [65,6,7,8,9,10]
654
+ sage: unit = UK.exp(vec); unit # random
655
+ -253576*z^11 + 7003*z^10 - 395532*z^9 - 35275*z^8 - 500326*z^7 - 35275*z^6
656
+ - 395532*z^5 + 7003*z^4 - 253576*z^3 - 59925*z - 59925
657
+ sage: UK.log(unit)
658
+ (13, 6, 7, 8, 9, 10)
659
+
660
+ An S-unit example::
661
+
662
+ sage: SUK = UnitGroup(K, S=2)
663
+ sage: v = (3,1,4,1,5,9,2)
664
+ sage: u = SUK.exp(v); u
665
+ 8732*z^11 - 15496*z^10 - 51840*z^9 - 68804*z^8 - 51840*z^7 - 15496*z^6
666
+ + 8732*z^5 - 34216*z^3 - 64312*z^2 - 64312*z - 34216
667
+ sage: SUK.log(u)
668
+ (3, 1, 4, 1, 5, 9, 2)
669
+ sage: SUK.log(u) == v
670
+ True
671
+ """
672
+ return self(u).exponents()
673
+
674
+ def exp(self, exponents):
675
+ r"""
676
+ Return unit with given exponents with respect to group generators.
677
+
678
+ INPUT:
679
+
680
+ - ``u`` -- any object from which an element of the unit
681
+ group's number field `K` may be constructed; an error is
682
+ raised if an element of `K` cannot be constructed from `u`, or
683
+ if the element constructed is not a unit.
684
+
685
+ OUTPUT: list of integers giving the exponents of `u` with
686
+ respect to the unit group's basis.
687
+
688
+ EXAMPLES::
689
+
690
+ sage: x = polygen(QQ)
691
+ sage: K.<z> = CyclotomicField(13)
692
+ sage: UK = UnitGroup(K)
693
+ sage: [UK.log(u) for u in UK.gens()]
694
+ [(1, 0, 0, 0, 0, 0),
695
+ (0, 1, 0, 0, 0, 0),
696
+ (0, 0, 1, 0, 0, 0),
697
+ (0, 0, 0, 1, 0, 0),
698
+ (0, 0, 0, 0, 1, 0),
699
+ (0, 0, 0, 0, 0, 1)]
700
+ sage: vec = [65,6,7,8,9,10]
701
+ sage: unit = UK.exp(vec)
702
+ sage: UK.log(unit)
703
+ (13, 6, 7, 8, 9, 10)
704
+ sage: u = UK.gens()[-1]
705
+ sage: UK.exp(UK.log(u)) == u.value()
706
+ True
707
+
708
+ An S-unit example::
709
+
710
+ sage: SUK = UnitGroup(K,S=2)
711
+ sage: v = (3,1,4,1,5,9,2)
712
+ sage: u = SUK.exp(v); u
713
+ 8732*z^11 - 15496*z^10 - 51840*z^9 - 68804*z^8 - 51840*z^7 - 15496*z^6
714
+ + 8732*z^5 - 34216*z^3 - 64312*z^2 - 64312*z - 34216
715
+ sage: SUK.log(u)
716
+ (3, 1, 4, 1, 5, 9, 2)
717
+ sage: SUK.log(u) == v
718
+ True
719
+ """
720
+ return prod((u**e for u, e in zip(self.gens_values(), exponents)),
721
+ self.number_field().one())