passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl

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

Potentially problematic release.


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

Files changed (807) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
  12. sage/algebras/all__sagemath_modules.py +20 -0
  13. sage/algebras/catalog.py +148 -0
  14. sage/algebras/clifford_algebra.py +3107 -0
  15. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  16. sage/algebras/clifford_algebra_element.pxd +16 -0
  17. sage/algebras/clifford_algebra_element.pyx +997 -0
  18. sage/algebras/commutative_dga.py +4252 -0
  19. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
  20. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  21. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  22. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  29. sage/algebras/finite_gca.py +528 -0
  30. sage/algebras/group_algebra.py +232 -0
  31. sage/algebras/lie_algebras/abelian.py +197 -0
  32. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  33. sage/algebras/lie_algebras/all.py +25 -0
  34. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  35. sage/algebras/lie_algebras/bch.py +177 -0
  36. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  37. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  38. sage/algebras/lie_algebras/center_uea.py +767 -0
  39. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  40. sage/algebras/lie_algebras/examples.py +683 -0
  41. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  42. sage/algebras/lie_algebras/heisenberg.py +820 -0
  43. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  47. sage/algebras/lie_algebras/morphism.py +661 -0
  48. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  49. sage/algebras/lie_algebras/onsager.py +1324 -0
  50. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  51. sage/algebras/lie_algebras/quotient.py +462 -0
  52. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  53. sage/algebras/lie_algebras/representation.py +1040 -0
  54. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  55. sage/algebras/lie_algebras/subalgebra.py +967 -0
  56. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  57. sage/algebras/lie_algebras/verma_module.py +1630 -0
  58. sage/algebras/lie_algebras/virasoro.py +1186 -0
  59. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
  60. sage/algebras/octonion_algebra.pxd +20 -0
  61. sage/algebras/octonion_algebra.pyx +987 -0
  62. sage/algebras/orlik_solomon.py +907 -0
  63. sage/algebras/orlik_terao.py +779 -0
  64. sage/algebras/steenrod/all.py +7 -0
  65. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  66. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  67. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  68. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  69. sage/algebras/weyl_algebra.py +1126 -0
  70. sage/all__sagemath_modules.py +62 -0
  71. sage/calculus/all__sagemath_modules.py +19 -0
  72. sage/calculus/expr.py +205 -0
  73. sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
  84. sage/calculus/riemann.pyx +1521 -0
  85. sage/calculus/test_sympy.py +201 -0
  86. sage/calculus/transforms/all.py +7 -0
  87. sage/calculus/transforms/dft.py +844 -0
  88. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
  89. sage/calculus/transforms/dwt.pxd +7 -0
  90. sage/calculus/transforms/dwt.pyx +160 -0
  91. sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
  92. sage/calculus/transforms/fft.pxd +12 -0
  93. sage/calculus/transforms/fft.pyx +487 -0
  94. sage/calculus/wester.py +662 -0
  95. sage/coding/abstract_code.py +1108 -0
  96. sage/coding/ag_code.py +868 -0
  97. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
  98. sage/coding/ag_code_decoders.pyx +2639 -0
  99. sage/coding/all.py +15 -0
  100. sage/coding/bch_code.py +494 -0
  101. sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
  102. sage/coding/binary_code.pxd +124 -0
  103. sage/coding/binary_code.pyx +4139 -0
  104. sage/coding/bounds_catalog.py +43 -0
  105. sage/coding/channel.py +819 -0
  106. sage/coding/channels_catalog.py +29 -0
  107. sage/coding/code_bounds.py +755 -0
  108. sage/coding/code_constructions.py +804 -0
  109. sage/coding/codes_catalog.py +111 -0
  110. sage/coding/cyclic_code.py +1329 -0
  111. sage/coding/databases.py +316 -0
  112. sage/coding/decoder.py +373 -0
  113. sage/coding/decoders_catalog.py +88 -0
  114. sage/coding/delsarte_bounds.py +709 -0
  115. sage/coding/encoder.py +390 -0
  116. sage/coding/encoders_catalog.py +64 -0
  117. sage/coding/extended_code.py +468 -0
  118. sage/coding/gabidulin_code.py +1058 -0
  119. sage/coding/golay_code.py +404 -0
  120. sage/coding/goppa_code.py +441 -0
  121. sage/coding/grs_code.py +2371 -0
  122. sage/coding/guava.py +107 -0
  123. sage/coding/guruswami_sudan/all.py +1 -0
  124. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  125. sage/coding/guruswami_sudan/interpolation.py +409 -0
  126. sage/coding/guruswami_sudan/utils.py +176 -0
  127. sage/coding/hamming_code.py +176 -0
  128. sage/coding/information_set_decoder.py +1032 -0
  129. sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
  130. sage/coding/kasami_codes.pyx +351 -0
  131. sage/coding/linear_code.py +3067 -0
  132. sage/coding/linear_code_no_metric.py +1354 -0
  133. sage/coding/linear_rank_metric.py +961 -0
  134. sage/coding/parity_check_code.py +353 -0
  135. sage/coding/punctured_code.py +719 -0
  136. sage/coding/reed_muller_code.py +999 -0
  137. sage/coding/self_dual_codes.py +942 -0
  138. sage/coding/source_coding/all.py +2 -0
  139. sage/coding/source_coding/huffman.py +553 -0
  140. sage/coding/subfield_subcode.py +423 -0
  141. sage/coding/two_weight_db.py +399 -0
  142. sage/combinat/all__sagemath_modules.py +7 -0
  143. sage/combinat/cartesian_product.py +347 -0
  144. sage/combinat/family.py +11 -0
  145. sage/combinat/free_module.py +1977 -0
  146. sage/combinat/root_system/all.py +147 -0
  147. sage/combinat/root_system/ambient_space.py +527 -0
  148. sage/combinat/root_system/associahedron.py +471 -0
  149. sage/combinat/root_system/braid_move_calculator.py +143 -0
  150. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
  151. sage/combinat/root_system/braid_orbit.pyx +144 -0
  152. sage/combinat/root_system/branching_rules.py +2301 -0
  153. sage/combinat/root_system/cartan_matrix.py +1245 -0
  154. sage/combinat/root_system/cartan_type.py +3069 -0
  155. sage/combinat/root_system/coxeter_group.py +162 -0
  156. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  157. sage/combinat/root_system/coxeter_type.py +681 -0
  158. sage/combinat/root_system/dynkin_diagram.py +900 -0
  159. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  160. sage/combinat/root_system/fundamental_group.py +795 -0
  161. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  162. sage/combinat/root_system/integrable_representations.py +1227 -0
  163. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  164. sage/combinat/root_system/pieri_factors.py +1147 -0
  165. sage/combinat/root_system/plot.py +1615 -0
  166. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  167. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  168. sage/combinat/root_system/root_space.py +487 -0
  169. sage/combinat/root_system/root_system.py +882 -0
  170. sage/combinat/root_system/type_A.py +348 -0
  171. sage/combinat/root_system/type_A_affine.py +227 -0
  172. sage/combinat/root_system/type_A_infinity.py +241 -0
  173. sage/combinat/root_system/type_B.py +347 -0
  174. sage/combinat/root_system/type_BC_affine.py +287 -0
  175. sage/combinat/root_system/type_B_affine.py +216 -0
  176. sage/combinat/root_system/type_C.py +317 -0
  177. sage/combinat/root_system/type_C_affine.py +188 -0
  178. sage/combinat/root_system/type_D.py +357 -0
  179. sage/combinat/root_system/type_D_affine.py +208 -0
  180. sage/combinat/root_system/type_E.py +641 -0
  181. sage/combinat/root_system/type_E_affine.py +231 -0
  182. sage/combinat/root_system/type_F.py +387 -0
  183. sage/combinat/root_system/type_F_affine.py +137 -0
  184. sage/combinat/root_system/type_G.py +293 -0
  185. sage/combinat/root_system/type_G_affine.py +132 -0
  186. sage/combinat/root_system/type_H.py +105 -0
  187. sage/combinat/root_system/type_I.py +110 -0
  188. sage/combinat/root_system/type_Q.py +150 -0
  189. sage/combinat/root_system/type_affine.py +509 -0
  190. sage/combinat/root_system/type_dual.py +704 -0
  191. sage/combinat/root_system/type_folded.py +301 -0
  192. sage/combinat/root_system/type_marked.py +748 -0
  193. sage/combinat/root_system/type_reducible.py +601 -0
  194. sage/combinat/root_system/type_relabel.py +730 -0
  195. sage/combinat/root_system/type_super_A.py +837 -0
  196. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  197. sage/combinat/root_system/weight_space.py +639 -0
  198. sage/combinat/root_system/weyl_characters.py +2238 -0
  199. sage/crypto/__init__.py +4 -0
  200. sage/crypto/all.py +28 -0
  201. sage/crypto/block_cipher/all.py +7 -0
  202. sage/crypto/block_cipher/des.py +1065 -0
  203. sage/crypto/block_cipher/miniaes.py +2171 -0
  204. sage/crypto/block_cipher/present.py +909 -0
  205. sage/crypto/block_cipher/sdes.py +1527 -0
  206. sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
  207. sage/crypto/boolean_function.pxd +10 -0
  208. sage/crypto/boolean_function.pyx +1487 -0
  209. sage/crypto/cipher.py +78 -0
  210. sage/crypto/classical.py +3668 -0
  211. sage/crypto/classical_cipher.py +569 -0
  212. sage/crypto/cryptosystem.py +387 -0
  213. sage/crypto/key_exchange/all.py +7 -0
  214. sage/crypto/key_exchange/catalog.py +24 -0
  215. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  216. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  217. sage/crypto/lattice.py +312 -0
  218. sage/crypto/lfsr.py +295 -0
  219. sage/crypto/lwe.py +840 -0
  220. sage/crypto/mq/__init__.py +4 -0
  221. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  222. sage/crypto/mq/rijndael_gf.py +2345 -0
  223. sage/crypto/mq/sbox.py +7 -0
  224. sage/crypto/mq/sr.py +3344 -0
  225. sage/crypto/public_key/all.py +5 -0
  226. sage/crypto/public_key/blum_goldwasser.py +776 -0
  227. sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
  228. sage/crypto/sbox.pyx +2090 -0
  229. sage/crypto/sboxes.py +2090 -0
  230. sage/crypto/stream.py +390 -0
  231. sage/crypto/stream_cipher.py +297 -0
  232. sage/crypto/util.py +519 -0
  233. sage/ext/all__sagemath_modules.py +1 -0
  234. sage/ext/interpreters/__init__.py +1 -0
  235. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  236. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
  237. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  238. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  239. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
  240. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  241. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  242. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
  243. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  244. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  245. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
  246. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  247. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  248. sage/geometry/all__sagemath_modules.py +5 -0
  249. sage/geometry/toric_lattice.py +1745 -0
  250. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
  251. sage/geometry/toric_lattice_element.pyx +432 -0
  252. sage/groups/abelian_gps/abelian_group.py +1925 -0
  253. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  254. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  255. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  256. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  257. sage/groups/abelian_gps/element_base.py +341 -0
  258. sage/groups/abelian_gps/values.py +488 -0
  259. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  260. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  261. sage/groups/additive_abelian/all.py +4 -0
  262. sage/groups/additive_abelian/qmodnz.py +231 -0
  263. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  264. sage/groups/affine_gps/affine_group.py +535 -0
  265. sage/groups/affine_gps/all.py +1 -0
  266. sage/groups/affine_gps/catalog.py +17 -0
  267. sage/groups/affine_gps/euclidean_group.py +246 -0
  268. sage/groups/affine_gps/group_element.py +562 -0
  269. sage/groups/all__sagemath_modules.py +12 -0
  270. sage/groups/galois_group.py +479 -0
  271. sage/groups/matrix_gps/all.py +4 -0
  272. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  273. sage/groups/matrix_gps/catalog.py +26 -0
  274. sage/groups/matrix_gps/coxeter_group.py +927 -0
  275. sage/groups/matrix_gps/finitely_generated.py +487 -0
  276. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
  277. sage/groups/matrix_gps/group_element.pxd +11 -0
  278. sage/groups/matrix_gps/group_element.pyx +431 -0
  279. sage/groups/matrix_gps/linear.py +440 -0
  280. sage/groups/matrix_gps/matrix_group.py +617 -0
  281. sage/groups/matrix_gps/named_group.py +296 -0
  282. sage/groups/matrix_gps/orthogonal.py +544 -0
  283. sage/groups/matrix_gps/symplectic.py +251 -0
  284. sage/groups/matrix_gps/unitary.py +436 -0
  285. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  286. sage/groups/misc_gps/argument_groups.py +1905 -0
  287. sage/groups/misc_gps/imaginary_groups.py +479 -0
  288. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  296. sage/homology/algebraic_topological_model.py +595 -0
  297. sage/homology/all.py +2 -0
  298. sage/homology/all__sagemath_modules.py +8 -0
  299. sage/homology/chain_complex.py +2148 -0
  300. sage/homology/chain_complex_homspace.py +165 -0
  301. sage/homology/chain_complex_morphism.py +629 -0
  302. sage/homology/chain_homotopy.py +604 -0
  303. sage/homology/chains.py +653 -0
  304. sage/homology/free_resolution.py +923 -0
  305. sage/homology/graded_resolution.py +567 -0
  306. sage/homology/hochschild_complex.py +756 -0
  307. sage/homology/homology_group.py +188 -0
  308. sage/homology/homology_morphism.py +422 -0
  309. sage/homology/homology_vector_space_with_basis.py +1454 -0
  310. sage/homology/koszul_complex.py +169 -0
  311. sage/homology/matrix_utils.py +205 -0
  312. sage/libs/all__sagemath_modules.py +1 -0
  313. sage/libs/gsl/__init__.py +1 -0
  314. sage/libs/gsl/airy.pxd +56 -0
  315. sage/libs/gsl/all.pxd +66 -0
  316. sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
  317. sage/libs/gsl/array.pxd +5 -0
  318. sage/libs/gsl/array.pyx +102 -0
  319. sage/libs/gsl/bessel.pxd +208 -0
  320. sage/libs/gsl/blas.pxd +116 -0
  321. sage/libs/gsl/blas_types.pxd +34 -0
  322. sage/libs/gsl/block.pxd +52 -0
  323. sage/libs/gsl/chebyshev.pxd +37 -0
  324. sage/libs/gsl/clausen.pxd +12 -0
  325. sage/libs/gsl/combination.pxd +47 -0
  326. sage/libs/gsl/complex.pxd +151 -0
  327. sage/libs/gsl/coulomb.pxd +30 -0
  328. sage/libs/gsl/coupling.pxd +21 -0
  329. sage/libs/gsl/dawson.pxd +12 -0
  330. sage/libs/gsl/debye.pxd +24 -0
  331. sage/libs/gsl/dilog.pxd +14 -0
  332. sage/libs/gsl/eigen.pxd +46 -0
  333. sage/libs/gsl/elementary.pxd +12 -0
  334. sage/libs/gsl/ellint.pxd +48 -0
  335. sage/libs/gsl/elljac.pxd +8 -0
  336. sage/libs/gsl/erf.pxd +32 -0
  337. sage/libs/gsl/errno.pxd +26 -0
  338. sage/libs/gsl/exp.pxd +44 -0
  339. sage/libs/gsl/expint.pxd +44 -0
  340. sage/libs/gsl/fermi_dirac.pxd +44 -0
  341. sage/libs/gsl/fft.pxd +121 -0
  342. sage/libs/gsl/fit.pxd +50 -0
  343. sage/libs/gsl/gamma.pxd +94 -0
  344. sage/libs/gsl/gegenbauer.pxd +26 -0
  345. sage/libs/gsl/histogram.pxd +176 -0
  346. sage/libs/gsl/hyperg.pxd +52 -0
  347. sage/libs/gsl/integration.pxd +69 -0
  348. sage/libs/gsl/interp.pxd +109 -0
  349. sage/libs/gsl/laguerre.pxd +24 -0
  350. sage/libs/gsl/lambert.pxd +16 -0
  351. sage/libs/gsl/legendre.pxd +90 -0
  352. sage/libs/gsl/linalg.pxd +185 -0
  353. sage/libs/gsl/log.pxd +26 -0
  354. sage/libs/gsl/math.pxd +43 -0
  355. sage/libs/gsl/matrix.pxd +143 -0
  356. sage/libs/gsl/matrix_complex.pxd +130 -0
  357. sage/libs/gsl/min.pxd +67 -0
  358. sage/libs/gsl/monte.pxd +56 -0
  359. sage/libs/gsl/ntuple.pxd +32 -0
  360. sage/libs/gsl/odeiv.pxd +70 -0
  361. sage/libs/gsl/permutation.pxd +78 -0
  362. sage/libs/gsl/poly.pxd +40 -0
  363. sage/libs/gsl/pow_int.pxd +12 -0
  364. sage/libs/gsl/psi.pxd +28 -0
  365. sage/libs/gsl/qrng.pxd +29 -0
  366. sage/libs/gsl/random.pxd +257 -0
  367. sage/libs/gsl/rng.pxd +100 -0
  368. sage/libs/gsl/roots.pxd +72 -0
  369. sage/libs/gsl/sort.pxd +36 -0
  370. sage/libs/gsl/statistics.pxd +59 -0
  371. sage/libs/gsl/sum.pxd +55 -0
  372. sage/libs/gsl/synchrotron.pxd +16 -0
  373. sage/libs/gsl/transport.pxd +24 -0
  374. sage/libs/gsl/trig.pxd +58 -0
  375. sage/libs/gsl/types.pxd +137 -0
  376. sage/libs/gsl/vector.pxd +101 -0
  377. sage/libs/gsl/vector_complex.pxd +83 -0
  378. sage/libs/gsl/wavelet.pxd +49 -0
  379. sage/libs/gsl/zeta.pxd +28 -0
  380. sage/libs/mpc/__init__.pxd +114 -0
  381. sage/libs/mpc/types.pxd +28 -0
  382. sage/libs/mpfr/__init__.pxd +299 -0
  383. sage/libs/mpfr/types.pxd +26 -0
  384. sage/libs/mpmath/__init__.py +1 -0
  385. sage/libs/mpmath/all.py +27 -0
  386. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  387. sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
  388. sage/libs/mpmath/utils.pxd +4 -0
  389. sage/libs/mpmath/utils.pyx +319 -0
  390. sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
  391. sage/matrix/action.pxd +26 -0
  392. sage/matrix/action.pyx +596 -0
  393. sage/matrix/all.py +9 -0
  394. sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
  395. sage/matrix/args.pxd +144 -0
  396. sage/matrix/args.pyx +1668 -0
  397. sage/matrix/benchmark.py +1258 -0
  398. sage/matrix/berlekamp_massey.py +95 -0
  399. sage/matrix/compute_J_ideal.py +926 -0
  400. sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
  416. sage/matrix/matrix_cdv.pxd +4 -0
  417. sage/matrix/matrix_cdv.pyx +93 -0
  418. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  419. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  420. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  421. sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
  422. sage/matrix/matrix_dense.pxd +5 -0
  423. sage/matrix/matrix_dense.pyx +343 -0
  424. sage/matrix/matrix_domain_dense.pxd +5 -0
  425. sage/matrix/matrix_domain_sparse.pxd +5 -0
  426. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  427. sage/matrix/matrix_double_dense.pxd +7 -0
  428. sage/matrix/matrix_double_dense.pyx +3906 -0
  429. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  430. sage/matrix/matrix_double_sparse.pxd +6 -0
  431. sage/matrix/matrix_double_sparse.pyx +248 -0
  432. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
  433. sage/matrix/matrix_generic_dense.pxd +7 -0
  434. sage/matrix/matrix_generic_dense.pyx +354 -0
  435. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  436. sage/matrix/matrix_generic_sparse.pxd +7 -0
  437. sage/matrix/matrix_generic_sparse.pyx +461 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  441. sage/matrix/matrix_misc.py +313 -0
  442. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  443. sage/matrix/matrix_numpy_dense.pxd +14 -0
  444. sage/matrix/matrix_numpy_dense.pyx +450 -0
  445. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  446. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  447. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  448. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  449. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  450. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  451. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  452. sage/matrix/matrix_real_double_dense.pxd +7 -0
  453. sage/matrix/matrix_real_double_dense.pyx +122 -0
  454. sage/matrix/matrix_space.py +2848 -0
  455. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  456. sage/matrix/matrix_sparse.pxd +5 -0
  457. sage/matrix/matrix_sparse.pyx +1222 -0
  458. sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
  459. sage/matrix/matrix_window.pxd +37 -0
  460. sage/matrix/matrix_window.pyx +242 -0
  461. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  462. sage/matrix/misc_mpfr.pyx +80 -0
  463. sage/matrix/operation_table.py +1182 -0
  464. sage/matrix/special.py +3666 -0
  465. sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
  466. sage/matrix/strassen.pyx +851 -0
  467. sage/matrix/symplectic_basis.py +541 -0
  468. sage/matrix/template.pxd +6 -0
  469. sage/matrix/tests.py +71 -0
  470. sage/matroids/advanced.py +77 -0
  471. sage/matroids/all.py +13 -0
  472. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  473. sage/matroids/basis_exchange_matroid.pxd +96 -0
  474. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  475. sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  476. sage/matroids/basis_matroid.pxd +45 -0
  477. sage/matroids/basis_matroid.pyx +1217 -0
  478. sage/matroids/catalog.py +44 -0
  479. sage/matroids/chow_ring.py +473 -0
  480. sage/matroids/chow_ring_ideal.py +849 -0
  481. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  482. sage/matroids/circuit_closures_matroid.pxd +16 -0
  483. sage/matroids/circuit_closures_matroid.pyx +559 -0
  484. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  485. sage/matroids/circuits_matroid.pxd +38 -0
  486. sage/matroids/circuits_matroid.pyx +947 -0
  487. sage/matroids/constructor.py +1086 -0
  488. sage/matroids/database_collections.py +365 -0
  489. sage/matroids/database_matroids.py +5338 -0
  490. sage/matroids/dual_matroid.py +583 -0
  491. sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  495. sage/matroids/flats_matroid.pxd +28 -0
  496. sage/matroids/flats_matroid.pyx +715 -0
  497. sage/matroids/gammoid.py +600 -0
  498. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  499. sage/matroids/graphic_matroid.pxd +39 -0
  500. sage/matroids/graphic_matroid.pyx +2024 -0
  501. sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  502. sage/matroids/lean_matrix.pxd +126 -0
  503. sage/matroids/lean_matrix.pyx +3667 -0
  504. sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  505. sage/matroids/linear_matroid.pxd +180 -0
  506. sage/matroids/linear_matroid.pyx +6649 -0
  507. sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
  508. sage/matroids/matroid.pxd +243 -0
  509. sage/matroids/matroid.pyx +8759 -0
  510. sage/matroids/matroids_catalog.py +190 -0
  511. sage/matroids/matroids_plot_helpers.py +890 -0
  512. sage/matroids/minor_matroid.py +480 -0
  513. sage/matroids/minorfix.h +9 -0
  514. sage/matroids/named_matroids.py +5 -0
  515. sage/matroids/rank_matroid.py +268 -0
  516. sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
  517. sage/matroids/set_system.pxd +38 -0
  518. sage/matroids/set_system.pyx +800 -0
  519. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  520. sage/matroids/transversal_matroid.pxd +14 -0
  521. sage/matroids/transversal_matroid.pyx +893 -0
  522. sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  523. sage/matroids/union_matroid.pxd +20 -0
  524. sage/matroids/union_matroid.pyx +331 -0
  525. sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
  526. sage/matroids/unpickling.pyx +843 -0
  527. sage/matroids/utilities.py +809 -0
  528. sage/misc/all__sagemath_modules.py +20 -0
  529. sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
  530. sage/misc/c3.pyx +238 -0
  531. sage/misc/compat.py +87 -0
  532. sage/misc/element_with_label.py +173 -0
  533. sage/misc/func_persist.py +79 -0
  534. sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
  535. sage/misc/pickle_old.pyx +19 -0
  536. sage/misc/proof.py +7 -0
  537. sage/misc/replace_dot_all.py +472 -0
  538. sage/misc/sagedoc_conf.py +168 -0
  539. sage/misc/sphinxify.py +167 -0
  540. sage/misc/test_class_pickling.py +85 -0
  541. sage/modules/all.py +42 -0
  542. sage/modules/complex_double_vector.py +25 -0
  543. sage/modules/diamond_cutting.py +380 -0
  544. sage/modules/fg_pid/all.py +1 -0
  545. sage/modules/fg_pid/fgp_element.py +456 -0
  546. sage/modules/fg_pid/fgp_module.py +2091 -0
  547. sage/modules/fg_pid/fgp_morphism.py +550 -0
  548. sage/modules/filtered_vector_space.py +1271 -0
  549. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
  550. sage/modules/finite_submodule_iter.pxd +27 -0
  551. sage/modules/finite_submodule_iter.pyx +452 -0
  552. sage/modules/fp_graded/all.py +1 -0
  553. sage/modules/fp_graded/element.py +346 -0
  554. sage/modules/fp_graded/free_element.py +298 -0
  555. sage/modules/fp_graded/free_homspace.py +53 -0
  556. sage/modules/fp_graded/free_module.py +1060 -0
  557. sage/modules/fp_graded/free_morphism.py +217 -0
  558. sage/modules/fp_graded/homspace.py +563 -0
  559. sage/modules/fp_graded/module.py +1340 -0
  560. sage/modules/fp_graded/morphism.py +1990 -0
  561. sage/modules/fp_graded/steenrod/all.py +1 -0
  562. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  563. sage/modules/fp_graded/steenrod/module.py +477 -0
  564. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  565. sage/modules/fp_graded/steenrod/profile.py +241 -0
  566. sage/modules/free_module.py +8447 -0
  567. sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
  568. sage/modules/free_module_element.pxd +22 -0
  569. sage/modules/free_module_element.pyx +5445 -0
  570. sage/modules/free_module_homspace.py +369 -0
  571. sage/modules/free_module_integer.py +896 -0
  572. sage/modules/free_module_morphism.py +823 -0
  573. sage/modules/free_module_pseudohomspace.py +352 -0
  574. sage/modules/free_module_pseudomorphism.py +578 -0
  575. sage/modules/free_quadratic_module.py +1706 -0
  576. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  577. sage/modules/matrix_morphism.py +1745 -0
  578. sage/modules/misc.py +103 -0
  579. sage/modules/module_functors.py +192 -0
  580. sage/modules/multi_filtered_vector_space.py +719 -0
  581. sage/modules/ore_module.py +2208 -0
  582. sage/modules/ore_module_element.py +178 -0
  583. sage/modules/ore_module_homspace.py +147 -0
  584. sage/modules/ore_module_morphism.py +968 -0
  585. sage/modules/quotient_module.py +699 -0
  586. sage/modules/real_double_vector.py +22 -0
  587. sage/modules/submodule.py +255 -0
  588. sage/modules/tensor_operations.py +567 -0
  589. sage/modules/torsion_quadratic_module.py +1352 -0
  590. sage/modules/tutorial_free_modules.py +248 -0
  591. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  592. sage/modules/vector_complex_double_dense.pxd +6 -0
  593. sage/modules/vector_complex_double_dense.pyx +117 -0
  594. sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  595. sage/modules/vector_double_dense.pxd +6 -0
  596. sage/modules/vector_double_dense.pyx +604 -0
  597. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  598. sage/modules/vector_integer_dense.pxd +15 -0
  599. sage/modules/vector_integer_dense.pyx +361 -0
  600. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  601. sage/modules/vector_integer_sparse.pxd +29 -0
  602. sage/modules/vector_integer_sparse.pyx +406 -0
  603. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
  604. sage/modules/vector_modn_dense.pxd +12 -0
  605. sage/modules/vector_modn_dense.pyx +394 -0
  606. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  607. sage/modules/vector_modn_sparse.pxd +21 -0
  608. sage/modules/vector_modn_sparse.pyx +298 -0
  609. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  610. sage/modules/vector_numpy_dense.pxd +15 -0
  611. sage/modules/vector_numpy_dense.pyx +304 -0
  612. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  613. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  614. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  615. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
  616. sage/modules/vector_rational_dense.pxd +15 -0
  617. sage/modules/vector_rational_dense.pyx +387 -0
  618. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  619. sage/modules/vector_rational_sparse.pxd +30 -0
  620. sage/modules/vector_rational_sparse.pyx +413 -0
  621. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  622. sage/modules/vector_real_double_dense.pxd +6 -0
  623. sage/modules/vector_real_double_dense.pyx +126 -0
  624. sage/modules/vector_space_homspace.py +430 -0
  625. sage/modules/vector_space_morphism.py +989 -0
  626. sage/modules/with_basis/all.py +15 -0
  627. sage/modules/with_basis/cell_module.py +494 -0
  628. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
  629. sage/modules/with_basis/indexed_element.pxd +13 -0
  630. sage/modules/with_basis/indexed_element.pyx +1058 -0
  631. sage/modules/with_basis/invariant.py +1075 -0
  632. sage/modules/with_basis/morphism.py +1636 -0
  633. sage/modules/with_basis/representation.py +2939 -0
  634. sage/modules/with_basis/subquotient.py +685 -0
  635. sage/numerical/all__sagemath_modules.py +6 -0
  636. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
  637. sage/numerical/gauss_legendre.pyx +381 -0
  638. sage/numerical/optimize.py +910 -0
  639. sage/probability/all.py +10 -0
  640. sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
  641. sage/probability/probability_distribution.pyx +1242 -0
  642. sage/probability/random_variable.py +411 -0
  643. sage/quadratic_forms/all.py +4 -0
  644. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  645. sage/quadratic_forms/binary_qf.py +2042 -0
  646. sage/quadratic_forms/bqf_class_group.py +748 -0
  647. sage/quadratic_forms/constructions.py +93 -0
  648. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
  649. sage/quadratic_forms/count_local_2.pyx +365 -0
  650. sage/quadratic_forms/extras.py +195 -0
  651. sage/quadratic_forms/quadratic_form.py +1753 -0
  652. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  653. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  656. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  657. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  658. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  659. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  660. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  661. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  662. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  663. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  664. sage/quadratic_forms/random_quadraticform.py +209 -0
  665. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
  666. sage/quadratic_forms/ternary.pyx +1154 -0
  667. sage/quadratic_forms/ternary_qf.py +2027 -0
  668. sage/rings/all__sagemath_modules.py +28 -0
  669. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  670. sage/rings/asymptotic/misc.py +1252 -0
  671. sage/rings/cc.py +4 -0
  672. sage/rings/cfinite_sequence.py +1306 -0
  673. sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  674. sage/rings/complex_conversion.pxd +8 -0
  675. sage/rings/complex_conversion.pyx +23 -0
  676. sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
  677. sage/rings/complex_double.pxd +21 -0
  678. sage/rings/complex_double.pyx +2654 -0
  679. sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
  680. sage/rings/complex_mpc.pxd +21 -0
  681. sage/rings/complex_mpc.pyx +2576 -0
  682. sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  683. sage/rings/complex_mpfr.pxd +18 -0
  684. sage/rings/complex_mpfr.pyx +3602 -0
  685. sage/rings/derivation.py +2334 -0
  686. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  687. sage/rings/finite_rings/maps_finite_field.py +191 -0
  688. sage/rings/function_field/all__sagemath_modules.py +8 -0
  689. sage/rings/function_field/derivations.py +102 -0
  690. sage/rings/function_field/derivations_rational.py +132 -0
  691. sage/rings/function_field/differential.py +853 -0
  692. sage/rings/function_field/divisor.py +1107 -0
  693. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  694. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  695. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  696. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  697. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  698. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  699. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  700. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
  703. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  704. sage/rings/invariants/all.py +4 -0
  705. sage/rings/invariants/invariant_theory.py +4597 -0
  706. sage/rings/invariants/reconstruction.py +395 -0
  707. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  708. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  712. sage/rings/polynomial/ore_function_element.py +952 -0
  713. sage/rings/polynomial/ore_function_field.py +1028 -0
  714. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  715. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  716. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  717. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  720. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  721. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  722. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  723. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  730. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  731. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
  732. sage/rings/real_double_element_gsl.pxd +8 -0
  733. sage/rings/real_double_element_gsl.pyx +794 -0
  734. sage/rings/real_field.py +58 -0
  735. sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  736. sage/rings/real_mpfr.pxd +29 -0
  737. sage/rings/real_mpfr.pyx +6122 -0
  738. sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
  739. sage/rings/ring_extension.pxd +42 -0
  740. sage/rings/ring_extension.pyx +2779 -0
  741. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  742. sage/rings/ring_extension_conversion.pxd +16 -0
  743. sage/rings/ring_extension_conversion.pyx +462 -0
  744. sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
  745. sage/rings/ring_extension_element.pxd +21 -0
  746. sage/rings/ring_extension_element.pyx +1635 -0
  747. sage/rings/ring_extension_homset.py +64 -0
  748. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
  749. sage/rings/ring_extension_morphism.pxd +35 -0
  750. sage/rings/ring_extension_morphism.pyx +920 -0
  751. sage/schemes/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/coherent_sheaf.py +300 -0
  754. sage/schemes/projective/cohomology.py +510 -0
  755. sage/stats/all.py +15 -0
  756. sage/stats/basic_stats.py +489 -0
  757. sage/stats/distributions/all.py +7 -0
  758. sage/stats/distributions/catalog.py +34 -0
  759. sage/stats/distributions/dgs.h +50 -0
  760. sage/stats/distributions/dgs.pxd +111 -0
  761. sage/stats/distributions/dgs_bern.h +400 -0
  762. sage/stats/distributions/dgs_gauss.h +614 -0
  763. sage/stats/distributions/dgs_misc.h +104 -0
  764. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  767. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  768. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  769. sage/stats/hmm/all.py +15 -0
  770. sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
  773. sage/stats/hmm/distributions.pxd +29 -0
  774. sage/stats/hmm/distributions.pyx +531 -0
  775. sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
  776. sage/stats/hmm/hmm.pxd +17 -0
  777. sage/stats/hmm/hmm.pyx +1388 -0
  778. sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
  779. sage/stats/hmm/util.pxd +7 -0
  780. sage/stats/hmm/util.pyx +165 -0
  781. sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
  782. sage/stats/intlist.pxd +14 -0
  783. sage/stats/intlist.pyx +588 -0
  784. sage/stats/r.py +49 -0
  785. sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
  786. sage/stats/time_series.pxd +6 -0
  787. sage/stats/time_series.pyx +2546 -0
  788. sage/tensor/all.py +2 -0
  789. sage/tensor/modules/all.py +8 -0
  790. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  791. sage/tensor/modules/comp.py +5598 -0
  792. sage/tensor/modules/ext_pow_free_module.py +824 -0
  793. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  794. sage/tensor/modules/format_utilities.py +333 -0
  795. sage/tensor/modules/free_module_alt_form.py +858 -0
  796. sage/tensor/modules/free_module_automorphism.py +1207 -0
  797. sage/tensor/modules/free_module_basis.py +1074 -0
  798. sage/tensor/modules/free_module_element.py +284 -0
  799. sage/tensor/modules/free_module_homset.py +652 -0
  800. sage/tensor/modules/free_module_linear_group.py +564 -0
  801. sage/tensor/modules/free_module_morphism.py +1581 -0
  802. sage/tensor/modules/free_module_tensor.py +3289 -0
  803. sage/tensor/modules/reflexive_module.py +386 -0
  804. sage/tensor/modules/tensor_free_module.py +780 -0
  805. sage/tensor/modules/tensor_free_submodule.py +538 -0
  806. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  807. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1581 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ Free module morphisms
