passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (807) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -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-2d945d6c.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
  12. sage/algebras/all__sagemath_modules.py +20 -0
  13. sage/algebras/catalog.py +148 -0
  14. sage/algebras/clifford_algebra.py +3107 -0
  15. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  16. sage/algebras/clifford_algebra_element.pxd +16 -0
  17. sage/algebras/clifford_algebra_element.pyx +997 -0
  18. sage/algebras/commutative_dga.py +4252 -0
  19. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
  20. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  21. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  22. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  29. sage/algebras/finite_gca.py +528 -0
  30. sage/algebras/group_algebra.py +232 -0
  31. sage/algebras/lie_algebras/abelian.py +197 -0
  32. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  33. sage/algebras/lie_algebras/all.py +25 -0
  34. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  35. sage/algebras/lie_algebras/bch.py +177 -0
  36. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  37. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  38. sage/algebras/lie_algebras/center_uea.py +767 -0
  39. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  40. sage/algebras/lie_algebras/examples.py +683 -0
  41. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  42. sage/algebras/lie_algebras/heisenberg.py +820 -0
  43. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  47. sage/algebras/lie_algebras/morphism.py +661 -0
  48. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  49. sage/algebras/lie_algebras/onsager.py +1324 -0
  50. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  51. sage/algebras/lie_algebras/quotient.py +462 -0
  52. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  53. sage/algebras/lie_algebras/representation.py +1040 -0
  54. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  55. sage/algebras/lie_algebras/subalgebra.py +967 -0
  56. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  57. sage/algebras/lie_algebras/verma_module.py +1630 -0
  58. sage/algebras/lie_algebras/virasoro.py +1186 -0
  59. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
  60. sage/algebras/octonion_algebra.pxd +20 -0
  61. sage/algebras/octonion_algebra.pyx +987 -0
  62. sage/algebras/orlik_solomon.py +907 -0
  63. sage/algebras/orlik_terao.py +779 -0
  64. sage/algebras/steenrod/all.py +7 -0
  65. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  66. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  67. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  68. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  69. sage/algebras/weyl_algebra.py +1126 -0
  70. sage/all__sagemath_modules.py +62 -0
  71. sage/calculus/all__sagemath_modules.py +19 -0
  72. sage/calculus/expr.py +205 -0
  73. sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
  84. sage/calculus/riemann.pyx +1521 -0
  85. sage/calculus/test_sympy.py +201 -0
  86. sage/calculus/transforms/all.py +7 -0
  87. sage/calculus/transforms/dft.py +844 -0
  88. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
  89. sage/calculus/transforms/dwt.pxd +7 -0
  90. sage/calculus/transforms/dwt.pyx +160 -0
  91. sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
  92. sage/calculus/transforms/fft.pxd +12 -0
  93. sage/calculus/transforms/fft.pyx +487 -0
  94. sage/calculus/wester.py +662 -0
  95. sage/coding/abstract_code.py +1108 -0
  96. sage/coding/ag_code.py +868 -0
  97. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
  98. sage/coding/ag_code_decoders.pyx +2639 -0
  99. sage/coding/all.py +15 -0
  100. sage/coding/bch_code.py +494 -0
  101. sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
  102. sage/coding/binary_code.pxd +124 -0
  103. sage/coding/binary_code.pyx +4139 -0
  104. sage/coding/bounds_catalog.py +43 -0
  105. sage/coding/channel.py +819 -0
  106. sage/coding/channels_catalog.py +29 -0
  107. sage/coding/code_bounds.py +755 -0
  108. sage/coding/code_constructions.py +804 -0
  109. sage/coding/codes_catalog.py +111 -0
  110. sage/coding/cyclic_code.py +1329 -0
  111. sage/coding/databases.py +316 -0
  112. sage/coding/decoder.py +373 -0
  113. sage/coding/decoders_catalog.py +88 -0
  114. sage/coding/delsarte_bounds.py +709 -0
  115. sage/coding/encoder.py +390 -0
  116. sage/coding/encoders_catalog.py +64 -0
  117. sage/coding/extended_code.py +468 -0
  118. sage/coding/gabidulin_code.py +1058 -0
  119. sage/coding/golay_code.py +404 -0
  120. sage/coding/goppa_code.py +441 -0
  121. sage/coding/grs_code.py +2371 -0
  122. sage/coding/guava.py +107 -0
  123. sage/coding/guruswami_sudan/all.py +1 -0
  124. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  125. sage/coding/guruswami_sudan/interpolation.py +409 -0
  126. sage/coding/guruswami_sudan/utils.py +176 -0
  127. sage/coding/hamming_code.py +176 -0
  128. sage/coding/information_set_decoder.py +1032 -0
  129. sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
  130. sage/coding/kasami_codes.pyx +351 -0
  131. sage/coding/linear_code.py +3067 -0
  132. sage/coding/linear_code_no_metric.py +1354 -0
  133. sage/coding/linear_rank_metric.py +961 -0
  134. sage/coding/parity_check_code.py +353 -0
  135. sage/coding/punctured_code.py +719 -0
  136. sage/coding/reed_muller_code.py +999 -0
  137. sage/coding/self_dual_codes.py +942 -0
  138. sage/coding/source_coding/all.py +2 -0
  139. sage/coding/source_coding/huffman.py +553 -0
  140. sage/coding/subfield_subcode.py +423 -0
  141. sage/coding/two_weight_db.py +399 -0
  142. sage/combinat/all__sagemath_modules.py +7 -0
  143. sage/combinat/cartesian_product.py +347 -0
  144. sage/combinat/family.py +11 -0
  145. sage/combinat/free_module.py +1977 -0
  146. sage/combinat/root_system/all.py +147 -0
  147. sage/combinat/root_system/ambient_space.py +527 -0
  148. sage/combinat/root_system/associahedron.py +471 -0
  149. sage/combinat/root_system/braid_move_calculator.py +143 -0
  150. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
  151. sage/combinat/root_system/braid_orbit.pyx +144 -0
  152. sage/combinat/root_system/branching_rules.py +2301 -0
  153. sage/combinat/root_system/cartan_matrix.py +1245 -0
  154. sage/combinat/root_system/cartan_type.py +3069 -0
  155. sage/combinat/root_system/coxeter_group.py +162 -0
  156. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  157. sage/combinat/root_system/coxeter_type.py +681 -0
  158. sage/combinat/root_system/dynkin_diagram.py +900 -0
  159. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  160. sage/combinat/root_system/fundamental_group.py +795 -0
  161. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  162. sage/combinat/root_system/integrable_representations.py +1227 -0
  163. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  164. sage/combinat/root_system/pieri_factors.py +1147 -0
  165. sage/combinat/root_system/plot.py +1615 -0
  166. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  167. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  168. sage/combinat/root_system/root_space.py +487 -0
  169. sage/combinat/root_system/root_system.py +882 -0
  170. sage/combinat/root_system/type_A.py +348 -0
  171. sage/combinat/root_system/type_A_affine.py +227 -0
  172. sage/combinat/root_system/type_A_infinity.py +241 -0
  173. sage/combinat/root_system/type_B.py +347 -0
  174. sage/combinat/root_system/type_BC_affine.py +287 -0
  175. sage/combinat/root_system/type_B_affine.py +216 -0
  176. sage/combinat/root_system/type_C.py +317 -0
  177. sage/combinat/root_system/type_C_affine.py +188 -0
  178. sage/combinat/root_system/type_D.py +357 -0
  179. sage/combinat/root_system/type_D_affine.py +208 -0
  180. sage/combinat/root_system/type_E.py +641 -0
  181. sage/combinat/root_system/type_E_affine.py +231 -0
  182. sage/combinat/root_system/type_F.py +387 -0
  183. sage/combinat/root_system/type_F_affine.py +137 -0
  184. sage/combinat/root_system/type_G.py +293 -0
  185. sage/combinat/root_system/type_G_affine.py +132 -0
  186. sage/combinat/root_system/type_H.py +105 -0
  187. sage/combinat/root_system/type_I.py +110 -0
  188. sage/combinat/root_system/type_Q.py +150 -0
  189. sage/combinat/root_system/type_affine.py +509 -0
  190. sage/combinat/root_system/type_dual.py +704 -0
  191. sage/combinat/root_system/type_folded.py +301 -0
  192. sage/combinat/root_system/type_marked.py +748 -0
  193. sage/combinat/root_system/type_reducible.py +601 -0
  194. sage/combinat/root_system/type_relabel.py +730 -0
  195. sage/combinat/root_system/type_super_A.py +837 -0
  196. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  197. sage/combinat/root_system/weight_space.py +639 -0
  198. sage/combinat/root_system/weyl_characters.py +2238 -0
  199. sage/crypto/__init__.py +4 -0
  200. sage/crypto/all.py +28 -0
  201. sage/crypto/block_cipher/all.py +7 -0
  202. sage/crypto/block_cipher/des.py +1065 -0
  203. sage/crypto/block_cipher/miniaes.py +2171 -0
  204. sage/crypto/block_cipher/present.py +909 -0
  205. sage/crypto/block_cipher/sdes.py +1527 -0
  206. sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
  207. sage/crypto/boolean_function.pxd +10 -0
  208. sage/crypto/boolean_function.pyx +1487 -0
  209. sage/crypto/cipher.py +78 -0
  210. sage/crypto/classical.py +3668 -0
  211. sage/crypto/classical_cipher.py +569 -0
  212. sage/crypto/cryptosystem.py +387 -0
  213. sage/crypto/key_exchange/all.py +7 -0
  214. sage/crypto/key_exchange/catalog.py +24 -0
  215. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  216. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  217. sage/crypto/lattice.py +312 -0
  218. sage/crypto/lfsr.py +295 -0
  219. sage/crypto/lwe.py +840 -0
  220. sage/crypto/mq/__init__.py +4 -0
  221. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  222. sage/crypto/mq/rijndael_gf.py +2345 -0
  223. sage/crypto/mq/sbox.py +7 -0
  224. sage/crypto/mq/sr.py +3344 -0
  225. sage/crypto/public_key/all.py +5 -0
  226. sage/crypto/public_key/blum_goldwasser.py +776 -0
  227. sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
  228. sage/crypto/sbox.pyx +2090 -0
  229. sage/crypto/sboxes.py +2090 -0
  230. sage/crypto/stream.py +390 -0
  231. sage/crypto/stream_cipher.py +297 -0
  232. sage/crypto/util.py +519 -0
  233. sage/ext/all__sagemath_modules.py +1 -0
  234. sage/ext/interpreters/__init__.py +1 -0
  235. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  236. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
  237. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  238. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  239. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
  240. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  241. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  242. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
  243. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  244. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  245. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
  246. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  247. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  248. sage/geometry/all__sagemath_modules.py +5 -0
  249. sage/geometry/toric_lattice.py +1745 -0
  250. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
  251. sage/geometry/toric_lattice_element.pyx +432 -0
  252. sage/groups/abelian_gps/abelian_group.py +1925 -0
  253. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  254. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  255. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  256. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  257. sage/groups/abelian_gps/element_base.py +341 -0
  258. sage/groups/abelian_gps/values.py +488 -0
  259. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  260. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  261. sage/groups/additive_abelian/all.py +4 -0
  262. sage/groups/additive_abelian/qmodnz.py +231 -0
  263. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  264. sage/groups/affine_gps/affine_group.py +535 -0
  265. sage/groups/affine_gps/all.py +1 -0
  266. sage/groups/affine_gps/catalog.py +17 -0
  267. sage/groups/affine_gps/euclidean_group.py +246 -0
  268. sage/groups/affine_gps/group_element.py +562 -0
  269. sage/groups/all__sagemath_modules.py +12 -0
  270. sage/groups/galois_group.py +479 -0
  271. sage/groups/matrix_gps/all.py +4 -0
  272. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  273. sage/groups/matrix_gps/catalog.py +26 -0
  274. sage/groups/matrix_gps/coxeter_group.py +927 -0
  275. sage/groups/matrix_gps/finitely_generated.py +487 -0
  276. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
  277. sage/groups/matrix_gps/group_element.pxd +11 -0
  278. sage/groups/matrix_gps/group_element.pyx +431 -0
  279. sage/groups/matrix_gps/linear.py +440 -0
  280. sage/groups/matrix_gps/matrix_group.py +617 -0
  281. sage/groups/matrix_gps/named_group.py +296 -0
  282. sage/groups/matrix_gps/orthogonal.py +544 -0
  283. sage/groups/matrix_gps/symplectic.py +251 -0
  284. sage/groups/matrix_gps/unitary.py +436 -0
  285. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  286. sage/groups/misc_gps/argument_groups.py +1905 -0
  287. sage/groups/misc_gps/imaginary_groups.py +479 -0
  288. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  296. sage/homology/algebraic_topological_model.py +595 -0
  297. sage/homology/all.py +2 -0
  298. sage/homology/all__sagemath_modules.py +8 -0
  299. sage/homology/chain_complex.py +2148 -0
  300. sage/homology/chain_complex_homspace.py +165 -0
  301. sage/homology/chain_complex_morphism.py +629 -0
  302. sage/homology/chain_homotopy.py +604 -0
  303. sage/homology/chains.py +653 -0
  304. sage/homology/free_resolution.py +923 -0
  305. sage/homology/graded_resolution.py +567 -0
  306. sage/homology/hochschild_complex.py +756 -0
  307. sage/homology/homology_group.py +188 -0
  308. sage/homology/homology_morphism.py +422 -0
  309. sage/homology/homology_vector_space_with_basis.py +1454 -0
  310. sage/homology/koszul_complex.py +169 -0
  311. sage/homology/matrix_utils.py +205 -0
  312. sage/libs/all__sagemath_modules.py +1 -0
  313. sage/libs/gsl/__init__.py +1 -0
  314. sage/libs/gsl/airy.pxd +56 -0
  315. sage/libs/gsl/all.pxd +66 -0
  316. sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
  317. sage/libs/gsl/array.pxd +5 -0
  318. sage/libs/gsl/array.pyx +102 -0
  319. sage/libs/gsl/bessel.pxd +208 -0
  320. sage/libs/gsl/blas.pxd +116 -0
  321. sage/libs/gsl/blas_types.pxd +34 -0
  322. sage/libs/gsl/block.pxd +52 -0
  323. sage/libs/gsl/chebyshev.pxd +37 -0
  324. sage/libs/gsl/clausen.pxd +12 -0
  325. sage/libs/gsl/combination.pxd +47 -0
  326. sage/libs/gsl/complex.pxd +151 -0
  327. sage/libs/gsl/coulomb.pxd +30 -0
  328. sage/libs/gsl/coupling.pxd +21 -0
  329. sage/libs/gsl/dawson.pxd +12 -0
  330. sage/libs/gsl/debye.pxd +24 -0
  331. sage/libs/gsl/dilog.pxd +14 -0
  332. sage/libs/gsl/eigen.pxd +46 -0
  333. sage/libs/gsl/elementary.pxd +12 -0
  334. sage/libs/gsl/ellint.pxd +48 -0
  335. sage/libs/gsl/elljac.pxd +8 -0
  336. sage/libs/gsl/erf.pxd +32 -0
  337. sage/libs/gsl/errno.pxd +26 -0
  338. sage/libs/gsl/exp.pxd +44 -0
  339. sage/libs/gsl/expint.pxd +44 -0
  340. sage/libs/gsl/fermi_dirac.pxd +44 -0
  341. sage/libs/gsl/fft.pxd +121 -0
  342. sage/libs/gsl/fit.pxd +50 -0
  343. sage/libs/gsl/gamma.pxd +94 -0
  344. sage/libs/gsl/gegenbauer.pxd +26 -0
  345. sage/libs/gsl/histogram.pxd +176 -0
  346. sage/libs/gsl/hyperg.pxd +52 -0
  347. sage/libs/gsl/integration.pxd +69 -0
  348. sage/libs/gsl/interp.pxd +109 -0
  349. sage/libs/gsl/laguerre.pxd +24 -0
  350. sage/libs/gsl/lambert.pxd +16 -0
  351. sage/libs/gsl/legendre.pxd +90 -0
  352. sage/libs/gsl/linalg.pxd +185 -0
  353. sage/libs/gsl/log.pxd +26 -0
  354. sage/libs/gsl/math.pxd +43 -0
  355. sage/libs/gsl/matrix.pxd +143 -0
  356. sage/libs/gsl/matrix_complex.pxd +130 -0
  357. sage/libs/gsl/min.pxd +67 -0
  358. sage/libs/gsl/monte.pxd +56 -0
  359. sage/libs/gsl/ntuple.pxd +32 -0
  360. sage/libs/gsl/odeiv.pxd +70 -0
  361. sage/libs/gsl/permutation.pxd +78 -0
  362. sage/libs/gsl/poly.pxd +40 -0
  363. sage/libs/gsl/pow_int.pxd +12 -0
  364. sage/libs/gsl/psi.pxd +28 -0
  365. sage/libs/gsl/qrng.pxd +29 -0
  366. sage/libs/gsl/random.pxd +257 -0
  367. sage/libs/gsl/rng.pxd +100 -0
  368. sage/libs/gsl/roots.pxd +72 -0
  369. sage/libs/gsl/sort.pxd +36 -0
  370. sage/libs/gsl/statistics.pxd +59 -0
  371. sage/libs/gsl/sum.pxd +55 -0
  372. sage/libs/gsl/synchrotron.pxd +16 -0
  373. sage/libs/gsl/transport.pxd +24 -0
  374. sage/libs/gsl/trig.pxd +58 -0
  375. sage/libs/gsl/types.pxd +137 -0
  376. sage/libs/gsl/vector.pxd +101 -0
  377. sage/libs/gsl/vector_complex.pxd +83 -0
  378. sage/libs/gsl/wavelet.pxd +49 -0
  379. sage/libs/gsl/zeta.pxd +28 -0
  380. sage/libs/mpc/__init__.pxd +114 -0
  381. sage/libs/mpc/types.pxd +28 -0
  382. sage/libs/mpfr/__init__.pxd +299 -0
  383. sage/libs/mpfr/types.pxd +26 -0
  384. sage/libs/mpmath/__init__.py +1 -0
  385. sage/libs/mpmath/all.py +27 -0
  386. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  387. sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
  388. sage/libs/mpmath/utils.pxd +4 -0
  389. sage/libs/mpmath/utils.pyx +319 -0
  390. sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
  391. sage/matrix/action.pxd +26 -0
  392. sage/matrix/action.pyx +596 -0
  393. sage/matrix/all.py +9 -0
  394. sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
  395. sage/matrix/args.pxd +144 -0
  396. sage/matrix/args.pyx +1668 -0
  397. sage/matrix/benchmark.py +1258 -0
  398. sage/matrix/berlekamp_massey.py +95 -0
  399. sage/matrix/compute_J_ideal.py +926 -0
  400. sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
  416. sage/matrix/matrix_cdv.pxd +4 -0
  417. sage/matrix/matrix_cdv.pyx +93 -0
  418. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  419. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  420. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  421. sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
  422. sage/matrix/matrix_dense.pxd +5 -0
  423. sage/matrix/matrix_dense.pyx +343 -0
  424. sage/matrix/matrix_domain_dense.pxd +5 -0
  425. sage/matrix/matrix_domain_sparse.pxd +5 -0
  426. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  427. sage/matrix/matrix_double_dense.pxd +7 -0
  428. sage/matrix/matrix_double_dense.pyx +3906 -0
  429. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  430. sage/matrix/matrix_double_sparse.pxd +6 -0
  431. sage/matrix/matrix_double_sparse.pyx +248 -0
  432. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
  433. sage/matrix/matrix_generic_dense.pxd +7 -0
  434. sage/matrix/matrix_generic_dense.pyx +354 -0
  435. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  436. sage/matrix/matrix_generic_sparse.pxd +7 -0
  437. sage/matrix/matrix_generic_sparse.pyx +461 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  441. sage/matrix/matrix_misc.py +313 -0
  442. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  443. sage/matrix/matrix_numpy_dense.pxd +14 -0
  444. sage/matrix/matrix_numpy_dense.pyx +450 -0
  445. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  446. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  447. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  448. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  449. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  450. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  451. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  452. sage/matrix/matrix_real_double_dense.pxd +7 -0
  453. sage/matrix/matrix_real_double_dense.pyx +122 -0
  454. sage/matrix/matrix_space.py +2848 -0
  455. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  456. sage/matrix/matrix_sparse.pxd +5 -0
  457. sage/matrix/matrix_sparse.pyx +1222 -0
  458. sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
  459. sage/matrix/matrix_window.pxd +37 -0
  460. sage/matrix/matrix_window.pyx +242 -0
  461. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  462. sage/matrix/misc_mpfr.pyx +80 -0
  463. sage/matrix/operation_table.py +1182 -0
  464. sage/matrix/special.py +3666 -0
  465. sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
  466. sage/matrix/strassen.pyx +851 -0
  467. sage/matrix/symplectic_basis.py +541 -0
  468. sage/matrix/template.pxd +6 -0
  469. sage/matrix/tests.py +71 -0
  470. sage/matroids/advanced.py +77 -0
  471. sage/matroids/all.py +13 -0
  472. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  473. sage/matroids/basis_exchange_matroid.pxd +96 -0
  474. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  475. sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  476. sage/matroids/basis_matroid.pxd +45 -0
  477. sage/matroids/basis_matroid.pyx +1217 -0
  478. sage/matroids/catalog.py +44 -0
  479. sage/matroids/chow_ring.py +473 -0
  480. sage/matroids/chow_ring_ideal.py +849 -0
  481. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  482. sage/matroids/circuit_closures_matroid.pxd +16 -0
  483. sage/matroids/circuit_closures_matroid.pyx +559 -0
  484. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  485. sage/matroids/circuits_matroid.pxd +38 -0
  486. sage/matroids/circuits_matroid.pyx +947 -0
  487. sage/matroids/constructor.py +1086 -0
  488. sage/matroids/database_collections.py +365 -0
  489. sage/matroids/database_matroids.py +5338 -0
  490. sage/matroids/dual_matroid.py +583 -0
  491. sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  495. sage/matroids/flats_matroid.pxd +28 -0
  496. sage/matroids/flats_matroid.pyx +715 -0
  497. sage/matroids/gammoid.py +600 -0
  498. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  499. sage/matroids/graphic_matroid.pxd +39 -0
  500. sage/matroids/graphic_matroid.pyx +2024 -0
  501. sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  502. sage/matroids/lean_matrix.pxd +126 -0
  503. sage/matroids/lean_matrix.pyx +3667 -0
  504. sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  505. sage/matroids/linear_matroid.pxd +180 -0
  506. sage/matroids/linear_matroid.pyx +6649 -0
  507. sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
  508. sage/matroids/matroid.pxd +243 -0
  509. sage/matroids/matroid.pyx +8759 -0
  510. sage/matroids/matroids_catalog.py +190 -0
  511. sage/matroids/matroids_plot_helpers.py +890 -0
  512. sage/matroids/minor_matroid.py +480 -0
  513. sage/matroids/minorfix.h +9 -0
  514. sage/matroids/named_matroids.py +5 -0
  515. sage/matroids/rank_matroid.py +268 -0
  516. sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
  517. sage/matroids/set_system.pxd +38 -0
  518. sage/matroids/set_system.pyx +800 -0
  519. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  520. sage/matroids/transversal_matroid.pxd +14 -0
  521. sage/matroids/transversal_matroid.pyx +893 -0
  522. sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  523. sage/matroids/union_matroid.pxd +20 -0
  524. sage/matroids/union_matroid.pyx +331 -0
  525. sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
  526. sage/matroids/unpickling.pyx +843 -0
  527. sage/matroids/utilities.py +809 -0
  528. sage/misc/all__sagemath_modules.py +20 -0
  529. sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
  530. sage/misc/c3.pyx +238 -0
  531. sage/misc/compat.py +87 -0
  532. sage/misc/element_with_label.py +173 -0
  533. sage/misc/func_persist.py +79 -0
  534. sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
  535. sage/misc/pickle_old.pyx +19 -0
  536. sage/misc/proof.py +7 -0
  537. sage/misc/replace_dot_all.py +472 -0
  538. sage/misc/sagedoc_conf.py +168 -0
  539. sage/misc/sphinxify.py +167 -0
  540. sage/misc/test_class_pickling.py +85 -0
  541. sage/modules/all.py +42 -0
  542. sage/modules/complex_double_vector.py +25 -0
  543. sage/modules/diamond_cutting.py +380 -0
  544. sage/modules/fg_pid/all.py +1 -0
  545. sage/modules/fg_pid/fgp_element.py +456 -0
  546. sage/modules/fg_pid/fgp_module.py +2091 -0
  547. sage/modules/fg_pid/fgp_morphism.py +550 -0
  548. sage/modules/filtered_vector_space.py +1271 -0
  549. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
  550. sage/modules/finite_submodule_iter.pxd +27 -0
  551. sage/modules/finite_submodule_iter.pyx +452 -0
  552. sage/modules/fp_graded/all.py +1 -0
  553. sage/modules/fp_graded/element.py +346 -0
  554. sage/modules/fp_graded/free_element.py +298 -0
  555. sage/modules/fp_graded/free_homspace.py +53 -0
  556. sage/modules/fp_graded/free_module.py +1060 -0
  557. sage/modules/fp_graded/free_morphism.py +217 -0
  558. sage/modules/fp_graded/homspace.py +563 -0
  559. sage/modules/fp_graded/module.py +1340 -0
  560. sage/modules/fp_graded/morphism.py +1990 -0
  561. sage/modules/fp_graded/steenrod/all.py +1 -0
  562. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  563. sage/modules/fp_graded/steenrod/module.py +477 -0
  564. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  565. sage/modules/fp_graded/steenrod/profile.py +241 -0
  566. sage/modules/free_module.py +8447 -0
  567. sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
  568. sage/modules/free_module_element.pxd +22 -0
  569. sage/modules/free_module_element.pyx +5445 -0
  570. sage/modules/free_module_homspace.py +369 -0
  571. sage/modules/free_module_integer.py +896 -0
  572. sage/modules/free_module_morphism.py +823 -0
  573. sage/modules/free_module_pseudohomspace.py +352 -0
  574. sage/modules/free_module_pseudomorphism.py +578 -0
  575. sage/modules/free_quadratic_module.py +1706 -0
  576. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  577. sage/modules/matrix_morphism.py +1745 -0
  578. sage/modules/misc.py +103 -0
  579. sage/modules/module_functors.py +192 -0
  580. sage/modules/multi_filtered_vector_space.py +719 -0
  581. sage/modules/ore_module.py +2208 -0
  582. sage/modules/ore_module_element.py +178 -0
  583. sage/modules/ore_module_homspace.py +147 -0
  584. sage/modules/ore_module_morphism.py +968 -0
  585. sage/modules/quotient_module.py +699 -0
  586. sage/modules/real_double_vector.py +22 -0
  587. sage/modules/submodule.py +255 -0
  588. sage/modules/tensor_operations.py +567 -0
  589. sage/modules/torsion_quadratic_module.py +1352 -0
  590. sage/modules/tutorial_free_modules.py +248 -0
  591. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  592. sage/modules/vector_complex_double_dense.pxd +6 -0
  593. sage/modules/vector_complex_double_dense.pyx +117 -0
  594. sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  595. sage/modules/vector_double_dense.pxd +6 -0
  596. sage/modules/vector_double_dense.pyx +604 -0
  597. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  598. sage/modules/vector_integer_dense.pxd +15 -0
  599. sage/modules/vector_integer_dense.pyx +361 -0
  600. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  601. sage/modules/vector_integer_sparse.pxd +29 -0
  602. sage/modules/vector_integer_sparse.pyx +406 -0
  603. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
  604. sage/modules/vector_modn_dense.pxd +12 -0
  605. sage/modules/vector_modn_dense.pyx +394 -0
  606. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  607. sage/modules/vector_modn_sparse.pxd +21 -0
  608. sage/modules/vector_modn_sparse.pyx +298 -0
  609. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  610. sage/modules/vector_numpy_dense.pxd +15 -0
  611. sage/modules/vector_numpy_dense.pyx +304 -0
  612. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  613. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  614. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  615. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
  616. sage/modules/vector_rational_dense.pxd +15 -0
  617. sage/modules/vector_rational_dense.pyx +387 -0
  618. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  619. sage/modules/vector_rational_sparse.pxd +30 -0
  620. sage/modules/vector_rational_sparse.pyx +413 -0
  621. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  622. sage/modules/vector_real_double_dense.pxd +6 -0
  623. sage/modules/vector_real_double_dense.pyx +126 -0
  624. sage/modules/vector_space_homspace.py +430 -0
  625. sage/modules/vector_space_morphism.py +989 -0
  626. sage/modules/with_basis/all.py +15 -0
  627. sage/modules/with_basis/cell_module.py +494 -0
  628. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
  629. sage/modules/with_basis/indexed_element.pxd +13 -0
  630. sage/modules/with_basis/indexed_element.pyx +1058 -0
  631. sage/modules/with_basis/invariant.py +1075 -0
  632. sage/modules/with_basis/morphism.py +1636 -0
  633. sage/modules/with_basis/representation.py +2939 -0
  634. sage/modules/with_basis/subquotient.py +685 -0
  635. sage/numerical/all__sagemath_modules.py +6 -0
  636. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
  637. sage/numerical/gauss_legendre.pyx +381 -0
  638. sage/numerical/optimize.py +910 -0
  639. sage/probability/all.py +10 -0
  640. sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
  641. sage/probability/probability_distribution.pyx +1242 -0
  642. sage/probability/random_variable.py +411 -0
  643. sage/quadratic_forms/all.py +4 -0
  644. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  645. sage/quadratic_forms/binary_qf.py +2042 -0
  646. sage/quadratic_forms/bqf_class_group.py +748 -0
  647. sage/quadratic_forms/constructions.py +93 -0
  648. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
  649. sage/quadratic_forms/count_local_2.pyx +365 -0
  650. sage/quadratic_forms/extras.py +195 -0
  651. sage/quadratic_forms/quadratic_form.py +1753 -0
  652. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  653. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  656. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  657. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  658. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  659. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  660. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  661. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  662. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  663. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  664. sage/quadratic_forms/random_quadraticform.py +209 -0
  665. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
  666. sage/quadratic_forms/ternary.pyx +1154 -0
  667. sage/quadratic_forms/ternary_qf.py +2027 -0
  668. sage/rings/all__sagemath_modules.py +28 -0
  669. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  670. sage/rings/asymptotic/misc.py +1252 -0
  671. sage/rings/cc.py +4 -0
  672. sage/rings/cfinite_sequence.py +1306 -0
  673. sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  674. sage/rings/complex_conversion.pxd +8 -0
  675. sage/rings/complex_conversion.pyx +23 -0
  676. sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
  677. sage/rings/complex_double.pxd +21 -0
  678. sage/rings/complex_double.pyx +2654 -0
  679. sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
  680. sage/rings/complex_mpc.pxd +21 -0
  681. sage/rings/complex_mpc.pyx +2576 -0
  682. sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  683. sage/rings/complex_mpfr.pxd +18 -0
  684. sage/rings/complex_mpfr.pyx +3602 -0
  685. sage/rings/derivation.py +2334 -0
  686. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  687. sage/rings/finite_rings/maps_finite_field.py +191 -0
  688. sage/rings/function_field/all__sagemath_modules.py +8 -0
  689. sage/rings/function_field/derivations.py +102 -0
  690. sage/rings/function_field/derivations_rational.py +132 -0
  691. sage/rings/function_field/differential.py +853 -0
  692. sage/rings/function_field/divisor.py +1107 -0
  693. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  694. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  695. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  696. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  697. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  698. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  699. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  700. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
  703. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  704. sage/rings/invariants/all.py +4 -0
  705. sage/rings/invariants/invariant_theory.py +4597 -0
  706. sage/rings/invariants/reconstruction.py +395 -0
  707. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  708. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  712. sage/rings/polynomial/ore_function_element.py +952 -0
  713. sage/rings/polynomial/ore_function_field.py +1028 -0
  714. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  715. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  716. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  717. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  720. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  721. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  722. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  723. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  730. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  731. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
  732. sage/rings/real_double_element_gsl.pxd +8 -0
  733. sage/rings/real_double_element_gsl.pyx +794 -0
  734. sage/rings/real_field.py +58 -0
  735. sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  736. sage/rings/real_mpfr.pxd +29 -0
  737. sage/rings/real_mpfr.pyx +6122 -0
  738. sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
  739. sage/rings/ring_extension.pxd +42 -0
  740. sage/rings/ring_extension.pyx +2779 -0
  741. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  742. sage/rings/ring_extension_conversion.pxd +16 -0
  743. sage/rings/ring_extension_conversion.pyx +462 -0
  744. sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
  745. sage/rings/ring_extension_element.pxd +21 -0
  746. sage/rings/ring_extension_element.pyx +1635 -0
  747. sage/rings/ring_extension_homset.py +64 -0
  748. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
  749. sage/rings/ring_extension_morphism.pxd +35 -0
  750. sage/rings/ring_extension_morphism.pyx +920 -0
  751. sage/schemes/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/coherent_sheaf.py +300 -0
  754. sage/schemes/projective/cohomology.py +510 -0
  755. sage/stats/all.py +15 -0
  756. sage/stats/basic_stats.py +489 -0
  757. sage/stats/distributions/all.py +7 -0
  758. sage/stats/distributions/catalog.py +34 -0
  759. sage/stats/distributions/dgs.h +50 -0
  760. sage/stats/distributions/dgs.pxd +111 -0
  761. sage/stats/distributions/dgs_bern.h +400 -0
  762. sage/stats/distributions/dgs_gauss.h +614 -0
  763. sage/stats/distributions/dgs_misc.h +104 -0
  764. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  767. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  768. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  769. sage/stats/hmm/all.py +15 -0
  770. sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
  773. sage/stats/hmm/distributions.pxd +29 -0
  774. sage/stats/hmm/distributions.pyx +531 -0
  775. sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
  776. sage/stats/hmm/hmm.pxd +17 -0
  777. sage/stats/hmm/hmm.pyx +1388 -0
  778. sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
  779. sage/stats/hmm/util.pxd +7 -0
  780. sage/stats/hmm/util.pyx +165 -0
  781. sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
  782. sage/stats/intlist.pxd +14 -0
  783. sage/stats/intlist.pyx +588 -0
  784. sage/stats/r.py +49 -0
  785. sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
  786. sage/stats/time_series.pxd +6 -0
  787. sage/stats/time_series.pyx +2546 -0
  788. sage/tensor/all.py +2 -0
  789. sage/tensor/modules/all.py +8 -0
  790. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  791. sage/tensor/modules/comp.py +5598 -0
  792. sage/tensor/modules/ext_pow_free_module.py +824 -0
  793. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  794. sage/tensor/modules/format_utilities.py +333 -0
  795. sage/tensor/modules/free_module_alt_form.py +858 -0
  796. sage/tensor/modules/free_module_automorphism.py +1207 -0
  797. sage/tensor/modules/free_module_basis.py +1074 -0
  798. sage/tensor/modules/free_module_element.py +284 -0
  799. sage/tensor/modules/free_module_homset.py +652 -0
  800. sage/tensor/modules/free_module_linear_group.py +564 -0
  801. sage/tensor/modules/free_module_morphism.py +1581 -0
  802. sage/tensor/modules/free_module_tensor.py +3289 -0
  803. sage/tensor/modules/reflexive_module.py +386 -0
  804. sage/tensor/modules/tensor_free_module.py +780 -0
  805. sage/tensor/modules/tensor_free_submodule.py +538 -0
  806. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  807. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1058 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.modules sage.rings.finite_rings
