passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

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

Potentially problematic release.


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

Files changed (807) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
  6. passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
  7. passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
  8. passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
  9. passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
  10. passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
  11. passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +0 -0
  12. sage/algebras/all__sagemath_modules.py +20 -0
  13. sage/algebras/catalog.py +148 -0
  14. sage/algebras/clifford_algebra.py +3107 -0
  15. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
  16. sage/algebras/clifford_algebra_element.pxd +16 -0
  17. sage/algebras/clifford_algebra_element.pyx +997 -0
  18. sage/algebras/commutative_dga.py +4252 -0
  19. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-gnu.so +0 -0
  20. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  21. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  22. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  29. sage/algebras/finite_gca.py +528 -0
  30. sage/algebras/group_algebra.py +232 -0
  31. sage/algebras/lie_algebras/abelian.py +197 -0
  32. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  33. sage/algebras/lie_algebras/all.py +25 -0
  34. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  35. sage/algebras/lie_algebras/bch.py +177 -0
  36. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  37. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  38. sage/algebras/lie_algebras/center_uea.py +767 -0
  39. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  40. sage/algebras/lie_algebras/examples.py +683 -0
  41. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  42. sage/algebras/lie_algebras/heisenberg.py +820 -0
  43. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  47. sage/algebras/lie_algebras/morphism.py +661 -0
  48. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  49. sage/algebras/lie_algebras/onsager.py +1324 -0
  50. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  51. sage/algebras/lie_algebras/quotient.py +462 -0
  52. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  53. sage/algebras/lie_algebras/representation.py +1040 -0
  54. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  55. sage/algebras/lie_algebras/subalgebra.py +967 -0
  56. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  57. sage/algebras/lie_algebras/verma_module.py +1630 -0
  58. sage/algebras/lie_algebras/virasoro.py +1186 -0
  59. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-gnu.so +0 -0
  60. sage/algebras/octonion_algebra.pxd +20 -0
  61. sage/algebras/octonion_algebra.pyx +987 -0
  62. sage/algebras/orlik_solomon.py +907 -0
  63. sage/algebras/orlik_terao.py +779 -0
  64. sage/algebras/steenrod/all.py +7 -0
  65. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  66. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  67. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  68. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  69. sage/algebras/weyl_algebra.py +1126 -0
  70. sage/all__sagemath_modules.py +62 -0
  71. sage/calculus/all__sagemath_modules.py +19 -0
  72. sage/calculus/expr.py +205 -0
  73. sage/calculus/integration.cpython-314-x86_64-linux-gnu.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-x86_64-linux-gnu.so +0 -0
  84. sage/calculus/riemann.pyx +1521 -0
  85. sage/calculus/test_sympy.py +201 -0
  86. sage/calculus/transforms/all.py +7 -0
  87. sage/calculus/transforms/dft.py +844 -0
  88. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-gnu.so +0 -0
  89. sage/calculus/transforms/dwt.pxd +7 -0
  90. sage/calculus/transforms/dwt.pyx +160 -0
  91. sage/calculus/transforms/fft.cpython-314-x86_64-linux-gnu.so +0 -0
  92. sage/calculus/transforms/fft.pxd +12 -0
  93. sage/calculus/transforms/fft.pyx +487 -0
  94. sage/calculus/wester.py +662 -0
  95. sage/coding/abstract_code.py +1108 -0
  96. sage/coding/ag_code.py +868 -0
  97. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-gnu.so +0 -0
  98. sage/coding/ag_code_decoders.pyx +2639 -0
  99. sage/coding/all.py +15 -0
  100. sage/coding/bch_code.py +494 -0
  101. sage/coding/binary_code.cpython-314-x86_64-linux-gnu.so +0 -0
  102. sage/coding/binary_code.pxd +124 -0
  103. sage/coding/binary_code.pyx +4139 -0
  104. sage/coding/bounds_catalog.py +43 -0
  105. sage/coding/channel.py +819 -0
  106. sage/coding/channels_catalog.py +29 -0
  107. sage/coding/code_bounds.py +755 -0
  108. sage/coding/code_constructions.py +804 -0
  109. sage/coding/codes_catalog.py +111 -0
  110. sage/coding/cyclic_code.py +1329 -0
  111. sage/coding/databases.py +316 -0
  112. sage/coding/decoder.py +373 -0
  113. sage/coding/decoders_catalog.py +88 -0
  114. sage/coding/delsarte_bounds.py +709 -0
  115. sage/coding/encoder.py +390 -0
  116. sage/coding/encoders_catalog.py +64 -0
  117. sage/coding/extended_code.py +468 -0
  118. sage/coding/gabidulin_code.py +1058 -0
  119. sage/coding/golay_code.py +404 -0
  120. sage/coding/goppa_code.py +441 -0
  121. sage/coding/grs_code.py +2371 -0
  122. sage/coding/guava.py +107 -0
  123. sage/coding/guruswami_sudan/all.py +1 -0
  124. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  125. sage/coding/guruswami_sudan/interpolation.py +409 -0
  126. sage/coding/guruswami_sudan/utils.py +176 -0
  127. sage/coding/hamming_code.py +176 -0
  128. sage/coding/information_set_decoder.py +1032 -0
  129. sage/coding/kasami_codes.cpython-314-x86_64-linux-gnu.so +0 -0
  130. sage/coding/kasami_codes.pyx +351 -0
  131. sage/coding/linear_code.py +3067 -0
  132. sage/coding/linear_code_no_metric.py +1354 -0
  133. sage/coding/linear_rank_metric.py +961 -0
  134. sage/coding/parity_check_code.py +353 -0
  135. sage/coding/punctured_code.py +719 -0
  136. sage/coding/reed_muller_code.py +999 -0
  137. sage/coding/self_dual_codes.py +942 -0
  138. sage/coding/source_coding/all.py +2 -0
  139. sage/coding/source_coding/huffman.py +553 -0
  140. sage/coding/subfield_subcode.py +423 -0
  141. sage/coding/two_weight_db.py +399 -0
  142. sage/combinat/all__sagemath_modules.py +7 -0
  143. sage/combinat/cartesian_product.py +347 -0
  144. sage/combinat/family.py +11 -0
  145. sage/combinat/free_module.py +1977 -0
  146. sage/combinat/root_system/all.py +147 -0
  147. sage/combinat/root_system/ambient_space.py +527 -0
  148. sage/combinat/root_system/associahedron.py +471 -0
  149. sage/combinat/root_system/braid_move_calculator.py +143 -0
  150. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-gnu.so +0 -0
  151. sage/combinat/root_system/braid_orbit.pyx +144 -0
  152. sage/combinat/root_system/branching_rules.py +2301 -0
  153. sage/combinat/root_system/cartan_matrix.py +1245 -0
  154. sage/combinat/root_system/cartan_type.py +3069 -0
  155. sage/combinat/root_system/coxeter_group.py +162 -0
  156. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  157. sage/combinat/root_system/coxeter_type.py +681 -0
  158. sage/combinat/root_system/dynkin_diagram.py +900 -0
  159. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  160. sage/combinat/root_system/fundamental_group.py +795 -0
  161. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  162. sage/combinat/root_system/integrable_representations.py +1227 -0
  163. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  164. sage/combinat/root_system/pieri_factors.py +1147 -0
  165. sage/combinat/root_system/plot.py +1615 -0
  166. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  167. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  168. sage/combinat/root_system/root_space.py +487 -0
  169. sage/combinat/root_system/root_system.py +882 -0
  170. sage/combinat/root_system/type_A.py +348 -0
  171. sage/combinat/root_system/type_A_affine.py +227 -0
  172. sage/combinat/root_system/type_A_infinity.py +241 -0
  173. sage/combinat/root_system/type_B.py +347 -0
  174. sage/combinat/root_system/type_BC_affine.py +287 -0
  175. sage/combinat/root_system/type_B_affine.py +216 -0
  176. sage/combinat/root_system/type_C.py +317 -0
  177. sage/combinat/root_system/type_C_affine.py +188 -0
  178. sage/combinat/root_system/type_D.py +357 -0
  179. sage/combinat/root_system/type_D_affine.py +208 -0
  180. sage/combinat/root_system/type_E.py +641 -0
  181. sage/combinat/root_system/type_E_affine.py +231 -0
  182. sage/combinat/root_system/type_F.py +387 -0
  183. sage/combinat/root_system/type_F_affine.py +137 -0
  184. sage/combinat/root_system/type_G.py +293 -0
  185. sage/combinat/root_system/type_G_affine.py +132 -0
  186. sage/combinat/root_system/type_H.py +105 -0
  187. sage/combinat/root_system/type_I.py +110 -0
  188. sage/combinat/root_system/type_Q.py +150 -0
  189. sage/combinat/root_system/type_affine.py +509 -0
  190. sage/combinat/root_system/type_dual.py +704 -0
  191. sage/combinat/root_system/type_folded.py +301 -0
  192. sage/combinat/root_system/type_marked.py +748 -0
  193. sage/combinat/root_system/type_reducible.py +601 -0
  194. sage/combinat/root_system/type_relabel.py +730 -0
  195. sage/combinat/root_system/type_super_A.py +837 -0
  196. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  197. sage/combinat/root_system/weight_space.py +639 -0
  198. sage/combinat/root_system/weyl_characters.py +2238 -0
  199. sage/crypto/__init__.py +4 -0
  200. sage/crypto/all.py +28 -0
  201. sage/crypto/block_cipher/all.py +7 -0
  202. sage/crypto/block_cipher/des.py +1065 -0
  203. sage/crypto/block_cipher/miniaes.py +2171 -0
  204. sage/crypto/block_cipher/present.py +909 -0
  205. sage/crypto/block_cipher/sdes.py +1527 -0
  206. sage/crypto/boolean_function.cpython-314-x86_64-linux-gnu.so +0 -0
  207. sage/crypto/boolean_function.pxd +10 -0
  208. sage/crypto/boolean_function.pyx +1487 -0
  209. sage/crypto/cipher.py +78 -0
  210. sage/crypto/classical.py +3668 -0
  211. sage/crypto/classical_cipher.py +569 -0
  212. sage/crypto/cryptosystem.py +387 -0
  213. sage/crypto/key_exchange/all.py +7 -0
  214. sage/crypto/key_exchange/catalog.py +24 -0
  215. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  216. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  217. sage/crypto/lattice.py +312 -0
  218. sage/crypto/lfsr.py +295 -0
  219. sage/crypto/lwe.py +840 -0
  220. sage/crypto/mq/__init__.py +4 -0
  221. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  222. sage/crypto/mq/rijndael_gf.py +2345 -0
  223. sage/crypto/mq/sbox.py +7 -0
  224. sage/crypto/mq/sr.py +3344 -0
  225. sage/crypto/public_key/all.py +5 -0
  226. sage/crypto/public_key/blum_goldwasser.py +776 -0
  227. sage/crypto/sbox.cpython-314-x86_64-linux-gnu.so +0 -0
  228. sage/crypto/sbox.pyx +2090 -0
  229. sage/crypto/sboxes.py +2090 -0
  230. sage/crypto/stream.py +390 -0
  231. sage/crypto/stream_cipher.py +297 -0
  232. sage/crypto/util.py +519 -0
  233. sage/ext/all__sagemath_modules.py +1 -0
  234. sage/ext/interpreters/__init__.py +1 -0
  235. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  236. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-gnu.so +0 -0
  237. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  238. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  239. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-gnu.so +0 -0
  240. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  241. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  242. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-gnu.so +0 -0
  243. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  244. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  245. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-gnu.so +0 -0
  246. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  247. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  248. sage/geometry/all__sagemath_modules.py +5 -0
  249. sage/geometry/toric_lattice.py +1745 -0
  250. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-gnu.so +0 -0
  251. sage/geometry/toric_lattice_element.pyx +432 -0
  252. sage/groups/abelian_gps/abelian_group.py +1925 -0
  253. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  254. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  255. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  256. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  257. sage/groups/abelian_gps/element_base.py +341 -0
  258. sage/groups/abelian_gps/values.py +488 -0
  259. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  260. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  261. sage/groups/additive_abelian/all.py +4 -0
  262. sage/groups/additive_abelian/qmodnz.py +231 -0
  263. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  264. sage/groups/affine_gps/affine_group.py +535 -0
  265. sage/groups/affine_gps/all.py +1 -0
  266. sage/groups/affine_gps/catalog.py +17 -0
  267. sage/groups/affine_gps/euclidean_group.py +246 -0
  268. sage/groups/affine_gps/group_element.py +562 -0
  269. sage/groups/all__sagemath_modules.py +12 -0
  270. sage/groups/galois_group.py +479 -0
  271. sage/groups/matrix_gps/all.py +4 -0
  272. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  273. sage/groups/matrix_gps/catalog.py +26 -0
  274. sage/groups/matrix_gps/coxeter_group.py +927 -0
  275. sage/groups/matrix_gps/finitely_generated.py +487 -0
  276. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-gnu.so +0 -0
  277. sage/groups/matrix_gps/group_element.pxd +11 -0
  278. sage/groups/matrix_gps/group_element.pyx +431 -0
  279. sage/groups/matrix_gps/linear.py +440 -0
  280. sage/groups/matrix_gps/matrix_group.py +617 -0
  281. sage/groups/matrix_gps/named_group.py +296 -0
  282. sage/groups/matrix_gps/orthogonal.py +544 -0
  283. sage/groups/matrix_gps/symplectic.py +251 -0
  284. sage/groups/matrix_gps/unitary.py +436 -0
  285. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  286. sage/groups/misc_gps/argument_groups.py +1905 -0
  287. sage/groups/misc_gps/imaginary_groups.py +479 -0
  288. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-gnu.so +0 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-gnu.so +0 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  296. sage/homology/algebraic_topological_model.py +595 -0
  297. sage/homology/all.py +2 -0
  298. sage/homology/all__sagemath_modules.py +8 -0
  299. sage/homology/chain_complex.py +2148 -0
  300. sage/homology/chain_complex_homspace.py +165 -0
  301. sage/homology/chain_complex_morphism.py +629 -0
  302. sage/homology/chain_homotopy.py +604 -0
  303. sage/homology/chains.py +653 -0
  304. sage/homology/free_resolution.py +923 -0
  305. sage/homology/graded_resolution.py +567 -0
  306. sage/homology/hochschild_complex.py +756 -0
  307. sage/homology/homology_group.py +188 -0
  308. sage/homology/homology_morphism.py +422 -0
  309. sage/homology/homology_vector_space_with_basis.py +1454 -0
  310. sage/homology/koszul_complex.py +169 -0
  311. sage/homology/matrix_utils.py +205 -0
  312. sage/libs/all__sagemath_modules.py +1 -0
  313. sage/libs/gsl/__init__.py +1 -0
  314. sage/libs/gsl/airy.pxd +56 -0
  315. sage/libs/gsl/all.pxd +66 -0
  316. sage/libs/gsl/array.cpython-314-x86_64-linux-gnu.so +0 -0
  317. sage/libs/gsl/array.pxd +5 -0
  318. sage/libs/gsl/array.pyx +102 -0
  319. sage/libs/gsl/bessel.pxd +208 -0
  320. sage/libs/gsl/blas.pxd +116 -0
  321. sage/libs/gsl/blas_types.pxd +34 -0
  322. sage/libs/gsl/block.pxd +52 -0
  323. sage/libs/gsl/chebyshev.pxd +37 -0
  324. sage/libs/gsl/clausen.pxd +12 -0
  325. sage/libs/gsl/combination.pxd +47 -0
  326. sage/libs/gsl/complex.pxd +151 -0
  327. sage/libs/gsl/coulomb.pxd +30 -0
  328. sage/libs/gsl/coupling.pxd +21 -0
  329. sage/libs/gsl/dawson.pxd +12 -0
  330. sage/libs/gsl/debye.pxd +24 -0
  331. sage/libs/gsl/dilog.pxd +14 -0
  332. sage/libs/gsl/eigen.pxd +46 -0
  333. sage/libs/gsl/elementary.pxd +12 -0
  334. sage/libs/gsl/ellint.pxd +48 -0
  335. sage/libs/gsl/elljac.pxd +8 -0
  336. sage/libs/gsl/erf.pxd +32 -0
  337. sage/libs/gsl/errno.pxd +26 -0
  338. sage/libs/gsl/exp.pxd +44 -0
  339. sage/libs/gsl/expint.pxd +44 -0
  340. sage/libs/gsl/fermi_dirac.pxd +44 -0
  341. sage/libs/gsl/fft.pxd +121 -0
  342. sage/libs/gsl/fit.pxd +50 -0
  343. sage/libs/gsl/gamma.pxd +94 -0
  344. sage/libs/gsl/gegenbauer.pxd +26 -0
  345. sage/libs/gsl/histogram.pxd +176 -0
  346. sage/libs/gsl/hyperg.pxd +52 -0
  347. sage/libs/gsl/integration.pxd +69 -0
  348. sage/libs/gsl/interp.pxd +109 -0
  349. sage/libs/gsl/laguerre.pxd +24 -0
  350. sage/libs/gsl/lambert.pxd +16 -0
  351. sage/libs/gsl/legendre.pxd +90 -0
  352. sage/libs/gsl/linalg.pxd +185 -0
  353. sage/libs/gsl/log.pxd +26 -0
  354. sage/libs/gsl/math.pxd +43 -0
  355. sage/libs/gsl/matrix.pxd +143 -0
  356. sage/libs/gsl/matrix_complex.pxd +130 -0
  357. sage/libs/gsl/min.pxd +67 -0
  358. sage/libs/gsl/monte.pxd +56 -0
  359. sage/libs/gsl/ntuple.pxd +32 -0
  360. sage/libs/gsl/odeiv.pxd +70 -0
  361. sage/libs/gsl/permutation.pxd +78 -0
  362. sage/libs/gsl/poly.pxd +40 -0
  363. sage/libs/gsl/pow_int.pxd +12 -0
  364. sage/libs/gsl/psi.pxd +28 -0
  365. sage/libs/gsl/qrng.pxd +29 -0
  366. sage/libs/gsl/random.pxd +257 -0
  367. sage/libs/gsl/rng.pxd +100 -0
  368. sage/libs/gsl/roots.pxd +72 -0
  369. sage/libs/gsl/sort.pxd +36 -0
  370. sage/libs/gsl/statistics.pxd +59 -0
  371. sage/libs/gsl/sum.pxd +55 -0
  372. sage/libs/gsl/synchrotron.pxd +16 -0
  373. sage/libs/gsl/transport.pxd +24 -0
  374. sage/libs/gsl/trig.pxd +58 -0
  375. sage/libs/gsl/types.pxd +137 -0
  376. sage/libs/gsl/vector.pxd +101 -0
  377. sage/libs/gsl/vector_complex.pxd +83 -0
  378. sage/libs/gsl/wavelet.pxd +49 -0
  379. sage/libs/gsl/zeta.pxd +28 -0
  380. sage/libs/mpc/__init__.pxd +114 -0
  381. sage/libs/mpc/types.pxd +28 -0
  382. sage/libs/mpfr/__init__.pxd +299 -0
  383. sage/libs/mpfr/types.pxd +26 -0
  384. sage/libs/mpmath/__init__.py +1 -0
  385. sage/libs/mpmath/all.py +27 -0
  386. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  387. sage/libs/mpmath/utils.cpython-314-x86_64-linux-gnu.so +0 -0
  388. sage/libs/mpmath/utils.pxd +4 -0
  389. sage/libs/mpmath/utils.pyx +319 -0
  390. sage/matrix/action.cpython-314-x86_64-linux-gnu.so +0 -0
  391. sage/matrix/action.pxd +26 -0
  392. sage/matrix/action.pyx +596 -0
  393. sage/matrix/all.py +9 -0
  394. sage/matrix/args.cpython-314-x86_64-linux-gnu.so +0 -0
  395. sage/matrix/args.pxd +144 -0
  396. sage/matrix/args.pyx +1668 -0
  397. sage/matrix/benchmark.py +1258 -0
  398. sage/matrix/berlekamp_massey.py +95 -0
  399. sage/matrix/compute_J_ideal.py +926 -0
  400. sage/matrix/constructor.cpython-314-x86_64-linux-gnu.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.so +0 -0
  416. sage/matrix/matrix_cdv.pxd +4 -0
  417. sage/matrix/matrix_cdv.pyx +93 -0
  418. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  419. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  420. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  421. sage/matrix/matrix_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  422. sage/matrix/matrix_dense.pxd +5 -0
  423. sage/matrix/matrix_dense.pyx +343 -0
  424. sage/matrix/matrix_domain_dense.pxd +5 -0
  425. sage/matrix/matrix_domain_sparse.pxd +5 -0
  426. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  427. sage/matrix/matrix_double_dense.pxd +7 -0
  428. sage/matrix/matrix_double_dense.pyx +3906 -0
  429. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  430. sage/matrix/matrix_double_sparse.pxd +6 -0
  431. sage/matrix/matrix_double_sparse.pyx +248 -0
  432. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  433. sage/matrix/matrix_generic_dense.pxd +7 -0
  434. sage/matrix/matrix_generic_dense.pyx +354 -0
  435. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  436. sage/matrix/matrix_generic_sparse.pxd +7 -0
  437. sage/matrix/matrix_generic_sparse.pyx +461 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  441. sage/matrix/matrix_misc.py +313 -0
  442. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  443. sage/matrix/matrix_numpy_dense.pxd +14 -0
  444. sage/matrix/matrix_numpy_dense.pyx +450 -0
  445. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  446. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  447. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  448. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  449. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  450. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  451. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  452. sage/matrix/matrix_real_double_dense.pxd +7 -0
  453. sage/matrix/matrix_real_double_dense.pyx +122 -0
  454. sage/matrix/matrix_space.py +2848 -0
  455. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  456. sage/matrix/matrix_sparse.pxd +5 -0
  457. sage/matrix/matrix_sparse.pyx +1222 -0
  458. sage/matrix/matrix_window.cpython-314-x86_64-linux-gnu.so +0 -0
  459. sage/matrix/matrix_window.pxd +37 -0
  460. sage/matrix/matrix_window.pyx +242 -0
  461. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
  462. sage/matrix/misc_mpfr.pyx +80 -0
  463. sage/matrix/operation_table.py +1182 -0
  464. sage/matrix/special.py +3666 -0
  465. sage/matrix/strassen.cpython-314-x86_64-linux-gnu.so +0 -0
  466. sage/matrix/strassen.pyx +851 -0
  467. sage/matrix/symplectic_basis.py +541 -0
  468. sage/matrix/template.pxd +6 -0
  469. sage/matrix/tests.py +71 -0
  470. sage/matroids/advanced.py +77 -0
  471. sage/matroids/all.py +13 -0
  472. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  473. sage/matroids/basis_exchange_matroid.pxd +96 -0
  474. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  475. sage/matroids/basis_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  476. sage/matroids/basis_matroid.pxd +45 -0
  477. sage/matroids/basis_matroid.pyx +1217 -0
  478. sage/matroids/catalog.py +44 -0
  479. sage/matroids/chow_ring.py +473 -0
  480. sage/matroids/chow_ring_ideal.py +849 -0
  481. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  482. sage/matroids/circuit_closures_matroid.pxd +16 -0
  483. sage/matroids/circuit_closures_matroid.pyx +559 -0
  484. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  485. sage/matroids/circuits_matroid.pxd +38 -0
  486. sage/matroids/circuits_matroid.pyx +947 -0
  487. sage/matroids/constructor.py +1086 -0
  488. sage/matroids/database_collections.py +365 -0
  489. sage/matroids/database_matroids.py +5338 -0
  490. sage/matroids/dual_matroid.py +583 -0
  491. sage/matroids/extension.cpython-314-x86_64-linux-gnu.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  495. sage/matroids/flats_matroid.pxd +28 -0
  496. sage/matroids/flats_matroid.pyx +715 -0
  497. sage/matroids/gammoid.py +600 -0
  498. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  499. sage/matroids/graphic_matroid.pxd +39 -0
  500. sage/matroids/graphic_matroid.pyx +2024 -0
  501. sage/matroids/lean_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
  502. sage/matroids/lean_matrix.pxd +126 -0
  503. sage/matroids/lean_matrix.pyx +3667 -0
  504. sage/matroids/linear_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  505. sage/matroids/linear_matroid.pxd +180 -0
  506. sage/matroids/linear_matroid.pyx +6649 -0
  507. sage/matroids/matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  508. sage/matroids/matroid.pxd +243 -0
  509. sage/matroids/matroid.pyx +8759 -0
  510. sage/matroids/matroids_catalog.py +190 -0
  511. sage/matroids/matroids_plot_helpers.py +890 -0
  512. sage/matroids/minor_matroid.py +480 -0
  513. sage/matroids/minorfix.h +9 -0
  514. sage/matroids/named_matroids.py +5 -0
  515. sage/matroids/rank_matroid.py +268 -0
  516. sage/matroids/set_system.cpython-314-x86_64-linux-gnu.so +0 -0
  517. sage/matroids/set_system.pxd +38 -0
  518. sage/matroids/set_system.pyx +800 -0
  519. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  520. sage/matroids/transversal_matroid.pxd +14 -0
  521. sage/matroids/transversal_matroid.pyx +893 -0
  522. sage/matroids/union_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  523. sage/matroids/union_matroid.pxd +20 -0
  524. sage/matroids/union_matroid.pyx +331 -0
  525. sage/matroids/unpickling.cpython-314-x86_64-linux-gnu.so +0 -0
  526. sage/matroids/unpickling.pyx +843 -0
  527. sage/matroids/utilities.py +809 -0
  528. sage/misc/all__sagemath_modules.py +20 -0
  529. sage/misc/c3.cpython-314-x86_64-linux-gnu.so +0 -0
  530. sage/misc/c3.pyx +238 -0
  531. sage/misc/compat.py +87 -0
  532. sage/misc/element_with_label.py +173 -0
  533. sage/misc/func_persist.py +79 -0
  534. sage/misc/pickle_old.cpython-314-x86_64-linux-gnu.so +0 -0
  535. sage/misc/pickle_old.pyx +19 -0
  536. sage/misc/proof.py +7 -0
  537. sage/misc/replace_dot_all.py +472 -0
  538. sage/misc/sagedoc_conf.py +168 -0
  539. sage/misc/sphinxify.py +167 -0
  540. sage/misc/test_class_pickling.py +85 -0
  541. sage/modules/all.py +42 -0
  542. sage/modules/complex_double_vector.py +25 -0
  543. sage/modules/diamond_cutting.py +380 -0
  544. sage/modules/fg_pid/all.py +1 -0
  545. sage/modules/fg_pid/fgp_element.py +456 -0
  546. sage/modules/fg_pid/fgp_module.py +2091 -0
  547. sage/modules/fg_pid/fgp_morphism.py +550 -0
  548. sage/modules/filtered_vector_space.py +1271 -0
  549. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-gnu.so +0 -0
  550. sage/modules/finite_submodule_iter.pxd +27 -0
  551. sage/modules/finite_submodule_iter.pyx +452 -0
  552. sage/modules/fp_graded/all.py +1 -0
  553. sage/modules/fp_graded/element.py +346 -0
  554. sage/modules/fp_graded/free_element.py +298 -0
  555. sage/modules/fp_graded/free_homspace.py +53 -0
  556. sage/modules/fp_graded/free_module.py +1060 -0
  557. sage/modules/fp_graded/free_morphism.py +217 -0
  558. sage/modules/fp_graded/homspace.py +563 -0
  559. sage/modules/fp_graded/module.py +1340 -0
  560. sage/modules/fp_graded/morphism.py +1990 -0
  561. sage/modules/fp_graded/steenrod/all.py +1 -0
  562. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  563. sage/modules/fp_graded/steenrod/module.py +477 -0
  564. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  565. sage/modules/fp_graded/steenrod/profile.py +241 -0
  566. sage/modules/free_module.py +8447 -0
  567. sage/modules/free_module_element.cpython-314-x86_64-linux-gnu.so +0 -0
  568. sage/modules/free_module_element.pxd +22 -0
  569. sage/modules/free_module_element.pyx +5445 -0
  570. sage/modules/free_module_homspace.py +369 -0
  571. sage/modules/free_module_integer.py +896 -0
  572. sage/modules/free_module_morphism.py +823 -0
  573. sage/modules/free_module_pseudohomspace.py +352 -0
  574. sage/modules/free_module_pseudomorphism.py +578 -0
  575. sage/modules/free_quadratic_module.py +1706 -0
  576. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  577. sage/modules/matrix_morphism.py +1745 -0
  578. sage/modules/misc.py +103 -0
  579. sage/modules/module_functors.py +192 -0
  580. sage/modules/multi_filtered_vector_space.py +719 -0
  581. sage/modules/ore_module.py +2208 -0
  582. sage/modules/ore_module_element.py +178 -0
  583. sage/modules/ore_module_homspace.py +147 -0
  584. sage/modules/ore_module_morphism.py +968 -0
  585. sage/modules/quotient_module.py +699 -0
  586. sage/modules/real_double_vector.py +22 -0
  587. sage/modules/submodule.py +255 -0
  588. sage/modules/tensor_operations.py +567 -0
  589. sage/modules/torsion_quadratic_module.py +1352 -0
  590. sage/modules/tutorial_free_modules.py +248 -0
  591. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  592. sage/modules/vector_complex_double_dense.pxd +6 -0
  593. sage/modules/vector_complex_double_dense.pyx +117 -0
  594. sage/modules/vector_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  595. sage/modules/vector_double_dense.pxd +6 -0
  596. sage/modules/vector_double_dense.pyx +604 -0
  597. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  598. sage/modules/vector_integer_dense.pxd +15 -0
  599. sage/modules/vector_integer_dense.pyx +361 -0
  600. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  601. sage/modules/vector_integer_sparse.pxd +29 -0
  602. sage/modules/vector_integer_sparse.pyx +406 -0
  603. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  604. sage/modules/vector_modn_dense.pxd +12 -0
  605. sage/modules/vector_modn_dense.pyx +394 -0
  606. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  607. sage/modules/vector_modn_sparse.pxd +21 -0
  608. sage/modules/vector_modn_sparse.pyx +298 -0
  609. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  610. sage/modules/vector_numpy_dense.pxd +15 -0
  611. sage/modules/vector_numpy_dense.pyx +304 -0
  612. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  613. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  614. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  615. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  616. sage/modules/vector_rational_dense.pxd +15 -0
  617. sage/modules/vector_rational_dense.pyx +387 -0
  618. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  619. sage/modules/vector_rational_sparse.pxd +30 -0
  620. sage/modules/vector_rational_sparse.pyx +413 -0
  621. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  622. sage/modules/vector_real_double_dense.pxd +6 -0
  623. sage/modules/vector_real_double_dense.pyx +126 -0
  624. sage/modules/vector_space_homspace.py +430 -0
  625. sage/modules/vector_space_morphism.py +989 -0
  626. sage/modules/with_basis/all.py +15 -0
  627. sage/modules/with_basis/cell_module.py +494 -0
  628. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-gnu.so +0 -0
  629. sage/modules/with_basis/indexed_element.pxd +13 -0
  630. sage/modules/with_basis/indexed_element.pyx +1058 -0
  631. sage/modules/with_basis/invariant.py +1075 -0
  632. sage/modules/with_basis/morphism.py +1636 -0
  633. sage/modules/with_basis/representation.py +2939 -0
  634. sage/modules/with_basis/subquotient.py +685 -0
  635. sage/numerical/all__sagemath_modules.py +6 -0
  636. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-gnu.so +0 -0
  637. sage/numerical/gauss_legendre.pyx +381 -0
  638. sage/numerical/optimize.py +910 -0
  639. sage/probability/all.py +10 -0
  640. sage/probability/probability_distribution.cpython-314-x86_64-linux-gnu.so +0 -0
  641. sage/probability/probability_distribution.pyx +1242 -0
  642. sage/probability/random_variable.py +411 -0
  643. sage/quadratic_forms/all.py +4 -0
  644. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  645. sage/quadratic_forms/binary_qf.py +2042 -0
  646. sage/quadratic_forms/bqf_class_group.py +748 -0
  647. sage/quadratic_forms/constructions.py +93 -0
  648. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-gnu.so +0 -0
  649. sage/quadratic_forms/count_local_2.pyx +365 -0
  650. sage/quadratic_forms/extras.py +195 -0
  651. sage/quadratic_forms/quadratic_form.py +1753 -0
  652. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  653. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-gnu.so +0 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  656. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  657. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  658. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  659. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  660. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  661. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  662. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  663. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  664. sage/quadratic_forms/random_quadraticform.py +209 -0
  665. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-gnu.so +0 -0
  666. sage/quadratic_forms/ternary.pyx +1154 -0
  667. sage/quadratic_forms/ternary_qf.py +2027 -0
  668. sage/rings/all__sagemath_modules.py +28 -0
  669. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  670. sage/rings/asymptotic/misc.py +1252 -0
  671. sage/rings/cc.py +4 -0
  672. sage/rings/cfinite_sequence.py +1306 -0
  673. sage/rings/complex_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
  674. sage/rings/complex_conversion.pxd +8 -0
  675. sage/rings/complex_conversion.pyx +23 -0
  676. sage/rings/complex_double.cpython-314-x86_64-linux-gnu.so +0 -0
  677. sage/rings/complex_double.pxd +21 -0
  678. sage/rings/complex_double.pyx +2654 -0
  679. sage/rings/complex_mpc.cpython-314-x86_64-linux-gnu.so +0 -0
  680. sage/rings/complex_mpc.pxd +21 -0
  681. sage/rings/complex_mpc.pyx +2576 -0
  682. sage/rings/complex_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
  683. sage/rings/complex_mpfr.pxd +18 -0
  684. sage/rings/complex_mpfr.pyx +3602 -0
  685. sage/rings/derivation.py +2334 -0
  686. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  687. sage/rings/finite_rings/maps_finite_field.py +191 -0
  688. sage/rings/function_field/all__sagemath_modules.py +8 -0
  689. sage/rings/function_field/derivations.py +102 -0
  690. sage/rings/function_field/derivations_rational.py +132 -0
  691. sage/rings/function_field/differential.py +853 -0
  692. sage/rings/function_field/divisor.py +1107 -0
  693. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  694. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  695. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  696. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  697. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  698. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  699. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  700. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.so +0 -0
  703. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  704. sage/rings/invariants/all.py +4 -0
  705. sage/rings/invariants/invariant_theory.py +4597 -0
  706. sage/rings/invariants/reconstruction.py +395 -0
  707. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  708. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-gnu.so +0 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  712. sage/rings/polynomial/ore_function_element.py +952 -0
  713. sage/rings/polynomial/ore_function_field.py +1028 -0
  714. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
  715. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  716. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  717. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  720. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  721. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
  722. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  723. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-gnu.so +0 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-gnu.so +0 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  730. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  731. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-gnu.so +0 -0
  732. sage/rings/real_double_element_gsl.pxd +8 -0
  733. sage/rings/real_double_element_gsl.pyx +794 -0
  734. sage/rings/real_field.py +58 -0
  735. sage/rings/real_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
  736. sage/rings/real_mpfr.pxd +29 -0
  737. sage/rings/real_mpfr.pyx +6122 -0
  738. sage/rings/ring_extension.cpython-314-x86_64-linux-gnu.so +0 -0
  739. sage/rings/ring_extension.pxd +42 -0
  740. sage/rings/ring_extension.pyx +2779 -0
  741. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
  742. sage/rings/ring_extension_conversion.pxd +16 -0
  743. sage/rings/ring_extension_conversion.pyx +462 -0
  744. sage/rings/ring_extension_element.cpython-314-x86_64-linux-gnu.so +0 -0
  745. sage/rings/ring_extension_element.pxd +21 -0
  746. sage/rings/ring_extension_element.pyx +1635 -0
  747. sage/rings/ring_extension_homset.py +64 -0
  748. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-gnu.so +0 -0
  749. sage/rings/ring_extension_morphism.pxd +35 -0
  750. sage/rings/ring_extension_morphism.pyx +920 -0
  751. sage/schemes/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/coherent_sheaf.py +300 -0
  754. sage/schemes/projective/cohomology.py +510 -0
  755. sage/stats/all.py +15 -0
  756. sage/stats/basic_stats.py +489 -0
  757. sage/stats/distributions/all.py +7 -0
  758. sage/stats/distributions/catalog.py +34 -0
  759. sage/stats/distributions/dgs.h +50 -0
  760. sage/stats/distributions/dgs.pxd +111 -0
  761. sage/stats/distributions/dgs_bern.h +400 -0
  762. sage/stats/distributions/dgs_gauss.h +614 -0
  763. sage/stats/distributions/dgs_misc.h +104 -0
  764. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-gnu.so +0 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  767. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  768. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  769. sage/stats/hmm/all.py +15 -0
  770. sage/stats/hmm/chmm.cpython-314-x86_64-linux-gnu.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.so +0 -0
  773. sage/stats/hmm/distributions.pxd +29 -0
  774. sage/stats/hmm/distributions.pyx +531 -0
  775. sage/stats/hmm/hmm.cpython-314-x86_64-linux-gnu.so +0 -0
  776. sage/stats/hmm/hmm.pxd +17 -0
  777. sage/stats/hmm/hmm.pyx +1388 -0
  778. sage/stats/hmm/util.cpython-314-x86_64-linux-gnu.so +0 -0
  779. sage/stats/hmm/util.pxd +7 -0
  780. sage/stats/hmm/util.pyx +165 -0
  781. sage/stats/intlist.cpython-314-x86_64-linux-gnu.so +0 -0
  782. sage/stats/intlist.pxd +14 -0
  783. sage/stats/intlist.pyx +588 -0
  784. sage/stats/r.py +49 -0
  785. sage/stats/time_series.cpython-314-x86_64-linux-gnu.so +0 -0
  786. sage/stats/time_series.pxd +6 -0
  787. sage/stats/time_series.pyx +2546 -0
  788. sage/tensor/all.py +2 -0
  789. sage/tensor/modules/all.py +8 -0
  790. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  791. sage/tensor/modules/comp.py +5598 -0
  792. sage/tensor/modules/ext_pow_free_module.py +824 -0
  793. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  794. sage/tensor/modules/format_utilities.py +333 -0
  795. sage/tensor/modules/free_module_alt_form.py +858 -0
  796. sage/tensor/modules/free_module_automorphism.py +1207 -0
  797. sage/tensor/modules/free_module_basis.py +1074 -0
  798. sage/tensor/modules/free_module_element.py +284 -0
  799. sage/tensor/modules/free_module_homset.py +652 -0
  800. sage/tensor/modules/free_module_linear_group.py +564 -0
  801. sage/tensor/modules/free_module_morphism.py +1581 -0
  802. sage/tensor/modules/free_module_tensor.py +3289 -0
  803. sage/tensor/modules/reflexive_module.py +386 -0
  804. sage/tensor/modules/tensor_free_module.py +780 -0
  805. sage/tensor/modules/tensor_free_submodule.py +538 -0
  806. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  807. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,3069 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ Cartan types
