passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

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

Potentially problematic release.


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

Files changed (806) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +806 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  6. passagemath_modules.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  7. passagemath_modules.libs/libgsl-e3525837.so.28.0.0 +0 -0
  8. passagemath_modules.libs/libmpc-c5c421e1.so.3.3.1 +0 -0
  9. passagemath_modules.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  10. passagemath_modules.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  11. sage/algebras/all__sagemath_modules.py +20 -0
  12. sage/algebras/catalog.py +148 -0
  13. sage/algebras/clifford_algebra.py +3107 -0
  14. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  15. sage/algebras/clifford_algebra_element.pxd +16 -0
  16. sage/algebras/clifford_algebra_element.pyx +997 -0
  17. sage/algebras/commutative_dga.py +4252 -0
  18. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-gnu.so +0 -0
  19. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  20. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  21. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  22. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  28. sage/algebras/finite_gca.py +528 -0
  29. sage/algebras/group_algebra.py +232 -0
  30. sage/algebras/lie_algebras/abelian.py +197 -0
  31. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  32. sage/algebras/lie_algebras/all.py +25 -0
  33. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  34. sage/algebras/lie_algebras/bch.py +177 -0
  35. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  36. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  37. sage/algebras/lie_algebras/center_uea.py +767 -0
  38. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  39. sage/algebras/lie_algebras/examples.py +683 -0
  40. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  41. sage/algebras/lie_algebras/heisenberg.py +820 -0
  42. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  43. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  46. sage/algebras/lie_algebras/morphism.py +661 -0
  47. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  48. sage/algebras/lie_algebras/onsager.py +1324 -0
  49. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  50. sage/algebras/lie_algebras/quotient.py +462 -0
  51. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  52. sage/algebras/lie_algebras/representation.py +1040 -0
  53. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  54. sage/algebras/lie_algebras/subalgebra.py +967 -0
  55. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  56. sage/algebras/lie_algebras/verma_module.py +1630 -0
  57. sage/algebras/lie_algebras/virasoro.py +1186 -0
  58. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-gnu.so +0 -0
  59. sage/algebras/octonion_algebra.pxd +20 -0
  60. sage/algebras/octonion_algebra.pyx +987 -0
  61. sage/algebras/orlik_solomon.py +907 -0
  62. sage/algebras/orlik_terao.py +779 -0
  63. sage/algebras/steenrod/all.py +7 -0
  64. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  65. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  66. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  67. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  68. sage/algebras/weyl_algebra.py +1126 -0
  69. sage/all__sagemath_modules.py +62 -0
  70. sage/calculus/all__sagemath_modules.py +19 -0
  71. sage/calculus/expr.py +205 -0
  72. sage/calculus/integration.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/calculus/integration.pyx +698 -0
  74. sage/calculus/interpolation.cpython-314-aarch64-linux-gnu.so +0 -0
  75. sage/calculus/interpolation.pxd +13 -0
  76. sage/calculus/interpolation.pyx +387 -0
  77. sage/calculus/interpolators.cpython-314-aarch64-linux-gnu.so +0 -0
  78. sage/calculus/interpolators.pyx +326 -0
  79. sage/calculus/ode.cpython-314-aarch64-linux-gnu.so +0 -0
  80. sage/calculus/ode.pxd +5 -0
  81. sage/calculus/ode.pyx +610 -0
  82. sage/calculus/riemann.cpython-314-aarch64-linux-gnu.so +0 -0
  83. sage/calculus/riemann.pyx +1521 -0
  84. sage/calculus/test_sympy.py +201 -0
  85. sage/calculus/transforms/all.py +7 -0
  86. sage/calculus/transforms/dft.py +844 -0
  87. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-gnu.so +0 -0
  88. sage/calculus/transforms/dwt.pxd +7 -0
  89. sage/calculus/transforms/dwt.pyx +160 -0
  90. sage/calculus/transforms/fft.cpython-314-aarch64-linux-gnu.so +0 -0
  91. sage/calculus/transforms/fft.pxd +12 -0
  92. sage/calculus/transforms/fft.pyx +487 -0
  93. sage/calculus/wester.py +662 -0
  94. sage/coding/abstract_code.py +1108 -0
  95. sage/coding/ag_code.py +868 -0
  96. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/coding/ag_code_decoders.pyx +2639 -0
  98. sage/coding/all.py +15 -0
  99. sage/coding/bch_code.py +494 -0
  100. sage/coding/binary_code.cpython-314-aarch64-linux-gnu.so +0 -0
  101. sage/coding/binary_code.pxd +124 -0
  102. sage/coding/binary_code.pyx +4139 -0
  103. sage/coding/bounds_catalog.py +43 -0
  104. sage/coding/channel.py +819 -0
  105. sage/coding/channels_catalog.py +29 -0
  106. sage/coding/code_bounds.py +755 -0
  107. sage/coding/code_constructions.py +804 -0
  108. sage/coding/codes_catalog.py +111 -0
  109. sage/coding/cyclic_code.py +1329 -0
  110. sage/coding/databases.py +316 -0
  111. sage/coding/decoder.py +373 -0
  112. sage/coding/decoders_catalog.py +88 -0
  113. sage/coding/delsarte_bounds.py +709 -0
  114. sage/coding/encoder.py +390 -0
  115. sage/coding/encoders_catalog.py +64 -0
  116. sage/coding/extended_code.py +468 -0
  117. sage/coding/gabidulin_code.py +1058 -0
  118. sage/coding/golay_code.py +404 -0
  119. sage/coding/goppa_code.py +441 -0
  120. sage/coding/grs_code.py +2371 -0
  121. sage/coding/guava.py +107 -0
  122. sage/coding/guruswami_sudan/all.py +1 -0
  123. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  124. sage/coding/guruswami_sudan/interpolation.py +409 -0
  125. sage/coding/guruswami_sudan/utils.py +176 -0
  126. sage/coding/hamming_code.py +176 -0
  127. sage/coding/information_set_decoder.py +1032 -0
  128. sage/coding/kasami_codes.cpython-314-aarch64-linux-gnu.so +0 -0
  129. sage/coding/kasami_codes.pyx +351 -0
  130. sage/coding/linear_code.py +3067 -0
  131. sage/coding/linear_code_no_metric.py +1354 -0
  132. sage/coding/linear_rank_metric.py +961 -0
  133. sage/coding/parity_check_code.py +353 -0
  134. sage/coding/punctured_code.py +719 -0
  135. sage/coding/reed_muller_code.py +999 -0
  136. sage/coding/self_dual_codes.py +942 -0
  137. sage/coding/source_coding/all.py +2 -0
  138. sage/coding/source_coding/huffman.py +553 -0
  139. sage/coding/subfield_subcode.py +423 -0
  140. sage/coding/two_weight_db.py +399 -0
  141. sage/combinat/all__sagemath_modules.py +7 -0
  142. sage/combinat/cartesian_product.py +347 -0
  143. sage/combinat/family.py +11 -0
  144. sage/combinat/free_module.py +1977 -0
  145. sage/combinat/root_system/all.py +147 -0
  146. sage/combinat/root_system/ambient_space.py +527 -0
  147. sage/combinat/root_system/associahedron.py +471 -0
  148. sage/combinat/root_system/braid_move_calculator.py +143 -0
  149. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-gnu.so +0 -0
  150. sage/combinat/root_system/braid_orbit.pyx +144 -0
  151. sage/combinat/root_system/branching_rules.py +2301 -0
  152. sage/combinat/root_system/cartan_matrix.py +1245 -0
  153. sage/combinat/root_system/cartan_type.py +3069 -0
  154. sage/combinat/root_system/coxeter_group.py +162 -0
  155. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  156. sage/combinat/root_system/coxeter_type.py +681 -0
  157. sage/combinat/root_system/dynkin_diagram.py +900 -0
  158. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  159. sage/combinat/root_system/fundamental_group.py +795 -0
  160. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  161. sage/combinat/root_system/integrable_representations.py +1227 -0
  162. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  163. sage/combinat/root_system/pieri_factors.py +1147 -0
  164. sage/combinat/root_system/plot.py +1615 -0
  165. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  166. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  167. sage/combinat/root_system/root_space.py +487 -0
  168. sage/combinat/root_system/root_system.py +882 -0
  169. sage/combinat/root_system/type_A.py +348 -0
  170. sage/combinat/root_system/type_A_affine.py +227 -0
  171. sage/combinat/root_system/type_A_infinity.py +241 -0
  172. sage/combinat/root_system/type_B.py +347 -0
  173. sage/combinat/root_system/type_BC_affine.py +287 -0
  174. sage/combinat/root_system/type_B_affine.py +216 -0
  175. sage/combinat/root_system/type_C.py +317 -0
  176. sage/combinat/root_system/type_C_affine.py +188 -0
  177. sage/combinat/root_system/type_D.py +357 -0
  178. sage/combinat/root_system/type_D_affine.py +208 -0
  179. sage/combinat/root_system/type_E.py +641 -0
  180. sage/combinat/root_system/type_E_affine.py +231 -0
  181. sage/combinat/root_system/type_F.py +387 -0
  182. sage/combinat/root_system/type_F_affine.py +137 -0
  183. sage/combinat/root_system/type_G.py +293 -0
  184. sage/combinat/root_system/type_G_affine.py +132 -0
  185. sage/combinat/root_system/type_H.py +105 -0
  186. sage/combinat/root_system/type_I.py +110 -0
  187. sage/combinat/root_system/type_Q.py +150 -0
  188. sage/combinat/root_system/type_affine.py +509 -0
  189. sage/combinat/root_system/type_dual.py +704 -0
  190. sage/combinat/root_system/type_folded.py +301 -0
  191. sage/combinat/root_system/type_marked.py +748 -0
  192. sage/combinat/root_system/type_reducible.py +601 -0
  193. sage/combinat/root_system/type_relabel.py +730 -0
  194. sage/combinat/root_system/type_super_A.py +837 -0
  195. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  196. sage/combinat/root_system/weight_space.py +639 -0
  197. sage/combinat/root_system/weyl_characters.py +2238 -0
  198. sage/crypto/__init__.py +4 -0
  199. sage/crypto/all.py +28 -0
  200. sage/crypto/block_cipher/all.py +7 -0
  201. sage/crypto/block_cipher/des.py +1065 -0
  202. sage/crypto/block_cipher/miniaes.py +2171 -0
  203. sage/crypto/block_cipher/present.py +909 -0
  204. sage/crypto/block_cipher/sdes.py +1527 -0
  205. sage/crypto/boolean_function.cpython-314-aarch64-linux-gnu.so +0 -0
  206. sage/crypto/boolean_function.pxd +10 -0
  207. sage/crypto/boolean_function.pyx +1487 -0
  208. sage/crypto/cipher.py +78 -0
  209. sage/crypto/classical.py +3668 -0
  210. sage/crypto/classical_cipher.py +569 -0
  211. sage/crypto/cryptosystem.py +387 -0
  212. sage/crypto/key_exchange/all.py +7 -0
  213. sage/crypto/key_exchange/catalog.py +24 -0
  214. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  215. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  216. sage/crypto/lattice.py +312 -0
  217. sage/crypto/lfsr.py +295 -0
  218. sage/crypto/lwe.py +840 -0
  219. sage/crypto/mq/__init__.py +4 -0
  220. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  221. sage/crypto/mq/rijndael_gf.py +2345 -0
  222. sage/crypto/mq/sbox.py +7 -0
  223. sage/crypto/mq/sr.py +3344 -0
  224. sage/crypto/public_key/all.py +5 -0
  225. sage/crypto/public_key/blum_goldwasser.py +776 -0
  226. sage/crypto/sbox.cpython-314-aarch64-linux-gnu.so +0 -0
  227. sage/crypto/sbox.pyx +2090 -0
  228. sage/crypto/sboxes.py +2090 -0
  229. sage/crypto/stream.py +390 -0
  230. sage/crypto/stream_cipher.py +297 -0
  231. sage/crypto/util.py +519 -0
  232. sage/ext/all__sagemath_modules.py +1 -0
  233. sage/ext/interpreters/__init__.py +1 -0
  234. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  235. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-gnu.so +0 -0
  236. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  237. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  238. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-gnu.so +0 -0
  239. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  240. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  241. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-gnu.so +0 -0
  242. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  243. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  244. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-gnu.so +0 -0
  245. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  246. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  247. sage/geometry/all__sagemath_modules.py +5 -0
  248. sage/geometry/toric_lattice.py +1745 -0
  249. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-gnu.so +0 -0
  250. sage/geometry/toric_lattice_element.pyx +432 -0
  251. sage/groups/abelian_gps/abelian_group.py +1925 -0
  252. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  253. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  254. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  255. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  256. sage/groups/abelian_gps/element_base.py +341 -0
  257. sage/groups/abelian_gps/values.py +488 -0
  258. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  259. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  260. sage/groups/additive_abelian/all.py +4 -0
  261. sage/groups/additive_abelian/qmodnz.py +231 -0
  262. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  263. sage/groups/affine_gps/affine_group.py +535 -0
  264. sage/groups/affine_gps/all.py +1 -0
  265. sage/groups/affine_gps/catalog.py +17 -0
  266. sage/groups/affine_gps/euclidean_group.py +246 -0
  267. sage/groups/affine_gps/group_element.py +562 -0
  268. sage/groups/all__sagemath_modules.py +12 -0
  269. sage/groups/galois_group.py +479 -0
  270. sage/groups/matrix_gps/all.py +4 -0
  271. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  272. sage/groups/matrix_gps/catalog.py +26 -0
  273. sage/groups/matrix_gps/coxeter_group.py +927 -0
  274. sage/groups/matrix_gps/finitely_generated.py +487 -0
  275. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-gnu.so +0 -0
  276. sage/groups/matrix_gps/group_element.pxd +11 -0
  277. sage/groups/matrix_gps/group_element.pyx +431 -0
  278. sage/groups/matrix_gps/linear.py +440 -0
  279. sage/groups/matrix_gps/matrix_group.py +617 -0
  280. sage/groups/matrix_gps/named_group.py +296 -0
  281. sage/groups/matrix_gps/orthogonal.py +544 -0
  282. sage/groups/matrix_gps/symplectic.py +251 -0
  283. sage/groups/matrix_gps/unitary.py +436 -0
  284. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  285. sage/groups/misc_gps/argument_groups.py +1905 -0
  286. sage/groups/misc_gps/imaginary_groups.py +479 -0
  287. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  288. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-gnu.so +0 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  292. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-gnu.so +0 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  295. sage/homology/algebraic_topological_model.py +595 -0
  296. sage/homology/all.py +2 -0
  297. sage/homology/all__sagemath_modules.py +8 -0
  298. sage/homology/chain_complex.py +2148 -0
  299. sage/homology/chain_complex_homspace.py +165 -0
  300. sage/homology/chain_complex_morphism.py +629 -0
  301. sage/homology/chain_homotopy.py +604 -0
  302. sage/homology/chains.py +653 -0
  303. sage/homology/free_resolution.py +923 -0
  304. sage/homology/graded_resolution.py +567 -0
  305. sage/homology/hochschild_complex.py +756 -0
  306. sage/homology/homology_group.py +188 -0
  307. sage/homology/homology_morphism.py +422 -0
  308. sage/homology/homology_vector_space_with_basis.py +1454 -0
  309. sage/homology/koszul_complex.py +169 -0
  310. sage/homology/matrix_utils.py +205 -0
  311. sage/libs/all__sagemath_modules.py +1 -0
  312. sage/libs/gsl/__init__.py +1 -0
  313. sage/libs/gsl/airy.pxd +56 -0
  314. sage/libs/gsl/all.pxd +66 -0
  315. sage/libs/gsl/array.cpython-314-aarch64-linux-gnu.so +0 -0
  316. sage/libs/gsl/array.pxd +5 -0
  317. sage/libs/gsl/array.pyx +102 -0
  318. sage/libs/gsl/bessel.pxd +208 -0
  319. sage/libs/gsl/blas.pxd +116 -0
  320. sage/libs/gsl/blas_types.pxd +34 -0
  321. sage/libs/gsl/block.pxd +52 -0
  322. sage/libs/gsl/chebyshev.pxd +37 -0
  323. sage/libs/gsl/clausen.pxd +12 -0
  324. sage/libs/gsl/combination.pxd +47 -0
  325. sage/libs/gsl/complex.pxd +151 -0
  326. sage/libs/gsl/coulomb.pxd +30 -0
  327. sage/libs/gsl/coupling.pxd +21 -0
  328. sage/libs/gsl/dawson.pxd +12 -0
  329. sage/libs/gsl/debye.pxd +24 -0
  330. sage/libs/gsl/dilog.pxd +14 -0
  331. sage/libs/gsl/eigen.pxd +46 -0
  332. sage/libs/gsl/elementary.pxd +12 -0
  333. sage/libs/gsl/ellint.pxd +48 -0
  334. sage/libs/gsl/elljac.pxd +8 -0
  335. sage/libs/gsl/erf.pxd +32 -0
  336. sage/libs/gsl/errno.pxd +26 -0
  337. sage/libs/gsl/exp.pxd +44 -0
  338. sage/libs/gsl/expint.pxd +44 -0
  339. sage/libs/gsl/fermi_dirac.pxd +44 -0
  340. sage/libs/gsl/fft.pxd +121 -0
  341. sage/libs/gsl/fit.pxd +50 -0
  342. sage/libs/gsl/gamma.pxd +94 -0
  343. sage/libs/gsl/gegenbauer.pxd +26 -0
  344. sage/libs/gsl/histogram.pxd +176 -0
  345. sage/libs/gsl/hyperg.pxd +52 -0
  346. sage/libs/gsl/integration.pxd +69 -0
  347. sage/libs/gsl/interp.pxd +109 -0
  348. sage/libs/gsl/laguerre.pxd +24 -0
  349. sage/libs/gsl/lambert.pxd +16 -0
  350. sage/libs/gsl/legendre.pxd +90 -0
  351. sage/libs/gsl/linalg.pxd +185 -0
  352. sage/libs/gsl/log.pxd +26 -0
  353. sage/libs/gsl/math.pxd +43 -0
  354. sage/libs/gsl/matrix.pxd +143 -0
  355. sage/libs/gsl/matrix_complex.pxd +130 -0
  356. sage/libs/gsl/min.pxd +67 -0
  357. sage/libs/gsl/monte.pxd +56 -0
  358. sage/libs/gsl/ntuple.pxd +32 -0
  359. sage/libs/gsl/odeiv.pxd +70 -0
  360. sage/libs/gsl/permutation.pxd +78 -0
  361. sage/libs/gsl/poly.pxd +40 -0
  362. sage/libs/gsl/pow_int.pxd +12 -0
  363. sage/libs/gsl/psi.pxd +28 -0
  364. sage/libs/gsl/qrng.pxd +29 -0
  365. sage/libs/gsl/random.pxd +257 -0
  366. sage/libs/gsl/rng.pxd +100 -0
  367. sage/libs/gsl/roots.pxd +72 -0
  368. sage/libs/gsl/sort.pxd +36 -0
  369. sage/libs/gsl/statistics.pxd +59 -0
  370. sage/libs/gsl/sum.pxd +55 -0
  371. sage/libs/gsl/synchrotron.pxd +16 -0
  372. sage/libs/gsl/transport.pxd +24 -0
  373. sage/libs/gsl/trig.pxd +58 -0
  374. sage/libs/gsl/types.pxd +137 -0
  375. sage/libs/gsl/vector.pxd +101 -0
  376. sage/libs/gsl/vector_complex.pxd +83 -0
  377. sage/libs/gsl/wavelet.pxd +49 -0
  378. sage/libs/gsl/zeta.pxd +28 -0
  379. sage/libs/mpc/__init__.pxd +114 -0
  380. sage/libs/mpc/types.pxd +28 -0
  381. sage/libs/mpfr/__init__.pxd +299 -0
  382. sage/libs/mpfr/types.pxd +26 -0
  383. sage/libs/mpmath/__init__.py +1 -0
  384. sage/libs/mpmath/all.py +27 -0
  385. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  386. sage/libs/mpmath/utils.cpython-314-aarch64-linux-gnu.so +0 -0
  387. sage/libs/mpmath/utils.pxd +4 -0
  388. sage/libs/mpmath/utils.pyx +319 -0
  389. sage/matrix/action.cpython-314-aarch64-linux-gnu.so +0 -0
  390. sage/matrix/action.pxd +26 -0
  391. sage/matrix/action.pyx +596 -0
  392. sage/matrix/all.py +9 -0
  393. sage/matrix/args.cpython-314-aarch64-linux-gnu.so +0 -0
  394. sage/matrix/args.pxd +144 -0
  395. sage/matrix/args.pyx +1668 -0
  396. sage/matrix/benchmark.py +1258 -0
  397. sage/matrix/berlekamp_massey.py +95 -0
  398. sage/matrix/compute_J_ideal.py +926 -0
  399. sage/matrix/constructor.cpython-314-aarch64-linux-gnu.so +0 -0
  400. sage/matrix/constructor.pyx +750 -0
  401. sage/matrix/docs.py +430 -0
  402. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  403. sage/matrix/echelon_matrix.pyx +155 -0
  404. sage/matrix/matrix.pxd +2 -0
  405. sage/matrix/matrix0.cpython-314-aarch64-linux-gnu.so +0 -0
  406. sage/matrix/matrix0.pxd +68 -0
  407. sage/matrix/matrix0.pyx +6324 -0
  408. sage/matrix/matrix1.cpython-314-aarch64-linux-gnu.so +0 -0
  409. sage/matrix/matrix1.pxd +8 -0
  410. sage/matrix/matrix1.pyx +2851 -0
  411. sage/matrix/matrix2.cpython-314-aarch64-linux-gnu.so +0 -0
  412. sage/matrix/matrix2.pxd +25 -0
  413. sage/matrix/matrix2.pyx +20181 -0
  414. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-gnu.so +0 -0
  415. sage/matrix/matrix_cdv.pxd +4 -0
  416. sage/matrix/matrix_cdv.pyx +93 -0
  417. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  418. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  419. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  420. sage/matrix/matrix_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  421. sage/matrix/matrix_dense.pxd +5 -0
  422. sage/matrix/matrix_dense.pyx +343 -0
  423. sage/matrix/matrix_domain_dense.pxd +5 -0
  424. sage/matrix/matrix_domain_sparse.pxd +5 -0
  425. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  426. sage/matrix/matrix_double_dense.pxd +7 -0
  427. sage/matrix/matrix_double_dense.pyx +3906 -0
  428. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  429. sage/matrix/matrix_double_sparse.pxd +6 -0
  430. sage/matrix/matrix_double_sparse.pyx +248 -0
  431. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  432. sage/matrix/matrix_generic_dense.pxd +7 -0
  433. sage/matrix/matrix_generic_dense.pyx +354 -0
  434. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  435. sage/matrix/matrix_generic_sparse.pxd +7 -0
  436. sage/matrix/matrix_generic_sparse.pyx +461 -0
  437. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  440. sage/matrix/matrix_misc.py +313 -0
  441. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  442. sage/matrix/matrix_numpy_dense.pxd +14 -0
  443. sage/matrix/matrix_numpy_dense.pyx +450 -0
  444. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  445. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  446. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  447. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  448. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  449. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  450. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  451. sage/matrix/matrix_real_double_dense.pxd +7 -0
  452. sage/matrix/matrix_real_double_dense.pyx +122 -0
  453. sage/matrix/matrix_space.py +2848 -0
  454. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  455. sage/matrix/matrix_sparse.pxd +5 -0
  456. sage/matrix/matrix_sparse.pyx +1222 -0
  457. sage/matrix/matrix_window.cpython-314-aarch64-linux-gnu.so +0 -0
  458. sage/matrix/matrix_window.pxd +37 -0
  459. sage/matrix/matrix_window.pyx +242 -0
  460. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  461. sage/matrix/misc_mpfr.pyx +80 -0
  462. sage/matrix/operation_table.py +1182 -0
  463. sage/matrix/special.py +3666 -0
  464. sage/matrix/strassen.cpython-314-aarch64-linux-gnu.so +0 -0
  465. sage/matrix/strassen.pyx +851 -0
  466. sage/matrix/symplectic_basis.py +541 -0
  467. sage/matrix/template.pxd +6 -0
  468. sage/matrix/tests.py +71 -0
  469. sage/matroids/advanced.py +77 -0
  470. sage/matroids/all.py +13 -0
  471. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  472. sage/matroids/basis_exchange_matroid.pxd +96 -0
  473. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  474. sage/matroids/basis_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  475. sage/matroids/basis_matroid.pxd +45 -0
  476. sage/matroids/basis_matroid.pyx +1217 -0
  477. sage/matroids/catalog.py +44 -0
  478. sage/matroids/chow_ring.py +473 -0
  479. sage/matroids/chow_ring_ideal.py +849 -0
  480. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  481. sage/matroids/circuit_closures_matroid.pxd +16 -0
  482. sage/matroids/circuit_closures_matroid.pyx +559 -0
  483. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  484. sage/matroids/circuits_matroid.pxd +38 -0
  485. sage/matroids/circuits_matroid.pyx +947 -0
  486. sage/matroids/constructor.py +1086 -0
  487. sage/matroids/database_collections.py +365 -0
  488. sage/matroids/database_matroids.py +5338 -0
  489. sage/matroids/dual_matroid.py +583 -0
  490. sage/matroids/extension.cpython-314-aarch64-linux-gnu.so +0 -0
  491. sage/matroids/extension.pxd +34 -0
  492. sage/matroids/extension.pyx +519 -0
  493. sage/matroids/flats_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  494. sage/matroids/flats_matroid.pxd +28 -0
  495. sage/matroids/flats_matroid.pyx +715 -0
  496. sage/matroids/gammoid.py +600 -0
  497. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  498. sage/matroids/graphic_matroid.pxd +39 -0
  499. sage/matroids/graphic_matroid.pyx +2024 -0
  500. sage/matroids/lean_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  501. sage/matroids/lean_matrix.pxd +126 -0
  502. sage/matroids/lean_matrix.pyx +3667 -0
  503. sage/matroids/linear_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  504. sage/matroids/linear_matroid.pxd +180 -0
  505. sage/matroids/linear_matroid.pyx +6649 -0
  506. sage/matroids/matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  507. sage/matroids/matroid.pxd +243 -0
  508. sage/matroids/matroid.pyx +8759 -0
  509. sage/matroids/matroids_catalog.py +190 -0
  510. sage/matroids/matroids_plot_helpers.py +890 -0
  511. sage/matroids/minor_matroid.py +480 -0
  512. sage/matroids/minorfix.h +9 -0
  513. sage/matroids/named_matroids.py +5 -0
  514. sage/matroids/rank_matroid.py +268 -0
  515. sage/matroids/set_system.cpython-314-aarch64-linux-gnu.so +0 -0
  516. sage/matroids/set_system.pxd +38 -0
  517. sage/matroids/set_system.pyx +800 -0
  518. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  519. sage/matroids/transversal_matroid.pxd +14 -0
  520. sage/matroids/transversal_matroid.pyx +893 -0
  521. sage/matroids/union_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  522. sage/matroids/union_matroid.pxd +20 -0
  523. sage/matroids/union_matroid.pyx +331 -0
  524. sage/matroids/unpickling.cpython-314-aarch64-linux-gnu.so +0 -0
  525. sage/matroids/unpickling.pyx +843 -0
  526. sage/matroids/utilities.py +809 -0
  527. sage/misc/all__sagemath_modules.py +20 -0
  528. sage/misc/c3.cpython-314-aarch64-linux-gnu.so +0 -0
  529. sage/misc/c3.pyx +238 -0
  530. sage/misc/compat.py +87 -0
  531. sage/misc/element_with_label.py +173 -0
  532. sage/misc/func_persist.py +79 -0
  533. sage/misc/pickle_old.cpython-314-aarch64-linux-gnu.so +0 -0
  534. sage/misc/pickle_old.pyx +19 -0
  535. sage/misc/proof.py +7 -0
  536. sage/misc/replace_dot_all.py +472 -0
  537. sage/misc/sagedoc_conf.py +168 -0
  538. sage/misc/sphinxify.py +167 -0
  539. sage/misc/test_class_pickling.py +85 -0
  540. sage/modules/all.py +42 -0
  541. sage/modules/complex_double_vector.py +25 -0
  542. sage/modules/diamond_cutting.py +380 -0
  543. sage/modules/fg_pid/all.py +1 -0
  544. sage/modules/fg_pid/fgp_element.py +456 -0
  545. sage/modules/fg_pid/fgp_module.py +2091 -0
  546. sage/modules/fg_pid/fgp_morphism.py +550 -0
  547. sage/modules/filtered_vector_space.py +1271 -0
  548. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-gnu.so +0 -0
  549. sage/modules/finite_submodule_iter.pxd +27 -0
  550. sage/modules/finite_submodule_iter.pyx +452 -0
  551. sage/modules/fp_graded/all.py +1 -0
  552. sage/modules/fp_graded/element.py +346 -0
  553. sage/modules/fp_graded/free_element.py +298 -0
  554. sage/modules/fp_graded/free_homspace.py +53 -0
  555. sage/modules/fp_graded/free_module.py +1060 -0
  556. sage/modules/fp_graded/free_morphism.py +217 -0
  557. sage/modules/fp_graded/homspace.py +563 -0
  558. sage/modules/fp_graded/module.py +1340 -0
  559. sage/modules/fp_graded/morphism.py +1990 -0
  560. sage/modules/fp_graded/steenrod/all.py +1 -0
  561. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  562. sage/modules/fp_graded/steenrod/module.py +477 -0
  563. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  564. sage/modules/fp_graded/steenrod/profile.py +241 -0
  565. sage/modules/free_module.py +8447 -0
  566. sage/modules/free_module_element.cpython-314-aarch64-linux-gnu.so +0 -0
  567. sage/modules/free_module_element.pxd +22 -0
  568. sage/modules/free_module_element.pyx +5445 -0
  569. sage/modules/free_module_homspace.py +369 -0
  570. sage/modules/free_module_integer.py +896 -0
  571. sage/modules/free_module_morphism.py +823 -0
  572. sage/modules/free_module_pseudohomspace.py +352 -0
  573. sage/modules/free_module_pseudomorphism.py +578 -0
  574. sage/modules/free_quadratic_module.py +1706 -0
  575. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  576. sage/modules/matrix_morphism.py +1745 -0
  577. sage/modules/misc.py +103 -0
  578. sage/modules/module_functors.py +192 -0
  579. sage/modules/multi_filtered_vector_space.py +719 -0
  580. sage/modules/ore_module.py +2208 -0
  581. sage/modules/ore_module_element.py +178 -0
  582. sage/modules/ore_module_homspace.py +147 -0
  583. sage/modules/ore_module_morphism.py +968 -0
  584. sage/modules/quotient_module.py +699 -0
  585. sage/modules/real_double_vector.py +22 -0
  586. sage/modules/submodule.py +255 -0
  587. sage/modules/tensor_operations.py +567 -0
  588. sage/modules/torsion_quadratic_module.py +1352 -0
  589. sage/modules/tutorial_free_modules.py +248 -0
  590. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  591. sage/modules/vector_complex_double_dense.pxd +6 -0
  592. sage/modules/vector_complex_double_dense.pyx +117 -0
  593. sage/modules/vector_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  594. sage/modules/vector_double_dense.pxd +6 -0
  595. sage/modules/vector_double_dense.pyx +604 -0
  596. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  597. sage/modules/vector_integer_dense.pxd +15 -0
  598. sage/modules/vector_integer_dense.pyx +361 -0
  599. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  600. sage/modules/vector_integer_sparse.pxd +29 -0
  601. sage/modules/vector_integer_sparse.pyx +406 -0
  602. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  603. sage/modules/vector_modn_dense.pxd +12 -0
  604. sage/modules/vector_modn_dense.pyx +394 -0
  605. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  606. sage/modules/vector_modn_sparse.pxd +21 -0
  607. sage/modules/vector_modn_sparse.pyx +298 -0
  608. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  609. sage/modules/vector_numpy_dense.pxd +15 -0
  610. sage/modules/vector_numpy_dense.pyx +304 -0
  611. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  612. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  613. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  614. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  615. sage/modules/vector_rational_dense.pxd +15 -0
  616. sage/modules/vector_rational_dense.pyx +387 -0
  617. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  618. sage/modules/vector_rational_sparse.pxd +30 -0
  619. sage/modules/vector_rational_sparse.pyx +413 -0
  620. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  621. sage/modules/vector_real_double_dense.pxd +6 -0
  622. sage/modules/vector_real_double_dense.pyx +126 -0
  623. sage/modules/vector_space_homspace.py +430 -0
  624. sage/modules/vector_space_morphism.py +989 -0
  625. sage/modules/with_basis/all.py +15 -0
  626. sage/modules/with_basis/cell_module.py +494 -0
  627. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-gnu.so +0 -0
  628. sage/modules/with_basis/indexed_element.pxd +13 -0
  629. sage/modules/with_basis/indexed_element.pyx +1058 -0
  630. sage/modules/with_basis/invariant.py +1075 -0
  631. sage/modules/with_basis/morphism.py +1636 -0
  632. sage/modules/with_basis/representation.py +2939 -0
  633. sage/modules/with_basis/subquotient.py +685 -0
  634. sage/numerical/all__sagemath_modules.py +6 -0
  635. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-gnu.so +0 -0
  636. sage/numerical/gauss_legendre.pyx +381 -0
  637. sage/numerical/optimize.py +910 -0
  638. sage/probability/all.py +10 -0
  639. sage/probability/probability_distribution.cpython-314-aarch64-linux-gnu.so +0 -0
  640. sage/probability/probability_distribution.pyx +1242 -0
  641. sage/probability/random_variable.py +411 -0
  642. sage/quadratic_forms/all.py +4 -0
  643. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  644. sage/quadratic_forms/binary_qf.py +2042 -0
  645. sage/quadratic_forms/bqf_class_group.py +748 -0
  646. sage/quadratic_forms/constructions.py +93 -0
  647. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-gnu.so +0 -0
  648. sage/quadratic_forms/count_local_2.pyx +365 -0
  649. sage/quadratic_forms/extras.py +195 -0
  650. sage/quadratic_forms/quadratic_form.py +1753 -0
  651. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  652. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  653. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-gnu.so +0 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  655. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  656. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  657. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  658. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  659. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  660. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  661. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  662. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  663. sage/quadratic_forms/random_quadraticform.py +209 -0
  664. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-gnu.so +0 -0
  665. sage/quadratic_forms/ternary.pyx +1154 -0
  666. sage/quadratic_forms/ternary_qf.py +2027 -0
  667. sage/rings/all__sagemath_modules.py +28 -0
  668. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  669. sage/rings/asymptotic/misc.py +1252 -0
  670. sage/rings/cc.py +4 -0
  671. sage/rings/cfinite_sequence.py +1306 -0
  672. sage/rings/complex_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  673. sage/rings/complex_conversion.pxd +8 -0
  674. sage/rings/complex_conversion.pyx +23 -0
  675. sage/rings/complex_double.cpython-314-aarch64-linux-gnu.so +0 -0
  676. sage/rings/complex_double.pxd +21 -0
  677. sage/rings/complex_double.pyx +2654 -0
  678. sage/rings/complex_mpc.cpython-314-aarch64-linux-gnu.so +0 -0
  679. sage/rings/complex_mpc.pxd +21 -0
  680. sage/rings/complex_mpc.pyx +2576 -0
  681. sage/rings/complex_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  682. sage/rings/complex_mpfr.pxd +18 -0
  683. sage/rings/complex_mpfr.pyx +3602 -0
  684. sage/rings/derivation.py +2334 -0
  685. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  686. sage/rings/finite_rings/maps_finite_field.py +191 -0
  687. sage/rings/function_field/all__sagemath_modules.py +8 -0
  688. sage/rings/function_field/derivations.py +102 -0
  689. sage/rings/function_field/derivations_rational.py +132 -0
  690. sage/rings/function_field/differential.py +853 -0
  691. sage/rings/function_field/divisor.py +1107 -0
  692. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  693. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  694. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  695. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  696. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  697. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  698. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  699. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  700. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  701. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-gnu.so +0 -0
  702. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  703. sage/rings/invariants/all.py +4 -0
  704. sage/rings/invariants/invariant_theory.py +4597 -0
  705. sage/rings/invariants/reconstruction.py +395 -0
  706. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  707. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  708. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-gnu.so +0 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  711. sage/rings/polynomial/ore_function_element.py +952 -0
  712. sage/rings/polynomial/ore_function_field.py +1028 -0
  713. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  714. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  715. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  716. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  717. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  719. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  720. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  721. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  722. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  723. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-gnu.so +0 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  726. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-gnu.so +0 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  729. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  730. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-gnu.so +0 -0
  731. sage/rings/real_double_element_gsl.pxd +8 -0
  732. sage/rings/real_double_element_gsl.pyx +794 -0
  733. sage/rings/real_field.py +58 -0
  734. sage/rings/real_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  735. sage/rings/real_mpfr.pxd +29 -0
  736. sage/rings/real_mpfr.pyx +6122 -0
  737. sage/rings/ring_extension.cpython-314-aarch64-linux-gnu.so +0 -0
  738. sage/rings/ring_extension.pxd +42 -0
  739. sage/rings/ring_extension.pyx +2779 -0
  740. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  741. sage/rings/ring_extension_conversion.pxd +16 -0
  742. sage/rings/ring_extension_conversion.pyx +462 -0
  743. sage/rings/ring_extension_element.cpython-314-aarch64-linux-gnu.so +0 -0
  744. sage/rings/ring_extension_element.pxd +21 -0
  745. sage/rings/ring_extension_element.pyx +1635 -0
  746. sage/rings/ring_extension_homset.py +64 -0
  747. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-gnu.so +0 -0
  748. sage/rings/ring_extension_morphism.pxd +35 -0
  749. sage/rings/ring_extension_morphism.pyx +920 -0
  750. sage/schemes/all__sagemath_modules.py +1 -0
  751. sage/schemes/projective/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/coherent_sheaf.py +300 -0
  753. sage/schemes/projective/cohomology.py +510 -0
  754. sage/stats/all.py +15 -0
  755. sage/stats/basic_stats.py +489 -0
  756. sage/stats/distributions/all.py +7 -0
  757. sage/stats/distributions/catalog.py +34 -0
  758. sage/stats/distributions/dgs.h +50 -0
  759. sage/stats/distributions/dgs.pxd +111 -0
  760. sage/stats/distributions/dgs_bern.h +400 -0
  761. sage/stats/distributions/dgs_gauss.h +614 -0
  762. sage/stats/distributions/dgs_misc.h +104 -0
  763. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-gnu.so +0 -0
  764. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  766. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  767. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  768. sage/stats/hmm/all.py +15 -0
  769. sage/stats/hmm/chmm.cpython-314-aarch64-linux-gnu.so +0 -0
  770. sage/stats/hmm/chmm.pyx +1595 -0
  771. sage/stats/hmm/distributions.cpython-314-aarch64-linux-gnu.so +0 -0
  772. sage/stats/hmm/distributions.pxd +29 -0
  773. sage/stats/hmm/distributions.pyx +531 -0
  774. sage/stats/hmm/hmm.cpython-314-aarch64-linux-gnu.so +0 -0
  775. sage/stats/hmm/hmm.pxd +17 -0
  776. sage/stats/hmm/hmm.pyx +1388 -0
  777. sage/stats/hmm/util.cpython-314-aarch64-linux-gnu.so +0 -0
  778. sage/stats/hmm/util.pxd +7 -0
  779. sage/stats/hmm/util.pyx +165 -0
  780. sage/stats/intlist.cpython-314-aarch64-linux-gnu.so +0 -0
  781. sage/stats/intlist.pxd +14 -0
  782. sage/stats/intlist.pyx +588 -0
  783. sage/stats/r.py +49 -0
  784. sage/stats/time_series.cpython-314-aarch64-linux-gnu.so +0 -0
  785. sage/stats/time_series.pxd +6 -0
  786. sage/stats/time_series.pyx +2546 -0
  787. sage/tensor/all.py +2 -0
  788. sage/tensor/modules/all.py +8 -0
  789. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  790. sage/tensor/modules/comp.py +5598 -0
  791. sage/tensor/modules/ext_pow_free_module.py +824 -0
  792. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  793. sage/tensor/modules/format_utilities.py +333 -0
  794. sage/tensor/modules/free_module_alt_form.py +858 -0
  795. sage/tensor/modules/free_module_automorphism.py +1207 -0
  796. sage/tensor/modules/free_module_basis.py +1074 -0
  797. sage/tensor/modules/free_module_element.py +284 -0
  798. sage/tensor/modules/free_module_homset.py +652 -0
  799. sage/tensor/modules/free_module_linear_group.py +564 -0
  800. sage/tensor/modules/free_module_morphism.py +1581 -0
  801. sage/tensor/modules/free_module_tensor.py +3289 -0
  802. sage/tensor/modules/reflexive_module.py +386 -0
  803. sage/tensor/modules/tensor_free_module.py +780 -0
  804. sage/tensor/modules/tensor_free_submodule.py +538 -0
  805. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  806. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1065 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.modules sage.rings.finite_rings