4
+
5
+ The class :class:`FiniteRankFreeModuleMorphism` implements homomorphisms
6
+ between two free modules of finite rank over the same commutative ring.
7
+
8
+ The subclass :class:`FiniteRankFreeModuleEndomorphism` implements the
9
+ special case of endomorphisms.
10
+
11
+ AUTHORS:
12
+
13
+ - Eric Gourgoulhon, Michal Bejger (2014-2015): initial version
14
+ - Matthias Koeppe (2024): add subclass :class:`FiniteRankFreeModuleEndomorphism`
15
+
16
+ REFERENCES:
17
+
18
+ - Chap. 13, 14 of R. Godement : *Algebra* [God1968]_
19
+ - Chap. 3 of S. Lang : *Algebra* [Lan2002]_
20
+ """
21
+ # *****************************************************************************
22
+ # Copyright (C) 2015 Eric Gourgoulhon <eric.gourgoulhon@obspm.fr>
23
+ # Copyright (C) 2015 Michal Bejger <bejger@camk.edu.pl>
24
+ #
25
+ # Distributed under the terms of the GNU General Public License (GPL)
26
+ # as published by the Free Software Foundation; either version 2 of
27
+ # the License, or (at your option) any later version.
28
+ # https://www.gnu.org/licenses/
29
+ # *****************************************************************************
30
+ from __future__ import annotations
31
+
32
+ from typing import TYPE_CHECKING
33
+
34
+ from sage.categories.morphism import Morphism
35
+ from sage.misc.lazy_attribute import lazy_attribute
36
+ from sage.rings.integer import Integer
37
+
38
+ if TYPE_CHECKING:
39
+ from sage.tensor.modules.free_module_element import FiniteRankFreeModuleElement
40
+
41
+
42
+ class FiniteRankFreeModuleMorphism(Morphism):
43
+ r"""
44
+ Homomorphism between free modules of finite rank over a commutative ring.
45
+
46
+ An instance of this class is a homomorphism
47
+
48
+ .. MATH::
49
+
50
+ \phi:\ M \longrightarrow N,
51
+
52
+ where `M` and `N` are two free modules of finite rank over the same
53
+ commutative ring `R`.
54
+
55
+ This is a Sage *element* class, the corresponding *parent* class being
56
+ :class:`~sage.tensor.modules.free_module_homset.FreeModuleHomset`.
57
+
58
+ For the special case of endomorphisms (`M=N`), use the subclass
59
+ :class:`FiniteRankFreeModuleEndomorphism`.
60
+
61
+ INPUT:
62
+
63
+ - ``parent`` -- Hom-set Hom(M,N) to which the homomorphism belongs
64
+ - ``matrix_rep`` -- matrix representation of the homomorphism with
65
+ respect to the bases ``bases``; this entry can actually
66
+ be any material from which a matrix of size rank(N)*rank(M) of
67
+ elements of `R` can be constructed; the *columns* of the matrix give
68
+ the images of the basis of `M` (see the convention in the example below)
69
+ - ``bases`` -- (default: ``None``) pair (basis_M, basis_N) defining the
70
+ matrix representation, basis_M being a basis of module `M` and
71
+ basis_N a basis of module `N` ; if None the pair formed by the
72
+ default bases of each module is assumed.
73
+ - ``name`` -- (default: ``None``) string; name given to the homomorphism
74
+ - ``latex_name`` -- (default: ``None``) string; LaTeX symbol to denote the
75
+ homomorphism. If ``None``, ``name`` will be used.
76
+
77
+ EXAMPLES:
78
+
79
+ A homomorphism between two free modules over `\ZZ` is constructed
80
+ as an element of the corresponding hom-set, by means of the function
81
+ ``__call__``::
82
+
83
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
84
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
85
+ sage: e = M.basis('e') ; f = N.basis('f')
86
+ sage: H = Hom(M,N) ; H
87
+ Set of Morphisms from Rank-3 free module M over the Integer Ring
88
+ to Rank-2 free module N over the Integer Ring
89
+ in Category of finite dimensional modules over Integer Ring
90
+ sage: phi = H([[2,-1,3], [1,0,-4]], name='phi', latex_name=r'\phi') ; phi
91
+ Generic morphism:
92
+ From: Rank-3 free module M over the Integer Ring
93
+ To: Rank-2 free module N over the Integer Ring
94
+
95
+ Since no bases have been specified in the argument list, the provided
96
+ matrix is relative to the default bases of modules M and N, so that
97
+ the above is equivalent to::
98
+
99
+ sage: phi = H([[2,-1,3], [1,0,-4]], bases=(e,f), name='phi',
100
+ ....: latex_name=r'\phi') ; phi
101
+ Generic morphism:
102
+ From: Rank-3 free module M over the Integer Ring
103
+ To: Rank-2 free module N over the Integer Ring
104
+
105
+ An alternative way to construct a homomorphism is to call the method
106
+ :meth:`~sage.tensor.modules.finite_rank_free_module.FiniteRankFreeModule.hom`
107
+ on the domain::
108
+
109
+ sage: phi = M.hom(N, [[2,-1,3], [1,0,-4]], bases=(e,f), name='phi',
110
+ ....: latex_name=r'\phi') ; phi
111
+ Generic morphism:
112
+ From: Rank-3 free module M over the Integer Ring
113
+ To: Rank-2 free module N over the Integer Ring
114
+
115
+ The parent of a homomorphism is of course the corresponding hom-set::
116
+
117
+ sage: phi.parent() is H
118
+ True
119
+ sage: phi.parent() is Hom(M,N)
120
+ True
121
+
122
+ Due to Sage's category scheme, the actual class of the homomorphism ``phi``
123
+ is a derived class of :class:`FiniteRankFreeModuleMorphism`::
124
+
125
+ sage: type(phi)
126
+ <class 'sage.tensor.modules.free_module_homset.FreeModuleHomset_with_category_with_equality_by_id.element_class'>
127
+ sage: isinstance(phi, sage.tensor.modules.free_module_morphism.FiniteRankFreeModuleMorphism)
128
+ True
129
+
130
+ The domain and codomain of the homomorphism are returned respectively by
131
+ the methods ``domain()`` and ``codomain()``, which are implemented as
132
+ Sage's constant functions::
133
+
134
+ sage: phi.domain()
135
+ Rank-3 free module M over the Integer Ring
136
+ sage: phi.codomain()
137
+ Rank-2 free module N over the Integer Ring
138
+ sage: type(phi.domain)
139
+ <... 'sage.misc.constant_function.ConstantFunction'>
140
+
141
+ The matrix of the homomorphism with respect to a pair of bases is
142
+ returned by the method :meth:`matrix`::
143
+
144
+ sage: phi.matrix(e,f)
145
+ [ 2 -1 3]
146
+ [ 1 0 -4]
147
+
148
+ The convention is that the columns of this matrix give the components of
149
+ the images of the elements of basis ``e`` w.r.t basis ``f``::
150
+
151
+ sage: phi(e[0]).display()
152
+ phi(e_0) = 2 f_0 + f_1
153
+ sage: phi(e[1]).display()
154
+ phi(e_1) = -f_0
155
+ sage: phi(e[2]).display()
156
+ phi(e_2) = 3 f_0 - 4 f_1
157
+
158
+ Test of the module homomorphism laws::
159
+
160
+ sage: phi(M.zero()) == N.zero()
161
+ True
162
+ sage: u = M([1,2,3], basis=e, name='u') ; u.display()
163
+ u = e_0 + 2 e_1 + 3 e_2
164
+ sage: v = M([-2,1,4], basis=e, name='v') ; v.display()
165
+ v = -2 e_0 + e_1 + 4 e_2
166
+ sage: phi(u).display()
167
+ phi(u) = 9 f_0 - 11 f_1
168
+ sage: phi(v).display()
169
+ phi(v) = 7 f_0 - 18 f_1
170
+ sage: phi(3*u + v).display()
171
+ 34 f_0 - 51 f_1
172
+ sage: phi(3*u + v) == 3*phi(u) + phi(v)
173
+ True
174
+ """
175
+ def __init__(self, parent, matrix_rep, bases=None, name=None,
176
+ latex_name=None, is_identity=False):
177
+ r"""
178
+ TESTS:
179
+
180
+ Generic homomorphism::
181
+
182
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
183
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
184
+ sage: e = M.basis('e') ; f = N.basis('f')
185
+ sage: from sage.tensor.modules.free_module_morphism import FiniteRankFreeModuleMorphism
186
+ sage: phi = FiniteRankFreeModuleMorphism(Hom(M,N), [[1,0,-3], [2,1,4]],
187
+ ....: name='phi', latex_name=r'\phi')
188
+ sage: phi
189
+ Generic morphism:
190
+ From: Rank-3 free module M over the Integer Ring
191
+ To: Rank-2 free module N over the Integer Ring
192
+ sage: phi.matrix(e,f)
193
+ [ 1 0 -3]
194
+ [ 2 1 4]
195
+ sage: latex(phi)
196
+ \phi
197
+ """
198
+ if is_identity:
199
+ raise TypeError('use the subclass FiniteRankFreeModuleEndomorphism for the identity morphis')
200
+ from sage.matrix.constructor import matrix
201
+ from sage.misc.constant_function import ConstantFunction
202
+ Morphism.__init__(self, parent)
203
+ fmodule1 = parent.domain()
204
+ fmodule2 = parent.codomain()
205
+ if bases is None:
206
+ def_basis1 = fmodule1.default_basis()
207
+ if def_basis1 is None:
208
+ raise ValueError("the {} has no default ".format(fmodule1) +
209
+ "basis")
210
+ def_basis2 = fmodule2.default_basis()
211
+ if def_basis2 is None:
212
+ raise ValueError("the {} has no default ".format(fmodule2) +
213
+ "basis")
214
+ bases = (def_basis1, def_basis2)
215
+ else:
216
+ bases = tuple(bases) # insures bases is a tuple
217
+ if len(bases) != 2:
218
+ raise TypeError("the argument bases must contain 2 bases")
219
+ if bases[0] not in fmodule1.bases():
220
+ raise TypeError("{} is not a basis on the {}".format(bases[0],
221
+ fmodule1))
222
+ if bases[1] not in fmodule2.bases():
223
+ raise TypeError("{} is not a basis on the {}".format(bases[1],
224
+ fmodule2))
225
+ ring = parent.base_ring()
226
+ n1 = fmodule1.rank()
227
+ n2 = fmodule2.rank()
228
+ # Construction of a generic morphism
229
+ self._is_identity = False
230
+ if isinstance(matrix_rep, ConstantFunction):
231
+ # the zero morphism
232
+ if matrix_rep().is_zero():
233
+ matrix_rep = 0
234
+ self._matrices = {bases: matrix(ring, n2, n1, matrix_rep)}
235
+ self._name = name
236
+ if latex_name is None:
237
+ self._latex_name = self._name
238
+ else:
239
+ self._latex_name = latex_name
240
+
241
+ #
242
+ # SageObject methods
243
+ #
244
+
245
+ def _latex_(self):
246
+ r"""
247
+ LaTeX representation of the object.
248
+
249
+ EXAMPLES::
250
+
251
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
252
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
253
+ sage: e = M.basis('e') ; f = N.basis('f')
254
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
255
+ ....: latex_name=r'\Phi')
256
+ sage: phi._latex_()
257
+ '\\Phi'
258
+ sage: latex(phi) # indirect doctest
259
+ \Phi
260
+
261
+ ::
262
+
263
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='F')
264
+ sage: phi._latex_()
265
+ 'F'
266
+
267
+ ::
268
+
269
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
270
+ sage: phi._latex_()
271
+ '\\mbox{Generic morphism:\n From: Rank-3 free module M over the Integer Ring\n To: Rank-2 free module N over the Integer Ring}'
272
+ """
273
+ if self._latex_name is None:
274
+ return r'\mbox{' + str(self) + r'}'
275
+ else:
276
+ return self._latex_name
277
+
278
+ def __eq__(self, other):
279
+ r"""
280
+ Comparison (equality) operator.
281
+
282
+ INPUT:
283
+
284
+ - ``other`` -- a free module morphism (or 0)
285
+
286
+ OUTPUT: ``True`` if ``self`` is equal to ``other`` and ``False`` otherwise
287
+
288
+ EXAMPLES::
289
+
290
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
291
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
292
+ sage: e = M.basis('e') ; f = N.basis('f')
293
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
294
+ ....: latex_name=r'\phi')
295
+ sage: psi = M.hom(N, [[-1,2,0], [5,1,2]])
296
+ sage: phi.__eq__(psi)
297
+ True
298
+ sage: phi == psi
299
+ True
300
+ sage: phi.__eq__(phi)
301
+ True
302
+ sage: phi.__eq__(+phi)
303
+ True
304
+ sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
305
+ sage: phi.__eq__(psi)
306
+ False
307
+ sage: phi.__eq__(-phi)
308
+ False
309
+
310
+ Comparison of homomorphisms defined on different bases::
311
+
312
+ sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
313
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
314
+ sage: psi = M.hom(N, [[-2,0,-1], [-1,-2, 5]], bases=(ep,f))
315
+ sage: phi.__eq__(psi)
316
+ True
317
+ sage: phi.matrix(e,f) == psi.matrix(e,f) # check
318
+ True
319
+
320
+ Comparison of homomorphisms having the same matrix but defined on
321
+ different modules::
322
+
323
+ sage: N1 = FiniteRankFreeModule(ZZ, 2, name='N1')
324
+ sage: f1 = N1.basis('f')
325
+ sage: phi1 = M.hom(N1, [[-1,2,0], [5,1,2]])
326
+ sage: phi.matrix() == phi1.matrix() # same matrix in the default bases
327
+ True
328
+ sage: phi.__eq__(phi1)
329
+ False
330
+
331
+ Comparison to zero::
332
+
333
+ sage: phi.__eq__(0)
334
+ False
335
+ sage: phi = M.hom(N, 0)
336
+ sage: phi.__eq__(0)
337
+ True
338
+ sage: phi == 0
339
+ True
340
+ sage: phi.__eq__(Hom(M,N).zero())
341
+ True
342
+ """
343
+ if isinstance(other, (int, Integer)): # other should be 0
344
+ if other == 0:
345
+ return self.is_zero()
346
+ else:
347
+ return False
348
+ elif not isinstance(other, FiniteRankFreeModuleMorphism):
349
+ return False
350
+ elif self.parent() != other.parent():
351
+ return False
352
+ else:
353
+ bases = self._common_bases(other)
354
+ if bases is None:
355
+ raise ValueError("no common pair of bases has been found to " +
356
+ "compare {} and {}".format(self, other))
357
+ return bool( self.matrix(*bases) == other.matrix(*bases) )
358
+
359
+ def __ne__(self, other):
360
+ r"""
361
+ Inequality operator.
362
+
363
+ INPUT:
364
+
365
+ - ``other`` -- a free module morphism (or 0)
366
+
367
+ OUTPUT:
368
+
369
+ - ``True`` if ``self`` is different from ``other`` and ``False``
370
+ otherwise
371
+
372
+ EXAMPLES::
373
+
374
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
375
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
376
+ sage: e = M.basis('e') ; f = N.basis('f')
377
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
378
+ ....: latex_name=r'\phi')
379
+ sage: psi = M.hom(N, [[-1,2,0], [5,1,2]])
380
+ sage: phi.__ne__(psi)
381
+ False
382
+ sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
383
+ sage: phi.__ne__(psi)
384
+ True
385
+ sage: phi != psi
386
+ True
387
+ sage: phi.__ne__('junk')
388
+ True
389
+ sage: Hom(M,N).zero().__ne__(0)
390
+ False
391
+ """
392
+ return not self == other
393
+
394
+ #
395
+ # Required module methods
396
+ #
397
+
398
+ def __bool__(self):
399
+ r"""
400
+ Return ``True`` if ``self`` is nonzero and ``False`` otherwise.
401
+
402
+ This method is called by self.is_zero().
403
+
404
+ EXAMPLES::
405
+
406
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
407
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
408
+ sage: e = M.basis('e') ; f = N.basis('f')
409
+ sage: phi = M.hom(N, [[2,-1,3], [1,0,-4]])
410
+ sage: bool(phi)
411
+ True
412
+ sage: phi.is_zero() # indirect doctest
413
+ False
414
+ sage: phi = M.hom(N, 0)
415
+ sage: bool(phi)
416
+ False
417
+ sage: phi.is_zero() # indirect doctest
418
+ True
419
+ sage: bool(Hom(M,N).zero())
420
+ False
421
+ """
422
+ # Some matrix representation is picked at random:
423
+ matrix_rep = next(iter(self._matrices.values()))
424
+ return not matrix_rep.is_zero()
425
+
426
+ def _add_(self, other):
427
+ r"""
428
+ Homomorphism addition.
429
+
430
+ INPUT:
431
+
432
+ - ``other`` -- a free module morphism (same parent as ``self``)
433
+
434
+ OUTPUT: the homomorphism resulting from the addition of ``self`` and ``other``
435
+
436
+ EXAMPLES::
437
+
438
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
439
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
440
+ sage: e = M.basis('e') ; f = N.basis('f')
441
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
442
+ ....: latex_name=r'\phi')
443
+ sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
444
+ sage: s = phi._add_(psi) ; s
445
+ Generic morphism:
446
+ From: Rank-3 free module M over the Integer Ring
447
+ To: Rank-2 free module N over the Integer Ring
448
+ sage: s.matrix(e,f)
449
+ [0 3 0]
450
+ [9 2 5]
451
+ sage: s.matrix(e,f) == phi.matrix(e,f) + psi.matrix(e,f) # check
452
+ True
453
+ sage: s == phi + psi # indirect doctest
454
+ True
455
+
456
+ Addition of homomorphisms defined on different bases::
457
+
458
+ sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
459
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
460
+ sage: b = N.automorphism() ; b[0,1], b[1,0] = -1, 1
461
+ sage: fp = f.new_basis(b, 'fp', latex_symbol="f'")
462
+ sage: psi = M.hom(N, [[-2,0,-1], [-1,-2, 5]], bases=(ep,fp))
463
+ sage: s = phi._add_(psi) ; s
464
+ Generic morphism:
465
+ From: Rank-3 free module M over the Integer Ring
466
+ To: Rank-2 free module N over the Integer Ring
467
+ sage: s.matrix(e,f)
468
+ [-6 1 -2]
469
+ [ 4 3 2]
470
+ sage: s.matrix(e,f) == phi.matrix(e,f) + psi.matrix(e,f) # check
471
+ True
472
+ sage: s == phi + psi # indirect doctest
473
+ True
474
+
475
+ Other tests::
476
+
477
+ sage: phi._add_(Hom(M,N).zero()) == phi
478
+ True
479
+ """
480
+ # No need for consistency checks since self and other are guaranteed
481
+ # to have the same parents
482
+ bases = self._common_bases(other)
483
+ if bases is None:
484
+ raise ValueError("no common pair of bases has been found to " +
485
+ "add {} and {}".format(self, other))
486
+ # Addition at the matrix level:
487
+ resu_mat = self._matrices[bases] + other._matrices[bases]
488
+ if self._name is not None and other._name is not None:
489
+ resu_name = self._name + '+' + other._name
490
+ else:
491
+ resu_name = None
492
+ if self._latex_name is not None and other._latex_name is not None:
493
+ resu_latex_name = self._latex_name + '+' + other._latex_name
494
+ else:
495
+ resu_latex_name = None
496
+ return self.__class__(self.parent(), resu_mat, bases=bases,
497
+ name=resu_name, latex_name=resu_latex_name)
498
+
499
+ def _sub_(self, other):
500
+ r"""
501
+ Homomorphism subtraction.
502
+
503
+ INPUT:
504
+
505
+ - ``other`` -- a free module morphism (same parent as ``self``)
506
+
507
+ OUTPUT:
508
+
509
+ - the homomorphism resulting from the subtraction of ``other`` from
510
+ ``self``
511
+
512
+ EXAMPLES::
513
+
514
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
515
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
516
+ sage: e = M.basis('e') ; f = N.basis('f')
517
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
518
+ ....: latex_name=r'\phi')
519
+ sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
520
+ sage: s = phi._sub_(psi) ; s
521
+ Generic morphism:
522
+ From: Rank-3 free module M over the Integer Ring
523
+ To: Rank-2 free module N over the Integer Ring
524
+ sage: s.matrix(e,f)
525
+ [-2 1 0]
526
+ [ 1 0 -1]
527
+ sage: s.matrix(e,f) == phi.matrix(e,f) - psi.matrix(e,f) # check
528
+ True
529
+ sage: s == phi - psi # indirect doctest
530
+ True
531
+
532
+ Subtraction of homomorphisms defined on different bases::
533
+
534
+ sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
535
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
536
+ sage: b = N.automorphism() ; b[0,1], b[1,0] = -1, 1
537
+ sage: fp = f.new_basis(b, 'fp', latex_symbol="f'")
538
+ sage: psi = M.hom(N, [[-2,0,-1], [-1,-2, 5]], bases=(ep,fp))
539
+ sage: s = phi._sub_(psi) ; s
540
+ Generic morphism:
541
+ From: Rank-3 free module M over the Integer Ring
542
+ To: Rank-2 free module N over the Integer Ring
543
+ sage: s.matrix(e,f)
544
+ [ 4 3 2]
545
+ [ 6 -1 2]
546
+ sage: s.matrix(e,f) == phi.matrix(e,f) - psi.matrix(e,f) # check
547
+ True
548
+ sage: s == phi - psi # indirect doctest
549
+ True
550
+
551
+ Other tests::
552
+
553
+ sage: phi._sub_(Hom(M,N).zero()) == phi
554
+ True
555
+ sage: Hom(M,N).zero()._sub_(phi) == -phi
556
+ True
557
+ sage: phi._sub_(phi).is_zero()
558
+ True
559
+ """
560
+ # No need for consistency checks since self and other are guaranteed
561
+ # to have the same parents
562
+ bases = self._common_bases(other)
563
+ if bases is None:
564
+ raise ValueError("no common pair of bases has been found to " +
565
+ "subtract {} from {}".format(other, self))
566
+ # Subtraction at the matrix level:
567
+ resu_mat = self._matrices[bases] - other._matrices[bases]
568
+ if self._name is not None and other._name is not None:
569
+ resu_name = self._name + '-' + other._name
570
+ else:
571
+ resu_name = None
572
+ if self._latex_name is not None and other._latex_name is not None:
573
+ resu_latex_name = self._latex_name + '-' + other._latex_name
574
+ else:
575
+ resu_latex_name = None
576
+ return self.__class__(self.parent(), resu_mat, bases=bases,
577
+ name=resu_name, latex_name=resu_latex_name)
578
+
579
+ def _lmul_(self, scalar):
580
+ r"""
581
+ Multiplication by ``scalar``.
582
+
583
+ INPUT:
584
+
585
+ - ``scalar`` -- element of the ring over which the parent of ``self``
586
+ is a module
587
+
588
+ OUTPUT: the homomorphism resulting from the multiplication of ``self``
589
+ by ``scalar``
590
+
591
+ EXAMPLES::
592
+
593
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
594
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
595
+ sage: e = M.basis('e') ; f = N.basis('f')
596
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
597
+ ....: latex_name=r'\phi')
598
+ sage: s = phi._lmul_(7) ; s
599
+ Generic morphism:
600
+ From: Rank-3 free module M over the Integer Ring
601
+ To: Rank-2 free module N over the Integer Ring
602
+ sage: s.matrix(e,f)
603
+ [-7 14 0]
604
+ [35 7 14]
605
+ sage: s == 7 * phi
606
+ True
607
+ """
608
+ resu = self.__class__(self.parent(), 0) # 0 = provisory value
609
+ for bases, mat in self._matrices.items():
610
+ resu._matrices[bases] = scalar * mat
611
+ return resu
612
+
613
+ #
614
+ # Other module methods
615
+ #
616
+
617
+ def __pos__(self):
618
+ r"""
619
+ Unary plus operator.
620
+
621
+ OUTPUT: an exact copy of ``self``
622
+
623
+ EXAMPLES::
624
+
625
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
626
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
627
+ sage: e = M.basis('e') ; f = N.basis('f')
628
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
629
+ ....: latex_name=r'\phi')
630
+ sage: s = phi.__pos__() ; s
631
+ Generic morphism:
632
+ From: Rank-3 free module M over the Integer Ring
633
+ To: Rank-2 free module N over the Integer Ring
634
+ sage: s == +phi
635
+ True
636
+ sage: s == phi
637
+ True
638
+ sage: s is phi
639
+ False
640
+ """
641
+ resu = self.__class__(self.parent(), 0, is_identity=self._is_identity)
642
+ # 0 = provisory value
643
+ for bases, mat in self._matrices.items():
644
+ resu._matrices[bases] = +mat
645
+ if self._name is not None:
646
+ resu._name = '+' + self._name
647
+ if self._latex_name is not None:
648
+ resu._latex_name = '+' + self._latex_name
649
+ return resu
650
+
651
+ def __neg__(self):
652
+ r"""
653
+ Unary minus operator.
654
+
655
+ OUTPUT: the homomorphism `-f`, where `f` is ``self``
656
+
657
+ EXAMPLES::
658
+
659
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
660
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
661
+ sage: e = M.basis('e') ; f = N.basis('f')
662
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
663
+ ....: latex_name=r'\phi')
664
+ sage: s = phi.__neg__() ; s
665
+ Generic morphism:
666
+ From: Rank-3 free module M over the Integer Ring
667
+ To: Rank-2 free module N over the Integer Ring
668
+ sage: s == -phi
669
+ True
670
+ sage: s.matrix()
671
+ [ 1 -2 0]
672
+ [-5 -1 -2]
673
+ sage: s.matrix() == -phi.matrix()
674
+ True
675
+ """
676
+ resu = self.__class__(self.parent(), 0) # 0 = provisory value
677
+ for bases, mat in self._matrices.items():
678
+ resu._matrices[bases] = -mat
679
+ if self._name is not None:
680
+ resu._name = '-' + self._name
681
+ if self._latex_name is not None:
682
+ resu._latex_name = '-' + self._latex_name
683
+ return resu
684
+
685
+ #
686
+ # Map methods
687
+ #
688
+
689
+ def _call_(
690
+ self, element: FiniteRankFreeModuleElement
691
+ ) -> FiniteRankFreeModuleElement:
692
+ r"""
693
+ Action of the homomorphism ``self`` on some free module element
694
+
695
+ INPUT:
696
+
697
+ - ``element`` -- element of the domain of ``self``
698
+
699
+ OUTPUT: the image of ``element`` by ``self``
700
+
701
+ EXAMPLES:
702
+
703
+ Images of a homomorphism between two `\ZZ`-modules::
704
+
705
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
706
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
707
+ sage: e = M.basis('e') ; f = N.basis('f')
708
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi', latex_name=r'\phi')
709
+ sage: v = M([1,2,3], basis=e, name='v')
710
+ sage: w = phi(v) ; w
711
+ Element phi(v) of the Rank-2 free module N over the Integer Ring
712
+ sage: w.display()
713
+ phi(v) = 3 f_0 + 13 f_1
714
+
715
+ TESTS::
716
+
717
+ sage: all(w[i] == sum(phi.matrix()[i,j]*v[j] for j in range(3)) for i in range(2))
718
+ True
719
+ sage: phi.matrix(e,f)
720
+ [-1 2 0]
721
+ [ 5 1 2]
722
+ sage: phi(e[0]).display()
723
+ phi(e_0) = -f_0 + 5 f_1
724
+ sage: phi(e[1]).display()
725
+ phi(e_1) = 2 f_0 + f_1
726
+ sage: phi(e[2]).display()
727
+ phi(e_2) = 2 f_1
728
+
729
+ Image of an element that is not defined on the default basis::
730
+
731
+ sage: a = M.automorphism()
732
+ sage: a[0,2], a[1,0], a[2,1] = 1, -1, -1
733
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
734
+ sage: v = M([1,2,3], basis=ep, name='v')
735
+ sage: w = phi(v) ; w
736
+ Element phi(v) of the Rank-2 free module N over the Integer Ring
737
+ sage: w.display()
738
+ phi(v) = -5 f_0 + 10 f_1
739
+ sage: all(w[i] == sum(phi.matrix(ep,f)[i,j]*v[ep,j] for j in range(3)) for i in range(2))
740
+ True
741
+
742
+ Check of homomorphism properties::
743
+
744
+ sage: phi(M.zero()) == N.zero()
745
+ True
746
+ """
747
+ if self._is_identity:
748
+ return element
749
+ dom = self.parent().domain()
750
+ sindex = dom._sindex
751
+ codom = self.parent().codomain()
752
+ basis_codom = codom.default_basis()
753
+ # Search for a common basis to compute the result
754
+ for basis in element._components:
755
+ try:
756
+ self.matrix(basis, basis_codom)
757
+ basis_dom = basis
758
+ break
759
+ except ValueError:
760
+ continue
761
+ else:
762
+ raise ValueError("no common basis found to evaluate the image " +
763
+ "of {} by {}".format(element,self))
764
+ # Components of the result obtained by matrix multiplication
765
+ mat = self.matrix(basis_dom, basis_codom)
766
+ vcomp = element._components[basis_dom]
767
+ tresu = []
768
+ for i in range(codom.rank()):
769
+ s = 0
770
+ for j in range(dom.rank()):
771
+ s += mat[i,j] * vcomp[[j+sindex]]
772
+ tresu.append(s)
773
+ # Name of the result
774
+ if self._name is not None and element._name is not None:
775
+ resu_name = self._name + '(' + element._name + ')'
776
+ else:
777
+ resu_name = None
778
+ if self._latex_name is not None and element._latex_name is not None:
779
+ resu_latex_name = self._latex_name + r'\left(' + \
780
+ element._latex_name + r'\right)'
781
+ else:
782
+ resu_latex_name = None
783
+ # Creation of the result
784
+ return codom(tresu, basis=basis_codom, name=resu_name,
785
+ latex_name=resu_latex_name)
786
+
787
+ def is_injective(self):
788
+ r"""
789
+ Determine whether ``self`` is injective.
790
+
791
+ OUTPUT:
792
+
793
+ - ``True`` if ``self`` is an injective homomorphism and ``False``
794
+ otherwise
795
+
796
+ EXAMPLES:
797
+
798
+ Homomorphisms between two `\ZZ`-modules::
799
+
800
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
801
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
802
+ sage: e = M.basis('e') ; f = N.basis('f')
803
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
804
+ sage: phi.matrix(e,f)
805
+ [-1 2 0]
806
+ [ 5 1 2]
807
+ sage: phi.is_injective()
808
+ False
809
+
810
+ Indeed, phi has a non trivial kernel::
811
+
812
+ sage: phi(4*e[0] + 2*e[1] - 11*e[2]).display()
813
+ 0
814
+
815
+ An injective homomorphism::
816
+
817
+ sage: psi = N.hom(M, [[1,-1], [0,3], [4,-5]])
818
+ sage: psi.matrix(f,e)
819
+ [ 1 -1]
820
+ [ 0 3]
821
+ [ 4 -5]
822
+ sage: psi.is_injective()
823
+ True
824
+
825
+ Of course, the identity endomorphism is injective::
826
+
827
+ sage: End(M).one().is_injective()
828
+ True
829
+ sage: End(N).one().is_injective()
830
+ True
831
+ """
832
+ # Some matrix representation is picked at random:
833
+ matrix_rep = next(iter(self._matrices.values()))
834
+ return not matrix_rep.right_kernel().rank()
835
+
836
+ def is_surjective(self):
837
+ r"""
838
+ Determine whether ``self`` is surjective.
839
+
840
+ OUTPUT:
841
+
842
+ - ``True`` if ``self`` is a surjective homomorphism and ``False``
843
+ otherwise
844
+
845
+ EXAMPLES:
846
+
847
+ This method has not been implemented yet::
848
+
849
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
850
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
851
+ sage: e = M.basis('e') ; f = N.basis('f')
852
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
853
+ sage: phi.is_surjective()
854
+ Traceback (most recent call last):
855
+ ...
856
+ NotImplementedError: FiniteRankFreeModuleMorphism.is_surjective()
857
+ has not been implemented yet
858
+
859
+ except for the identity endomorphism (!)::
860
+
861
+ sage: End(M).one().is_surjective()
862
+ True
863
+ sage: End(N).one().is_surjective()
864
+ True
865
+ """
866
+ if self._is_identity:
867
+ return True
868
+ raise NotImplementedError(
869
+ "FiniteRankFreeModuleMorphism.is_surjective() " +
870
+ "has not been implemented yet")
871
+ #
872
+ # Morphism methods
873
+ #
874
+
875
+ def is_identity(self):
876
+ r"""
877
+ Check whether ``self`` is the identity morphism.
878
+
879
+ EXAMPLES::
880
+
881
+ sage: M = FiniteRankFreeModule(ZZ, 2, name='M')
882
+ sage: e = M.basis('e')
883
+ sage: phi = M.endomorphism([[1,0], [0,1]])
884
+ sage: phi.is_identity()
885
+ True
886
+ sage: (phi+phi).is_identity()
887
+ False
888
+ sage: End(M).zero().is_identity()
889
+ False
890
+ sage: a = M.automorphism() ; a[0,1], a[1,0] = 1, -1
891
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
892
+ sage: phi = M.endomorphism([[1,0], [0,1]], basis=ep)
893
+ sage: phi.is_identity()
894
+ True
895
+
896
+ Example illustrating that the identity can be constructed from a
897
+ matrix that is not the identity one, provided that it is relative to
898
+ different bases::
899
+
900
+ sage: phi = M.hom(M, [[0,1], [-1,0]], bases=(ep,e))
901
+ sage: phi.is_identity()
902
+ True
903
+
904
+ Of course, if we ask for the matrix in a single basis, it is the
905
+ identity matrix::
906
+
907
+ sage: phi.matrix(e)
908
+ [1 0]
909
+ [0 1]
910
+ sage: phi.matrix(ep)
911
+ [1 0]
912
+ [0 1]
913
+ """
914
+ if self._is_identity:
915
+ return True
916
+ # The identity must be an endomorphism:
917
+ fmodule = self.domain()
918
+ if fmodule != self.codomain():
919
+ return False
920
+ # Some basis in which ``self`` has a representation is picked at
921
+ # random and the test is performed on the images of the basis
922
+ # elements:
923
+ basis = list(self._matrices)[0][0]
924
+ for i in fmodule.irange():
925
+ if self(basis[i]) != basis[i]:
926
+ return False
927
+ self._is_identity = True
928
+ return True
929
+
930
+ #
931
+ # End of Morphism methods
932
+ #
933
+
934
+ def _modules_and_bases(self, basis1=None, basis2=None):
935
+ r"""
936
+ Return domain, codomain, domain basis, and codomain basis.
937
+
938
+ This method implements default argument handling for methods
939
+ :meth:`matrix` and :meth:`display`.
940
+
941
+ INPUT:
942
+
943
+ - ``basis1`` -- (default: ``None``) basis of the domain of ``self``; if
944
+ none is provided, the domain's default basis is assumed
945
+ - ``basis2`` -- (default: ``None``) basis of the codomain of ``self``;
946
+ if none is provided, ``basis2`` is set to ``basis1`` if ``self`` is
947
+ an endomorphism, otherwise, ``basis2`` is set to the codomain's
948
+ default basis.
949
+
950
+ EXAMPLES::
951
+
952
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
953
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
954
+ sage: e = M.basis('e'); f = N.basis('f')
955
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
956
+ sage: phi._modules_and_bases()
957
+ (Rank-3 free module M over the Integer Ring,
958
+ Rank-2 free module N over the Integer Ring,
959
+ Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring,
960
+ Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
961
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
962
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
963
+ sage: phi._modules_and_bases(ep)
964
+ (Rank-3 free module M over the Integer Ring,
965
+ Rank-2 free module N over the Integer Ring,
966
+ Basis (ep_0,ep_1,ep_2) on the Rank-3 free module M over the Integer Ring,
967
+ Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
968
+ """
969
+ fmodule1 = self.domain()
970
+ fmodule2 = self.codomain()
971
+ if basis1 is None:
972
+ basis1 = fmodule1.default_basis()
973
+ elif basis1 not in fmodule1.bases():
974
+ raise TypeError(str(basis1) + " is not a basis on the " +
975
+ str(fmodule1) + ".")
976
+ if basis2 is None:
977
+ if self.is_endomorphism():
978
+ basis2 = basis1
979
+ else:
980
+ basis2 = fmodule2.default_basis()
981
+ elif basis2 not in fmodule2.bases():
982
+ raise TypeError(str(basis2) + " is not a basis on the " +
983
+ str(fmodule2) + ".")
984
+ return fmodule1, fmodule2, basis1, basis2
985
+
986
+ def matrix(self, basis1=None, basis2=None):
987
+ r"""
988
+ Return the matrix of ``self`` w.r.t to a pair of bases.
989
+
990
+ If the matrix is not known already, it is computed from the matrix in
991
+ another pair of bases by means of the change-of-basis formula.
992
+
993
+ INPUT:
994
+
995
+ - ``basis1`` -- (default: ``None``) basis of the domain of ``self``; if
996
+ none is provided, the domain's default basis is assumed
997
+ - ``basis2`` -- (default: ``None``) basis of the codomain of ``self``;
998
+ if none is provided, ``basis2`` is set to ``basis1`` if ``self`` is
999
+ an endomorphism, otherwise, ``basis2`` is set to the codomain's
1000
+ default basis.
1001
+
1002
+ OUTPUT:
1003
+
1004
+ - the matrix representing the homomorphism ``self`` w.r.t
1005
+ to bases ``basis1`` and ``basis2``; more precisely, the columns of
1006
+ this matrix are formed by the components w.r.t. ``basis2`` of
1007
+ the images of the elements of ``basis1``.
1008
+
1009
+ EXAMPLES:
1010
+
1011
+ Matrix of a homomorphism between two `\ZZ`-modules::
1012
+
1013
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1014
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
1015
+ sage: e = M.basis('e') ; f = N.basis('f')
1016
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
1017
+ sage: phi.matrix() # default bases
1018
+ [-1 2 0]
1019
+ [ 5 1 2]
1020
+ sage: phi.matrix(e, f) # given bases
1021
+ [-1 2 0]
1022
+ [ 5 1 2]
1023
+ sage: type(phi.matrix()) # needs sage.libs.flint
1024
+ <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'>
1025
+
1026
+ Matrix in bases different from those in which the homomorphism has
1027
+ been defined::
1028
+
1029
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1030
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1031
+ sage: b = N.automorphism(matrix=[[3,5],[4,7]], basis=f)
1032
+ sage: fp = f.new_basis(b, 'fp', latex_symbol="f'")
1033
+ sage: phi.matrix(ep, fp)
1034
+ [ 32 -1 -12]
1035
+ [-19 1 8]
1036
+
1037
+ Check of the change-of-basis formula::
1038
+
1039
+ sage: phi.matrix(ep, fp) == (b^(-1)).matrix(f) * phi.matrix(e,f) * a.matrix(e)
1040
+ True
1041
+
1042
+ Single change of basis::
1043
+
1044
+ sage: phi.matrix(ep, f)
1045
+ [ 1 2 4]
1046
+ [-5 3 8]
1047
+ sage: phi.matrix(ep,f) == phi.matrix(e,f) * a.matrix(e)
1048
+ True
1049
+ sage: phi.matrix(e, fp)
1050
+ [-32 9 -10]
1051
+ [ 19 -5 6]
1052
+ sage: phi.matrix(e, fp) == (b^(-1)).matrix(f) * phi.matrix(e,f)
1053
+ True
1054
+
1055
+ Matrix of an endomorphism::
1056
+
1057
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1058
+ sage: phi.matrix(ep)
1059
+ [1 2 3]
1060
+ [4 5 6]
1061
+ [7 8 9]
1062
+ sage: phi.matrix(ep,ep) # same as above
1063
+ [1 2 3]
1064
+ [4 5 6]
1065
+ [7 8 9]
1066
+ sage: phi.matrix() # matrix w.r.t to the module's default basis
1067
+ [ 1 -3 1]
1068
+ [-18 39 -18]
1069
+ [-25 54 -25]
1070
+ """
1071
+ from sage.matrix.constructor import matrix
1072
+ fmodule1, fmodule2, basis1, basis2 = self._modules_and_bases(basis1, basis2)
1073
+ if (basis1, basis2) not in self._matrices:
1074
+ if self._is_identity:
1075
+ # The identity endomorphism
1076
+ # -------------------------
1077
+ if basis1 == basis2:
1078
+ # the matrix is the identity matrix:
1079
+ ring = fmodule1.base_ring()
1080
+ zero = ring.zero()
1081
+ one = ring.one()
1082
+ size = fmodule1.rank()
1083
+ mat = []
1084
+ for i in range(size):
1085
+ row = [zero]*size
1086
+ row[i] = one
1087
+ mat.append(row)
1088
+ else:
1089
+ # the matrix is the change-of-basis matrix:
1090
+ change = fmodule1.change_of_basis(basis1, basis2)
1091
+ mat = [[change[[i,j]] for j in fmodule1.irange()]
1092
+ for i in fmodule1.irange()]
1093
+ self._matrices[(basis1, basis2)] = matrix(mat)
1094
+ else:
1095
+ # Generic homomorphism
1096
+ # --------------------
1097
+ b1_list = [bases[0] for bases in self._matrices]
1098
+ b2_list = [bases[1] for bases in self._matrices]
1099
+ if basis1 in b1_list:
1100
+ for b2 in b2_list:
1101
+ if (basis2, b2) in fmodule2._basis_changes:
1102
+ nb2 = b2
1103
+ break
1104
+ else:
1105
+ raise ValueError("no start basis could be found for " +
1106
+ "applying the change-of-basis formula")
1107
+ change2 = fmodule2._basis_changes[(basis2, nb2)]
1108
+ mat2 = matrix( [[change2[[i,j]] for j in fmodule2.irange()]
1109
+ for i in fmodule2.irange()] )
1110
+ self._matrices[(basis1, basis2)] = \
1111
+ mat2 * self._matrices[(basis1,nb2)]
1112
+ elif basis2 in b2_list:
1113
+ for b1 in b1_list:
1114
+ if (b1, basis1) in fmodule1._basis_changes:
1115
+ nb1 = b1
1116
+ break
1117
+ else:
1118
+ raise ValueError("no start basis could be found for " +
1119
+ "applying the change-of-basis formula")
1120
+ change1 = fmodule1._basis_changes[(nb1, basis1)]
1121
+ mat1 = matrix( [[change1[[i,j]] for j in fmodule1.irange()]
1122
+ for i in fmodule1.irange()] )
1123
+ self._matrices[(basis1, basis2)] = \
1124
+ self._matrices[(nb1,basis2)] * mat1
1125
+ else: # most general change-of-basis formula
1126
+ for (b1, b2) in self._matrices:
1127
+ if (b1, basis1) in fmodule1._basis_changes and \
1128
+ (basis2, b2) in fmodule2._basis_changes:
1129
+ nb1, nb2 = b1, b2
1130
+ break
1131
+ else:
1132
+ raise ValueError("no start basis could be found for " +
1133
+ "applying the change-of-basis formula")
1134
+ change1 = fmodule1._basis_changes[(nb1, basis1)]
1135
+ change2 = fmodule2._basis_changes[(basis2, nb2)]
1136
+ mat1 = matrix( [[change1[[i,j]] for j in fmodule1.irange()]
1137
+ for i in fmodule1.irange()] )
1138
+ mat2 = matrix( [[change2[[i,j]] for j in fmodule2.irange()]
1139
+ for i in fmodule2.irange()] )
1140
+ self._matrices[(basis1, basis2)] = \
1141
+ mat2 * self._matrices[(nb1,nb2)] * mat1
1142
+ return self._matrices[(basis1, basis2)]
1143
+
1144
+ def _common_bases(self, other):
1145
+ r"""
1146
+ Return a pair of bases in which ``self`` and ``other`` have a known
1147
+ matrix representation.
1148
+
1149
+ INPUT:
1150
+
1151
+ - ``other`` -- another homomorphism in the same hom-set
1152
+
1153
+ OUTPUT:
1154
+
1155
+ - a pair of bases in which ``self`` and ``other`` have a known
1156
+ matrix representation.
1157
+
1158
+ EXAMPLES::
1159
+
1160
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1161
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
1162
+ sage: e = M.basis('e') ; f = N.basis('f')
1163
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
1164
+ sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
1165
+ sage: phi._common_bases(psi) # matrices of phi and psi both defined on (e,f)
1166
+ (Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring,
1167
+ Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
1168
+ sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
1169
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1170
+ sage: psi = M.hom(N, [[1,1,0], [4,1,3]], bases=(ep,f))
1171
+ sage: phi._common_bases(psi) # matrix of psi w.r.t. (e,f) computed
1172
+ (Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring,
1173
+ Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
1174
+ sage: psi = M.hom(N, [[1,1,0], [4,1,3]], bases=(ep,f))
1175
+ sage: psi._common_bases(phi) # matrix of phi w.r.t. (ep,f) computed
1176
+ (Basis (ep_0,ep_1,ep_2) on the Rank-3 free module M over the Integer Ring,
1177
+ Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
1178
+ """
1179
+ resu = None
1180
+ for bases in self._matrices:
1181
+ try:
1182
+ other.matrix(*bases)
1183
+ resu = bases
1184
+ break
1185
+ except ValueError:
1186
+ continue
1187
+ if resu is None:
1188
+ for bases in other._matrices:
1189
+ try:
1190
+ self.matrix(*bases)
1191
+ resu = bases
1192
+ break
1193
+ except ValueError:
1194
+ continue
1195
+ return resu
1196
+
1197
+ def display(self, basis1=None, basis2=None):
1198
+ r"""
1199
+ Display ``self`` as a matrix w.r.t to a pair of bases.
1200
+
1201
+ If the matrix is not known already, it is computed from the matrix in
1202
+ another pair of bases by means of the change-of-basis formula.
1203
+
1204
+ INPUT:
1205
+
1206
+ - ``basis1`` -- (default: ``None``) basis of the domain of ``self``; if
1207
+ none is provided, the domain's default basis is assumed
1208
+ - ``basis2`` -- (default: ``None``) basis of the codomain of ``self``;
1209
+ if none is provided, ``basis2`` is set to ``basis1`` if ``self`` is
1210
+ an endomorphism, otherwise, ``basis2`` is set to the codomain's
1211
+ default basis.
1212
+
1213
+ EXAMPLES::
1214
+
1215
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1216
+ sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
1217
+ sage: e = M.basis('e'); f = N.basis('f')
1218
+ sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
1219
+ sage: phi.display() # default bases
1220
+ e_0 e_1 e_2
1221
+ f_0⎛ -1 2 0⎞
1222
+ f_1⎝ 5 1 2⎠
1223
+ sage: phi.display(e, f) # given bases
1224
+ e_0 e_1 e_2
1225
+ f_0⎛ -1 2 0⎞
1226
+ f_1⎝ 5 1 2⎠
1227
+
1228
+ Matrix of an endomorphism::
1229
+
1230
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1231
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1232
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1233
+ sage: phi.display(ep)
1234
+ ep_0 ep_1 ep_2
1235
+ ep_0⎛ 1 2 3⎞
1236
+ ep_1⎜ 4 5 6⎟
1237
+ ep_2⎝ 7 8 9⎠
1238
+ sage: phi.display(ep, ep) # same as above
1239
+ ep_0 ep_1 ep_2
1240
+ ep_0⎛ 1 2 3⎞
1241
+ ep_1⎜ 4 5 6⎟
1242
+ ep_2⎝ 7 8 9⎠
1243
+ sage: phi.display() # matrix w.r.t to the module's default basis
1244
+ e_0 e_1 e_2
1245
+ e_0⎛ 1 -3 1⎞
1246
+ e_1⎜-18 39 -18⎟
1247
+ e_2⎝-25 54 -25⎠
1248
+ """
1249
+ from sage.misc.latex import latex
1250
+ from .format_utilities import is_atomic, FormattedExpansion
1251
+ fmodule1, fmodule2, basis1, basis2 = self._modules_and_bases(basis1, basis2)
1252
+ matrix = self.matrix(basis1, basis2)
1253
+ if all(element._name for element in basis1):
1254
+ basis1_names = [element._name for element in basis1]
1255
+ else:
1256
+ basis1_names = None
1257
+ if all(element._name for element in basis2):
1258
+ basis2_names = [element._name for element in basis2]
1259
+ else:
1260
+ basis2_names = None
1261
+ resu_txt = matrix.str(unicode=True,
1262
+ top_border=basis1_names,
1263
+ left_border=basis2_names)
1264
+ resu_latex = latex(matrix)
1265
+ return FormattedExpansion(resu_txt, resu_latex)
1266
+
1267
+
1268
+ class FiniteRankFreeModuleEndomorphism(FiniteRankFreeModuleMorphism):
1269
+ r"""
1270
+ Endomorphism of a free module of finite rank over a commutative ring.
1271
+
1272
+ An instance of this class is an endomorphism
1273
+
1274
+ .. MATH::
1275
+
1276
+ \phi:\ M \longrightarrow M,
1277
+
1278
+ where `M` is a free module of finite rank over a commutative ring `R`.
1279
+
1280
+ This is a Sage *element* class, the corresponding *parent* class being
1281
+ :class:`~sage.tensor.modules.free_module_homset.FreeModuleEndset`.
1282
+
1283
+ INPUT:
1284
+
1285
+ - ``parent`` -- Hom-set Hom(M,M) to which the endomorphism belongs
1286
+ - ``matrix_rep`` -- matrix representation of the endomorphism with
1287
+ respect to the basis ``bases``; this entry can actually
1288
+ be any material from which a matrix of size rank(N)*rank(M) of
1289
+ elements of `R` can be constructed; the *columns* of the matrix give
1290
+ the images of the basis of `M` (see the convention in the example below)
1291
+ - ``bases`` -- (default: ``None``) pair ``(basis_domain, basis_codomain)``
1292
+ defining the matrix representation, ``basis_domain`` and ``basis_codomain``
1293
+ being two bases (typically the same) of the same module `M`; if ``None``,
1294
+ the default basis of `M` is used for both.
1295
+ - ``name`` -- (default: ``None``) string; name given to the endomorphism
1296
+ - ``latex_name`` -- (default: ``None``) string; LaTeX symbol to denote the
1297
+ endomorphism. If ``None``, ``name`` will be used.
1298
+ - ``is_identity`` -- boolean (default: ``False``); determines whether the
1299
+ constructed object is the identity endomorphism. If set to ``True``,
1300
+ then the entry ``matrix_rep`` is not used.
1301
+
1302
+ EXAMPLES:
1303
+
1304
+ The identity endomorphism::
1305
+
1306
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1307
+ sage: e = M.basis('e')
1308
+ sage: Id = End(M).one(); Id
1309
+ Identity endomorphism of Rank-3 free module M over the Integer Ring
1310
+ sage: Id.parent()
1311
+ Set of Morphisms from Rank-3 free module M over the Integer Ring
1312
+ to Rank-3 free module M over the Integer Ring
1313
+ in Category of finite dimensional modules over Integer Ring
1314
+ sage: Id.parent() is End(M)
1315
+ True
1316
+
1317
+ The matrix of ``Id`` with respect to the basis ``e`` is of course the identity
1318
+ matrix::
1319
+
1320
+ sage: Id.matrix(e)
1321
+ [1 0 0]
1322
+ [0 1 0]
1323
+ [0 0 1]
1324
+
1325
+ The identity acting on a module element::
1326
+
1327
+ sage: v = M([-2,1,4], basis=e, name='v'); v.display()
1328
+ v = -2 e_0 + e_1 + 4 e_2
1329
+ sage: Id(v) is v
1330
+ True
1331
+ """
1332
+ def __init__(self, parent, matrix_rep, bases=None, name=None,
1333
+ latex_name=None, is_identity=False):
1334
+ r"""
1335
+ TESTS::
1336
+
1337
+ sage: from sage.tensor.modules.free_module_morphism import FiniteRankFreeModuleEndomorphism
1338
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1339
+ sage: e = M.basis('e')
1340
+
1341
+ Generic endomorphism::
1342
+
1343
+ sage: phi = FiniteRankFreeModuleEndomorphism(End(M),
1344
+ ....: [[1,0,-3], [2,1,4], [7,8,9]],
1345
+ ....: name='phi', latex_name=r'\phi')
1346
+ sage: phi
1347
+ Generic endomorphism of Rank-3 free module M over the Integer Ring
1348
+
1349
+ Identity endomorphism::
1350
+
1351
+ sage: phi = FiniteRankFreeModuleEndomorphism(End(M), 'whatever',
1352
+ ....: is_identity=True)
1353
+ sage: phi
1354
+ Identity endomorphism of Rank-3 free module M over the Integer Ring
1355
+ sage: phi.matrix(e)
1356
+ [1 0 0]
1357
+ [0 1 0]
1358
+ [0 0 1]
1359
+ sage: latex(phi)
1360
+ \mathrm{Id}
1361
+ """
1362
+ from sage.misc.constant_function import ConstantFunction
1363
+
1364
+ fmodule = parent.domain()
1365
+ if bases is None:
1366
+ def_basis = fmodule.default_basis()
1367
+ if def_basis is None:
1368
+ raise ValueError("the {} has no default ".format(fmodule) +
1369
+ "basis")
1370
+ bases = (def_basis, def_basis)
1371
+ else:
1372
+ bases = tuple(bases) # insures bases is a tuple
1373
+ if len(bases) != 2:
1374
+ raise TypeError("the argument bases must contain 2 bases")
1375
+ if bases[0] not in fmodule.bases():
1376
+ raise TypeError("{} is not a basis on the {}".format(bases[0],
1377
+ fmodule))
1378
+ if bases[1] not in fmodule.bases():
1379
+ raise TypeError("{} is not a basis on the {}".format(bases[1],
1380
+ fmodule))
1381
+ if not is_identity:
1382
+ # Construction of a generic endomorphism
1383
+ if isinstance(matrix_rep, ConstantFunction):
1384
+ # the zero morphism
1385
+ if matrix_rep().is_zero():
1386
+ matrix_rep = 0
1387
+ if bases[0] == bases[1] and matrix_rep == 1:
1388
+ is_identity = True
1389
+ if is_identity:
1390
+ # Construction of the identity endomorphism
1391
+ if bases[0] != bases[1]:
1392
+ raise TypeError("the two bases must coincide for " +
1393
+ "constructing the identity endomorphism.")
1394
+ matrix_rep = 1
1395
+ if name is None:
1396
+ name = 'Id'
1397
+ if latex_name is None and name == 'Id':
1398
+ latex_name = r'\mathrm{Id}'
1399
+ FiniteRankFreeModuleMorphism.__init__(self, parent, matrix_rep, bases,
1400
+ name, latex_name)
1401
+ if is_identity:
1402
+ self._is_identity = True
1403
+ self._repr_type_str = 'Identity'
1404
+
1405
+ def _some_matrix(self):
1406
+ r"""
1407
+ Return the matrix of the endomorphism ``self`` w.r.t. some basis.
1408
+
1409
+ EXAMPLES::
1410
+
1411
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1412
+ sage: e = M.basis('e')
1413
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1414
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1415
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1416
+ sage: phi._some_matrix()
1417
+ [1 2 3]
1418
+ [4 5 6]
1419
+ [7 8 9]
1420
+ """
1421
+ for (basis1, basis2), matrix in self._matrices.items():
1422
+ if basis1 == basis2:
1423
+ return matrix
1424
+ for basis in self.domain().bases():
1425
+ try:
1426
+ return self.matrix(basis)
1427
+ except ValueError:
1428
+ pass
1429
+ return self.matrix()
1430
+
1431
+ @lazy_attribute
1432
+ def characteristic_polynomial(self):
1433
+ r"""
1434
+ Return the characteristic polynomial of ``self``.
1435
+
1436
+ :meth:`characteristic_polynomial` and :meth:`charpoly` are the same method.
1437
+
1438
+ INPUT:
1439
+
1440
+ - ``var`` -- string (default: ``'x'``); a variable name
1441
+
1442
+ EXAMPLES::
1443
+
1444
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1445
+ sage: e = M.basis('e')
1446
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1447
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1448
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1449
+ sage: phi.matrix(e)
1450
+ [ 1 -3 1]
1451
+ [-18 39 -18]
1452
+ [-25 54 -25]
1453
+ sage: phi.characteristic_polynomial()
1454
+ x^3 - 15*x^2 - 18*x
1455
+ sage: phi.charpoly()
1456
+ x^3 - 15*x^2 - 18*x
1457
+ sage: phi.charpoly('T')
1458
+ T^3 - 15*T^2 - 18*T
1459
+ """
1460
+ return self._some_matrix().characteristic_polynomial
1461
+
1462
+ charpoly = characteristic_polynomial
1463
+
1464
+ @lazy_attribute
1465
+ def det(self):
1466
+ r"""
1467
+ Return the determinant of ``self``.
1468
+
1469
+ OUTPUT:
1470
+
1471
+ - element of the base ring of the modules on which ``self`` is defined,
1472
+ equal to the determinant of ``self``.
1473
+
1474
+ EXAMPLES::
1475
+
1476
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1477
+ sage: e = M.basis('e')
1478
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1479
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1480
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1481
+ sage: phi.matrix(e)
1482
+ [ 1 -3 1]
1483
+ [-18 39 -18]
1484
+ [-25 54 -25]
1485
+ sage: phi.det()
1486
+ 0
1487
+ sage: det(phi)
1488
+ 0
1489
+ """
1490
+ return self._some_matrix().det
1491
+
1492
+ determinant = det
1493
+
1494
+ @lazy_attribute
1495
+ def fcp(self):
1496
+ r"""
1497
+ Return the factorization of the characteristic polynomial of ``self``.
1498
+
1499
+ INPUT:
1500
+
1501
+ - ``var`` -- string (default: ``'x'``); a variable name
1502
+
1503
+ EXAMPLES::
1504
+
1505
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1506
+ sage: e = M.basis('e')
1507
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1508
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1509
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1510
+ sage: phi.matrix(e)
1511
+ [ 1 -3 1]
1512
+ [-18 39 -18]
1513
+ [-25 54 -25]
1514
+ sage: phi.fcp() # needs sage.libs.pari
1515
+ x * (x^2 - 15*x - 18)
1516
+ sage: phi.fcp('T') # needs sage.libs.pari
1517
+ T * (T^2 - 15*T - 18)
1518
+ """
1519
+ return self._some_matrix().fcp
1520
+
1521
+ @lazy_attribute
1522
+ def minimal_polynomial(self):
1523
+ r"""
1524
+ Return the minimal polynomial of ``self``.
1525
+
1526
+ :meth:`minimal_polynomial` and :meth:`minpoly` are the same method.
1527
+
1528
+ INPUT:
1529
+
1530
+ - ``var`` -- string (default: ``'x'``); a variable name
1531
+
1532
+ EXAMPLES::
1533
+
1534
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1535
+ sage: e = M.basis('e')
1536
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1537
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1538
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1539
+ sage: phi.matrix(e)
1540
+ [ 1 -3 1]
1541
+ [-18 39 -18]
1542
+ [-25 54 -25]
1543
+ sage: phi.minpoly() # needs sage.libs.pari
1544
+ x^3 - 15*x^2 - 18*x
1545
+ sage: phi.minimal_polynomial() # needs sage.libs.pari
1546
+ x^3 - 15*x^2 - 18*x
1547
+ sage: phi.minimal_polynomial('T') # needs sage.libs.pari
1548
+ T^3 - 15*T^2 - 18*T
1549
+ """
1550
+ return self._some_matrix().minimal_polynomial
1551
+
1552
+ minpoly = minimal_polynomial
1553
+
1554
+ @lazy_attribute
1555
+ def trace(self):
1556
+ r"""
1557
+ Return the trace of ``self``.
1558
+
1559
+ OUTPUT:
1560
+
1561
+ - element of the base ring of the modules on which ``self`` is defined,
1562
+ equal to the trace of ``self``.
1563
+
1564
+ EXAMPLES::
1565
+
1566
+ sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
1567
+ sage: e = M.basis('e')
1568
+ sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
1569
+ sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
1570
+ sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
1571
+ sage: phi.matrix(e)
1572
+ [ 1 -3 1]
1573
+ [-18 39 -18]
1574
+ [-25 54 -25]
1575
+ sage: phi.trace()
1576
+ 15
1577
+ sage: id = M.identity_map()
1578
+ sage: id.trace()
1579
+ 3
1580
+ """
1581
+ return self._some_matrix().trace