passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl

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

Potentially problematic release.


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

Files changed (807) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
  12. sage/algebras/all__sagemath_modules.py +20 -0
  13. sage/algebras/catalog.py +148 -0
  14. sage/algebras/clifford_algebra.py +3107 -0
  15. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  16. sage/algebras/clifford_algebra_element.pxd +16 -0
  17. sage/algebras/clifford_algebra_element.pyx +997 -0
  18. sage/algebras/commutative_dga.py +4252 -0
  19. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
  20. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  21. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  22. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  29. sage/algebras/finite_gca.py +528 -0
  30. sage/algebras/group_algebra.py +232 -0
  31. sage/algebras/lie_algebras/abelian.py +197 -0
  32. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  33. sage/algebras/lie_algebras/all.py +25 -0
  34. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  35. sage/algebras/lie_algebras/bch.py +177 -0
  36. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  37. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  38. sage/algebras/lie_algebras/center_uea.py +767 -0
  39. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  40. sage/algebras/lie_algebras/examples.py +683 -0
  41. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  42. sage/algebras/lie_algebras/heisenberg.py +820 -0
  43. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  47. sage/algebras/lie_algebras/morphism.py +661 -0
  48. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  49. sage/algebras/lie_algebras/onsager.py +1324 -0
  50. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  51. sage/algebras/lie_algebras/quotient.py +462 -0
  52. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  53. sage/algebras/lie_algebras/representation.py +1040 -0
  54. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  55. sage/algebras/lie_algebras/subalgebra.py +967 -0
  56. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  57. sage/algebras/lie_algebras/verma_module.py +1630 -0
  58. sage/algebras/lie_algebras/virasoro.py +1186 -0
  59. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
  60. sage/algebras/octonion_algebra.pxd +20 -0
  61. sage/algebras/octonion_algebra.pyx +987 -0
  62. sage/algebras/orlik_solomon.py +907 -0
  63. sage/algebras/orlik_terao.py +779 -0
  64. sage/algebras/steenrod/all.py +7 -0
  65. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  66. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  67. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  68. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  69. sage/algebras/weyl_algebra.py +1126 -0
  70. sage/all__sagemath_modules.py +62 -0
  71. sage/calculus/all__sagemath_modules.py +19 -0
  72. sage/calculus/expr.py +205 -0
  73. sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
  84. sage/calculus/riemann.pyx +1521 -0
  85. sage/calculus/test_sympy.py +201 -0
  86. sage/calculus/transforms/all.py +7 -0
  87. sage/calculus/transforms/dft.py +844 -0
  88. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
  89. sage/calculus/transforms/dwt.pxd +7 -0
  90. sage/calculus/transforms/dwt.pyx +160 -0
  91. sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
  92. sage/calculus/transforms/fft.pxd +12 -0
  93. sage/calculus/transforms/fft.pyx +487 -0
  94. sage/calculus/wester.py +662 -0
  95. sage/coding/abstract_code.py +1108 -0
  96. sage/coding/ag_code.py +868 -0
  97. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
  98. sage/coding/ag_code_decoders.pyx +2639 -0
  99. sage/coding/all.py +15 -0
  100. sage/coding/bch_code.py +494 -0
  101. sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
  102. sage/coding/binary_code.pxd +124 -0
  103. sage/coding/binary_code.pyx +4139 -0
  104. sage/coding/bounds_catalog.py +43 -0
  105. sage/coding/channel.py +819 -0
  106. sage/coding/channels_catalog.py +29 -0
  107. sage/coding/code_bounds.py +755 -0
  108. sage/coding/code_constructions.py +804 -0
  109. sage/coding/codes_catalog.py +111 -0
  110. sage/coding/cyclic_code.py +1329 -0
  111. sage/coding/databases.py +316 -0
  112. sage/coding/decoder.py +373 -0
  113. sage/coding/decoders_catalog.py +88 -0
  114. sage/coding/delsarte_bounds.py +709 -0
  115. sage/coding/encoder.py +390 -0
  116. sage/coding/encoders_catalog.py +64 -0
  117. sage/coding/extended_code.py +468 -0
  118. sage/coding/gabidulin_code.py +1058 -0
  119. sage/coding/golay_code.py +404 -0
  120. sage/coding/goppa_code.py +441 -0
  121. sage/coding/grs_code.py +2371 -0
  122. sage/coding/guava.py +107 -0
  123. sage/coding/guruswami_sudan/all.py +1 -0
  124. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  125. sage/coding/guruswami_sudan/interpolation.py +409 -0
  126. sage/coding/guruswami_sudan/utils.py +176 -0
  127. sage/coding/hamming_code.py +176 -0
  128. sage/coding/information_set_decoder.py +1032 -0
  129. sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
  130. sage/coding/kasami_codes.pyx +351 -0
  131. sage/coding/linear_code.py +3067 -0
  132. sage/coding/linear_code_no_metric.py +1354 -0
  133. sage/coding/linear_rank_metric.py +961 -0
  134. sage/coding/parity_check_code.py +353 -0
  135. sage/coding/punctured_code.py +719 -0
  136. sage/coding/reed_muller_code.py +999 -0
  137. sage/coding/self_dual_codes.py +942 -0
  138. sage/coding/source_coding/all.py +2 -0
  139. sage/coding/source_coding/huffman.py +553 -0
  140. sage/coding/subfield_subcode.py +423 -0
  141. sage/coding/two_weight_db.py +399 -0
  142. sage/combinat/all__sagemath_modules.py +7 -0
  143. sage/combinat/cartesian_product.py +347 -0
  144. sage/combinat/family.py +11 -0
  145. sage/combinat/free_module.py +1977 -0
  146. sage/combinat/root_system/all.py +147 -0
  147. sage/combinat/root_system/ambient_space.py +527 -0
  148. sage/combinat/root_system/associahedron.py +471 -0
  149. sage/combinat/root_system/braid_move_calculator.py +143 -0
  150. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
  151. sage/combinat/root_system/braid_orbit.pyx +144 -0
  152. sage/combinat/root_system/branching_rules.py +2301 -0
  153. sage/combinat/root_system/cartan_matrix.py +1245 -0
  154. sage/combinat/root_system/cartan_type.py +3069 -0
  155. sage/combinat/root_system/coxeter_group.py +162 -0
  156. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  157. sage/combinat/root_system/coxeter_type.py +681 -0
  158. sage/combinat/root_system/dynkin_diagram.py +900 -0
  159. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  160. sage/combinat/root_system/fundamental_group.py +795 -0
  161. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  162. sage/combinat/root_system/integrable_representations.py +1227 -0
  163. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  164. sage/combinat/root_system/pieri_factors.py +1147 -0
  165. sage/combinat/root_system/plot.py +1615 -0
  166. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  167. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  168. sage/combinat/root_system/root_space.py +487 -0
  169. sage/combinat/root_system/root_system.py +882 -0
  170. sage/combinat/root_system/type_A.py +348 -0
  171. sage/combinat/root_system/type_A_affine.py +227 -0
  172. sage/combinat/root_system/type_A_infinity.py +241 -0
  173. sage/combinat/root_system/type_B.py +347 -0
  174. sage/combinat/root_system/type_BC_affine.py +287 -0
  175. sage/combinat/root_system/type_B_affine.py +216 -0
  176. sage/combinat/root_system/type_C.py +317 -0
  177. sage/combinat/root_system/type_C_affine.py +188 -0
  178. sage/combinat/root_system/type_D.py +357 -0
  179. sage/combinat/root_system/type_D_affine.py +208 -0
  180. sage/combinat/root_system/type_E.py +641 -0
  181. sage/combinat/root_system/type_E_affine.py +231 -0
  182. sage/combinat/root_system/type_F.py +387 -0
  183. sage/combinat/root_system/type_F_affine.py +137 -0
  184. sage/combinat/root_system/type_G.py +293 -0
  185. sage/combinat/root_system/type_G_affine.py +132 -0
  186. sage/combinat/root_system/type_H.py +105 -0
  187. sage/combinat/root_system/type_I.py +110 -0
  188. sage/combinat/root_system/type_Q.py +150 -0
  189. sage/combinat/root_system/type_affine.py +509 -0
  190. sage/combinat/root_system/type_dual.py +704 -0
  191. sage/combinat/root_system/type_folded.py +301 -0
  192. sage/combinat/root_system/type_marked.py +748 -0
  193. sage/combinat/root_system/type_reducible.py +601 -0
  194. sage/combinat/root_system/type_relabel.py +730 -0
  195. sage/combinat/root_system/type_super_A.py +837 -0
  196. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  197. sage/combinat/root_system/weight_space.py +639 -0
  198. sage/combinat/root_system/weyl_characters.py +2238 -0
  199. sage/crypto/__init__.py +4 -0
  200. sage/crypto/all.py +28 -0
  201. sage/crypto/block_cipher/all.py +7 -0
  202. sage/crypto/block_cipher/des.py +1065 -0
  203. sage/crypto/block_cipher/miniaes.py +2171 -0
  204. sage/crypto/block_cipher/present.py +909 -0
  205. sage/crypto/block_cipher/sdes.py +1527 -0
  206. sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
  207. sage/crypto/boolean_function.pxd +10 -0
  208. sage/crypto/boolean_function.pyx +1487 -0
  209. sage/crypto/cipher.py +78 -0
  210. sage/crypto/classical.py +3668 -0
  211. sage/crypto/classical_cipher.py +569 -0
  212. sage/crypto/cryptosystem.py +387 -0
  213. sage/crypto/key_exchange/all.py +7 -0
  214. sage/crypto/key_exchange/catalog.py +24 -0
  215. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  216. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  217. sage/crypto/lattice.py +312 -0
  218. sage/crypto/lfsr.py +295 -0
  219. sage/crypto/lwe.py +840 -0
  220. sage/crypto/mq/__init__.py +4 -0
  221. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  222. sage/crypto/mq/rijndael_gf.py +2345 -0
  223. sage/crypto/mq/sbox.py +7 -0
  224. sage/crypto/mq/sr.py +3344 -0
  225. sage/crypto/public_key/all.py +5 -0
  226. sage/crypto/public_key/blum_goldwasser.py +776 -0
  227. sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
  228. sage/crypto/sbox.pyx +2090 -0
  229. sage/crypto/sboxes.py +2090 -0
  230. sage/crypto/stream.py +390 -0
  231. sage/crypto/stream_cipher.py +297 -0
  232. sage/crypto/util.py +519 -0
  233. sage/ext/all__sagemath_modules.py +1 -0
  234. sage/ext/interpreters/__init__.py +1 -0
  235. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  236. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
  237. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  238. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  239. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
  240. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  241. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  242. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
  243. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  244. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  245. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
  246. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  247. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  248. sage/geometry/all__sagemath_modules.py +5 -0
  249. sage/geometry/toric_lattice.py +1745 -0
  250. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
  251. sage/geometry/toric_lattice_element.pyx +432 -0
  252. sage/groups/abelian_gps/abelian_group.py +1925 -0
  253. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  254. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  255. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  256. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  257. sage/groups/abelian_gps/element_base.py +341 -0
  258. sage/groups/abelian_gps/values.py +488 -0
  259. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  260. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  261. sage/groups/additive_abelian/all.py +4 -0
  262. sage/groups/additive_abelian/qmodnz.py +231 -0
  263. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  264. sage/groups/affine_gps/affine_group.py +535 -0
  265. sage/groups/affine_gps/all.py +1 -0
  266. sage/groups/affine_gps/catalog.py +17 -0
  267. sage/groups/affine_gps/euclidean_group.py +246 -0
  268. sage/groups/affine_gps/group_element.py +562 -0
  269. sage/groups/all__sagemath_modules.py +12 -0
  270. sage/groups/galois_group.py +479 -0
  271. sage/groups/matrix_gps/all.py +4 -0
  272. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  273. sage/groups/matrix_gps/catalog.py +26 -0
  274. sage/groups/matrix_gps/coxeter_group.py +927 -0
  275. sage/groups/matrix_gps/finitely_generated.py +487 -0
  276. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
  277. sage/groups/matrix_gps/group_element.pxd +11 -0
  278. sage/groups/matrix_gps/group_element.pyx +431 -0
  279. sage/groups/matrix_gps/linear.py +440 -0
  280. sage/groups/matrix_gps/matrix_group.py +617 -0
  281. sage/groups/matrix_gps/named_group.py +296 -0
  282. sage/groups/matrix_gps/orthogonal.py +544 -0
  283. sage/groups/matrix_gps/symplectic.py +251 -0
  284. sage/groups/matrix_gps/unitary.py +436 -0
  285. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  286. sage/groups/misc_gps/argument_groups.py +1905 -0
  287. sage/groups/misc_gps/imaginary_groups.py +479 -0
  288. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  296. sage/homology/algebraic_topological_model.py +595 -0
  297. sage/homology/all.py +2 -0
  298. sage/homology/all__sagemath_modules.py +8 -0
  299. sage/homology/chain_complex.py +2148 -0
  300. sage/homology/chain_complex_homspace.py +165 -0
  301. sage/homology/chain_complex_morphism.py +629 -0
  302. sage/homology/chain_homotopy.py +604 -0
  303. sage/homology/chains.py +653 -0
  304. sage/homology/free_resolution.py +923 -0
  305. sage/homology/graded_resolution.py +567 -0
  306. sage/homology/hochschild_complex.py +756 -0
  307. sage/homology/homology_group.py +188 -0
  308. sage/homology/homology_morphism.py +422 -0
  309. sage/homology/homology_vector_space_with_basis.py +1454 -0
  310. sage/homology/koszul_complex.py +169 -0
  311. sage/homology/matrix_utils.py +205 -0
  312. sage/libs/all__sagemath_modules.py +1 -0
  313. sage/libs/gsl/__init__.py +1 -0
  314. sage/libs/gsl/airy.pxd +56 -0
  315. sage/libs/gsl/all.pxd +66 -0
  316. sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
  317. sage/libs/gsl/array.pxd +5 -0
  318. sage/libs/gsl/array.pyx +102 -0
  319. sage/libs/gsl/bessel.pxd +208 -0
  320. sage/libs/gsl/blas.pxd +116 -0
  321. sage/libs/gsl/blas_types.pxd +34 -0
  322. sage/libs/gsl/block.pxd +52 -0
  323. sage/libs/gsl/chebyshev.pxd +37 -0
  324. sage/libs/gsl/clausen.pxd +12 -0
  325. sage/libs/gsl/combination.pxd +47 -0
  326. sage/libs/gsl/complex.pxd +151 -0
  327. sage/libs/gsl/coulomb.pxd +30 -0
  328. sage/libs/gsl/coupling.pxd +21 -0
  329. sage/libs/gsl/dawson.pxd +12 -0
  330. sage/libs/gsl/debye.pxd +24 -0
  331. sage/libs/gsl/dilog.pxd +14 -0
  332. sage/libs/gsl/eigen.pxd +46 -0
  333. sage/libs/gsl/elementary.pxd +12 -0
  334. sage/libs/gsl/ellint.pxd +48 -0
  335. sage/libs/gsl/elljac.pxd +8 -0
  336. sage/libs/gsl/erf.pxd +32 -0
  337. sage/libs/gsl/errno.pxd +26 -0
  338. sage/libs/gsl/exp.pxd +44 -0
  339. sage/libs/gsl/expint.pxd +44 -0
  340. sage/libs/gsl/fermi_dirac.pxd +44 -0
  341. sage/libs/gsl/fft.pxd +121 -0
  342. sage/libs/gsl/fit.pxd +50 -0
  343. sage/libs/gsl/gamma.pxd +94 -0
  344. sage/libs/gsl/gegenbauer.pxd +26 -0
  345. sage/libs/gsl/histogram.pxd +176 -0
  346. sage/libs/gsl/hyperg.pxd +52 -0
  347. sage/libs/gsl/integration.pxd +69 -0
  348. sage/libs/gsl/interp.pxd +109 -0
  349. sage/libs/gsl/laguerre.pxd +24 -0
  350. sage/libs/gsl/lambert.pxd +16 -0
  351. sage/libs/gsl/legendre.pxd +90 -0
  352. sage/libs/gsl/linalg.pxd +185 -0
  353. sage/libs/gsl/log.pxd +26 -0
  354. sage/libs/gsl/math.pxd +43 -0
  355. sage/libs/gsl/matrix.pxd +143 -0
  356. sage/libs/gsl/matrix_complex.pxd +130 -0
  357. sage/libs/gsl/min.pxd +67 -0
  358. sage/libs/gsl/monte.pxd +56 -0
  359. sage/libs/gsl/ntuple.pxd +32 -0
  360. sage/libs/gsl/odeiv.pxd +70 -0
  361. sage/libs/gsl/permutation.pxd +78 -0
  362. sage/libs/gsl/poly.pxd +40 -0
  363. sage/libs/gsl/pow_int.pxd +12 -0
  364. sage/libs/gsl/psi.pxd +28 -0
  365. sage/libs/gsl/qrng.pxd +29 -0
  366. sage/libs/gsl/random.pxd +257 -0
  367. sage/libs/gsl/rng.pxd +100 -0
  368. sage/libs/gsl/roots.pxd +72 -0
  369. sage/libs/gsl/sort.pxd +36 -0
  370. sage/libs/gsl/statistics.pxd +59 -0
  371. sage/libs/gsl/sum.pxd +55 -0
  372. sage/libs/gsl/synchrotron.pxd +16 -0
  373. sage/libs/gsl/transport.pxd +24 -0
  374. sage/libs/gsl/trig.pxd +58 -0
  375. sage/libs/gsl/types.pxd +137 -0
  376. sage/libs/gsl/vector.pxd +101 -0
  377. sage/libs/gsl/vector_complex.pxd +83 -0
  378. sage/libs/gsl/wavelet.pxd +49 -0
  379. sage/libs/gsl/zeta.pxd +28 -0
  380. sage/libs/mpc/__init__.pxd +114 -0
  381. sage/libs/mpc/types.pxd +28 -0
  382. sage/libs/mpfr/__init__.pxd +299 -0
  383. sage/libs/mpfr/types.pxd +26 -0
  384. sage/libs/mpmath/__init__.py +1 -0
  385. sage/libs/mpmath/all.py +27 -0
  386. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  387. sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
  388. sage/libs/mpmath/utils.pxd +4 -0
  389. sage/libs/mpmath/utils.pyx +319 -0
  390. sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
  391. sage/matrix/action.pxd +26 -0
  392. sage/matrix/action.pyx +596 -0
  393. sage/matrix/all.py +9 -0
  394. sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
  395. sage/matrix/args.pxd +144 -0
  396. sage/matrix/args.pyx +1668 -0
  397. sage/matrix/benchmark.py +1258 -0
  398. sage/matrix/berlekamp_massey.py +95 -0
  399. sage/matrix/compute_J_ideal.py +926 -0
  400. sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
  416. sage/matrix/matrix_cdv.pxd +4 -0
  417. sage/matrix/matrix_cdv.pyx +93 -0
  418. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  419. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  420. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  421. sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
  422. sage/matrix/matrix_dense.pxd +5 -0
  423. sage/matrix/matrix_dense.pyx +343 -0
  424. sage/matrix/matrix_domain_dense.pxd +5 -0
  425. sage/matrix/matrix_domain_sparse.pxd +5 -0
  426. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  427. sage/matrix/matrix_double_dense.pxd +7 -0
  428. sage/matrix/matrix_double_dense.pyx +3906 -0
  429. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  430. sage/matrix/matrix_double_sparse.pxd +6 -0
  431. sage/matrix/matrix_double_sparse.pyx +248 -0
  432. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
  433. sage/matrix/matrix_generic_dense.pxd +7 -0
  434. sage/matrix/matrix_generic_dense.pyx +354 -0
  435. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  436. sage/matrix/matrix_generic_sparse.pxd +7 -0
  437. sage/matrix/matrix_generic_sparse.pyx +461 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  441. sage/matrix/matrix_misc.py +313 -0
  442. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  443. sage/matrix/matrix_numpy_dense.pxd +14 -0
  444. sage/matrix/matrix_numpy_dense.pyx +450 -0
  445. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  446. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  447. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  448. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  449. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  450. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  451. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  452. sage/matrix/matrix_real_double_dense.pxd +7 -0
  453. sage/matrix/matrix_real_double_dense.pyx +122 -0
  454. sage/matrix/matrix_space.py +2848 -0
  455. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  456. sage/matrix/matrix_sparse.pxd +5 -0
  457. sage/matrix/matrix_sparse.pyx +1222 -0
  458. sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
  459. sage/matrix/matrix_window.pxd +37 -0
  460. sage/matrix/matrix_window.pyx +242 -0
  461. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  462. sage/matrix/misc_mpfr.pyx +80 -0
  463. sage/matrix/operation_table.py +1182 -0
  464. sage/matrix/special.py +3666 -0
  465. sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
  466. sage/matrix/strassen.pyx +851 -0
  467. sage/matrix/symplectic_basis.py +541 -0
  468. sage/matrix/template.pxd +6 -0
  469. sage/matrix/tests.py +71 -0
  470. sage/matroids/advanced.py +77 -0
  471. sage/matroids/all.py +13 -0
  472. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  473. sage/matroids/basis_exchange_matroid.pxd +96 -0
  474. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  475. sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  476. sage/matroids/basis_matroid.pxd +45 -0
  477. sage/matroids/basis_matroid.pyx +1217 -0
  478. sage/matroids/catalog.py +44 -0
  479. sage/matroids/chow_ring.py +473 -0
  480. sage/matroids/chow_ring_ideal.py +849 -0
  481. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  482. sage/matroids/circuit_closures_matroid.pxd +16 -0
  483. sage/matroids/circuit_closures_matroid.pyx +559 -0
  484. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  485. sage/matroids/circuits_matroid.pxd +38 -0
  486. sage/matroids/circuits_matroid.pyx +947 -0
  487. sage/matroids/constructor.py +1086 -0
  488. sage/matroids/database_collections.py +365 -0
  489. sage/matroids/database_matroids.py +5338 -0
  490. sage/matroids/dual_matroid.py +583 -0
  491. sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  495. sage/matroids/flats_matroid.pxd +28 -0
  496. sage/matroids/flats_matroid.pyx +715 -0
  497. sage/matroids/gammoid.py +600 -0
  498. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  499. sage/matroids/graphic_matroid.pxd +39 -0
  500. sage/matroids/graphic_matroid.pyx +2024 -0
  501. sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  502. sage/matroids/lean_matrix.pxd +126 -0
  503. sage/matroids/lean_matrix.pyx +3667 -0
  504. sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  505. sage/matroids/linear_matroid.pxd +180 -0
  506. sage/matroids/linear_matroid.pyx +6649 -0
  507. sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
  508. sage/matroids/matroid.pxd +243 -0
  509. sage/matroids/matroid.pyx +8759 -0
  510. sage/matroids/matroids_catalog.py +190 -0
  511. sage/matroids/matroids_plot_helpers.py +890 -0
  512. sage/matroids/minor_matroid.py +480 -0
  513. sage/matroids/minorfix.h +9 -0
  514. sage/matroids/named_matroids.py +5 -0
  515. sage/matroids/rank_matroid.py +268 -0
  516. sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
  517. sage/matroids/set_system.pxd +38 -0
  518. sage/matroids/set_system.pyx +800 -0
  519. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  520. sage/matroids/transversal_matroid.pxd +14 -0
  521. sage/matroids/transversal_matroid.pyx +893 -0
  522. sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  523. sage/matroids/union_matroid.pxd +20 -0
  524. sage/matroids/union_matroid.pyx +331 -0
  525. sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
  526. sage/matroids/unpickling.pyx +843 -0
  527. sage/matroids/utilities.py +809 -0
  528. sage/misc/all__sagemath_modules.py +20 -0
  529. sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
  530. sage/misc/c3.pyx +238 -0
  531. sage/misc/compat.py +87 -0
  532. sage/misc/element_with_label.py +173 -0
  533. sage/misc/func_persist.py +79 -0
  534. sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
  535. sage/misc/pickle_old.pyx +19 -0
  536. sage/misc/proof.py +7 -0
  537. sage/misc/replace_dot_all.py +472 -0
  538. sage/misc/sagedoc_conf.py +168 -0
  539. sage/misc/sphinxify.py +167 -0
  540. sage/misc/test_class_pickling.py +85 -0
  541. sage/modules/all.py +42 -0
  542. sage/modules/complex_double_vector.py +25 -0
  543. sage/modules/diamond_cutting.py +380 -0
  544. sage/modules/fg_pid/all.py +1 -0
  545. sage/modules/fg_pid/fgp_element.py +456 -0
  546. sage/modules/fg_pid/fgp_module.py +2091 -0
  547. sage/modules/fg_pid/fgp_morphism.py +550 -0
  548. sage/modules/filtered_vector_space.py +1271 -0
  549. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
  550. sage/modules/finite_submodule_iter.pxd +27 -0
  551. sage/modules/finite_submodule_iter.pyx +452 -0
  552. sage/modules/fp_graded/all.py +1 -0
  553. sage/modules/fp_graded/element.py +346 -0
  554. sage/modules/fp_graded/free_element.py +298 -0
  555. sage/modules/fp_graded/free_homspace.py +53 -0
  556. sage/modules/fp_graded/free_module.py +1060 -0
  557. sage/modules/fp_graded/free_morphism.py +217 -0
  558. sage/modules/fp_graded/homspace.py +563 -0
  559. sage/modules/fp_graded/module.py +1340 -0
  560. sage/modules/fp_graded/morphism.py +1990 -0
  561. sage/modules/fp_graded/steenrod/all.py +1 -0
  562. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  563. sage/modules/fp_graded/steenrod/module.py +477 -0
  564. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  565. sage/modules/fp_graded/steenrod/profile.py +241 -0
  566. sage/modules/free_module.py +8447 -0
  567. sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
  568. sage/modules/free_module_element.pxd +22 -0
  569. sage/modules/free_module_element.pyx +5445 -0
  570. sage/modules/free_module_homspace.py +369 -0
  571. sage/modules/free_module_integer.py +896 -0
  572. sage/modules/free_module_morphism.py +823 -0
  573. sage/modules/free_module_pseudohomspace.py +352 -0
  574. sage/modules/free_module_pseudomorphism.py +578 -0
  575. sage/modules/free_quadratic_module.py +1706 -0
  576. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  577. sage/modules/matrix_morphism.py +1745 -0
  578. sage/modules/misc.py +103 -0
  579. sage/modules/module_functors.py +192 -0
  580. sage/modules/multi_filtered_vector_space.py +719 -0
  581. sage/modules/ore_module.py +2208 -0
  582. sage/modules/ore_module_element.py +178 -0
  583. sage/modules/ore_module_homspace.py +147 -0
  584. sage/modules/ore_module_morphism.py +968 -0
  585. sage/modules/quotient_module.py +699 -0
  586. sage/modules/real_double_vector.py +22 -0
  587. sage/modules/submodule.py +255 -0
  588. sage/modules/tensor_operations.py +567 -0
  589. sage/modules/torsion_quadratic_module.py +1352 -0
  590. sage/modules/tutorial_free_modules.py +248 -0
  591. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  592. sage/modules/vector_complex_double_dense.pxd +6 -0
  593. sage/modules/vector_complex_double_dense.pyx +117 -0
  594. sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  595. sage/modules/vector_double_dense.pxd +6 -0
  596. sage/modules/vector_double_dense.pyx +604 -0
  597. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  598. sage/modules/vector_integer_dense.pxd +15 -0
  599. sage/modules/vector_integer_dense.pyx +361 -0
  600. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  601. sage/modules/vector_integer_sparse.pxd +29 -0
  602. sage/modules/vector_integer_sparse.pyx +406 -0
  603. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
  604. sage/modules/vector_modn_dense.pxd +12 -0
  605. sage/modules/vector_modn_dense.pyx +394 -0
  606. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  607. sage/modules/vector_modn_sparse.pxd +21 -0
  608. sage/modules/vector_modn_sparse.pyx +298 -0
  609. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  610. sage/modules/vector_numpy_dense.pxd +15 -0
  611. sage/modules/vector_numpy_dense.pyx +304 -0
  612. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  613. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  614. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  615. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
  616. sage/modules/vector_rational_dense.pxd +15 -0
  617. sage/modules/vector_rational_dense.pyx +387 -0
  618. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  619. sage/modules/vector_rational_sparse.pxd +30 -0
  620. sage/modules/vector_rational_sparse.pyx +413 -0
  621. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  622. sage/modules/vector_real_double_dense.pxd +6 -0
  623. sage/modules/vector_real_double_dense.pyx +126 -0
  624. sage/modules/vector_space_homspace.py +430 -0
  625. sage/modules/vector_space_morphism.py +989 -0
  626. sage/modules/with_basis/all.py +15 -0
  627. sage/modules/with_basis/cell_module.py +494 -0
  628. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
  629. sage/modules/with_basis/indexed_element.pxd +13 -0
  630. sage/modules/with_basis/indexed_element.pyx +1058 -0
  631. sage/modules/with_basis/invariant.py +1075 -0
  632. sage/modules/with_basis/morphism.py +1636 -0
  633. sage/modules/with_basis/representation.py +2939 -0
  634. sage/modules/with_basis/subquotient.py +685 -0
  635. sage/numerical/all__sagemath_modules.py +6 -0
  636. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
  637. sage/numerical/gauss_legendre.pyx +381 -0
  638. sage/numerical/optimize.py +910 -0
  639. sage/probability/all.py +10 -0
  640. sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
  641. sage/probability/probability_distribution.pyx +1242 -0
  642. sage/probability/random_variable.py +411 -0
  643. sage/quadratic_forms/all.py +4 -0
  644. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  645. sage/quadratic_forms/binary_qf.py +2042 -0
  646. sage/quadratic_forms/bqf_class_group.py +748 -0
  647. sage/quadratic_forms/constructions.py +93 -0
  648. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
  649. sage/quadratic_forms/count_local_2.pyx +365 -0
  650. sage/quadratic_forms/extras.py +195 -0
  651. sage/quadratic_forms/quadratic_form.py +1753 -0
  652. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  653. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  656. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  657. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  658. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  659. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  660. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  661. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  662. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  663. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  664. sage/quadratic_forms/random_quadraticform.py +209 -0
  665. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
  666. sage/quadratic_forms/ternary.pyx +1154 -0
  667. sage/quadratic_forms/ternary_qf.py +2027 -0
  668. sage/rings/all__sagemath_modules.py +28 -0
  669. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  670. sage/rings/asymptotic/misc.py +1252 -0
  671. sage/rings/cc.py +4 -0
  672. sage/rings/cfinite_sequence.py +1306 -0
  673. sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  674. sage/rings/complex_conversion.pxd +8 -0
  675. sage/rings/complex_conversion.pyx +23 -0
  676. sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
  677. sage/rings/complex_double.pxd +21 -0
  678. sage/rings/complex_double.pyx +2654 -0
  679. sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
  680. sage/rings/complex_mpc.pxd +21 -0
  681. sage/rings/complex_mpc.pyx +2576 -0
  682. sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  683. sage/rings/complex_mpfr.pxd +18 -0
  684. sage/rings/complex_mpfr.pyx +3602 -0
  685. sage/rings/derivation.py +2334 -0
  686. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  687. sage/rings/finite_rings/maps_finite_field.py +191 -0
  688. sage/rings/function_field/all__sagemath_modules.py +8 -0
  689. sage/rings/function_field/derivations.py +102 -0
  690. sage/rings/function_field/derivations_rational.py +132 -0
  691. sage/rings/function_field/differential.py +853 -0
  692. sage/rings/function_field/divisor.py +1107 -0
  693. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  694. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  695. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  696. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  697. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  698. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  699. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  700. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
  703. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  704. sage/rings/invariants/all.py +4 -0
  705. sage/rings/invariants/invariant_theory.py +4597 -0
  706. sage/rings/invariants/reconstruction.py +395 -0
  707. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  708. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  712. sage/rings/polynomial/ore_function_element.py +952 -0
  713. sage/rings/polynomial/ore_function_field.py +1028 -0
  714. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  715. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  716. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  717. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  720. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  721. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  722. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  723. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  730. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  731. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
  732. sage/rings/real_double_element_gsl.pxd +8 -0
  733. sage/rings/real_double_element_gsl.pyx +794 -0
  734. sage/rings/real_field.py +58 -0
  735. sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  736. sage/rings/real_mpfr.pxd +29 -0
  737. sage/rings/real_mpfr.pyx +6122 -0
  738. sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
  739. sage/rings/ring_extension.pxd +42 -0
  740. sage/rings/ring_extension.pyx +2779 -0
  741. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  742. sage/rings/ring_extension_conversion.pxd +16 -0
  743. sage/rings/ring_extension_conversion.pyx +462 -0
  744. sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
  745. sage/rings/ring_extension_element.pxd +21 -0
  746. sage/rings/ring_extension_element.pyx +1635 -0
  747. sage/rings/ring_extension_homset.py +64 -0
  748. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
  749. sage/rings/ring_extension_morphism.pxd +35 -0
  750. sage/rings/ring_extension_morphism.pyx +920 -0
  751. sage/schemes/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/coherent_sheaf.py +300 -0
  754. sage/schemes/projective/cohomology.py +510 -0
  755. sage/stats/all.py +15 -0
  756. sage/stats/basic_stats.py +489 -0
  757. sage/stats/distributions/all.py +7 -0
  758. sage/stats/distributions/catalog.py +34 -0
  759. sage/stats/distributions/dgs.h +50 -0
  760. sage/stats/distributions/dgs.pxd +111 -0
  761. sage/stats/distributions/dgs_bern.h +400 -0
  762. sage/stats/distributions/dgs_gauss.h +614 -0
  763. sage/stats/distributions/dgs_misc.h +104 -0
  764. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  767. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  768. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  769. sage/stats/hmm/all.py +15 -0
  770. sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
  773. sage/stats/hmm/distributions.pxd +29 -0
  774. sage/stats/hmm/distributions.pyx +531 -0
  775. sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
  776. sage/stats/hmm/hmm.pxd +17 -0
  777. sage/stats/hmm/hmm.pyx +1388 -0
  778. sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
  779. sage/stats/hmm/util.pxd +7 -0
  780. sage/stats/hmm/util.pyx +165 -0
  781. sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
  782. sage/stats/intlist.pxd +14 -0
  783. sage/stats/intlist.pyx +588 -0
  784. sage/stats/r.py +49 -0
  785. sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
  786. sage/stats/time_series.pxd +6 -0
  787. sage/stats/time_series.pyx +2546 -0
  788. sage/tensor/all.py +2 -0
  789. sage/tensor/modules/all.py +8 -0
  790. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  791. sage/tensor/modules/comp.py +5598 -0
  792. sage/tensor/modules/ext_pow_free_module.py +824 -0
  793. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  794. sage/tensor/modules/format_utilities.py +333 -0
  795. sage/tensor/modules/free_module_alt_form.py +858 -0
  796. sage/tensor/modules/free_module_automorphism.py +1207 -0
  797. sage/tensor/modules/free_module_basis.py +1074 -0
  798. sage/tensor/modules/free_module_element.py +284 -0
  799. sage/tensor/modules/free_module_homset.py +652 -0
  800. sage/tensor/modules/free_module_linear_group.py +564 -0
  801. sage/tensor/modules/free_module_morphism.py +1581 -0
  802. sage/tensor/modules/free_module_tensor.py +3289 -0
  803. sage/tensor/modules/reflexive_module.py +386 -0
  804. sage/tensor/modules/tensor_free_module.py +780 -0
  805. sage/tensor/modules/tensor_free_submodule.py +538 -0
  806. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  807. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1222 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ Base class for sparse matrices
