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

Potentially problematic release.


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

Files changed (808) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  12. passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  13. sage/algebras/all__sagemath_modules.py +20 -0
  14. sage/algebras/catalog.py +148 -0
  15. sage/algebras/clifford_algebra.py +3107 -0
  16. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  17. sage/algebras/clifford_algebra_element.pxd +16 -0
  18. sage/algebras/clifford_algebra_element.pyx +997 -0
  19. sage/algebras/commutative_dga.py +4252 -0
  20. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
  21. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  22. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  23. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  29. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  30. sage/algebras/finite_gca.py +528 -0
  31. sage/algebras/group_algebra.py +232 -0
  32. sage/algebras/lie_algebras/abelian.py +197 -0
  33. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  34. sage/algebras/lie_algebras/all.py +25 -0
  35. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  36. sage/algebras/lie_algebras/bch.py +177 -0
  37. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  38. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  39. sage/algebras/lie_algebras/center_uea.py +767 -0
  40. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  41. sage/algebras/lie_algebras/examples.py +683 -0
  42. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  43. sage/algebras/lie_algebras/heisenberg.py +820 -0
  44. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  47. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  48. sage/algebras/lie_algebras/morphism.py +661 -0
  49. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  50. sage/algebras/lie_algebras/onsager.py +1324 -0
  51. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  52. sage/algebras/lie_algebras/quotient.py +462 -0
  53. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  54. sage/algebras/lie_algebras/representation.py +1040 -0
  55. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  56. sage/algebras/lie_algebras/subalgebra.py +967 -0
  57. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  58. sage/algebras/lie_algebras/verma_module.py +1630 -0
  59. sage/algebras/lie_algebras/virasoro.py +1186 -0
  60. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
  61. sage/algebras/octonion_algebra.pxd +20 -0
  62. sage/algebras/octonion_algebra.pyx +987 -0
  63. sage/algebras/orlik_solomon.py +907 -0
  64. sage/algebras/orlik_terao.py +779 -0
  65. sage/algebras/steenrod/all.py +7 -0
  66. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  67. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  68. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  69. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  70. sage/algebras/weyl_algebra.py +1126 -0
  71. sage/all__sagemath_modules.py +62 -0
  72. sage/calculus/all__sagemath_modules.py +19 -0
  73. sage/calculus/expr.py +205 -0
  74. sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
  75. sage/calculus/integration.pyx +698 -0
  76. sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
  77. sage/calculus/interpolation.pxd +13 -0
  78. sage/calculus/interpolation.pyx +387 -0
  79. sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
  80. sage/calculus/interpolators.pyx +326 -0
  81. sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/calculus/ode.pxd +5 -0
  83. sage/calculus/ode.pyx +610 -0
  84. sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
  85. sage/calculus/riemann.pyx +1521 -0
  86. sage/calculus/test_sympy.py +201 -0
  87. sage/calculus/transforms/all.py +7 -0
  88. sage/calculus/transforms/dft.py +844 -0
  89. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
  90. sage/calculus/transforms/dwt.pxd +7 -0
  91. sage/calculus/transforms/dwt.pyx +160 -0
  92. sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/calculus/transforms/fft.pxd +12 -0
  94. sage/calculus/transforms/fft.pyx +487 -0
  95. sage/calculus/wester.py +662 -0
  96. sage/coding/abstract_code.py +1108 -0
  97. sage/coding/ag_code.py +868 -0
  98. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
  99. sage/coding/ag_code_decoders.pyx +2639 -0
  100. sage/coding/all.py +15 -0
  101. sage/coding/bch_code.py +494 -0
  102. sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/coding/binary_code.pxd +124 -0
  104. sage/coding/binary_code.pyx +4139 -0
  105. sage/coding/bounds_catalog.py +43 -0
  106. sage/coding/channel.py +819 -0
  107. sage/coding/channels_catalog.py +29 -0
  108. sage/coding/code_bounds.py +755 -0
  109. sage/coding/code_constructions.py +804 -0
  110. sage/coding/codes_catalog.py +111 -0
  111. sage/coding/cyclic_code.py +1329 -0
  112. sage/coding/databases.py +316 -0
  113. sage/coding/decoder.py +373 -0
  114. sage/coding/decoders_catalog.py +88 -0
  115. sage/coding/delsarte_bounds.py +709 -0
  116. sage/coding/encoder.py +390 -0
  117. sage/coding/encoders_catalog.py +64 -0
  118. sage/coding/extended_code.py +468 -0
  119. sage/coding/gabidulin_code.py +1058 -0
  120. sage/coding/golay_code.py +404 -0
  121. sage/coding/goppa_code.py +441 -0
  122. sage/coding/grs_code.py +2371 -0
  123. sage/coding/guava.py +107 -0
  124. sage/coding/guruswami_sudan/all.py +1 -0
  125. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  126. sage/coding/guruswami_sudan/interpolation.py +409 -0
  127. sage/coding/guruswami_sudan/utils.py +176 -0
  128. sage/coding/hamming_code.py +176 -0
  129. sage/coding/information_set_decoder.py +1032 -0
  130. sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
  131. sage/coding/kasami_codes.pyx +351 -0
  132. sage/coding/linear_code.py +3067 -0
  133. sage/coding/linear_code_no_metric.py +1354 -0
  134. sage/coding/linear_rank_metric.py +961 -0
  135. sage/coding/parity_check_code.py +353 -0
  136. sage/coding/punctured_code.py +719 -0
  137. sage/coding/reed_muller_code.py +999 -0
  138. sage/coding/self_dual_codes.py +942 -0
  139. sage/coding/source_coding/all.py +2 -0
  140. sage/coding/source_coding/huffman.py +553 -0
  141. sage/coding/subfield_subcode.py +423 -0
  142. sage/coding/two_weight_db.py +399 -0
  143. sage/combinat/all__sagemath_modules.py +7 -0
  144. sage/combinat/cartesian_product.py +347 -0
  145. sage/combinat/family.py +11 -0
  146. sage/combinat/free_module.py +1977 -0
  147. sage/combinat/root_system/all.py +147 -0
  148. sage/combinat/root_system/ambient_space.py +527 -0
  149. sage/combinat/root_system/associahedron.py +471 -0
  150. sage/combinat/root_system/braid_move_calculator.py +143 -0
  151. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
  152. sage/combinat/root_system/braid_orbit.pyx +144 -0
  153. sage/combinat/root_system/branching_rules.py +2301 -0
  154. sage/combinat/root_system/cartan_matrix.py +1245 -0
  155. sage/combinat/root_system/cartan_type.py +3069 -0
  156. sage/combinat/root_system/coxeter_group.py +162 -0
  157. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  158. sage/combinat/root_system/coxeter_type.py +681 -0
  159. sage/combinat/root_system/dynkin_diagram.py +900 -0
  160. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  161. sage/combinat/root_system/fundamental_group.py +795 -0
  162. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  163. sage/combinat/root_system/integrable_representations.py +1227 -0
  164. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  165. sage/combinat/root_system/pieri_factors.py +1147 -0
  166. sage/combinat/root_system/plot.py +1615 -0
  167. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  168. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  169. sage/combinat/root_system/root_space.py +487 -0
  170. sage/combinat/root_system/root_system.py +882 -0
  171. sage/combinat/root_system/type_A.py +348 -0
  172. sage/combinat/root_system/type_A_affine.py +227 -0
  173. sage/combinat/root_system/type_A_infinity.py +241 -0
  174. sage/combinat/root_system/type_B.py +347 -0
  175. sage/combinat/root_system/type_BC_affine.py +287 -0
  176. sage/combinat/root_system/type_B_affine.py +216 -0
  177. sage/combinat/root_system/type_C.py +317 -0
  178. sage/combinat/root_system/type_C_affine.py +188 -0
  179. sage/combinat/root_system/type_D.py +357 -0
  180. sage/combinat/root_system/type_D_affine.py +208 -0
  181. sage/combinat/root_system/type_E.py +641 -0
  182. sage/combinat/root_system/type_E_affine.py +231 -0
  183. sage/combinat/root_system/type_F.py +387 -0
  184. sage/combinat/root_system/type_F_affine.py +137 -0
  185. sage/combinat/root_system/type_G.py +293 -0
  186. sage/combinat/root_system/type_G_affine.py +132 -0
  187. sage/combinat/root_system/type_H.py +105 -0
  188. sage/combinat/root_system/type_I.py +110 -0
  189. sage/combinat/root_system/type_Q.py +150 -0
  190. sage/combinat/root_system/type_affine.py +509 -0
  191. sage/combinat/root_system/type_dual.py +704 -0
  192. sage/combinat/root_system/type_folded.py +301 -0
  193. sage/combinat/root_system/type_marked.py +748 -0
  194. sage/combinat/root_system/type_reducible.py +601 -0
  195. sage/combinat/root_system/type_relabel.py +730 -0
  196. sage/combinat/root_system/type_super_A.py +837 -0
  197. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  198. sage/combinat/root_system/weight_space.py +639 -0
  199. sage/combinat/root_system/weyl_characters.py +2238 -0
  200. sage/crypto/__init__.py +4 -0
  201. sage/crypto/all.py +28 -0
  202. sage/crypto/block_cipher/all.py +7 -0
  203. sage/crypto/block_cipher/des.py +1065 -0
  204. sage/crypto/block_cipher/miniaes.py +2171 -0
  205. sage/crypto/block_cipher/present.py +909 -0
  206. sage/crypto/block_cipher/sdes.py +1527 -0
  207. sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
  208. sage/crypto/boolean_function.pxd +10 -0
  209. sage/crypto/boolean_function.pyx +1487 -0
  210. sage/crypto/cipher.py +78 -0
  211. sage/crypto/classical.py +3668 -0
  212. sage/crypto/classical_cipher.py +569 -0
  213. sage/crypto/cryptosystem.py +387 -0
  214. sage/crypto/key_exchange/all.py +7 -0
  215. sage/crypto/key_exchange/catalog.py +24 -0
  216. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  217. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  218. sage/crypto/lattice.py +312 -0
  219. sage/crypto/lfsr.py +295 -0
  220. sage/crypto/lwe.py +840 -0
  221. sage/crypto/mq/__init__.py +4 -0
  222. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  223. sage/crypto/mq/rijndael_gf.py +2345 -0
  224. sage/crypto/mq/sbox.py +7 -0
  225. sage/crypto/mq/sr.py +3344 -0
  226. sage/crypto/public_key/all.py +5 -0
  227. sage/crypto/public_key/blum_goldwasser.py +776 -0
  228. sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
  229. sage/crypto/sbox.pyx +2090 -0
  230. sage/crypto/sboxes.py +2090 -0
  231. sage/crypto/stream.py +390 -0
  232. sage/crypto/stream_cipher.py +297 -0
  233. sage/crypto/util.py +519 -0
  234. sage/ext/all__sagemath_modules.py +1 -0
  235. sage/ext/interpreters/__init__.py +1 -0
  236. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  237. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
  238. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  239. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  240. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
  241. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  242. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  243. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  245. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  246. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
  247. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  248. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  249. sage/geometry/all__sagemath_modules.py +5 -0
  250. sage/geometry/toric_lattice.py +1745 -0
  251. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
  252. sage/geometry/toric_lattice_element.pyx +432 -0
  253. sage/groups/abelian_gps/abelian_group.py +1925 -0
  254. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  255. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  256. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  257. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  258. sage/groups/abelian_gps/element_base.py +341 -0
  259. sage/groups/abelian_gps/values.py +488 -0
  260. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  261. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  262. sage/groups/additive_abelian/all.py +4 -0
  263. sage/groups/additive_abelian/qmodnz.py +231 -0
  264. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  265. sage/groups/affine_gps/affine_group.py +535 -0
  266. sage/groups/affine_gps/all.py +1 -0
  267. sage/groups/affine_gps/catalog.py +17 -0
  268. sage/groups/affine_gps/euclidean_group.py +246 -0
  269. sage/groups/affine_gps/group_element.py +562 -0
  270. sage/groups/all__sagemath_modules.py +12 -0
  271. sage/groups/galois_group.py +479 -0
  272. sage/groups/matrix_gps/all.py +4 -0
  273. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  274. sage/groups/matrix_gps/catalog.py +26 -0
  275. sage/groups/matrix_gps/coxeter_group.py +927 -0
  276. sage/groups/matrix_gps/finitely_generated.py +487 -0
  277. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
  278. sage/groups/matrix_gps/group_element.pxd +11 -0
  279. sage/groups/matrix_gps/group_element.pyx +431 -0
  280. sage/groups/matrix_gps/linear.py +440 -0
  281. sage/groups/matrix_gps/matrix_group.py +617 -0
  282. sage/groups/matrix_gps/named_group.py +296 -0
  283. sage/groups/matrix_gps/orthogonal.py +544 -0
  284. sage/groups/matrix_gps/symplectic.py +251 -0
  285. sage/groups/matrix_gps/unitary.py +436 -0
  286. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  287. sage/groups/misc_gps/argument_groups.py +1905 -0
  288. sage/groups/misc_gps/imaginary_groups.py +479 -0
  289. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  293. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  296. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  297. sage/homology/algebraic_topological_model.py +595 -0
  298. sage/homology/all.py +2 -0
  299. sage/homology/all__sagemath_modules.py +8 -0
  300. sage/homology/chain_complex.py +2148 -0
  301. sage/homology/chain_complex_homspace.py +165 -0
  302. sage/homology/chain_complex_morphism.py +629 -0
  303. sage/homology/chain_homotopy.py +604 -0
  304. sage/homology/chains.py +653 -0
  305. sage/homology/free_resolution.py +923 -0
  306. sage/homology/graded_resolution.py +567 -0
  307. sage/homology/hochschild_complex.py +756 -0
  308. sage/homology/homology_group.py +188 -0
  309. sage/homology/homology_morphism.py +422 -0
  310. sage/homology/homology_vector_space_with_basis.py +1454 -0
  311. sage/homology/koszul_complex.py +169 -0
  312. sage/homology/matrix_utils.py +205 -0
  313. sage/libs/all__sagemath_modules.py +1 -0
  314. sage/libs/gsl/__init__.py +1 -0
  315. sage/libs/gsl/airy.pxd +56 -0
  316. sage/libs/gsl/all.pxd +66 -0
  317. sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
  318. sage/libs/gsl/array.pxd +5 -0
  319. sage/libs/gsl/array.pyx +102 -0
  320. sage/libs/gsl/bessel.pxd +208 -0
  321. sage/libs/gsl/blas.pxd +116 -0
  322. sage/libs/gsl/blas_types.pxd +34 -0
  323. sage/libs/gsl/block.pxd +52 -0
  324. sage/libs/gsl/chebyshev.pxd +37 -0
  325. sage/libs/gsl/clausen.pxd +12 -0
  326. sage/libs/gsl/combination.pxd +47 -0
  327. sage/libs/gsl/complex.pxd +151 -0
  328. sage/libs/gsl/coulomb.pxd +30 -0
  329. sage/libs/gsl/coupling.pxd +21 -0
  330. sage/libs/gsl/dawson.pxd +12 -0
  331. sage/libs/gsl/debye.pxd +24 -0
  332. sage/libs/gsl/dilog.pxd +14 -0
  333. sage/libs/gsl/eigen.pxd +46 -0
  334. sage/libs/gsl/elementary.pxd +12 -0
  335. sage/libs/gsl/ellint.pxd +48 -0
  336. sage/libs/gsl/elljac.pxd +8 -0
  337. sage/libs/gsl/erf.pxd +32 -0
  338. sage/libs/gsl/errno.pxd +26 -0
  339. sage/libs/gsl/exp.pxd +44 -0
  340. sage/libs/gsl/expint.pxd +44 -0
  341. sage/libs/gsl/fermi_dirac.pxd +44 -0
  342. sage/libs/gsl/fft.pxd +121 -0
  343. sage/libs/gsl/fit.pxd +50 -0
  344. sage/libs/gsl/gamma.pxd +94 -0
  345. sage/libs/gsl/gegenbauer.pxd +26 -0
  346. sage/libs/gsl/histogram.pxd +176 -0
  347. sage/libs/gsl/hyperg.pxd +52 -0
  348. sage/libs/gsl/integration.pxd +69 -0
  349. sage/libs/gsl/interp.pxd +109 -0
  350. sage/libs/gsl/laguerre.pxd +24 -0
  351. sage/libs/gsl/lambert.pxd +16 -0
  352. sage/libs/gsl/legendre.pxd +90 -0
  353. sage/libs/gsl/linalg.pxd +185 -0
  354. sage/libs/gsl/log.pxd +26 -0
  355. sage/libs/gsl/math.pxd +43 -0
  356. sage/libs/gsl/matrix.pxd +143 -0
  357. sage/libs/gsl/matrix_complex.pxd +130 -0
  358. sage/libs/gsl/min.pxd +67 -0
  359. sage/libs/gsl/monte.pxd +56 -0
  360. sage/libs/gsl/ntuple.pxd +32 -0
  361. sage/libs/gsl/odeiv.pxd +70 -0
  362. sage/libs/gsl/permutation.pxd +78 -0
  363. sage/libs/gsl/poly.pxd +40 -0
  364. sage/libs/gsl/pow_int.pxd +12 -0
  365. sage/libs/gsl/psi.pxd +28 -0
  366. sage/libs/gsl/qrng.pxd +29 -0
  367. sage/libs/gsl/random.pxd +257 -0
  368. sage/libs/gsl/rng.pxd +100 -0
  369. sage/libs/gsl/roots.pxd +72 -0
  370. sage/libs/gsl/sort.pxd +36 -0
  371. sage/libs/gsl/statistics.pxd +59 -0
  372. sage/libs/gsl/sum.pxd +55 -0
  373. sage/libs/gsl/synchrotron.pxd +16 -0
  374. sage/libs/gsl/transport.pxd +24 -0
  375. sage/libs/gsl/trig.pxd +58 -0
  376. sage/libs/gsl/types.pxd +137 -0
  377. sage/libs/gsl/vector.pxd +101 -0
  378. sage/libs/gsl/vector_complex.pxd +83 -0
  379. sage/libs/gsl/wavelet.pxd +49 -0
  380. sage/libs/gsl/zeta.pxd +28 -0
  381. sage/libs/mpc/__init__.pxd +114 -0
  382. sage/libs/mpc/types.pxd +28 -0
  383. sage/libs/mpfr/__init__.pxd +299 -0
  384. sage/libs/mpfr/types.pxd +26 -0
  385. sage/libs/mpmath/__init__.py +1 -0
  386. sage/libs/mpmath/all.py +27 -0
  387. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  388. sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
  389. sage/libs/mpmath/utils.pxd +4 -0
  390. sage/libs/mpmath/utils.pyx +319 -0
  391. sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
  392. sage/matrix/action.pxd +26 -0
  393. sage/matrix/action.pyx +596 -0
  394. sage/matrix/all.py +9 -0
  395. sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
  396. sage/matrix/args.pxd +144 -0
  397. sage/matrix/args.pyx +1668 -0
  398. sage/matrix/benchmark.py +1258 -0
  399. sage/matrix/berlekamp_massey.py +95 -0
  400. sage/matrix/compute_J_ideal.py +926 -0
  401. sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
  402. sage/matrix/constructor.pyx +750 -0
  403. sage/matrix/docs.py +430 -0
  404. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  405. sage/matrix/echelon_matrix.pyx +155 -0
  406. sage/matrix/matrix.pxd +2 -0
  407. sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
  408. sage/matrix/matrix0.pxd +68 -0
  409. sage/matrix/matrix0.pyx +6324 -0
  410. sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
  411. sage/matrix/matrix1.pxd +8 -0
  412. sage/matrix/matrix1.pyx +2851 -0
  413. sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
  414. sage/matrix/matrix2.pxd +25 -0
  415. sage/matrix/matrix2.pyx +20181 -0
  416. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
  417. sage/matrix/matrix_cdv.pxd +4 -0
  418. sage/matrix/matrix_cdv.pyx +93 -0
  419. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  420. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  421. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  422. sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
  423. sage/matrix/matrix_dense.pxd +5 -0
  424. sage/matrix/matrix_dense.pyx +343 -0
  425. sage/matrix/matrix_domain_dense.pxd +5 -0
  426. sage/matrix/matrix_domain_sparse.pxd +5 -0
  427. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  428. sage/matrix/matrix_double_dense.pxd +7 -0
  429. sage/matrix/matrix_double_dense.pyx +3906 -0
  430. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  431. sage/matrix/matrix_double_sparse.pxd +6 -0
  432. sage/matrix/matrix_double_sparse.pyx +248 -0
  433. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
  434. sage/matrix/matrix_generic_dense.pxd +7 -0
  435. sage/matrix/matrix_generic_dense.pyx +354 -0
  436. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  437. sage/matrix/matrix_generic_sparse.pxd +7 -0
  438. sage/matrix/matrix_generic_sparse.pyx +461 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  441. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  442. sage/matrix/matrix_misc.py +313 -0
  443. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  444. sage/matrix/matrix_numpy_dense.pxd +14 -0
  445. sage/matrix/matrix_numpy_dense.pyx +450 -0
  446. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  447. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  448. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  449. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  450. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  451. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  452. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  453. sage/matrix/matrix_real_double_dense.pxd +7 -0
  454. sage/matrix/matrix_real_double_dense.pyx +122 -0
  455. sage/matrix/matrix_space.py +2848 -0
  456. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  457. sage/matrix/matrix_sparse.pxd +5 -0
  458. sage/matrix/matrix_sparse.pyx +1222 -0
  459. sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
  460. sage/matrix/matrix_window.pxd +37 -0
  461. sage/matrix/matrix_window.pyx +242 -0
  462. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  463. sage/matrix/misc_mpfr.pyx +80 -0
  464. sage/matrix/operation_table.py +1182 -0
  465. sage/matrix/special.py +3666 -0
  466. sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
  467. sage/matrix/strassen.pyx +851 -0
  468. sage/matrix/symplectic_basis.py +541 -0
  469. sage/matrix/template.pxd +6 -0
  470. sage/matrix/tests.py +71 -0
  471. sage/matroids/advanced.py +77 -0
  472. sage/matroids/all.py +13 -0
  473. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  474. sage/matroids/basis_exchange_matroid.pxd +96 -0
  475. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  476. sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  477. sage/matroids/basis_matroid.pxd +45 -0
  478. sage/matroids/basis_matroid.pyx +1217 -0
  479. sage/matroids/catalog.py +44 -0
  480. sage/matroids/chow_ring.py +473 -0
  481. sage/matroids/chow_ring_ideal.py +849 -0
  482. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  483. sage/matroids/circuit_closures_matroid.pxd +16 -0
  484. sage/matroids/circuit_closures_matroid.pyx +559 -0
  485. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  486. sage/matroids/circuits_matroid.pxd +38 -0
  487. sage/matroids/circuits_matroid.pyx +947 -0
  488. sage/matroids/constructor.py +1086 -0
  489. sage/matroids/database_collections.py +365 -0
  490. sage/matroids/database_matroids.py +5338 -0
  491. sage/matroids/dual_matroid.py +583 -0
  492. sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
  493. sage/matroids/extension.pxd +34 -0
  494. sage/matroids/extension.pyx +519 -0
  495. sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  496. sage/matroids/flats_matroid.pxd +28 -0
  497. sage/matroids/flats_matroid.pyx +715 -0
  498. sage/matroids/gammoid.py +600 -0
  499. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  500. sage/matroids/graphic_matroid.pxd +39 -0
  501. sage/matroids/graphic_matroid.pyx +2024 -0
  502. sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  503. sage/matroids/lean_matrix.pxd +126 -0
  504. sage/matroids/lean_matrix.pyx +3667 -0
  505. sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  506. sage/matroids/linear_matroid.pxd +180 -0
  507. sage/matroids/linear_matroid.pyx +6649 -0
  508. sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
  509. sage/matroids/matroid.pxd +243 -0
  510. sage/matroids/matroid.pyx +8759 -0
  511. sage/matroids/matroids_catalog.py +190 -0
  512. sage/matroids/matroids_plot_helpers.py +890 -0
  513. sage/matroids/minor_matroid.py +480 -0
  514. sage/matroids/minorfix.h +9 -0
  515. sage/matroids/named_matroids.py +5 -0
  516. sage/matroids/rank_matroid.py +268 -0
  517. sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
  518. sage/matroids/set_system.pxd +38 -0
  519. sage/matroids/set_system.pyx +800 -0
  520. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  521. sage/matroids/transversal_matroid.pxd +14 -0
  522. sage/matroids/transversal_matroid.pyx +893 -0
  523. sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  524. sage/matroids/union_matroid.pxd +20 -0
  525. sage/matroids/union_matroid.pyx +331 -0
  526. sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
  527. sage/matroids/unpickling.pyx +843 -0
  528. sage/matroids/utilities.py +809 -0
  529. sage/misc/all__sagemath_modules.py +20 -0
  530. sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
  531. sage/misc/c3.pyx +238 -0
  532. sage/misc/compat.py +87 -0
  533. sage/misc/element_with_label.py +173 -0
  534. sage/misc/func_persist.py +79 -0
  535. sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
  536. sage/misc/pickle_old.pyx +19 -0
  537. sage/misc/proof.py +7 -0
  538. sage/misc/replace_dot_all.py +472 -0
  539. sage/misc/sagedoc_conf.py +168 -0
  540. sage/misc/sphinxify.py +167 -0
  541. sage/misc/test_class_pickling.py +85 -0
  542. sage/modules/all.py +42 -0
  543. sage/modules/complex_double_vector.py +25 -0
  544. sage/modules/diamond_cutting.py +380 -0
  545. sage/modules/fg_pid/all.py +1 -0
  546. sage/modules/fg_pid/fgp_element.py +456 -0
  547. sage/modules/fg_pid/fgp_module.py +2091 -0
  548. sage/modules/fg_pid/fgp_morphism.py +550 -0
  549. sage/modules/filtered_vector_space.py +1271 -0
  550. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
  551. sage/modules/finite_submodule_iter.pxd +27 -0
  552. sage/modules/finite_submodule_iter.pyx +452 -0
  553. sage/modules/fp_graded/all.py +1 -0
  554. sage/modules/fp_graded/element.py +346 -0
  555. sage/modules/fp_graded/free_element.py +298 -0
  556. sage/modules/fp_graded/free_homspace.py +53 -0
  557. sage/modules/fp_graded/free_module.py +1060 -0
  558. sage/modules/fp_graded/free_morphism.py +217 -0
  559. sage/modules/fp_graded/homspace.py +563 -0
  560. sage/modules/fp_graded/module.py +1340 -0
  561. sage/modules/fp_graded/morphism.py +1990 -0
  562. sage/modules/fp_graded/steenrod/all.py +1 -0
  563. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  564. sage/modules/fp_graded/steenrod/module.py +477 -0
  565. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  566. sage/modules/fp_graded/steenrod/profile.py +241 -0
  567. sage/modules/free_module.py +8447 -0
  568. sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
  569. sage/modules/free_module_element.pxd +22 -0
  570. sage/modules/free_module_element.pyx +5445 -0
  571. sage/modules/free_module_homspace.py +369 -0
  572. sage/modules/free_module_integer.py +896 -0
  573. sage/modules/free_module_morphism.py +823 -0
  574. sage/modules/free_module_pseudohomspace.py +352 -0
  575. sage/modules/free_module_pseudomorphism.py +578 -0
  576. sage/modules/free_quadratic_module.py +1706 -0
  577. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  578. sage/modules/matrix_morphism.py +1745 -0
  579. sage/modules/misc.py +103 -0
  580. sage/modules/module_functors.py +192 -0
  581. sage/modules/multi_filtered_vector_space.py +719 -0
  582. sage/modules/ore_module.py +2208 -0
  583. sage/modules/ore_module_element.py +178 -0
  584. sage/modules/ore_module_homspace.py +147 -0
  585. sage/modules/ore_module_morphism.py +968 -0
  586. sage/modules/quotient_module.py +699 -0
  587. sage/modules/real_double_vector.py +22 -0
  588. sage/modules/submodule.py +255 -0
  589. sage/modules/tensor_operations.py +567 -0
  590. sage/modules/torsion_quadratic_module.py +1352 -0
  591. sage/modules/tutorial_free_modules.py +248 -0
  592. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  593. sage/modules/vector_complex_double_dense.pxd +6 -0
  594. sage/modules/vector_complex_double_dense.pyx +117 -0
  595. sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  596. sage/modules/vector_double_dense.pxd +6 -0
  597. sage/modules/vector_double_dense.pyx +604 -0
  598. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  599. sage/modules/vector_integer_dense.pxd +15 -0
  600. sage/modules/vector_integer_dense.pyx +361 -0
  601. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  602. sage/modules/vector_integer_sparse.pxd +29 -0
  603. sage/modules/vector_integer_sparse.pyx +406 -0
  604. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
  605. sage/modules/vector_modn_dense.pxd +12 -0
  606. sage/modules/vector_modn_dense.pyx +394 -0
  607. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  608. sage/modules/vector_modn_sparse.pxd +21 -0
  609. sage/modules/vector_modn_sparse.pyx +298 -0
  610. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  611. sage/modules/vector_numpy_dense.pxd +15 -0
  612. sage/modules/vector_numpy_dense.pyx +304 -0
  613. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  614. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  615. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  616. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
  617. sage/modules/vector_rational_dense.pxd +15 -0
  618. sage/modules/vector_rational_dense.pyx +387 -0
  619. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  620. sage/modules/vector_rational_sparse.pxd +30 -0
  621. sage/modules/vector_rational_sparse.pyx +413 -0
  622. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  623. sage/modules/vector_real_double_dense.pxd +6 -0
  624. sage/modules/vector_real_double_dense.pyx +126 -0
  625. sage/modules/vector_space_homspace.py +430 -0
  626. sage/modules/vector_space_morphism.py +989 -0
  627. sage/modules/with_basis/all.py +15 -0
  628. sage/modules/with_basis/cell_module.py +494 -0
  629. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
  630. sage/modules/with_basis/indexed_element.pxd +13 -0
  631. sage/modules/with_basis/indexed_element.pyx +1058 -0
  632. sage/modules/with_basis/invariant.py +1075 -0
  633. sage/modules/with_basis/morphism.py +1636 -0
  634. sage/modules/with_basis/representation.py +2939 -0
  635. sage/modules/with_basis/subquotient.py +685 -0
  636. sage/numerical/all__sagemath_modules.py +6 -0
  637. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
  638. sage/numerical/gauss_legendre.pyx +381 -0
  639. sage/numerical/optimize.py +910 -0
  640. sage/probability/all.py +10 -0
  641. sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
  642. sage/probability/probability_distribution.pyx +1242 -0
  643. sage/probability/random_variable.py +411 -0
  644. sage/quadratic_forms/all.py +4 -0
  645. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  646. sage/quadratic_forms/binary_qf.py +2042 -0
  647. sage/quadratic_forms/bqf_class_group.py +748 -0
  648. sage/quadratic_forms/constructions.py +93 -0
  649. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
  650. sage/quadratic_forms/count_local_2.pyx +365 -0
  651. sage/quadratic_forms/extras.py +195 -0
  652. sage/quadratic_forms/quadratic_form.py +1753 -0
  653. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  654. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
  656. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  657. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  658. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  659. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  660. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  661. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  662. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  663. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  664. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  665. sage/quadratic_forms/random_quadraticform.py +209 -0
  666. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
  667. sage/quadratic_forms/ternary.pyx +1154 -0
  668. sage/quadratic_forms/ternary_qf.py +2027 -0
  669. sage/rings/all__sagemath_modules.py +28 -0
  670. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  671. sage/rings/asymptotic/misc.py +1252 -0
  672. sage/rings/cc.py +4 -0
  673. sage/rings/cfinite_sequence.py +1306 -0
  674. sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  675. sage/rings/complex_conversion.pxd +8 -0
  676. sage/rings/complex_conversion.pyx +23 -0
  677. sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
  678. sage/rings/complex_double.pxd +21 -0
  679. sage/rings/complex_double.pyx +2654 -0
  680. sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
  681. sage/rings/complex_mpc.pxd +21 -0
  682. sage/rings/complex_mpc.pyx +2576 -0
  683. sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  684. sage/rings/complex_mpfr.pxd +18 -0
  685. sage/rings/complex_mpfr.pyx +3602 -0
  686. sage/rings/derivation.py +2334 -0
  687. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  688. sage/rings/finite_rings/maps_finite_field.py +191 -0
  689. sage/rings/function_field/all__sagemath_modules.py +8 -0
  690. sage/rings/function_field/derivations.py +102 -0
  691. sage/rings/function_field/derivations_rational.py +132 -0
  692. sage/rings/function_field/differential.py +853 -0
  693. sage/rings/function_field/divisor.py +1107 -0
  694. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  695. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  696. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  697. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  698. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  699. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  700. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  701. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  702. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  703. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
  704. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  705. sage/rings/invariants/all.py +4 -0
  706. sage/rings/invariants/invariant_theory.py +4597 -0
  707. sage/rings/invariants/reconstruction.py +395 -0
  708. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  709. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  712. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  713. sage/rings/polynomial/ore_function_element.py +952 -0
  714. sage/rings/polynomial/ore_function_field.py +1028 -0
  715. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  716. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  717. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  718. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
  720. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  721. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  722. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  723. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  724. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  727. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  730. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  731. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  732. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
  733. sage/rings/real_double_element_gsl.pxd +8 -0
  734. sage/rings/real_double_element_gsl.pyx +794 -0
  735. sage/rings/real_field.py +58 -0
  736. sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  737. sage/rings/real_mpfr.pxd +29 -0
  738. sage/rings/real_mpfr.pyx +6122 -0
  739. sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
  740. sage/rings/ring_extension.pxd +42 -0
  741. sage/rings/ring_extension.pyx +2779 -0
  742. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  743. sage/rings/ring_extension_conversion.pxd +16 -0
  744. sage/rings/ring_extension_conversion.pyx +462 -0
  745. sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
  746. sage/rings/ring_extension_element.pxd +21 -0
  747. sage/rings/ring_extension_element.pyx +1635 -0
  748. sage/rings/ring_extension_homset.py +64 -0
  749. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
  750. sage/rings/ring_extension_morphism.pxd +35 -0
  751. sage/rings/ring_extension_morphism.pyx +920 -0
  752. sage/schemes/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/all__sagemath_modules.py +1 -0
  754. sage/schemes/projective/coherent_sheaf.py +300 -0
  755. sage/schemes/projective/cohomology.py +510 -0
  756. sage/stats/all.py +15 -0
  757. sage/stats/basic_stats.py +489 -0
  758. sage/stats/distributions/all.py +7 -0
  759. sage/stats/distributions/catalog.py +34 -0
  760. sage/stats/distributions/dgs.h +50 -0
  761. sage/stats/distributions/dgs.pxd +111 -0
  762. sage/stats/distributions/dgs_bern.h +400 -0
  763. sage/stats/distributions/dgs_gauss.h +614 -0
  764. sage/stats/distributions/dgs_misc.h +104 -0
  765. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  767. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  768. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  769. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  770. sage/stats/hmm/all.py +15 -0
  771. sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
  772. sage/stats/hmm/chmm.pyx +1595 -0
  773. sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
  774. sage/stats/hmm/distributions.pxd +29 -0
  775. sage/stats/hmm/distributions.pyx +531 -0
  776. sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
  777. sage/stats/hmm/hmm.pxd +17 -0
  778. sage/stats/hmm/hmm.pyx +1388 -0
  779. sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
  780. sage/stats/hmm/util.pxd +7 -0
  781. sage/stats/hmm/util.pyx +165 -0
  782. sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
  783. sage/stats/intlist.pxd +14 -0
  784. sage/stats/intlist.pyx +588 -0
  785. sage/stats/r.py +49 -0
  786. sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
  787. sage/stats/time_series.pxd +6 -0
  788. sage/stats/time_series.pyx +2546 -0
  789. sage/tensor/all.py +2 -0
  790. sage/tensor/modules/all.py +8 -0
  791. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  792. sage/tensor/modules/comp.py +5598 -0
  793. sage/tensor/modules/ext_pow_free_module.py +824 -0
  794. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  795. sage/tensor/modules/format_utilities.py +333 -0
  796. sage/tensor/modules/free_module_alt_form.py +858 -0
  797. sage/tensor/modules/free_module_automorphism.py +1207 -0
  798. sage/tensor/modules/free_module_basis.py +1074 -0
  799. sage/tensor/modules/free_module_element.py +284 -0
  800. sage/tensor/modules/free_module_homset.py +652 -0
  801. sage/tensor/modules/free_module_linear_group.py +564 -0
  802. sage/tensor/modules/free_module_morphism.py +1581 -0
  803. sage/tensor/modules/free_module_tensor.py +3289 -0
  804. sage/tensor/modules/reflexive_module.py +386 -0
  805. sage/tensor/modules/tensor_free_module.py +780 -0
  806. sage/tensor/modules/tensor_free_submodule.py +538 -0
  807. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  808. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1093 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.combinat sage.rings.finite_rings
