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

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

Potentially problematic release.


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

Files changed (806) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +806 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  6. passagemath_modules.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  7. passagemath_modules.libs/libgsl-e3525837.so.28.0.0 +0 -0
  8. passagemath_modules.libs/libmpc-c5c421e1.so.3.3.1 +0 -0
  9. passagemath_modules.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  10. passagemath_modules.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  11. sage/algebras/all__sagemath_modules.py +20 -0
  12. sage/algebras/catalog.py +148 -0
  13. sage/algebras/clifford_algebra.py +3107 -0
  14. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  15. sage/algebras/clifford_algebra_element.pxd +16 -0
  16. sage/algebras/clifford_algebra_element.pyx +997 -0
  17. sage/algebras/commutative_dga.py +4252 -0
  18. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-gnu.so +0 -0
  19. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  20. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  21. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  22. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  28. sage/algebras/finite_gca.py +528 -0
  29. sage/algebras/group_algebra.py +232 -0
  30. sage/algebras/lie_algebras/abelian.py +197 -0
  31. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  32. sage/algebras/lie_algebras/all.py +25 -0
  33. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  34. sage/algebras/lie_algebras/bch.py +177 -0
  35. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  36. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  37. sage/algebras/lie_algebras/center_uea.py +767 -0
  38. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  39. sage/algebras/lie_algebras/examples.py +683 -0
  40. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  41. sage/algebras/lie_algebras/heisenberg.py +820 -0
  42. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  43. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  46. sage/algebras/lie_algebras/morphism.py +661 -0
  47. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  48. sage/algebras/lie_algebras/onsager.py +1324 -0
  49. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  50. sage/algebras/lie_algebras/quotient.py +462 -0
  51. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  52. sage/algebras/lie_algebras/representation.py +1040 -0
  53. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  54. sage/algebras/lie_algebras/subalgebra.py +967 -0
  55. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  56. sage/algebras/lie_algebras/verma_module.py +1630 -0
  57. sage/algebras/lie_algebras/virasoro.py +1186 -0
  58. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-gnu.so +0 -0
  59. sage/algebras/octonion_algebra.pxd +20 -0
  60. sage/algebras/octonion_algebra.pyx +987 -0
  61. sage/algebras/orlik_solomon.py +907 -0
  62. sage/algebras/orlik_terao.py +779 -0
  63. sage/algebras/steenrod/all.py +7 -0
  64. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  65. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  66. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  67. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  68. sage/algebras/weyl_algebra.py +1126 -0
  69. sage/all__sagemath_modules.py +62 -0
  70. sage/calculus/all__sagemath_modules.py +19 -0
  71. sage/calculus/expr.py +205 -0
  72. sage/calculus/integration.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/calculus/integration.pyx +698 -0
  74. sage/calculus/interpolation.cpython-314-aarch64-linux-gnu.so +0 -0
  75. sage/calculus/interpolation.pxd +13 -0
  76. sage/calculus/interpolation.pyx +387 -0
  77. sage/calculus/interpolators.cpython-314-aarch64-linux-gnu.so +0 -0
  78. sage/calculus/interpolators.pyx +326 -0
  79. sage/calculus/ode.cpython-314-aarch64-linux-gnu.so +0 -0
  80. sage/calculus/ode.pxd +5 -0
  81. sage/calculus/ode.pyx +610 -0
  82. sage/calculus/riemann.cpython-314-aarch64-linux-gnu.so +0 -0
  83. sage/calculus/riemann.pyx +1521 -0
  84. sage/calculus/test_sympy.py +201 -0
  85. sage/calculus/transforms/all.py +7 -0
  86. sage/calculus/transforms/dft.py +844 -0
  87. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-gnu.so +0 -0
  88. sage/calculus/transforms/dwt.pxd +7 -0
  89. sage/calculus/transforms/dwt.pyx +160 -0
  90. sage/calculus/transforms/fft.cpython-314-aarch64-linux-gnu.so +0 -0
  91. sage/calculus/transforms/fft.pxd +12 -0
  92. sage/calculus/transforms/fft.pyx +487 -0
  93. sage/calculus/wester.py +662 -0
  94. sage/coding/abstract_code.py +1108 -0
  95. sage/coding/ag_code.py +868 -0
  96. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/coding/ag_code_decoders.pyx +2639 -0
  98. sage/coding/all.py +15 -0
  99. sage/coding/bch_code.py +494 -0
  100. sage/coding/binary_code.cpython-314-aarch64-linux-gnu.so +0 -0
  101. sage/coding/binary_code.pxd +124 -0
  102. sage/coding/binary_code.pyx +4139 -0
  103. sage/coding/bounds_catalog.py +43 -0
  104. sage/coding/channel.py +819 -0
  105. sage/coding/channels_catalog.py +29 -0
  106. sage/coding/code_bounds.py +755 -0
  107. sage/coding/code_constructions.py +804 -0
  108. sage/coding/codes_catalog.py +111 -0
  109. sage/coding/cyclic_code.py +1329 -0
  110. sage/coding/databases.py +316 -0
  111. sage/coding/decoder.py +373 -0
  112. sage/coding/decoders_catalog.py +88 -0
  113. sage/coding/delsarte_bounds.py +709 -0
  114. sage/coding/encoder.py +390 -0
  115. sage/coding/encoders_catalog.py +64 -0
  116. sage/coding/extended_code.py +468 -0
  117. sage/coding/gabidulin_code.py +1058 -0
  118. sage/coding/golay_code.py +404 -0
  119. sage/coding/goppa_code.py +441 -0
  120. sage/coding/grs_code.py +2371 -0
  121. sage/coding/guava.py +107 -0
  122. sage/coding/guruswami_sudan/all.py +1 -0
  123. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  124. sage/coding/guruswami_sudan/interpolation.py +409 -0
  125. sage/coding/guruswami_sudan/utils.py +176 -0
  126. sage/coding/hamming_code.py +176 -0
  127. sage/coding/information_set_decoder.py +1032 -0
  128. sage/coding/kasami_codes.cpython-314-aarch64-linux-gnu.so +0 -0
  129. sage/coding/kasami_codes.pyx +351 -0
  130. sage/coding/linear_code.py +3067 -0
  131. sage/coding/linear_code_no_metric.py +1354 -0
  132. sage/coding/linear_rank_metric.py +961 -0
  133. sage/coding/parity_check_code.py +353 -0
  134. sage/coding/punctured_code.py +719 -0
  135. sage/coding/reed_muller_code.py +999 -0
  136. sage/coding/self_dual_codes.py +942 -0
  137. sage/coding/source_coding/all.py +2 -0
  138. sage/coding/source_coding/huffman.py +553 -0
  139. sage/coding/subfield_subcode.py +423 -0
  140. sage/coding/two_weight_db.py +399 -0
  141. sage/combinat/all__sagemath_modules.py +7 -0
  142. sage/combinat/cartesian_product.py +347 -0
  143. sage/combinat/family.py +11 -0
  144. sage/combinat/free_module.py +1977 -0
  145. sage/combinat/root_system/all.py +147 -0
  146. sage/combinat/root_system/ambient_space.py +527 -0
  147. sage/combinat/root_system/associahedron.py +471 -0
  148. sage/combinat/root_system/braid_move_calculator.py +143 -0
  149. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-gnu.so +0 -0
  150. sage/combinat/root_system/braid_orbit.pyx +144 -0
  151. sage/combinat/root_system/branching_rules.py +2301 -0
  152. sage/combinat/root_system/cartan_matrix.py +1245 -0
  153. sage/combinat/root_system/cartan_type.py +3069 -0
  154. sage/combinat/root_system/coxeter_group.py +162 -0
  155. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  156. sage/combinat/root_system/coxeter_type.py +681 -0
  157. sage/combinat/root_system/dynkin_diagram.py +900 -0
  158. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  159. sage/combinat/root_system/fundamental_group.py +795 -0
  160. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  161. sage/combinat/root_system/integrable_representations.py +1227 -0
  162. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  163. sage/combinat/root_system/pieri_factors.py +1147 -0
  164. sage/combinat/root_system/plot.py +1615 -0
  165. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  166. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  167. sage/combinat/root_system/root_space.py +487 -0
  168. sage/combinat/root_system/root_system.py +882 -0
  169. sage/combinat/root_system/type_A.py +348 -0
  170. sage/combinat/root_system/type_A_affine.py +227 -0
  171. sage/combinat/root_system/type_A_infinity.py +241 -0
  172. sage/combinat/root_system/type_B.py +347 -0
  173. sage/combinat/root_system/type_BC_affine.py +287 -0
  174. sage/combinat/root_system/type_B_affine.py +216 -0
  175. sage/combinat/root_system/type_C.py +317 -0
  176. sage/combinat/root_system/type_C_affine.py +188 -0
  177. sage/combinat/root_system/type_D.py +357 -0
  178. sage/combinat/root_system/type_D_affine.py +208 -0
  179. sage/combinat/root_system/type_E.py +641 -0
  180. sage/combinat/root_system/type_E_affine.py +231 -0
  181. sage/combinat/root_system/type_F.py +387 -0
  182. sage/combinat/root_system/type_F_affine.py +137 -0
  183. sage/combinat/root_system/type_G.py +293 -0
  184. sage/combinat/root_system/type_G_affine.py +132 -0
  185. sage/combinat/root_system/type_H.py +105 -0
  186. sage/combinat/root_system/type_I.py +110 -0
  187. sage/combinat/root_system/type_Q.py +150 -0
  188. sage/combinat/root_system/type_affine.py +509 -0
  189. sage/combinat/root_system/type_dual.py +704 -0
  190. sage/combinat/root_system/type_folded.py +301 -0
  191. sage/combinat/root_system/type_marked.py +748 -0
  192. sage/combinat/root_system/type_reducible.py +601 -0
  193. sage/combinat/root_system/type_relabel.py +730 -0
  194. sage/combinat/root_system/type_super_A.py +837 -0
  195. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  196. sage/combinat/root_system/weight_space.py +639 -0
  197. sage/combinat/root_system/weyl_characters.py +2238 -0
  198. sage/crypto/__init__.py +4 -0
  199. sage/crypto/all.py +28 -0
  200. sage/crypto/block_cipher/all.py +7 -0
  201. sage/crypto/block_cipher/des.py +1065 -0
  202. sage/crypto/block_cipher/miniaes.py +2171 -0
  203. sage/crypto/block_cipher/present.py +909 -0
  204. sage/crypto/block_cipher/sdes.py +1527 -0
  205. sage/crypto/boolean_function.cpython-314-aarch64-linux-gnu.so +0 -0
  206. sage/crypto/boolean_function.pxd +10 -0
  207. sage/crypto/boolean_function.pyx +1487 -0
  208. sage/crypto/cipher.py +78 -0
  209. sage/crypto/classical.py +3668 -0
  210. sage/crypto/classical_cipher.py +569 -0
  211. sage/crypto/cryptosystem.py +387 -0
  212. sage/crypto/key_exchange/all.py +7 -0
  213. sage/crypto/key_exchange/catalog.py +24 -0
  214. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  215. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  216. sage/crypto/lattice.py +312 -0
  217. sage/crypto/lfsr.py +295 -0
  218. sage/crypto/lwe.py +840 -0
  219. sage/crypto/mq/__init__.py +4 -0
  220. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  221. sage/crypto/mq/rijndael_gf.py +2345 -0
  222. sage/crypto/mq/sbox.py +7 -0
  223. sage/crypto/mq/sr.py +3344 -0
  224. sage/crypto/public_key/all.py +5 -0
  225. sage/crypto/public_key/blum_goldwasser.py +776 -0
  226. sage/crypto/sbox.cpython-314-aarch64-linux-gnu.so +0 -0
  227. sage/crypto/sbox.pyx +2090 -0
  228. sage/crypto/sboxes.py +2090 -0
  229. sage/crypto/stream.py +390 -0
  230. sage/crypto/stream_cipher.py +297 -0
  231. sage/crypto/util.py +519 -0
  232. sage/ext/all__sagemath_modules.py +1 -0
  233. sage/ext/interpreters/__init__.py +1 -0
  234. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  235. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-gnu.so +0 -0
  236. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  237. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  238. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-gnu.so +0 -0
  239. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  240. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  241. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-gnu.so +0 -0
  242. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  243. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  244. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-gnu.so +0 -0
  245. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  246. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  247. sage/geometry/all__sagemath_modules.py +5 -0
  248. sage/geometry/toric_lattice.py +1745 -0
  249. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-gnu.so +0 -0
  250. sage/geometry/toric_lattice_element.pyx +432 -0
  251. sage/groups/abelian_gps/abelian_group.py +1925 -0
  252. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  253. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  254. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  255. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  256. sage/groups/abelian_gps/element_base.py +341 -0
  257. sage/groups/abelian_gps/values.py +488 -0
  258. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  259. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  260. sage/groups/additive_abelian/all.py +4 -0
  261. sage/groups/additive_abelian/qmodnz.py +231 -0
  262. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  263. sage/groups/affine_gps/affine_group.py +535 -0
  264. sage/groups/affine_gps/all.py +1 -0
  265. sage/groups/affine_gps/catalog.py +17 -0
  266. sage/groups/affine_gps/euclidean_group.py +246 -0
  267. sage/groups/affine_gps/group_element.py +562 -0
  268. sage/groups/all__sagemath_modules.py +12 -0
  269. sage/groups/galois_group.py +479 -0
  270. sage/groups/matrix_gps/all.py +4 -0
  271. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  272. sage/groups/matrix_gps/catalog.py +26 -0
  273. sage/groups/matrix_gps/coxeter_group.py +927 -0
  274. sage/groups/matrix_gps/finitely_generated.py +487 -0
  275. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-gnu.so +0 -0
  276. sage/groups/matrix_gps/group_element.pxd +11 -0
  277. sage/groups/matrix_gps/group_element.pyx +431 -0
  278. sage/groups/matrix_gps/linear.py +440 -0
  279. sage/groups/matrix_gps/matrix_group.py +617 -0
  280. sage/groups/matrix_gps/named_group.py +296 -0
  281. sage/groups/matrix_gps/orthogonal.py +544 -0
  282. sage/groups/matrix_gps/symplectic.py +251 -0
  283. sage/groups/matrix_gps/unitary.py +436 -0
  284. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  285. sage/groups/misc_gps/argument_groups.py +1905 -0
  286. sage/groups/misc_gps/imaginary_groups.py +479 -0
  287. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  288. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-gnu.so +0 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  292. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-gnu.so +0 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  295. sage/homology/algebraic_topological_model.py +595 -0
  296. sage/homology/all.py +2 -0
  297. sage/homology/all__sagemath_modules.py +8 -0
  298. sage/homology/chain_complex.py +2148 -0
  299. sage/homology/chain_complex_homspace.py +165 -0
  300. sage/homology/chain_complex_morphism.py +629 -0
  301. sage/homology/chain_homotopy.py +604 -0
  302. sage/homology/chains.py +653 -0
  303. sage/homology/free_resolution.py +923 -0
  304. sage/homology/graded_resolution.py +567 -0
  305. sage/homology/hochschild_complex.py +756 -0
  306. sage/homology/homology_group.py +188 -0
  307. sage/homology/homology_morphism.py +422 -0
  308. sage/homology/homology_vector_space_with_basis.py +1454 -0
  309. sage/homology/koszul_complex.py +169 -0
  310. sage/homology/matrix_utils.py +205 -0
  311. sage/libs/all__sagemath_modules.py +1 -0
  312. sage/libs/gsl/__init__.py +1 -0
  313. sage/libs/gsl/airy.pxd +56 -0
  314. sage/libs/gsl/all.pxd +66 -0
  315. sage/libs/gsl/array.cpython-314-aarch64-linux-gnu.so +0 -0
  316. sage/libs/gsl/array.pxd +5 -0
  317. sage/libs/gsl/array.pyx +102 -0
  318. sage/libs/gsl/bessel.pxd +208 -0
  319. sage/libs/gsl/blas.pxd +116 -0
  320. sage/libs/gsl/blas_types.pxd +34 -0
  321. sage/libs/gsl/block.pxd +52 -0
  322. sage/libs/gsl/chebyshev.pxd +37 -0
  323. sage/libs/gsl/clausen.pxd +12 -0
  324. sage/libs/gsl/combination.pxd +47 -0
  325. sage/libs/gsl/complex.pxd +151 -0
  326. sage/libs/gsl/coulomb.pxd +30 -0
  327. sage/libs/gsl/coupling.pxd +21 -0
  328. sage/libs/gsl/dawson.pxd +12 -0
  329. sage/libs/gsl/debye.pxd +24 -0
  330. sage/libs/gsl/dilog.pxd +14 -0
  331. sage/libs/gsl/eigen.pxd +46 -0
  332. sage/libs/gsl/elementary.pxd +12 -0
  333. sage/libs/gsl/ellint.pxd +48 -0
  334. sage/libs/gsl/elljac.pxd +8 -0
  335. sage/libs/gsl/erf.pxd +32 -0
  336. sage/libs/gsl/errno.pxd +26 -0
  337. sage/libs/gsl/exp.pxd +44 -0
  338. sage/libs/gsl/expint.pxd +44 -0
  339. sage/libs/gsl/fermi_dirac.pxd +44 -0
  340. sage/libs/gsl/fft.pxd +121 -0
  341. sage/libs/gsl/fit.pxd +50 -0
  342. sage/libs/gsl/gamma.pxd +94 -0
  343. sage/libs/gsl/gegenbauer.pxd +26 -0
  344. sage/libs/gsl/histogram.pxd +176 -0
  345. sage/libs/gsl/hyperg.pxd +52 -0
  346. sage/libs/gsl/integration.pxd +69 -0
  347. sage/libs/gsl/interp.pxd +109 -0
  348. sage/libs/gsl/laguerre.pxd +24 -0
  349. sage/libs/gsl/lambert.pxd +16 -0
  350. sage/libs/gsl/legendre.pxd +90 -0
  351. sage/libs/gsl/linalg.pxd +185 -0
  352. sage/libs/gsl/log.pxd +26 -0
  353. sage/libs/gsl/math.pxd +43 -0
  354. sage/libs/gsl/matrix.pxd +143 -0
  355. sage/libs/gsl/matrix_complex.pxd +130 -0
  356. sage/libs/gsl/min.pxd +67 -0
  357. sage/libs/gsl/monte.pxd +56 -0
  358. sage/libs/gsl/ntuple.pxd +32 -0
  359. sage/libs/gsl/odeiv.pxd +70 -0
  360. sage/libs/gsl/permutation.pxd +78 -0
  361. sage/libs/gsl/poly.pxd +40 -0
  362. sage/libs/gsl/pow_int.pxd +12 -0
  363. sage/libs/gsl/psi.pxd +28 -0
  364. sage/libs/gsl/qrng.pxd +29 -0
  365. sage/libs/gsl/random.pxd +257 -0
  366. sage/libs/gsl/rng.pxd +100 -0
  367. sage/libs/gsl/roots.pxd +72 -0
  368. sage/libs/gsl/sort.pxd +36 -0
  369. sage/libs/gsl/statistics.pxd +59 -0
  370. sage/libs/gsl/sum.pxd +55 -0
  371. sage/libs/gsl/synchrotron.pxd +16 -0
  372. sage/libs/gsl/transport.pxd +24 -0
  373. sage/libs/gsl/trig.pxd +58 -0
  374. sage/libs/gsl/types.pxd +137 -0
  375. sage/libs/gsl/vector.pxd +101 -0
  376. sage/libs/gsl/vector_complex.pxd +83 -0
  377. sage/libs/gsl/wavelet.pxd +49 -0
  378. sage/libs/gsl/zeta.pxd +28 -0
  379. sage/libs/mpc/__init__.pxd +114 -0
  380. sage/libs/mpc/types.pxd +28 -0
  381. sage/libs/mpfr/__init__.pxd +299 -0
  382. sage/libs/mpfr/types.pxd +26 -0
  383. sage/libs/mpmath/__init__.py +1 -0
  384. sage/libs/mpmath/all.py +27 -0
  385. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  386. sage/libs/mpmath/utils.cpython-314-aarch64-linux-gnu.so +0 -0
  387. sage/libs/mpmath/utils.pxd +4 -0
  388. sage/libs/mpmath/utils.pyx +319 -0
  389. sage/matrix/action.cpython-314-aarch64-linux-gnu.so +0 -0
  390. sage/matrix/action.pxd +26 -0
  391. sage/matrix/action.pyx +596 -0
  392. sage/matrix/all.py +9 -0
  393. sage/matrix/args.cpython-314-aarch64-linux-gnu.so +0 -0
  394. sage/matrix/args.pxd +144 -0
  395. sage/matrix/args.pyx +1668 -0
  396. sage/matrix/benchmark.py +1258 -0
  397. sage/matrix/berlekamp_massey.py +95 -0
  398. sage/matrix/compute_J_ideal.py +926 -0
  399. sage/matrix/constructor.cpython-314-aarch64-linux-gnu.so +0 -0
  400. sage/matrix/constructor.pyx +750 -0
  401. sage/matrix/docs.py +430 -0
  402. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  403. sage/matrix/echelon_matrix.pyx +155 -0
  404. sage/matrix/matrix.pxd +2 -0
  405. sage/matrix/matrix0.cpython-314-aarch64-linux-gnu.so +0 -0
  406. sage/matrix/matrix0.pxd +68 -0
  407. sage/matrix/matrix0.pyx +6324 -0
  408. sage/matrix/matrix1.cpython-314-aarch64-linux-gnu.so +0 -0
  409. sage/matrix/matrix1.pxd +8 -0
  410. sage/matrix/matrix1.pyx +2851 -0
  411. sage/matrix/matrix2.cpython-314-aarch64-linux-gnu.so +0 -0
  412. sage/matrix/matrix2.pxd +25 -0
  413. sage/matrix/matrix2.pyx +20181 -0
  414. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-gnu.so +0 -0
  415. sage/matrix/matrix_cdv.pxd +4 -0
  416. sage/matrix/matrix_cdv.pyx +93 -0
  417. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  418. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  419. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  420. sage/matrix/matrix_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  421. sage/matrix/matrix_dense.pxd +5 -0
  422. sage/matrix/matrix_dense.pyx +343 -0
  423. sage/matrix/matrix_domain_dense.pxd +5 -0
  424. sage/matrix/matrix_domain_sparse.pxd +5 -0
  425. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  426. sage/matrix/matrix_double_dense.pxd +7 -0
  427. sage/matrix/matrix_double_dense.pyx +3906 -0
  428. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  429. sage/matrix/matrix_double_sparse.pxd +6 -0
  430. sage/matrix/matrix_double_sparse.pyx +248 -0
  431. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  432. sage/matrix/matrix_generic_dense.pxd +7 -0
  433. sage/matrix/matrix_generic_dense.pyx +354 -0
  434. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  435. sage/matrix/matrix_generic_sparse.pxd +7 -0
  436. sage/matrix/matrix_generic_sparse.pyx +461 -0
  437. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  440. sage/matrix/matrix_misc.py +313 -0
  441. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  442. sage/matrix/matrix_numpy_dense.pxd +14 -0
  443. sage/matrix/matrix_numpy_dense.pyx +450 -0
  444. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  445. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  446. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  447. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  448. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  449. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  450. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  451. sage/matrix/matrix_real_double_dense.pxd +7 -0
  452. sage/matrix/matrix_real_double_dense.pyx +122 -0
  453. sage/matrix/matrix_space.py +2848 -0
  454. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  455. sage/matrix/matrix_sparse.pxd +5 -0
  456. sage/matrix/matrix_sparse.pyx +1222 -0
  457. sage/matrix/matrix_window.cpython-314-aarch64-linux-gnu.so +0 -0
  458. sage/matrix/matrix_window.pxd +37 -0
  459. sage/matrix/matrix_window.pyx +242 -0
  460. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  461. sage/matrix/misc_mpfr.pyx +80 -0
  462. sage/matrix/operation_table.py +1182 -0
  463. sage/matrix/special.py +3666 -0
  464. sage/matrix/strassen.cpython-314-aarch64-linux-gnu.so +0 -0
  465. sage/matrix/strassen.pyx +851 -0
  466. sage/matrix/symplectic_basis.py +541 -0
  467. sage/matrix/template.pxd +6 -0
  468. sage/matrix/tests.py +71 -0
  469. sage/matroids/advanced.py +77 -0
  470. sage/matroids/all.py +13 -0
  471. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  472. sage/matroids/basis_exchange_matroid.pxd +96 -0
  473. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  474. sage/matroids/basis_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  475. sage/matroids/basis_matroid.pxd +45 -0
  476. sage/matroids/basis_matroid.pyx +1217 -0
  477. sage/matroids/catalog.py +44 -0
  478. sage/matroids/chow_ring.py +473 -0
  479. sage/matroids/chow_ring_ideal.py +849 -0
  480. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  481. sage/matroids/circuit_closures_matroid.pxd +16 -0
  482. sage/matroids/circuit_closures_matroid.pyx +559 -0
  483. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  484. sage/matroids/circuits_matroid.pxd +38 -0
  485. sage/matroids/circuits_matroid.pyx +947 -0
  486. sage/matroids/constructor.py +1086 -0
  487. sage/matroids/database_collections.py +365 -0
  488. sage/matroids/database_matroids.py +5338 -0
  489. sage/matroids/dual_matroid.py +583 -0
  490. sage/matroids/extension.cpython-314-aarch64-linux-gnu.so +0 -0
  491. sage/matroids/extension.pxd +34 -0
  492. sage/matroids/extension.pyx +519 -0
  493. sage/matroids/flats_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  494. sage/matroids/flats_matroid.pxd +28 -0
  495. sage/matroids/flats_matroid.pyx +715 -0
  496. sage/matroids/gammoid.py +600 -0
  497. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  498. sage/matroids/graphic_matroid.pxd +39 -0
  499. sage/matroids/graphic_matroid.pyx +2024 -0
  500. sage/matroids/lean_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  501. sage/matroids/lean_matrix.pxd +126 -0
  502. sage/matroids/lean_matrix.pyx +3667 -0
  503. sage/matroids/linear_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  504. sage/matroids/linear_matroid.pxd +180 -0
  505. sage/matroids/linear_matroid.pyx +6649 -0
  506. sage/matroids/matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  507. sage/matroids/matroid.pxd +243 -0
  508. sage/matroids/matroid.pyx +8759 -0
  509. sage/matroids/matroids_catalog.py +190 -0
  510. sage/matroids/matroids_plot_helpers.py +890 -0
  511. sage/matroids/minor_matroid.py +480 -0
  512. sage/matroids/minorfix.h +9 -0
  513. sage/matroids/named_matroids.py +5 -0
  514. sage/matroids/rank_matroid.py +268 -0
  515. sage/matroids/set_system.cpython-314-aarch64-linux-gnu.so +0 -0
  516. sage/matroids/set_system.pxd +38 -0
  517. sage/matroids/set_system.pyx +800 -0
  518. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  519. sage/matroids/transversal_matroid.pxd +14 -0
  520. sage/matroids/transversal_matroid.pyx +893 -0
  521. sage/matroids/union_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  522. sage/matroids/union_matroid.pxd +20 -0
  523. sage/matroids/union_matroid.pyx +331 -0
  524. sage/matroids/unpickling.cpython-314-aarch64-linux-gnu.so +0 -0
  525. sage/matroids/unpickling.pyx +843 -0
  526. sage/matroids/utilities.py +809 -0
  527. sage/misc/all__sagemath_modules.py +20 -0
  528. sage/misc/c3.cpython-314-aarch64-linux-gnu.so +0 -0
  529. sage/misc/c3.pyx +238 -0
  530. sage/misc/compat.py +87 -0
  531. sage/misc/element_with_label.py +173 -0
  532. sage/misc/func_persist.py +79 -0
  533. sage/misc/pickle_old.cpython-314-aarch64-linux-gnu.so +0 -0
  534. sage/misc/pickle_old.pyx +19 -0
  535. sage/misc/proof.py +7 -0
  536. sage/misc/replace_dot_all.py +472 -0
  537. sage/misc/sagedoc_conf.py +168 -0
  538. sage/misc/sphinxify.py +167 -0
  539. sage/misc/test_class_pickling.py +85 -0
  540. sage/modules/all.py +42 -0
  541. sage/modules/complex_double_vector.py +25 -0
  542. sage/modules/diamond_cutting.py +380 -0
  543. sage/modules/fg_pid/all.py +1 -0
  544. sage/modules/fg_pid/fgp_element.py +456 -0
  545. sage/modules/fg_pid/fgp_module.py +2091 -0
  546. sage/modules/fg_pid/fgp_morphism.py +550 -0
  547. sage/modules/filtered_vector_space.py +1271 -0
  548. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-gnu.so +0 -0
  549. sage/modules/finite_submodule_iter.pxd +27 -0
  550. sage/modules/finite_submodule_iter.pyx +452 -0
  551. sage/modules/fp_graded/all.py +1 -0
  552. sage/modules/fp_graded/element.py +346 -0
  553. sage/modules/fp_graded/free_element.py +298 -0
  554. sage/modules/fp_graded/free_homspace.py +53 -0
  555. sage/modules/fp_graded/free_module.py +1060 -0
  556. sage/modules/fp_graded/free_morphism.py +217 -0
  557. sage/modules/fp_graded/homspace.py +563 -0
  558. sage/modules/fp_graded/module.py +1340 -0
  559. sage/modules/fp_graded/morphism.py +1990 -0
  560. sage/modules/fp_graded/steenrod/all.py +1 -0
  561. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  562. sage/modules/fp_graded/steenrod/module.py +477 -0
  563. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  564. sage/modules/fp_graded/steenrod/profile.py +241 -0
  565. sage/modules/free_module.py +8447 -0
  566. sage/modules/free_module_element.cpython-314-aarch64-linux-gnu.so +0 -0
  567. sage/modules/free_module_element.pxd +22 -0
  568. sage/modules/free_module_element.pyx +5445 -0
  569. sage/modules/free_module_homspace.py +369 -0
  570. sage/modules/free_module_integer.py +896 -0
  571. sage/modules/free_module_morphism.py +823 -0
  572. sage/modules/free_module_pseudohomspace.py +352 -0
  573. sage/modules/free_module_pseudomorphism.py +578 -0
  574. sage/modules/free_quadratic_module.py +1706 -0
  575. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  576. sage/modules/matrix_morphism.py +1745 -0
  577. sage/modules/misc.py +103 -0
  578. sage/modules/module_functors.py +192 -0
  579. sage/modules/multi_filtered_vector_space.py +719 -0
  580. sage/modules/ore_module.py +2208 -0
  581. sage/modules/ore_module_element.py +178 -0
  582. sage/modules/ore_module_homspace.py +147 -0
  583. sage/modules/ore_module_morphism.py +968 -0
  584. sage/modules/quotient_module.py +699 -0
  585. sage/modules/real_double_vector.py +22 -0
  586. sage/modules/submodule.py +255 -0
  587. sage/modules/tensor_operations.py +567 -0
  588. sage/modules/torsion_quadratic_module.py +1352 -0
  589. sage/modules/tutorial_free_modules.py +248 -0
  590. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  591. sage/modules/vector_complex_double_dense.pxd +6 -0
  592. sage/modules/vector_complex_double_dense.pyx +117 -0
  593. sage/modules/vector_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  594. sage/modules/vector_double_dense.pxd +6 -0
  595. sage/modules/vector_double_dense.pyx +604 -0
  596. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  597. sage/modules/vector_integer_dense.pxd +15 -0
  598. sage/modules/vector_integer_dense.pyx +361 -0
  599. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  600. sage/modules/vector_integer_sparse.pxd +29 -0
  601. sage/modules/vector_integer_sparse.pyx +406 -0
  602. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  603. sage/modules/vector_modn_dense.pxd +12 -0
  604. sage/modules/vector_modn_dense.pyx +394 -0
  605. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  606. sage/modules/vector_modn_sparse.pxd +21 -0
  607. sage/modules/vector_modn_sparse.pyx +298 -0
  608. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  609. sage/modules/vector_numpy_dense.pxd +15 -0
  610. sage/modules/vector_numpy_dense.pyx +304 -0
  611. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  612. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  613. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  614. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  615. sage/modules/vector_rational_dense.pxd +15 -0
  616. sage/modules/vector_rational_dense.pyx +387 -0
  617. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  618. sage/modules/vector_rational_sparse.pxd +30 -0
  619. sage/modules/vector_rational_sparse.pyx +413 -0
  620. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  621. sage/modules/vector_real_double_dense.pxd +6 -0
  622. sage/modules/vector_real_double_dense.pyx +126 -0
  623. sage/modules/vector_space_homspace.py +430 -0
  624. sage/modules/vector_space_morphism.py +989 -0
  625. sage/modules/with_basis/all.py +15 -0
  626. sage/modules/with_basis/cell_module.py +494 -0
  627. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-gnu.so +0 -0
  628. sage/modules/with_basis/indexed_element.pxd +13 -0
  629. sage/modules/with_basis/indexed_element.pyx +1058 -0
  630. sage/modules/with_basis/invariant.py +1075 -0
  631. sage/modules/with_basis/morphism.py +1636 -0
  632. sage/modules/with_basis/representation.py +2939 -0
  633. sage/modules/with_basis/subquotient.py +685 -0
  634. sage/numerical/all__sagemath_modules.py +6 -0
  635. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-gnu.so +0 -0
  636. sage/numerical/gauss_legendre.pyx +381 -0
  637. sage/numerical/optimize.py +910 -0
  638. sage/probability/all.py +10 -0
  639. sage/probability/probability_distribution.cpython-314-aarch64-linux-gnu.so +0 -0
  640. sage/probability/probability_distribution.pyx +1242 -0
  641. sage/probability/random_variable.py +411 -0
  642. sage/quadratic_forms/all.py +4 -0
  643. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  644. sage/quadratic_forms/binary_qf.py +2042 -0
  645. sage/quadratic_forms/bqf_class_group.py +748 -0
  646. sage/quadratic_forms/constructions.py +93 -0
  647. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-gnu.so +0 -0
  648. sage/quadratic_forms/count_local_2.pyx +365 -0
  649. sage/quadratic_forms/extras.py +195 -0
  650. sage/quadratic_forms/quadratic_form.py +1753 -0
  651. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  652. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  653. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-gnu.so +0 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  655. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  656. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  657. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  658. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  659. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  660. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  661. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  662. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  663. sage/quadratic_forms/random_quadraticform.py +209 -0
  664. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-gnu.so +0 -0
  665. sage/quadratic_forms/ternary.pyx +1154 -0
  666. sage/quadratic_forms/ternary_qf.py +2027 -0
  667. sage/rings/all__sagemath_modules.py +28 -0
  668. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  669. sage/rings/asymptotic/misc.py +1252 -0
  670. sage/rings/cc.py +4 -0
  671. sage/rings/cfinite_sequence.py +1306 -0
  672. sage/rings/complex_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  673. sage/rings/complex_conversion.pxd +8 -0
  674. sage/rings/complex_conversion.pyx +23 -0
  675. sage/rings/complex_double.cpython-314-aarch64-linux-gnu.so +0 -0
  676. sage/rings/complex_double.pxd +21 -0
  677. sage/rings/complex_double.pyx +2654 -0
  678. sage/rings/complex_mpc.cpython-314-aarch64-linux-gnu.so +0 -0
  679. sage/rings/complex_mpc.pxd +21 -0
  680. sage/rings/complex_mpc.pyx +2576 -0
  681. sage/rings/complex_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  682. sage/rings/complex_mpfr.pxd +18 -0
  683. sage/rings/complex_mpfr.pyx +3602 -0
  684. sage/rings/derivation.py +2334 -0
  685. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  686. sage/rings/finite_rings/maps_finite_field.py +191 -0
  687. sage/rings/function_field/all__sagemath_modules.py +8 -0
  688. sage/rings/function_field/derivations.py +102 -0
  689. sage/rings/function_field/derivations_rational.py +132 -0
  690. sage/rings/function_field/differential.py +853 -0
  691. sage/rings/function_field/divisor.py +1107 -0
  692. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  693. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  694. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  695. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  696. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  697. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  698. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  699. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  700. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  701. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-gnu.so +0 -0
  702. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  703. sage/rings/invariants/all.py +4 -0
  704. sage/rings/invariants/invariant_theory.py +4597 -0
  705. sage/rings/invariants/reconstruction.py +395 -0
  706. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  707. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  708. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-gnu.so +0 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  711. sage/rings/polynomial/ore_function_element.py +952 -0
  712. sage/rings/polynomial/ore_function_field.py +1028 -0
  713. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  714. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  715. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  716. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  717. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  719. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  720. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  721. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  722. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  723. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-gnu.so +0 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  726. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-gnu.so +0 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  729. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  730. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-gnu.so +0 -0
  731. sage/rings/real_double_element_gsl.pxd +8 -0
  732. sage/rings/real_double_element_gsl.pyx +794 -0
  733. sage/rings/real_field.py +58 -0
  734. sage/rings/real_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  735. sage/rings/real_mpfr.pxd +29 -0
  736. sage/rings/real_mpfr.pyx +6122 -0
  737. sage/rings/ring_extension.cpython-314-aarch64-linux-gnu.so +0 -0
  738. sage/rings/ring_extension.pxd +42 -0
  739. sage/rings/ring_extension.pyx +2779 -0
  740. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  741. sage/rings/ring_extension_conversion.pxd +16 -0
  742. sage/rings/ring_extension_conversion.pyx +462 -0
  743. sage/rings/ring_extension_element.cpython-314-aarch64-linux-gnu.so +0 -0
  744. sage/rings/ring_extension_element.pxd +21 -0
  745. sage/rings/ring_extension_element.pyx +1635 -0
  746. sage/rings/ring_extension_homset.py +64 -0
  747. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-gnu.so +0 -0
  748. sage/rings/ring_extension_morphism.pxd +35 -0
  749. sage/rings/ring_extension_morphism.pyx +920 -0
  750. sage/schemes/all__sagemath_modules.py +1 -0
  751. sage/schemes/projective/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/coherent_sheaf.py +300 -0
  753. sage/schemes/projective/cohomology.py +510 -0
  754. sage/stats/all.py +15 -0
  755. sage/stats/basic_stats.py +489 -0
  756. sage/stats/distributions/all.py +7 -0
  757. sage/stats/distributions/catalog.py +34 -0
  758. sage/stats/distributions/dgs.h +50 -0
  759. sage/stats/distributions/dgs.pxd +111 -0
  760. sage/stats/distributions/dgs_bern.h +400 -0
  761. sage/stats/distributions/dgs_gauss.h +614 -0
  762. sage/stats/distributions/dgs_misc.h +104 -0
  763. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-gnu.so +0 -0
  764. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  766. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  767. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  768. sage/stats/hmm/all.py +15 -0
  769. sage/stats/hmm/chmm.cpython-314-aarch64-linux-gnu.so +0 -0
  770. sage/stats/hmm/chmm.pyx +1595 -0
  771. sage/stats/hmm/distributions.cpython-314-aarch64-linux-gnu.so +0 -0
  772. sage/stats/hmm/distributions.pxd +29 -0
  773. sage/stats/hmm/distributions.pyx +531 -0
  774. sage/stats/hmm/hmm.cpython-314-aarch64-linux-gnu.so +0 -0
  775. sage/stats/hmm/hmm.pxd +17 -0
  776. sage/stats/hmm/hmm.pyx +1388 -0
  777. sage/stats/hmm/util.cpython-314-aarch64-linux-gnu.so +0 -0
  778. sage/stats/hmm/util.pxd +7 -0
  779. sage/stats/hmm/util.pyx +165 -0
  780. sage/stats/intlist.cpython-314-aarch64-linux-gnu.so +0 -0
  781. sage/stats/intlist.pxd +14 -0
  782. sage/stats/intlist.pyx +588 -0
  783. sage/stats/r.py +49 -0
  784. sage/stats/time_series.cpython-314-aarch64-linux-gnu.so +0 -0
  785. sage/stats/time_series.pxd +6 -0
  786. sage/stats/time_series.pyx +2546 -0
  787. sage/tensor/all.py +2 -0
  788. sage/tensor/modules/all.py +8 -0
  789. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  790. sage/tensor/modules/comp.py +5598 -0
  791. sage/tensor/modules/ext_pow_free_module.py +824 -0
  792. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  793. sage/tensor/modules/format_utilities.py +333 -0
  794. sage/tensor/modules/free_module_alt_form.py +858 -0
  795. sage/tensor/modules/free_module_automorphism.py +1207 -0
  796. sage/tensor/modules/free_module_basis.py +1074 -0
  797. sage/tensor/modules/free_module_element.py +284 -0
  798. sage/tensor/modules/free_module_homset.py +652 -0
  799. sage/tensor/modules/free_module_linear_group.py +564 -0
  800. sage/tensor/modules/free_module_morphism.py +1581 -0
  801. sage/tensor/modules/free_module_tensor.py +3289 -0
  802. sage/tensor/modules/reflexive_module.py +386 -0
  803. sage/tensor/modules/tensor_free_module.py +780 -0
  804. sage/tensor/modules/tensor_free_submodule.py +538 -0
  805. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  806. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1043 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.groups
