passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl

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

Potentially problematic release.


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

Files changed (808) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  12. passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  13. sage/algebras/all__sagemath_modules.py +20 -0
  14. sage/algebras/catalog.py +148 -0
  15. sage/algebras/clifford_algebra.py +3107 -0
  16. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  17. sage/algebras/clifford_algebra_element.pxd +16 -0
  18. sage/algebras/clifford_algebra_element.pyx +997 -0
  19. sage/algebras/commutative_dga.py +4252 -0
  20. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
  21. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  22. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  23. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  29. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  30. sage/algebras/finite_gca.py +528 -0
  31. sage/algebras/group_algebra.py +232 -0
  32. sage/algebras/lie_algebras/abelian.py +197 -0
  33. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  34. sage/algebras/lie_algebras/all.py +25 -0
  35. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  36. sage/algebras/lie_algebras/bch.py +177 -0
  37. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  38. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  39. sage/algebras/lie_algebras/center_uea.py +767 -0
  40. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  41. sage/algebras/lie_algebras/examples.py +683 -0
  42. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  43. sage/algebras/lie_algebras/heisenberg.py +820 -0
  44. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  47. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  48. sage/algebras/lie_algebras/morphism.py +661 -0
  49. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  50. sage/algebras/lie_algebras/onsager.py +1324 -0
  51. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  52. sage/algebras/lie_algebras/quotient.py +462 -0
  53. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  54. sage/algebras/lie_algebras/representation.py +1040 -0
  55. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  56. sage/algebras/lie_algebras/subalgebra.py +967 -0
  57. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  58. sage/algebras/lie_algebras/verma_module.py +1630 -0
  59. sage/algebras/lie_algebras/virasoro.py +1186 -0
  60. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
  61. sage/algebras/octonion_algebra.pxd +20 -0
  62. sage/algebras/octonion_algebra.pyx +987 -0
  63. sage/algebras/orlik_solomon.py +907 -0
  64. sage/algebras/orlik_terao.py +779 -0
  65. sage/algebras/steenrod/all.py +7 -0
  66. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  67. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  68. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  69. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  70. sage/algebras/weyl_algebra.py +1126 -0
  71. sage/all__sagemath_modules.py +62 -0
  72. sage/calculus/all__sagemath_modules.py +19 -0
  73. sage/calculus/expr.py +205 -0
  74. sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
  75. sage/calculus/integration.pyx +698 -0
  76. sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
  77. sage/calculus/interpolation.pxd +13 -0
  78. sage/calculus/interpolation.pyx +387 -0
  79. sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
  80. sage/calculus/interpolators.pyx +326 -0
  81. sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/calculus/ode.pxd +5 -0
  83. sage/calculus/ode.pyx +610 -0
  84. sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
  85. sage/calculus/riemann.pyx +1521 -0
  86. sage/calculus/test_sympy.py +201 -0
  87. sage/calculus/transforms/all.py +7 -0
  88. sage/calculus/transforms/dft.py +844 -0
  89. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
  90. sage/calculus/transforms/dwt.pxd +7 -0
  91. sage/calculus/transforms/dwt.pyx +160 -0
  92. sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/calculus/transforms/fft.pxd +12 -0
  94. sage/calculus/transforms/fft.pyx +487 -0
  95. sage/calculus/wester.py +662 -0
  96. sage/coding/abstract_code.py +1108 -0
  97. sage/coding/ag_code.py +868 -0
  98. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
  99. sage/coding/ag_code_decoders.pyx +2639 -0
  100. sage/coding/all.py +15 -0
  101. sage/coding/bch_code.py +494 -0
  102. sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/coding/binary_code.pxd +124 -0
  104. sage/coding/binary_code.pyx +4139 -0
  105. sage/coding/bounds_catalog.py +43 -0
  106. sage/coding/channel.py +819 -0
  107. sage/coding/channels_catalog.py +29 -0
  108. sage/coding/code_bounds.py +755 -0
  109. sage/coding/code_constructions.py +804 -0
  110. sage/coding/codes_catalog.py +111 -0
  111. sage/coding/cyclic_code.py +1329 -0
  112. sage/coding/databases.py +316 -0
  113. sage/coding/decoder.py +373 -0
  114. sage/coding/decoders_catalog.py +88 -0
  115. sage/coding/delsarte_bounds.py +709 -0
  116. sage/coding/encoder.py +390 -0
  117. sage/coding/encoders_catalog.py +64 -0
  118. sage/coding/extended_code.py +468 -0
  119. sage/coding/gabidulin_code.py +1058 -0
  120. sage/coding/golay_code.py +404 -0
  121. sage/coding/goppa_code.py +441 -0
  122. sage/coding/grs_code.py +2371 -0
  123. sage/coding/guava.py +107 -0
  124. sage/coding/guruswami_sudan/all.py +1 -0
  125. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  126. sage/coding/guruswami_sudan/interpolation.py +409 -0
  127. sage/coding/guruswami_sudan/utils.py +176 -0
  128. sage/coding/hamming_code.py +176 -0
  129. sage/coding/information_set_decoder.py +1032 -0
  130. sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
  131. sage/coding/kasami_codes.pyx +351 -0
  132. sage/coding/linear_code.py +3067 -0
  133. sage/coding/linear_code_no_metric.py +1354 -0
  134. sage/coding/linear_rank_metric.py +961 -0
  135. sage/coding/parity_check_code.py +353 -0
  136. sage/coding/punctured_code.py +719 -0
  137. sage/coding/reed_muller_code.py +999 -0
  138. sage/coding/self_dual_codes.py +942 -0
  139. sage/coding/source_coding/all.py +2 -0
  140. sage/coding/source_coding/huffman.py +553 -0
  141. sage/coding/subfield_subcode.py +423 -0
  142. sage/coding/two_weight_db.py +399 -0
  143. sage/combinat/all__sagemath_modules.py +7 -0
  144. sage/combinat/cartesian_product.py +347 -0
  145. sage/combinat/family.py +11 -0
  146. sage/combinat/free_module.py +1977 -0
  147. sage/combinat/root_system/all.py +147 -0
  148. sage/combinat/root_system/ambient_space.py +527 -0
  149. sage/combinat/root_system/associahedron.py +471 -0
  150. sage/combinat/root_system/braid_move_calculator.py +143 -0
  151. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
  152. sage/combinat/root_system/braid_orbit.pyx +144 -0
  153. sage/combinat/root_system/branching_rules.py +2301 -0
  154. sage/combinat/root_system/cartan_matrix.py +1245 -0
  155. sage/combinat/root_system/cartan_type.py +3069 -0
  156. sage/combinat/root_system/coxeter_group.py +162 -0
  157. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  158. sage/combinat/root_system/coxeter_type.py +681 -0
  159. sage/combinat/root_system/dynkin_diagram.py +900 -0
  160. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  161. sage/combinat/root_system/fundamental_group.py +795 -0
  162. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  163. sage/combinat/root_system/integrable_representations.py +1227 -0
  164. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  165. sage/combinat/root_system/pieri_factors.py +1147 -0
  166. sage/combinat/root_system/plot.py +1615 -0
  167. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  168. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  169. sage/combinat/root_system/root_space.py +487 -0
  170. sage/combinat/root_system/root_system.py +882 -0
  171. sage/combinat/root_system/type_A.py +348 -0
  172. sage/combinat/root_system/type_A_affine.py +227 -0
  173. sage/combinat/root_system/type_A_infinity.py +241 -0
  174. sage/combinat/root_system/type_B.py +347 -0
  175. sage/combinat/root_system/type_BC_affine.py +287 -0
  176. sage/combinat/root_system/type_B_affine.py +216 -0
  177. sage/combinat/root_system/type_C.py +317 -0
  178. sage/combinat/root_system/type_C_affine.py +188 -0
  179. sage/combinat/root_system/type_D.py +357 -0
  180. sage/combinat/root_system/type_D_affine.py +208 -0
  181. sage/combinat/root_system/type_E.py +641 -0
  182. sage/combinat/root_system/type_E_affine.py +231 -0
  183. sage/combinat/root_system/type_F.py +387 -0
  184. sage/combinat/root_system/type_F_affine.py +137 -0
  185. sage/combinat/root_system/type_G.py +293 -0
  186. sage/combinat/root_system/type_G_affine.py +132 -0
  187. sage/combinat/root_system/type_H.py +105 -0
  188. sage/combinat/root_system/type_I.py +110 -0
  189. sage/combinat/root_system/type_Q.py +150 -0
  190. sage/combinat/root_system/type_affine.py +509 -0
  191. sage/combinat/root_system/type_dual.py +704 -0
  192. sage/combinat/root_system/type_folded.py +301 -0
  193. sage/combinat/root_system/type_marked.py +748 -0
  194. sage/combinat/root_system/type_reducible.py +601 -0
  195. sage/combinat/root_system/type_relabel.py +730 -0
  196. sage/combinat/root_system/type_super_A.py +837 -0
  197. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  198. sage/combinat/root_system/weight_space.py +639 -0
  199. sage/combinat/root_system/weyl_characters.py +2238 -0
  200. sage/crypto/__init__.py +4 -0
  201. sage/crypto/all.py +28 -0
  202. sage/crypto/block_cipher/all.py +7 -0
  203. sage/crypto/block_cipher/des.py +1065 -0
  204. sage/crypto/block_cipher/miniaes.py +2171 -0
  205. sage/crypto/block_cipher/present.py +909 -0
  206. sage/crypto/block_cipher/sdes.py +1527 -0
  207. sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
  208. sage/crypto/boolean_function.pxd +10 -0
  209. sage/crypto/boolean_function.pyx +1487 -0
  210. sage/crypto/cipher.py +78 -0
  211. sage/crypto/classical.py +3668 -0
  212. sage/crypto/classical_cipher.py +569 -0
  213. sage/crypto/cryptosystem.py +387 -0
  214. sage/crypto/key_exchange/all.py +7 -0
  215. sage/crypto/key_exchange/catalog.py +24 -0
  216. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  217. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  218. sage/crypto/lattice.py +312 -0
  219. sage/crypto/lfsr.py +295 -0
  220. sage/crypto/lwe.py +840 -0
  221. sage/crypto/mq/__init__.py +4 -0
  222. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  223. sage/crypto/mq/rijndael_gf.py +2345 -0
  224. sage/crypto/mq/sbox.py +7 -0
  225. sage/crypto/mq/sr.py +3344 -0
  226. sage/crypto/public_key/all.py +5 -0
  227. sage/crypto/public_key/blum_goldwasser.py +776 -0
  228. sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
  229. sage/crypto/sbox.pyx +2090 -0
  230. sage/crypto/sboxes.py +2090 -0
  231. sage/crypto/stream.py +390 -0
  232. sage/crypto/stream_cipher.py +297 -0
  233. sage/crypto/util.py +519 -0
  234. sage/ext/all__sagemath_modules.py +1 -0
  235. sage/ext/interpreters/__init__.py +1 -0
  236. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  237. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
  238. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  239. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  240. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
  241. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  242. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  243. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  245. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  246. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
  247. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  248. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  249. sage/geometry/all__sagemath_modules.py +5 -0
  250. sage/geometry/toric_lattice.py +1745 -0
  251. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
  252. sage/geometry/toric_lattice_element.pyx +432 -0
  253. sage/groups/abelian_gps/abelian_group.py +1925 -0
  254. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  255. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  256. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  257. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  258. sage/groups/abelian_gps/element_base.py +341 -0
  259. sage/groups/abelian_gps/values.py +488 -0
  260. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  261. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  262. sage/groups/additive_abelian/all.py +4 -0
  263. sage/groups/additive_abelian/qmodnz.py +231 -0
  264. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  265. sage/groups/affine_gps/affine_group.py +535 -0
  266. sage/groups/affine_gps/all.py +1 -0
  267. sage/groups/affine_gps/catalog.py +17 -0
  268. sage/groups/affine_gps/euclidean_group.py +246 -0
  269. sage/groups/affine_gps/group_element.py +562 -0
  270. sage/groups/all__sagemath_modules.py +12 -0
  271. sage/groups/galois_group.py +479 -0
  272. sage/groups/matrix_gps/all.py +4 -0
  273. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  274. sage/groups/matrix_gps/catalog.py +26 -0
  275. sage/groups/matrix_gps/coxeter_group.py +927 -0
  276. sage/groups/matrix_gps/finitely_generated.py +487 -0
  277. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
  278. sage/groups/matrix_gps/group_element.pxd +11 -0
  279. sage/groups/matrix_gps/group_element.pyx +431 -0
  280. sage/groups/matrix_gps/linear.py +440 -0
  281. sage/groups/matrix_gps/matrix_group.py +617 -0
  282. sage/groups/matrix_gps/named_group.py +296 -0
  283. sage/groups/matrix_gps/orthogonal.py +544 -0
  284. sage/groups/matrix_gps/symplectic.py +251 -0
  285. sage/groups/matrix_gps/unitary.py +436 -0
  286. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  287. sage/groups/misc_gps/argument_groups.py +1905 -0
  288. sage/groups/misc_gps/imaginary_groups.py +479 -0
  289. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  293. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  296. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  297. sage/homology/algebraic_topological_model.py +595 -0
  298. sage/homology/all.py +2 -0
  299. sage/homology/all__sagemath_modules.py +8 -0
  300. sage/homology/chain_complex.py +2148 -0
  301. sage/homology/chain_complex_homspace.py +165 -0
  302. sage/homology/chain_complex_morphism.py +629 -0
  303. sage/homology/chain_homotopy.py +604 -0
  304. sage/homology/chains.py +653 -0
  305. sage/homology/free_resolution.py +923 -0
  306. sage/homology/graded_resolution.py +567 -0
  307. sage/homology/hochschild_complex.py +756 -0
  308. sage/homology/homology_group.py +188 -0
  309. sage/homology/homology_morphism.py +422 -0
  310. sage/homology/homology_vector_space_with_basis.py +1454 -0
  311. sage/homology/koszul_complex.py +169 -0
  312. sage/homology/matrix_utils.py +205 -0
  313. sage/libs/all__sagemath_modules.py +1 -0
  314. sage/libs/gsl/__init__.py +1 -0
  315. sage/libs/gsl/airy.pxd +56 -0
  316. sage/libs/gsl/all.pxd +66 -0
  317. sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
  318. sage/libs/gsl/array.pxd +5 -0
  319. sage/libs/gsl/array.pyx +102 -0
  320. sage/libs/gsl/bessel.pxd +208 -0
  321. sage/libs/gsl/blas.pxd +116 -0
  322. sage/libs/gsl/blas_types.pxd +34 -0
  323. sage/libs/gsl/block.pxd +52 -0
  324. sage/libs/gsl/chebyshev.pxd +37 -0
  325. sage/libs/gsl/clausen.pxd +12 -0
  326. sage/libs/gsl/combination.pxd +47 -0
  327. sage/libs/gsl/complex.pxd +151 -0
  328. sage/libs/gsl/coulomb.pxd +30 -0
  329. sage/libs/gsl/coupling.pxd +21 -0
  330. sage/libs/gsl/dawson.pxd +12 -0
  331. sage/libs/gsl/debye.pxd +24 -0
  332. sage/libs/gsl/dilog.pxd +14 -0
  333. sage/libs/gsl/eigen.pxd +46 -0
  334. sage/libs/gsl/elementary.pxd +12 -0
  335. sage/libs/gsl/ellint.pxd +48 -0
  336. sage/libs/gsl/elljac.pxd +8 -0
  337. sage/libs/gsl/erf.pxd +32 -0
  338. sage/libs/gsl/errno.pxd +26 -0
  339. sage/libs/gsl/exp.pxd +44 -0
  340. sage/libs/gsl/expint.pxd +44 -0
  341. sage/libs/gsl/fermi_dirac.pxd +44 -0
  342. sage/libs/gsl/fft.pxd +121 -0
  343. sage/libs/gsl/fit.pxd +50 -0
  344. sage/libs/gsl/gamma.pxd +94 -0
  345. sage/libs/gsl/gegenbauer.pxd +26 -0
  346. sage/libs/gsl/histogram.pxd +176 -0
  347. sage/libs/gsl/hyperg.pxd +52 -0
  348. sage/libs/gsl/integration.pxd +69 -0
  349. sage/libs/gsl/interp.pxd +109 -0
  350. sage/libs/gsl/laguerre.pxd +24 -0
  351. sage/libs/gsl/lambert.pxd +16 -0
  352. sage/libs/gsl/legendre.pxd +90 -0
  353. sage/libs/gsl/linalg.pxd +185 -0
  354. sage/libs/gsl/log.pxd +26 -0
  355. sage/libs/gsl/math.pxd +43 -0
  356. sage/libs/gsl/matrix.pxd +143 -0
  357. sage/libs/gsl/matrix_complex.pxd +130 -0
  358. sage/libs/gsl/min.pxd +67 -0
  359. sage/libs/gsl/monte.pxd +56 -0
  360. sage/libs/gsl/ntuple.pxd +32 -0
  361. sage/libs/gsl/odeiv.pxd +70 -0
  362. sage/libs/gsl/permutation.pxd +78 -0
  363. sage/libs/gsl/poly.pxd +40 -0
  364. sage/libs/gsl/pow_int.pxd +12 -0
  365. sage/libs/gsl/psi.pxd +28 -0
  366. sage/libs/gsl/qrng.pxd +29 -0
  367. sage/libs/gsl/random.pxd +257 -0
  368. sage/libs/gsl/rng.pxd +100 -0
  369. sage/libs/gsl/roots.pxd +72 -0
  370. sage/libs/gsl/sort.pxd +36 -0
  371. sage/libs/gsl/statistics.pxd +59 -0
  372. sage/libs/gsl/sum.pxd +55 -0
  373. sage/libs/gsl/synchrotron.pxd +16 -0
  374. sage/libs/gsl/transport.pxd +24 -0
  375. sage/libs/gsl/trig.pxd +58 -0
  376. sage/libs/gsl/types.pxd +137 -0
  377. sage/libs/gsl/vector.pxd +101 -0
  378. sage/libs/gsl/vector_complex.pxd +83 -0
  379. sage/libs/gsl/wavelet.pxd +49 -0
  380. sage/libs/gsl/zeta.pxd +28 -0
  381. sage/libs/mpc/__init__.pxd +114 -0
  382. sage/libs/mpc/types.pxd +28 -0
  383. sage/libs/mpfr/__init__.pxd +299 -0
  384. sage/libs/mpfr/types.pxd +26 -0
  385. sage/libs/mpmath/__init__.py +1 -0
  386. sage/libs/mpmath/all.py +27 -0
  387. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  388. sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
  389. sage/libs/mpmath/utils.pxd +4 -0
  390. sage/libs/mpmath/utils.pyx +319 -0
  391. sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
  392. sage/matrix/action.pxd +26 -0
  393. sage/matrix/action.pyx +596 -0
  394. sage/matrix/all.py +9 -0
  395. sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
  396. sage/matrix/args.pxd +144 -0
  397. sage/matrix/args.pyx +1668 -0
  398. sage/matrix/benchmark.py +1258 -0
  399. sage/matrix/berlekamp_massey.py +95 -0
  400. sage/matrix/compute_J_ideal.py +926 -0
  401. sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
  402. sage/matrix/constructor.pyx +750 -0
  403. sage/matrix/docs.py +430 -0
  404. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  405. sage/matrix/echelon_matrix.pyx +155 -0
  406. sage/matrix/matrix.pxd +2 -0
  407. sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
  408. sage/matrix/matrix0.pxd +68 -0
  409. sage/matrix/matrix0.pyx +6324 -0
  410. sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
  411. sage/matrix/matrix1.pxd +8 -0
  412. sage/matrix/matrix1.pyx +2851 -0
  413. sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
  414. sage/matrix/matrix2.pxd +25 -0
  415. sage/matrix/matrix2.pyx +20181 -0
  416. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
  417. sage/matrix/matrix_cdv.pxd +4 -0
  418. sage/matrix/matrix_cdv.pyx +93 -0
  419. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  420. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  421. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  422. sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
  423. sage/matrix/matrix_dense.pxd +5 -0
  424. sage/matrix/matrix_dense.pyx +343 -0
  425. sage/matrix/matrix_domain_dense.pxd +5 -0
  426. sage/matrix/matrix_domain_sparse.pxd +5 -0
  427. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  428. sage/matrix/matrix_double_dense.pxd +7 -0
  429. sage/matrix/matrix_double_dense.pyx +3906 -0
  430. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  431. sage/matrix/matrix_double_sparse.pxd +6 -0
  432. sage/matrix/matrix_double_sparse.pyx +248 -0
  433. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
  434. sage/matrix/matrix_generic_dense.pxd +7 -0
  435. sage/matrix/matrix_generic_dense.pyx +354 -0
  436. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  437. sage/matrix/matrix_generic_sparse.pxd +7 -0
  438. sage/matrix/matrix_generic_sparse.pyx +461 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  441. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  442. sage/matrix/matrix_misc.py +313 -0
  443. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  444. sage/matrix/matrix_numpy_dense.pxd +14 -0
  445. sage/matrix/matrix_numpy_dense.pyx +450 -0
  446. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  447. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  448. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  449. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  450. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  451. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  452. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  453. sage/matrix/matrix_real_double_dense.pxd +7 -0
  454. sage/matrix/matrix_real_double_dense.pyx +122 -0
  455. sage/matrix/matrix_space.py +2848 -0
  456. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  457. sage/matrix/matrix_sparse.pxd +5 -0
  458. sage/matrix/matrix_sparse.pyx +1222 -0
  459. sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
  460. sage/matrix/matrix_window.pxd +37 -0
  461. sage/matrix/matrix_window.pyx +242 -0
  462. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  463. sage/matrix/misc_mpfr.pyx +80 -0
  464. sage/matrix/operation_table.py +1182 -0
  465. sage/matrix/special.py +3666 -0
  466. sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
  467. sage/matrix/strassen.pyx +851 -0
  468. sage/matrix/symplectic_basis.py +541 -0
  469. sage/matrix/template.pxd +6 -0
  470. sage/matrix/tests.py +71 -0
  471. sage/matroids/advanced.py +77 -0
  472. sage/matroids/all.py +13 -0
  473. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  474. sage/matroids/basis_exchange_matroid.pxd +96 -0
  475. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  476. sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  477. sage/matroids/basis_matroid.pxd +45 -0
  478. sage/matroids/basis_matroid.pyx +1217 -0
  479. sage/matroids/catalog.py +44 -0
  480. sage/matroids/chow_ring.py +473 -0
  481. sage/matroids/chow_ring_ideal.py +849 -0
  482. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  483. sage/matroids/circuit_closures_matroid.pxd +16 -0
  484. sage/matroids/circuit_closures_matroid.pyx +559 -0
  485. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  486. sage/matroids/circuits_matroid.pxd +38 -0
  487. sage/matroids/circuits_matroid.pyx +947 -0
  488. sage/matroids/constructor.py +1086 -0
  489. sage/matroids/database_collections.py +365 -0
  490. sage/matroids/database_matroids.py +5338 -0
  491. sage/matroids/dual_matroid.py +583 -0
  492. sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
  493. sage/matroids/extension.pxd +34 -0
  494. sage/matroids/extension.pyx +519 -0
  495. sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  496. sage/matroids/flats_matroid.pxd +28 -0
  497. sage/matroids/flats_matroid.pyx +715 -0
  498. sage/matroids/gammoid.py +600 -0
  499. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  500. sage/matroids/graphic_matroid.pxd +39 -0
  501. sage/matroids/graphic_matroid.pyx +2024 -0
  502. sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  503. sage/matroids/lean_matrix.pxd +126 -0
  504. sage/matroids/lean_matrix.pyx +3667 -0
  505. sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  506. sage/matroids/linear_matroid.pxd +180 -0
  507. sage/matroids/linear_matroid.pyx +6649 -0
  508. sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
  509. sage/matroids/matroid.pxd +243 -0
  510. sage/matroids/matroid.pyx +8759 -0
  511. sage/matroids/matroids_catalog.py +190 -0
  512. sage/matroids/matroids_plot_helpers.py +890 -0
  513. sage/matroids/minor_matroid.py +480 -0
  514. sage/matroids/minorfix.h +9 -0
  515. sage/matroids/named_matroids.py +5 -0
  516. sage/matroids/rank_matroid.py +268 -0
  517. sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
  518. sage/matroids/set_system.pxd +38 -0
  519. sage/matroids/set_system.pyx +800 -0
  520. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  521. sage/matroids/transversal_matroid.pxd +14 -0
  522. sage/matroids/transversal_matroid.pyx +893 -0
  523. sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  524. sage/matroids/union_matroid.pxd +20 -0
  525. sage/matroids/union_matroid.pyx +331 -0
  526. sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
  527. sage/matroids/unpickling.pyx +843 -0
  528. sage/matroids/utilities.py +809 -0
  529. sage/misc/all__sagemath_modules.py +20 -0
  530. sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
  531. sage/misc/c3.pyx +238 -0
  532. sage/misc/compat.py +87 -0
  533. sage/misc/element_with_label.py +173 -0
  534. sage/misc/func_persist.py +79 -0
  535. sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
  536. sage/misc/pickle_old.pyx +19 -0
  537. sage/misc/proof.py +7 -0
  538. sage/misc/replace_dot_all.py +472 -0
  539. sage/misc/sagedoc_conf.py +168 -0
  540. sage/misc/sphinxify.py +167 -0
  541. sage/misc/test_class_pickling.py +85 -0
  542. sage/modules/all.py +42 -0
  543. sage/modules/complex_double_vector.py +25 -0
  544. sage/modules/diamond_cutting.py +380 -0
  545. sage/modules/fg_pid/all.py +1 -0
  546. sage/modules/fg_pid/fgp_element.py +456 -0
  547. sage/modules/fg_pid/fgp_module.py +2091 -0
  548. sage/modules/fg_pid/fgp_morphism.py +550 -0
  549. sage/modules/filtered_vector_space.py +1271 -0
  550. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
  551. sage/modules/finite_submodule_iter.pxd +27 -0
  552. sage/modules/finite_submodule_iter.pyx +452 -0
  553. sage/modules/fp_graded/all.py +1 -0
  554. sage/modules/fp_graded/element.py +346 -0
  555. sage/modules/fp_graded/free_element.py +298 -0
  556. sage/modules/fp_graded/free_homspace.py +53 -0
  557. sage/modules/fp_graded/free_module.py +1060 -0
  558. sage/modules/fp_graded/free_morphism.py +217 -0
  559. sage/modules/fp_graded/homspace.py +563 -0
  560. sage/modules/fp_graded/module.py +1340 -0
  561. sage/modules/fp_graded/morphism.py +1990 -0
  562. sage/modules/fp_graded/steenrod/all.py +1 -0
  563. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  564. sage/modules/fp_graded/steenrod/module.py +477 -0
  565. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  566. sage/modules/fp_graded/steenrod/profile.py +241 -0
  567. sage/modules/free_module.py +8447 -0
  568. sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
  569. sage/modules/free_module_element.pxd +22 -0
  570. sage/modules/free_module_element.pyx +5445 -0
  571. sage/modules/free_module_homspace.py +369 -0
  572. sage/modules/free_module_integer.py +896 -0
  573. sage/modules/free_module_morphism.py +823 -0
  574. sage/modules/free_module_pseudohomspace.py +352 -0
  575. sage/modules/free_module_pseudomorphism.py +578 -0
  576. sage/modules/free_quadratic_module.py +1706 -0
  577. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  578. sage/modules/matrix_morphism.py +1745 -0
  579. sage/modules/misc.py +103 -0
  580. sage/modules/module_functors.py +192 -0
  581. sage/modules/multi_filtered_vector_space.py +719 -0
  582. sage/modules/ore_module.py +2208 -0
  583. sage/modules/ore_module_element.py +178 -0
  584. sage/modules/ore_module_homspace.py +147 -0
  585. sage/modules/ore_module_morphism.py +968 -0
  586. sage/modules/quotient_module.py +699 -0
  587. sage/modules/real_double_vector.py +22 -0
  588. sage/modules/submodule.py +255 -0
  589. sage/modules/tensor_operations.py +567 -0
  590. sage/modules/torsion_quadratic_module.py +1352 -0
  591. sage/modules/tutorial_free_modules.py +248 -0
  592. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  593. sage/modules/vector_complex_double_dense.pxd +6 -0
  594. sage/modules/vector_complex_double_dense.pyx +117 -0
  595. sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  596. sage/modules/vector_double_dense.pxd +6 -0
  597. sage/modules/vector_double_dense.pyx +604 -0
  598. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  599. sage/modules/vector_integer_dense.pxd +15 -0
  600. sage/modules/vector_integer_dense.pyx +361 -0
  601. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  602. sage/modules/vector_integer_sparse.pxd +29 -0
  603. sage/modules/vector_integer_sparse.pyx +406 -0
  604. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
  605. sage/modules/vector_modn_dense.pxd +12 -0
  606. sage/modules/vector_modn_dense.pyx +394 -0
  607. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  608. sage/modules/vector_modn_sparse.pxd +21 -0
  609. sage/modules/vector_modn_sparse.pyx +298 -0
  610. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  611. sage/modules/vector_numpy_dense.pxd +15 -0
  612. sage/modules/vector_numpy_dense.pyx +304 -0
  613. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  614. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  615. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  616. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
  617. sage/modules/vector_rational_dense.pxd +15 -0
  618. sage/modules/vector_rational_dense.pyx +387 -0
  619. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  620. sage/modules/vector_rational_sparse.pxd +30 -0
  621. sage/modules/vector_rational_sparse.pyx +413 -0
  622. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  623. sage/modules/vector_real_double_dense.pxd +6 -0
  624. sage/modules/vector_real_double_dense.pyx +126 -0
  625. sage/modules/vector_space_homspace.py +430 -0
  626. sage/modules/vector_space_morphism.py +989 -0
  627. sage/modules/with_basis/all.py +15 -0
  628. sage/modules/with_basis/cell_module.py +494 -0
  629. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
  630. sage/modules/with_basis/indexed_element.pxd +13 -0
  631. sage/modules/with_basis/indexed_element.pyx +1058 -0
  632. sage/modules/with_basis/invariant.py +1075 -0
  633. sage/modules/with_basis/morphism.py +1636 -0
  634. sage/modules/with_basis/representation.py +2939 -0
  635. sage/modules/with_basis/subquotient.py +685 -0
  636. sage/numerical/all__sagemath_modules.py +6 -0
  637. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
  638. sage/numerical/gauss_legendre.pyx +381 -0
  639. sage/numerical/optimize.py +910 -0
  640. sage/probability/all.py +10 -0
  641. sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
  642. sage/probability/probability_distribution.pyx +1242 -0
  643. sage/probability/random_variable.py +411 -0
  644. sage/quadratic_forms/all.py +4 -0
  645. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  646. sage/quadratic_forms/binary_qf.py +2042 -0
  647. sage/quadratic_forms/bqf_class_group.py +748 -0
  648. sage/quadratic_forms/constructions.py +93 -0
  649. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
  650. sage/quadratic_forms/count_local_2.pyx +365 -0
  651. sage/quadratic_forms/extras.py +195 -0
  652. sage/quadratic_forms/quadratic_form.py +1753 -0
  653. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  654. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
  656. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  657. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  658. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  659. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  660. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  661. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  662. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  663. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  664. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  665. sage/quadratic_forms/random_quadraticform.py +209 -0
  666. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
  667. sage/quadratic_forms/ternary.pyx +1154 -0
  668. sage/quadratic_forms/ternary_qf.py +2027 -0
  669. sage/rings/all__sagemath_modules.py +28 -0
  670. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  671. sage/rings/asymptotic/misc.py +1252 -0
  672. sage/rings/cc.py +4 -0
  673. sage/rings/cfinite_sequence.py +1306 -0
  674. sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  675. sage/rings/complex_conversion.pxd +8 -0
  676. sage/rings/complex_conversion.pyx +23 -0
  677. sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
  678. sage/rings/complex_double.pxd +21 -0
  679. sage/rings/complex_double.pyx +2654 -0
  680. sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
  681. sage/rings/complex_mpc.pxd +21 -0
  682. sage/rings/complex_mpc.pyx +2576 -0
  683. sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  684. sage/rings/complex_mpfr.pxd +18 -0
  685. sage/rings/complex_mpfr.pyx +3602 -0
  686. sage/rings/derivation.py +2334 -0
  687. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  688. sage/rings/finite_rings/maps_finite_field.py +191 -0
  689. sage/rings/function_field/all__sagemath_modules.py +8 -0
  690. sage/rings/function_field/derivations.py +102 -0
  691. sage/rings/function_field/derivations_rational.py +132 -0
  692. sage/rings/function_field/differential.py +853 -0
  693. sage/rings/function_field/divisor.py +1107 -0
  694. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  695. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  696. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  697. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  698. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  699. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  700. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  701. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  702. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  703. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
  704. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  705. sage/rings/invariants/all.py +4 -0
  706. sage/rings/invariants/invariant_theory.py +4597 -0
  707. sage/rings/invariants/reconstruction.py +395 -0
  708. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  709. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  712. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  713. sage/rings/polynomial/ore_function_element.py +952 -0
  714. sage/rings/polynomial/ore_function_field.py +1028 -0
  715. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  716. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  717. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  718. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
  720. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  721. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  722. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  723. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  724. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  727. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  730. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  731. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  732. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
  733. sage/rings/real_double_element_gsl.pxd +8 -0
  734. sage/rings/real_double_element_gsl.pyx +794 -0
  735. sage/rings/real_field.py +58 -0
  736. sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  737. sage/rings/real_mpfr.pxd +29 -0
  738. sage/rings/real_mpfr.pyx +6122 -0
  739. sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
  740. sage/rings/ring_extension.pxd +42 -0
  741. sage/rings/ring_extension.pyx +2779 -0
  742. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  743. sage/rings/ring_extension_conversion.pxd +16 -0
  744. sage/rings/ring_extension_conversion.pyx +462 -0
  745. sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
  746. sage/rings/ring_extension_element.pxd +21 -0
  747. sage/rings/ring_extension_element.pyx +1635 -0
  748. sage/rings/ring_extension_homset.py +64 -0
  749. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
  750. sage/rings/ring_extension_morphism.pxd +35 -0
  751. sage/rings/ring_extension_morphism.pyx +920 -0
  752. sage/schemes/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/all__sagemath_modules.py +1 -0
  754. sage/schemes/projective/coherent_sheaf.py +300 -0
  755. sage/schemes/projective/cohomology.py +510 -0
  756. sage/stats/all.py +15 -0
  757. sage/stats/basic_stats.py +489 -0
  758. sage/stats/distributions/all.py +7 -0
  759. sage/stats/distributions/catalog.py +34 -0
  760. sage/stats/distributions/dgs.h +50 -0
  761. sage/stats/distributions/dgs.pxd +111 -0
  762. sage/stats/distributions/dgs_bern.h +400 -0
  763. sage/stats/distributions/dgs_gauss.h +614 -0
  764. sage/stats/distributions/dgs_misc.h +104 -0
  765. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  767. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  768. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  769. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  770. sage/stats/hmm/all.py +15 -0
  771. sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
  772. sage/stats/hmm/chmm.pyx +1595 -0
  773. sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
  774. sage/stats/hmm/distributions.pxd +29 -0
  775. sage/stats/hmm/distributions.pyx +531 -0
  776. sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
  777. sage/stats/hmm/hmm.pxd +17 -0
  778. sage/stats/hmm/hmm.pyx +1388 -0
  779. sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
  780. sage/stats/hmm/util.pxd +7 -0
  781. sage/stats/hmm/util.pyx +165 -0
  782. sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
  783. sage/stats/intlist.pxd +14 -0
  784. sage/stats/intlist.pyx +588 -0
  785. sage/stats/r.py +49 -0
  786. sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
  787. sage/stats/time_series.pxd +6 -0
  788. sage/stats/time_series.pyx +2546 -0
  789. sage/tensor/all.py +2 -0
  790. sage/tensor/modules/all.py +8 -0
  791. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  792. sage/tensor/modules/comp.py +5598 -0
  793. sage/tensor/modules/ext_pow_free_module.py +824 -0
  794. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  795. sage/tensor/modules/format_utilities.py +333 -0
  796. sage/tensor/modules/free_module_alt_form.py +858 -0
  797. sage/tensor/modules/free_module_automorphism.py +1207 -0
  798. sage/tensor/modules/free_module_basis.py +1074 -0
  799. sage/tensor/modules/free_module_element.py +284 -0
  800. sage/tensor/modules/free_module_homset.py +652 -0
  801. sage/tensor/modules/free_module_linear_group.py +564 -0
  802. sage/tensor/modules/free_module_morphism.py +1581 -0
  803. sage/tensor/modules/free_module_tensor.py +3289 -0
  804. sage/tensor/modules/reflexive_module.py +386 -0
  805. sage/tensor/modules/tensor_free_module.py +780 -0
  806. sage/tensor/modules/tensor_free_submodule.py +538 -0
  807. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  808. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1245 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ """
3
+ Cartan matrices
4
+
5
+ AUTHORS:
6
+
7
+ - Travis Scrimshaw (2012-04-22): Nicolas M. Thiery moved matrix creation to
8
+ :class:`CartanType` to prepare :func:`cartan_matrix()` for deprecation.
9
+ - Christian Stump, Travis Scrimshaw (2013-04-13): Created :class:`CartanMatrix`.
10
+ - Ben Salisbury (2018-08-07): Added Borcherds-Cartan matrices.
11
+ """
12
+ # ****************************************************************************
13
+ # Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
14
+ # Copyright (C) 2012,2013 Travis Scrimshaw <tscrim at ucdavis.edu>,
15
+ # Copyright (C) 2013 Christian Stump,
16
+ # Copyright (C) 2018 Ben Salisbury <salis1bt at cmich.edu>,
17
+ #
18
+ # Distributed under the terms of the GNU General Public License (GPL)
19
+ #
20
+ # This code is distributed in the hope that it will be useful,
21
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23
+ # General Public License for more details.
24
+ #
25
+ # The full text of the GPL is available at:
26
+ #
27
+ # https://www.gnu.org/licenses/
28
+ # ****************************************************************************
29
+
30
+ from sage.misc.cachefunc import cached_method
31
+ from sage.matrix.constructor import matrix
32
+ from sage.misc.lazy_import import lazy_import
33
+ from sage.structure.element import Matrix
34
+ from sage.matrix.matrix_space import MatrixSpace
35
+ from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
36
+ from sage.misc.classcall_metaclass import typecall
37
+ from sage.combinat.subset import powerset
38
+ from sage.rings.integer_ring import ZZ
39
+ from sage.combinat.root_system.cartan_type import CartanType, CartanType_abstract
40
+ from sage.combinat.root_system.root_system import RootSystem
41
+ from sage.sets.family import Family
42
+
43
+ lazy_import('sage.graphs.digraph', 'DiGraph')
44
+ lazy_import('sage.combinat.root_system.dynkin_diagram', 'DynkinDiagram_class')
45
+
46
+
47
+ try:
48
+ from sage.matrix.matrix_integer_sparse import Matrix_integer_sparse as Base
49
+ except ImportError:
50
+ from sage.matrix.matrix_generic_sparse import Matrix_generic_sparse as Base
51
+
52
+
53
+ class CartanMatrix(Base, CartanType_abstract,
54
+ metaclass=InheritComparisonClasscallMetaclass):
55
+ r"""
56
+ A (generalized) Cartan matrix.
57
+
58
+ A matrix `A = (a_{ij})_{i,j \in I}` for some index set `I` is a
59
+ generalized Cartan matrix if it satisfies the following properties:
60
+
61
+ - `a_{ii} = 2` for all `i`,
62
+ - `a_{ij} \leq 0` for all `i \neq j`,
63
+ - `a_{ij} = 0` if and only if `a_{ji} = 0` for all `i \neq j`.
64
+
65
+ Additionally some reference assume that a Cartan matrix is
66
+ *symmetrizable* (see :meth:`is_symmetrizable`). However following Kac, we
67
+ do not make that assumption here.
68
+
69
+ An even, integral Borcherds--Cartan matrix is an integral matrix
70
+ `A = (a_{ij})_{i,j \in I}` for some countable index set `I` which satisfies
71
+ the following properties:
72
+
73
+ - `a_{ii} \in \{2\} \cup 2\ZZ_{<0}` for all `i`,
74
+ - `a_{ij} \leq 0` for all `i \neq j`,
75
+ - `a_{ij} = 0` if and only if `a_{ji} = 0` for all `i \neq j`.
76
+
77
+ INPUT:
78
+
79
+ Can be anything which is accepted by ``CartanType`` or a matrix.
80
+
81
+ If given a matrix, one can also use the keyword ``cartan_type`` when giving
82
+ a matrix to explicitly state the type. Otherwise this will try to check the
83
+ input matrix against possible standard types of Cartan matrices. To disable
84
+ this check, use the keyword ``cartan_type_check = False``.
85
+
86
+ If one wants to initialize a Borcherds-Cartan matrix using matrix data,
87
+ use the keyword ``borcherds=True``. To specify the diagonal entries of
88
+ corresponding to a Cartan type (a Cartan matrix is treated as matrix data),
89
+ use ``borcherds`` with a list of the diagonal entries.
90
+
91
+ EXAMPLES::
92
+
93
+ sage: # needs sage.graphs
94
+ sage: CartanMatrix(['A', 4])
95
+ [ 2 -1 0 0]
96
+ [-1 2 -1 0]
97
+ [ 0 -1 2 -1]
98
+ [ 0 0 -1 2]
99
+ sage: CartanMatrix(['B', 6])
100
+ [ 2 -1 0 0 0 0]
101
+ [-1 2 -1 0 0 0]
102
+ [ 0 -1 2 -1 0 0]
103
+ [ 0 0 -1 2 -1 0]
104
+ [ 0 0 0 -1 2 -1]
105
+ [ 0 0 0 0 -2 2]
106
+ sage: CartanMatrix(['C', 4])
107
+ [ 2 -1 0 0]
108
+ [-1 2 -1 0]
109
+ [ 0 -1 2 -2]
110
+ [ 0 0 -1 2]
111
+ sage: CartanMatrix(['D', 6])
112
+ [ 2 -1 0 0 0 0]
113
+ [-1 2 -1 0 0 0]
114
+ [ 0 -1 2 -1 0 0]
115
+ [ 0 0 -1 2 -1 -1]
116
+ [ 0 0 0 -1 2 0]
117
+ [ 0 0 0 -1 0 2]
118
+ sage: CartanMatrix(['E',6])
119
+ [ 2 0 -1 0 0 0]
120
+ [ 0 2 0 -1 0 0]
121
+ [-1 0 2 -1 0 0]
122
+ [ 0 -1 -1 2 -1 0]
123
+ [ 0 0 0 -1 2 -1]
124
+ [ 0 0 0 0 -1 2]
125
+ sage: CartanMatrix(['E',7])
126
+ [ 2 0 -1 0 0 0 0]
127
+ [ 0 2 0 -1 0 0 0]
128
+ [-1 0 2 -1 0 0 0]
129
+ [ 0 -1 -1 2 -1 0 0]
130
+ [ 0 0 0 -1 2 -1 0]
131
+ [ 0 0 0 0 -1 2 -1]
132
+ [ 0 0 0 0 0 -1 2]
133
+ sage: CartanMatrix(['E', 8])
134
+ [ 2 0 -1 0 0 0 0 0]
135
+ [ 0 2 0 -1 0 0 0 0]
136
+ [-1 0 2 -1 0 0 0 0]
137
+ [ 0 -1 -1 2 -1 0 0 0]
138
+ [ 0 0 0 -1 2 -1 0 0]
139
+ [ 0 0 0 0 -1 2 -1 0]
140
+ [ 0 0 0 0 0 -1 2 -1]
141
+ [ 0 0 0 0 0 0 -1 2]
142
+ sage: CartanMatrix(['F', 4])
143
+ [ 2 -1 0 0]
144
+ [-1 2 -1 0]
145
+ [ 0 -2 2 -1]
146
+ [ 0 0 -1 2]
147
+
148
+ This is different from MuPAD-Combinat, due to different node
149
+ convention?
150
+
151
+ ::
152
+
153
+ sage: # needs sage.graphs
154
+ sage: CartanMatrix(['G', 2])
155
+ [ 2 -3]
156
+ [-1 2]
157
+ sage: CartanMatrix(['A',1,1])
158
+ [ 2 -2]
159
+ [-2 2]
160
+ sage: CartanMatrix(['A', 3, 1])
161
+ [ 2 -1 0 -1]
162
+ [-1 2 -1 0]
163
+ [ 0 -1 2 -1]
164
+ [-1 0 -1 2]
165
+ sage: CartanMatrix(['B', 3, 1])
166
+ [ 2 0 -1 0]
167
+ [ 0 2 -1 0]
168
+ [-1 -1 2 -1]
169
+ [ 0 0 -2 2]
170
+ sage: CartanMatrix(['C', 3, 1])
171
+ [ 2 -1 0 0]
172
+ [-2 2 -1 0]
173
+ [ 0 -1 2 -2]
174
+ [ 0 0 -1 2]
175
+ sage: CartanMatrix(['D', 4, 1])
176
+ [ 2 0 -1 0 0]
177
+ [ 0 2 -1 0 0]
178
+ [-1 -1 2 -1 -1]
179
+ [ 0 0 -1 2 0]
180
+ [ 0 0 -1 0 2]
181
+ sage: CartanMatrix(['E', 6, 1])
182
+ [ 2 0 -1 0 0 0 0]
183
+ [ 0 2 0 -1 0 0 0]
184
+ [-1 0 2 0 -1 0 0]
185
+ [ 0 -1 0 2 -1 0 0]
186
+ [ 0 0 -1 -1 2 -1 0]
187
+ [ 0 0 0 0 -1 2 -1]
188
+ [ 0 0 0 0 0 -1 2]
189
+ sage: CartanMatrix(['E', 7, 1])
190
+ [ 2 -1 0 0 0 0 0 0]
191
+ [-1 2 0 -1 0 0 0 0]
192
+ [ 0 0 2 0 -1 0 0 0]
193
+ [ 0 -1 0 2 -1 0 0 0]
194
+ [ 0 0 -1 -1 2 -1 0 0]
195
+ [ 0 0 0 0 -1 2 -1 0]
196
+ [ 0 0 0 0 0 -1 2 -1]
197
+ [ 0 0 0 0 0 0 -1 2]
198
+ sage: CartanMatrix(['E', 8, 1])
199
+ [ 2 0 0 0 0 0 0 0 -1]
200
+ [ 0 2 0 -1 0 0 0 0 0]
201
+ [ 0 0 2 0 -1 0 0 0 0]
202
+ [ 0 -1 0 2 -1 0 0 0 0]
203
+ [ 0 0 -1 -1 2 -1 0 0 0]
204
+ [ 0 0 0 0 -1 2 -1 0 0]
205
+ [ 0 0 0 0 0 -1 2 -1 0]
206
+ [ 0 0 0 0 0 0 -1 2 -1]
207
+ [-1 0 0 0 0 0 0 -1 2]
208
+ sage: CartanMatrix(['F', 4, 1])
209
+ [ 2 -1 0 0 0]
210
+ [-1 2 -1 0 0]
211
+ [ 0 -1 2 -1 0]
212
+ [ 0 0 -2 2 -1]
213
+ [ 0 0 0 -1 2]
214
+ sage: CartanMatrix(['G', 2, 1])
215
+ [ 2 0 -1]
216
+ [ 0 2 -3]
217
+ [-1 -1 2]
218
+
219
+ Examples of Borcherds-Cartan matrices::
220
+
221
+ sage: CartanMatrix([[2,-1],[-1,-2]], borcherds=True) # needs sage.graphs
222
+ [ 2 -1]
223
+ [-1 -2]
224
+ sage: CartanMatrix('B3', borcherds=[-4,-6,2]) # needs sage.graphs
225
+ [-4 -1 0]
226
+ [-1 -6 -1]
227
+ [ 0 -2 2]
228
+
229
+ .. NOTE::
230
+
231
+ Since this is a matrix, :meth:`row()` and :meth:`column()` will return
232
+ the standard row and column respectively. To get the row with the
233
+ indices as in Dynkin diagrams/Cartan types, use
234
+ :meth:`row_with_indices()` and :meth:`column_with_indices()`
235
+ respectively.
236
+ """
237
+ @staticmethod
238
+ def __classcall_private__(cls, data=None, index_set=None,
239
+ cartan_type=None, cartan_type_check=True,
240
+ borcherds=None):
241
+ """
242
+ Normalize input so we can inherit from sparse integer matrix.
243
+
244
+ .. NOTE::
245
+
246
+ To disable the Cartan type check, use the optional argument
247
+ ``cartan_type_check = False``.
248
+
249
+ EXAMPLES::
250
+
251
+ sage: # needs sage.graphs
252
+ sage: C = CartanMatrix(['A',1,1])
253
+ sage: C2 = CartanMatrix([[2, -2], [-2, 2]])
254
+ sage: C3 = CartanMatrix(matrix([[2, -2], [-2, 2]]), [0, 1])
255
+ sage: C == C2 and C == C3
256
+ True
257
+
258
+ TESTS:
259
+
260
+ Check that :issue:`15740` is fixed::
261
+
262
+ sage: # needs sage.graphs
263
+ sage: d = DynkinDiagram()
264
+ sage: d.add_edge('a', 'b', 2)
265
+ sage: d.index_set()
266
+ ('a', 'b')
267
+ sage: cm = CartanMatrix(d)
268
+ sage: cm.index_set()
269
+ ('a', 'b')
270
+ """
271
+ # Special case with 0 args and kwds has Cartan type
272
+ if cartan_type is not None and data is None:
273
+ data = CartanType(cartan_type)
274
+
275
+ if data is None:
276
+ data = []
277
+ n = 0
278
+ index_set = tuple()
279
+ cartan_type = None
280
+ subdivisions = None
281
+ elif isinstance(data, CartanMatrix):
282
+ if index_set is not None:
283
+ d = {a: index_set[i] for i,a in enumerate(data.index_set())}
284
+ return data.relabel(d)
285
+ return data
286
+ else:
287
+ dynkin_diagram = None
288
+ subdivisions = None
289
+
290
+ if isinstance(data, DynkinDiagram_class):
291
+ dynkin_diagram = data
292
+ cartan_type = data._cartan_type
293
+ else:
294
+ try:
295
+ cartan_type = CartanType(data)
296
+ dynkin_diagram = cartan_type.dynkin_diagram()
297
+ except (TypeError, ValueError):
298
+ pass
299
+
300
+ if dynkin_diagram is not None:
301
+ n = dynkin_diagram.rank()
302
+ index_set = dynkin_diagram.index_set()
303
+ oir = dynkin_diagram.odd_isotropic_roots()
304
+ reverse = {a: i for i,a in enumerate(index_set)}
305
+ if isinstance(borcherds, (list, tuple)):
306
+ if (len(borcherds) != len(index_set)
307
+ and not all(val in ZZ
308
+ and (val == 2 or (val % 2 == 0 and val < 0))
309
+ for val in borcherds)):
310
+ raise ValueError("the input data is not a Borcherds-Cartan matrix")
311
+ data = {(i, i): val if index_set[i] not in oir else 0
312
+ for i,val in enumerate(borcherds)}
313
+ else:
314
+ data = {(i, i): 2 if index_set[i] not in oir else 0
315
+ for i in range(n)}
316
+ for (i,j,l) in dynkin_diagram.edge_iterator():
317
+ data[(reverse[j], reverse[i])] = -l
318
+ else:
319
+ M = matrix(data)
320
+ if borcherds:
321
+ if not is_borcherds_cartan_matrix(M):
322
+ raise ValueError("the input matrix is not a Borcherds-Cartan matrix")
323
+ else:
324
+ if not is_generalized_cartan_matrix(M):
325
+ raise ValueError("the input matrix is not a generalized Cartan matrix")
326
+ n = M.ncols()
327
+ data = M.dict()
328
+ subdivisions = M._subdivisions
329
+
330
+ if index_set is None:
331
+ index_set = tuple(range(n))
332
+ else:
333
+ index_set = tuple(index_set)
334
+
335
+ if len(index_set) != n and len(set(index_set)) != n:
336
+ raise ValueError("the given index set is not valid")
337
+
338
+ # We can do the Cartan type initialization later as this is not
339
+ # a unique representation
340
+ mat = typecall(cls, MatrixSpace(ZZ, n, sparse=True), data, False, True)
341
+ # FIXME: We have to initialize the CartanMatrix part separately because
342
+ # of the __cinit__ of the matrix. We should get rid of this workaround
343
+ mat._CM_init(cartan_type, index_set, cartan_type_check)
344
+ mat._subdivisions = subdivisions
345
+ return mat
346
+
347
+ def matrix_space(self, nrows=None, ncols=None, sparse=None):
348
+ r"""
349
+ Return a matrix space over the integers.
350
+
351
+ INPUT:
352
+
353
+ - ``nrows`` -- number of rows
354
+
355
+ - ``ncols`` -- number of columns
356
+
357
+ - ``sparse`` -- boolean
358
+
359
+ EXAMPLES::
360
+
361
+ sage: # needs sage.graphs
362
+ sage: cm = CartanMatrix(['A', 3])
363
+ sage: cm.matrix_space()
364
+ Full MatrixSpace of 3 by 3 sparse matrices over Integer Ring
365
+ sage: cm.matrix_space(2, 2)
366
+ Full MatrixSpace of 2 by 2 sparse matrices over Integer Ring
367
+ sage: cm[:2,1:] # indirect doctest
368
+ [-1 0]
369
+ [ 2 -1]
370
+ """
371
+ if nrows is None:
372
+ nrows = self.nrows()
373
+ if ncols is None:
374
+ ncols = self.ncols()
375
+ if sparse is None:
376
+ sparse = True
377
+
378
+ if nrows == self.nrows() and ncols == self.ncols() and sparse:
379
+ return self.parent()
380
+ else:
381
+ from sage.matrix.matrix_space import MatrixSpace
382
+ return MatrixSpace(ZZ, nrows, ncols, sparse is None or bool(sparse))
383
+
384
+ def _CM_init(self, cartan_type, index_set, cartan_type_check):
385
+ """
386
+ Initialize ``self`` as a Cartan matrix.
387
+
388
+ TESTS::
389
+
390
+ sage: C = CartanMatrix(['A',1,1]) # indirect doctest # needs sage.graphs
391
+ sage: TestSuite(C).run(skip=["_test_category", "_test_change_ring"]) # needs sage.graphs sage.libs.pari
392
+
393
+ Check that :issue:`37979` is fixed::
394
+
395
+ sage: C = CartanMatrix([[2]], index_set=(4,))
396
+ sage: C.index_set()
397
+ (4,)
398
+ sage: CartanType("A3").subtype((2,)) is CartanType("A1").relabel({1:2}) # needs sage.graphs
399
+ True
400
+ """
401
+ self._index_set = index_set
402
+ self.set_immutable()
403
+
404
+ if cartan_type is not None:
405
+ cartan_type = CartanType(cartan_type)
406
+ elif self.nrows() == 1:
407
+ cartan_type = CartanType(['A', 1])
408
+ if index_set != (1,):
409
+ cartan_type = cartan_type.relabel({1: index_set[0]})
410
+ elif cartan_type_check:
411
+ # Placeholder so we don't have to reimplement creating a
412
+ # Dynkin diagram from a Cartan matrix
413
+ self._cartan_type = None
414
+ cartan_type = find_cartan_type_from_matrix(self)
415
+
416
+ self._cartan_type = cartan_type
417
+
418
+ def __reduce__(self):
419
+ """
420
+ Used for pickling.
421
+
422
+ TESTS::
423
+
424
+ sage: CM = CartanMatrix(['A',4]) # needs sage.graphs
425
+ sage: x = loads(dumps(CM)) # needs sage.graphs
426
+ sage: x._index_set # needs sage.graphs
427
+ (1, 2, 3, 4)
428
+ """
429
+ if self._cartan_type:
430
+ return (CartanMatrix, (self._cartan_type,))
431
+ return (CartanMatrix, (self.dynkin_diagram(),))
432
+
433
+ def root_system(self):
434
+ """
435
+ Return the root system corresponding to ``self``.
436
+
437
+ EXAMPLES::
438
+
439
+ sage: C = CartanMatrix(['A',3]) # needs sage.graphs
440
+ sage: C.root_system() # needs sage.graphs
441
+ Root system of type ['A', 3]
442
+ """
443
+ if self._cartan_type is not None:
444
+ return RootSystem(self._cartan_type)
445
+ return self.dynkin_diagram().root_system()
446
+
447
+ def root_space(self):
448
+ """
449
+ Return the root space corresponding to ``self``.
450
+
451
+ EXAMPLES::
452
+
453
+ sage: C = CartanMatrix(['A',3]) # needs sage.graphs
454
+ sage: C.root_space() # needs sage.graphs
455
+ Root space over the Rational Field of the Root system of type ['A', 3]
456
+ """
457
+ return self.root_system().root_space()
458
+
459
+ def reflection_group(self, type='matrix'):
460
+ """
461
+ Return the reflection group corresponding to ``self``.
462
+
463
+ EXAMPLES::
464
+
465
+ sage: C = CartanMatrix(['A',3]) # needs sage.graphs
466
+ sage: C.reflection_group() # needs sage.graphs sage.libs.gap
467
+ Weyl Group of type ['A', 3] (as a matrix group acting on the root space)
468
+ """
469
+ RS = self.root_space()
470
+
471
+ if type == "matrix":
472
+ return RS.weyl_group()
473
+
474
+ if type == "permutation":
475
+ if not self.is_finite():
476
+ raise ValueError("only works for finite types")
477
+ Phi = RS.roots()
478
+ gens = {}
479
+ from sage.groups.perm_gps.permgroup_named import SymmetricGroup
480
+ S = SymmetricGroup(len(Phi))
481
+ for i in self.index_set():
482
+ pi = S([ Phi.index( beta.simple_reflection(i) ) + 1 for beta in Phi ])
483
+ gens[i] = pi
484
+ return S.subgroup( gens[i] for i in gens )
485
+
486
+ raise ValueError("the reflection group is only available as a matrix group or as a permutation group")
487
+
488
+ def symmetrizer(self):
489
+ """
490
+ Return the symmetrizer of ``self``.
491
+
492
+ EXAMPLES::
493
+
494
+ sage: cm = CartanMatrix([[2,-5],[-2,2]]) # needs sage.graphs
495
+ sage: cm.symmetrizer() # needs sage.graphs
496
+ Finite family {0: 2, 1: 5}
497
+
498
+ TESTS:
499
+
500
+ Check that the symmetrizer computed from the Cartan matrix agrees
501
+ with the values given by the Cartan type::
502
+
503
+ sage: ct = CartanType(['B',4,1])
504
+ sage: ct.symmetrizer() # needs sage.graphs
505
+ Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
506
+ sage: ct.cartan_matrix().symmetrizer() # needs sage.graphs
507
+ Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
508
+ """
509
+ sym = self.is_symmetrizable(True)
510
+ if not sym:
511
+ raise ValueError("the Cartan matrix is not symmetrizable")
512
+ iset = self.index_set()
513
+ # The result from is_symmetrizable needs to be scaled
514
+ # to integer coefficients
515
+ from sage.arith.functions import lcm as LCM
516
+ from sage.rings.rational_field import QQ
517
+ scalar = LCM([QQ(x).denominator() for x in sym])
518
+ return Family( {iset[i]: ZZ(val*scalar) for i, val in enumerate(sym)} )
519
+
520
+ @cached_method
521
+ def symmetrized_matrix(self):
522
+ """
523
+ Return the symmetrized matrix of ``self`` if symmetrizable.
524
+
525
+ EXAMPLES::
526
+
527
+ sage: cm = CartanMatrix(['B',4,1]) # needs sage.graphs
528
+ sage: cm.symmetrized_matrix() # needs sage.graphs
529
+ [ 4 0 -2 0 0]
530
+ [ 0 4 -2 0 0]
531
+ [-2 -2 4 -2 0]
532
+ [ 0 0 -2 4 -2]
533
+ [ 0 0 0 -2 2]
534
+ """
535
+ M = matrix.diagonal(list(self.symmetrizer())) * self
536
+ M.set_immutable()
537
+ return M
538
+
539
+ ##########################################################################
540
+ # Cartan type methods
541
+
542
+ def index_set(self):
543
+ """
544
+ Return the index set of ``self``.
545
+
546
+ EXAMPLES::
547
+
548
+ sage: # needs sage.graphs
549
+ sage: C = CartanMatrix(['A',1,1])
550
+ sage: C.index_set()
551
+ (0, 1)
552
+ sage: C = CartanMatrix(['E',6])
553
+ sage: C.index_set()
554
+ (1, 2, 3, 4, 5, 6)
555
+ """
556
+ return self._index_set
557
+
558
+ def cartan_type(self):
559
+ """
560
+ Return the Cartan type of ``self`` or ``self`` if unknown.
561
+
562
+ EXAMPLES::
563
+
564
+ sage: C = CartanMatrix(['A',4,1]) # needs sage.graphs
565
+ sage: C.cartan_type() # needs sage.graphs
566
+ ['A', 4, 1]
567
+
568
+ If the Cartan type is unknown::
569
+
570
+ sage: C = CartanMatrix([[2,-1,-2], [-1,2,-1], [-2,-1,2]]) # needs sage.graphs
571
+ sage: C.cartan_type() # needs sage.graphs
572
+ [ 2 -1 -2]
573
+ [-1 2 -1]
574
+ [-2 -1 2]
575
+ """
576
+ if self._cartan_type is None:
577
+ return self
578
+ if is_borcherds_cartan_matrix(self) and not is_generalized_cartan_matrix(self):
579
+ return self
580
+ return self._cartan_type
581
+
582
+ def subtype(self, index_set):
583
+ """
584
+ Return a subtype of ``self`` given by ``index_set``.
585
+
586
+ A subtype can be considered the Dynkin diagram induced from
587
+ the Dynkin diagram of ``self`` by ``index_set``.
588
+
589
+ EXAMPLES::
590
+
591
+ sage: # needs sage.graphs
592
+ sage: C = CartanMatrix(['F',4])
593
+ sage: S = C.subtype([1,2,3])
594
+ sage: S
595
+ [ 2 -1 0]
596
+ [-1 2 -1]
597
+ [ 0 -2 2]
598
+ sage: S.index_set()
599
+ (1, 2, 3)
600
+ """
601
+ ind = self.index_set()
602
+ I = [ind.index(i) for i in index_set]
603
+ return CartanMatrix(self.matrix_from_rows_and_columns(I, I), index_set=index_set)
604
+
605
+ def rank(self):
606
+ r"""
607
+ Return the rank of ``self``.
608
+
609
+ EXAMPLES::
610
+
611
+ sage: CartanMatrix(['C',3]).rank() # needs sage.graphs
612
+ 3
613
+ sage: CartanMatrix(["A2","B2","F4"]).rank() # needs sage.graphs
614
+ 8
615
+ """
616
+ return self.ncols()
617
+
618
+ def relabel(self, relabelling):
619
+ """
620
+ Return the relabelled Cartan matrix.
621
+
622
+ EXAMPLES::
623
+
624
+ sage: # needs sage.graphs
625
+ sage: CM = CartanMatrix(['C',3])
626
+ sage: R = CM.relabel({1:0, 2:4, 3:1}); R
627
+ [ 2 0 -1]
628
+ [ 0 2 -1]
629
+ [-1 -2 2]
630
+ sage: R.index_set()
631
+ (0, 1, 4)
632
+ sage: CM
633
+ [ 2 -1 0]
634
+ [-1 2 -2]
635
+ [ 0 -1 2]
636
+ """
637
+ return self.dynkin_diagram().relabel(relabelling, inplace=False).cartan_matrix()
638
+
639
+ @cached_method
640
+ def dynkin_diagram(self):
641
+ """
642
+ Return the Dynkin diagram corresponding to ``self``.
643
+
644
+ EXAMPLES::
645
+
646
+ sage: # needs sage.graphs
647
+ sage: C = CartanMatrix(['A',2])
648
+ sage: C.dynkin_diagram()
649
+ O---O
650
+ 1 2
651
+ A2
652
+ sage: C = CartanMatrix(['F',4,1])
653
+ sage: C.dynkin_diagram()
654
+ O---O---O=>=O---O
655
+ 0 1 2 3 4
656
+ F4~
657
+ sage: C = CartanMatrix([[2,-4],[-4,2]])
658
+ sage: C.dynkin_diagram()
659
+ Dynkin diagram of rank 2
660
+ """
661
+ from sage.combinat.root_system.dynkin_diagram import DynkinDiagram
662
+ if self._cartan_type is not None:
663
+ return DynkinDiagram(self._cartan_type)
664
+ return DynkinDiagram(self)
665
+
666
+ def cartan_matrix(self):
667
+ r"""
668
+ Return the Cartan matrix of ``self``.
669
+
670
+ EXAMPLES::
671
+
672
+ sage: CartanMatrix(['C',3]).cartan_matrix() # needs sage.graphs
673
+ [ 2 -1 0]
674
+ [-1 2 -2]
675
+ [ 0 -1 2]
676
+ """
677
+ return self
678
+
679
+ def dual(self):
680
+ r"""
681
+ Return the dual Cartan matrix of ``self``, which is obtained by taking
682
+ the transpose.
683
+
684
+ EXAMPLES::
685
+
686
+ sage: # needs sage.graphs
687
+ sage: ct = CartanType(['C',3])
688
+ sage: M = CartanMatrix(ct); M
689
+ [ 2 -1 0]
690
+ [-1 2 -2]
691
+ [ 0 -1 2]
692
+ sage: M.dual()
693
+ [ 2 -1 0]
694
+ [-1 2 -1]
695
+ [ 0 -2 2]
696
+ sage: M.dual() == CartanMatrix(ct.dual())
697
+ True
698
+ sage: M.dual().cartan_type() == ct.dual()
699
+ True
700
+
701
+ An example with arbitrary Cartan matrices::
702
+
703
+ sage: # needs sage.graphs
704
+ sage: cm = CartanMatrix([[2,-5], [-2, 2]]); cm
705
+ [ 2 -5]
706
+ [-2 2]
707
+ sage: cm.dual()
708
+ [ 2 -2]
709
+ [-5 2]
710
+ sage: cm.dual() == CartanMatrix(cm.transpose())
711
+ True
712
+ sage: cm.dual().dual() == cm
713
+ True
714
+ """
715
+ if self._cartan_type is not None:
716
+ return CartanMatrix(self._cartan_type.dual())
717
+ return CartanMatrix(self.transpose())
718
+
719
+ def is_simply_laced(self):
720
+ """
721
+ Implement :meth:`CartanType_abstract.is_simply_laced()`.
722
+
723
+ A Cartan matrix is simply-laced if all non diagonal entries are `0`
724
+ or `-1`.
725
+
726
+ EXAMPLES::
727
+
728
+ sage: cm = CartanMatrix([[2, -1, -1, -1], [-1, 2, -1, -1], # needs sage.graphs
729
+ ....: [-1, -1, 2, -1], [-1, -1, -1, 2]])
730
+ sage: cm.is_simply_laced() # needs sage.graphs
731
+ True
732
+ """
733
+ for i in range(self.nrows()):
734
+ for j in range(i+1, self.ncols()):
735
+ if self[i, j] < -1 or self[j, i] < -1:
736
+ return False
737
+ return True
738
+
739
+ def is_crystallographic(self):
740
+ """
741
+ Implement :meth:`CartanType_abstract.is_crystallographic`.
742
+
743
+ A Cartan matrix is crystallographic if it is symmetrizable.
744
+
745
+ EXAMPLES::
746
+
747
+ sage: CartanMatrix(['F',4]).is_crystallographic() # needs sage.graphs
748
+ True
749
+ """
750
+ return self.is_symmetrizable()
751
+
752
+ def column_with_indices(self, j):
753
+ """
754
+ Return the `j`-th column `(a_{i,j})_i` of ``self`` as a container
755
+ (or iterator) of tuples `(i, a_{i,j})`
756
+
757
+ EXAMPLES::
758
+
759
+ sage: M = CartanMatrix(['B',4]) # needs sage.graphs
760
+ sage: [ (i,a) for (i,a) in M.column_with_indices(3) ] # needs sage.graphs
761
+ [(3, 2), (2, -1), (4, -2)]
762
+ """
763
+ return self.dynkin_diagram().column(j)
764
+
765
+ def row_with_indices(self, i):
766
+ """
767
+ Return the `i`-th row `(a_{i,j})_j` of ``self`` as a container
768
+ (or iterator) of tuples `(j, a_{i,j})`
769
+
770
+ EXAMPLES::
771
+
772
+ sage: M = CartanMatrix(['C',4]) # needs sage.graphs
773
+ sage: [ (i,a) for (i,a) in M.row_with_indices(3) ] # needs sage.graphs
774
+ [(3, 2), (2, -1), (4, -2)]
775
+ """
776
+ return self.dynkin_diagram().row(i)
777
+
778
+ @cached_method
779
+ def is_finite(self):
780
+ """
781
+ Return ``True`` if ``self`` is a finite type or ``False`` otherwise.
782
+
783
+ A generalized Cartan matrix is finite if the determinant of all its
784
+ principal submatrices (see :meth:`principal_submatrices`) is positive.
785
+ Such matrices have a positive definite symmetrized matrix. Note that a
786
+ finite matrix may consist of multiple blocks of Cartan matrices each
787
+ having finite Cartan type.
788
+
789
+ EXAMPLES::
790
+
791
+ sage: # needs sage.graphs
792
+ sage: M = CartanMatrix(['C',4])
793
+ sage: M.is_finite()
794
+ True
795
+ sage: M = CartanMatrix(['D',4,1])
796
+ sage: M.is_finite()
797
+ False
798
+ sage: M = CartanMatrix([[2, -4], [-3, 2]])
799
+ sage: M.is_finite()
800
+ False
801
+ """
802
+ if self._cartan_type is None:
803
+ if not self.is_symmetrizable():
804
+ return False
805
+ return self.symmetrized_matrix().is_positive_definite()
806
+ return self._cartan_type.is_finite()
807
+
808
+ @cached_method
809
+ def is_affine(self):
810
+ """
811
+ Return ``True`` if ``self`` is an affine type or ``False`` otherwise.
812
+
813
+ A generalized Cartan matrix is affine if all of its indecomposable
814
+ blocks are either finite (see :meth:`is_finite`) or have zero
815
+ determinant with all proper principal minors positive.
816
+
817
+ EXAMPLES::
818
+
819
+ sage: # needs sage.graphs
820
+ sage: M = CartanMatrix(['C',4])
821
+ sage: M.is_affine()
822
+ False
823
+ sage: M = CartanMatrix(['D',4,1])
824
+ sage: M.is_affine()
825
+ True
826
+ sage: M = CartanMatrix([[2, -4], [-3, 2]])
827
+ sage: M.is_affine()
828
+ False
829
+ """
830
+ if self._cartan_type is None:
831
+ if self.det() != 0:
832
+ return False
833
+ for b in self.indecomposable_blocks():
834
+ if b.det() < 0 or not all(
835
+ a.det() > 0 for a in b.principal_submatrices(proper=True)):
836
+ return False
837
+ return True
838
+ return self._cartan_type.is_affine()
839
+
840
+ @cached_method
841
+ def is_hyperbolic(self, compact=False):
842
+ """
843
+ Return if ``True`` if ``self`` is a (compact) hyperbolic type
844
+ or ``False`` otherwise.
845
+
846
+ An indecomposable generalized Cartan matrix is hyperbolic if it has
847
+ negative determinant and if any proper connected subdiagram of its
848
+ Dynkin diagram is of finite or affine type. It is compact hyperbolic
849
+ if any proper connected subdiagram has finite type.
850
+
851
+ INPUT:
852
+
853
+ - ``compact`` -- if ``True``, check if matrix is compact hyperbolic
854
+
855
+ EXAMPLES::
856
+
857
+ sage: # needs sage.graphs
858
+ sage: M = CartanMatrix([[2,-2,0],[-2,2,-1],[0,-1,2]])
859
+ sage: M.is_hyperbolic()
860
+ True
861
+ sage: M.is_hyperbolic(compact=True)
862
+ False
863
+ sage: M = CartanMatrix([[2,-3],[-3,2]])
864
+ sage: M.is_hyperbolic()
865
+ True
866
+ sage: M = CartanMatrix(['C',4])
867
+ sage: M.is_hyperbolic()
868
+ False
869
+ """
870
+ if not self.is_indefinite() or not self.is_indecomposable():
871
+ return False
872
+
873
+ D = self.dynkin_diagram()
874
+ verts = tuple(D.vertex_iterator())
875
+ for v in verts:
876
+ l = set(verts)-set((v,))
877
+ subg = D.subgraph(vertices=l)
878
+ if compact and not subg.is_finite():
879
+ return False
880
+ elif not subg.is_finite() and not subg.is_affine():
881
+ return False
882
+ return True
883
+
884
+ @cached_method
885
+ def is_lorentzian(self):
886
+ """
887
+ Return ``True`` if ``self`` is a Lorentzian type or ``False`` otherwise.
888
+
889
+ A generalized Cartan matrix is Lorentzian if it has negative determinant
890
+ and exactly one negative eigenvalue.
891
+
892
+ EXAMPLES::
893
+
894
+ sage: # needs sage.graphs sage.rings.number_field
895
+ sage: M = CartanMatrix([[2,-3],[-3,2]])
896
+ sage: M.is_lorentzian()
897
+ True
898
+ sage: M = CartanMatrix([[2,-1],[-1,2]])
899
+ sage: M.is_lorentzian()
900
+ False
901
+ """
902
+ if self.det() >= 0:
903
+ return False
904
+ return sum(1 for x in self.eigenvalues() if x < 0) == 1
905
+
906
+ @cached_method
907
+ def is_indefinite(self):
908
+ """
909
+ Return if ``self`` is an indefinite type or ``False`` otherwise.
910
+
911
+ EXAMPLES::
912
+
913
+ sage: # needs sage.graphs
914
+ sage: M = CartanMatrix([[2,-3],[-3,2]])
915
+ sage: M.is_indefinite()
916
+ True
917
+ sage: M = CartanMatrix("A2")
918
+ sage: M.is_indefinite()
919
+ False
920
+ """
921
+ return not self.is_finite() and not self.is_affine()
922
+
923
+ @cached_method
924
+ def is_indecomposable(self):
925
+ """
926
+ Return if ``self`` is an indecomposable matrix or ``False`` otherwise.
927
+
928
+ EXAMPLES::
929
+
930
+ sage: # needs sage.graphs
931
+ sage: M = CartanMatrix(['A',5])
932
+ sage: M.is_indecomposable()
933
+ True
934
+ sage: M = CartanMatrix([[2,-1,0],[-1,2,0],[0,0,2]])
935
+ sage: M.is_indecomposable()
936
+ False
937
+ """
938
+ comp_num = self.dynkin_diagram().connected_components_number()
939
+ # consider the empty matrix to be indecomposable
940
+ return comp_num <= 1
941
+
942
+ @cached_method
943
+ def coxeter_matrix(self):
944
+ r"""
945
+ Return the Coxeter matrix for ``self``.
946
+
947
+ .. SEEALSO:: :meth:`CartanType_abstract.coxeter_matrix`
948
+
949
+ EXAMPLES::
950
+
951
+ sage: # needs sage.graphs
952
+ sage: cm = CartanMatrix([[2,-5,0],[-2,2,-1],[0,-1,2]])
953
+ sage: cm.coxeter_matrix()
954
+ [ 1 -1 2]
955
+ [-1 1 3]
956
+ [ 2 3 1]
957
+ sage: ct = CartanType([['A',2,2], ['B',3]])
958
+ sage: ct.coxeter_matrix()
959
+ [ 1 -1 2 2 2]
960
+ [-1 1 2 2 2]
961
+ [ 2 2 1 3 2]
962
+ [ 2 2 3 1 4]
963
+ [ 2 2 2 4 1]
964
+ sage: ct.cartan_matrix().coxeter_matrix() == ct.coxeter_matrix()
965
+ True
966
+ """
967
+ scalarproducts_to_order = {0: 2, 1: 3, 2: 4, 3: 6}
968
+ from sage.combinat.root_system.coxeter_matrix import CoxeterMatrix
969
+ I = self.index_set()
970
+ n = len(I)
971
+ M = matrix.identity(ZZ, n)
972
+ for i in range(n):
973
+ for j in range(i+1,n):
974
+ val = self[i,j] * self[j,i]
975
+ val = scalarproducts_to_order.get(val, -1)
976
+ M[i,j] = val
977
+ M[j,i] = val
978
+ return CoxeterMatrix(M, index_set=self.index_set(), cartan_type=self)
979
+
980
+ @cached_method
981
+ def coxeter_diagram(self):
982
+ r"""
983
+ Construct the Coxeter diagram of ``self``.
984
+
985
+ .. SEEALSO:: :meth:`CartanType_abstract.coxeter_diagram`
986
+
987
+ EXAMPLES::
988
+
989
+ sage: # needs sage.graphs
990
+ sage: cm = CartanMatrix([[2,-5,0],[-2,2,-1],[0,-1,2]])
991
+ sage: G = cm.coxeter_diagram(); G
992
+ Graph on 3 vertices
993
+ sage: G.edges(sort=True)
994
+ [(0, 1, +Infinity), (1, 2, 3)]
995
+ sage: ct = CartanType([['A',2,2], ['B',3]])
996
+ sage: ct.coxeter_diagram()
997
+ Graph on 5 vertices
998
+ sage: ct.cartan_matrix().coxeter_diagram() == ct.coxeter_diagram()
999
+ True
1000
+ """
1001
+ return self.coxeter_matrix().coxeter_graph()
1002
+
1003
+ def principal_submatrices(self, proper=False):
1004
+ """
1005
+ Return a list of all principal submatrices of ``self``.
1006
+
1007
+ INPUT:
1008
+
1009
+ - ``proper`` -- if ``True``, return only proper submatrices
1010
+
1011
+ EXAMPLES::
1012
+
1013
+ sage: M = CartanMatrix(['A',2]) # needs sage.graphs
1014
+ sage: M.principal_submatrices() # needs sage.graphs
1015
+ [
1016
+ [ 2 -1]
1017
+ [], [2], [2], [-1 2]
1018
+ ]
1019
+ sage: M.principal_submatrices(proper=True) # needs sage.graphs
1020
+ [[], [2], [2]]
1021
+ """
1022
+ iset = list(range(self.ncols()))
1023
+ ret = []
1024
+ for l in powerset(iset):
1025
+ if not proper or (proper and l != iset):
1026
+ ret.append(self.matrix_from_rows_and_columns(l,l))
1027
+ return ret
1028
+
1029
+ @cached_method
1030
+ def indecomposable_blocks(self):
1031
+ """
1032
+ Return a tuple of all indecomposable blocks of ``self``.
1033
+
1034
+ EXAMPLES::
1035
+
1036
+ sage: # needs sage.graphs
1037
+ sage: M = CartanMatrix(['A',2])
1038
+ sage: M.indecomposable_blocks()
1039
+ (
1040
+ [ 2 -1]
1041
+ [-1 2]
1042
+ )
1043
+ sage: M = CartanMatrix([['A',2,1],['A',3,1]])
1044
+ sage: M.indecomposable_blocks()
1045
+ (
1046
+ [ 2 -1 0 -1]
1047
+ [-1 2 -1 0] [ 2 -1 -1]
1048
+ [ 0 -1 2 -1] [-1 2 -1]
1049
+ [-1 0 -1 2], [-1 -1 2]
1050
+ )
1051
+ """
1052
+ subgraphs = self.dynkin_diagram().connected_components_subgraphs()
1053
+ return tuple(CartanMatrix(subg._matrix_().rows()) for subg in subgraphs)
1054
+
1055
+
1056
+ def is_borcherds_cartan_matrix(M):
1057
+ """
1058
+ Return ``True`` if ``M`` is an even, integral Borcherds-Cartan matrix.
1059
+ For a definition of such a matrix, see :class:`CartanMatrix`.
1060
+
1061
+ EXAMPLES::
1062
+
1063
+ sage: from sage.combinat.root_system.cartan_matrix import is_borcherds_cartan_matrix
1064
+ sage: M = Matrix([[2,-1],[-1,2]])
1065
+ sage: is_borcherds_cartan_matrix(M)
1066
+ True
1067
+ sage: N = Matrix([[2,-1],[-1,0]])
1068
+ sage: is_borcherds_cartan_matrix(N)
1069
+ False
1070
+ sage: O = Matrix([[2,-1],[-1,-2]])
1071
+ sage: is_borcherds_cartan_matrix(O)
1072
+ True
1073
+ sage: O = Matrix([[2,-1],[-1,-3]])
1074
+ sage: is_borcherds_cartan_matrix(O)
1075
+ False
1076
+ """
1077
+ if not isinstance(M, Matrix):
1078
+ return False
1079
+ if not M.is_square():
1080
+ return False
1081
+ n = M.ncols()
1082
+ for i in range(n):
1083
+ if M[i,i] == 0:
1084
+ return False
1085
+ if M[i,i] % 2 == 1:
1086
+ return False
1087
+ for j in range(i+1, n):
1088
+ if M[i,j] > 0 or M[j,i] > 0:
1089
+ return False
1090
+ elif M[i,j] == 0 and M[j,i] != 0:
1091
+ return False
1092
+ elif M[j,i] == 0 and M[i,j] != 0:
1093
+ return False
1094
+ return True
1095
+
1096
+
1097
+ def is_generalized_cartan_matrix(M):
1098
+ """
1099
+ Return ``True`` if ``M`` is a generalized Cartan matrix. For a definition
1100
+ of a generalized Cartan matrix, see :class:`CartanMatrix`.
1101
+
1102
+ EXAMPLES::
1103
+
1104
+ sage: from sage.combinat.root_system.cartan_matrix import is_generalized_cartan_matrix
1105
+ sage: M = matrix([[2,-1,-2], [-1,2,-1], [-2,-1,2]])
1106
+ sage: is_generalized_cartan_matrix(M)
1107
+ True
1108
+ sage: M = matrix([[2,-1,-2], [-1,2,-1], [0,-1,2]])
1109
+ sage: is_generalized_cartan_matrix(M)
1110
+ False
1111
+ sage: M = matrix([[1,-1,-2], [-1,2,-1], [-2,-1,2]])
1112
+ sage: is_generalized_cartan_matrix(M)
1113
+ False
1114
+
1115
+ A non-symmetrizable example::
1116
+
1117
+ sage: M = matrix([[2,-1,-2], [-1,2,-1], [-1,-1,2]])
1118
+ sage: is_generalized_cartan_matrix(M)
1119
+ True
1120
+ """
1121
+ if not is_borcherds_cartan_matrix(M):
1122
+ return False
1123
+ n = M.ncols()
1124
+ return all(M[i,i] == 2 for i in range(n))
1125
+
1126
+
1127
+ def find_cartan_type_from_matrix(CM):
1128
+ r"""
1129
+ Find a Cartan type by direct comparison of Dynkin diagrams given from
1130
+ the generalized Cartan matrix ``CM`` and return ``None`` if not found.
1131
+
1132
+ INPUT:
1133
+
1134
+ - ``CM`` -- a generalized Cartan matrix
1135
+
1136
+ EXAMPLES::
1137
+
1138
+ sage: # needs sage.graphs
1139
+ sage: from sage.combinat.root_system.cartan_matrix import find_cartan_type_from_matrix
1140
+ sage: CM = CartanMatrix([[2,-1,-1], [-1,2,-1], [-1,-1,2]])
1141
+ sage: find_cartan_type_from_matrix(CM)
1142
+ ['A', 2, 1]
1143
+ sage: CM = CartanMatrix([[2,-1,0], [-1,2,-2], [0,-1,2]])
1144
+ sage: find_cartan_type_from_matrix(CM)
1145
+ ['C', 3] relabelled by {1: 0, 2: 1, 3: 2}
1146
+ sage: CM = CartanMatrix([[2,-1,-2], [-1,2,-1], [-2,-1,2]])
1147
+ sage: find_cartan_type_from_matrix(CM)
1148
+
1149
+ TESTS:
1150
+
1151
+ Check that :issue:`35987` is fixed::
1152
+
1153
+ sage: from sage.combinat.root_system.cartan_matrix import find_cartan_type_from_matrix
1154
+ sage: cm = CartanMatrix(['A',7]).subtype([2,3,5]) # needs sage.graphs
1155
+ sage: find_cartan_type_from_matrix(cm) # needs sage.graphs
1156
+ A2xA1 relabelled by {1: 2, 2: 3, 3: 5}
1157
+
1158
+ sage: cm = CartanMatrix(['B',10,1]).subtype([0,1,2,3,5,6,8,9,10]) # needs sage.graphs
1159
+ sage: ct = find_cartan_type_from_matrix(cm); ct # needs sage.graphs
1160
+ D4xB3xA2 relabelled by {1: 0, 2: 2, 3: 1, 4: 3, 5: 8, 6: 9, 7: 10, 8: 5, 9: 6}
1161
+ sage: ct.dynkin_diagram() # needs sage.graphs
1162
+ O 3
1163
+ |
1164
+ |
1165
+ O---O---O
1166
+ 0 2 1
1167
+ O---O=>=O
1168
+ 8 9 10
1169
+ O---O
1170
+ 5 6
1171
+ D4xB3xA2 relabelled by {1: 0, 2: 2, 3: 1, 4: 3, 5: 8, 6: 9, 7: 10, 8: 5, 9: 6}
1172
+ """
1173
+ types = []
1174
+ relabel = []
1175
+ for S in CM.dynkin_diagram().connected_components_subgraphs():
1176
+ S = DiGraph(S) # We need a simple digraph here
1177
+ n = S.num_verts()
1178
+ # Build the list to test based upon rank
1179
+ if n == 1:
1180
+ relabel.append({1: S.vertices()[0]})
1181
+ types.append(CartanType(['A', 1]))
1182
+ continue
1183
+
1184
+ test = [['A', n]]
1185
+ if n >= 2:
1186
+ if n == 2:
1187
+ test += [['G',2], ['A',2,2]]
1188
+ test += [['B',n], ['A',n-1,1]]
1189
+ if n >= 3:
1190
+ if n == 3:
1191
+ test.append(['G',2,1])
1192
+ test += [['C',n], ['BC',n-1,2], ['C',n-1,1]]
1193
+ if n >= 4:
1194
+ if n == 4:
1195
+ test.append(['F',4])
1196
+ test += [['D',n], ['B',n-1,1]]
1197
+ if n >= 5:
1198
+ if n == 5:
1199
+ test.append(['F',4,1])
1200
+ test.append(['D',n-1,1])
1201
+ if n == 6:
1202
+ test.append(['E',6])
1203
+ elif n == 7:
1204
+ test += [['E',7], ['E',6,1]]
1205
+ elif n == 8:
1206
+ test += [['E',8], ['E',7,1]]
1207
+ elif n == 9:
1208
+ test.append(['E',8,1])
1209
+
1210
+ # Test every possible Cartan type and its dual
1211
+ found = False
1212
+ for x in test:
1213
+ ct = CartanType(x)
1214
+ T = DiGraph(ct.dynkin_diagram()) # We need a simple digraph here
1215
+ iso, match = T.is_isomorphic(S, certificate=True, edge_labels=True)
1216
+ if iso:
1217
+ types.append(ct)
1218
+ relabel.append(match)
1219
+ found = True
1220
+ break
1221
+
1222
+ if ct == ct.dual():
1223
+ continue # self-dual, so nothing more to test
1224
+
1225
+ ct = ct.dual()
1226
+ T = DiGraph(ct.dynkin_diagram()) # We need a simple digraph here
1227
+ iso, match = T.is_isomorphic(S, certificate=True, edge_labels=True)
1228
+ if iso:
1229
+ types.append(ct)
1230
+ relabel.append(match)
1231
+ found = True
1232
+ break
1233
+ if not found:
1234
+ return None
1235
+
1236
+ if len(types) == 1:
1237
+ # Irreducible, so just relabel
1238
+ return CartanType(types[0]).relabel(relabel[0])
1239
+ ct = CartanType(types)
1240
+ # ct._index_relabelling is a dict ``(ind, j): i``, where i is an index of
1241
+ # ``ct``, ``ind`` is the position in the list of types, and j is the
1242
+ # corresponding index of the type number ``ind``.
1243
+ # In other words, the j-th node of ``types[ind]`` is the i-th node of ``ct``.
1244
+ mapping = {i: relabel[d[0]][d[1]] for d, i in ct._index_relabelling.items()}
1245
+ return ct.relabel(mapping)