passagemath-modules 10.6.31rc3__cp314-cp314-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.

Potentially problematic release.


This version of passagemath-modules might be problematic. Click here for more details.

Files changed (806) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +806 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  6. passagemath_modules.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  7. passagemath_modules.libs/libgsl-e3525837.so.28.0.0 +0 -0
  8. passagemath_modules.libs/libmpc-c5c421e1.so.3.3.1 +0 -0
  9. passagemath_modules.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  10. passagemath_modules.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  11. sage/algebras/all__sagemath_modules.py +20 -0
  12. sage/algebras/catalog.py +148 -0
  13. sage/algebras/clifford_algebra.py +3107 -0
  14. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  15. sage/algebras/clifford_algebra_element.pxd +16 -0
  16. sage/algebras/clifford_algebra_element.pyx +997 -0
  17. sage/algebras/commutative_dga.py +4252 -0
  18. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-gnu.so +0 -0
  19. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  20. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  21. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  22. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  28. sage/algebras/finite_gca.py +528 -0
  29. sage/algebras/group_algebra.py +232 -0
  30. sage/algebras/lie_algebras/abelian.py +197 -0
  31. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  32. sage/algebras/lie_algebras/all.py +25 -0
  33. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  34. sage/algebras/lie_algebras/bch.py +177 -0
  35. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  36. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  37. sage/algebras/lie_algebras/center_uea.py +767 -0
  38. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  39. sage/algebras/lie_algebras/examples.py +683 -0
  40. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  41. sage/algebras/lie_algebras/heisenberg.py +820 -0
  42. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  43. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  46. sage/algebras/lie_algebras/morphism.py +661 -0
  47. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  48. sage/algebras/lie_algebras/onsager.py +1324 -0
  49. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  50. sage/algebras/lie_algebras/quotient.py +462 -0
  51. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  52. sage/algebras/lie_algebras/representation.py +1040 -0
  53. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  54. sage/algebras/lie_algebras/subalgebra.py +967 -0
  55. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  56. sage/algebras/lie_algebras/verma_module.py +1630 -0
  57. sage/algebras/lie_algebras/virasoro.py +1186 -0
  58. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-gnu.so +0 -0
  59. sage/algebras/octonion_algebra.pxd +20 -0
  60. sage/algebras/octonion_algebra.pyx +987 -0
  61. sage/algebras/orlik_solomon.py +907 -0
  62. sage/algebras/orlik_terao.py +779 -0
  63. sage/algebras/steenrod/all.py +7 -0
  64. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  65. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  66. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  67. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  68. sage/algebras/weyl_algebra.py +1126 -0
  69. sage/all__sagemath_modules.py +62 -0
  70. sage/calculus/all__sagemath_modules.py +19 -0
  71. sage/calculus/expr.py +205 -0
  72. sage/calculus/integration.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/calculus/integration.pyx +698 -0
  74. sage/calculus/interpolation.cpython-314-aarch64-linux-gnu.so +0 -0
  75. sage/calculus/interpolation.pxd +13 -0
  76. sage/calculus/interpolation.pyx +387 -0
  77. sage/calculus/interpolators.cpython-314-aarch64-linux-gnu.so +0 -0
  78. sage/calculus/interpolators.pyx +326 -0
  79. sage/calculus/ode.cpython-314-aarch64-linux-gnu.so +0 -0
  80. sage/calculus/ode.pxd +5 -0
  81. sage/calculus/ode.pyx +610 -0
  82. sage/calculus/riemann.cpython-314-aarch64-linux-gnu.so +0 -0
  83. sage/calculus/riemann.pyx +1521 -0
  84. sage/calculus/test_sympy.py +201 -0
  85. sage/calculus/transforms/all.py +7 -0
  86. sage/calculus/transforms/dft.py +844 -0
  87. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-gnu.so +0 -0
  88. sage/calculus/transforms/dwt.pxd +7 -0
  89. sage/calculus/transforms/dwt.pyx +160 -0
  90. sage/calculus/transforms/fft.cpython-314-aarch64-linux-gnu.so +0 -0
  91. sage/calculus/transforms/fft.pxd +12 -0
  92. sage/calculus/transforms/fft.pyx +487 -0
  93. sage/calculus/wester.py +662 -0
  94. sage/coding/abstract_code.py +1108 -0
  95. sage/coding/ag_code.py +868 -0
  96. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/coding/ag_code_decoders.pyx +2639 -0
  98. sage/coding/all.py +15 -0
  99. sage/coding/bch_code.py +494 -0
  100. sage/coding/binary_code.cpython-314-aarch64-linux-gnu.so +0 -0
  101. sage/coding/binary_code.pxd +124 -0
  102. sage/coding/binary_code.pyx +4139 -0
  103. sage/coding/bounds_catalog.py +43 -0
  104. sage/coding/channel.py +819 -0
  105. sage/coding/channels_catalog.py +29 -0
  106. sage/coding/code_bounds.py +755 -0
  107. sage/coding/code_constructions.py +804 -0
  108. sage/coding/codes_catalog.py +111 -0
  109. sage/coding/cyclic_code.py +1329 -0
  110. sage/coding/databases.py +316 -0
  111. sage/coding/decoder.py +373 -0
  112. sage/coding/decoders_catalog.py +88 -0
  113. sage/coding/delsarte_bounds.py +709 -0
  114. sage/coding/encoder.py +390 -0
  115. sage/coding/encoders_catalog.py +64 -0
  116. sage/coding/extended_code.py +468 -0
  117. sage/coding/gabidulin_code.py +1058 -0
  118. sage/coding/golay_code.py +404 -0
  119. sage/coding/goppa_code.py +441 -0
  120. sage/coding/grs_code.py +2371 -0
  121. sage/coding/guava.py +107 -0
  122. sage/coding/guruswami_sudan/all.py +1 -0
  123. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  124. sage/coding/guruswami_sudan/interpolation.py +409 -0
  125. sage/coding/guruswami_sudan/utils.py +176 -0
  126. sage/coding/hamming_code.py +176 -0
  127. sage/coding/information_set_decoder.py +1032 -0
  128. sage/coding/kasami_codes.cpython-314-aarch64-linux-gnu.so +0 -0
  129. sage/coding/kasami_codes.pyx +351 -0
  130. sage/coding/linear_code.py +3067 -0
  131. sage/coding/linear_code_no_metric.py +1354 -0
  132. sage/coding/linear_rank_metric.py +961 -0
  133. sage/coding/parity_check_code.py +353 -0
  134. sage/coding/punctured_code.py +719 -0
  135. sage/coding/reed_muller_code.py +999 -0
  136. sage/coding/self_dual_codes.py +942 -0
  137. sage/coding/source_coding/all.py +2 -0
  138. sage/coding/source_coding/huffman.py +553 -0
  139. sage/coding/subfield_subcode.py +423 -0
  140. sage/coding/two_weight_db.py +399 -0
  141. sage/combinat/all__sagemath_modules.py +7 -0
  142. sage/combinat/cartesian_product.py +347 -0
  143. sage/combinat/family.py +11 -0
  144. sage/combinat/free_module.py +1977 -0
  145. sage/combinat/root_system/all.py +147 -0
  146. sage/combinat/root_system/ambient_space.py +527 -0
  147. sage/combinat/root_system/associahedron.py +471 -0
  148. sage/combinat/root_system/braid_move_calculator.py +143 -0
  149. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-gnu.so +0 -0
  150. sage/combinat/root_system/braid_orbit.pyx +144 -0
  151. sage/combinat/root_system/branching_rules.py +2301 -0
  152. sage/combinat/root_system/cartan_matrix.py +1245 -0
  153. sage/combinat/root_system/cartan_type.py +3069 -0
  154. sage/combinat/root_system/coxeter_group.py +162 -0
  155. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  156. sage/combinat/root_system/coxeter_type.py +681 -0
  157. sage/combinat/root_system/dynkin_diagram.py +900 -0
  158. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  159. sage/combinat/root_system/fundamental_group.py +795 -0
  160. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  161. sage/combinat/root_system/integrable_representations.py +1227 -0
  162. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  163. sage/combinat/root_system/pieri_factors.py +1147 -0
  164. sage/combinat/root_system/plot.py +1615 -0
  165. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  166. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  167. sage/combinat/root_system/root_space.py +487 -0
  168. sage/combinat/root_system/root_system.py +882 -0
  169. sage/combinat/root_system/type_A.py +348 -0
  170. sage/combinat/root_system/type_A_affine.py +227 -0
  171. sage/combinat/root_system/type_A_infinity.py +241 -0
  172. sage/combinat/root_system/type_B.py +347 -0
  173. sage/combinat/root_system/type_BC_affine.py +287 -0
  174. sage/combinat/root_system/type_B_affine.py +216 -0
  175. sage/combinat/root_system/type_C.py +317 -0
  176. sage/combinat/root_system/type_C_affine.py +188 -0
  177. sage/combinat/root_system/type_D.py +357 -0
  178. sage/combinat/root_system/type_D_affine.py +208 -0
  179. sage/combinat/root_system/type_E.py +641 -0
  180. sage/combinat/root_system/type_E_affine.py +231 -0
  181. sage/combinat/root_system/type_F.py +387 -0
  182. sage/combinat/root_system/type_F_affine.py +137 -0
  183. sage/combinat/root_system/type_G.py +293 -0
  184. sage/combinat/root_system/type_G_affine.py +132 -0
  185. sage/combinat/root_system/type_H.py +105 -0
  186. sage/combinat/root_system/type_I.py +110 -0
  187. sage/combinat/root_system/type_Q.py +150 -0
  188. sage/combinat/root_system/type_affine.py +509 -0
  189. sage/combinat/root_system/type_dual.py +704 -0
  190. sage/combinat/root_system/type_folded.py +301 -0
  191. sage/combinat/root_system/type_marked.py +748 -0
  192. sage/combinat/root_system/type_reducible.py +601 -0
  193. sage/combinat/root_system/type_relabel.py +730 -0
  194. sage/combinat/root_system/type_super_A.py +837 -0
  195. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  196. sage/combinat/root_system/weight_space.py +639 -0
  197. sage/combinat/root_system/weyl_characters.py +2238 -0
  198. sage/crypto/__init__.py +4 -0
  199. sage/crypto/all.py +28 -0
  200. sage/crypto/block_cipher/all.py +7 -0
  201. sage/crypto/block_cipher/des.py +1065 -0
  202. sage/crypto/block_cipher/miniaes.py +2171 -0
  203. sage/crypto/block_cipher/present.py +909 -0
  204. sage/crypto/block_cipher/sdes.py +1527 -0
  205. sage/crypto/boolean_function.cpython-314-aarch64-linux-gnu.so +0 -0
  206. sage/crypto/boolean_function.pxd +10 -0
  207. sage/crypto/boolean_function.pyx +1487 -0
  208. sage/crypto/cipher.py +78 -0
  209. sage/crypto/classical.py +3668 -0
  210. sage/crypto/classical_cipher.py +569 -0
  211. sage/crypto/cryptosystem.py +387 -0
  212. sage/crypto/key_exchange/all.py +7 -0
  213. sage/crypto/key_exchange/catalog.py +24 -0
  214. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  215. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  216. sage/crypto/lattice.py +312 -0
  217. sage/crypto/lfsr.py +295 -0
  218. sage/crypto/lwe.py +840 -0
  219. sage/crypto/mq/__init__.py +4 -0
  220. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  221. sage/crypto/mq/rijndael_gf.py +2345 -0
  222. sage/crypto/mq/sbox.py +7 -0
  223. sage/crypto/mq/sr.py +3344 -0
  224. sage/crypto/public_key/all.py +5 -0
  225. sage/crypto/public_key/blum_goldwasser.py +776 -0
  226. sage/crypto/sbox.cpython-314-aarch64-linux-gnu.so +0 -0
  227. sage/crypto/sbox.pyx +2090 -0
  228. sage/crypto/sboxes.py +2090 -0
  229. sage/crypto/stream.py +390 -0
  230. sage/crypto/stream_cipher.py +297 -0
  231. sage/crypto/util.py +519 -0
  232. sage/ext/all__sagemath_modules.py +1 -0
  233. sage/ext/interpreters/__init__.py +1 -0
  234. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  235. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-gnu.so +0 -0
  236. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  237. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  238. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-gnu.so +0 -0
  239. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  240. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  241. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-gnu.so +0 -0
  242. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  243. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  244. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-gnu.so +0 -0
  245. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  246. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  247. sage/geometry/all__sagemath_modules.py +5 -0
  248. sage/geometry/toric_lattice.py +1745 -0
  249. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-gnu.so +0 -0
  250. sage/geometry/toric_lattice_element.pyx +432 -0
  251. sage/groups/abelian_gps/abelian_group.py +1925 -0
  252. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  253. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  254. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  255. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  256. sage/groups/abelian_gps/element_base.py +341 -0
  257. sage/groups/abelian_gps/values.py +488 -0
  258. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  259. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  260. sage/groups/additive_abelian/all.py +4 -0
  261. sage/groups/additive_abelian/qmodnz.py +231 -0
  262. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  263. sage/groups/affine_gps/affine_group.py +535 -0
  264. sage/groups/affine_gps/all.py +1 -0
  265. sage/groups/affine_gps/catalog.py +17 -0
  266. sage/groups/affine_gps/euclidean_group.py +246 -0
  267. sage/groups/affine_gps/group_element.py +562 -0
  268. sage/groups/all__sagemath_modules.py +12 -0
  269. sage/groups/galois_group.py +479 -0
  270. sage/groups/matrix_gps/all.py +4 -0
  271. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  272. sage/groups/matrix_gps/catalog.py +26 -0
  273. sage/groups/matrix_gps/coxeter_group.py +927 -0
  274. sage/groups/matrix_gps/finitely_generated.py +487 -0
  275. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-gnu.so +0 -0
  276. sage/groups/matrix_gps/group_element.pxd +11 -0
  277. sage/groups/matrix_gps/group_element.pyx +431 -0
  278. sage/groups/matrix_gps/linear.py +440 -0
  279. sage/groups/matrix_gps/matrix_group.py +617 -0
  280. sage/groups/matrix_gps/named_group.py +296 -0
  281. sage/groups/matrix_gps/orthogonal.py +544 -0
  282. sage/groups/matrix_gps/symplectic.py +251 -0
  283. sage/groups/matrix_gps/unitary.py +436 -0
  284. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  285. sage/groups/misc_gps/argument_groups.py +1905 -0
  286. sage/groups/misc_gps/imaginary_groups.py +479 -0
  287. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  288. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-gnu.so +0 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  292. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-gnu.so +0 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  295. sage/homology/algebraic_topological_model.py +595 -0
  296. sage/homology/all.py +2 -0
  297. sage/homology/all__sagemath_modules.py +8 -0
  298. sage/homology/chain_complex.py +2148 -0
  299. sage/homology/chain_complex_homspace.py +165 -0
  300. sage/homology/chain_complex_morphism.py +629 -0
  301. sage/homology/chain_homotopy.py +604 -0
  302. sage/homology/chains.py +653 -0
  303. sage/homology/free_resolution.py +923 -0
  304. sage/homology/graded_resolution.py +567 -0
  305. sage/homology/hochschild_complex.py +756 -0
  306. sage/homology/homology_group.py +188 -0
  307. sage/homology/homology_morphism.py +422 -0
  308. sage/homology/homology_vector_space_with_basis.py +1454 -0
  309. sage/homology/koszul_complex.py +169 -0
  310. sage/homology/matrix_utils.py +205 -0
  311. sage/libs/all__sagemath_modules.py +1 -0
  312. sage/libs/gsl/__init__.py +1 -0
  313. sage/libs/gsl/airy.pxd +56 -0
  314. sage/libs/gsl/all.pxd +66 -0
  315. sage/libs/gsl/array.cpython-314-aarch64-linux-gnu.so +0 -0
  316. sage/libs/gsl/array.pxd +5 -0
  317. sage/libs/gsl/array.pyx +102 -0
  318. sage/libs/gsl/bessel.pxd +208 -0
  319. sage/libs/gsl/blas.pxd +116 -0
  320. sage/libs/gsl/blas_types.pxd +34 -0
  321. sage/libs/gsl/block.pxd +52 -0
  322. sage/libs/gsl/chebyshev.pxd +37 -0
  323. sage/libs/gsl/clausen.pxd +12 -0
  324. sage/libs/gsl/combination.pxd +47 -0
  325. sage/libs/gsl/complex.pxd +151 -0
  326. sage/libs/gsl/coulomb.pxd +30 -0
  327. sage/libs/gsl/coupling.pxd +21 -0
  328. sage/libs/gsl/dawson.pxd +12 -0
  329. sage/libs/gsl/debye.pxd +24 -0
  330. sage/libs/gsl/dilog.pxd +14 -0
  331. sage/libs/gsl/eigen.pxd +46 -0
  332. sage/libs/gsl/elementary.pxd +12 -0
  333. sage/libs/gsl/ellint.pxd +48 -0
  334. sage/libs/gsl/elljac.pxd +8 -0
  335. sage/libs/gsl/erf.pxd +32 -0
  336. sage/libs/gsl/errno.pxd +26 -0
  337. sage/libs/gsl/exp.pxd +44 -0
  338. sage/libs/gsl/expint.pxd +44 -0
  339. sage/libs/gsl/fermi_dirac.pxd +44 -0
  340. sage/libs/gsl/fft.pxd +121 -0
  341. sage/libs/gsl/fit.pxd +50 -0
  342. sage/libs/gsl/gamma.pxd +94 -0
  343. sage/libs/gsl/gegenbauer.pxd +26 -0
  344. sage/libs/gsl/histogram.pxd +176 -0
  345. sage/libs/gsl/hyperg.pxd +52 -0
  346. sage/libs/gsl/integration.pxd +69 -0
  347. sage/libs/gsl/interp.pxd +109 -0
  348. sage/libs/gsl/laguerre.pxd +24 -0
  349. sage/libs/gsl/lambert.pxd +16 -0
  350. sage/libs/gsl/legendre.pxd +90 -0
  351. sage/libs/gsl/linalg.pxd +185 -0
  352. sage/libs/gsl/log.pxd +26 -0
  353. sage/libs/gsl/math.pxd +43 -0
  354. sage/libs/gsl/matrix.pxd +143 -0
  355. sage/libs/gsl/matrix_complex.pxd +130 -0
  356. sage/libs/gsl/min.pxd +67 -0
  357. sage/libs/gsl/monte.pxd +56 -0
  358. sage/libs/gsl/ntuple.pxd +32 -0
  359. sage/libs/gsl/odeiv.pxd +70 -0
  360. sage/libs/gsl/permutation.pxd +78 -0
  361. sage/libs/gsl/poly.pxd +40 -0
  362. sage/libs/gsl/pow_int.pxd +12 -0
  363. sage/libs/gsl/psi.pxd +28 -0
  364. sage/libs/gsl/qrng.pxd +29 -0
  365. sage/libs/gsl/random.pxd +257 -0
  366. sage/libs/gsl/rng.pxd +100 -0
  367. sage/libs/gsl/roots.pxd +72 -0
  368. sage/libs/gsl/sort.pxd +36 -0
  369. sage/libs/gsl/statistics.pxd +59 -0
  370. sage/libs/gsl/sum.pxd +55 -0
  371. sage/libs/gsl/synchrotron.pxd +16 -0
  372. sage/libs/gsl/transport.pxd +24 -0
  373. sage/libs/gsl/trig.pxd +58 -0
  374. sage/libs/gsl/types.pxd +137 -0
  375. sage/libs/gsl/vector.pxd +101 -0
  376. sage/libs/gsl/vector_complex.pxd +83 -0
  377. sage/libs/gsl/wavelet.pxd +49 -0
  378. sage/libs/gsl/zeta.pxd +28 -0
  379. sage/libs/mpc/__init__.pxd +114 -0
  380. sage/libs/mpc/types.pxd +28 -0
  381. sage/libs/mpfr/__init__.pxd +299 -0
  382. sage/libs/mpfr/types.pxd +26 -0
  383. sage/libs/mpmath/__init__.py +1 -0
  384. sage/libs/mpmath/all.py +27 -0
  385. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  386. sage/libs/mpmath/utils.cpython-314-aarch64-linux-gnu.so +0 -0
  387. sage/libs/mpmath/utils.pxd +4 -0
  388. sage/libs/mpmath/utils.pyx +319 -0
  389. sage/matrix/action.cpython-314-aarch64-linux-gnu.so +0 -0
  390. sage/matrix/action.pxd +26 -0
  391. sage/matrix/action.pyx +596 -0
  392. sage/matrix/all.py +9 -0
  393. sage/matrix/args.cpython-314-aarch64-linux-gnu.so +0 -0
  394. sage/matrix/args.pxd +144 -0
  395. sage/matrix/args.pyx +1668 -0
  396. sage/matrix/benchmark.py +1258 -0
  397. sage/matrix/berlekamp_massey.py +95 -0
  398. sage/matrix/compute_J_ideal.py +926 -0
  399. sage/matrix/constructor.cpython-314-aarch64-linux-gnu.so +0 -0
  400. sage/matrix/constructor.pyx +750 -0
  401. sage/matrix/docs.py +430 -0
  402. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  403. sage/matrix/echelon_matrix.pyx +155 -0
  404. sage/matrix/matrix.pxd +2 -0
  405. sage/matrix/matrix0.cpython-314-aarch64-linux-gnu.so +0 -0
  406. sage/matrix/matrix0.pxd +68 -0
  407. sage/matrix/matrix0.pyx +6324 -0
  408. sage/matrix/matrix1.cpython-314-aarch64-linux-gnu.so +0 -0
  409. sage/matrix/matrix1.pxd +8 -0
  410. sage/matrix/matrix1.pyx +2851 -0
  411. sage/matrix/matrix2.cpython-314-aarch64-linux-gnu.so +0 -0
  412. sage/matrix/matrix2.pxd +25 -0
  413. sage/matrix/matrix2.pyx +20181 -0
  414. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-gnu.so +0 -0
  415. sage/matrix/matrix_cdv.pxd +4 -0
  416. sage/matrix/matrix_cdv.pyx +93 -0
  417. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  418. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  419. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  420. sage/matrix/matrix_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  421. sage/matrix/matrix_dense.pxd +5 -0
  422. sage/matrix/matrix_dense.pyx +343 -0
  423. sage/matrix/matrix_domain_dense.pxd +5 -0
  424. sage/matrix/matrix_domain_sparse.pxd +5 -0
  425. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  426. sage/matrix/matrix_double_dense.pxd +7 -0
  427. sage/matrix/matrix_double_dense.pyx +3906 -0
  428. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  429. sage/matrix/matrix_double_sparse.pxd +6 -0
  430. sage/matrix/matrix_double_sparse.pyx +248 -0
  431. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  432. sage/matrix/matrix_generic_dense.pxd +7 -0
  433. sage/matrix/matrix_generic_dense.pyx +354 -0
  434. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  435. sage/matrix/matrix_generic_sparse.pxd +7 -0
  436. sage/matrix/matrix_generic_sparse.pyx +461 -0
  437. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  440. sage/matrix/matrix_misc.py +313 -0
  441. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  442. sage/matrix/matrix_numpy_dense.pxd +14 -0
  443. sage/matrix/matrix_numpy_dense.pyx +450 -0
  444. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  445. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  446. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  447. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  448. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  449. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  450. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  451. sage/matrix/matrix_real_double_dense.pxd +7 -0
  452. sage/matrix/matrix_real_double_dense.pyx +122 -0
  453. sage/matrix/matrix_space.py +2848 -0
  454. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  455. sage/matrix/matrix_sparse.pxd +5 -0
  456. sage/matrix/matrix_sparse.pyx +1222 -0
  457. sage/matrix/matrix_window.cpython-314-aarch64-linux-gnu.so +0 -0
  458. sage/matrix/matrix_window.pxd +37 -0
  459. sage/matrix/matrix_window.pyx +242 -0
  460. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  461. sage/matrix/misc_mpfr.pyx +80 -0
  462. sage/matrix/operation_table.py +1182 -0
  463. sage/matrix/special.py +3666 -0
  464. sage/matrix/strassen.cpython-314-aarch64-linux-gnu.so +0 -0
  465. sage/matrix/strassen.pyx +851 -0
  466. sage/matrix/symplectic_basis.py +541 -0
  467. sage/matrix/template.pxd +6 -0
  468. sage/matrix/tests.py +71 -0
  469. sage/matroids/advanced.py +77 -0
  470. sage/matroids/all.py +13 -0
  471. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  472. sage/matroids/basis_exchange_matroid.pxd +96 -0
  473. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  474. sage/matroids/basis_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  475. sage/matroids/basis_matroid.pxd +45 -0
  476. sage/matroids/basis_matroid.pyx +1217 -0
  477. sage/matroids/catalog.py +44 -0
  478. sage/matroids/chow_ring.py +473 -0
  479. sage/matroids/chow_ring_ideal.py +849 -0
  480. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  481. sage/matroids/circuit_closures_matroid.pxd +16 -0
  482. sage/matroids/circuit_closures_matroid.pyx +559 -0
  483. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  484. sage/matroids/circuits_matroid.pxd +38 -0
  485. sage/matroids/circuits_matroid.pyx +947 -0
  486. sage/matroids/constructor.py +1086 -0
  487. sage/matroids/database_collections.py +365 -0
  488. sage/matroids/database_matroids.py +5338 -0
  489. sage/matroids/dual_matroid.py +583 -0
  490. sage/matroids/extension.cpython-314-aarch64-linux-gnu.so +0 -0
  491. sage/matroids/extension.pxd +34 -0
  492. sage/matroids/extension.pyx +519 -0
  493. sage/matroids/flats_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  494. sage/matroids/flats_matroid.pxd +28 -0
  495. sage/matroids/flats_matroid.pyx +715 -0
  496. sage/matroids/gammoid.py +600 -0
  497. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  498. sage/matroids/graphic_matroid.pxd +39 -0
  499. sage/matroids/graphic_matroid.pyx +2024 -0
  500. sage/matroids/lean_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  501. sage/matroids/lean_matrix.pxd +126 -0
  502. sage/matroids/lean_matrix.pyx +3667 -0
  503. sage/matroids/linear_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  504. sage/matroids/linear_matroid.pxd +180 -0
  505. sage/matroids/linear_matroid.pyx +6649 -0
  506. sage/matroids/matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  507. sage/matroids/matroid.pxd +243 -0
  508. sage/matroids/matroid.pyx +8759 -0
  509. sage/matroids/matroids_catalog.py +190 -0
  510. sage/matroids/matroids_plot_helpers.py +890 -0
  511. sage/matroids/minor_matroid.py +480 -0
  512. sage/matroids/minorfix.h +9 -0
  513. sage/matroids/named_matroids.py +5 -0
  514. sage/matroids/rank_matroid.py +268 -0
  515. sage/matroids/set_system.cpython-314-aarch64-linux-gnu.so +0 -0
  516. sage/matroids/set_system.pxd +38 -0
  517. sage/matroids/set_system.pyx +800 -0
  518. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  519. sage/matroids/transversal_matroid.pxd +14 -0
  520. sage/matroids/transversal_matroid.pyx +893 -0
  521. sage/matroids/union_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  522. sage/matroids/union_matroid.pxd +20 -0
  523. sage/matroids/union_matroid.pyx +331 -0
  524. sage/matroids/unpickling.cpython-314-aarch64-linux-gnu.so +0 -0
  525. sage/matroids/unpickling.pyx +843 -0
  526. sage/matroids/utilities.py +809 -0
  527. sage/misc/all__sagemath_modules.py +20 -0
  528. sage/misc/c3.cpython-314-aarch64-linux-gnu.so +0 -0
  529. sage/misc/c3.pyx +238 -0
  530. sage/misc/compat.py +87 -0
  531. sage/misc/element_with_label.py +173 -0
  532. sage/misc/func_persist.py +79 -0
  533. sage/misc/pickle_old.cpython-314-aarch64-linux-gnu.so +0 -0
  534. sage/misc/pickle_old.pyx +19 -0
  535. sage/misc/proof.py +7 -0
  536. sage/misc/replace_dot_all.py +472 -0
  537. sage/misc/sagedoc_conf.py +168 -0
  538. sage/misc/sphinxify.py +167 -0
  539. sage/misc/test_class_pickling.py +85 -0
  540. sage/modules/all.py +42 -0
  541. sage/modules/complex_double_vector.py +25 -0
  542. sage/modules/diamond_cutting.py +380 -0
  543. sage/modules/fg_pid/all.py +1 -0
  544. sage/modules/fg_pid/fgp_element.py +456 -0
  545. sage/modules/fg_pid/fgp_module.py +2091 -0
  546. sage/modules/fg_pid/fgp_morphism.py +550 -0
  547. sage/modules/filtered_vector_space.py +1271 -0
  548. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-gnu.so +0 -0
  549. sage/modules/finite_submodule_iter.pxd +27 -0
  550. sage/modules/finite_submodule_iter.pyx +452 -0
  551. sage/modules/fp_graded/all.py +1 -0
  552. sage/modules/fp_graded/element.py +346 -0
  553. sage/modules/fp_graded/free_element.py +298 -0
  554. sage/modules/fp_graded/free_homspace.py +53 -0
  555. sage/modules/fp_graded/free_module.py +1060 -0
  556. sage/modules/fp_graded/free_morphism.py +217 -0
  557. sage/modules/fp_graded/homspace.py +563 -0
  558. sage/modules/fp_graded/module.py +1340 -0
  559. sage/modules/fp_graded/morphism.py +1990 -0
  560. sage/modules/fp_graded/steenrod/all.py +1 -0
  561. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  562. sage/modules/fp_graded/steenrod/module.py +477 -0
  563. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  564. sage/modules/fp_graded/steenrod/profile.py +241 -0
  565. sage/modules/free_module.py +8447 -0
  566. sage/modules/free_module_element.cpython-314-aarch64-linux-gnu.so +0 -0
  567. sage/modules/free_module_element.pxd +22 -0
  568. sage/modules/free_module_element.pyx +5445 -0
  569. sage/modules/free_module_homspace.py +369 -0
  570. sage/modules/free_module_integer.py +896 -0
  571. sage/modules/free_module_morphism.py +823 -0
  572. sage/modules/free_module_pseudohomspace.py +352 -0
  573. sage/modules/free_module_pseudomorphism.py +578 -0
  574. sage/modules/free_quadratic_module.py +1706 -0
  575. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  576. sage/modules/matrix_morphism.py +1745 -0
  577. sage/modules/misc.py +103 -0
  578. sage/modules/module_functors.py +192 -0
  579. sage/modules/multi_filtered_vector_space.py +719 -0
  580. sage/modules/ore_module.py +2208 -0
  581. sage/modules/ore_module_element.py +178 -0
  582. sage/modules/ore_module_homspace.py +147 -0
  583. sage/modules/ore_module_morphism.py +968 -0
  584. sage/modules/quotient_module.py +699 -0
  585. sage/modules/real_double_vector.py +22 -0
  586. sage/modules/submodule.py +255 -0
  587. sage/modules/tensor_operations.py +567 -0
  588. sage/modules/torsion_quadratic_module.py +1352 -0
  589. sage/modules/tutorial_free_modules.py +248 -0
  590. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  591. sage/modules/vector_complex_double_dense.pxd +6 -0
  592. sage/modules/vector_complex_double_dense.pyx +117 -0
  593. sage/modules/vector_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  594. sage/modules/vector_double_dense.pxd +6 -0
  595. sage/modules/vector_double_dense.pyx +604 -0
  596. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  597. sage/modules/vector_integer_dense.pxd +15 -0
  598. sage/modules/vector_integer_dense.pyx +361 -0
  599. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  600. sage/modules/vector_integer_sparse.pxd +29 -0
  601. sage/modules/vector_integer_sparse.pyx +406 -0
  602. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  603. sage/modules/vector_modn_dense.pxd +12 -0
  604. sage/modules/vector_modn_dense.pyx +394 -0
  605. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  606. sage/modules/vector_modn_sparse.pxd +21 -0
  607. sage/modules/vector_modn_sparse.pyx +298 -0
  608. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  609. sage/modules/vector_numpy_dense.pxd +15 -0
  610. sage/modules/vector_numpy_dense.pyx +304 -0
  611. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  612. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  613. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  614. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  615. sage/modules/vector_rational_dense.pxd +15 -0
  616. sage/modules/vector_rational_dense.pyx +387 -0
  617. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  618. sage/modules/vector_rational_sparse.pxd +30 -0
  619. sage/modules/vector_rational_sparse.pyx +413 -0
  620. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  621. sage/modules/vector_real_double_dense.pxd +6 -0
  622. sage/modules/vector_real_double_dense.pyx +126 -0
  623. sage/modules/vector_space_homspace.py +430 -0
  624. sage/modules/vector_space_morphism.py +989 -0
  625. sage/modules/with_basis/all.py +15 -0
  626. sage/modules/with_basis/cell_module.py +494 -0
  627. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-gnu.so +0 -0
  628. sage/modules/with_basis/indexed_element.pxd +13 -0
  629. sage/modules/with_basis/indexed_element.pyx +1058 -0
  630. sage/modules/with_basis/invariant.py +1075 -0
  631. sage/modules/with_basis/morphism.py +1636 -0
  632. sage/modules/with_basis/representation.py +2939 -0
  633. sage/modules/with_basis/subquotient.py +685 -0
  634. sage/numerical/all__sagemath_modules.py +6 -0
  635. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-gnu.so +0 -0
  636. sage/numerical/gauss_legendre.pyx +381 -0
  637. sage/numerical/optimize.py +910 -0
  638. sage/probability/all.py +10 -0
  639. sage/probability/probability_distribution.cpython-314-aarch64-linux-gnu.so +0 -0
  640. sage/probability/probability_distribution.pyx +1242 -0
  641. sage/probability/random_variable.py +411 -0
  642. sage/quadratic_forms/all.py +4 -0
  643. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  644. sage/quadratic_forms/binary_qf.py +2042 -0
  645. sage/quadratic_forms/bqf_class_group.py +748 -0
  646. sage/quadratic_forms/constructions.py +93 -0
  647. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-gnu.so +0 -0
  648. sage/quadratic_forms/count_local_2.pyx +365 -0
  649. sage/quadratic_forms/extras.py +195 -0
  650. sage/quadratic_forms/quadratic_form.py +1753 -0
  651. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  652. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  653. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-gnu.so +0 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  655. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  656. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  657. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  658. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  659. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  660. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  661. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  662. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  663. sage/quadratic_forms/random_quadraticform.py +209 -0
  664. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-gnu.so +0 -0
  665. sage/quadratic_forms/ternary.pyx +1154 -0
  666. sage/quadratic_forms/ternary_qf.py +2027 -0
  667. sage/rings/all__sagemath_modules.py +28 -0
  668. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  669. sage/rings/asymptotic/misc.py +1252 -0
  670. sage/rings/cc.py +4 -0
  671. sage/rings/cfinite_sequence.py +1306 -0
  672. sage/rings/complex_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  673. sage/rings/complex_conversion.pxd +8 -0
  674. sage/rings/complex_conversion.pyx +23 -0
  675. sage/rings/complex_double.cpython-314-aarch64-linux-gnu.so +0 -0
  676. sage/rings/complex_double.pxd +21 -0
  677. sage/rings/complex_double.pyx +2654 -0
  678. sage/rings/complex_mpc.cpython-314-aarch64-linux-gnu.so +0 -0
  679. sage/rings/complex_mpc.pxd +21 -0
  680. sage/rings/complex_mpc.pyx +2576 -0
  681. sage/rings/complex_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  682. sage/rings/complex_mpfr.pxd +18 -0
  683. sage/rings/complex_mpfr.pyx +3602 -0
  684. sage/rings/derivation.py +2334 -0
  685. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  686. sage/rings/finite_rings/maps_finite_field.py +191 -0
  687. sage/rings/function_field/all__sagemath_modules.py +8 -0
  688. sage/rings/function_field/derivations.py +102 -0
  689. sage/rings/function_field/derivations_rational.py +132 -0
  690. sage/rings/function_field/differential.py +853 -0
  691. sage/rings/function_field/divisor.py +1107 -0
  692. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  693. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  694. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  695. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  696. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  697. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  698. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  699. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  700. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  701. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-gnu.so +0 -0
  702. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  703. sage/rings/invariants/all.py +4 -0
  704. sage/rings/invariants/invariant_theory.py +4597 -0
  705. sage/rings/invariants/reconstruction.py +395 -0
  706. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  707. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  708. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-gnu.so +0 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  711. sage/rings/polynomial/ore_function_element.py +952 -0
  712. sage/rings/polynomial/ore_function_field.py +1028 -0
  713. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  714. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  715. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  716. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  717. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  719. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  720. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  721. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  722. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  723. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-gnu.so +0 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  726. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-gnu.so +0 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  729. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  730. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-gnu.so +0 -0
  731. sage/rings/real_double_element_gsl.pxd +8 -0
  732. sage/rings/real_double_element_gsl.pyx +794 -0
  733. sage/rings/real_field.py +58 -0
  734. sage/rings/real_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  735. sage/rings/real_mpfr.pxd +29 -0
  736. sage/rings/real_mpfr.pyx +6122 -0
  737. sage/rings/ring_extension.cpython-314-aarch64-linux-gnu.so +0 -0
  738. sage/rings/ring_extension.pxd +42 -0
  739. sage/rings/ring_extension.pyx +2779 -0
  740. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  741. sage/rings/ring_extension_conversion.pxd +16 -0
  742. sage/rings/ring_extension_conversion.pyx +462 -0
  743. sage/rings/ring_extension_element.cpython-314-aarch64-linux-gnu.so +0 -0
  744. sage/rings/ring_extension_element.pxd +21 -0
  745. sage/rings/ring_extension_element.pyx +1635 -0
  746. sage/rings/ring_extension_homset.py +64 -0
  747. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-gnu.so +0 -0
  748. sage/rings/ring_extension_morphism.pxd +35 -0
  749. sage/rings/ring_extension_morphism.pyx +920 -0
  750. sage/schemes/all__sagemath_modules.py +1 -0
  751. sage/schemes/projective/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/coherent_sheaf.py +300 -0
  753. sage/schemes/projective/cohomology.py +510 -0
  754. sage/stats/all.py +15 -0
  755. sage/stats/basic_stats.py +489 -0
  756. sage/stats/distributions/all.py +7 -0
  757. sage/stats/distributions/catalog.py +34 -0
  758. sage/stats/distributions/dgs.h +50 -0
  759. sage/stats/distributions/dgs.pxd +111 -0
  760. sage/stats/distributions/dgs_bern.h +400 -0
  761. sage/stats/distributions/dgs_gauss.h +614 -0
  762. sage/stats/distributions/dgs_misc.h +104 -0
  763. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-gnu.so +0 -0
  764. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  766. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  767. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  768. sage/stats/hmm/all.py +15 -0
  769. sage/stats/hmm/chmm.cpython-314-aarch64-linux-gnu.so +0 -0
  770. sage/stats/hmm/chmm.pyx +1595 -0
  771. sage/stats/hmm/distributions.cpython-314-aarch64-linux-gnu.so +0 -0
  772. sage/stats/hmm/distributions.pxd +29 -0
  773. sage/stats/hmm/distributions.pyx +531 -0
  774. sage/stats/hmm/hmm.cpython-314-aarch64-linux-gnu.so +0 -0
  775. sage/stats/hmm/hmm.pxd +17 -0
  776. sage/stats/hmm/hmm.pyx +1388 -0
  777. sage/stats/hmm/util.cpython-314-aarch64-linux-gnu.so +0 -0
  778. sage/stats/hmm/util.pxd +7 -0
  779. sage/stats/hmm/util.pyx +165 -0
  780. sage/stats/intlist.cpython-314-aarch64-linux-gnu.so +0 -0
  781. sage/stats/intlist.pxd +14 -0
  782. sage/stats/intlist.pyx +588 -0
  783. sage/stats/r.py +49 -0
  784. sage/stats/time_series.cpython-314-aarch64-linux-gnu.so +0 -0
  785. sage/stats/time_series.pxd +6 -0
  786. sage/stats/time_series.pyx +2546 -0
  787. sage/tensor/all.py +2 -0
  788. sage/tensor/modules/all.py +8 -0
  789. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  790. sage/tensor/modules/comp.py +5598 -0
  791. sage/tensor/modules/ext_pow_free_module.py +824 -0
  792. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  793. sage/tensor/modules/format_utilities.py +333 -0
  794. sage/tensor/modules/free_module_alt_form.py +858 -0
  795. sage/tensor/modules/free_module_automorphism.py +1207 -0
  796. sage/tensor/modules/free_module_basis.py +1074 -0
  797. sage/tensor/modules/free_module_element.py +284 -0
  798. sage/tensor/modules/free_module_homset.py +652 -0
  799. sage/tensor/modules/free_module_linear_group.py +564 -0
  800. sage/tensor/modules/free_module_morphism.py +1581 -0
  801. sage/tensor/modules/free_module_tensor.py +3289 -0
  802. sage/tensor/modules/reflexive_module.py +386 -0
  803. sage/tensor/modules/tensor_free_module.py +780 -0
  804. sage/tensor/modules/tensor_free_submodule.py +538 -0
  805. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  806. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1131 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.rings.finite_rings
