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,851 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ """
3
+ Generic Asymptotically Fast Strassen Algorithms
4
+
5
+ This implements asymptotically fast echelon form and matrix
6
+ multiplication algorithms.
7
+ """
8
+
9
+ # ***************************************************************************
10
+ # Copyright (C) 2005, 2006 William Stein <wstein@gmail.com>
11
+ #
12
+ # This program is free software: you can redistribute it and/or modify
13
+ # it under the terms of the GNU General Public License as published by
14
+ # the Free Software Foundation, either version 2 of the License, or
15
+ # (at your option) any later version.
16
+ # https://www.gnu.org/licenses/
17
+ # ***************************************************************************
18
+
19
+ from sage.matrix.matrix_window cimport MatrixWindow
20
+
21
+ from cysignals.signals cimport sig_on, sig_off
22
+
23
+
24
+ def strassen_window_multiply(C, A, B, cutoff):
25
+ """
26
+ Multiply the submatrices specified by A and B, places result in
27
+ C. Assumes that A and B have compatible dimensions to be
28
+ multiplied, and that C is the correct size to receive the product,
29
+ and that they are all defined over the same ring.
30
+
31
+ Uses Strassen multiplication at high levels and then uses
32
+ MatrixWindow methods at low levels.
33
+
34
+ EXAMPLES: The following matrix
35
+ dimensions are chosen especially to exercise the eight possible
36
+ parity combinations that could occur while subdividing the matrix
37
+ in the Strassen recursion. The base case in both cases will be a
38
+ (4x5) matrix times a (5x6) matrix.
39
+
40
+ ::
41
+
42
+ sage: A = MatrixSpace(Integers(2^65), 64, 83).random_element()
43
+ sage: B = MatrixSpace(Integers(2^65), 83, 101).random_element()
44
+ sage: A._multiply_classical(B) == A._multiply_strassen(B, 3) #indirect doctest
45
+ True
46
+
47
+ AUTHORS:
48
+
49
+ - David Harvey
50
+ - Simon King (2011-07): Improve memory efficiency; :issue:`11610`
51
+ """
52
+ strassen_window_multiply_c(C, A, B, cutoff)
53
+
54
+
55
+ cdef strassen_window_multiply_c(MatrixWindow C, MatrixWindow A,
56
+ MatrixWindow B, Py_ssize_t cutoff):
57
+ # todo -- I'm not sure how to interpret "cutoff". Should it be...
58
+ # (a) the minimum side length of the matrices (currently implemented below)
59
+ # (b) the maximum side length of the matrices
60
+ # (c) the total number of entries being multiplied
61
+ # (d) something else entirely?
62
+
63
+ cdef Py_ssize_t A_nrows, A_ncols, B_ncols
64
+ A_nrows = A._nrows
65
+ A_ncols = A._ncols # this should also be the number of rows of B
66
+ B_ncols = B._ncols
67
+
68
+ if (A_nrows <= cutoff) or (A_ncols <= cutoff) or (B_ncols <= cutoff):
69
+ # note: this code is only reached if the TOP level is already beneath
70
+ # the cutoff. In a typical large multiplication, the base case is
71
+ # handled directly (see below).
72
+ C.set_to_prod(A, B)
73
+ return
74
+
75
+ # Construct windows for the four quadrants of each matrix.
76
+ # Note that if the side lengths are odd we're ignoring the
77
+ # final row/column for the moment.
78
+
79
+ cdef Py_ssize_t A_sub_nrows, A_sub_ncols, B_sub_ncols
80
+ A_sub_nrows = A_nrows >> 1
81
+ A_sub_ncols = A_ncols >> 1 # this is also like B_sub_nrows
82
+ B_sub_ncols = B_ncols >> 1
83
+
84
+ cdef bint have_cutoff = (A_sub_nrows <= cutoff) or (A_sub_ncols <= cutoff) or (B_sub_ncols <= cutoff)
85
+
86
+ cdef MatrixWindow A00, A01, A10, A11, B00, B01, B10, B11
87
+ A00 = A.matrix_window(0, 0, A_sub_nrows, A_sub_ncols)
88
+ A01 = A.matrix_window(0, A_sub_ncols, A_sub_nrows, A_sub_ncols)
89
+ A10 = A.matrix_window(A_sub_nrows, 0, A_sub_nrows, A_sub_ncols)
90
+ A11 = A.matrix_window(A_sub_nrows, A_sub_ncols, A_sub_nrows, A_sub_ncols)
91
+ B00 = B.matrix_window(0, 0, A_sub_ncols, B_sub_ncols)
92
+ B01 = B.matrix_window(0, B_sub_ncols, A_sub_ncols, B_sub_ncols)
93
+ B10 = B.matrix_window(A_sub_ncols, 0, A_sub_ncols, B_sub_ncols)
94
+ B11 = B.matrix_window(A_sub_ncols, B_sub_ncols, A_sub_ncols, B_sub_ncols)
95
+
96
+ # Allocate temp space.
97
+ # S.K: We already have allocated C, so, we should use it for temporary results.
98
+ # We use the schedule from Douglas-Heroux-Slishman-Smith (see also Boyer-Pernet-Zhou,
99
+ # "Memory efficient scheduling of Strassen-Winograd's matrix multiplication algorithm",
100
+ # Table 1).
101
+
102
+ cdef MatrixWindow S0, S1, S2, S3, T0, T1, T2, T3, P0, P1, P2, P3, P4, P5, P6, U0, U1, U2, U3, U4, U5, U6
103
+ cdef MatrixWindow X, Y
104
+ X = A.new_empty_window(A_sub_nrows, max(A_sub_ncols, B_sub_ncols))
105
+ Y = B.new_empty_window(A_sub_ncols, B_sub_ncols)
106
+
107
+ # 1 S2 = A00-A10 in X
108
+ S2 = X.matrix_window(0, 0, A_sub_nrows, A_sub_ncols)
109
+ S2.set_to_diff(A00, A10)
110
+
111
+ # 2 T2 = B11-B01 in Y
112
+ T2 = Y
113
+ T2.set_to_diff(B11, B01)
114
+
115
+ # 3 P6 = S2*T2 in C10
116
+ P6 = C.matrix_window(A_sub_nrows, 0, A_sub_nrows, B_sub_ncols)
117
+ if have_cutoff:
118
+ P6.set_to_prod(S2, T2)
119
+ else:
120
+ strassen_window_multiply_c(P6, S2, T2, cutoff)
121
+
122
+ # 4 S0 = A10+A11 in X
123
+ S0 = X.matrix_window(0, 0, A_sub_nrows, A_sub_ncols)
124
+ S0.set_to_sum(A10, A11)
125
+
126
+ # 5 T0 = B01-B00 in Y
127
+ T0 = Y
128
+ T0.set_to_diff(B01, B00)
129
+
130
+ # 6 P4 = S0*T0 in C11
131
+ P4 = C.matrix_window(A_sub_nrows, B_sub_ncols, A_sub_nrows, B_sub_ncols)
132
+ if have_cutoff:
133
+ P4.set_to_prod(S0, T0)
134
+ else:
135
+ strassen_window_multiply_c(P4, S0, T0, cutoff)
136
+
137
+ # 7 S1 = S0-A00 in X
138
+ S1 = X.matrix_window(0, 0, A_sub_nrows, A_sub_ncols)
139
+ S1.set_to_diff(S0, A00)
140
+
141
+ # 8 T1 = B11-T0 in Y
142
+ T1 = Y
143
+ T1.set_to_diff(B11,T0)
144
+
145
+ # 9 P5 = S1*T1 in C01
146
+ P5 = C.matrix_window(0, B_sub_ncols, A_sub_nrows, B_sub_ncols)
147
+ if have_cutoff:
148
+ P5.set_to_prod(S1, T1)
149
+ else:
150
+ strassen_window_multiply_c(P5, S1, T1, cutoff)
151
+
152
+ #10 S3 = A01-S1 in X
153
+ S3 = X.matrix_window(0, 0, A_sub_nrows, A_sub_ncols)
154
+ S3.set_to_diff(A01,S1)
155
+
156
+ #11 P2 = S3*B11 in C00
157
+ P2 = C.matrix_window(0, 0, A_sub_nrows, B_sub_ncols)
158
+ if have_cutoff:
159
+ P2.set_to_prod(S3, B11)
160
+ else:
161
+ strassen_window_multiply_c(P2, S3, B11, cutoff)
162
+
163
+ #12 P0 = A00*B00 in X
164
+ P0 = X.matrix_window(0, 0, A_sub_nrows, B_sub_ncols)
165
+ if have_cutoff:
166
+ P0.set_to_prod(A00, B00)
167
+ else:
168
+ strassen_window_multiply_c(P0, A00, B00, cutoff)
169
+
170
+ #13 U1 = P0+P5 in C01
171
+ U1 = C.matrix_window(0, B_sub_ncols, A_sub_nrows, B_sub_ncols)
172
+ U1.set_to_sum(P0, P5)
173
+
174
+ #14 U2 = U1+P6 in C10
175
+ U2 = C.matrix_window(A_sub_nrows, 0, A_sub_nrows, B_sub_ncols)
176
+ U2.set_to_sum(U1, P6)
177
+
178
+ #15 U3 = U1+P4 in C01
179
+ U3 = C.matrix_window(0, B_sub_ncols, A_sub_nrows, B_sub_ncols)
180
+ U3.set_to_sum(U1, P4)
181
+
182
+ #16 U6 = U2+P4 in C11 (final)
183
+ U6 = C.matrix_window(A_sub_nrows, B_sub_ncols, A_sub_nrows, B_sub_ncols)
184
+ U6.set_to_sum(U2, P4)
185
+
186
+ #17 U4 = U3+P2 in C01 (final)
187
+ U4 = C.matrix_window(0, B_sub_ncols, A_sub_nrows, B_sub_ncols)
188
+ U4.set_to_sum(U3, P2)
189
+
190
+ #18 T3 = T1-B10 in Y
191
+ T3 = Y
192
+ T3.set_to_diff(T1, B10)
193
+
194
+ #19 P3 = A11*T3 in C00
195
+ P3 = C.matrix_window(0, 0, A_sub_nrows, B_sub_ncols)
196
+ if have_cutoff:
197
+ P3.set_to_prod(A11, T3)
198
+ else:
199
+ strassen_window_multiply_c(P3, A11, T3, cutoff)
200
+
201
+ #20 U5 = U2-P3 in C10 (final)
202
+ U5 = C.matrix_window(A_sub_nrows, 0, A_sub_nrows, B_sub_ncols)
203
+ U5.set_to_diff(U2, P3)
204
+
205
+ #21 P1 = A01*B10 in C00
206
+ P1 = C.matrix_window(0, 0, A_sub_nrows, B_sub_ncols)
207
+ if have_cutoff:
208
+ P1.set_to_prod(A01, B10)
209
+ else:
210
+ strassen_window_multiply_c(P1, A01, B10, cutoff)
211
+
212
+ #22 U0 = P0+P1 in C00 (final)
213
+ U0 = C.matrix_window(0, 0, A_sub_nrows, B_sub_ncols)
214
+ U0.set_to_sum(P0, P1)
215
+
216
+ # Now deal with the leftover row and/or column (if they exist).
217
+
218
+ cdef MatrixWindow B_last_col, C_last_col, B_bulk, A_last_row, C_last_row, B_last_row, A_last_col, C_bulk
219
+
220
+ if B_ncols & 1:
221
+ B_last_col = B.matrix_window(0, B_ncols-1, A_ncols, 1)
222
+ C_last_col = C.matrix_window(0, B_ncols-1, A_nrows, 1)
223
+ C_last_col.set_to_prod(A, B_last_col)
224
+
225
+ if A_nrows & 1:
226
+ A_last_row = A.matrix_window(A_nrows-1, 0, 1, A_ncols)
227
+ if B_ncols & 1:
228
+ B_bulk = B.matrix_window(0, 0, A_ncols, B_ncols-1)
229
+ C_last_row = C.matrix_window(A_nrows-1, 0, 1, B_ncols-1)
230
+ else:
231
+ B_bulk = B
232
+ C_last_row = C.matrix_window(A_nrows-1, 0, 1, B_ncols)
233
+ C_last_row.set_to_prod(A_last_row, B_bulk)
234
+
235
+ if A_ncols & 1:
236
+ A_last_col = A.matrix_window(0, A_ncols-1, A_sub_nrows << 1, 1)
237
+ B_last_row = B.matrix_window(A_ncols-1, 0, 1, B_sub_ncols << 1)
238
+ C_bulk = C.matrix_window(0, 0, A_sub_nrows << 1, B_sub_ncols << 1)
239
+ C_bulk.add_prod(A_last_col, B_last_row)
240
+
241
+ cdef subtract_strassen_product(MatrixWindow result, MatrixWindow A, MatrixWindow B, Py_ssize_t cutoff):
242
+ cdef MatrixWindow to_sub
243
+ if (cutoff == -1 or result.ncols() <= cutoff or result.nrows() <= cutoff):
244
+ result.subtract_prod(A, B)
245
+ else:
246
+ to_sub = A.new_empty_window(result.nrows(), result.ncols())
247
+ strassen_window_multiply_c(to_sub, A, B, cutoff)
248
+ result.subtract(to_sub)
249
+
250
+
251
+ def strassen_echelon(MatrixWindow A, cutoff):
252
+ """
253
+ Compute echelon form, in place. Internal function, call with
254
+ M.echelonize(algorithm='strassen')
255
+
256
+ Based on work of Robert Bradshaw
257
+ and David Harvey at MSRI workshop in 2006.
258
+
259
+ INPUT:
260
+
261
+ - ``A`` -- matrix window
262
+
263
+ - ``cutoff`` -- size at which algorithm reverts to
264
+ naive Gaussian elimination and multiplication must be at least 1
265
+
266
+ OUTPUT: the list of pivot columns
267
+
268
+ EXAMPLES::
269
+
270
+ sage: A = matrix(QQ, 7, [5, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, -1, 3, 1, 0, -1, 0, 0, -1, 0, 1, 2, -1, 1, 0, -1, 0, 1, 3, -1, 1, 0, 0, -2, 0, 2, 0, 1, 0, 0, -1, 0, 1, 0, 1])
271
+ sage: B = A.__copy__(); B._echelon_strassen(1); B
272
+ [ 1 0 0 0 0 0 0]
273
+ [ 0 1 0 -1 0 1 0]
274
+ [ 0 0 1 0 0 0 0]
275
+ [ 0 0 0 0 1 0 0]
276
+ [ 0 0 0 0 0 0 1]
277
+ [ 0 0 0 0 0 0 0]
278
+ [ 0 0 0 0 0 0 0]
279
+ sage: C = A.__copy__(); C._echelon_strassen(2); C == B
280
+ True
281
+ sage: C = A.__copy__(); C._echelon_strassen(4); C == B
282
+ True
283
+
284
+ ::
285
+
286
+ sage: n = 32; A = matrix(Integers(389),n,range(n^2))
287
+ sage: B = A.__copy__(); B._echelon_in_place_classical()
288
+ sage: C = A.__copy__(); C._echelon_strassen(2)
289
+ sage: B == C
290
+ True
291
+
292
+ TESTS::
293
+
294
+ sage: A = matrix(Integers(7), 4, 4, [1,2,0,3,0,0,1,0,0,1,0,0,0,0,0,1])
295
+ sage: B = A.__copy__(); B._echelon_in_place_classical()
296
+ sage: C = A.__copy__(); C._echelon_strassen(2)
297
+ sage: B == C
298
+ True
299
+
300
+ ::
301
+
302
+ sage: A = matrix(Integers(7), 4, 4, [1,0,5,0,2,0,3,6,5,1,2,6,4,6,1,1])
303
+ sage: B = A.__copy__(); B._echelon_in_place_classical()
304
+ sage: C = A.__copy__(); C._echelon_strassen(2) #indirect doctest
305
+ sage: B == C
306
+ True
307
+
308
+ AUTHORS:
309
+
310
+ - Robert Bradshaw
311
+ """
312
+ if cutoff < 1:
313
+ raise ValueError("cutoff must be at least 1")
314
+ sig_on()
315
+ strassen_echelon_c(A, cutoff, A._matrix._strassen_default_cutoff(A._matrix))
316
+ sig_off()
317
+
318
+
319
+ cdef strassen_echelon_c(MatrixWindow A, Py_ssize_t cutoff, Py_ssize_t mul_cutoff):
320
+ # The following notation will be used in the comments below, which should be understood to give
321
+ # the general idea of what's going on, as if there were no inconvenient non-pivot columns.
322
+ # The original matrix is given by [ A B ]
323
+ # [ C D ]
324
+ # For compactness, let A' denote the inverse of A
325
+ # top_left, top_right, bottom_left, and bottom_right loosely correspond to A, B, C, and D respectively,
326
+ # however, the "cut" between the top and bottom rows need not be the same.
327
+
328
+ cdef Py_ssize_t nrows, ncols
329
+ nrows = A.nrows()
330
+ ncols = A.ncols()
331
+
332
+ if nrows <= cutoff or ncols <= cutoff:
333
+ return list(A.echelon_in_place())
334
+
335
+ cdef Py_ssize_t top_h, bottom_cut, bottom_h, bottom_start, top_cut
336
+ cdef Py_ssize_t prev_pivot_count
337
+ cdef Py_ssize_t split
338
+ split = nrows // 2
339
+
340
+ cdef MatrixWindow top, bottom, top_left, top_right, bottom_left, bottom_right, clear
341
+
342
+ top = A.matrix_window(0, 0, split, ncols)
343
+ bottom = A.matrix_window(split, 0, nrows-split, ncols)
344
+
345
+ top_pivots = strassen_echelon_c(top, cutoff, mul_cutoff)
346
+ # effectively "multiplied" top row by A^{-1}
347
+ # [ I A'B ]
348
+ # [ C D ]
349
+
350
+ top_pivot_intervals = int_range(top_pivots)
351
+ top_h = len(top_pivots)
352
+
353
+ if top_h == 0:
354
+ # [ 0 0 ]
355
+ # the whole top is a zero matrix, [ C D ]. Run echelon on the bottom
356
+ bottom_pivots = strassen_echelon_c(bottom, cutoff, mul_cutoff)
357
+ # [ 0 0 ]
358
+ # we now have [ I C'D ], proceed to sorting
359
+
360
+ else:
361
+ bottom_cut = max(top_pivots) + 1
362
+ bottom_left = bottom.matrix_window(0, 0, nrows-split, bottom_cut)
363
+
364
+ if top_h == ncols:
365
+ bottom.set_to_zero()
366
+ # [ I ]
367
+ # [ 0 ]
368
+ # proceed to sorting
369
+
370
+ else:
371
+ if bottom_cut == top_h:
372
+ clear = bottom_left
373
+ else:
374
+ clear = bottom_left.to_matrix().matrix_from_columns(top_pivots).matrix_window() # TODO: read only, can I do this faster? Also below
375
+ # Subtract off C time top from the bottom_right
376
+ if bottom_cut < ncols:
377
+ bottom_right = bottom.matrix_window(0, bottom_cut, nrows-split, ncols-bottom_cut)
378
+ subtract_strassen_product(bottom_right, clear, top.matrix_window(0, bottom_cut, top_h, ncols-bottom_cut), mul_cutoff)
379
+ # [ I A'B ]
380
+ # [ * D - CA'B ]
381
+
382
+ # Now subtract off C times the top from the bottom_left (pivots -> 0)
383
+ if bottom_cut == top_h:
384
+ bottom_left.set_to_zero()
385
+ bottom_start = bottom_cut
386
+
387
+ else:
388
+ for cols in top_pivot_intervals:
389
+ bottom_left.matrix_window(0, cols[0], nrows-split, cols[1]).set_to_zero()
390
+ non_pivots = int_range(0, bottom_cut) - top_pivot_intervals
391
+ for cols in non_pivots:
392
+ if cols[0] == 0: continue
393
+ prev_pivot_count = len(top_pivot_intervals - int_range(cols[0]+cols[1], bottom_cut - cols[0]+cols[1]))
394
+ subtract_strassen_product(bottom_left.matrix_window(0, cols[0], nrows-split, cols[1]),
395
+ clear.matrix_window(0, 0, nrows-split, prev_pivot_count),
396
+ top.matrix_window(0, cols[0], prev_pivot_count, cols[1]),
397
+ mul_cutoff)
398
+ bottom_start = non_pivots._intervals[0][0]
399
+ # [ I A'B ]
400
+ # [ 0 D - CA'B ]
401
+
402
+ # Now recursively do echelon form on the bottom
403
+ bottom_pivots_rel = strassen_echelon_c(bottom.matrix_window(0, bottom_start, nrows-split, ncols-bottom_start), cutoff, mul_cutoff)
404
+ # [ I A'B ]
405
+ # [ 0 I F ]
406
+ bottom_pivots = []
407
+ for pivot in bottom_pivots_rel:
408
+ bottom_pivots.append(pivot + bottom_start)
409
+ bottom_h = len(bottom_pivots)
410
+
411
+ if bottom_h == 0:
412
+ pass
413
+ # [ I A'B ]
414
+ # [ 0 0 ]
415
+ # proceed to sorting
416
+
417
+ else:
418
+ # [ I A'B ] = [ I E G ]
419
+ # let [ 0 I F ] = [ 0 I F ]
420
+ top_cut = max(max(bottom_pivots) + 1, bottom_cut)
421
+
422
+ # Note: left with respect to leftmost nonzero column of bottom
423
+ top_left = top.matrix_window(0, bottom_start, top_h, top_cut - bottom_start)
424
+
425
+ if bottom_h + top_h < ncols:
426
+
427
+ if top_cut - bottom_start == bottom_h:
428
+ clear = top_left
429
+ else:
430
+ clear = top_left.to_matrix().matrix_from_columns(bottom_pivots_rel).matrix_window()
431
+
432
+ # subtract off E times bottom from top right
433
+ if top_cut < ncols:
434
+
435
+ top_right = top.matrix_window(0, top_cut, top_h, ncols - top_cut)
436
+ subtract_strassen_product(top_right, clear, bottom.matrix_window(0, top_cut, bottom_h, ncols - top_cut), mul_cutoff)
437
+
438
+ # [ I * G - EF ]
439
+ # [ 0 I F ]
440
+
441
+ # Now subtract of E times bottom from top left
442
+ if top_cut - bottom_start == bottom_h:
443
+ top_left.set_to_zero()
444
+
445
+ else:
446
+ bottom_pivot_intervals = int_range(bottom_pivots)
447
+ non_pivots = int_range(bottom_start, top_cut - bottom_start) - bottom_pivot_intervals - top_pivot_intervals
448
+ for cols in non_pivots:
449
+ if cols[0] == 0: continue
450
+ prev_pivot_count = len(bottom_pivot_intervals - int_range(cols[0]+cols[1], top_cut - cols[0]+cols[1]))
451
+ subtract_strassen_product(top.matrix_window(0, cols[0], top_h, cols[1]),
452
+ clear.matrix_window(0, 0, top_h, prev_pivot_count),
453
+ bottom.matrix_window(0, cols[0], prev_pivot_count, cols[1]),
454
+ mul_cutoff)
455
+ for cols in bottom_pivot_intervals:
456
+ top.matrix_window(0, cols[0], top_h, cols[1]).set_to_zero()
457
+
458
+ # [ I 0 G - EF ]
459
+ # [ 0 I F ]
460
+ # proceed to sorting
461
+
462
+ # subrows already sorted...maybe I could do this more efficiently in cases with few pivot columns (e.g. merge sort)
463
+
464
+ pivots = top_pivots
465
+ pivots.extend(bottom_pivots)
466
+ pivots.sort()
467
+
468
+ cdef Py_ssize_t i, cur_row
469
+ for cur_row from 0 <= cur_row < len(pivots):
470
+ pivot = pivots[cur_row]
471
+ for i from cur_row <= i < nrows:
472
+ if not A.element_is_zero(i, pivot):
473
+ break
474
+ if i > cur_row and i < nrows:
475
+ A.swap_rows(i, cur_row)
476
+
477
+ return pivots
478
+
479
+
480
+ ################################
481
+ # lots of room for optimization....
482
+ # eventually, should I just pass these around
483
+ # rather than lists of ints for pivots?
484
+ # would need new from_cols
485
+ class int_range:
486
+ r"""
487
+ Represent a list of integers as a list of integer intervals.
488
+
489
+ .. NOTE::
490
+
491
+ Repetitions are not considered.
492
+
493
+ Useful class for dealing with pivots in the Strassen echelon, could
494
+ have much more general application
495
+
496
+ INPUT:
497
+
498
+ It can be one of the following:
499
+
500
+ - ``indices`` -- integer; start of the unique interval
501
+ - ``range`` -- integer; length of the unique interval
502
+
503
+ OR
504
+
505
+ - ``indices`` -- list of integers, the integers to wrap into intervals
506
+
507
+ OR
508
+
509
+ - ``indices`` -- ``None`` (default), shortcut for an empty list
510
+
511
+ OUTPUT:
512
+
513
+ An instance of ``int_range``, i.e. a list of pairs ``(start, length)``.
514
+
515
+ EXAMPLES:
516
+
517
+ From a pair of integers::
518
+
519
+ sage: from sage.matrix.strassen import int_range
520
+ sage: int_range(2, 4)
521
+ [(2, 4)]
522
+
523
+ Default::
524
+
525
+ sage: int_range()
526
+ []
527
+
528
+ From a list of integers::
529
+
530
+ sage: int_range([1,2,3,4])
531
+ [(1, 4)]
532
+ sage: int_range([1,2,3,4,6,7,8])
533
+ [(1, 4), (6, 3)]
534
+ sage: int_range([1,2,3,4,100,101,102])
535
+ [(1, 4), (100, 3)]
536
+ sage: int_range([1,1000,2,101,3,4,100,102])
537
+ [(1, 4), (100, 3), (1000, 1)]
538
+
539
+ Repetitions are not considered::
540
+
541
+ sage: int_range([1,2,3])
542
+ [(1, 3)]
543
+ sage: int_range([1,1,1,1,2,2,2,3])
544
+ [(1, 3)]
545
+
546
+ AUTHORS:
547
+
548
+ - Robert Bradshaw
549
+ """
550
+ def __init__(self, indices=None, range=None):
551
+ r"""
552
+ See ``sage.matrix.strassen.int_range`` for full documentation.
553
+
554
+ EXAMPLES::
555
+
556
+ sage: from sage.matrix.strassen import int_range
557
+ sage: int_range(2, 4)
558
+ [(2, 4)]
559
+ """
560
+ if indices is None:
561
+ self._intervals = []
562
+ return
563
+ if range is not None:
564
+ self._intervals = [(int(indices), int(range))]
565
+ else:
566
+ self._intervals = []
567
+ if not indices:
568
+ return
569
+ indices.sort()
570
+ start = None
571
+ last = None
572
+ for ix in indices:
573
+ if last is None:
574
+ start = ix
575
+ elif ix-last > 1:
576
+ self._intervals.append((start, last-start+1))
577
+ start = ix
578
+ last = ix
579
+ self._intervals.append((start, last-start+1))
580
+
581
+ def __repr__(self):
582
+ r"""
583
+ String representation.
584
+
585
+ EXAMPLES::
586
+
587
+ sage: from sage.matrix.strassen import int_range
588
+ sage: int_range([4,5,6,20,21,22,23])
589
+ [(4, 3), (20, 4)]
590
+ sage: int_range([])
591
+ []
592
+ """
593
+ return str(self._intervals)
594
+
595
+ def intervals(self):
596
+ r"""
597
+ Return the list of intervals.
598
+
599
+ OUTPUT: list of pairs of integers
600
+
601
+ EXAMPLES::
602
+
603
+ sage: from sage.matrix.strassen import int_range
604
+ sage: I = int_range([4,5,6,20,21,22,23])
605
+ sage: I.intervals()
606
+ [(4, 3), (20, 4)]
607
+ sage: type(I.intervals())
608
+ <... 'list'>
609
+ """
610
+ return self._intervals
611
+
612
+ def to_list(self):
613
+ r"""
614
+ Return the (sorted) list of integers represented by this object.
615
+
616
+ OUTPUT: list of integers
617
+
618
+ EXAMPLES::
619
+
620
+ sage: from sage.matrix.strassen import int_range
621
+ sage: I = int_range([6,20,21,4,5,22,23])
622
+ sage: I.to_list()
623
+ [4, 5, 6, 20, 21, 22, 23]
624
+
625
+ ::
626
+
627
+ sage: I = int_range(34, 9)
628
+ sage: I.to_list()
629
+ [34, 35, 36, 37, 38, 39, 40, 41, 42]
630
+
631
+ Repetitions are not considered::
632
+
633
+ sage: I = int_range([1,1,1,1,2,2,2,3])
634
+ sage: I.to_list()
635
+ [1, 2, 3]
636
+ """
637
+ return [i for iv0, iv1 in self._intervals
638
+ for i in range(iv0, iv0 + iv1)]
639
+
640
+ def __iter__(self):
641
+ r"""
642
+ Return an iterator over the intervals.
643
+
644
+ OUTPUT: iterator
645
+
646
+ EXAMPLES::
647
+
648
+ sage: from sage.matrix.strassen import int_range
649
+ sage: I = int_range([6,20,21,4,5,22,23])
650
+ sage: it = iter(I)
651
+ sage: next(it)
652
+ (4, 3)
653
+ sage: next(it)
654
+ (20, 4)
655
+ sage: next(it)
656
+ Traceback (most recent call last):
657
+ ...
658
+ StopIteration
659
+ """
660
+ return iter(self._intervals)
661
+
662
+ def __len__(self):
663
+ r"""
664
+ Return the number of integers represented by this object.
665
+
666
+ OUTPUT: Python integer
667
+
668
+ EXAMPLES::
669
+
670
+ sage: from sage.matrix.strassen import int_range
671
+ sage: I = int_range([6,20,21,4,5,22,23])
672
+ sage: len(I)
673
+ 7
674
+
675
+ ::
676
+
677
+ sage: I = int_range([1,1,1,1,2,2,2,3])
678
+ sage: len(I)
679
+ 3
680
+ """
681
+ return sum(iv1 for _, iv1 in self._intervals)
682
+
683
+ def __add__(self, right):
684
+ r"""
685
+ Return the union of ``self`` and ``right``.
686
+
687
+ INPUT:
688
+
689
+ - ``right`` -- an instance of ``int_range``
690
+
691
+ OUTPUT: an instance of ``int_range``
692
+
693
+ .. NOTE::
694
+
695
+ Yes, this two could be a lot faster...
696
+ Basically, this class is for abstracting away what I was trying
697
+ to do by hand in several places
698
+
699
+ EXAMPLES::
700
+
701
+ sage: from sage.matrix.strassen import int_range
702
+ sage: I = int_range([1,1,1,1,2,2,2,3])
703
+ sage: J = int_range([6,20,21,4,5,22,23])
704
+ sage: I + J
705
+ [(1, 6), (20, 4)]
706
+ """
707
+ full_list = self.to_list()
708
+ full_list.extend(right.to_list())
709
+ return int_range(full_list)
710
+
711
+ def __sub__(self, right):
712
+ r"""
713
+ Return the set difference of ``self`` and ``right``.
714
+
715
+ INPUT:
716
+
717
+ - ``right`` -- an instance of ``int_range``
718
+
719
+ OUTPUT: an instance of ``int_range``
720
+
721
+ .. NOTE::
722
+
723
+ Yes, this two could be a lot faster...
724
+ Basically, this class is for abstracting away what I was trying
725
+ to do by hand in several places
726
+
727
+ EXAMPLES::
728
+
729
+ sage: from sage.matrix.strassen import int_range
730
+ sage: I = int_range([1,2,3,4,5])
731
+ sage: J = int_range([6,20,21,4,5,22,23])
732
+ sage: J - I
733
+ [(6, 1), (20, 4)]
734
+ """
735
+ right_list = set(right.to_list())
736
+ diff = [i for i in self.to_list() if i not in right_list]
737
+ return int_range(diff)
738
+
739
+ def __mul__(self, right):
740
+ r"""
741
+ Return the intersection of ``self`` and ``right``.
742
+
743
+ INPUT:
744
+
745
+ - ``right`` -- an instance of ``int_range``
746
+
747
+ OUTPUT: an instance of ``int_range``
748
+
749
+ EXAMPLES::
750
+
751
+ sage: from sage.matrix.strassen import int_range
752
+ sage: I = int_range([1,2,3,4,5])
753
+ sage: J = int_range([6,20,21,4,5,22,23])
754
+ sage: J * I
755
+ [(4, 2)]
756
+ """
757
+ self_list = set(self.to_list())
758
+ intersection = [i for i in right.to_list() if i in self_list]
759
+ return int_range(intersection)
760
+
761
+
762
+ # Useful test code:
763
+ def test(n, m, R, c=2):
764
+ r"""
765
+ Test code for the Strassen algorithm.
766
+
767
+ INPUT:
768
+
769
+ - ``n`` -- integer
770
+ - ``m`` -- integer
771
+ - ``R`` -- ring
772
+ - ``c`` -- integer (default: 2)
773
+
774
+ EXAMPLES::
775
+
776
+ sage: from sage.matrix.strassen import test
777
+ sage: for n in range(5):
778
+ ....: print("{} {}".format(n, test(2*n,n,Frac(QQ['x']),2)))
779
+ 0 True
780
+ 1 True
781
+ 2 True
782
+ 3 True
783
+ 4 True
784
+ """
785
+ from sage.matrix.constructor import matrix
786
+ A = matrix(R, n, m, range(n * m))
787
+ B = A.__copy__()
788
+ B._echelon_in_place_classical()
789
+ C = A.__copy__()
790
+ C._echelon_strassen(c)
791
+ return B == C
792
+
793
+
794
+ # This stuff gets tested extensively elsewhere, and the functions
795
+ # below aren't callable now without using Pyrex.
796
+
797
+
798
+ # todo: doc cutoff parameter as soon as I work out what it really means
799
+
800
+ # EXAMPLES:
801
+
802
+ # The following matrix dimensions are chosen especially to exercise the
803
+ # eight possible parity combinations that could occur while subdividing
804
+ # the matrix in the strassen recursion. The base case in both cases will
805
+ # be a (4x5) matrix times a (5x6) matrix.
806
+
807
+ # TODO -- the doctests below are currently not
808
+ # tested/enabled/working -- enable them when linear algebra
809
+ # restructuring gets going.
810
+
811
+ # sage: dim1 = 64; dim2 = 83; dim3 = 101
812
+ # sage: R = MatrixSpace(QQ, dim1, dim2)
813
+ # sage: S = MatrixSpace(QQ, dim2, dim3)
814
+ # sage: T = MatrixSpace(QQ, dim1, dim3)
815
+
816
+
817
+ # sage: A = R.random_element(range(-30, 30))
818
+ # sage: B = S.random_element(range(-30, 30))
819
+ # sage: C = T(0)
820
+ # sage: D = T(0)
821
+
822
+ # sage: A_window = A.matrix_window(0, 0, dim1, dim2)
823
+ # sage: B_window = B.matrix_window(0, 0, dim2, dim3)
824
+ # sage: C_window = C.matrix_window(0, 0, dim1, dim3)
825
+ # sage: D_window = D.matrix_window(0, 0, dim1, dim3)
826
+
827
+ # sage: from sage.matrix.strassen import strassen_window_multiply
828
+ # sage: strassen_window_multiply(C_window, A_window, B_window, 2) # use strassen method
829
+ # sage: D_window.set_to_prod(A_window, B_window) # use naive method
830
+ # sage: C_window == D_window
831
+ # True
832
+
833
+ # sage: dim1 = 79; dim2 = 83; dim3 = 101
834
+ # sage: R = MatrixSpace(QQ, dim1, dim2)
835
+ # sage: S = MatrixSpace(QQ, dim2, dim3)
836
+ # sage: T = MatrixSpace(QQ, dim1, dim3)
837
+
838
+ # sage: A = R.random_element(range(30))
839
+ # sage: B = S.random_element(range(30))
840
+ # sage: C = T(0)
841
+ # sage: D = T(0)
842
+
843
+ # sage: A_window = A.matrix_window(0, 0, dim1, dim2)
844
+ # sage: B_window = B.matrix_window(0, 0, dim2, dim3)
845
+ # sage: C_window = C.matrix_window(0, 0, dim1, dim3)
846
+
847
+ # sage: strassen_window_multiply(C, A, B, 2) # use strassen method
848
+ # sage: D.set_to_prod(A, B) # use naive method
849
+
850
+ # sage: C == D
851
+ # True