passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl

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

Potentially problematic release.


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

Files changed (808) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  12. passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  13. sage/algebras/all__sagemath_modules.py +20 -0
  14. sage/algebras/catalog.py +148 -0
  15. sage/algebras/clifford_algebra.py +3107 -0
  16. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  17. sage/algebras/clifford_algebra_element.pxd +16 -0
  18. sage/algebras/clifford_algebra_element.pyx +997 -0
  19. sage/algebras/commutative_dga.py +4252 -0
  20. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
  21. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  22. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  23. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  29. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  30. sage/algebras/finite_gca.py +528 -0
  31. sage/algebras/group_algebra.py +232 -0
  32. sage/algebras/lie_algebras/abelian.py +197 -0
  33. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  34. sage/algebras/lie_algebras/all.py +25 -0
  35. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  36. sage/algebras/lie_algebras/bch.py +177 -0
  37. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  38. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  39. sage/algebras/lie_algebras/center_uea.py +767 -0
  40. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  41. sage/algebras/lie_algebras/examples.py +683 -0
  42. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  43. sage/algebras/lie_algebras/heisenberg.py +820 -0
  44. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  47. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  48. sage/algebras/lie_algebras/morphism.py +661 -0
  49. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  50. sage/algebras/lie_algebras/onsager.py +1324 -0
  51. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  52. sage/algebras/lie_algebras/quotient.py +462 -0
  53. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  54. sage/algebras/lie_algebras/representation.py +1040 -0
  55. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  56. sage/algebras/lie_algebras/subalgebra.py +967 -0
  57. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  58. sage/algebras/lie_algebras/verma_module.py +1630 -0
  59. sage/algebras/lie_algebras/virasoro.py +1186 -0
  60. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
  61. sage/algebras/octonion_algebra.pxd +20 -0
  62. sage/algebras/octonion_algebra.pyx +987 -0
  63. sage/algebras/orlik_solomon.py +907 -0
  64. sage/algebras/orlik_terao.py +779 -0
  65. sage/algebras/steenrod/all.py +7 -0
  66. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  67. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  68. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  69. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  70. sage/algebras/weyl_algebra.py +1126 -0
  71. sage/all__sagemath_modules.py +62 -0
  72. sage/calculus/all__sagemath_modules.py +19 -0
  73. sage/calculus/expr.py +205 -0
  74. sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
  75. sage/calculus/integration.pyx +698 -0
  76. sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
  77. sage/calculus/interpolation.pxd +13 -0
  78. sage/calculus/interpolation.pyx +387 -0
  79. sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
  80. sage/calculus/interpolators.pyx +326 -0
  81. sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/calculus/ode.pxd +5 -0
  83. sage/calculus/ode.pyx +610 -0
  84. sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
  85. sage/calculus/riemann.pyx +1521 -0
  86. sage/calculus/test_sympy.py +201 -0
  87. sage/calculus/transforms/all.py +7 -0
  88. sage/calculus/transforms/dft.py +844 -0
  89. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
  90. sage/calculus/transforms/dwt.pxd +7 -0
  91. sage/calculus/transforms/dwt.pyx +160 -0
  92. sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/calculus/transforms/fft.pxd +12 -0
  94. sage/calculus/transforms/fft.pyx +487 -0
  95. sage/calculus/wester.py +662 -0
  96. sage/coding/abstract_code.py +1108 -0
  97. sage/coding/ag_code.py +868 -0
  98. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
  99. sage/coding/ag_code_decoders.pyx +2639 -0
  100. sage/coding/all.py +15 -0
  101. sage/coding/bch_code.py +494 -0
  102. sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/coding/binary_code.pxd +124 -0
  104. sage/coding/binary_code.pyx +4139 -0
  105. sage/coding/bounds_catalog.py +43 -0
  106. sage/coding/channel.py +819 -0
  107. sage/coding/channels_catalog.py +29 -0
  108. sage/coding/code_bounds.py +755 -0
  109. sage/coding/code_constructions.py +804 -0
  110. sage/coding/codes_catalog.py +111 -0
  111. sage/coding/cyclic_code.py +1329 -0
  112. sage/coding/databases.py +316 -0
  113. sage/coding/decoder.py +373 -0
  114. sage/coding/decoders_catalog.py +88 -0
  115. sage/coding/delsarte_bounds.py +709 -0
  116. sage/coding/encoder.py +390 -0
  117. sage/coding/encoders_catalog.py +64 -0
  118. sage/coding/extended_code.py +468 -0
  119. sage/coding/gabidulin_code.py +1058 -0
  120. sage/coding/golay_code.py +404 -0
  121. sage/coding/goppa_code.py +441 -0
  122. sage/coding/grs_code.py +2371 -0
  123. sage/coding/guava.py +107 -0
  124. sage/coding/guruswami_sudan/all.py +1 -0
  125. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  126. sage/coding/guruswami_sudan/interpolation.py +409 -0
  127. sage/coding/guruswami_sudan/utils.py +176 -0
  128. sage/coding/hamming_code.py +176 -0
  129. sage/coding/information_set_decoder.py +1032 -0
  130. sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
  131. sage/coding/kasami_codes.pyx +351 -0
  132. sage/coding/linear_code.py +3067 -0
  133. sage/coding/linear_code_no_metric.py +1354 -0
  134. sage/coding/linear_rank_metric.py +961 -0
  135. sage/coding/parity_check_code.py +353 -0
  136. sage/coding/punctured_code.py +719 -0
  137. sage/coding/reed_muller_code.py +999 -0
  138. sage/coding/self_dual_codes.py +942 -0
  139. sage/coding/source_coding/all.py +2 -0
  140. sage/coding/source_coding/huffman.py +553 -0
  141. sage/coding/subfield_subcode.py +423 -0
  142. sage/coding/two_weight_db.py +399 -0
  143. sage/combinat/all__sagemath_modules.py +7 -0
  144. sage/combinat/cartesian_product.py +347 -0
  145. sage/combinat/family.py +11 -0
  146. sage/combinat/free_module.py +1977 -0
  147. sage/combinat/root_system/all.py +147 -0
  148. sage/combinat/root_system/ambient_space.py +527 -0
  149. sage/combinat/root_system/associahedron.py +471 -0
  150. sage/combinat/root_system/braid_move_calculator.py +143 -0
  151. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
  152. sage/combinat/root_system/braid_orbit.pyx +144 -0
  153. sage/combinat/root_system/branching_rules.py +2301 -0
  154. sage/combinat/root_system/cartan_matrix.py +1245 -0
  155. sage/combinat/root_system/cartan_type.py +3069 -0
  156. sage/combinat/root_system/coxeter_group.py +162 -0
  157. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  158. sage/combinat/root_system/coxeter_type.py +681 -0
  159. sage/combinat/root_system/dynkin_diagram.py +900 -0
  160. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  161. sage/combinat/root_system/fundamental_group.py +795 -0
  162. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  163. sage/combinat/root_system/integrable_representations.py +1227 -0
  164. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  165. sage/combinat/root_system/pieri_factors.py +1147 -0
  166. sage/combinat/root_system/plot.py +1615 -0
  167. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  168. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  169. sage/combinat/root_system/root_space.py +487 -0
  170. sage/combinat/root_system/root_system.py +882 -0
  171. sage/combinat/root_system/type_A.py +348 -0
  172. sage/combinat/root_system/type_A_affine.py +227 -0
  173. sage/combinat/root_system/type_A_infinity.py +241 -0
  174. sage/combinat/root_system/type_B.py +347 -0
  175. sage/combinat/root_system/type_BC_affine.py +287 -0
  176. sage/combinat/root_system/type_B_affine.py +216 -0
  177. sage/combinat/root_system/type_C.py +317 -0
  178. sage/combinat/root_system/type_C_affine.py +188 -0
  179. sage/combinat/root_system/type_D.py +357 -0
  180. sage/combinat/root_system/type_D_affine.py +208 -0
  181. sage/combinat/root_system/type_E.py +641 -0
  182. sage/combinat/root_system/type_E_affine.py +231 -0
  183. sage/combinat/root_system/type_F.py +387 -0
  184. sage/combinat/root_system/type_F_affine.py +137 -0
  185. sage/combinat/root_system/type_G.py +293 -0
  186. sage/combinat/root_system/type_G_affine.py +132 -0
  187. sage/combinat/root_system/type_H.py +105 -0
  188. sage/combinat/root_system/type_I.py +110 -0
  189. sage/combinat/root_system/type_Q.py +150 -0
  190. sage/combinat/root_system/type_affine.py +509 -0
  191. sage/combinat/root_system/type_dual.py +704 -0
  192. sage/combinat/root_system/type_folded.py +301 -0
  193. sage/combinat/root_system/type_marked.py +748 -0
  194. sage/combinat/root_system/type_reducible.py +601 -0
  195. sage/combinat/root_system/type_relabel.py +730 -0
  196. sage/combinat/root_system/type_super_A.py +837 -0
  197. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  198. sage/combinat/root_system/weight_space.py +639 -0
  199. sage/combinat/root_system/weyl_characters.py +2238 -0
  200. sage/crypto/__init__.py +4 -0
  201. sage/crypto/all.py +28 -0
  202. sage/crypto/block_cipher/all.py +7 -0
  203. sage/crypto/block_cipher/des.py +1065 -0
  204. sage/crypto/block_cipher/miniaes.py +2171 -0
  205. sage/crypto/block_cipher/present.py +909 -0
  206. sage/crypto/block_cipher/sdes.py +1527 -0
  207. sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
  208. sage/crypto/boolean_function.pxd +10 -0
  209. sage/crypto/boolean_function.pyx +1487 -0
  210. sage/crypto/cipher.py +78 -0
  211. sage/crypto/classical.py +3668 -0
  212. sage/crypto/classical_cipher.py +569 -0
  213. sage/crypto/cryptosystem.py +387 -0
  214. sage/crypto/key_exchange/all.py +7 -0
  215. sage/crypto/key_exchange/catalog.py +24 -0
  216. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  217. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  218. sage/crypto/lattice.py +312 -0
  219. sage/crypto/lfsr.py +295 -0
  220. sage/crypto/lwe.py +840 -0
  221. sage/crypto/mq/__init__.py +4 -0
  222. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  223. sage/crypto/mq/rijndael_gf.py +2345 -0
  224. sage/crypto/mq/sbox.py +7 -0
  225. sage/crypto/mq/sr.py +3344 -0
  226. sage/crypto/public_key/all.py +5 -0
  227. sage/crypto/public_key/blum_goldwasser.py +776 -0
  228. sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
  229. sage/crypto/sbox.pyx +2090 -0
  230. sage/crypto/sboxes.py +2090 -0
  231. sage/crypto/stream.py +390 -0
  232. sage/crypto/stream_cipher.py +297 -0
  233. sage/crypto/util.py +519 -0
  234. sage/ext/all__sagemath_modules.py +1 -0
  235. sage/ext/interpreters/__init__.py +1 -0
  236. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  237. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
  238. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  239. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  240. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
  241. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  242. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  243. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  245. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  246. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
  247. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  248. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  249. sage/geometry/all__sagemath_modules.py +5 -0
  250. sage/geometry/toric_lattice.py +1745 -0
  251. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
  252. sage/geometry/toric_lattice_element.pyx +432 -0
  253. sage/groups/abelian_gps/abelian_group.py +1925 -0
  254. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  255. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  256. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  257. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  258. sage/groups/abelian_gps/element_base.py +341 -0
  259. sage/groups/abelian_gps/values.py +488 -0
  260. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  261. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  262. sage/groups/additive_abelian/all.py +4 -0
  263. sage/groups/additive_abelian/qmodnz.py +231 -0
  264. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  265. sage/groups/affine_gps/affine_group.py +535 -0
  266. sage/groups/affine_gps/all.py +1 -0
  267. sage/groups/affine_gps/catalog.py +17 -0
  268. sage/groups/affine_gps/euclidean_group.py +246 -0
  269. sage/groups/affine_gps/group_element.py +562 -0
  270. sage/groups/all__sagemath_modules.py +12 -0
  271. sage/groups/galois_group.py +479 -0
  272. sage/groups/matrix_gps/all.py +4 -0
  273. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  274. sage/groups/matrix_gps/catalog.py +26 -0
  275. sage/groups/matrix_gps/coxeter_group.py +927 -0
  276. sage/groups/matrix_gps/finitely_generated.py +487 -0
  277. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
  278. sage/groups/matrix_gps/group_element.pxd +11 -0
  279. sage/groups/matrix_gps/group_element.pyx +431 -0
  280. sage/groups/matrix_gps/linear.py +440 -0
  281. sage/groups/matrix_gps/matrix_group.py +617 -0
  282. sage/groups/matrix_gps/named_group.py +296 -0
  283. sage/groups/matrix_gps/orthogonal.py +544 -0
  284. sage/groups/matrix_gps/symplectic.py +251 -0
  285. sage/groups/matrix_gps/unitary.py +436 -0
  286. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  287. sage/groups/misc_gps/argument_groups.py +1905 -0
  288. sage/groups/misc_gps/imaginary_groups.py +479 -0
  289. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  293. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  296. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  297. sage/homology/algebraic_topological_model.py +595 -0
  298. sage/homology/all.py +2 -0
  299. sage/homology/all__sagemath_modules.py +8 -0
  300. sage/homology/chain_complex.py +2148 -0
  301. sage/homology/chain_complex_homspace.py +165 -0
  302. sage/homology/chain_complex_morphism.py +629 -0
  303. sage/homology/chain_homotopy.py +604 -0
  304. sage/homology/chains.py +653 -0
  305. sage/homology/free_resolution.py +923 -0
  306. sage/homology/graded_resolution.py +567 -0
  307. sage/homology/hochschild_complex.py +756 -0
  308. sage/homology/homology_group.py +188 -0
  309. sage/homology/homology_morphism.py +422 -0
  310. sage/homology/homology_vector_space_with_basis.py +1454 -0
  311. sage/homology/koszul_complex.py +169 -0
  312. sage/homology/matrix_utils.py +205 -0
  313. sage/libs/all__sagemath_modules.py +1 -0
  314. sage/libs/gsl/__init__.py +1 -0
  315. sage/libs/gsl/airy.pxd +56 -0
  316. sage/libs/gsl/all.pxd +66 -0
  317. sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
  318. sage/libs/gsl/array.pxd +5 -0
  319. sage/libs/gsl/array.pyx +102 -0
  320. sage/libs/gsl/bessel.pxd +208 -0
  321. sage/libs/gsl/blas.pxd +116 -0
  322. sage/libs/gsl/blas_types.pxd +34 -0
  323. sage/libs/gsl/block.pxd +52 -0
  324. sage/libs/gsl/chebyshev.pxd +37 -0
  325. sage/libs/gsl/clausen.pxd +12 -0
  326. sage/libs/gsl/combination.pxd +47 -0
  327. sage/libs/gsl/complex.pxd +151 -0
  328. sage/libs/gsl/coulomb.pxd +30 -0
  329. sage/libs/gsl/coupling.pxd +21 -0
  330. sage/libs/gsl/dawson.pxd +12 -0
  331. sage/libs/gsl/debye.pxd +24 -0
  332. sage/libs/gsl/dilog.pxd +14 -0
  333. sage/libs/gsl/eigen.pxd +46 -0
  334. sage/libs/gsl/elementary.pxd +12 -0
  335. sage/libs/gsl/ellint.pxd +48 -0
  336. sage/libs/gsl/elljac.pxd +8 -0
  337. sage/libs/gsl/erf.pxd +32 -0
  338. sage/libs/gsl/errno.pxd +26 -0
  339. sage/libs/gsl/exp.pxd +44 -0
  340. sage/libs/gsl/expint.pxd +44 -0
  341. sage/libs/gsl/fermi_dirac.pxd +44 -0
  342. sage/libs/gsl/fft.pxd +121 -0
  343. sage/libs/gsl/fit.pxd +50 -0
  344. sage/libs/gsl/gamma.pxd +94 -0
  345. sage/libs/gsl/gegenbauer.pxd +26 -0
  346. sage/libs/gsl/histogram.pxd +176 -0
  347. sage/libs/gsl/hyperg.pxd +52 -0
  348. sage/libs/gsl/integration.pxd +69 -0
  349. sage/libs/gsl/interp.pxd +109 -0
  350. sage/libs/gsl/laguerre.pxd +24 -0
  351. sage/libs/gsl/lambert.pxd +16 -0
  352. sage/libs/gsl/legendre.pxd +90 -0
  353. sage/libs/gsl/linalg.pxd +185 -0
  354. sage/libs/gsl/log.pxd +26 -0
  355. sage/libs/gsl/math.pxd +43 -0
  356. sage/libs/gsl/matrix.pxd +143 -0
  357. sage/libs/gsl/matrix_complex.pxd +130 -0
  358. sage/libs/gsl/min.pxd +67 -0
  359. sage/libs/gsl/monte.pxd +56 -0
  360. sage/libs/gsl/ntuple.pxd +32 -0
  361. sage/libs/gsl/odeiv.pxd +70 -0
  362. sage/libs/gsl/permutation.pxd +78 -0
  363. sage/libs/gsl/poly.pxd +40 -0
  364. sage/libs/gsl/pow_int.pxd +12 -0
  365. sage/libs/gsl/psi.pxd +28 -0
  366. sage/libs/gsl/qrng.pxd +29 -0
  367. sage/libs/gsl/random.pxd +257 -0
  368. sage/libs/gsl/rng.pxd +100 -0
  369. sage/libs/gsl/roots.pxd +72 -0
  370. sage/libs/gsl/sort.pxd +36 -0
  371. sage/libs/gsl/statistics.pxd +59 -0
  372. sage/libs/gsl/sum.pxd +55 -0
  373. sage/libs/gsl/synchrotron.pxd +16 -0
  374. sage/libs/gsl/transport.pxd +24 -0
  375. sage/libs/gsl/trig.pxd +58 -0
  376. sage/libs/gsl/types.pxd +137 -0
  377. sage/libs/gsl/vector.pxd +101 -0
  378. sage/libs/gsl/vector_complex.pxd +83 -0
  379. sage/libs/gsl/wavelet.pxd +49 -0
  380. sage/libs/gsl/zeta.pxd +28 -0
  381. sage/libs/mpc/__init__.pxd +114 -0
  382. sage/libs/mpc/types.pxd +28 -0
  383. sage/libs/mpfr/__init__.pxd +299 -0
  384. sage/libs/mpfr/types.pxd +26 -0
  385. sage/libs/mpmath/__init__.py +1 -0
  386. sage/libs/mpmath/all.py +27 -0
  387. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  388. sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
  389. sage/libs/mpmath/utils.pxd +4 -0
  390. sage/libs/mpmath/utils.pyx +319 -0
  391. sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
  392. sage/matrix/action.pxd +26 -0
  393. sage/matrix/action.pyx +596 -0
  394. sage/matrix/all.py +9 -0
  395. sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
  396. sage/matrix/args.pxd +144 -0
  397. sage/matrix/args.pyx +1668 -0
  398. sage/matrix/benchmark.py +1258 -0
  399. sage/matrix/berlekamp_massey.py +95 -0
  400. sage/matrix/compute_J_ideal.py +926 -0
  401. sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
  402. sage/matrix/constructor.pyx +750 -0
  403. sage/matrix/docs.py +430 -0
  404. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  405. sage/matrix/echelon_matrix.pyx +155 -0
  406. sage/matrix/matrix.pxd +2 -0
  407. sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
  408. sage/matrix/matrix0.pxd +68 -0
  409. sage/matrix/matrix0.pyx +6324 -0
  410. sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
  411. sage/matrix/matrix1.pxd +8 -0
  412. sage/matrix/matrix1.pyx +2851 -0
  413. sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
  414. sage/matrix/matrix2.pxd +25 -0
  415. sage/matrix/matrix2.pyx +20181 -0
  416. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
  417. sage/matrix/matrix_cdv.pxd +4 -0
  418. sage/matrix/matrix_cdv.pyx +93 -0
  419. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  420. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  421. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  422. sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
  423. sage/matrix/matrix_dense.pxd +5 -0
  424. sage/matrix/matrix_dense.pyx +343 -0
  425. sage/matrix/matrix_domain_dense.pxd +5 -0
  426. sage/matrix/matrix_domain_sparse.pxd +5 -0
  427. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  428. sage/matrix/matrix_double_dense.pxd +7 -0
  429. sage/matrix/matrix_double_dense.pyx +3906 -0
  430. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  431. sage/matrix/matrix_double_sparse.pxd +6 -0
  432. sage/matrix/matrix_double_sparse.pyx +248 -0
  433. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
  434. sage/matrix/matrix_generic_dense.pxd +7 -0
  435. sage/matrix/matrix_generic_dense.pyx +354 -0
  436. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  437. sage/matrix/matrix_generic_sparse.pxd +7 -0
  438. sage/matrix/matrix_generic_sparse.pyx +461 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  441. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  442. sage/matrix/matrix_misc.py +313 -0
  443. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  444. sage/matrix/matrix_numpy_dense.pxd +14 -0
  445. sage/matrix/matrix_numpy_dense.pyx +450 -0
  446. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  447. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  448. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  449. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  450. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  451. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  452. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  453. sage/matrix/matrix_real_double_dense.pxd +7 -0
  454. sage/matrix/matrix_real_double_dense.pyx +122 -0
  455. sage/matrix/matrix_space.py +2848 -0
  456. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  457. sage/matrix/matrix_sparse.pxd +5 -0
  458. sage/matrix/matrix_sparse.pyx +1222 -0
  459. sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
  460. sage/matrix/matrix_window.pxd +37 -0
  461. sage/matrix/matrix_window.pyx +242 -0
  462. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  463. sage/matrix/misc_mpfr.pyx +80 -0
  464. sage/matrix/operation_table.py +1182 -0
  465. sage/matrix/special.py +3666 -0
  466. sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
  467. sage/matrix/strassen.pyx +851 -0
  468. sage/matrix/symplectic_basis.py +541 -0
  469. sage/matrix/template.pxd +6 -0
  470. sage/matrix/tests.py +71 -0
  471. sage/matroids/advanced.py +77 -0
  472. sage/matroids/all.py +13 -0
  473. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  474. sage/matroids/basis_exchange_matroid.pxd +96 -0
  475. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  476. sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  477. sage/matroids/basis_matroid.pxd +45 -0
  478. sage/matroids/basis_matroid.pyx +1217 -0
  479. sage/matroids/catalog.py +44 -0
  480. sage/matroids/chow_ring.py +473 -0
  481. sage/matroids/chow_ring_ideal.py +849 -0
  482. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  483. sage/matroids/circuit_closures_matroid.pxd +16 -0
  484. sage/matroids/circuit_closures_matroid.pyx +559 -0
  485. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  486. sage/matroids/circuits_matroid.pxd +38 -0
  487. sage/matroids/circuits_matroid.pyx +947 -0
  488. sage/matroids/constructor.py +1086 -0
  489. sage/matroids/database_collections.py +365 -0
  490. sage/matroids/database_matroids.py +5338 -0
  491. sage/matroids/dual_matroid.py +583 -0
  492. sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
  493. sage/matroids/extension.pxd +34 -0
  494. sage/matroids/extension.pyx +519 -0
  495. sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  496. sage/matroids/flats_matroid.pxd +28 -0
  497. sage/matroids/flats_matroid.pyx +715 -0
  498. sage/matroids/gammoid.py +600 -0
  499. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  500. sage/matroids/graphic_matroid.pxd +39 -0
  501. sage/matroids/graphic_matroid.pyx +2024 -0
  502. sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  503. sage/matroids/lean_matrix.pxd +126 -0
  504. sage/matroids/lean_matrix.pyx +3667 -0
  505. sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  506. sage/matroids/linear_matroid.pxd +180 -0
  507. sage/matroids/linear_matroid.pyx +6649 -0
  508. sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
  509. sage/matroids/matroid.pxd +243 -0
  510. sage/matroids/matroid.pyx +8759 -0
  511. sage/matroids/matroids_catalog.py +190 -0
  512. sage/matroids/matroids_plot_helpers.py +890 -0
  513. sage/matroids/minor_matroid.py +480 -0
  514. sage/matroids/minorfix.h +9 -0
  515. sage/matroids/named_matroids.py +5 -0
  516. sage/matroids/rank_matroid.py +268 -0
  517. sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
  518. sage/matroids/set_system.pxd +38 -0
  519. sage/matroids/set_system.pyx +800 -0
  520. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  521. sage/matroids/transversal_matroid.pxd +14 -0
  522. sage/matroids/transversal_matroid.pyx +893 -0
  523. sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  524. sage/matroids/union_matroid.pxd +20 -0
  525. sage/matroids/union_matroid.pyx +331 -0
  526. sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
  527. sage/matroids/unpickling.pyx +843 -0
  528. sage/matroids/utilities.py +809 -0
  529. sage/misc/all__sagemath_modules.py +20 -0
  530. sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
  531. sage/misc/c3.pyx +238 -0
  532. sage/misc/compat.py +87 -0
  533. sage/misc/element_with_label.py +173 -0
  534. sage/misc/func_persist.py +79 -0
  535. sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
  536. sage/misc/pickle_old.pyx +19 -0
  537. sage/misc/proof.py +7 -0
  538. sage/misc/replace_dot_all.py +472 -0
  539. sage/misc/sagedoc_conf.py +168 -0
  540. sage/misc/sphinxify.py +167 -0
  541. sage/misc/test_class_pickling.py +85 -0
  542. sage/modules/all.py +42 -0
  543. sage/modules/complex_double_vector.py +25 -0
  544. sage/modules/diamond_cutting.py +380 -0
  545. sage/modules/fg_pid/all.py +1 -0
  546. sage/modules/fg_pid/fgp_element.py +456 -0
  547. sage/modules/fg_pid/fgp_module.py +2091 -0
  548. sage/modules/fg_pid/fgp_morphism.py +550 -0
  549. sage/modules/filtered_vector_space.py +1271 -0
  550. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
  551. sage/modules/finite_submodule_iter.pxd +27 -0
  552. sage/modules/finite_submodule_iter.pyx +452 -0
  553. sage/modules/fp_graded/all.py +1 -0
  554. sage/modules/fp_graded/element.py +346 -0
  555. sage/modules/fp_graded/free_element.py +298 -0
  556. sage/modules/fp_graded/free_homspace.py +53 -0
  557. sage/modules/fp_graded/free_module.py +1060 -0
  558. sage/modules/fp_graded/free_morphism.py +217 -0
  559. sage/modules/fp_graded/homspace.py +563 -0
  560. sage/modules/fp_graded/module.py +1340 -0
  561. sage/modules/fp_graded/morphism.py +1990 -0
  562. sage/modules/fp_graded/steenrod/all.py +1 -0
  563. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  564. sage/modules/fp_graded/steenrod/module.py +477 -0
  565. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  566. sage/modules/fp_graded/steenrod/profile.py +241 -0
  567. sage/modules/free_module.py +8447 -0
  568. sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
  569. sage/modules/free_module_element.pxd +22 -0
  570. sage/modules/free_module_element.pyx +5445 -0
  571. sage/modules/free_module_homspace.py +369 -0
  572. sage/modules/free_module_integer.py +896 -0
  573. sage/modules/free_module_morphism.py +823 -0
  574. sage/modules/free_module_pseudohomspace.py +352 -0
  575. sage/modules/free_module_pseudomorphism.py +578 -0
  576. sage/modules/free_quadratic_module.py +1706 -0
  577. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  578. sage/modules/matrix_morphism.py +1745 -0
  579. sage/modules/misc.py +103 -0
  580. sage/modules/module_functors.py +192 -0
  581. sage/modules/multi_filtered_vector_space.py +719 -0
  582. sage/modules/ore_module.py +2208 -0
  583. sage/modules/ore_module_element.py +178 -0
  584. sage/modules/ore_module_homspace.py +147 -0
  585. sage/modules/ore_module_morphism.py +968 -0
  586. sage/modules/quotient_module.py +699 -0
  587. sage/modules/real_double_vector.py +22 -0
  588. sage/modules/submodule.py +255 -0
  589. sage/modules/tensor_operations.py +567 -0
  590. sage/modules/torsion_quadratic_module.py +1352 -0
  591. sage/modules/tutorial_free_modules.py +248 -0
  592. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  593. sage/modules/vector_complex_double_dense.pxd +6 -0
  594. sage/modules/vector_complex_double_dense.pyx +117 -0
  595. sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  596. sage/modules/vector_double_dense.pxd +6 -0
  597. sage/modules/vector_double_dense.pyx +604 -0
  598. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  599. sage/modules/vector_integer_dense.pxd +15 -0
  600. sage/modules/vector_integer_dense.pyx +361 -0
  601. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  602. sage/modules/vector_integer_sparse.pxd +29 -0
  603. sage/modules/vector_integer_sparse.pyx +406 -0
  604. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
  605. sage/modules/vector_modn_dense.pxd +12 -0
  606. sage/modules/vector_modn_dense.pyx +394 -0
  607. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  608. sage/modules/vector_modn_sparse.pxd +21 -0
  609. sage/modules/vector_modn_sparse.pyx +298 -0
  610. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  611. sage/modules/vector_numpy_dense.pxd +15 -0
  612. sage/modules/vector_numpy_dense.pyx +304 -0
  613. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  614. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  615. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  616. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
  617. sage/modules/vector_rational_dense.pxd +15 -0
  618. sage/modules/vector_rational_dense.pyx +387 -0
  619. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  620. sage/modules/vector_rational_sparse.pxd +30 -0
  621. sage/modules/vector_rational_sparse.pyx +413 -0
  622. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  623. sage/modules/vector_real_double_dense.pxd +6 -0
  624. sage/modules/vector_real_double_dense.pyx +126 -0
  625. sage/modules/vector_space_homspace.py +430 -0
  626. sage/modules/vector_space_morphism.py +989 -0
  627. sage/modules/with_basis/all.py +15 -0
  628. sage/modules/with_basis/cell_module.py +494 -0
  629. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
  630. sage/modules/with_basis/indexed_element.pxd +13 -0
  631. sage/modules/with_basis/indexed_element.pyx +1058 -0
  632. sage/modules/with_basis/invariant.py +1075 -0
  633. sage/modules/with_basis/morphism.py +1636 -0
  634. sage/modules/with_basis/representation.py +2939 -0
  635. sage/modules/with_basis/subquotient.py +685 -0
  636. sage/numerical/all__sagemath_modules.py +6 -0
  637. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
  638. sage/numerical/gauss_legendre.pyx +381 -0
  639. sage/numerical/optimize.py +910 -0
  640. sage/probability/all.py +10 -0
  641. sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
  642. sage/probability/probability_distribution.pyx +1242 -0
  643. sage/probability/random_variable.py +411 -0
  644. sage/quadratic_forms/all.py +4 -0
  645. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  646. sage/quadratic_forms/binary_qf.py +2042 -0
  647. sage/quadratic_forms/bqf_class_group.py +748 -0
  648. sage/quadratic_forms/constructions.py +93 -0
  649. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
  650. sage/quadratic_forms/count_local_2.pyx +365 -0
  651. sage/quadratic_forms/extras.py +195 -0
  652. sage/quadratic_forms/quadratic_form.py +1753 -0
  653. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  654. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
  656. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  657. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  658. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  659. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  660. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  661. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  662. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  663. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  664. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  665. sage/quadratic_forms/random_quadraticform.py +209 -0
  666. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
  667. sage/quadratic_forms/ternary.pyx +1154 -0
  668. sage/quadratic_forms/ternary_qf.py +2027 -0
  669. sage/rings/all__sagemath_modules.py +28 -0
  670. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  671. sage/rings/asymptotic/misc.py +1252 -0
  672. sage/rings/cc.py +4 -0
  673. sage/rings/cfinite_sequence.py +1306 -0
  674. sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  675. sage/rings/complex_conversion.pxd +8 -0
  676. sage/rings/complex_conversion.pyx +23 -0
  677. sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
  678. sage/rings/complex_double.pxd +21 -0
  679. sage/rings/complex_double.pyx +2654 -0
  680. sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
  681. sage/rings/complex_mpc.pxd +21 -0
  682. sage/rings/complex_mpc.pyx +2576 -0
  683. sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  684. sage/rings/complex_mpfr.pxd +18 -0
  685. sage/rings/complex_mpfr.pyx +3602 -0
  686. sage/rings/derivation.py +2334 -0
  687. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  688. sage/rings/finite_rings/maps_finite_field.py +191 -0
  689. sage/rings/function_field/all__sagemath_modules.py +8 -0
  690. sage/rings/function_field/derivations.py +102 -0
  691. sage/rings/function_field/derivations_rational.py +132 -0
  692. sage/rings/function_field/differential.py +853 -0
  693. sage/rings/function_field/divisor.py +1107 -0
  694. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  695. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  696. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  697. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  698. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  699. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  700. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  701. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  702. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  703. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
  704. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  705. sage/rings/invariants/all.py +4 -0
  706. sage/rings/invariants/invariant_theory.py +4597 -0
  707. sage/rings/invariants/reconstruction.py +395 -0
  708. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  709. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  712. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  713. sage/rings/polynomial/ore_function_element.py +952 -0
  714. sage/rings/polynomial/ore_function_field.py +1028 -0
  715. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  716. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  717. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  718. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
  720. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  721. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  722. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  723. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  724. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  727. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  730. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  731. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  732. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
  733. sage/rings/real_double_element_gsl.pxd +8 -0
  734. sage/rings/real_double_element_gsl.pyx +794 -0
  735. sage/rings/real_field.py +58 -0
  736. sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  737. sage/rings/real_mpfr.pxd +29 -0
  738. sage/rings/real_mpfr.pyx +6122 -0
  739. sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
  740. sage/rings/ring_extension.pxd +42 -0
  741. sage/rings/ring_extension.pyx +2779 -0
  742. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  743. sage/rings/ring_extension_conversion.pxd +16 -0
  744. sage/rings/ring_extension_conversion.pyx +462 -0
  745. sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
  746. sage/rings/ring_extension_element.pxd +21 -0
  747. sage/rings/ring_extension_element.pyx +1635 -0
  748. sage/rings/ring_extension_homset.py +64 -0
  749. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
  750. sage/rings/ring_extension_morphism.pxd +35 -0
  751. sage/rings/ring_extension_morphism.pyx +920 -0
  752. sage/schemes/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/all__sagemath_modules.py +1 -0
  754. sage/schemes/projective/coherent_sheaf.py +300 -0
  755. sage/schemes/projective/cohomology.py +510 -0
  756. sage/stats/all.py +15 -0
  757. sage/stats/basic_stats.py +489 -0
  758. sage/stats/distributions/all.py +7 -0
  759. sage/stats/distributions/catalog.py +34 -0
  760. sage/stats/distributions/dgs.h +50 -0
  761. sage/stats/distributions/dgs.pxd +111 -0
  762. sage/stats/distributions/dgs_bern.h +400 -0
  763. sage/stats/distributions/dgs_gauss.h +614 -0
  764. sage/stats/distributions/dgs_misc.h +104 -0
  765. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  767. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  768. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  769. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  770. sage/stats/hmm/all.py +15 -0
  771. sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
  772. sage/stats/hmm/chmm.pyx +1595 -0
  773. sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
  774. sage/stats/hmm/distributions.pxd +29 -0
  775. sage/stats/hmm/distributions.pyx +531 -0
  776. sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
  777. sage/stats/hmm/hmm.pxd +17 -0
  778. sage/stats/hmm/hmm.pyx +1388 -0
  779. sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
  780. sage/stats/hmm/util.pxd +7 -0
  781. sage/stats/hmm/util.pyx +165 -0
  782. sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
  783. sage/stats/intlist.pxd +14 -0
  784. sage/stats/intlist.pyx +588 -0
  785. sage/stats/r.py +49 -0
  786. sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
  787. sage/stats/time_series.pxd +6 -0
  788. sage/stats/time_series.pyx +2546 -0
  789. sage/tensor/all.py +2 -0
  790. sage/tensor/modules/all.py +8 -0
  791. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  792. sage/tensor/modules/comp.py +5598 -0
  793. sage/tensor/modules/ext_pow_free_module.py +824 -0
  794. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  795. sage/tensor/modules/format_utilities.py +333 -0
  796. sage/tensor/modules/free_module_alt_form.py +858 -0
  797. sage/tensor/modules/free_module_automorphism.py +1207 -0
  798. sage/tensor/modules/free_module_basis.py +1074 -0
  799. sage/tensor/modules/free_module_element.py +284 -0
  800. sage/tensor/modules/free_module_homset.py +652 -0
  801. sage/tensor/modules/free_module_linear_group.py +564 -0
  802. sage/tensor/modules/free_module_morphism.py +1581 -0
  803. sage/tensor/modules/free_module_tensor.py +3289 -0
  804. sage/tensor/modules/reflexive_module.py +386 -0
  805. sage/tensor/modules/tensor_free_module.py +780 -0
  806. sage/tensor/modules/tensor_free_submodule.py +538 -0
  807. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  808. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1329 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.modules sage.rings.finite_rings
