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,1261 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.graphs
3
+ """
4
+ Coxeter matrices
5
+ """
6
+ # ****************************************************************************
7
+ # Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
8
+ # 2015 Travis Scrimshaw <tscrim at ucdavis.edu>
9
+ # 2015 Jean-Philippe Labbe <labbe at math.huji.ac.il>
10
+ #
11
+ # Distributed under the terms of the GNU General Public License (GPL)
12
+ #
13
+ # This code is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
+ # General Public License for more details.
17
+ #
18
+ # The full text of the GPL is available at:
19
+ #
20
+ # https://www.gnu.org/licenses/
21
+ # ****************************************************************************
22
+
23
+ from sage.misc.cachefunc import cached_method
24
+ from sage.matrix.constructor import matrix
25
+ from sage.matrix.matrix_space import MatrixSpace
26
+ from sage.misc.classcall_metaclass import ClasscallMetaclass, typecall
27
+ from sage.misc.lazy_import import lazy_import
28
+ from sage.matrix.matrix_generic_dense import Matrix_generic_dense
29
+ from sage.rings.integer_ring import ZZ
30
+ from sage.rings.rational_field import QQ
31
+ from sage.rings.real_mpfr import RR
32
+ from sage.rings.infinity import infinity
33
+ from sage.combinat.root_system.cartan_type import CartanType
34
+ from sage.combinat.root_system.coxeter_type import CoxeterType
35
+
36
+ lazy_import('sage.graphs.graph', 'Graph')
37
+
38
+
39
+ class CoxeterMatrix(CoxeterType, metaclass=ClasscallMetaclass):
40
+ r"""
41
+ A Coxeter matrix.
42
+
43
+ A Coxeter matrix `M = (m_{ij})_{i,j \in I}` is a matrix encoding
44
+ a Coxeter system `(W, S)`, where the relations are given by
45
+ `(s_i s_j)^{m_{ij}}`. Thus `M` is symmetric and has entries
46
+ in `\{1, 2, 3, \ldots, \infty\}` with `m_{ij} = 1` if and only
47
+ if `i = j`.
48
+
49
+ We represent `m_{ij} = \infty` by any number `m_{ij} \leq -1`. In
50
+ particular, we can construct a bilinear form `B = (b_{ij})_{i,j \in I}`
51
+ from `M` by
52
+
53
+ .. MATH::
54
+
55
+ b_{ij} = \begin{cases}
56
+ m_{ij} & m_{ij} < 0\ (\text{i.e., } m_{ij} = \infty), \\
57
+ -\cos\left( \frac{\pi}{m_{ij}} \right) & \text{otherwise}.
58
+ \end{cases}
59
+
60
+ EXAMPLES::
61
+
62
+ sage: CoxeterMatrix(['A', 4])
63
+ [1 3 2 2]
64
+ [3 1 3 2]
65
+ [2 3 1 3]
66
+ [2 2 3 1]
67
+ sage: CoxeterMatrix(['B', 4])
68
+ [1 3 2 2]
69
+ [3 1 3 2]
70
+ [2 3 1 4]
71
+ [2 2 4 1]
72
+ sage: CoxeterMatrix(['C', 4])
73
+ [1 3 2 2]
74
+ [3 1 3 2]
75
+ [2 3 1 4]
76
+ [2 2 4 1]
77
+ sage: CoxeterMatrix(['D', 4])
78
+ [1 3 2 2]
79
+ [3 1 3 3]
80
+ [2 3 1 2]
81
+ [2 3 2 1]
82
+
83
+ sage: CoxeterMatrix(['E', 6])
84
+ [1 2 3 2 2 2]
85
+ [2 1 2 3 2 2]
86
+ [3 2 1 3 2 2]
87
+ [2 3 3 1 3 2]
88
+ [2 2 2 3 1 3]
89
+ [2 2 2 2 3 1]
90
+
91
+ sage: CoxeterMatrix(['F', 4])
92
+ [1 3 2 2]
93
+ [3 1 4 2]
94
+ [2 4 1 3]
95
+ [2 2 3 1]
96
+
97
+ sage: CoxeterMatrix(['G', 2])
98
+ [1 6]
99
+ [6 1]
100
+
101
+ By default, entries representing `\infty` are given by `-1`
102
+ in the Coxeter matrix::
103
+
104
+ sage: G = Graph([(0,1,None), (1,2,4), (0,2,oo)])
105
+ sage: CoxeterMatrix(G)
106
+ [ 1 3 -1]
107
+ [ 3 1 4]
108
+ [-1 4 1]
109
+
110
+ It is possible to give a number `\leq -1` to represent an infinite label::
111
+
112
+ sage: CoxeterMatrix([[1,-1],[-1,1]])
113
+ [ 1 -1]
114
+ [-1 1]
115
+ sage: CoxeterMatrix([[1,-3/2],[-3/2,1]])
116
+ [ 1 -3/2]
117
+ [-3/2 1]
118
+ """
119
+ @staticmethod
120
+ def __classcall_private__(cls, data=None, index_set=None, coxeter_type=None,
121
+ cartan_type=None, coxeter_type_check=True):
122
+ r"""
123
+ A Coxeter matrix can we created via a graph, a Coxeter type, or
124
+ a matrix.
125
+
126
+ .. NOTE::
127
+
128
+ To disable the Coxeter type check, use the optional argument
129
+ ``coxeter_type_check = False``.
130
+
131
+ EXAMPLES::
132
+
133
+ sage: C = CoxeterMatrix(['A',1,1],['a','b'])
134
+ sage: C2 = CoxeterMatrix([[1, -1], [-1, 1]])
135
+ sage: C3 = CoxeterMatrix(matrix([[1, -1], [-1, 1]]), [0, 1])
136
+ sage: C == C2 and C == C3
137
+ True
138
+
139
+ Check with `\infty` because of the hack of using `-1` to represent
140
+ `\infty` in the Coxeter matrix::
141
+
142
+ sage: G = Graph([(0, 1, 3), (1, 2, oo)])
143
+ sage: W1 = CoxeterMatrix([[1, 3, 2], [3, 1, -1], [2, -1, 1]])
144
+ sage: W2 = CoxeterMatrix(G)
145
+ sage: W1 == W2
146
+ True
147
+ sage: CoxeterMatrix(W1.coxeter_graph()) == W1
148
+ True
149
+
150
+ The base ring of the matrix depends on the entries given::
151
+
152
+ sage: CoxeterMatrix([[1,-1],[-1,1]])._matrix.base_ring()
153
+ Integer Ring
154
+ sage: CoxeterMatrix([[1,-3/2],[-3/2,1]])._matrix.base_ring()
155
+ Rational Field
156
+ sage: CoxeterMatrix([[1,-1.5],[-1.5,1]])._matrix.base_ring()
157
+ Real Field with 53 bits of precision
158
+ """
159
+ if not data:
160
+ if coxeter_type:
161
+ data = CoxeterType(coxeter_type)
162
+ elif cartan_type:
163
+ data = CoxeterType(CartanType(cartan_type))
164
+
165
+ # Special cases with no arguments passed
166
+ if not data:
167
+ data = []
168
+ n = 0
169
+ index_set = tuple()
170
+ coxeter_type = None
171
+ base_ring = ZZ
172
+ mat = typecall(cls, MatrixSpace(base_ring, n, sparse=False), data, coxeter_type, index_set)
173
+ mat._subdivisions = None
174
+
175
+ return mat
176
+
177
+ if isinstance(data, CoxeterMatrix): # Initiate from itself
178
+ return data
179
+
180
+ # Initiate from a graph:
181
+ # TODO: Check if a CoxeterDiagram once implemented
182
+ if isinstance(data, Graph):
183
+ return cls._from_graph(data, coxeter_type_check)
184
+
185
+ # Get the Coxeter type
186
+ coxeter_type = None
187
+ from sage.combinat.root_system.cartan_type import CartanType_abstract
188
+ if isinstance(data, CartanType_abstract):
189
+ coxeter_type = data.coxeter_type()
190
+ else:
191
+ try:
192
+ coxeter_type = CoxeterType(data)
193
+ except (TypeError, ValueError, NotImplementedError):
194
+ pass
195
+
196
+ # Initiate from a Coxeter type
197
+ if coxeter_type:
198
+ return cls._from_coxetertype(coxeter_type)
199
+
200
+ # TODO:: remove when oo is possible in matrices.
201
+ n = len(data[0])
202
+ data = [x if x != infinity else -1 for r in data for x in r]
203
+ data = matrix(n, n, data)
204
+ # until here
205
+
206
+ # Get the index set
207
+ if index_set:
208
+ index_set = tuple(index_set)
209
+ else:
210
+ index_set = tuple(range(1, n + 1))
211
+ if len(set(index_set)) != n:
212
+ raise ValueError("the given index set is not valid")
213
+
214
+ return cls._from_matrix(data, coxeter_type, index_set, coxeter_type_check)
215
+
216
+ def __init__(self, parent, data, coxeter_type, index_set):
217
+ """
218
+ Initialize ``self``.
219
+
220
+ TESTS::
221
+
222
+ sage: C = CoxeterMatrix(['A', 2, 1])
223
+ sage: TestSuite(C).run(skip=["_test_category", "_test_change_ring"])
224
+ """
225
+ self._matrix = Matrix_generic_dense(parent, data, False, True)
226
+ self._matrix.set_immutable()
227
+
228
+ if self._matrix.base_ring() not in [ZZ, QQ]:
229
+ self._is_cyclotomic = False
230
+ else:
231
+ self._is_cyclotomic = True
232
+ self._coxeter_type = coxeter_type
233
+
234
+ if self._coxeter_type is not None:
235
+ if self._coxeter_type.is_finite():
236
+ self._is_finite = True
237
+ self._is_affine = False
238
+ elif self._coxeter_type.is_affine():
239
+ self._is_finite = False
240
+ self._is_affine = True
241
+ else:
242
+ self._is_finite = False
243
+ self._is_affine = False
244
+ else:
245
+ self._is_finite = False
246
+ self._is_affine = False
247
+
248
+ self._index_set = index_set
249
+ self._rank = self._matrix.nrows()
250
+
251
+ self._dict = {(self._index_set[i], self._index_set[j]): self._matrix[i, j]
252
+ for i in range(self._rank) for j in range(self._rank)}
253
+
254
+ for i, key in enumerate(self._index_set):
255
+ self._dict[key] = {key2: self._matrix[i, j]
256
+ for j, key2 in enumerate(self._index_set)}
257
+
258
+ @classmethod
259
+ def _from_matrix(cls, data, coxeter_type, index_set, coxeter_type_check):
260
+ """
261
+ Initiate the Coxeter matrix from a matrix.
262
+
263
+ TESTS::
264
+
265
+ sage: CM = CoxeterMatrix([[1,2],[2,1]]); CM
266
+ [1 2]
267
+ [2 1]
268
+ sage: CM = CoxeterMatrix([[1,-1],[-1,1]]); CM
269
+ [ 1 -1]
270
+ [-1 1]
271
+ sage: CM = CoxeterMatrix([[1,-1.5],[-1.5,1]]); CM
272
+ [ 1.00000000000000 -1.50000000000000]
273
+ [-1.50000000000000 1.00000000000000]
274
+ sage: CM = CoxeterMatrix([[1,-3/2],[-3/2,1]]); CM
275
+ [ 1 -3/2]
276
+ [-3/2 1]
277
+ sage: CM = CoxeterMatrix([[1,-3/2,5],[-3/2,1,-1],[5,-1,1]]); CM
278
+ [ 1 -3/2 5]
279
+ [-3/2 1 -1]
280
+ [ 5 -1 1]
281
+ sage: CM = CoxeterMatrix([[1,-3/2,5],[-3/2,1,oo],[5,oo,1]]); CM
282
+ [ 1 -3/2 5]
283
+ [-3/2 1 -1]
284
+ [ 5 -1 1]
285
+ """
286
+ # Check that the data is valid
287
+ check_coxeter_matrix(data)
288
+
289
+ M = matrix(data)
290
+ n = M.ncols()
291
+
292
+ base_ring = M.base_ring()
293
+
294
+ if not coxeter_type:
295
+ if n == 1:
296
+ coxeter_type = CoxeterType(['A', 1])
297
+ elif coxeter_type_check:
298
+ coxeter_type = recognize_coxeter_type_from_matrix(M, index_set)
299
+ else:
300
+ coxeter_type = None
301
+
302
+ raw_data = M.list()
303
+
304
+ mat = typecall(cls, MatrixSpace(base_ring, n, sparse=False), raw_data,
305
+ coxeter_type, index_set)
306
+ mat._subdivisions = M._subdivisions
307
+
308
+ return mat
309
+
310
+ @classmethod
311
+ def _from_graph(cls, graph, coxeter_type_check):
312
+ """
313
+ Initiate the Coxeter matrix from a graph.
314
+
315
+ TESTS::
316
+
317
+ sage: CoxeterMatrix(CoxeterMatrix(['A',4,1]).coxeter_graph())
318
+ [1 3 2 2 3]
319
+ [3 1 3 2 2]
320
+ [2 3 1 3 2]
321
+ [2 2 3 1 3]
322
+ [3 2 2 3 1]
323
+ sage: CoxeterMatrix(CoxeterMatrix(['B',4,1]).coxeter_graph())
324
+ [1 2 3 2 2]
325
+ [2 1 3 2 2]
326
+ [3 3 1 3 2]
327
+ [2 2 3 1 4]
328
+ [2 2 2 4 1]
329
+ sage: CoxeterMatrix(CoxeterMatrix(['F',4]).coxeter_graph())
330
+ [1 3 2 2]
331
+ [3 1 4 2]
332
+ [2 4 1 3]
333
+ [2 2 3 1]
334
+
335
+ sage: G = Graph()
336
+ sage: G.add_edge([0,1,oo])
337
+ sage: CoxeterMatrix(G)
338
+ [ 1 -1]
339
+ [-1 1]
340
+ sage: H = Graph()
341
+ sage: H.add_edge([0,1,-1.5])
342
+ sage: CoxeterMatrix(H)
343
+ [ 1.00000000000000 -1.50000000000000]
344
+ [-1.50000000000000 1.00000000000000]
345
+ """
346
+ verts = graph.vertices(sort=True)
347
+ index_set = tuple(verts)
348
+ n = len(index_set)
349
+
350
+ # Setup the basis matrix as all 2 except 1 on the diagonal
351
+ data = []
352
+ for i in range(n):
353
+ data += [[]]
354
+ for j in range(n):
355
+ if i == j:
356
+ data[-1] += [ZZ.one()]
357
+ else:
358
+ data[-1] += [2]
359
+
360
+ for e in graph.edges(sort=True):
361
+ label = e[2]
362
+ if label is None:
363
+ label = 3
364
+ elif label == infinity:
365
+ label = -1
366
+ elif label not in ZZ and label > -1:
367
+ raise ValueError("invalid Coxeter graph label")
368
+ elif label == 0 or label == 1:
369
+ raise ValueError("invalid Coxeter graph label")
370
+ i = verts.index(e[0])
371
+ j = verts.index(e[1])
372
+ data[j][i] = data[i][j] = label
373
+
374
+ return cls._from_matrix(data, None, index_set, coxeter_type_check)
375
+
376
+ @classmethod
377
+ def _from_coxetertype(cls, coxeter_type):
378
+ """
379
+ Initiate the Coxeter matrix from a Coxeter type.
380
+
381
+ TESTS::
382
+
383
+ sage: CoxeterMatrix(['A',4]).coxeter_type()
384
+ Coxeter type of ['A', 4]
385
+ sage: CoxeterMatrix(['A',4,1]).coxeter_type()
386
+ Coxeter type of ['A', 4, 1]
387
+ sage: CoxeterMatrix(['D',4,1]).coxeter_type()
388
+ Coxeter type of ['D', 4, 1]
389
+ """
390
+ index_set = coxeter_type.index_set()
391
+ n = len(index_set)
392
+ reverse = {index_set[i]: i for i in range(n)}
393
+ data = [[1 if i == j else 2 for j in range(n)] for i in range(n)]
394
+ for (i, j, l) in coxeter_type.coxeter_graph().edge_iterator():
395
+ if l == infinity:
396
+ l = -1
397
+ data[reverse[i]][reverse[j]] = l
398
+ data[reverse[j]][reverse[i]] = l
399
+
400
+ return cls._from_matrix(data, coxeter_type, index_set, False)
401
+
402
+ @classmethod
403
+ def samples(self, finite=None, affine=None, crystallographic=None, higher_rank=None):
404
+ """
405
+ Return a sample of the available Coxeter types.
406
+
407
+ INPUT:
408
+
409
+ - ``finite`` -- (default: ``None``) a boolean or ``None``
410
+
411
+ - ``affine`` -- (default: ``None``) a boolean or ``None``
412
+
413
+ - ``crystallographic`` -- (default: ``None``) a boolean or ``None``
414
+
415
+ - ``higher_rank`` -- (default: ``None``) a boolean or ``None``
416
+
417
+ The sample contains all the exceptional finite and affine
418
+ Coxeter types, as well as typical representatives of the
419
+ infinite families.
420
+
421
+ Here the ``higher_rank`` term denotes non-finite, non-affine,
422
+ Coxeter groups (including hyperbolic types).
423
+
424
+ .. TODO:: Implement the hyperbolic and compact hyperbolic in the samples.
425
+
426
+ EXAMPLES::
427
+
428
+ sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples()]
429
+ [
430
+ Coxeter type of ['A', 1], Coxeter type of ['A', 5],
431
+ <BLANKLINE>
432
+ Coxeter type of ['B', 5], Coxeter type of ['D', 4],
433
+ <BLANKLINE>
434
+ Coxeter type of ['D', 5], Coxeter type of ['E', 6],
435
+ <BLANKLINE>
436
+ Coxeter type of ['E', 7], Coxeter type of ['E', 8],
437
+ <BLANKLINE>
438
+ Coxeter type of ['F', 4], Coxeter type of ['H', 3],
439
+ <BLANKLINE>
440
+ Coxeter type of ['H', 4], Coxeter type of ['I', 10],
441
+ <BLANKLINE>
442
+ Coxeter type of ['A', 2, 1], Coxeter type of ['B', 5, 1],
443
+ <BLANKLINE>
444
+ Coxeter type of ['C', 5, 1], Coxeter type of ['D', 5, 1],
445
+ <BLANKLINE>
446
+ Coxeter type of ['E', 6, 1], Coxeter type of ['E', 7, 1],
447
+ <BLANKLINE>
448
+ Coxeter type of ['E', 8, 1], Coxeter type of ['F', 4, 1],
449
+ <BLANKLINE>
450
+ [ 1 -1 -1]
451
+ [-1 1 -1]
452
+ Coxeter type of ['G', 2, 1], Coxeter type of ['A', 1, 1], [-1 -1 1],
453
+ <BLANKLINE>
454
+ [ 1 -2 3 2]
455
+ [1 2 3] [-2 1 2 3]
456
+ [2 1 7] [ 3 2 1 -8]
457
+ [3 7 1], [ 2 3 -8 1]
458
+ ]
459
+
460
+ The finite, affine and crystallographic options allow
461
+ respectively for restricting to (non) finite, (non) affine,
462
+ and (non) crystallographic Cartan types::
463
+
464
+ sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples(finite=True)]
465
+ [Coxeter type of ['A', 1], Coxeter type of ['A', 5],
466
+ Coxeter type of ['B', 5], Coxeter type of ['D', 4],
467
+ Coxeter type of ['D', 5], Coxeter type of ['E', 6],
468
+ Coxeter type of ['E', 7], Coxeter type of ['E', 8],
469
+ Coxeter type of ['F', 4], Coxeter type of ['H', 3],
470
+ Coxeter type of ['H', 4], Coxeter type of ['I', 10]]
471
+
472
+ sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples(affine=True)]
473
+ [Coxeter type of ['A', 2, 1], Coxeter type of ['B', 5, 1],
474
+ Coxeter type of ['C', 5, 1], Coxeter type of ['D', 5, 1],
475
+ Coxeter type of ['E', 6, 1], Coxeter type of ['E', 7, 1],
476
+ Coxeter type of ['E', 8, 1], Coxeter type of ['F', 4, 1],
477
+ Coxeter type of ['G', 2, 1], Coxeter type of ['A', 1, 1]]
478
+
479
+ sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples(crystallographic=True)]
480
+ [Coxeter type of ['A', 1], Coxeter type of ['A', 5],
481
+ Coxeter type of ['B', 5], Coxeter type of ['D', 4],
482
+ Coxeter type of ['D', 5], Coxeter type of ['E', 6],
483
+ Coxeter type of ['E', 7], Coxeter type of ['E', 8],
484
+ Coxeter type of ['F', 4], Coxeter type of ['A', 2, 1],
485
+ Coxeter type of ['B', 5, 1], Coxeter type of ['C', 5, 1],
486
+ Coxeter type of ['D', 5, 1], Coxeter type of ['E', 6, 1],
487
+ Coxeter type of ['E', 7, 1], Coxeter type of ['E', 8, 1],
488
+ Coxeter type of ['F', 4, 1], Coxeter type of ['G', 2, 1]]
489
+
490
+ sage: CoxeterMatrix.samples(crystallographic=False)
491
+ [
492
+ [1 3 2 2]
493
+ [1 3 2] [3 1 3 2] [ 1 -1 -1] [1 2 3]
494
+ [3 1 5] [2 3 1 5] [ 1 10] [ 1 -1] [-1 1 -1] [2 1 7]
495
+ [2 5 1], [2 2 5 1], [10 1], [-1 1], [-1 -1 1], [3 7 1],
496
+ <BLANKLINE>
497
+ [ 1 -2 3 2]
498
+ [-2 1 2 3]
499
+ [ 3 2 1 -8]
500
+ [ 2 3 -8 1]
501
+ ]
502
+
503
+ .. TODO:: add some reducible Coxeter types (suggestions?)
504
+
505
+ TESTS::
506
+
507
+ sage: for ct in CoxeterMatrix.samples(): TestSuite(ct).run()
508
+ """
509
+ result = self._samples()
510
+ if crystallographic is not None:
511
+ result = [t for t in result if t.is_crystallographic() == crystallographic]
512
+ if finite is not None:
513
+ result = [t for t in result if t.is_finite() == finite]
514
+ if affine is not None:
515
+ result = [t for t in result if t.is_affine() == affine]
516
+ if higher_rank is not None:
517
+ result = [t for t in result if not t.is_affine() and not t.is_finite()]
518
+ return result
519
+
520
+ @cached_method
521
+ def _samples(self):
522
+ """
523
+ Return a sample of all implemented Coxeter types.
524
+
525
+ .. NOTE:: This is intended to be used through :meth:`samples`.
526
+
527
+ EXAMPLES::
528
+
529
+ sage: [CM.coxeter_type() for CM in CoxeterMatrix._samples()]
530
+ [
531
+ Coxeter type of ['A', 1], Coxeter type of ['A', 5],
532
+ <BLANKLINE>
533
+ Coxeter type of ['B', 5], Coxeter type of ['D', 4],
534
+ <BLANKLINE>
535
+ Coxeter type of ['D', 5], Coxeter type of ['E', 6],
536
+ <BLANKLINE>
537
+ Coxeter type of ['E', 7], Coxeter type of ['E', 8],
538
+ <BLANKLINE>
539
+ Coxeter type of ['F', 4], Coxeter type of ['H', 3],
540
+ <BLANKLINE>
541
+ Coxeter type of ['H', 4], Coxeter type of ['I', 10],
542
+ <BLANKLINE>
543
+ Coxeter type of ['A', 2, 1], Coxeter type of ['B', 5, 1],
544
+ <BLANKLINE>
545
+ Coxeter type of ['C', 5, 1], Coxeter type of ['D', 5, 1],
546
+ <BLANKLINE>
547
+ Coxeter type of ['E', 6, 1], Coxeter type of ['E', 7, 1],
548
+ <BLANKLINE>
549
+ Coxeter type of ['E', 8, 1], Coxeter type of ['F', 4, 1],
550
+ <BLANKLINE>
551
+ [ 1 -1 -1]
552
+ [-1 1 -1]
553
+ Coxeter type of ['G', 2, 1], Coxeter type of ['A', 1, 1], [-1 -1 1],
554
+ <BLANKLINE>
555
+ [ 1 -2 3 2]
556
+ [1 2 3] [-2 1 2 3]
557
+ [2 1 7] [ 3 2 1 -8]
558
+ [3 7 1], [ 2 3 -8 1]
559
+ ]
560
+ """
561
+ finite = [CoxeterMatrix(t) for t in [['A', 1], ['A', 5], ['B', 5],
562
+ ['D', 4], ['D', 5], ['E', 6], ['E', 7],
563
+ ['E', 8], ['F', 4], ['H', 3], ['H', 4],
564
+ ['I', 10]]]
565
+
566
+ affine = [CoxeterMatrix(t) for t in [['A', 2, 1], ['B', 5, 1],
567
+ ['C', 5, 1], ['D', 5, 1], ['E', 6, 1],
568
+ ['E', 7, 1], ['E', 8, 1], ['F', 4, 1],
569
+ ['G', 2, 1], ['A', 1, 1]]]
570
+
571
+ higher_matrices = [[[1, -1, -1], [-1, 1, -1], [-1, -1, 1]],
572
+ [[1, 2, 3], [2, 1, 7], [3, 7, 1]],
573
+ [[1, -2, 3, 2], [-2, 1, 2, 3], [3, 2, 1, -8], [2, 3, -8, 1]]]
574
+
575
+ higher = [CoxeterMatrix(m) for m in higher_matrices]
576
+
577
+ return finite + affine + higher
578
+
579
+ def relabel(self, relabelling):
580
+ """
581
+ Return a relabelled copy of this Coxeter matrix.
582
+
583
+ INPUT:
584
+
585
+ - ``relabelling`` -- a function (or dictionary)
586
+
587
+ OUTPUT:
588
+
589
+ an isomorphic Coxeter type obtained by relabelling the nodes of
590
+ the Coxeter graph. Namely, the node with label ``i`` is
591
+ relabelled ``f(i)`` (or, by ``f[i]`` if ``f`` is a dictionary).
592
+
593
+ EXAMPLES::
594
+
595
+ sage: CoxeterMatrix(['F',4]).relabel({ 1:2, 2:3, 3:4, 4:1})
596
+ [1 4 2 3]
597
+ [4 1 3 2]
598
+ [2 3 1 2]
599
+ [3 2 2 1]
600
+ sage: CoxeterMatrix(['F',4]).relabel(lambda x: x+1 if x<4 else 1)
601
+ [1 4 2 3]
602
+ [4 1 3 2]
603
+ [2 3 1 2]
604
+ [3 2 2 1]
605
+ """
606
+ if isinstance(relabelling, dict):
607
+ data = [[self[relabelling[i]][relabelling[j]]
608
+ for j in self.index_set()] for i in self.index_set()]
609
+ else:
610
+ data = [[self[relabelling(i)][relabelling(j)]
611
+ for j in self.index_set()] for i in self.index_set()]
612
+
613
+ return CoxeterMatrix(data)
614
+
615
+ def __reduce__(self):
616
+ """
617
+ Used for pickling.
618
+
619
+ TESTS::
620
+
621
+ sage: C = CoxeterMatrix(['A',4])
622
+ sage: M = loads(dumps(C))
623
+ sage: M._index_set
624
+ (1, 2, 3, 4)
625
+ """
626
+ if self._coxeter_type:
627
+ return (CoxeterMatrix, (self._coxeter_type,))
628
+ return (CoxeterMatrix, (self._matrix, self._index_set))
629
+
630
+ def _repr_(self):
631
+ """
632
+ String representation of the Coxeter matrix.
633
+
634
+ EXAMPLES::
635
+
636
+ sage: CM = CoxeterMatrix(['A',3]); CM
637
+ [1 3 2]
638
+ [3 1 3]
639
+ [2 3 1]
640
+ sage: CM = CoxeterMatrix([[1,-3/2],[-3/2,1]]); CM
641
+ [ 1 -3/2]
642
+ [-3/2 1]
643
+ """
644
+ return repr(self._matrix)
645
+
646
+ def _repr_option(self, key):
647
+ """
648
+ Metadata about the :meth:`_repr_` output.
649
+
650
+ See :meth:`sage.structure.parent._repr_option` for details.
651
+
652
+ EXAMPLES::
653
+
654
+ sage: CM = CoxeterMatrix(['A',3])
655
+ sage: CM._repr_option('ascii_art')
656
+ True
657
+ """
658
+ if key == 'ascii_art' or key == 'element_ascii_art':
659
+ return self._matrix.nrows() > 1
660
+ return super()._repr_option(key)
661
+
662
+ def _latex_(self):
663
+ r"""
664
+ Latex representation of the Coxeter matrix.
665
+
666
+ EXAMPLES::
667
+
668
+ sage: CM = CoxeterMatrix(['A',3])
669
+ sage: latex(CM)
670
+ \left(\begin{array}{rrr}
671
+ 1 & 3 & 2 \\
672
+ 3 & 1 & 3 \\
673
+ 2 & 3 & 1
674
+ \end{array}\right)
675
+ """
676
+ return self._matrix._latex_()
677
+
678
+ def __iter__(self):
679
+ """
680
+ Return an iterator for the rows of the Coxeter matrix.
681
+
682
+ EXAMPLES::
683
+
684
+ sage: CM = CoxeterMatrix([[1,8],[8,1]])
685
+ sage: next(CM.__iter__())
686
+ (1, 8)
687
+ """
688
+ return iter(self._matrix)
689
+
690
+ def __getitem__(self, key):
691
+ """
692
+ Return a dictionary of labels adjacent to a node or
693
+ the label of an edge in the Coxeter graph.
694
+
695
+ EXAMPLES::
696
+
697
+ sage: CM = CoxeterMatrix([[1,-2],[-2,1]])
698
+ sage: CM = CoxeterMatrix([[1,-2],[-2,1]], ['a','b'])
699
+ sage: CM['a']
700
+ {'a': 1, 'b': -2}
701
+ sage: CM['b']
702
+ {'a': -2, 'b': 1}
703
+ sage: CM['a','b']
704
+ -2
705
+ sage: CM['a','a']
706
+ 1
707
+ """
708
+ return self._dict[key]
709
+
710
+ def __hash__(self):
711
+ r"""
712
+ Return hash of the Coxeter matrix.
713
+
714
+ EXAMPLES::
715
+
716
+ sage: CM = CoxeterMatrix([[1, -2], [-2, 1]], ['a', 'b'])
717
+ sage: CM.__hash__()
718
+ -337812865737895661 # 64-bit
719
+ 153276691 # 32-bit
720
+ sage: CM = CoxeterMatrix([[1, -3], [-3, 1]], ['1', '2'])
721
+ sage: CM.__hash__()
722
+ -506719298606843492 # 64-bit
723
+ -1917568612 # 32-bit
724
+ """
725
+ return hash(self._matrix)
726
+
727
+ def __eq__(self, other):
728
+ r"""
729
+ Return if ``self`` and ``other`` are equal.
730
+
731
+ EXAMPLES::
732
+
733
+ sage: CM = CoxeterMatrix([[1,-2],[-2,1]],['a','b'])
734
+ sage: CM2 = CoxeterMatrix([[1,-2],[-2,1]],['1','2'])
735
+ sage: CM == CM2
736
+ True
737
+ sage: CM == matrix(CM)
738
+ False
739
+ sage: CM3 = CoxeterMatrix([[1,-3],[-3,1]],['1','2'])
740
+ sage: CM == CM3
741
+ False
742
+ """
743
+ return isinstance(other, CoxeterMatrix) and self._matrix == other._matrix
744
+
745
+ def __ne__(self, other):
746
+ """
747
+ Return if ``self`` and ``other`` are not equal.
748
+
749
+ EXAMPLES::
750
+
751
+ sage: CM = CoxeterMatrix([[1,-2],[-2,1]],['a','b'])
752
+ sage: CM2 = CoxeterMatrix([[1,-2],[-2,1]],['1','2'])
753
+ sage: CM != CM2
754
+ False
755
+ sage: matrix(CM) != CM
756
+ True
757
+ sage: CM3 = CoxeterMatrix([[1,-3],[-3,1]],['1','2'])
758
+ sage: CM != CM3
759
+ True
760
+ """
761
+ return not (self == other)
762
+
763
+ def _matrix_(self, R=None):
764
+ """
765
+ Return ``self`` as a matrix over the ring ``R``.
766
+
767
+ EXAMPLES::
768
+
769
+ sage: CM = CoxeterMatrix([[1,-3],[-3,1]])
770
+ sage: matrix(CM)
771
+ [ 1 -3]
772
+ [-3 1]
773
+ sage: matrix(RR, CM)
774
+ [ 1.00000000000000 -3.00000000000000]
775
+ [-3.00000000000000 1.00000000000000]
776
+ """
777
+ if R is not None:
778
+ return self._matrix.change_ring(R)
779
+ else:
780
+ return self._matrix
781
+
782
+ ##########################################################################
783
+ # Coxeter type methods
784
+
785
+ def index_set(self):
786
+ """
787
+ Return the index set of ``self``.
788
+
789
+ EXAMPLES::
790
+
791
+ sage: C = CoxeterMatrix(['A',1,1])
792
+ sage: C.index_set()
793
+ (0, 1)
794
+ sage: C = CoxeterMatrix(['E',6])
795
+ sage: C.index_set()
796
+ (1, 2, 3, 4, 5, 6)
797
+ """
798
+ return self._index_set
799
+
800
+ def coxeter_type(self):
801
+ """
802
+ Return the Coxeter type of ``self`` or ``self`` if unknown.
803
+
804
+ EXAMPLES::
805
+
806
+ sage: C = CoxeterMatrix(['A',4,1])
807
+ sage: C.coxeter_type()
808
+ Coxeter type of ['A', 4, 1]
809
+
810
+ If the Coxeter type is unknown::
811
+
812
+ sage: C = CoxeterMatrix([[1,3,4], [3,1,-1], [4,-1,1]])
813
+ sage: C.coxeter_type()
814
+ [ 1 3 4]
815
+ [ 3 1 -1]
816
+ [ 4 -1 1]
817
+ """
818
+ if self._coxeter_type is None:
819
+ return self
820
+ return self._coxeter_type
821
+
822
+ def rank(self):
823
+ r"""
824
+ Return the rank of ``self``.
825
+
826
+ EXAMPLES::
827
+
828
+ sage: CoxeterMatrix(['C',3]).rank()
829
+ 3
830
+ sage: CoxeterMatrix(["A2","B2","F4"]).rank()
831
+ 8
832
+ """
833
+ return self._rank
834
+
835
+ def coxeter_matrix(self):
836
+ r"""
837
+ Return the Coxeter matrix of ``self``.
838
+
839
+ EXAMPLES::
840
+
841
+ sage: CoxeterMatrix(['C',3]).coxeter_matrix()
842
+ [1 3 2]
843
+ [3 1 4]
844
+ [2 4 1]
845
+ """
846
+ return self
847
+
848
+ def bilinear_form(self, R=None):
849
+ r"""
850
+ Return the bilinear form of ``self``.
851
+
852
+ EXAMPLES::
853
+
854
+ sage: # needs sage.libs.gap
855
+ sage: CoxeterType(['A', 2, 1]).bilinear_form()
856
+ [ 1 -1/2 -1/2]
857
+ [-1/2 1 -1/2]
858
+ [-1/2 -1/2 1]
859
+ sage: CoxeterType(['H', 3]).bilinear_form()
860
+ [ 1 -1/2 0]
861
+ [ -1/2 1 1/2*E(5)^2 + 1/2*E(5)^3]
862
+ [ 0 1/2*E(5)^2 + 1/2*E(5)^3 1]
863
+ sage: C = CoxeterMatrix([[1,-1,-1],[-1,1,-1],[-1,-1,1]])
864
+ sage: C.bilinear_form()
865
+ [ 1 -1 -1]
866
+ [-1 1 -1]
867
+ [-1 -1 1]
868
+ """
869
+ return CoxeterType.bilinear_form(self, R=R)
870
+
871
+ @cached_method
872
+ def coxeter_graph(self):
873
+ """
874
+ Return the Coxeter graph of ``self``.
875
+
876
+ EXAMPLES::
877
+
878
+ sage: C = CoxeterMatrix(['A',3])
879
+ sage: C.coxeter_graph()
880
+ Graph on 3 vertices
881
+
882
+ sage: C = CoxeterMatrix([['A',3],['A',1]])
883
+ sage: C.coxeter_graph()
884
+ Graph on 4 vertices
885
+ """
886
+ n = self.rank()
887
+ I = self.index_set()
888
+
889
+ def val(x):
890
+ return infinity if x == -1 else x
891
+ G = Graph([(I[i], I[j], val((self._matrix)[i, j]))
892
+ for i in range(n) for j in range(i)
893
+ if self._matrix[i, j] not in [1, 2]],
894
+ format='list_of_edges')
895
+ G.add_vertices(I)
896
+ return G.copy(immutable=True)
897
+
898
+ def is_simply_laced(self):
899
+ """
900
+ Return if ``self`` is simply-laced.
901
+
902
+ A Coxeter matrix is simply-laced if all non-diagonal entries are
903
+ either 2 or 3.
904
+
905
+ EXAMPLES::
906
+
907
+ sage: cm = CoxeterMatrix([[1,3,3,3], [3,1,3,3], [3,3,1,3], [3,3,3,1]])
908
+ sage: cm.is_simply_laced()
909
+ True
910
+ """
911
+ # We include 1 in this list to account for the diagonal
912
+ L = [1, 2, 3]
913
+ return all(x in L for row in self for x in row)
914
+
915
+ def is_crystallographic(self):
916
+ """
917
+ Return whether ``self`` is crystallographic.
918
+
919
+ A Coxeter matrix is crystallographic if all non-diagonal entries
920
+ are either 2, 3, 4, or 6.
921
+
922
+ EXAMPLES::
923
+
924
+ sage: CoxeterMatrix(['F',4]).is_crystallographic()
925
+ True
926
+ sage: CoxeterMatrix(['H',3]).is_crystallographic()
927
+ False
928
+ """
929
+ # We include 1 in this list to account for the diagonal
930
+ L = [1, 2, 3, 4, 6]
931
+ return all(x in L for row in self for x in row)
932
+
933
+ def is_irreducible(self):
934
+ """
935
+ Return whether ``self`` is irreducible.
936
+
937
+ A Coxeter matrix is irreducible if the Coxeter graph is connected.
938
+
939
+ EXAMPLES::
940
+
941
+ sage: CoxeterMatrix([['F',4],['A',1]]).is_irreducible()
942
+ False
943
+ sage: CoxeterMatrix(['H',3]).is_irreducible()
944
+ True
945
+ """
946
+ return self.coxeter_graph().is_connected()
947
+
948
+ def is_finite(self):
949
+ """
950
+ Return if ``self`` is a finite type or ``False`` if unknown.
951
+
952
+ EXAMPLES::
953
+
954
+ sage: M = CoxeterMatrix(['C',4])
955
+ sage: M.is_finite()
956
+ True
957
+ sage: M = CoxeterMatrix(['D',4,1])
958
+ sage: M.is_finite()
959
+ False
960
+ sage: M = CoxeterMatrix([[1, -1], [-1, 1]])
961
+ sage: M.is_finite()
962
+ False
963
+ """
964
+ return self._is_finite
965
+
966
+ def is_affine(self):
967
+ """
968
+ Return if ``self`` is an affine type or ``False`` if unknown.
969
+
970
+ EXAMPLES::
971
+
972
+ sage: M = CoxeterMatrix(['C',4])
973
+ sage: M.is_affine()
974
+ False
975
+ sage: M = CoxeterMatrix(['D',4,1])
976
+ sage: M.is_affine()
977
+ True
978
+ sage: M = CoxeterMatrix([[1, 3],[3,1]])
979
+ sage: M.is_affine()
980
+ False
981
+ sage: M = CoxeterMatrix([[1, -1, 7], [-1, 1, 3], [7, 3, 1]])
982
+ sage: M.is_affine()
983
+ False
984
+ """
985
+ return self._is_affine
986
+
987
+
988
+ #####################################################################
989
+ # Type check functions
990
+
991
+
992
+ def recognize_coxeter_type_from_matrix(coxeter_matrix, index_set):
993
+ """
994
+ Return the Coxeter type of ``coxeter_matrix`` if known,
995
+ otherwise return ``None``.
996
+
997
+ EXAMPLES:
998
+
999
+ Some infinite ones::
1000
+
1001
+ sage: C = CoxeterMatrix([[1,3,2],[3,1,-1],[2,-1,1]])
1002
+ sage: C.is_finite() # indirect doctest
1003
+ False
1004
+ sage: C = CoxeterMatrix([[1,-1,-1],[-1,1,-1],[-1,-1,1]])
1005
+ sage: C.is_finite() # indirect doctest
1006
+ False
1007
+
1008
+ Some finite ones::
1009
+
1010
+ sage: m = matrix(CoxeterMatrix(['D', 4]))
1011
+ sage: CoxeterMatrix(m).is_finite() # indirect doctest
1012
+ True
1013
+ sage: m = matrix(CoxeterMatrix(['H', 4]))
1014
+ sage: CoxeterMatrix(m).is_finite() # indirect doctest
1015
+ True
1016
+
1017
+ sage: CoxeterMatrix(CoxeterType(['A',10]).coxeter_graph()).coxeter_type()
1018
+ Coxeter type of ['A', 10]
1019
+ sage: CoxeterMatrix(CoxeterType(['B',10]).coxeter_graph()).coxeter_type()
1020
+ Coxeter type of ['B', 10]
1021
+ sage: CoxeterMatrix(CoxeterType(['C',10]).coxeter_graph()).coxeter_type()
1022
+ Coxeter type of ['B', 10]
1023
+ sage: CoxeterMatrix(CoxeterType(['D',10]).coxeter_graph()).coxeter_type()
1024
+ Coxeter type of ['D', 10]
1025
+ sage: CoxeterMatrix(CoxeterType(['E',6]).coxeter_graph()).coxeter_type()
1026
+ Coxeter type of ['E', 6]
1027
+ sage: CoxeterMatrix(CoxeterType(['E',7]).coxeter_graph()).coxeter_type()
1028
+ Coxeter type of ['E', 7]
1029
+ sage: CoxeterMatrix(CoxeterType(['E',8]).coxeter_graph()).coxeter_type()
1030
+ Coxeter type of ['E', 8]
1031
+ sage: CoxeterMatrix(CoxeterType(['F',4]).coxeter_graph()).coxeter_type()
1032
+ Coxeter type of ['F', 4]
1033
+ sage: CoxeterMatrix(CoxeterType(['G',2]).coxeter_graph()).coxeter_type()
1034
+ Coxeter type of ['G', 2]
1035
+ sage: CoxeterMatrix(CoxeterType(['H',3]).coxeter_graph()).coxeter_type()
1036
+ Coxeter type of ['H', 3]
1037
+ sage: CoxeterMatrix(CoxeterType(['H',4]).coxeter_graph()).coxeter_type()
1038
+ Coxeter type of ['H', 4]
1039
+ sage: CoxeterMatrix(CoxeterType(['I',100]).coxeter_graph()).coxeter_type()
1040
+ Coxeter type of ['I', 100]
1041
+
1042
+ Some affine graphs::
1043
+
1044
+ sage: CoxeterMatrix(CoxeterType(['A',1,1]).coxeter_graph()).coxeter_type()
1045
+ Coxeter type of ['A', 1, 1]
1046
+ sage: CoxeterMatrix(CoxeterType(['A',10,1]).coxeter_graph()).coxeter_type()
1047
+ Coxeter type of ['A', 10, 1]
1048
+ sage: CoxeterMatrix(CoxeterType(['B',10,1]).coxeter_graph()).coxeter_type()
1049
+ Coxeter type of ['B', 10, 1]
1050
+ sage: CoxeterMatrix(CoxeterType(['C',10,1]).coxeter_graph()).coxeter_type()
1051
+ Coxeter type of ['C', 10, 1]
1052
+ sage: CoxeterMatrix(CoxeterType(['D',10,1]).coxeter_graph()).coxeter_type()
1053
+ Coxeter type of ['D', 10, 1]
1054
+ sage: CoxeterMatrix(CoxeterType(['E',6,1]).coxeter_graph()).coxeter_type()
1055
+ Coxeter type of ['E', 6, 1]
1056
+ sage: CoxeterMatrix(CoxeterType(['E',7,1]).coxeter_graph()).coxeter_type()
1057
+ Coxeter type of ['E', 7, 1]
1058
+ sage: CoxeterMatrix(CoxeterType(['E',8,1]).coxeter_graph()).coxeter_type()
1059
+ Coxeter type of ['E', 8, 1]
1060
+ sage: CoxeterMatrix(CoxeterType(['F',4,1]).coxeter_graph()).coxeter_type()
1061
+ Coxeter type of ['F', 4, 1]
1062
+ sage: CoxeterMatrix(CoxeterType(['G',2,1]).coxeter_graph()).coxeter_type()
1063
+ Coxeter type of ['G', 2, 1]
1064
+
1065
+ TESTS:
1066
+
1067
+ Check that we detect relabellings::
1068
+
1069
+ sage: M = CoxeterMatrix([[1,2,3],[2,1,6],[3,6,1]], index_set=['a', 'b', 'c'])
1070
+ sage: M.coxeter_type()
1071
+ Coxeter type of ['G', 2, 1] relabelled by {0: 'a', 1: 'b', 2: 'c'}
1072
+
1073
+ sage: from sage.combinat.root_system.coxeter_matrix import recognize_coxeter_type_from_matrix
1074
+ sage: for C in CoxeterMatrix.samples():
1075
+ ....: relabelling_perm = Permutations(C.index_set()).random_element()
1076
+ ....: relabelling_dict = {C.index_set()[i]: relabelling_perm[i] for i in range(C.rank())}
1077
+ ....: relabeled_matrix = C.relabel(relabelling_dict)._matrix
1078
+ ....: recognized_type = recognize_coxeter_type_from_matrix(relabeled_matrix, relabelling_perm)
1079
+ ....: if C.is_finite() or C.is_affine():
1080
+ ....: assert recognized_type == C.coxeter_type()
1081
+
1082
+ We check the rank 2 cases (:issue:`20419`)::
1083
+
1084
+ sage: for i in range(2, 10):
1085
+ ....: M = matrix([[1,i],[i,1]])
1086
+ ....: CoxeterMatrix(M).coxeter_type()
1087
+ Coxeter type of A1xA1 relabelled by {1: 2}
1088
+ Coxeter type of ['A', 2]
1089
+ Coxeter type of ['B', 2]
1090
+ Coxeter type of ['I', 5]
1091
+ Coxeter type of ['G', 2]
1092
+ Coxeter type of ['I', 7]
1093
+ Coxeter type of ['I', 8]
1094
+ Coxeter type of ['I', 9]
1095
+ sage: CoxeterMatrix(matrix([[1,-1],[-1,1]]), index_set=[0,1]).coxeter_type()
1096
+ Coxeter type of ['A', 1, 1]
1097
+
1098
+ Check that this works for reducible types with relabellings
1099
+ (:issue:`24892`)::
1100
+
1101
+ sage: CM = CoxeterMatrix([[1,2,5],[2,1,2],[5,2,1]]); CM
1102
+ [1 2 5]
1103
+ [2 1 2]
1104
+ [5 2 1]
1105
+ sage: CM.coxeter_type()
1106
+ Coxeter type of I5 relabelled by {1: 1, 2: 3}xA1 relabelled by {1: 2}
1107
+ """
1108
+ # First, we build the Coxeter graph of the group without the edge labels
1109
+ n = ZZ(coxeter_matrix.nrows())
1110
+ G = Graph([index_set,
1111
+ [(index_set[i], index_set[j], coxeter_matrix[i, j])
1112
+ for i in range(n) for j in range(i, n)
1113
+ if coxeter_matrix[i, j] not in [1, 2]]],
1114
+ format='vertices_and_edges')
1115
+
1116
+ types = []
1117
+ for S in G.connected_components_subgraphs():
1118
+ r = S.num_verts()
1119
+ # Handle the special cases first
1120
+ if r == 1:
1121
+ types.append(CoxeterType(['A', 1]).relabel({1: S.vertices(sort=True)[0]}))
1122
+ continue
1123
+ if r == 2: # Type B2, G2, or I_2(p)
1124
+ e = S.edge_labels()[0]
1125
+ if e == 3: # Can't be 2 because it is connected
1126
+ ct = CoxeterType(['A', 2])
1127
+ elif e == 4:
1128
+ ct = CoxeterType(['B', 2])
1129
+ elif e == 6:
1130
+ ct = CoxeterType(['G', 2])
1131
+ elif e > 0 and e < float('inf'): # Remaining non-affine types
1132
+ ct = CoxeterType(['I', e])
1133
+ else: # Otherwise it is infinite dihedral group Z_2 \ast Z_2
1134
+ ct = CoxeterType(['A', 1, 1])
1135
+ SV = S.vertices(sort=True)
1136
+ if not ct.is_affine():
1137
+ types.append(ct.relabel({1: SV[0],
1138
+ 2: SV[1]}))
1139
+ else:
1140
+ types.append(ct.relabel({0: SV[0],
1141
+ 1: SV[1]}))
1142
+ continue
1143
+
1144
+ test = [['A', r], ['B', r], ['A', r - 1, 1]]
1145
+ if r >= 3:
1146
+ if r == 3:
1147
+ test += [['G', 2, 1], ['H', 3]]
1148
+ test.append(['C', r - 1, 1])
1149
+ if r >= 4:
1150
+ if r == 4:
1151
+ test += [['F', 4], ['H', 4]]
1152
+ test += [['D', r], ['B', r - 1, 1]]
1153
+ if r >= 5:
1154
+ if r == 5:
1155
+ test.append(['F', 4, 1])
1156
+ test.append(['D', r - 1, 1])
1157
+ if r == 6:
1158
+ test.append(['E', 6])
1159
+ elif r == 7:
1160
+ test += [['E', 7], ['E', 6, 1]]
1161
+ elif r == 8:
1162
+ test += [['E', 8], ['E', 7, 1]]
1163
+ elif r == 9:
1164
+ test.append(['E', 8, 1])
1165
+
1166
+ found = False
1167
+ for ct in test:
1168
+ ct = CoxeterType(ct)
1169
+ T = ct.coxeter_graph()
1170
+ iso, match = T.is_isomorphic(S, certificate=True, edge_labels=True)
1171
+ if iso:
1172
+ types.append(ct.relabel(match))
1173
+ found = True
1174
+ break
1175
+ if not found:
1176
+ return None
1177
+
1178
+ return CoxeterType(types)
1179
+
1180
+ #####################################################################
1181
+ # Other functions
1182
+
1183
+
1184
+ def check_coxeter_matrix(m):
1185
+ """
1186
+ Check if ``m`` represents a generalized Coxeter matrix and raise
1187
+ and error if not.
1188
+
1189
+ EXAMPLES::
1190
+
1191
+ sage: from sage.combinat.root_system.coxeter_matrix import check_coxeter_matrix
1192
+ sage: m = matrix([[1,3,2],[3,1,-1],[2,-1,1]])
1193
+ sage: check_coxeter_matrix(m)
1194
+
1195
+ sage: m = matrix([[1,3],[3,1],[2,-1]])
1196
+ sage: check_coxeter_matrix(m)
1197
+ Traceback (most recent call last):
1198
+ ...
1199
+ ValueError: not a square matrix
1200
+
1201
+ sage: m = matrix([[1,3,2],[3,1,-1],[2,-1,2]])
1202
+ sage: check_coxeter_matrix(m)
1203
+ Traceback (most recent call last):
1204
+ ...
1205
+ ValueError: the matrix diagonal is not all 1
1206
+
1207
+ sage: m = matrix([[1,3,3],[3,1,-1],[2,-1,1]])
1208
+ sage: check_coxeter_matrix(m)
1209
+ Traceback (most recent call last):
1210
+ ...
1211
+ ValueError: the matrix is not symmetric
1212
+
1213
+ sage: m = matrix([[1,3,1/2],[3,1,-1],[1/2,-1,1]])
1214
+ sage: check_coxeter_matrix(m)
1215
+ Traceback (most recent call last):
1216
+ ...
1217
+ ValueError: invalid Coxeter label 1/2
1218
+
1219
+ sage: m = matrix([[1,3,1],[3,1,-1],[1,-1,1]])
1220
+ sage: check_coxeter_matrix(m)
1221
+ Traceback (most recent call last):
1222
+ ...
1223
+ ValueError: invalid Coxeter label 1
1224
+ """
1225
+ mat = matrix(m)
1226
+ if not mat.is_square():
1227
+ raise ValueError("not a square matrix")
1228
+ for i, row in enumerate(m):
1229
+ if mat[i, i] != 1:
1230
+ raise ValueError("the matrix diagonal is not all 1")
1231
+ for j, val in enumerate(row[i + 1:]):
1232
+ if val != m[j + i + 1][i]:
1233
+ raise ValueError("the matrix is not symmetric")
1234
+ if val not in ZZ:
1235
+ if val > -1 and val in RR and val != infinity:
1236
+ raise ValueError("invalid Coxeter label {}".format(val))
1237
+ else:
1238
+ if val == 1 or val == 0:
1239
+ raise ValueError("invalid Coxeter label {}".format(val))
1240
+
1241
+
1242
+ def coxeter_matrix_as_function(t):
1243
+ """
1244
+ Return the Coxeter matrix, as a function.
1245
+
1246
+ INPUT:
1247
+
1248
+ - ``t`` -- a Cartan type
1249
+
1250
+ EXAMPLES::
1251
+
1252
+ sage: from sage.combinat.root_system.coxeter_matrix import coxeter_matrix_as_function
1253
+ sage: f = coxeter_matrix_as_function(['A',4])
1254
+ sage: matrix([[f(i,j) for j in range(1,5)] for i in range(1,5)])
1255
+ [1 3 2 2]
1256
+ [3 1 3 2]
1257
+ [2 3 1 3]
1258
+ [2 2 3 1]
1259
+ """
1260
+ m = CartanType(t).coxeter_matrix()
1261
+ return lambda i, j: m[i, j]