4
+
5
+ .. TODO::
6
+
7
+ Why does sphinx complain if I use sections here?
8
+
9
+ Introduction
10
+
11
+ Loosely speaking, Dynkin diagrams (or equivalently Cartan matrices)
12
+ are graphs which are used to classify root systems, Coxeter and Weyl
13
+ groups, Lie algebras, Lie groups, crystals, etc. up to an
14
+ isomorphism. *Cartan types* are a standard set of names for those
15
+ Dynkin diagrams (see :wikipedia:`Dynkin_diagram`).
16
+
17
+ Let us consider, for example, the Cartan type `A_4`::
18
+
19
+ sage: T = CartanType(['A', 4]); T
20
+ ['A', 4]
21
+
22
+ It is the name of the following Dynkin diagram::
23
+
24
+ sage: DynkinDiagram(T) # needs sage.graphs
25
+ O---O---O---O
26
+ 1 2 3 4
27
+ A4
28
+
29
+ .. NOTE::
30
+
31
+ For convenience, the following shortcuts are available::
32
+
33
+ sage: DynkinDiagram(['A',4]) # needs sage.graphs
34
+ O---O---O---O
35
+ 1 2 3 4
36
+ A4
37
+ sage: DynkinDiagram('A4') # needs sage.graphs
38
+ O---O---O---O
39
+ 1 2 3 4
40
+ A4
41
+ sage: T.dynkin_diagram() # needs sage.graphs
42
+ O---O---O---O
43
+ 1 2 3 4
44
+ A4
45
+
46
+ See :class:`~sage.combinat.root_system.dynkin_diagram.DynkinDiagram`
47
+ for how to further manipulate Dynkin diagrams.
48
+
49
+ From this data (the *Cartan datum*), one can construct the associated
50
+ root system::
51
+
52
+ sage: RootSystem(T)
53
+ Root system of type ['A', 4]
54
+
55
+ The associated Weyl group of `A_n` is the symmetric group `S_{n+1}`::
56
+
57
+ sage: W = WeylGroup(T); W # needs sage.libs.gap
58
+ Weyl Group of type ['A', 4] (as a matrix group acting on the ambient space)
59
+ sage: W.cardinality() # needs sage.libs.gap
60
+ 120
61
+
62
+ while the Lie algebra is `sl_{n+1}`, and the Lie group `SL_{n+1}`
63
+ (TODO: illustrate this once this is implemented).
64
+
65
+ One may also construct crystals associated to various Dynkin diagrams.
66
+ For example::
67
+
68
+ sage: C = crystals.Letters(T); C # needs sage.combinat
69
+ The crystal of letters for type ['A', 4]
70
+ sage: C.list() # needs sage.combinat
71
+ [1, 2, 3, 4, 5]
72
+
73
+ sage: C = crystals.Tableaux(T, shape=[2]); C # needs sage.combinat
74
+ The crystal of tableaux of type ['A', 4] and shape(s) [[2]]
75
+ sage: C.cardinality() # needs sage.combinat
76
+ 15
77
+
78
+ Here is a sample of all the finite irreducible crystallographic Cartan
79
+ types::
80
+
81
+ sage: CartanType.samples(finite=True, crystallographic=True)
82
+ [['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
83
+ ['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2]]
84
+
85
+ One can also get latex representations of the crystallographic Cartan
86
+ types and their corresponding Dynkin diagrams::
87
+
88
+ sage: [latex(ct) for ct in CartanType.samples(crystallographic=True)]
89
+ [A_{1}, A_{5}, B_{1}, B_{5}, C_{1}, C_{5}, D_{2}, D_{3}, D_{5},
90
+ E_6, E_7, E_8, F_4, G_2,
91
+ A_{1}^{(1)}, A_{5}^{(1)}, B_{1}^{(1)}, B_{5}^{(1)},
92
+ C_{1}^{(1)}, C_{5}^{(1)}, D_{3}^{(1)}, D_{5}^{(1)},
93
+ E_6^{(1)}, E_7^{(1)}, E_8^{(1)}, F_4^{(1)}, G_2^{(1)},
94
+ BC_{1}^{(2)}, BC_{5}^{(2)},
95
+ B_{5}^{(1)\vee}, C_{4}^{(1)\vee}, F_4^{(1)\vee},
96
+ G_2^{(1)\vee}, BC_{1}^{(2)\vee}, BC_{5}^{(2)\vee}]
97
+ sage: view([DynkinDiagram(ct) for ct in CartanType.samples(crystallographic=True)]) # not tested
98
+
99
+ Non-crystallographic Cartan types are also partially supported::
100
+
101
+ sage: CartanType.samples(finite=True, crystallographic=False)
102
+ [['I', 5], ['H', 3], ['H', 4]]
103
+
104
+ In Sage, a Cartan type is used as a database of type-specific
105
+ information and algorithms (see e.g. :mod:`sage.combinat.root_system.type_A`).
106
+ This database includes how to construct the Dynkin diagram, the ambient space
107
+ for the root system (see :wikipedia:`Root_system`), and further
108
+ mathematical properties::
109
+
110
+ sage: T.is_finite(), T.is_simply_laced(), T.is_affine(), T.is_crystallographic()
111
+ (True, True, False, True)
112
+
113
+ In particular, a Sage Cartan type is endowed with a fixed choice of
114
+ labels for the nodes of the Dynkin diagram. This choice follows the
115
+ conventions of Nicolas Bourbaki, Lie Groups and Lie Algebras: Chapter 4-6,
116
+ Elements of Mathematics, Springer (2002). ISBN 978-3540426509. For example::
117
+
118
+ sage: T = CartanType(['D', 4])
119
+ sage: DynkinDiagram(T) # needs sage.graphs
120
+ O 4
121
+ |
122
+ |
123
+ O---O---O
124
+ 1 2 3
125
+ D4
126
+
127
+ sage: E6 = CartanType(['E',6])
128
+ sage: DynkinDiagram(E6) # needs sage.graphs
129
+ O 2
130
+ |
131
+ |
132
+ O---O---O---O---O
133
+ 1 3 4 5 6
134
+ E6
135
+
136
+ .. NOTE::
137
+
138
+ The direction of the arrows is the **opposite** (i.e. the transpose)
139
+ of Bourbaki's convention, but agrees with Kac's.
140
+
141
+ For example, in type `C_2`, we have::
142
+
143
+ sage: C2 = DynkinDiagram(['C',2]); C2 # needs sage.graphs
144
+ O=<=O
145
+ 1 2
146
+ C2
147
+ sage: C2.cartan_matrix() # needs sage.graphs
148
+ [ 2 -2]
149
+ [-1 2]
150
+
151
+ However Bourbaki would have the Cartan matrix as:
152
+
153
+ .. MATH::
154
+
155
+ \begin{bmatrix}
156
+ 2 & -1 \\
157
+ -2 & 2
158
+ \end{bmatrix}.
159
+
160
+ If desired, other node labelling conventions can be achieved. For
161
+ example the Kac labelling for type `E_6` can be obtained via::
162
+
163
+ sage: E6.relabel({1:1,2:6,3:2,4:3,5:4,6:5}).dynkin_diagram() # needs sage.graphs
164
+ O 6
165
+ |
166
+ |
167
+ O---O---O---O---O
168
+ 1 2 3 4 5
169
+ E6 relabelled by {1: 1, 2: 6, 3: 2, 4: 3, 5: 4, 6: 5}
170
+
171
+ Contributions implementing other conventions are very welcome.
172
+
173
+ Another option is to build from scratch a new Dynkin diagram. The
174
+ architecture has been designed to make it fairly easy to add other
175
+ labelling conventions. In particular, we strived at choosing type free
176
+ algorithms whenever possible, so in principle most features should
177
+ remain available even with custom Cartan types. This has not been used
178
+ much yet, so some rough corners certainly remain.
179
+
180
+ Here, we construct the hyperbolic example of Exercise 4.9 p. 57 of
181
+ Kac, Infinite Dimensional Lie Algebras. We start with an empty Dynkin
182
+ diagram, and add a couple nodes::
183
+
184
+ sage: g = DynkinDiagram() # needs sage.graphs
185
+ sage: g.add_vertices([1,2,3]) # needs sage.graphs
186
+
187
+ Note that the diagonal of the Cartan matrix is already initialized::
188
+
189
+ sage: g.cartan_matrix() # needs sage.graphs
190
+ [2 0 0]
191
+ [0 2 0]
192
+ [0 0 2]
193
+
194
+ Then we add a couple edges::
195
+
196
+ sage: g.add_edge(1,2,2) # needs sage.graphs
197
+ sage: g.add_edge(1,3) # needs sage.graphs
198
+ sage: g.add_edge(2,3) # needs sage.graphs
199
+
200
+ and we get the desired Cartan matrix::
201
+
202
+ sage: g.cartan_matrix() # needs sage.graphs
203
+ [2 0 0]
204
+ [0 2 0]
205
+ [0 0 2]
206
+
207
+ Oops, the Cartan matrix did not change! This is because it is cached
208
+ for efficiency (see :class:`cached_method`). In general, a Dynkin
209
+ diagram should not be modified after having been used.
210
+
211
+ .. WARNING:: this is not checked currently
212
+
213
+ .. TODO:: add a method :meth:`set_mutable` as, say, for matrices
214
+
215
+ Here, we can work around this by clearing the cache::
216
+
217
+ sage: delattr(g, 'cartan_matrix') # needs sage.graphs
218
+
219
+ Now we get the desired Cartan matrix::
220
+
221
+ sage: g.cartan_matrix() # needs sage.graphs
222
+ [ 2 -1 -1]
223
+ [-2 2 -1]
224
+ [-1 -1 2]
225
+
226
+ Note that backward edges have been automatically added::
227
+
228
+ sage: g.edges(sort=True) # needs sage.graphs
229
+ [(1, 2, 2), (1, 3, 1), (2, 1, 1), (2, 3, 1), (3, 1, 1), (3, 2, 1)]
230
+
231
+ .. rubric:: Reducible Cartan types
232
+
233
+ Reducible Cartan types can be specified by passing a sequence
234
+ or list of irreducible Cartan types::
235
+
236
+ sage: CartanType(['A',2],['B',2])
237
+ A2xB2
238
+ sage: CartanType([['A',2],['B',2]])
239
+ A2xB2
240
+ sage: CartanType(['A',2],['B',2]).is_reducible()
241
+ True
242
+
243
+ or using the following short hand notation::
244
+
245
+ sage: CartanType("A2xB2")
246
+ A2xB2
247
+ sage: CartanType("A2","B2") == CartanType("A2xB2")
248
+ True
249
+
250
+ .. rubric:: Degenerate cases
251
+
252
+ When possible, type `I_n` is automatically converted to the isomorphic
253
+ crystallographic Cartan types (any reason not to do so?)::
254
+
255
+ sage: CartanType(["I",1])
256
+ A1xA1
257
+ sage: CartanType(["I",3])
258
+ ['A', 2]
259
+ sage: CartanType(["I",4])
260
+ ['C', 2]
261
+ sage: CartanType(["I",6])
262
+ ['G', 2]
263
+
264
+ The Dynkin diagrams for types `B_1`, `C_1`, `D_2`, and `D_3` are
265
+ isomorphic to that for `A_1`, `A_1`, `A_1 \times A_1`, and `A_3`,
266
+ respectively. However their natural ambient space realizations (stemming
267
+ from the corresponding infinite families of Lie groups) are different.
268
+ Therefore, the Cartan types are considered as distinct::
269
+
270
+ sage: CartanType(['B',1])
271
+ ['B', 1]
272
+ sage: CartanType(['C',1])
273
+ ['C', 1]
274
+ sage: CartanType(['D',2])
275
+ ['D', 2]
276
+ sage: CartanType(['D',3])
277
+ ['D', 3]
278
+
279
+ .. rubric:: Affine Cartan types
280
+
281
+ For affine types, we use the usual conventions for affine Coxeter
282
+ groups: each affine type is either untwisted (that is arise from the
283
+ natural affinisation of a finite Cartan type)::
284
+
285
+ sage: CartanType(["A", 4, 1]).dynkin_diagram() # needs sage.graphs
286
+ 0
287
+ O-----------+
288
+ | |
289
+ | |
290
+ O---O---O---O
291
+ 1 2 3 4
292
+ A4~
293
+ sage: CartanType(["B", 4, 1]).dynkin_diagram() # needs sage.graphs
294
+ O 0
295
+ |
296
+ |
297
+ O---O---O=>=O
298
+ 1 2 3 4
299
+ B4~
300
+
301
+ or dual thereof::
302
+
303
+ sage: CartanType(["B", 4, 1]).dual().dynkin_diagram() # needs sage.graphs
304
+ O 0
305
+ |
306
+ |
307
+ O---O---O=<=O
308
+ 1 2 3 4
309
+ B4~*
310
+
311
+ or is of type `\widetilde{BC}_n` (which yields an irreducible, but
312
+ nonreduced root system)::
313
+
314
+ sage: CartanType(["BC", 4, 2]).dynkin_diagram() # needs sage.graphs
315
+ O=<=O---O---O=<=O
316
+ 0 1 2 3 4
317
+ BC4~
318
+
319
+ This includes the two degenerate cases::
320
+
321
+ sage: CartanType(["A", 1, 1]).dynkin_diagram() # needs sage.graphs
322
+ O<=>O
323
+ 0 1
324
+ A1~
325
+ sage: CartanType(["BC", 1, 2]).dynkin_diagram() # needs sage.graphs
326
+ 4
327
+ O=<=O
328
+ 0 1
329
+ BC1~
330
+
331
+ For the user convenience, Kac's notations for twisted affine types are
332
+ automatically translated into the previous ones::
333
+
334
+ sage: # needs sage.graphs
335
+ sage: CartanType(["A", 9, 2])
336
+ ['B', 5, 1]^*
337
+ sage: CartanType(["A", 9, 2]).dynkin_diagram()
338
+ O 0
339
+ |
340
+ |
341
+ O---O---O---O=<=O
342
+ 1 2 3 4 5
343
+ B5~*
344
+ sage: CartanType(["A", 10, 2]).dynkin_diagram()
345
+ O=<=O---O---O---O=<=O
346
+ 0 1 2 3 4 5
347
+ BC5~
348
+ sage: CartanType(["D", 5, 2]).dynkin_diagram()
349
+ O=<=O---O---O=>=O
350
+ 0 1 2 3 4
351
+ C4~*
352
+ sage: CartanType(["D", 4, 3]).dynkin_diagram()
353
+ 3
354
+ O=>=O---O
355
+ 2 1 0
356
+ G2~* relabelled by {0: 0, 1: 2, 2: 1}
357
+ sage: CartanType(["E", 6, 2]).dynkin_diagram()
358
+ O---O---O=<=O---O
359
+ 0 1 2 3 4
360
+ F4~*
361
+
362
+ Additionally one can set the notation option to use Kac's notation::
363
+
364
+ sage: # needs sage.graphs
365
+ sage: CartanType.options['notation'] = 'Kac'
366
+ sage: CartanType(["A", 9, 2])
367
+ ['A', 9, 2]
368
+ sage: CartanType(["A", 9, 2]).dynkin_diagram()
369
+ O 0
370
+ |
371
+ |
372
+ O---O---O---O=<=O
373
+ 1 2 3 4 5
374
+ A9^2
375
+ sage: CartanType(["A", 10, 2]).dynkin_diagram()
376
+ O=<=O---O---O---O=<=O
377
+ 0 1 2 3 4 5
378
+ A10^2
379
+ sage: CartanType(["D", 5, 2]).dynkin_diagram()
380
+ O=<=O---O---O=>=O
381
+ 0 1 2 3 4
382
+ D5^2
383
+ sage: CartanType(["D", 4, 3]).dynkin_diagram()
384
+ 3
385
+ O=>=O---O
386
+ 2 1 0
387
+ D4^3
388
+ sage: CartanType(["E", 6, 2]).dynkin_diagram()
389
+ O---O---O=<=O---O
390
+ 0 1 2 3 4
391
+ E6^2
392
+ sage: CartanType.options['notation'] = 'BC'
393
+
394
+ .. rubric:: Infinite Cartan types
395
+
396
+ There are minimal implementations of the Cartan types `A_{\infty}` and
397
+ `A_{+\infty}`. In sage `oo` is the same as `+Infinity`, so `NN` and `ZZ` are
398
+ used to differentiate between the `A_{+\infty}` and `A_{\infty}` root systems::
399
+
400
+ sage: CartanType(['A', NN])
401
+ ['A', NN]
402
+ sage: print(CartanType(['A', NN]).ascii_art())
403
+ O---O---O---O---O---O---O---..
404
+ 0 1 2 3 4 5 6
405
+ sage: CartanType(['A', ZZ])
406
+ ['A', ZZ]
407
+ sage: print(CartanType(['A', ZZ]).ascii_art())
408
+ ..---O---O---O---O---O---O---O---..
409
+ -3 -2 -1 0 1 2 3
410
+
411
+ There are also the following shorthands::
412
+
413
+ sage: CartanType("Aoo")
414
+ ['A', ZZ]
415
+ sage: CartanType("A+oo")
416
+ ['A', NN]
417
+
418
+ .. rubric:: Abstract classes for Cartan types
419
+
420
+ - :class:`CartanType_abstract`
421
+ - :class:`CartanType_crystallographic`
422
+ - :class:`CartanType_simply_laced`
423
+ - :class:`CartanType_simple`
424
+ - :class:`CartanType_finite`
425
+ - :class:`CartanType_affine` (see also :ref:`sage.combinat.root_system.type_affine`)
426
+ - :obj:`sage.combinat.root_system.cartan_type.CartanType`
427
+ - :ref:`sage.combinat.root_system.type_dual`
428
+ - :ref:`sage.combinat.root_system.type_reducible`
429
+ - :ref:`sage.combinat.root_system.type_relabel`
430
+
431
+ Concrete classes for Cartan types
432
+
433
+ - :class:`CartanType_standard`
434
+ - :class:`CartanType_standard_finite`
435
+ - :class:`CartanType_standard_affine`
436
+ - :class:`CartanType_standard_untwisted_affine`
437
+
438
+ Type specific data
439
+
440
+ The data essentially consists of a description of the Dynkin/Coxeter
441
+ diagram and, when relevant, of the natural embedding of the root
442
+ system in a Euclidean space. Everything else is reconstructed from
443
+ this data.
444
+
445
+ - :ref:`sage.combinat.root_system.type_A`
446
+ - :ref:`sage.combinat.root_system.type_B`
447
+ - :ref:`sage.combinat.root_system.type_C`
448
+ - :ref:`sage.combinat.root_system.type_D`
449
+ - :ref:`sage.combinat.root_system.type_E`
450
+ - :ref:`sage.combinat.root_system.type_F`
451
+ - :ref:`sage.combinat.root_system.type_G`
452
+ - :ref:`sage.combinat.root_system.type_H`
453
+ - :ref:`sage.combinat.root_system.type_I`
454
+ - :ref:`sage.combinat.root_system.type_super_A`
455
+ - :ref:`sage.combinat.root_system.type_Q`
456
+ - :ref:`sage.combinat.root_system.type_A_affine`
457
+ - :ref:`sage.combinat.root_system.type_B_affine`
458
+ - :ref:`sage.combinat.root_system.type_C_affine`
459
+ - :ref:`sage.combinat.root_system.type_D_affine`
460
+ - :ref:`sage.combinat.root_system.type_E_affine`
461
+ - :ref:`sage.combinat.root_system.type_F_affine`
462
+ - :ref:`sage.combinat.root_system.type_G_affine`
463
+ - :ref:`sage.combinat.root_system.type_BC_affine`
464
+ - :ref:`sage.combinat.root_system.type_A_infinity`
465
+
466
+ .. TODO:: Should those indexes come before the introduction?
467
+ """
468
+ # ****************************************************************************
469
+ # Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
470
+ # Copyright (C) 2008-2009 Nicolas M. Thiery <nthiery at users.sf.net>,
471
+ #
472
+ # This program is free software: you can redistribute it and/or modify
473
+ # it under the terms of the GNU General Public License as published by
474
+ # the Free Software Foundation, either version 2 of the License, or
475
+ # (at your option) any later version.
476
+ # https://www.gnu.org/licenses/
477
+ # ****************************************************************************
478
+
479
+ from sage.misc.cachefunc import cached_method
480
+ from sage.misc.abstract_method import abstract_method
481
+ from sage.misc.lazy_import import LazyImport
482
+ from sage.rings.integer_ring import ZZ
483
+ from sage.rings.infinity import Infinity
484
+ from sage.structure.sage_object import SageObject
485
+ from sage.structure.unique_representation import UniqueRepresentation
486
+ from sage.structure.global_options import GlobalOptions
487
+ from sage.sets.family import Family
488
+
489
+ # TODO:
490
+ # Implement the Kac conventions by relabeling/dual/... of the above
491
+ # Implement Coxeter diagrams for non crystallographic
492
+
493
+
494
+ # Intention: we want simultaneously CartanType to be a factory for
495
+ # the various subtypes of CartanType_abstract, as in:
496
+ # CartanType(["A",4,1])
497
+ # and to behaves as a "module" for some extra utilities:
498
+ # CartanType.samples()
499
+ #
500
+ # Implementation: CartanType is the unique instance of this class
501
+ # CartanTypeFactory. Is there a better/more standard way to do it?
502
+
503
+ class CartanTypeFactory(SageObject):
504
+
505
+ def __call__(self, *args):
506
+ """
507
+ Construct a Cartan type object.
508
+
509
+ INPUT:
510
+
511
+ - ``[letter, rank]`` -- letter is one of 'A', 'B', 'C', 'D', 'E', 'F', 'G'
512
+ and rank is an integer or a pair of integers
513
+
514
+ - ``[letter, rank, twist]`` -- letter is one of 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'BC'
515
+ and rank and twist are integers
516
+
517
+ - ``str`` -- string
518
+
519
+ - ``object`` -- a Cartan type, or an object with a Cartan type method
520
+
521
+ EXAMPLES:
522
+
523
+ We construct the Cartan type `D_4`::
524
+
525
+ sage: d4 = CartanType(['D',4])
526
+ sage: d4
527
+ ['D', 4]
528
+
529
+ or, for short::
530
+
531
+ sage: CartanType("D4")
532
+ ['D', 4]
533
+
534
+ .. SEEALSO:: :func:`~sage.combinat.root_system.cartan_type.CartanType`
535
+
536
+ TESTS:
537
+
538
+ Check that this is compatible with :class:`CartanTypeFolded`::
539
+
540
+ sage: fct = CartanType(['C', 4, 1]).as_folding()
541
+ sage: CartanType(fct)
542
+ ['C', 4, 1]
543
+
544
+ Check that :issue:`13774` is fixed::
545
+
546
+ sage: CT = CartanType([['A',2]])
547
+ sage: CT.is_irreducible()
548
+ True
549
+ sage: CT.cartan_matrix() # needs sage.graphs
550
+ [ 2 -1]
551
+ [-1 2]
552
+ sage: CT = CartanType(['A2'])
553
+ sage: CT.is_irreducible()
554
+ True
555
+ sage: CartanType('A2')
556
+ ['A', 2]
557
+
558
+ Check that we can pass any Cartan type as a single element list::
559
+
560
+ sage: CT = CartanType(['A2', 'A2', 'A2'])
561
+ sage: CartanType([CT])
562
+ A2xA2xA2
563
+
564
+ sage: CT = CartanType('A2').relabel({1:-1, 2:-2})
565
+ sage: CartanType([CT])
566
+ ['A', 2] relabelled by {1: -1, 2: -2}
567
+
568
+ Check the errors from :issue:`20973`::
569
+
570
+ sage: CartanType(['A',-1])
571
+ Traceback (most recent call last):
572
+ ...
573
+ ValueError: ['A', -1] is not a valid Cartan type
574
+
575
+ Check that unicode is handled properly (:issue:`23323`)::
576
+
577
+ sage: CartanType(u"A3")
578
+ ['A', 3]
579
+ """
580
+ if len(args) == 1:
581
+ t = args[0]
582
+ else:
583
+ t = args
584
+
585
+ if isinstance(t, (CartanType_abstract, SuperCartanType_standard)):
586
+ return t
587
+ if hasattr(t, "cartan_type"):
588
+ return t.cartan_type()
589
+
590
+ if len(t) == 1: # Fix for trac #13774
591
+ t = t[0]
592
+
593
+ # We need to make another check
594
+ if isinstance(t, (CartanType_abstract, SuperCartanType_standard)):
595
+ return t
596
+
597
+ from sage.rings.semirings.non_negative_integer_semiring import NN
598
+ if isinstance(t, str):
599
+ if "x" in t:
600
+ from . import type_reducible
601
+ return type_reducible.CartanType([CartanType(u) for u in t.split("x")])
602
+ elif t[-1] == "*":
603
+ return CartanType(t[:-1]).dual()
604
+ elif t[-1] == "~":
605
+ return CartanType(t[:-1]).affine()
606
+ elif t in ["Aoo", "A∞"]:
607
+ return CartanType(['A', Infinity])
608
+ elif t == "A+oo":
609
+ from . import type_A_infinity
610
+ return type_A_infinity.CartanType(NN)
611
+ else:
612
+ return CartanType([t[0], eval(t[1:])])
613
+
614
+ t = list(t)
615
+ if isinstance(t[0], str) and t[1] in [Infinity, ZZ, NN]:
616
+ letter, n = t[0], t[1]
617
+ if letter == 'A':
618
+ from . import type_A_infinity
619
+ if t[1] == NN:
620
+ return type_A_infinity.CartanType(NN)
621
+ else:
622
+ return type_A_infinity.CartanType(ZZ)
623
+
624
+ if isinstance(t[0], str) and t[1] in ZZ and t[1] >= 0:
625
+ letter, n = t[0], t[1]
626
+ if len(t) == 2:
627
+ if letter == "A":
628
+ if n >= 0:
629
+ from . import type_A
630
+ return type_A.CartanType(n)
631
+ if letter == "B":
632
+ if n >= 1:
633
+ from . import type_B
634
+ return type_B.CartanType(n)
635
+ if letter == "C":
636
+ if n >= 1:
637
+ from . import type_C
638
+ return type_C.CartanType(n)
639
+ if letter == "D":
640
+ from . import type_D
641
+ if n >= 2:
642
+ return type_D.CartanType(n)
643
+ if letter == "E":
644
+ if n >= 6 and n <= 8:
645
+ from . import type_E
646
+ return type_E.CartanType(n)
647
+ if letter == "F":
648
+ if n == 4:
649
+ from . import type_F
650
+ return type_F.CartanType()
651
+ if letter == "G":
652
+ if n == 2:
653
+ from . import type_G
654
+ return type_G.CartanType()
655
+ if letter == "H":
656
+ if n in [3, 4]:
657
+ from . import type_H
658
+ return type_H.CartanType(n)
659
+ if letter == "I":
660
+ if n == 1:
661
+ return CartanType([["A", 1], ["A", 1]])
662
+ if n == 3:
663
+ return CartanType(["A", 2])
664
+ if n == 4:
665
+ return CartanType(["C", 2])
666
+ if n == 6:
667
+ return CartanType(["G", 2])
668
+ if n >= 1:
669
+ from . import type_I
670
+ return type_I.CartanType(n)
671
+ if letter == "Q":
672
+ if n >= 1:
673
+ from . import type_Q
674
+ return type_Q.CartanType(n)
675
+
676
+ if len(t) == 3:
677
+ if t[2] == 1: # Untwisted affine
678
+ if letter == "A":
679
+ if n >= 1:
680
+ from . import type_A_affine
681
+ return type_A_affine.CartanType(n)
682
+ if letter == "B":
683
+ if n >= 1:
684
+ from . import type_B_affine
685
+ return type_B_affine.CartanType(n)
686
+ if letter == "C":
687
+ if n >= 1:
688
+ from . import type_C_affine
689
+ return type_C_affine.CartanType(n)
690
+ if letter == "D":
691
+ from . import type_D_affine
692
+ if n >= 3:
693
+ return type_D_affine.CartanType(n)
694
+ if letter == "E":
695
+ if n >= 6 and n <= 8:
696
+ from . import type_E_affine
697
+ return type_E_affine.CartanType(n)
698
+ if letter == "F":
699
+ if n == 4:
700
+ from . import type_F_affine
701
+ return type_F_affine.CartanType()
702
+ if letter == "G":
703
+ if n == 2:
704
+ from . import type_G_affine
705
+ return type_G_affine.CartanType()
706
+ if t[2] in [2,3]:
707
+ if letter == "BC" and t[2] == 2:
708
+ if n >= 1:
709
+ from . import type_BC_affine
710
+ return type_BC_affine.CartanType(n)
711
+ if letter == "A" and t[2] == 2:
712
+ if n % 2 == 0: # Kac' A_2n^(2)
713
+ return CartanType(["BC", ZZ(n//2), 2])
714
+ else: # Kac' A_2n-1^(2)
715
+ return CartanType(["B", ZZ((n+1)//2), 1]).dual()
716
+ if letter == "D" and t[2] == 2:
717
+ return CartanType(["C", n-1, 1]).dual()
718
+ if letter == "D" and t[2] == 3 and n == 4:
719
+ return CartanType(["G", 2, 1]).dual().relabel([0,2,1])
720
+ if letter == "E" and t[2] == 2 and n == 6:
721
+ return CartanType(["F", 4, 1]).dual()
722
+ raise ValueError("%s is not a valid Cartan type" % t)
723
+
724
+ if isinstance(t[0], str) and isinstance(t[1], (list, tuple)):
725
+ letter, n = t[0], t[1]
726
+ if len(t) == 2 and len(n) == 2:
727
+ from . import type_super_A
728
+ return type_super_A.CartanType(n[0], n[1])
729
+ raise ValueError("%s is not a valid super Cartan type" % t)
730
+
731
+ # As the Cartan type has not been recognised try subtypes - but check
732
+ # for the error noted in trac:???
733
+ from . import type_reducible
734
+ try:
735
+ return type_reducible.CartanType([ CartanType(subtype) for subtype in t ])
736
+ except (SyntaxError, ValueError):
737
+ raise ValueError("%s is not a valid Cartan type" % t)
738
+
739
+ def _repr_(self):
740
+ """
741
+ EXAMPLES::
742
+
743
+ sage: CartanType # indirect doctest
744
+ CartanType
745
+ """
746
+ return "CartanType"
747
+
748
+ def samples(self, finite=None, affine=None, crystallographic=None):
749
+ """
750
+ Return a sample of the available Cartan types.
751
+
752
+ INPUT:
753
+
754
+ - ``finite`` -- boolean or ``None`` (default: ``None``)
755
+
756
+ - ``affine`` -- boolean or ``None`` (default: ``None``)
757
+
758
+ - ``crystallographic`` -- boolean or ``None`` (default: ``None``)
759
+
760
+ The sample contains all the exceptional finite and affine
761
+ Cartan types, as well as typical representatives of the
762
+ infinite families.
763
+
764
+ EXAMPLES::
765
+
766
+ sage: CartanType.samples()
767
+ [['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
768
+ ['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2], ['I', 5], ['H', 3], ['H', 4],
769
+ ['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
770
+ ['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
771
+ ['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
772
+ ['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
773
+
774
+ The finite, affine and crystallographic options allow
775
+ respectively for restricting to (non) finite, (non) affine,
776
+ and (non) crystallographic Cartan types::
777
+
778
+ sage: CartanType.samples(finite=True)
779
+ [['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
780
+ ['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2], ['I', 5], ['H', 3], ['H', 4]]
781
+
782
+ sage: CartanType.samples(affine=True)
783
+ [['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
784
+ ['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
785
+ ['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
786
+ ['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
787
+
788
+ sage: CartanType.samples(crystallographic=True)
789
+ [['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
790
+ ['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2],
791
+ ['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
792
+ ['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
793
+ ['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
794
+ ['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
795
+
796
+ sage: CartanType.samples(crystallographic=False)
797
+ [['I', 5], ['H', 3], ['H', 4]]
798
+
799
+ .. TODO:: add some reducible Cartan types (suggestions?)
800
+
801
+ TESTS::
802
+
803
+ sage: for ct in CartanType.samples(): TestSuite(ct).run()
804
+ """
805
+ result = self._samples()
806
+ if crystallographic is not None:
807
+ result = [t for t in result if t.is_crystallographic() == crystallographic ]
808
+ if finite is not None:
809
+ result = [t for t in result if t.is_finite() == finite]
810
+ if affine is not None:
811
+ result = [t for t in result if t.is_affine() == affine]
812
+ return result
813
+
814
+ @cached_method
815
+ def _samples(self):
816
+ """
817
+ Return a sample of all implemented Cartan types.
818
+
819
+ .. NOTE:: This is intended to be used through :meth:`samples`.
820
+
821
+ EXAMPLES::
822
+
823
+ sage: CartanType._samples()
824
+ [['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
825
+ ['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2], ['I', 5], ['H', 3], ['H', 4],
826
+ ['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
827
+ ['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
828
+ ['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
829
+ ['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
830
+ """
831
+ finite_crystallographic = [CartanType(t)
832
+ for t in [['A', 1], ['A', 5], ['B', 1], ['B', 5],
833
+ ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
834
+ ["E", 6], ["E", 7], ["E", 8],
835
+ ["F", 4],
836
+ ["G", 2]]]
837
+
838
+ # Support for hand constructed Dynkin diagrams as Cartan types is not yet ready enough for including an example here.
839
+ # from sage.combinat.root_system.dynkin_diagram import DynkinDiagram_class
840
+ # g = DynkinDiagram_class.an_instance()
841
+ return finite_crystallographic + \
842
+ [CartanType(t) for t in [["I", 5], ["H", 3], ["H", 4]]] + \
843
+ [t.affine() for t in finite_crystallographic if t.is_irreducible()] + \
844
+ [CartanType(t) for t in [["BC", 1, 2], ["BC", 5, 2]]] + \
845
+ [CartanType(t).dual() for t in [["B", 5, 1], ["C", 4, 1],
846
+ ["F", 4, 1], ["G", 2, 1],
847
+ ["BC", 1, 2], ["BC", 5, 2]]] # + \
848
+ # [ g ]
849
+
850
+ _colors = {1: 'blue', -1: 'blue',
851
+ 2: 'red', -2: 'red',
852
+ 3: 'green', -3: 'green',
853
+ 4: 'cyan', -4: 'cyan',
854
+ 5: 'magenta', -5: 'magenta',
855
+ 6: 'yellow', -6: 'yellow'}
856
+
857
+ @classmethod
858
+ def color(cls, i):
859
+ """
860
+ Default color scheme for the vertices of a Dynkin diagram (and associated objects).
861
+
862
+ EXAMPLES::
863
+
864
+ sage: CartanType.color(1)
865
+ 'blue'
866
+ sage: CartanType.color(2)
867
+ 'red'
868
+ sage: CartanType.color(3)
869
+ 'green'
870
+
871
+ The default color is black::
872
+
873
+ sage: CartanType.color(0)
874
+ 'black'
875
+
876
+ Negative indices get the same color as their positive counterparts::
877
+
878
+ sage: CartanType.color(-1)
879
+ 'blue'
880
+ sage: CartanType.color(-2)
881
+ 'red'
882
+ sage: CartanType.color(-3)
883
+ 'green'
884
+ """
885
+ return cls._colors.get(i, 'black')
886
+
887
+ # add options to class
888
+ class options(GlobalOptions):
889
+ r"""
890
+ Set and display the options for Cartan types. If no parameters
891
+ are set, then the function returns a copy of the options dictionary.
892
+
893
+ The ``options`` to partitions can be accessed as the method
894
+ :obj:`CartanType.options` of
895
+ :class:`CartanType <CartanTypeFactory>`.
896
+
897
+ @OPTIONS@
898
+
899
+ EXAMPLES::
900
+
901
+ sage: ct = CartanType(['D',5,2]); ct
902
+ ['C', 4, 1]^*
903
+ sage: ct.dynkin_diagram() # needs sage.graphs
904
+ O=<=O---O---O=>=O
905
+ 0 1 2 3 4
906
+ C4~*
907
+ sage: latex(ct)
908
+ C_{4}^{(1)\vee}
909
+ sage: CartanType.options(dual_str='#', dual_latex='\\ast',)
910
+ sage: ct
911
+ ['C', 4, 1]^#
912
+ sage: ct.dynkin_diagram() # needs sage.graphs
913
+ O=<=O---O---O=>=O
914
+ 0 1 2 3 4
915
+ C4~#
916
+ sage: latex(ct)
917
+ C_{4}^{(1)\ast}
918
+ sage: CartanType.options(notation='kac', mark_special_node='both')
919
+ sage: ct
920
+ ['D', 5, 2]
921
+ sage: ct.dynkin_diagram() # needs sage.graphs
922
+ @=<=O---O---O=>=O
923
+ 0 1 2 3 4
924
+ D5^2
925
+ sage: latex(ct)
926
+ D_{5}^{(2)}
927
+
928
+ For type `A_{2n}^{(2)\dagger}`, the dual string/latex options are
929
+ automatically overridden::
930
+
931
+ sage: dct = CartanType(['A',8,2]).dual(); dct
932
+ ['A', 8, 2]^+
933
+ sage: latex(dct)
934
+ A_{8}^{(2)\dagger}
935
+ sage: dct.dynkin_diagram() # needs sage.graphs
936
+ @=>=O---O---O=>=O
937
+ 0 1 2 3 4
938
+ A8^2+
939
+ sage: CartanType.options._reset()
940
+ """
941
+ NAME = 'CartanType'
942
+ module = 'sage.combinat.root_system.cartan_type'
943
+ option_class = 'CartanTypeFactory'
944
+ notation = dict(default='Stembridge',
945
+ description='Specifies which notation Cartan types should use when printed',
946
+ values=dict(Stembridge="use Stembridge's notation",
947
+ Kac="use Kac's notation"),
948
+ case_sensitive=False,
949
+ alias=dict(BC='Stembridge', tilde='Stembridge', twisted='Kac'))
950
+ dual_str = dict(default='*',
951
+ description='The string used for dual Cartan types when printing',
952
+ checker=lambda char: isinstance(char, str))
953
+ dual_latex = dict(default='\\vee',
954
+ description='The latex used for dual CartanTypes when latexing',
955
+ checker=lambda char: isinstance(char, str))
956
+ mark_special_node = dict(default='none',
957
+ description="Make the special nodes",
958
+ values=dict(none="no markup", latex="only in latex",
959
+ printing="only in printing", both="both in latex and printing"),
960
+ case_sensitive=False)
961
+ special_node_str = dict(default='@',
962
+ description="The string used to indicate which node is special when printing",
963
+ checker=lambda char: isinstance(char, str))
964
+ marked_node_str = dict(default='X',
965
+ description="The string used to indicate a marked node when printing",
966
+ checker=lambda char: isinstance(char, str))
967
+ latex_relabel = dict(default=True,
968
+ description="Indicate in the latex output if a Cartan type has been relabelled",
969
+ checker=lambda x: isinstance(x, bool))
970
+ latex_marked = dict(default=True,
971
+ description="Indicate in the latex output if a Cartan type has been marked",
972
+ checker=lambda x: isinstance(x, bool))
973
+
974
+
975
+ CartanType = CartanTypeFactory()
976
+ CartanType.__doc__ = __doc__
977
+
978
+
979
+ class CartanType_abstract:
980
+ r"""
981
+ Abstract class for Cartan types
982
+
983
+ Subclasses should implement:
984
+
985
+ - :meth:`dynkin_diagram()`
986
+
987
+ - :meth:`cartan_matrix()`
988
+
989
+ - :meth:`is_finite()`
990
+
991
+ - :meth:`is_affine()`
992
+
993
+ - :meth:`is_irreducible()`
994
+ """
995
+
996
+ def type(self):
997
+ r"""
998
+ Return the type of ``self``, or ``None`` if unknown.
999
+
1000
+ This method should be overridden in any subclass.
1001
+
1002
+ EXAMPLES::
1003
+
1004
+ sage: from sage.combinat.root_system.cartan_type import CartanType_abstract
1005
+ sage: C = CartanType_abstract()
1006
+ sage: C.type() is None
1007
+ True
1008
+ """
1009
+ return None
1010
+
1011
+ def _add_abstract_superclass(self, classes):
1012
+ """
1013
+ Add abstract super-classes to the class of ``self``.
1014
+
1015
+ INPUT:
1016
+
1017
+ - ``classes`` -- an abstract class or tuple thereof
1018
+
1019
+ EXAMPLES::
1020
+
1021
+ sage: C = CartanType(["A",3,1])
1022
+ sage: class MyCartanType:
1023
+ ....: def my_method(self):
1024
+ ....: return 'I am here!'
1025
+ sage: C._add_abstract_superclass(MyCartanType)
1026
+ sage: C.__class__
1027
+ <class 'sage.combinat.root_system.type_A_affine.CartanType_with_superclass_with_superclass'>
1028
+ sage: C.__class__.__bases__
1029
+ (<class 'sage.combinat.root_system.type_A_affine.CartanType_with_superclass'>,
1030
+ <class ...__main__.MyCartanType...>)
1031
+ sage: C.my_method()
1032
+ 'I am here!'
1033
+
1034
+ .. TODO:: Generalize to :class:`SageObject`?
1035
+ """
1036
+ from sage.structure.dynamic_class import dynamic_class
1037
+ assert isinstance(classes, (tuple, type))
1038
+ if not isinstance(classes, tuple):
1039
+ classes = (classes,)
1040
+ bases = (self.__class__,) + classes
1041
+ self.__class__ = dynamic_class(self.__class__.__name__+"_with_superclass", bases)
1042
+
1043
+ def _ascii_art_node(self, label):
1044
+ """
1045
+ Return the ascii art for the node labelled by ``label``.
1046
+
1047
+ EXAMPLES::
1048
+
1049
+ sage: CartanType(['A',3])._ascii_art_node(2)
1050
+ 'O'
1051
+ """
1052
+ return "O"
1053
+
1054
+ def _latex_draw_node(self, x, y, label, position='below=4pt', fill='white'):
1055
+ r"""
1056
+ Draw (possibly marked [crossed out]) circular node ``i`` at the
1057
+ position ``(x,y)`` with node label ``label`` .
1058
+
1059
+ - ``position`` -- position of the label relative to the node
1060
+ - ``anchor`` -- (optional) the anchor point for the label
1061
+
1062
+ EXAMPLES::
1063
+
1064
+ sage: CartanType(['A',3])._latex_draw_node(0, 0, 1)
1065
+ '\\draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$};\n'
1066
+ """
1067
+ return "\\draw[fill={}] ({} cm, {} cm) circle (.25cm) node[{}]{{${}$}};\n".format(
1068
+ fill, x, y, position, label)
1069
+
1070
+ def _latex_draw_arrow_tip(self, x, y, rot=0):
1071
+ r"""
1072
+ Draw an arrow tip at the point ``(x, y)`` rotated by ``rot``.
1073
+
1074
+ INPUT:
1075
+
1076
+ - ``(x, y)`` -- the coordinates of a point, in cm
1077
+
1078
+ - ``rot`` -- an angle, in degrees
1079
+
1080
+ This is an internal function used to assist drawing the Dynkin
1081
+ diagrams. See e.g. :meth:`~sage.combinat.root_system.type_B.CartanType._latex_dynkin_diagram`.
1082
+
1083
+ EXAMPLES::
1084
+
1085
+ sage: CartanType(['B',2])._latex_draw_arrow_tip(1, 0, 180)
1086
+ '\\draw[shift={(1, 0)}, rotate=180] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm);\n'
1087
+ """
1088
+ return "\\draw[shift={(%s, %s)}, rotate=%s] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm);\n" % (x, y, rot)
1089
+
1090
+ @abstract_method
1091
+ def rank(self):
1092
+ """
1093
+ Return the rank of ``self``.
1094
+
1095
+ This is the number of nodes of the associated Coxeter or
1096
+ Dynkin diagram.
1097
+
1098
+ EXAMPLES::
1099
+
1100
+ sage: CartanType(['A', 4]).rank()
1101
+ 4
1102
+ sage: CartanType(['A', 7, 2]).rank()
1103
+ 5
1104
+ sage: CartanType(['I', 8]).rank()
1105
+ 2
1106
+ """
1107
+ #return len(self.index_set())
1108
+
1109
+ @abstract_method
1110
+ def index_set(self):
1111
+ """
1112
+ Return the index set for ``self``.
1113
+
1114
+ This is the list of the nodes of the associated Coxeter or
1115
+ Dynkin diagram.
1116
+
1117
+ EXAMPLES::
1118
+
1119
+ sage: CartanType(['A', 3, 1]).index_set()
1120
+ (0, 1, 2, 3)
1121
+ sage: CartanType(['D', 4]).index_set()
1122
+ (1, 2, 3, 4)
1123
+ sage: CartanType(['A', 7, 2]).index_set()
1124
+ (0, 1, 2, 3, 4)
1125
+ sage: CartanType(['A', 7, 2]).index_set()
1126
+ (0, 1, 2, 3, 4)
1127
+ sage: CartanType(['A', 6, 2]).index_set()
1128
+ (0, 1, 2, 3)
1129
+ sage: CartanType(['D', 6, 2]).index_set()
1130
+ (0, 1, 2, 3, 4, 5)
1131
+ sage: CartanType(['E', 6, 1]).index_set()
1132
+ (0, 1, 2, 3, 4, 5, 6)
1133
+ sage: CartanType(['E', 6, 2]).index_set()
1134
+ (0, 1, 2, 3, 4)
1135
+ sage: CartanType(['A', 2, 2]).index_set()
1136
+ (0, 1)
1137
+ sage: CartanType(['G', 2, 1]).index_set()
1138
+ (0, 1, 2)
1139
+ sage: CartanType(['F', 4, 1]).index_set()
1140
+ (0, 1, 2, 3, 4)
1141
+ """
1142
+
1143
+ # This coloring scheme is used for crystal graphs and will eventually
1144
+ # be used for Coxeter groups etc. (experimental feature)
1145
+ _index_set_coloring = {1:"blue", 2:"red", 3:"green"}
1146
+
1147
+ @abstract_method(optional=True)
1148
+ def coxeter_diagram(self):
1149
+ """
1150
+ Return the Coxeter diagram for ``self``.
1151
+
1152
+ EXAMPLES::
1153
+
1154
+ sage: # needs sage.graphs
1155
+ sage: CartanType(['B',3]).coxeter_diagram()
1156
+ Graph on 3 vertices
1157
+ sage: CartanType(['A',3]).coxeter_diagram().edges(sort=True)
1158
+ [(1, 2, 3), (2, 3, 3)]
1159
+ sage: CartanType(['B',3]).coxeter_diagram().edges(sort=True)
1160
+ [(1, 2, 3), (2, 3, 4)]
1161
+ sage: CartanType(['G',2]).coxeter_diagram().edges(sort=True)
1162
+ [(1, 2, 6)]
1163
+ sage: CartanType(['F',4]).coxeter_diagram().edges(sort=True)
1164
+ [(1, 2, 3), (2, 3, 4), (3, 4, 3)]
1165
+ """
1166
+
1167
+ @cached_method
1168
+ def coxeter_matrix(self):
1169
+ """
1170
+ Return the Coxeter matrix for ``self``.
1171
+
1172
+ EXAMPLES::
1173
+
1174
+ sage: CartanType(['A', 4]).coxeter_matrix() # needs sage.graphs
1175
+ [1 3 2 2]
1176
+ [3 1 3 2]
1177
+ [2 3 1 3]
1178
+ [2 2 3 1]
1179
+ """
1180
+ from sage.combinat.root_system.coxeter_matrix import CoxeterMatrix
1181
+ return CoxeterMatrix(self)
1182
+
1183
+ def coxeter_type(self):
1184
+ """
1185
+ Return the Coxeter type for ``self``.
1186
+
1187
+ EXAMPLES::
1188
+
1189
+ sage: CartanType(['A', 4]).coxeter_type()
1190
+ Coxeter type of ['A', 4]
1191
+ """
1192
+ from sage.combinat.root_system.coxeter_type import CoxeterType
1193
+ return CoxeterType(self)
1194
+
1195
+ def dual(self):
1196
+ """
1197
+ Return the dual Cartan type, possibly just as a formal dual.
1198
+
1199
+ EXAMPLES::
1200
+
1201
+ sage: CartanType(['A',3]).dual()
1202
+ ['A', 3]
1203
+ sage: CartanType(["B", 3]).dual()
1204
+ ['C', 3]
1205
+ sage: CartanType(['C',2]).dual()
1206
+ ['B', 2]
1207
+ sage: CartanType(['D',4]).dual()
1208
+ ['D', 4]
1209
+ sage: CartanType(['E',8]).dual()
1210
+ ['E', 8]
1211
+ sage: CartanType(['F',4]).dual()
1212
+ ['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
1213
+ """
1214
+ from . import type_dual
1215
+ return type_dual.CartanType(self)
1216
+
1217
+ def relabel(self, relabelling):
1218
+ """
1219
+ Return a relabelled copy of this Cartan type.
1220
+
1221
+ INPUT:
1222
+
1223
+ - ``relabelling`` -- a function (or a list or dictionary)
1224
+
1225
+ OUTPUT:
1226
+
1227
+ an isomorphic Cartan type obtained by relabelling the nodes of
1228
+ the Dynkin diagram. Namely, the node with label ``i`` is
1229
+ relabelled ``f(i)`` (or, by ``f[i]`` if ``f`` is a list or
1230
+ dictionary).
1231
+
1232
+ EXAMPLES::
1233
+
1234
+ sage: CartanType(['F',4]).relabel({ 1:4, 2:3, 3:2, 4:1 }).dynkin_diagram() # needs sage.graphs
1235
+ O---O=>=O---O
1236
+ 4 3 2 1
1237
+ F4 relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
1238
+ """
1239
+ from . import type_relabel
1240
+ return type_relabel.CartanType(self, relabelling)
1241
+
1242
+ def subtype(self, index_set):
1243
+ """
1244
+ Return a subtype of ``self`` given by ``index_set``.
1245
+
1246
+ A subtype can be considered the Dynkin diagram induced from
1247
+ the Dynkin diagram of ``self`` by ``index_set``.
1248
+
1249
+ EXAMPLES::
1250
+
1251
+ sage: ct = CartanType(['A',6,2])
1252
+ sage: ct.dynkin_diagram() # needs sage.graphs
1253
+ O=<=O---O=<=O
1254
+ 0 1 2 3
1255
+ BC3~
1256
+ sage: ct.subtype([1,2,3]) # needs sage.graphs
1257
+ ['C', 3]
1258
+ """
1259
+ return self.cartan_matrix().subtype(index_set).cartan_type()
1260
+
1261
+ def marked_nodes(self, marked_nodes):
1262
+ """
1263
+ Return a Cartan type with the nodes ``marked_nodes`` marked.
1264
+
1265
+ INPUT:
1266
+
1267
+ - ``marked_nodes`` -- list of nodes to mark
1268
+
1269
+ EXAMPLES::
1270
+
1271
+ sage: CartanType(['F',4]).marked_nodes([1, 3]).dynkin_diagram() # needs sage.graphs
1272
+ X---O=>=X---O
1273
+ 1 2 3 4
1274
+ F4 with nodes (1, 3) marked
1275
+ """
1276
+ if not marked_nodes:
1277
+ return self
1278
+ from . import type_marked
1279
+ return type_marked.CartanType(self, marked_nodes)
1280
+
1281
+ def is_reducible(self):
1282
+ """
1283
+ Report whether the root system is reducible (i.e. not simple), that
1284
+ is whether it can be factored as a product of root systems.
1285
+
1286
+ EXAMPLES::
1287
+
1288
+ sage: CartanType("A2xB3").is_reducible()
1289
+ True
1290
+ sage: CartanType(['A',2]).is_reducible()
1291
+ False
1292
+ """
1293
+ return not self.is_irreducible()
1294
+
1295
+ def is_irreducible(self):
1296
+ """
1297
+ Report whether this Cartan type is irreducible (i.e. simple). This
1298
+ should be overridden in any subclass.
1299
+
1300
+ This returns ``False`` by default. Derived class should override this
1301
+ appropriately.
1302
+
1303
+ EXAMPLES::
1304
+
1305
+ sage: from sage.combinat.root_system.cartan_type import CartanType_abstract
1306
+ sage: C = CartanType_abstract()
1307
+ sage: C.is_irreducible()
1308
+ False
1309
+ """
1310
+ return False
1311
+
1312
+ def is_atomic(self):
1313
+ r"""
1314
+ This method is usually equivalent to :meth:`is_reducible`,
1315
+ except for the Cartan type `D_2`.
1316
+
1317
+ `D_2` is not a standard Cartan type. It is equivalent to type
1318
+ `A_1 \times A_1` which is reducible; however the isomorphism
1319
+ from its ambient space (for the orthogonal group of degree 4)
1320
+ to that of `A_1 \times A_1` is non trivial, and it is useful to
1321
+ have it.
1322
+
1323
+ From a programming point of view its implementation is more
1324
+ similar to the irreducible types, and so the method
1325
+ :meth:`is_atomic()` is supplied.
1326
+
1327
+ EXAMPLES::
1328
+
1329
+ sage: CartanType("D2").is_atomic()
1330
+ True
1331
+ sage: CartanType("D2").is_irreducible()
1332
+ False
1333
+
1334
+ TESTS::
1335
+
1336
+ sage: all( T.is_irreducible() == T.is_atomic() for T in CartanType.samples() if T != CartanType("D2"))
1337
+ True
1338
+ """
1339
+ return self.is_irreducible()
1340
+
1341
+ def is_compound(self):
1342
+ """
1343
+ A short hand for not :meth:`is_atomic`.
1344
+
1345
+ TESTS::
1346
+
1347
+ sage: all( T.is_compound() == (not T.is_atomic()) for T in CartanType.samples())
1348
+ True
1349
+ """
1350
+ return not self.is_atomic()
1351
+
1352
+ @abstract_method
1353
+ def is_finite(self):
1354
+ """
1355
+ Return whether this Cartan type is finite.
1356
+
1357
+ EXAMPLES::
1358
+
1359
+ sage: from sage.combinat.root_system.cartan_type import CartanType_abstract
1360
+ sage: C = CartanType_abstract()
1361
+ sage: C.is_finite()
1362
+ Traceback (most recent call last):
1363
+ ...
1364
+ NotImplementedError: <abstract method is_finite at ...>
1365
+
1366
+ ::
1367
+
1368
+ sage: CartanType(['A',4]).is_finite()
1369
+ True
1370
+ sage: CartanType(['A',4, 1]).is_finite()
1371
+ False
1372
+ """
1373
+
1374
+ @abstract_method
1375
+ def is_affine(self):
1376
+ """
1377
+ Return whether ``self`` is affine.
1378
+
1379
+ EXAMPLES::
1380
+
1381
+ sage: CartanType(['A', 3]).is_affine()
1382
+ False
1383
+ sage: CartanType(['A', 3, 1]).is_affine()
1384
+ True
1385
+ """
1386
+
1387
+ def is_crystallographic(self):
1388
+ """
1389
+ Return whether this Cartan type is crystallographic.
1390
+
1391
+ This returns ``False`` by default. Derived class should override this
1392
+ appropriately.
1393
+
1394
+ EXAMPLES::
1395
+
1396
+ sage: [ [t, t.is_crystallographic() ] for t in CartanType.samples(finite=True) ]
1397
+ [[['A', 1], True], [['A', 5], True],
1398
+ [['B', 1], True], [['B', 5], True],
1399
+ [['C', 1], True], [['C', 5], True],
1400
+ [['D', 2], True], [['D', 3], True], [['D', 5], True],
1401
+ [['E', 6], True], [['E', 7], True], [['E', 8], True],
1402
+ [['F', 4], True], [['G', 2], True],
1403
+ [['I', 5], False], [['H', 3], False], [['H', 4], False]]
1404
+ """
1405
+ return False
1406
+
1407
+ def is_simply_laced(self):
1408
+ """
1409
+ Return whether this Cartan type is simply laced.
1410
+
1411
+ This returns ``False`` by default. Derived class should override this
1412
+ appropriately.
1413
+
1414
+ EXAMPLES::
1415
+
1416
+ sage: [ [t, t.is_simply_laced() ] for t in CartanType.samples() ]
1417
+ [[['A', 1], True], [['A', 5], True],
1418
+ [['B', 1], True], [['B', 5], False],
1419
+ [['C', 1], True], [['C', 5], False],
1420
+ [['D', 2], True], [['D', 3], True], [['D', 5], True],
1421
+ [['E', 6], True], [['E', 7], True], [['E', 8], True],
1422
+ [['F', 4], False], [['G', 2], False], [['I', 5], False],
1423
+ [['H', 3], False], [['H', 4], False],
1424
+ [['A', 1, 1], False], [['A', 5, 1], True],
1425
+ [['B', 1, 1], False], [['B', 5, 1], False],
1426
+ [['C', 1, 1], False], [['C', 5, 1], False],
1427
+ [['D', 3, 1], True], [['D', 5, 1], True],
1428
+ [['E', 6, 1], True], [['E', 7, 1], True], [['E', 8, 1], True],
1429
+ [['F', 4, 1], False], [['G', 2, 1], False],
1430
+ [['BC', 1, 2], False], [['BC', 5, 2], False],
1431
+ [['B', 5, 1]^*, False], [['C', 4, 1]^*, False],
1432
+ [['F', 4, 1]^*, False], [['G', 2, 1]^*, False],
1433
+ [['BC', 1, 2]^*, False], [['BC', 5, 2]^*, False]]
1434
+ """
1435
+ return False
1436
+
1437
+ def is_implemented(self):
1438
+ """
1439
+ Check whether the Cartan datum for ``self`` is actually implemented.
1440
+
1441
+ EXAMPLES::
1442
+
1443
+ sage: CartanType(["A",4,1]).is_implemented() # needs sage.graphs
1444
+ True
1445
+ sage: CartanType(['H',3]).is_implemented()
1446
+ True
1447
+ """
1448
+ try:
1449
+ self.coxeter_diagram()
1450
+ return True
1451
+ except Exception:
1452
+ return False
1453
+
1454
+ def root_system(self):
1455
+ """
1456
+ Return the root system associated to ``self``.
1457
+
1458
+ EXAMPLES::
1459
+
1460
+ sage: CartanType(['A',4]).root_system()
1461
+ Root system of type ['A', 4]
1462
+ """
1463
+ from sage.combinat.root_system.root_system import RootSystem
1464
+ return RootSystem(self)
1465
+
1466
+ def as_folding(self, folding_of=None, sigma=None):
1467
+ r"""
1468
+ Return ``self`` realized as a folded Cartan type.
1469
+
1470
+ For finite and affine types, this is realized by the Dynkin
1471
+ diagram foldings:
1472
+
1473
+ .. MATH::
1474
+
1475
+ \begin{array}{ccl}
1476
+ C_n^{(1)}, A_{2n}^{(2)}, A_{2n}^{(2)\dagger}, D_{n+1}^{(2)}
1477
+ & \hookrightarrow & A_{2n-1}^{(1)}, \\
1478
+ A_{2n-1}^{(2)}, B_n^{(1)} & \hookrightarrow & D_{n+1}^{(1)}, \\
1479
+ E_6^{(2)}, F_4^{(1)} & \hookrightarrow & E_6^{(1)}, \\
1480
+ D_4^{(3)}, G_2^{(1)} & \hookrightarrow & D_4^{(1)}, \\
1481
+ C_n & \hookrightarrow & A_{2n-1}, \\
1482
+ B_n & \hookrightarrow & D_{n+1}, \\
1483
+ F_4 & \hookrightarrow & E_6, \\
1484
+ G_2 & \hookrightarrow & D_4.
1485
+ \end{array}
1486
+
1487
+ For general types, this returns ``self`` as a folded type of ``self``
1488
+ with `\sigma` as the identity map.
1489
+
1490
+ For more information on these foldings and folded Cartan types, see
1491
+ :class:`sage.combinat.root_system.type_folded.CartanTypeFolded`.
1492
+
1493
+ If the optional inputs ``folding_of`` and ``sigma`` are specified, then
1494
+ this returns the folded Cartan type of ``self`` in ``folding_of`` given
1495
+ by the automorphism ``sigma``.
1496
+
1497
+ EXAMPLES::
1498
+
1499
+ sage: CartanType(['B', 3, 1]).as_folding()
1500
+ ['B', 3, 1] as a folding of ['D', 4, 1]
1501
+ sage: CartanType(['F', 4]).as_folding()
1502
+ ['F', 4] as a folding of ['E', 6]
1503
+ sage: CartanType(['BC', 3, 2]).as_folding()
1504
+ ['BC', 3, 2] as a folding of ['A', 5, 1]
1505
+ sage: CartanType(['D', 4, 3]).as_folding()
1506
+ ['G', 2, 1]^* relabelled by {0: 0, 1: 2, 2: 1} as a folding of ['D', 4, 1]
1507
+ """
1508
+ from sage.combinat.root_system.type_folded import CartanTypeFolded
1509
+ if folding_of is None and sigma is None:
1510
+ return self._default_folded_cartan_type()
1511
+ if folding_of is None or sigma is None:
1512
+ raise ValueError("Both folding_of and sigma must be given")
1513
+ return CartanTypeFolded(self, folding_of, sigma)
1514
+
1515
+ def _default_folded_cartan_type(self):
1516
+ r"""
1517
+ Return the default folded Cartan type.
1518
+
1519
+ In general, this just returns ``self`` in ``self`` with `\sigma` as
1520
+ the identity map.
1521
+
1522
+ EXAMPLES::
1523
+
1524
+ sage: D = CartanMatrix([[2, -3], [-2, 2]]).dynkin_diagram() # needs sage.graphs
1525
+ sage: D._default_folded_cartan_type() # needs sage.graphs
1526
+ Dynkin diagram of rank 2 as a folding of Dynkin diagram of rank 2
1527
+ """
1528
+ from sage.combinat.root_system.type_folded import CartanTypeFolded
1529
+ return CartanTypeFolded(self, self, [[i] for i in self.index_set()])
1530
+
1531
+ options = CartanType.options
1532
+
1533
+
1534
+ class CartanType_crystallographic(CartanType_abstract):
1535
+ """
1536
+ An abstract class for crystallographic Cartan types.
1537
+ """
1538
+ # The default value should really be lambda x:x, but sphinx does
1539
+ # not like it currently (see #14553); since this is an abstract method
1540
+ # the value won't actually be used, so we put a fake instead.
1541
+ @abstract_method(optional=True)
1542
+ def ascii_art(self, label='lambda x: x', node=None):
1543
+ r"""
1544
+ Return an ascii art representation of the Dynkin diagram.
1545
+
1546
+ INPUT:
1547
+
1548
+ - ``label`` -- (default: the identity) a relabeling function
1549
+ for the nodes
1550
+ - ``node`` -- (optional) a function which returns
1551
+ the character for a node
1552
+
1553
+ EXAMPLES::
1554
+
1555
+ sage: cartan_type = CartanType(['B',5,1])
1556
+ sage: print(cartan_type.ascii_art())
1557
+ O 0
1558
+ |
1559
+ |
1560
+ O---O---O---O=>=O
1561
+ 1 2 3 4 5
1562
+
1563
+ The label option is useful to visualize various statistics on
1564
+ the nodes of the Dynkin diagram::
1565
+
1566
+ sage: a = cartan_type.col_annihilator(); a # needs sage.graphs
1567
+ Finite family {0: 1, 1: 1, 2: 2, 3: 2, 4: 2, 5: 2}
1568
+ sage: print(CartanType(['B',5,1]).ascii_art(label=a.__getitem__)) # needs sage.graphs
1569
+ O 1
1570
+ |
1571
+ |
1572
+ O---O---O---O=>=O
1573
+ 1 2 2 2 2
1574
+ """
1575
+
1576
+ # The default value of label should really be lambda i:i, but sphinx does
1577
+ # not like it currently (see #14553); since this is an abstract method
1578
+ # the value won't actually be used, so we put a fake instead.
1579
+ @abstract_method(optional=True)
1580
+ def _latex_dynkin_diagram(self, label='lambda i: i',
1581
+ node=None, node_dist=2):
1582
+ r"""
1583
+ Return a latex representation of the Dynkin diagram.
1584
+
1585
+ INPUT:
1586
+
1587
+ - ``label`` -- (default: the identity) a relabeling function
1588
+ for the nodes
1589
+
1590
+ - ``node`` -- (optional) a function which returns the latex for a node
1591
+
1592
+ - ``node_dist`` -- (default: 2) the distance between nodes in cm
1593
+
1594
+ EXAMPLES::
1595
+
1596
+ sage: latex(CartanType(['A',4]).dynkin_diagram()) # indirect doctest # needs sage.graphs
1597
+ \begin{tikzpicture}[scale=0.5]
1598
+ \draw (-1,0) node[anchor=east] {$A_{4}$};
1599
+ \draw (0 cm,0) -- (6 cm,0);
1600
+ \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$};
1601
+ \draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$2$};
1602
+ \draw[fill=white] (4 cm, 0 cm) circle (.25cm) node[below=4pt]{$3$};
1603
+ \draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$};
1604
+ \end{tikzpicture}
1605
+ """
1606
+
1607
+ @abstract_method
1608
+ def dynkin_diagram(self):
1609
+ """
1610
+ Return the Dynkin diagram associated with ``self``.
1611
+
1612
+ EXAMPLES::
1613
+
1614
+ sage: CartanType(['A',4]).dynkin_diagram() # needs sage.graphs
1615
+ O---O---O---O
1616
+ 1 2 3 4
1617
+ A4
1618
+
1619
+ .. NOTE::
1620
+
1621
+ Derived subclasses should typically implement this as a cached
1622
+ method.
1623
+ """
1624
+
1625
+ @cached_method
1626
+ def cartan_matrix(self):
1627
+ """
1628
+ Return the Cartan matrix associated with ``self``.
1629
+
1630
+ EXAMPLES::
1631
+
1632
+ sage: CartanType(['A',4]).cartan_matrix() # needs sage.graphs
1633
+ [ 2 -1 0 0]
1634
+ [-1 2 -1 0]
1635
+ [ 0 -1 2 -1]
1636
+ [ 0 0 -1 2]
1637
+ """
1638
+ from sage.combinat.root_system.cartan_matrix import CartanMatrix
1639
+ return CartanMatrix(self.dynkin_diagram())
1640
+
1641
+ def coxeter_diagram(self):
1642
+ """
1643
+ Return the Coxeter diagram for ``self``.
1644
+
1645
+ This implementation constructs it from the Dynkin diagram.
1646
+
1647
+ .. SEEALSO:: :meth:`CartanType_abstract.coxeter_diagram`
1648
+
1649
+ EXAMPLES::
1650
+
1651
+ sage: # needs sage.graphs
1652
+ sage: CartanType(['A',3]).coxeter_diagram()
1653
+ Graph on 3 vertices
1654
+ sage: CartanType(['A',3]).coxeter_diagram().edges(sort=True)
1655
+ [(1, 2, 3), (2, 3, 3)]
1656
+ sage: CartanType(['B',3]).coxeter_diagram().edges(sort=True)
1657
+ [(1, 2, 3), (2, 3, 4)]
1658
+ sage: CartanType(['G',2]).coxeter_diagram().edges(sort=True)
1659
+ [(1, 2, 6)]
1660
+ sage: CartanType(['F',4]).coxeter_diagram().edges(sort=True)
1661
+ [(1, 2, 3), (2, 3, 4), (3, 4, 3)]
1662
+ sage: CartanType(['A',2,2]).coxeter_diagram().edges(sort=True)
1663
+ [(0, 1, +Infinity)]
1664
+ """
1665
+ return self.dynkin_diagram().coxeter_diagram()
1666
+
1667
+ def is_crystallographic(self):
1668
+ """
1669
+ Implement :meth:`CartanType_abstract.is_crystallographic`
1670
+ by returning ``True``.
1671
+
1672
+ EXAMPLES::
1673
+
1674
+ sage: CartanType(['A', 3, 1]).is_crystallographic()
1675
+ True
1676
+ """
1677
+ return True
1678
+
1679
+ @cached_method
1680
+ def symmetrizer(self):
1681
+ """
1682
+ Return the symmetrizer of the Cartan matrix of ``self``.
1683
+
1684
+ A Cartan matrix `M` is symmetrizable if there exists a non
1685
+ trivial diagonal matrix `D` such that `DM` is a symmetric
1686
+ matrix, that is `DM = M^tD`. In that case, `D` is unique, up
1687
+ to a scalar factor for each connected component of the Dynkin
1688
+ diagram.
1689
+
1690
+ This method computes the unique minimal such `D` with positive
1691
+ integral coefficients. If `D` exists, it is returned as a
1692
+ family. Otherwise ``None`` is returned.
1693
+
1694
+ The coefficients are coerced to ``base_ring``.
1695
+
1696
+ EXAMPLES::
1697
+
1698
+ sage: CartanType(["B",5]).symmetrizer() # needs sage.graphs
1699
+ Finite family {1: 2, 2: 2, 3: 2, 4: 2, 5: 1}
1700
+
1701
+ Here is a neat trick to visualize it better::
1702
+
1703
+ sage: T = CartanType(["B",5])
1704
+ sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
1705
+ O---O---O---O=>=O
1706
+ 2 2 2 2 1
1707
+
1708
+ sage: T = CartanType(["BC",5, 2])
1709
+ sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
1710
+ O=<=O---O---O---O=<=O
1711
+ 1 2 2 2 2 4
1712
+
1713
+ Here is the symmetrizer of some reducible Cartan types::
1714
+
1715
+ sage: T = CartanType(["D", 2])
1716
+ sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
1717
+ O O
1718
+ 1 1
1719
+
1720
+ sage: T = CartanType(["B",5],["BC",5, 2])
1721
+ sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
1722
+ O---O---O---O=>=O
1723
+ 2 2 2 2 1
1724
+ O=<=O---O---O---O=<=O
1725
+ 1 2 2 2 2 4
1726
+
1727
+ Property: up to an overall scalar factor, this gives the norm
1728
+ of the simple roots in the ambient space::
1729
+
1730
+ sage: T = CartanType(["C",5])
1731
+ sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
1732
+ O---O---O---O=<=O
1733
+ 1 1 1 1 2
1734
+
1735
+ sage: alpha = RootSystem(T).ambient_space().simple_roots()
1736
+ sage: print(T.ascii_art(lambda i: alpha[i].scalar(alpha[i])))
1737
+ O---O---O---O=<=O
1738
+ 2 2 2 2 4
1739
+ """
1740
+ from sage.matrix.constructor import matrix, diagonal_matrix
1741
+ m = self.cartan_matrix()
1742
+ n = m.nrows()
1743
+ M = matrix(ZZ, n, n * n, sparse=True)
1744
+ for i, j in m.nonzero_positions():
1745
+ M[i, n * i + j] = m[i, j]
1746
+ M[j, n * i + j] -= m[j, i]
1747
+ kern = M.integer_kernel()
1748
+ c = len(self.dynkin_diagram().connected_components(sort=False))
1749
+ if kern.dimension() < c:
1750
+ # the Cartan matrix is not symmetrizable
1751
+ return None
1752
+ assert kern.dimension() == c
1753
+ # Now the basis contains one vector v per connected component
1754
+ # C of the Dynkin diagram, or equivalently diagonal block of
1755
+ # the Cartan matrix. The support of v is exactly that
1756
+ # connected component, and it symmetrizes the corresponding
1757
+ # diagonal block of the Cartan matrix. We sum all those vectors.
1758
+ D = sum(kern.basis())
1759
+ assert diagonal_matrix(D) * m == m.transpose() * diagonal_matrix(D)
1760
+ I = self.index_set()
1761
+ return Family({I[i]: D[i] for i in range(n)})
1762
+
1763
+ def index_set_bipartition(self):
1764
+ r"""
1765
+ Return a bipartition `\{L,R\}` of the vertices of the Dynkin diagram.
1766
+
1767
+ For `i` and `j` both in `L` (or both in `R`), the simple
1768
+ reflections `s_i` and `s_j` commute.
1769
+
1770
+ Of course, the Dynkin diagram should be bipartite. This is
1771
+ always the case for all finite types.
1772
+
1773
+ EXAMPLES::
1774
+
1775
+ sage: CartanType(['A',5]).index_set_bipartition() # needs sage.graphs
1776
+ ({1, 3, 5}, {2, 4})
1777
+
1778
+ sage: CartanType(['A',2,1]).index_set_bipartition() # needs sage.graphs
1779
+ Traceback (most recent call last):
1780
+ ...
1781
+ ValueError: the Dynkin diagram must be bipartite
1782
+ """
1783
+ from sage.graphs.graph import Graph
1784
+ G = Graph(self.dynkin_diagram())
1785
+ if not G.is_bipartite():
1786
+ raise ValueError("the Dynkin diagram must be bipartite")
1787
+ return G.bipartite_sets()
1788
+
1789
+
1790
+ class CartanType_simply_laced(CartanType_crystallographic):
1791
+ """
1792
+ An abstract class for simply laced Cartan types.
1793
+ """
1794
+
1795
+ def is_simply_laced(self):
1796
+ """
1797
+ Return whether ``self`` is simply laced, which is ``True``.
1798
+
1799
+ EXAMPLES::
1800
+
1801
+ sage: CartanType(['A',3,1]).is_simply_laced()
1802
+ True
1803
+ sage: CartanType(['A',2]).is_simply_laced()
1804
+ True
1805
+ """
1806
+ return True
1807
+
1808
+ def dual(self):
1809
+ """
1810
+ Simply laced Cartan types are self-dual, so return ``self``.
1811
+
1812
+ EXAMPLES::
1813
+
1814
+ sage: CartanType(["A", 3]).dual()
1815
+ ['A', 3]
1816
+ sage: CartanType(["A", 3, 1]).dual()
1817
+ ['A', 3, 1]
1818
+ sage: CartanType(["D", 3]).dual()
1819
+ ['D', 3]
1820
+ sage: CartanType(["D", 4, 1]).dual()
1821
+ ['D', 4, 1]
1822
+ sage: CartanType(["E", 6]).dual()
1823
+ ['E', 6]
1824
+ sage: CartanType(["E", 6, 1]).dual()
1825
+ ['E', 6, 1]
1826
+ """
1827
+ return self
1828
+
1829
+
1830
+ class CartanType_simple(CartanType_abstract):
1831
+ """
1832
+ An abstract class for simple Cartan types.
1833
+ """
1834
+
1835
+ def is_irreducible(self):
1836
+ """
1837
+ Return whether ``self`` is irreducible, which is ``True``.
1838
+
1839
+ EXAMPLES::
1840
+
1841
+ sage: CartanType(['A', 3]).is_irreducible()
1842
+ True
1843
+ """
1844
+ return True
1845
+
1846
+
1847
+ class CartanType_finite(CartanType_abstract):
1848
+ """
1849
+ An abstract class for simple affine Cartan types.
1850
+ """
1851
+
1852
+ def is_finite(self):
1853
+ """
1854
+ EXAMPLES::
1855
+
1856
+ sage: CartanType(["A", 3]).is_finite()
1857
+ True
1858
+ """
1859
+ return True
1860
+
1861
+ def is_affine(self):
1862
+ """
1863
+ EXAMPLES::
1864
+
1865
+ sage: CartanType(["A", 3]).is_affine()
1866
+ False
1867
+ """
1868
+ return False
1869
+
1870
+
1871
+ class CartanType_affine(CartanType_simple, CartanType_crystallographic):
1872
+ """
1873
+ An abstract class for simple affine Cartan types
1874
+ """
1875
+
1876
+ AmbientSpace = LazyImport('sage.combinat.root_system.type_affine', 'AmbientSpace')
1877
+
1878
+ def _ascii_art_node(self, label):
1879
+ """
1880
+ Return the ascii art for the node labeled by ``label``.
1881
+
1882
+ EXAMPLES::
1883
+
1884
+ sage: ct = CartanType(['A',4,1])
1885
+ sage: CartanType.options(mark_special_node='both')
1886
+ sage: ct._ascii_art_node(0)
1887
+ '@'
1888
+ sage: CartanType.options._reset()
1889
+ """
1890
+ if (label == self.special_node()
1891
+ and self.options('mark_special_node') in ['printing', 'both']):
1892
+ return self.options('special_node_str')
1893
+ return super()._ascii_art_node(label)
1894
+
1895
+ def _latex_draw_node(self, x, y, label, position='below=4pt'):
1896
+ r"""
1897
+ Draw (possibly marked [crossed out]) circular node ``i`` at the
1898
+ position ``(x,y)`` with node label ``label`` .
1899
+
1900
+ - ``position`` -- position of the label relative to the node
1901
+ - ``anchor`` -- (optional) the anchor point for the label
1902
+
1903
+ EXAMPLES::
1904
+
1905
+ sage: CartanType.options(mark_special_node='both')
1906
+ sage: CartanType(['A',3,1])._latex_draw_node(0, 0, 0)
1907
+ '\\draw[fill=black] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$};\n'
1908
+ sage: CartanType.options._reset()
1909
+ """
1910
+ if label == self.special_node() and self.options('mark_special_node') in ['latex', 'both']:
1911
+ fill = 'black'
1912
+ else:
1913
+ fill = 'white'
1914
+ return super()._latex_draw_node(x, y, label, position, fill)
1915
+
1916
+ def is_finite(self):
1917
+ """
1918
+ EXAMPLES::
1919
+
1920
+ sage: CartanType(['A', 3, 1]).is_finite()
1921
+ False
1922
+ """
1923
+ return False
1924
+
1925
+ def is_affine(self):
1926
+ """
1927
+ EXAMPLES::
1928
+
1929
+ sage: CartanType(['A', 3, 1]).is_affine()
1930
+ True
1931
+ """
1932
+ return True
1933
+
1934
+ def is_untwisted_affine(self):
1935
+ """
1936
+ Return whether ``self`` is untwisted affine.
1937
+
1938
+ A Cartan type is untwisted affine if it is the canonical
1939
+ affine extension of some finite type. Every affine type is
1940
+ either untwisted affine, dual thereof, or of type ``BC``.
1941
+
1942
+ EXAMPLES::
1943
+
1944
+ sage: CartanType(['A', 3, 1]).is_untwisted_affine()
1945
+ True
1946
+ sage: CartanType(['A', 3, 1]).dual().is_untwisted_affine() # this one is self dual!
1947
+ True
1948
+ sage: CartanType(['B', 3, 1]).dual().is_untwisted_affine()
1949
+ False
1950
+ sage: CartanType(['BC', 3, 2]).is_untwisted_affine()
1951
+ False
1952
+ """
1953
+ return False
1954
+
1955
+ @abstract_method
1956
+ def special_node(self):
1957
+ r"""
1958
+ Return a special node of the Dynkin diagram.
1959
+
1960
+ A *special* node is a node of the Dynkin diagram such that
1961
+ pruning it yields a Dynkin diagram for the associated
1962
+ classical type (see :meth:`classical`).
1963
+
1964
+ This method returns the label of some special node. This is
1965
+ usually `0` in the standard conventions.
1966
+
1967
+ EXAMPLES::
1968
+
1969
+ sage: CartanType(['A', 3, 1]).special_node()
1970
+ 0
1971
+
1972
+ The choice is guaranteed to be consistent with the indexing of
1973
+ the nodes of the classical Dynkin diagram::
1974
+
1975
+ sage: CartanType(['A', 3, 1]).index_set()
1976
+ (0, 1, 2, 3)
1977
+ sage: CartanType(['A', 3, 1]).classical().index_set()
1978
+ (1, 2, 3)
1979
+ """
1980
+
1981
+ @cached_method
1982
+ def special_nodes(self):
1983
+ r"""
1984
+ Return the set of special nodes of the affine Dynkin diagram.
1985
+
1986
+ EXAMPLES::
1987
+
1988
+ sage: # needs sage.graphs sage.groups
1989
+ sage: CartanType(['A',3,1]).special_nodes()
1990
+ (0, 1, 2, 3)
1991
+ sage: CartanType(['C',2,1]).special_nodes()
1992
+ (0, 2)
1993
+ sage: CartanType(['D',4,1]).special_nodes()
1994
+ (0, 1, 3, 4)
1995
+ sage: CartanType(['E',6,1]).special_nodes()
1996
+ (0, 1, 6)
1997
+ sage: CartanType(['D',3,2]).special_nodes()
1998
+ (0, 2)
1999
+ sage: CartanType(['A',4,2]).special_nodes()
2000
+ (0,)
2001
+ """
2002
+ return tuple(sorted(self.dynkin_diagram().automorphism_group(edge_labels=True).orbit(self.special_node())))
2003
+
2004
+ @abstract_method
2005
+ def classical(self):
2006
+ r"""
2007
+ Return the classical Cartan type associated with this affine Cartan type.
2008
+
2009
+ EXAMPLES::
2010
+
2011
+ sage: CartanType(['A', 1, 1]).classical()
2012
+ ['A', 1]
2013
+ sage: CartanType(['A', 3, 1]).classical()
2014
+ ['A', 3]
2015
+ sage: CartanType(['B', 3, 1]).classical()
2016
+ ['B', 3]
2017
+
2018
+ sage: CartanType(['A', 2, 2]).classical()
2019
+ ['C', 1]
2020
+ sage: CartanType(['BC', 1, 2]).classical()
2021
+ ['C', 1]
2022
+ sage: CartanType(['A', 4, 2]).classical()
2023
+ ['C', 2]
2024
+ sage: CartanType(['BC', 2, 2]).classical()
2025
+ ['C', 2]
2026
+ sage: CartanType(['A', 10, 2]).classical()
2027
+ ['C', 5]
2028
+ sage: CartanType(['BC', 5, 2]).classical()
2029
+ ['C', 5]
2030
+
2031
+ sage: CartanType(['D', 5, 2]).classical()
2032
+ ['B', 4]
2033
+ sage: CartanType(['E', 6, 1]).classical()
2034
+ ['E', 6]
2035
+ sage: CartanType(['G', 2, 1]).classical()
2036
+ ['G', 2]
2037
+ sage: CartanType(['E', 6, 2]).classical()
2038
+ ['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
2039
+ sage: CartanType(['D', 4, 3]).classical()
2040
+ ['G', 2]
2041
+
2042
+ We check that :meth:`classical`,
2043
+ :meth:`sage.combinat.root_system.cartan_type.CartanType_crystallographic.dynkin_diagram`,
2044
+ and :meth:`special_node` are consistent::
2045
+
2046
+ sage: for ct in CartanType.samples(affine=True): # needs sage.graphs
2047
+ ....: g1 = ct.classical().dynkin_diagram()
2048
+ ....: g2 = ct.dynkin_diagram()
2049
+ ....: g2.delete_vertex(ct.special_node())
2050
+ ....: assert g1.vertices(sort=True) == g2.vertices(sort=True)
2051
+ ....: assert g1.edges(sort=True) == g2.edges(sort=True)
2052
+ """
2053
+
2054
+ @abstract_method
2055
+ def basic_untwisted(self):
2056
+ r"""
2057
+ Return the basic untwisted Cartan type associated with this affine
2058
+ Cartan type.
2059
+
2060
+ Given an affine type `X_n^{(r)}`, the basic untwisted type is `X_n`.
2061
+ In other words, it is the classical Cartan type that is twisted to
2062
+ obtain ``self``.
2063
+
2064
+ EXAMPLES::
2065
+
2066
+ sage: CartanType(['A', 1, 1]).basic_untwisted()
2067
+ ['A', 1]
2068
+ sage: CartanType(['A', 3, 1]).basic_untwisted()
2069
+ ['A', 3]
2070
+ sage: CartanType(['B', 3, 1]).basic_untwisted()
2071
+ ['B', 3]
2072
+ sage: CartanType(['E', 6, 1]).basic_untwisted()
2073
+ ['E', 6]
2074
+ sage: CartanType(['G', 2, 1]).basic_untwisted()
2075
+ ['G', 2]
2076
+
2077
+ sage: CartanType(['A', 2, 2]).basic_untwisted()
2078
+ ['A', 2]
2079
+ sage: CartanType(['A', 4, 2]).basic_untwisted()
2080
+ ['A', 4]
2081
+ sage: CartanType(['A', 11, 2]).basic_untwisted()
2082
+ ['A', 11]
2083
+ sage: CartanType(['D', 5, 2]).basic_untwisted()
2084
+ ['D', 5]
2085
+ sage: CartanType(['E', 6, 2]).basic_untwisted()
2086
+ ['E', 6]
2087
+ sage: CartanType(['D', 4, 3]).basic_untwisted()
2088
+ ['D', 4]
2089
+ """
2090
+
2091
+ def row_annihilator(self, m=None):
2092
+ r"""
2093
+ Return the unique minimal non trivial annihilating linear
2094
+ combination of `\alpha_0, \alpha_1, \ldots, \alpha_n` with
2095
+ nonnegative coefficients (or alternatively, the unique minimal
2096
+ non trivial annihilating linear combination of the rows of the
2097
+ Cartan matrix with nonnegative coefficients).
2098
+
2099
+ Throw an error if the existence of uniqueness does not hold
2100
+
2101
+ The optional argument ``m`` is for internal use only.
2102
+
2103
+ EXAMPLES::
2104
+
2105
+ sage: # needs sage.graphs
2106
+ sage: RootSystem(['C',2,1]).cartan_type().acheck()
2107
+ Finite family {0: 1, 1: 1, 2: 1}
2108
+ sage: RootSystem(['D',4,1]).cartan_type().acheck()
2109
+ Finite family {0: 1, 1: 1, 2: 2, 3: 1, 4: 1}
2110
+ sage: RootSystem(['F',4,1]).cartan_type().acheck()
2111
+ Finite family {0: 1, 1: 2, 2: 3, 3: 2, 4: 1}
2112
+ sage: RootSystem(['BC',4,2]).cartan_type().acheck()
2113
+ Finite family {0: 1, 1: 2, 2: 2, 3: 2, 4: 2}
2114
+
2115
+ ``acheck`` is a shortcut for row_annihilator::
2116
+
2117
+ sage: RootSystem(['BC',4,2]).cartan_type().row_annihilator() # needs sage.graphs
2118
+ Finite family {0: 1, 1: 2, 2: 2, 3: 2, 4: 2}
2119
+
2120
+ FIXME:
2121
+
2122
+ - The current implementation assumes that the Cartan matrix
2123
+ is indexed by `[0,1,...]`, in the same order as the index set.
2124
+ - This really should be a method of :class:`CartanMatrix`.
2125
+ """
2126
+ if m is None:
2127
+ m = self.cartan_matrix()
2128
+ if self.index_set() != tuple(range(m.ncols())):
2129
+ raise NotImplementedError("the Cartan matrix currently must be indexed by [0,1,...,{}]".format(m.ncols()))
2130
+ annihilator_basis = m.integer_kernel().gens()
2131
+ if len(annihilator_basis) != 1:
2132
+ raise ValueError("the kernel is not 1 dimensional")
2133
+ assert (all(coef > 0 for coef in annihilator_basis[0]))
2134
+
2135
+ return Family({i: annihilator_basis[0][i] for i in self.index_set()})
2136
+
2137
+ acheck = row_annihilator
2138
+
2139
+ def col_annihilator(self):
2140
+ r"""
2141
+ Return the unique minimal non trivial annihilating linear
2142
+ combination of `\alpha^\vee_0, \alpha^\vee, \ldots, \alpha^\vee` with
2143
+ nonnegative coefficients (or alternatively, the unique minimal
2144
+ non trivial annihilating linear combination of the columns of the
2145
+ Cartan matrix with nonnegative coefficients).
2146
+
2147
+ Throw an error if the existence or uniqueness does not hold
2148
+
2149
+ FIXME: the current implementation assumes that the Cartan
2150
+ matrix is indexed by `[0,1,...]`, in the same order as the
2151
+ index set.
2152
+
2153
+ EXAMPLES::
2154
+
2155
+ sage: # needs sage.graphs
2156
+ sage: RootSystem(['C',2,1]).cartan_type().a()
2157
+ Finite family {0: 1, 1: 2, 2: 1}
2158
+ sage: RootSystem(['D',4,1]).cartan_type().a()
2159
+ Finite family {0: 1, 1: 1, 2: 2, 3: 1, 4: 1}
2160
+ sage: RootSystem(['F',4,1]).cartan_type().a()
2161
+ Finite family {0: 1, 1: 2, 2: 3, 3: 4, 4: 2}
2162
+ sage: RootSystem(['BC',4,2]).cartan_type().a()
2163
+ Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
2164
+
2165
+ ``a`` is a shortcut for col_annihilator::
2166
+
2167
+ sage: RootSystem(['BC',4,2]).cartan_type().col_annihilator() # needs sage.graphs
2168
+ Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
2169
+ """
2170
+ return self.row_annihilator(self.cartan_matrix().transpose())
2171
+
2172
+ a = col_annihilator
2173
+
2174
+ def c(self):
2175
+ r"""
2176
+ Return the family (c_i)_i of integer coefficients defined by
2177
+ `c_i=max(1, a_i/a^vee_i)` (see e.g. [FSS07]_ p. 3)
2178
+
2179
+ FIXME: the current implementation assumes that the Cartan
2180
+ matrix is indexed by `[0,1,...]`, in the same order as the
2181
+ index set.
2182
+
2183
+ EXAMPLES::
2184
+
2185
+ sage: # needs sage.graphs
2186
+ sage: RootSystem(['C',2,1]).cartan_type().c()
2187
+ Finite family {0: 1, 1: 2, 2: 1}
2188
+ sage: RootSystem(['D',4,1]).cartan_type().c()
2189
+ Finite family {0: 1, 1: 1, 2: 1, 3: 1, 4: 1}
2190
+ sage: RootSystem(['F',4,1]).cartan_type().c()
2191
+ Finite family {0: 1, 1: 1, 2: 1, 3: 2, 4: 2}
2192
+ sage: RootSystem(['BC',4,2]).cartan_type().c()
2193
+ Finite family {0: 2, 1: 1, 2: 1, 3: 1, 4: 1}
2194
+
2195
+ TESTS::
2196
+
2197
+ sage: CartanType(["B", 3, 1]).c().map(parent) # needs sage.graphs
2198
+ Finite family {0: Integer Ring, 1: Integer Ring, 2: Integer Ring, 3: Integer Ring}
2199
+
2200
+ REFERENCES:
2201
+
2202
+ .. [FSS07] \G. Fourier, A. Schilling, and M. Shimozono,
2203
+ *Demazure structure inside Kirillov-Reshetikhin crystals*,
2204
+ J. Algebra, Vol. 309, (2007), p. 386-404
2205
+ :arxiv:`math/0605451`
2206
+ """
2207
+ a = self.a()
2208
+ acheck = self.acheck()
2209
+ return Family({i: max(ZZ.one(), a[i] // acheck[i])
2210
+ for i in self.index_set()})
2211
+
2212
+ def translation_factors(self):
2213
+ r"""
2214
+ Return the translation factors for ``self``.
2215
+
2216
+ Those are the smallest factors `t_i` such that the translation
2217
+ by `t_i \alpha_i` maps the fundamental polygon to another
2218
+ polygon in the alcove picture.
2219
+
2220
+ OUTPUT:
2221
+
2222
+ a dictionary from ``self.index_set()`` to `\ZZ`
2223
+ (or `\QQ` for affine type `BC`)
2224
+
2225
+ Those coefficients are all `1` for dual untwisted, and in
2226
+ particular for simply laced. They coincide with the usual
2227
+ `c_i` coefficients (see :meth:`c`) for untwisted and dual
2228
+ thereof. See the discussion below for affine type `BC`.
2229
+
2230
+ .. NOTE::
2231
+
2232
+ One usually realizes the alcove picture in the coweight
2233
+ lattice, with translations by coroots; in that case, one will
2234
+ use the translation factors for the dual Cartan type.
2235
+
2236
+ FIXME: the current implementation assumes that the Cartan
2237
+ matrix is indexed by `[0,1,...]`, in the same order as the
2238
+ index set.
2239
+
2240
+ EXAMPLES::
2241
+
2242
+ sage: # needs sage.graphs
2243
+ sage: CartanType(['C',2,1]).translation_factors()
2244
+ Finite family {0: 1, 1: 2, 2: 1}
2245
+ sage: CartanType(['C',2,1]).dual().translation_factors()
2246
+ Finite family {0: 1, 1: 1, 2: 1}
2247
+ sage: CartanType(['D',4,1]).translation_factors()
2248
+ Finite family {0: 1, 1: 1, 2: 1, 3: 1, 4: 1}
2249
+ sage: CartanType(['F',4,1]).translation_factors()
2250
+ Finite family {0: 1, 1: 1, 2: 1, 3: 2, 4: 2}
2251
+ sage: CartanType(['BC',4,2]).translation_factors()
2252
+ Finite family {0: 1, 1: 1, 2: 1, 3: 1, 4: 1/2}
2253
+
2254
+ We proceed with systematic tests taken from MuPAD-Combinat's
2255
+ testsuite::
2256
+
2257
+ sage: # needs sage.graphs
2258
+ sage: list(CartanType(["A", 1, 1]).translation_factors())
2259
+ [1, 1]
2260
+ sage: list(CartanType(["A", 5, 1]).translation_factors())
2261
+ [1, 1, 1, 1, 1, 1]
2262
+ sage: list(CartanType(["B", 5, 1]).translation_factors())
2263
+ [1, 1, 1, 1, 1, 2]
2264
+ sage: list(CartanType(["C", 5, 1]).translation_factors())
2265
+ [1, 2, 2, 2, 2, 1]
2266
+ sage: list(CartanType(["D", 5, 1]).translation_factors())
2267
+ [1, 1, 1, 1, 1, 1]
2268
+ sage: list(CartanType(["E", 6, 1]).translation_factors())
2269
+ [1, 1, 1, 1, 1, 1, 1]
2270
+ sage: list(CartanType(["E", 7, 1]).translation_factors())
2271
+ [1, 1, 1, 1, 1, 1, 1, 1]
2272
+ sage: list(CartanType(["E", 8, 1]).translation_factors())
2273
+ [1, 1, 1, 1, 1, 1, 1, 1, 1]
2274
+ sage: list(CartanType(["F", 4, 1]).translation_factors())
2275
+ [1, 1, 1, 2, 2]
2276
+ sage: list(CartanType(["G", 2, 1]).translation_factors())
2277
+ [1, 3, 1]
2278
+ sage: list(CartanType(["A", 2, 2]).translation_factors())
2279
+ [1, 1/2]
2280
+ sage: list(CartanType(["A", 2, 2]).dual().translation_factors())
2281
+ [1/2, 1]
2282
+ sage: list(CartanType(["A", 10, 2]).translation_factors())
2283
+ [1, 1, 1, 1, 1, 1/2]
2284
+ sage: list(CartanType(["A", 10, 2]).dual().translation_factors())
2285
+ [1/2, 1, 1, 1, 1, 1]
2286
+ sage: list(CartanType(["A", 9, 2]).translation_factors())
2287
+ [1, 1, 1, 1, 1, 1]
2288
+ sage: list(CartanType(["D", 5, 2]).translation_factors())
2289
+ [1, 1, 1, 1, 1]
2290
+ sage: list(CartanType(["D", 4, 3]).translation_factors())
2291
+ [1, 1, 1]
2292
+ sage: list(CartanType(["E", 6, 2]).translation_factors())
2293
+ [1, 1, 1, 1, 1]
2294
+
2295
+ We conclude with a discussion of the appropriate value for
2296
+ affine type `BC`. Let us consider the alcove picture realized
2297
+ in the weight lattice. It is obtained by taking the level-`1`
2298
+ affine hyperplane in the weight lattice, and projecting it
2299
+ along `\Lambda_0`::
2300
+
2301
+ sage: R = RootSystem(["BC",2,2])
2302
+ sage: alpha = R.weight_space().simple_roots() # needs sage.graphs
2303
+ sage: alphacheck = R.coroot_space().simple_roots()
2304
+ sage: Lambda = R.weight_space().fundamental_weights()
2305
+
2306
+ Here are the levels of the fundamental weights::
2307
+
2308
+ sage: Lambda[0].level(), Lambda[1].level(), Lambda[2].level() # needs sage.graphs
2309
+ (1, 2, 2)
2310
+
2311
+ So the "center" of the fundamental polygon at level `1` is::
2312
+
2313
+ sage: O = Lambda[0]
2314
+ sage: O.level() # needs sage.graphs
2315
+ 1
2316
+
2317
+ We take the projection `\omega_1` at level `0` of `\Lambda_1`
2318
+ as unit vector on the `x`-axis, and the projection `\omega_2`
2319
+ at level 0 of `\Lambda_2` as unit vector of the `y`-axis::
2320
+
2321
+ sage: omega1 = Lambda[1] - 2*Lambda[0]
2322
+ sage: omega2 = Lambda[2] - 2*Lambda[0]
2323
+ sage: omega1.level(), omega2.level() # needs sage.graphs
2324
+ (0, 0)
2325
+
2326
+ The projections of the simple roots can be read off::
2327
+
2328
+ sage: alpha[0] # needs sage.graphs
2329
+ 2*Lambda[0] - Lambda[1]
2330
+ sage: alpha[1] # needs sage.graphs
2331
+ -2*Lambda[0] + 2*Lambda[1] - Lambda[2]
2332
+ sage: alpha[2] # needs sage.graphs
2333
+ -2*Lambda[1] + 2*Lambda[2]
2334
+
2335
+ Namely `\alpha_0 = -\omega_1`, `\alpha_1 = 2\omega_1 -
2336
+ \omega_2` and `\alpha_2 = -2 \omega_1 + 2 \omega_2`.
2337
+
2338
+ The reflection hyperplane defined by `\alpha_0^\vee` goes
2339
+ through the points `O+1/2 \omega_1` and `O+1/2 \omega_2`::
2340
+
2341
+ sage: (O+(1/2)*omega1).scalar(alphacheck[0])
2342
+ 0
2343
+ sage: (O+(1/2)*omega2).scalar(alphacheck[0])
2344
+ 0
2345
+
2346
+ Hence, the fundamental alcove is the triangle `(O, O+1/2
2347
+ \omega_1, O+1/2 \omega_2)`. By successive reflections, one can
2348
+ tile the full plane. This induces a tiling of the full plane
2349
+ by translates of the fundamental polygon.
2350
+
2351
+ .. TODO::
2352
+
2353
+ Add the picture here, once root system plots in the
2354
+ weight lattice will be implemented. In the mean time, the
2355
+ reader may look up the dual picture on Figure 2 of [HST09]_
2356
+ which was produced by MuPAD-Combinat.
2357
+
2358
+ From this picture, one can read that translations by
2359
+ `\alpha_0`, `\alpha_1`, and `1/2\alpha_2` map the fundamental
2360
+ polygon to translates of it in the alcove picture, and are
2361
+ smallest with this property. Hence, the translation factors
2362
+ for affine type `BC` are `t_0=1, t_1=1, t_2=1/2`::
2363
+
2364
+ sage: CartanType(['BC',2,2]).translation_factors() # needs sage.graphs
2365
+ Finite family {0: 1, 1: 1, 2: 1/2}
2366
+
2367
+ TESTS::
2368
+
2369
+ sage: CartanType(["B", 3, 1]).translation_factors().map(parent) # needs sage.graphs
2370
+ Finite family {0: Integer Ring, 1: Integer Ring, 2: Integer Ring, 3: Integer Ring}
2371
+ sage: CartanType(["BC", 3, 2]).translation_factors().map(parent) # needs sage.graphs
2372
+ Finite family {0: Integer Ring, 1: Integer Ring, 2: Integer Ring, 3: Rational Field}
2373
+
2374
+ REFERENCES:
2375
+
2376
+ .. [HST09] \F. Hivert, A. Schilling, and N. M. Thiéry,
2377
+ *Hecke group algebras as quotients of affine Hecke
2378
+ algebras at level 0*, JCT A, Vol. 116, (2009) p. 844-863
2379
+ :arxiv:`0804.3781`
2380
+ """
2381
+ a = self.a()
2382
+ acheck = self.acheck()
2383
+ s = set(a[i] / acheck[i] for i in self.index_set())
2384
+ if ~ZZ(2) in s and 2 in s:
2385
+ # The test above and the formula below are rather meaningless
2386
+ # But they detect properly type BC or dual and return the correct value
2387
+ return Family({i: min(ZZ.one(), a[i] / acheck[i])
2388
+ for i in self.index_set()})
2389
+
2390
+ return self.c()
2391
+
2392
+ def _test_dual_classical(self, **options):
2393
+ r"""
2394
+ Test whether the special node of the dual is still the same and whether
2395
+ the methods dual and classical commute.
2396
+
2397
+ TESTS::
2398
+
2399
+ sage: C = CartanType(['A',2,2])
2400
+ sage: C._test_dual_classical()
2401
+ """
2402
+ tester = self._tester(**options)
2403
+ tester.assertEqual(self.classical().dual(), self.dual().classical())
2404
+ tester.assertEqual(self.special_node(), self.dual().special_node())
2405
+
2406
+ def other_affinization(self):
2407
+ """
2408
+ Return the other affinization of the same classical type.
2409
+
2410
+ EXAMPLES::
2411
+
2412
+ sage: CartanType(["A", 3, 1]).other_affinization()
2413
+ ['A', 3, 1]
2414
+ sage: CartanType(["B", 3, 1]).other_affinization()
2415
+ ['C', 3, 1]^*
2416
+ sage: CartanType(["C", 3, 1]).dual().other_affinization()
2417
+ ['B', 3, 1]
2418
+
2419
+ Is this what we want?::
2420
+
2421
+ sage: CartanType(["BC", 3, 2]).dual().other_affinization()
2422
+ ['B', 3, 1]
2423
+ """
2424
+ if self.is_untwisted_affine():
2425
+ result = self.classical().dual().affine().dual()
2426
+ else:
2427
+ result = self.dual().classical().dual().affine()
2428
+ assert result.classical() is self.classical()
2429
+ return result
2430
+
2431
+ ##############################################################################
2432
+ # Concrete base classes
2433
+
2434
+
2435
+ class CartanType_standard(UniqueRepresentation, SageObject):
2436
+ # Technical methods
2437
+ def _repr_(self, compact=False):
2438
+ """
2439
+ TESTS::
2440
+
2441
+ sage: ct = CartanType(['A',3])
2442
+ sage: repr(ct)
2443
+ "['A', 3]"
2444
+ sage: ct._repr_(compact=True)
2445
+ 'A3'
2446
+ """
2447
+ format = '%s%s' if compact else "['%s', %s]"
2448
+ return format % (self.letter, self.n)
2449
+
2450
+ def __len__(self):
2451
+ """
2452
+ EXAMPLES::
2453
+
2454
+ sage: len(CartanType(['A',4]))
2455
+ 2
2456
+ sage: len(CartanType(['A',4,1]))
2457
+ 3
2458
+ """
2459
+ return 3 if self.is_affine() else 2
2460
+
2461
+ def __getitem__(self, i):
2462
+ """
2463
+ EXAMPLES::
2464
+
2465
+ sage: t = CartanType(['B', 3])
2466
+ sage: t[0]
2467
+ 'B'
2468
+ sage: t[1]
2469
+ 3
2470
+ sage: t[2]
2471
+ Traceback (most recent call last):
2472
+ ...
2473
+ IndexError: index out of range
2474
+ """
2475
+ if i == 0:
2476
+ return self.letter
2477
+ elif i == 1:
2478
+ return self.n
2479
+ else:
2480
+ raise IndexError("index out of range")
2481
+
2482
+
2483
+ class CartanType_standard_finite(CartanType_standard, CartanType_finite):
2484
+ """
2485
+ A concrete base class for the finite standard Cartan types.
2486
+
2487
+ This includes for example `A_3`, `D_4`, or `E_8`.
2488
+
2489
+ TESTS::
2490
+
2491
+ sage: ct1 = CartanType(['A',4])
2492
+ sage: ct2 = CartanType(['A',4])
2493
+ sage: ct3 = CartanType(['A',5])
2494
+ sage: ct1 == ct2
2495
+ True
2496
+ sage: ct1 != ct3
2497
+ True
2498
+ """
2499
+
2500
+ def __init__(self, letter, n):
2501
+ """
2502
+ EXAMPLES::
2503
+
2504
+ sage: ct = CartanType(['A',4])
2505
+
2506
+ TESTS::
2507
+
2508
+ sage: TestSuite(ct).run(verbose = True)
2509
+ running ._test_category() . . . pass
2510
+ running ._test_new() . . . pass
2511
+ running ._test_not_implemented_methods() . . . pass
2512
+ running ._test_pickling() . . . pass
2513
+ """
2514
+ # assert(t[0] in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'])
2515
+ # assert(t[1] in ZZ and t[1] >= 0)
2516
+ # if t[0] in ['B', 'C']:
2517
+ # assert(t[1] >= 2)
2518
+ # if t[0] == 'D':
2519
+ # assert(t[1] >= 3)
2520
+ # if t[0] == 'E':
2521
+ # assert(t[1] <= 8)
2522
+ # if t[0] == 'F':
2523
+ # assert(t[1] <= 4)
2524
+ # if t[0] == 'G':
2525
+ # assert(t[1] <= 2)
2526
+ # if t[0] == 'H':
2527
+ # assert(t[1] <= 4)
2528
+ self.letter = letter
2529
+ self.n = n
2530
+
2531
+ def __reduce__(self):
2532
+ """
2533
+ TESTS::
2534
+
2535
+ sage: T = CartanType(['D', 4])
2536
+ sage: T.__reduce__()
2537
+ (CartanType, ('D', 4))
2538
+ sage: T == loads(dumps(T))
2539
+ True
2540
+ """
2541
+ return (CartanType, (self.letter, self.n))
2542
+
2543
+ def __hash__(self):
2544
+ """
2545
+ EXAMPLES::
2546
+
2547
+ sage: ct = CartanType(['A',2])
2548
+ sage: hash(ct) #random
2549
+ -5684143898951441983
2550
+ """
2551
+ return hash((self.n, self.letter))
2552
+
2553
+ # mathematical methods
2554
+
2555
+ def index_set(self):
2556
+ r"""
2557
+ Implement :meth:`CartanType_abstract.index_set`.
2558
+
2559
+ The index set for all standard finite Cartan types is of the form
2560
+ `\{1, \ldots, n\}`. (See :mod:`~sage.combinat.root_system.type_I`
2561
+ for a slight abuse of this).
2562
+
2563
+ EXAMPLES::
2564
+
2565
+ sage: CartanType(['A', 5]).index_set()
2566
+ (1, 2, 3, 4, 5)
2567
+ """
2568
+ return tuple(range(1,self.n+1))
2569
+
2570
+ def rank(self):
2571
+ """
2572
+ Return the rank of ``self`` which for type `X_n` is `n`.
2573
+
2574
+ EXAMPLES::
2575
+
2576
+ sage: CartanType(['A', 3]).rank()
2577
+ 3
2578
+ sage: CartanType(['B', 3]).rank()
2579
+ 3
2580
+ sage: CartanType(['C', 3]).rank()
2581
+ 3
2582
+ sage: CartanType(['D', 4]).rank()
2583
+ 4
2584
+ sage: CartanType(['E', 6]).rank()
2585
+ 6
2586
+ """
2587
+ return self.n
2588
+
2589
+ def affine(self):
2590
+ """
2591
+ Return the corresponding untwisted affine Cartan type.
2592
+
2593
+ EXAMPLES::
2594
+
2595
+ sage: CartanType(['A',3]).affine()
2596
+ ['A', 3, 1]
2597
+ """
2598
+ return CartanType([self.letter, self.n, 1])
2599
+
2600
+ def coxeter_number(self):
2601
+ """
2602
+ Return the Coxeter number associated with ``self``.
2603
+
2604
+ The Coxeter number is the order of a Coxeter element of the
2605
+ corresponding Weyl group.
2606
+
2607
+ See Bourbaki, Lie Groups and Lie Algebras V.6.1 or
2608
+ :wikipedia:`Coxeter_element` for more information.
2609
+
2610
+ EXAMPLES::
2611
+
2612
+ sage: CartanType(['A',4]).coxeter_number()
2613
+ 5
2614
+ sage: CartanType(['B',4]).coxeter_number()
2615
+ 8
2616
+ sage: CartanType(['C',4]).coxeter_number()
2617
+ 8
2618
+ """
2619
+ return sum(self.affine().a())
2620
+
2621
+ def dual_coxeter_number(self):
2622
+ """
2623
+ Return the Coxeter number associated with ``self``.
2624
+
2625
+ EXAMPLES::
2626
+
2627
+ sage: CartanType(['A',4]).dual_coxeter_number()
2628
+ 5
2629
+ sage: CartanType(['B',4]).dual_coxeter_number()
2630
+ 7
2631
+ sage: CartanType(['C',4]).dual_coxeter_number()
2632
+ 5
2633
+ """
2634
+ return sum(self.affine().acheck())
2635
+
2636
+ def type(self):
2637
+ """
2638
+ Return the type of ``self``.
2639
+
2640
+ EXAMPLES::
2641
+
2642
+ sage: CartanType(['A', 4]).type()
2643
+ 'A'
2644
+ sage: CartanType(['A', 4, 1]).type()
2645
+ 'A'
2646
+ """
2647
+ return self.letter
2648
+
2649
+ @cached_method
2650
+ def opposition_automorphism(self):
2651
+ r"""
2652
+ Return the opposition automorphism.
2653
+
2654
+ The *opposition automorphism* is the automorphism
2655
+ `i \mapsto i^*` of the vertices Dynkin diagram such that,
2656
+ for `w_0` the longest element of the Weyl group, and any
2657
+ simple root `\alpha_i`, one has `\alpha_{i^*} = -w_0(\alpha_i)`.
2658
+
2659
+ The automorphism is returned as a :class:`Family`.
2660
+
2661
+ EXAMPLES::
2662
+
2663
+ sage: ct = CartanType(['A', 5])
2664
+ sage: ct.opposition_automorphism() # needs sage.graphs sage.libs.gap
2665
+ Finite family {1: 5, 2: 4, 3: 3, 4: 2, 5: 1}
2666
+
2667
+ sage: ct = CartanType(['D', 4])
2668
+ sage: ct.opposition_automorphism() # needs sage.libs.gap
2669
+ Finite family {1: 1, 2: 2, 3: 3, 4: 4}
2670
+
2671
+ sage: ct = CartanType(['D', 5])
2672
+ sage: ct.opposition_automorphism() # needs sage.libs.gap
2673
+ Finite family {1: 1, 2: 2, 3: 3, 4: 5, 5: 4}
2674
+
2675
+ sage: ct = CartanType(['C', 4])
2676
+ sage: ct.opposition_automorphism() # needs sage.libs.gap
2677
+ Finite family {1: 1, 2: 2, 3: 3, 4: 4}
2678
+ """
2679
+ Q = self.root_system().root_lattice()
2680
+ W = Q.weyl_group()
2681
+ w0 = W.long_element()
2682
+ alpha = Q.simple_roots()
2683
+ d = {i: (w0.action(alpha[i])).leading_support() for i in self.index_set()}
2684
+ return Family(d)
2685
+
2686
+ ##########################################################################
2687
+
2688
+
2689
+ class CartanType_standard_affine(CartanType_standard, CartanType_affine):
2690
+ r"""
2691
+ A concrete class for affine simple Cartan types.
2692
+ """
2693
+
2694
+ def __init__(self, letter, n, affine=1):
2695
+ """
2696
+ EXAMPLES::
2697
+
2698
+ sage: ct = CartanType(['A',4,1])
2699
+ sage: TestSuite(ct).run()
2700
+
2701
+ TESTS::
2702
+
2703
+ sage: ct1 = CartanType(['A',3, 1])
2704
+ sage: ct2 = CartanType(['B',3, 1])
2705
+ sage: ct3 = CartanType(['A',3])
2706
+ sage: ct1 == ct1
2707
+ True
2708
+ sage: ct1 == ct2
2709
+ False
2710
+ sage: ct1 == ct3
2711
+ False
2712
+ """
2713
+ assert (letter in ['A', 'B', 'C', 'BC', 'D', 'E', 'F', 'G'])
2714
+ self.letter = letter
2715
+ self.n = n
2716
+ self.affine = affine
2717
+
2718
+ def _repr_(self, compact=False):
2719
+ """
2720
+ TESTS::
2721
+
2722
+ sage: ct = CartanType(['A',3, 1])
2723
+ sage: repr(ct)
2724
+ "['A', 3, 1]"
2725
+ sage: ct._repr_(compact=True)
2726
+ 'A3~'
2727
+ """
2728
+ letter = self.letter
2729
+ n = self.n
2730
+ aff = self.affine
2731
+ if self.options('notation') == "Kac":
2732
+ if letter == 'BC':
2733
+ letter = 'A'
2734
+ n *= 2
2735
+ if compact:
2736
+ return '%s%s^%s' % (letter, n, aff)
2737
+ if compact:
2738
+ return '%s%s~' % (letter, n)
2739
+ else:
2740
+ return "['%s', %s, %s]" % (letter, n, aff)
2741
+
2742
+ def __reduce__(self):
2743
+ """
2744
+ TESTS::
2745
+
2746
+ sage: T = CartanType(['D', 4, 1])
2747
+ sage: T.__reduce__()
2748
+ (CartanType, ('D', 4, 1))
2749
+ sage: T == loads(dumps(T))
2750
+ True
2751
+ """
2752
+ return (CartanType, (self.letter, self.n, self.affine))
2753
+
2754
+ def __getitem__(self, i):
2755
+ """
2756
+ EXAMPLES::
2757
+
2758
+ sage: t = CartanType(['A', 3, 1])
2759
+ sage: t[0]
2760
+ 'A'
2761
+ sage: t[1]
2762
+ 3
2763
+ sage: t[2]
2764
+ 1
2765
+ sage: t[3]
2766
+ Traceback (most recent call last):
2767
+ ...
2768
+ IndexError: index out of range
2769
+ """
2770
+ if i == 0:
2771
+ return self.letter
2772
+ elif i == 1:
2773
+ return self.n
2774
+ elif i == 2:
2775
+ return self.affine
2776
+ else:
2777
+ raise IndexError("index out of range")
2778
+
2779
+ def rank(self):
2780
+ """
2781
+ Return the rank of ``self`` which for type `X_n^{(1)}` is `n + 1`.
2782
+
2783
+ EXAMPLES::
2784
+
2785
+ sage: CartanType(['A', 4, 1]).rank()
2786
+ 5
2787
+ sage: CartanType(['B', 4, 1]).rank()
2788
+ 5
2789
+ sage: CartanType(['C', 3, 1]).rank()
2790
+ 4
2791
+ sage: CartanType(['D', 4, 1]).rank()
2792
+ 5
2793
+ sage: CartanType(['E', 6, 1]).rank()
2794
+ 7
2795
+ sage: CartanType(['E', 7, 1]).rank()
2796
+ 8
2797
+ sage: CartanType(['F', 4, 1]).rank()
2798
+ 5
2799
+ sage: CartanType(['G', 2, 1]).rank()
2800
+ 3
2801
+ sage: CartanType(['A', 2, 2]).rank()
2802
+ 2
2803
+ sage: CartanType(['A', 6, 2]).rank()
2804
+ 4
2805
+ sage: CartanType(['A', 7, 2]).rank()
2806
+ 5
2807
+ sage: CartanType(['D', 5, 2]).rank()
2808
+ 5
2809
+ sage: CartanType(['E', 6, 2]).rank()
2810
+ 5
2811
+ sage: CartanType(['D', 4, 3]).rank()
2812
+ 3
2813
+ """
2814
+ return self.n+1
2815
+
2816
+ def index_set(self):
2817
+ r"""
2818
+ Implement :meth:`CartanType_abstract.index_set`.
2819
+
2820
+ The index set for all standard affine Cartan types is of the form
2821
+ `\{0, \ldots, n\}`.
2822
+
2823
+ EXAMPLES::
2824
+
2825
+ sage: CartanType(['A', 5, 1]).index_set()
2826
+ (0, 1, 2, 3, 4, 5)
2827
+ """
2828
+ return tuple(range(self.n+1))
2829
+
2830
+ def special_node(self):
2831
+ r"""
2832
+ Implement :meth:`CartanType_abstract.special_node`.
2833
+
2834
+ With the standard labelling conventions, `0` is always a
2835
+ special node.
2836
+
2837
+ EXAMPLES::
2838
+
2839
+ sage: CartanType(['A', 3, 1]).special_node()
2840
+ 0
2841
+ """
2842
+ return 0
2843
+
2844
+ def type(self):
2845
+ """
2846
+ Return the type of ``self``.
2847
+
2848
+ EXAMPLES::
2849
+
2850
+ sage: CartanType(['A', 4, 1]).type()
2851
+ 'A'
2852
+ """
2853
+ return self.letter
2854
+
2855
+ ##########################################################################
2856
+
2857
+
2858
+ class CartanType_standard_untwisted_affine(CartanType_standard_affine):
2859
+ r"""
2860
+ A concrete class for the standard untwisted affine Cartan types.
2861
+ """
2862
+
2863
+ def classical(self):
2864
+ r"""
2865
+ Return the classical Cartan type associated with ``self``.
2866
+
2867
+ EXAMPLES::
2868
+
2869
+ sage: CartanType(['A', 3, 1]).classical()
2870
+ ['A', 3]
2871
+ sage: CartanType(['B', 3, 1]).classical()
2872
+ ['B', 3]
2873
+ sage: CartanType(['C', 3, 1]).classical()
2874
+ ['C', 3]
2875
+ sage: CartanType(['D', 4, 1]).classical()
2876
+ ['D', 4]
2877
+ sage: CartanType(['E', 6, 1]).classical()
2878
+ ['E', 6]
2879
+ sage: CartanType(['F', 4, 1]).classical()
2880
+ ['F', 4]
2881
+ sage: CartanType(['G', 2, 1]).classical()
2882
+ ['G', 2]
2883
+ """
2884
+ return CartanType([self.letter,self.n])
2885
+
2886
+ def basic_untwisted(self):
2887
+ r"""
2888
+ Return the basic_untwisted Cartan type associated with this affine
2889
+ Cartan type.
2890
+
2891
+ Given an affine type `X_n^{(r)}`, the basic_untwisted type is `X_n`. In
2892
+ other words, it is the classical Cartan type that is twisted to
2893
+ obtain ``self``.
2894
+
2895
+ EXAMPLES::
2896
+
2897
+ sage: CartanType(['A', 1, 1]).basic_untwisted()
2898
+ ['A', 1]
2899
+ sage: CartanType(['A', 3, 1]).basic_untwisted()
2900
+ ['A', 3]
2901
+ sage: CartanType(['B', 3, 1]).basic_untwisted()
2902
+ ['B', 3]
2903
+ sage: CartanType(['E', 6, 1]).basic_untwisted()
2904
+ ['E', 6]
2905
+ sage: CartanType(['G', 2, 1]).basic_untwisted()
2906
+ ['G', 2]
2907
+ """
2908
+ return self.classical()
2909
+
2910
+ def is_untwisted_affine(self):
2911
+ """
2912
+ Implement :meth:`CartanType_affine.is_untwisted_affine` by
2913
+ returning ``True``.
2914
+
2915
+ EXAMPLES::
2916
+
2917
+ sage: CartanType(['B', 3, 1]).is_untwisted_affine()
2918
+ True
2919
+ """
2920
+ return True
2921
+
2922
+ def _latex_(self):
2923
+ r"""
2924
+ Return a latex representation of ``self``.
2925
+
2926
+ EXAMPLES::
2927
+
2928
+ sage: latex(CartanType(['B',4,1]))
2929
+ B_{4}^{(1)}
2930
+ sage: latex(CartanType(['C',4,1]))
2931
+ C_{4}^{(1)}
2932
+ sage: latex(CartanType(['D',4,1]))
2933
+ D_{4}^{(1)}
2934
+ sage: latex(CartanType(['F',4,1]))
2935
+ F_4^{(1)}
2936
+ sage: latex(CartanType(['G',2,1]))
2937
+ G_2^{(1)}
2938
+ """
2939
+ return self.classical()._latex_()+"^{(1)}"
2940
+
2941
+ ##########################################################################
2942
+
2943
+
2944
+ class CartanType_decorator(UniqueRepresentation, SageObject, CartanType_abstract):
2945
+ """
2946
+ Concrete base class for Cartan types that decorate another Cartan type.
2947
+ """
2948
+
2949
+ def __init__(self, ct):
2950
+ """
2951
+ Initialize ``self``.
2952
+
2953
+ EXAMPLES::
2954
+
2955
+ sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
2956
+ sage: TestSuite(ct).run()
2957
+ """
2958
+ self._type = ct
2959
+
2960
+ def is_irreducible(self):
2961
+ """
2962
+ EXAMPLES::
2963
+
2964
+ sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
2965
+ sage: ct.is_irreducible()
2966
+ True
2967
+ """
2968
+ return self._type.is_irreducible()
2969
+
2970
+ def is_finite(self):
2971
+ """
2972
+ EXAMPLES::
2973
+
2974
+ sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
2975
+ sage: ct.is_finite()
2976
+ True
2977
+ """
2978
+ return self._type.is_finite()
2979
+
2980
+ def is_crystallographic(self):
2981
+ """
2982
+ EXAMPLES::
2983
+
2984
+ sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
2985
+ sage: ct.is_crystallographic()
2986
+ True
2987
+ """
2988
+ return self._type.is_crystallographic()
2989
+
2990
+ def is_affine(self):
2991
+ """
2992
+ EXAMPLES::
2993
+
2994
+ sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
2995
+ sage: ct.is_affine()
2996
+ False
2997
+ """
2998
+ return self._type.is_affine()
2999
+
3000
+ def rank(self):
3001
+ """
3002
+ EXAMPLES::
3003
+
3004
+ sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
3005
+ sage: ct.rank()
3006
+ 2
3007
+ """
3008
+ return self._type.rank()
3009
+
3010
+ def index_set(self):
3011
+ """
3012
+ EXAMPLES::
3013
+
3014
+ sage: ct = CartanType(['F', 4, 1]).dual()
3015
+ sage: ct.index_set()
3016
+ (0, 1, 2, 3, 4)
3017
+ """
3018
+ return self._type.index_set()
3019
+
3020
+ ##############################################################################
3021
+ # Base concrete class for superalgebras
3022
+
3023
+
3024
+ class SuperCartanType_standard(UniqueRepresentation, SageObject):
3025
+ # Technical methods
3026
+ def _repr_(self, compact=False):
3027
+ """
3028
+ TESTS::
3029
+
3030
+ sage: ct = CartanType(['A', [3,2]])
3031
+ sage: repr(ct)
3032
+ "['A', [3, 2]]"
3033
+ sage: ct._repr_(compact=True)
3034
+ 'A3|2'
3035
+ """
3036
+ formatstr = '%s%s|%s' if compact else "['%s', [%s, %s]]"
3037
+ return formatstr % (self.letter, self.m, self.n)
3038
+
3039
+ def __len__(self):
3040
+ """
3041
+ EXAMPLES::
3042
+
3043
+ sage: len(CartanType(['A',[4,3]]))
3044
+ 2
3045
+ """
3046
+ return 2
3047
+
3048
+ def __getitem__(self, i):
3049
+ """
3050
+ EXAMPLES::
3051
+
3052
+ sage: t = CartanType(['A', [3,6]])
3053
+ sage: t[0]
3054
+ 'A'
3055
+ sage: t[1]
3056
+ [3, 6]
3057
+ sage: t[2]
3058
+ Traceback (most recent call last):
3059
+ ...
3060
+ IndexError: index out of range
3061
+ """
3062
+ if i == 0:
3063
+ return self.letter
3064
+ elif i == 1:
3065
+ return [self.m, self.n]
3066
+ else:
3067
+ raise IndexError("index out of range")
3068
+
3069
+ options = CartanType.options