passagemath-flint 10.6.1rc10__cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.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 (361) hide show
  1. passagemath_flint-10.6.1rc10.dist-info/METADATA +122 -0
  2. passagemath_flint-10.6.1rc10.dist-info/RECORD +361 -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-aecb9cc5.so.21.0.0 +0 -0
  6. passagemath_flint.libs/libgf2x-a4cdec90.so.3.0.0 +0 -0
  7. passagemath_flint.libs/libgfortran-8f1e9814.so.5.0.0 +0 -0
  8. passagemath_flint.libs/libgmp-6e109695.so.10.5.0 +0 -0
  9. passagemath_flint.libs/libgsl-cda90e79.so.28.0.0 +0 -0
  10. passagemath_flint.libs/libmpfi-e3c25853.so.0.0.0 +0 -0
  11. passagemath_flint.libs/libmpfr-82690d50.so.6.2.1 +0 -0
  12. passagemath_flint.libs/libntl-74e7d9a3.so.44.0.1 +0 -0
  13. passagemath_flint.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
  14. passagemath_flint.libs/libquadmath-828275a7.so.0.0.0 +0 -0
  15. sage/all__sagemath_flint.py +29 -0
  16. sage/combinat/all__sagemath_flint.py +1 -0
  17. sage/combinat/posets/all__sagemath_flint.py +1 -0
  18. sage/combinat/posets/hasse_cython_flint.cpython-311-x86_64-linux-gnu.so +0 -0
  19. sage/combinat/posets/hasse_cython_flint.pyx +194 -0
  20. sage/data_structures/all__sagemath_flint.py +1 -0
  21. sage/data_structures/bounded_integer_sequences.cpython-311-x86_64-linux-gnu.so +0 -0
  22. sage/data_structures/bounded_integer_sequences.pxd +62 -0
  23. sage/data_structures/bounded_integer_sequences.pyx +1418 -0
  24. sage/graphs/all__sagemath_flint.py +1 -0
  25. sage/graphs/chrompoly.cpython-311-x86_64-linux-gnu.so +0 -0
  26. sage/graphs/chrompoly.pyx +555 -0
  27. sage/graphs/matchpoly.cpython-311-x86_64-linux-gnu.so +0 -0
  28. sage/graphs/matchpoly.pyx +412 -0
  29. sage/libs/all__sagemath_flint.py +17 -0
  30. sage/libs/arb/__init__.py +1 -0
  31. sage/libs/arb/acb.pxd +154 -0
  32. sage/libs/arb/acb_calc.pxd +9 -0
  33. sage/libs/arb/acb_elliptic.pxd +25 -0
  34. sage/libs/arb/acb_hypgeom.pxd +74 -0
  35. sage/libs/arb/acb_mat.pxd +62 -0
  36. sage/libs/arb/acb_modular.pxd +17 -0
  37. sage/libs/arb/acb_poly.pxd +216 -0
  38. sage/libs/arb/arb.pxd +240 -0
  39. sage/libs/arb/arb_fmpz_poly.pxd +21 -0
  40. sage/libs/arb/arb_hypgeom.pxd +83 -0
  41. sage/libs/arb/arb_wrap.h +34 -0
  42. sage/libs/arb/arf.pxd +131 -0
  43. sage/libs/arb/arith.cpython-311-x86_64-linux-gnu.so +0 -0
  44. sage/libs/arb/arith.pyx +87 -0
  45. sage/libs/arb/bernoulli.pxd +6 -0
  46. sage/libs/arb/mag.pxd +77 -0
  47. sage/libs/arb/types.pxd +37 -0
  48. sage/libs/flint/__init__.py +1 -0
  49. sage/libs/flint/acb.pxd +270 -0
  50. sage/libs/flint/acb_calc.pxd +22 -0
  51. sage/libs/flint/acb_dft.pxd +51 -0
  52. sage/libs/flint/acb_dirichlet.pxd +112 -0
  53. sage/libs/flint/acb_elliptic.pxd +42 -0
  54. sage/libs/flint/acb_hypgeom.pxd +169 -0
  55. sage/libs/flint/acb_macros.pxd +9 -0
  56. sage/libs/flint/acb_mat.pxd +136 -0
  57. sage/libs/flint/acb_mat_macros.pxd +10 -0
  58. sage/libs/flint/acb_modular.pxd +62 -0
  59. sage/libs/flint/acb_poly.pxd +251 -0
  60. sage/libs/flint/acb_poly_macros.pxd +8 -0
  61. sage/libs/flint/acb_theta.pxd +124 -0
  62. sage/libs/flint/acf.pxd +32 -0
  63. sage/libs/flint/aprcl.pxd +84 -0
  64. sage/libs/flint/arb.pxd +382 -0
  65. sage/libs/flint/arb_calc.pxd +31 -0
  66. sage/libs/flint/arb_fmpz_poly.pxd +34 -0
  67. sage/libs/flint/arb_fpwrap.pxd +215 -0
  68. sage/libs/flint/arb_hypgeom.pxd +147 -0
  69. sage/libs/flint/arb_macros.pxd +9 -0
  70. sage/libs/flint/arb_mat.pxd +140 -0
  71. sage/libs/flint/arb_mat_macros.pxd +10 -0
  72. sage/libs/flint/arb_poly.pxd +237 -0
  73. sage/libs/flint/arf.pxd +167 -0
  74. sage/libs/flint/arith.cpython-311-x86_64-linux-gnu.so +0 -0
  75. sage/libs/flint/arith.pxd +76 -0
  76. sage/libs/flint/arith.pyx +77 -0
  77. sage/libs/flint/arith_sage.cpython-311-x86_64-linux-gnu.so +0 -0
  78. sage/libs/flint/arith_sage.pyx +308 -0
  79. sage/libs/flint/bernoulli.pxd +28 -0
  80. sage/libs/flint/bool_mat.pxd +52 -0
  81. sage/libs/flint/ca.pxd +203 -0
  82. sage/libs/flint/ca_ext.pxd +34 -0
  83. sage/libs/flint/ca_field.pxd +32 -0
  84. sage/libs/flint/ca_mat.pxd +117 -0
  85. sage/libs/flint/ca_poly.pxd +104 -0
  86. sage/libs/flint/ca_vec.pxd +46 -0
  87. sage/libs/flint/calcium.pxd +27 -0
  88. sage/libs/flint/d_mat.pxd +39 -0
  89. sage/libs/flint/d_vec.pxd +32 -0
  90. sage/libs/flint/dirichlet.pxd +57 -0
  91. sage/libs/flint/dlog.pxd +53 -0
  92. sage/libs/flint/double_extras.pxd +24 -0
  93. sage/libs/flint/double_interval.pxd +36 -0
  94. sage/libs/flint/fexpr.pxd +104 -0
  95. sage/libs/flint/fexpr_builtin.pxd +20 -0
  96. sage/libs/flint/fft.pxd +66 -0
  97. sage/libs/flint/flint.pxd +36 -0
  98. sage/libs/flint/flint_ntl_wrap.h +35 -0
  99. sage/libs/flint/flint_sage.cpython-311-x86_64-linux-gnu.so +0 -0
  100. sage/libs/flint/flint_sage.pyx +163 -0
  101. sage/libs/flint/flint_wrap.h +190 -0
  102. sage/libs/flint/fmpq.pxd +137 -0
  103. sage/libs/flint/fmpq_mat.pxd +105 -0
  104. sage/libs/flint/fmpq_mat_macros.pxd +10 -0
  105. sage/libs/flint/fmpq_mpoly.pxd +165 -0
  106. sage/libs/flint/fmpq_mpoly_factor.pxd +30 -0
  107. sage/libs/flint/fmpq_poly.pxd +241 -0
  108. sage/libs/flint/fmpq_poly_macros.pxd +9 -0
  109. sage/libs/flint/fmpq_poly_sage.cpython-311-x86_64-linux-gnu.so +0 -0
  110. sage/libs/flint/fmpq_poly_sage.pxd +31 -0
  111. sage/libs/flint/fmpq_poly_sage.pyx +48 -0
  112. sage/libs/flint/fmpq_vec.pxd +27 -0
  113. sage/libs/flint/fmpz.pxd +256 -0
  114. sage/libs/flint/fmpz_extras.pxd +32 -0
  115. sage/libs/flint/fmpz_factor.pxd +42 -0
  116. sage/libs/flint/fmpz_factor_sage.cpython-311-x86_64-linux-gnu.so +0 -0
  117. sage/libs/flint/fmpz_factor_sage.pxd +4 -0
  118. sage/libs/flint/fmpz_factor_sage.pyx +29 -0
  119. sage/libs/flint/fmpz_lll.pxd +49 -0
  120. sage/libs/flint/fmpz_macros.pxd +8 -0
  121. sage/libs/flint/fmpz_mat.pxd +184 -0
  122. sage/libs/flint/fmpz_mat_macros.pxd +10 -0
  123. sage/libs/flint/fmpz_mod.pxd +46 -0
  124. sage/libs/flint/fmpz_mod_mat.pxd +71 -0
  125. sage/libs/flint/fmpz_mod_mpoly.pxd +161 -0
  126. sage/libs/flint/fmpz_mod_mpoly_factor.pxd +28 -0
  127. sage/libs/flint/fmpz_mod_poly.pxd +249 -0
  128. sage/libs/flint/fmpz_mod_poly_factor.pxd +46 -0
  129. sage/libs/flint/fmpz_mod_vec.pxd +27 -0
  130. sage/libs/flint/fmpz_mpoly.pxd +224 -0
  131. sage/libs/flint/fmpz_mpoly_factor.pxd +29 -0
  132. sage/libs/flint/fmpz_mpoly_q.pxd +57 -0
  133. sage/libs/flint/fmpz_poly.cpython-311-x86_64-linux-gnu.so +0 -0
  134. sage/libs/flint/fmpz_poly.pxd +407 -0
  135. sage/libs/flint/fmpz_poly.pyx +19 -0
  136. sage/libs/flint/fmpz_poly_factor.pxd +33 -0
  137. sage/libs/flint/fmpz_poly_macros.pxd +8 -0
  138. sage/libs/flint/fmpz_poly_mat.pxd +71 -0
  139. sage/libs/flint/fmpz_poly_q.pxd +55 -0
  140. sage/libs/flint/fmpz_poly_sage.cpython-311-x86_64-linux-gnu.so +0 -0
  141. sage/libs/flint/fmpz_poly_sage.pxd +20 -0
  142. sage/libs/flint/fmpz_poly_sage.pyx +500 -0
  143. sage/libs/flint/fmpz_vec.pxd +80 -0
  144. sage/libs/flint/fmpzi.pxd +52 -0
  145. sage/libs/flint/fq.pxd +97 -0
  146. sage/libs/flint/fq_default.pxd +84 -0
  147. sage/libs/flint/fq_default_mat.pxd +70 -0
  148. sage/libs/flint/fq_default_poly.pxd +97 -0
  149. sage/libs/flint/fq_default_poly_factor.pxd +39 -0
  150. sage/libs/flint/fq_embed.pxd +28 -0
  151. sage/libs/flint/fq_mat.pxd +83 -0
  152. sage/libs/flint/fq_nmod.pxd +95 -0
  153. sage/libs/flint/fq_nmod_embed.pxd +28 -0
  154. sage/libs/flint/fq_nmod_mat.pxd +83 -0
  155. sage/libs/flint/fq_nmod_mpoly.pxd +130 -0
  156. sage/libs/flint/fq_nmod_mpoly_factor.pxd +28 -0
  157. sage/libs/flint/fq_nmod_poly.pxd +202 -0
  158. sage/libs/flint/fq_nmod_poly_factor.pxd +47 -0
  159. sage/libs/flint/fq_nmod_vec.pxd +33 -0
  160. sage/libs/flint/fq_poly.pxd +204 -0
  161. sage/libs/flint/fq_poly_factor.pxd +47 -0
  162. sage/libs/flint/fq_vec.pxd +33 -0
  163. sage/libs/flint/fq_zech.pxd +99 -0
  164. sage/libs/flint/fq_zech_embed.pxd +28 -0
  165. sage/libs/flint/fq_zech_mat.pxd +78 -0
  166. sage/libs/flint/fq_zech_poly.pxd +198 -0
  167. sage/libs/flint/fq_zech_poly_factor.pxd +47 -0
  168. sage/libs/flint/fq_zech_vec.pxd +33 -0
  169. sage/libs/flint/gr.pxd +174 -0
  170. sage/libs/flint/gr_generic.pxd +215 -0
  171. sage/libs/flint/gr_mat.pxd +161 -0
  172. sage/libs/flint/gr_mpoly.pxd +68 -0
  173. sage/libs/flint/gr_poly.pxd +276 -0
  174. sage/libs/flint/gr_special.pxd +237 -0
  175. sage/libs/flint/gr_vec.pxd +120 -0
  176. sage/libs/flint/hypgeom.pxd +24 -0
  177. sage/libs/flint/long_extras.pxd +23 -0
  178. sage/libs/flint/mag.pxd +131 -0
  179. sage/libs/flint/mag_macros.pxd +8 -0
  180. sage/libs/flint/mpf_mat.pxd +36 -0
  181. sage/libs/flint/mpf_vec.pxd +34 -0
  182. sage/libs/flint/mpfr_mat.pxd +27 -0
  183. sage/libs/flint/mpfr_vec.pxd +25 -0
  184. sage/libs/flint/mpn_extras.pxd +41 -0
  185. sage/libs/flint/mpoly.pxd +72 -0
  186. sage/libs/flint/nf.pxd +19 -0
  187. sage/libs/flint/nf_elem.pxd +74 -0
  188. sage/libs/flint/nmod.pxd +35 -0
  189. sage/libs/flint/nmod_mat.pxd +104 -0
  190. sage/libs/flint/nmod_mpoly.pxd +144 -0
  191. sage/libs/flint/nmod_mpoly_factor.pxd +28 -0
  192. sage/libs/flint/nmod_poly.pxd +339 -0
  193. sage/libs/flint/nmod_poly_factor.pxd +44 -0
  194. sage/libs/flint/nmod_poly_linkage.pxi +710 -0
  195. sage/libs/flint/nmod_poly_mat.pxd +76 -0
  196. sage/libs/flint/nmod_vec.pxd +40 -0
  197. sage/libs/flint/ntl_interface.pxd +17 -0
  198. sage/libs/flint/padic.pxd +93 -0
  199. sage/libs/flint/padic_mat.pxd +64 -0
  200. sage/libs/flint/padic_poly.pxd +88 -0
  201. sage/libs/flint/partitions.pxd +23 -0
  202. sage/libs/flint/perm.pxd +26 -0
  203. sage/libs/flint/profiler.pxd +24 -0
  204. sage/libs/flint/qadic.pxd +77 -0
  205. sage/libs/flint/qfb.pxd +44 -0
  206. sage/libs/flint/qqbar.pxd +172 -0
  207. sage/libs/flint/qsieve.cpython-311-x86_64-linux-gnu.so +0 -0
  208. sage/libs/flint/qsieve.pxd +41 -0
  209. sage/libs/flint/qsieve.pyx +21 -0
  210. sage/libs/flint/qsieve_sage.cpython-311-x86_64-linux-gnu.so +0 -0
  211. sage/libs/flint/qsieve_sage.pyx +67 -0
  212. sage/libs/flint/thread_pool.pxd +25 -0
  213. sage/libs/flint/types.pxd +2076 -0
  214. sage/libs/flint/ulong_extras.cpython-311-x86_64-linux-gnu.so +0 -0
  215. sage/libs/flint/ulong_extras.pxd +141 -0
  216. sage/libs/flint/ulong_extras.pyx +21 -0
  217. sage/libs/flint/ulong_extras_sage.cpython-311-x86_64-linux-gnu.so +0 -0
  218. sage/libs/flint/ulong_extras_sage.pyx +21 -0
  219. sage/matrix/all__sagemath_flint.py +1 -0
  220. sage/matrix/change_ring.cpython-311-x86_64-linux-gnu.so +0 -0
  221. sage/matrix/change_ring.pyx +43 -0
  222. sage/matrix/matrix_complex_ball_dense.cpython-311-x86_64-linux-gnu.so +0 -0
  223. sage/matrix/matrix_complex_ball_dense.pxd +14 -0
  224. sage/matrix/matrix_complex_ball_dense.pyx +973 -0
  225. sage/matrix/matrix_cyclo_dense.cpython-311-x86_64-linux-gnu.so +0 -0
  226. sage/matrix/matrix_cyclo_dense.pxd +16 -0
  227. sage/matrix/matrix_cyclo_dense.pyx +1761 -0
  228. sage/matrix/matrix_integer_dense.cpython-311-x86_64-linux-gnu.so +0 -0
  229. sage/matrix/matrix_integer_dense.pxd +32 -0
  230. sage/matrix/matrix_integer_dense.pyx +5801 -0
  231. sage/matrix/matrix_integer_dense_hnf.py +1294 -0
  232. sage/matrix/matrix_integer_dense_saturation.py +346 -0
  233. sage/matrix/matrix_integer_sparse.cpython-311-x86_64-linux-gnu.so +0 -0
  234. sage/matrix/matrix_integer_sparse.pxd +9 -0
  235. sage/matrix/matrix_integer_sparse.pyx +1090 -0
  236. sage/matrix/matrix_rational_dense.cpython-311-x86_64-linux-gnu.so +0 -0
  237. sage/matrix/matrix_rational_dense.pxd +23 -0
  238. sage/matrix/matrix_rational_dense.pyx +2995 -0
  239. sage/matrix/matrix_rational_sparse.cpython-311-x86_64-linux-gnu.so +0 -0
  240. sage/matrix/matrix_rational_sparse.pxd +11 -0
  241. sage/matrix/matrix_rational_sparse.pyx +789 -0
  242. sage/matrix/misc_flint.cpython-311-x86_64-linux-gnu.so +0 -0
  243. sage/matrix/misc_flint.pyx +109 -0
  244. sage/modular/all__sagemath_flint.py +1 -0
  245. sage/modular/modform/all__sagemath_flint.py +1 -0
  246. sage/modular/modform/eis_series_cython.cpython-311-x86_64-linux-gnu.so +0 -0
  247. sage/modular/modform/eis_series_cython.pyx +226 -0
  248. sage/modular/modsym/all__sagemath_flint.py +1 -0
  249. sage/modular/modsym/apply.cpython-311-x86_64-linux-gnu.so +0 -0
  250. sage/modular/modsym/apply.pxd +6 -0
  251. sage/modular/modsym/apply.pyx +113 -0
  252. sage/modular/modsym/heilbronn.cpython-311-x86_64-linux-gnu.so +0 -0
  253. sage/modular/modsym/heilbronn.pyx +966 -0
  254. sage/modular/pollack_stevens/all__sagemath_flint.py +1 -0
  255. sage/modular/pollack_stevens/dist.cpython-311-x86_64-linux-gnu.so +0 -0
  256. sage/modular/pollack_stevens/dist.pxd +38 -0
  257. sage/modular/pollack_stevens/dist.pyx +1439 -0
  258. sage/quivers/algebra.py +691 -0
  259. sage/quivers/algebra_elements.cpython-311-x86_64-linux-gnu.so +0 -0
  260. sage/quivers/algebra_elements.pxd +97 -0
  261. sage/quivers/algebra_elements.pxi +1324 -0
  262. sage/quivers/algebra_elements.pyx +1424 -0
  263. sage/quivers/all.py +1 -0
  264. sage/quivers/ar_quiver.py +917 -0
  265. sage/quivers/homspace.py +640 -0
  266. sage/quivers/morphism.py +1282 -0
  267. sage/quivers/path_semigroup.py +1155 -0
  268. sage/quivers/paths.cpython-311-x86_64-linux-gnu.so +0 -0
  269. sage/quivers/paths.pxd +13 -0
  270. sage/quivers/paths.pyx +809 -0
  271. sage/quivers/representation.py +2975 -0
  272. sage/rings/all__sagemath_flint.py +37 -0
  273. sage/rings/cif.py +4 -0
  274. sage/rings/complex_arb.cpython-311-x86_64-linux-gnu.so +0 -0
  275. sage/rings/complex_arb.pxd +29 -0
  276. sage/rings/complex_arb.pyx +5176 -0
  277. sage/rings/complex_interval.cpython-311-x86_64-linux-gnu.so +0 -0
  278. sage/rings/complex_interval.pxd +30 -0
  279. sage/rings/complex_interval.pyx +2475 -0
  280. sage/rings/complex_interval_field.py +711 -0
  281. sage/rings/convert/all.py +1 -0
  282. sage/rings/convert/mpfi.cpython-311-x86_64-linux-gnu.so +0 -0
  283. sage/rings/convert/mpfi.pxd +6 -0
  284. sage/rings/convert/mpfi.pyx +576 -0
  285. sage/rings/factorint_flint.cpython-311-x86_64-linux-gnu.so +0 -0
  286. sage/rings/factorint_flint.pyx +99 -0
  287. sage/rings/fraction_field_FpT.cpython-311-x86_64-linux-gnu.so +0 -0
  288. sage/rings/fraction_field_FpT.pxd +28 -0
  289. sage/rings/fraction_field_FpT.pyx +2043 -0
  290. sage/rings/imaginary_unit.py +5 -0
  291. sage/rings/monomials.py +73 -0
  292. sage/rings/number_field/S_unit_solver.py +2870 -0
  293. sage/rings/number_field/all__sagemath_flint.py +7 -0
  294. sage/rings/number_field/bdd_height.py +664 -0
  295. sage/rings/number_field/class_group.py +762 -0
  296. sage/rings/number_field/galois_group.py +1307 -0
  297. sage/rings/number_field/homset.py +612 -0
  298. sage/rings/number_field/maps.py +687 -0
  299. sage/rings/number_field/morphism.py +272 -0
  300. sage/rings/number_field/number_field.py +12820 -0
  301. sage/rings/number_field/number_field_element.cpython-311-x86_64-linux-gnu.so +0 -0
  302. sage/rings/number_field/number_field_element.pxd +59 -0
  303. sage/rings/number_field/number_field_element.pyx +5735 -0
  304. sage/rings/number_field/number_field_element_quadratic.cpython-311-x86_64-linux-gnu.so +0 -0
  305. sage/rings/number_field/number_field_element_quadratic.pxd +34 -0
  306. sage/rings/number_field/number_field_element_quadratic.pyx +3185 -0
  307. sage/rings/number_field/number_field_ideal_rel.py +925 -0
  308. sage/rings/number_field/number_field_morphisms.cpython-311-x86_64-linux-gnu.so +0 -0
  309. sage/rings/number_field/number_field_morphisms.pyx +781 -0
  310. sage/rings/number_field/number_field_rel.py +2734 -0
  311. sage/rings/number_field/order.py +2981 -0
  312. sage/rings/number_field/order_ideal.py +804 -0
  313. sage/rings/number_field/selmer_group.py +715 -0
  314. sage/rings/number_field/small_primes_of_degree_one.py +242 -0
  315. sage/rings/number_field/splitting_field.py +606 -0
  316. sage/rings/number_field/structure.py +380 -0
  317. sage/rings/number_field/unit_group.py +721 -0
  318. sage/rings/padics/all__sagemath_flint.py +3 -0
  319. sage/rings/polynomial/all__sagemath_flint.py +1 -0
  320. sage/rings/polynomial/complex_roots.py +312 -0
  321. sage/rings/polynomial/evaluation_flint.cpython-311-x86_64-linux-gnu.so +0 -0
  322. sage/rings/polynomial/evaluation_flint.pxd +7 -0
  323. sage/rings/polynomial/evaluation_flint.pyx +68 -0
  324. sage/rings/polynomial/hilbert.cpython-311-x86_64-linux-gnu.so +0 -0
  325. sage/rings/polynomial/hilbert.pyx +602 -0
  326. sage/rings/polynomial/polynomial_complex_arb.cpython-311-x86_64-linux-gnu.so +0 -0
  327. sage/rings/polynomial/polynomial_complex_arb.pxd +7 -0
  328. sage/rings/polynomial/polynomial_complex_arb.pyx +963 -0
  329. sage/rings/polynomial/polynomial_integer_dense_flint.cpython-311-x86_64-linux-gnu.so +0 -0
  330. sage/rings/polynomial/polynomial_integer_dense_flint.pxd +13 -0
  331. sage/rings/polynomial/polynomial_integer_dense_flint.pyx +1881 -0
  332. sage/rings/polynomial/polynomial_number_field.cpython-311-x86_64-linux-gnu.so +0 -0
  333. sage/rings/polynomial/polynomial_number_field.pyx +345 -0
  334. sage/rings/polynomial/polynomial_rational_flint.cpython-311-x86_64-linux-gnu.so +0 -0
  335. sage/rings/polynomial/polynomial_rational_flint.pxd +20 -0
  336. sage/rings/polynomial/polynomial_rational_flint.pyx +2598 -0
  337. sage/rings/polynomial/polynomial_zmod_flint.cpython-311-x86_64-linux-gnu.so +0 -0
  338. sage/rings/polynomial/polynomial_zmod_flint.pxd +20 -0
  339. sage/rings/polynomial/polynomial_zmod_flint.pyx +1063 -0
  340. sage/rings/polynomial/real_roots.cpython-311-x86_64-linux-gnu.so +0 -0
  341. sage/rings/polynomial/real_roots.pxd +81 -0
  342. sage/rings/polynomial/real_roots.pyx +4704 -0
  343. sage/rings/polynomial/refine_root.cpython-311-x86_64-linux-gnu.so +0 -0
  344. sage/rings/polynomial/refine_root.pyx +142 -0
  345. sage/rings/polynomial/weil/all.py +4 -0
  346. sage/rings/polynomial/weil/power_sums.h +46 -0
  347. sage/rings/polynomial/weil/weil_polynomials.cpython-311-x86_64-linux-gnu.so +0 -0
  348. sage/rings/polynomial/weil/weil_polynomials.pyx +596 -0
  349. sage/rings/qqbar.py +9025 -0
  350. sage/rings/real_arb.cpython-311-x86_64-linux-gnu.so +0 -0
  351. sage/rings/real_arb.pxd +21 -0
  352. sage/rings/real_arb.pyx +4065 -0
  353. sage/rings/real_interval_absolute.cpython-311-x86_64-linux-gnu.so +0 -0
  354. sage/rings/real_interval_absolute.pyx +1073 -0
  355. sage/rings/real_mpfi.cpython-311-x86_64-linux-gnu.so +0 -0
  356. sage/rings/real_mpfi.pyx +5428 -0
  357. sage/schemes/all__sagemath_flint.py +1 -0
  358. sage/schemes/elliptic_curves/all__sagemath_flint.py +1 -0
  359. sage/schemes/elliptic_curves/descent_two_isogeny.cpython-311-x86_64-linux-gnu.so +0 -0
  360. sage/schemes/elliptic_curves/descent_two_isogeny.pyx +1387 -0
  361. sage/schemes/elliptic_curves/descent_two_isogeny_pari.pxd +5 -0