3
+ r"""
4
+ DES
5
+
6
+ The Data Encryption Standard.
7
+
8
+ This file implements the Data Encryption Standard and the corresponding key
9
+ schedule as described in [U.S1999]_.
10
+
11
+ This implementation is meant for experimental and educational usage only,
12
+ do not use it in production code!
13
+
14
+ EXAMPLES:
15
+
16
+ Encrypt a message::
17
+
18
+ sage: from sage.crypto.block_cipher.des import DES
19
+ sage: des = DES()
20
+ sage: P = 0x01A1D6D039776742
21
+ sage: K = 0x7CA110454A1A6E57
22
+ sage: C = des.encrypt(plaintext=P, key=K); C.hex()
23
+ '690f5b0d9a26939b'
24
+
25
+ And decrypt it again::
26
+
27
+ sage: des.decrypt(ciphertext=C, key=K).hex()
28
+ '1a1d6d039776742'
29
+
30
+ Have a look at the used round keys::
31
+
32
+ sage: from sage.crypto.block_cipher.des import DES_KS
33
+ sage: ks = DES_KS()
34
+ sage: [k.hex() for k in ks(0x1F08260D1AC2465E)]
35
+ ['103049bfb90e',
36
+ '808d40f07bf',
37
+ ...
38
+ '231000f2dd97']
39
+
40
+ Validate the Sample Round Outputs for DES (cf. [KeSm1998]_ p. 124)::
41
+
42
+ sage: from sage.crypto.block_cipher.des import DES
43
+ sage: P = 0
44
+ sage: K = 0x10316E028C8F3B4A
45
+ sage: for r in range(1, 17):
46
+ ....: DES(rounds=r, doFinalRound=False).encrypt(P, K).hex()
47
+ '47092b5b'
48
+ '47092b5b53f372af'
49
+ '53f372af9f1d158b'
50
+ ...
51
+ '3f6c3efd5a1e5228'
52
+ sage: DES().encrypt(P, K).hex()
53
+ '82dcbafbdeab6602'
54
+
55
+ Change cipher internals::
56
+
57
+ sage: from sage.crypto.sbox import SBox
58
+ sage: cipher = DES(rounds=1, doFinalRound=False)
59
+ sage: cipher.sboxes = [[SBox(range(16))]*4]*8
60
+ sage: cipher.keySchedule = lambda x: [0] # return the 0 key as round key
61
+ sage: cipher.encrypt(plaintext=0x1234, key=0x0).hex()
62
+ '80004000d08100'
63
+
64
+ AUTHORS:
65
+
66
+ - Lukas Stennes (2019-03-29): initial version
67
+ """
68
+
69
+ # ****************************************************************************
70
+ # Copyright (C) 2013 Lukas Stennes <lukas.stennes@rub.de>
71
+ #
72
+ # This program is free software: you can redistribute it and/or modify
73
+ # it under the terms of the GNU General Public License as published by
74
+ # the Free Software Foundation, either version 2 of the License, or
75
+ # (at your option) any later version.
76
+ # https://www.gnu.org/licenses/
77
+ # ****************************************************************************
78
+ from sage.structure.sage_object import SageObject
79
+ from sage.rings.integer_ring import ZZ
80
+ from sage.modules.free_module_element import vector
81
+ from sage.rings.finite_rings.finite_field_constructor import GF
82
+ from sage.structure.element import Vector
83
+ from sage.rings.integer import Integer
84
+ from sage.crypto.sboxes import DES_S1_1, DES_S1_2, DES_S1_3, DES_S1_4
85
+ from sage.crypto.sboxes import DES_S2_1, DES_S2_2, DES_S2_3, DES_S2_4
86
+ from sage.crypto.sboxes import DES_S3_1, DES_S3_2, DES_S3_3, DES_S3_4
87
+ from sage.crypto.sboxes import DES_S4_1, DES_S4_2, DES_S4_3, DES_S4_4
88
+ from sage.crypto.sboxes import DES_S5_1, DES_S5_2, DES_S5_3, DES_S5_4
89
+ from sage.crypto.sboxes import DES_S6_1, DES_S6_2, DES_S6_3, DES_S6_4
90
+ from sage.crypto.sboxes import DES_S7_1, DES_S7_2, DES_S7_3, DES_S7_4
91
+ from sage.crypto.sboxes import DES_S8_1, DES_S8_2, DES_S8_3, DES_S8_4
92
+ from itertools import chain
93
+
94
+
95
+ sboxes = [[DES_S1_1, DES_S1_2, DES_S1_3, DES_S1_4],
96
+ [DES_S2_1, DES_S2_2, DES_S2_3, DES_S2_4],
97
+ [DES_S3_1, DES_S3_2, DES_S3_3, DES_S3_4],
98
+ [DES_S4_1, DES_S4_2, DES_S4_3, DES_S4_4],
99
+ [DES_S5_1, DES_S5_2, DES_S5_3, DES_S5_4],
100
+ [DES_S6_1, DES_S6_2, DES_S6_3, DES_S6_4],
101
+ [DES_S7_1, DES_S7_2, DES_S7_3, DES_S7_4],
102
+ [DES_S8_1, DES_S8_2, DES_S8_3, DES_S8_4]]
103
+
104
+
105
+ class DES(SageObject):
106
+ r"""
107
+ This class implements DES described in [U.S1999]_.
108
+
109
+ EXAMPLES:
110
+
111
+ You can invoke DES encryption/decryption either by calling DES with an
112
+ appropriate flag::
113
+
114
+ sage: from sage.crypto.block_cipher.des import DES
115
+ sage: des = DES()
116
+ sage: P = 0x8000000000000000
117
+ sage: K = 0x0
118
+ sage: C = des(P, K, 'encrypt'); C.hex()
119
+ '95f8a5e5dd31d900'
120
+ sage: des(C, K, 'decrypt').hex()
121
+ '8000000000000000'
122
+
123
+ Or by calling encryption/decryption methods directly::
124
+
125
+ sage: C = des.encrypt(P, K)
126
+ sage: P == des.decrypt(C, K)
127
+ True
128
+
129
+ The number of rounds can be reduced easily::
130
+
131
+ sage: des = DES(rounds=15)
132
+ sage: des(des(P, K, 'encrypt'), K, 'decrypt') == P
133
+ True
134
+
135
+ You can use hex (i.e. integers) or a list-like bit representation for the
136
+ inputs. If the input is an integer the output will be too. If it is
137
+ list-like the output will be a bit vector::
138
+
139
+ sage: des = DES()
140
+ sage: P = vector(GF(2), 64, [1] + [0]*63)
141
+ sage: K = vector(GF(2), 64, [0,0,0,0,0,0,0,1]*8)
142
+ sage: des.encrypt(P, K)
143
+ (1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0,
144
+ 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0,
145
+ 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0)
146
+ sage: P = 0x8000000000000000
147
+ sage: K = 0x0101010101010101
148
+ sage: C = des.encrypt(P, K); C; C.hex()
149
+ 10806569712552630528
150
+ '95f8a5e5dd31d900'
151
+
152
+ .. SEEALSO::
153
+
154
+ :class:`DES_KS`
155
+ :mod:`sage.crypto.sboxes`
156
+
157
+ TESTS:
158
+
159
+ Test test vectors from [KeSm1998]_ pp. 125-136::
160
+
161
+ sage: from sage.crypto.block_cipher.des import DES
162
+ sage: test = \
163
+ ....: [[0x0101010101010101, 0x8000000000000000, 0x95F8A5E5DD31D900],
164
+ ....: [0x0101010101010101, 0x4000000000000000, 0xDD7F121CA5015619],
165
+ ....: [0x0101010101010101, 0x2000000000000000, 0x2E8653104F3834EA],
166
+ ....: [0x0101010101010101, 0x1000000000000000, 0x4BD388FF6CD81D4F],
167
+ ....: [0x0101010101010101, 0x0800000000000000, 0x20B9E767B2FB1456],
168
+ ....: [0x0101010101010101, 0x0400000000000000, 0x55579380D77138EF],
169
+ ....: [0x0101010101010101, 0x0200000000000000, 0x6CC5DEFAAF04512F],
170
+ ....: [0x0101010101010101, 0x0100000000000000, 0x0D9F279BA5D87260],
171
+ ....: [0x0101010101010101, 0x0080000000000000, 0xD9031B0271BD5A0A],
172
+ ....: [0x0101010101010101, 0x0040000000000000, 0x424250B37C3DD951],
173
+ ....: [0x0101010101010101, 0x0020000000000000, 0xB8061B7ECD9A21E5],
174
+ ....: [0x0101010101010101, 0x0010000000000000, 0xF15D0F286B65BD28],
175
+ ....: [0x0101010101010101, 0x0008000000000000, 0xADD0CC8D6E5DEBA1],
176
+ ....: [0x0101010101010101, 0x0004000000000000, 0xE6D5F82752AD63D1],
177
+ ....: [0x0101010101010101, 0x0002000000000000, 0xECBFE3BD3F591A5E],
178
+ ....: [0x0101010101010101, 0x0001000000000000, 0xF356834379D165CD],
179
+ ....: [0x0101010101010101, 0x0000800000000000, 0x2B9F982F20037FA9],
180
+ ....: [0x0101010101010101, 0x0000400000000000, 0x889DE068A16F0BE6],
181
+ ....: [0x0101010101010101, 0x0000200000000000, 0xE19E275D846A1298],
182
+ ....: [0x0101010101010101, 0x0000100000000000, 0x329A8ED523D71AEC],
183
+ ....: [0x0101010101010101, 0x0000080000000000, 0xE7FCE22557D23C97],
184
+ ....: [0x0101010101010101, 0x0000040000000000, 0x12A9F5817FF2D65D],
185
+ ....: [0x0101010101010101, 0x0000020000000000, 0xA484C3AD38DC9C19],
186
+ ....: [0x0101010101010101, 0x0000010000000000, 0xFBE00A8A1EF8AD72],
187
+ ....: [0x0101010101010101, 0x0000008000000000, 0x750D079407521363],
188
+ ....: [0x0101010101010101, 0x0000004000000000, 0x64FEED9C724C2FAF],
189
+ ....: [0x0101010101010101, 0x0000002000000000, 0xF02B263B328E2B60],
190
+ ....: [0x0101010101010101, 0x0000001000000000, 0x9D64555A9A10B852],
191
+ ....: [0x0101010101010101, 0x0000000800000000, 0xD106FF0BED5255D7],
192
+ ....: [0x0101010101010101, 0x0000000400000000, 0xE1652C6B138C64A5],
193
+ ....: [0x0101010101010101, 0x0000000200000000, 0xE428581186EC8F46],
194
+ ....: [0x0101010101010101, 0x0000000100000000, 0xAEB5F5EDE22D1A36],
195
+ ....: [0x0101010101010101, 0x0000000080000000, 0xE943D7568AEC0C5C],
196
+ ....: [0x0101010101010101, 0x0000000040000000, 0xDF98C8276F54B04B],
197
+ ....: [0x0101010101010101, 0x0000000020000000, 0xB160E4680F6C696F],
198
+ ....: [0x0101010101010101, 0x0000000010000000, 0xFA0752B07D9C4AB8],
199
+ ....: [0x0101010101010101, 0x0000000008000000, 0xCA3A2B036DBC8502],
200
+ ....: [0x0101010101010101, 0x0000000004000000, 0x5E0905517BB59BCF],
201
+ ....: [0x0101010101010101, 0x0000000002000000, 0x814EEB3B91D90726],
202
+ ....: [0x0101010101010101, 0x0000000001000000, 0x4D49DB1532919C9F],
203
+ ....: [0x0101010101010101, 0x0000000000800000, 0x25EB5FC3F8CF0621],
204
+ ....: [0x0101010101010101, 0x0000000000400000, 0xAB6A20C0620D1C6F],
205
+ ....: [0x0101010101010101, 0x0000000000200000, 0x79E90DBC98F92CCA],
206
+ ....: [0x0101010101010101, 0x0000000000100000, 0x866ECEDD8072BB0E],
207
+ ....: [0x0101010101010101, 0x0000000000080000, 0x8B54536F2F3E64A8],
208
+ ....: [0x0101010101010101, 0x0000000000040000, 0xEA51D3975595B86B],
209
+ ....: [0x0101010101010101, 0x0000000000020000, 0xCAFFC6AC4542DE31],
210
+ ....: [0x0101010101010101, 0x0000000000010000, 0x8DD45A2DDF90796C],
211
+ ....: [0x0101010101010101, 0x0000000000008000, 0x1029D55E880EC2D0],
212
+ ....: [0x0101010101010101, 0x0000000000004000, 0x5D86CB23639DBEA9],
213
+ ....: [0x0101010101010101, 0x0000000000002000, 0x1D1CA853AE7C0C5F],
214
+ ....: [0x0101010101010101, 0x0000000000001000, 0xCE332329248F3228],
215
+ ....: [0x0101010101010101, 0x0000000000000800, 0x8405D1ABE24FB942],
216
+ ....: [0x0101010101010101, 0x0000000000000400, 0xE643D78090CA4207],
217
+ ....: [0x0101010101010101, 0x0000000000000200, 0x48221B9937748A23],
218
+ ....: [0x0101010101010101, 0x0000000000000100, 0xDD7C0BBD61FAFD54],
219
+ ....: [0x0101010101010101, 0x0000000000000080, 0x2FBC291A570DB5C4],
220
+ ....: [0x0101010101010101, 0x0000000000000040, 0xE07C30D7E4E26E12],
221
+ ....: [0x0101010101010101, 0x0000000000000020, 0x0953E2258E8E90A1],
222
+ ....: [0x0101010101010101, 0x0000000000000010, 0x5B711BC4CEEBF2EE],
223
+ ....: [0x0101010101010101, 0x0000000000000008, 0xCC083F1E6D9E85F6],
224
+ ....: [0x0101010101010101, 0x0000000000000004, 0xD2FD8867D50D2DFE],
225
+ ....: [0x0101010101010101, 0x0000000000000002, 0x06E7EA22CE92708F],
226
+ ....: [0x0101010101010101, 0x0000000000000001, 0x166B40B44ABA4BD6],
227
+ ....: [0x8001010101010101, 0x0000000000000000, 0x95A8D72813DAA94D],
228
+ ....: [0x4001010101010101, 0x0000000000000000, 0x0EEC1487DD8C26D5],
229
+ ....: [0x2001010101010101, 0x0000000000000000, 0x7AD16FFB79C45926],
230
+ ....: [0x1001010101010101, 0x0000000000000000, 0xD3746294CA6A6CF3],
231
+ ....: [0x0801010101010101, 0x0000000000000000, 0x809F5F873C1FD761],
232
+ ....: [0x0401010101010101, 0x0000000000000000, 0xC02FAFFEC989D1FC],
233
+ ....: [0x0201010101010101, 0x0000000000000000, 0x4615AA1D33E72F10],
234
+ ....: [0x0180010101010101, 0x0000000000000000, 0x2055123350C00858],
235
+ ....: [0x0140010101010101, 0x0000000000000000, 0xDF3B99D6577397C8],
236
+ ....: [0x0120010101010101, 0x0000000000000000, 0x31FE17369B5288C9],
237
+ ....: [0x0110010101010101, 0x0000000000000000, 0xDFDD3CC64DAE1642],
238
+ ....: [0x0108010101010101, 0x0000000000000000, 0x178C83CE2B399D94],
239
+ ....: [0x0104010101010101, 0x0000000000000000, 0x50F636324A9B7F80],
240
+ ....: [0x0102010101010101, 0x0000000000000000, 0xA8468EE3BC18F06D],
241
+ ....: [0x0101800101010101, 0x0000000000000000, 0xA2DC9E92FD3CDE92],
242
+ ....: [0x0101400101010101, 0x0000000000000000, 0xCAC09F797D031287],
243
+ ....: [0x0101200101010101, 0x0000000000000000, 0x90BA680B22AEB525],
244
+ ....: [0x0101100101010101, 0x0000000000000000, 0xCE7A24F350E280B6],
245
+ ....: [0x0101080101010101, 0x0000000000000000, 0x882BFF0AA01A0B87],
246
+ ....: [0x0101040101010101, 0x0000000000000000, 0x25610288924511C2],
247
+ ....: [0x0101020101010101, 0x0000000000000000, 0xC71516C29C75D170],
248
+ ....: [0x0101018001010101, 0x0000000000000000, 0x5199C29A52C9F059],
249
+ ....: [0x0101014001010101, 0x0000000000000000, 0xC22F0A294A71F29F],
250
+ ....: [0x0101012001010101, 0x0000000000000000, 0xEE371483714C02EA],
251
+ ....: [0x0101011001010101, 0x0000000000000000, 0xA81FBD448F9E522F],
252
+ ....: [0x0101010801010101, 0x0000000000000000, 0x4F644C92E192DFED],
253
+ ....: [0x0101010401010101, 0x0000000000000000, 0x1AFA9A66A6DF92AE],
254
+ ....: [0x0101010201010101, 0x0000000000000000, 0xB3C1CC715CB879D8],
255
+ ....: [0x0101010180010101, 0x0000000000000000, 0x19D032E64AB0BD8B],
256
+ ....: [0x0101010140010101, 0x0000000000000000, 0x3CFAA7A7DC8720DC],
257
+ ....: [0x0101010120010101, 0x0000000000000000, 0xB7265F7F447AC6F3],
258
+ ....: [0x0101010110010101, 0x0000000000000000, 0x9DB73B3C0D163F54],
259
+ ....: [0x0101010108010101, 0x0000000000000000, 0x8181B65BABF4A975],
260
+ ....: [0x0101010104010101, 0x0000000000000000, 0x93C9B64042EAA240],
261
+ ....: [0x0101010102010101, 0x0000000000000000, 0x5570530829705592],
262
+ ....: [0x0101010101800101, 0x0000000000000000, 0x8638809E878787A0],
263
+ ....: [0x0101010101400101, 0x0000000000000000, 0x41B9A79AF79AC208],
264
+ ....: [0x0101010101200101, 0x0000000000000000, 0x7A9BE42F2009A892],
265
+ ....: [0x0101010101100101, 0x0000000000000000, 0x29038D56BA6D2745],
266
+ ....: [0x0101010101080101, 0x0000000000000000, 0x5495C6ABF1E5DF51],
267
+ ....: [0x0101010101040101, 0x0000000000000000, 0xAE13DBD561488933],
268
+ ....: [0x0101010101020101, 0x0000000000000000, 0x024D1FFA8904E389],
269
+ ....: [0x0101010101018001, 0x0000000000000000, 0xD1399712F99BF02E],
270
+ ....: [0x0101010101014001, 0x0000000000000000, 0x14C1D7C1CFFEC79E],
271
+ ....: [0x0101010101012001, 0x0000000000000000, 0x1DE5279DAE3BED6F],
272
+ ....: [0x0101010101011001, 0x0000000000000000, 0xE941A33F85501303],
273
+ ....: [0x0101010101010801, 0x0000000000000000, 0xDA99DBBC9A03F379],
274
+ ....: [0x0101010101010401, 0x0000000000000000, 0xB7FC92F91D8E92E9],
275
+ ....: [0x0101010101010201, 0x0000000000000000, 0xAE8E5CAA3CA04E85],
276
+ ....: [0x0101010101010180, 0x0000000000000000, 0x9CC62DF43B6EED74],
277
+ ....: [0x0101010101010140, 0x0000000000000000, 0xD863DBB5C59A91A0],
278
+ ....: [0x0101010101010120, 0x0000000000000000, 0xA1AB2190545B91D7],
279
+ ....: [0x0101010101010110, 0x0000000000000000, 0x0875041E64C570F7],
280
+ ....: [0x0101010101010108, 0x0000000000000000, 0x5A594528BEBEF1CC],
281
+ ....: [0x0101010101010104, 0x0000000000000000, 0xFCDB3291DE21F0C0],
282
+ ....: [0x0101010101010102, 0x0000000000000000, 0x869EFD7F9F265A09],
283
+ ....: [0x1046913489980131, 0x0000000000000000, 0x88D55E54F54C97B4],
284
+ ....: [0x1007103489988020, 0x0000000000000000, 0x0C0CC00C83EA48FD],
285
+ ....: [0x10071034C8980120, 0x0000000000000000, 0x83BC8EF3A6570183],
286
+ ....: [0x1046103489988020, 0x0000000000000000, 0xDF725DCAD94EA2E9],
287
+ ....: [0x1086911519190101, 0x0000000000000000, 0xE652B53B550BE8B0],
288
+ ....: [0x1086911519580101, 0x0000000000000000, 0xAF527120C485CBB0],
289
+ ....: [0x5107B01519580101, 0x0000000000000000, 0x0F04CE393DB926D5],
290
+ ....: [0x1007B01519190101, 0x0000000000000000, 0xC9F00FFC74079067],
291
+ ....: [0x3107915498080101, 0x0000000000000000, 0x7CFD82A593252B4E],
292
+ ....: [0x3107919498080101, 0x0000000000000000, 0xCB49A2F9E91363E3],
293
+ ....: [0x10079115B9080140, 0x0000000000000000, 0x00B588BE70D23F56],
294
+ ....: [0x3107911598090140, 0x0000000000000000, 0x406A9A6AB43399AE],
295
+ ....: [0x1007D01589980101, 0x0000000000000000, 0x6CB773611DCA9ADA],
296
+ ....: [0x9107911589980101, 0x0000000000000000, 0x67FD21C17DBB5D70],
297
+ ....: [0x9107D01589190101, 0x0000000000000000, 0x9592CB4110430787],
298
+ ....: [0x1007D01598980120, 0x0000000000000000, 0xA6B7FF68A318DDD3],
299
+ ....: [0x1007940498190101, 0x0000000000000000, 0x4D102196C914CA16],
300
+ ....: [0x0107910491190401, 0x0000000000000000, 0x2DFA9F4573594965],
301
+ ....: [0x0107910491190101, 0x0000000000000000, 0xB46604816C0E0774],
302
+ ....: [0x0107940491190401, 0x0000000000000000, 0x6E7E6221A4F34E87],
303
+ ....: [0x19079210981A0101, 0x0000000000000000, 0xAA85E74643233199],
304
+ ....: [0x1007911998190801, 0x0000000000000000, 0x2E5A19DB4D1962D6],
305
+ ....: [0x10079119981A0801, 0x0000000000000000, 0x23A866A809D30894],
306
+ ....: [0x1007921098190101, 0x0000000000000000, 0xD812D961F017D320],
307
+ ....: [0x100791159819010B, 0x0000000000000000, 0x055605816E58608F],
308
+ ....: [0x1004801598190101, 0x0000000000000000, 0xABD88E8B1B7716F1],
309
+ ....: [0x1004801598190102, 0x0000000000000000, 0x537AC95BE69DA1E1],
310
+ ....: [0x1004801598190108, 0x0000000000000000, 0xAED0F6AE3C25CDD8],
311
+ ....: [0x1002911598100104, 0x0000000000000000, 0xB3E35A5EE53E7B8D],
312
+ ....: [0x1002911598190104, 0x0000000000000000, 0x61C79C71921A2EF8],
313
+ ....: [0x1002911598100201, 0x0000000000000000, 0xE2F5728F0995013C],
314
+ ....: [0x1002911698100101, 0x0000000000000000, 0x1AEAC39A61F0A464],
315
+ ....: [0x7CA110454A1A6E57, 0x01A1D6D039776742, 0x690F5B0D9A26939B],
316
+ ....: [0x0131D9619DC1376E, 0x5CD54CA83DEF57DA, 0x7A389D10354BD271],
317
+ ....: [0x07A1133E4A0B2686, 0x0248D43806F67172, 0x868EBB51CAB4599A],
318
+ ....: [0x3849674C2602319E, 0x51454B582DDF440A, 0x7178876E01F19B2A],
319
+ ....: [0x04B915BA43FEB5B6, 0x42FD443059577FA2, 0xAF37FB421F8C4095],
320
+ ....: [0x0113B970FD34F2CE, 0x059B5E0851CF143A, 0x86A560F10EC6D85B],
321
+ ....: [0x0170F175468FB5E6, 0x0756D8E0774761D2, 0x0CD3DA020021DC09],
322
+ ....: [0x43297FAD38E373FE, 0x762514B829BF486A, 0xEA676B2CB7DB2B7A],
323
+ ....: [0x07A7137045DA2A16, 0x3BDD119049372802, 0xDFD64A815CAF1A0F],
324
+ ....: [0x04689104C2FD3B2F, 0x26955F6835AF609A, 0x5C513C9C4886C088],
325
+ ....: [0x37D06BB516CB7546, 0x164D5E404F275232, 0x0A2AEEAE3FF4AB77],
326
+ ....: [0x1F08260D1AC2465E, 0x6B056E18759F5CCA, 0xEF1BF03E5DFA575A],
327
+ ....: [0x584023641ABA6176, 0x004BD6EF09176062, 0x88BF0DB6D70DEE56],
328
+ ....: [0x025816164629B007, 0x480D39006EE762F2, 0xA1F9915541020B56],
329
+ ....: [0x49793EBC79B3258F, 0x437540C8698F3CFA, 0x6FBF1CAFCFFD0556],
330
+ ....: [0x4FB05E1515AB73A7, 0x072D43A077075292, 0x2F22E49BAB7CA1AC],
331
+ ....: [0x49E95D6D4CA229BF, 0x02FE55778117F12A, 0x5A6B612CC26CCE4A],
332
+ ....: [0x018310DC409B26D6, 0x1D9D5C5018F728C2, 0x5F4C038ED12B2E41],
333
+ ....: [0x1C587F1C13924FEF, 0x305532286D6F295A, 0x63FAC0D034D9F793]]
334
+ sage: des = DES()
335
+ sage: for K, P, C in test: # long time
336
+ ....: if des.encrypt(P, K) != C or des.decrypt(C, K) != P:
337
+ ....: print("DES tests failed for K=0x%s, P=0x%s, C=0x%s" %
338
+ ....: (K.hex(), P.hex(), C.hex()))
339
+
340
+ .. automethod:: __init__
341
+ .. automethod:: __call__
342
+ """
343
+
344
+ def __init__(self, rounds=None, keySchedule='DES_KS', keySize=64, doFinalRound=True):
345
+ r"""
346
+ Construct an instance of DES.
347
+
348
+ INPUT:
349
+
350
+ - ``rounds`` -- integer (default: ``None``); the number of rounds. If
351
+ ``None`` the number of rounds of the key schedule is used.
352
+
353
+ - ``keySchedule`` -- (default: ``'DES_KS'``) the key schedule that
354
+ will be used for encryption and decryption. If ``'DES_KS'`` the
355
+ default DES key schedule is used.
356
+
357
+ - ``keySize`` -- (default: ``64``) the key length in bits. Must be
358
+ ``56`` of ``64``. In the latter case the key contains 8 parity bits.
359
+
360
+ - ``doFinalRound`` -- boolean (default: ``True``); if ``False`` a swap
361
+ takes places but the inverse initial permutation is omitted (i.e. you
362
+ can get the state after ``rounds``). This only effects encryption.
363
+
364
+ EXAMPLES::
365
+
366
+ sage: from sage.crypto.block_cipher.des import DES
367
+ sage: DES() # indirect doctest
368
+ DES block cipher with 16 rounds and the following key schedule:
369
+ Original DES key schedule with 16 rounds
370
+
371
+ Reducing the number of rounds is simple. But increasing it is only
372
+ possible if the key schedule can produce enough round keys::
373
+
374
+ sage: DES(rounds=11) # indirect doctest
375
+ DES block cipher with 11 rounds and the following key schedule:
376
+ Original DES key schedule with 16 rounds
377
+ sage: DES(rounds=42) # indirect doctest
378
+ Traceback (most recent call last):
379
+ ...
380
+ ValueError: number of rounds must be less or equal to the number
381
+ of rounds of the key schedule
382
+
383
+ You can use arbitrary key schedules. Since it is the only one
384
+ implemented here the original key schedule is used for demonstration::
385
+
386
+ sage: from sage.crypto.block_cipher.des import DES_KS
387
+ sage: DES(keySchedule=DES_KS(11)) # indirect doctest
388
+ DES block cipher with 11 rounds and the following key schedule:
389
+ Original DES key schedule with 11 rounds
390
+ """
391
+ self.keySchedule = DES_KS() if keySchedule == 'DES_KS' else keySchedule
392
+ self._rounds = self.keySchedule._rounds if rounds is None else rounds
393
+ if self._rounds > self.keySchedule._rounds:
394
+ raise ValueError('number of rounds must be less or equal to the '
395
+ 'number of rounds of the key schedule')
396
+ self._keySize = keySize
397
+ if keySize not in (56, 64):
398
+ raise ValueError('key size must be 56 or 64')
399
+ self.sboxes = sboxes
400
+ self._doFinalRound = doFinalRound
401
+ self._blocksize = 64
402
+
403
+ def __call__(self, block, key, algorithm='encrypt'):
404
+ r"""
405
+ Apply DES encryption or decryption on ``block`` using ``key``. The flag
406
+ ``algorithm`` controls what action is to be performed on ``block``.
407
+
408
+ INPUT:
409
+
410
+ - ``block`` -- integer or bit list-like; the plaintext or ciphertext
411
+
412
+ - ``key`` -- integer or bit list-like; the key
413
+
414
+ - ``algorithm`` -- string (default: ``'encrypt'``); a flag to signify
415
+ whether encryption or decryption is to be applied to ``block``. The
416
+ encryption flag is ``'encrypt'`` and the decryption flag is
417
+ ``'decrypt'``
418
+
419
+ OUTPUT:
420
+
421
+ - The plaintext or ciphertext corresponding to ``block``, obtained
422
+ using ``key``. If ``block`` is an integer the output will be too. If
423
+ ``block`` is list-like the output will be a bit vector.
424
+
425
+ EXAMPLES::
426
+
427
+ sage: from sage.crypto.block_cipher.des import DES
428
+ sage: des = DES()
429
+ sage: P = 0x480D39006EE762F2
430
+ sage: K = 0x025816164629B007
431
+ sage: des(P, K, 'encrypt').hex()
432
+ 'a1f9915541020b56'
433
+ """
434
+ if algorithm == 'encrypt':
435
+ return self.encrypt(block, key)
436
+ elif algorithm == 'decrypt':
437
+ return self.decrypt(block, key)
438
+ else:
439
+ raise ValueError('Algorithm must be \'encrypt\' or \'decrypt\' and'
440
+ ' not \'%s\'' % algorithm)
441
+
442
+ def __eq__(self, other):
443
+ r"""
444
+ Compare ``self`` with ``other``.
445
+
446
+ DES objects are the same if all attributes are the same.
447
+
448
+ EXAMPLES::
449
+
450
+ sage: from sage.crypto.block_cipher.des import DES
451
+ sage: des1 = DES()
452
+ sage: des2 = DES()
453
+ sage: des3 = DES(rounds=11)
454
+ sage: des1 == des2
455
+ True
456
+ sage: des1 == des3
457
+ False
458
+ sage: des2 == 42
459
+ False
460
+ """
461
+ if not isinstance(other, DES):
462
+ return False
463
+ else:
464
+ return self.__dict__ == other.__dict__
465
+
466
+ def __repr__(self):
467
+ r"""
468
+ A string representation of this DES.
469
+
470
+ EXAMPLES::
471
+
472
+ sage: from sage.crypto.block_cipher.des import DES
473
+ sage: DES() # indirect doctest
474
+ DES block cipher with 16 rounds and the following key schedule:
475
+ Original DES key schedule with 16 rounds
476
+ """
477
+ return ('DES block cipher with %s rounds and the following key '
478
+ 'schedule:\n%s' % (self._rounds, self.keySchedule.__repr__()))
479
+
480
+ def encrypt(self, plaintext, key):
481
+ r"""
482
+ Return the ciphertext corresponding to ``plaintext``, using DES
483
+ encryption with ``key``.
484
+
485
+ INPUT:
486
+
487
+ - ``plaintext`` -- integer or bit list-like; the plaintext that will be
488
+ encrypted
489
+
490
+ - ``key`` -- integer or bit list-like; the key
491
+
492
+ OUTPUT:
493
+
494
+ - The ciphertext corresponding to ``plaintext``, obtained using
495
+ ``key``. If ``plaintext`` is an integer the output will be too. If
496
+ ``plaintext`` is list-like the output will be a bit vector.
497
+
498
+ EXAMPLES:
499
+
500
+ Encrypt a message::
501
+
502
+ sage: from sage.crypto.block_cipher.des import DES
503
+ sage: des = DES()
504
+ sage: K64 = 0x133457799BBCDFF1
505
+ sage: P = 0x0123456789ABCDEF
506
+ sage: C = des.encrypt(P, K64); C.hex()
507
+ '85e813540f0ab405'
508
+
509
+ You can also use 56 bit keys i.e. you can leave out the parity bits::
510
+
511
+ sage: K56 = 0x12695BC9B7B7F8
512
+ sage: des = DES(keySize=56)
513
+ sage: des.encrypt(P, K56) == C
514
+ True
515
+ """
516
+ if isinstance(plaintext, (list, tuple, Vector)):
517
+ inputType = 'vector'
518
+ elif isinstance(plaintext, (Integer, int)):
519
+ inputType = 'integer'
520
+ state = convert_to_vector(plaintext, self._blocksize)
521
+ key = convert_to_vector(key, self._keySize)
522
+ if self._keySize == 56:
523
+ # insert 'parity' bits
524
+ key = list(key)
525
+ for i in range(7, 64, 8):
526
+ key.insert(i, 0)
527
+ key = vector(GF(2), 64, key)
528
+ roundKeys = self.keySchedule(key)
529
+ state = self._ip(state)
530
+ for k in roundKeys[:self._rounds]:
531
+ state = self.round(state, k)
532
+ if self._doFinalRound:
533
+ state = vector(GF(2), 64, list(state[32:64])+list(state[0:32]))
534
+ state = self._inv_ip(state)
535
+ return state if inputType == 'vector' else ZZ(list(state)[::-1], 2)
536
+
537
+ def decrypt(self, ciphertext, key):
538
+ r"""
539
+ Return the plaintext corresponding to ``ciphertext``, using DES
540
+ decryption with ``key``.
541
+
542
+ INPUT:
543
+
544
+ - ``ciphertext`` -- integer or bit list-like; the ciphertext that will
545
+ be decrypted
546
+
547
+ - ``key`` -- integer or bit list-like; the key
548
+
549
+ OUTPUT:
550
+
551
+ - The plaintext corresponding to ``ciphertext``, obtained using
552
+ ``key``. If ``ciphertext`` is an integer the output will be too. If
553
+ ``ciphertext`` is list-like the output will be a bit vector.
554
+
555
+ EXAMPLES:
556
+
557
+ Decrypt a message::
558
+
559
+ sage: from sage.crypto.block_cipher.des import DES
560
+ sage: des = DES()
561
+ sage: K64 = 0x7CA110454A1A6E57
562
+ sage: C = 0x690F5B0D9A26939B
563
+ sage: P = des.decrypt(C, K64).hex(); P
564
+ '1a1d6d039776742'
565
+
566
+ You can also use 56 bit keys i.e. you can leave out the parity bits::
567
+
568
+ sage: K56 = 0x7D404224A35BAB
569
+ sage: des = DES(keySize=56)
570
+ sage: des.decrypt(C, K56).hex() == P
571
+ True
572
+ """
573
+ if isinstance(ciphertext, (list, tuple, Vector)):
574
+ inputType = 'vector'
575
+ elif isinstance(ciphertext, (Integer, int)):
576
+ inputType = 'integer'
577
+ state = convert_to_vector(ciphertext, 64)
578
+ key = convert_to_vector(key, self._keySize)
579
+ if self._keySize == 56:
580
+ # insert 'parity' bits
581
+ key = list(key)
582
+ for i in range(7, 64, 8):
583
+ key.insert(i, 0)
584
+ key = vector(GF(2), 64, key)
585
+ roundKeys = self.keySchedule(key)
586
+ state = self._ip(state)
587
+ for k in roundKeys[:self._rounds][::-1]:
588
+ state = self.round(state, k)
589
+ state = vector(GF(2), 64, list(state[32:64])+list(state[0:32]))
590
+ state = self._inv_ip(state)
591
+ return state if inputType == 'vector' else ZZ(list(state)[::-1], 2)
592
+
593
+ def _ip(self, block):
594
+ r"""
595
+ Return the initial permutation of ``block``.
596
+
597
+ EXAMPLES::
598
+
599
+ sage: from sage.crypto.block_cipher.des import DES
600
+ sage: des = DES()
601
+ sage: B = vector(GF(2), 64, [0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,
602
+ ....: 0,0,1,0,1,0,1,1,0,0,1,1,1,1,0,0,0,1,0,
603
+ ....: 0,1,1,0,1,0,1,0,1,1,1,1,0,0,1,1,0,1,1,
604
+ ....: 1,1,0,1,1,1,1])
605
+ sage: des._ip(B)
606
+ (1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
607
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0,
608
+ 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0)
609
+ """
610
+ IP = [58, 50, 42, 34, 26, 18, 10, 2,
611
+ 60, 52, 44, 36, 28, 20, 12, 4,
612
+ 62, 54, 46, 38, 30, 22, 14, 6,
613
+ 64, 56, 48, 40, 32, 24, 16, 8,
614
+ 57, 49, 41, 33, 25, 17, 9, 1,
615
+ 59, 51, 43, 35, 27, 19, 11, 3,
616
+ 61, 53, 45, 37, 29, 21, 13, 5,
617
+ 63, 55, 47, 39, 31, 23, 15, 7]
618
+ return vector(GF(2), 64, [block[i-1] for i in IP])
619
+
620
+ def round(self, state, round_key):
621
+ r"""
622
+ Apply one round of DES to ``state`` and return the result.
623
+
624
+ EXAMPLES::
625
+
626
+ sage: from sage.crypto.block_cipher.des import DES
627
+ sage: from sage.crypto.block_cipher.des import convert_to_vector
628
+ sage: des = DES()
629
+ sage: k1 = convert_to_vector(0xFFFFFFFFFFFF, 48)
630
+ sage: state = convert_to_vector(0xFFFFFFFF11111111, 64)
631
+ sage: ZZ(list(des.round(state, k1))[::-1], 2).hex()
632
+ '11111111b29684b8'
633
+ """
634
+ L, R = state[0:32], state[32:64]
635
+ L, R = R, L + self._f(R, round_key)
636
+ state = vector(GF(2), 64, list(L)+list(R))
637
+ return state
638
+
639
+ def _f(self, right, subkey):
640
+ r"""
641
+ Apply the cipher function to ``right`` and ``subkey``.
642
+
643
+ EXAMPLES::
644
+
645
+ sage: from sage.crypto.block_cipher.des import DES
646
+ sage: des = DES()
647
+ sage: R = vector(GF(2), 32, [1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,
648
+ ....: 1,0,0,0,0,1,0,1,0,1,0,1,0])
649
+ sage: K = vector(GF(2), 48, [0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,1,1,1,
650
+ ....: 0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,
651
+ ....: 0,0,0,1,1,1,0,0,1,0])
652
+ sage: des._f(R, K)
653
+ (0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
654
+ 0, 1, 1, 0, 1, 1, 1, 0, 1, 1)
655
+ """
656
+ return self._permutaion(self.sbox_layer(self._expand(right)+subkey))
657
+
658
+ def _expand(self, right):
659
+ r"""
660
+ Apply the expansion function to ``right``.
661
+
662
+ EXAMPLES::
663
+
664
+ sage: from sage.crypto.block_cipher.des import DES
665
+ sage: des = DES()
666
+ sage: R = vector(GF(2), 32, [1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,
667
+ ....: 1,0,0,0,0,1,0,1,0,1,0,1,0])
668
+ sage: des._expand(R)
669
+ (0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
670
+ 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
671
+ 0, 1, 0, 1)
672
+ """
673
+ E = [32, 1, 2, 3, 4, 5,
674
+ 4, 5, 6, 7, 8, 9,
675
+ 8, 9, 10, 11, 12, 13,
676
+ 12, 13, 14, 15, 16, 17,
677
+ 16, 17, 18, 19, 20, 21,
678
+ 20, 21, 22, 23, 24, 25,
679
+ 24, 25, 26, 27, 28, 29,
680
+ 28, 29, 30, 31, 32, 1]
681
+ return vector(GF(2), 48, [right[i-1] for i in E])
682
+
683
+ def sbox_layer(self, block):
684
+ r"""
685
+ Apply the Sboxes to ``block``.
686
+
687
+ EXAMPLES::
688
+
689
+ sage: from sage.crypto.block_cipher.des import DES
690
+ sage: des = DES()
691
+ sage: B = vector(GF(2), 48, [0,1,1,0,0,0,0,1,0,0,0,1,0,1,1,1,1,0,1,
692
+ ....: 1,1,0,1,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,
693
+ ....: 0,1,0,0,1,0,0,1,1,1])
694
+ sage: des.sbox_layer(B)
695
+ (0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1,
696
+ 0, 1, 1, 0, 0, 1, 0, 1, 1, 1)
697
+
698
+ .. SEEALSO::
699
+
700
+ :mod:`sage.crypto.sboxes`
701
+ """
702
+ s = self.sboxes
703
+ block = [block[i:i+6] for i in range(0, 48, 6)]
704
+ block = list(chain.from_iterable([s[i][ZZ([b[5], b[0]], 2)](b[1:5])
705
+ for i, b in enumerate(block)]))
706
+ return vector(GF(2), 32, block)
707
+
708
+ def _permutaion(self, block):
709
+ r"""
710
+ Apply the permutation function to ``block``.
711
+
712
+ EXAMPLES::
713
+
714
+ sage: from sage.crypto.block_cipher.des import DES
715
+ sage: des = DES()
716
+ sage: B = vector(GF(2), 32, [0,1,0,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,
717
+ ....: 1,0,1,0,1,1,0,0,1,0,1,1,1])
718
+ sage: des._permutaion(B)
719
+ (0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
720
+ 0, 1, 1, 0, 1, 1, 1, 0, 1, 1)
721
+ """
722
+ P = [16, 7, 20, 21,
723
+ 29, 12, 28, 17,
724
+ 1, 15, 23, 26,
725
+ 5, 18, 31, 10,
726
+ 2, 8, 24, 14,
727
+ 32, 27, 3, 9,
728
+ 19, 13, 30, 6,
729
+ 22, 11, 4, 25]
730
+ return vector(GF(2), 32, [block[i-1] for i in P])
731
+
732
+ def _inv_ip(self, block):
733
+ r"""
734
+ Apply the inverse permutation function to ``block``.
735
+
736
+ EXAMPLES::
737
+
738
+ sage: from sage.crypto.block_cipher.des import DES
739
+ sage: des = DES()
740
+ sage: B = vector(GF(2), 64, [0,0,0,0,1,0,1,0,0,1,0,0,1,1,0,0,1,1,0,
741
+ ....: 1,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,0,0,0,
742
+ ....: 1,1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,
743
+ ....: 0,1,1,0,1,0,0])
744
+ sage: des._inv_ip(B)
745
+ (1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
746
+ 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
747
+ 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1)
748
+ """
749
+ invIP = [40, 8, 48, 16, 56, 24, 64, 32,
750
+ 39, 7, 47, 15, 55, 23, 63, 31,
751
+ 38, 6, 46, 14, 54, 22, 62, 30,
752
+ 37, 5, 45, 13, 53, 21, 61, 29,
753
+ 36, 4, 44, 12, 52, 20, 60, 28,
754
+ 35, 3, 43, 11, 51, 19, 59, 27,
755
+ 34, 2, 42, 10, 50, 18, 58, 26,
756
+ 33, 1, 41, 9, 49, 17, 57, 25]
757
+ return vector(GF(2), 64, [block[i-1] for i in invIP])
758
+
759
+
760
+ class DES_KS(SageObject):
761
+ r"""
762
+ This class implements the DES key schedules described in [U.S1999]_.
763
+
764
+ EXAMPLES:
765
+
766
+ Initialise the key schedule with a `masterKey` to use it as an iterable::
767
+
768
+ sage: from sage.crypto.block_cipher.des import DES_KS
769
+ sage: ks = DES_KS(masterKey=0)
770
+ sage: ks[0]
771
+ 0
772
+ sage: ks[15]
773
+ 0
774
+
775
+ Or omit the `masterKey` and pass a key when calling the key schedule::
776
+
777
+ sage: ks = DES_KS()
778
+ sage: K = ks(0x584023641ABA6176)
779
+ sage: K[0].hex()
780
+ 'd0a2ed2fa124'
781
+ sage: K[15].hex()
782
+ '43b42af81183'
783
+
784
+ .. SEEALSO::
785
+
786
+ :class:`DES`
787
+
788
+ .. automethod:: __init__
789
+ .. automethod:: __call__
790
+ """
791
+
792
+ def __init__(self, rounds=16, masterKey=None):
793
+ r"""
794
+ Construct an instance of DES_KS.
795
+
796
+ INPUT:
797
+
798
+ - ``rounds`` -- integer (default: `16`); the number of rounds
799
+ ``self`` can create keys for
800
+
801
+ - ``masterKey`` -- integer or bit list-like (default: ``None``); the
802
+ 64-bit key that will be used
803
+
804
+ EXAMPLES::
805
+
806
+ sage: from sage.crypto.block_cipher.des import DES_KS
807
+ sage: DES_KS()
808
+ Original DES key schedule with 16 rounds
809
+
810
+ .. NOTE::
811
+
812
+ If you want to use a DES_KS object as an iterable you have to
813
+ pass a ``masterKey`` value on initialisation. Otherwise you can
814
+ omit ``masterKey`` and pass a key when you call the object.
815
+ """
816
+ self._rounds = rounds
817
+ self._masterKey = masterKey
818
+ self._keySize = 64
819
+
820
+ def __call__(self, key):
821
+ r"""
822
+ Return all round keys in a list.
823
+
824
+ INPUT:
825
+
826
+ - ``key`` -- integer or bit list-like; the 64-bit key
827
+
828
+ OUTPUT:
829
+
830
+ - A list containing the round keys. If ``key`` is an integer the
831
+ elements of the output list will be too. If ``key`` is list-like the
832
+ element of the output list will be bit vectors.
833
+
834
+ EXAMPLES:
835
+
836
+ This implementation is using bit vectors for all internal
837
+ representations. So you can invoke the key schedule with a bit
838
+ vector::
839
+
840
+ sage: from sage.crypto.block_cipher.des import DES_KS
841
+ sage: K = vector(GF(2),[0,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,1,0,1,0,
842
+ ....: 1,1,1,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,
843
+ ....: 1,1,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,1])
844
+ sage: ks = DES_KS(16, K)
845
+ sage: [k for k in ks]
846
+ [(0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1,
847
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,
848
+ 0, 0, 1, 0),
849
+ (0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0,
850
+ 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0,
851
+ 0, 1, 0, 1),
852
+ ...
853
+ (1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0,
854
+ 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1,
855
+ 0, 1, 0, 1)]
856
+
857
+ But of course you can invoke it with hex representation as well::
858
+
859
+ sage: K = 0x133457799bbcdff1
860
+ sage: ks = DES_KS(16, K)
861
+ sage: [k.hex() for k in ks]
862
+ ['1b02effc7072',
863
+ '79aed9dbc9e5',
864
+ ...
865
+ 'cb3d8b0e17f5']
866
+
867
+ .. NOTE::
868
+
869
+ If you want to use a DES_KS object as an iterable you have to
870
+ pass a ``masterKey`` value on initialisation. Otherwise you can
871
+ omit ``masterKey`` and pass a key when you call the object.
872
+ """
873
+ if isinstance(key, (list, tuple, Vector)):
874
+ inputType = 'vector'
875
+ elif isinstance(key, (Integer, int)):
876
+ inputType = 'integer'
877
+ key = convert_to_vector(key, self._keySize)
878
+ roundKeys = []
879
+ C, D = self._pc1(key)
880
+ for i in range(16):
881
+ C, D = self._left_shift(C, i), self._left_shift(D, i)
882
+ roundKeys.append(self._pc2(list(C)+list(D)))
883
+ return roundKeys if inputType == 'vector' else [ZZ(list(k)[::-1], 2)
884
+ for k in roundKeys]
885
+
886
+ def __eq__(self, other):
887
+ r"""
888
+ Compare ``self`` with ``other``.
889
+
890
+ DES_KS objects are the same if all attributes are the same.
891
+
892
+ EXAMPLES::
893
+
894
+ sage: from sage.crypto.block_cipher.des import DES_KS
895
+ sage: DES_KS() == DES_KS() # indirect doctest
896
+ True
897
+ sage: DES_KS() == DES_KS(11) # indirect doctest
898
+ False
899
+ """
900
+ if not isinstance(other, DES_KS):
901
+ return False
902
+ else:
903
+ return self.__dict__ == other.__dict__
904
+
905
+ def __repr__(self):
906
+ r"""
907
+ A string representation of this DES_KS.
908
+
909
+ EXAMPLES::
910
+
911
+ sage: from sage.crypto.block_cipher.des import DES_KS
912
+ sage: DES_KS() # indirect doctest
913
+ Original DES key schedule with 16 rounds
914
+ """
915
+ return ('Original DES key schedule with %s rounds' % (self._rounds))
916
+
917
+ def __getitem__(self, r):
918
+ r"""
919
+ Compute the sub key for round ``r`` derived from initial master key.
920
+
921
+ The key schedule object has to have been initialised with the
922
+ `masterKey` argument.
923
+
924
+ INPUT:
925
+
926
+ - ``r`` -- integer; the round for which the sub key is computed
927
+
928
+ EXAMPLES::
929
+
930
+ sage: from sage.crypto.block_cipher.des import DES_KS
931
+ sage: ks = DES_KS(masterKey=0x1F08260D1AC2465E)
932
+ sage: ks[0].hex() # indirect doctest
933
+ '103049bfb90e'
934
+ sage: ks[15].hex() # indirect doctest
935
+ '231000f2dd97'
936
+ """
937
+ if self._masterKey is None:
938
+ raise ValueError('Key not set during initialisation')
939
+ return self(self._masterKey)[r]
940
+
941
+ def __iter__(self):
942
+ r"""
943
+ Iterate over the DES round keys, derived from `masterKey`.
944
+
945
+ EXAMPLES::
946
+
947
+ sage: from sage.crypto.block_cipher.des import DES_KS
948
+ sage: K = [k for k in DES_KS(masterKey=0x0113B970FD34F2CE)]
949
+ sage: K[0].hex() # indirect doctest
950
+ '6f26cc480fc6'
951
+ sage: K[15].hex() # indirect doctest
952
+ '9778f17524a'
953
+ """
954
+ if self._masterKey is None:
955
+ raise ValueError('Key not set during initialisation')
956
+ return iter(self(self._masterKey))
957
+
958
+ def _pc1(self, key):
959
+ r"""
960
+ Return Permuted Choice 1 of ``key``.
961
+
962
+ EXAMPLES::
963
+
964
+ sage: from sage.crypto.block_cipher.des import DES_KS
965
+ sage: ks = DES_KS()
966
+ sage: K = vector(GF(2),[0,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,1,0,1,0,
967
+ ....: 1,1,1,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,
968
+ ....: 1,1,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,1])
969
+ sage: C, D = ks._pc1(K)
970
+ sage: C
971
+ (1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0,
972
+ 1, 0, 1, 1, 1, 1)
973
+ sage: D
974
+ (0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0,
975
+ 0, 0, 1, 1, 1, 1)
976
+ """
977
+ PC1_C = [57, 49, 41, 33, 25, 17, 9,
978
+ 1, 58, 50, 42, 34, 26, 18,
979
+ 10, 2, 59, 51, 43, 35, 27,
980
+ 19, 11, 3, 60, 52, 44, 36]
981
+ PC1_D = [63, 55, 47, 39, 31, 23, 15,
982
+ 7, 62, 54, 46, 38, 30, 22,
983
+ 14, 6, 61, 53, 45, 37, 29,
984
+ 21, 13, 5, 28, 20, 12, 4]
985
+ C = vector(GF(2), 28, [key[i-1] for i in PC1_C])
986
+ D = vector(GF(2), 28, [key[i-1] for i in PC1_D])
987
+ return C, D
988
+
989
+ def _pc2(self, key):
990
+ r"""
991
+ Return Permuted Choice 2 of ``key``.
992
+
993
+ EXAMPLES::
994
+
995
+ sage: from sage.crypto.block_cipher.des import DES_KS
996
+ sage: ks = DES_KS()
997
+ sage: K = vector(GF(2),[1,1,1,0,0,0,0,1,1,0,0,1,1,0,0,1,0,1,0,1,0,
998
+ ....: 1,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,0,0,1,1,
999
+ ....: 0,0,1,1,1,1,0,0,0,1,1,1,1,0])
1000
+ sage: ks._pc2(K)
1001
+ (0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1,
1002
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,
1003
+ 0, 0, 1, 0)
1004
+ """
1005
+ PC2 = [14, 17, 11, 24, 1, 5,
1006
+ 3, 28, 15, 6, 21, 10,
1007
+ 23, 19, 12, 4, 26, 8,
1008
+ 16, 7, 27, 20, 13, 2,
1009
+ 41, 52, 31, 37, 47, 55,
1010
+ 30, 40, 51, 45, 33, 48,
1011
+ 44, 49, 39, 56, 34, 53,
1012
+ 46, 42, 50, 36, 29, 32]
1013
+ return vector(GF(2), 48, [key[i-1] for i in PC2])
1014
+
1015
+ def _left_shift(self, half, i):
1016
+ r"""
1017
+ Shift ``half`` one or two positions to the left depending on the
1018
+ iteration number ``i``.
1019
+
1020
+ EXAMPLES::
1021
+
1022
+ sage: from sage.crypto.block_cipher.des import DES_KS
1023
+ sage: ks = DES_KS()
1024
+ sage: bits = vector(GF(2), 6, [1,0,1,0,1,0])
1025
+ sage: ks._left_shift(bits, 0)
1026
+ (0, 1, 0, 1, 0, 1)
1027
+ sage: bits
1028
+ (1, 0, 1, 0, 1, 0)
1029
+ sage: ks._left_shift(bits, 2)
1030
+ (1, 0, 1, 0, 1, 0)
1031
+ """
1032
+ amount = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
1033
+ return vector(GF(2),
1034
+ list(half[amount[i]:]) + list(half[0:amount[i]]))
1035
+
1036
+
1037
+ def convert_to_vector(I, L):
1038
+ r"""
1039
+ Convert ``I`` to a bit vector of length ``L``.
1040
+
1041
+ INPUT:
1042
+
1043
+ - ``I`` -- integer or bit list-like
1044
+
1045
+ - ``L`` -- integer; the desired bit length of the output
1046
+
1047
+ OUTPUT: the ``L``-bit vector representation of ``I``
1048
+
1049
+ EXAMPLES::
1050
+
1051
+ sage: from sage.crypto.block_cipher.des import convert_to_vector
1052
+ sage: convert_to_vector(0x1F, 8)
1053
+ (0, 0, 0, 1, 1, 1, 1, 1)
1054
+ sage: v = vector(GF(2), 4, [1,0,1,0])
1055
+ sage: convert_to_vector(v, 4)
1056
+ (1, 0, 1, 0)
1057
+ """
1058
+ try:
1059
+ state = vector(GF(2), L, ZZ(I).digits(2, padto=L)[::-1])
1060
+ return state
1061
+ except TypeError:
1062
+ # ignore the error and try list-like types
1063
+ pass
1064
+ state = vector(GF(2), L, [0]*(L-len(I))+list(I))
1065
+ return state