passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_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 (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 +6 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
  6. passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
  7. passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
  8. passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
  9. passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
  10. passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
  11. passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.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,1271 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ `\ZZ`-filtered vector spaces
4
+
5
+ This module implements filtered vector spaces, that is, a descending
6
+ sequence of vector spaces
7
+
8
+ .. MATH::
9
+
10
+ \cdots \supset F_d \supset F_{d+1} \supset F_{d+2} \supset \cdots
11
+
12
+ with degrees `d\in \ZZ`. It is not required that `F_d` is the entire
13
+ ambient space for `d\ll 0` (see
14
+ :meth:`~FilteredVectorSpace_class.is_exhaustive`) nor that `F_d=0` for
15
+ `d\gg 0` (see :meth:`~FilteredVectorSpace_class.is_separating`). To
16
+ construct a filtered vector space, use the :func:`FilteredVectorSpace`
17
+ command. It supports easy creation of simple filtrations, for example
18
+ the trivial one::
19
+
20
+ sage: FilteredVectorSpace(2, base_ring=RDF)
21
+ RDF^2
22
+
23
+ The next-simplest filtration has a single non-trivial inclusion
24
+ between `V_d` and `V_{d+1}`::
25
+
26
+ sage: d = 1
27
+ sage: V = FilteredVectorSpace(2, d); V
28
+ QQ^2 >= 0
29
+ sage: [V.get_degree(i).dimension() for i in range(0,4)]
30
+ [2, 2, 0, 0]
31
+
32
+ To construct general filtrations, you need to tell Sage about generating
33
+ vectors for the nested subspaces. For example, a dictionary whose keys
34
+ are the degrees and values are a list of generators::
35
+
36
+ sage: r1 = (1, 0, 5)
37
+ sage: r2 = (0, 1, 2)
38
+ sage: r3 = (1, 2, 1)
39
+ sage: V = FilteredVectorSpace({0:[r1, r2, r3], 1:[r1, r2], 3:[r1]}); V
40
+ QQ^3 >= QQ^2 >= QQ^1 >= QQ^1 >= 0
41
+
42
+ For degrees `d` that are not specified, the associated vector subspace
43
+ is the same as the next-lower degree, that is, `V_d \simeq
44
+ V_{d-1}`. In the above example, this means that
45
+
46
+ * `V_d \simeq \QQ^3` for `d<0`
47
+ * `V_0 = \mathop{span}(r_1, r_2) \simeq \QQ^2`
48
+ * `V_1 = V_2 = \mathop{span}(r_3) \simeq \QQ`
49
+ * `V_d = 0` for `d \geq 3`
50
+
51
+ That is::
52
+
53
+ sage: V.get_degree(0) == V
54
+ True
55
+ sage: V.get_degree(1) == V.span([r1, r2])
56
+ True
57
+ sage: V.get_degree(2) == V.get_degree(3) == V.span([r1])
58
+ True
59
+ sage: V.get_degree(4) == V.get_degree(5) == V.span([])
60
+ True
61
+
62
+ If you have many generators you can just pass the generators once and
63
+ then refer to them by index::
64
+
65
+ sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1,2], 1:[1,2], 3:[1]})
66
+ QQ^3 >= QQ^2 >= QQ^1 >= QQ^1 >= 0
67
+
68
+ Note that generators for the degree-`d` subspace of the filtration are
69
+ automatically generators for all lower degrees. For example, here we
70
+ do not have to specify the ray `r_2` separately in degree 1::
71
+
72
+ sage: FilteredVectorSpace([r1, r2, r3], {0:[0 ], 1:[1]})
73
+ QQ^2 >= QQ^1 >= 0 in QQ^3
74
+ sage: FilteredVectorSpace([r1, r2, r3], {0:[0, 1], 1:[1]})
75
+ QQ^2 >= QQ^1 >= 0 in QQ^3
76
+
77
+ The degree can be infinite (plus infinity), this allows construction
78
+ of filtered vector spaces that are not eventually zero in high
79
+ degree::
80
+
81
+ sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1], oo:[1]})
82
+ QQ^2 >= QQ^1 in QQ^3
83
+
84
+ Any field can be used as the vector space base. For example a finite
85
+ field::
86
+
87
+ sage: F.<a> = GF(5^3) # needs sage.rings.finite_rings
88
+ sage: r1 = (a, 0, F(5)); r1 # needs sage.rings.finite_rings
89
+ (a, 0, 0)
90
+ sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1], oo:[1]}, base_ring=F) # needs sage.rings.finite_rings
91
+ GF(125)^2 >= GF(125)^1 in GF(125)^3
92
+
93
+ Or the algebraic field::
94
+
95
+ sage: r1 = (1, 0, 1+QQbar(I)); r1 # needs sage.rings.number_field
96
+ (1, 0, I + 1)
97
+ sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1], oo:[1]}, base_ring=QQbar) # needs sage.rings.number_field
98
+ Vector space of dimension 2 over Algebraic Field
99
+ >= Vector space of dimension 1 over Algebraic Field
100
+ in Vector space of dimension 3 over Algebraic Field
101
+ """
102
+
103
+ # ***************************************************************************
104
+ # Copyright (C) 2013 Volker Braun <vbraun.name@gmail.com>
105
+ #
106
+ # Distributed under the terms of the GNU General Public License (GPL)
107
+ # as published by the Free Software Foundation; either version 2 of
108
+ # the License, or (at your option) any later version.
109
+ # https://www.gnu.org/licenses/
110
+ # ***************************************************************************
111
+ from itertools import product
112
+
113
+ from sage.rings.rational_field import QQ
114
+ from sage.rings.integer_ring import ZZ
115
+ from sage.rings.real_double import RDF
116
+ from sage.rings.integer import Integer
117
+ from sage.rings.infinity import InfinityRing, infinity, minus_infinity
118
+ from sage.categories.fields import Fields
119
+ from sage.modules.free_module import FreeModule_ambient_field, VectorSpace
120
+ from sage.matrix.constructor import matrix
121
+ from sage.misc.cachefunc import cached_method
122
+
123
+ try:
124
+ from sage.rings.real_mpfr import RR
125
+ except ImportError:
126
+ RR = None
127
+
128
+
129
+ def is_FilteredVectorSpace(X):
130
+ """
131
+ Test whether ``X`` is a filtered vector space.
132
+
133
+ This function is for library use only.
134
+
135
+ INPUT:
136
+
137
+ - ``X`` -- anything
138
+
139
+ OUTPUT: boolean
140
+
141
+ EXAMPLES::
142
+
143
+ sage: from sage.modules.filtered_vector_space import is_FilteredVectorSpace
144
+ sage: V = FilteredVectorSpace(2, 1)
145
+ sage: is_FilteredVectorSpace(V)
146
+ doctest:warning...:
147
+ DeprecationWarning: the function is_FilteredVectorSpace is deprecated;
148
+ use 'isinstance(..., FilteredVectorSpace_class)' instead
149
+ See https://github.com/sagemath/sage/issues/37924 for details.
150
+ True
151
+ sage: is_FilteredVectorSpace('ceci n\'est pas une pipe')
152
+ False
153
+ """
154
+ from sage.misc.superseded import deprecation
155
+ deprecation(37924, "the function is_FilteredVectorSpace is deprecated; use 'isinstance(..., FilteredVectorSpace_class)' instead")
156
+ return isinstance(X, FilteredVectorSpace_class)
157
+
158
+
159
+ def FilteredVectorSpace(arg1, arg2=None, base_ring=QQ, check=True):
160
+ r"""
161
+ Construct a filtered vector space.
162
+
163
+ INPUT:
164
+
165
+ This function accepts various input that determines the vector space and filtration.
166
+
167
+ - Just the dimensionFilteredVectorSpace(dimension): Return the trivial filtration
168
+ (where all vector spaces are isomorphic).
169
+
170
+ - Dimension and maximal degree, see
171
+ :func:`constructor_from_dim_degree` for arguments. Construct a
172
+ filtration with only one non-trivial step `V\supset 0` at the
173
+ given cutoff degree.
174
+
175
+ - A dictionary containing the degrees as keys and a list of vector
176
+ space generators as values, see
177
+ :func:`FilteredVectorSpace_from_generators`
178
+
179
+ - Generators and a dictionary containing the degrees as keys and
180
+ the indices of vector space generators as values, see
181
+ :func:`FilteredVectorSpace_from_generators_indices`
182
+
183
+ In addition, the following keyword arguments are supported:
184
+
185
+ - ``base_ring`` -- a field (default: `\QQ`). The base
186
+ field of the vector space. Must be a field.
187
+
188
+ EXAMPLES:
189
+
190
+ Just the dimension for the trivial filtration::
191
+
192
+ sage: FilteredVectorSpace(2)
193
+ QQ^2
194
+
195
+ Dimension and degree::
196
+
197
+ sage: FilteredVectorSpace(2, 1)
198
+ QQ^2 >= 0
199
+
200
+ Dictionary of generators::
201
+
202
+ sage: FilteredVectorSpace({1:[(1,0), (0,1)], 3:[(1,0)]})
203
+ QQ^2 >= QQ^1 >= QQ^1 >= 0
204
+
205
+ Generators and a dictionary referring to them by index::
206
+
207
+ sage: FilteredVectorSpace([(1,0), (0,1)], {1:[0,1], 3:[0]})
208
+ QQ^2 >= QQ^1 >= QQ^1 >= 0
209
+ """
210
+ if base_ring not in Fields():
211
+ raise ValueError('the base_ring argument must be a field')
212
+ if arg1 in ZZ:
213
+ return construct_from_dim_degree(arg1, arg2, base_ring, check)
214
+ elif arg2 is None:
215
+ return construct_from_generators(arg1, base_ring, check)
216
+ else:
217
+ return construct_from_generators_indices(arg1, arg2, base_ring, check)
218
+
219
+
220
+ def normalize_degree(deg):
221
+ """
222
+ Normalize the degree.
223
+
224
+ - ``deg`` -- something that defines the degree (either integer or infinity)
225
+
226
+ OUTPUT: plus/minus infinity or a Sage integer
227
+
228
+ EXAMPLES::
229
+
230
+ sage: from sage.modules.filtered_vector_space import normalize_degree
231
+ sage: type(normalize_degree(int(1)))
232
+ <class 'sage.rings.integer.Integer'>
233
+ sage: normalize_degree(oo)
234
+ +Infinity
235
+ """
236
+ try:
237
+ return ZZ(deg)
238
+ except TypeError:
239
+ pass
240
+ deg = InfinityRing(deg)
241
+ if deg == infinity:
242
+ return infinity
243
+ if deg == minus_infinity:
244
+ return minus_infinity
245
+ raise ValueError('not integer or infinity')
246
+
247
+
248
+ def construct_from_dim_degree(dim, max_degree, base_ring, check):
249
+ """
250
+ Construct a filtered vector space.
251
+
252
+ INPUT:
253
+
254
+ - ``dim`` -- integer; the dimension
255
+
256
+ - ``max_degree`` -- integer or infinity; the maximal degree where
257
+ the vector subspace of the filtration is still the entire space
258
+
259
+ EXAMPLES::
260
+
261
+ sage: V = FilteredVectorSpace(2, 5); V
262
+ QQ^2 >= 0
263
+ sage: V.get_degree(5)
264
+ Vector space of degree 2 and dimension 2 over Rational Field
265
+ Basis matrix:
266
+ [1 0]
267
+ [0 1]
268
+ sage: V.get_degree(6)
269
+ Vector space of degree 2 and dimension 0 over Rational Field
270
+ Basis matrix:
271
+ []
272
+
273
+ sage: FilteredVectorSpace(2, oo)
274
+ QQ^2
275
+ sage: FilteredVectorSpace(2, -oo)
276
+ 0 in QQ^2
277
+
278
+ TESTS::
279
+
280
+ sage: from sage.modules.filtered_vector_space import construct_from_dim_degree
281
+ sage: V = construct_from_dim_degree(2, 5, QQ, True); V
282
+ QQ^2 >= 0
283
+ """
284
+ if dim not in ZZ:
285
+ raise ValueError('dimension must be an integer')
286
+ dim = ZZ(dim)
287
+ from sage.matrix.constructor import identity_matrix
288
+ generators = identity_matrix(base_ring, dim).columns()
289
+ filtration = {}
290
+ if max_degree is None:
291
+ max_degree = infinity
292
+ filtration[normalize_degree(max_degree)] = range(dim)
293
+ return construct_from_generators_indices(generators, filtration, base_ring, check)
294
+
295
+
296
+ def construct_from_generators(filtration, base_ring, check):
297
+ """
298
+ Construct a filtered vector space.
299
+
300
+ INPUT:
301
+
302
+ - ``filtration`` -- dictionary of filtration steps. Each
303
+ filtration step is a pair consisting of an integer degree and a
304
+ list/tuple/iterable of vector space generators. The integer
305
+ ``degree`` stipulates that all filtration steps of degree higher
306
+ or equal than ``degree`` (up to the next filtration step) are
307
+ said subspace.
308
+
309
+ EXAMPLES::
310
+
311
+ sage: from sage.modules.filtered_vector_space import construct_from_generators
312
+ sage: r = [1, 2]
313
+ sage: construct_from_generators({1:[r]}, QQ, True)
314
+ QQ^1 >= 0 in QQ^2
315
+ """
316
+ def normalize_gen(v):
317
+ return tuple(map(base_ring, v))
318
+
319
+ # convert generator notation to generator+indices
320
+ if len(filtration) == 0:
321
+ raise ValueError('you need to specify at least one ray to deduce the dimension')
322
+ generators = set()
323
+ for gens in filtration.values():
324
+ generators.update(normalize_gen(g) for g in gens)
325
+ generators = tuple(sorted(generators))
326
+
327
+ # normalize filtration data
328
+ normalized = {}
329
+ for deg, gens_deg in filtration.items():
330
+ indices = [generators.index(normalize_gen(v)) for v in gens_deg]
331
+ normalized[deg] = tuple(indices)
332
+ return construct_from_generators_indices(generators, normalized, base_ring, check)
333
+
334
+
335
+ def construct_from_generators_indices(generators, filtration, base_ring, check):
336
+ """
337
+ Construct a filtered vector space.
338
+
339
+ INPUT:
340
+
341
+ - ``generators`` -- list/tuple/iterable of vectors, or something
342
+ convertible to them. The generators spanning various
343
+ subspaces.
344
+
345
+ - ``filtration`` -- list or iterable of filtration steps. Each
346
+ filtration step is a pair ``(degree, ray_indices)``. The
347
+ ``ray_indices`` are a list or iterable of ray indices, which
348
+ span a subspace of the vector space. The integer ``degree``
349
+ stipulates that all filtration steps of degree higher or equal
350
+ than ``degree`` (up to the next filtration step) are said
351
+ subspace.
352
+
353
+ EXAMPLES::
354
+
355
+ sage: from sage.modules.filtered_vector_space import construct_from_generators_indices
356
+ sage: gens = [(1,0), (0,1), (-1,-1)]
357
+ sage: V = construct_from_generators_indices(gens, {1:[0,1], 3:[1]}, QQ, True); V
358
+ QQ^2 >= QQ^1 >= QQ^1 >= 0
359
+
360
+ TESTS::
361
+
362
+ sage: gens = [(int(1),int(0)), (0,1), (-1,-1)]
363
+ sage: construct_from_generators_indices(iter(gens), {int(0):[0, int(1)], 2:[2]}, QQ, True)
364
+ QQ^2 >= QQ^1 >= QQ^1 >= 0
365
+ """
366
+ # normalize generators
367
+ generators = [list(g) for g in generators]
368
+
369
+ # deduce dimension
370
+ if len(generators) == 0:
371
+ dim = ZZ(0)
372
+ else:
373
+ dim = ZZ(len(generators[0]))
374
+ ambient = VectorSpace(base_ring, dim)
375
+
376
+ # complete generators to a generating set
377
+ if matrix(base_ring, generators).rank() < dim:
378
+ complement = ambient.span(generators).complement()
379
+ generators = generators + list(complement.gens())
380
+ # normalize generators II
381
+ generators = tuple(ambient(v) for v in generators)
382
+
383
+ for v in generators:
384
+ v.set_immutable()
385
+
386
+ # normalize filtration data
387
+ normalized = {}
388
+ for deg, gens in filtration.items():
389
+ deg = normalize_degree(deg)
390
+ gens = tuple(sorted(ZZ(i) for i in gens))
391
+ if gens and (gens[0] < 0 or gens[-1] >= len(generators)):
392
+ raise ValueError('generator index out of bounds')
393
+ normalized[deg] = gens
394
+ try:
395
+ del normalized[minus_infinity]
396
+ except KeyError:
397
+ pass
398
+ filtration = normalized
399
+
400
+ return FilteredVectorSpace_class(base_ring, dim, generators, filtration, check=check)
401
+
402
+
403
+ class FilteredVectorSpace_class(FreeModule_ambient_field):
404
+
405
+ def __init__(self, base_ring, dim, generators, filtration, check=True):
406
+ r"""
407
+ A descending filtration of a vector space.
408
+
409
+ INPUT:
410
+
411
+ - ``base_ring`` -- a field; the base field of the ambient vector space
412
+
413
+ - ``dim`` -- integer; the dimension of the ambient vector space
414
+
415
+ - ``generators`` -- tuple of generators for the ambient vector
416
+ space. These will be used to span the subspaces of the
417
+ filtration.
418
+
419
+ - ``filtration`` -- dictionary of filtration steps in ray
420
+ index notation. See
421
+ :func:`construct_from_generators_indices` for details.
422
+
423
+ - ``check`` -- boolean (default: ``True``); whether
424
+ to perform consistency checks
425
+
426
+ TESTS::
427
+
428
+ sage: from sage.modules.filtered_vector_space import FilteredVectorSpace_class
429
+ sage: gens = [(1,0,0), (1,1,0), (1,2,0), (-1,-1, 0), (0,0,1)]
430
+ sage: FilteredVectorSpace_class(QQ, 3, gens, {2:(0,1), oo:(4,)})
431
+ QQ^3 >= QQ^1
432
+ sage: FilteredVectorSpace_class(QQ, 3, gens, {2:(0,1), 3:(4,)})
433
+ QQ^3 >= QQ^1 >= 0
434
+
435
+ The trivial filtration::
436
+
437
+ sage: FilteredVectorSpace_class(QQ, 3, gens, {}, QQ)
438
+ 0 in QQ^3
439
+
440
+ The empty vector space::
441
+
442
+ sage: FilteredVectorSpace_class(QQ, 0, [], {})
443
+ 0
444
+
445
+ Higher-degree generators are automatically generators in lower degrees::
446
+
447
+ sage: FilteredVectorSpace_class(QQ, 3, gens, {2:(4,), 3:(1,)})
448
+ QQ^2 >= QQ^1 >= 0 in QQ^3
449
+ """
450
+ if check:
451
+ assert isinstance(dim, Integer)
452
+ assert base_ring in Fields()
453
+ super().__init__(base_ring, dim)
454
+
455
+ if check:
456
+ assert matrix(generators).rank() == self.dimension()
457
+ assert isinstance(filtration, dict)
458
+ for degree, indices in filtration.items():
459
+ assert isinstance(degree, Integer) or degree == infinity
460
+ assert isinstance(indices, tuple)
461
+ assert all(isinstance(r, Integer) for r in indices)
462
+
463
+ # Construct subspaces from the generators and store in self._filt
464
+ def make_subspace(indices):
465
+ return self.span([generators[i] for i in indices])
466
+
467
+ indices = set(filtration.pop(infinity, []))
468
+ V = make_subspace(indices)
469
+ filtered_subspaces = [(infinity, V)]
470
+ for deg in sorted(filtration.keys(), reverse=True):
471
+ next_V = V
472
+ indices.update(filtration[deg])
473
+ V = make_subspace(indices)
474
+ if V == next_V: # skip trivial filtrations
475
+ continue
476
+ filtered_subspaces.append((deg, V))
477
+ filtered_subspaces.append((minus_infinity, V))
478
+ filtered_subspaces.reverse()
479
+ self._filt = tuple(filtered_subspaces)
480
+ assert self._filt[0][0] is minus_infinity
481
+
482
+ def change_ring(self, base_ring):
483
+ """
484
+ Return the same filtration over a different base ring.
485
+
486
+ INPUT:
487
+
488
+ - ``base_ring`` -- the new base ring
489
+
490
+ OUTPUT:
491
+
492
+ This method returns a new filtered vector space whose
493
+ subspaces are defined by the same generators but over a
494
+ different base ring.
495
+
496
+ EXAMPLES::
497
+
498
+ sage: V = FilteredVectorSpace(1, 0); V
499
+ QQ^1 >= 0
500
+ sage: V.change_ring(RDF)
501
+ RDF^1 >= 0
502
+ """
503
+ generators, filtration = self.presentation()
504
+ return FilteredVectorSpace(generators, filtration, base_ring=base_ring)
505
+
506
+ def ambient_vector_space(self):
507
+ """
508
+ Return the ambient (unfiltered) vector space.
509
+
510
+ OUTPUT: a vector space
511
+
512
+ EXAMPLES::
513
+
514
+ sage: V = FilteredVectorSpace(1, 0)
515
+ sage: V.ambient_vector_space()
516
+ Vector space of dimension 1 over Rational Field
517
+ """
518
+ return VectorSpace(self.base_ring(), self.dimension())
519
+
520
+ @cached_method
521
+ def is_constant(self) -> bool:
522
+ """
523
+ Return whether the filtration is constant.
524
+
525
+ OUTPUT: boolean; whether the filtered vector spaces are identical in
526
+ all degrees
527
+
528
+ EXAMPLES::
529
+
530
+ sage: V = FilteredVectorSpace(2); V
531
+ QQ^2
532
+ sage: V.is_constant()
533
+ True
534
+
535
+ sage: V = FilteredVectorSpace(1, 0); V
536
+ QQ^1 >= 0
537
+ sage: V.is_constant()
538
+ False
539
+
540
+ sage: V = FilteredVectorSpace({0:[(1,)]}); V
541
+ QQ^1 >= 0
542
+ sage: V.is_constant()
543
+ False
544
+ """
545
+ f = self._filt
546
+ return (len(f) == 1) or (len(f) == 2 and f[1][0] == infinity)
547
+
548
+ def is_exhaustive(self) -> bool:
549
+ r"""
550
+ Return whether the filtration is exhaustive.
551
+
552
+ A filtration `\{F_d\}` in an ambient vector space `V` is
553
+ exhaustive if `\cup F_d = V`. See also :meth:`is_separating`.
554
+
555
+ OUTPUT: boolean
556
+
557
+ EXAMPLES::
558
+
559
+ sage: F = FilteredVectorSpace({0:[(1,1)]}); F
560
+ QQ^1 >= 0 in QQ^2
561
+ sage: F.is_exhaustive()
562
+ False
563
+ sage: G = FilteredVectorSpace(2, 0); G
564
+ QQ^2 >= 0
565
+ sage: G.is_exhaustive()
566
+ True
567
+ """
568
+ return self.get_degree(minus_infinity).dimension() == \
569
+ self.ambient_vector_space().dimension()
570
+
571
+ def is_separating(self) -> bool:
572
+ r"""
573
+ Return whether the filtration is separating.
574
+
575
+ A filtration `\{F_d\}` in an ambient vector space `V` is
576
+ exhaustive if `\cap F_d = 0`. See also :meth:`is_exhaustive`.
577
+
578
+ OUTPUT: boolean
579
+
580
+ EXAMPLES::
581
+
582
+ sage: F = FilteredVectorSpace({0:[(1,1)]}); F
583
+ QQ^1 >= 0 in QQ^2
584
+ sage: F.is_separating()
585
+ True
586
+ sage: G = FilteredVectorSpace({0:[(1,1,0)], oo:[(0,0,1)]}); G
587
+ QQ^2 >= QQ^1 in QQ^3
588
+ sage: G.is_separating()
589
+ False
590
+ """
591
+ return self.get_degree(infinity).dimension() == 0
592
+
593
+ @cached_method
594
+ def support(self):
595
+ """
596
+ Return the degrees in which there are non-trivial generators.
597
+
598
+ OUTPUT:
599
+
600
+ A tuple of integers (and plus infinity) in ascending
601
+ order. The last entry is plus infinity if and only if the
602
+ filtration is not separating (see :meth:`is_separating`).
603
+
604
+ EXAMPLES::
605
+
606
+ sage: G = FilteredVectorSpace({0:[(1,1,0)], 3:[(0,1,0)]}); G
607
+ QQ^2 >= QQ^1 >= QQ^1 >= QQ^1 >= 0 in QQ^3
608
+ sage: G.support()
609
+ (0, 3)
610
+
611
+ sage: G = FilteredVectorSpace({0:[(1,1,0)], 3:[(0,1,0)], oo:[(0,0,1)]}); G
612
+ QQ^3 >= QQ^2 >= QQ^2 >= QQ^2 >= QQ^1
613
+ sage: G.support()
614
+ (0, 3, +Infinity)
615
+ """
616
+ if self.is_separating():
617
+ filt = self._filt[1:-1]
618
+ else:
619
+ filt = self._filt[1:]
620
+ return tuple(f[0] for f in filt)
621
+
622
+ @cached_method
623
+ def min_degree(self):
624
+ r"""
625
+ Return the lowest degree of the filtration.
626
+
627
+ OUTPUT:
628
+
629
+ Integer or plus infinity. The largest degree `d` of the
630
+ (descending) filtration such that the filtered vector space
631
+ `F_d` is still equal to `F_{-\infty}`.
632
+
633
+ EXAMPLES::
634
+
635
+ sage: FilteredVectorSpace(1, 3).min_degree()
636
+ 3
637
+ sage: FilteredVectorSpace(2).min_degree()
638
+ +Infinity
639
+ """
640
+ if self.is_constant():
641
+ return infinity
642
+ return self._filt[1][0]
643
+
644
+ @cached_method
645
+ def max_degree(self):
646
+ r"""
647
+ Return the highest degree of the filtration.
648
+
649
+ OUTPUT:
650
+
651
+ Integer or minus infinity. The smallest degree of the
652
+ filtration such that the filtration is constant to the right.
653
+
654
+ EXAMPLES::
655
+
656
+ sage: FilteredVectorSpace(1, 3).max_degree()
657
+ 4
658
+ sage: FilteredVectorSpace({0:[[1]]}).max_degree()
659
+ 1
660
+ sage: FilteredVectorSpace(3).max_degree()
661
+ -Infinity
662
+ """
663
+ f = self._filt
664
+ if len(f) == 1:
665
+ return minus_infinity
666
+ d = f[-1][0]
667
+ if d == infinity:
668
+ if len(f) == 1:
669
+ return minus_infinity
670
+ else:
671
+ return f[-2][0] + 1
672
+ else:
673
+ return d + 1
674
+
675
+ def get_degree(self, d):
676
+ r"""
677
+ Return the degree-``d`` entry of the filtration.
678
+
679
+ INPUT:
680
+
681
+ - ``d`` -- integer; the desired degree of the filtration
682
+
683
+ OUTPUT:
684
+
685
+ The degree-``d`` vector space in the filtration as subspace of
686
+ the ambient space.
687
+
688
+ EXAMPLES::
689
+
690
+ sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
691
+ sage: F = FilteredVectorSpace(rays, {3:[1], 1:[1,2]})
692
+ sage: F.get_degree(2)
693
+ Vector space of degree 2 and dimension 1 over Rational Field
694
+ Basis matrix:
695
+ [1 1]
696
+ sage: F.get_degree(oo)
697
+ Vector space of degree 2 and dimension 0 over Rational Field
698
+ Basis matrix:
699
+ []
700
+ sage: F.get_degree(-oo)
701
+ Vector space of degree 2 and dimension 2 over Rational Field
702
+ Basis matrix:
703
+ [1 0]
704
+ [0 1]
705
+ """
706
+ d = normalize_degree(d)
707
+ for deg, Vdeg in self._filt:
708
+ if d <= deg:
709
+ return Vdeg
710
+ assert False # unreachable
711
+
712
+ def graded(self, d):
713
+ r"""
714
+ Return the associated graded vectorspace.
715
+
716
+ INPUT:
717
+
718
+ - ``d`` -- integer; the degree
719
+
720
+ OUTPUT: the quotient `G_d = F_d / F_{d+1}`
721
+
722
+ EXAMPLES::
723
+
724
+ sage: rays = [(1,0), (1,1), (1,2)]
725
+ sage: F = FilteredVectorSpace(rays, {3:[1], 1:[1,2]})
726
+ sage: F.graded(1)
727
+ Vector space quotient V/W of dimension 1 over Rational Field where
728
+ V: Vector space of degree 2 and dimension 2 over Rational Field
729
+ Basis matrix:
730
+ [1 0]
731
+ [0 1]
732
+ W: Vector space of degree 2 and dimension 1 over Rational Field
733
+ Basis matrix:
734
+ [1 1]
735
+ """
736
+ return self.get_degree(d).quotient(self.get_degree(d + 1))
737
+
738
+ def presentation(self):
739
+ """
740
+ Return a presentation in term of generators of various degrees.
741
+
742
+ OUTPUT:
743
+
744
+ A pair consisting of generators and a filtration suitable as
745
+ input to :func:`~construct_from_generators_indices`.
746
+
747
+ EXAMPLES::
748
+
749
+ sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
750
+ sage: F = FilteredVectorSpace(rays, {0:[1, 2], 2:[3]}); F
751
+ QQ^2 >= QQ^1 >= QQ^1 >= 0
752
+ sage: F.presentation()
753
+ (((0, 1), (1, 0), (1, 1)), {0: (1, 0), 2: (2,), +Infinity: ()})
754
+ """
755
+ # this could be done more efficiently with (potentially) less generators
756
+ generators = set()
757
+ filt = self._filt[1:]
758
+ for d, V in filt:
759
+ generators.update(V.echelonized_basis())
760
+ generators = tuple(sorted(generators))
761
+
762
+ filtration = {}
763
+ for d, V in filt:
764
+ indices = [ZZ(generators.index(v)) for v in V.echelonized_basis()]
765
+ filtration[d] = tuple(indices)
766
+ return generators, filtration
767
+
768
+ def _repr_field_name(self):
769
+ """
770
+ Return an abbreviated field name as string.
771
+
772
+ .. NOTE: This should rather be a method of fields and rings.
773
+
774
+ RAISES:
775
+
776
+ :exc:`NotImplementedError`: The field does not have an
777
+ abbreviated name defined.
778
+
779
+ EXAMPLES::
780
+
781
+ sage: FilteredVectorSpace(2, base_ring=QQ)._repr_field_name()
782
+ 'QQ'
783
+
784
+ sage: F.<a> = GF(9) # needs sage.rings.finite_rings
785
+ sage: FilteredVectorSpace(2, base_ring=F)._repr_field_name() # needs sage.rings.finite_rings
786
+ 'GF(9)'
787
+
788
+ sage: FilteredVectorSpace(2, base_ring=AA)._repr_field_name() # needs sage.rings.number_field
789
+ Traceback (most recent call last):
790
+ ...
791
+ NotImplementedError
792
+ """
793
+ if self.base_ring() == QQ:
794
+ return 'QQ'
795
+ elif self.base_ring() == RDF:
796
+ return 'RDF'
797
+ elif self.base_ring() == RR:
798
+ return 'RR'
799
+ from sage.categories.finite_fields import FiniteFields
800
+ if self.base_ring() in FiniteFields():
801
+ return 'GF({})'.format(len(self.base_ring()))
802
+ else:
803
+ raise NotImplementedError()
804
+
805
+ def _repr_vector_space(self, dim):
806
+ """
807
+ Return a string representation of the vector space of given dimension.
808
+
809
+ INPUT:
810
+
811
+ - ``dim`` -- integer
812
+
813
+ OUTPUT: string representation of the vector space of dimension ``dim``
814
+
815
+ EXAMPLES::
816
+
817
+ sage: F = FilteredVectorSpace(3, base_ring=RDF)
818
+ sage: F._repr_vector_space(1234)
819
+ 'RDF^1234'
820
+ sage: F3 = FilteredVectorSpace(3, base_ring=GF(3))
821
+ sage: F3._repr_vector_space(1234)
822
+ 'GF(3)^1234'
823
+ sage: F3 = FilteredVectorSpace(3, base_ring=AA) # needs sage.rings.number_field
824
+ sage: F3._repr_vector_space(1234) # needs sage.rings.number_field
825
+ 'Vector space of dimension 1234 over Algebraic Real Field'
826
+ """
827
+ if dim == 0:
828
+ return '0'
829
+ try:
830
+ return self._repr_field_name() + '^' + str(dim)
831
+ except NotImplementedError:
832
+ return repr(VectorSpace(self.base_ring(), dim))
833
+
834
+ def _repr_degrees(self, min_deg, max_deg):
835
+ """
836
+ Return a string representation.
837
+
838
+ This method is like :meth:`_repr_` except that the user can
839
+ select the range of degrees to be shown in the output.
840
+
841
+ INPUT:
842
+
843
+ - ``min_deg``, ``max_deg`` -- two integers
844
+
845
+ EXAMPLES::
846
+
847
+ sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
848
+ sage: F = FilteredVectorSpace(rays, {0:[1, 2], 2:[3]})
849
+ sage: F._repr_degrees(-2, 4)
850
+ ['QQ^2', 'QQ^2', 'QQ^2', 'QQ^1', 'QQ^1', '0', '0', '0']
851
+ """
852
+ degrees = list(range(min_deg, max_deg + 1))
853
+ dims = []
854
+ for i in degrees + [infinity]:
855
+ d = self.get_degree(i).dimension()
856
+ dims.append(self._repr_vector_space(d))
857
+ return dims
858
+
859
+ def _repr_(self):
860
+ r"""
861
+ Return as string representation of ``self``.
862
+
863
+ OUTPUT: string
864
+
865
+ EXAMPLES::
866
+
867
+ sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
868
+ sage: FilteredVectorSpace(rays, {0:[1, 2], 2:[3]})._repr_()
869
+ 'QQ^2 >= QQ^1 >= QQ^1 >= 0'
870
+ sage: FilteredVectorSpace(rays, {0:[1, 2], oo:[3]})
871
+ QQ^2 >= QQ^1
872
+ sage: FilteredVectorSpace(rays, {oo:[3]})
873
+ QQ^1 in QQ^2
874
+ sage: FilteredVectorSpace(rays, {0:[3]})
875
+ QQ^1 >= 0 in QQ^2
876
+ sage: FilteredVectorSpace({1:[(1,0), (-1,1)], 3:[(1,0)]}, base_ring=GF(3))
877
+ GF(3)^2 >= GF(3)^1 >= GF(3)^1 >= 0
878
+ sage: FilteredVectorSpace({1:[(1,0), (-1,1)], 3:[(1,0)]}, base_ring=AA) # needs sage.rings.number_field
879
+ Vector space of dimension 2 over Algebraic Real Field
880
+ >= Vector space of dimension 1 over Algebraic Real Field
881
+ >= Vector space of dimension 1 over Algebraic Real Field >= 0
882
+ """
883
+ finite_support = [d for d in self.support() if d != infinity]
884
+ if len(finite_support) == 0:
885
+ dims = self._repr_degrees(0, -1)
886
+ else:
887
+ min_deg = finite_support[0]
888
+ max_deg = finite_support[-1]
889
+ dims = self._repr_degrees(min_deg, max_deg)
890
+ s = ' >= '.join(dims)
891
+ if not self.is_exhaustive():
892
+ s += ' in ' + self._repr_vector_space(self.degree())
893
+ return s
894
+
895
+ def __eq__(self, other):
896
+ """
897
+ Return whether ``self`` is equal to ``other``.
898
+
899
+ EXAMPLES::
900
+
901
+ sage: V = FilteredVectorSpace(2, 0)
902
+ sage: W = FilteredVectorSpace([(1,0),(0,1)], {0:[0, 1]})
903
+ sage: V == W
904
+ True
905
+ sage: V is W
906
+ False
907
+
908
+ sage: W = FilteredVectorSpace([(1,0),(1,1)], {0:[1]})
909
+ sage: V == W
910
+ False
911
+
912
+ TESTS::
913
+
914
+ sage: # needs palp sage.geometry.polyhedron sage.graphs sage.schemes
915
+ sage: P = toric_varieties.P2()
916
+ sage: T_P = P.sheaves.tangent_bundle()
917
+ sage: O_P = P.sheaves.trivial_bundle(1)
918
+ sage: S1 = T_P + O_P
919
+ sage: S2 = O_P + T_P
920
+ sage: S1._filt[0].is_isomorphic(S2._filt[0]) # known bug
921
+ True
922
+
923
+ sage: FilteredVectorSpace(2, base_ring=QQ) == FilteredVectorSpace(2, base_ring=GF(5))
924
+ False
925
+ """
926
+ if type(self) is not type(other):
927
+ return False
928
+ if self.base_ring() != other.base_ring():
929
+ return False
930
+ if self.dimension() != other.dimension():
931
+ return False
932
+ if len(self._filt) != len(other._filt):
933
+ return False
934
+ for self_filt, other_filt in zip(self._filt, other._filt):
935
+ if self_filt[0] != other_filt[0]:
936
+ # compare degree
937
+ return False
938
+ if (self_filt[1].echelonized_basis_matrix() !=
939
+ other_filt[1].echelonized_basis_matrix()):
940
+ # compare vector subspace
941
+ return False
942
+ return True
943
+
944
+ def __ne__(self, other):
945
+ """
946
+ Return whether ``self`` is not equal to ``other``.
947
+
948
+ EXAMPLES::
949
+
950
+ sage: V = FilteredVectorSpace(2, 0)
951
+ sage: W = FilteredVectorSpace([(1,0),(0,1)], {0:[0, 1]})
952
+ sage: V != W
953
+ False
954
+
955
+ sage: W = FilteredVectorSpace([(1,0),(1,1)], {0:[1]})
956
+ sage: V != W
957
+ True
958
+ """
959
+ return not (self == other)
960
+
961
+ def direct_sum(self, other):
962
+ """
963
+ Return the direct sum.
964
+
965
+ INPUT:
966
+
967
+ - ``other`` -- a filtered vector space
968
+
969
+ OUTPUT: the direct sum as a filtered vector space
970
+
971
+ EXAMPLES::
972
+
973
+ sage: V = FilteredVectorSpace(2, 0)
974
+ sage: W = FilteredVectorSpace({0:[(1,-1),(2,1)], 1:[(1,1)]})
975
+ sage: V.direct_sum(W)
976
+ QQ^4 >= QQ^1 >= 0
977
+ sage: V + W # syntactic sugar
978
+ QQ^4 >= QQ^1 >= 0
979
+ sage: V + V == FilteredVectorSpace(4, 0)
980
+ True
981
+
982
+ sage: W = FilteredVectorSpace([(1,-1),(2,1)], {1:[0,1], 2:[1]})
983
+ sage: V + W
984
+ QQ^4 >= QQ^2 >= QQ^1 >= 0
985
+
986
+ A suitable base ring is chosen if they do not match::
987
+
988
+ sage: v = [(1,0), (0,1)]
989
+ sage: F1 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=QQ)
990
+ sage: F2 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=RDF)
991
+ sage: F1 + F2 # needs scipy
992
+ RDF^4 >= RDF^2 >= 0
993
+ """
994
+ from sage.structure.element import get_coercion_model
995
+ base_ring = get_coercion_model().common_parent(self.base_ring(), other.base_ring())
996
+ # construct the generators
997
+ self_gens, self_filt = self.presentation()
998
+ other_gens, other_filt = other.presentation()
999
+ generators = \
1000
+ [list(v) + [base_ring.zero()] * other.dimension() for v in self_gens] + \
1001
+ [[base_ring.zero()] * self.dimension() + list(v) for v in other_gens]
1002
+
1003
+ # construct the filtration dictionary
1004
+ def join_indices(self_indices, other_indices):
1005
+ self_indices = tuple(self_indices)
1006
+ other_indices = tuple(i + len(self_gens) for i in other_indices)
1007
+ return self_indices + other_indices
1008
+ filtration = {}
1009
+ self_indices = set()
1010
+ other_indices = set()
1011
+ degrees = list(self_filt) + list(other_filt)
1012
+ for deg in sorted(set(degrees), reverse=True):
1013
+ self_indices.update(self_filt.get(deg, []))
1014
+ other_indices.update(other_filt.get(deg, []))
1015
+ gens = join_indices(self_indices, other_indices)
1016
+ filtration[deg] = gens
1017
+ return FilteredVectorSpace(generators, filtration, base_ring=base_ring)
1018
+
1019
+ __add__ = direct_sum
1020
+
1021
+ def tensor_product(self, other):
1022
+ r"""
1023
+ Return the graded tensor product.
1024
+
1025
+ INPUT:
1026
+
1027
+ - ``other`` -- a filtered vector space
1028
+
1029
+ OUTPUT:
1030
+
1031
+ The graded tensor product, that is, the tensor product of a
1032
+ generator of degree `d_1` with a generator in degree `d_2` has
1033
+ degree `d_1 + d_2`.
1034
+
1035
+ EXAMPLES::
1036
+
1037
+ sage: F1 = FilteredVectorSpace(1, 1)
1038
+ sage: F2 = FilteredVectorSpace(1, 2)
1039
+ sage: F1.tensor_product(F2)
1040
+ QQ^1 >= 0
1041
+ sage: F1 * F2
1042
+ QQ^1 >= 0
1043
+
1044
+ sage: F1.min_degree()
1045
+ 1
1046
+ sage: F2.min_degree()
1047
+ 2
1048
+ sage: (F1*F2).min_degree()
1049
+ 3
1050
+
1051
+ A suitable base ring is chosen if they do not match::
1052
+
1053
+ sage: v = [(1,0), (0,1)]
1054
+ sage: F1 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=QQ)
1055
+ sage: F2 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=RDF)
1056
+ sage: F1 * F2 # needs scipy
1057
+ RDF^4 >= RDF^3 >= RDF^1 >= 0
1058
+ """
1059
+ V = self
1060
+ W = other
1061
+ from sage.structure.element import get_coercion_model
1062
+ base_ring = get_coercion_model().common_parent(V.base_ring(), W.base_ring())
1063
+ from sage.modules.tensor_operations import VectorCollection, TensorOperation
1064
+ V_generators, V_indices = V.presentation()
1065
+ W_generators, W_indices = W.presentation()
1066
+ V_coll = VectorCollection(V_generators, base_ring, V.dimension())
1067
+ W_coll = VectorCollection(W_generators, base_ring, W.dimension())
1068
+ T = TensorOperation([V_coll, W_coll], 'product')
1069
+
1070
+ filtration = {}
1071
+ for V_deg in V.support():
1072
+ for W_deg in W.support():
1073
+ deg = V_deg + W_deg
1074
+ indices = filtration.get(deg, set())
1075
+ for i in V_indices[V_deg]:
1076
+ for j in W_indices[W_deg]:
1077
+ i_tensor_j = T.index_map(i, j)
1078
+ indices.add(i_tensor_j)
1079
+ filtration[deg] = indices
1080
+ return FilteredVectorSpace(T.vectors(), filtration, base_ring=base_ring)
1081
+
1082
+ __mul__ = tensor_product
1083
+
1084
+ def _power_operation(self, n, operation):
1085
+ """
1086
+ Return tensor power operation.
1087
+
1088
+ INPUT:
1089
+
1090
+ - ``n`` -- integer; the number of factors of ``self``
1091
+
1092
+ - ``operation`` -- string. See
1093
+ :class:`~sage.modules.tensor_operations.TensorOperation` for
1094
+ details.
1095
+
1096
+ EXAMPLES::
1097
+
1098
+ sage: F = FilteredVectorSpace(1, 1) + FilteredVectorSpace(1, 2); F
1099
+ QQ^2 >= QQ^1 >= 0
1100
+ sage: F._power_operation(2, 'symmetric')
1101
+ QQ^3 >= QQ^2 >= QQ^1 >= 0
1102
+ sage: F._power_operation(2, 'antisymmetric') # needs sage.groups
1103
+ QQ^1 >= 0
1104
+ """
1105
+ from sage.modules.tensor_operations import VectorCollection, TensorOperation
1106
+ generators, indices = self.presentation()
1107
+ V = VectorCollection(generators, self.base_ring(), self.dimension())
1108
+ T = TensorOperation([V] * n, operation)
1109
+
1110
+ iters = [self.support()] * n
1111
+ filtration = {}
1112
+ for degrees in product(*iters):
1113
+ deg = sum(degrees)
1114
+ filt_deg = filtration.get(deg, set())
1115
+ for i in product(*[indices.get(d) for d in degrees]):
1116
+ pow_i = T.index_map(*i)
1117
+ if pow_i is not None:
1118
+ filt_deg.add(pow_i)
1119
+ filtration[deg] = filt_deg
1120
+ return FilteredVectorSpace(T.vectors(), filtration, base_ring=self.base_ring())
1121
+
1122
+ def exterior_power(self, n):
1123
+ """
1124
+ Return the `n`-th graded exterior power.
1125
+
1126
+ INPUT:
1127
+
1128
+ - ``n`` -- integer; exterior product of how many copies of ``self``
1129
+
1130
+ OUTPUT:
1131
+
1132
+ The graded exterior product, that is, the wedge product of a
1133
+ generator of degree `d_1` with a generator in degree `d_2` has
1134
+ degree `d_1 + d_2`.
1135
+
1136
+ EXAMPLES::
1137
+
1138
+ sage: # needs sage.groups
1139
+ sage: F = FilteredVectorSpace(1, 1) + FilteredVectorSpace(1, 2); F
1140
+ QQ^2 >= QQ^1 >= 0
1141
+ sage: F.exterior_power(1)
1142
+ QQ^2 >= QQ^1 >= 0
1143
+ sage: F.exterior_power(2)
1144
+ QQ^1 >= 0
1145
+ sage: F.exterior_power(3)
1146
+ 0
1147
+ sage: F.wedge(2)
1148
+ QQ^1 >= 0
1149
+ """
1150
+ return self._power_operation(n, 'antisymmetric')
1151
+
1152
+ wedge = exterior_power
1153
+
1154
+ def symmetric_power(self, n):
1155
+ """
1156
+ Return the `n`-th graded symmetric power.
1157
+
1158
+ INPUT:
1159
+
1160
+ - ``n`` -- integer; symmetric product of how many copies of
1161
+ ``self``
1162
+
1163
+ OUTPUT:
1164
+
1165
+ The graded symmetric product, that is, the symmetrization of a
1166
+ generator of degree `d_1` with a generator in degree `d_2` has
1167
+ degree `d_1 + d_2`.
1168
+
1169
+ EXAMPLES::
1170
+
1171
+ sage: F = FilteredVectorSpace(1, 1) + FilteredVectorSpace(1, 2); F
1172
+ QQ^2 >= QQ^1 >= 0
1173
+ sage: F.symmetric_power(2)
1174
+ QQ^3 >= QQ^2 >= QQ^1 >= 0
1175
+ """
1176
+ return self._power_operation(n, 'symmetric')
1177
+
1178
+ def dual(self):
1179
+ """
1180
+ Return the dual filtered vector space.
1181
+
1182
+ OUTPUT:
1183
+
1184
+ The graded dual, that is, the dual of a degree-`d` subspace is
1185
+ a set of linear constraints in degree `-d+1`. That is, the
1186
+ dual generators live in degree `-d`.
1187
+
1188
+ EXAMPLES::
1189
+
1190
+ sage: gens = identity_matrix(3).rows()
1191
+ sage: F = FilteredVectorSpace(gens, {0:[0,1,2], 2:[0]}); F
1192
+ QQ^3 >= QQ^1 >= QQ^1 >= 0
1193
+ sage: F.support()
1194
+ (0, 2)
1195
+
1196
+ sage: F.dual()
1197
+ QQ^3 >= QQ^2 >= QQ^2 >= 0
1198
+ sage: F.dual().support()
1199
+ (-2, 0)
1200
+ """
1201
+ filtration = {}
1202
+ prev_deg = minus_infinity
1203
+ for deg, V in self._filt[1:]:
1204
+ filtration[-prev_deg] = V.complement().echelonized_basis()
1205
+ prev_deg = deg
1206
+ return FilteredVectorSpace(filtration, base_ring=self.base_ring())
1207
+
1208
+ def shift(self, deg):
1209
+ """
1210
+ Return a filtered vector space with degrees shifted by a constant.
1211
+
1212
+ EXAMPLES::
1213
+
1214
+ sage: gens = identity_matrix(3).rows()
1215
+ sage: F = FilteredVectorSpace(gens, {0:[0,1,2], 2:[0]}); F
1216
+ QQ^3 >= QQ^1 >= QQ^1 >= 0
1217
+ sage: F.support()
1218
+ (0, 2)
1219
+ sage: F.shift(-5).support()
1220
+ (-5, -3)
1221
+ """
1222
+ generators, filtration = self.presentation()
1223
+ shifted = {}
1224
+ for d, indices in filtration.items():
1225
+ shifted[d + deg] = indices
1226
+ return FilteredVectorSpace(generators, shifted, base_ring=self.base_ring())
1227
+
1228
+ def random_deformation(self, epsilon=None):
1229
+ """
1230
+ Return a random deformation.
1231
+
1232
+ INPUT:
1233
+
1234
+ - ``epsilon`` -- a number in the base ring
1235
+
1236
+ OUTPUT:
1237
+
1238
+ A new filtered vector space where the generators of the
1239
+ subspaces are moved by ``epsilon`` times a random vector.
1240
+
1241
+ EXAMPLES::
1242
+
1243
+ sage: gens = identity_matrix(3).rows()
1244
+ sage: F = FilteredVectorSpace(gens, {0:[0,1,2], 2:[0]}); F
1245
+ QQ^3 >= QQ^1 >= QQ^1 >= 0
1246
+ sage: F.get_degree(2)
1247
+ Vector space of degree 3 and dimension 1 over Rational Field
1248
+ Basis matrix:
1249
+ [1 0 0]
1250
+ sage: G = F.random_deformation(1/50); G
1251
+ QQ^3 >= QQ^1 >= QQ^1 >= 0
1252
+ sage: D = G.get_degree(2)
1253
+ sage: D.degree()
1254
+ 3
1255
+ sage: v = D.basis_matrix()[0]
1256
+ sage: v[0]
1257
+ 1
1258
+
1259
+ sage: while F.random_deformation(1/50).get_degree(2).matrix() == matrix([1, 0, 0]):
1260
+ ....: pass
1261
+ """
1262
+ from sage.modules.free_module_element import random_vector
1263
+ R = self.base_ring()
1264
+ if epsilon is None:
1265
+ epsilon = R.one()
1266
+ filtration = {}
1267
+ for deg, filt in self._filt[1:]:
1268
+ generators = [v + epsilon * random_vector(R, self.rank())
1269
+ for v in filt.echelonized_basis()]
1270
+ filtration[deg] = generators
1271
+ return FilteredVectorSpace(filtration, base_ring=R, check=True)