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,1032 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.modules sage.rings.finite_rings
3
+ r"""
4
+ Information-set decoding for linear codes
5
+
6
+ Information-set decoding is a probabilistic decoding strategy that
7
+ essentially tries to guess `k` correct positions in the received word,
8
+ where `k` is the dimension of the code. A codeword agreeing with the
9
+ received word on the guessed position can easily be computed, and their
10
+ difference is one possible error vector. A "correct" guess is assumed when
11
+ this error vector has low Hamming weight.
12
+
13
+ This simple algorithm is not very efficient in itself, but there are numerous
14
+ refinements to the strategy that make it very capable over rather large codes.
15
+ Still, the decoding algorithm is exponential in dimension of the code and the
16
+ log of the field size.
17
+
18
+ The ISD strategy requires choosing how many errors is deemed acceptable. One
19
+ choice could be `d/2`, where `d` is the minimum distance of the code, but
20
+ sometimes `d` is not known, or sometimes more errors are expected. If one
21
+ chooses anything above `d/2`, the algorithm does not guarantee to return a
22
+ nearest codeword.
23
+
24
+ AUTHORS:
25
+
26
+ - David Lucas, Johan Rosenkilde, Yann Laigle-Chapuy (2016-02, 2017-06): initial
27
+ version
28
+ """
29
+
30
+ #******************************************************************************
31
+ # Copyright (C) 2017 David Lucas <david.lucas@inria.fr>
32
+ # Johan Rosenkilde <jsrn@jsrn.dk>
33
+ # Yann Laigle-Chapuy
34
+ #
35
+ # This program is free software: you can redistribute it and/or modify
36
+ # it under the terms of the GNU General Public License as published by
37
+ # the Free Software Foundation, either version 2 of the License, or
38
+ # (at your option) any later version.
39
+ #
40
+ # http://www.gnu.org/licenses/
41
+ #******************************************************************************
42
+
43
+ from sage.arith.misc import binomial
44
+ from sage.rings.integer_ring import ZZ
45
+ from sage.rings.integer import Integer
46
+ from sage.modules.free_module_element import free_module_element as vector
47
+ from sage.structure.sage_object import SageObject
48
+ from .decoder import Decoder
49
+
50
+
51
+ def _format_decoding_interval(decoding_interval):
52
+ r"""
53
+ Format the decoding interval of an ISD decoder when calling ``_repr_`` or
54
+ ``_latex_``.
55
+
56
+ EXAMPLES::
57
+
58
+ sage: from sage.coding.information_set_decoder import _format_decoding_interval
59
+ sage: _format_decoding_interval((0,3))
60
+ 'up to 3'
61
+ sage: _format_decoding_interval((2,3))
62
+ 'between 2 and 3'
63
+ sage: _format_decoding_interval((3,3))
64
+ 'exactly 3'
65
+ """
66
+ if decoding_interval[0] == 0:
67
+ return "up to {0}".format(decoding_interval[1])
68
+ if decoding_interval[0] == decoding_interval[1]:
69
+ return "exactly {0}".format(decoding_interval[0])
70
+ return "between {0} and {1}".format(decoding_interval[0], decoding_interval[1])
71
+
72
+
73
+ class InformationSetAlgorithm(SageObject):
74
+ r"""
75
+ Abstract class for algorithms for
76
+ :class:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder`.
77
+
78
+ To sub-class this class, override ``decode`` and ``calibrate``, and call the
79
+ super constructor from ``__init__``.
80
+
81
+ INPUT:
82
+
83
+ - ``code`` -- a linear code for which to decode
84
+
85
+ - ``number_errors`` -- integer; the maximal number of errors to accept as
86
+ correct decoding. An interval can also be specified by giving a pair of
87
+ integers, where both end values are taken to be in the interval.
88
+
89
+ - ``algorithm_name`` -- a name for the specific ISD algorithm used (used for
90
+ printing)
91
+
92
+ - ``parameters`` -- (optional) A dictionary for setting the parameters of
93
+ this ISD algorithm. Note that sanity checking this dictionary for the
94
+ individual sub-classes should be done in the sub-class constructor.
95
+
96
+ EXAMPLES::
97
+
98
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
99
+ sage: LeeBrickellISDAlgorithm(codes.GolayCode(GF(2)), (0,4))
100
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
101
+ decoding up to 4 errors
102
+
103
+ A minimal working example of how to sub-class::
104
+
105
+ sage: from sage.coding.information_set_decoder import InformationSetAlgorithm
106
+ sage: from sage.coding.decoder import DecodingError
107
+ sage: class MinimalISD(InformationSetAlgorithm):
108
+ ....: def __init__(self, code, decoding_interval):
109
+ ....: super().__init__(code, decoding_interval, "MinimalISD")
110
+ ....: def calibrate(self):
111
+ ....: self._parameters = { } # calibrate parameters here
112
+ ....: self._time_estimate = 10.0 # calibrated time estimate
113
+ ....: def decode(self, r):
114
+ ....: # decoding algorithm here
115
+ ....: raise DecodingError("I failed")
116
+ sage: MinimalISD(codes.GolayCode(GF(2)), (0,4))
117
+ ISD Algorithm (MinimalISD) for [24, 12, 8] Extended Golay code over GF(2)
118
+ decoding up to 4 errors
119
+ """
120
+
121
+ def __init__(self, code, decoding_interval, algorithm_name, parameters=None):
122
+ r"""
123
+ TESTS::
124
+
125
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
126
+ sage: LeeBrickellISDAlgorithm(codes.GolayCode(GF(2)), (0,4))
127
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 4 errors
128
+ """
129
+ self._code = code
130
+ self._decoding_interval = decoding_interval
131
+ self._algorithm_name = algorithm_name
132
+ if parameters:
133
+ self._parameters = parameters
134
+ self._parameters_specified = True
135
+ else:
136
+ self._parameters_specified = False
137
+
138
+ def name(self):
139
+ r"""
140
+ Return the name of this ISD algorithm.
141
+
142
+ EXAMPLES::
143
+
144
+ sage: C = codes.GolayCode(GF(2))
145
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
146
+ sage: A = LeeBrickellISDAlgorithm(C, (0,2))
147
+ sage: A.name()
148
+ 'Lee-Brickell'
149
+ """
150
+ return self._algorithm_name
151
+
152
+ def decode(self, r):
153
+ r"""
154
+ Decode a received word using this ISD decoding algorithm.
155
+
156
+ Must be overridden by sub-classes.
157
+
158
+ EXAMPLES::
159
+
160
+ sage: M = matrix(GF(2), [[1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0],\
161
+ ....: [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1],\
162
+ ....: [0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0],\
163
+ ....: [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1],\
164
+ ....: [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1]])
165
+ sage: C = codes.LinearCode(M)
166
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
167
+ sage: A = LeeBrickellISDAlgorithm(C, (2,2))
168
+ sage: r = vector(GF(2), [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
169
+ sage: A.decode(r)
170
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
171
+ """
172
+ raise NotImplementedError
173
+
174
+ def time_estimate(self):
175
+ """
176
+ Estimate for how long this ISD algorithm takes to perform a single decoding.
177
+
178
+ The estimate is for a received word whose number of errors is within the
179
+ decoding interval of this ISD algorithm.
180
+
181
+ EXAMPLES::
182
+
183
+ sage: C = codes.GolayCode(GF(2))
184
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
185
+ sage: A = LeeBrickellISDAlgorithm(C, (0,2))
186
+ sage: A.time_estimate() #random
187
+ 0.0008162108571427874
188
+ """
189
+ if not hasattr(self, "_time_estimate"):
190
+ self.calibrate()
191
+ return self._time_estimate
192
+
193
+ def calibrate(self):
194
+ """
195
+ Uses test computations to estimate optimal values for any parameters
196
+ this ISD algorithm may take.
197
+
198
+ Must be overridden by sub-classes.
199
+
200
+ If ``self._parameters_specified`` is ``False``, this method shall set
201
+ ``self._parameters`` to the best parameters estimated. It shall always
202
+ set ``self._time_estimate`` to the time estimate of using
203
+ ``self._parameters``.
204
+
205
+ EXAMPLES::
206
+
207
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
208
+ sage: C = codes.GolayCode(GF(2))
209
+ sage: A = LeeBrickellISDAlgorithm(C, (0,3))
210
+ sage: A.calibrate()
211
+ sage: A.parameters() #random
212
+ {'search_size': 1}
213
+ """
214
+ raise NotImplementedError
215
+
216
+ def code(self):
217
+ r"""
218
+ Return the code associated to this ISD algorithm.
219
+
220
+ EXAMPLES::
221
+
222
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
223
+ sage: C = codes.GolayCode(GF(2))
224
+ sage: A = LeeBrickellISDAlgorithm(C, (0,3))
225
+ sage: A.code()
226
+ [24, 12, 8] Extended Golay code over GF(2)
227
+ """
228
+ return self._code
229
+
230
+ def decoding_interval(self):
231
+ r"""
232
+ A pair of integers specifying the interval of number of errors this
233
+ ISD algorithm will attempt to correct.
234
+
235
+ The interval includes both end values.
236
+
237
+ EXAMPLES::
238
+
239
+ sage: C = codes.GolayCode(GF(2))
240
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
241
+ sage: A = LeeBrickellISDAlgorithm(C, (0,2))
242
+ sage: A.decoding_interval()
243
+ (0, 2)
244
+ """
245
+ return self._decoding_interval
246
+
247
+ def parameters(self):
248
+ """
249
+ Return any parameters this ISD algorithm uses.
250
+
251
+ If the parameters have not already been set, efficient values will first
252
+ be calibrated and returned.
253
+
254
+ EXAMPLES::
255
+
256
+ sage: C = codes.GolayCode(GF(2))
257
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
258
+ sage: A = LeeBrickellISDAlgorithm(C, (0,4), search_size=3)
259
+ sage: A.parameters()
260
+ {'search_size': 3}
261
+
262
+ If not set, calibration will determine a sensible value::
263
+
264
+ sage: A = LeeBrickellISDAlgorithm(C, (0,4))
265
+ sage: A.parameters() #random
266
+ {'search_size': 1}
267
+ """
268
+ if not hasattr(self, "_parameters"):
269
+ self.calibrate()
270
+ return self._parameters
271
+
272
+ def __eq__(self, other):
273
+ r"""
274
+ Test equality between ISD algorithm objects.
275
+
276
+ EXAMPLES::
277
+
278
+ sage: C = codes.GolayCode(GF(2))
279
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
280
+ sage: A = LeeBrickellISDAlgorithm(C, (0,4))
281
+ sage: A == LeeBrickellISDAlgorithm(C, (0,4))
282
+ True
283
+ sage: A == LeeBrickellISDAlgorithm(C, (0,5))
284
+ False
285
+ sage: other_search = 1 if A.parameters()['search_size'] != 1 else 2
286
+ sage: A == LeeBrickellISDAlgorithm(C, (0,4), search_size=other_search)
287
+ False
288
+
289
+ ISD Algorithm objects can be equal only if they have both calibrated
290
+ the parameters, or if they both had it set and to the same value::
291
+
292
+ sage: A2 = LeeBrickellISDAlgorithm(C, (0,4), search_size=A.parameters()['search_size'])
293
+ sage: A == A2
294
+ False
295
+ sage: A2 == LeeBrickellISDAlgorithm(C, (0,4), search_size=A.parameters()['search_size'])
296
+ True
297
+ """
298
+ return isinstance(other, self.__class__)\
299
+ and self.code() == other.code()\
300
+ and self.decoding_interval() == other.decoding_interval()\
301
+ and self._parameters_specified == other._parameters_specified\
302
+ and (not self._parameters_specified or self.parameters() == other.parameters())
303
+
304
+ def __hash__(self):
305
+ r"""
306
+ Return the hash value of ``self``.
307
+
308
+ EXAMPLES::
309
+
310
+ sage: C = codes.GolayCode(GF(2))
311
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
312
+ sage: A = LeeBrickellISDAlgorithm(C, (0,4))
313
+ sage: hash(A) #random
314
+ 5884357732955478461
315
+ sage: C2 = codes.GolayCode(GF(3))
316
+ sage: A2 = LeeBrickellISDAlgorithm(C2, (0,4))
317
+ sage: hash(A) != hash(A2)
318
+ True
319
+ """
320
+ return hash(str(self))
321
+
322
+ def _repr_(self):
323
+ r"""
324
+ Return a string representation of this ISD algorithm.
325
+
326
+ EXAMPLES::
327
+
328
+ sage: C = codes.GolayCode(GF(2))
329
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
330
+ sage: A = LeeBrickellISDAlgorithm(C, (0,4))
331
+ sage: A
332
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 4 errors
333
+ """
334
+ return "ISD Algorithm ({}) for {} decoding {} errors ".format(self._algorithm_name, self.code(), _format_decoding_interval(self.decoding_interval()))
335
+
336
+ def _latex_(self):
337
+ r"""
338
+ Return a latex representation of this ISD algorithm.
339
+
340
+ EXAMPLES::
341
+
342
+ sage: C = codes.GolayCode(GF(2))
343
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
344
+ sage: A = LeeBrickellISDAlgorithm(C, (0,4))
345
+ sage: latex(A)
346
+ \textnormal{ISD Algorithm (Lee-Brickell) for }[24, 12, 8] \textnormal{ Extended Golay Code over } \Bold{F}_{2} \textnormal{decoding up to 4 errors}
347
+ """
348
+ return "\\textnormal{{ISD Algorithm ({}) for }}{} \\textnormal{{decoding {} errors}}".format(self._algorithm_name, self.code()._latex_(), _format_decoding_interval(self.decoding_interval()))
349
+
350
+
351
+ class LeeBrickellISDAlgorithm(InformationSetAlgorithm):
352
+ r"""
353
+ The Lee-Brickell algorithm for information-set decoding.
354
+
355
+ For a description of the information-set decoding paradigm (ISD), see
356
+ :class:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder`.
357
+
358
+ This implements the Lee-Brickell variant of ISD, see [LB1988]_ for the
359
+ original binary case, and [Pet2010]_ for the `q`-ary extension.
360
+
361
+ Let `C` be a `[n, k]`-linear code over `\GF{q}`, and let `r \in \GF{q}^{n}` be
362
+ a received word in a transmission. We seek the codeword whose Hamming
363
+ distance from `r` is minimal. Let `p` and `w` be integers, such that `0\leq
364
+ p\leq w`, Let `G` be a generator matrix of `C`, and for any set of indices
365
+ `I`, we write `G_{I}` for the matrix formed by the columns of `G` indexed by
366
+ `I`. The Lee-Brickell ISD loops the following until it is successful:
367
+
368
+ 1. Choose an information set `I` of `C`.
369
+ 2. Compute `r' = r - r_{I} G_I^{-1} G`
370
+ 3. Consider every size-`p` subset of `I`, `\{a_1, \dots, a_p\}`.
371
+ For each `m = (m_1, \dots, m_p) \in \GF{q}^{p}`, compute
372
+ the error vector `e = r' - \sum_{i=1}^{p} m_i g_{a_i}`,
373
+ 4. If `e` has a Hamming weight at most `w`, return `r-e`.
374
+
375
+ INPUT:
376
+
377
+ - ``code`` -- a linear code for which to decode
378
+
379
+ - ``decoding_interval`` -- a pair of integers specifying an interval of
380
+ number of errors to correct; includes both end values
381
+
382
+ - ``search_size`` -- (optional) the size of subsets to use on step 3 of the
383
+ algorithm as described above. Usually a small number. It has to be at most
384
+ the largest allowed number of errors. A good choice will be approximated
385
+ if this option is not set; see
386
+ :meth:`sage.coding.LeeBrickellISDAlgorithm.calibrate`
387
+ for details.
388
+
389
+ EXAMPLES::
390
+
391
+ sage: C = codes.GolayCode(GF(2))
392
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
393
+ sage: A = LeeBrickellISDAlgorithm(C, (0,4)); A
394
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
395
+ decoding up to 4 errors
396
+
397
+ sage: C = codes.GolayCode(GF(2))
398
+ sage: A = LeeBrickellISDAlgorithm(C, (2,3)); A
399
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
400
+ decoding between 2 and 3 errors
401
+ """
402
+ def __init__(self, code, decoding_interval, search_size=None):
403
+ r"""
404
+ TESTS:
405
+
406
+ If ``search_size`` is not a positive integer, or is bigger than the
407
+ decoding radius, an error will be raised::
408
+
409
+ sage: C = codes.GolayCode(GF(2))
410
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
411
+ sage: LeeBrickellISDAlgorithm(C, (1, 3), search_size=-1)
412
+ Traceback (most recent call last):
413
+ ...
414
+ ValueError: The search size parameter has to be a positive integer
415
+
416
+ sage: LeeBrickellISDAlgorithm(C, (1, 3), search_size=4)
417
+ Traceback (most recent call last):
418
+ ...
419
+ ValueError: The search size parameter has to be at most the maximal number of allowed errors
420
+ """
421
+ if search_size is not None:
422
+ if not isinstance(search_size, (Integer, int)) or search_size < 0:
423
+ raise ValueError("The search size parameter has to be a positive integer")
424
+ if search_size > decoding_interval[1]:
425
+ raise ValueError("The search size parameter has to be at most"
426
+ " the maximal number of allowed errors")
427
+ super().__init__(code, decoding_interval, "Lee-Brickell",
428
+ parameters={'search_size': search_size})
429
+ self._parameters_specified = True
430
+ else:
431
+ self._parameters_specified = False
432
+ super().__init__(code, decoding_interval, "Lee-Brickell")
433
+
434
+ def decode(self, r):
435
+ r"""
436
+ The Lee-Brickell algorithm as described in the class doc.
437
+
438
+ Note that either parameters must be given at construction time or
439
+ :meth:`sage.coding.information_set_decoder.InformationSetAlgorithm.calibrate()`
440
+ should be called before calling this method.
441
+
442
+ INPUT:
443
+
444
+ - ``r`` -- a received word, i.e. a vector in the ambient space of
445
+ :meth:`decoder.Decoder.code`
446
+
447
+ OUTPUT: a codeword whose distance to `r` satisfies ``self.decoding_interval()``.
448
+
449
+ EXAMPLES::
450
+
451
+ sage: M = matrix(GF(2), [[1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0],\
452
+ ....: [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1],\
453
+ ....: [0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0],\
454
+ ....: [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1],\
455
+ ....: [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1]])
456
+ sage: C = codes.LinearCode(M)
457
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
458
+ sage: A = LeeBrickellISDAlgorithm(C, (2,2))
459
+ sage: c = C.random_element()
460
+ sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
461
+ sage: r = Chan(c)
462
+ sage: c_out = A.decode(r)
463
+ sage: (r - c).hamming_weight() == 2
464
+ True
465
+ """
466
+ import itertools
467
+ from sage.misc.prandom import sample
468
+ C = self.code()
469
+ n, k = C.length(), C.dimension()
470
+ tau = self.decoding_interval()
471
+ p = self.parameters()['search_size']
472
+ F = C.base_ring()
473
+ G = C.generator_matrix()
474
+ Fstar = F.list()[1:]
475
+ while True:
476
+ # step 1.
477
+ I = sample(range(n), k)
478
+ Gi = G.matrix_from_columns(I)
479
+ try:
480
+ Gi_inv = Gi.inverse()
481
+ except ZeroDivisionError:
482
+ # I was not an information set
483
+ continue
484
+ Gt = Gi_inv * G
485
+ # step 2.
486
+ y = r - vector([r[i] for i in I]) * Gt
487
+ g = Gt.rows()
488
+ # step 3.
489
+ for pi in range(p + 1):
490
+ for A in itertools.combinations(range(k), pi):
491
+ for m in itertools.product(Fstar, repeat=pi):
492
+ e = y - sum(m[i] * g[A[i]] for i in range(pi))
493
+ errs = e.hamming_weight()
494
+ if tau[0] <= errs <= tau[1]:
495
+ return r - e
496
+
497
+ def calibrate(self):
498
+ r"""
499
+ Run some test computations to estimate the optimal search size.
500
+
501
+ Let `p` be the search size. We should simply choose `p` such that the
502
+ average expected time is minimal. The algorithm succeeds when it chooses
503
+ an information set with at least `k - p` correct positions, where `k` is
504
+ the dimension of the code and `p` the search size. The expected number
505
+ of trials we need before this occurs is:
506
+
507
+ .. MATH::
508
+
509
+ \binom{n}{k}/(\rho \sum_{i=0}^p \binom{n-\tau}{k-i} \binom{\tau}{i})
510
+
511
+ Here `\rho` is the fraction of `k` subsets of indices which are
512
+ information sets. If `T` is the average time for steps 1 and 2
513
+ (including selecting `I` until an information set is found), while `P(i)`
514
+ is the time for the body of the ``for``-loop in step 3 for `m` of weight
515
+ `i`, then each information set trial takes roughly time `T +
516
+ \sum_{i=0}^{p} P(i) \binom{k}{i} (q-1)^i`, where `\GF{q}` is the base
517
+ field.
518
+
519
+ The values `T` and `P` are here estimated by running a few test
520
+ computations similar to those done by the decoding algorithm.
521
+ We don't explicitly estimate `\rho`.
522
+
523
+ OUTPUT: does not output anything but sets private fields used by
524
+ :meth:`sage.coding.information_set_decoder.InformationSetAlgorithm.parameters()`
525
+ and
526
+ :meth:`sage.coding.information_set_decoder.InformationSetAlgorithm.time_estimate()`.
527
+
528
+ EXAMPLES::
529
+
530
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
531
+ sage: C = codes.GolayCode(GF(2))
532
+ sage: A = LeeBrickellISDAlgorithm(C, (0,3)); A
533
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
534
+ decoding up to 3 errors
535
+ sage: A.calibrate()
536
+ sage: A.parameters() #random
537
+ {'search_size': 1}
538
+ sage: A.time_estimate() #random
539
+ 0.0008162108571427874
540
+
541
+ If we specify the parameter at construction time, calibrate does not override this choice::
542
+
543
+ sage: A = LeeBrickellISDAlgorithm(C, (0,3), search_size=2); A
544
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
545
+ decoding up to 3 errors
546
+ sage: A.parameters()
547
+ {'search_size': 2}
548
+ sage: A.calibrate()
549
+ sage: A.parameters()
550
+ {'search_size': 2}
551
+ sage: A.time_estimate() #random
552
+ 0.0008162108571427874
553
+ """
554
+ from sage.matrix.special import random_matrix
555
+ from sage.misc.prandom import sample, randint
556
+ from sage.modules.free_module_element import random_vector
557
+ from time import process_time
558
+
559
+ C = self.code()
560
+ G = C.generator_matrix()
561
+ n, k = C.length(), C.dimension()
562
+ tau = self.decoding_interval()[1]
563
+ F = C.base_ring()
564
+ q = F.cardinality()
565
+ Fstar = F.list()[1:]
566
+
567
+ def time_information_set_steps():
568
+ before = process_time()
569
+ while True:
570
+ I = sample(range(n), k)
571
+ Gi = G.matrix_from_columns(I)
572
+ try:
573
+ Gi_inv = Gi.inverse()
574
+ except ZeroDivisionError:
575
+ continue
576
+ return process_time() - before
577
+
578
+ def time_search_loop(p):
579
+ y = random_vector(F, n)
580
+ g = random_matrix(F, p, n).rows()
581
+ scalars = [ [ Fstar[randint(0,q-2)] for i in range(p) ]
582
+ for s in range(100) ]
583
+ before = process_time()
584
+ for m in scalars:
585
+ e = y - sum(m[i]*g[i] for i in range(p))
586
+ return (process_time() - before) / 100.
587
+ T = sum([ time_information_set_steps() for s in range(5) ]) / 5.
588
+ P = [ time_search_loop(p) for p in range(tau+1) ]
589
+
590
+ def compute_estimate(p):
591
+ iters = 1. * binomial(n, k) / \
592
+ sum( binomial(n-tau, k-i)*binomial(tau,i) for i in range(p+1) )
593
+ estimate = iters*(T +
594
+ sum(P[pi] * (q-1)**pi * binomial(k, pi) for pi in range(p+1) ))
595
+ return estimate
596
+
597
+ if self._parameters_specified:
598
+ self._time_estimate = compute_estimate(self._parameters['search_size'])
599
+ else:
600
+ self._calibrate_select([ compute_estimate(p) for p in range(tau+1) ])
601
+
602
+ def _calibrate_select(self, estimates):
603
+ r"""
604
+ Internal method used by ``self.calibrate()``.
605
+
606
+ Given the timing estimates, select the best parameter and set the
607
+ appropriate private fields.
608
+
609
+ INPUT:
610
+
611
+ - ``estimates`` -- list of time estimates, for the search size set to the
612
+ index of the list entry
613
+
614
+ OUTPUT: none, but sets the private fields `self._parameters` and
615
+ `self._time_estimate`.
616
+
617
+ TESTS::
618
+
619
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
620
+ sage: C = codes.GolayCode(GF(2))
621
+ sage: A = LeeBrickellISDAlgorithm(C, (0,3)); A
622
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 3 errors
623
+ sage: A._calibrate_select([ 1.0, 2.0, 3.0, 0.5, 0.6, 1.0 ])
624
+ sage: A._time_estimate
625
+ 0.500000000000000
626
+ sage: A._parameters
627
+ {'search_size': 3}
628
+ """
629
+ search_size = 0
630
+ for p in range(1, len(estimates)):
631
+ if estimates[p] < estimates[search_size]:
632
+ search_size = p
633
+ self._parameters = { 'search_size': search_size }
634
+ self._time_estimate = estimates[search_size]
635
+
636
+
637
+ class LinearCodeInformationSetDecoder(Decoder):
638
+ r"""
639
+ Information-set decoder for any linear code.
640
+
641
+ Information-set decoding is a probabilistic decoding strategy that
642
+ essentially tries to guess `k` correct positions in the received word,
643
+ where `k` is the dimension of the code. A codeword agreeing with the
644
+ received word on the guessed position can easily be computed, and their
645
+ difference is one possible error vector. A "correct" guess is assumed when
646
+ this error vector has low Hamming weight.
647
+
648
+ The ISD strategy requires choosing how many errors is deemed acceptable. One
649
+ choice could be `d/2`, where `d` is the minimum distance of the code, but
650
+ sometimes `d` is not known, or sometimes more errors are expected. If one
651
+ chooses anything above `d/2`, the algorithm does not guarantee to return a
652
+ nearest codeword.
653
+
654
+ This simple algorithm is not very efficient in itself, but there are numerous
655
+ refinements to the strategy. Specifying which strategy to use among those
656
+ that Sage knows is done using the ``algorithm`` keyword. If this is not set,
657
+ an efficient choice will be made for you.
658
+
659
+ The various ISD algorithms all need to select a number of parameters. If you
660
+ choose a specific algorithm to use, you can pass these parameters as named
661
+ parameters directly to this class' constructor. If you don't, efficient
662
+ choices will be calibrated for you.
663
+
664
+ .. WARNING::
665
+
666
+ If there is no codeword within the specified decoding distance, then the
667
+ decoder may never terminate, or it may raise a
668
+ :exc:`sage.coding.decoder.DecodingError` exception, depending on the ISD
669
+ algorithm used.
670
+
671
+ INPUT:
672
+
673
+ - ``code`` -- a linear code for which to decode
674
+
675
+ - ``number_errors`` -- integer; the maximal number of errors to accept as
676
+ correct decoding. An interval can also be specified by giving a pair of
677
+ integers, where both end values are taken to be in the interval.
678
+
679
+ - ``algorithm`` -- (optional) the string name of the ISD algorithm to
680
+ employ. If this is not set, an appropriate one will be chosen.
681
+ A constructed
682
+ :class:`sage.coding.information_set_decoder.InformationSetAlgorithm`
683
+ object may also be given. In this case ``number_errors`` must match that
684
+ of the passed algorithm.
685
+
686
+ - ``**kwargs`` -- (optional) any number of named arguments passed on to the
687
+ ISD algorithm. Such are usually not required, and they can only be set if
688
+ ``algorithm`` is set to a specific algorithm. See the documentation for
689
+ each individual ISD algorithm class for information on any named arguments
690
+ they may accept. The easiest way to access this documentation is to first
691
+ construct the decoder without passing any named arguments, then accessing
692
+ the ISD algorithm using
693
+ :meth:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder.algorithm`,
694
+ and then reading the `?` help on the constructed object.
695
+
696
+ EXAMPLES:
697
+
698
+ The principal way to access this class is through the
699
+ :meth:`sage.code.linear_code.AbstractLinearCode.decoder` method::
700
+
701
+ sage: C = codes.GolayCode(GF(3))
702
+ sage: D = C.decoder('InformationSet', 2); D
703
+ Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
704
+ decoding up to 2 errors
705
+
706
+ You can specify which algorithm you wish to use, and you should do so in
707
+ order to pass special parameters to it::
708
+
709
+ sage: C = codes.GolayCode(GF(3))
710
+ sage: D2 = C.decoder('InformationSet', 2, algorithm='Lee-Brickell', search_size=2); D2
711
+ Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
712
+ decoding up to 2 errors
713
+ sage: D2.algorithm()
714
+ ISD Algorithm (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
715
+ decoding up to 2 errors
716
+ sage: D2.algorithm().parameters()
717
+ {'search_size': 2}
718
+
719
+ If you specify an algorithm which is not known, you get a friendly error message::
720
+
721
+ sage: C.decoder('InformationSet', 2, algorithm="NoSuchThing")
722
+ Traceback (most recent call last):
723
+ ...
724
+ ValueError: Unknown ISD algorithm 'NoSuchThing'.
725
+ The known algorithms are ['Lee-Brickell'].
726
+
727
+ You can also construct an ISD algorithm separately and pass that. This is
728
+ mostly useful if you write your own ISD algorithms::
729
+
730
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
731
+ sage: A = LeeBrickellISDAlgorithm(C, (0, 2))
732
+ sage: D = C.decoder('InformationSet', 2, algorithm=A); D
733
+ Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
734
+ decoding up to 2 errors
735
+
736
+ When passing an already constructed ISD algorithm, you can't also pass
737
+ parameters to the ISD algorithm when constructing the decoder::
738
+
739
+ sage: C.decoder('InformationSet', 2, algorithm=A, search_size=2)
740
+ Traceback (most recent call last):
741
+ ...
742
+ ValueError: ISD algorithm arguments are not allowed
743
+ when supplying a constructed ISD algorithm
744
+
745
+ We can also information-set decode non-binary codes::
746
+
747
+ sage: C = codes.GolayCode(GF(3))
748
+ sage: D = C.decoder('InformationSet', 2); D
749
+ Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
750
+ decoding up to 2 errors
751
+
752
+ There are two other ways to access this class::
753
+
754
+ sage: D = codes.decoders.LinearCodeInformationSetDecoder(C, 2); D
755
+ Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
756
+ decoding up to 2 errors
757
+
758
+ sage: from sage.coding.information_set_decoder import LinearCodeInformationSetDecoder
759
+ sage: D = LinearCodeInformationSetDecoder(C, 2); D
760
+ Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
761
+ decoding up to 2 errors
762
+ """
763
+ def __init__(self, code, number_errors, algorithm=None, **kwargs):
764
+ r"""
765
+ TESTS:
766
+
767
+ ``number_errors`` has to be either a list of Integers/ints, a tuple of Integers/ints,
768
+ or an Integer/int::
769
+
770
+ sage: C = codes.GolayCode(GF(2))
771
+ sage: D = C.decoder('InformationSet', "aa")
772
+ Traceback (most recent call last):
773
+ ...
774
+ ValueError: number_errors should be an integer or a pair of integers
775
+
776
+ If ``number_errors`` is passed as a list/tuple, it has to contain only
777
+ two values, the first one being at most the second one::
778
+
779
+ sage: C = codes.GolayCode(GF(2))
780
+ sage: D = C.decoder('InformationSet', (4, 2))
781
+ Traceback (most recent call last):
782
+ ...
783
+ ValueError: number_errors should be a positive integer or a valid interval within the positive integers
784
+
785
+ You cannot ask the decoder to correct more errors than the code length::
786
+
787
+ sage: D = C.decoder('InformationSet', 25)
788
+ Traceback (most recent call last):
789
+ ...
790
+ ValueError: The provided number of errors should be at most the code's length
791
+
792
+ If ``algorithm`` is not set, additional parameters cannot be passed to
793
+ the ISD algorithm::
794
+
795
+ sage: D = C.decoder('InformationSet', 2, search_size=2)
796
+ Traceback (most recent call last):
797
+ ...
798
+ ValueError: Additional arguments to an information-set decoder algorithm are only allowed if a specific algorithm is selected by setting the algorithm keyword
799
+
800
+ If ``algorithm`` is set to a constructed ISD algorithm, additional
801
+ parameters cannot be passed to the ISD algorithm::
802
+
803
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
804
+ sage: A = LeeBrickellISDAlgorithm(C, (0, 2))
805
+ sage: D = C.decoder('InformationSet', 2, A, search_size=3)
806
+ Traceback (most recent call last):
807
+ ...
808
+ ValueError: ISD algorithm arguments are not allowed when supplying a constructed ISD algorithm
809
+
810
+ If ``algorithm`` is set to a constructed
811
+ :class:`sage.coding.information_set_decoder.InformationSetAlgorithm`,
812
+ then ``number_errors`` must match that of the algorithm::
813
+
814
+ sage: C = codes.GolayCode(GF(2))
815
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
816
+ sage: A = LeeBrickellISDAlgorithm(C, (0, 2))
817
+ sage: D = C.decoder('InformationSet', 2, A); D
818
+ Information-set decoder (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 2 errors
819
+ sage: D = C.decoder('InformationSet', (0,2), A); D
820
+ Information-set decoder (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 2 errors
821
+ sage: D = C.decoder('InformationSet', 3, A); D
822
+ Traceback (most recent call last):
823
+ ...
824
+ ValueError: number_errors must match that of the passed ISD algorithm
825
+ """
826
+ if isinstance(number_errors, (Integer, int)):
827
+ number_errors = (0, number_errors)
828
+ if isinstance(number_errors, (tuple, list)) and len(number_errors) == 2 \
829
+ and number_errors[0] in ZZ and number_errors[1] in ZZ:
830
+ if 0 > number_errors[0] or number_errors[0] > number_errors[1]:
831
+ raise ValueError(
832
+ "number_errors should be a positive integer or"
833
+ " a valid interval within the positive integers")
834
+ if number_errors[1] > code.length():
835
+ raise ValueError("The provided number of errors should be at"
836
+ " most the code's length")
837
+ else:
838
+ raise ValueError("number_errors should be an integer or a pair of integers")
839
+
840
+ self._number_errors = number_errors
841
+
842
+ super().__init__(code, code.ambient_space(), code._default_encoder_name)
843
+
844
+ if algorithm is None:
845
+ if kwargs:
846
+ raise ValueError("Additional arguments to an information-set decoder"
847
+ " algorithm are only allowed if a specific"
848
+ " algorithm is selected by setting the algorithm"
849
+ " keyword")
850
+ algorithm = "Lee-Brickell"
851
+ algorithm_names = LinearCodeInformationSetDecoder.known_algorithms(dictionary=True)
852
+
853
+ if isinstance(algorithm, InformationSetAlgorithm):
854
+ if kwargs:
855
+ raise ValueError("ISD algorithm arguments are not allowed when"
856
+ " supplying a constructed ISD algorithm")
857
+ if number_errors != algorithm.decoding_interval():
858
+ raise ValueError("number_errors must match that of the passed"
859
+ " ISD algorithm")
860
+ self._algorithm = algorithm
861
+ elif algorithm in algorithm_names:
862
+ self._algorithm = algorithm_names[algorithm](code, number_errors, **kwargs)
863
+ else:
864
+ raise ValueError("Unknown ISD algorithm '{}'."
865
+ " The known algorithms are {}."
866
+ .format(algorithm, sorted(algorithm_names)))
867
+
868
+ _known_algorithms = {
869
+ "Lee-Brickell": LeeBrickellISDAlgorithm
870
+ }
871
+
872
+ @staticmethod
873
+ def known_algorithms(dictionary=False):
874
+ r"""
875
+ Return the list of ISD algorithms that Sage knows.
876
+
877
+ Passing any of these to the constructor of
878
+ :class:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder`
879
+ will make the ISD decoder use that algorithm.
880
+
881
+ INPUT:
882
+
883
+ - ``dictionary`` -- boolean (default: ``False``); if set to ``True``,
884
+ return a ``dict`` mapping decoding algorithm name to its class
885
+
886
+ OUTPUT: list of strings or a ``dict`` from string to ISD algorithm class
887
+
888
+ EXAMPLES::
889
+
890
+ sage: from sage.coding.information_set_decoder import LinearCodeInformationSetDecoder
891
+ sage: sorted(LinearCodeInformationSetDecoder.known_algorithms())
892
+ ['Lee-Brickell']
893
+ """
894
+ if dictionary:
895
+ return LinearCodeInformationSetDecoder._known_algorithms
896
+ else:
897
+ return LinearCodeInformationSetDecoder._known_algorithms.keys()
898
+
899
+ def algorithm(self):
900
+ r"""
901
+ Return the ISD algorithm used by this ISD decoder.
902
+
903
+ EXAMPLES::
904
+
905
+ sage: C = codes.GolayCode(GF(2))
906
+ sage: D = C.decoder('InformationSet', (2,4), "Lee-Brickell")
907
+ sage: D.algorithm()
908
+ ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
909
+ decoding between 2 and 4 errors
910
+ """
911
+ return self._algorithm
912
+
913
+ def decode_to_code(self, r):
914
+ r"""
915
+ Decodes a received word with respect to the associated code of this decoder.
916
+
917
+ .. WARNING::
918
+
919
+ If there is no codeword within the decoding radius of this decoder, this
920
+ method may never terminate, or it may raise a
921
+ :exc:`sage.coding.decoder.DecodingError` exception, depending on the ISD
922
+ algorithm used.
923
+
924
+ INPUT:
925
+
926
+ - ``r`` -- a vector in the ambient space of :meth:`decoder.Decoder.code`
927
+
928
+ OUTPUT: a codeword of :meth:`decoder.Decoder.code`
929
+
930
+ EXAMPLES::
931
+
932
+ sage: M = matrix(GF(2), [[1,0,0,0,0,0,1,0,1,0,1,1,0,0,1],\
933
+ ....: [0,1,0,0,0,1,1,1,1,0,0,0,0,1,1],\
934
+ ....: [0,0,1,0,0,0,0,1,0,1,1,1,1,1,0],\
935
+ ....: [0,0,0,1,0,0,1,0,1,0,0,0,1,1,0],\
936
+ ....: [0,0,0,0,1,0,0,0,1,0,1,1,0,1,0]])
937
+ sage: C = LinearCode(M)
938
+ sage: c = C.random_element()
939
+ sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
940
+ sage: r = Chan(c)
941
+ sage: D = C.decoder('InformationSet', 2)
942
+ sage: c == D.decode_to_code(r)
943
+ True
944
+
945
+ Information-set decoding a non-binary code::
946
+
947
+ sage: C = codes.GolayCode(GF(3)); C
948
+ [12, 6, 6] Extended Golay code over GF(3)
949
+ sage: c = C.random_element()
950
+ sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
951
+ sage: r = Chan(c)
952
+ sage: D = C.decoder('InformationSet', 2)
953
+ sage: c == D.decode_to_code(r)
954
+ True
955
+
956
+ Let's take a bigger example, for which syndrome decoding or
957
+ nearest-neighbor decoding would be infeasible: the `[59, 30]` Quadratic
958
+ Residue code over `\GF{3}` has true minimum distance 17, so we can
959
+ correct 8 errors::
960
+
961
+ sage: C = codes.QuadraticResidueCode(59, GF(3))
962
+ sage: c = C.random_element()
963
+ sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
964
+ sage: r = Chan(c)
965
+ sage: D = C.decoder('InformationSet', 8)
966
+ sage: c == D.decode_to_code(r) # long time
967
+ True
968
+ """
969
+ C = self.code()
970
+ if r in C:
971
+ return r
972
+ return self.algorithm().decode(r)
973
+
974
+ def decoding_radius(self):
975
+ r"""
976
+ Return the maximal number of errors this decoder can decode.
977
+
978
+ EXAMPLES::
979
+
980
+ sage: C = codes.GolayCode(GF(2))
981
+ sage: D = C.decoder('InformationSet', 2)
982
+ sage: D.decoding_radius()
983
+ 2
984
+ """
985
+ return self._number_errors[1]
986
+
987
+ def decoding_interval(self):
988
+ r"""
989
+ A pair of integers specifying the interval of number of errors this
990
+ decoder will attempt to correct.
991
+
992
+ The interval includes both end values.
993
+
994
+ EXAMPLES::
995
+
996
+ sage: C = codes.GolayCode(GF(2))
997
+ sage: D = C.decoder('InformationSet', 2)
998
+ sage: D.decoding_interval()
999
+ (0, 2)
1000
+ """
1001
+ return self._number_errors
1002
+
1003
+ def _repr_(self):
1004
+ r"""
1005
+ Return a string representation of this decoding algorithm.
1006
+
1007
+ EXAMPLES::
1008
+
1009
+ sage: C = codes.GolayCode(GF(2))
1010
+ sage: D = C.decoder('InformationSet', 2)
1011
+ sage: D
1012
+ Information-set decoder (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 2 errors
1013
+ """
1014
+ return "Information-set decoder ({}) for {} decoding {} errors ".format(self.algorithm().name(), self.code(), _format_decoding_interval(self.decoding_interval()))
1015
+
1016
+ def _latex_(self):
1017
+ r"""
1018
+ Return a latex representation of this decoding algorithm.
1019
+
1020
+ EXAMPLES::
1021
+
1022
+ sage: C = codes.GolayCode(GF(2))
1023
+ sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
1024
+ sage: D = C.decoder('InformationSet', 2)
1025
+ sage: latex(D)
1026
+ \textnormal{Information-set decoder (Lee-Brickell) for }[24, 12, 8] \textnormal{ Extended Golay Code over } \Bold{F}_{2} \textnormal{decoding up to 2 errors}
1027
+ """
1028
+ return "\\textnormal{{Information-set decoder ({}) for }}{} \\textnormal{{decoding {} errors}}".format(self.algorithm().name(), self.code()._latex_(), _format_decoding_interval(self.decoding_interval()))
1029
+
1030
+
1031
+ LinearCodeInformationSetDecoder._decoder_type = {"hard-decision",
1032
+ "probabilistic", "not-always-closest", "bounded-distance", "might-fail"}