3
+ r"""
4
+ Gabidulin Code
5
+
6
+ This module provides the :class:`~sage.coding.gabidulin.GabidulinCode`, which constructs
7
+ Gabidulin Codes that are the rank metric equivalent of Reed Solomon codes and are
8
+ defined as the evaluation codes of degree-restricted skew polynomials.
9
+
10
+ This module also provides :class:`~sage.coding.gabidulin.GabidulinPolynomialEvaluationEncoder`,
11
+ an encoder with a skew polynomial message space and :class:`~sage.coding.gabidulin.GabidulinVectorEvaluationEncoder`,
12
+ an encoder based on the generator matrix. It also provides a decoder
13
+ :class:`~sage.coding.gabidulin.GabidulinGaoDecoder` which corrects errors using
14
+ the Gao algorithm in the rank metric.
15
+
16
+ AUTHOR:
17
+
18
+ - Arpit Merchant (2016-08-16)
19
+ - Marketa Slukova (2019-08-19): initial version
20
+ """
21
+ from sage.matrix.constructor import matrix
22
+ from sage.modules.free_module_element import vector
23
+ from sage.coding.encoder import Encoder
24
+ from sage.coding.decoder import Decoder, DecodingError
25
+ from sage.coding.linear_rank_metric import AbstractLinearRankMetricCode
26
+ from sage.categories.fields import Fields
27
+
28
+
29
+ class GabidulinCode(AbstractLinearRankMetricCode):
30
+ r"""
31
+ A Gabidulin Code.
32
+
33
+ DEFINITION:
34
+
35
+ A linear Gabidulin code Gab[n, k] over `F_{q^m}` of length `n` (at most
36
+ `m`) and dimension `k` (at most `n`) is the set of all codewords, that
37
+ are the evaluation of a `q`-degree restricted skew polynomial `f(x)`
38
+ belonging to the skew polynomial constructed over the base ring `F_{q^m}`
39
+ and the twisting homomorphism `\sigma`.
40
+
41
+ .. math::
42
+
43
+ \{ \text{Gab[n, k]} = \big\{ (f(g_0) f(g_1) ... f(g_{n-1})) = f(\textbf{g}) : \text{deg}_{q}f(x) < k \big\} \}
44
+
45
+ where the fixed evaluation points `g_0, g_1,..., g_{n-1}` are linearly
46
+ independent over `F_{q^m}`.
47
+
48
+ EXAMPLES:
49
+
50
+ A Gabidulin Code can be constructed in the following way::
51
+
52
+ sage: Fqm = GF(16)
53
+ sage: Fq = GF(4)
54
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
55
+ sage: C
56
+ [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
57
+ """
58
+ _registered_encoders = {}
59
+ _registered_decoders = {}
60
+
61
+ def __init__(self, base_field, length, dimension, sub_field=None,
62
+ twisting_homomorphism=None, evaluation_points=None):
63
+ r"""
64
+ Representation of a Gabidulin Code.
65
+
66
+ INPUT:
67
+
68
+ - ``base_field`` -- finite field of order `q^m` where `q` is a prime power
69
+ and `m` is an integer
70
+
71
+ - ``length`` -- length of the resulting code
72
+
73
+ - ``dimension`` -- dimension of the resulting code
74
+
75
+ - ``sub_field`` -- (default: ``None``) finite field of order `q`
76
+ which is a subfield of the ``base_field``. If not given, it is the
77
+ prime subfield of the ``base_field``.
78
+
79
+ - ``twisting_homomorphism`` -- (default: ``None``) homomorphism of the
80
+ underlying skew polynomial ring. If not given, it is the Frobenius
81
+ endomorphism on ``base_field``, which sends an element `x` to `x^{q}`.
82
+
83
+ - ``evaluation_points`` -- (default: ``None``) list of elements
84
+ `g_0, g_1,...,g_{n-1}` of the ``base_field`` that are linearly
85
+ independent over the ``sub_field``. These elements form the first row
86
+ of the generator matrix. If not specified, these are the `nth` powers
87
+ of the generator of the ``base_field``.
88
+
89
+ Both parameters ``sub_field`` and ``twisting_homomorphism`` are optional.
90
+ Since they are closely related, here is a complete list of behaviours:
91
+
92
+ - both ``sub_field`` and ``twisting_homomorphism`` given -- in this case
93
+ we only check that given that ``twisting_homomorphism`` has a fixed
94
+ field method, it returns ``sub_field``
95
+
96
+ - only ``twisting_homomorphism`` given -- we set ``sub_field`` to be the
97
+ fixed field of the ``twisting_homomorphism``. If such method does not
98
+ exist, an error is raised.
99
+
100
+ - only ``sub_field`` given -- we set ``twisting_homomorphism`` to be the
101
+ Frobenius of the field extension
102
+
103
+ - neither ``sub_field`` or ``twisting_homomorphism`` given -- we take
104
+ ``sub_field`` to be the prime field of ``base_field`` and the
105
+ ``twisting_homomorphism`` to be the Frobenius wrt. the prime field
106
+
107
+ TESTS:
108
+
109
+ If ``length`` is bigger than the degree of the extension, an error is
110
+ raised::
111
+
112
+ sage: C = codes.GabidulinCode(GF(64), 4, 3, GF(4))
113
+ Traceback (most recent call last):
114
+ ...
115
+ ValueError: 'length' can be at most the degree of the extension, 3
116
+
117
+ If the number of evaluation points is not equal to the length
118
+ of the code, an error is raised::
119
+
120
+ sage: Fqm = GF(5^20)
121
+ sage: Fq = GF(5)
122
+ sage: aa = Fqm.gen()
123
+ sage: evals = [ aa^i for i in range(21) ]
124
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq, None, evals)
125
+ Traceback (most recent call last):
126
+ ...
127
+ ValueError: the number of evaluation points should be equal to the length of the code
128
+
129
+ If evaluation points are not linearly independent over the ``base_field``,
130
+ an error is raised::
131
+
132
+ sage: evals = [ aa*i for i in range(2) ]
133
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq, None, evals)
134
+ Traceback (most recent call last):
135
+ ...
136
+ ValueError: the evaluation points provided are not linearly independent
137
+
138
+ If an evaluation point does not belong to the ``base_field``, an error
139
+ is raised::
140
+
141
+ sage: a = GF(3).gen()
142
+ sage: evals = [ a*i for i in range(2) ]
143
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq, None, evals)
144
+ Traceback (most recent call last):
145
+ ...
146
+ ValueError: evaluation point does not belong to the 'base field'
147
+
148
+ Given that both ``sub_field`` and ``twisting_homomorphism`` are specified
149
+ and ``twisting_homomorphism`` has a fixed field method. If the fixed
150
+ field of ``twisting_homomorphism`` is not ``sub_field``, an error is
151
+ raised::
152
+
153
+ sage: Fqm = GF(64)
154
+ sage: Fq = GF(8)
155
+ sage: twist = GF(64).frobenius_endomorphism(n=2)
156
+ sage: C = codes.GabidulinCode(Fqm, 3, 2, Fq, twist)
157
+ Traceback (most recent call last):
158
+ ...
159
+ ValueError: the fixed field of the twisting homomorphism has to be the relative field of the extension
160
+
161
+ If ``twisting_homomorphism`` is given, but ``sub_field`` is not. In case
162
+ ``twisting_homomorphism`` does not have a fixed field method, and error
163
+ is raised::
164
+
165
+ sage: Fqm.<z6> = GF(64)
166
+ sage: sigma = Hom(Fqm, Fqm)[1]; sigma
167
+ Ring endomorphism of Finite Field in z6 of size 2^6
168
+ Defn: z6 |--> z6^2
169
+ sage: C = codes.GabidulinCode(Fqm, 3, 2, None, sigma)
170
+ Traceback (most recent call last):
171
+ ...
172
+ ValueError: if 'sub_field' is not given, the twisting homomorphism has to have a 'fixed_field' method
173
+ """
174
+ twist_fix_field = None
175
+ have_twist = (twisting_homomorphism is not None)
176
+ have_subfield = (sub_field is not None)
177
+
178
+ if have_twist and have_subfield:
179
+ try:
180
+ twist_fix_field = twisting_homomorphism.fixed_field()[0]
181
+ except AttributeError:
182
+ pass
183
+ if twist_fix_field and twist_fix_field.order() != sub_field.order():
184
+ raise ValueError("the fixed field of the twisting homomorphism has to be the relative field of the extension")
185
+
186
+ if have_twist and not have_subfield:
187
+ if not twist_fix_field:
188
+ raise ValueError("if 'sub_field' is not given, the twisting homomorphism has to have a 'fixed_field' method")
189
+ else:
190
+ sub_field = twist_fix_field
191
+
192
+ if (not have_twist) and have_subfield:
193
+ twisting_homomorphism = base_field.frobenius_endomorphism(n=sub_field.degree())
194
+
195
+ if (not have_twist) and not have_subfield:
196
+ sub_field = base_field.base_ring()
197
+ twisting_homomorphism = base_field.frobenius_endomorphism()
198
+
199
+ self._twisting_homomorphism = twisting_homomorphism
200
+
201
+ super().__init__(base_field, sub_field, length, "VectorEvaluation", "Gao")
202
+
203
+ if length > self.extension_degree():
204
+ raise ValueError("'length' can be at most the degree of the extension, {}".format(self.extension_degree()))
205
+ if evaluation_points is None:
206
+ evaluation_points = [base_field.gen()**i for i in range(base_field.degree())][:length]
207
+ else:
208
+ if not len(evaluation_points) == length:
209
+ raise ValueError("the number of evaluation points should be equal to the length of the code")
210
+ for i in range(length):
211
+ if evaluation_points[i] not in base_field:
212
+ raise ValueError("evaluation point does not belong to the 'base field'")
213
+ basis = self.matrix_form_of_vector(vector(evaluation_points))
214
+ if basis.rank() != length:
215
+ raise ValueError("the evaluation points provided are not linearly independent")
216
+ self._evaluation_points = evaluation_points
217
+ self._dimension = dimension
218
+
219
+ def _repr_(self):
220
+ """
221
+ Return a string representation of ``self``.
222
+
223
+ EXAMPLES::
224
+
225
+ sage: Fqm = GF(16)
226
+ sage: Fq = GF(4)
227
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq); C
228
+ [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
229
+ """
230
+ R = self.base_field()
231
+ S = self.sub_field()
232
+ if R and S in Fields():
233
+ return "[%s, %s, %s] linear Gabidulin code over GF(%s)/GF(%s)" % (self.length(), self.dimension(), self.minimum_distance(), R.cardinality(), S.cardinality())
234
+ else:
235
+ return "[%s, %s, %s] linear Gabidulin code over %s/%s" % (self.length(), self.dimension(), self.minimum_distance(), R, S)
236
+
237
+ def _latex_(self):
238
+ r"""
239
+ Return a latex representation of ``self``.
240
+
241
+ EXAMPLES::
242
+
243
+ sage: Fqm = GF(16)
244
+ sage: Fq = GF(4)
245
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq);
246
+ sage: latex(C)
247
+ [2, 2, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{2^{4}}/\Bold{F}_{2^{2}}
248
+ """
249
+ txt = "[%s, %s, %s] \\textnormal{ linear Gabidulin code over } %s/%s"
250
+ return txt % (self.length(), self.dimension(), self.minimum_distance(),
251
+ self.base_field()._latex_(), self.sub_field()._latex_())
252
+
253
+ def __eq__(self, other):
254
+ """
255
+ Test equality between Gabidulin Code objects.
256
+
257
+ INPUT:
258
+
259
+ - ``other`` -- another Gabidulin Code object
260
+
261
+ OUTPUT: boolean
262
+
263
+ EXAMPLES::
264
+
265
+ sage: Fqm = GF(16)
266
+ sage: Fq = GF(4)
267
+ sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
268
+ sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
269
+ sage: C1.__eq__(C2)
270
+ True
271
+
272
+ sage: Fqmm = GF(64)
273
+ sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
274
+ sage: C3.__eq__(C2)
275
+ False
276
+ """
277
+ return isinstance(other, GabidulinCode) \
278
+ and self.base_field() == other.base_field() \
279
+ and self.sub_field() == other.sub_field() \
280
+ and self.length() == other.length() \
281
+ and self.dimension() == other.dimension() \
282
+ and self.evaluation_points() == other.evaluation_points()
283
+
284
+ def twisting_homomorphism(self):
285
+ r"""
286
+ Return the twisting homomorphism of ``self``.
287
+
288
+ EXAMPLES::
289
+
290
+ sage: Fqm = GF(5^20)
291
+ sage: Fq = GF(5^4)
292
+ sage: C = codes.GabidulinCode(Fqm, 5, 3, Fq)
293
+ sage: C.twisting_homomorphism()
294
+ Frobenius endomorphism z20 |--> z20^(5^4) on Finite Field in z20 of size 5^20
295
+ """
296
+ return self._twisting_homomorphism
297
+
298
+ def minimum_distance(self):
299
+ r"""
300
+ Return the minimum distance of ``self``.
301
+
302
+ Since Gabidulin Codes are Maximum-Distance-Separable (MDS), this returns
303
+ ``self.length() - self.dimension() + 1``.
304
+
305
+ EXAMPLES::
306
+
307
+ sage: Fqm = GF(5^20)
308
+ sage: Fq = GF(5)
309
+ sage: C = codes.GabidulinCode(Fqm, 20, 15, Fq)
310
+ sage: C.minimum_distance()
311
+ 6
312
+ """
313
+ return self.length() - self.dimension() + 1
314
+
315
+ def parity_evaluation_points(self):
316
+ r"""
317
+ Return the parity evaluation points of ``self``.
318
+
319
+ These form the first row of the parity check matrix of ``self``.
320
+
321
+ EXAMPLES::
322
+
323
+ sage: C = codes.GabidulinCode(GF(2^10), 5, 2)
324
+ sage: list(C.parity_check_matrix().row(0)) == C.parity_evaluation_points() #indirect_doctest
325
+ True
326
+ """
327
+ eval_pts = self.evaluation_points()
328
+ n = self.length()
329
+ k = self.dimension()
330
+ sigma = self.twisting_homomorphism()
331
+
332
+ coefficient_matrix = matrix(self.base_field(), n - 1, n,
333
+ lambda i, j: (sigma**(-n + k + 1 + i))(eval_pts[j]))
334
+ solution_space = coefficient_matrix.right_kernel()
335
+ return list(solution_space.basis()[0])
336
+
337
+ def dual_code(self):
338
+ r"""
339
+ Return the dual code `C^{\perp}` of ``self``, the code `C`,
340
+
341
+ .. MATH::
342
+
343
+ C^{\perp} = \{ v \in V\ |\ v\cdot c = 0,\ \forall c \in C \}.
344
+
345
+ EXAMPLES::
346
+
347
+ sage: C = codes.GabidulinCode(GF(2^10), 5, 2)
348
+ sage: C1 = C.dual_code(); C1
349
+ [5, 3, 3] linear Gabidulin code over GF(1024)/GF(2)
350
+ sage: C == C1.dual_code()
351
+ True
352
+ """
353
+ return GabidulinCode(self.base_field(), self.length(),
354
+ self.length() - self.dimension(),
355
+ self.sub_field(),
356
+ self.twisting_homomorphism(),
357
+ self.parity_evaluation_points())
358
+
359
+ def parity_check_matrix(self):
360
+ r"""
361
+ Return the parity check matrix of ``self``.
362
+
363
+ This is the generator matrix of the dual code of ``self``.
364
+
365
+ EXAMPLES::
366
+
367
+ sage: C = codes.GabidulinCode(GF(2^3), 3, 2)
368
+ sage: C.parity_check_matrix()
369
+ [ 1 z3 z3^2 + z3]
370
+ sage: C.parity_check_matrix() == C.dual_code().generator_matrix()
371
+ True
372
+ """
373
+ return self.dual_code().generator_matrix()
374
+
375
+ def evaluation_points(self):
376
+ """
377
+ Return the evaluation points of ``self``.
378
+
379
+ EXAMPLES::
380
+
381
+ sage: Fqm = GF(5^20)
382
+ sage: Fq = GF(5^4)
383
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
384
+ sage: C.evaluation_points()
385
+ [1, z20, z20^2, z20^3]
386
+ """
387
+ return self._evaluation_points
388
+
389
+ # ---------------------- encoders ------------------------------
390
+
391
+
392
+ class GabidulinVectorEvaluationEncoder(Encoder):
393
+
394
+ def __init__(self, code):
395
+ """
396
+ This method constructs the vector evaluation encoder for
397
+ Gabidulin Codes.
398
+
399
+ INPUT:
400
+
401
+ - ``code`` -- the associated code of this encoder
402
+
403
+ EXAMPLES::
404
+
405
+ sage: Fqm = GF(16)
406
+ sage: Fq = GF(4)
407
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
408
+ sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C)
409
+ sage: E
410
+ Vector evaluation style encoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
411
+
412
+ Alternatively, we can construct the encoder from ``C`` directly::
413
+
414
+ sage: E = C.encoder("VectorEvaluation")
415
+ sage: E
416
+ Vector evaluation style encoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
417
+
418
+ TESTS:
419
+
420
+ If the code is not a Gabidulin code, an error is raised::
421
+
422
+ sage: C = codes.HammingCode(GF(4), 2)
423
+ sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C)
424
+ Traceback (most recent call last):
425
+ ...
426
+ ValueError: code has to be a Gabidulin code
427
+ """
428
+ if not isinstance(code, GabidulinCode):
429
+ raise ValueError("code has to be a Gabidulin code")
430
+ super().__init__(code)
431
+
432
+ def _repr_(self):
433
+ """
434
+ Return a string representation of ``self``.
435
+
436
+ EXAMPLES::
437
+
438
+ sage: Fqm = GF(5^20)
439
+ sage: Fq = GF(5^4)
440
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
441
+ sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C); E
442
+ Vector evaluation style encoder for [4, 4, 1] linear Gabidulin code over GF(95367431640625)/GF(625)
443
+ """
444
+ return "Vector evaluation style encoder for %s" % self.code()
445
+
446
+ def _latex_(self):
447
+ r"""
448
+ Return a latex representation of ``self``.
449
+
450
+ EXAMPLES::
451
+
452
+ sage: Fqm = GF(5^20)
453
+ sage: Fq = GF(5^4)
454
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
455
+ sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C)
456
+ sage: latex(E)
457
+ \textnormal{Vector evaluation style encoder for } [4, 4, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{5^{20}}/\Bold{F}_{5^{4}}
458
+ """
459
+ return "\\textnormal{Vector evaluation style encoder for } %s" % self.code()._latex_()
460
+
461
+ def __eq__(self, other):
462
+ """
463
+ Test equality between Gabidulin Generator Matrix Encoder objects.
464
+
465
+ INPUT:
466
+
467
+ - ``other`` -- another Gabidulin Generator Matrix Encoder
468
+
469
+ OUTPUT: boolean
470
+
471
+ EXAMPLES::
472
+
473
+ sage: Fqm = GF(16)
474
+ sage: Fq = GF(4)
475
+ sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
476
+ sage: E1 = codes.encoders.GabidulinVectorEvaluationEncoder(C1)
477
+ sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
478
+ sage: E2 = codes.encoders.GabidulinVectorEvaluationEncoder(C2)
479
+ sage: E1.__eq__(E2)
480
+ True
481
+
482
+ sage: Fqmm = GF(64)
483
+ sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
484
+ sage: E3 = codes.encoders.GabidulinVectorEvaluationEncoder(C3)
485
+ sage: E3.__eq__(E2)
486
+ False
487
+ """
488
+ return isinstance(other, GabidulinVectorEvaluationEncoder) \
489
+ and self.code() == other.code()
490
+
491
+ def generator_matrix(self):
492
+ """
493
+ Return the generator matrix of ``self``.
494
+
495
+ EXAMPLES::
496
+
497
+ sage: Fqm = GF(2^9)
498
+ sage: Fq = GF(2^3)
499
+ sage: C = codes.GabidulinCode(Fqm, 3, 3, Fq)
500
+ sage: (list(C.generator_matrix().row(1))
501
+ ....: == [C.evaluation_points()[i]**(2**3) for i in range(3)])
502
+ True
503
+ """
504
+ from functools import reduce
505
+ C = self.code()
506
+ eval_pts = C.evaluation_points()
507
+ sigma = C.twisting_homomorphism()
508
+
509
+ def create_matrix_elements(A, k, f):
510
+ return reduce(lambda L, x: [x] +
511
+ [list(map(f, l)) for l in L], [A] * k, [])
512
+ return matrix(C.base_field(), C.dimension(), C.length(),
513
+ create_matrix_elements(eval_pts, C.dimension(), sigma))
514
+
515
+
516
+ class GabidulinPolynomialEvaluationEncoder(Encoder):
517
+ r"""
518
+ Encoder for Gabidulin codes which uses evaluation of skew polynomials to
519
+ obtain codewords.
520
+
521
+ Let `C` be a Gabidulin code of length `n` and dimension `k` over some
522
+ finite field `F = GF(q^m)`. We denote by `\alpha_i` its evaluations
523
+ points, where `1 \leq i \leq n`. Let `p`, a skew polynomial of degree at
524
+ most `k-1` in `F[x]`, be the message.
525
+
526
+ The encoding of `m` will be the following codeword:
527
+
528
+ .. MATH::
529
+
530
+ (p(\alpha_1), \dots, p(\alpha_n)).
531
+
532
+ TESTS:
533
+
534
+ This module uses the following experimental feature.
535
+ This test block is here only to trigger the experimental warning so it does not
536
+ interferes with doctests::
537
+
538
+ sage: Fqm = GF(2^9)
539
+ sage: Fq = GF(2^3)
540
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
541
+ sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
542
+ sage: z9 = Fqm.gen()
543
+ sage: p = (z9^6 + z9^2 + z9 + 1)*x + z9^7 + z9^5 + z9^4 + z9^2
544
+ sage: vector(p.multi_point_evaluation(C.evaluation_points()))
545
+ doctest:...: FutureWarning: This class/method/function is marked as experimental.
546
+ It, its functionality or its interface might change without a formal deprecation.
547
+ See https://github.com/sagemath/sage/issues/13215 for details.
548
+ (z9^7 + z9^6 + z9^5 + z9^4 + z9 + 1, z9^6 + z9^5 + z9^3 + z9)
549
+
550
+ EXAMPLES::
551
+
552
+ sage: Fqm = GF(16)
553
+ sage: Fq = GF(4)
554
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
555
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
556
+ sage: E
557
+ Polynomial evaluation style encoder for
558
+ [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
559
+
560
+ Alternatively, we can construct the encoder from ``C`` directly::
561
+
562
+ sage: E = C.encoder("PolynomialEvaluation")
563
+ sage: E
564
+ Polynomial evaluation style encoder for
565
+ [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
566
+ """
567
+
568
+ def __init__(self, code):
569
+ r"""
570
+ INPUT:
571
+
572
+ - ``code`` -- the associated code of this encoder
573
+
574
+ TESTS:
575
+
576
+ If the code is not a Gabidulin code, an error is raised::
577
+
578
+ sage: C = codes.HammingCode(GF(4), 2)
579
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
580
+ Traceback (most recent call last):
581
+ ...
582
+ ValueError: code has to be a Gabidulin code
583
+ """
584
+ if not isinstance(code, GabidulinCode):
585
+ raise ValueError("code has to be a Gabidulin code")
586
+ super().__init__(code)
587
+
588
+ def _repr_(self):
589
+ """
590
+ Return a string representation of ``self``.
591
+
592
+ EXAMPLES::
593
+
594
+ sage: Fqm = GF(5^20)
595
+ sage: Fq = GF(5^4)
596
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
597
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C); E
598
+ Polynomial evaluation style encoder for [4, 4, 1] linear Gabidulin code over GF(95367431640625)/GF(625)
599
+ """
600
+ return "Polynomial evaluation style encoder for %s" % self.code()
601
+
602
+ def _latex_(self):
603
+ r"""
604
+ Return a latex representation of ``self``.
605
+
606
+ EXAMPLES::
607
+
608
+ sage: Fqm = GF(5^20)
609
+ sage: Fq = GF(5^4)
610
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
611
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
612
+ sage: latex(E)
613
+ \textnormal{Polynomial evaluation style encoder for } [4, 4, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{5^{20}}/\Bold{F}_{5^{4}}
614
+ """
615
+ return "\\textnormal{Polynomial evaluation style encoder for } %s" % self.code()._latex_()
616
+
617
+ def __eq__(self, other):
618
+ """
619
+ Test equality between Gabidulin Polynomial Evaluation Encoder objects.
620
+
621
+ INPUT:
622
+
623
+ - ``other`` -- another Gabidulin Polynomial Evaluation Encoder
624
+
625
+ OUTPUT: boolean
626
+
627
+ EXAMPLES::
628
+
629
+ sage: Fqm = GF(16)
630
+ sage: Fq = GF(4)
631
+ sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
632
+ sage: E1 = codes.encoders.GabidulinPolynomialEvaluationEncoder(C1)
633
+ sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
634
+ sage: E2 = codes.encoders.GabidulinPolynomialEvaluationEncoder(C2)
635
+ sage: E1.__eq__(E2)
636
+ True
637
+
638
+ sage: Fqmm = GF(64)
639
+ sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
640
+ sage: E3 = codes.encoders.GabidulinPolynomialEvaluationEncoder(C3)
641
+ sage: E3.__eq__(E2)
642
+ False
643
+ """
644
+ return isinstance(other, GabidulinPolynomialEvaluationEncoder) \
645
+ and self.code() == other.code()
646
+
647
+ def message_space(self):
648
+ r"""
649
+ Return the message space of the associated code of ``self``.
650
+
651
+ EXAMPLES::
652
+
653
+ sage: Fqm = GF(5^20)
654
+ sage: Fq = GF(5^4)
655
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
656
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
657
+ sage: E.message_space()
658
+ Ore Polynomial Ring in x over Finite Field in z20 of size 5^20
659
+ twisted by z20 |--> z20^(5^4)
660
+ """
661
+ C = self.code()
662
+ return C.base_field()['x', C.twisting_homomorphism()]
663
+
664
+ def encode(self, p, form='vector'):
665
+ """
666
+ Transform the polynomial ``p`` into a codeword of :meth:`code`.
667
+
668
+ The output codeword can be represented as a vector or a matrix,
669
+ depending on the ``form`` input.
670
+
671
+ INPUT:
672
+
673
+ - ``p`` -- a skew polynomial from the message space of ``self`` of degree
674
+ less than ``self.code().dimension()``
675
+
676
+ - ``form`` -- type parameter taking strings "vector" or "matrix"
677
+ as values and converting the output codeword into the respective form
678
+ (default: ``'vector'``)
679
+
680
+ OUTPUT: a codeword corresponding to `p` in vector or matrix form
681
+
682
+ EXAMPLES::
683
+
684
+ sage: Fqm = GF(2^9)
685
+ sage: Fq = GF(2^3)
686
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
687
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
688
+ sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
689
+ sage: z9 = Fqm.gen()
690
+ sage: p = (z9^6 + z9^2 + z9 + 1)*x + z9^7 + z9^5 + z9^4 + z9^2
691
+ sage: codeword_vector = E.encode(p, "vector"); codeword_vector
692
+ (z9^7 + z9^6 + z9^5 + z9^4 + z9 + 1, z9^6 + z9^5 + z9^3 + z9)
693
+ sage: codeword_matrix = E.encode(p, "matrix"); codeword_matrix
694
+ [ z3 z3^2 + z3]
695
+ [ z3 1]
696
+ [ z3^2 z3^2 + z3 + 1]
697
+
698
+ TESTS:
699
+
700
+ If the skew polynomial, `p`, has degree greater than or equal to the
701
+ dimension of the code, an error is raised::
702
+
703
+ sage: t = z9^4*x^2 + z9
704
+ sage: codeword_vector = E.encode(t, "vector"); codeword_vector
705
+ Traceback (most recent call last):
706
+ ...
707
+ ValueError: the skew polynomial to encode must have degree at most 1
708
+
709
+ The skew polynomial, `p`, must belong to the message space of the code.
710
+ Otherwise, an error is raised::
711
+
712
+ sage: Fqmm = GF(2^12)
713
+ sage: S.<x> = Fqmm['x', Fqmm.frobenius_endomorphism(n=3)]
714
+ sage: q = S.random_element(degree=2)
715
+ sage: codeword_vector = E.encode(q, "vector"); codeword_vector
716
+ Traceback (most recent call last):
717
+ ...
718
+ ValueError: the message to encode must be in Ore Polynomial Ring in x over Finite Field in z9 of size 2^9 twisted by z9 |--> z9^(2^3)
719
+ """
720
+ C = self.code()
721
+ M = self.message_space()
722
+ if p not in M:
723
+ raise ValueError("the message to encode must be in %s" % M)
724
+ if p.degree() >= C.dimension():
725
+ raise ValueError("the skew polynomial to encode must have degree at most %s" % (C.dimension() - 1))
726
+ eval_pts = C.evaluation_points()
727
+ codeword = p.multi_point_evaluation(eval_pts)
728
+ if form == "vector":
729
+ return vector(codeword)
730
+ elif form == "matrix":
731
+ return C.matrix_form_of_vector(vector(codeword))
732
+ else:
733
+ return ValueError("the argument 'form' takes only either 'vector' or 'matrix' as valid input")
734
+
735
+ def unencode_nocheck(self, c):
736
+ """
737
+ Return the message corresponding to the codeword ``c``.
738
+
739
+ Use this method with caution: it does not check if ``c``
740
+ belongs to the code, and if this is not the case, the output is
741
+ unspecified.
742
+
743
+ INPUT:
744
+
745
+ - ``c`` -- a codeword of :meth:`code`
746
+
747
+ OUTPUT:
748
+
749
+ - a skew polynomial of degree less than ``self.code().dimension()``
750
+
751
+ EXAMPLES::
752
+
753
+ sage: Fqm = GF(2^9)
754
+ sage: Fq = GF(2^3)
755
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
756
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
757
+ sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
758
+ sage: z9 = Fqm.gen()
759
+ sage: p = (z9^6 + z9^4)*x + z9^2 + z9
760
+ sage: codeword_vector = E.encode(p, "vector")
761
+ sage: E.unencode_nocheck(codeword_vector)
762
+ (z9^6 + z9^4)*x + z9^2 + z9
763
+ """
764
+ C = self.code()
765
+ eval_pts = C.evaluation_points()
766
+ values = [c[i] for i in range(len(c))]
767
+ points = [(eval_pts[i], values[i]) for i in range(len(eval_pts))]
768
+ p = self.message_space().lagrange_polynomial(points)
769
+ return p
770
+
771
+
772
+ # ---------------------- decoders ------------------------------
773
+
774
+
775
+ class GabidulinGaoDecoder(Decoder):
776
+
777
+ def __init__(self, code):
778
+ r"""
779
+ Gao style decoder for Gabidulin Codes.
780
+
781
+ INPUT:
782
+
783
+ - ``code`` -- the associated code of this decoder
784
+
785
+ EXAMPLES::
786
+
787
+ sage: Fqm = GF(16)
788
+ sage: Fq = GF(4)
789
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
790
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
791
+ sage: D
792
+ Gao decoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
793
+
794
+ Alternatively, we can construct the encoder from ``C`` directly::
795
+
796
+ sage: D = C.decoder("Gao")
797
+ sage: D
798
+ Gao decoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
799
+
800
+ TESTS:
801
+
802
+ If the code is not a Gabidulin code, an error is raised::
803
+
804
+ sage: C = codes.HammingCode(GF(4), 2)
805
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
806
+ Traceback (most recent call last):
807
+ ...
808
+ ValueError: code has to be a Gabidulin code
809
+ """
810
+ if not isinstance(code, GabidulinCode):
811
+ raise ValueError("code has to be a Gabidulin code")
812
+ super().__init__(code, code.ambient_space(), "PolynomialEvaluation")
813
+
814
+ def _repr_(self):
815
+ """
816
+ Return a string representation of ``self``.
817
+
818
+ EXAMPLES::
819
+
820
+ sage: Fqm = GF(5^20)
821
+ sage: Fq = GF(5^4)
822
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
823
+ sage: D = codes.decoders.GabidulinGaoDecoder(C); D
824
+ Gao decoder for [4, 4, 1] linear Gabidulin code over GF(95367431640625)/GF(625)
825
+ """
826
+ return "Gao decoder for %s" % self.code()
827
+
828
+ def _latex_(self):
829
+ r"""
830
+ Return a latex representation of ``self``.
831
+
832
+ EXAMPLES::
833
+
834
+ sage: Fqm = GF(5^20)
835
+ sage: Fq = GF(5^4)
836
+ sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
837
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
838
+ sage: latex(D)
839
+ \textnormal{Gao decoder for } [4, 4, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{5^{20}}/\Bold{F}_{5^{4}}
840
+ """
841
+ return "\\textnormal{Gao decoder for } %s" % self.code()._latex_()
842
+
843
+ def __eq__(self, other) -> bool:
844
+ """
845
+ Test equality between Gabidulin Gao Decoder objects.
846
+
847
+ INPUT:
848
+
849
+ - ``other`` -- another Gabidulin Gao Decoder
850
+
851
+ OUTPUT: boolean
852
+
853
+ EXAMPLES::
854
+
855
+ sage: Fqm = GF(16)
856
+ sage: Fq = GF(4)
857
+ sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
858
+ sage: D1 = codes.decoders.GabidulinGaoDecoder(C1)
859
+ sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
860
+ sage: D2 = codes.decoders.GabidulinGaoDecoder(C2)
861
+ sage: D1.__eq__(D2)
862
+ True
863
+
864
+ sage: Fqmm = GF(64)
865
+ sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
866
+ sage: D3 = codes.decoders.GabidulinGaoDecoder(C3)
867
+ sage: D3.__eq__(D2)
868
+ False
869
+ """
870
+ return isinstance(other, GabidulinGaoDecoder) \
871
+ and self.code() == other.code()
872
+
873
+ def _partial_xgcd(self, a, b, d_stop):
874
+ """
875
+ Compute the partial gcd of `a` and `b` using the right linearized
876
+ extended Euclidean algorithm up to the `d_stop` iterations. This
877
+ is a private method for internal use only.
878
+
879
+ INPUT:
880
+
881
+ - ``a`` -- a skew polynomial
882
+
883
+ - ``b`` -- another skew polynomial
884
+
885
+ - ``d_stop`` -- the number of iterations for which the algorithm
886
+ is to be run
887
+
888
+ OUTPUT: ``r_c`` -- right linearized remainder of `a` and `b`
889
+
890
+ - ``u_c`` -- right linearized quotient of `a` and `b`
891
+
892
+ EXAMPLES::
893
+
894
+ sage: Fqm = GF(2^9)
895
+ sage: Fq = GF(2^3)
896
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
897
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
898
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
899
+ sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
900
+ sage: z9 = Fqm.gen()
901
+ sage: p = (z9^6 + z9^4)*x + z9^2 + z9
902
+ sage: codeword_vector = E.encode(p, "vector")
903
+ sage: r = D.decode_to_message(codeword_vector) #indirect_doctest
904
+ sage: r
905
+ (z9^6 + z9^4)*x + z9^2 + z9
906
+ """
907
+ S = self.message_space()
908
+ if (a not in S) or (b not in S):
909
+ raise ValueError("both the input polynomials must belong to %s" % S)
910
+ if a.degree() < b.degree():
911
+ raise ValueError("degree of first polynomial must be greater than or equal to degree of second polynomial")
912
+ r_p = a
913
+ r_c = b
914
+ u_p = S.zero()
915
+ u_c = S.one()
916
+ v_p = u_c
917
+ v_c = u_p
918
+
919
+ while r_c.degree() >= d_stop:
920
+ (q, r_c), r_p = r_p.right_quo_rem(r_c), r_c
921
+ u_c, u_p = u_p - q * u_c, u_c
922
+ v_c, v_p = v_p - q * v_c, v_c
923
+ return r_c, u_c
924
+
925
+ def _decode_to_code_and_message(self, r):
926
+ """
927
+ Return the decoded codeword and message (skew polynomial)
928
+ corresponding to the received codeword `r`. This is a
929
+ private method for internal use only.
930
+
931
+ INPUT:
932
+
933
+ - ``r`` -- received codeword
934
+
935
+ OUTPUT:
936
+
937
+ - the decoded codeword and decoded message corresponding to
938
+ the received codeword `r`
939
+
940
+ EXAMPLES::
941
+
942
+ sage: Fqm = GF(2^9)
943
+ sage: Fq = GF(2^3)
944
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
945
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
946
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
947
+ sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
948
+ sage: z9 = Fqm.gen()
949
+ sage: p = (z9^6 + z9^4)*x + z9^2 + z9
950
+ sage: codeword_vector = E.encode(p, "vector")
951
+ sage: r = D.decode_to_message(codeword_vector) #indirect doctest
952
+ sage: r
953
+ (z9^6 + z9^4)*x + z9^2 + z9
954
+ """
955
+ C = self.code()
956
+ length = len(r)
957
+ eval_pts = C.evaluation_points()
958
+ S = self.message_space()
959
+
960
+ if length == C.dimension() or r in C:
961
+ return r, self.connected_encoder().unencode_nocheck(r)
962
+
963
+ points = [(eval_pts[i], r[i]) for i in range(len(eval_pts))]
964
+ # R = S.lagrange_polynomial(eval_pts, list(r))
965
+ R = S.lagrange_polynomial(points)
966
+ r_out, u_out = self._partial_xgcd(S.minimal_vanishing_polynomial(eval_pts),
967
+ R, (C.length() + C.dimension()) // 2)
968
+ quo, rem = r_out.left_quo_rem(u_out)
969
+ if not rem.is_zero():
970
+ raise DecodingError("Decoding failed because the number of errors exceeded the decoding radius")
971
+ if quo not in S:
972
+ raise DecodingError("Decoding failed because the number of errors exceeded the decoding radius")
973
+ c = self.connected_encoder().encode(quo)
974
+ if C.rank_weight_of_vector(c - r) > self.decoding_radius():
975
+ raise DecodingError("Decoding failed because the number of errors exceeded the decoding radius")
976
+ return c, quo
977
+
978
+ def decode_to_code(self, r):
979
+ """
980
+ Return the decoded codeword corresponding to the
981
+ received word `r`.
982
+
983
+ INPUT:
984
+
985
+ - ``r`` -- received codeword
986
+
987
+ OUTPUT: the decoded codeword corresponding to the received codeword
988
+
989
+ EXAMPLES::
990
+
991
+ sage: Fqm = GF(3^20)
992
+ sage: Fq = GF(3)
993
+ sage: C = codes.GabidulinCode(Fqm, 5, 3, Fq)
994
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
995
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
996
+ sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
997
+ sage: z20 = Fqm.gen()
998
+ sage: p = x
999
+ sage: codeword_vector = E.encode(p, "vector")
1000
+ sage: codeword_vector
1001
+ (1, z20^3, z20^6, z20^9, z20^12)
1002
+ sage: l = list(codeword_vector)
1003
+ sage: l[0] = l[1] #make an error
1004
+ sage: D.decode_to_code(vector(l))
1005
+ (1, z20^3, z20^6, z20^9, z20^12)
1006
+ """
1007
+ return self._decode_to_code_and_message(r)[0]
1008
+
1009
+ def decode_to_message(self, r):
1010
+ """
1011
+ Return the skew polynomial (message) corresponding to the
1012
+ received word `r`.
1013
+
1014
+ INPUT:
1015
+
1016
+ - ``r`` -- received codeword
1017
+
1018
+ OUTPUT: the message corresponding to the received codeword
1019
+
1020
+ EXAMPLES::
1021
+
1022
+ sage: Fqm = GF(2^9)
1023
+ sage: Fq = GF(2^3)
1024
+ sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
1025
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
1026
+ sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
1027
+ sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
1028
+ sage: z9 = Fqm.gen()
1029
+ sage: p = (z9^6 + z9^4)*x + z9^2 + z9
1030
+ sage: codeword_vector = E.encode(p, "vector")
1031
+ sage: r = D.decode_to_message(codeword_vector)
1032
+ sage: r
1033
+ (z9^6 + z9^4)*x + z9^2 + z9
1034
+ """
1035
+ return self._decode_to_code_and_message(r)[1]
1036
+
1037
+ def decoding_radius(self):
1038
+ """
1039
+ Return the decoding radius of the Gabidulin Gao Decoder.
1040
+
1041
+ EXAMPLES::
1042
+
1043
+ sage: Fqm = GF(5^20)
1044
+ sage: Fq = GF(5)
1045
+ sage: C = codes.GabidulinCode(Fqm, 20, 4, Fq)
1046
+ sage: D = codes.decoders.GabidulinGaoDecoder(C)
1047
+ sage: D.decoding_radius()
1048
+ 8
1049
+ """
1050
+ return (self.code().minimum_distance() - 1) // 2
1051
+
1052
+ # ----------------------------- registration --------------------------------
1053
+
1054
+
1055
+ GabidulinCode._registered_encoders["PolynomialEvaluation"] = GabidulinPolynomialEvaluationEncoder
1056
+ GabidulinCode._registered_encoders["VectorEvaluation"] = GabidulinVectorEvaluationEncoder
1057
+
1058
+ GabidulinCode._registered_decoders["Gao"] = GabidulinGaoDecoder