4
+ """
5
+ # ****************************************************************************
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 2 of the License, or
9
+ # (at your option) any later version.
10
+ # https://www.gnu.org/licenses/
11
+ # ****************************************************************************
12
+
13
+ cimport cython
14
+ from cysignals.memory cimport check_allocarray, sig_free
15
+ from cysignals.signals cimport sig_check
16
+
17
+ cimport sage.matrix.matrix as matrix
18
+ cimport sage.matrix.matrix0 as matrix0
19
+ from sage.categories.rings import Rings
20
+ from sage.structure.element cimport Element, Vector
21
+ from sage.structure.richcmp cimport richcmp_item, rich_to_bool
22
+
23
+ from cpython cimport *
24
+ from cpython.object cimport Py_EQ, Py_NE
25
+
26
+ import sage.matrix.matrix_space
27
+
28
+
29
+ cdef class Matrix_sparse(matrix.Matrix):
30
+
31
+ cdef bint is_sparse_c(self) noexcept:
32
+ return 1
33
+
34
+ cdef bint is_dense_c(self) noexcept:
35
+ return 0
36
+
37
+ def change_ring(self, ring):
38
+ """
39
+ Return the matrix obtained by coercing the entries of this matrix
40
+ into the given ring.
41
+
42
+ Always returns a copy (unless ``self`` is immutable, in which case
43
+ returns ``self``).
44
+
45
+ EXAMPLES::
46
+
47
+ sage: x = polygen(ZZ, 'x')
48
+ sage: A = matrix(QQ['x,y'], 2, [0,-1,2*x,-2], sparse=True); A
49
+ [ 0 -1]
50
+ [2*x -2]
51
+ sage: A.change_ring(QQ['x,y,z'])
52
+ [ 0 -1]
53
+ [2*x -2]
54
+
55
+ Subdivisions are preserved when changing rings::
56
+
57
+ sage: A.subdivide([2],[]); A
58
+ [ 0 -1]
59
+ [2*x -2]
60
+ [-------]
61
+ sage: A.change_ring(RR['x,y'])
62
+ [ 0 -1.00000000000000]
63
+ [2.00000000000000*x -2.00000000000000]
64
+ [-------------------------------------]
65
+ """
66
+ if ring not in Rings():
67
+ raise TypeError("input must be a ring")
68
+ if ring is self._base_ring:
69
+ if self._is_immutable:
70
+ return self
71
+ return self.__copy__()
72
+
73
+ M = sage.matrix.matrix_space.MatrixSpace(ring, self._nrows, self._ncols, sparse=self.is_sparse_c())
74
+ mat = M(self.dict(), coerce=True, copy=False)
75
+ if self._subdivisions is not None:
76
+ mat.subdivide(self.subdivisions())
77
+ return mat
78
+
79
+ def __copy__(self):
80
+ """
81
+ Return a copy of this matrix. Changing the entries of the copy will
82
+ not change the entries of this matrix.
83
+
84
+ EXAMPLES::
85
+
86
+ sage: A = matrix(QQ['x,y'], 2, [0,-1,2,-2], sparse=True); A
87
+ [ 0 -1]
88
+ [ 2 -2]
89
+ sage: B = copy(A); B
90
+ [ 0 -1]
91
+ [ 2 -2]
92
+ sage: B is A
93
+ False
94
+ sage: B[0,0]=10; B
95
+ [10 -1]
96
+ [ 2 -2]
97
+ sage: A
98
+ [ 0 -1]
99
+ [ 2 -2]
100
+ """
101
+ A = self.new_matrix(entries=self.dict(), coerce=False, copy=False)
102
+ if self._subdivisions is not None:
103
+ A.subdivide(*self.subdivisions())
104
+ return A
105
+
106
+ @cython.boundscheck(False)
107
+ @cython.wraparound(False)
108
+ cdef long _hash_(self) except -1:
109
+ """
110
+ Return the hash of this matrix.
111
+
112
+ Equal matrices should have equal hashes, even if one is sparse
113
+ and the other is dense. We also ensure that zero matrices hash
114
+ to zero and that scalar matrices have the same hash as the
115
+ scalar.
116
+
117
+ EXAMPLES::
118
+
119
+ sage: m = matrix(2, range(6), sparse=True)
120
+ sage: m.set_immutable()
121
+ sage: hash(m)
122
+ -154991009345361003 # 64-bit
123
+ -2003358827 # 32-bit
124
+
125
+ The sparse and dense hashes should agree::
126
+
127
+ sage: d = m.dense_matrix()
128
+ sage: d.set_immutable()
129
+ sage: hash(d) == hash(m)
130
+ True
131
+
132
+ ::
133
+
134
+ sage: A = Matrix(ZZ[['t']], 2, 2, range(4), sparse=True)
135
+ sage: hash(A)
136
+ Traceback (most recent call last):
137
+ ...
138
+ TypeError: mutable matrices are unhashable
139
+ sage: A.set_immutable()
140
+ sage: B = A.__copy__(); B.set_immutable()
141
+ sage: hash(A) == hash(B)
142
+ True
143
+
144
+ TESTS::
145
+
146
+ sage: R.<x> = ZZ[]
147
+ sage: M = matrix(R, 10, 20, sparse=True); M.set_immutable()
148
+ sage: hash(M)
149
+ 0
150
+ sage: M = matrix(R, 10, 10, x, sparse=True); M.set_immutable()
151
+ sage: hash(M) == hash(x)
152
+ True
153
+ """
154
+ cdef dict D = self._dict()
155
+ cdef long C[5]
156
+ self.get_hash_constants(C)
157
+
158
+ cdef long h = 0, k, l
159
+ cdef Py_ssize_t i, j
160
+ for ij, x in D.iteritems():
161
+ sig_check()
162
+ i = (<tuple>ij)[0]
163
+ j = (<tuple>ij)[1]
164
+ k = C[0] if i == 0 else C[1] + C[2] * i
165
+ l = C[3] * (i - j) * (i ^ j)
166
+ h += (k ^ l) * hash(x)
167
+ h *= C[4]
168
+
169
+ if h == -1:
170
+ return -2
171
+ return h
172
+
173
+ def _multiply_classical(Matrix_sparse left, Matrix_sparse right):
174
+ """
175
+ EXAMPLES::
176
+
177
+ sage: A = matrix(QQ['x,y'], 2, [0,-1,2,-2], sparse=True)
178
+ sage: type(A)
179
+ <class 'sage.matrix.matrix_generic_sparse.Matrix_generic_sparse'>
180
+ sage: B = matrix(QQ['x,y'], 2, [-1,-1,-2,-2], sparse=True)
181
+ sage: A * B
182
+ [2 2]
183
+ [2 2]
184
+ sage: B * A
185
+ [-2 3]
186
+ [-4 6]
187
+ """
188
+ cdef Py_ssize_t row, col, row_start, k1, k2, len_left, len_right, a, b
189
+ cdef list left_nonzero = <list> left.nonzero_positions(copy=False, column_order=False)
190
+ cdef list right_nonzero = <list> right.nonzero_positions(copy=False, column_order=True)
191
+ len_left = len(left_nonzero)
192
+ len_right = len(right_nonzero)
193
+
194
+ cdef dict e = {}
195
+ k1 = 0
196
+ while k1 < len_left:
197
+ row_start = k1
198
+ row = get_ij(left_nonzero, row_start, 0)
199
+ k2 = 0
200
+ while k2 < len_right:
201
+ sig_check()
202
+ col = get_ij(right_nonzero, k2, 1)
203
+ s = None
204
+ k1 = row_start
205
+ while (k1 < len_left and get_ij(left_nonzero,k1,0) == row
206
+ and k2 < len_right and get_ij(right_nonzero,k2,1) == col):
207
+ sig_check()
208
+ a = get_ij(left_nonzero, k1, 1)
209
+ b = get_ij(right_nonzero, k2, 0)
210
+ if a == b:
211
+ if s is None:
212
+ s = left.get_unsafe(row,a) * right.get_unsafe(a,col)
213
+ else:
214
+ s += left.get_unsafe(row,a) * right.get_unsafe(a,col)
215
+ k1 += 1
216
+ k2 += 1
217
+ elif a < b:
218
+ k1 += 1
219
+ else:
220
+ k2 += 1
221
+ if s is not None:
222
+ e[row, col] = s
223
+ while k2 < len_right and get_ij(right_nonzero, k2, 1) == col:
224
+ k2 += 1
225
+ while k1 < len_left and get_ij(left_nonzero, k1, 0) == row:
226
+ k1 += 1
227
+ return left.new_matrix(left._nrows, right._ncols, entries=e, coerce=False, copy=False)
228
+
229
+ def _multiply_classical_with_cache(Matrix_sparse left, Matrix_sparse right):
230
+ """
231
+ This function computes the locations of the end of the rows/columns
232
+ in the nonzero entries list once O(rows+cols) time and space, then
233
+ uses these values in the inner loops. For large matrices this can
234
+ be a 2x or more speedup, but the matrices can no longer be
235
+ arbitrarily large as the runtime and space requirements are no
236
+ longer functions of the total number of entries only.
237
+
238
+ EXAMPLES::
239
+
240
+ sage: A = matrix(QQ['x,y'], 2, [0,-1,2,-2], sparse=True)
241
+ sage: type(A)
242
+ <class 'sage.matrix.matrix_generic_sparse.Matrix_generic_sparse'>
243
+ sage: B = matrix(QQ['x,y'], 2, [-1,-1,-2,-2], sparse=True)
244
+ sage: A._multiply_classical_with_cache(B)
245
+ [2 2]
246
+ [2 2]
247
+ """
248
+ cdef Py_ssize_t row, col, row_start, k1, k2, len_left, len_right, a, b, i
249
+ cdef Py_ssize_t* next_row
250
+ cdef Py_ssize_t* next_col
251
+ left_nonzero = left.nonzero_positions(copy=False, column_order=False)
252
+ right_nonzero = right.nonzero_positions(copy=False, column_order=True)
253
+ len_left = len(left_nonzero)
254
+ len_right = len(right_nonzero)
255
+ next_row = <Py_ssize_t *>check_allocarray(left._nrows, sizeof(Py_ssize_t))
256
+ next_col = <Py_ssize_t *>check_allocarray(right._ncols, sizeof(Py_ssize_t))
257
+
258
+ i = len_left - 1
259
+ for row from left._nrows > row >= 0:
260
+ next_row[row] = i + 1
261
+ while i >= 0 and get_ij(left_nonzero,i,0) == row:
262
+ i = i - 1
263
+ i = len_right - 1
264
+ for col from right._ncols > col >= 0:
265
+ next_col[col] = i + 1
266
+ while i >= 0 and get_ij(right_nonzero,i,1) == col:
267
+ i = i - 1
268
+
269
+ e = {}
270
+ k1 = 0
271
+ while k1 < len_left:
272
+ row_start = k1
273
+ row = get_ij(left_nonzero, row_start, 0)
274
+ k2 = 0
275
+ while k2 < len_right:
276
+ sig_check()
277
+ col = get_ij(right_nonzero, k2, 1)
278
+ sum = None
279
+ k1 = row_start
280
+ while k1 < next_row[row] and k2 < next_col[col]:
281
+ sig_check()
282
+ a = get_ij(left_nonzero, k1,1)
283
+ b = get_ij(right_nonzero,k2,0)
284
+ if a == b:
285
+ if sum is None:
286
+ sum = left.get_unsafe(row,a)*right.get_unsafe(a,col)
287
+ else:
288
+ sum = sum + left.get_unsafe(row,a)*right.get_unsafe(a,col)
289
+ k1 = k1 + 1
290
+ k2 = k2 + 1
291
+ elif a < b:
292
+ k1 = k1 + 1
293
+ else:
294
+ k2 = k2 + 1
295
+ if sum is not None:
296
+ e[row, col] = sum
297
+ k2 = next_col[col]
298
+ k1 = next_row[row]
299
+
300
+ sig_free(next_row)
301
+ sig_free(next_col)
302
+
303
+ return left.new_matrix(left._nrows, right._ncols, entries=e, coerce=False, copy=False)
304
+
305
+ cpdef _lmul_(self, Element right):
306
+ """
307
+ Left scalar multiplication. Internal usage only.
308
+
309
+ INPUT:
310
+
311
+ - ``right`` -- a ring element which must already be in the base ring
312
+ of ``self`` (no coercion done here)
313
+
314
+ OUTPUT: the matrix ``self * right``
315
+
316
+ EXAMPLES::
317
+
318
+ sage: M = Matrix(QQ, 3, 6, range(18), sparse=true); M
319
+ [ 0 1 2 3 4 5]
320
+ [ 6 7 8 9 10 11]
321
+ [12 13 14 15 16 17]
322
+ sage: (2/3)*M
323
+ [ 0 2/3 4/3 2 8/3 10/3]
324
+ [ 4 14/3 16/3 6 20/3 22/3]
325
+ [ 8 26/3 28/3 10 32/3 34/3]
326
+ sage: 7*M
327
+ [ 0 7 14 21 28 35]
328
+ [ 42 49 56 63 70 77]
329
+ [ 84 91 98 105 112 119]
330
+ sage: (1/4)*M
331
+ [ 0 1/4 1/2 3/4 1 5/4]
332
+ [ 3/2 7/4 2 9/4 5/2 11/4]
333
+ [ 3 13/4 7/2 15/4 4 17/4]
334
+
335
+ Really Large Example you would not want to do with normal matrices::
336
+
337
+ sage: M = MatrixSpace(QQ, 100000, 1000000, sparse=True)
338
+ sage: m = M.random_element(density=1/100000000)
339
+ sage: m == (97/42)*(42/97*m)
340
+ True
341
+ """
342
+ cdef Py_ssize_t k, r, c
343
+ cdef Matrix_sparse M
344
+ nc, nr = self.ncols(), self.nrows()
345
+ M = self.new_matrix(nr, nc, copy=False, coerce=False)
346
+ nz = self.nonzero_positions(copy=False)
347
+ for k from 0 <= k < len(nz):
348
+ r = get_ij(nz, k, 0)
349
+ c = get_ij(nz, k, 1)
350
+ entry = self.get_unsafe(r,c)*right
351
+ M.set_unsafe(r, c, entry)
352
+ return M
353
+
354
+ cdef bint _will_use_strassen(self, matrix0.Matrix right) except -2:
355
+ # never use Strassen for sparse matrix multiply
356
+ return 0
357
+
358
+ def _pickle(self):
359
+ version = -1
360
+ data = self._dict() # dict of all elements
361
+ return data, version
362
+
363
+ def _unpickle_generic(self, data, int version):
364
+ cdef Py_ssize_t i, j
365
+ if version == -1:
366
+ for (i, j), x in data.iteritems():
367
+ self.set_unsafe(i, j, x)
368
+ else:
369
+ raise RuntimeError("unknown matrix version (=%s)" % version)
370
+
371
+ cpdef _richcmp_(self, right, int op):
372
+ """
373
+ Rich comparison.
374
+
375
+ EXAMPLES::
376
+
377
+ sage: M = matrix({(5,5): 2})
378
+ sage: Mp = matrix({(5,5): 7, (3,1):-2})
379
+ sage: M > Mp
380
+ True
381
+ sage: M == M.transpose()
382
+ True
383
+ sage: M != Mp
384
+ True
385
+ """
386
+ other = <Matrix_sparse>right
387
+ if op == Py_EQ:
388
+ return self._dict() == other._dict()
389
+ if op == Py_NE:
390
+ return self._dict() != other._dict()
391
+ cdef Py_ssize_t i, j
392
+ # Parents are equal, so dimensions of self and other are equal
393
+ for i in range(self._nrows):
394
+ for j in range(self._ncols):
395
+ lij = self.get_unsafe(i, j)
396
+ rij = other.get_unsafe(i, j)
397
+ r = richcmp_item(lij, rij, op)
398
+ if r is not NotImplemented:
399
+ return bool(r)
400
+ # Matrices are equal
401
+ return rich_to_bool(op, 0)
402
+
403
+ def transpose(self):
404
+ """
405
+ Return the transpose of ``self``, without changing ``self``.
406
+
407
+ EXAMPLES: We create a matrix, compute its transpose, and note that
408
+ the original matrix is not changed.
409
+
410
+ ::
411
+
412
+ sage: M = MatrixSpace(QQ, 2, sparse=True)
413
+ sage: A = M([1,2,3,4]); A
414
+ [1 2]
415
+ [3 4]
416
+ sage: B = A.transpose(); B
417
+ [1 3]
418
+ [2 4]
419
+
420
+ ``.T`` is a convenient shortcut for the transpose::
421
+
422
+ sage: A.T
423
+ [1 3]
424
+ [2 4]
425
+
426
+ .. SEEALSO:: :meth:`antitranspose`
427
+ """
428
+ cdef Matrix_sparse A
429
+ A = self.new_matrix(self._ncols, self._nrows)
430
+
431
+ nz = self.nonzero_positions(copy=False)
432
+ cdef Py_ssize_t i, j, k
433
+ for k from 0 <= k < len(nz):
434
+ i = get_ij(nz, k, 0)
435
+ j = get_ij(nz, k, 1)
436
+ A.set_unsafe(j,i,self.get_unsafe(i,j))
437
+ if self._subdivisions is not None:
438
+ row_divs, col_divs = self.subdivisions()
439
+ A.subdivide(col_divs, row_divs)
440
+ return A
441
+
442
+ def antitranspose(self):
443
+ """
444
+ Return the antitranspose of ``self``, without changing ``self``.
445
+
446
+ This is the mirror image along the other diagonal.
447
+
448
+ EXAMPLES::
449
+
450
+ sage: M = MatrixSpace(QQ, 2, sparse=True)
451
+ sage: A = M([1,2,3,4]); A
452
+ [1 2]
453
+ [3 4]
454
+ sage: A.antitranspose()
455
+ [4 2]
456
+ [3 1]
457
+
458
+ .. SEEALSO:: :meth:`transpose`
459
+ """
460
+ cdef Matrix_sparse A
461
+ A = self.new_matrix(self._ncols, self._nrows)
462
+
463
+ nz = self.nonzero_positions(copy=False)
464
+ cdef Py_ssize_t i, j, k
465
+ for k from 0 <= k < len(nz):
466
+ i = get_ij(nz, k, 0)
467
+ j = get_ij(nz, k, 1)
468
+ A.set_unsafe(self._ncols-j-1, self._nrows-i-1,self.get_unsafe(i,j))
469
+ if self._subdivisions is not None:
470
+ row_divs, col_divs = self.subdivisions()
471
+ A.subdivide(list(reversed([self._ncols - t for t in col_divs])),
472
+ list(reversed([self._nrows - t for t in row_divs])))
473
+ return A
474
+
475
+ def _reverse_unsafe(self):
476
+ r"""
477
+ TESTS::
478
+
479
+ sage: m = matrix(QQ, 3, 3, {(2,2): 1}, sparse=True)
480
+ sage: m._reverse_unsafe()
481
+ sage: m
482
+ [1 0 0]
483
+ [0 0 0]
484
+ [0 0 0]
485
+ sage: m = matrix(QQ, 3, 3, {(2,2): 1, (0,0):2}, sparse=True)
486
+ sage: m._reverse_unsafe()
487
+ sage: m
488
+ [1 0 0]
489
+ [0 0 0]
490
+ [0 0 2]
491
+ sage: m = matrix(QQ, 3, 3, {(1,2): 1}, sparse=True)
492
+ sage: m._reverse_unsafe()
493
+ sage: m
494
+ [0 0 0]
495
+ [1 0 0]
496
+ [0 0 0]
497
+ sage: m = matrix(QQ, 3, 3, {(1,1): 1}, sparse=True)
498
+ sage: m._reverse_unsafe()
499
+ sage: m
500
+ [0 0 0]
501
+ [0 1 0]
502
+ [0 0 0]
503
+ """
504
+ cdef Py_ssize_t i, j, ii, jj
505
+ for i,j in self.nonzero_positions(copy=False):
506
+ ii = self._nrows - i - 1
507
+ jj = self._ncols - j - 1
508
+ if (i > ii or (i == ii and j >= jj)) and self.get_unsafe(ii, jj):
509
+ # already swapped
510
+ continue
511
+
512
+ e1 = self.get_unsafe(i, j)
513
+ e2 = self.get_unsafe(ii, jj)
514
+ self.set_unsafe(i, j, e2)
515
+ self.set_unsafe(ii, jj, e1)
516
+
517
+ def charpoly(self, var='x', **kwds):
518
+ """
519
+ Return the characteristic polynomial of this matrix.
520
+
521
+ .. NOTE::
522
+
523
+ the generic sparse charpoly implementation in Sage is to
524
+ just compute the charpoly of the corresponding dense
525
+ matrix, so this could use a lot of memory. In particular,
526
+ for this matrix, the charpoly will be computed using a
527
+ dense algorithm.
528
+
529
+ EXAMPLES::
530
+
531
+ sage: A = matrix(ZZ, 4, range(16), sparse=True)
532
+ sage: A.charpoly()
533
+ x^4 - 30*x^3 - 80*x^2
534
+ sage: A.charpoly('y')
535
+ y^4 - 30*y^3 - 80*y^2
536
+ sage: A.charpoly()
537
+ x^4 - 30*x^3 - 80*x^2
538
+ """
539
+ f = self.fetch('charpoly')
540
+ if f is not None:
541
+ return f.change_variable_name(var)
542
+ f = self.dense_matrix().charpoly(var=var, **kwds)
543
+ self.cache('charpoly', f)
544
+ return f
545
+
546
+ def determinant(self, **kwds):
547
+ """
548
+ Return the determinant of this matrix.
549
+
550
+ .. NOTE::
551
+
552
+ the generic sparse determinant implementation in Sage is
553
+ to just compute the determinant of the corresponding dense
554
+ matrix, so this could use a lot of memory. In particular,
555
+ for this matrix, the determinant will be computed using a
556
+ dense algorithm.
557
+
558
+ EXAMPLES::
559
+
560
+ sage: A = matrix(ZZ, 4, range(16), sparse=True)
561
+ sage: B = A + identity_matrix(ZZ, 4, sparse=True)
562
+ sage: B.det()
563
+ -49
564
+ """
565
+ d = self.fetch('det')
566
+ if d is not None:
567
+ return d
568
+ d = self.dense_matrix().determinant(**kwds)
569
+ self.cache('det', d)
570
+ return d
571
+
572
+ def _elementwise_product(self, right):
573
+ r"""
574
+ Return the elementwise product of two sparse
575
+ matrices with identical base rings.
576
+
577
+ This routine assumes that ``self`` and ``right``
578
+ are both matrices, both sparse, with identical
579
+ sizes and with identical base rings. It is
580
+ "unsafe" in the sense that these conditions
581
+ are not checked and no sensible errors are
582
+ raised.
583
+
584
+ This routine is meant to be called from the
585
+ :meth:`~sage.matrix.matrix2.Matrix.elementwise_product`
586
+ method, which will ensure that this routine receives
587
+ proper input. More thorough documentation is provided
588
+ there.
589
+
590
+ EXAMPLES::
591
+
592
+ sage: A = matrix(ZZ, 2, range(6), sparse=True)
593
+ sage: B = matrix(ZZ, 2, [1,0,2,0,3,0], sparse=True)
594
+ sage: A._elementwise_product(B)
595
+ [ 0 0 4]
596
+ [ 0 12 0]
597
+
598
+ AUTHOR:
599
+
600
+ - Rob Beezer (2009-07-14)
601
+ """
602
+ cdef Py_ssize_t k, r, c
603
+ cdef Matrix_sparse other, prod
604
+
605
+ nc, nr = self.ncols(), self.nrows()
606
+ other = right
607
+ prod = self.new_matrix(nr, nc, copy=False, coerce=False)
608
+ nzleft = self.nonzero_positions(copy=False)
609
+ nzright = other.nonzero_positions(copy=False)
610
+ for k from 0 <= k < len(nzleft):
611
+ r = get_ij(nzleft, k, 0)
612
+ c = get_ij(nzleft, k, 1)
613
+ if (r,c) in nzright:
614
+ entry = self.get_unsafe(r,c)*other.get_unsafe(r,c)
615
+ prod.set_unsafe(r,c,entry)
616
+ return prod
617
+
618
+ def apply_morphism(self, phi):
619
+ """
620
+ Apply the morphism ``phi`` to the coefficients of this sparse matrix.
621
+
622
+ The resulting matrix is over the codomain of ``phi``.
623
+
624
+ INPUT:
625
+
626
+ - ``phi`` -- a morphism, so ``phi`` is callable and
627
+ ``phi.domain()`` and ``phi.codomain()`` are defined. The
628
+ codomain must be a ring.
629
+
630
+ OUTPUT: a matrix over the codomain of ``phi``
631
+
632
+ EXAMPLES::
633
+
634
+ sage: m = matrix(ZZ, 3, range(9), sparse=True)
635
+ sage: phi = ZZ.hom(GF(5))
636
+ sage: m.apply_morphism(phi)
637
+ [0 1 2]
638
+ [3 4 0]
639
+ [1 2 3]
640
+ sage: m.apply_morphism(phi).parent()
641
+ Full MatrixSpace of 3 by 3 sparse matrices
642
+ over Finite Field of size 5
643
+ """
644
+ R = phi.codomain()
645
+ M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
646
+ self._ncols, sparse=True)
647
+ return M({ij: phi(z) for ij, z in self.dict().iteritems()})
648
+
649
+ def apply_map(self, phi, R=None, sparse=True):
650
+ r"""
651
+ Apply the given map ``phi`` (an arbitrary Python function or callable
652
+ object) to this matrix.
653
+
654
+ If ``R`` is not given, automatically determine the base ring
655
+ of the resulting matrix.
656
+
657
+ INPUT:
658
+
659
+ - ``phi`` -- arbitrary Python function or callable object
660
+
661
+ - ``R`` -- (optional) ring
662
+
663
+ - ``sparse`` -- boolean (default: ``True``); whether to return
664
+ a sparse or a dense matrix
665
+
666
+ OUTPUT: a matrix over ``R``
667
+
668
+ EXAMPLES::
669
+
670
+ sage: m = matrix(ZZ, 10000, {(1,2): 17}, sparse=True)
671
+
672
+ sage: # needs sage.rings.finite_rings
673
+ sage: k.<a> = GF(9)
674
+ sage: f = lambda x: k(x)
675
+ sage: n = m.apply_map(f)
676
+ sage: n.parent()
677
+ Full MatrixSpace of 10000 by 10000 sparse matrices
678
+ over Finite Field in a of size 3^2
679
+ sage: n[1, 2]
680
+ 2
681
+
682
+ An example where the codomain is explicitly specified.
683
+
684
+ ::
685
+
686
+ sage: n = m.apply_map(lambda x: x%3, GF(3))
687
+ sage: n.parent()
688
+ Full MatrixSpace of 10000 by 10000 sparse matrices
689
+ over Finite Field of size 3
690
+ sage: n[1, 2]
691
+ 2
692
+
693
+ If we did not specify the codomain, the resulting matrix in the
694
+ above case ends up over `\ZZ` again::
695
+
696
+ sage: n = m.apply_map(lambda x: x%3)
697
+ sage: n.parent()
698
+ Full MatrixSpace of 10000 by 10000 sparse matrices over Integer Ring
699
+ sage: n[1, 2]
700
+ 2
701
+
702
+ If ``self`` is subdivided, the result will be as well::
703
+
704
+ sage: m = matrix(2, 2, [0, 0, 3, 0])
705
+ sage: m.subdivide(None, 1); m
706
+ [0|0]
707
+ [3|0]
708
+ sage: m.apply_map(lambda x: x*x)
709
+ [0|0]
710
+ [9|0]
711
+
712
+ If the map sends zero to a nonzero value, then it may be useful to
713
+ get the result as a dense matrix.
714
+
715
+ ::
716
+
717
+ sage: m = matrix(ZZ, 3, 3, [0] * 7 + [1,2], sparse=True); m
718
+ [0 0 0]
719
+ [0 0 0]
720
+ [0 1 2]
721
+ sage: parent(m)
722
+ Full MatrixSpace of 3 by 3 sparse matrices over Integer Ring
723
+ sage: n = m.apply_map(lambda x: x+polygen(QQ), sparse=False); n
724
+ [ x x x]
725
+ [ x x x]
726
+ [ x x + 1 x + 2]
727
+ sage: parent(n)
728
+ Full MatrixSpace of 3 by 3 dense matrices over Univariate Polynomial Ring in x over Rational Field
729
+
730
+ TESTS::
731
+
732
+ sage: m = matrix([], sparse=True)
733
+ sage: m.apply_map(lambda x: x*x) == m
734
+ True
735
+
736
+ sage: m.apply_map(lambda x: x*x, sparse=False).parent()
737
+ Full MatrixSpace of 0 by 0 dense matrices over Integer Ring
738
+
739
+ Check that we do not unnecessarily apply phi to 0 in the sparse case::
740
+
741
+ sage: m = matrix(QQ, 2, 2, range(1, 5), sparse=True)
742
+ sage: m.apply_map(lambda x: 1/x)
743
+ [ 1 1/2]
744
+ [1/3 1/4]
745
+
746
+ Test subdivisions when phi maps 0 to nonzero::
747
+
748
+ sage: m = matrix(2, 2, [0, 0, 3, 0])
749
+ sage: m.subdivide(None, 1); m
750
+ [0|0]
751
+ [3|0]
752
+ sage: m.apply_map(lambda x: x+1)
753
+ [1|1]
754
+ [4|1]
755
+
756
+ When applying a map to a sparse zero matrix, the codomain is determined
757
+ from the image of zero (:issue:`29214`)::
758
+
759
+ sage: matrix(RR, 2, 2, sparse=True).apply_map(floor).base_ring() is ZZ
760
+ True
761
+ """
762
+ if self._nrows==0 or self._ncols==0:
763
+ if not sparse:
764
+ return self.dense_matrix()
765
+ else:
766
+ return self.__copy__()
767
+ self_dict = self._dict()
768
+ if len(self_dict) < self._nrows * self._ncols:
769
+ zero_res = phi(self.base_ring()(0))
770
+ else:
771
+ zero_res = None
772
+ v = [(ij, phi(z)) for ij,z in self_dict.iteritems()]
773
+ if R is None:
774
+ w = [x for _, x in v]
775
+ if zero_res is not None:
776
+ w.append(zero_res)
777
+ w = sage.structure.sequence.Sequence(w)
778
+ R = w.universe()
779
+ v = {v[i][0]: w[i] for i in range(len(v))}
780
+ else:
781
+ v = dict(v)
782
+ if zero_res is not None and not zero_res.is_zero():
783
+ M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
784
+ self._ncols, sparse=sparse)
785
+ m = M([zero_res] * (self._nrows * self._ncols))
786
+ for i,n in v.items():
787
+ m[i] = n
788
+ if self._subdivisions is not None:
789
+ m.subdivide(*self.subdivisions())
790
+ return m
791
+
792
+ M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
793
+ self._ncols, sparse=sparse)
794
+ m = M(v)
795
+ if self._subdivisions is not None:
796
+ m.subdivide(*self.subdivisions())
797
+ return m
798
+
799
+ def _derivative(self, var=None, R=None):
800
+ """
801
+ Differentiate with respect to ``var`` by differentiating each element
802
+ with respect to ``var``.
803
+
804
+ .. SEEALSO::
805
+
806
+ :meth:`derivative`
807
+
808
+ EXAMPLES::
809
+
810
+ sage: m = matrix(2, [x^i for i in range(4)], sparse=True) # needs sage.symbolic
811
+ sage: m._derivative(x) # needs sage.symbolic
812
+ [ 0 1]
813
+ [ 2*x 3*x^2]
814
+
815
+ TESTS:
816
+
817
+ Verify that :issue:`15067` is fixed::
818
+
819
+ sage: m = matrix(3, 3, {(1, 1): 2, (0,2): 5})
820
+ sage: derivative(m, x) # needs sage.symbolic
821
+ [0 0 0]
822
+ [0 0 0]
823
+ [0 0 0]
824
+ """
825
+ # We would just use apply_map, except that Cython does not
826
+ # allow lambda functions
827
+
828
+ if self._nrows==0 or self._ncols==0:
829
+ return self.__copy__()
830
+ v = [(ij, sage.calculus.functional.derivative(z, var)) for ij, z in self.dict().iteritems()]
831
+ if R is None:
832
+ w = [x for _, x in v]
833
+ w = sage.structure.sequence.Sequence(w)
834
+ R = w.universe()
835
+ v = {v[i][0]: w[i] for i in range(len(v))}
836
+ else:
837
+ v = dict(v)
838
+ M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
839
+ self._ncols, sparse=True)
840
+ return M(v)
841
+
842
+ def density(self):
843
+ """
844
+ Return the density of the matrix.
845
+
846
+ By density we understand the ratio of the number of nonzero
847
+ positions and the number ``self.nrows() * self.ncols()``,
848
+ i.e. the number of possible nonzero positions.
849
+
850
+ EXAMPLES::
851
+
852
+ sage: a = matrix([[],[],[],[]], sparse=True); a.density()
853
+ 0
854
+ sage: a = matrix(5000,5000,{(1,2): 1}); a.density()
855
+ 1/25000000
856
+ """
857
+ nr = self.nrows()
858
+ nc = self.ncols()
859
+ if nc == 0 or nr == 0:
860
+ return 0
861
+ from sage.rings.rational_field import QQ
862
+ return QQ(len(self.nonzero_positions(copy=False))) / (nr * nc)
863
+
864
+ def matrix_from_rows_and_columns(self, rows, columns):
865
+ """
866
+ Return the matrix constructed from ``self`` from the given rows and
867
+ columns.
868
+
869
+ EXAMPLES::
870
+
871
+ sage: M = MatrixSpace(Integers(8),3,3, sparse=True)
872
+ sage: A = M(range(9)); A
873
+ [0 1 2]
874
+ [3 4 5]
875
+ [6 7 0]
876
+ sage: A.matrix_from_rows_and_columns([1], [0,2])
877
+ [3 5]
878
+ sage: A.matrix_from_rows_and_columns([1,2], [1,2])
879
+ [4 5]
880
+ [7 0]
881
+
882
+ Note that row and column indices can be reordered or repeated::
883
+
884
+ sage: A.matrix_from_rows_and_columns([2,1], [2,1])
885
+ [0 7]
886
+ [5 4]
887
+
888
+ For example here we take from row 1 columns 2 then 0 twice, and do
889
+ this 3 times.
890
+
891
+ ::
892
+
893
+ sage: A.matrix_from_rows_and_columns([1,1,1],[2,0,0])
894
+ [5 3 3]
895
+ [5 3 3]
896
+ [5 3 3]
897
+
898
+ We can efficiently extract large submatrices::
899
+
900
+ sage: A = random_matrix(ZZ, 100000, density=.00005, sparse=True) # long time (4s on sage.math, 2012)
901
+ sage: B = A[50000:,:50000] # long time
902
+ sage: count = 0
903
+ sage: for i, j in A.nonzero_positions(): # long time
904
+ ....: if i >= 50000 and j < 50000:
905
+ ....: assert B[i-50000, j] == A[i, j]
906
+ ....: count += 1
907
+ sage: count == sum(1 for _ in B.nonzero_positions()) # long time
908
+ True
909
+
910
+ We must pass in a list of indices::
911
+
912
+ sage: A = random_matrix(ZZ,100,density=.02,sparse=True)
913
+ sage: A.matrix_from_rows_and_columns(1,[2,3])
914
+ Traceback (most recent call last):
915
+ ...
916
+ TypeError: 'sage.rings.integer.Integer' object is not iterable
917
+
918
+ sage: A.matrix_from_rows_and_columns([1,2],3)
919
+ Traceback (most recent call last):
920
+ ...
921
+ TypeError: 'sage.rings.integer.Integer' object is not iterable
922
+
923
+ AUTHORS:
924
+
925
+ - Jaap Spies (2006-02-18)
926
+
927
+ - Didier Deshommes: some Pyrex speedups implemented
928
+
929
+ - Jason Grout: sparse matrix optimizations
930
+ """
931
+ if not isinstance(rows, (list, tuple)):
932
+ rows = list(rows)
933
+
934
+ if not isinstance(columns, (list, tuple)):
935
+ columns = list(columns)
936
+
937
+ cdef Py_ssize_t nrows, ncols, k, i, j
938
+
939
+ ncols = len(columns)
940
+ nrows = len(rows)
941
+ cdef Matrix_sparse A = self.new_matrix(nrows=nrows, ncols=ncols)
942
+
943
+ tmp = [el for el in columns if 0 <= el < self._ncols]
944
+ columns = tmp
945
+ if ncols != len(columns):
946
+ raise IndexError("column index out of range")
947
+
948
+ tmp = [el for el in rows if 0 <= el < self._nrows]
949
+ rows = tmp
950
+ if nrows != len(rows):
951
+ raise IndexError("row index out of range")
952
+
953
+ row_map = {}
954
+ for new_row, old_row in enumerate(rows):
955
+ if old_row in row_map:
956
+ row_map[old_row].append(new_row)
957
+ else:
958
+ row_map[old_row] = [new_row]
959
+
960
+ col_map = {}
961
+ for new_col, old_col in enumerate(columns):
962
+ if old_col in col_map:
963
+ col_map[old_col].append(new_col)
964
+ else:
965
+ col_map[old_col] = [new_col]
966
+
967
+ nz = self.nonzero_positions(copy=False)
968
+ for k in range(len(nz)):
969
+ i = get_ij(nz, k, 0)
970
+ j = get_ij(nz, k, 1)
971
+ if i in row_map and j in col_map:
972
+ entry = self.get_unsafe(i, j)
973
+ for new_row in row_map[i]:
974
+ for new_col in col_map[j]:
975
+ A.set_unsafe(new_row, new_col, entry)
976
+ return A
977
+
978
+ cdef _stack_impl(self, bottom):
979
+ r"""
980
+ Stack ``self`` on top of ``bottom``::
981
+
982
+ [ self ]
983
+ [ bottom ]
984
+
985
+ EXAMPLES::
986
+
987
+ sage: M = Matrix(QQ, 2, 3, range(6), sparse=True)
988
+ sage: N = Matrix(QQ, 1, 3, [10,11,12], sparse=True)
989
+ sage: M.stack(N)
990
+ [ 0 1 2]
991
+ [ 3 4 5]
992
+ [10 11 12]
993
+
994
+ A vector may be stacked below a matrix. ::
995
+
996
+ sage: A = matrix(QQ, 2, 5, range(10), sparse=True)
997
+ sage: v = vector(QQ, 5, range(5), sparse=True)
998
+ sage: A.stack(v)
999
+ [0 1 2 3 4]
1000
+ [5 6 7 8 9]
1001
+ [0 1 2 3 4]
1002
+
1003
+ The ``subdivide`` option will add a natural subdivision between
1004
+ ``self`` and ``other``. For more details about how subdivisions
1005
+ are managed when stacking, see
1006
+ :meth:`sage.matrix.matrix1.Matrix.stack`. ::
1007
+
1008
+ sage: A = matrix(ZZ, 3, 4, range(12), sparse=True)
1009
+ sage: B = matrix(ZZ, 2, 4, range(8), sparse=True)
1010
+ sage: A.stack(B, subdivide=True)
1011
+ [ 0 1 2 3]
1012
+ [ 4 5 6 7]
1013
+ [ 8 9 10 11]
1014
+ [-----------]
1015
+ [ 0 1 2 3]
1016
+ [ 4 5 6 7]
1017
+
1018
+ TESTS:
1019
+
1020
+ One can stack matrices over different rings (:issue:`16399`). ::
1021
+
1022
+ sage: M = Matrix(ZZ, 2, 3, range(6), sparse=True)
1023
+ sage: N = Matrix(QQ, 1, 3, [10,11,12], sparse=True)
1024
+ sage: M.stack(N)
1025
+ [ 0 1 2]
1026
+ [ 3 4 5]
1027
+ [10 11 12]
1028
+ sage: N.stack(M)
1029
+ [10 11 12]
1030
+ [ 0 1 2]
1031
+ [ 3 4 5]
1032
+ sage: M2 = Matrix(ZZ['x'], 2, 3, range(6), sparse=True)
1033
+ sage: N.stack(M2)
1034
+ [10 11 12]
1035
+ [ 0 1 2]
1036
+ [ 3 4 5]
1037
+ """
1038
+ cdef Matrix_sparse other = <Matrix_sparse>bottom
1039
+ cdef Matrix_sparse Z
1040
+ Z = self.new_matrix(nrows=self._nrows + other._nrows, ncols=self._ncols)
1041
+
1042
+ for i, j in self.nonzero_positions(copy=False):
1043
+ Z.set_unsafe(i, j, self.get_unsafe(i,j))
1044
+ for i, j in other.nonzero_positions(copy=False):
1045
+ Z.set_unsafe(i + self._nrows, j, other.get_unsafe(i,j))
1046
+
1047
+ return Z
1048
+
1049
+ def augment(self, right, subdivide=False):
1050
+ r"""
1051
+ Return the augmented matrix of the form::
1052
+
1053
+ [self | right].
1054
+
1055
+ EXAMPLES::
1056
+
1057
+ sage: M = MatrixSpace(QQ, 2, 2, sparse=True)
1058
+ sage: A = M([1,2, 3,4])
1059
+ sage: A
1060
+ [1 2]
1061
+ [3 4]
1062
+ sage: N = MatrixSpace(QQ, 2, 1, sparse=True)
1063
+ sage: B = N([9,8])
1064
+ sage: B
1065
+ [9]
1066
+ [8]
1067
+ sage: A.augment(B)
1068
+ [1 2 9]
1069
+ [3 4 8]
1070
+ sage: B.augment(A)
1071
+ [9 1 2]
1072
+ [8 3 4]
1073
+
1074
+ A vector may be augmented to a matrix. ::
1075
+
1076
+ sage: A = matrix(QQ, 3, 4, range(12), sparse=True)
1077
+ sage: v = vector(QQ, 3, range(3), sparse=True)
1078
+ sage: A.augment(v)
1079
+ [ 0 1 2 3 0]
1080
+ [ 4 5 6 7 1]
1081
+ [ 8 9 10 11 2]
1082
+
1083
+ The ``subdivide`` option will add a natural subdivision between
1084
+ ``self`` and ``right``. For more details about how subdivisions
1085
+ are managed when augmenting, see
1086
+ :meth:`sage.matrix.matrix1.Matrix.augment`. ::
1087
+
1088
+ sage: A = matrix(QQ, 3, 5, range(15), sparse=True)
1089
+ sage: B = matrix(QQ, 3, 3, range(9), sparse=True)
1090
+ sage: A.augment(B, subdivide=True)
1091
+ [ 0 1 2 3 4| 0 1 2]
1092
+ [ 5 6 7 8 9| 3 4 5]
1093
+ [10 11 12 13 14| 6 7 8]
1094
+
1095
+ TESTS:
1096
+
1097
+ Verify that :issue:`12689` is fixed::
1098
+
1099
+ sage: A = identity_matrix(QQ, 2, sparse=True)
1100
+ sage: B = identity_matrix(ZZ, 2, sparse=True)
1101
+ sage: A.augment(B)
1102
+ [1 0 1 0]
1103
+ [0 1 0 1]
1104
+ """
1105
+ if not isinstance(right, matrix.Matrix):
1106
+ if hasattr(right, '_vector_'):
1107
+ right = right.column()
1108
+ else:
1109
+ raise TypeError("right must be a matrix")
1110
+
1111
+ if not (self._base_ring is right.base_ring()):
1112
+ right = right.change_ring(self._base_ring)
1113
+
1114
+ cdef Matrix_sparse other = right.sparse_matrix()
1115
+
1116
+ if self._nrows != other._nrows:
1117
+ raise TypeError("number of rows must be the same")
1118
+
1119
+ cdef Matrix_sparse Z
1120
+ Z = self.new_matrix(ncols = self._ncols + other._ncols)
1121
+ for i, j in self.nonzero_positions(copy=False):
1122
+ Z.set_unsafe(i, j, self.get_unsafe(i,j))
1123
+ for i, j in other.nonzero_positions(copy=False):
1124
+ Z.set_unsafe(i, j + self._ncols, other.get_unsafe(i,j))
1125
+ if subdivide:
1126
+ Z._subdivide_on_augment(self, other)
1127
+ return Z
1128
+
1129
+ cdef _vector_times_matrix_(self, Vector v):
1130
+ """
1131
+ Return the vector times matrix product.
1132
+
1133
+ INPUT:
1134
+
1135
+ - ``v`` -- a free module element
1136
+
1137
+ OUTPUT: the vector times matrix product ``v*A``
1138
+
1139
+ EXAMPLES::
1140
+
1141
+ sage: v = FreeModule(ZZ, 3)([1, 2, 3])
1142
+ sage: m = matrix(QQ, 3, 4, range(12), sparse=True)
1143
+ sage: v * m
1144
+ (32, 38, 44, 50)
1145
+
1146
+ TESTS::
1147
+
1148
+ sage: (v * m).is_sparse()
1149
+ True
1150
+ sage: (v * m).parent() is m.row(0).parent()
1151
+ True
1152
+ """
1153
+ cdef Py_ssize_t i, j
1154
+ if self._nrows != v._degree:
1155
+ raise ArithmeticError("number of rows of matrix must equal degree of vector")
1156
+ parent = self.row_ambient_module(base_ring=None, sparse=v.is_sparse_c())
1157
+ s = parent.zero_vector()
1158
+ for (i, j), a in self._dict().iteritems():
1159
+ s[j] += v[i] * a
1160
+ return s
1161
+
1162
+ cdef _matrix_times_vector_(self, Vector v):
1163
+ """
1164
+ Return the matrix times vector product.
1165
+
1166
+ INPUT:
1167
+
1168
+ - ``v`` -- a free module element
1169
+
1170
+ OUTPUT: the matrix times vector product ``A*v``
1171
+
1172
+ EXAMPLES::
1173
+
1174
+ sage: v = FreeModule(ZZ, 3)([1, 2, 3])
1175
+ sage: m = matrix(QQ, 4, 3, range(12), sparse=True)
1176
+ sage: m * v
1177
+ (8, 26, 44, 62)
1178
+
1179
+ TESTS::
1180
+
1181
+ sage: (m * v).is_sparse()
1182
+ True
1183
+ sage: (m * v).parent() is m.column(0).parent()
1184
+ True
1185
+
1186
+ Check that the bug in :issue:`13854` has been fixed::
1187
+
1188
+ sage: # needs sage.combinat sage.libs.singular
1189
+ sage: A.<x,y> = FreeAlgebra(QQ, 2)
1190
+ sage: P.<x,y> = A.g_algebra(relations={y*x: -x*y}, order='lex')
1191
+ sage: M = Matrix([[x]], sparse=True)
1192
+ sage: w = vector([y])
1193
+ doctest:...: UserWarning: You are constructing a free module
1194
+ over a noncommutative ring. Sage does not have a concept
1195
+ of left/right and both sided modules, so be careful.
1196
+ It's also not guaranteed that all multiplications are
1197
+ done from the right side.
1198
+ doctest:...: UserWarning: You are constructing a free module
1199
+ over a noncommutative ring. Sage does not have a concept
1200
+ of left/right and both sided modules, so be careful.
1201
+ It's also not guaranteed that all multiplications are
1202
+ done from the right side.
1203
+ sage: M*w
1204
+ (x*y)
1205
+ """
1206
+ cdef Py_ssize_t i, j
1207
+ if self._ncols != v._degree:
1208
+ raise ArithmeticError("number of columns of matrix must equal degree of vector")
1209
+ parent = self.column_ambient_module(base_ring=None, sparse=v.is_sparse_c())
1210
+ s = parent.zero_vector()
1211
+ for (i, j), a in self._dict().iteritems():
1212
+ s[i] += a * v[j]
1213
+ return s
1214
+
1215
+
1216
+ @cython.boundscheck(False)
1217
+ @cython.wraparound(False)
1218
+ # Return v[i][j] where v is a list of tuples.
1219
+ # No checking is done, make sure you feed it valid input!
1220
+ cdef inline Py_ssize_t get_ij(v, Py_ssize_t i, Py_ssize_t j) noexcept:
1221
+ t = (<list>v)[i]
1222
+ return (<tuple>t)[j]