3
+ r"""
4
+ Univariate dense skew polynomials over finite fields
5
+
6
+ This module provides the
7
+ class:`~sage.rings.polynomial.skew_polynomial_finite_field.SkewPolynomial_finite_field_dense`,
8
+ which constructs a single univariate skew polynomial over a finite field
9
+ equipped with the Frobenius endomorphism. Among other things, it implements
10
+ the fast factorization algorithm designed in [CL2017]_.
11
+
12
+ AUTHOR::
13
+
14
+ - Xavier Caruso (2012-06-29): initial version
15
+
16
+ - Arpit Merchant (2016-08-04): improved docstrings, fixed doctests and
17
+ refactored classes and methods
18
+ """
19
+
20
+ # ***************************************************************************
21
+ # Copyright (C) 2012 Xavier Caruso <xavier.caruso@normalesup.org>
22
+ #
23
+ # This program is free software: you can redistribute it and/or modify
24
+ # it under the terms of the GNU General Public License as published by
25
+ # the Free Software Foundation, either version 2 of the License, or
26
+ # (at your option) any later version.
27
+ # https://www.gnu.org/licenses/
28
+ #****************************************************************************
29
+
30
+ from sage.structure.element cimport parent
31
+ from sage.rings.integer_ring import ZZ
32
+ from sage.rings.integer cimport Integer
33
+ from sage.matrix.matrix_space import MatrixSpace
34
+ from sage.matrix.matrix2 import NotFullRankError
35
+
36
+ from sage.rings.polynomial.polynomial_element cimport Polynomial
37
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
38
+ from sage.rings.polynomial.skew_polynomial_finite_order cimport SkewPolynomial_finite_order_dense
39
+
40
+ from sage.structure.factorization import Factorization
41
+ from sage.misc.mrange import xmrange_iter
42
+ from sage.misc.prandom import sample
43
+ from sage.arith.misc import factorial
44
+ from sage.combinat.q_analogues import q_jordan
45
+
46
+
47
+ cdef class SkewPolynomial_finite_field_dense(SkewPolynomial_finite_order_dense):
48
+ cdef inline _reduced_norm_factored(self):
49
+ """
50
+ Return the reduced norm of this polynomial factorized in the center.
51
+ """
52
+ if self._norm_factor is None:
53
+ N = self._parent._working_center(self.reduced_norm(var=False))
54
+ self._norm_factor = N.factor()
55
+ return self._norm_factor
56
+
57
+ def is_irreducible(self):
58
+ r"""
59
+ Return ``True`` if this skew polynomial is irreducible.
60
+
61
+ EXAMPLES::
62
+
63
+ sage: k.<t> = GF(5^3)
64
+ sage: Frob = k.frobenius_endomorphism()
65
+ sage: S.<x> = k['x',Frob]
66
+
67
+ sage: a = x^2 + t*x + 1
68
+ sage: a.is_irreducible()
69
+ False
70
+ sage: a.factor()
71
+ (x + 4*t^2 + 4*t + 1) * (x + 3*t + 2)
72
+
73
+ sage: a = x^2 + t*x + t + 1
74
+ sage: a.is_irreducible()
75
+ True
76
+ sage: a.factor()
77
+ x^2 + t*x + t + 1
78
+
79
+ Skew polynomials of degree `1` are of course irreducible::
80
+
81
+ sage: a = x + t
82
+ sage: a.is_irreducible()
83
+ True
84
+
85
+ A random irreducible skew polynomial is irreducible::
86
+
87
+ sage: a = S.random_irreducible(degree=4,monic=True); a # random
88
+ x^4 + (t + 1)*x^3 + (3*t^2 + 2*t + 3)*x^2 + 3*t*x + 3*t
89
+ sage: a.is_irreducible()
90
+ True
91
+
92
+ By convention, constant skew polynomials are not irreducible::
93
+
94
+ sage: S(1).is_irreducible()
95
+ False
96
+ sage: S(0).is_irreducible()
97
+ False
98
+ """
99
+ if self._norm_factor is not None:
100
+ return len(self._norm_factor) == 1 and self._norm_factor[0][1] == 1
101
+ N = self._parent._working_center(self.reduced_norm(var=False))
102
+ return N.is_irreducible()
103
+
104
+ def type(self, N):
105
+ r"""
106
+ Return the `N`-type of this skew polynomial (see definition below).
107
+
108
+ INPUT:
109
+
110
+ - ``N`` -- an irreducible polynomial in the
111
+ center of the underlying skew polynomial ring
112
+
113
+ .. NOTE::
114
+
115
+ The result is cached.
116
+
117
+ DEFINITION:
118
+
119
+ The `N`-type of a skew polynomial `a` is the Partition
120
+ `(t_0, t_1, t_2, \ldots)` defined by
121
+
122
+ .. MATH::
123
+
124
+ t_0 + \cdots + t_i = \frac{\deg gcd(a,N^i)}{\deg N},
125
+
126
+ where `\deg N` is the degree of `N` considered as an
127
+ element in the center.
128
+
129
+ This notion has an important mathematical interest because
130
+ it corresponds to the Jordan type of the `N`-typical part
131
+ of the associated Galois representation.
132
+
133
+ EXAMPLES::
134
+
135
+ sage: k.<t> = GF(5^3)
136
+ sage: Frob = k.frobenius_endomorphism()
137
+ sage: S.<x> = k['x',Frob]
138
+ sage: Z = S.center(); x3 = Z.gen()
139
+
140
+ sage: a = x^4 + x^3 + (4*t^2 + 4)*x^2 + (t^2 + 2)*x + 4*t^2
141
+ sage: N = x3^2 + x3 + 1
142
+ sage: a.type(N)
143
+ [1]
144
+ sage: N = x3 + 1
145
+ sage: a.type(N)
146
+ [2]
147
+
148
+ sage: a = x^3 + (3*t^2 + 1)*x^2 + (3*t^2 + t + 1)*x + t + 1
149
+ sage: N = x3 + 1
150
+ sage: a.type(N)
151
+ [2, 1]
152
+
153
+ If `N` does not divide the reduced map of `a`, the type
154
+ is empty::
155
+
156
+ sage: N = x3 + 2
157
+ sage: a.type(N)
158
+ []
159
+
160
+ If `a = N`, the type is just `[r]` where `r` is the order
161
+ of the twisting morphism ``Frob``::
162
+
163
+ sage: N = x3^2 + x3 + 1
164
+ sage: S(N).type(N)
165
+ [3]
166
+
167
+ `N` must be irreducible::
168
+
169
+ sage: N = (x3 + 1) * (x3 + 2)
170
+ sage: a.type(N)
171
+ Traceback (most recent call last):
172
+ ...
173
+ ValueError: N is not irreducible
174
+ """
175
+ cdef SkewPolynomial_finite_field_dense P, d, NS
176
+ cdef Py_ssize_t deg, degN, m
177
+ cdef list type
178
+ skew_ring = self._parent
179
+ if parent(N) is not skew_ring._working_center:
180
+ N = skew_ring._working_center(N)
181
+ if self._types is None:
182
+ self._types = dict()
183
+ elif N in self._types:
184
+ return self._types[N]
185
+ if not N.is_irreducible():
186
+ raise ValueError("N is not irreducible")
187
+ if self._norm_factor is None:
188
+ m = -1
189
+ else:
190
+ for n, m in self._norm_factor:
191
+ if n == N:
192
+ break
193
+ NS = skew_ring(N)
194
+ type = [ ]
195
+ degN = N.degree()
196
+ P = self
197
+ d = P.right_gcd(NS)
198
+ deg = d.degree() // degN
199
+ while deg > 0:
200
+ if m >= 0:
201
+ if deg == 1:
202
+ type += m * [1]
203
+ break
204
+ m -= deg
205
+ P = P // d
206
+ type.append(deg)
207
+ d = P.right_gcd(NS)
208
+ deg = d.degree() // degN
209
+ self._types[N] = type
210
+ return type
211
+
212
+ # Finding divisors
213
+ # ----------------
214
+
215
+ cdef SkewPolynomial_finite_field_dense _rdivisor_c(self, N):
216
+ r"""
217
+ Return a right divisor of this skew polynomial whose
218
+ reduced norm is `N`.
219
+
220
+ .. WARNING::
221
+
222
+ `N` needs to be an irreducible factor of the
223
+ reduced norm. This function does not check
224
+ this (and his behaviour is not defined if the
225
+ require property doesn't hold).
226
+ """
227
+ cdef skew_ring = self._parent
228
+ cdef SkewPolynomial_finite_field_dense NS = <SkewPolynomial_finite_field_dense>skew_ring(N)
229
+ cdef SkewPolynomial_finite_field_dense P = self.right_gcd(NS)
230
+ cdef Py_ssize_t d = N.degree()
231
+ cdef Py_ssize_t e = P.degree() // d
232
+ if e == 1:
233
+ return P.right_monic()
234
+
235
+ cdef SkewPolynomial_finite_field_dense D
236
+ cdef SkewPolynomial_finite_field_dense Q = <SkewPolynomial_finite_field_dense>(NS // P)
237
+ cdef SkewPolynomial_finite_field_dense R, X
238
+ cdef Py_ssize_t i, j, t, r = skew_ring._order
239
+ cdef Polynomial dd, xx, yy, zz
240
+ cdef Integer exp
241
+ cdef list lM
242
+ cdef bint char2
243
+
244
+ center = parent(N)
245
+ E = center.quo(N)
246
+ PE = PolynomialRing(E, name='T')
247
+ char2 = skew_ring.characteristic() != 2
248
+ if not char2:
249
+ exp = <Integer>((E.cardinality()-1) // 2)
250
+ while True:
251
+ R = <SkewPolynomial_finite_field_dense>skew_ring.random_element((e*r-1, e*r-1))
252
+ R = Q*R
253
+ X = <SkewPolynomial_finite_field_dense>Q._new_c(list(Q._coeffs), Q._parent)
254
+ lM = [ None ] * (e**2)
255
+ for j in range(e):
256
+ for i in range(e):
257
+ coeffs = [skew_ring._retraction(X[t*r+i]) for t in range(d)]
258
+ value = E(coeffs)
259
+ lM[i*e+j] = value
260
+ X = (R*X) % NS
261
+ M = MatrixSpace(E,e,e)(lM)
262
+ V = MatrixSpace(E,e,1)([ E([skew_ring._retraction(X[t*r+i]) for t in range(d)]) for i in range(e) ])
263
+ try:
264
+ W = M._solve_right_nonsingular_square(V)
265
+ except NotFullRankError:
266
+ skew_ring._new_retraction_map()
267
+ continue
268
+ xx = PE(<list>W.list() + [E(-1)])
269
+ if char2:
270
+ zz = yy = PE.gen()
271
+ for i in range(1,d):
272
+ zz = (zz*zz) % xx
273
+ yy += zz
274
+ dd = xx.gcd(yy)
275
+ if dd.degree() != 1:
276
+ continue
277
+ else:
278
+ yy = PE.gen().__pow__(exp,xx) - 1
279
+ dd = xx.gcd(yy)
280
+ if dd.degree() != 1:
281
+ yy += 2
282
+ dd = xx.gcd(yy)
283
+ if dd.degree() != 1:
284
+ continue
285
+ D = P.right_gcd(R + skew_ring(center((dd[0]/dd[1]).list())))
286
+ if D.degree() == 0:
287
+ continue
288
+ return D
289
+
290
+ def _reduced_norm_factor_uniform(self):
291
+ r"""
292
+ Return a factor of the reduced norm of this skew
293
+ polynomial, the probability of a given factor to
294
+ show up being proportional to the number of irreducible
295
+ divisors of ``self`` having this norm.
296
+
297
+ This method is an helper function; it is not supposed
298
+ to be called directly.
299
+
300
+ EXAMPLES::
301
+
302
+ sage: k.<a> = GF(5^3)
303
+ sage: Frob = k.frobenius_endomorphism()
304
+ sage: S.<x> = k['x', Frob]
305
+ sage: Z.<z> = S.center()
306
+
307
+ In the two examples below, the reduced norms of `P` and `Q`
308
+ have a unique factor::
309
+
310
+ sage: P = x + a
311
+ sage: P.reduced_norm().factor()
312
+ z + 2
313
+ sage: P._reduced_norm_factor_uniform()
314
+ z + 2
315
+
316
+ sage: Q = x^3 + 1
317
+ sage: Q.reduced_norm().factor()
318
+ (z + 1)^3
319
+ sage: Q._reduced_norm_factor_uniform()
320
+ z + 1
321
+
322
+ Now, we consider the product `R = P \cdot Q`; it admits `32`
323
+ irreducible divisors but among them, only one has norm `z + 2`,
324
+ the others having norm `z + 1`.
325
+ Therefore this method outputs `z + 2` with probability `1 / 32`
326
+ and `z + 1` with probability `31 / 32`::
327
+
328
+ sage: R = P*Q
329
+ sage: counts = { z+1: 0, z+2: 0 }
330
+ sage: for _ in range(1000):
331
+ ....: N = R._reduced_norm_factor_uniform()
332
+ ....: counts[N] += 1
333
+ sage: counts # random
334
+ {z + 1: 969, z + 2: 31}
335
+ """
336
+ skew_ring = self._parent
337
+ F = self._reduced_norm_factored()
338
+ center = F[0][0].parent()
339
+ cardcenter = center.base_ring().cardinality()
340
+ gencenter = center.gen()
341
+ count = [ ]
342
+ total = 0
343
+ for n, _ in F:
344
+ if n == gencenter:
345
+ total += 1
346
+ else:
347
+ degn = n.degree()
348
+ P = self.right_gcd(skew_ring(n))
349
+ m = P.degree() // degn
350
+ cardL = cardcenter**degn
351
+ total += (cardL**m - 1) / (cardL - 1)
352
+ count.append(total)
353
+ random = ZZ.random_element(total)
354
+ for i in range(len(F)):
355
+ if random < count[i]:
356
+ return F[i][0]
357
+
358
+ def _irreducible_divisors(self, bint right):
359
+ r"""
360
+ Return an iterator over all irreducible monic
361
+ divisors of this skew polynomial.
362
+
363
+ Do not use this function. Use instead
364
+ :meth:`right_irreducible_divisors` and
365
+ :meth:`left_irreducible_divisors`.
366
+
367
+ INPUT:
368
+
369
+ - ``right`` -- boolean; if ``True``, return right divisors,
370
+ otherwise, return left divisors
371
+
372
+ TESTS::
373
+
374
+ sage: k.<a> = GF(7^4)
375
+ sage: Frob = k.frobenius_endomorphism(2)
376
+ sage: S.<x> = k['x', Frob]
377
+
378
+ sage: P = S.random_element(degree=10)
379
+ sage: rightdiv = [ f for f in P.right_irreducible_divisors() ] # indirect doctest
380
+ sage: len(rightdiv) == P.count_irreducible_divisors()
381
+ True
382
+ sage: len(rightdiv) == Set(rightdiv).cardinality() # check no duplicates
383
+ True
384
+ sage: for D in rightdiv:
385
+ ....: assert P.is_right_divisible_by(D), "not right divisible"
386
+ ....: assert D.is_irreducible(), "not irreducible"
387
+
388
+ sage: P = S.random_element(degree=10)
389
+ sage: leftdiv = [ f for f in P.left_irreducible_divisors() ] # indirect doctest
390
+ sage: len(leftdiv) == P.count_irreducible_divisors()
391
+ True
392
+ sage: len(leftdiv) == Set(leftdiv).cardinality() # check no duplicates
393
+ True
394
+ sage: for D in leftdiv:
395
+ ....: assert P.is_left_divisible_by(D), "not left divisible"
396
+ ....: assert D.is_irreducible(), "not irreducible"
397
+ """
398
+ cdef SkewPolynomial_finite_field_dense NS, P, Q, R, P1, Q1, L, V, g, d
399
+ cdef Py_ssize_t i, m, degrandom
400
+ if not self:
401
+ return
402
+ if right:
403
+ quo_rem = SkewPolynomial_finite_field_dense.right_quo_rem
404
+ quo_rem2 = SkewPolynomial_finite_field_dense.left_quo_rem
405
+ gcd = SkewPolynomial_finite_field_dense.right_gcd
406
+ gcd2 = SkewPolynomial_finite_field_dense.left_gcd
407
+ mul = SkewPolynomial_finite_field_dense.__mul__ # why _mul_ doesn't work?
408
+ else:
409
+ quo_rem = SkewPolynomial_finite_field_dense.left_quo_rem
410
+ quo_rem2 = SkewPolynomial_finite_field_dense.right_quo_rem
411
+ gcd = SkewPolynomial_finite_field_dense.left_gcd
412
+ gcd2 = SkewPolynomial_finite_field_dense.right_gcd
413
+ mul = mul_op
414
+ skew_ring = self._parent
415
+ center = skew_ring._working_center
416
+ kfixed = center.base_ring()
417
+ F = self._reduced_norm_factored()
418
+ for N, _ in F:
419
+ if N == center.gen():
420
+ yield skew_ring.gen()
421
+ continue
422
+ degN = N.degree()
423
+ NS = skew_ring(N)
424
+ P = gcd(self, NS)
425
+ m = P.degree()/degN
426
+ if m == 1:
427
+ yield P
428
+ continue
429
+ Q,_ = quo_rem(NS, P)
430
+ if right:
431
+ P1 = self._rdivisor_c(N)
432
+ else:
433
+ D = self._rdivisor_c(N)
434
+ degrandom = NS.degree() - 1
435
+ while True:
436
+ P1 = P // P.right_gcd(NS // D)
437
+ if P1.degree() == degN:
438
+ break
439
+ while True:
440
+ R = skew_ring.random_element((degrandom,degrandom))
441
+ if NS.right_gcd(R) == 1:
442
+ break
443
+ D = NS.right_gcd(D*R)
444
+ Q1,_ = quo_rem(P, P1)
445
+ degrandom = P.degree() - 1
446
+ while True:
447
+ R = skew_ring.random_element((degrandom, degrandom))
448
+ _, g = quo_rem2(mul(R,Q), P)
449
+ if gcd2(g,P) != 1:
450
+ continue
451
+ L = Q1
452
+ V = L
453
+ for i in range(1,m):
454
+ L = gcd2(mul(g,L), P)
455
+ V = gcd2(V,L)
456
+ if V == 1:
457
+ break
458
+ rng = xmrange_iter([kfixed]*degN, center)
459
+ for i in range(m):
460
+ for pol in xmrange_iter([rng]*i):
461
+ f = skew_ring.one()
462
+ for j in range(i):
463
+ coeff = pol.pop()
464
+ _, f = quo_rem2(g*f + coeff, P)
465
+ d = gcd2(mul(f,Q1), P)
466
+ d, _ = quo_rem2(P, d)
467
+ yield d
468
+
469
+ def right_irreducible_divisor(self, uniform=False):
470
+ r"""
471
+ Return a right irreducible divisor of this skew polynomial.
472
+
473
+ INPUT:
474
+
475
+ - ``uniform`` -- boolean (default: ``False``); whether the
476
+ output irreducible divisor should be uniformly distributed
477
+ among all possibilities
478
+
479
+ EXAMPLES::
480
+
481
+ sage: k.<t> = GF(5^3)
482
+ sage: Frob = k.frobenius_endomorphism()
483
+ sage: S.<x> = k['x',Frob]
484
+ sage: a = x^6 + 3*t*x^5 + (3*t + 1)*x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + 2)*x + 4*t^2 + 3*t + 3
485
+
486
+ sage: dr = a.right_irreducible_divisor(); dr # random
487
+ x^3 + (2*t^2 + t + 4)*x^2 + (4*t + 1)*x + 4*t^2 + t + 1
488
+ sage: a.is_right_divisible_by(dr)
489
+ True
490
+
491
+ Right divisors are cached. Hence, if we ask again for a
492
+ right divisor, we will get the same answer::
493
+
494
+ sage: a.right_irreducible_divisor() # random
495
+ x^3 + (2*t^2 + t + 4)*x^2 + (4*t + 1)*x + 4*t^2 + t + 1
496
+
497
+ However the algorithm is probabilistic. Hence, if we first
498
+ reinitialize `a`, we may get a different answer::
499
+
500
+ sage: a = x^6 + 3*t*x^5 + (3*t + 1)*x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + 2)*x + 4*t^2 + 3*t + 3
501
+ sage: a.right_irreducible_divisor() # random
502
+ x^3 + (t^2 + 3*t + 4)*x^2 + (t + 2)*x + 4*t^2 + t + 1
503
+
504
+ We can also generate uniformly distributed irreducible monic
505
+ divisors as follows::
506
+
507
+ sage: a.right_irreducible_divisor(uniform=True) # random
508
+ x^3 + (4*t + 2)*x^2 + (2*t^2 + 2*t + 2)*x + 2*t^2 + 2
509
+ sage: a.right_irreducible_divisor(uniform=True) # random
510
+ x^3 + (t^2 + 2)*x^2 + (3*t^2 + 1)*x + 4*t^2 + 2*t
511
+ sage: a.right_irreducible_divisor(uniform=True) # random
512
+ x^3 + x^2 + (4*t^2 + 2*t + 4)*x + t^2 + 3
513
+
514
+ By convention, the zero skew polynomial has no irreducible
515
+ divisor::
516
+
517
+ sage: S(0).right_irreducible_divisor()
518
+ Traceback (most recent call last):
519
+ ...
520
+ ValueError: 0 has no irreducible divisor
521
+ """
522
+ if self.is_zero():
523
+ raise ValueError("0 has no irreducible divisor")
524
+ skew_ring = self._parent
525
+ if uniform:
526
+ N = self._reduced_norm_factor_uniform()
527
+ else:
528
+ N = self._reduced_norm_factored()[0][0]
529
+ NS = skew_ring(N)
530
+ degN = N.degree()
531
+ D = self._rdivisor_c(N)
532
+ if uniform:
533
+ P1 = self.right_gcd(NS)
534
+ if P1.degree() != degN:
535
+ Q1 = NS // P1
536
+ deg = P1.degree() - 1
537
+ while True:
538
+ R = Q1 * skew_ring.random_element((deg,deg))
539
+ if P1.right_gcd(R) == 1:
540
+ break
541
+ D = P1.right_gcd(D*R)
542
+ return D
543
+
544
+ def left_irreducible_divisor(self, uniform=False):
545
+ r"""
546
+ Return a left irreducible divisor of this skew polynomial.
547
+
548
+ INPUT:
549
+
550
+ - ``uniform`` -- boolean (default: ``False``); whether the
551
+ output irreducible divisor should be uniformly distributed
552
+ among all possibilities
553
+
554
+ EXAMPLES::
555
+
556
+ sage: k.<t> = GF(5^3)
557
+ sage: Frob = k.frobenius_endomorphism()
558
+ sage: S.<x> = k['x',Frob]
559
+ sage: a = x^6 + 3*t*x^5 + (3*t + 1)*x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + 2)*x + 4*t^2 + 3*t + 3
560
+ sage: dl = a.left_irreducible_divisor(); dl # random
561
+ x^3 + (t^2 + t + 2)*x^2 + (t + 2)*x + 3*t^2 + t + 4
562
+ sage: a.is_left_divisible_by(dl)
563
+ True
564
+
565
+ The algorithm is probabilistic. Hence, if we ask again for
566
+ a left irreducible divisor of `a`, we may get a different
567
+ answer::
568
+
569
+ sage: a.left_irreducible_divisor() # random
570
+ x^3 + (4*t + 3)*x^2 + (2*t^2 + 3*t + 4)*x + 4*t^2 + 2*t
571
+
572
+ We can also generate uniformly distributed irreducible monic
573
+ divisors as follows::
574
+
575
+ sage: a.left_irreducible_divisor(uniform=True) # random
576
+ x^3 + (4*t^2 + 3*t + 4)*x^2 + (t^2 + t + 3)*x + 2*t^2 + 3
577
+ sage: a.left_irreducible_divisor(uniform=True) # random
578
+ x^3 + (2*t^2 + t + 4)*x^2 + (2*t^2 + 4*t + 4)*x + 2*t + 3
579
+ sage: a.left_irreducible_divisor(uniform=True) # random
580
+ x^3 + (t^2 + t + 2)*x^2 + (3*t^2 + t)*x + 2*t + 1
581
+
582
+ By convention, the zero skew polynomial has no irreducible
583
+ divisor::
584
+
585
+ sage: S(0).left_irreducible_divisor()
586
+ Traceback (most recent call last):
587
+ ...
588
+ ValueError: 0 has no irreducible divisor
589
+ """
590
+ if self.is_zero():
591
+ raise ValueError("0 has no irreducible divisor")
592
+ if uniform:
593
+ N = self._reduced_norm_factor_uniform()
594
+ else:
595
+ N = self._reduced_norm_factored()[0][0]
596
+ skew_ring = self._parent
597
+ NS = skew_ring(N)
598
+ degN = N.degree()
599
+ D = self._rdivisor_c(N)
600
+ deg = NS.degree() - 1
601
+ P1 = self.left_gcd(NS)
602
+ if not uniform:
603
+ LD = P1 // P1.right_gcd(NS // D)
604
+ if LD.degree() == degN:
605
+ return LD
606
+ while True:
607
+ while True:
608
+ R = skew_ring.random_element((deg,deg))
609
+ if NS.right_gcd(R) == 1:
610
+ break
611
+ D = NS.right_gcd(D*R)
612
+ LD = P1 // P1.right_gcd(NS // D)
613
+ if LD.degree() == degN:
614
+ return LD
615
+
616
+ def right_irreducible_divisors(self):
617
+ r"""
618
+ Return an iterator over all irreducible monic right divisors
619
+ of this skew polynomial.
620
+
621
+ EXAMPLES::
622
+
623
+ sage: k.<t> = GF(5^3)
624
+ sage: Frob = k.frobenius_endomorphism()
625
+ sage: S.<x> = k['x',Frob]
626
+ sage: a = x^4 + 2*t*x^3 + 3*t^2*x^2 + (t^2 + t + 1)*x + 4*t + 3
627
+ sage: iter = a.right_irreducible_divisors(); iter
628
+ <...generator object at 0x...>
629
+ sage: next(iter) # random
630
+ x + 2*t^2 + 4*t + 4
631
+ sage: next(iter) # random
632
+ x + 3*t^2 + 4*t + 1
633
+
634
+ We can use this function to build the list of all monic
635
+ irreducible divisors of `a`::
636
+
637
+ sage: rightdiv = [ d for d in a.right_irreducible_divisors() ]
638
+
639
+ Note that the algorithm is probabilistic. As a consequence, if we
640
+ build again the list of right monic irreducible divisors of `a`, we
641
+ may get a different ordering::
642
+
643
+ sage: rightdiv2 = [ d for d in a.right_irreducible_divisors() ]
644
+ sage: rightdiv == rightdiv2
645
+ False
646
+ sage: Set(rightdiv) == Set(rightdiv2)
647
+ True
648
+ """
649
+ return self._irreducible_divisors(True)
650
+
651
+ def left_irreducible_divisors(self):
652
+ r"""
653
+ Return an iterator over all irreducible monic left divisors
654
+ of this skew polynomial.
655
+
656
+ EXAMPLES::
657
+
658
+ sage: k.<t> = GF(5^3)
659
+ sage: Frob = k.frobenius_endomorphism()
660
+ sage: S.<x> = k['x',Frob]
661
+ sage: a = x^4 + 2*t*x^3 + 3*t^2*x^2 + (t^2 + t + 1)*x + 4*t + 3
662
+ sage: iter = a.left_irreducible_divisors(); iter
663
+ <...generator object at 0x...>
664
+ sage: next(iter) # random
665
+ x + 3*t + 3
666
+ sage: next(iter) # random
667
+ x + 4*t + 2
668
+
669
+ We can use this function to build the list of all monic
670
+ irreducible divisors of `a`::
671
+
672
+ sage: leftdiv = [ d for d in a.left_irreducible_divisors() ]
673
+
674
+ Note that the algorithm is probabilistic. As a consequence, if we
675
+ build again the list of left monic irreducible divisors of `a`, we
676
+ may get a different ordering::
677
+
678
+ sage: leftdiv2 = [ d for d in a.left_irreducible_divisors() ]
679
+ sage: Set(leftdiv) == Set(leftdiv2)
680
+ True
681
+ """
682
+ return self._irreducible_divisors(False)
683
+
684
+ def count_irreducible_divisors(self):
685
+ r"""
686
+ Return the number of irreducible monic divisors of
687
+ this skew polynomial.
688
+
689
+ .. NOTE::
690
+
691
+ One can prove that there are always as many left
692
+ irreducible monic divisors as right irreducible
693
+ monic divisors.
694
+
695
+ EXAMPLES::
696
+
697
+ sage: k.<t> = GF(5^3)
698
+ sage: Frob = k.frobenius_endomorphism()
699
+ sage: S.<x> = k['x',Frob]
700
+
701
+ We illustrate that a skew polynomial may have a number of irreducible
702
+ divisors greater than its degree::
703
+
704
+ sage: a = x^4 + (4*t + 3)*x^3 + t^2*x^2 + (4*t^2 + 3*t)*x + 3*t
705
+ sage: a.count_irreducible_divisors()
706
+ 12
707
+
708
+ We illustrate that an irreducible polynomial in the center have
709
+ in general a lot of irreducible divisors in the skew polynomial
710
+ ring::
711
+
712
+ sage: Z.<x3> = S.center()
713
+ sage: N = x3^5 + 4*x3^4 + 4*x3^2 + 4*x3 + 3; N
714
+ x3^5 + 4*x3^4 + 4*x3^2 + 4*x3 + 3
715
+ sage: N.is_irreducible()
716
+ True
717
+ sage: S(N).count_irreducible_divisors()
718
+ 9768751
719
+ """
720
+ if self.is_zero():
721
+ return 0
722
+ skew_ring = self.parent()
723
+ cardcenter = skew_ring._working_center.base_ring().cardinality()
724
+ gencenter = skew_ring._working_center.gen()
725
+ F = self._reduced_norm_factored()
726
+ val = self.valuation()
727
+ self >>= val
728
+ count = 0
729
+ if val > 0:
730
+ count = 1
731
+ for N,_ in F:
732
+ if N == gencenter:
733
+ continue
734
+ degN = N.degree()
735
+ P = self.right_gcd(skew_ring(N))
736
+ m = P.degree() // degN
737
+ cardL = cardcenter**degN
738
+ count += (cardL**m - 1) // (cardL - 1)
739
+ return count
740
+
741
+ # Finding factorizations
742
+ # ----------------------
743
+
744
+ cdef _factor_c(self):
745
+ r"""
746
+ Compute a factorization of ``self``.
747
+
748
+ This is the low level implementation of :meth:`factor`.
749
+ """
750
+ cdef skew_ring = self._parent
751
+ cdef SkewPolynomial_finite_field_dense poly = self.right_monic()
752
+ cdef list a = poly._coeffs
753
+ cdef Py_ssize_t val = 0
754
+ while not a[0]:
755
+ del a[0]
756
+ val += 1
757
+
758
+ cdef Py_ssize_t degrandom, m, mP, i
759
+ cdef N
760
+ cdef list factors = [ (skew_ring.gen(), val) ]
761
+ cdef SkewPolynomial_finite_field_dense P, Q, P1, NS, g, right, Pn
762
+ cdef unit = self.leading_coefficient()
763
+ cdef Polynomial gencenter = skew_ring._working_center.gen()
764
+ cdef F = self._reduced_norm_factored()
765
+
766
+ for N, m in F:
767
+ if N == gencenter:
768
+ continue
769
+ degN = N.degree()
770
+ if poly.degree() == degN:
771
+ factors.append((poly, 1))
772
+ break
773
+ NS = <SkewPolynomial_finite_field_dense>skew_ring(N)
774
+ P1 = None
775
+ while True:
776
+ P = <SkewPolynomial_finite_field_dense>poly.right_gcd(NS)
777
+ mP = P.degree() / degN
778
+ if mP == 0: break
779
+ if mP == 1:
780
+ factors.append((P, 1))
781
+ poly = poly // P
782
+ for i in range(1, m):
783
+ if poly.degree() == degN:
784
+ factors.append((poly,1))
785
+ break
786
+ P = poly.right_gcd(NS)
787
+ factors.append((P, 1))
788
+ poly = poly // P
789
+ break
790
+ if P1 is None:
791
+ P1 = P._rdivisor_c(N)
792
+ Q = <SkewPolynomial_finite_field_dense>NS._new_c(NS._coeffs[:], NS._parent)
793
+ Q = P1 * (Q // P)
794
+ factors.append((P1, 1))
795
+ right = <SkewPolynomial_finite_field_dense>P1._new_c(P1._coeffs[:], P1._parent)
796
+ m -= (mP-1)
797
+ degrandom = P.degree()
798
+ while mP > 2:
799
+ while True:
800
+ g = <SkewPolynomial_finite_field_dense>skew_ring.random_element((degrandom, degrandom))
801
+ g = (Q*g).right_gcd(P)
802
+ Pn = right._left_lcm_cofactor(g)
803
+ if Pn.degree() == degN: break
804
+ Pn = Pn.right_monic()
805
+ factors.append((Pn, 1))
806
+ right = Pn * right
807
+ degrandom -= degN
808
+ mP -= 1
809
+ poly = poly // right
810
+ P1, _ = P.right_quo_rem(right)
811
+ factors.reverse()
812
+ return Factorization(factors, sort=False, unit=unit)
813
+
814
+ cdef _factor_uniform_c(self):
815
+ r"""
816
+ Compute a uniformly distributed factorization of ``self``.
817
+
818
+ This is the low level implementation of :meth:`factor`.
819
+ """
820
+ skew_ring = self._parent
821
+ cdef Integer cardE, cardcenter = skew_ring._working_center.base_ring().cardinality()
822
+ cdef gencenter = skew_ring._working_center.gen()
823
+ cdef SkewPolynomial_finite_field_dense gen = <SkewPolynomial_finite_field_dense>skew_ring.gen()
824
+
825
+ cdef list factorsN = [ ]
826
+ cdef dict dict_divisor = { }
827
+ cdef dict dict_type = { }
828
+ cdef dict dict_right = { }
829
+ cdef Py_ssize_t m
830
+ cdef list type
831
+
832
+ for N, m in self._reduced_norm_factored():
833
+ factorsN += m * [N]
834
+ if N == gencenter:
835
+ continue
836
+ type = list(self.type(N))
837
+ dict_type[N] = type
838
+ if <Py_ssize_t>(type[0]) > 1:
839
+ dict_divisor[N] = self._rdivisor_c(N)
840
+ dict_right[N] = skew_ring.one()
841
+ m = len(factorsN)
842
+ cdef list indices = <list>sample(range(1, m+1), m)
843
+
844
+ cdef unit = self.leading_coefficient()
845
+ cdef SkewPolynomial_finite_field_dense left = self._new_c(self._coeffs[:], skew_ring)
846
+ left = left.right_monic()
847
+ cdef SkewPolynomial_finite_field_dense right = <SkewPolynomial_finite_field_dense>skew_ring.one()
848
+ cdef SkewPolynomial_finite_field_dense L, R
849
+ cdef SkewPolynomial_finite_field_dense NS, P, Q, D, D1, D2, d
850
+ cdef list factors = [ ]
851
+ cdef list maxtype
852
+ cdef Py_ssize_t i, j, degN, deg
853
+ cdef count, maxcount
854
+
855
+ for i in indices:
856
+ N = factorsN[i-1]
857
+ if N == gencenter:
858
+ D1 = gen
859
+ else:
860
+ type = dict_type[N]
861
+ NS = skew_ring(N)
862
+ P = left.right_gcd(NS)
863
+ if <Py_ssize_t>(type[0]) == 1:
864
+ D1 = P
865
+ else:
866
+ R = right._new_c(right._coeffs[:],skew_ring)
867
+ R = R // dict_right[N]
868
+ D = R._left_lcm_cofactor(dict_divisor[N])
869
+ maxtype = list(type)
870
+ maxtype[-1] -= 1
871
+ degN = N.degree()
872
+ cardE = cardcenter ** degN
873
+ maxcount = q_jordan(maxtype, cardE)
874
+ Q = NS // P
875
+ deg = P.degree()-1
876
+ while True:
877
+ while True:
878
+ R = <SkewPolynomial_finite_field_dense>skew_ring.random_element((deg,deg))
879
+ R = Q * R
880
+ if P.right_gcd(R).degree() == 0:
881
+ break
882
+ D1 = P.right_gcd(D*R)
883
+
884
+ L = left._new_c(list(left._coeffs),skew_ring)
885
+ L = L // D1
886
+ degN = N.degree()
887
+ for j in range(len(type)):
888
+ if <Py_ssize_t>(type[j]) == 1:
889
+ newtype = type[:-1]
890
+ break
891
+ d = L.right_gcd(NS)
892
+ deg = d.degree() / degN
893
+ if deg < <Py_ssize_t>(type[j]):
894
+ newtype = list(type)
895
+ newtype[j] = deg
896
+ break
897
+ L = L // d
898
+ count = q_jordan(newtype, cardE)
899
+ if ZZ.random_element(maxcount) < count:
900
+ break
901
+ dict_type[N] = newtype
902
+
903
+ D2 = D._new_c(list(D._coeffs), skew_ring)
904
+ D2 = D2.right_monic()
905
+ while D2 == D1:
906
+ while True:
907
+ R = <SkewPolynomial_finite_field_dense>skew_ring.random_element((deg,deg))
908
+ R = Q * R
909
+ if P.right_gcd(R).degree() == 0:
910
+ break
911
+ D2 = P.right_gcd(D*R)
912
+ dict_divisor[N] = D1.left_lcm(D2)
913
+ factors.append((D1,1))
914
+ left = left // D1
915
+ right = D1 * right
916
+ dict_right[N] = right._new_c(list(right._coeffs), skew_ring)
917
+
918
+ factors.reverse()
919
+ return Factorization(factors, sort=False, unit=unit)
920
+
921
+ def factor(self, uniform=False):
922
+ r"""
923
+ Return a factorization of this skew polynomial.
924
+
925
+ INPUT:
926
+
927
+ - ``uniform`` -- boolean (default: ``False``); whether the
928
+ output irreducible divisor should be uniformly distributed
929
+ among all possibilities
930
+
931
+ EXAMPLES::
932
+
933
+ sage: k.<t> = GF(5^3)
934
+ sage: Frob = k.frobenius_endomorphism()
935
+ sage: S.<x> = k['x',Frob]
936
+ sage: a = x^3 + (t^2 + 4*t + 2)*x^2 + (3*t + 3)*x + t^2 + 1
937
+ sage: F = a.factor(); F # random
938
+ (x + t^2 + 4) * (x + t + 3) * (x + t)
939
+ sage: F.value() == a
940
+ True
941
+
942
+ The result of the factorization is cached. Hence, if we try
943
+ again to factor `a`, we will get the same answer::
944
+
945
+ sage: a.factor() # random
946
+ (x + t^2 + 4) * (x + t + 3) * (x + t)
947
+
948
+ However, the algorithm is probabilistic. Hence if we first
949
+ reinitialize `a`, we may get a different answer::
950
+
951
+ sage: a = x^3 + (t^2 + 4*t + 2)*x^2 + (3*t + 3)*x + t^2 + 1
952
+ sage: F = a.factor(); F # random
953
+ (x + t^2 + t + 2) * (x + 2*t^2 + t + 4) * (x + t)
954
+ sage: F.value() == a
955
+ True
956
+
957
+ There is a priori no guarantee on the distribution of the
958
+ factorizations we get. Passing in the keyword ``uniform=True``
959
+ ensures the output is uniformly distributed among all
960
+ factorizations::
961
+
962
+ sage: a.factor(uniform=True) # random
963
+ (x + t^2 + 4) * (x + t) * (x + t + 3)
964
+ sage: a.factor(uniform=True) # random
965
+ (x + 2*t^2) * (x + t^2 + t + 1) * (x + t^2 + t + 2)
966
+ sage: a.factor(uniform=True) # random
967
+ (x + 2*t^2 + 3*t) * (x + 4*t + 2) * (x + 2*t + 2)
968
+
969
+ By convention, the zero skew polynomial has no factorization::
970
+
971
+ sage: S(0).factor()
972
+ Traceback (most recent call last):
973
+ ...
974
+ ValueError: factorization of 0 not defined
975
+ """
976
+ if self.is_zero():
977
+ raise ValueError("factorization of 0 not defined")
978
+ if uniform:
979
+ F = self._factor_uniform_c()
980
+ if self._factorization is None:
981
+ self._factorization = F
982
+ else:
983
+ if self._factorization is None:
984
+ self._factorization = self._factor_c()
985
+ F = self._factorization
986
+ return F
987
+
988
+ def count_factorizations(self):
989
+ r"""
990
+ Return the number of factorizations (as a product of a
991
+ unit and a product of irreducible monic factors) of this
992
+ skew polynomial.
993
+
994
+ EXAMPLES::
995
+
996
+ sage: k.<t> = GF(5^3)
997
+ sage: Frob = k.frobenius_endomorphism()
998
+ sage: S.<x> = k['x',Frob]
999
+ sage: a = x^4 + (4*t + 3)*x^3 + t^2*x^2 + (4*t^2 + 3*t)*x + 3*t
1000
+ sage: a.count_factorizations()
1001
+ 216
1002
+
1003
+ We illustrate that an irreducible polynomial in the center have
1004
+ in general a lot of distinct factorizations in the skew polynomial
1005
+ ring::
1006
+
1007
+ sage: Z.<x3> = S.center()
1008
+ sage: N = x3^5 + 4*x3^4 + 4*x3^2 + 4*x3 + 3
1009
+ sage: N.is_irreducible()
1010
+ True
1011
+ sage: S(N).count_factorizations()
1012
+ 30537115626
1013
+ """
1014
+ if self.is_zero():
1015
+ raise ValueError("factorization of 0 not defined")
1016
+ cardcenter = self._parent._working_center.base_ring().cardinality()
1017
+ gencenter = self._parent._working_center.gen()
1018
+ F = self._reduced_norm_factored()
1019
+ summ = 0
1020
+ count = 1
1021
+ for N, m in F:
1022
+ summ += m
1023
+ if m == 1:
1024
+ continue
1025
+ if N != gencenter:
1026
+ count *= q_jordan(self.type(N), cardcenter**N.degree())
1027
+ count /= factorial(m)
1028
+ return count * factorial(summ)
1029
+
1030
+ # Not optimized:
1031
+ # many calls to reduced_norm, reduced_norm_factor, _rdivisor_c, which are slow
1032
+
1033
+ def factorizations(self):
1034
+ r"""
1035
+ Return an iterator over all factorizations (as a product
1036
+ of a unit and a product of irreducible monic factors) of
1037
+ this skew polynomial.
1038
+
1039
+ EXAMPLES::
1040
+
1041
+ sage: k.<t> = GF(5^3)
1042
+ sage: Frob = k.frobenius_endomorphism()
1043
+ sage: S.<x> = k['x',Frob]
1044
+ sage: a = x^3 + (t^2 + 1)*x^2 + (2*t + 3)*x + t^2 + t + 2
1045
+ sage: iter = a.factorizations(); iter
1046
+ <...generator object at 0x...>
1047
+ sage: next(iter) # random
1048
+ (x + 3*t^2 + 4*t) * (x + 2*t^2) * (x + 4*t^2 + 4*t + 2)
1049
+ sage: next(iter) # random
1050
+ (x + 3*t^2 + 4*t) * (x + 3*t^2 + 2*t + 2) * (x + 4*t^2 + t + 2)
1051
+
1052
+ We can use this function to build the list of factorizations
1053
+ of `a`::
1054
+
1055
+ sage: factorizations = [ F for F in a.factorizations() ]
1056
+
1057
+ We do some checks::
1058
+
1059
+ sage: len(factorizations) == a.count_factorizations()
1060
+ True
1061
+ sage: len(factorizations) == Set(factorizations).cardinality() # check no duplicates
1062
+ True
1063
+ sage: for F in factorizations:
1064
+ ....: assert F.value() == a, "factorization has a different value"
1065
+ ....: for d,_ in F:
1066
+ ....: assert d.is_irreducible(), "a factor is not irreducible"
1067
+
1068
+ Note that the algorithm used in this method is probabilistic.
1069
+ As a consequence, if we call it two times with the same input,
1070
+ we can get different orderings::
1071
+
1072
+ sage: factorizations2 = [ F for F in a.factorizations() ]
1073
+ sage: factorizations == factorizations2 # random
1074
+ False
1075
+ sage: sorted(factorizations) == sorted(factorizations2)
1076
+ True
1077
+ """
1078
+ if self.is_zero():
1079
+ raise ValueError("factorization of 0 not defined")
1080
+
1081
+ def factorizations_rec(P):
1082
+ if P.is_irreducible():
1083
+ yield [(P, 1)]
1084
+ else:
1085
+ for div in P._irreducible_divisors(True):
1086
+ Q = P // div
1087
+ # Here, we should update Q._norm, Q._norm_factor
1088
+ for factors in factorizations_rec(Q):
1089
+ factors.append((div, 1))
1090
+ yield factors
1091
+ unit = self.leading_coefficient()
1092
+ for factors in factorizations_rec(~unit * self):
1093
+ yield Factorization(factors, sort=False, unit=unit)