3
+ r"""
4
+ Cyclic code
5
+
6
+ Let `F` be a field. A `[n, k]` code `C` over `F` is called cyclic if every
7
+ cyclic shift of a codeword is also a codeword [Rot2006]_:
8
+
9
+ .. MATH::
10
+
11
+ \forall c \in C,
12
+ c = (c_{0}, c_{1}, \dots , c_{n-1}) \in C
13
+ \Rightarrow (c_{n-1}, c_{0}, \dots , c_{n-2}) \in C
14
+
15
+ Let `c = (c_0, c_1, \dots, c_{n-1})` be a codeword of `C`.
16
+ This codeword can be seen as a polynomial over `F_q[x]` as follows:
17
+ `\Sigma_{i=0}^{n-1} c_i x^i`.
18
+ There is a unique monic polynomial `g(x)` such that for every
19
+ `c(x) \in F_q[x]` of degree less than `n-1`, we have
20
+ `c(x) \in C \Leftrightarrow g(x) | c(x)`.
21
+ This polynomial is called the generator polynomial of `C`.
22
+
23
+ For now, only single-root cyclic codes (i.e. whose length `n` and field order
24
+ `q` are coprimes) are implemented.
25
+ """
26
+
27
+ # *****************************************************************************
28
+ # Copyright (C) 2015 David Lucas <david.lucas@inria.fr>
29
+ # 2016 Julien Lavauzelle <julien.lavauzelle@inria.fr>
30
+ #
31
+ # This program is free software: you can redistribute it and/or modify
32
+ # it under the terms of the GNU General Public License as published by
33
+ # the Free Software Foundation, either version 2 of the License, or
34
+ # (at your option) any later version.
35
+ # http://www.gnu.org/licenses/
36
+ # *****************************************************************************
37
+
38
+ from .linear_code import (AbstractLinearCode,
39
+ LinearCodeSyndromeDecoder,
40
+ LinearCodeNearestNeighborDecoder)
41
+ from .encoder import Encoder
42
+ from .decoder import Decoder
43
+ from copy import copy
44
+ from sage.rings.integer import Integer
45
+ from sage.categories.homset import Hom
46
+ from sage.arith.misc import gcd
47
+ from sage.modules.free_module_element import vector
48
+ from sage.matrix.constructor import matrix
49
+ from sage.misc.cachefunc import cached_method
50
+ from sage.rings.finite_rings.integer_mod_ring import IntegerModRing as Zmod
51
+
52
+
53
+ def find_generator_polynomial(code, check=True):
54
+ r"""
55
+ Return a possible generator polynomial for ``code``.
56
+
57
+ If the code is cyclic, the generator polynomial is the gcd of all the
58
+ polynomial forms of the codewords. Conversely, if this gcd exactly
59
+ generates the code ``code``, then ``code`` is cyclic.
60
+
61
+ If ``check`` is set to ``True``, then it also checks that the code is
62
+ indeed cyclic. Otherwise it doesn't.
63
+
64
+ INPUT:
65
+
66
+ - ``code`` -- a linear code
67
+
68
+ - ``check`` -- whether the cyclicity should be checked
69
+
70
+ OUTPUT:
71
+
72
+ - the generator polynomial of ``code`` (if the code is cyclic).
73
+
74
+ EXAMPLES::
75
+
76
+ sage: from sage.coding.cyclic_code import find_generator_polynomial
77
+ sage: C = codes.GeneralizedReedSolomonCode(GF(8, 'a').list()[1:], 4)
78
+ sage: find_generator_polynomial(C)
79
+ x^3 + (a^2 + 1)*x^2 + a*x + a^2 + 1
80
+ """
81
+ G = code.generator_matrix()
82
+ F = code.base_ring()
83
+ R = F['x']
84
+ g = gcd(R(row.list()) for row in G)
85
+
86
+ if check:
87
+ n = code.length()
88
+ k = code.dimension()
89
+ if (g.degree() != n - k):
90
+ raise ValueError("The code is not cyclic.")
91
+ c = _to_complete_list(g, n)
92
+ if any(vector(c[i:] + c[:i]) not in code for i in range(n)):
93
+ raise ValueError("The code is not cyclic.")
94
+
95
+ return g.monic()
96
+
97
+
98
+ def _to_complete_list(poly, length):
99
+ r"""
100
+ Return the vector of length exactly ``length`` corresponding to the
101
+ coefficients of the provided polynomial. If needed, zeros are added.
102
+
103
+ INPUT:
104
+
105
+ - ``poly`` -- a polynomial
106
+
107
+ - ``length`` -- integer
108
+
109
+ OUTPUT: the list of coefficients
110
+
111
+ EXAMPLES::
112
+
113
+ sage: R = PolynomialRing(GF(2), 'X')
114
+ sage: X = R.gen()
115
+ sage: poly = X**4 + X + 1
116
+ sage: sage.coding.cyclic_code._to_complete_list(poly, 7)
117
+ [1, 1, 0, 0, 1, 0, 0]
118
+ """
119
+ L = poly.coefficients(sparse=False)
120
+ return L + [poly.base_ring().zero()] * (length - len(L))
121
+
122
+
123
+ def bch_bound(n, D, arithmetic=False):
124
+ r"""
125
+ Return the BCH bound obtained for a cyclic code of length ``n`` and
126
+ defining set ``D``.
127
+
128
+ Consider a cyclic code `C`, with defining set `D`, length `n`, and minimum
129
+ distance `d`. We have the following bound, called BCH bound, on `d`:
130
+ `d \geq \delta + 1`, where `\delta` is the length of the longest arithmetic
131
+ sequence (modulo `n`) of elements in `D`.
132
+
133
+ That is, if `\exists c, \gcd(c,n) = 1` such that
134
+ `\{l, l+c, \dots, l + (\delta - 1) \times c\} \subseteq D`,
135
+ then `d \geq \delta + 1` [1]
136
+
137
+ The BCH bound is often known in the particular case `c = 1`. The user can
138
+ specify by setting ``arithmetic = False``.
139
+
140
+ .. NOTE::
141
+
142
+ As this is a specific use case of the BCH bound, it is *not* available
143
+ in the global namespace.
144
+ Call it by using ``sage.coding.cyclic_code.bch_bound``. You can also
145
+ load it into the global namespace by typing
146
+ ``from sage.coding.cyclic_code import bch_bound``.
147
+
148
+ INPUT:
149
+
150
+ - ``n`` -- integer
151
+
152
+ - ``D`` -- list of integers
153
+
154
+ - ``arithmetic`` -- (default: ``False``) if it is set to ``True``, then it
155
+ computes the BCH bound using the longest arithmetic sequence definition
156
+
157
+ OUTPUT:
158
+
159
+ - ``(delta + 1, (l, c))`` -- such that ``delta + 1`` is the BCH bound, and
160
+ ``l, c`` are the parameters of the longest arithmetic sequence
161
+ (see below)
162
+
163
+ EXAMPLES::
164
+
165
+ sage: n = 15
166
+ sage: D = [14,1,2,11,12]
167
+ sage: sage.coding.cyclic_code.bch_bound(n, D)
168
+ (3, (1, 1))
169
+
170
+ sage: n = 15
171
+ sage: D = [14,1,2,11,12]
172
+ sage: sage.coding.cyclic_code.bch_bound(n, D, True)
173
+ (4, (2, 12))
174
+ """
175
+ def longest_streak(step):
176
+ max_len = 1
177
+ max_offset = 0
178
+ j = 0
179
+ while j < n:
180
+ h = j
181
+ while isD[h * step % n]:
182
+ h += 1
183
+ if h - j > max_len:
184
+ max_offset = j * step % n
185
+ max_len = h - j
186
+ j = h + 1
187
+ return (max_len, max_offset)
188
+
189
+ isD = [0] * n
190
+ for d in D:
191
+ try:
192
+ isD[d] = 1
193
+ except IndexError:
194
+ raise ValueError("%s must contains integers between 0 and %s" %
195
+ (D, n - 1))
196
+ if 0 not in isD:
197
+ return (n + 1, (1, 0))
198
+
199
+ if not arithmetic:
200
+ one_len, offset = longest_streak(1)
201
+ return (one_len + 1, (1, offset))
202
+ else:
203
+ n = Integer(n)
204
+ longest_streak_list = [(longest_streak(step), step)
205
+ for step in n.coprime_integers(n // 2 + 1)
206
+ if step >= 1]
207
+ (max_len, offset), step = max(longest_streak_list)
208
+ return (max_len + 1, (step, offset))
209
+
210
+
211
+ class CyclicCode(AbstractLinearCode):
212
+ r"""
213
+ Representation of a cyclic code.
214
+
215
+ We propose three different ways to create a new :class:`CyclicCode`, either by
216
+ providing:
217
+
218
+ - the generator polynomial and the length (1)
219
+ - an existing linear code. In that case, a generator polynomial will be
220
+ computed from the provided linear code's parameters (2)
221
+ - (a subset of) the defining set of the cyclic code (3)
222
+
223
+ For now, only single-root cyclic codes are implemented. That is, only
224
+ cyclic codes such that its length `n` and field order `q` are coprimes.
225
+
226
+ Depending on which behaviour you want, you need to specify the names of the
227
+ arguments to :class:`CyclicCode`. See EXAMPLES section below for details.
228
+
229
+ INPUT:
230
+
231
+ - ``generator_pol`` -- (default: ``None``) the generator polynomial
232
+ of ``self``; that is, the highest-degree monic polynomial which divides
233
+ every polynomial representation of a codeword in ``self``
234
+
235
+ - ``length`` -- (default: ``None``) the length of ``self``; it has to be
236
+ bigger than the degree of ``generator_pol``
237
+
238
+ - ``code`` -- (default: ``None``) a linear code
239
+
240
+ - ``check`` -- boolean (default: ``False``); whether the cyclicity of
241
+ ``self`` must be checked while finding the generator polynomial. See
242
+ :meth:`find_generator_polynomial` for details.
243
+
244
+ - ``D`` -- (default: ``None``) a list of integers between ``0`` and
245
+ ``length-1``, corresponding to (a subset of) the defining set of the code.
246
+ Will be modified if it is not cyclotomic-closed.
247
+
248
+ - ``field`` -- (default: ``None``) the base field of ``self``
249
+
250
+ - ``primitive_root`` -- (default: ``None``) the primitive root of
251
+ the splitting field which contains the roots of the generator polynomial.
252
+ It has to be of multiplicative order ``length`` over this field.
253
+ If the splitting field is not ``field``, it also have to be a polynomial
254
+ in ``zx``, where ``x`` is the degree of the extension over the prime
255
+ field. For instance, over ``GF(16)``, it must be a polynomial in ``z4``.
256
+
257
+ EXAMPLES:
258
+
259
+ We can construct a :class:`CyclicCode` object using three different methods.
260
+ First (1), we provide a generator polynomial and a code length::
261
+
262
+ sage: F.<x> = GF(2)[]
263
+ sage: n = 7
264
+ sage: g = x ** 3 + x + 1
265
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
266
+ sage: C
267
+ [7, 4] Cyclic Code over GF(2)
268
+
269
+ We can also provide a code (2). In that case, the program will try to
270
+ extract a generator polynomial (see :meth:`find_generator_polynomial`
271
+ for details)::
272
+
273
+ sage: C = codes.GeneralizedReedSolomonCode(GF(8, 'a').list()[1:], 4)
274
+ sage: Cc = codes.CyclicCode(code = C)
275
+ sage: Cc
276
+ [7, 4] Cyclic Code over GF(8)
277
+
278
+ Finally, we can give (a subset of) a defining set for the code (3).
279
+ In this case, the generator polynomial will be computed::
280
+
281
+ sage: F = GF(16, 'a')
282
+ sage: n = 15
283
+ sage: Cc = codes.CyclicCode(length=n, field=F, D = [1,2])
284
+ sage: Cc
285
+ [15, 13] Cyclic Code over GF(16)
286
+ """
287
+
288
+ _registered_encoders = {}
289
+ _registered_decoders = {}
290
+
291
+ def __init__(self, generator_pol=None, length=None, code=None, check=True,
292
+ D=None, field=None, primitive_root=None):
293
+ r"""
294
+ TESTS:
295
+
296
+ If one provides a generator polynomial and a length, we check that
297
+ the length is bigger than the degree of the polynomial::
298
+
299
+ sage: F.<x> = GF(2)[]
300
+ sage: n = 2
301
+ sage: g = x ** 3 + x + 1
302
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
303
+ Traceback (most recent call last):
304
+ ...
305
+ ValueError: Only cyclic codes whose length and field order are coprimes are implemented.
306
+
307
+ We also check that the polynomial is defined over a finite field::
308
+
309
+ sage: F.<x> = RR[]
310
+ sage: n = 7
311
+ sage: g = x ** 3 + x + 1
312
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
313
+ Traceback (most recent call last):
314
+ ...
315
+ ValueError: The generator polynomial must be defined over a finite field.
316
+
317
+ And we check that the generator polynomial divides `x^{n} - 1`,
318
+ where `n` is provided length::
319
+
320
+ sage: F.<x> = GF(2)[]
321
+ sage: n = 7
322
+ sage: g = x ** 2 + x + 1
323
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
324
+ Traceback (most recent call last):
325
+ ...
326
+ ValueError: Provided polynomial must divide x^n - 1, where n is the provided length.
327
+
328
+ In the case of a code is passed as argument, if it's not possible
329
+ to extract a generator polynomial, an exception is raised::
330
+
331
+ sage: G = matrix(GF(2), [[1, 1, 1], [0, 1, 1]])
332
+ sage: C = codes.LinearCode(G)
333
+ sage: Cc = codes.CyclicCode(code=C)
334
+ Traceback (most recent call last):
335
+ ...
336
+ ValueError: The code is not cyclic.
337
+
338
+ If the ``primitive_root`` does not lie in an extension of ``field``,
339
+ or is not a primitive `n`-th root of unity, then
340
+ an exception is raised::
341
+
342
+ sage: F = GF(2)
343
+ sage: n = 15
344
+ sage: Dset = [1, 2, 4, 8]
345
+ sage: alpha = GF(3).one()
346
+ sage: Cc = codes.CyclicCode(D=Dset, field=F, length=n, primitive_root=alpha)
347
+ Traceback (most recent call last):
348
+ ...
349
+ ValueError: primitive_root must belong to an extension of the base field
350
+ sage: alpha = GF(16).one()
351
+ sage: Cc = codes.CyclicCode(D=Dset, field=F, length=n, primitive_root=alpha)
352
+ Traceback (most recent call last):
353
+ ...
354
+ ValueError: primitive_root must be a primitive n-th root of unity
355
+ sage: alpha = GF(32).gen()
356
+ sage: Cc = codes.CyclicCode(D=Dset, field=F, length=n, primitive_root=alpha)
357
+ Traceback (most recent call last):
358
+ ...
359
+ ValueError: primitive_root must be a primitive n-th root of unity
360
+ """
361
+ # Case (1) : generator polynomial and length are provided.
362
+ if (generator_pol is not None and length is not None and
363
+ code is None and D is None and field is None and
364
+ primitive_root is None):
365
+ F = generator_pol.base_ring()
366
+ if not F.is_finite() or not F.is_field():
367
+ raise ValueError("The generator polynomial must be defined "
368
+ "over a finite field.")
369
+ q = F.cardinality()
370
+ if not gcd(length, q) == 1:
371
+ raise ValueError("Only cyclic codes whose length and field "
372
+ "order are coprimes are implemented.")
373
+ R = generator_pol.parent()
374
+ deg = generator_pol.degree()
375
+ if not isinstance(length, Integer):
376
+ length = Integer(length)
377
+ if not generator_pol.divides(R.gen() ** length - 1):
378
+ raise ValueError("Provided polynomial must divide x^n - 1, "
379
+ "where n is the provided length.")
380
+ self._polynomial_ring = R
381
+ self._dimension = length - deg
382
+ if not generator_pol.is_monic():
383
+ self._generator_polynomial = generator_pol.monic()
384
+ else:
385
+ self._generator_polynomial = generator_pol
386
+ super().__init__(F, length, "Vector", "Syndrome")
387
+
388
+ # Case (2) : a code is provided.
389
+ elif (code is not None and
390
+ generator_pol is None and length is None and D is None and
391
+ field is None and primitive_root is None):
392
+ if not isinstance(code, AbstractLinearCode):
393
+ raise ValueError("code must be an AbstractLinearCode")
394
+ F = code.base_ring()
395
+ q = F.cardinality()
396
+ n = code.length()
397
+ if not gcd(n, q) == 1:
398
+ raise ValueError("Only cyclic codes whose length and field "
399
+ "order are coprimes are implemented.")
400
+ g = find_generator_polynomial(code, check)
401
+ self._polynomial_ring = g.parent()
402
+ self._generator_polynomial = g
403
+ self._dimension = code.dimension()
404
+ super().__init__(code.base_ring(), n, "Vector", "Syndrome")
405
+
406
+ # Case (3) : a defining set, a length and a field are provided
407
+ elif (D is not None and length is not None and field is not None and
408
+ generator_pol is None and code is None):
409
+ F = field
410
+ if not F.is_finite() or not F.is_field():
411
+ raise ValueError("You must provide a finite field.")
412
+ n = length
413
+ q = F.cardinality()
414
+ if not gcd(n, q) == 1:
415
+ raise ValueError("Only cyclic codes whose length and field "
416
+ "order are coprimes are implemented.")
417
+
418
+ R = F['x']
419
+ s = Zmod(n)(q).multiplicative_order()
420
+
421
+ if primitive_root is not None:
422
+ Fsplit = primitive_root.parent()
423
+ try:
424
+ FE = Hom(F, Fsplit)[0]
425
+ except Exception:
426
+ raise ValueError("primitive_root must belong to an "
427
+ "extension of the base field")
428
+ extension_degree = Fsplit.degree() // F.degree()
429
+ if (extension_degree != s or
430
+ primitive_root.multiplicative_order() != n):
431
+ raise ValueError("primitive_root must be a primitive "
432
+ "n-th root of unity")
433
+ alpha = primitive_root
434
+ else:
435
+ Fsplit, FE = F.extension(Integer(s), map=True)
436
+ alpha = Fsplit.zeta(n)
437
+
438
+ Rsplit = Fsplit['xx']
439
+ xx = Rsplit.gen()
440
+
441
+ cosets = Zmod(n).cyclotomic_cosets(q, D)
442
+ pows = [item for l in cosets for item in l]
443
+
444
+ sec = FE.section()
445
+ g = R.one()
446
+ for J in cosets:
447
+ pol = Rsplit.one()
448
+ for j in J:
449
+ pol *= xx - alpha**j
450
+ g *= R([sec(coeff) for coeff in pol])
451
+
452
+ # we set class variables
453
+ self._field_embedding = FE
454
+ self._primitive_root = alpha
455
+ self._defining_set = sorted(pows)
456
+ self._polynomial_ring = R
457
+ self._generator_polynomial = g
458
+ self._dimension = n - g.degree()
459
+ super().__init__(F, n, "Vector", "SurroundingBCH")
460
+
461
+ else:
462
+ raise AttributeError("You must provide either a code, or a list "
463
+ "of powers and the length and the field, or "
464
+ "a generator polynomial and the code length")
465
+
466
+ def __contains__(self, word):
467
+ r"""
468
+ Return ``True`` if ``word`` belongs to ``self``, ``False`` otherwise.
469
+
470
+ INPUT:
471
+
472
+ - ``word`` -- the word to test
473
+
474
+ EXAMPLES::
475
+
476
+ sage: F.<x> = GF(2)[]
477
+ sage: n = 7
478
+ sage: g = x ** 3 + x + 1
479
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
480
+ sage: c = vector(GF(2), (1, 1, 1, 0, 0, 1, 0))
481
+ sage: c in C
482
+ True
483
+ """
484
+ g = self.generator_polynomial()
485
+ R = self._polynomial_ring
486
+ return (g.divides(R(word.list())) and word in self.ambient_space())
487
+
488
+ def __eq__(self, other):
489
+ r"""
490
+ Test equality between CyclicCode objects.
491
+
492
+ INPUT:
493
+
494
+ - ``other`` -- the code to test
495
+
496
+ EXAMPLES::
497
+
498
+ sage: F.<x> = GF(2)[]
499
+ sage: n = 7
500
+ sage: g = x ** 3 + x + 1
501
+ sage: C1 = codes.CyclicCode(generator_pol=g, length=n)
502
+ sage: C2 = codes.CyclicCode(generator_pol=g, length=n)
503
+ sage: C1 == C2
504
+ True
505
+ """
506
+ if not isinstance(other, CyclicCode):
507
+ return False
508
+ else:
509
+ R = self._polynomial_ring
510
+ return (self.base_field() == other.base_field() and
511
+ self.length() == other.length() and
512
+ self.generator_polynomial() == R(other.generator_polynomial()))
513
+
514
+ def _repr_(self):
515
+ r"""
516
+ Return a string representation of ``self``.
517
+
518
+ EXAMPLES::
519
+
520
+ sage: F.<x> = GF(2)[]
521
+ sage: n = 7
522
+ sage: g = x ** 3 + x + 1
523
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
524
+ sage: C
525
+ [7, 4] Cyclic Code over GF(2)
526
+ """
527
+ return ("[%s, %s] Cyclic Code over GF(%s)"
528
+ % (self.length(), self.dimension(),
529
+ self.base_field().cardinality()))
530
+
531
+ def _latex_(self):
532
+ r"""
533
+ Return a latex representation of ``self``.
534
+
535
+ EXAMPLES::
536
+
537
+ sage: F.<x> = GF(2)[]
538
+ sage: n = 7
539
+ sage: g = x ** 3 + x + 1
540
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
541
+ sage: latex(C)
542
+ [7, 4] \textnormal{ Cyclic Code over } \Bold{F}_{2}
543
+ """
544
+ return ("[%s, %s] \\textnormal{ Cyclic Code over } %s"
545
+ % (self.length(), self.dimension(),
546
+ self.base_field()._latex_()))
547
+
548
+ def generator_polynomial(self):
549
+ r"""
550
+ Return the generator polynomial of ``self``.
551
+
552
+ EXAMPLES::
553
+
554
+ sage: F.<x> = GF(2)[]
555
+ sage: n = 7
556
+ sage: g = x ** 3 + x + 1
557
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
558
+ sage: C.generator_polynomial()
559
+ x^3 + x + 1
560
+ """
561
+ return self._generator_polynomial
562
+
563
+ def field_embedding(self):
564
+ r"""
565
+ Return the base field embedding into the splitting field.
566
+
567
+ EXAMPLES::
568
+
569
+ sage: F.<x> = GF(2)[]
570
+ sage: n = 7
571
+ sage: g = x ** 3 + x + 1
572
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
573
+ sage: C.field_embedding()
574
+ Ring morphism:
575
+ From: Finite Field of size 2
576
+ To: Finite Field in z3 of size 2^3
577
+ Defn: 1 |--> 1
578
+ """
579
+ if not hasattr(self, "_field_embedding"):
580
+ self.defining_set()
581
+ return self._field_embedding
582
+
583
+ def defining_set(self, primitive_root=None):
584
+ r"""
585
+ Return the set of exponents of the roots of ``self``'s generator
586
+ polynomial over the extension field.
587
+
588
+ Of course, it depends on the choice of the primitive root of
589
+ the splitting field.
590
+
591
+ INPUT:
592
+
593
+ - ``primitive_root`` -- (optional) a primitive root of the extension
594
+ field
595
+
596
+ EXAMPLES:
597
+
598
+ We provide a defining set at construction time::
599
+
600
+ sage: F = GF(16, 'a')
601
+ sage: n = 15
602
+ sage: C = codes.CyclicCode(length=n, field=F, D=[1,2])
603
+ sage: C.defining_set()
604
+ [1, 2]
605
+
606
+ If the defining set was provided by the user, it might have been
607
+ expanded at construction time. In this case, the expanded defining set
608
+ will be returned::
609
+
610
+ sage: C = codes.CyclicCode(length=13, field=F, D=[1, 2])
611
+ sage: C.defining_set()
612
+ [1, 2, 3, 5, 6, 9]
613
+
614
+ If a generator polynomial was passed at construction time,
615
+ the defining set is computed using this polynomial::
616
+
617
+ sage: R.<x> = F[]
618
+ sage: n = 7
619
+ sage: g = x ** 3 + x + 1
620
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
621
+ sage: C.defining_set()
622
+ [1, 2, 4]
623
+
624
+ Both operations give the same result::
625
+
626
+ sage: C1 = codes.CyclicCode(length=n, field=F, D=[1, 2, 4])
627
+ sage: C1.generator_polynomial() == g
628
+ True
629
+
630
+ Another one, in a reversed order::
631
+
632
+ sage: n = 13
633
+ sage: C1 = codes.CyclicCode(length=n, field=F, D=[1, 2])
634
+ sage: g = C1.generator_polynomial()
635
+ sage: C2 = codes.CyclicCode(generator_pol=g, length=n)
636
+ sage: C1.defining_set() == C2.defining_set()
637
+ True
638
+ """
639
+ if (hasattr(self, "_defining_set") and
640
+ (primitive_root is None or
641
+ primitive_root == self._primitive_root)):
642
+ return self._defining_set
643
+ else:
644
+ F = self.base_field()
645
+ n = self.length()
646
+ q = F.cardinality()
647
+ g = self.generator_polynomial()
648
+
649
+ s = Zmod(n)(q).multiplicative_order()
650
+
651
+ if primitive_root is None:
652
+ Fsplit, FE = F.extension(Integer(s), map=True)
653
+ alpha = Fsplit.zeta(n)
654
+ else:
655
+ try:
656
+ alpha = primitive_root
657
+ Fsplit = alpha.parent()
658
+ FE = Hom(Fsplit, F)[0]
659
+ except ValueError:
660
+ raise ValueError("primitive_root does not belong to the "
661
+ "right splitting field")
662
+ if alpha.multiplicative_order() != n:
663
+ raise ValueError("primitive_root must have multiplicative "
664
+ "order equal to the code length")
665
+
666
+ Rsplit = Fsplit['xx']
667
+ gsplit = Rsplit([FE(coeff) for coeff in g])
668
+ roots = gsplit.roots(multiplicities=False)
669
+ D = [root.log(alpha) for root in roots]
670
+
671
+ self._field_embedding = FE
672
+ self._primitive_root = alpha
673
+ self._defining_set = sorted(D)
674
+ return self._defining_set
675
+
676
+ def primitive_root(self):
677
+ r"""
678
+ Return the primitive root of the splitting field that is used
679
+ to build the defining set of the code.
680
+
681
+ If it has not been specified by the user, it is set by default with the
682
+ output of the ``zeta`` method of the splitting field.
683
+
684
+ EXAMPLES::
685
+
686
+ sage: F.<x> = GF(2)[]
687
+ sage: n = 7
688
+ sage: g = x ** 3 + x + 1
689
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
690
+ sage: C.primitive_root()
691
+ z3
692
+
693
+ sage: F = GF(16, 'a')
694
+ sage: n = 15
695
+ sage: a = F.gen()
696
+ sage: Cc = codes.CyclicCode(length=n, field=F, D=[1,2],
697
+ ....: primitive_root=a^2 + 1)
698
+ sage: Cc.primitive_root()
699
+ a^2 + 1
700
+ """
701
+ if hasattr(self, "_primitive_root"):
702
+ return self._primitive_root
703
+ else:
704
+ self.defining_set()
705
+ return self._primitive_root
706
+
707
+ @cached_method
708
+ def check_polynomial(self):
709
+ r"""
710
+ Return the check polynomial of ``self``.
711
+
712
+ Let `C` be a cyclic code of length `n` and `g` its generator
713
+ polynomial. The following: `h = \frac{x^n - 1}{g(x)}` is called `C`'s
714
+ check polynomial.
715
+
716
+ EXAMPLES::
717
+
718
+ sage: F.<x> = GF(2)[]
719
+ sage: n = 7
720
+ sage: g = x ** 3 + x + 1
721
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
722
+ sage: h = C.check_polynomial()
723
+ sage: h == (x**n - 1)/C.generator_polynomial()
724
+ True
725
+ """
726
+ R = self._polynomial_ring
727
+ n = self.length()
728
+ self._check_polynomial = (R.gen() ** n - 1) // self.generator_polynomial()
729
+ return self._check_polynomial
730
+
731
+ @cached_method
732
+ def parity_check_matrix(self):
733
+ r"""
734
+ Return the parity check matrix of ``self``.
735
+
736
+ The parity check matrix of a linear code `C` corresponds to the
737
+ generator matrix of the dual code of `C`.
738
+
739
+ EXAMPLES::
740
+
741
+ sage: F.<x> = GF(2)[]
742
+ sage: n = 7
743
+ sage: g = x ** 3 + x + 1
744
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
745
+ sage: C.parity_check_matrix()
746
+ [1 0 1 1 1 0 0]
747
+ [0 1 0 1 1 1 0]
748
+ [0 0 1 0 1 1 1]
749
+ """
750
+ k = self.dimension()
751
+ n = self.length()
752
+ h = self.check_polynomial().reverse()
753
+ l = _to_complete_list(h, n)
754
+ M = matrix([l[-i:] + l[:-i] for i in range(n - k)])
755
+ M.set_immutable()
756
+ return M
757
+
758
+ def bch_bound(self, arithmetic=False):
759
+ r"""
760
+ Return the BCH bound of ``self`` which is a bound on ``self``
761
+ minimum distance.
762
+
763
+ See :meth:`sage.coding.cyclic_code.bch_bound` for details.
764
+
765
+ INPUT:
766
+
767
+ - ``arithmetic`` -- (default: ``False``) if it is set to ``True``,
768
+ then it computes the BCH bound using the longest arithmetic sequence
769
+ definition
770
+
771
+ OUTPUT:
772
+
773
+ - ``(delta + 1, (l, c))`` -- such that ``delta + 1`` is the BCH bound,
774
+ and ``l, c`` are the parameters of the largest arithmetic sequence
775
+
776
+ EXAMPLES::
777
+
778
+ sage: F = GF(16, 'a')
779
+ sage: n = 15
780
+ sage: D = [14,1,2,11,12]
781
+ sage: C = codes.CyclicCode(field=F, length=n, D = D)
782
+ sage: C.bch_bound()
783
+ (3, (1, 1))
784
+
785
+ sage: F = GF(16, 'a')
786
+ sage: n = 15
787
+ sage: D = [14,1,2,11,12]
788
+ sage: C = codes.CyclicCode(field=F, length=n, D = D)
789
+ sage: C.bch_bound(True)
790
+ (4, (2, 12))
791
+ """
792
+ return bch_bound(self.length(), self.defining_set(), arithmetic)
793
+
794
+ def surrounding_bch_code(self):
795
+ r"""
796
+ Return the surrounding BCH code of ``self``.
797
+
798
+ EXAMPLES::
799
+
800
+ sage: C = codes.CyclicCode(field=GF(2), length=63, D=[1, 7, 17])
801
+ sage: C.dimension()
802
+ 45
803
+ sage: CC = C.surrounding_bch_code()
804
+ sage: CC
805
+ [63, 51] BCH Code over GF(2) with designed distance 3
806
+ sage: all(r in CC for r in C.generator_matrix())
807
+ True
808
+ """
809
+ from .bch_code import BCHCode
810
+ delta, params = self.bch_bound(arithmetic=True)
811
+ return BCHCode(self.base_field(), self.length(), delta,
812
+ offset=params[1], jump_size=params[0])
813
+
814
+
815
+ class CyclicCodePolynomialEncoder(Encoder):
816
+ r"""
817
+ An encoder encoding polynomials into codewords.
818
+
819
+ Let `C` be a cyclic code over some finite field `F`,
820
+ and let `g` be its generator polynomial.
821
+
822
+ This encoder encodes any polynomial `p \in F[x]_{<k}` by computing
823
+ `c = p g` and returning the vector of its coefficients.
824
+
825
+ INPUT:
826
+
827
+ - ``code`` -- the associated code of this encoder
828
+
829
+ EXAMPLES::
830
+
831
+ sage: F.<x> = GF(2)[]
832
+ sage: n = 7
833
+ sage: g = x ** 3 + x + 1
834
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
835
+ sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
836
+ sage: E
837
+ Polynomial-style encoder for [7, 4] Cyclic Code over GF(2)
838
+ """
839
+
840
+ def __init__(self, code):
841
+ r"""
842
+ EXAMPLES::
843
+
844
+ sage: F.<x> = GF(2)[]
845
+ sage: n = 7
846
+ sage: g = x ** 3 + x + 1
847
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
848
+ sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
849
+ sage: E
850
+ Polynomial-style encoder for [7, 4] Cyclic Code over GF(2)
851
+ """
852
+ if not isinstance(code, CyclicCode):
853
+ raise ValueError("code has to be a CyclicCode")
854
+ self._polynomial_ring = code._polynomial_ring
855
+ super().__init__(code)
856
+
857
+ def __eq__(self, other):
858
+ r"""
859
+ Test equality between CyclicCodePolynomialEncoder objects.
860
+
861
+ EXAMPLES::
862
+
863
+ sage: F.<x> = GF(2)[]
864
+ sage: n = 7
865
+ sage: g = x ** 3 + x + 1
866
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
867
+ sage: E1 = codes.encoders.CyclicCodePolynomialEncoder(C)
868
+ sage: E2 = codes.encoders.CyclicCodePolynomialEncoder(C)
869
+ sage: E1 == E2
870
+ True
871
+ """
872
+ return (isinstance(other, CyclicCodePolynomialEncoder) and
873
+ self.code() == other.code())
874
+
875
+ def _repr_(self):
876
+ r"""
877
+ Return a string representation of ``self``.
878
+
879
+ EXAMPLES::
880
+
881
+ sage: F.<x> = GF(2)[]
882
+ sage: n = 7
883
+ sage: g = x ** 3 + x + 1
884
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
885
+ sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
886
+ sage: E
887
+ Polynomial-style encoder for [7, 4] Cyclic Code over GF(2)
888
+ """
889
+ return "Polynomial-style encoder for %s" % self.code()
890
+
891
+ def _latex_(self):
892
+ r"""
893
+ Return a latex representation of ``self``.
894
+
895
+ EXAMPLES::
896
+
897
+ sage: F.<x> = GF(2)[]
898
+ sage: n = 7
899
+ sage: g = x ** 3 + x + 1
900
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
901
+ sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
902
+ sage: latex(E)
903
+ \textnormal{Polynomial-style encoder for }[7, 4] \textnormal{ Cyclic Code over } \Bold{F}_{2}
904
+ """
905
+ return ("\\textnormal{Polynomial-style encoder for }%s" %
906
+ self.code()._latex_())
907
+
908
+ def encode(self, p):
909
+ r"""
910
+ Transform `p` into an element of the associated code of ``self``.
911
+
912
+ INPUT:
913
+
914
+ - ``p`` -- a polynomial from ``self`` message space
915
+
916
+ OUTPUT: a codeword in associated code of ``self``
917
+
918
+ EXAMPLES::
919
+
920
+ sage: F.<x> = GF(2)[]
921
+ sage: n = 7
922
+ sage: g = x ** 3 + x + 1
923
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
924
+ sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
925
+ sage: m = x ** 2 + 1
926
+ sage: E.encode(m)
927
+ (1, 1, 1, 0, 0, 1, 0)
928
+ """
929
+ C = self.code()
930
+ k = C.dimension()
931
+ n = C.length()
932
+ if p.degree() >= k:
933
+ raise ValueError("Degree of the message must be at most %s" % k - 1)
934
+ res = _to_complete_list(p * C.generator_polynomial(), n)
935
+ return vector(C.base_field(), res)
936
+
937
+ def unencode_nocheck(self, c):
938
+ r"""
939
+ Return the message corresponding to ``c``.
940
+ Does not check if ``c`` belongs to the code.
941
+
942
+ INPUT:
943
+
944
+ - ``c`` -- a vector with the same length as the code
945
+
946
+ OUTPUT: an element of the message space
947
+
948
+ EXAMPLES::
949
+
950
+ sage: F.<x> = GF(2)[]
951
+ sage: n = 7
952
+ sage: g = x ** 3 + x + 1
953
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
954
+ sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
955
+ sage: c = vector(GF(2), (1, 1, 1, 0, 0, 1, 0))
956
+ sage: E.unencode_nocheck(c)
957
+ x^2 + 1
958
+ """
959
+ R = self.message_space()
960
+ g = self.code().generator_polynomial()
961
+ p = R(c.list())
962
+ return p // g
963
+
964
+ def message_space(self):
965
+ r"""
966
+ Return the message space of ``self``.
967
+
968
+ EXAMPLES::
969
+
970
+ sage: F.<x> = GF(2)[]
971
+ sage: n = 7
972
+ sage: g = x ** 3 + x + 1
973
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
974
+ sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
975
+ sage: E.message_space() # needs sage.libs.ntl
976
+ Univariate Polynomial Ring in x over Finite Field of size 2 (using GF2X)
977
+ """
978
+ return self._polynomial_ring
979
+
980
+
981
+ class CyclicCodeVectorEncoder(Encoder):
982
+ r"""
983
+ An encoder which can encode vectors into codewords.
984
+
985
+ Let `C` be a cyclic code over some finite field `F`,
986
+ and let `g` be its generator polynomial.
987
+
988
+ Let `m = (m_1, m_2, \dots, m_k)` be a vector in `F^{k}`.
989
+ This codeword can be seen as a polynomial over `F[x]`, as follows:
990
+ `P_m = \Sigma_{i=0}^{k-1} m_i \times x^i`.
991
+
992
+ To encode `m`, this encoder does the multiplication `P_m g`.
993
+
994
+ INPUT:
995
+
996
+ - ``code`` -- the associated code of this encoder
997
+
998
+ EXAMPLES::
999
+
1000
+ sage: F.<x> = GF(2)[]
1001
+ sage: n = 7
1002
+ sage: g = x ** 3 + x + 1
1003
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1004
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1005
+ sage: E
1006
+ Vector-style encoder for [7, 4] Cyclic Code over GF(2)
1007
+ """
1008
+
1009
+ def __init__(self, code):
1010
+ r"""
1011
+
1012
+ EXAMPLES::
1013
+
1014
+ sage: F.<x> = GF(2)[]
1015
+ sage: n = 7
1016
+ sage: g = x ** 3 + x + 1
1017
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1018
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1019
+ sage: E
1020
+ Vector-style encoder for [7, 4] Cyclic Code over GF(2)
1021
+ """
1022
+ if not isinstance(code, CyclicCode):
1023
+ raise ValueError("code has to be a CyclicCode")
1024
+ self._polynomial_ring = code._polynomial_ring
1025
+ super().__init__(code)
1026
+
1027
+ def __eq__(self, other):
1028
+ r"""
1029
+ Test equality between CyclicCodeVectorEncoder objects.
1030
+
1031
+ EXAMPLES::
1032
+
1033
+ sage: F.<x> = GF(2)[]
1034
+ sage: n = 7
1035
+ sage: g = x ** 3 + x + 1
1036
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1037
+ sage: E1 = codes.encoders.CyclicCodeVectorEncoder(C)
1038
+ sage: E2 = codes.encoders.CyclicCodeVectorEncoder(C)
1039
+ sage: E1 == E2
1040
+ True
1041
+ """
1042
+ return (isinstance(other, CyclicCodeVectorEncoder) and
1043
+ self.code() == other.code())
1044
+
1045
+ def _repr_(self):
1046
+ r"""
1047
+ Return a string representation of ``self``.
1048
+
1049
+ EXAMPLES::
1050
+
1051
+ sage: F.<x> = GF(2)[]
1052
+ sage: n = 7
1053
+ sage: g = x ** 3 + x + 1
1054
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1055
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1056
+ sage: E
1057
+ Vector-style encoder for [7, 4] Cyclic Code over GF(2)
1058
+ """
1059
+ return "Vector-style encoder for %s" % self.code()
1060
+
1061
+ def _latex_(self):
1062
+ r"""
1063
+ Return a latex representation of ``self``.
1064
+
1065
+ EXAMPLES::
1066
+
1067
+ sage: F.<x> = GF(2)[]
1068
+ sage: n = 7
1069
+ sage: g = x ** 3 + x + 1
1070
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1071
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1072
+ sage: latex(E)
1073
+ \textnormal{Vector-style encoder for }[7, 4] \textnormal{ Cyclic Code over } \Bold{F}_{2}
1074
+ """
1075
+ return ("\\textnormal{Vector-style encoder for }%s" %
1076
+ self.code()._latex_())
1077
+
1078
+ def encode(self, m):
1079
+ r"""
1080
+ Transform `m` into an element of the associated code of ``self``.
1081
+
1082
+ INPUT:
1083
+
1084
+ - ``m`` -- an element from ``self``'s message space
1085
+
1086
+ OUTPUT: a codeword in the associated code of ``self``
1087
+
1088
+ EXAMPLES::
1089
+
1090
+ sage: F.<x> = GF(2)[]
1091
+ sage: n = 7
1092
+ sage: g = x ** 3 + x + 1
1093
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1094
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1095
+ sage: m = vector(GF(2), (1, 0, 1, 0))
1096
+ sage: E.encode(m)
1097
+ (1, 1, 1, 0, 0, 1, 0)
1098
+ """
1099
+ if self.generator_matrix.cache is not None:
1100
+ return super().encode(m)
1101
+
1102
+ k = self.code().dimension()
1103
+ n = self.code().length()
1104
+ F = self.code().base_field()
1105
+ R = self._polynomial_ring
1106
+ p = R(m.list())
1107
+ if p.degree() >= k:
1108
+ raise ValueError("Degree of the message must be at most %s" % k - 1)
1109
+ res = _to_complete_list(p * self.code().generator_polynomial(), n)
1110
+ return vector(F, res)
1111
+
1112
+ def unencode_nocheck(self, c):
1113
+ r"""
1114
+ Return the message corresponding to ``c``.
1115
+ Does not check if ``c`` belongs to the code.
1116
+
1117
+ INPUT:
1118
+
1119
+ - ``c`` -- a vector with the same length as the code
1120
+
1121
+ OUTPUT: an element of the message space
1122
+
1123
+ EXAMPLES::
1124
+
1125
+ sage: F.<x> = GF(2)[]
1126
+ sage: n = 7
1127
+ sage: g = x ** 3 + x + 1
1128
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1129
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1130
+ sage: c = vector(GF(2), (1, 1, 1, 0, 0, 1, 0))
1131
+ sage: E.unencode_nocheck(c)
1132
+ (1, 0, 1, 0)
1133
+ """
1134
+
1135
+ R = self._polynomial_ring
1136
+ g = self.code().generator_polynomial()
1137
+ p = R(c.list())
1138
+ l = _to_complete_list(p // g, self.message_space().dimension())
1139
+ return vector(self.code().base_field(), l)
1140
+
1141
+ @cached_method
1142
+ def generator_matrix(self):
1143
+ r"""
1144
+ Return a generator matrix of ``self``.
1145
+
1146
+ EXAMPLES::
1147
+
1148
+ sage: F.<x> = GF(2)[]
1149
+ sage: n = 7
1150
+ sage: g = x ** 3 + x + 1
1151
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1152
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1153
+ sage: E.generator_matrix()
1154
+ [1 1 0 1 0 0 0]
1155
+ [0 1 1 0 1 0 0]
1156
+ [0 0 1 1 0 1 0]
1157
+ [0 0 0 1 1 0 1]
1158
+ """
1159
+ C = self.code()
1160
+ k = C.dimension()
1161
+ n = C.length()
1162
+ l = _to_complete_list(C.generator_polynomial(), n)
1163
+ M = matrix([l[-i:] + l[:-i] for i in range(k)])
1164
+ M.set_immutable()
1165
+ return M
1166
+
1167
+ def message_space(self):
1168
+ r"""
1169
+ Return the message space of ``self``.
1170
+
1171
+ EXAMPLES::
1172
+
1173
+ sage: F.<x> = GF(2)[]
1174
+ sage: n = 7
1175
+ sage: g = x ** 3 + x + 1
1176
+ sage: C = codes.CyclicCode(generator_pol=g, length=n)
1177
+ sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
1178
+ sage: E.message_space()
1179
+ Vector space of dimension 4 over Finite Field of size 2
1180
+ """
1181
+ return self.code().base_ring() ** self.code().dimension()
1182
+
1183
+
1184
+ class CyclicCodeSurroundingBCHDecoder(Decoder):
1185
+ r"""
1186
+ A decoder which decodes through the surrounding BCH code of the cyclic
1187
+ code.
1188
+
1189
+ INPUT:
1190
+
1191
+ - ``code`` -- the associated code of this decoder
1192
+
1193
+ - ``**kwargs`` -- all extra arguments are forwarded to the BCH decoder
1194
+
1195
+ EXAMPLES::
1196
+
1197
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1198
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1199
+ sage: D
1200
+ Decoder through the surrounding BCH code of the [15, 10] Cyclic Code over GF(16)
1201
+ """
1202
+ def __init__(self, code, **kwargs):
1203
+ r"""
1204
+
1205
+ EXAMPLES::
1206
+
1207
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1208
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1209
+ sage: D
1210
+ Decoder through the surrounding BCH code of the [15, 10] Cyclic Code over GF(16)
1211
+ """
1212
+ self._bch_code = code.surrounding_bch_code()
1213
+ self._bch_decoder = self._bch_code.decoder(**kwargs)
1214
+ self._decoder_type = copy(self._bch_decoder.decoder_type())
1215
+ super().__init__(code, code.ambient_space(), "Vector")
1216
+
1217
+ def __eq__(self, other):
1218
+ r"""
1219
+ Test equality between CyclicCodeSurroundingBCHDecoder objects.
1220
+
1221
+ EXAMPLES::
1222
+
1223
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1224
+ sage: D1 = C.decoder()
1225
+ sage: D2 = C.decoder()
1226
+ sage: D1 == D2
1227
+ True
1228
+ """
1229
+ return (isinstance(other, CyclicCodeSurroundingBCHDecoder) and
1230
+ self.code() == other.code() and
1231
+ self.bch_decoder() == other.bch_decoder())
1232
+
1233
+ def _repr_(self):
1234
+ r"""
1235
+ Return a string representation of ``self``.
1236
+
1237
+ EXAMPLES::
1238
+
1239
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1240
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1241
+ sage: D
1242
+ Decoder through the surrounding BCH code of the [15, 10] Cyclic Code over GF(16)
1243
+ """
1244
+ return ("Decoder through the surrounding BCH code of the %s" %
1245
+ self.code())
1246
+
1247
+ def _latex_(self):
1248
+ r"""
1249
+ Return a latex representation of ``self``.
1250
+
1251
+ EXAMPLES::
1252
+
1253
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1254
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1255
+ sage: latex(D)
1256
+ \textnormal{Decoder through the surrounding BCH code of the }[15, 10] \textnormal{ Cyclic Code over } \Bold{F}_{2^{4}}
1257
+ """
1258
+ return ("\\textnormal{Decoder through the surrounding BCH code of "
1259
+ "the }%s" % self.code()._latex_())
1260
+
1261
+ def bch_code(self):
1262
+ r"""
1263
+ Return the surrounding BCH code of
1264
+ :meth:`sage.coding.encoder.Encoder.code`.
1265
+
1266
+ EXAMPLES::
1267
+
1268
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1269
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1270
+ sage: D.bch_code()
1271
+ [15, 12] BCH Code over GF(16) with designed distance 4
1272
+ """
1273
+ return self._bch_code
1274
+
1275
+ def bch_decoder(self):
1276
+ r"""
1277
+ Return the decoder that will be used over the surrounding BCH code.
1278
+
1279
+ EXAMPLES::
1280
+
1281
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1282
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1283
+ sage: D.bch_decoder()
1284
+ Decoder through the underlying GRS code of [15, 12] BCH Code
1285
+ over GF(16) with designed distance 4
1286
+ """
1287
+ return self._bch_decoder
1288
+
1289
+ def decode_to_code(self, y):
1290
+ r"""
1291
+ Decodes ``r`` to an element in :meth:`sage.coding.encoder.Encoder.code`.
1292
+
1293
+ EXAMPLES::
1294
+
1295
+ sage: F = GF(16, 'a')
1296
+ sage: C = codes.CyclicCode(field=F, length=15, D=[14, 1, 2, 11, 12])
1297
+ sage: a = F.gen()
1298
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1299
+ sage: y = vector(F, [0, a^3, a^3 + a^2 + a, 1, a^2 + 1, a^3 + a^2 + 1,
1300
+ ....: a^3 + a^2 + a, a^3 + a^2 + a, a^2 + a, a^2 + 1,
1301
+ ....: a^2 + a + 1, a^3 + 1, a^2, a^3 + a, a^3 + a])
1302
+ sage: D.decode_to_code(y) in C
1303
+ True
1304
+ """
1305
+ return self.bch_code().decode_to_code(y)
1306
+
1307
+ def decoding_radius(self):
1308
+ r"""
1309
+ Return maximal number of errors that ``self`` can decode.
1310
+
1311
+ EXAMPLES::
1312
+
1313
+ sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
1314
+ sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
1315
+ sage: D.decoding_radius()
1316
+ 1
1317
+ """
1318
+ return self._bch_decoder.decoding_radius()
1319
+
1320
+
1321
+ # ###################### registration ##############################
1322
+
1323
+ CyclicCode._registered_encoders["Polynomial"] = CyclicCodePolynomialEncoder
1324
+ CyclicCode._registered_encoders["Vector"] = CyclicCodeVectorEncoder
1325
+ CyclicCode._registered_decoders["Syndrome"] = LinearCodeSyndromeDecoder
1326
+ CyclicCode._registered_decoders["NearestNeighbor"] = LinearCodeNearestNeighborDecoder
1327
+
1328
+ CyclicCode._registered_decoders["SurroundingBCH"] = CyclicCodeSurroundingBCHDecoder
1329
+ CyclicCodeSurroundingBCHDecoder._decoder_type = {"dynamic"}