3
+ r"""
4
+ Index notation for tensors
5
+
6
+ AUTHORS:
7
+
8
+ - Eric Gourgoulhon, Michal Bejger (2014-2015): initial version
9
+ - Léo Brunswic (2019): add multiple symmetries and multiple contractions
10
+ """
11
+ # ****************************************************************************
12
+ # Copyright (C) 2015 Eric Gourgoulhon <eric.gourgoulhon@obspm.fr>
13
+ # Copyright (C) 2015 Michal Bejger <bejger@camk.edu.pl>
14
+ #
15
+ # Distributed under the terms of the GNU General Public License (GPL)
16
+ # as published by the Free Software Foundation; either version 2 of
17
+ # the License, or (at your option) any later version.
18
+ # https://www.gnu.org/licenses/
19
+ # ****************************************************************************
20
+ from itertools import combinations
21
+ import re
22
+
23
+ from sage.structure.sage_object import SageObject
24
+
25
+ # Regular expression for the allowed characters in index notation.
26
+ # This includes Unicode word constituents but excludes digits and underscores.
27
+ # Compare with https://docs.python.org/3/reference/lexical_analysis.html#identifiers
28
+ # The dot is special syntax for unnamed index positions.
29
+ _alph_or_dot_pattern = r"([.]|[^\d\W_])"
30
+
31
+
32
+ class TensorWithIndices(SageObject):
33
+ r"""
34
+ Index notation for tensors.
35
+
36
+ This is a technical class to allow one to write some tensor operations
37
+ (contractions and symmetrizations) in index notation.
38
+
39
+ INPUT:
40
+
41
+ - ``tensor`` -- a tensor (or a tensor field)
42
+ - ``indices`` -- string containing the indices, as single letters; the
43
+ contravariant indices must be stated first and separated from the
44
+ covariant indices by the character ``_``
45
+
46
+ EXAMPLES:
47
+
48
+ Index representation of tensors on a rank-3 free module::
49
+
50
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
51
+ sage: e = M.basis('e')
52
+ sage: a = M.tensor((2,0), name='a')
53
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
54
+ sage: b = M.tensor((0,2), name='b')
55
+ sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
56
+ sage: t = a*b ; t.set_name('t') ; t
57
+ Type-(2,2) tensor t on the 3-dimensional vector space M over the
58
+ Rational Field
59
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
60
+ sage: T = TensorWithIndices(t, '^ij_kl') ; T
61
+ t^ij_kl
62
+
63
+ The :class:`TensorWithIndices` object is returned by the square
64
+ bracket operator acting on the tensor and fed with the string specifying
65
+ the indices::
66
+
67
+ sage: a['^ij']
68
+ a^ij
69
+ sage: type(a['^ij'])
70
+ <class 'sage.tensor.modules.tensor_with_indices.TensorWithIndices'>
71
+ sage: b['_ef']
72
+ b_ef
73
+ sage: t['^ij_kl']
74
+ t^ij_kl
75
+
76
+ The symbol '^' may be omitted, since the distinction between covariant
77
+ and contravariant indices is performed by the index position relative to
78
+ the symbol '_'::
79
+
80
+ sage: t['ij_kl']
81
+ t^ij_kl
82
+
83
+ Also, LaTeX notation may be used::
84
+
85
+ sage: t['^{ij}_{kl}']
86
+ t^ij_kl
87
+
88
+ If some operation is asked in the index notation, the resulting tensor
89
+ is returned, not a :class:`TensorWithIndices` object; for instance, for
90
+ a symmetrization::
91
+
92
+ sage: s = t['^(ij)_kl'] ; s # the symmetrization on i,j is indicated by parentheses
93
+ Type-(2,2) tensor on the 3-dimensional vector space M over the
94
+ Rational Field
95
+ sage: s.symmetries()
96
+ symmetry: (0, 1); no antisymmetry
97
+ sage: s == t.symmetrize(0,1)
98
+ True
99
+
100
+ The letters denoting the indices can be chosen freely; since they carry no
101
+ information, they can even be replaced by dots::
102
+
103
+ sage: t['^(..)_..'] == t.symmetrize(0,1)
104
+ True
105
+
106
+ Similarly, for an antisymmetrization::
107
+
108
+ sage: s = t['^ij_[kl]'] ; s # the symmetrization on k,l is indicated by square brackets
109
+ Type-(2,2) tensor on the 3-dimensional vector space M over the Rational
110
+ Field
111
+ sage: s.symmetries()
112
+ no symmetry; antisymmetry: (2, 3)
113
+ sage: s == t.antisymmetrize(2,3)
114
+ True
115
+
116
+ One can also perform multiple symmetrization-antisymmetrizations::
117
+
118
+ sage: aa = a*a
119
+ sage: aa['(..)(..)'] == aa.symmetrize(0,1).symmetrize(2,3)
120
+ True
121
+ sage: aa == aa['(..)(..)'] + aa['[..][..]'] + aa['(..)[..]'] + aa['[..](..)']
122
+ True
123
+
124
+ Another example of an operation indicated by indices is a contraction::
125
+
126
+ sage: s = t['^ki_kj'] ; s # contraction on the repeated index k
127
+ Type-(1,1) tensor on the 3-dimensional vector space M over the Rational
128
+ Field
129
+ sage: s == t.trace(0,2)
130
+ True
131
+
132
+ Indices not involved in the contraction may be replaced by dots::
133
+
134
+ sage: s == t['^k._k.']
135
+ True
136
+
137
+ The contraction of two tensors is indicated by repeated indices and
138
+ the ``*`` operator::
139
+
140
+ sage: s = a['^ik'] * b['_kj'] ; s
141
+ Type-(1,1) tensor on the 3-dimensional vector space M over the Rational
142
+ Field
143
+ sage: s == a.contract(1, b, 0)
144
+ True
145
+ sage: s = t['^.k_..'] * b['_.k'] ; s
146
+ Type-(1,3) tensor on the 3-dimensional vector space M over the Rational
147
+ Field
148
+ sage: s == t.contract(1, b, 1)
149
+ True
150
+ sage: t['^{ik}_{jl}']*b['_{mk}'] == s # LaTeX notation
151
+ True
152
+
153
+ Contraction on two indices::
154
+
155
+ sage: s = a['^kl'] * b['_kl'] ; s
156
+ 105
157
+ sage: s == (a*b)['^kl_kl']
158
+ True
159
+ sage: s == (a*b)['_kl^kl']
160
+ True
161
+ sage: s == a.contract(0,1, b, 0,1)
162
+ True
163
+
164
+ The square bracket operator acts in a similar way on :class:`TensorWithIndices`::
165
+
166
+ sage: b = +a["ij"] ; b._tensor.set_name("b") # create a copy of a["ij"]
167
+ sage: b
168
+ b^ij
169
+ sage: b[:]
170
+ [1 2 3]
171
+ [4 5 6]
172
+ [7 8 9]
173
+ sage: b[0,0] == 1
174
+ True
175
+ sage: b["ji"]
176
+ b^ji
177
+ sage: b["(ij)"][:]
178
+ [1 3 5]
179
+ [3 5 7]
180
+ [5 7 9]
181
+ sage: b["(ij)"] == b["(ij)"]["ij"]
182
+ True
183
+
184
+ However, it keeps track of indices::
185
+
186
+ sage: b["ij"] = a["ji"]
187
+ sage: b[:] == a[:]
188
+ False
189
+ sage: b[:] == a[:].transpose()
190
+ True
191
+
192
+
193
+ Arithmetics::
194
+
195
+ sage: 2*a['^ij']
196
+ X^ij
197
+ sage: (2*a['^ij'])._tensor == 2*a
198
+ True
199
+ sage: 2*t['ij_kl']
200
+ X^ij_kl
201
+ sage: +a['^ij']
202
+ +a^ij
203
+ sage: +t['ij_kl']
204
+ +t^ij_kl
205
+ sage: -a['^ij']
206
+ -a^ij
207
+ sage: -t['ij_kl']
208
+ -t^ij_kl
209
+ sage: a["^(..)"]["ij"] == 1/2*(a["^ij"] + a["^ji"])
210
+ True
211
+
212
+ The output indices are the ones of the left term of the addition::
213
+
214
+ sage: a["^(..)"]["ji"] == 1/2*(a["^ij"] + a["^ji"])
215
+ False
216
+ sage: (a*a)["^..(ij)"]["abij"] == 1/2*((a*a)["^abij"] + (a*a)["^abji"])
217
+ True
218
+ sage: c = 1/2*((a*a)["^abij"] + (a*a)["^ijab"])
219
+ sage: from itertools import product
220
+ sage: all(c[i,j,k,l] == c[k,l,i,j] for i,j,k,l in product(range(3),repeat=4))
221
+ True
222
+
223
+ Non-digit unicode identifier characters are allowed::
224
+
225
+ sage: a['^μξ']
226
+ a^μξ
227
+
228
+ Conventions are checked and non acceptable indices raise
229
+ :exc:`ValueError`, for instance::
230
+
231
+ sage: a['([..])'] # nested symmetries
232
+ Traceback (most recent call last):
233
+ ...
234
+ ValueError: index conventions not satisfied
235
+ sage: a['(..'] # unbalanced parenthis
236
+ Traceback (most recent call last):
237
+ ...
238
+ ValueError: index conventions not satisfied
239
+ sage: a['ii'] # repeated indices of the same type
240
+ Traceback (most recent call last):
241
+ ...
242
+ ValueError: index conventions not satisfied: repeated indices of same type
243
+ sage: (a*a)['^(ij)^(kl)'] # multiple indices group of the same type
244
+ Traceback (most recent call last):
245
+ ...
246
+ ValueError: index conventions not satisfied
247
+ sage: a["^\u2663\u2665"] # non-word-constituent
248
+ Traceback (most recent call last):
249
+ ...
250
+ ValueError: index conventions not satisfied
251
+ """
252
+
253
+ @staticmethod
254
+ def _parse_indices(indices, tensor_type=None, allow_contraction=True,
255
+ allow_symmetries=True):
256
+ r"""
257
+ Parse index notation for tensors, enforces conventions and return
258
+ indices.
259
+
260
+ Parse ``indices`` checking usual conventions on repeating indices,
261
+ wildcard, balanced parentheses/brackets and raises a :exc:`ValueError`
262
+ if not. Return a couple contravariant/covariant indices.
263
+
264
+ INPUT:
265
+
266
+ - ``indices`` -- string of index notation
267
+ - ``tensor_type`` -- (default: ``None``) a valid tensor type
268
+ (a couple of nonnegative integers). If not ``None``, the indices
269
+ are checked to have the correct type.
270
+ - ``allow_contraction`` -- (default: ``True``) determines if
271
+ repeated indices are allowed in the index notation
272
+ - ``allow_symmetries`` -- (default: ``True``) determines if
273
+ symmetries ()/[] are allowed in the index notation
274
+
275
+ OUTPUT:
276
+
277
+ - A couple of string corresponding to the contravariant and the
278
+ covariant part
279
+
280
+ TESTS::
281
+
282
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
283
+ sage: TensorWithIndices._parse_indices('([..])') # nested symmetries
284
+ Traceback (most recent call last):
285
+ ...
286
+ ValueError: index conventions not satisfied
287
+ sage: TensorWithIndices._parse_indices('(..') # unbalanced parenthis
288
+ Traceback (most recent call last):
289
+ ...
290
+ ValueError: index conventions not satisfied
291
+ sage: TensorWithIndices._parse_indices('ii') # repeated indices of the same type
292
+ Traceback (most recent call last):
293
+ ...
294
+ ValueError: index conventions not satisfied: repeated indices of same type
295
+ sage: TensorWithIndices._parse_indices('^(ij)^(kl)') # multiple indices group of the same type
296
+ Traceback (most recent call last):
297
+ ...
298
+ ValueError: index conventions not satisfied
299
+ sage: TensorWithIndices._parse_indices("^17") # digits are not allowed as names
300
+ Traceback (most recent call last):
301
+ ...
302
+ ValueError: index conventions not satisfied
303
+ sage: TensorWithIndices._parse_indices("^;") # non-word-constituents are not allowed as names
304
+ Traceback (most recent call last):
305
+ ...
306
+ ValueError: index conventions not satisfied
307
+ sage: TensorWithIndices._parse_indices("^\u00ae") # non-word-constituents are not allowed as names
308
+ Traceback (most recent call last):
309
+ ...
310
+ ValueError: index conventions not satisfied
311
+ sage: TensorWithIndices._parse_indices("^\u25e2") # non-word-constituents are not allowed as names
312
+ Traceback (most recent call last):
313
+ ...
314
+ ValueError: index conventions not satisfied
315
+ sage: TensorWithIndices._parse_indices('^ij_kl')
316
+ ('ij', 'kl')
317
+ sage: TensorWithIndices._parse_indices('_kl^ij')
318
+ ('ij', 'kl')
319
+ sage: TensorWithIndices._parse_indices("(ij)_ik",tensor_type=(2,2))
320
+ ('(ij)', 'ik')
321
+ sage: TensorWithIndices._parse_indices("(ij)_ik",tensor_type=(2,0))
322
+ Traceback (most recent call last):
323
+ ...
324
+ IndexError: number of covavariant indices not compatible with the tensor type
325
+ sage: TensorWithIndices._parse_indices("(ij)_ik", allow_contraction=False)
326
+ Traceback (most recent call last):
327
+ ...
328
+ IndexError: no contraction allowed
329
+ sage: TensorWithIndices._parse_indices("(ij)_ik", allow_symmetries=False)
330
+ Traceback (most recent call last):
331
+ ...
332
+ IndexError: no symmetry allowed
333
+ """
334
+ # Suppress all '{' and '}' coming from LaTeX notations:
335
+ indices = indices.replace('{','').replace('}','')
336
+
337
+ # Check index notation conventions and parse indices
338
+ allowed_pattern = r"(\(" + _alph_or_dot_pattern + r"{2,}\)|\[" + _alph_or_dot_pattern + r"{2,}\]|" + _alph_or_dot_pattern + r"+)*"
339
+ con_then_cov = r"^(\^|)" + allowed_pattern + r"(\_" + allowed_pattern + r"|)$"
340
+ cov_then_con = r"^\_" + allowed_pattern + r"(\^" + allowed_pattern + r"|)$"
341
+ if (re.match(con_then_cov,indices) is None
342
+ and re.match(cov_then_con,indices) is None):
343
+ raise ValueError("index conventions not satisfied")
344
+ elif re.match(con_then_cov,indices):
345
+ try:
346
+ con,cov = indices.replace("^","").split("_")
347
+ except ValueError:
348
+ con = indices.replace("^","")
349
+ cov = ""
350
+ else:
351
+ try:
352
+ cov,con = indices.replace("_","").split("^")
353
+ except ValueError:
354
+ cov = indices.replace("_","")
355
+ con = ""
356
+ if not allow_contraction:
357
+ for ind in con:
358
+ if ind != '.' and ind in cov:
359
+ raise IndexError("no contraction allowed")
360
+ con_without_sym = (con.replace("(","").replace(")","").replace("[","").replace("]",""))
361
+ cov_without_sym = (cov.replace("(","").replace(")","").replace("[","").replace("]",""))
362
+ if allow_symmetries:
363
+ if len(con_without_sym) != len(set(con_without_sym)) \
364
+ + max(con_without_sym.count(".")-1, 0):
365
+ raise ValueError("index conventions not satisfied: "
366
+ "repeated indices of same type")
367
+ if len(cov_without_sym) != len(set(cov_without_sym)) \
368
+ + max(cov_without_sym.count(".")-1, 0):
369
+ raise ValueError("index conventions not satisfied: "
370
+ "repeated indices of same type")
371
+ else:
372
+ if re.search(r"[()\[\]]",con) is not None:
373
+ raise IndexError("no symmetry allowed")
374
+ if re.search(r"[()\[\]]",cov) is not None:
375
+ raise IndexError("no symmetry allowed")
376
+ if tensor_type is not None:
377
+ # Check number of (co/contra)variant indices
378
+ if len(con_without_sym) != tensor_type[0]:
379
+ raise IndexError("number of contravariant indices not compatible "
380
+ "with the tensor type")
381
+ if len(cov_without_sym) != tensor_type[1]:
382
+ raise IndexError("number of covavariant indices not compatible "
383
+ "with the tensor type")
384
+ return con,cov
385
+
386
+ def __init__(self, tensor, indices):
387
+ r"""
388
+ TESTS::
389
+
390
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
391
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
392
+ sage: t = M.tensor((2,1), name='t')
393
+ sage: ti = TensorWithIndices(t, 'ab_c')
394
+
395
+ We need to skip the pickling test because we can't check equality
396
+ unless the tensor was defined w.r.t. a basis::
397
+
398
+ sage: TestSuite(ti).run(skip='_test_pickling')
399
+
400
+ ::
401
+
402
+ sage: e = M.basis('e')
403
+ sage: t[:] = [[[1,2,3], [-4,5,6], [7,8,-9]],
404
+ ....: [[10,-11,12], [13,14,-15], [16,17,18]],
405
+ ....: [[19,-20,-21], [-22,23,24], [25,26,-27]]]
406
+ sage: ti = TensorWithIndices(t, 'ab_c')
407
+ sage: TestSuite(ti).run()
408
+ """
409
+ self._tensor = tensor # may be changed below
410
+ self._changed = False # indicates whether self contains an altered
411
+ # version of the original tensor (True if
412
+ # symmetries or contractions are indicated in the
413
+ # indices)
414
+
415
+ # Check whether the usual convention for indices, symmetries and
416
+ # contractions are respected. This includes restrictions on the
417
+ # indices symbols used, non nested (anti)symmetries,
418
+ # (co/contra)variant identification of repeated indices, as well
419
+ # as checking the number of covariant and contravariant indices.
420
+ # Latex notations '{' and '}' are totally ignored.
421
+ # "^{ijkl}_{ib(cd)}"
422
+
423
+ con,cov = self._parse_indices(
424
+ indices,
425
+ tensor_type=self._tensor.tensor_type()
426
+ )
427
+
428
+ # Apply (anti)symmetrizations on contravariant indices
429
+ first_sym_regex = r"(\(|\[)" + _alph_or_dot_pattern + r"*[)\]]"
430
+ while re.search(first_sym_regex,con):
431
+ first_sym = re.search(first_sym_regex,con)
432
+ sym1 = first_sym.span()[0]
433
+ sym2 = first_sym.span()[1]-1
434
+ if first_sym.groups()[0] == "(":
435
+ self._tensor = self._tensor.symmetrize(*range(
436
+ sym1,
437
+ sym2-1
438
+ ))
439
+ else:
440
+ self._tensor = self._tensor.antisymmetrize(*range(
441
+ sym1,
442
+ sym2-1
443
+ ))
444
+ self._changed = True # self does no longer contain the original tensor
445
+ con = con[:sym1] + con[sym1+1:sym2] + con[sym2+1:]
446
+ self._con = con
447
+
448
+ # Apply (anti)symmetrizations on covariant indices
449
+ while re.search(first_sym_regex,cov):
450
+ first_sym = re.search(first_sym_regex,cov)
451
+ sym1 = first_sym.span()[0]
452
+ sym2 = first_sym.span()[1]-1
453
+ if first_sym.groups()[0] == "(":
454
+ self._tensor = self._tensor.symmetrize(*range(
455
+ self._tensor._tensor_type[0] + sym1,
456
+ self._tensor._tensor_type[0] + sym2-1
457
+ ))
458
+ else:
459
+ self._tensor = self._tensor.antisymmetrize(*range(
460
+ self._tensor._tensor_type[0] + sym1,
461
+ self._tensor._tensor_type[0] + sym2-1
462
+ ))
463
+ self._changed = True # self does no longer contain the original tensor
464
+ cov = cov[:sym1] + cov[sym1+1:sym2] + cov[sym2+1:]
465
+ self._cov = cov
466
+
467
+ # Treatment of possible self-contractions:
468
+ # ---------------------------------------
469
+ contraction_pair_list = []
470
+ for ind in self._con:
471
+ if ind != '.' and ind in self._cov:
472
+ pos1 = self._con.index(ind)
473
+ pos2 = self._tensor._tensor_type[0] + self._cov.index(ind)
474
+ contraction_pair_list.append([pos1, pos2])
475
+ while contraction_pair_list:
476
+ pos1, pos2 = contraction_pair_list.pop()
477
+ self._tensor = self._tensor.trace(pos1, pos2)
478
+ for contraction_pair in contraction_pair_list:
479
+ if contraction_pair[0] > pos1:
480
+ contraction_pair[0] = contraction_pair[0]-1
481
+ if contraction_pair[1] > pos2:
482
+ contraction_pair[1] = contraction_pair[1]-1
483
+ contraction_pair[1] = contraction_pair[1]-1
484
+ self._changed = True # self does no longer contain the original
485
+ # tensor
486
+ ind = self._con[pos1]
487
+ self._con = self._con.replace(ind, '')
488
+ self._cov = self._cov.replace(ind, '')
489
+
490
+ def _repr_(self):
491
+ r"""
492
+ Return a string representation of ``self``.
493
+
494
+ EXAMPLES::
495
+
496
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
497
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
498
+ sage: t = M.tensor((2,1), name='t')
499
+ sage: ti = TensorWithIndices(t, 'ab_c')
500
+ sage: ti._repr_()
501
+ 't^ab_c'
502
+ sage: t = M.tensor((0,2), name='t')
503
+ sage: ti = TensorWithIndices(t, '_{ij}')
504
+ sage: ti._repr_()
505
+ 't_ij'
506
+ """
507
+ name = 'X'
508
+ if hasattr(self._tensor, '_name'):
509
+ if self._tensor._name is not None:
510
+ name = self._tensor._name
511
+ if self._con == '':
512
+ if self._cov == '':
513
+ return 'scalar'
514
+ else:
515
+ return name + '_' + self._cov
516
+ elif self._cov == '':
517
+ return name + '^' + self._con
518
+ else:
519
+ return name + '^' + self._con + '_' + self._cov
520
+
521
+ def update(self):
522
+ r"""
523
+ Return the tensor contains in ``self`` if it differs from that used
524
+ for creating ``self``, otherwise return ``self``.
525
+
526
+ EXAMPLES::
527
+
528
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
529
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
530
+ sage: e = M.basis('e')
531
+ sage: a = M.tensor((1,1), name='a')
532
+ sage: a[:] = [[1,-2,3], [-4,5,-6], [7,-8,9]]
533
+ sage: a_ind = TensorWithIndices(a, 'i_j') ; a_ind
534
+ a^i_j
535
+ sage: a_ind.update()
536
+ a^i_j
537
+ sage: a_ind.update() is a_ind
538
+ True
539
+ sage: a_ind = TensorWithIndices(a, 'k_k') ; a_ind
540
+ scalar
541
+ sage: a_ind.update()
542
+ 15
543
+ """
544
+ if self._changed:
545
+ return self._tensor
546
+ else:
547
+ return self
548
+
549
+ def __eq__(self, other):
550
+ r"""
551
+ Check equality.
552
+
553
+ TESTS::
554
+
555
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
556
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
557
+ sage: t = M.tensor((2,1), name='t')
558
+ sage: ti = TensorWithIndices(t, 'ab_c')
559
+ sage: ti == TensorWithIndices(t, '^{ab}_c')
560
+ True
561
+ sage: ti == TensorWithIndices(t, 'ac_b')
562
+ False
563
+ sage: tp = M.tensor((2,1))
564
+ sage: ti == TensorWithIndices(tp, 'ab_c')
565
+ Traceback (most recent call last):
566
+ ...
567
+ ValueError: no common basis for the comparison
568
+ """
569
+ if not isinstance(other, TensorWithIndices):
570
+ return False
571
+ return (self._tensor == other._tensor
572
+ and self._con == other._con
573
+ and self._cov == other._cov)
574
+
575
+ def __ne__(self, other):
576
+ r"""
577
+ Check not equals.
578
+
579
+ TESTS::
580
+
581
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
582
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
583
+ sage: t = M.tensor((2,1), name='t')
584
+ sage: ti = TensorWithIndices(t, 'ab_c')
585
+ sage: ti != TensorWithIndices(t, '^{ab}_c')
586
+ False
587
+ sage: ti != TensorWithIndices(t, 'ac_b')
588
+ True
589
+ """
590
+ return not self == other
591
+
592
+ def __mul__(self, other):
593
+ r"""
594
+ Tensor product or contraction on specified indices.
595
+
596
+ EXAMPLES::
597
+
598
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
599
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
600
+ sage: e = M.basis('e')
601
+ sage: a = M.tensor((2,0), name='a')
602
+ sage: a[:] = [[1,-2,3], [-4,5,-6], [7,-8,9]]
603
+ sage: b = M.linear_form(name='b')
604
+ sage: b[:] = [4,2,1]
605
+ sage: ai = TensorWithIndices(a, '^ij')
606
+ sage: bi = TensorWithIndices(b, '_k')
607
+ sage: s = ai.__mul__(bi) ; s # no repeated indices ==> tensor product
608
+ Type-(2,1) tensor a⊗b on the 3-dimensional vector space M over the
609
+ Rational Field
610
+ sage: s == a*b
611
+ True
612
+ sage: s[:]
613
+ [[[4, 2, 1], [-8, -4, -2], [12, 6, 3]],
614
+ [[-16, -8, -4], [20, 10, 5], [-24, -12, -6]],
615
+ [[28, 14, 7], [-32, -16, -8], [36, 18, 9]]]
616
+ sage: ai = TensorWithIndices(a, '^kj')
617
+ sage: s = ai.__mul__(bi) ; s # repeated index k ==> contraction
618
+ Element of the 3-dimensional vector space M over the Rational Field
619
+ sage: s == a.contract(0, b)
620
+ True
621
+ sage: s[:]
622
+ [3, -6, 9]
623
+ """
624
+ if not isinstance(other, TensorWithIndices):
625
+ raise TypeError("the second item of * must be a tensor with " +
626
+ "specified indices")
627
+ contraction_pairs = []
628
+ for ind in self._con:
629
+ if ind != '.':
630
+ if ind in other._cov:
631
+ pos1 = self._con.index(ind)
632
+ pos2 = other._tensor._tensor_type[0] + other._cov.index(ind)
633
+ contraction_pairs.append((pos1, pos2))
634
+ if ind in other._con:
635
+ raise IndexError(f"the index {ind} appears twice "
636
+ + "in a contravariant position")
637
+ for ind in self._cov:
638
+ if ind != '.':
639
+ if ind in other._con:
640
+ pos1 = self._tensor._tensor_type[0] + self._cov.index(ind)
641
+ pos2 = other._con.index(ind)
642
+ contraction_pairs.append((pos1, pos2))
643
+ if ind in other._cov:
644
+ raise IndexError(f"the index {ind} appears twice "
645
+ + "in a covariant position")
646
+ if not contraction_pairs:
647
+ # No contraction is performed: the tensor product is returned
648
+ return self._tensor * other._tensor
649
+ ncontr = len(contraction_pairs)
650
+ pos1 = [contraction_pairs[i][0] for i in range(ncontr)]
651
+ pos2 = [contraction_pairs[i][1] for i in range(ncontr)]
652
+ args = pos1 + [other._tensor] + pos2
653
+ return self._tensor.contract(*args)
654
+
655
+ def __rmul__(self, other):
656
+ r"""
657
+ Multiplication on the left by ``other``.
658
+
659
+ EXAMPLES::
660
+
661
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
662
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
663
+ sage: e = M.basis('e')
664
+ sage: a = M.tensor((2,1), name='a')
665
+ sage: a[0,2,1], a[1,2,0] = 7, -4
666
+ sage: ai = TensorWithIndices(a, 'ij_k')
667
+ sage: s = ai.__rmul__(3) ; s
668
+ X^ij_k
669
+ sage: s._tensor == 3*a
670
+ True
671
+ """
672
+ return TensorWithIndices(other*self._tensor,
673
+ self._con + '_' + self._cov)
674
+
675
+ def __add__(self, other):
676
+ r"""
677
+ Addition between tensors with indices.
678
+
679
+ The underlying tensor of the output is the sum of the underlying tensor
680
+ of ``self`` with the underlying tensor of ``other`` whose entries have
681
+ be permuted to respect Einstein summation usual conventions. The
682
+ indices names of the output are those of ``self``.
683
+
684
+
685
+ TESTS::
686
+
687
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
688
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
689
+ sage: e = M.basis('e')
690
+ sage: a = M.tensor((2,0), name='a')
691
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
692
+ sage: b = M.tensor((0,2), name='b')
693
+ sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
694
+ sage: T = a*a*b*b
695
+ sage: 1/4*(T["ijkl_abcd"] + T["jikl_abcd"] + T["ijkl_abdc"]\
696
+ ....: + T["jikl_abdc"]) == T["(..).._..(..)"]["ijkl_abcd"]
697
+ True
698
+ """
699
+ # Check tensor types are compatible
700
+ if self._tensor.tensor_type() != other._tensor.tensor_type():
701
+ raise ValueError("Tensors are not of the same type")
702
+ # Check the set of indices are compatible
703
+ if set(self._cov) != set(other._cov):
704
+ raise ValueError("The covariant Indices sets are not identical")
705
+ if set(self._con) != set(other._con):
706
+ raise ValueError("The contravariant Indices sets are not identical")
707
+ self_wild_card_indices = [match.span()[0] for match in re.finditer(r"\.", self._con)]
708
+ other_wild_card_indices = [match.span()[0] for match in re.finditer(r"\.", self._cov)]
709
+ if self_wild_card_indices != other_wild_card_indices:
710
+ raise ValueError("Ambiguous wildcard notation")
711
+
712
+ # Permutation of the components of self
713
+ # -------------------------------------
714
+
715
+ permutation = list(range(other._tensor.tensor_rank()))
716
+ for other_index in range(other._tensor.tensor_type()[0]):
717
+ if other._con[other_index] == self._con[other_index]:
718
+ permutation[other_index] = other_index
719
+ else:
720
+ permutation[other_index] = self._con.index(other._con[other_index])
721
+ for other_index in range(other._tensor.tensor_type()[1]):
722
+ if other._cov[other_index] == self._cov[other_index]:
723
+ permutation[other._tensor.tensor_type()[0] + other_index]\
724
+ = other._tensor.tensor_type()[0] + other_index
725
+ else:
726
+ permutation[other._tensor.tensor_type()[0] + other_index]\
727
+ = other._tensor.tensor_type()[0] + self._cov.index(other._cov[other_index])
728
+
729
+ result = self.__pos__()
730
+ result._tensor = result._tensor + other.permute_indices(permutation)._tensor
731
+ return result
732
+
733
+ def __sub__(self, other):
734
+ r"""
735
+ Subtraction between tensors with indices.
736
+
737
+ The underlying tensor of the output is the underlying tensor of
738
+ ``self`` minus the underlying tensor of ``other`` whose entries have
739
+ be permuted to respect Einstein summation usual conventions. The
740
+ indices names of the output are those of ``self``.
741
+
742
+ EXAMPLES::
743
+
744
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
745
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
746
+ sage: e = M.basis('e')
747
+ sage: a = M.tensor((2,0), name='a')
748
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
749
+ sage: b = M.tensor((0,2), name='b')
750
+ sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
751
+ sage: a["^[..]"]["ij"] == 1/2*(a["^ij"]-a["^ji"])
752
+ True
753
+ sage: (a*a)["^..[ij]"]["abij"] == 1/2*((a*a)["^abij"]-(a*a)["^abji"])
754
+ True
755
+ sage: Riem = a*a
756
+ sage: Riem = Riem["[ij][kl]"]
757
+ sage: Riem = 1/2*(Riem["ijkl"]+Riem["klij"])
758
+ sage: O = M.tensor((4,0), name='O')
759
+ sage: O[0,0,0,0] = 0
760
+ sage: (Riem["ijkl"]+Riem["iklj"]+Riem["iljk"]) == O["ijkl"]
761
+ True
762
+
763
+ TESTS::
764
+
765
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
766
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
767
+ sage: e = M.basis('e')
768
+ sage: a = M.tensor((2,0), name='a')
769
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
770
+ sage: b = M.tensor((0,2), name='b')
771
+ sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
772
+ sage: T = a*a*b*b
773
+ sage: 1/4*(T["ijkl_abcd"]-T["jikl_abcd"] - T["ijkl_abdc"]\
774
+ ....: + T["jikl_abdc"] ) == T["[..].._..[..]"]["ijkl_abcd"]
775
+ True
776
+ """
777
+ return self + (-other)
778
+
779
+ def __getitem__(self, args):
780
+ r"""
781
+ Return a component of the underlying tensor w.r.t. some basis.
782
+
783
+ NB: if ``args`` is a string, this method acts as a shortcut for
784
+ tensor contractions and symmetrizations, the string containing
785
+ abstract indices.
786
+
787
+ INPUT:
788
+
789
+ - ``args`` -- list of indices defining the component; if ``[:]`` is
790
+ provided, all the components are returned. The basis can be passed
791
+ as the first item of ``args``; if not, the free module's default
792
+ basis is assumed.
793
+ if ``args`` is a string, this method acts as a shortcut for
794
+ tensor contractions and symmetrizations, the string containing
795
+ abstract indices.
796
+
797
+ TESTS::
798
+
799
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
800
+ sage: e = M.basis('e')
801
+ sage: a = M.tensor((2,0), name='a')
802
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
803
+ sage: b = a["ij"]
804
+ sage: b
805
+ a^ij
806
+ sage: b[:]
807
+ [1 2 3]
808
+ [4 5 6]
809
+ [7 8 9]
810
+ sage: b[0,0] == 1
811
+ True
812
+ sage: b["ji"]
813
+ a^ji
814
+ sage: b["(ij)"][:]
815
+ [1 3 5]
816
+ [3 5 7]
817
+ [5 7 9]
818
+ """
819
+ if isinstance(args, str):
820
+ result = +self
821
+ result.__init__(self._tensor, args)
822
+ return result
823
+ else:
824
+ return self._tensor[args]
825
+
826
+ def __setitem__(self, args, value):
827
+ r"""
828
+ Set a component w.r.t. some basis.
829
+
830
+ INPUT:
831
+
832
+ - ``args`` -- list of indices defining the component; if ``[:]`` is
833
+ provided, all the components are set. The basis can be passed
834
+ as the first item of ``args``; if not, the free module's default
835
+ basis is assumed if ``args`` is a string and value is a tensor
836
+ with indices, this method permutes the coefficients of ``value``
837
+ before assigning the underlying tensor of ``value`` to ``self``.
838
+
839
+ - ``value`` -- the value to be set or a list of values if
840
+ ``args = [:]`` or a tensor with indices
841
+
842
+ TESTS::
843
+
844
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
845
+ sage: e = M.basis('e')
846
+ sage: a = M.tensor((2,0), name='a')["ij"]
847
+ sage: b = M.tensor((2,0), name='b')["ij"]
848
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
849
+ sage: b["ij"] = a["ji"]
850
+ sage: b[:] == a[:].transpose()
851
+ True
852
+ """
853
+ if isinstance(args, str):
854
+ if not isinstance(value,TensorWithIndices):
855
+ raise ValueError("The tensor provided should be with indices")
856
+ elif self._tensor.tensor_type() != value._tensor.tensor_type():
857
+ raise ValueError("The tensors are not of the same type")
858
+ else:
859
+ con,cov = self._parse_indices(
860
+ args,
861
+ tensor_type=self._tensor.tensor_type(),
862
+ allow_symmetries=False,
863
+ allow_contraction=False
864
+ )
865
+
866
+ permutation = list(range(value._tensor.tensor_rank()))
867
+ for value_index in range(value._tensor.tensor_type()[0]):
868
+ if value._con[value_index] == self._con[value_index]:
869
+ permutation[value_index] = value_index
870
+ else:
871
+ permutation[value_index] = self._con.index(value._con[value_index])
872
+ for value_index in range(value._tensor.tensor_type()[1]):
873
+ if value._cov[value_index] == self._cov[value_index]:
874
+ permutation[value._tensor.tensor_type()[0] + value_index]\
875
+ = value._tensor.tensor_type()[0] + value_index
876
+ else:
877
+ permutation[value._tensor.tensor_type()[0] + value_index]\
878
+ = value._tensor.tensor_type()[0] + self._cov.index(value._cov[value_index])
879
+ self._tensor[:] = value.permute_indices(permutation)[:]
880
+
881
+ else:
882
+ self._tensor.__setitem__(args,value)
883
+
884
+ def permute_indices(self, permutation):
885
+ r"""
886
+ Return a tensor with indices with permuted indices.
887
+
888
+ INPUT:
889
+
890
+ - ``permutation`` -- permutation that has to be applied to the indices
891
+ the input should be a ``list`` containing the second line of the permutation
892
+ in Cauchy notation.
893
+
894
+ OUTPUT:
895
+
896
+ - an instance of ``TensorWithIndices`` whose indices names and place
897
+ are those of ``self`` but whose components have been permuted with
898
+ ``permutation``.
899
+
900
+ EXAMPLES::
901
+
902
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
903
+ sage: e = M.basis('e')
904
+ sage: a = M.tensor((2,0), name='a')
905
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
906
+ sage: b = M.tensor((2,0), name='b')
907
+ sage: b[:] = [[-1,2,-3], [-4,5,6], [7,-8,9]]
908
+ sage: identity = [0,1]
909
+ sage: transposition = [1,0]
910
+ sage: a["ij"].permute_indices(identity) == a["ij"]
911
+ True
912
+ sage: a["ij"].permute_indices(transposition)[:] == a[:].transpose()
913
+ True
914
+ sage: cycle = [1,2,3,0] # the cyclic permutation sending 0 to 1
915
+ sage: (a*b)[0,1,2,0] == (a*b)["ijkl"].permute_indices(cycle)[1,2,0,0]
916
+ True
917
+
918
+ TESTS::
919
+
920
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
921
+ sage: e = M.basis('e')
922
+ sage: a = M.tensor((2,0), name='a')
923
+ sage: a[:] = [[1,2,3], [4,5,6], [7,8,9]]
924
+ sage: identity = [0,1]
925
+ sage: transposition = [1,0]
926
+ sage: a["ij"].permute_indices(identity) == a["ij"]
927
+ True
928
+ sage: a["ij"].permute_indices(transposition)[:] == a[:].transpose()
929
+ True
930
+ sage: (a*a)["ijkl"].permute_indices([1,2,3,0])[0,1,2,1] == (a*a)[1,2,1,0]
931
+ True
932
+ """
933
+ # Decomposition of the permutation of the components of self
934
+ # into product of swaps given by the method
935
+ # sage.tensor.modules.comp.Components.swap_adjacent_indices
936
+
937
+ # A swap is determined by 3 distinct integers
938
+ swap_params = list(combinations(range(self._tensor.tensor_rank()+1), 3))
939
+
940
+ # The associated permutation is as follows
941
+ def swap(param, N):
942
+ i,j,k = param
943
+ L = list(range(1,N+1))
944
+ L = L[:i] + L[j:k] + L[i:j] + L[k:]
945
+ return L
946
+
947
+ # Construction of the permutation group generated by swaps
948
+ from sage.groups.perm_gps.permgroup import PermutationGroup
949
+
950
+ perm_group = PermutationGroup(
951
+ [swap(param, self._tensor.tensor_rank()) for param in swap_params],
952
+ canonicalize=False
953
+ )
954
+ # Compute a decomposition of the permutation as a product of swaps
955
+ decomposition_as_string = perm_group([x+1 for x in permutation]).word_problem(
956
+ perm_group.gens(),
957
+ display=False
958
+ )[0]
959
+
960
+ if decomposition_as_string != "<identity ...>":
961
+ decomposition_as_string = [
962
+ # Two cases whether the term appear with an exponent or not
963
+ ("^" in term)*term.split("^") + ("^" not in term)*(term.split("^")+['1'])
964
+ for term in decomposition_as_string.replace("x","").split("*")
965
+ ]
966
+ decomposition = [(swap_params[int(x)-1], int(y)) for x, y in decomposition_as_string]
967
+ decomposition.reverse() # /!\ The symmetric group acts on the right by default /!\.
968
+ else:
969
+ decomposition = []
970
+ # Choice of a basis
971
+ basis = self._tensor._fmodule._def_basis
972
+
973
+ # Swap of components
974
+
975
+ swaped_components = self._tensor.comp(basis)
976
+ for swap_param,exponent in decomposition:
977
+ if exponent > 0:
978
+ for i in range(exponent):
979
+ # Apply the swap given by swap_param
980
+ swaped_components = swaped_components\
981
+ .swap_adjacent_indices(*swap_param)
982
+ elif exponent < 0:
983
+ for i in range(-exponent):
984
+ # Apply the opposite of the swap given by swap_param
985
+ swaped_components = swaped_components\
986
+ .swap_adjacent_indices(
987
+ swap_param[0],
988
+ swap_param[0] + swap_param[2] - swap_param[1],
989
+ swap_param[2]
990
+ )
991
+ else:
992
+ pass
993
+ result = self.__pos__()
994
+ result._tensor = self._tensor._fmodule.tensor_from_comp(
995
+ self._tensor.tensor_type(),
996
+ swaped_components
997
+ )
998
+
999
+ return result
1000
+
1001
+ def __pos__(self):
1002
+ r"""
1003
+ Unary plus operator.
1004
+
1005
+ OUTPUT: an exact copy of ``self``
1006
+
1007
+ EXAMPLES::
1008
+
1009
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
1010
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
1011
+ sage: e = M.basis('e')
1012
+ sage: a = M.tensor((2,1), name='a')
1013
+ sage: a[0,2,1], a[1,2,0] = 7, -4
1014
+ sage: ai = TensorWithIndices(a, 'ij_k')
1015
+ sage: s = ai.__pos__() ; s
1016
+ +a^ij_k
1017
+ sage: s._tensor == a
1018
+ True
1019
+ """
1020
+ return TensorWithIndices(+self._tensor,
1021
+ self._con + '_' + self._cov)
1022
+
1023
+ def __neg__(self):
1024
+ r"""
1025
+ Unary minus operator.
1026
+
1027
+ OUTPUT: negative of ``self``
1028
+
1029
+ EXAMPLES::
1030
+
1031
+ sage: from sage.tensor.modules.tensor_with_indices import TensorWithIndices
1032
+ sage: M = FiniteRankFreeModule(QQ, 3, name='M')
1033
+ sage: e = M.basis('e')
1034
+ sage: a = M.tensor((2,1), name='a')
1035
+ sage: a[0,2,1], a[1,2,0] = 7, -4
1036
+ sage: ai = TensorWithIndices(a, 'ij_k')
1037
+ sage: s = ai.__neg__() ; s
1038
+ -a^ij_k
1039
+ sage: s._tensor == -a
1040
+ True
1041
+ """
1042
+ return TensorWithIndices(-self._tensor,
1043
+ self._con + '_' + self._cov)