@@ -0,0 +1,7 @@
1
+ # sage_setup: distribution = sagemath-flint
2
+
3
+ from sage.rings.number_field.number_field import (NumberField, NumberFieldTower, CyclotomicField, QuadraticField,
4
+ is_fundamental_discriminant, is_real_place)
5
+ from sage.rings.number_field.number_field_element import NumberFieldElement
6
+
7
+ from sage.rings.number_field.order import EquationOrder, GaussianIntegers, EisensteinIntegers
@@ -0,0 +1,664 @@
1
+ # sage_setup: distribution = sagemath-flint
2
+ # sage.doctest: needs sage.geometry.polyhedron
3
+ r"""
4
+ Elements of bounded height in number fields
5
+
6
+ This module provides functions to list all elements of a given number field
7
+ with height less than a specified bound.
8
+
9
+ REFERENCES:
10
+
11
+ - [DK2013]_
12
+
13
+ AUTHORS:
14
+
15
+ - John Doyle, David Krumm (2013): initial version
16
+ - TJ Combs, Raghukul Raman (2018): added Doyle-Krumm algorithm-4
17
+ """
18
+ # ****************************************************************************
19
+ # Copyright (C) 2013 John Doyle and David Krumm
20
+ #
21
+ # Distributed under the terms of the GNU General Public License (GPL)
22
+ # as published by the Free Software Foundation; either version 2 of
23
+ # the License, or (at your option) any later version.
24
+ # https://www.gnu.org/licenses/
25
+ # ****************************************************************************
26
+
27
+ from copy import copy
28
+ from itertools import product
29
+ from sage.rings.real_mpfr import RealField
30
+ from sage.rings.number_field.unit_group import UnitGroup
31
+ from sage.modules.free_module_element import vector
32
+ from sage.matrix.constructor import column_matrix
33
+ from sage.rings.rational_field import QQ
34
+ from sage.rings.infinity import Infinity
35
+ from sage.rings.real_mpfr import RR
36
+ from sage.geometry.polyhedron.constructor import Polyhedron
37
+
38
+
39
+ def bdd_norm_pr_gens_iq(K, norm_list):
40
+ r"""
41
+ Compute generators for all principal ideals in an imaginary quadratic field
42
+ `K` whose norms are in ``norm_list``.
43
+
44
+ The only keys for the output dictionary are integers n appearing in
45
+ ``norm_list``.
46
+
47
+ The function will only be called with `K` an imaginary quadratic field.
48
+
49
+ The function will return a dictionary for other number fields, but it may be
50
+ incorrect.
51
+
52
+ INPUT:
53
+
54
+ - ``K`` -- an imaginary quadratic number field
55
+
56
+ - ``norm_list`` -- list of positive integers
57
+
58
+ OUTPUT: dictionary of number field elements, keyed by norm
59
+
60
+ EXAMPLES:
61
+
62
+ In `QQ(i)`, there is one principal ideal of norm 4, two principal ideals of
63
+ norm 5, but no principal ideals of norm 7::
64
+
65
+ sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_gens_iq
66
+ sage: x = polygen(ZZ, 'x')
67
+ sage: K.<g> = NumberField(x^2 + 1)
68
+ sage: L = range(10)
69
+ sage: bdd_pr_ideals = bdd_norm_pr_gens_iq(K, L)
70
+ sage: bdd_pr_ideals[4]
71
+ [2]
72
+ sage: bdd_pr_ideals[5]
73
+ [-g - 2, -g + 2]
74
+ sage: bdd_pr_ideals[7]
75
+ []
76
+
77
+ There are no ideals in the ring of integers with negative norm::
78
+
79
+ sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_gens_iq
80
+ sage: K.<g> = NumberField(x^2 + 10)
81
+ sage: L = range(-5,-1)
82
+ sage: bdd_pr_ideals = bdd_norm_pr_gens_iq(K,L)
83
+ sage: bdd_pr_ideals
84
+ {-5: [], -4: [], -3: [], -2: []}
85
+
86
+ Calling a key that is not in the input ``norm_list`` raises a KeyError::
87
+
88
+ sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_gens_iq
89
+ sage: K.<g> = NumberField(x^2 + 20)
90
+ sage: L = range(100)
91
+ sage: bdd_pr_ideals = bdd_norm_pr_gens_iq(K, L)
92
+ sage: bdd_pr_ideals[100]
93
+ Traceback (most recent call last):
94
+ ...
95
+ KeyError: 100
96
+ """
97
+ return {n: K.elements_of_norm(n) for n in norm_list}
98
+
99
+
100
+ def bdd_height_iq(K, height_bound):
101
+ r"""
102
+ Compute all elements in the imaginary quadratic field `K` which have
103
+ relative multiplicative height at most ``height_bound``.
104
+
105
+ The function will only be called with `K` an imaginary quadratic field.
106
+
107
+ If called with `K` not an imaginary quadratic, the function will likely
108
+ yield incorrect output.
109
+
110
+ ALGORITHM:
111
+
112
+ This is an implementation of Algorithm 5 in [DK2013]_.
113
+
114
+ INPUT:
115
+
116
+ - ``K`` -- an imaginary quadratic number field
117
+
118
+ - ``height_bound`` -- a real number
119
+
120
+ OUTPUT: an iterator of number field elements
121
+
122
+ EXAMPLES::
123
+
124
+ sage: from sage.rings.number_field.bdd_height import bdd_height_iq
125
+ sage: x = polygen(ZZ, 'x')
126
+ sage: K.<a> = NumberField(x^2 + 191)
127
+ sage: for t in bdd_height_iq(K,8):
128
+ ....: print(exp(2*t.global_height()))
129
+ 1.00000000000000
130
+ 1.00000000000000
131
+ 1.00000000000000
132
+ 4.00000000000000
133
+ 4.00000000000000
134
+ 4.00000000000000
135
+ 4.00000000000000
136
+ 8.00000000000000
137
+ 8.00000000000000
138
+ 8.00000000000000
139
+ 8.00000000000000
140
+ 8.00000000000000
141
+ 8.00000000000000
142
+ 8.00000000000000
143
+ 8.00000000000000
144
+
145
+ There are 175 elements of height at most 10 in `QQ(\sqrt(-3))`::
146
+
147
+ sage: from sage.rings.number_field.bdd_height import bdd_height_iq
148
+ sage: K.<a> = NumberField(x^2 + 3)
149
+ sage: len(list(bdd_height_iq(K,10)))
150
+ 175
151
+
152
+ The only elements of multiplicative height 1 in a number field are 0 and
153
+ the roots of unity::
154
+
155
+ sage: from sage.rings.number_field.bdd_height import bdd_height_iq
156
+ sage: K.<a> = NumberField(x^2 + x + 1)
157
+ sage: list(bdd_height_iq(K,1))
158
+ [0, a + 1, a, -1, -a - 1, -a, 1]
159
+
160
+ A number field has no elements of multiplicative height less than 1::
161
+
162
+ sage: from sage.rings.number_field.bdd_height import bdd_height_iq
163
+ sage: K.<a> = NumberField(x^2 + 5)
164
+ sage: list(bdd_height_iq(K,0.9))
165
+ []
166
+ """
167
+ if height_bound < 1:
168
+ return
169
+ yield K(0)
170
+ roots_of_unity = K.roots_of_unity()
171
+ for zeta in roots_of_unity:
172
+ yield zeta
173
+
174
+ # Get a complete set of ideal class representatives
175
+ class_group_reps = []
176
+ class_group_rep_norms = []
177
+ for c in K.class_group():
178
+ a = c.ideal()
179
+ class_group_reps.append(a)
180
+ class_group_rep_norms.append(a.norm())
181
+ class_number = len(class_group_reps)
182
+
183
+ # Find principal ideals of bounded norm
184
+ possible_norm_set = set()
185
+ for n in range(class_number):
186
+ for m in range(1, int(height_bound + 1)):
187
+ possible_norm_set.add(m * class_group_rep_norms[n])
188
+ bdd_ideals = bdd_norm_pr_gens_iq(K, possible_norm_set)
189
+
190
+ # Distribute the principal ideals
191
+ generator_lists = []
192
+ for n in range(class_number):
193
+ this_ideal = class_group_reps[n]
194
+ this_ideal_norm = class_group_rep_norms[n]
195
+ gens = [g for i in range(1, int(height_bound + 1))
196
+ for g in bdd_ideals[i * this_ideal_norm] if g in this_ideal]
197
+ generator_lists.append(gens)
198
+
199
+ # Build all the output numbers
200
+ for n in range(class_number):
201
+ gens = generator_lists[n]
202
+ s = len(gens)
203
+ for i in range(s):
204
+ for j in range(i + 1, s):
205
+ if K.ideal(gens[i], gens[j]) == class_group_reps[n]:
206
+ new_number = gens[i] / gens[j]
207
+ for zeta in roots_of_unity:
208
+ yield zeta * new_number
209
+ yield zeta / new_number
210
+
211
+
212
+ def bdd_norm_pr_ideal_gens(K, norm_list):
213
+ r"""
214
+ Compute generators for all principal ideals in a number field `K` whose
215
+ norms are in ``norm_list``.
216
+
217
+ INPUT:
218
+
219
+ - ``K`` -- a number field
220
+
221
+ - ``norm_list`` -- list of positive integers
222
+
223
+ OUTPUT: dictionary of number field elements, keyed by norm
224
+
225
+ EXAMPLES:
226
+
227
+ There is only one principal ideal of norm 1, and it is generated by the
228
+ element 1::
229
+
230
+ sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_ideal_gens
231
+ sage: K.<g> = QuadraticField(101)
232
+ sage: bdd_norm_pr_ideal_gens(K, [1])
233
+ {1: [1]}
234
+
235
+ ::
236
+
237
+ sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_ideal_gens
238
+ sage: K.<g> = QuadraticField(123)
239
+ sage: bdd_norm_pr_ideal_gens(K, range(5))
240
+ {0: [0], 1: [1], 2: [g + 11], 3: [], 4: [2]} # 64-bit
241
+ {0: [0], 1: [1], 2: [g - 11], 3: [], 4: [2]} # 32-bit
242
+
243
+ ::
244
+
245
+ sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_ideal_gens
246
+ sage: x = polygen(ZZ, 'x')
247
+ sage: K.<g> = NumberField(x^5 - x + 19)
248
+ sage: b = bdd_norm_pr_ideal_gens(K, range(30))
249
+ sage: key = ZZ(28)
250
+ sage: b[key]
251
+ [157*g^4 - 139*g^3 - 369*g^2 + 848*g + 158, g^4 + g^3 - g - 7]
252
+ """
253
+ negative_norm_units = K.elements_of_norm(-1)
254
+ gens = {}
255
+ if not negative_norm_units:
256
+ for n in norm_list:
257
+ if not n:
258
+ gens[n] = [K.zero()]
259
+ else:
260
+ gens[n] = K.elements_of_norm(n) + K.elements_of_norm(-n)
261
+ else:
262
+ for n in norm_list:
263
+ gens[n] = K.elements_of_norm(n)
264
+ return gens
265
+
266
+
267
+ def integer_points_in_polytope(matrix, interval_radius):
268
+ r"""
269
+ Return the set of integer points in the polytope obtained by acting on a
270
+ cube by a linear transformation.
271
+
272
+ Given an `r`-by-`r` matrix ``matrix`` and a real number ``interval_radius``,
273
+ this function finds all integer lattice points in the polytope obtained by
274
+ transforming the cube ``[-interval_radius, interval_radius]^r`` via the linear
275
+ map induced by ``matrix``.
276
+
277
+ INPUT:
278
+
279
+ - ``matrix`` -- a square matrix of real numbers
280
+
281
+ - ``interval_radius`` -- a real number
282
+
283
+ OUTPUT: list of tuples of integers
284
+
285
+ EXAMPLES:
286
+
287
+ Stretch the interval `[-1,1]` by a factor of 2 and find the integers in the
288
+ resulting interval::
289
+
290
+ sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
291
+ sage: m = matrix([2])
292
+ sage: r = 1
293
+ sage: integer_points_in_polytope(m, r)
294
+ [(-2), (-1), (0), (1), (2)]
295
+
296
+ Integer points inside a parallelogram::
297
+
298
+ sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
299
+ sage: m = matrix([[1, 2], [3, 4]])
300
+ sage: r = RealField()(1.3)
301
+ sage: integer_points_in_polytope(m, r)
302
+ [(-3, -7), (-2, -5), (-2, -4), (-1, -3), (-1, -2), (-1, -1), (0, -1),
303
+ (0, 0), (0, 1), (1, 1), (1, 2), (1, 3), (2, 4), (2, 5), (3, 7)]
304
+
305
+ Integer points inside a parallelepiped::
306
+
307
+ sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
308
+ sage: m = matrix([[1.2,3.7,0.2], [-5.3,-.43,3], [1.2,4.7,-2.1]])
309
+ sage: r = 2.2
310
+ sage: L = integer_points_in_polytope(m, r)
311
+ sage: len(L)
312
+ 4143
313
+
314
+ If ``interval_radius`` is 0, the output should include only the zero tuple::
315
+
316
+ sage: from sage.rings.number_field.bdd_height import integer_points_in_polytope
317
+ sage: m = matrix([[1,2,3,7], [4,5,6,2], [7,8,9,3], [0,3,4,5]])
318
+ sage: integer_points_in_polytope(m, 0)
319
+ [(0, 0, 0, 0)]
320
+ """
321
+ T = matrix
322
+ d = interval_radius
323
+ r = T.nrows()
324
+
325
+ # Find the vertices of the given box
326
+ box_vertices = [vector(x) for x in product([-d, d], repeat=r)]
327
+
328
+ # Transform the vertices
329
+ T_trans = T.transpose()
330
+ transformed_vertices = [v * T_trans for v in box_vertices]
331
+
332
+ # Create polyhedron from transformed vertices and find integer points inside
333
+ return list(Polyhedron(transformed_vertices, base_ring=QQ).integral_points())
334
+
335
+
336
+ def bdd_height(K, height_bound, tolerance=1e-2, precision=53):
337
+ r"""
338
+ Compute all elements in the number field `K` which have relative
339
+ multiplicative height at most ``height_bound``.
340
+
341
+ The function can only be called for number fields `K` with positive unit
342
+ rank. An error will occur if `K` is `\QQ` or an imaginary quadratic field.
343
+
344
+ This algorithm computes 2 lists: `L`, containing elements `x` in `K` such that
345
+ `H_k(x) \leq B`, and a list `L'` containing elements `x` in `K` that, due to
346
+ floating point issues,
347
+ may be slightly larger then the bound. This can be controlled
348
+ by lowering the tolerance.
349
+
350
+ In current implementation both lists `(L,L')` are merged and returned in
351
+ form of iterator.
352
+
353
+ ALGORITHM:
354
+
355
+ This is an implementation of the revised algorithm (Algorithm 4) in
356
+ [DK2013]_.
357
+
358
+ INPUT:
359
+
360
+ - ``height_bound`` -- real number
361
+
362
+ - ``tolerance`` -- (default: 0.01) a rational number in (0,1]
363
+
364
+ - ``precision`` -- (default: 53) positive integer
365
+
366
+ OUTPUT: an iterator of number field elements
367
+
368
+ EXAMPLES:
369
+
370
+ There are no elements of negative height::
371
+
372
+ sage: from sage.rings.number_field.bdd_height import bdd_height
373
+ sage: x = polygen(ZZ, 'x')
374
+ sage: K.<g> = NumberField(x^5 - x + 7)
375
+ sage: list(bdd_height(K, -3))
376
+ []
377
+
378
+ The only nonzero elements of height 1 are the roots of unity::
379
+
380
+ sage: from sage.rings.number_field.bdd_height import bdd_height
381
+ sage: K.<g> = QuadraticField(3)
382
+ sage: list(bdd_height(K, 1))
383
+ [0, -1, 1]
384
+
385
+ ::
386
+
387
+ sage: from sage.rings.number_field.bdd_height import bdd_height
388
+ sage: K.<g> = QuadraticField(36865)
389
+ sage: len(list(bdd_height(K, 101))) # long time (4 s)
390
+ 131
391
+
392
+ ::
393
+
394
+ sage: from sage.rings.number_field.bdd_height import bdd_height
395
+ sage: K.<g> = NumberField(x^6 + 2)
396
+ sage: len(list(bdd_height(K, 60))) # long time (5 s)
397
+ 1899
398
+
399
+ ::
400
+
401
+ sage: from sage.rings.number_field.bdd_height import bdd_height
402
+ sage: K.<g> = NumberField(x^4 - x^3 - 3*x^2 + x + 1)
403
+ sage: len(list(bdd_height(K, 10)))
404
+ 99
405
+
406
+ TESTS:
407
+
408
+ Check that :issue:`22771` is fixed::
409
+
410
+ sage: from sage.rings.number_field.bdd_height import bdd_height
411
+ sage: K.<v> = NumberField(x^3 + x + 1)
412
+ sage: len(list(bdd_height(K,3)))
413
+ 23
414
+ """
415
+ # global values, used in internal function
416
+ B = height_bound
417
+ theta = tolerance
418
+ if B < 1:
419
+ return
420
+ embeddings = K.places(prec=precision)
421
+ r1, r2 = K.signature()
422
+ r = r1 + r2 - 1
423
+ RF = RealField(precision)
424
+ lambda_gens_approx = {}
425
+ class_group_rep_norm_log_approx = []
426
+ unit_log_dict = {}
427
+
428
+ def rational_in(x, y):
429
+ r"""
430
+ Compute a rational number q, such that x<q<y using Archimedes' axiom
431
+ """
432
+ z = y - x
433
+ if z == 0:
434
+ n = 1
435
+ else:
436
+ n = RR(1/z).ceil() + 1
437
+ if RR(n*y).ceil() is n*y: # WHAT !?
438
+ m = n*y - 1
439
+ else:
440
+ m = RR(n*y).floor()
441
+ return m / n
442
+
443
+ def delta_approximation(x, delta):
444
+ r"""
445
+ Compute a rational number in range `(x-\delta, x+\delta)`
446
+ """
447
+ return rational_in(x - delta, x + delta)
448
+
449
+ def vector_delta_approximation(v, delta):
450
+ r"""
451
+ Compute a rational vector `w=(w_1, ..., w_n)`
452
+ such that `|v_i-w_i|<\delta` for all `i` in `[1, n]`
453
+ """
454
+ return [delta_approximation(vi, delta) for vi in v]
455
+
456
+ def log_map(number):
457
+ r"""
458
+ Compute the image of an element of `K` under the logarithmic map.
459
+ """
460
+ x = number
461
+ x_logs = []
462
+ for i in range(r1):
463
+ sigma = embeddings[i] # real embeddings
464
+ x_logs.append(sigma(x).abs().log())
465
+ for i in range(r1, r + 1):
466
+ tau = embeddings[i] # Complex embeddings
467
+ x_logs.append(2 * tau(x).abs().log())
468
+ return vector(x_logs)
469
+
470
+ def log_height_for_generators_approx(alpha, beta, Lambda):
471
+ r"""
472
+ Compute the rational approximation of logarithmic height function.
473
+ Return a lambda approximation h_K(alpha/beta)
474
+ """
475
+ delta = Lambda / (r + 2)
476
+ norm_log = delta_approximation(RR(K.ideal(alpha, beta).norm()).log(), delta)
477
+ log_ga = vector_delta_approximation(log_map(alpha), delta)
478
+ log_gb = vector_delta_approximation(log_map(beta), delta)
479
+ arch_sum = sum([max(log_ga[k], log_gb[k]) for k in range(r + 1)])
480
+ return (arch_sum - norm_log)
481
+
482
+ def packet_height(n, pair, u):
483
+ r"""
484
+ Compute the height of the element of `K` encoded by a given packet.
485
+ """
486
+ gens = generator_lists[n]
487
+ i = pair[0]
488
+ j = pair[1]
489
+ Log_gi = lambda_gens_approx[gens[i]]
490
+ Log_gj = lambda_gens_approx[gens[j]]
491
+ Log_u_gi = vector(Log_gi) + unit_log_dict[u]
492
+ arch_sum = sum([max(Log_u_gi[k], Log_gj[k]) for k in range(r + 1)])
493
+ return (arch_sum - class_group_rep_norm_log_approx[n])
494
+
495
+ # Step 1
496
+ # Computes ideal class representative and their rational approx norm
497
+ t = theta / (3*B)
498
+ delta_1 = t / (6*r+12)
499
+
500
+ class_group_reps = []
501
+ class_group_rep_norms = []
502
+
503
+ for c in K.class_group():
504
+ a = c.ideal()
505
+ a_norm = a.norm()
506
+ log_norm = RF(a_norm).log()
507
+ log_norm_approx = delta_approximation(log_norm, delta_1)
508
+ class_group_reps.append(a)
509
+ class_group_rep_norms.append(a_norm)
510
+ class_group_rep_norm_log_approx.append(log_norm_approx)
511
+ class_number = len(class_group_reps)
512
+
513
+ # Step 2
514
+ # Find generators for principal ideals of bounded norm
515
+ possible_norm_set = set()
516
+ for n in range(class_number):
517
+ for m in range(1, (B + 1).ceil()):
518
+ possible_norm_set.add(m * class_group_rep_norms[n])
519
+ bdd_ideals = bdd_norm_pr_ideal_gens(K, possible_norm_set)
520
+
521
+ # Stores it in form of a dictionary and gives lambda(g)_approx for key g
522
+ for norm in possible_norm_set:
523
+ gens = bdd_ideals[norm]
524
+ for g in gens:
525
+ lambda_g_approx = vector_delta_approximation(log_map(g), delta_1)
526
+ lambda_gens_approx[g] = lambda_g_approx
527
+
528
+ # Step 3
529
+ # Find a list of all generators corresponding to each ideal a_l
530
+ generator_lists = []
531
+ for l in range(class_number):
532
+ this_ideal = class_group_reps[l]
533
+ this_ideal_norm = class_group_rep_norms[l]
534
+ gens = []
535
+ for i in range(1, (B + 1).ceil()):
536
+ for g in bdd_ideals[i * this_ideal_norm]:
537
+ if g in this_ideal:
538
+ gens.append(g)
539
+ generator_lists.append(gens)
540
+
541
+ # Step 4
542
+ # Finds all relevant pair and their height
543
+ gen_height_approx_dictionary = {}
544
+ relevant_pair_lists = []
545
+
546
+ for n in range(class_number):
547
+ relevant_pairs = []
548
+ gens = generator_lists[n]
549
+ l = len(gens)
550
+ for i in range(l):
551
+ for j in range(i+1, l):
552
+ if K.ideal(gens[i], gens[j]) == class_group_reps[n]:
553
+ relevant_pairs.append([i, j])
554
+ gen_height_approx_dictionary[(n, i, j)] = log_height_for_generators_approx(gens[i], gens[j], t/6)
555
+ relevant_pair_lists.append(relevant_pairs)
556
+
557
+ # Step 5
558
+ b = rational_in(t/12 + RR(B).log(), t/4 + RR(B).log())
559
+ maximum = 0
560
+ for n in range(class_number):
561
+ for p in relevant_pair_lists[n]:
562
+ maximum = max(maximum, gen_height_approx_dictionary[(n, p[0], p[1])])
563
+ d_tilde = b + t/6 + maximum
564
+
565
+ # Step 6
566
+ # computes fundamental units and their value under log map
567
+ fund_units = UnitGroup(K).fundamental_units()
568
+ fund_unit_logs = [log_map(fund_units[i]) for i in range(r)]
569
+ S = column_matrix(fund_unit_logs).delete_rows([r])
570
+ S_inverse = S.inverse()
571
+ S_norm = S.norm(Infinity)
572
+ S_inverse_norm = S_inverse.norm(Infinity)
573
+
574
+ upper_bound = (r**2) * max(S_norm, S_inverse_norm)
575
+ m = RR(upper_bound).ceil() + 1
576
+
577
+ # Step 7
578
+ # Variables needed for rational approximation
579
+ lambda_tilde = (t/12) / (d_tilde*r*(1+m))
580
+ delta_tilde = min(lambda_tilde/((r**2)*((m**2)+m*lambda_tilde)), 1/(r**2))
581
+ M = d_tilde * (upper_bound+lambda_tilde*RR(r).sqrt())
582
+ M = RR(M).ceil()
583
+ d_tilde = RR(d_tilde)
584
+ delta_2 = min(delta_tilde, (t/6)/(r*(r+1)*M))
585
+
586
+ # Step 8, 9
587
+ # Computes relevant points in polytope
588
+ fund_unit_log_approx = [vector_delta_approximation(fund_unit_logs[i], delta_2) for i in range(r)]
589
+ S_tilde = column_matrix(fund_unit_log_approx).delete_rows([r])
590
+ S_tilde_inverse = S_tilde.inverse()
591
+ U = integer_points_in_polytope(S_tilde_inverse, d_tilde)
592
+
593
+ # Step 10
594
+ # tilde suffixed list are used for computing second list (L_primed)
595
+ yield K(0)
596
+ U0 = []
597
+ U0_tilde = []
598
+ L0 = []
599
+ L0_tilde = []
600
+
601
+ # Step 11
602
+ # Computes unit height
603
+ unit_height_dict = {}
604
+ U_copy = copy(U)
605
+ inter_bound = b - (5*t)/12
606
+
607
+ for u in U:
608
+ u_log = sum([u[j]*vector(fund_unit_log_approx[j]) for j in range(r)])
609
+ unit_log_dict[u] = u_log
610
+ u_height = sum([max(u_log[k], 0) for k in range(r + 1)])
611
+ unit_height_dict[u] = u_height
612
+ if u_height < inter_bound:
613
+ U0.append(u)
614
+ if inter_bound <= u_height < b - (t/12):
615
+ U0_tilde.append(u)
616
+ if u_height > t/12 + d_tilde:
617
+ U_copy.remove(u)
618
+ U = U_copy
619
+
620
+ relevant_tuples = set(U0 + U0_tilde)
621
+
622
+ # Step 12
623
+ # check for relevant packets
624
+ for n in range(class_number):
625
+ for pair in relevant_pair_lists[n]:
626
+ i = pair[0]
627
+ j = pair[1]
628
+ u_height_bound = b + gen_height_approx_dictionary[(n, i, j)] + t/4
629
+ for u in U:
630
+ if unit_height_dict[u] < u_height_bound:
631
+ candidate_height = packet_height(n, pair, u)
632
+ if candidate_height <= b - 7*t/12:
633
+ L0.append([n, pair, u])
634
+ relevant_tuples.add(u)
635
+ elif candidate_height < b + t/4:
636
+ L0_tilde.append([n, pair, u])
637
+ relevant_tuples.add(u)
638
+
639
+ # Step 13
640
+ # forms a dictionary of all_unit_tuples and their value
641
+ tuple_to_unit_dict = {}
642
+ for u in relevant_tuples:
643
+ unit = K.one()
644
+ for k in range(r):
645
+ unit *= fund_units[k]**u[k]
646
+ tuple_to_unit_dict[u] = unit
647
+
648
+ # Step 14
649
+ # Build all output numbers
650
+ roots_of_unity = K.roots_of_unity()
651
+ for u in U0 + U0_tilde:
652
+ for zeta in roots_of_unity:
653
+ yield zeta * tuple_to_unit_dict[u]
654
+
655
+ # Step 15
656
+ for p in L0 + L0_tilde:
657
+ gens = generator_lists[p[0]]
658
+ i = p[1][0]
659
+ j = p[1][1]
660
+ u = p[2]
661
+ c_p = tuple_to_unit_dict[u] * (gens[i] / gens[j])
662
+ for zeta in roots_of_unity:
663
+ yield zeta * c_p
664
+ yield zeta / c_p