3
+ r"""
4
+ Finite Drinfeld modules
5
+
6
+ This module provides the class
7
+ :class:`sage.rings.function_fields.drinfeld_module.finite_drinfeld_module.DrinfeldModule_finite`,
8
+ which inherits
9
+ :class:`sage.rings.function_fields.drinfeld_module.drinfeld_module.DrinfeldModule`.
10
+
11
+ AUTHORS:
12
+
13
+ - Antoine Leudière (2022-04)
14
+ - Yossef Musleh (2023-02): added characteristic polynomial methods
15
+ """
16
+
17
+ # *****************************************************************************
18
+ # Copyright (C) 2022 Antoine Leudière <antoine.leudiere@inria.fr>
19
+ #
20
+ # This program is free software: you can redistribute it and/or modify
21
+ # it under the terms of the GNU General Public License as published by
22
+ # the Free Software Foundation, either version 2 of the License, or
23
+ # (at your option) any later version.
24
+ # http://www.gnu.org/licenses/
25
+ # *****************************************************************************
26
+
27
+ from sage.functions.log import logb
28
+ from sage.functions.other import ceil, sqrt
29
+ from sage.matrix.constructor import Matrix
30
+ from sage.matrix.matrix_space import MatrixSpace
31
+ from sage.matrix.special import companion_matrix
32
+ from sage.misc.misc_c import prod
33
+ from sage.modules.free_module_element import vector
34
+ from sage.rings.function_field.drinfeld_modules.drinfeld_module import DrinfeldModule
35
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
36
+
37
+
38
+ class DrinfeldModule_finite(DrinfeldModule):
39
+ r"""
40
+ This class implements finite Drinfeld `\mathbb{F}_q[T]`-modules.
41
+
42
+ A *finite Drinfeld module* is a Drinfeld module whose base field is
43
+ finite. In this case, the function field characteristic is a prime
44
+ ideal.
45
+
46
+ For general definitions and help on Drinfeld modules, see class
47
+ :class:`sage.rings.function_fields.drinfeld_module.drinfeld_module.DrinfeldModule`.
48
+
49
+ .. RUBRIC:: Construction:
50
+
51
+ The user does not ever need to directly call
52
+ ``DrinfeldModule_finite`` --- the metaclass ``DrinfeldModule`` is
53
+ responsible for instantiating ``DrinfeldModule`` or
54
+ ``DrinfeldModule_finite`` depending on the input::
55
+
56
+ sage: Fq = GF(343)
57
+ sage: A.<T> = Fq[]
58
+ sage: K.<z6> = Fq.extension(2)
59
+ sage: phi = DrinfeldModule(A, [z6, 0, 5])
60
+ sage: phi
61
+ Drinfeld module defined by T |--> 5*t^2 + z6
62
+
63
+ ::
64
+
65
+ sage: isinstance(phi, DrinfeldModule)
66
+ True
67
+ sage: from sage.rings.function_field.drinfeld_modules.finite_drinfeld_module import DrinfeldModule_finite
68
+ sage: isinstance(phi, DrinfeldModule_finite)
69
+ True
70
+
71
+ The user should never use ``DrinfeldModule_finite`` to test if a
72
+ Drinfeld module is finite, but rather the ``is_finite`` method::
73
+
74
+ sage: phi.is_finite()
75
+ True
76
+
77
+ .. RUBRIC:: Complex multiplication of rank two finite Drinfeld modules
78
+
79
+ We can handle some aspects of the theory of complex multiplication
80
+ of finite Drinfeld modules. Apart from the method
81
+ ``frobenius_endomorphism``, we only handle rank two Drinfeld
82
+ modules.
83
+
84
+ First of all, it is easy to create the Frobenius endomorphism::
85
+
86
+ sage: frobenius_endomorphism = phi.frobenius_endomorphism()
87
+ sage: frobenius_endomorphism
88
+ Endomorphism of Drinfeld module defined by T |--> 5*t^2 + z6
89
+ Defn: t^2
90
+
91
+ Its characteristic polynomial can be computed::
92
+
93
+ sage: chi = phi.frobenius_charpoly()
94
+ sage: chi
95
+ X^2 + (T + 2*z3^2 + 2*z3 + 1)*X + 2*T^2 + (z3^2 + z3 + 4)*T + 2*z3
96
+ sage: frob_pol = frobenius_endomorphism.ore_polynomial()
97
+ sage: chi(frob_pol, phi(T))
98
+ 0
99
+
100
+ as well as its trace and norm::
101
+
102
+ sage: phi.frobenius_trace()
103
+ 6*T + 5*z3^2 + 5*z3 + 6
104
+ sage: phi.frobenius_trace() == -chi[1]
105
+ True
106
+ sage: phi.frobenius_norm()
107
+ 2*T^2 + (z3^2 + z3 + 4)*T + 2*z3
108
+
109
+ We can decide if a Drinfeld module is ordinary or supersingular::
110
+
111
+ sage: phi.is_ordinary()
112
+ True
113
+ sage: phi.is_supersingular()
114
+ False
115
+
116
+ .. RUBRIC:: Inverting the Drinfeld module
117
+
118
+ The morphism that defines a Drinfeld module is injective (see
119
+ [Gos1998]_, cor. 4.5.2). If the Drinfeld module is finite, one can
120
+ retrieve preimages::
121
+
122
+ sage: a = A.random_element()
123
+ sage: phi.invert(phi(a)) == a
124
+ True
125
+ """
126
+
127
+ def __init__(self, gen, category):
128
+ """
129
+ Initialize ``self``.
130
+
131
+ Validity of the input is checked in ``__classcall_private__``. The
132
+ ``__init__`` just saves attributes.
133
+
134
+ INPUT:
135
+
136
+ - ``function_ring`` -- a univariate polynomial ring whose base
137
+ is a finite field
138
+
139
+ - ``gen`` -- the generator of the Drinfeld module as a list of
140
+ coefficients or an Ore polynomial
141
+
142
+ - ``name`` -- (default: ``'t'``) the name of the Ore polynomial
143
+ ring gen
144
+
145
+ TESTS::
146
+
147
+ sage: Fq = GF(25)
148
+ sage: A.<T> = Fq[]
149
+ sage: K.<z12> = Fq.extension(6)
150
+ sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
151
+ sage: gen = [p_root, z12^3, z12^5]
152
+ sage: phi = DrinfeldModule(A, gen)
153
+ sage: ore_polring = phi.ore_polring()
154
+ sage: phi._gen == ore_polring(gen)
155
+ True
156
+ """
157
+ # NOTE: There used to be no __init__ here (which was fine). I
158
+ # added one to ensure that DrinfeldModule_finite would always
159
+ # have _frobenius_norm and _frobenius_trace attributes.
160
+ super().__init__(gen, category)
161
+ self._base_degree_over_constants = self.base_over_constants_field().degree(self._Fq)
162
+ self._frobenius_norm = None
163
+ self._frobenius_trace = None
164
+ self._frobenius_charpoly = None
165
+
166
+ def _frobenius_matrix_crystalline(self):
167
+ r"""
168
+ Return the matrix representing the Frobenius endomorphism on the
169
+ crystalline cohomology of the Drinfeld module. This is done up to
170
+ precision [K:Fq] + 1, which is enough to ensure the characteristic
171
+ polynomial can be recovered.
172
+
173
+ For the formal construction of the crystalline cohomology, see
174
+ [Ang1997]_. It is a free module of rank r over the ring of Witt
175
+ vectors in `T - \mathfrak{p}`.
176
+
177
+ EXAMPLES::
178
+
179
+ sage: Fq = GF(25)
180
+ sage: A.<T> = Fq[]
181
+ sage: K.<z12> = Fq.extension(6)
182
+ sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
183
+ sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
184
+ sage: phi._frobenius_matrix_crystalline()
185
+ [...((z2 + 3) + z12 + (4*z2 + 1)*z12^2 + (z2 + 4)*z12^3 + (z2 + 4)*z12^4 + (2*z2 + 3)*z12^5)*T^3 + (2*z2 + 2*z2*z12 + (2*z2 + 3)*z12^2 + ... + (3*z2 + 4)*z12^3 + (2*z2 + 3)*z12^4 + 3*z2*z12^5]
186
+
187
+ ALGORITHM:
188
+
189
+ Compute the action of the Frobenius on an explicit basis for the
190
+ cohomology using a recurrence relation, and return the resulting
191
+ matrix.
192
+ """
193
+ Fq = self._Fq
194
+ K = self.base_over_constants_field()
195
+ A = self.function_ring()
196
+ char, q = Fq.characteristic(), Fq.cardinality()
197
+ qdeg = logb(q, char)
198
+ r, n = self.rank(), self._base_degree_over_constants
199
+ nstar = ceil(sqrt(n))
200
+ nquo, nrem = divmod(n, nstar)
201
+ drin_coeffs = self.coefficients(sparse=False)
202
+ poly_K = PolynomialRing(K, name=str(A.gen()))
203
+ matrix_poly_K = MatrixSpace(poly_K, r, r)
204
+ mu_coeffs = ((poly_K.gen() - drin_coeffs[0])**(n+1)) \
205
+ .coefficients(sparse=False)
206
+
207
+ def companion(order):
208
+ # + [1] is required to satisfy formatting for companion matrix
209
+ M = matrix_poly_K(companion_matrix([(drin_coeffs[i]/drin_coeffs[r])
210
+ .frobenius(qdeg*order)
211
+ for i in range(r)] + [1], format='top'))
212
+ M[0, r-1] += poly_K.gen() / drin_coeffs[r].frobenius(qdeg*order)
213
+ return M
214
+
215
+ companion_initial = prod([companion(i) for i in range(nrem, 0, -1)])
216
+ companion_step = prod([companion(i)
217
+ for i in range(nstar + nrem, nrem, -1)])
218
+ reduced_companions = []
219
+ for k in range(nquo - 1, 0, -1):
220
+ M = Matrix(poly_K, r, r)
221
+ modulus = poly_K([c.frobenius(qdeg*(-k*nstar % n))
222
+ for c in mu_coeffs])
223
+ for i, row in enumerate(companion_step):
224
+ for j, entry in enumerate(row):
225
+ reduction = entry % modulus
226
+ M[i, j] = poly_K([c.frobenius(qdeg*(k*nstar))
227
+ for c in reduction
228
+ .coefficients(sparse=False)])
229
+ reduced_companions.append(M)
230
+ return (prod(reduced_companions) * companion_step * companion_initial)
231
+
232
+ def frobenius_endomorphism(self):
233
+ r"""
234
+ Return the Frobenius endomorphism of the Drinfeld module as a
235
+ morphism object.
236
+
237
+ Let `q` be the order of the base field of the function ring. The
238
+ *Frobenius endomorphism* is defined as the endomorphism whose
239
+ defining Ore polynomial is `t^q`.
240
+
241
+ EXAMPLES::
242
+
243
+ sage: Fq = GF(343)
244
+ sage: A.<T> = Fq[]
245
+ sage: K.<z6> = Fq.extension(2)
246
+ sage: phi = DrinfeldModule(A, [1, 0, z6])
247
+ sage: phi.frobenius_endomorphism()
248
+ Endomorphism of Drinfeld module defined by T |--> z6*t^2 + 1
249
+ Defn: t^2
250
+
251
+ TESTS::
252
+
253
+ sage: from sage.rings.function_field.drinfeld_modules.morphism import DrinfeldModuleMorphism
254
+ sage: isinstance(phi.frobenius_endomorphism(), DrinfeldModuleMorphism)
255
+ True
256
+ """
257
+ t = self.ore_polring().gen()
258
+ deg = self.base_over_constants_field().degree_over()
259
+ return self._Hom_(self, category=self.category())(t**deg)
260
+
261
+ def frobenius_charpoly(self, var='X', algorithm=None):
262
+ r"""
263
+ Return the characteristic polynomial of the Frobenius
264
+ endomorphism.
265
+
266
+ Let `\mathbb{F}_q` be the base field of the function ring. The
267
+ *characteristic polynomial* `\chi` *of the Frobenius endomorphism*
268
+ is defined in [Gek1991]_. An important feature of this
269
+ polynomial is that it is monic, univariate, and has coefficients
270
+ in the function ring. As in our case the function
271
+ ring is a univariate polynomial ring, it is customary to see the
272
+ characteristic polynomial of the Frobenius endomorphism as a
273
+ bivariate polynomial.
274
+
275
+ Let `\chi = X^r + \sum_{i=0}^{r-1} A_{i}(T)X^{i}` be the
276
+ characteristic polynomial of the Frobenius endomorphism, and
277
+ let `t^n` be the Ore polynomial that defines the Frobenius
278
+ endomorphism of `\phi`; by definition, `n` is the degree of `K`
279
+ over the base field `\mathbb{F}_q`. Then we have
280
+
281
+ .. MATH::
282
+
283
+ \chi(t^n)(\phi(T))
284
+ = t^{nr} + \sum_{i=1}^{r} \phi_{A_{i}}t^{n(i)}
285
+ = 0,
286
+
287
+ with `\deg(A_i) \leq \frac{n(r-i)}{r}`.
288
+
289
+ Note that the *Frobenius trace* is defined as `A_{r-1}(T)` and the
290
+ *Frobenius norm* is defined as `A_0(T)`.
291
+
292
+ INPUT:
293
+
294
+ - ``var`` (default: ``'X'``) -- the name of the second variable
295
+ - ``algorithm`` (default: ``None``) -- the algorithm
296
+ used to compute the characteristic polynomial
297
+
298
+ .. NOTE:
299
+
300
+ Available algorithms are:
301
+
302
+ - ``'CSA'`` -- it exploits the fact that `K\{\tau\}` is a
303
+ central simple algebra (CSA) over `\mathbb
304
+ F_q[\text{Frob}_\phi]` (see Chapter 4 of [CL2023]_).
305
+ - ``'crystalline'`` -- it uses the action of the Frobenius
306
+ on the crystalline cohomology (see [MS2023]_).
307
+ - ``'gekeler'`` -- it tries to identify coefficients by
308
+ writing that the characteristic polynomial annihilates the
309
+ Frobenius endomorphism; this algorithm may fail is some
310
+ cases (see [Gek2008]_).
311
+ - ``'motive'`` -- it uses the action of the Frobenius on the
312
+ Anderson motive (see Chapter 2 of [CL2023]_).
313
+
314
+ The method raises an exception if the user asks for an
315
+ unimplemented algorithm, even if the characteristic polynomial
316
+ has already been computed.
317
+
318
+ EXAMPLES::
319
+
320
+ sage: Fq = GF(25)
321
+ sage: A.<T> = Fq[]
322
+ sage: K.<z12> = Fq.extension(6)
323
+ sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
324
+ sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
325
+ sage: phi.frobenius_charpoly()
326
+ X^2 + ((4*z2 + 4)*T^3 + (z2 + 3)*T^2 + 3*T + 2*z2 + 3)*X + 3*z2*T^6 + (4*z2 + 3)*T^5 + (4*z2 + 4)*T^4 + 2*T^3 + (3*z2 + 3)*T^2 + (z2 + 2)*T + 4*z2
327
+
328
+ ::
329
+
330
+ sage: Fq = GF(343)
331
+ sage: A.<T> = Fq[]
332
+ sage: K.<z6> = Fq.extension(2)
333
+ sage: phi = DrinfeldModule(A, [1, 0, z6])
334
+ sage: chi = phi.frobenius_charpoly(algorithm='crystalline')
335
+ sage: chi
336
+ X^2 + ((3*z3^2 + z3 + 4)*T + 4*z3^2 + 6*z3 + 3)*X + (5*z3^2 + 2*z3)*T^2 + (4*z3^2 + 3*z3)*T + 5*z3^2 + 2*z3
337
+
338
+ ::
339
+
340
+ sage: frob_pol = phi.frobenius_endomorphism().ore_polynomial()
341
+ sage: chi(frob_pol, phi(T))
342
+ 0
343
+ sage: phi.frobenius_charpoly(algorithm='motive')(phi.frobenius_endomorphism())
344
+ Endomorphism of Drinfeld module defined by T |--> z6*t^2 + 1
345
+ Defn: 0
346
+
347
+ ::
348
+
349
+ sage: phi.frobenius_charpoly(algorithm="NotImplemented")
350
+ Traceback (most recent call last):
351
+ ...
352
+ NotImplementedError: algorithm "NotImplemented" not implemented
353
+
354
+ ALGORITHM:
355
+
356
+ If the user specifies an algorithm, then the characteristic
357
+ polynomial is computed according to the user's input (see
358
+ the note above), even if it had already been computed.
359
+
360
+ If no algorithm is given, then the function either returns a
361
+ cached value, or if no cached value is available, the
362
+ function computes the Frobenius characteristic polynomial
363
+ from scratch. In that case, if the rank `r` is less than the
364
+ extension degree `n`, then the ``crystalline`` algorithm is
365
+ used, while the ``CSA`` algorithm is used otherwise.
366
+
367
+ TESTS::
368
+
369
+ sage: Fq = GF(9)
370
+ sage: A.<T> = Fq[]
371
+ sage: k.<zk> = Fq.extension(2)
372
+ sage: K.<z> = k.extension(3)
373
+
374
+ ::
375
+
376
+ sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7])
377
+ sage: phi.frobenius_charpoly(algorithm='CSA')
378
+ X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
379
+ sage: phi.frobenius_charpoly(algorithm='crystalline')
380
+ X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
381
+ sage: phi.frobenius_charpoly(algorithm='gekeler')
382
+ X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
383
+ sage: phi.frobenius_charpoly(algorithm='motive')
384
+ X^2 + (2*T^3 + (2*z2 + 2)*T^2 + (z2 + 1)*T + 2*z2)*X + z2*T^6 + (2*z2 + 2)*T^3 + 2
385
+ sage: phi.frobenius_charpoly()(phi.frobenius_endomorphism()).ore_polynomial()
386
+ 0
387
+
388
+ ::
389
+
390
+ sage: phi = DrinfeldModule(A, [K(zk), z^2, z^3, z^4])
391
+ sage: phi.frobenius_charpoly(algorithm='CSA')
392
+ X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
393
+ sage: phi.frobenius_charpoly(algorithm='crystalline')
394
+ X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
395
+ sage: phi.frobenius_charpoly(algorithm='gekeler')
396
+ X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
397
+ sage: phi.frobenius_charpoly(algorithm='motive')
398
+ X^3 + ((z2 + 1)*T^2 + (z2 + 1)*T + z2 + 2)*X^2 + ((z2 + 2)*T^4 + 2*T^3 + z2*T^2 + T + 2*z2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
399
+ sage: phi.frobenius_charpoly()(phi.frobenius_endomorphism()).ore_polynomial()
400
+ 0
401
+
402
+ ::
403
+
404
+ sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7, z^20])
405
+ sage: phi.frobenius_charpoly(algorithm='CSA')
406
+ X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
407
+ sage: phi.frobenius_charpoly(algorithm='crystalline')
408
+ X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
409
+ sage: phi.frobenius_charpoly(algorithm='gekeler')
410
+ X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
411
+ sage: phi.frobenius_charpoly(algorithm='motive')
412
+ X^3 + (z2*T^2 + z2*T + z2 + 1)*X^2 + (T^4 + (2*z2 + 1)*T^3 + (z2 + 2)*T^2 + (2*z2 + 1)*T + z2 + 2)*X + T^6 + 2*z2*T^3 + 2*z2 + 1
413
+ sage: phi.frobenius_charpoly()(phi.frobenius_endomorphism()).ore_polynomial()
414
+ 0
415
+
416
+ Check that ``var`` inputs are taken into account for cached
417
+ characteristic polynomials::
418
+
419
+ sage: Fq = GF(2)
420
+ sage: A.<T> = Fq[]
421
+ sage: K.<z> = Fq.extension(2)
422
+ sage: phi = DrinfeldModule(A, [z, 0, 1])
423
+ sage: phi.frobenius_charpoly()
424
+ X^2 + X + T^2 + T + 1
425
+ sage: phi.frobenius_charpoly(var='Foo')
426
+ Foo^2 + Foo + T^2 + T + 1
427
+ sage: phi.frobenius_charpoly(var='Bar')
428
+ Bar^2 + Bar + T^2 + T + 1
429
+ """
430
+ # If no algorithm is specified, return cached data (if it
431
+ # exists), or pick an algorithm:
432
+ if algorithm is None:
433
+ if self._frobenius_charpoly is not None:
434
+ return self._frobenius_charpoly.change_variable_name(var)
435
+ else:
436
+ if self.rank() < self._base_degree_over_constants:
437
+ algorithm = 'crystalline'
438
+ else:
439
+ algorithm = 'CSA'
440
+ # If an algorithm is specified, do not use cached data, even
441
+ # if it is possible:
442
+ method_name = f'_frobenius_charpoly_{algorithm}'
443
+ if not hasattr(self, method_name):
444
+ raise NotImplementedError(f'algorithm "{algorithm}" not implemented')
445
+ self._frobenius_charpoly = getattr(self, method_name)()
446
+ return self._frobenius_charpoly.change_variable_name(var)
447
+
448
+ def _frobenius_charpoly_CSA(self):
449
+ r"""
450
+ Return the characteristic polynomial of the Frobenius
451
+ endomorphism using Crystalline cohomology.
452
+
453
+ The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
454
+ any rank.
455
+
456
+ This method is private and should not be directly called.
457
+ Instead, use :meth:`frobenius_charpoly` with the option
458
+ `algorithm='CSA'`.
459
+
460
+ EXAMPLES::
461
+
462
+ sage: Fq = GF(5)
463
+ sage: A.<T> = Fq[]
464
+ sage: K.<z> = Fq.extension(3)
465
+ sage: phi = DrinfeldModule(A, [z^i for i in range(1, 50)])
466
+ sage: phi.frobenius_charpoly(algorithm="CSA") # indirect doctest
467
+ X^48 + 4*X^47 + 4*X^46 + X^45 + 3*X^44 + X^42 + 4*X^41 + 4*X^39 + 2*X^37 + 4*X^36 + 3*X^35 + 2*X^33 + (4*T + 2)*X^32 + (4*T + 1)*X^31 + (3*T + 1)*X^30 + 4*T*X^29 + 4*T*X^28 + 2*X^27 + X^26 + (3*T + 4)*X^25 + (4*T + 4)*X^24 + (T + 1)*X^23 + (T + 3)*X^22 + 4*T*X^21 + (2*T + 1)*X^20 + 4*X^19 + 4*T*X^18 + (T + 4)*X^17 + 4*T^2*X^16 + (T^2 + 3*T + 3)*X^15 + (4*T^2 + 3*T + 3)*X^14 + (3*T^2 + 3*T + 3)*X^13 + (3*T^2 + 4*T + 4)*X^12 + (T^2 + 2*T + 2)*X^11 + (3*T^2 + 4*T + 4)*X^10 + (3*T^2 + T + 1)*X^9 + (4*T + 4)*X^8 + (3*T + 3)*X^7 + (T^2 + 3*T + 3)*X^6 + (3*T^2 + T + 1)*X^5 + (2*T^2 + 3*T + 3)*X^4 + (2*T^2 + 3*T + 3)*X^3 + 3*T^2*X^2 + 4*T^2*X + 2*T^3 + T + 1
468
+
469
+ ALGORITHM:
470
+
471
+ Compute the characteristic polynomial of the Frobenius from
472
+ the reduced characteristic polynomial of the Ore polynomial
473
+ `\phi_T`. This algorithm is particularly interesting when the
474
+ rank of the Drinfeld module is large compared to the degree
475
+ of the extension `K/\mathbb F_q`. See [CL2023]_.
476
+ """
477
+ E = self._base
478
+ EZ = PolynomialRing(E, name='Z')
479
+ n = self._base_degree_over_constants
480
+ f = self.gen() # phi_T, which is updated in the subsequent loop
481
+ t = self.ore_variable()
482
+ rows = []
483
+ for i in range(n):
484
+ m = f.degree() + 1
485
+ row = [EZ([f[jj] for jj in range(j, m, n)]) for j in range(n)]
486
+ rows.append(row)
487
+ f = t * f
488
+ chi = Matrix(rows).charpoly()
489
+ # Format the result
490
+ K = self.base_over_constants_field()
491
+ A = self.function_ring()
492
+ n = self._base_degree_over_constants
493
+ r = self.rank()
494
+ lc = chi[0][r]
495
+ coeffs = [A([K(chi[i][j]/lc).in_base()
496
+ for i in range((r-j)*n // r + 1)])
497
+ for j in range(r+1)]
498
+ return PolynomialRing(A, name='X')(coeffs)
499
+
500
+ def _frobenius_charpoly_crystalline(self):
501
+ r"""
502
+ Return the characteristic polynomial of the Frobenius
503
+ endomorphism using Crystalline cohomology.
504
+
505
+ The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
506
+ any rank.
507
+
508
+ This method is private and should not be directly called.
509
+ Instead, use :meth:`frobenius_charpoly` with the option
510
+ `algorithm='crystalline'`.
511
+
512
+ OUTPUT: a univariate polynomial with coefficients in the
513
+ function ring
514
+
515
+ EXAMPLES::
516
+
517
+ sage: Fq = GF(25)
518
+ sage: A.<T> = Fq[]
519
+ sage: K.<z12> = Fq.extension(6)
520
+ sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
521
+ sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
522
+ sage: phi.frobenius_charpoly(algorithm='crystalline') # indirect doctest
523
+ X^2 + ((4*z2 + 4)*T^3 + (z2 + 3)*T^2 + 3*T + 2*z2 + 3)*X + 3*z2*T^6 + (4*z2 + 3)*T^5 + (4*z2 + 4)*T^4 + 2*T^3 + (3*z2 + 3)*T^2 + (z2 + 2)*T + 4*z2
524
+
525
+ ::
526
+
527
+ sage: Fq = GF(25)
528
+ sage: A.<T> = Fq[]
529
+ sage: K.<z> = Fq.extension(8)
530
+ sage: phi = DrinfeldModule(A, [z, 4, 1, z, z+1, 2, z+2, 1, 1, 3, 1])
531
+ sage: phi.frobenius_charpoly(algorithm='crystalline') # indirect doctest
532
+ X^10 + X^9 + (3*T + z2 + 1)*X^8 + (4*T^2 + z2*T + 2*z2 + 1)*X^7 + ... + (4*z2 + 4)*T^4 + 4*z2*T^2 + (z2 + 2)*T + z2
533
+
534
+ ::
535
+
536
+ sage: Fq = GF(27)
537
+ sage: A.<T> = Fq[]
538
+ sage: K.<z> = Fq.extension(10)
539
+ sage: phi = DrinfeldModule(A, [z, z^2 + z, 2, 1, z, z+1, 2, z+2, 0, 1, 1, z^2 + z])
540
+ sage: phi.frobenius_charpoly(algorithm='crystalline') # indirect doctest
541
+ X^11 + (z3^2 + 2*z3)*X^10 + ((z3 + 1)*T + z3)*X^9 + ((2*z3^2 + z3 + 2)*T^2 + ... + (2*z3^2 + 2*z3 + 2)*T + z3^2
542
+
543
+ ALGORITHM:
544
+
545
+ Compute the characteristic polynomial of the Frobenius endomorphism
546
+ acting on the crystalline cohomology of a Drinfeld module, which
547
+ is equal to that of the Frobenius endomorphism on the Drinfeld
548
+ module. A recurrence on elements of the cohomology allows us to
549
+ compute a matrix representation of the Frobenius endomorphism
550
+ efficiently using a companion matrix method. Based on the algorithm
551
+ of section 6.3 in [MS2023]_.
552
+ """
553
+ A = self.function_ring()
554
+ charpoly_K = self._frobenius_matrix_crystalline().charpoly().list()
555
+
556
+ # The above line obtains the char poly with coefficients in K[T]
557
+ # This maps them into A = Fq[T]
558
+
559
+ coeffs_A = [A([x.in_base() for x in coeff]) for coeff in charpoly_K]
560
+ return PolynomialRing(A, name='X')(coeffs_A)
561
+
562
+ def _frobenius_charpoly_gekeler(self):
563
+ r"""
564
+ Return the characteristic polynomial of the Frobenius
565
+ endomorphism using Gekeler's algorithm.
566
+
567
+ The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
568
+ any rank, provided that the constant coefficient is a generator
569
+ of the base field.
570
+
571
+ This method is private and should not be directly called.
572
+ Instead, use :meth:`frobenius_charpoly` with the option
573
+ `algorithm='gekeler'`.
574
+
575
+ .. WARNING::
576
+
577
+ This algorithm only works in the generic case when the
578
+ corresponding linear system is invertible. Notable cases
579
+ where this fails include Drinfeld modules whose minimal
580
+ polynomial is not equal to the characteristic polynomial,
581
+ and rank 2 Drinfeld modules where the degree 1 coefficient
582
+ of `\phi_T` is 0. In that case, an exception is raised.
583
+
584
+ EXAMPLES::
585
+
586
+ sage: Fq = GF(25)
587
+ sage: A.<T> = Fq[]
588
+ sage: K.<z> = Fq.extension(6)
589
+ sage: phi = DrinfeldModule(A, [z, 4, 1, z])
590
+ sage: phi.frobenius_charpoly(algorithm='gekeler') # indirect doctest
591
+ X^3 + ((z2 + 2)*T^2 + (z2 + 2)*T + 4*z2 + 4)*X^2 + ... + (3*z2 + 2)*T^2 + (3*z2 + 3)*T + 4
592
+
593
+ ::
594
+
595
+ sage: Fq = GF(125)
596
+ sage: A.<T> = Fq[]
597
+ sage: K.<z> = Fq.extension(2)
598
+ sage: phi = DrinfeldModule(A, [z, 0, z])
599
+ sage: phi.frobenius_charpoly(algorithm='gekeler') # indirect doctest
600
+ Traceback (most recent call last):
601
+ NotImplementedError: 'gekeler' algorithm failed
602
+
603
+ ALGORITHM:
604
+
605
+ Construct a linear system based on the requirement that the
606
+ Frobenius satisfies a degree r polynomial with coefficients in
607
+ the function ring. This generalizes the procedure from
608
+ [Gek2008]_ for the rank 2 case.
609
+ """
610
+ K = self.base_over_constants_field()
611
+ A = self.function_ring()
612
+ r, n = self.rank(), self._base_degree_over_constants
613
+ # Compute constants that determine the block structure of the
614
+ # linear system. The system is prepared such that the solution
615
+ # vector has the form [a_0, a_1, ... a_{r-1}]^T with each a_i
616
+ # corresponding to a block of length (n*(r - i))//r + 1
617
+ shifts = [(n*(r - i))//r + 1 for i in range(r)]
618
+ rows, cols = n*r + 1, sum(shifts)
619
+ block_shifts = [0]
620
+ for i in range(r-1):
621
+ block_shifts.append(block_shifts[-1] + shifts[i])
622
+ # Compute the images \phi_T^i for i = 0 .. n.
623
+ gen_powers = [self(A.gen()**i).coefficients(sparse=False)
624
+ for i in range(0, n + 1)]
625
+ sys, vec = Matrix(K, rows, cols), vector(K, rows)
626
+ vec[rows - 1] = -1
627
+ for j in range(r):
628
+ for k in range(shifts[j]):
629
+ for i in range(len(gen_powers[k])):
630
+ sys[i + n*j, block_shifts[j] + k] = gen_powers[k][i]
631
+ if sys.right_nullity() != 0:
632
+ raise NotImplementedError("'gekeler' algorithm failed")
633
+ sol = list(sys.solve_right(vec))
634
+ # The system is solved over K, but the coefficients should all
635
+ # be in Fq We project back into Fq here.
636
+ sol_Fq = [K(x).vector()[0] for x in sol]
637
+ char_poly = []
638
+ for i in range(r):
639
+ char_poly.append([sol_Fq[block_shifts[i] + j]
640
+ for j in range(shifts[i])])
641
+ return PolynomialRing(A, name='X')(char_poly + [1])
642
+
643
+ def _frobenius_charpoly_motive(self):
644
+ r"""
645
+ Return the characteristic polynomial of the Frobenius
646
+ endomorphism using Motivic cohomology.
647
+
648
+ The algorithm works for Drinfeld `\mathbb{F}_q[T]`-modules of
649
+ any rank.
650
+
651
+ This method is private and should not be directly called.
652
+ Instead, use :meth:`frobenius_charpoly` with the option
653
+ `algorithm='motive'`.
654
+
655
+ OUTPUT: a univariate polynomial with coefficients in the
656
+ function ring
657
+
658
+ EXAMPLES::
659
+
660
+ sage: Fq = GF(25)
661
+ sage: A.<T> = Fq[]
662
+ sage: K.<z12> = Fq.extension(6)
663
+ sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
664
+ sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
665
+ sage: phi.frobenius_charpoly(algorithm='motive') # indirect doctest
666
+ X^2 + ((4*z2 + 4)*T^3 + (z2 + 3)*T^2 + 3*T + 2*z2 + 3)*X + 3*z2*T^6 + (4*z2 + 3)*T^5 + (4*z2 + 4)*T^4 + 2*T^3 + (3*z2 + 3)*T^2 + (z2 + 2)*T + 4*z2
667
+
668
+ ::
669
+
670
+ sage: Fq = GF(25)
671
+ sage: A.<T> = Fq[]
672
+ sage: K.<z> = Fq.extension(8)
673
+ sage: phi = DrinfeldModule(A, [z, 4, 1, z, z+1, 2, z+2, 1, 1, 3, 1])
674
+ sage: phi.frobenius_charpoly(algorithm='motive') # indirect doctest
675
+ X^10 + X^9 + (3*T + z2 + 1)*X^8 + (4*T^2 + z2*T + 2*z2 + 1)*X^7 + ... + (4*z2 + 4)*T^4 + 4*z2*T^2 + (z2 + 2)*T + z2
676
+
677
+ ::
678
+
679
+ sage: Fq = GF(27)
680
+ sage: A.<T> = Fq[]
681
+ sage: K.<z> = Fq.extension(10)
682
+ sage: phi = DrinfeldModule(A, [z, z^2 + z, 2, 1, z, z+1, 2, z+2, 0, 1, 1, z^2 + z])
683
+ sage: phi.frobenius_charpoly(algorithm='motive') # indirect doctest
684
+ X^11 + (z3^2 + 2*z3)*X^10 + ((z3 + 1)*T + z3)*X^9 + ((2*z3^2 + z3 + 2)*T^2 + ... + (2*z3^2 + 2*z3 + 2)*T + z3^2
685
+ """
686
+ return self.frobenius_endomorphism().characteristic_polynomial('X')
687
+
688
+ def frobenius_norm(self):
689
+ r"""
690
+ Return the Frobenius norm of the Drinfeld module.
691
+
692
+ Let `C(X) = \sum_{i=0}^r a_iX^{i}` denote the characteristic
693
+ polynomial of the Frobenius endomorphism. The Frobenius norm
694
+ is `a_{0}`, and given by the formula
695
+
696
+ .. MATH::
697
+
698
+ a_0 = (-1)^{nr - n -r}
699
+ \mathrm{Norm}_{K/\mathbb F_q}(\Delta)^{-1}
700
+ p^{n / \mathrm{deg}(p)},
701
+
702
+ where `K` is the ground field, which as degree `n` over
703
+ `\mathbb F_q`, `r` is the rank of the Drinfeld module,
704
+ and `\Delta` is the leading coefficient of the generator.
705
+ This formula is given in Theorem~4.2.7 of [Pap2023]_.
706
+
707
+ Note that the Frobenius norm computed by this method may be
708
+ different than what is computed as the isogeny norm of the
709
+ Frobenius endomorphism (see :meth:`norm` on the Frobenius
710
+ endomorphism), which is an ideal defined of the function ring
711
+ given by its monic generator; the Frobenius norm may not be
712
+ monic.
713
+
714
+ EXAMPLES::
715
+
716
+ sage: Fq = GF(343)
717
+ sage: A.<T> = Fq[]
718
+ sage: K.<z6> = Fq.extension(2)
719
+ sage: phi = DrinfeldModule(A, [1, 0, z6])
720
+ sage: frobenius_norm = phi.frobenius_norm()
721
+ sage: frobenius_norm
722
+ (5*z3^2 + 2*z3)*T^2 + (4*z3^2 + 3*z3)*T + 5*z3^2 + 2*z3
723
+
724
+ ::
725
+
726
+ sage: n = 2 # Degree of the base field over Fq
727
+ sage: frobenius_norm.degree() == n
728
+ True
729
+
730
+ ::
731
+
732
+ sage: frobenius_norm == phi.frobenius_charpoly()[0]
733
+ True
734
+
735
+ ::
736
+
737
+ sage: lc = frobenius_norm.leading_coefficient()
738
+ sage: isogeny_norm = phi.frobenius_endomorphism().norm()
739
+ sage: isogeny_norm.gen() == frobenius_norm / lc
740
+ True
741
+ sage: A.ideal(frobenius_norm) == isogeny_norm
742
+ True
743
+
744
+ ALGORITHM:
745
+
746
+ The Frobenius norm is computed using the formula, by
747
+ Gekeler, given in [MS2019]_, Section 4, Proposition 3.
748
+ """
749
+ if self._frobenius_norm is not None:
750
+ return self._frobenius_norm
751
+ K = self.base_over_constants_field()
752
+ n = K.degree(self._Fq)
753
+ r = self.rank()
754
+ p = self.characteristic()
755
+ norm = K(self.coefficients()[-1]).norm()
756
+ self._frobenius_norm = (-1) ** (n*r - n - r) \
757
+ * norm**(-1) \
758
+ * p ** (n//p.degree())
759
+ return self._frobenius_norm
760
+
761
+ def frobenius_trace(self, algorithm=None):
762
+ r"""
763
+ Return the Frobenius trace of the Drinfeld module.
764
+
765
+ Let `C(X) = \sum_{i=0}^r a_iX^{i}` denote the characteristic
766
+ polynomial of the Frobenius endomorphism. The Frobenius trace
767
+ is `-a_{r-1}`. This is an element of the regular function ring
768
+ and if `n` is the degree of the base field over `\mathbb{F}_q`,
769
+ then the Frobenius trace has degree at most `\frac{n}{r}`.
770
+
771
+ INPUT:
772
+
773
+ - ``algorithm`` (default: ``None``) -- the algorithm
774
+ used to compute the characteristic polynomial
775
+
776
+ .. NOTE:
777
+
778
+ Available algorithms are:
779
+
780
+ - ``'CSA'`` -- it exploits the fact that `K\{\tau\}` is a
781
+ central simple algebra (CSA) over `\mathbb
782
+ F_q[\text{Frob}_\phi]` (see Chapter 4 of [CL2023]_).
783
+ - ``'crystalline'`` -- it uses the action of the Frobenius
784
+ on the crystalline cohomology (see [MS2023]_).
785
+
786
+ The method raises an exception if the user asks for an
787
+ unimplemented algorithm, even if the characteristic has already
788
+ been computed. See :meth:`frobenius_charpoly` for more details.
789
+
790
+ EXAMPLES::
791
+
792
+ sage: Fq = GF(343)
793
+ sage: A.<T> = Fq[]
794
+ sage: K.<z6> = Fq.extension(2)
795
+ sage: phi = DrinfeldModule(A, [1, 0, z6])
796
+ sage: frobenius_trace = phi.frobenius_trace()
797
+ sage: frobenius_trace
798
+ (4*z3^2 + 6*z3 + 3)*T + 3*z3^2 + z3 + 4
799
+
800
+ ::
801
+
802
+ sage: n = 2 # Degree over Fq of the base codomain
803
+ sage: frobenius_trace.degree() <= n/2
804
+ True
805
+
806
+ ::
807
+
808
+ sage: frobenius_trace == -phi.frobenius_charpoly()[1]
809
+ True
810
+
811
+ One can specify an algorithm::
812
+
813
+ sage: psi = DrinfeldModule(A, [z6, 1, z6^3, z6 + 1])
814
+ sage: psi.frobenius_trace(algorithm='crystalline')
815
+ z3^2 + 6*z3 + 2
816
+ sage: psi.frobenius_trace(algorithm='CSA')
817
+ z3^2 + 6*z3 + 2
818
+
819
+ ALGORITHM:
820
+
821
+ If the user specifies an algorithm, then the trace is
822
+ computed according to the user's input (see the note above),
823
+ even if the Frobenius trace or the Frobenius characteristic
824
+ polynomial had already been computed.
825
+
826
+ If no algorithm is given, then the function either returns a
827
+ cached value, or if no cached value is available, the
828
+ function computes the Frobenius trace from scratch. In that
829
+ case, if the rank `r` is less than the extension degree `n`,
830
+ then the ``crystalline`` algorithm is used, while the
831
+ ``CSA`` algorithm is used otherwise.
832
+
833
+ TESTS:
834
+
835
+ These test values are taken from :meth:`frobenius_charpoly`::
836
+
837
+ sage: Fq = GF(9)
838
+ sage: A.<T> = Fq[]
839
+ sage: k.<zk> = Fq.extension(2)
840
+ sage: K.<z> = k.extension(3)
841
+
842
+ ::
843
+
844
+ sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7])
845
+ sage: phi.frobenius_trace(algorithm='CSA')
846
+ T^3 + (z2 + 1)*T^2 + (2*z2 + 2)*T + z2
847
+ sage: phi.frobenius_trace(algorithm='crystalline')
848
+ T^3 + (z2 + 1)*T^2 + (2*z2 + 2)*T + z2
849
+ sage: charpoly = phi.frobenius_charpoly()
850
+ sage: trace = phi.frobenius_trace()
851
+ sage: trace == -charpoly[1]
852
+ True
853
+
854
+ ::
855
+
856
+ sage: phi = DrinfeldModule(A, [K(zk), z^2, z^3, z^4])
857
+ sage: phi.frobenius_trace(algorithm='CSA')
858
+ (2*z2 + 2)*T^2 + (2*z2 + 2)*T + 2*z2 + 1
859
+ sage: phi.frobenius_trace(algorithm='crystalline')
860
+ (2*z2 + 2)*T^2 + (2*z2 + 2)*T + 2*z2 + 1
861
+ sage: charpoly = phi.frobenius_charpoly()
862
+ sage: trace = phi.frobenius_trace()
863
+ sage: trace == -charpoly[2]
864
+ True
865
+
866
+ ::
867
+
868
+ sage: phi = DrinfeldModule(A, [K(zk), z^8, z^7, z^20])
869
+ sage: phi.frobenius_trace(algorithm='CSA')
870
+ 2*z2*T^2 + 2*z2*T + 2*z2 + 2
871
+ sage: phi.frobenius_trace(algorithm='crystalline')
872
+ 2*z2*T^2 + 2*z2*T + 2*z2 + 2
873
+ sage: charpoly = phi.frobenius_charpoly()
874
+ sage: trace = phi.frobenius_trace()
875
+ sage: trace == -charpoly[2]
876
+ True
877
+ """
878
+ if algorithm is None:
879
+ # If no algorithm is specified, return cached data (if it
880
+ # exists), or pick an algorithm:
881
+ # However, if an algorithm is specified, do not use cached
882
+ # data, even if it is possible
883
+ if self._frobenius_trace is not None:
884
+ return self._frobenius_trace
885
+ if self._frobenius_charpoly is not None:
886
+ self._frobenius_trace = -self._frobenius_charpoly \
887
+ .coefficients(sparse=False)[-2]
888
+ return self._frobenius_trace
889
+ else:
890
+ if self.rank() < self._base_degree_over_constants:
891
+ algorithm = 'crystalline'
892
+ else:
893
+ algorithm = 'CSA'
894
+ # We first check if a matrix method is available
895
+ matrix_method_name = f'_frobenius_matrix_{algorithm}'
896
+ if hasattr(self, matrix_method_name):
897
+ matrix = getattr(self, matrix_method_name)()
898
+ trace = matrix.trace()
899
+ A = self.function_ring()
900
+ self._frobenius_trace = A([x.in_base() for x in trace])
901
+ return self._frobenius_trace
902
+ # If it is not, we look for a charpoly method
903
+ charpoly_method_name = f'_frobenius_charpoly_{algorithm}'
904
+ if hasattr(self, charpoly_method_name):
905
+ charpoly = getattr(self, charpoly_method_name)()
906
+ self._frobenius_trace = -charpoly.list()[-2]
907
+ return self._frobenius_trace
908
+ # If all fail, we raise an error
909
+ raise NotImplementedError(f'algorithm "{algorithm}" not implemented')
910
+
911
+ def invert(self, ore_pol):
912
+ r"""
913
+ Return the preimage of the input under the Drinfeld module, if it
914
+ exists.
915
+
916
+ INPUT:
917
+
918
+ - ``ore_pol`` -- the Ore polynomial whose preimage we want to
919
+ compute
920
+
921
+ EXAMPLES::
922
+
923
+ sage: Fq = GF(25)
924
+ sage: A.<T> = Fq[]
925
+ sage: K.<z12> = Fq.extension(6)
926
+ sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
927
+ sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5])
928
+ sage: a = A.random_element()
929
+ sage: phi.invert(phi(a)) == a
930
+ True
931
+ sage: phi.invert(phi(T)) == T
932
+ True
933
+ sage: phi.invert(phi(Fq.gen())) == Fq.gen()
934
+ True
935
+
936
+ When the input is not in the image of the Drinfeld module, an
937
+ exception is raised::
938
+
939
+ sage: t = phi.ore_polring().gen()
940
+ sage: phi.invert(t + 1)
941
+ Traceback (most recent call last):
942
+ ...
943
+ ValueError: input must be in the image of the Drinfeld module
944
+
945
+ ::
946
+
947
+ sage: phi.invert(t^4 + t^2 + 1)
948
+ Traceback (most recent call last):
949
+ ...
950
+ ValueError: input must be in the image of the Drinfeld module
951
+
952
+ ALGORITHM:
953
+
954
+ The algorithm relies on the inversion of a linear algebra
955
+ system. See [MS2019]_, 3.2.5 for details.
956
+
957
+ TESTS::
958
+
959
+ sage: a = A.random_element()
960
+ sage: cat = phi.category()
961
+ sage: phi_r1 = cat.random_object(1)
962
+ sage: phi_r1.invert(phi_r1(a)) == a
963
+ True
964
+ sage: phi_r2 = cat.random_object(2)
965
+ sage: phi_r2.invert(phi_r2(a)) == a
966
+ True
967
+ sage: phi_r3 = cat.random_object(3)
968
+ sage: phi_r3.invert(phi_r3(a)) == a
969
+ True
970
+ sage: phi_r4 = cat.random_object(4)
971
+ sage: phi_r4.invert(phi_r4(a)) == a
972
+ True
973
+ sage: phi_r5 = cat.random_object(5)
974
+ sage: phi_r5.invert(phi_r5(a)) == a
975
+ True
976
+
977
+ ::
978
+
979
+ sage: B.<X> = Fq[]
980
+ sage: phi_r5.invert(X)
981
+ Traceback (most recent call last):
982
+ ...
983
+ TypeError: input must be an Ore polynomial
984
+ """
985
+ deg = ore_pol.degree()
986
+ r = self.rank()
987
+ E = self.base()
988
+ K = self.base_over_constants_field()
989
+ if ore_pol in self._ore_polring:
990
+ ore_pol = self._ore_polring(ore_pol)
991
+ else:
992
+ raise TypeError('input must be an Ore polynomial')
993
+
994
+ # Trivial cases
995
+ if deg <= 0:
996
+ return K(ore_pol[0]).in_base()
997
+ if deg % r != 0:
998
+ raise ValueError('input must be in the image of the Drinfeld module')
999
+ # Write the system and solve it
1000
+ k = deg // r
1001
+ A = self._function_ring
1002
+ mat_rows = [[E.zero() for _ in range(k+1)] for _ in range(k+1)]
1003
+ mat_rows[0][0] = E.one()
1004
+ phiT = self.gen()
1005
+ phiTi = self.ore_polring().one()
1006
+ for i in range(1, k+1):
1007
+ phiTi *= phiT
1008
+ for j in range(i+1):
1009
+ mat_rows[j][i] = phiTi[r*j]
1010
+ mat = Matrix(mat_rows)
1011
+ vec = vector([ore_pol[r*j] for j in range(k+1)])
1012
+ coeffs_K = list(mat.inverse() * vec)
1013
+ # Cast the coefficients to Fq
1014
+ try:
1015
+ coeffs_Fq = [K(c).in_base() for c in coeffs_K]
1016
+ pre_image = A(coeffs_Fq)
1017
+ if self(pre_image) == ore_pol:
1018
+ return pre_image
1019
+ except ValueError:
1020
+ pass
1021
+ raise ValueError('input must be in the image of the Drinfeld module')
1022
+
1023
+ def is_isogenous(self, psi):
1024
+ r"""
1025
+ Return ``True`` when ``self`` is isogenous to the other
1026
+ Drinfeld module.
1027
+
1028
+ If the Drinfeld modules do not belong to the same category, an
1029
+ exception is raised.
1030
+
1031
+ EXAMPLES::
1032
+
1033
+ sage: Fq = GF(2)
1034
+ sage: A.<T> = Fq[]
1035
+ sage: K.<z> = Fq.extension(3)
1036
+ sage: psi = DrinfeldModule(A, [z, z + 1, z^2 + z + 1])
1037
+ sage: phi = DrinfeldModule(A, [z, z^2 + z + 1, z^2 + z])
1038
+ sage: phi.is_isogenous(psi)
1039
+ True
1040
+
1041
+ ::
1042
+
1043
+ sage: chi = DrinfeldModule(A, [z, z + 1, z^2 + z])
1044
+ sage: phi.is_isogenous(chi)
1045
+ False
1046
+
1047
+ ::
1048
+
1049
+ sage: mu = DrinfeldModule(A, [z + 1, z^2 + z + 1, z^2 + z])
1050
+ sage: phi.is_isogenous(mu)
1051
+ Traceback (most recent call last):
1052
+ ...
1053
+ TypeError: Drinfeld modules are not in the same category
1054
+
1055
+ ::
1056
+
1057
+ sage: mu = 1
1058
+ sage: phi.is_isogenous(mu)
1059
+ Traceback (most recent call last):
1060
+ ...
1061
+ TypeError: input must be a Drinfeld module
1062
+
1063
+ ALGORITHM:
1064
+
1065
+ Two Drinfeld A-modules of equal characteristic are isogenous
1066
+ if and only if:
1067
+
1068
+ - they have the same rank
1069
+ - the characteristic polynomial of the Frobenius endomorphism
1070
+ for both Drinfeld modules are equal.
1071
+ """
1072
+ if not isinstance(psi, DrinfeldModule):
1073
+ raise TypeError("input must be a Drinfeld module")
1074
+ if self.category() != psi.category():
1075
+ raise TypeError("Drinfeld modules are not in the same category")
1076
+ return self.rank() == psi.rank() \
1077
+ and self.frobenius_charpoly() == psi.frobenius_charpoly()
1078
+
1079
+ def is_supersingular(self):
1080
+ r"""
1081
+ Return ``True`` if this Drinfeld module is supersingular.
1082
+
1083
+ A Drinfeld module is supersingular if and only if its
1084
+ height equals its rank.
1085
+
1086
+ EXAMPLES::
1087
+
1088
+ sage: Fq = GF(343)
1089
+ sage: A.<T> = Fq[]
1090
+ sage: K.<z6> = Fq.extension(2)
1091
+ sage: phi = DrinfeldModule(A, [1, 0, z6])
1092
+ sage: phi.is_supersingular()
1093
+ True
1094
+ sage: phi(phi.characteristic()) # Purely inseparable
1095
+ z6*t^2
1096
+
1097
+ In rank two, a Drinfeld module is either ordinary or
1098
+ supersinguler. In higher ranks, it could be neither of
1099
+ the two::
1100
+
1101
+ sage: psi = DrinfeldModule(A, [1, 0, z6, z6])
1102
+ sage: psi.is_ordinary()
1103
+ False
1104
+ sage: psi.is_supersingular()
1105
+ False
1106
+ """
1107
+ return self.height() == self.rank()
1108
+
1109
+ def is_ordinary(self):
1110
+ r"""
1111
+ Return ``True`` if this Drinfeld module is ordinary.
1112
+
1113
+ A Drinfeld module is ordinary if and only if its
1114
+ height is one.
1115
+
1116
+ EXAMPLES::
1117
+
1118
+ sage: Fq = GF(343)
1119
+ sage: A.<T> = Fq[]
1120
+ sage: K.<z6> = Fq.extension(2)
1121
+ sage: phi = DrinfeldModule(A, [1, 0, z6])
1122
+ sage: phi.is_ordinary()
1123
+ False
1124
+
1125
+ ::
1126
+
1127
+ sage: phi = DrinfeldModule(A, [1, z6, 0, z6])
1128
+ sage: phi.is_ordinary()
1129
+ True
1130
+ """
1131
+ return self.height() == 1