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,1615 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.geometry.polyhedron sage.plot sage.symbolic
3
+ r"""
4
+ Tutorial: visualizing root systems
5
+
6
+ Root systems encode the positions of collections of hyperplanes in
7
+ space, and form the fundamental combinatorial data underlying Coxeter
8
+ and Weyl groups, Lie algebras and groups, etc. The theory can be a bit
9
+ intimidating at first because of the many technical gadgets (roots,
10
+ coroots, weights, ...). Visualizing them goes a long way toward
11
+ building a geometric intuition.
12
+
13
+ This tutorial starts from simple plots and guides you all the way to
14
+ advanced plots with your own combinatorial data drawn on top of it.
15
+
16
+ .. SEEALSO::
17
+
18
+ - :ref:`sage.combinat.root_system.root_system`
19
+ -- An overview of root systems in Sage
20
+
21
+ - :meth:`RootLatticeRealizations.ParentMethods.plot()
22
+ <sage.combinat.root_system.root_lattice_realizations.RootLatticeRealizations.ParentMethods.plot>`
23
+ -- the main plotting function, with pointers to all the subroutines
24
+
25
+
26
+ First plots
27
+ -----------
28
+
29
+ In this first plot, we draw the root system for type `A_2` in the
30
+ ambient space. It is generated from two hyperplanes at a 120 degree
31
+ angle::
32
+
33
+ sage: L = RootSystem(["A",2]).ambient_space()
34
+ sage: L.plot()
35
+ Graphics object consisting of 13 graphics primitives
36
+
37
+ .. PLOT::
38
+ :width: 300 px
39
+
40
+ L = RootSystem(["A",2]).ambient_space()
41
+ sphinx_plot(L.plot())
42
+
43
+ Each of those hyperplane `H_{\alpha^\vee_i}` is described by a linear
44
+ form `\alpha_i^\vee` called simple coroot. To each such hyperplane
45
+ corresponds a reflection along a vector called root. In this picture,
46
+ the reflections are orthogonal and the two simple roots `\alpha_1` and
47
+ `\alpha_2` are vectors which are normal to the reflection hyperplanes.
48
+ The same color code is used uniformly: blue for 1, red for 2, green
49
+ for 3, ... (see :meth:`CartanType.color()
50
+ <sage.combinat.root_system.cartan_type.CartanTypeFactory.color>`). The
51
+ fundamental weights, `\Lambda_1` and `\Lambda_2` form the dual basis of
52
+ the coroots.
53
+
54
+ The two reflections generate a group of order six which is nothing but
55
+ the usual symmetric group `S_3`, in its natural action by permutations
56
+ of the coordinates of the ambient space. Wait, but the ambient space
57
+ should be of dimension `3` then? That's perfectly right. Here is the
58
+ full picture in 3D::
59
+
60
+ sage: L = RootSystem(["A",2]).ambient_space()
61
+ sage: L.plot(projection=False)
62
+ Graphics3d Object
63
+
64
+ .. PLOT::
65
+ :width: 300 px
66
+
67
+ L = RootSystem(["A",2]).ambient_space()
68
+ sphinx_plot(L.plot(projection=False))
69
+
70
+ However in this space, the line `(1,1,1)` is fixed by the action of
71
+ the group. Therefore, the so called barycentric projection orthogonal
72
+ to `(1,1,1)` gives a convenient 2D picture which contains all the
73
+ essential information. The same projection is used by default in type
74
+ `G_2`::
75
+
76
+ sage: L = RootSystem(["G",2]).ambient_space()
77
+ sage: L.plot(reflection_hyperplanes='all')
78
+ Graphics object consisting of 21 graphics primitives
79
+
80
+ .. PLOT::
81
+ :width: 300 px
82
+
83
+ L = RootSystem(["G",2]).ambient_space()
84
+ sphinx_plot(L.plot(reflection_hyperplanes='all'))
85
+
86
+ The group is now the dihedral group of order 12, generated by the two
87
+ reflections `s_1` and `s_2`. The picture displays the hyperplanes for
88
+ all 12 reflections of the group. Those reflections delimit 12 chambers
89
+ which are in one to one correspondence with the elements of the
90
+ group. The fundamental chamber, which is grayed out, is associated
91
+ with the identity of the group.
92
+
93
+ .. WARNING::
94
+
95
+ The fundamental chamber is currently plotted as the cone generated
96
+ by the fundamental weights. As can be seen on the previous 3D
97
+ picture this is not quite correct if the fundamental weights do
98
+ not span the space.
99
+
100
+ Another caveat is that some plotting features may require
101
+ manipulating elements with rational coordinates which will fail if
102
+ one is working in, say, the weight lattice. It is therefore
103
+ recommended to use the root, weight, or ambient spaces for
104
+ plotting purposes rather than their lattice counterparts.
105
+
106
+ Coming back to the symmetric group, here is the picture in the weight
107
+ space, with all roots and all reflection hyperplanes; remark that,
108
+ unlike in the ambient space, a root is not necessarily orthogonal to
109
+ its corresponding reflection hyperplane::
110
+
111
+ sage: L = RootSystem(["A",2]).weight_space()
112
+ sage: L.plot(roots='all', reflection_hyperplanes='all').show(figsize=15)
113
+
114
+ .. NOTE::
115
+
116
+ Setting a larger figure size as above can help reduce
117
+ the overlap between the text labels when the figure
118
+ gets crowded.
119
+
120
+ .. PLOT::
121
+ :width: 300 px
122
+
123
+ L = RootSystem(["A",2]).weight_space()
124
+ sphinx_plot(L.plot(roots='all', reflection_hyperplanes='all'))
125
+
126
+ One can further customize which roots to display, as in
127
+ the following example showing the positive roots in the
128
+ weight space for type ['G',2], labelled by their
129
+ coordinates in the root lattice::
130
+
131
+ sage: Q = RootSystem(["G",2]).root_space()
132
+ sage: L = RootSystem(["G",2]).ambient_space()
133
+ sage: L.plot(roots=list(Q.positive_roots()), fundamental_weights=False)
134
+ Graphics object consisting of 17 graphics primitives
135
+
136
+ .. PLOT::
137
+ :width: 300 px
138
+
139
+ Q = RootSystem(["G",2]).root_space()
140
+ L = RootSystem(["G",2]).ambient_space()
141
+ sphinx_plot(L.plot(roots=list(Q.positive_roots()), fundamental_weights=False))
142
+
143
+ One can also customize the projection by specifying a function. Here,
144
+ we display all the roots for type `E_8` using the projection from its
145
+ eight dimensional ambient space onto 3D described on
146
+ :wikipedia:`Wikipedia%27s E8 3D picture <File:E8_3D.png>`::
147
+
148
+ sage: M = matrix([[0., -0.556793440452, 0.19694925177, -0.19694925177, 0.0805477263944, -0.385290876171, 0., 0.385290876171],
149
+ ....: [0.180913155536, 0., 0.160212955043, 0.160212955043, 0., 0.0990170516545, 0.766360424875, 0.0990170516545],
150
+ ....: [0.338261212718, 0, 0, -0.338261212718, 0.672816364803, 0.171502564281, 0, -0.171502564281]])
151
+ sage: L = RootSystem(["E",8]).ambient_space()
152
+ sage: L.dimension()
153
+ 8
154
+ sage: L.plot(roots='all', reflection_hyperplanes=False, # long time
155
+ ....: projection=lambda v: M*vector(v), labels=False)
156
+ Graphics3d Object
157
+
158
+ .. PLOT::
159
+ :width: 300 px
160
+
161
+ M = matrix([[0., -0.556793440452, 0.19694925177, -0.19694925177, 0.0805477263944, -0.385290876171, 0., 0.385290876171],
162
+ [0.180913155536, 0., 0.160212955043, 0.160212955043, 0., 0.0990170516545, 0.766360424875, 0.0990170516545],
163
+ [0.338261212718, 0, 0, -0.338261212718, 0.672816364803, 0.171502564281, 0, -0.171502564281]])
164
+ L = RootSystem(["E",8]).ambient_space()
165
+ sphinx_plot(L.plot(roots='all', reflection_hyperplanes=False, projection=lambda v: M*vector(v), labels=False))
166
+
167
+ The projection function should be linear or affine, and return a
168
+ vector with rational coordinates. The rationale for the later
169
+ constraint is to allow for using the PPL exact library for
170
+ manipulating polytopes. Indeed exact calculations give cleaner
171
+ pictures (adjacent objects, intersection with the bounding box, ...).
172
+ Besides the interface to PPL is indeed currently faster than that for
173
+ CDD, and it is likely to become even more so.
174
+
175
+ .. TOPIC:: Exercise
176
+
177
+ Draw all finite root systems in 2D, using the canonical projection
178
+ onto their Coxeter plane. See
179
+ `Stembridge's page <http://www.math.lsa.umich.edu/~jrs/coxplane.html>`_.
180
+
181
+
182
+ Alcoves and chambers
183
+ --------------------
184
+
185
+ We now draw the root system for type `G_2`, with its alcoves (in
186
+ finite type, those really are the chambers) and the corresponding
187
+ elements of the Weyl group. We enlarge a bit the bounding box to make
188
+ sure everything fits in the picture::
189
+
190
+ sage: RootSystem(["G",2]).ambient_space().plot(alcoves=True,
191
+ ....: alcove_labels=True, bounding_box=5)
192
+ Graphics object consisting of 37 graphics primitives
193
+
194
+ .. PLOT::
195
+ :width: 300 px
196
+
197
+ sphinx_plot(RootSystem(["G",2]).ambient_space().plot(alcoves=True, alcove_labels=True, bounding_box=5))
198
+
199
+ The same picture in 3D, for type `B_3`::
200
+
201
+ sage: RootSystem(["B",3]).ambient_space().plot(alcoves=True, alcove_labels=True)
202
+ Graphics3d Object
203
+
204
+ .. PLOT::
205
+ :width: 300 px
206
+
207
+ sphinx_plot(RootSystem(["B",3]).ambient_space().plot(alcoves=True, alcove_labels=True))
208
+
209
+ .. TOPIC:: Exercise
210
+
211
+ Can you spot the fundamental chamber? The fundamental weights? The
212
+ simple roots? The longest element of the Weyl group?
213
+
214
+ Alcove pictures for affine types
215
+ --------------------------------
216
+
217
+ We now draw the usual alcove picture for affine type `A_2^{(1)}`::
218
+
219
+ sage: L = RootSystem(["A",2,1]).ambient_space()
220
+ sage: L.plot() # long time
221
+ Graphics object consisting of 160 graphics primitives
222
+
223
+ .. PLOT::
224
+ :width: 300 px
225
+
226
+ sphinx_plot(RootSystem(["A",2,1]).ambient_space().plot())
227
+
228
+ This picture is convenient because it is low dimensional and contains
229
+ most of the relevant information. Beside, by choosing the ambient
230
+ space, the elements of the Weyl group act as orthogonal affine
231
+ maps. In particular, reflections are usual (affine) orthogonal
232
+ reflections. However this is in fact only a slice of the real picture:
233
+ the Weyl group actually acts by linear maps on the full ambient
234
+ space. Those maps stabilize the so-called level `l` hyperplanes, and
235
+ we are visualizing here what's happening at level `1`. Here is the
236
+ full picture in 3D::
237
+
238
+ sage: L.plot(bounding_box=[[-3,3],[-3,3],[-1,1]], affine=False) # long time
239
+ Graphics3d Object
240
+
241
+ .. PLOT::
242
+ :width: 300 px
243
+
244
+ L = RootSystem(["A",2,1]).ambient_space()
245
+ sphinx_plot(L.plot(bounding_box=[[-3,3],[-3,3],[-1,1]], affine=False))
246
+
247
+ In fact, in type `A`, this really is a picture in 4D, but as usual the
248
+ barycentric projection kills the boring extra dimension for us.
249
+
250
+ It's usually more readable to only draw the intersection of the
251
+ reflection hyperplanes with the level `1` hyperplane::
252
+
253
+ sage: L.plot(affine=False, level=1) # long time
254
+ Graphics3d Object
255
+
256
+ .. PLOT::
257
+ :width: 300 px
258
+
259
+ sphinx_plot(RootSystem(["A",2,1]).ambient_space().plot(affine=False, level=1))
260
+
261
+ Such 3D pictures are useful to better understand technicalities, like
262
+ the fact that the fundamental weights do not necessarily all live at
263
+ level 1::
264
+
265
+ sage: L = RootSystem(["G",2,1]).ambient_space()
266
+ sage: L.plot(affine=False, level=1)
267
+ Graphics3d Object
268
+
269
+ .. PLOT::
270
+ :width: 300 px
271
+
272
+ sphinx_plot(RootSystem(["G",2,1]).ambient_space().plot(affine=False, level=1))
273
+
274
+ .. NOTE::
275
+
276
+ Such pictures may tend to be a bit flat, and it may be helpful to
277
+ play with the aspect_ratio and more generally with the various
278
+ options of the :meth:`~sage.plot.plot3d.base.Graphics3d.show`
279
+ method::
280
+
281
+ sage: p = L.plot(affine=False, level=1)
282
+ sage: p.show(aspect_ratio=[1,1,2], frame=False)
283
+
284
+ .. TOPIC:: Exercise
285
+
286
+ Draw the alcove picture at level 1, and compare the position of
287
+ the fundamental weights and the vertices of the fundamental
288
+ alcove.
289
+
290
+ As for finite root systems, the alcoves are indexed by the elements of
291
+ the Weyl group `W`. Two alcoves indexed by `u` and `v` respectively
292
+ share a wall if `u` and `v` are neighbors in the right Cayley graph:
293
+ `u = vs_i`; the color of that wall is given by `i`::
294
+
295
+ sage: L = RootSystem(["C",2,1]).ambient_space()
296
+ sage: L.plot(coroots='simple', alcove_labels=True) # long time
297
+ Graphics object consisting of 216 graphics primitives
298
+
299
+ .. PLOT::
300
+ :width: 300 px
301
+
302
+ L = RootSystem(["C",2,1]).ambient_space()
303
+ sphinx_plot(L.plot(coroots='simple', alcove_labels=True))
304
+
305
+ Even 2D pictures of the rank `1 + 1` cases can give some food for
306
+ thought. Here, we draw the root lattice, with the positive roots of
307
+ small height in the root poset::
308
+
309
+ sage: L = RootSystem(["A",1,1]).root_lattice()
310
+ sage: seed = L.simple_roots()
311
+ sage: succ = attrcall("pred")
312
+ sage: positive_roots = RecursivelyEnumeratedSet(seed, succ, structure='graded')
313
+ sage: it = iter(positive_roots)
314
+ sage: first_positive_roots = [next(it) for i in range(10)]
315
+ sage: L.plot(roots=first_positive_roots, affine=False, alcoves=False)
316
+ Graphics object consisting of 24 graphics primitives
317
+
318
+ .. PLOT::
319
+ :width: 300 px
320
+
321
+ L = RootSystem(["A",1,1]).root_lattice()
322
+ seed = L.simple_roots()
323
+ succ = attrcall("pred")
324
+ positive_roots = RecursivelyEnumeratedSet(seed, succ, structure='graded')
325
+ it = iter(positive_roots)
326
+ first_positive_roots = [next(it) for i in range(10)]
327
+ sphinx_plot(L.plot(roots=first_positive_roots, affine=False, alcoves=False))
328
+
329
+ .. TOPIC:: Exercises
330
+
331
+ #. Use the same trick to draw the reflection hyperplanes in the
332
+ weight lattice for the coroots of small height. Add the
333
+ indexing of the alcoves by elements of the Weyl group.
334
+ See below for a solution.
335
+
336
+ #. Draw the positive roots in the weight lattice and in the
337
+ extended weight lattice.
338
+
339
+ #. Draw the reflection hyperplanes in the root lattice
340
+
341
+ #. Recreate John Stembridge's
342
+ `"Sandwich" arrangement pictures <http://www.math.lsa.umich.edu/~jrs/archive.html>`_
343
+ by choosing appropriate coroots for the reflection hyperplanes.
344
+
345
+ Here is a polished solution for the first exercise::
346
+
347
+ sage: L = RootSystem(["A",1,1]).weight_space()
348
+ sage: seed = L.simple_coroots()
349
+ sage: succ = attrcall("pred")
350
+ sage: positive_coroots = RecursivelyEnumeratedSet(seed, succ, structure='graded')
351
+ sage: it = iter(positive_coroots)
352
+ sage: first_positive_coroots = [next(it) for i in range(20)]
353
+ sage: p = L.plot(fundamental_chamber=True,
354
+ ....: reflection_hyperplanes=first_positive_coroots,
355
+ ....: affine=False, alcove_labels=1,
356
+ ....: bounding_box=[[-9,9],[-1,2]],
357
+ ....: projection=lambda x: matrix([[1,-1],[1,1]])*vector(x))
358
+ sage: p.show(figsize=20) # long time
359
+
360
+
361
+ Higher dimension affine pictures
362
+ --------------------------------
363
+
364
+ We now do some plots for rank 4 affine types, at level 1. The space is
365
+ tiled by the alcoves, each of which is a 3D simplex::
366
+
367
+ sage: L = RootSystem(["A",3,1]).ambient_space()
368
+ sage: L.plot(reflection_hyperplanes=False, bounding_box=85/100) # long time
369
+ Graphics3d Object
370
+
371
+ .. PLOT::
372
+ :width: 300 px
373
+
374
+ L = RootSystem(["A",3,1]).ambient_space()
375
+ sphinx_plot(L.plot(reflection_hyperplanes=False, bounding_box=Rational((85,100))))
376
+
377
+ It is recommended to use a small bounding box here, for otherwise the
378
+ number of simplices grows quicker than what Sage can handle
379
+ smoothly. It can help to specify explicitly which alcoves to
380
+ visualize. Here is the fundamental alcove, specified by an element of
381
+ the Weyl group::
382
+
383
+ sage: W = L.weyl_group()
384
+ sage: L.plot(reflection_hyperplanes=False, alcoves=[W.one()], bounding_box=2)
385
+ Graphics3d Object
386
+
387
+ .. PLOT::
388
+ :width: 300 px
389
+
390
+ X = RootSystem(["A",3,1]).ambient_space()
391
+ XW = X.weyl_group()
392
+ sphinx_plot(X.plot(reflection_hyperplanes=False, alcoves=[XW.one()], bounding_box=2))
393
+
394
+ and the fundamental polygon, specified by the coordinates of its
395
+ center in the root lattice::
396
+
397
+ sage: W = L.weyl_group()
398
+ sage: L.plot(reflection_hyperplanes=False, alcoves=[[0,0]], bounding_box=2)
399
+ Graphics3d Object
400
+
401
+ .. PLOT::
402
+ :width: 300 px
403
+
404
+ L = RootSystem(["A",3,1]).ambient_space()
405
+ W = L.weyl_group()
406
+ sphinx_plot(L.plot(reflection_hyperplanes=False, alcoves=[[0,0]], bounding_box=2))
407
+
408
+ Finally, we draw the alcoves in the classical fundamental chambers,
409
+ using that those are indexed by the elements of the Weyl group having
410
+ no other left descent than `0`. In order to see the inner structure,
411
+ we only draw the wireframe of the facets of the alcoves. Specifying
412
+ the ``wireframe`` option requires a more flexible syntax for plots
413
+ which will be explained later on in this tutorial::
414
+
415
+ sage: L = RootSystem(["B",3,1]).ambient_space()
416
+ sage: W = L.weyl_group()
417
+ sage: alcoves = [~w for d in range(12)
418
+ ....: for w in W.affine_grassmannian_elements_of_given_length(d)]
419
+ sage: p = L.plot_fundamental_chamber("classical")
420
+ sage: p += L.plot_alcoves(alcoves=alcoves, wireframe=True)
421
+ sage: p += L.plot_fundamental_weights()
422
+ sage: p.show(frame=False)
423
+
424
+ .. PLOT::
425
+ :width: 300 px
426
+
427
+ L = RootSystem(["B",3,1]).ambient_space()
428
+ W = L.weyl_group()
429
+ alcoves = [~w for d in range(12) for w in W.affine_grassmannian_elements_of_given_length(d)]
430
+ p = L.plot_fundamental_chamber("classical")
431
+ p += L.plot_alcoves(alcoves=alcoves, wireframe=True)
432
+ p += L.plot_fundamental_weights()
433
+ sphinx_plot(p)
434
+
435
+ .. TOPIC:: Exercises
436
+
437
+ #. Draw the fundamental alcove in the ambient space, just by
438
+ itself (no reflection hyperplane, root, ...). The automorphism
439
+ group of the Dynkin diagram for `A_3^{(1)}` (a cycle of length 4)
440
+ is the dihedral group. Visualize the corresponding symmetries
441
+ of the fundamental alcove.
442
+
443
+ #. Draw the fundamental alcoves for the other rank 4 affine types,
444
+ and recover the automorphism groups of their Dynkin diagram
445
+ from the pictures.
446
+
447
+ Drawing on top of a root system plot
448
+ ------------------------------------
449
+
450
+ The root system plots have been designed to be used as wallpaper on
451
+ top of which to draw more information. In the following example, we
452
+ draw an alcove walk, specified by a word of indices of simple
453
+ reflections, on top of the weight lattice in affine type `A_{2,1}`::
454
+
455
+ sage: L = RootSystem(["A",2,1]).ambient_space()
456
+ sage: w1 = [0,2,1,2,0,2,1,0,2,1,2,1,2,0,2,0,1,2,0]
457
+ sage: L.plot(alcove_walk=w1, bounding_box=6) # long time
458
+ Graphics object consisting of 535 graphics primitives
459
+
460
+ .. PLOT::
461
+ :width: 300 px
462
+
463
+ L = RootSystem(["A",2,1]).ambient_space()
464
+ w1 = [0,2,1,2,0,2,1,0,2,1,2,1,2,0,2,0,1,2,0]
465
+ sphinx_plot(L.plot(alcove_walk=w1, bounding_box=6))
466
+
467
+ Now, what about drawing several alcove walks, and specifying some
468
+ colors? A single do-it-all plot method would be cumbersome; so
469
+ instead, it is actually built on top of many methods (see the list
470
+ below) that can be called independently and combined at will::
471
+
472
+ sage: L.plot_roots() + L.plot_reflection_hyperplanes()
473
+ Graphics object consisting of 12 graphics primitives
474
+
475
+ .. PLOT::
476
+ :width: 300 px
477
+
478
+ L = RootSystem(["A",2,1]).ambient_space()
479
+ w1 = [0,2,1,2,0,2,1,0,2,1,2,1,2,0,2,0,1,2,0]
480
+ sphinx_plot(L.plot_roots() + L.plot_reflection_hyperplanes())
481
+
482
+ .. NOTE::
483
+
484
+ By default the axes are disabled in root system plots since they
485
+ tend to pollute the picture. Annoyingly they come back when
486
+ combining them. Here is a workaround::
487
+
488
+ sage: p = L.plot_roots() + L.plot_reflection_hyperplanes()
489
+ sage: p.axes(False)
490
+ sage: p
491
+ Graphics object consisting of 12 graphics primitives
492
+
493
+ .. PLOT::
494
+ :width: 300 px
495
+
496
+ L = RootSystem(["A",2,1]).ambient_space()
497
+ p = L.plot_roots() + L.plot_reflection_hyperplanes()
498
+ p.axes(False)
499
+ sphinx_plot(p)
500
+
501
+ In order to specify common information for all the pieces of a root
502
+ system plot (choice of projection, bounding box, color code for the
503
+ index set, ...), the easiest is to create an option object using
504
+ :meth:`~sage.combinat.root_system.root_lattice_realizations.RootLatticeRealizations.ParentMethods.plot_parse_options`,
505
+ and pass it down to each piece. We use this to plot our two walks::
506
+
507
+ sage: # long time
508
+ sage: plot_options = L.plot_parse_options(bounding_box=[[-2,5],[-2,6]])
509
+ sage: w2 = [2,1,2,0,2,0,2,1,2,0,1,2,1,2,1,0,1,2,0,2,0,1,2,0,2]
510
+ sage: p = L.plot_alcoves(plot_options=plot_options)
511
+ sage: p += L.plot_alcove_walk(w1, color='green',
512
+ ....: plot_options=plot_options)
513
+ sage: p += L.plot_alcove_walk(w2, color='orange',
514
+ ....: plot_options=plot_options)
515
+ sage: p
516
+ Graphics object consisting of ... graphics primitives
517
+
518
+ .. PLOT::
519
+ :width: 300 px
520
+
521
+ L = RootSystem(["A",2,1]).ambient_space()
522
+ w1 = [0,2,1,2,0,2,1,0,2,1,2,1,2,0,2,0,1,2,0]
523
+ plot_options = L.plot_parse_options(bounding_box=[[-2,5],[-2,6]])
524
+ w2 = [2,1,2,0,2,0,2,1,2,0,1,2,1,2,1,0,1,2,0,2,0,1,2,0,2]
525
+ sphinx_plot(L.plot_alcoves(plot_options=plot_options)
526
+ + L.plot_alcove_walk(w1, color='green', plot_options=plot_options)
527
+ + L.plot_alcove_walk(w2, color='orange', plot_options=plot_options))
528
+
529
+ And another with some foldings::
530
+
531
+ sage: p += L.plot_alcove_walk([0,1,2,0,2,0,1,2,0,1],
532
+ ....: foldings=[False, False, True, False, False,
533
+ ....: False, True, False, True, False],
534
+ ....: color='purple')
535
+ sage: p.axes(False)
536
+ sage: p.show(figsize=20)
537
+
538
+ .. PLOT::
539
+ :width: 300 px
540
+
541
+ L = RootSystem(["A",2,1]).ambient_space()
542
+ w1 = [0,2,1,2,0,2,1,0,2,1,2,1,2,0,2,0,1,2,0]
543
+ plot_options = L.plot_parse_options(bounding_box=[[-2,5],[-2,6]])
544
+ w2 = [2,1,2,0,2,0,2,1,2,0,1,2,1,2,1,0,1,2,0,2,0,1,2,0,2]
545
+ p = L.plot_alcoves(plot_options=plot_options)
546
+ p += L.plot_alcove_walk(w1, color='green', plot_options=plot_options)
547
+ p += L.plot_alcove_walk(w2, color='orange', plot_options=plot_options)
548
+ p += L.plot_alcove_walk([0,1,2,0,2,0,1,2,0,1],
549
+ foldings=[False, False, True, False, False, False, True, False, True, False],
550
+ color='purple')
551
+ p.axes(False)
552
+ sphinx_plot(p)
553
+
554
+ Here we show a weight at level `0` and the reduced word implementing
555
+ the translation by this weight::
556
+
557
+ sage: # long time
558
+ sage: L = RootSystem(["A",2,1]).ambient_space()
559
+ sage: P = RootSystem(["A",2,1]).weight_space(extended=True)
560
+ sage: Lambda = P.fundamental_weights()
561
+ sage: t = 6*Lambda[1] - 2*Lambda[2] - 4*Lambda[0]
562
+ sage: walk = L.reduced_word_of_translation(L(t))
563
+ sage: plot_options = L.plot_parse_options(bounding_box=[[-2,5],[-2,5]])
564
+ sage: p = L.plot(plot_options=plot_options)
565
+ sage: p += L.plot_alcove_walk(walk, color='green',
566
+ ....: plot_options=plot_options)
567
+ sage: p += plot_options.family_of_vectors({t: L(t)})
568
+ sage: plot_options.finalize(p)
569
+ Graphics object consisting of ... graphics primitives
570
+ sage: p
571
+ Graphics object consisting of ... graphics primitives
572
+
573
+ .. PLOT::
574
+ :width: 300 px
575
+
576
+ L = RootSystem(["A",2,1]).ambient_space()
577
+ P = RootSystem(["A",2,1]).weight_space(extended=True)
578
+ Lambda = P.fundamental_weights()
579
+ t = 6*Lambda[1] - 2*Lambda[2] - 4*Lambda[0]
580
+ walk = L.reduced_word_of_translation(L(t))
581
+ plot_options = L.plot_parse_options(bounding_box=[[-2,5],[-2,5]])
582
+ p = L.plot(plot_options=plot_options) # long time
583
+ p += L.plot_alcove_walk(walk, color='green', plot_options=plot_options)
584
+ p += plot_options.family_of_vectors({t: L(t)})
585
+ plot_options.finalize(p)
586
+ sphinx_plot(p)
587
+
588
+ Note that the coloring of the translated alcove does not match with
589
+ that of the fundamental alcove: the translation actually lives in the
590
+ extended Weyl group and is the composition of the simple reflections
591
+ indexed by the alcove walk together with a rotation implementing an
592
+ automorphism of the Dynkin diagram.
593
+
594
+ We conclude with a rank `3 + 1` alcove walk::
595
+
596
+ sage: L = RootSystem(["B",3,1]).ambient_space()
597
+ sage: w3 = [0,2,1,3,2,0,2,1,0,2,3,1,2,1,3,2,0,2,0,1,2,0]
598
+ sage: (L.plot_fundamental_weights()
599
+ ....: + L.plot_reflection_hyperplanes(bounding_box=2) + L.plot_alcove_walk(w3))
600
+ Graphics3d Object
601
+
602
+ .. PLOT::
603
+ :width: 300 px
604
+
605
+ L = RootSystem(["B",3,1]).ambient_space()
606
+ w3 = [0,2,1,3,2,0,2,1,0,2,3,1,2,1,3,2,0,2,0,1,2,0]
607
+ sphinx_plot(L.plot_fundamental_weights()
608
+ + L.plot_reflection_hyperplanes(bounding_box=2)
609
+ + L.plot_alcove_walk(w3))
610
+
611
+ .. TOPIC:: Exercise
612
+
613
+ #. Draw the tiling of 3D space by the fundamental polygons for
614
+ types A,B,C,D. Hints: use the ``wireframe`` option of
615
+ :meth:`RootLatticeRealizations.ParentMethods.plot_alcoves` and
616
+ the ``color`` option of :meth:`plot` to only draw the alcove
617
+ facets indexed by `0`.
618
+
619
+ .. TOPIC:: Solution
620
+
621
+ ::
622
+
623
+ sage: L = RootSystem(["A",3,1]).ambient_space()
624
+ sage: alcoves = cartesian_product([[0,1],[0,1],[0,1]])
625
+ sage: color = lambda i: "black" if i==0 else None
626
+ sage: L.plot_alcoves(alcoves=alcoves, color=color, # long time
627
+ ....: bounding_box=10, wireframe=True).show(frame=False)
628
+
629
+ .. PLOT::
630
+ :width: 300 px
631
+
632
+ L = RootSystem(["A",3,1]).ambient_space()
633
+ alcoves = cartesian_product([[0,1],[0,1],[0,1]])
634
+ color = lambda i: "black" if i==0 else None
635
+ sphinx_plot(L.plot_alcoves(alcoves=alcoves, color=color, bounding_box=10,wireframe=True))
636
+
637
+ Hand drawing on top of a root system plot (aka Coxeter graph paper)
638
+ -------------------------------------------------------------------
639
+
640
+ Taken from John Stembridge's excellent
641
+ `data archive <http://www.math.lsa.umich.edu/~jrs/archive.html>`_:
642
+
643
+ "If you've ever worked with affine reflection groups, you've probably
644
+ wasted lots of time drawing the reflecting hyperplanes of the rank 2
645
+ groups on scraps of paper. You may also have wished you had pads of
646
+ graph paper with these lines drawn in for you. If so, you've come to
647
+ the right place. Behold! Coxeter graph paper!".
648
+
649
+ Now you can create your own customized color Coxeter graph paper::
650
+
651
+ sage: L = RootSystem(["C",2,1]).ambient_space()
652
+ sage: p = L.plot(bounding_box=[[-8,9],[-5,7]], # long time (10 s)
653
+ ....: coroots='simple')
654
+ sage: p # long time
655
+ Graphics object consisting of ... graphics primitives
656
+
657
+ .. PLOT::
658
+ :width: 300 px
659
+
660
+ L = RootSystem(["C",2,1]).ambient_space()
661
+ sphinx_plot(L.plot(bounding_box=[[-8,9],[-5,7]], coroots='simple'))
662
+
663
+ By default Sage's plot are bitmap pictures which would come out ugly
664
+ if printed on paper. Instead, we recommend saving the picture in
665
+ postscript or svg before printing it::
666
+
667
+ sage: p.save("C21paper.eps") # not tested
668
+
669
+ .. NOTE::
670
+
671
+ Drawing pictures with a large number of alcoves is currently
672
+ somewhat ridiculously slow. This is due to the use of generic code
673
+ that works uniformly in all dimension rather than taylor-made code
674
+ for 2D. Things should improve with the fast interface to the PPL
675
+ library (see e.g. :issue:`12553`).
676
+
677
+ Drawing custom objects on top of a root system plot
678
+ ---------------------------------------------------
679
+
680
+ So far so good. Now, what if one wants to draw, on top of a root
681
+ system plot, some object for which there is no preexisting plot
682
+ method? Again, the ``plot_options`` object come in handy, as it can be
683
+ used to compute appropriate coordinates. Here we draw the
684
+ permutohedron, that is the Cayley graph of the symmetric group `W`, by
685
+ positioning each element `w` at `w(\rho)`, where `\rho` is in the
686
+ fundamental alcove::
687
+
688
+ sage: L = RootSystem(["A",2]).ambient_space()
689
+ sage: rho = L.rho()
690
+ sage: plot_options = L.plot_parse_options()
691
+ sage: W = L.weyl_group()
692
+ sage: g = W.cayley_graph(side='right')
693
+ sage: positions = {w: plot_options.projection(w.action(rho)) for w in W}
694
+ sage: p = L.plot_alcoves()
695
+ sage: p += g.plot(pos=positions, vertex_size=0,
696
+ ....: color_by_label=plot_options.color)
697
+ sage: p.axes(False)
698
+ sage: p
699
+ Graphics object consisting of 30 graphics primitives
700
+
701
+ .. PLOT::
702
+ :width: 300 px
703
+
704
+ L = RootSystem(["A",2]).ambient_space()
705
+ rho = L.rho()
706
+ plot_options = L.plot_parse_options()
707
+ W = L.weyl_group()
708
+ g = W.cayley_graph(side='right')
709
+ positions = {w: plot_options.projection(w.action(rho)) for w in W}
710
+ p = L.plot_alcoves()
711
+ p += g.plot(pos = positions, vertex_size=0, color_by_label=plot_options.color)
712
+ p.axes(False)
713
+ sphinx_plot(p)
714
+
715
+ .. TODO:: Could we have nice `\LaTeX` labels in this graph?
716
+
717
+ The same picture for `A_3` gives a nice 3D permutohedron::
718
+
719
+ sage: L = RootSystem(["A",3]).ambient_space()
720
+ sage: rho = L.rho()
721
+ sage: plot_options = L.plot_parse_options()
722
+ sage: W = L.weyl_group()
723
+ sage: g = W.cayley_graph(side='right')
724
+ sage: positions = {w: plot_options.projection(w.action(rho)) for w in W}
725
+ sage: p = L.plot_roots()
726
+ sage: p += g.plot3d(pos3d=positions, color_by_label=plot_options.color)
727
+ sage: p
728
+ Graphics3d Object
729
+
730
+ .. PLOT::
731
+ :width: 300 px
732
+
733
+ L = RootSystem(["A",3]).ambient_space()
734
+ rho = L.rho()
735
+ plot_options = L.plot_parse_options()
736
+ W = L.weyl_group()
737
+ g = W.cayley_graph(side='right')
738
+ positions = {w: plot_options.projection(w.action(rho)) for w in W}
739
+ sphinx_plot(L.plot_roots() + g.plot3d(pos3d=positions, color_by_label=plot_options.color))
740
+
741
+ .. TOPIC:: Exercises
742
+
743
+ #. Locate the identity element of `W` in the previous picture
744
+
745
+ #. Rotate the picture appropriately to highlight the
746
+ various symmetries of the permutohedron.
747
+
748
+ #. Make a function out of the previous example, and
749
+ explore the Cayley graphs of all rank 2 and 3 Weyl groups.
750
+
751
+ #. Draw the root poset for type `B_2` and `B_3`
752
+
753
+ #. Draw the root poset for type `E_8` to recover the picture from
754
+ :wikipedia:`File:E8_3D.png`
755
+
756
+ Similarly, we display a crystal graph by positioning each element
757
+ according to its weight::
758
+
759
+ sage: C = crystals.Tableaux(["A",2], shape=[4,2])
760
+ sage: L = C.weight_lattice_realization()
761
+ sage: plot_options = L.plot_parse_options()
762
+
763
+ sage: g = C.digraph()
764
+ sage: positions = {x: plot_options.projection(x.weight()) for x in C}
765
+ sage: p = L.plot()
766
+ sage: p += g.plot(pos=positions,
767
+ ....: color_by_label=plot_options.color, vertex_size=0)
768
+ sage: p.axes(False)
769
+ sage: p.show(figsize=15)
770
+
771
+ .. PLOT::
772
+ :width: 300 px
773
+
774
+ C = crystals.Tableaux(["A",2], shape=[4,2])
775
+ L = C.weight_lattice_realization()
776
+ plot_options = L.plot_parse_options()
777
+ g = C.digraph()
778
+ positions = {x: plot_options.projection(x.weight()) for x in C}
779
+ p = L.plot()
780
+ p += g.plot(pos=positions, color_by_label=plot_options.color, vertex_size=0)
781
+ p.axes(False)
782
+ sphinx_plot(p)
783
+
784
+ .. NOTE::
785
+
786
+ In the above picture, many pairs of tableaux have the
787
+ same weight and are thus superposed (look for example
788
+ near the center). Some more layout logic would be
789
+ needed to separate those nodes properly, but the
790
+ foundations are laid firmly and uniformly across all
791
+ types of root systems for writing such extensions.
792
+
793
+ Here is an analogue picture in 3D::
794
+
795
+ sage: C = crystals.Tableaux(["A",3], shape=[3,2,1])
796
+ sage: L = C.weight_lattice_realization()
797
+ sage: plot_options = L.plot_parse_options()
798
+ sage: g = C.digraph()
799
+ sage: positions = {x: plot_options.projection(x.weight()) for x in C}
800
+ sage: p = L.plot(reflection_hyperplanes=False, fundamental_weights=False)
801
+ sage: p += g.plot3d(pos3d=positions, vertex_labels=True,
802
+ ....: color_by_label=plot_options.color, edge_labels=True)
803
+ sage: p
804
+ Graphics3d Object
805
+
806
+ .. TOPIC:: Exercise
807
+
808
+ Explore the previous picture and notice how the edges
809
+ of the crystal graph are parallel to the simple roots.
810
+
811
+
812
+ Enjoy and please post your best pictures on the
813
+ `Sage-Combinat wiki <http://wiki.sagemath.org/combinat/CoolPictures>`_.
814
+ """
815
+ # ****************************************************************************
816
+ # Copyright (C) 2013 Nicolas M. Thiery <nthiery at users.sf.net>
817
+ #
818
+ # Distributed under the terms of the GNU General Public License (GPL)
819
+ # https://www.gnu.org/licenses/
820
+ # ****************************************************************************
821
+
822
+ from sage.misc.cachefunc import cached_method, cached_function
823
+ from sage.misc.latex import latex
824
+ from sage.misc.lazy_import import lazy_import
825
+ from sage.structure.element import parent
826
+ from sage.modules.free_module_element import vector
827
+ from sage.rings.integer_ring import ZZ
828
+ from sage.rings.rational_field import QQ
829
+ from sage.combinat.root_system.cartan_type import CartanType
830
+ lazy_import("sage.combinat.root_system.root_lattice_realizations",
831
+ "RootLatticeRealizations")
832
+
833
+
834
+ class PlotOptions:
835
+ r"""
836
+ A class for plotting options for root lattice realizations.
837
+
838
+ .. SEEALSO::
839
+
840
+ - :meth:`RootLatticeRealizations.ParentMethods.plot()
841
+ <sage.combinat.root_system.root_lattice_realizations.RootLatticeRealizations.ParentMethods.plot>`
842
+ for a description of the plotting options
843
+ - :ref:`sage.combinat.root_system.plot` for a tutorial on root
844
+ system plotting
845
+ """
846
+
847
+ def __init__(self, space,
848
+ projection=True,
849
+ bounding_box=3,
850
+ color=CartanType.color,
851
+ labels=True,
852
+ level=None,
853
+ affine=None,
854
+ arrowsize=5,
855
+ ):
856
+ r"""
857
+ TESTS::
858
+
859
+ sage: L = RootSystem(['B',2,1]).weight_space()
860
+ sage: options = L.plot_parse_options()
861
+ sage: options.dimension
862
+ 2
863
+ sage: options._projections
864
+ [Weight space over the Rational Field of the Root system of type ['B', 2],
865
+ <bound method RootLatticeRealizations.ParentMethods._plot_projection
866
+ of Weight space over the Rational Field of the Root system of type ['B', 2]>]
867
+
868
+ sage: L = RootSystem(['B',2,1]).ambient_space()
869
+ sage: options = L.plot_parse_options()
870
+ sage: options.dimension
871
+ 2
872
+ sage: options._projections
873
+ [Ambient space of the Root system of type ['B', 2],
874
+ <bound method RootLatticeRealizations.ParentMethods._plot_projection
875
+ of Ambient space of the Root system of type ['B', 2]>]
876
+
877
+ sage: options = L.plot_parse_options(affine=True)
878
+ sage: options.dimension
879
+ 2
880
+ sage: options._projections
881
+ [Ambient space of the Root system of type ['B', 2],
882
+ <bound method RootLatticeRealizations.ParentMethods._plot_projection
883
+ of Ambient space of the Root system of type ['B', 2]>]
884
+
885
+ sage: options = L.plot_parse_options(affine=False)
886
+ sage: options._projections
887
+ [<bound method AmbientSpace._plot_projection
888
+ of Ambient space of the Root system of type ['B', 2, 1]>]
889
+ sage: options.dimension
890
+ 3
891
+
892
+ sage: options = L.plot_parse_options(affine=False,
893
+ ....: projection='barycentric')
894
+ sage: options._projections
895
+ [<bound method RootLatticeRealizations.ParentMethods._plot_projection_barycentric
896
+ of Ambient space of the Root system of type ['B', 2, 1]>]
897
+ sage: options.dimension
898
+ 3
899
+ """
900
+ self.space = space
901
+ self._color = color
902
+ self._arrowsize = arrowsize
903
+ self.labels = labels
904
+
905
+ # self.level = l != None: whether to intersect the alcove picture at level l
906
+ # self.affine: whether to project at level l and then onto the classical space
907
+
908
+ if affine is None:
909
+ affine = space.cartan_type().is_affine()
910
+ if affine:
911
+ if level is None:
912
+ level = 1
913
+ if not space.cartan_type().is_affine():
914
+ raise ValueError("affine option only valid for affine types")
915
+ projections = [space.classical()]
916
+ projection_space = space.classical()
917
+ else:
918
+ projections = []
919
+ projection_space = space
920
+
921
+ self.affine = affine
922
+ self.level = level
923
+
924
+ if projection is True:
925
+ projections.append(projection_space._plot_projection)
926
+ elif projection == "barycentric":
927
+ projections.append(projection_space._plot_projection_barycentric)
928
+ elif projection is not False:
929
+ # assert projection is a callable
930
+ projections.append(projection)
931
+
932
+ self._projections = projections
933
+
934
+ self.origin_projected = self.projection(space.zero())
935
+
936
+ self.dimension = len(self.origin_projected)
937
+
938
+ # Bounding box
939
+ from sage.rings.real_mpfr import RR
940
+ from sage.geometry.polyhedron.constructor import Polyhedron
941
+ from itertools import product
942
+ if bounding_box in RR:
943
+ bounding_box = [[-bounding_box,bounding_box]] * self.dimension
944
+ else:
945
+ if not len(bounding_box) == self.dimension:
946
+ raise TypeError("bounding_box argument doesn't match with the plot dimension")
947
+ elif not all(len(b) == 2 for b in bounding_box):
948
+ raise TypeError("Invalid bounding box %s" % bounding_box)
949
+ self.bounding_box = Polyhedron(vertices=product(*bounding_box))
950
+
951
+ @cached_method
952
+ def in_bounding_box(self, x):
953
+ r"""
954
+ Return whether ``x`` is in the bounding box.
955
+
956
+ INPUT:
957
+
958
+ - ``x`` -- an element of the root lattice realization
959
+
960
+ This method is currently one of the bottlenecks, and therefore
961
+ cached.
962
+
963
+ EXAMPLES::
964
+
965
+ sage: L = RootSystem(["A",2,1]).ambient_space()
966
+ sage: options = L.plot_parse_options()
967
+ sage: alpha = L.simple_roots()
968
+ sage: options.in_bounding_box(alpha[1])
969
+ True
970
+ sage: options.in_bounding_box(3*alpha[1])
971
+ False
972
+ """
973
+ return self.bounding_box.contains(self.projection(x))
974
+
975
+ def text(self, label, position, rgbcolor=(0,0,0)):
976
+ r"""
977
+ Return text widget with label ``label`` at position ``position``.
978
+
979
+ INPUT:
980
+
981
+ - ``label`` -- string or Sage object upon which latex will be called
982
+
983
+ - ``position`` -- a position
984
+
985
+ - ``rgbcolor`` -- the color as an RGB tuple
986
+
987
+ EXAMPLES::
988
+
989
+ sage: L = RootSystem(["A",2]).root_lattice()
990
+ sage: options = L.plot_parse_options()
991
+ sage: list(options.text("coucou", [0,1]))
992
+ [Text 'coucou' at the point (0.0,1.0)]
993
+ sage: list(options.text(L.simple_root(1), [0,1]))
994
+ [Text '$\alpha_{1}$' at the point (0.0,1.0)]
995
+ sage: list(options.text(L.simple_root(2), [1,0], rgbcolor=(1,0.5,0)))
996
+ [Text '$\alpha_{2}$' at the point (1.0,0.0)]
997
+
998
+ sage: options = L.plot_parse_options(labels=False)
999
+ sage: options.text("coucou", [0,1])
1000
+ 0
1001
+
1002
+ sage: options = RootSystem(["B",3]).root_lattice().plot_parse_options()
1003
+ sage: print(options.text("coucou", [0,1,2]).x3d_str())
1004
+ <Transform translation='0 1 2'>
1005
+ <Shape><Text string='coucou' solid='true'/><Appearance><Material diffuseColor='0.0 0.0 0.0' shininess='1.0' specularColor='0.0 0.0 0.0'/></Appearance></Shape>
1006
+ <BLANKLINE>
1007
+ </Transform>
1008
+ """
1009
+ if self.labels:
1010
+ if self.dimension <= 2:
1011
+ if not isinstance(label, str):
1012
+ label = "$"+str(latex(label))+"$"
1013
+ from sage.plot.text import text
1014
+ return text(label, position, fontsize=15, rgbcolor=rgbcolor)
1015
+ elif self.dimension == 3:
1016
+ # LaTeX labels not yet supported in 3D
1017
+ if isinstance(label, str):
1018
+ label = label.replace("{","").replace("}","").replace("$","").replace("_","")
1019
+ else:
1020
+ label = str(label)
1021
+ from sage.plot.plot3d.shapes2 import text3d
1022
+ return text3d(label, position, rgbcolor=rgbcolor)
1023
+ else:
1024
+ raise NotImplementedError("Plots in dimension > 3")
1025
+ else:
1026
+ return self.empty()
1027
+
1028
+ def index_of_object(self, i):
1029
+ """
1030
+ Try to return the node of the Dynkin diagram indexing the object `i`.
1031
+
1032
+ OUTPUT: a node of the Dynkin diagram or ``None``
1033
+
1034
+ EXAMPLES::
1035
+
1036
+ sage: L = RootSystem(["A",3]).root_lattice()
1037
+ sage: alpha = L.simple_roots()
1038
+ sage: omega = RootSystem(["A",3]).weight_lattice().fundamental_weights()
1039
+ sage: options = L.plot_parse_options(labels=False)
1040
+ sage: options.index_of_object(3)
1041
+ 3
1042
+ sage: options.index_of_object(alpha[1])
1043
+ 1
1044
+ sage: options.index_of_object(omega[2])
1045
+ 2
1046
+ sage: options.index_of_object(omega[2]+omega[3])
1047
+ sage: options.index_of_object(30)
1048
+ sage: options.index_of_object("bla")
1049
+ """
1050
+ if parent(i) in RootLatticeRealizations and len(i) == 1 and i.leading_coefficient().is_one():
1051
+ i = i.leading_support()
1052
+ if i in self.space.cartan_type().index_set():
1053
+ return i
1054
+ return None
1055
+
1056
+ def thickness(self, i):
1057
+ r"""
1058
+ Return the thickness to be used for lines indexed by `i`.
1059
+
1060
+ INPUT:
1061
+
1062
+ - ``i`` -- an index
1063
+
1064
+ .. SEEALSO:: :meth:`index_of_object`
1065
+
1066
+ EXAMPLES::
1067
+
1068
+ sage: L = RootSystem(["A",2,1]).root_lattice()
1069
+ sage: options = L.plot_parse_options(labels=False)
1070
+ sage: alpha = L.simple_roots()
1071
+ sage: options.thickness(0)
1072
+ 2
1073
+ sage: options.thickness(1)
1074
+ 1
1075
+ sage: options.thickness(2)
1076
+ 1
1077
+ sage: for alpha in L.simple_roots():
1078
+ ....: print("{} {}".format(alpha, options.thickness(alpha)))
1079
+ alpha[0] 2
1080
+ alpha[1] 1
1081
+ alpha[2] 1
1082
+ """
1083
+ ct = self.space.cartan_type()
1084
+ if ct.is_affine() and ct.special_node() == self.index_of_object(i):
1085
+ return 2
1086
+ else:
1087
+ return 1
1088
+
1089
+ def color(self, i):
1090
+ r"""
1091
+ Return the color to be used for objects indexed by `i`.
1092
+
1093
+ INPUT:
1094
+
1095
+ - ``i`` -- an index
1096
+
1097
+ .. SEEALSO:: :meth:`index_of_object`
1098
+
1099
+ EXAMPLES::
1100
+
1101
+ sage: L = RootSystem(["A",2]).root_lattice()
1102
+ sage: options = L.plot_parse_options(labels=False)
1103
+ sage: alpha = L.simple_roots()
1104
+ sage: options.color(1)
1105
+ 'blue'
1106
+ sage: options.color(2)
1107
+ 'red'
1108
+ sage: for alpha in L.roots():
1109
+ ....: print("{} {}".format(alpha, options.color(alpha)))
1110
+ alpha[1] blue
1111
+ alpha[2] red
1112
+ alpha[1] + alpha[2] black
1113
+ -alpha[1] black
1114
+ -alpha[2] black
1115
+ -alpha[1] - alpha[2] black
1116
+ """
1117
+ return self._color(self.index_of_object(i))
1118
+
1119
+ def projection(self, v):
1120
+ r"""
1121
+ Return the projection of ``v``.
1122
+
1123
+ INPUT:
1124
+
1125
+ - ``x`` -- an element of the root lattice realization
1126
+
1127
+ OUTPUT: an immutable vector with integer or rational coefficients
1128
+
1129
+ EXAMPLES::
1130
+
1131
+ sage: L = RootSystem(["A",2,1]).ambient_space()
1132
+ sage: options = L.plot_parse_options()
1133
+ sage: options.projection(L.rho())
1134
+ (0, 989/571)
1135
+
1136
+ sage: options = L.plot_parse_options(projection=False)
1137
+ sage: options.projection(L.rho())
1138
+ (2, 1, 0)
1139
+ """
1140
+ for projection in self._projections:
1141
+ v = projection(v)
1142
+ v = vector(v)
1143
+ v.set_immutable()
1144
+ return v
1145
+
1146
+ def intersection_at_level_1(self, x):
1147
+ r"""
1148
+ Return ``x`` scaled at the appropriate level, if level is set;
1149
+ otherwise return ``x``.
1150
+
1151
+ INPUT:
1152
+
1153
+ - ``x`` -- an element of the root lattice realization
1154
+
1155
+ EXAMPLES::
1156
+
1157
+ sage: L = RootSystem(["A",2,1]).weight_space()
1158
+ sage: options = L.plot_parse_options()
1159
+ sage: options.intersection_at_level_1(L.rho())
1160
+ 1/3*Lambda[0] + 1/3*Lambda[1] + 1/3*Lambda[2]
1161
+
1162
+ sage: options = L.plot_parse_options(affine=False, level=2)
1163
+ sage: options.intersection_at_level_1(L.rho())
1164
+ 2/3*Lambda[0] + 2/3*Lambda[1] + 2/3*Lambda[2]
1165
+
1166
+ When ``level`` is not set, ``x`` is returned::
1167
+
1168
+ sage: options = L.plot_parse_options(affine=False)
1169
+ sage: options.intersection_at_level_1(L.rho())
1170
+ Lambda[0] + Lambda[1] + Lambda[2]
1171
+ """
1172
+ if self.level is not None:
1173
+ return x * self.level / x.level()
1174
+ else:
1175
+ return x
1176
+
1177
+ def empty(self, *args):
1178
+ r"""
1179
+ Return an empty plot.
1180
+
1181
+ EXAMPLES::
1182
+
1183
+ sage: L = RootSystem(["A",2]).root_lattice()
1184
+ sage: options = L.plot_parse_options(labels=True)
1185
+
1186
+ This currently returns ``int(0)``::
1187
+
1188
+ sage: options.empty()
1189
+ 0
1190
+
1191
+ This is not a plot, so may cause some corner cases. On the
1192
+ other hand, `0` behaves as a fast neutral element, which is
1193
+ important given the typical idioms used in the plotting code::
1194
+
1195
+ sage: p = point([0,0])
1196
+ sage: p + options.empty() is p
1197
+ True
1198
+ """
1199
+ return 0
1200
+ # if self.dimension == 2:
1201
+ # from sage.plot.graphics import Graphics
1202
+ # G = Graphics()
1203
+ # elif self.dimension == 3:
1204
+ # from sage.plot.plot3d.base import Graphics3dGroup
1205
+ # G = Graphics3dGroup()
1206
+ # else:
1207
+ # assert False, "Dimension too high (or too low!)"
1208
+ # self.finalize(G)
1209
+ # return G
1210
+
1211
+ def finalize(self, G):
1212
+ r"""
1213
+ Finalize a root system plot.
1214
+
1215
+ INPUT:
1216
+
1217
+ - ``G`` -- a root system plot or ``0``
1218
+
1219
+ This sets the aspect ratio to 1 and remove the axes. This
1220
+ should be called by all the user-level plotting methods of
1221
+ root systems. This will become mostly obsolete when
1222
+ customization options won't be lost anymore upon addition of
1223
+ graphics objects and there will be a proper empty object for
1224
+ 2D and 3D plots.
1225
+
1226
+ EXAMPLES::
1227
+
1228
+ sage: L = RootSystem(["B",2,1]).ambient_space()
1229
+ sage: options = L.plot_parse_options()
1230
+ sage: p = L.plot_roots(plot_options=options)
1231
+ sage: p += L.plot_coroots(plot_options=options)
1232
+ sage: p.axes()
1233
+ True
1234
+ sage: p = options.finalize(p)
1235
+ sage: p.axes()
1236
+ False
1237
+ sage: p.aspect_ratio()
1238
+ 1.0
1239
+
1240
+ sage: options = L.plot_parse_options(affine=False)
1241
+ sage: p = L.plot_roots(plot_options=options)
1242
+ sage: p += point([[1,1,0]])
1243
+ sage: p = options.finalize(p)
1244
+ sage: p.aspect_ratio()
1245
+ [1.0, 1.0, 1.0]
1246
+
1247
+ If the input is ``0``, this returns an empty graphics object::
1248
+
1249
+ sage: type(options.finalize(0))
1250
+ <class 'sage.plot.plot3d.base.Graphics3dGroup'>
1251
+
1252
+ sage: options = L.plot_parse_options()
1253
+ sage: type(options.finalize(0))
1254
+ <class 'sage.plot.graphics.Graphics'>
1255
+ sage: list(options.finalize(0))
1256
+ []
1257
+ """
1258
+ from sage.plot.graphics import Graphics
1259
+ if self.dimension == 2:
1260
+ if G == 0:
1261
+ G = Graphics()
1262
+ G.set_aspect_ratio(1)
1263
+ # TODO: make this customizable
1264
+ G.axes(False)
1265
+ elif self.dimension == 3:
1266
+ if G == 0:
1267
+ from sage.plot.plot3d.base import Graphics3dGroup
1268
+ G = Graphics3dGroup()
1269
+ G.aspect_ratio(1)
1270
+ # TODO: Configuration axes
1271
+ return G
1272
+
1273
+ def family_of_vectors(self, vectors):
1274
+ r"""
1275
+ Return a plot of a family of vectors.
1276
+
1277
+ INPUT:
1278
+
1279
+ - ``vectors`` -- family or vectors in ``self``
1280
+
1281
+ The vectors are labelled by their index.
1282
+
1283
+ EXAMPLES::
1284
+
1285
+ sage: L = RootSystem(["A",2]).root_lattice()
1286
+ sage: options = L.plot_parse_options()
1287
+ sage: alpha = L.simple_roots()
1288
+ sage: p = options.family_of_vectors(alpha); p
1289
+ Graphics object consisting of 4 graphics primitives
1290
+ sage: list(p)
1291
+ [Arrow from (0.0,0.0) to (1.0,0.0),
1292
+ Text '$1$' at the point (1.05,0.0),
1293
+ Arrow from (0.0,0.0) to (0.0,1.0),
1294
+ Text '$2$' at the point (0.0,1.05)]
1295
+
1296
+ Handling of colors and labels::
1297
+
1298
+ sage: def color(i):
1299
+ ....: return "purple" if i==1 else None
1300
+ sage: options = L.plot_parse_options(labels=False, color=color)
1301
+ sage: p = options.family_of_vectors(alpha)
1302
+ sage: list(p)
1303
+ [Arrow from (0.0,0.0) to (1.0,0.0)]
1304
+ sage: p[0].options()['rgbcolor']
1305
+ 'purple'
1306
+
1307
+ Matplotlib emits a warning for arrows of length 0 and draws
1308
+ nothing anyway. So we do not draw them at all::
1309
+
1310
+ sage: L = RootSystem(["A",2,1]).ambient_space()
1311
+ sage: options = L.plot_parse_options()
1312
+ sage: Lambda = L.fundamental_weights()
1313
+ sage: p = options.family_of_vectors(Lambda); p
1314
+ Graphics object consisting of 5 graphics primitives
1315
+ sage: list(p)
1316
+ [Text '$0$' at the point (0.0,0.0),
1317
+ Arrow from (0.0,0.0) to (0.5,0.86602451838...),
1318
+ Text '$1$' at the point (0.525,0.909325744308...),
1319
+ Arrow from (0.0,0.0) to (-0.5,0.86602451838...),
1320
+ Text '$2$' at the point (-0.525,0.909325744308...)]
1321
+ """
1322
+ from sage.plot.arrow import arrow
1323
+ tail = self.origin_projected
1324
+ G = self.empty()
1325
+ for i in vectors.keys():
1326
+ if self.color(i) is None:
1327
+ continue
1328
+ head = self.projection(vectors[i])
1329
+ if head != tail:
1330
+ G += arrow(tail, head, rgbcolor=self.color(i), arrowsize=self._arrowsize)
1331
+ G += self.text(i, 1.05*head)
1332
+ return self.finalize(G)
1333
+
1334
+ def cone(self, rays=[], lines=[], color='black', thickness=1, alpha=1, wireframe=False,
1335
+ label=None, draw_degenerate=True, as_polyhedron=False):
1336
+ r"""
1337
+ Return the cone generated by the given rays and lines.
1338
+
1339
+ INPUT:
1340
+
1341
+ - ``rays``, ``lines`` -- lists of elements of the root lattice
1342
+ realization (default: ``[]``)
1343
+
1344
+ - ``color`` -- a color (default: ``'black'``)
1345
+
1346
+ - ``alpha`` -- a number in the interval `[0, 1]` (default: `1`)
1347
+ the desired transparency
1348
+
1349
+ - ``label`` -- an object to be used as the label for this cone
1350
+ The label itself will be constructed by calling
1351
+ :func:`~sage.misc.latex.latex` or :func:`repr` on the
1352
+ object depending on the graphics backend.
1353
+
1354
+ - ``draw_degenerate`` -- boolean (default: ``True``)
1355
+ whether to draw cones with a degenerate intersection with
1356
+ the bounding box
1357
+
1358
+ - ``as_polyhedron`` -- boolean (default: ``False``)
1359
+ whether to return the result as a polyhedron, without
1360
+ clipping it to the bounding box, and without making a plot
1361
+ out of it (for testing purposes)
1362
+
1363
+ OUTPUT: a graphic object, a polyhedron, or ``0``
1364
+
1365
+ EXAMPLES::
1366
+
1367
+ sage: L = RootSystem(["A",2]).root_lattice()
1368
+ sage: options = L.plot_parse_options()
1369
+ sage: alpha = L.simple_roots()
1370
+ sage: p = options.cone(rays=[alpha[1]], lines=[alpha[2]],
1371
+ ....: color='green', label=2); p
1372
+ Graphics object consisting of 2 graphics primitives
1373
+ sage: list(p)
1374
+ [Polygon defined by 4 points,
1375
+ Text '$2$' at the point (3.15...,3.15...)]
1376
+ sage: options.cone(rays=[alpha[1]], lines=[alpha[2]],
1377
+ ....: color='green', label=2, as_polyhedron=True)
1378
+ A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 1 vertex, 1 ray, 1 line
1379
+
1380
+ An empty result, being outside of the bounding box::
1381
+
1382
+ sage: options = L.plot_parse_options(labels=True,
1383
+ ....: bounding_box=[[-10,-9]]*2)
1384
+ sage: options.cone(rays=[alpha[1]], lines=[alpha[2]],
1385
+ ....: color='green', label=2)
1386
+ 0
1387
+
1388
+ Test that the options are properly passed down::
1389
+
1390
+ sage: L = RootSystem(["A",2]).root_lattice()
1391
+ sage: options = L.plot_parse_options()
1392
+ sage: p = options.cone(rays=[alpha[1] + alpha[2]],
1393
+ ....: color='green', label=2, thickness=4, alpha=.5)
1394
+ sage: list(p)
1395
+ [Line defined by 2 points, Text '$2$' at the point (3.15...,3.15...)]
1396
+ sage: sorted(p[0].options().items())
1397
+ [('alpha', 0.500000000000000), ('legend_color', None),
1398
+ ('legend_label', None), ('rgbcolor', 'green'), ('thickness', 4),
1399
+ ('zorder', 1)]
1400
+
1401
+ This method is tested indirectly but extensively by the
1402
+ various plot methods of root lattice realizations.
1403
+ """
1404
+ if color is None:
1405
+ return self.empty()
1406
+ from sage.geometry.polyhedron.constructor import Polyhedron
1407
+ # TODO: we currently convert lines into rays, which simplify a
1408
+ # bit the calculation of the intersection. But it would be
1409
+ # nice to benefit from the new ``lines`` option of Polyhedra
1410
+ rays = list(rays) + list(lines) + [-ray for ray in lines]
1411
+
1412
+ # Compute the intersection at level 1, if needed
1413
+ if self.level:
1414
+ old_rays = rays
1415
+ vertices = [self.intersection_at_level_1(ray) for ray in old_rays if ray.level() > 0]
1416
+ rays = [ray for ray in old_rays if ray.level() == 0]
1417
+ rays += [vertex - self.intersection_at_level_1(ray) for ray in old_rays if ray.level() < 0 for vertex in vertices]
1418
+ else:
1419
+ vertices = []
1420
+
1421
+ # Apply the projection (which is supposed to be affine)
1422
+ vertices = [ self.projection(vertex) for vertex in vertices ]
1423
+ rays = [ self.projection(ray)-self.projection(self.space.zero()) for ray in rays ]
1424
+ rays = [ ray for ray in rays if ray ] # Polyhedron does not accept yet zero rays
1425
+
1426
+ # Build the polyhedron
1427
+ p = Polyhedron(vertices=vertices, rays=rays)
1428
+ if as_polyhedron:
1429
+ return p
1430
+
1431
+ # Compute the intersection with the bounding box
1432
+ q = p & self.bounding_box
1433
+ if q.dim() >= 0 and p.dim() >= 0 and (draw_degenerate or p.dim() == q.dim()):
1434
+ if wireframe:
1435
+ options = dict(point=False, line=dict(width=10), polygon=False)
1436
+ center = q.center()
1437
+ q = q.translation(-center).dilation(ZZ(95)/ZZ(100)).translation(center)
1438
+ else:
1439
+ options = dict(wireframe=False, line={"thickness":thickness})
1440
+ result = q.plot(color=color, alpha=alpha, **options)
1441
+ if label is not None:
1442
+ # Put the label on the vertex having largest z, then y, then x coordinate.
1443
+ vertices = sorted([vector(v) for v in q.vertices()],
1444
+ key=lambda x: list(reversed(x)))
1445
+ result += self.text(label, 1.05*vector(vertices[-1]))
1446
+ return result
1447
+ else:
1448
+ return self.empty()
1449
+
1450
+ def reflection_hyperplane(self, coroot, as_polyhedron=False):
1451
+ r"""
1452
+ Return a plot of the reflection hyperplane indexed by this coroot.
1453
+
1454
+ - ``coroot`` -- a coroot
1455
+
1456
+ EXAMPLES::
1457
+
1458
+ sage: L = RootSystem(["B",2]).weight_space()
1459
+ sage: alphacheck = L.simple_coroots()
1460
+ sage: options = L.plot_parse_options()
1461
+ sage: H = options.reflection_hyperplane(alphacheck[1]); H
1462
+ Graphics object consisting of 2 graphics primitives
1463
+
1464
+ TESTS::
1465
+
1466
+ sage: print(H.description())
1467
+ Text '$H_{\alpha^\vee_{1}}$' at the point (0.0,3.15...)
1468
+ Line defined by 2 points: [(0.0, 3.0), (0.0, -3.0)]
1469
+
1470
+ ::
1471
+
1472
+ sage: L = RootSystem(["A",3,1]).ambient_space()
1473
+ sage: alphacheck = L.simple_coroots()
1474
+ sage: options = L.plot_parse_options()
1475
+ sage: H = options.reflection_hyperplane(alphacheck[1],
1476
+ ....: as_polyhedron=True); H
1477
+ A 2-dimensional polyhedron in QQ^3 defined as the convex hull of 1 vertex and 2 lines
1478
+ sage: H.lines()
1479
+ (A line in the direction (0, 0, 1), A line in the direction (0, 1, 0))
1480
+ sage: H.vertices()
1481
+ (A vertex at (0, 0, 0),)
1482
+
1483
+ ::
1484
+
1485
+ sage: all(options.reflection_hyperplane(c, as_polyhedron=True).dim() == 2
1486
+ ....: for c in alphacheck)
1487
+ True
1488
+
1489
+
1490
+ .. TODO::
1491
+
1492
+ Display the periodic orientation by adding a `+` and
1493
+ a `-` sign close to the label. Typically by using
1494
+ the associated root to shift a bit from the vertex
1495
+ upon which the hyperplane label is attached.
1496
+ """
1497
+ from sage.matrix.constructor import matrix
1498
+ L = self.space
1499
+ label = coroot
1500
+ # scalar currently only handles scalar product with
1501
+ # elements of self.coroot_lattice(). Furthermore, the
1502
+ # latter is misnamed: for ambient spaces, this does
1503
+ # not necessarily coincide with the coroot lattice of
1504
+ # the rootsystem. So we need to do a coercion.
1505
+ coroot = self.space.coroot_lattice()(coroot)
1506
+ # Compute the kernel of the linear form associated to the coroot
1507
+ vectors = matrix([b.scalar(coroot) for b in L.basis()]).right_kernel().basis()
1508
+ basis = [L.from_vector(v) for v in vectors]
1509
+ if self.dimension == 3: # LaTeX labels not yet supported in 3D
1510
+ text_label = "H_%s$" % (str(label))
1511
+ else:
1512
+ text_label = "$H_{%s}$" % (latex(label))
1513
+ return self.cone(lines=basis, color=self.color(label), label=text_label,
1514
+ as_polyhedron=as_polyhedron)
1515
+
1516
+
1517
+ @cached_function
1518
+ def barycentric_projection_matrix(n, angle=0):
1519
+ r"""
1520
+ Return a family of `n+1` vectors evenly spaced in a real vector space of dimension `n`.
1521
+
1522
+ Those vectors are of norm `1`, the scalar product between any two
1523
+ vector is `1/n`, thus the distance between two tips is constant.
1524
+
1525
+ The family is built recursively and uniquely determined by the
1526
+ following property: the last vector is `(0,\dots,0,-1)`, and the
1527
+ projection of the first `n` vectors in dimension `n-1`, after
1528
+ appropriate rescaling to norm `1`, retrieves the family for `n-1`.
1529
+
1530
+ OUTPUT:
1531
+
1532
+ A matrix with `n+1` columns of height `n` with rational or
1533
+ symbolic coefficients.
1534
+
1535
+ EXAMPLES:
1536
+
1537
+ One vector in dimension `0`::
1538
+
1539
+ sage: from sage.combinat.root_system.root_lattice_realizations import barycentric_projection_matrix
1540
+ sage: m = barycentric_projection_matrix(0); m
1541
+ []
1542
+ sage: matrix(QQ,0,1).nrows()
1543
+ 0
1544
+ sage: matrix(QQ,0,1).ncols()
1545
+ 1
1546
+
1547
+ Two vectors in dimension 1::
1548
+
1549
+ sage: barycentric_projection_matrix(1)
1550
+ [ 1 -1]
1551
+
1552
+ Three vectors in dimension 2::
1553
+
1554
+ sage: barycentric_projection_matrix(2)
1555
+ [ 1/2*sqrt(3) -1/2*sqrt(3) 0]
1556
+ [ 1/2 1/2 -1]
1557
+
1558
+ Four vectors in dimension 3::
1559
+
1560
+ sage: m = barycentric_projection_matrix(3); m
1561
+ [ 1/3*sqrt(3)*sqrt(2) -1/3*sqrt(3)*sqrt(2) 0 0]
1562
+ [ 1/3*sqrt(2) 1/3*sqrt(2) -2/3*sqrt(2) 0]
1563
+ [ 1/3 1/3 1/3 -1]
1564
+
1565
+ The columns give four vectors that sum up to zero::
1566
+
1567
+ sage: sum(m.columns())
1568
+ (0, 0, 0)
1569
+
1570
+ and have regular mutual angles::
1571
+
1572
+ sage: m.transpose()*m
1573
+ [ 1 -1/3 -1/3 -1/3]
1574
+ [-1/3 1 -1/3 -1/3]
1575
+ [-1/3 -1/3 1 -1/3]
1576
+ [-1/3 -1/3 -1/3 1]
1577
+
1578
+ Here is a plot of them::
1579
+
1580
+ sage: sum(arrow((0,0,0),x) for x in m.columns())
1581
+ Graphics3d Object
1582
+
1583
+ For 2D drawings of root systems, it is desirable to rotate the
1584
+ result to match with the usual conventions::
1585
+
1586
+ sage: barycentric_projection_matrix(2, angle=2*pi/3)
1587
+ [ 1/2 -1 1/2]
1588
+ [ 1/2*sqrt(3) 0 -1/2*sqrt(3)]
1589
+
1590
+ TESTS::
1591
+
1592
+ sage: for n in range(1, 7):
1593
+ ....: m = barycentric_projection_matrix(n)
1594
+ ....: assert sum(m.columns()).is_zero()
1595
+ ....: assert matrix(QQ, n+1,n+1, lambda i,j: 1 if i==j else -1/n) == m.transpose()*m
1596
+ """
1597
+ from sage.matrix.constructor import matrix
1598
+ from sage.misc.functional import sqrt
1599
+ n = ZZ(n)
1600
+ if n == 0:
1601
+ return matrix(QQ, 0, 1)
1602
+ a = 1/n
1603
+ b = sqrt(1-a**2)
1604
+ result = b * barycentric_projection_matrix(n-1)
1605
+ result = result.augment(vector([0]*(n-1)))
1606
+ result = result.stack(matrix([[a]*n+[-1]]))
1607
+ assert sum(result.columns()).is_zero()
1608
+ if angle and n == 2:
1609
+ from sage.functions.trig import sin
1610
+ from sage.functions.trig import cos
1611
+ rotation = matrix([[sin(angle), cos(angle)],
1612
+ [-cos(angle), sin(angle)]])
1613
+ result = rotation * result
1614
+ result.set_immutable()
1615
+ return result