passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl

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

Potentially problematic release.


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

Files changed (807) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
  12. sage/algebras/all__sagemath_modules.py +20 -0
  13. sage/algebras/catalog.py +148 -0
  14. sage/algebras/clifford_algebra.py +3107 -0
  15. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  16. sage/algebras/clifford_algebra_element.pxd +16 -0
  17. sage/algebras/clifford_algebra_element.pyx +997 -0
  18. sage/algebras/commutative_dga.py +4252 -0
  19. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
  20. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  21. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  22. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  29. sage/algebras/finite_gca.py +528 -0
  30. sage/algebras/group_algebra.py +232 -0
  31. sage/algebras/lie_algebras/abelian.py +197 -0
  32. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  33. sage/algebras/lie_algebras/all.py +25 -0
  34. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  35. sage/algebras/lie_algebras/bch.py +177 -0
  36. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  37. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  38. sage/algebras/lie_algebras/center_uea.py +767 -0
  39. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  40. sage/algebras/lie_algebras/examples.py +683 -0
  41. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  42. sage/algebras/lie_algebras/heisenberg.py +820 -0
  43. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  47. sage/algebras/lie_algebras/morphism.py +661 -0
  48. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  49. sage/algebras/lie_algebras/onsager.py +1324 -0
  50. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  51. sage/algebras/lie_algebras/quotient.py +462 -0
  52. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  53. sage/algebras/lie_algebras/representation.py +1040 -0
  54. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  55. sage/algebras/lie_algebras/subalgebra.py +967 -0
  56. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  57. sage/algebras/lie_algebras/verma_module.py +1630 -0
  58. sage/algebras/lie_algebras/virasoro.py +1186 -0
  59. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
  60. sage/algebras/octonion_algebra.pxd +20 -0
  61. sage/algebras/octonion_algebra.pyx +987 -0
  62. sage/algebras/orlik_solomon.py +907 -0
  63. sage/algebras/orlik_terao.py +779 -0
  64. sage/algebras/steenrod/all.py +7 -0
  65. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  66. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  67. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  68. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  69. sage/algebras/weyl_algebra.py +1126 -0
  70. sage/all__sagemath_modules.py +62 -0
  71. sage/calculus/all__sagemath_modules.py +19 -0
  72. sage/calculus/expr.py +205 -0
  73. sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
  84. sage/calculus/riemann.pyx +1521 -0
  85. sage/calculus/test_sympy.py +201 -0
  86. sage/calculus/transforms/all.py +7 -0
  87. sage/calculus/transforms/dft.py +844 -0
  88. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
  89. sage/calculus/transforms/dwt.pxd +7 -0
  90. sage/calculus/transforms/dwt.pyx +160 -0
  91. sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
  92. sage/calculus/transforms/fft.pxd +12 -0
  93. sage/calculus/transforms/fft.pyx +487 -0
  94. sage/calculus/wester.py +662 -0
  95. sage/coding/abstract_code.py +1108 -0
  96. sage/coding/ag_code.py +868 -0
  97. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
  98. sage/coding/ag_code_decoders.pyx +2639 -0
  99. sage/coding/all.py +15 -0
  100. sage/coding/bch_code.py +494 -0
  101. sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
  102. sage/coding/binary_code.pxd +124 -0
  103. sage/coding/binary_code.pyx +4139 -0
  104. sage/coding/bounds_catalog.py +43 -0
  105. sage/coding/channel.py +819 -0
  106. sage/coding/channels_catalog.py +29 -0
  107. sage/coding/code_bounds.py +755 -0
  108. sage/coding/code_constructions.py +804 -0
  109. sage/coding/codes_catalog.py +111 -0
  110. sage/coding/cyclic_code.py +1329 -0
  111. sage/coding/databases.py +316 -0
  112. sage/coding/decoder.py +373 -0
  113. sage/coding/decoders_catalog.py +88 -0
  114. sage/coding/delsarte_bounds.py +709 -0
  115. sage/coding/encoder.py +390 -0
  116. sage/coding/encoders_catalog.py +64 -0
  117. sage/coding/extended_code.py +468 -0
  118. sage/coding/gabidulin_code.py +1058 -0
  119. sage/coding/golay_code.py +404 -0
  120. sage/coding/goppa_code.py +441 -0
  121. sage/coding/grs_code.py +2371 -0
  122. sage/coding/guava.py +107 -0
  123. sage/coding/guruswami_sudan/all.py +1 -0
  124. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  125. sage/coding/guruswami_sudan/interpolation.py +409 -0
  126. sage/coding/guruswami_sudan/utils.py +176 -0
  127. sage/coding/hamming_code.py +176 -0
  128. sage/coding/information_set_decoder.py +1032 -0
  129. sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
  130. sage/coding/kasami_codes.pyx +351 -0
  131. sage/coding/linear_code.py +3067 -0
  132. sage/coding/linear_code_no_metric.py +1354 -0
  133. sage/coding/linear_rank_metric.py +961 -0
  134. sage/coding/parity_check_code.py +353 -0
  135. sage/coding/punctured_code.py +719 -0
  136. sage/coding/reed_muller_code.py +999 -0
  137. sage/coding/self_dual_codes.py +942 -0
  138. sage/coding/source_coding/all.py +2 -0
  139. sage/coding/source_coding/huffman.py +553 -0
  140. sage/coding/subfield_subcode.py +423 -0
  141. sage/coding/two_weight_db.py +399 -0
  142. sage/combinat/all__sagemath_modules.py +7 -0
  143. sage/combinat/cartesian_product.py +347 -0
  144. sage/combinat/family.py +11 -0
  145. sage/combinat/free_module.py +1977 -0
  146. sage/combinat/root_system/all.py +147 -0
  147. sage/combinat/root_system/ambient_space.py +527 -0
  148. sage/combinat/root_system/associahedron.py +471 -0
  149. sage/combinat/root_system/braid_move_calculator.py +143 -0
  150. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
  151. sage/combinat/root_system/braid_orbit.pyx +144 -0
  152. sage/combinat/root_system/branching_rules.py +2301 -0
  153. sage/combinat/root_system/cartan_matrix.py +1245 -0
  154. sage/combinat/root_system/cartan_type.py +3069 -0
  155. sage/combinat/root_system/coxeter_group.py +162 -0
  156. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  157. sage/combinat/root_system/coxeter_type.py +681 -0
  158. sage/combinat/root_system/dynkin_diagram.py +900 -0
  159. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  160. sage/combinat/root_system/fundamental_group.py +795 -0
  161. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  162. sage/combinat/root_system/integrable_representations.py +1227 -0
  163. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  164. sage/combinat/root_system/pieri_factors.py +1147 -0
  165. sage/combinat/root_system/plot.py +1615 -0
  166. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  167. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  168. sage/combinat/root_system/root_space.py +487 -0
  169. sage/combinat/root_system/root_system.py +882 -0
  170. sage/combinat/root_system/type_A.py +348 -0
  171. sage/combinat/root_system/type_A_affine.py +227 -0
  172. sage/combinat/root_system/type_A_infinity.py +241 -0
  173. sage/combinat/root_system/type_B.py +347 -0
  174. sage/combinat/root_system/type_BC_affine.py +287 -0
  175. sage/combinat/root_system/type_B_affine.py +216 -0
  176. sage/combinat/root_system/type_C.py +317 -0
  177. sage/combinat/root_system/type_C_affine.py +188 -0
  178. sage/combinat/root_system/type_D.py +357 -0
  179. sage/combinat/root_system/type_D_affine.py +208 -0
  180. sage/combinat/root_system/type_E.py +641 -0
  181. sage/combinat/root_system/type_E_affine.py +231 -0
  182. sage/combinat/root_system/type_F.py +387 -0
  183. sage/combinat/root_system/type_F_affine.py +137 -0
  184. sage/combinat/root_system/type_G.py +293 -0
  185. sage/combinat/root_system/type_G_affine.py +132 -0
  186. sage/combinat/root_system/type_H.py +105 -0
  187. sage/combinat/root_system/type_I.py +110 -0
  188. sage/combinat/root_system/type_Q.py +150 -0
  189. sage/combinat/root_system/type_affine.py +509 -0
  190. sage/combinat/root_system/type_dual.py +704 -0
  191. sage/combinat/root_system/type_folded.py +301 -0
  192. sage/combinat/root_system/type_marked.py +748 -0
  193. sage/combinat/root_system/type_reducible.py +601 -0
  194. sage/combinat/root_system/type_relabel.py +730 -0
  195. sage/combinat/root_system/type_super_A.py +837 -0
  196. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  197. sage/combinat/root_system/weight_space.py +639 -0
  198. sage/combinat/root_system/weyl_characters.py +2238 -0
  199. sage/crypto/__init__.py +4 -0
  200. sage/crypto/all.py +28 -0
  201. sage/crypto/block_cipher/all.py +7 -0
  202. sage/crypto/block_cipher/des.py +1065 -0
  203. sage/crypto/block_cipher/miniaes.py +2171 -0
  204. sage/crypto/block_cipher/present.py +909 -0
  205. sage/crypto/block_cipher/sdes.py +1527 -0
  206. sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
  207. sage/crypto/boolean_function.pxd +10 -0
  208. sage/crypto/boolean_function.pyx +1487 -0
  209. sage/crypto/cipher.py +78 -0
  210. sage/crypto/classical.py +3668 -0
  211. sage/crypto/classical_cipher.py +569 -0
  212. sage/crypto/cryptosystem.py +387 -0
  213. sage/crypto/key_exchange/all.py +7 -0
  214. sage/crypto/key_exchange/catalog.py +24 -0
  215. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  216. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  217. sage/crypto/lattice.py +312 -0
  218. sage/crypto/lfsr.py +295 -0
  219. sage/crypto/lwe.py +840 -0
  220. sage/crypto/mq/__init__.py +4 -0
  221. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  222. sage/crypto/mq/rijndael_gf.py +2345 -0
  223. sage/crypto/mq/sbox.py +7 -0
  224. sage/crypto/mq/sr.py +3344 -0
  225. sage/crypto/public_key/all.py +5 -0
  226. sage/crypto/public_key/blum_goldwasser.py +776 -0
  227. sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
  228. sage/crypto/sbox.pyx +2090 -0
  229. sage/crypto/sboxes.py +2090 -0
  230. sage/crypto/stream.py +390 -0
  231. sage/crypto/stream_cipher.py +297 -0
  232. sage/crypto/util.py +519 -0
  233. sage/ext/all__sagemath_modules.py +1 -0
  234. sage/ext/interpreters/__init__.py +1 -0
  235. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  236. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
  237. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  238. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  239. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
  240. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  241. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  242. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
  243. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  244. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  245. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
  246. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  247. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  248. sage/geometry/all__sagemath_modules.py +5 -0
  249. sage/geometry/toric_lattice.py +1745 -0
  250. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
  251. sage/geometry/toric_lattice_element.pyx +432 -0
  252. sage/groups/abelian_gps/abelian_group.py +1925 -0
  253. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  254. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  255. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  256. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  257. sage/groups/abelian_gps/element_base.py +341 -0
  258. sage/groups/abelian_gps/values.py +488 -0
  259. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  260. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  261. sage/groups/additive_abelian/all.py +4 -0
  262. sage/groups/additive_abelian/qmodnz.py +231 -0
  263. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  264. sage/groups/affine_gps/affine_group.py +535 -0
  265. sage/groups/affine_gps/all.py +1 -0
  266. sage/groups/affine_gps/catalog.py +17 -0
  267. sage/groups/affine_gps/euclidean_group.py +246 -0
  268. sage/groups/affine_gps/group_element.py +562 -0
  269. sage/groups/all__sagemath_modules.py +12 -0
  270. sage/groups/galois_group.py +479 -0
  271. sage/groups/matrix_gps/all.py +4 -0
  272. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  273. sage/groups/matrix_gps/catalog.py +26 -0
  274. sage/groups/matrix_gps/coxeter_group.py +927 -0
  275. sage/groups/matrix_gps/finitely_generated.py +487 -0
  276. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
  277. sage/groups/matrix_gps/group_element.pxd +11 -0
  278. sage/groups/matrix_gps/group_element.pyx +431 -0
  279. sage/groups/matrix_gps/linear.py +440 -0
  280. sage/groups/matrix_gps/matrix_group.py +617 -0
  281. sage/groups/matrix_gps/named_group.py +296 -0
  282. sage/groups/matrix_gps/orthogonal.py +544 -0
  283. sage/groups/matrix_gps/symplectic.py +251 -0
  284. sage/groups/matrix_gps/unitary.py +436 -0
  285. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  286. sage/groups/misc_gps/argument_groups.py +1905 -0
  287. sage/groups/misc_gps/imaginary_groups.py +479 -0
  288. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  296. sage/homology/algebraic_topological_model.py +595 -0
  297. sage/homology/all.py +2 -0
  298. sage/homology/all__sagemath_modules.py +8 -0
  299. sage/homology/chain_complex.py +2148 -0
  300. sage/homology/chain_complex_homspace.py +165 -0
  301. sage/homology/chain_complex_morphism.py +629 -0
  302. sage/homology/chain_homotopy.py +604 -0
  303. sage/homology/chains.py +653 -0
  304. sage/homology/free_resolution.py +923 -0
  305. sage/homology/graded_resolution.py +567 -0
  306. sage/homology/hochschild_complex.py +756 -0
  307. sage/homology/homology_group.py +188 -0
  308. sage/homology/homology_morphism.py +422 -0
  309. sage/homology/homology_vector_space_with_basis.py +1454 -0
  310. sage/homology/koszul_complex.py +169 -0
  311. sage/homology/matrix_utils.py +205 -0
  312. sage/libs/all__sagemath_modules.py +1 -0
  313. sage/libs/gsl/__init__.py +1 -0
  314. sage/libs/gsl/airy.pxd +56 -0
  315. sage/libs/gsl/all.pxd +66 -0
  316. sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
  317. sage/libs/gsl/array.pxd +5 -0
  318. sage/libs/gsl/array.pyx +102 -0
  319. sage/libs/gsl/bessel.pxd +208 -0
  320. sage/libs/gsl/blas.pxd +116 -0
  321. sage/libs/gsl/blas_types.pxd +34 -0
  322. sage/libs/gsl/block.pxd +52 -0
  323. sage/libs/gsl/chebyshev.pxd +37 -0
  324. sage/libs/gsl/clausen.pxd +12 -0
  325. sage/libs/gsl/combination.pxd +47 -0
  326. sage/libs/gsl/complex.pxd +151 -0
  327. sage/libs/gsl/coulomb.pxd +30 -0
  328. sage/libs/gsl/coupling.pxd +21 -0
  329. sage/libs/gsl/dawson.pxd +12 -0
  330. sage/libs/gsl/debye.pxd +24 -0
  331. sage/libs/gsl/dilog.pxd +14 -0
  332. sage/libs/gsl/eigen.pxd +46 -0
  333. sage/libs/gsl/elementary.pxd +12 -0
  334. sage/libs/gsl/ellint.pxd +48 -0
  335. sage/libs/gsl/elljac.pxd +8 -0
  336. sage/libs/gsl/erf.pxd +32 -0
  337. sage/libs/gsl/errno.pxd +26 -0
  338. sage/libs/gsl/exp.pxd +44 -0
  339. sage/libs/gsl/expint.pxd +44 -0
  340. sage/libs/gsl/fermi_dirac.pxd +44 -0
  341. sage/libs/gsl/fft.pxd +121 -0
  342. sage/libs/gsl/fit.pxd +50 -0
  343. sage/libs/gsl/gamma.pxd +94 -0
  344. sage/libs/gsl/gegenbauer.pxd +26 -0
  345. sage/libs/gsl/histogram.pxd +176 -0
  346. sage/libs/gsl/hyperg.pxd +52 -0
  347. sage/libs/gsl/integration.pxd +69 -0
  348. sage/libs/gsl/interp.pxd +109 -0
  349. sage/libs/gsl/laguerre.pxd +24 -0
  350. sage/libs/gsl/lambert.pxd +16 -0
  351. sage/libs/gsl/legendre.pxd +90 -0
  352. sage/libs/gsl/linalg.pxd +185 -0
  353. sage/libs/gsl/log.pxd +26 -0
  354. sage/libs/gsl/math.pxd +43 -0
  355. sage/libs/gsl/matrix.pxd +143 -0
  356. sage/libs/gsl/matrix_complex.pxd +130 -0
  357. sage/libs/gsl/min.pxd +67 -0
  358. sage/libs/gsl/monte.pxd +56 -0
  359. sage/libs/gsl/ntuple.pxd +32 -0
  360. sage/libs/gsl/odeiv.pxd +70 -0
  361. sage/libs/gsl/permutation.pxd +78 -0
  362. sage/libs/gsl/poly.pxd +40 -0
  363. sage/libs/gsl/pow_int.pxd +12 -0
  364. sage/libs/gsl/psi.pxd +28 -0
  365. sage/libs/gsl/qrng.pxd +29 -0
  366. sage/libs/gsl/random.pxd +257 -0
  367. sage/libs/gsl/rng.pxd +100 -0
  368. sage/libs/gsl/roots.pxd +72 -0
  369. sage/libs/gsl/sort.pxd +36 -0
  370. sage/libs/gsl/statistics.pxd +59 -0
  371. sage/libs/gsl/sum.pxd +55 -0
  372. sage/libs/gsl/synchrotron.pxd +16 -0
  373. sage/libs/gsl/transport.pxd +24 -0
  374. sage/libs/gsl/trig.pxd +58 -0
  375. sage/libs/gsl/types.pxd +137 -0
  376. sage/libs/gsl/vector.pxd +101 -0
  377. sage/libs/gsl/vector_complex.pxd +83 -0
  378. sage/libs/gsl/wavelet.pxd +49 -0
  379. sage/libs/gsl/zeta.pxd +28 -0
  380. sage/libs/mpc/__init__.pxd +114 -0
  381. sage/libs/mpc/types.pxd +28 -0
  382. sage/libs/mpfr/__init__.pxd +299 -0
  383. sage/libs/mpfr/types.pxd +26 -0
  384. sage/libs/mpmath/__init__.py +1 -0
  385. sage/libs/mpmath/all.py +27 -0
  386. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  387. sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
  388. sage/libs/mpmath/utils.pxd +4 -0
  389. sage/libs/mpmath/utils.pyx +319 -0
  390. sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
  391. sage/matrix/action.pxd +26 -0
  392. sage/matrix/action.pyx +596 -0
  393. sage/matrix/all.py +9 -0
  394. sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
  395. sage/matrix/args.pxd +144 -0
  396. sage/matrix/args.pyx +1668 -0
  397. sage/matrix/benchmark.py +1258 -0
  398. sage/matrix/berlekamp_massey.py +95 -0
  399. sage/matrix/compute_J_ideal.py +926 -0
  400. sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
  416. sage/matrix/matrix_cdv.pxd +4 -0
  417. sage/matrix/matrix_cdv.pyx +93 -0
  418. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  419. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  420. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  421. sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
  422. sage/matrix/matrix_dense.pxd +5 -0
  423. sage/matrix/matrix_dense.pyx +343 -0
  424. sage/matrix/matrix_domain_dense.pxd +5 -0
  425. sage/matrix/matrix_domain_sparse.pxd +5 -0
  426. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  427. sage/matrix/matrix_double_dense.pxd +7 -0
  428. sage/matrix/matrix_double_dense.pyx +3906 -0
  429. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  430. sage/matrix/matrix_double_sparse.pxd +6 -0
  431. sage/matrix/matrix_double_sparse.pyx +248 -0
  432. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
  433. sage/matrix/matrix_generic_dense.pxd +7 -0
  434. sage/matrix/matrix_generic_dense.pyx +354 -0
  435. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  436. sage/matrix/matrix_generic_sparse.pxd +7 -0
  437. sage/matrix/matrix_generic_sparse.pyx +461 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  441. sage/matrix/matrix_misc.py +313 -0
  442. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  443. sage/matrix/matrix_numpy_dense.pxd +14 -0
  444. sage/matrix/matrix_numpy_dense.pyx +450 -0
  445. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  446. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  447. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  448. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  449. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  450. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  451. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  452. sage/matrix/matrix_real_double_dense.pxd +7 -0
  453. sage/matrix/matrix_real_double_dense.pyx +122 -0
  454. sage/matrix/matrix_space.py +2848 -0
  455. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  456. sage/matrix/matrix_sparse.pxd +5 -0
  457. sage/matrix/matrix_sparse.pyx +1222 -0
  458. sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
  459. sage/matrix/matrix_window.pxd +37 -0
  460. sage/matrix/matrix_window.pyx +242 -0
  461. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  462. sage/matrix/misc_mpfr.pyx +80 -0
  463. sage/matrix/operation_table.py +1182 -0
  464. sage/matrix/special.py +3666 -0
  465. sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
  466. sage/matrix/strassen.pyx +851 -0
  467. sage/matrix/symplectic_basis.py +541 -0
  468. sage/matrix/template.pxd +6 -0
  469. sage/matrix/tests.py +71 -0
  470. sage/matroids/advanced.py +77 -0
  471. sage/matroids/all.py +13 -0
  472. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  473. sage/matroids/basis_exchange_matroid.pxd +96 -0
  474. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  475. sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  476. sage/matroids/basis_matroid.pxd +45 -0
  477. sage/matroids/basis_matroid.pyx +1217 -0
  478. sage/matroids/catalog.py +44 -0
  479. sage/matroids/chow_ring.py +473 -0
  480. sage/matroids/chow_ring_ideal.py +849 -0
  481. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  482. sage/matroids/circuit_closures_matroid.pxd +16 -0
  483. sage/matroids/circuit_closures_matroid.pyx +559 -0
  484. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  485. sage/matroids/circuits_matroid.pxd +38 -0
  486. sage/matroids/circuits_matroid.pyx +947 -0
  487. sage/matroids/constructor.py +1086 -0
  488. sage/matroids/database_collections.py +365 -0
  489. sage/matroids/database_matroids.py +5338 -0
  490. sage/matroids/dual_matroid.py +583 -0
  491. sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  495. sage/matroids/flats_matroid.pxd +28 -0
  496. sage/matroids/flats_matroid.pyx +715 -0
  497. sage/matroids/gammoid.py +600 -0
  498. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  499. sage/matroids/graphic_matroid.pxd +39 -0
  500. sage/matroids/graphic_matroid.pyx +2024 -0
  501. sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  502. sage/matroids/lean_matrix.pxd +126 -0
  503. sage/matroids/lean_matrix.pyx +3667 -0
  504. sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  505. sage/matroids/linear_matroid.pxd +180 -0
  506. sage/matroids/linear_matroid.pyx +6649 -0
  507. sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
  508. sage/matroids/matroid.pxd +243 -0
  509. sage/matroids/matroid.pyx +8759 -0
  510. sage/matroids/matroids_catalog.py +190 -0
  511. sage/matroids/matroids_plot_helpers.py +890 -0
  512. sage/matroids/minor_matroid.py +480 -0
  513. sage/matroids/minorfix.h +9 -0
  514. sage/matroids/named_matroids.py +5 -0
  515. sage/matroids/rank_matroid.py +268 -0
  516. sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
  517. sage/matroids/set_system.pxd +38 -0
  518. sage/matroids/set_system.pyx +800 -0
  519. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  520. sage/matroids/transversal_matroid.pxd +14 -0
  521. sage/matroids/transversal_matroid.pyx +893 -0
  522. sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  523. sage/matroids/union_matroid.pxd +20 -0
  524. sage/matroids/union_matroid.pyx +331 -0
  525. sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
  526. sage/matroids/unpickling.pyx +843 -0
  527. sage/matroids/utilities.py +809 -0
  528. sage/misc/all__sagemath_modules.py +20 -0
  529. sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
  530. sage/misc/c3.pyx +238 -0
  531. sage/misc/compat.py +87 -0
  532. sage/misc/element_with_label.py +173 -0
  533. sage/misc/func_persist.py +79 -0
  534. sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
  535. sage/misc/pickle_old.pyx +19 -0
  536. sage/misc/proof.py +7 -0
  537. sage/misc/replace_dot_all.py +472 -0
  538. sage/misc/sagedoc_conf.py +168 -0
  539. sage/misc/sphinxify.py +167 -0
  540. sage/misc/test_class_pickling.py +85 -0
  541. sage/modules/all.py +42 -0
  542. sage/modules/complex_double_vector.py +25 -0
  543. sage/modules/diamond_cutting.py +380 -0
  544. sage/modules/fg_pid/all.py +1 -0
  545. sage/modules/fg_pid/fgp_element.py +456 -0
  546. sage/modules/fg_pid/fgp_module.py +2091 -0
  547. sage/modules/fg_pid/fgp_morphism.py +550 -0
  548. sage/modules/filtered_vector_space.py +1271 -0
  549. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
  550. sage/modules/finite_submodule_iter.pxd +27 -0
  551. sage/modules/finite_submodule_iter.pyx +452 -0
  552. sage/modules/fp_graded/all.py +1 -0
  553. sage/modules/fp_graded/element.py +346 -0
  554. sage/modules/fp_graded/free_element.py +298 -0
  555. sage/modules/fp_graded/free_homspace.py +53 -0
  556. sage/modules/fp_graded/free_module.py +1060 -0
  557. sage/modules/fp_graded/free_morphism.py +217 -0
  558. sage/modules/fp_graded/homspace.py +563 -0
  559. sage/modules/fp_graded/module.py +1340 -0
  560. sage/modules/fp_graded/morphism.py +1990 -0
  561. sage/modules/fp_graded/steenrod/all.py +1 -0
  562. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  563. sage/modules/fp_graded/steenrod/module.py +477 -0
  564. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  565. sage/modules/fp_graded/steenrod/profile.py +241 -0
  566. sage/modules/free_module.py +8447 -0
  567. sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
  568. sage/modules/free_module_element.pxd +22 -0
  569. sage/modules/free_module_element.pyx +5445 -0
  570. sage/modules/free_module_homspace.py +369 -0
  571. sage/modules/free_module_integer.py +896 -0
  572. sage/modules/free_module_morphism.py +823 -0
  573. sage/modules/free_module_pseudohomspace.py +352 -0
  574. sage/modules/free_module_pseudomorphism.py +578 -0
  575. sage/modules/free_quadratic_module.py +1706 -0
  576. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  577. sage/modules/matrix_morphism.py +1745 -0
  578. sage/modules/misc.py +103 -0
  579. sage/modules/module_functors.py +192 -0
  580. sage/modules/multi_filtered_vector_space.py +719 -0
  581. sage/modules/ore_module.py +2208 -0
  582. sage/modules/ore_module_element.py +178 -0
  583. sage/modules/ore_module_homspace.py +147 -0
  584. sage/modules/ore_module_morphism.py +968 -0
  585. sage/modules/quotient_module.py +699 -0
  586. sage/modules/real_double_vector.py +22 -0
  587. sage/modules/submodule.py +255 -0
  588. sage/modules/tensor_operations.py +567 -0
  589. sage/modules/torsion_quadratic_module.py +1352 -0
  590. sage/modules/tutorial_free_modules.py +248 -0
  591. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  592. sage/modules/vector_complex_double_dense.pxd +6 -0
  593. sage/modules/vector_complex_double_dense.pyx +117 -0
  594. sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  595. sage/modules/vector_double_dense.pxd +6 -0
  596. sage/modules/vector_double_dense.pyx +604 -0
  597. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  598. sage/modules/vector_integer_dense.pxd +15 -0
  599. sage/modules/vector_integer_dense.pyx +361 -0
  600. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  601. sage/modules/vector_integer_sparse.pxd +29 -0
  602. sage/modules/vector_integer_sparse.pyx +406 -0
  603. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
  604. sage/modules/vector_modn_dense.pxd +12 -0
  605. sage/modules/vector_modn_dense.pyx +394 -0
  606. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  607. sage/modules/vector_modn_sparse.pxd +21 -0
  608. sage/modules/vector_modn_sparse.pyx +298 -0
  609. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  610. sage/modules/vector_numpy_dense.pxd +15 -0
  611. sage/modules/vector_numpy_dense.pyx +304 -0
  612. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  613. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  614. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  615. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
  616. sage/modules/vector_rational_dense.pxd +15 -0
  617. sage/modules/vector_rational_dense.pyx +387 -0
  618. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  619. sage/modules/vector_rational_sparse.pxd +30 -0
  620. sage/modules/vector_rational_sparse.pyx +413 -0
  621. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  622. sage/modules/vector_real_double_dense.pxd +6 -0
  623. sage/modules/vector_real_double_dense.pyx +126 -0
  624. sage/modules/vector_space_homspace.py +430 -0
  625. sage/modules/vector_space_morphism.py +989 -0
  626. sage/modules/with_basis/all.py +15 -0
  627. sage/modules/with_basis/cell_module.py +494 -0
  628. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
  629. sage/modules/with_basis/indexed_element.pxd +13 -0
  630. sage/modules/with_basis/indexed_element.pyx +1058 -0
  631. sage/modules/with_basis/invariant.py +1075 -0
  632. sage/modules/with_basis/morphism.py +1636 -0
  633. sage/modules/with_basis/representation.py +2939 -0
  634. sage/modules/with_basis/subquotient.py +685 -0
  635. sage/numerical/all__sagemath_modules.py +6 -0
  636. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
  637. sage/numerical/gauss_legendre.pyx +381 -0
  638. sage/numerical/optimize.py +910 -0
  639. sage/probability/all.py +10 -0
  640. sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
  641. sage/probability/probability_distribution.pyx +1242 -0
  642. sage/probability/random_variable.py +411 -0
  643. sage/quadratic_forms/all.py +4 -0
  644. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  645. sage/quadratic_forms/binary_qf.py +2042 -0
  646. sage/quadratic_forms/bqf_class_group.py +748 -0
  647. sage/quadratic_forms/constructions.py +93 -0
  648. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
  649. sage/quadratic_forms/count_local_2.pyx +365 -0
  650. sage/quadratic_forms/extras.py +195 -0
  651. sage/quadratic_forms/quadratic_form.py +1753 -0
  652. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  653. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  656. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  657. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  658. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  659. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  660. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  661. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  662. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  663. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  664. sage/quadratic_forms/random_quadraticform.py +209 -0
  665. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
  666. sage/quadratic_forms/ternary.pyx +1154 -0
  667. sage/quadratic_forms/ternary_qf.py +2027 -0
  668. sage/rings/all__sagemath_modules.py +28 -0
  669. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  670. sage/rings/asymptotic/misc.py +1252 -0
  671. sage/rings/cc.py +4 -0
  672. sage/rings/cfinite_sequence.py +1306 -0
  673. sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  674. sage/rings/complex_conversion.pxd +8 -0
  675. sage/rings/complex_conversion.pyx +23 -0
  676. sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
  677. sage/rings/complex_double.pxd +21 -0
  678. sage/rings/complex_double.pyx +2654 -0
  679. sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
  680. sage/rings/complex_mpc.pxd +21 -0
  681. sage/rings/complex_mpc.pyx +2576 -0
  682. sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  683. sage/rings/complex_mpfr.pxd +18 -0
  684. sage/rings/complex_mpfr.pyx +3602 -0
  685. sage/rings/derivation.py +2334 -0
  686. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  687. sage/rings/finite_rings/maps_finite_field.py +191 -0
  688. sage/rings/function_field/all__sagemath_modules.py +8 -0
  689. sage/rings/function_field/derivations.py +102 -0
  690. sage/rings/function_field/derivations_rational.py +132 -0
  691. sage/rings/function_field/differential.py +853 -0
  692. sage/rings/function_field/divisor.py +1107 -0
  693. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  694. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  695. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  696. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  697. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  698. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  699. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  700. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
  703. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  704. sage/rings/invariants/all.py +4 -0
  705. sage/rings/invariants/invariant_theory.py +4597 -0
  706. sage/rings/invariants/reconstruction.py +395 -0
  707. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  708. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  712. sage/rings/polynomial/ore_function_element.py +952 -0
  713. sage/rings/polynomial/ore_function_field.py +1028 -0
  714. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  715. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  716. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  717. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  720. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  721. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  722. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  723. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  730. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  731. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
  732. sage/rings/real_double_element_gsl.pxd +8 -0
  733. sage/rings/real_double_element_gsl.pyx +794 -0
  734. sage/rings/real_field.py +58 -0
  735. sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  736. sage/rings/real_mpfr.pxd +29 -0
  737. sage/rings/real_mpfr.pyx +6122 -0
  738. sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
  739. sage/rings/ring_extension.pxd +42 -0
  740. sage/rings/ring_extension.pyx +2779 -0
  741. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  742. sage/rings/ring_extension_conversion.pxd +16 -0
  743. sage/rings/ring_extension_conversion.pyx +462 -0
  744. sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
  745. sage/rings/ring_extension_element.pxd +21 -0
  746. sage/rings/ring_extension_element.pyx +1635 -0
  747. sage/rings/ring_extension_homset.py +64 -0
  748. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
  749. sage/rings/ring_extension_morphism.pxd +35 -0
  750. sage/rings/ring_extension_morphism.pyx +920 -0
  751. sage/schemes/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/coherent_sheaf.py +300 -0
  754. sage/schemes/projective/cohomology.py +510 -0
  755. sage/stats/all.py +15 -0
  756. sage/stats/basic_stats.py +489 -0
  757. sage/stats/distributions/all.py +7 -0
  758. sage/stats/distributions/catalog.py +34 -0
  759. sage/stats/distributions/dgs.h +50 -0
  760. sage/stats/distributions/dgs.pxd +111 -0
  761. sage/stats/distributions/dgs_bern.h +400 -0
  762. sage/stats/distributions/dgs_gauss.h +614 -0
  763. sage/stats/distributions/dgs_misc.h +104 -0
  764. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  767. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  768. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  769. sage/stats/hmm/all.py +15 -0
  770. sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
  773. sage/stats/hmm/distributions.pxd +29 -0
  774. sage/stats/hmm/distributions.pyx +531 -0
  775. sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
  776. sage/stats/hmm/hmm.pxd +17 -0
  777. sage/stats/hmm/hmm.pyx +1388 -0
  778. sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
  779. sage/stats/hmm/util.pxd +7 -0
  780. sage/stats/hmm/util.pyx +165 -0
  781. sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
  782. sage/stats/intlist.pxd +14 -0
  783. sage/stats/intlist.pyx +588 -0
  784. sage/stats/r.py +49 -0
  785. sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
  786. sage/stats/time_series.pxd +6 -0
  787. sage/stats/time_series.pyx +2546 -0
  788. sage/tensor/all.py +2 -0
  789. sage/tensor/modules/all.py +8 -0
  790. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  791. sage/tensor/modules/comp.py +5598 -0
  792. sage/tensor/modules/ext_pow_free_module.py +824 -0
  793. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  794. sage/tensor/modules/format_utilities.py +333 -0
  795. sage/tensor/modules/free_module_alt_form.py +858 -0
  796. sage/tensor/modules/free_module_automorphism.py +1207 -0
  797. sage/tensor/modules/free_module_basis.py +1074 -0
  798. sage/tensor/modules/free_module_element.py +284 -0
  799. sage/tensor/modules/free_module_homset.py +652 -0
  800. sage/tensor/modules/free_module_linear_group.py +564 -0
  801. sage/tensor/modules/free_module_morphism.py +1581 -0
  802. sage/tensor/modules/free_module_tensor.py +3289 -0
  803. sage/tensor/modules/reflexive_module.py +386 -0
  804. sage/tensor/modules/tensor_free_module.py +780 -0
  805. sage/tensor/modules/tensor_free_submodule.py +538 -0
  806. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  807. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,2993 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ # sage.doctest: needs sage.graphs sage.libs.gap
3
+ r"""
4
+ Extended affine Weyl groups
5
+
6
+ AUTHORS:
7
+
8
+ - Daniel Bump (2012): initial version
9
+ - Daniel Orr (2012): initial version
10
+ - Anne Schilling (2012): initial version
11
+ - Mark Shimozono (2012): initial version
12
+ - Nicolas M. Thiery (2012): initial version
13
+ - Mark Shimozono (2013): twisted affine root systems, multiple realizations, GL_n
14
+ """
15
+ # ***************************************************************************
16
+ # Copyright (C) 2012 Daniel Bump <bump at match.stanford.edu>,
17
+ # 2012 Daniel Orr <danorr at live.unc.edu>
18
+ # 2012 Anne Schilling <anne at math.ucdavis.edu>
19
+ # 2012 Mark Shimozono <mshimo at math.vt.edu>
20
+ # 2012 Nicolas M. Thiery <nthiery at users.sf.net>
21
+ #
22
+ # 2013 Mark Shimozono <mshimo at math.vt.edu>
23
+ #
24
+ # This program is free software: you can redistribute it and/or modify
25
+ # it under the terms of the GNU General Public License as published by
26
+ # the Free Software Foundation, either version 2 of the License, or
27
+ # (at your option) any later version.
28
+ # https://www.gnu.org/licenses/
29
+ # ***************************************************************************
30
+ from sage.combinat.root_system.cartan_type import CartanType
31
+ from sage.combinat.root_system.weyl_group import WeylGroup
32
+ from sage.categories.groups import Groups
33
+ from sage.categories.sets_cat import Sets
34
+ from sage.misc.cachefunc import cached_method
35
+ from sage.structure.parent import Parent
36
+ from sage.structure.unique_representation import UniqueRepresentation
37
+ from sage.sets.family import Family
38
+ from sage.categories.realizations import Category_realization_of_parent
39
+ from sage.misc.bindable_class import BindableClass
40
+ from sage.combinat.root_system.fundamental_group import FundamentalGroupOfExtendedAffineWeylGroup
41
+ from sage.misc.abstract_method import abstract_method
42
+ from sage.categories.morphism import SetMorphism
43
+ from sage.categories.homset import Hom
44
+ from sage.groups.group_exp import GroupExp
45
+ from sage.groups.group_semidirect_product import GroupSemidirectProduct
46
+ from sage.combinat.root_system.root_system import RootSystem
47
+ from sage.rings.finite_rings.integer_mod import Mod
48
+ from sage.modules.free_module_element import vector
49
+ from sage.rings.integer_ring import ZZ
50
+
51
+
52
+ def ExtendedAffineWeylGroup(cartan_type, general_linear=None, **print_options):
53
+ r"""
54
+ The extended affine Weyl group.
55
+
56
+ INPUT:
57
+
58
+ - ``cartan_type`` -- an affine or finite Cartan type (a finite Cartan type is an
59
+ abbreviation for its untwisted affinization)
60
+ - ``general_linear`` -- (default: ``None``) if ``True`` and ``cartan_type`` indicates
61
+ untwisted type A, returns the universal central extension
62
+ - ``print_options`` -- special instructions for printing elements (see below)
63
+
64
+ .. RUBRIC:: Mnemonics
65
+
66
+ - "P" -- subgroup of translations
67
+ - "Pv" -- subgroup of translations in a dual form
68
+ - "W0" -- classical Weyl group
69
+ - "W" -- affine Weyl group
70
+ - "F" -- fundamental group of length zero elements
71
+
72
+ There are currently six realizations: "PW0", "W0P, "WF", "FW", "PvW0", and "W0Pv".
73
+
74
+ "PW0" means the semidirect product of "P" with "W0" acting from the right.
75
+ "W0P" is similar but with "W0" acting from the left.
76
+ "WF" is the semidirect product of "W" with "F" acting from the right, etc.
77
+
78
+ Recognized arguments for ``print_options`` are:
79
+
80
+ - ``print_tuple`` -- boolean (default: ``False``); if ``True``, elements
81
+ are printed `(a,b)`, otherwise as `a * b`
82
+ - ``affine`` -- prefix for simple reflections in the affine Weyl group
83
+ - ``classical`` -- prefix for simple reflections in the classical Weyl group
84
+ - ``translation`` -- prefix for the translation elements
85
+ - ``fundamental`` -- prefix for the elements of the fundamental group
86
+
87
+ These options are not mutable.
88
+
89
+ The *extended affine Weyl group* was introduced in the following references.
90
+
91
+ REFERENCES:
92
+
93
+ .. [Iwahori] Iwahori,
94
+ *Generalized Tits system (Bruhat decomposition) on p-adic semisimple groups*.
95
+ 1966 Algebraic Groups and Discontinuous
96
+ Subgroups (AMS Proc. Symp. Pure Math.., 1965) pp. 71-83 Amer. Math. Soc.,
97
+ Providence, R.I.
98
+
99
+ .. [Bour] Bourbaki, *Lie Groups and Lie Algebras* IV.2
100
+
101
+ - [Ka1990]_
102
+
103
+ .. RUBRIC:: Notation
104
+
105
+ - `R` -- an irreducible affine root system
106
+ - `I` -- set of nodes of the Dynkin diagram of `R`
107
+ - `R_0` -- the classical subsystem of `R`
108
+ - `I_0` -- set of nodes of the Dynkin diagram of `R_0`
109
+ - `E` -- extended affine Weyl group of type `R`
110
+ - `W` -- affine Weyl group of type `R`
111
+ - `W_0` -- finite (classical) Weyl group (of type `R_0`)
112
+ - `M` -- translation lattice for `W`
113
+ - `L` -- translation lattice for `E`
114
+ - `F` -- fundamental subgroup of `E` (the length zero elements)
115
+ - `P` -- finite weight lattice
116
+ - `Q` -- finite root lattice
117
+ - `P^\vee` -- finite coweight lattice
118
+ - `Q^\vee` -- finite coroot lattice
119
+
120
+ .. RUBRIC:: Translation lattices
121
+
122
+ The styles "PW0" and "W0P" use the following lattices:
123
+
124
+ - Untwisted affine: `L = P^\vee`, `M = Q^\vee`
125
+ - Dual of untwisted affine: `L = P`, `M = Q`
126
+ - `BC_n` (`A_{2n}^{(2)}`): `L = M = P`
127
+ - Dual of `BC_n` (`A_{2n}^{(2)\dagger}`): `L = M = P^\vee`
128
+
129
+ The styles "PvW0" and "W0Pv" use the following lattices:
130
+
131
+ - Untwisted affine: The weight lattice of the dual finite Cartan type.
132
+ - Dual untwisted affine: The same as for "PW0" and "W0P".
133
+
134
+ For mixed affine type (`A_{2n}^{(2)}`, aka `\tilde{BC}_n`, and their affine duals)
135
+ the styles "PvW0" and "W0Pv" are not implemented.
136
+
137
+ .. RUBRIC:: Finite and affine Weyl groups `W_0` and `W`
138
+
139
+ The finite Weyl group `W_0` is generated by the simple reflections `s_i` for `i \in I_0` where
140
+ `s_i` is the reflection across a suitable hyperplane `H_i` through the origin in the
141
+ real span `V` of the lattice `M`.
142
+
143
+ `R` specifies another (affine) hyperplane `H_0`. The affine Weyl group `W` is generated by `W_0`
144
+ and the reflection `S_0` across `H_0`.
145
+
146
+ .. RUBRIC:: Extended affine Weyl group `E`
147
+
148
+ The complement in `V` of the set `H` of hyperplanes obtained from the `H_i` by the action of
149
+ `W`, has connected components called alcoves. `W` acts freely and transitively on the set
150
+ of alcoves. After the choice of a certain alcove (the fundamental alcove),
151
+ there is an induced bijection from `W` to the set of alcoves under which the identity
152
+ in `W` maps to the fundamental alcove.
153
+
154
+ Then `L` is the largest sublattice of `V`, whose translations stabilize the set of alcoves.
155
+
156
+ There are isomorphisms
157
+
158
+ .. MATH::
159
+
160
+ \begin{aligned}
161
+ W &\cong M \rtimes W_0 \cong W_0 \ltimes M \\
162
+ E &\cong L \rtimes W_0 \cong W_0 \ltimes L
163
+ \end{aligned}
164
+
165
+ .. RUBRIC:: Fundamental group of affine Dynkin automorphisms
166
+
167
+ Since `L` acts on the set of alcoves, the group `F = L/M` may be viewed as a
168
+ subgroup of the symmetries of the fundamental alcove or equivalently the
169
+ symmetries of the affine Dynkin diagram.
170
+ `F` acts on the set of alcoves and hence on `W`. Conjugation by an element of `F`
171
+ acts on `W` by permuting the indices of simple reflections.
172
+
173
+ There are isomorphisms
174
+
175
+ .. MATH::
176
+
177
+ E \cong F \ltimes W \cong W \rtimes F
178
+
179
+ An affine Dynkin node is *special* if it is conjugate to the zero node under some
180
+ affine Dynkin automorphism.
181
+
182
+ There is a bijection `i` `\mapsto` `\pi_i` from the set of special nodes
183
+ to the group `F`, where `\pi_i` is the unique element of `F` that sends `0` to `i`.
184
+ When `L=P` (resp. `L=P^\vee`) the element `\pi_i` is induced
185
+ (under the isomorphism `F \cong L/M`) by addition of the coset of the
186
+ `i`-th fundamental weight (resp. coweight).
187
+
188
+ The length function of the Coxeter group `W` may be extended to `E` by
189
+ `\ell(w \pi) = \ell(w)` where `w \in W` and `\pi\in F`.
190
+ This is the number of hyperplanes in `H` separating the
191
+ fundamental alcove from its image by `w \pi` (or equivalently `w`).
192
+
193
+ It is known that if `G` is the compact Lie group of adjoint type with root
194
+ system `R_0` then `F` is isomorphic to the fundamental group of `G`, or
195
+ to the center of its simply-connected covering group. That is why we
196
+ call `F` the *fundamental group*.
197
+
198
+ In the future we may want to build an element of the group from an appropriate linear map f
199
+ on some of the root lattice realizations for this Cartan type: W.from_endomorphism(f).
200
+
201
+ EXAMPLES::
202
+
203
+ sage: E = ExtendedAffineWeylGroup(["A",2,1]); E
204
+ Extended affine Weyl group of type ['A', 2, 1]
205
+ sage: type(E)
206
+ <class 'sage.combinat.root_system.extended_affine_weyl_group.ExtendedAffineWeylGroup_Class_with_category'>
207
+
208
+ sage: PW0 = E.PW0(); PW0
209
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
210
+ Multiplicative form of Coweight lattice of the Root system of type ['A', 2]
211
+ acted upon by Weyl Group of type ['A', 2]
212
+ (as a matrix group acting on the coweight lattice)
213
+
214
+ sage: W0P = E.W0P(); W0P
215
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
216
+ Weyl Group of type ['A', 2] (as a matrix group acting on the coweight lattice)
217
+ acting on Multiplicative form of Coweight lattice of the Root system of type ['A', 2]
218
+
219
+ sage: PvW0 = E.PvW0(); PvW0
220
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
221
+ Multiplicative form of Weight lattice of the Root system of type ['A', 2]
222
+ acted upon by Weyl Group of type ['A', 2]
223
+ (as a matrix group acting on the weight lattice)
224
+
225
+ sage: W0Pv = E.W0Pv(); W0Pv
226
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
227
+ Weyl Group of type ['A', 2] (as a matrix group acting on the weight lattice)
228
+ acting on Multiplicative form of Weight lattice of the Root system of type ['A', 2]
229
+
230
+ sage: WF = E.WF(); WF
231
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
232
+ Weyl Group of type ['A', 2, 1] (as a matrix group acting on the root lattice)
233
+ acted upon by Fundamental group of type ['A', 2, 1]
234
+
235
+ sage: FW = E.FW(); FW
236
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
237
+ Fundamental group of type ['A', 2, 1] acting on Weyl Group of type ['A', 2, 1]
238
+ (as a matrix group acting on the root lattice)
239
+
240
+ When the realizations are constructed from each other as above, there are built-in coercions between them. ::
241
+
242
+ sage: F = E.fundamental_group()
243
+ sage: x = WF.from_reduced_word([0,1,2]) * WF(F(2)); x
244
+ S0*S1*S2 * pi[2]
245
+ sage: FW(x)
246
+ pi[2] * S1*S2*S0
247
+ sage: W0P(x)
248
+ s1*s2*s1 * t[-2*Lambdacheck[1] - Lambdacheck[2]]
249
+ sage: PW0(x)
250
+ t[Lambdacheck[1] + 2*Lambdacheck[2]] * s1*s2*s1
251
+ sage: PvW0(x)
252
+ t[Lambda[1] + 2*Lambda[2]] * s1*s2*s1
253
+
254
+ The translation lattice and its distinguished basis are obtained from ``E``::
255
+
256
+ sage: L = E.lattice(); L
257
+ Coweight lattice of the Root system of type ['A', 2]
258
+ sage: b = E.lattice_basis(); b
259
+ Finite family {1: Lambdacheck[1], 2: Lambdacheck[2]}
260
+
261
+ Translation lattice elements can be coerced into any realization::
262
+
263
+ sage: PW0(b[1]-b[2])
264
+ t[Lambdacheck[1] - Lambdacheck[2]]
265
+ sage: FW(b[1]-b[2])
266
+ pi[2] * S0*S1
267
+
268
+ The dual form of the translation lattice and its basis are similarly obtained::
269
+
270
+ sage: Lv = E.dual_lattice(); Lv
271
+ Weight lattice of the Root system of type ['A', 2]
272
+ sage: bv = E.dual_lattice_basis(); bv
273
+ Finite family {1: Lambda[1], 2: Lambda[2]}
274
+ sage: FW(bv[1]-bv[2])
275
+ pi[2] * S0*S1
276
+
277
+ The abstract fundamental group is accessed from ``E``::
278
+
279
+ sage: F = E.fundamental_group(); F
280
+ Fundamental group of type ['A', 2, 1]
281
+
282
+ Its elements are indexed by the set of special nodes of the affine Dynkin diagram::
283
+
284
+ sage: E.cartan_type().special_nodes()
285
+ (0, 1, 2)
286
+ sage: F.special_nodes()
287
+ (0, 1, 2)
288
+ sage: [F(i) for i in F.special_nodes()]
289
+ [pi[0], pi[1], pi[2]]
290
+
291
+ There is a coercion from the fundamental group into each realization::
292
+
293
+ sage: F(2)
294
+ pi[2]
295
+ sage: WF(F(2))
296
+ pi[2]
297
+ sage: W0P(F(2))
298
+ s2*s1 * t[-Lambdacheck[1]]
299
+ sage: W0Pv(F(2))
300
+ s2*s1 * t[-Lambda[1]]
301
+
302
+ Using ``E`` one may access the classical and affine Weyl groups and their morphisms
303
+ into each realization::
304
+
305
+ sage: W0 = E.classical_weyl(); W0
306
+ Weyl Group of type ['A', 2] (as a matrix group acting on the coweight lattice)
307
+ sage: v = W0.from_reduced_word([1,2,1]); v
308
+ s1*s2*s1
309
+ sage: PW0(v)
310
+ s1*s2*s1
311
+ sage: WF(v)
312
+ S1*S2*S1
313
+ sage: W = E.affine_weyl(); W
314
+ Weyl Group of type ['A', 2, 1] (as a matrix group acting on the root lattice)
315
+ sage: w = W.from_reduced_word([2,1,0]); w
316
+ S2*S1*S0
317
+ sage: WF(w)
318
+ S2*S1*S0
319
+ sage: PW0(w)
320
+ t[Lambdacheck[1] - 2*Lambdacheck[2]] * s1
321
+
322
+ Note that for untwisted affine type, the dual form of the classical
323
+ Weyl group is isomorphic to the usual one, but acts on a different
324
+ lattice and is therefore different to sage::
325
+
326
+ sage: W0v = E.dual_classical_weyl(); W0v
327
+ Weyl Group of type ['A', 2] (as a matrix group acting on the weight lattice)
328
+ sage: v = W0v.from_reduced_word([1,2])
329
+ sage: x = PvW0(v); x
330
+ s1*s2
331
+ sage: y = PW0(v); y
332
+ s1*s2
333
+ sage: x.parent() == y.parent()
334
+ False
335
+
336
+ However, because there is a coercion from ``PvW0`` to ``PW0``,
337
+ the elements ``x`` and ``y`` compare as equal::
338
+
339
+ sage: x == y
340
+ True
341
+
342
+ An element can be created directly from a reduced word::
343
+
344
+ sage: PW0.from_reduced_word([2,1,0])
345
+ t[Lambdacheck[1] - 2*Lambdacheck[2]] * s1
346
+
347
+ Here is a demonstration of the printing options::
348
+
349
+ sage: E = ExtendedAffineWeylGroup(["A",2,1], affine='sx', classical='Sx',
350
+ ....: translation='x', fundamental='pix')
351
+ sage: PW0 = E.PW0()
352
+ sage: y = PW0(E.lattice_basis()[1]); y
353
+ x[Lambdacheck[1]]
354
+ sage: FW = E.FW()
355
+ sage: FW(y)
356
+ pix[1] * sx2*sx1
357
+ sage: PW0.an_element()
358
+ x[2*Lambdacheck[1] + 2*Lambdacheck[2]] * Sx1*Sx2
359
+
360
+ .. TODO::
361
+
362
+ - Implement a "slow" action of `E` on any affine root or weight lattice realization.
363
+ - Implement the level `m` actions of `E` and `W` on the lattices of finite type.
364
+ - Implement the relevant methods from the usual affine Weyl group
365
+ - Implementation by matrices: style "M".
366
+ - Use case: implement the Hecke algebra on top of this
367
+
368
+ The semidirect product construction in sage currently only
369
+ admits multiplicative groups. Therefore for the styles involving "P" and "Pv", one must
370
+ convert the additive group of translations `L` into a multiplicative group by
371
+ applying the :class:`sage.groups.group_exp.GroupExp` functor.
372
+
373
+ .. RUBRIC:: The general linear case
374
+
375
+ The general linear group is not semisimple. Sage can build its extended
376
+ affine Weyl group::
377
+
378
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], general_linear=True); E
379
+ Extended affine Weyl group of GL(3)
380
+
381
+ If the Cartan type is ``['A', n-1, 1]`` and the parameter ``general_linear`` is not
382
+ True, the extended affine Weyl group that is built will be for `SL_n`, not
383
+ `GL_n`. But if ``general_linear`` is True, let `W_a` and `W_e` be the affine and
384
+ extended affine Weyl groups. We make the following nonstandard definition: the
385
+ extended affine Weyl group `W_e(GL_n)` is defined by
386
+
387
+ .. MATH::
388
+
389
+ W_e(GL_n) = P(GL_n) \rtimes W
390
+
391
+ where `W` is the finite Weyl group (the symmetric group `S_n`) and `P(GL_n)` is the weight lattice
392
+ of `GL_n`, which is usually identified with the lattice `\ZZ^n` of `n`-tuples of integers::
393
+
394
+ sage: PW0 = E.PW0(); PW0
395
+ Extended affine Weyl group of GL(3) realized by Semidirect product of
396
+ Multiplicative form of Ambient space of the Root system of type ['A', 2] acted upon
397
+ by Weyl Group of type ['A', 2] (as a matrix group acting on the ambient space)
398
+ sage: PW0.an_element()
399
+ t[(2, 2, 3)] * s1*s2
400
+
401
+ There is an isomorphism
402
+
403
+ .. MATH::
404
+
405
+ W_e(GL_n) = \ZZ \ltimes W_a
406
+
407
+ where the group of integers `\ZZ` (with generator `\pi`) acts on `W_a` by
408
+
409
+ .. MATH::
410
+
411
+ \pi\, s_i\, \pi^{-1} = s_{i+1}
412
+
413
+ and the indices of the simple reflections are taken modulo `n`::
414
+
415
+ sage: FW = E.FW(); FW
416
+ Extended affine Weyl group of GL(3) realized by
417
+ Semidirect product of Fundamental group of GL(3) acting on
418
+ Weyl Group of type ['A', 2, 1] (as a matrix group acting on the root lattice)
419
+ sage: FW.an_element()
420
+ pi[5] * S0*S1*S2
421
+
422
+ We regard `\ZZ` as the fundamental group of affine type `GL_n`::
423
+
424
+ sage: F = E.fundamental_group(); F
425
+ Fundamental group of GL(3)
426
+ sage: F.special_nodes()
427
+ Integer Ring
428
+
429
+ sage: x = FW.from_fundamental(F(10)); x
430
+ pi[10]
431
+ sage: x*x
432
+ pi[20]
433
+ sage: E.PvW0()(x*x)
434
+ t[(7, 7, 6)] * s2*s1
435
+ """
436
+ cartan_type = CartanType(cartan_type)
437
+ if cartan_type.is_reducible():
438
+ raise ValueError("Extended affine Weyl groups are only implemented for irreducible affine Cartan types")
439
+ if cartan_type.is_finite(): # a finite Cartan type is an abbreviation for its untwisted affinization
440
+ cartan_type = cartan_type.affine()
441
+ elif not cartan_type.is_affine():
442
+ raise ValueError("Cartan type must be finite or affine")
443
+
444
+ return ExtendedAffineWeylGroup_Class(cartan_type, general_linear, **print_options)
445
+
446
+
447
+ class ExtendedAffineWeylGroup_Class(UniqueRepresentation, Parent):
448
+ r"""
449
+ The parent-with-realization class of an extended affine Weyl group.
450
+ """
451
+
452
+ def __init__(self, cartan_type, general_linear, **print_options):
453
+ r"""
454
+
455
+ EXAMPLES::
456
+
457
+ sage: E = ExtendedAffineWeylGroup(["D",3,2])
458
+ sage: E in Groups().Infinite()
459
+ True
460
+ sage: TestSuite(E).run()
461
+ """
462
+ if not cartan_type.is_affine():
463
+ raise ValueError("%s is not affine" % cartan_type)
464
+
465
+ self._cartan_type = cartan_type
466
+
467
+ self._prefixt = "t"
468
+ self._prefixf = "pi"
469
+ self._prefixcl = None
470
+ self._prefixaf = None
471
+ self._print_tuple = False
472
+
473
+ if general_linear is True:
474
+ self._general_linear = True
475
+ self._n = self._cartan_type.n + 1
476
+ else:
477
+ self._general_linear = False
478
+ for option in print_options:
479
+ if option == 'translation':
480
+ self._prefixt = print_options['translation']
481
+ elif option == 'fundamental':
482
+ self._prefixf = print_options['fundamental']
483
+ elif option == 'print_tuple':
484
+ self._print_tuple = print_options['print_tuple']
485
+ elif option == 'affine':
486
+ self._prefixaf = print_options['affine']
487
+ elif option == 'classical':
488
+ self._prefixcl = print_options['classical']
489
+ else:
490
+ raise ValueError("Print option %s is unrecognized" % option)
491
+
492
+ if self._prefixaf:
493
+ if not self._prefixcl:
494
+ if self._prefixaf.islower():
495
+ self._prefixcl = self._prefixaf.upper()
496
+ else:
497
+ self._prefixcl = self._prefixaf.lower()
498
+ elif self._prefixcl:
499
+ if self._prefixcl.islower():
500
+ self._prefixaf = self._prefixcl.upper()
501
+ else:
502
+ self._prefixaf = self._prefixcl.lower()
503
+ else:
504
+ self._prefixaf = "S"
505
+ self._prefixcl = "s"
506
+
507
+ self._ct0 = cartan_type.classical()
508
+ self._R0 = self._ct0.root_system()
509
+ self._I0 = self._ct0.index_set()
510
+ self._ct0v = self._ct0.dual()
511
+ self._R0v = self._ct0v.root_system()
512
+ self._a0check = self._cartan_type.acheck()[self._cartan_type.special_node()]
513
+
514
+ if self._cartan_type.is_untwisted_affine():
515
+ self._type = 'untwisted'
516
+ elif self._cartan_type.dual().is_untwisted_affine():
517
+ self._type = 'dual_untwisted'
518
+ elif self._a0check == 1:
519
+ # if there are three root lengths with the special affine node extra short
520
+ self._type = 'special_extra_short'
521
+ else:
522
+ # if there are three root lengths with the special affine node extra long
523
+ self._type = 'special_extra_long'
524
+ # this boolean is used to decide which translation lattice to use
525
+ self._untwisted = (self._type in ('untwisted', 'special_extra_long'))
526
+
527
+ # fundamental group
528
+ self._fundamental_group = FundamentalGroupOfExtendedAffineWeylGroup(cartan_type, prefix=self._prefixf, general_linear=self._general_linear)
529
+
530
+ # lattice data
531
+ if self._untwisted:
532
+ if self._general_linear:
533
+ self._lattice = self._R0.ambient_space()
534
+ self._simpleR0 = self._lattice.simple_roots()
535
+ else:
536
+ self._lattice = self._R0.coweight_lattice()
537
+ self._basis_name = 'Lambdacheck'
538
+ self._simpleR0 = self._R0.root_lattice().simple_roots()
539
+ self._basis = self._lattice.fundamental_weights()
540
+ if self._type == 'special_extra_long':
541
+ self._special_root = self._R0.coroot_lattice().highest_root()
542
+ # get the node adjacent to the special affine node
543
+ # the [0] is just taking the first and only list element among the neighbors of the distinguished node
544
+ node_adjacent_to_special = self._cartan_type.dynkin_diagram().neighbors(self._cartan_type.special_node())[0]
545
+ self._special_translation = self._lattice.fundamental_weight(node_adjacent_to_special)
546
+ else:
547
+ # untwisted affine case
548
+ self._special_root = self._R0.root_lattice().highest_root().associated_coroot()
549
+ self._special_translation = self._special_root
550
+ self._special_translation_covector = self._special_root.associated_coroot()
551
+ # in the "Pv" realization for the untwisted case, the weight lattice of dual type is used for translations
552
+ if self._general_linear:
553
+ self._dual_lattice = self._lattice
554
+ else:
555
+ self._dual_lattice = self._R0v.weight_lattice()
556
+ self._dual_basis_name = 'Lambda'
557
+ self._dual_basis = self._dual_lattice.fundamental_weights()
558
+ else:
559
+ self._lattice = self._R0.weight_lattice()
560
+ self._basis = self._lattice.fundamental_weights()
561
+ self._basis_name = 'Lambda'
562
+ self._simpleR0 = self._R0.coroot_lattice().simple_roots()
563
+ if self._type == 'special_extra_short':
564
+ self._special_root = self._R0.root_lattice().highest_root()
565
+ node_adjacent_to_special = self._cartan_type.dynkin_diagram().neighbors(self._cartan_type.special_node())[0]
566
+ self._special_translation = self._lattice.fundamental_weight(node_adjacent_to_special)
567
+ self._special_translation_covector = 2*self._special_root.associated_coroot()
568
+ else:
569
+ # dual untwisted case
570
+ self._special_root = self._R0.coroot_lattice().highest_root().associated_coroot()
571
+ self._special_translation = self._special_root
572
+ self._special_translation_covector = self._special_root.associated_coroot()
573
+
574
+ self._dual_lattice = self._lattice
575
+ self._dual_basis = self._basis
576
+ self._dual_basis_name = 'Lambda'
577
+
578
+ # classical and affine Weyl groups
579
+ self._W0 = WeylGroup(self._lattice, prefix=self._prefixcl)
580
+ self._W = WeylGroup(self._cartan_type.root_system().root_lattice(), prefix=self._prefixaf)
581
+ self._special_reflection = self._W0.from_reduced_word(self._special_root.associated_reflection())
582
+
583
+ if self._general_linear:
584
+ self._special_root = self._special_root.to_ambient()
585
+ self._special_translation = self._special_root
586
+ self._special_translation_covector = self._special_root
587
+
588
+ # "Pv" version of classical Weyl group; use same prefix as for W0
589
+ self._W0v = WeylGroup(self._dual_lattice, prefix=self._prefixcl)
590
+
591
+ # wrap the lattice into a multiplicative group for internal use in the semidirect product
592
+ self._exp_lattice = GroupExp()(self._lattice)
593
+ self._exp_dual_lattice = GroupExp()(self._dual_lattice)
594
+
595
+ self._extended = True
596
+
597
+ Parent.__init__(self, category=Groups().WithRealizations().Infinite())
598
+
599
+ # create the realizations (they are cached)
600
+ PW0 = self.PW0()
601
+ W0P = self.W0P()
602
+ WF = self.WF()
603
+ FW = self.FW()
604
+ PvW0 = self.PvW0()
605
+ W0Pv = self.W0Pv()
606
+
607
+ # coercions between realizations
608
+
609
+ W0P_to_PW0 = SetMorphism(Hom(W0P, PW0, Groups()), lambda x: PW0(x.to_opposite()))
610
+ W0P_to_PW0.register_as_coercion()
611
+
612
+ PW0_to_W0P = SetMorphism(Hom(PW0, W0P, Groups()), lambda x: W0P(x.to_opposite()))
613
+ PW0_to_W0P.register_as_coercion()
614
+
615
+ FW_to_WF = SetMorphism(Hom(FW, WF, Groups()), lambda x: WF(x.to_opposite()))
616
+ FW_to_WF.register_as_coercion()
617
+
618
+ WF_to_FW = SetMorphism(Hom(WF, FW, Groups()), lambda x: FW(x.to_opposite()))
619
+ WF_to_FW.register_as_coercion()
620
+
621
+ PW0_to_WF = SetMorphism(Hom(PW0, WF, Groups()), self.PW0_to_WF_func)
622
+ PW0_to_WF.register_as_coercion()
623
+ WF_to_PW0 = SetMorphism(Hom(WF, PW0, Groups()), self.WF_to_PW0_func)
624
+ WF_to_PW0.register_as_coercion()
625
+
626
+ PvW0_to_W0Pv = SetMorphism(Hom(PvW0, W0Pv, Groups()), lambda x: W0Pv(x.to_opposite()))
627
+ PvW0_to_W0Pv.register_as_coercion()
628
+ W0Pv_to_PvW0 = SetMorphism(Hom(W0Pv, PvW0, Groups()), lambda x: PvW0(x.to_opposite()))
629
+ W0Pv_to_PvW0.register_as_coercion()
630
+
631
+ if self._general_linear:
632
+ PW0_to_PvW0 = SetMorphism(Hom(PW0, PvW0, Groups()), lambda x: PvW0((x.cartesian_projection(0),x.cartesian_projection(1))))
633
+ PvW0_to_PW0 = SetMorphism(Hom(PvW0, PW0, Groups()), lambda x: PW0((x.cartesian_projection(0),x.cartesian_projection(1))))
634
+ W0P_to_W0Pv = SetMorphism(Hom(W0P, W0Pv, Groups()), lambda x: W0Pv((x.cartesian_projection(0),x.cartesian_projection(1))))
635
+ W0Pv_to_W0P = SetMorphism(Hom(W0Pv, W0P, Groups()), lambda x: W0P((x.cartesian_projection(0),x.cartesian_projection(1))))
636
+ elif self._untwisted:
637
+ PW0_to_PvW0 = SetMorphism(Hom(PW0, PvW0, Groups()), lambda x: PvW0((self.exp_dual_lattice()(x.cartesian_projection(0).value.to_dual_type_cospace()),self.dual_classical_weyl().from_reduced_word(x.cartesian_projection(1).reduced_word()))))
638
+ PvW0_to_PW0 = SetMorphism(Hom(PvW0, PW0, Groups()), lambda x: PW0((self.exp_lattice()(x.cartesian_projection(0).value.to_dual_type_cospace()),self.classical_weyl().from_reduced_word(x.cartesian_projection(1).reduced_word()))))
639
+ W0P_to_W0Pv = SetMorphism(Hom(W0P, W0Pv, Groups()), lambda x: W0Pv((self.dual_classical_weyl().from_reduced_word(x.cartesian_projection(0).reduced_word()),self.exp_dual_lattice()(x.cartesian_projection(1).value.to_dual_type_cospace()))))
640
+ W0Pv_to_W0P = SetMorphism(Hom(W0Pv, W0P, Groups()), lambda x: W0P((self.classical_weyl().from_reduced_word(x.cartesian_projection(0).reduced_word()),self.exp_lattice()(x.cartesian_projection(1).value.to_dual_type_cospace()))))
641
+ else:
642
+ PW0_to_PvW0 = SetMorphism(Hom(PW0, PvW0, Groups()), lambda x: PvW0((x.cartesian_projection(0),self.dual_classical_weyl().from_reduced_word(x.cartesian_projection(1).reduced_word()))))
643
+ PvW0_to_PW0 = SetMorphism(Hom(PvW0, PW0, Groups()), lambda x: PW0((x.cartesian_projection(0),self.classical_weyl().from_reduced_word(x.cartesian_projection(1).reduced_word()))))
644
+ W0P_to_W0Pv = SetMorphism(Hom(W0P, W0Pv, Groups()), lambda x: W0Pv((self.dual_classical_weyl().from_reduced_word(x.cartesian_projection(0).reduced_word()),x.cartesian_projection(1))))
645
+ W0Pv_to_W0P = SetMorphism(Hom(W0Pv, W0P, Groups()), lambda x: W0P((self.classical_weyl().from_reduced_word(x.cartesian_projection(0).reduced_word()),x.cartesian_projection(1))))
646
+
647
+ PW0_to_PvW0.register_as_coercion()
648
+ PvW0_to_PW0.register_as_coercion()
649
+ W0P_to_W0Pv.register_as_coercion()
650
+ W0Pv_to_W0P.register_as_coercion()
651
+
652
+ # coercions of the translation lattice into the appropriate realizations
653
+ P_to_PW0 = SetMorphism(Hom(self.lattice(), PW0, Sets()), PW0.from_translation)
654
+ P_to_PW0.register_as_coercion()
655
+ P_to_W0P = SetMorphism(Hom(self.lattice(), W0P, Sets()), W0P.from_translation)
656
+ P_to_W0P.register_as_coercion()
657
+ Pv_to_PvW0 = SetMorphism(Hom(self.dual_lattice(), PvW0, Sets()), PvW0.from_dual_translation)
658
+ Pv_to_PvW0.register_as_coercion()
659
+ Pv_to_W0Pv = SetMorphism(Hom(self.dual_lattice(), W0Pv, Sets()), W0Pv.from_dual_translation)
660
+ Pv_to_W0Pv.register_as_coercion()
661
+
662
+ # coercions of the classical Weyl group into the appropriate realizations
663
+
664
+ W0_to_PW0 = SetMorphism(Hom(self.classical_weyl(), PW0, Groups()), PW0.from_classical_weyl)
665
+ W0_to_PW0.register_as_coercion()
666
+ W0_to_W0P = SetMorphism(Hom(self.classical_weyl(), W0P, Groups()), W0P.from_classical_weyl)
667
+ W0_to_W0P.register_as_coercion()
668
+ W0v_to_PvW0 = SetMorphism(Hom(self.dual_classical_weyl(), PvW0, Groups()), PvW0.from_dual_classical_weyl)
669
+ W0v_to_PvW0.register_as_coercion()
670
+ W0v_to_W0Pv = SetMorphism(Hom(self.dual_classical_weyl(), W0Pv, Groups()), W0Pv.from_dual_classical_weyl)
671
+ W0v_to_W0Pv.register_as_coercion()
672
+
673
+ # coercions of the fundamental group into the appropriate realizations
674
+
675
+ F_to_WF = SetMorphism(Hom(self.fundamental_group(), WF, Groups()), WF.from_fundamental)
676
+ F_to_WF.register_as_coercion()
677
+ F_to_FW = SetMorphism(Hom(self.fundamental_group(), FW, Groups()), FW.from_fundamental)
678
+ F_to_FW.register_as_coercion()
679
+
680
+ # coercions of the affine Weyl group into the appropriate realizations
681
+
682
+ W_to_WF = SetMorphism(Hom(self.affine_weyl(), WF, Groups()), WF.from_affine_weyl)
683
+ W_to_WF.register_as_coercion()
684
+
685
+ W_to_FW = SetMorphism(Hom(self.affine_weyl(), FW, Groups()), FW.from_affine_weyl)
686
+ W_to_FW.register_as_coercion()
687
+
688
+ def PW0(self):
689
+ r"""
690
+ Realizes ``self`` in "PW0"-style.
691
+
692
+ EXAMPLES::
693
+
694
+ sage: ExtendedAffineWeylGroup(['A',2,1]).PW0()
695
+ Extended affine Weyl group of type ['A', 2, 1] realized by
696
+ Semidirect product of Multiplicative form of
697
+ Coweight lattice of the Root system of type ['A', 2] acted upon by
698
+ Weyl Group of type ['A', 2] (as a matrix group acting on the coweight lattice)
699
+ """
700
+ return self.ExtendedAffineWeylGroupPW0()
701
+
702
+ def W0P(self):
703
+ r"""
704
+ Realizes ``self`` in "W0P"-style.
705
+
706
+ EXAMPLES::
707
+
708
+ sage: ExtendedAffineWeylGroup(['A',2,1]).W0P()
709
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
710
+ Weyl Group of type ['A', 2] (as a matrix group acting on the coweight lattice)
711
+ acting on Multiplicative form of Coweight lattice of the Root system of type ['A', 2]
712
+ """
713
+ return self.ExtendedAffineWeylGroupW0P()
714
+
715
+ def WF(self):
716
+ r"""
717
+ Realizes ``self`` in "WF"-style.
718
+
719
+ EXAMPLES::
720
+
721
+ sage: ExtendedAffineWeylGroup(['A',2,1]).WF()
722
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
723
+ Weyl Group of type ['A', 2, 1] (as a matrix group acting on the root lattice)
724
+ acted upon by Fundamental group of type ['A', 2, 1]
725
+ """
726
+ return self.ExtendedAffineWeylGroupWF()
727
+
728
+ def FW(self):
729
+ r"""
730
+ Realizes ``self`` in "FW"-style.
731
+
732
+ EXAMPLES::
733
+
734
+ sage: ExtendedAffineWeylGroup(['A',2,1]).FW()
735
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
736
+ Fundamental group of type ['A', 2, 1] acting on
737
+ Weyl Group of type ['A', 2, 1] (as a matrix group acting on the root lattice)
738
+ """
739
+ return self.ExtendedAffineWeylGroupFW()
740
+
741
+ def PvW0(self):
742
+ r"""
743
+ Realizes ``self`` in "PvW0"-style.
744
+
745
+ EXAMPLES::
746
+
747
+ sage: ExtendedAffineWeylGroup(['A',2,1]).PvW0()
748
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
749
+ Multiplicative form of Weight lattice of the Root system of type ['A', 2]
750
+ acted upon by Weyl Group of type ['A', 2] (as a matrix group acting on the weight lattice)
751
+ """
752
+ return self.ExtendedAffineWeylGroupPvW0()
753
+
754
+ def W0Pv(self):
755
+ r"""
756
+ Realizes ``self`` in "W0Pv"-style.
757
+
758
+ EXAMPLES::
759
+
760
+ sage: ExtendedAffineWeylGroup(['A',2,1]).W0Pv()
761
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
762
+ Weyl Group of type ['A', 2] (as a matrix group acting on the weight lattice)
763
+ acting on Multiplicative form of Weight lattice of the Root system of type ['A', 2]
764
+ """
765
+ return self.ExtendedAffineWeylGroupW0Pv()
766
+
767
+ def cartan_type(self):
768
+ r"""
769
+ The Cartan type of ``self``.
770
+
771
+ EXAMPLES::
772
+
773
+ sage: ExtendedAffineWeylGroup(["D",3,2]).cartan_type()
774
+ ['C', 2, 1]^*
775
+ """
776
+ return self._cartan_type
777
+
778
+ def _repr_(self):
779
+ r"""
780
+ A string representing ``self``.
781
+
782
+ EXAMPLES::
783
+
784
+ sage: ExtendedAffineWeylGroup(['A',2,1])
785
+ Extended affine Weyl group of type ['A', 2, 1]
786
+ """
787
+ if self._general_linear:
788
+ return "Extended affine Weyl group of GL(%s)" % self._n
789
+ return "Extended affine Weyl group of type %s" % self.cartan_type()
790
+
791
+ def fundamental_group(self):
792
+ r"""
793
+ Return the abstract fundamental group.
794
+
795
+ EXAMPLES::
796
+
797
+ sage: F = ExtendedAffineWeylGroup(['D',5,1]).fundamental_group(); F
798
+ Fundamental group of type ['D', 5, 1]
799
+ sage: [a for a in F]
800
+ [pi[0], pi[1], pi[4], pi[5]]
801
+ """
802
+ return self._fundamental_group
803
+
804
+ def lattice(self):
805
+ r"""
806
+ Return the translation lattice for ``self``.
807
+
808
+ EXAMPLES::
809
+
810
+ sage: ExtendedAffineWeylGroup(['A',2,1]).lattice()
811
+ Coweight lattice of the Root system of type ['A', 2]
812
+ sage: ExtendedAffineWeylGroup(['A',5,2]).lattice()
813
+ Weight lattice of the Root system of type ['C', 3]
814
+ sage: ExtendedAffineWeylGroup(['A',4,2]).lattice()
815
+ Weight lattice of the Root system of type ['C', 2]
816
+ sage: ExtendedAffineWeylGroup(CartanType(['A',4,2]).dual()).lattice()
817
+ Coweight lattice of the Root system of type ['B', 2]
818
+ sage: ExtendedAffineWeylGroup(CartanType(['A',2,1]),
819
+ ....: general_linear=True).lattice()
820
+ Ambient space of the Root system of type ['A', 2]
821
+ """
822
+
823
+ return self._lattice
824
+
825
+ def exp_lattice(self):
826
+ r"""
827
+ Return the multiplicative version of the translation lattice for ``self``.
828
+
829
+ EXAMPLES::
830
+
831
+ sage: ExtendedAffineWeylGroup(['A',2,1]).exp_lattice()
832
+ Multiplicative form of Coweight lattice of the Root system of type ['A', 2]
833
+ """
834
+ return self._exp_lattice
835
+
836
+ def lattice_basis(self):
837
+ r"""
838
+ Return the distinguished basis of the translation lattice for ``self``.
839
+
840
+ EXAMPLES::
841
+
842
+ sage: ExtendedAffineWeylGroup(['A',2,1]).lattice_basis()
843
+ Finite family {1: Lambdacheck[1], 2: Lambdacheck[2]}
844
+ sage: ExtendedAffineWeylGroup(['A',5,2]).lattice_basis()
845
+ Finite family {1: Lambda[1], 2: Lambda[2], 3: Lambda[3]}
846
+ sage: ExtendedAffineWeylGroup(['A',4,2]).lattice_basis()
847
+ Finite family {1: Lambda[1], 2: Lambda[2]}
848
+ sage: ExtendedAffineWeylGroup(CartanType(['A',4,2]).dual()).lattice_basis()
849
+ Finite family {1: Lambdacheck[1], 2: Lambdacheck[2]}
850
+ """
851
+ return self._basis
852
+
853
+ def dual_lattice(self):
854
+ r"""
855
+ Return the dual version of the translation lattice for ``self``.
856
+
857
+ EXAMPLES::
858
+
859
+ sage: ExtendedAffineWeylGroup(['A',2,1]).dual_lattice()
860
+ Weight lattice of the Root system of type ['A', 2]
861
+ sage: ExtendedAffineWeylGroup(['A',5,2]).dual_lattice()
862
+ Weight lattice of the Root system of type ['C', 3]
863
+ """
864
+ return self._dual_lattice
865
+
866
+ def exp_dual_lattice(self):
867
+ r"""
868
+ Return the multiplicative version of the dual version of the translation lattice for ``self``.
869
+
870
+ EXAMPLES::
871
+
872
+ sage: ExtendedAffineWeylGroup(['A',2,1]).exp_dual_lattice()
873
+ Multiplicative form of Weight lattice of the Root system of type ['A', 2]
874
+ """
875
+ return self._exp_dual_lattice
876
+
877
+ def dual_lattice_basis(self):
878
+ r"""
879
+ Return the distinguished basis of the dual version of the translation lattice for ``self``.
880
+
881
+ EXAMPLES::
882
+
883
+ sage: ExtendedAffineWeylGroup(['A',2,1]).dual_lattice_basis()
884
+ Finite family {1: Lambda[1], 2: Lambda[2]}
885
+ sage: ExtendedAffineWeylGroup(['A',5,2]).dual_lattice_basis()
886
+ Finite family {1: Lambda[1], 2: Lambda[2], 3: Lambda[3]}
887
+ """
888
+ return self._dual_basis
889
+
890
+ def classical_weyl(self):
891
+ r"""
892
+ Return the classical Weyl group of ``self``.
893
+
894
+ EXAMPLES::
895
+
896
+ sage: ExtendedAffineWeylGroup(['A',2,1]).classical_weyl()
897
+ Weyl Group of type ['A', 2] (as a matrix group acting on the coweight lattice)
898
+ sage: ExtendedAffineWeylGroup(['A',5,2]).classical_weyl()
899
+ Weyl Group of type ['C', 3] (as a matrix group acting on the weight lattice)
900
+ sage: ExtendedAffineWeylGroup(['A',4,2]).classical_weyl()
901
+ Weyl Group of type ['C', 2] (as a matrix group acting on the weight lattice)
902
+ sage: ExtendedAffineWeylGroup(CartanType(['A',4,2]).dual()).classical_weyl()
903
+ Weyl Group of type ['C', 2] (as a matrix group acting on the coweight lattice)
904
+ """
905
+ return self._W0
906
+
907
+ def dual_classical_weyl(self):
908
+ r"""
909
+ Return the dual version of the classical Weyl group of ``self``.
910
+
911
+ EXAMPLES::
912
+
913
+ sage: ExtendedAffineWeylGroup(['A',2,1]).dual_classical_weyl()
914
+ Weyl Group of type ['A', 2] (as a matrix group acting on the weight lattice)
915
+ sage: ExtendedAffineWeylGroup(['A',5,2]).dual_classical_weyl()
916
+ Weyl Group of type ['C', 3] (as a matrix group acting on the weight lattice)
917
+ """
918
+ return self._W0v
919
+
920
+ def affine_weyl(self):
921
+ r"""
922
+ Return the affine Weyl group of ``self``.
923
+
924
+ EXAMPLES::
925
+
926
+ sage: ExtendedAffineWeylGroup(['A',2,1]).affine_weyl()
927
+ Weyl Group of type ['A', 2, 1] (as a matrix group acting on the root lattice)
928
+ sage: ExtendedAffineWeylGroup(['A',5,2]).affine_weyl()
929
+ Weyl Group of type ['B', 3, 1]^* (as a matrix group acting on the root lattice)
930
+ sage: ExtendedAffineWeylGroup(['A',4,2]).affine_weyl()
931
+ Weyl Group of type ['BC', 2, 2] (as a matrix group acting on the root lattice)
932
+ sage: ExtendedAffineWeylGroup(CartanType(['A',4,2]).dual()).affine_weyl()
933
+ Weyl Group of type ['BC', 2, 2]^* (as a matrix group acting on the root lattice)
934
+ """
935
+ return self._W
936
+
937
+ def classical_weyl_to_affine(self, w):
938
+ r"""
939
+ The image of `w` under the homomorphism from the classical Weyl group into the affine Weyl group.
940
+
941
+ EXAMPLES::
942
+
943
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
944
+ sage: W0 = E.classical_weyl()
945
+ sage: w = W0.from_reduced_word([1,2]); w
946
+ s1*s2
947
+ sage: v = E.classical_weyl_to_affine(w); v
948
+ S1*S2
949
+ """
950
+ return self.affine_weyl().from_reduced_word(w.reduced_word())
951
+
952
+ def dual_classical_weyl_to_affine(self, w):
953
+ r"""
954
+ The image of `w` under the homomorphism from the dual version of the classical
955
+ Weyl group into the affine Weyl group.
956
+
957
+ EXAMPLES::
958
+
959
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
960
+ sage: W0v = E.dual_classical_weyl()
961
+ sage: w = W0v.from_reduced_word([1,2]); w
962
+ s1*s2
963
+ sage: v = E.dual_classical_weyl_to_affine(w); v
964
+ S1*S2
965
+ """
966
+ return self.affine_weyl().from_reduced_word(w.reduced_word())
967
+
968
+ def a_realization(self):
969
+ r"""
970
+ Return the default realization of an extended affine Weyl group.
971
+
972
+ EXAMPLES::
973
+
974
+ sage: ExtendedAffineWeylGroup(['A',2,1]).a_realization()
975
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
976
+ Multiplicative form of Coweight lattice of the Root system of type ['A', 2]
977
+ acted upon by Weyl Group of type ['A', 2] (as a matrix group acting on the coweight lattice)
978
+ """
979
+ return self.PW0()
980
+
981
+ def group_generators(self):
982
+ r"""
983
+ Return a set of generators for the default realization of ``self``.
984
+
985
+ EXAMPLES::
986
+
987
+ sage: ExtendedAffineWeylGroup(['A',2,1]).group_generators()
988
+ (t[Lambdacheck[1]], t[Lambdacheck[2]], s1, s2)
989
+ """
990
+ return self.a_realization().group_generators()
991
+
992
+ @cached_method
993
+ def PW0_to_WF_func(self, x):
994
+ r"""
995
+ Implement coercion from style "PW0" to "WF".
996
+
997
+ EXAMPLES::
998
+
999
+ sage: E = ExtendedAffineWeylGroup(["A", 2, 1])
1000
+ sage: x = E.PW0().an_element(); x
1001
+ t[2*Lambdacheck[1] + 2*Lambdacheck[2]] * s1*s2
1002
+ sage: E.PW0_to_WF_func(x)
1003
+ S0*S1*S2*S0*S1*S0
1004
+
1005
+ .. WARNING::
1006
+
1007
+ This function cannot use coercion, because it is used to define the coercion maps.
1008
+ """
1009
+ i = x.first_descent(side='left')
1010
+ if i is None:
1011
+ t = x.to_translation_left()
1012
+ # t must be zero or a special fundamental basis element
1013
+ if self._general_linear:
1014
+ ispecial = ZZ.sum([t[j] for j in t.support()])
1015
+ elif t == self.lattice().zero():
1016
+ ispecial = 0
1017
+ else:
1018
+ supp = t.support()
1019
+ assert len(supp) == 1
1020
+ ispecial = supp[0]
1021
+ return self.WF().from_fundamental(self.fundamental_group()(ispecial))
1022
+ return self.PW0_to_WF_func(x.apply_simple_reflection(i, side='left')).apply_simple_reflection(i, side='left')
1023
+
1024
+ @cached_method
1025
+ def WF_to_PW0_func(self, x):
1026
+ r"""
1027
+ Coercion from style "WF" to "PW0".
1028
+
1029
+ EXAMPLES::
1030
+
1031
+ sage: E = ExtendedAffineWeylGroup(["A", 2, 1])
1032
+ sage: x = E.WF().an_element(); x
1033
+ S0*S1*S2 * pi[2]
1034
+ sage: E.WF_to_PW0_func(x)
1035
+ t[Lambdacheck[1] + 2*Lambdacheck[2]] * s1*s2*s1
1036
+
1037
+ .. WARNING::
1038
+
1039
+ Since this is used to define some coercion maps it cannot itself use coercion.
1040
+ """
1041
+ w = x.to_affine_weyl_left()
1042
+ f = x.to_fundamental_group()
1043
+ i = w.first_descent(side='left')
1044
+ if i is not None:
1045
+ return self.WF_to_PW0_func(x.apply_simple_reflection(i, side='left')).apply_simple_reflection(i, side='left')
1046
+ # the element is in the fundamental group
1047
+ PW0 = self.PW0()
1048
+ ispecial = f.value()
1049
+ W = self.classical_weyl()
1050
+ if self._general_linear:
1051
+ r = ZZ(Mod(ispecial, self._n))
1052
+ weight = self.lattice().from_vector(vector([ZZ((ispecial-r)/self._n)]*self._n))
1053
+ if r != ZZ(0):
1054
+ weight = weight + self.lattice_basis()[r]
1055
+ wo = W.from_reduced_word(self.fundamental_group().reduced_word(r))
1056
+ else:
1057
+ wo = W.one()
1058
+ elif ispecial == 0:
1059
+ weight = self.lattice().zero()
1060
+ wo = W.one()
1061
+ else:
1062
+ weight = self.lattice_basis()[ispecial]
1063
+ wo = W.from_reduced_word(self.fundamental_group().reduced_word(ispecial))
1064
+ return PW0((weight,wo))
1065
+
1066
+ class Realizations(Category_realization_of_parent):
1067
+ r"""
1068
+ The category of the realizations of an extended affine Weyl group
1069
+ """
1070
+
1071
+ def super_categories(self):
1072
+ r"""
1073
+ EXAMPLES::
1074
+
1075
+ sage: R = ExtendedAffineWeylGroup(['A',2,1]).Realizations(); R
1076
+ Category of realizations of Extended affine Weyl group of type ['A', 2, 1]
1077
+ sage: R.super_categories()
1078
+ [Category of associative inverse realizations of unital magmas]
1079
+ """
1080
+ return [Groups().Realizations()]
1081
+
1082
+ class ParentMethods:
1083
+
1084
+ @cached_method
1085
+ def from_fundamental(self, x):
1086
+ r"""
1087
+ Return the image of `x` under the homomorphism from the fundamental group into
1088
+ ``self``.
1089
+
1090
+ EXAMPLES::
1091
+
1092
+ sage: E = ExtendedAffineWeylGroup(['A',3,1])
1093
+ sage: PW0=E.PW0()
1094
+ sage: F = E.fundamental_group()
1095
+ sage: Is = F.special_nodes()
1096
+ sage: [(i, PW0.from_fundamental(F(i))) for i in Is]
1097
+ [(0, 1),
1098
+ (1, t[Lambdacheck[1]] * s1*s2*s3),
1099
+ (2, t[Lambdacheck[2]] * s2*s3*s1*s2),
1100
+ (3, t[Lambdacheck[3]] * s3*s2*s1)]
1101
+ sage: [(i, E.W0P().from_fundamental((F(i)))) for i in Is]
1102
+ [(0, 1),
1103
+ (1, s1*s2*s3 * t[-Lambdacheck[3]]),
1104
+ (2, s2*s3*s1*s2 * t[-Lambdacheck[2]]),
1105
+ (3, s3*s2*s1 * t[-Lambdacheck[1]])]
1106
+ sage: [(i, E.WF().from_fundamental(F(i))) for i in Is]
1107
+ [(0, 1), (1, pi[1]), (2, pi[2]), (3, pi[3])]
1108
+
1109
+ .. WARNING::
1110
+
1111
+ This method must be implemented by the "WF" and "FW" realizations.
1112
+ """
1113
+ WF = self.realization_of().WF()
1114
+ return self(WF.from_fundamental(x))
1115
+
1116
+ def from_translation(self, la):
1117
+ r"""
1118
+ Return the element of translation by ``la`` in ``self``.
1119
+
1120
+ INPUT:
1121
+
1122
+ - ``self`` -- a realization of the extended affine Weyl group
1123
+ - ``la`` -- an element of the translation lattice
1124
+
1125
+ In the notation of the documentation for :meth:`ExtendedAffineWeylGroup`,
1126
+ ``la`` must be an element of "P".
1127
+
1128
+ EXAMPLES::
1129
+
1130
+ sage: E = ExtendedAffineWeylGroup(['A',2,1]); PW0 = E.PW0()
1131
+ sage: b = E.lattice_basis(); b
1132
+ Finite family {1: Lambdacheck[1], 2: Lambdacheck[2]}
1133
+ sage: x = PW0.from_translation(2*b[1] - b[2]); x
1134
+ t[2*Lambdacheck[1] - Lambdacheck[2]]
1135
+ sage: FW = E.FW()
1136
+ sage: y = FW.from_translation(2*b[1] - b[2]); y
1137
+ S0*S2*S0*S1
1138
+ sage: FW(x) == y
1139
+ True
1140
+
1141
+ Since the implementation as a semidirect product requires
1142
+ wrapping the lattice group to make it multiplicative,
1143
+ we cannot declare that this map is a morphism for
1144
+ sage ``Groups()``.
1145
+
1146
+ .. WARNING::
1147
+
1148
+ This method must be implemented by the "PW0" and "W0P" realizations.
1149
+ """
1150
+ PW0 = self.realization_of().PW0()
1151
+ return self(PW0.from_translation(la))
1152
+
1153
+ def from_dual_translation(self, la):
1154
+ r"""
1155
+ Return the image of ``la`` under the homomorphism of the dual version of the
1156
+ translation lattice into ``self``.
1157
+
1158
+ EXAMPLES::
1159
+
1160
+ sage: E = ExtendedAffineWeylGroup(['A',2,1]); PvW0 = E.PvW0()
1161
+ sage: bv = E.dual_lattice_basis(); bv
1162
+ Finite family {1: Lambda[1], 2: Lambda[2]}
1163
+ sage: x = PvW0.from_dual_translation(2*bv[1] - bv[2]); x
1164
+ t[2*Lambda[1] - Lambda[2]]
1165
+ sage: FW = E.FW()
1166
+ sage: y = FW.from_dual_translation(2*bv[1] - bv[2]); y
1167
+ S0*S2*S0*S1
1168
+ sage: FW(x) == y
1169
+ True
1170
+ """
1171
+ return self(self.realization_of().PvW0().from_dual_translation(la))
1172
+
1173
+ @abstract_method
1174
+ def simple_reflections(self):
1175
+ r"""
1176
+ Return a family from the set of affine Dynkin nodes to the simple reflections
1177
+ in the realization of the extended affine Weyl group.
1178
+
1179
+ EXAMPLES::
1180
+
1181
+ sage: ExtendedAffineWeylGroup(['A',3,1]).W0P().simple_reflections()
1182
+ Finite family {0: s1*s2*s3*s2*s1 * t[-Lambdacheck[1] - Lambdacheck[3]],
1183
+ 1: s1, 2: s2, 3: s3}
1184
+ sage: ExtendedAffineWeylGroup(['A',3,1]).WF().simple_reflections()
1185
+ Finite family {0: S0, 1: S1, 2: S2, 3: S3}
1186
+ sage: ExtendedAffineWeylGroup(['A',3,1],
1187
+ ....: print_tuple=True).FW().simple_reflections()
1188
+ Finite family {0: (pi[0], S0), 1: (pi[0], S1),
1189
+ 2: (pi[0], S2), 3: (pi[0], S3)}
1190
+ sage: ExtendedAffineWeylGroup(['A',3,1],
1191
+ ....: fundamental='f',
1192
+ ....: print_tuple=True).FW().simple_reflections()
1193
+ Finite family {0: (f[0], S0), 1: (f[0], S1),
1194
+ 2: (f[0], S2), 3: (f[0], S3)}
1195
+ sage: ExtendedAffineWeylGroup(['A',3,1]).PvW0().simple_reflections()
1196
+ Finite family {0: t[Lambda[1] + Lambda[3]] * s1*s2*s3*s2*s1,
1197
+ 1: s1, 2: s2, 3: s3}
1198
+ """
1199
+
1200
+ def simple_reflection(self, i):
1201
+ r"""
1202
+ Return the `i`-th simple reflection in ``self``.
1203
+
1204
+ INPUT:
1205
+
1206
+ - ``self`` -- a realization of the extended affine Weyl group
1207
+ - ``i`` -- an affine Dynkin node
1208
+
1209
+ EXAMPLES::
1210
+
1211
+ sage: ExtendedAffineWeylGroup(['A',3,1]).PW0().simple_reflection(0)
1212
+ t[Lambdacheck[1] + Lambdacheck[3]] * s1*s2*s3*s2*s1
1213
+ sage: ExtendedAffineWeylGroup(['C',2,1]).WF().simple_reflection(0)
1214
+ S0
1215
+ sage: ExtendedAffineWeylGroup(['D',3,2]).PvW0().simple_reflection(1)
1216
+ s1
1217
+ """
1218
+ return self.simple_reflections()[i]
1219
+
1220
+ def from_classical_weyl(self, w):
1221
+ r"""
1222
+ Return the image of `w` from the finite Weyl group into ``self``.
1223
+
1224
+ EXAMPLES::
1225
+
1226
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); PW0=E.PW0()
1227
+ sage: W0 = E.classical_weyl()
1228
+ sage: w = W0.from_reduced_word([2,1,3])
1229
+ sage: y = PW0.from_classical_weyl(w); y
1230
+ s2*s3*s1
1231
+ sage: y.parent() == PW0
1232
+ True
1233
+ sage: y.to_classical_weyl() == w
1234
+ True
1235
+ sage: W0P = E.W0P()
1236
+ sage: z = W0P.from_classical_weyl(w); z
1237
+ s2*s3*s1
1238
+ sage: z.parent() == W0P
1239
+ True
1240
+ sage: W0P(y) == z
1241
+ True
1242
+ sage: FW = E.FW()
1243
+ sage: x = FW.from_classical_weyl(w); x
1244
+ S2*S3*S1
1245
+ sage: x.parent() == FW
1246
+ True
1247
+ sage: FW(y) == x
1248
+ True
1249
+ sage: FW(z) == x
1250
+ True
1251
+
1252
+ .. WARNING::
1253
+
1254
+ Must be implemented in style "PW0" and "W0P".
1255
+ """
1256
+ PW0 = self.realization_of().PW0()
1257
+ return self(PW0.from_classical_weyl(w))
1258
+
1259
+ def from_dual_classical_weyl(self, w):
1260
+ r"""
1261
+ Return the image of `w` from the finite Weyl group of dual form into ``self``.
1262
+
1263
+ EXAMPLES::
1264
+
1265
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); PvW0 = E.PvW0()
1266
+ sage: W0v = E.dual_classical_weyl()
1267
+ sage: w = W0v.from_reduced_word([2,1,3])
1268
+ sage: y = PvW0.from_dual_classical_weyl(w); y
1269
+ s2*s3*s1
1270
+ sage: y.parent() == PvW0
1271
+ True
1272
+ sage: y.to_dual_classical_weyl() == w
1273
+ True
1274
+ sage: x = E.FW().from_dual_classical_weyl(w); x
1275
+ S2*S3*S1
1276
+ sage: PvW0(x) == y
1277
+ True
1278
+
1279
+ .. WARNING::
1280
+
1281
+ Must be implemented in style "PvW0" and "W0Pv".
1282
+ """
1283
+ return self(self.realization_of().PvW0().from_dual_classical_weyl(w))
1284
+
1285
+ def from_affine_weyl(self, w):
1286
+ r"""
1287
+ Return the image of `w` under the homomorphism from the affine Weyl group
1288
+ into ``self``.
1289
+
1290
+ EXAMPLES::
1291
+
1292
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); PW0 = E.PW0()
1293
+ sage: W = E.affine_weyl()
1294
+ sage: w = W.from_reduced_word([2,1,3,0])
1295
+ sage: x = PW0.from_affine_weyl(w); x
1296
+ t[Lambdacheck[1] - 2*Lambdacheck[2] + Lambdacheck[3]] * s3*s1
1297
+ sage: FW = E.FW()
1298
+ sage: y = FW.from_affine_weyl(w); y
1299
+ S2*S3*S1*S0
1300
+ sage: FW(x) == y
1301
+ True
1302
+
1303
+ .. WARNING::
1304
+
1305
+ Must be implemented in style "WF" and "FW".
1306
+ """
1307
+ WF = self.realization_of().WF()
1308
+ return self(WF.from_affine_weyl(w))
1309
+
1310
+ def from_reduced_word(self, word):
1311
+ r"""
1312
+ Convert an affine or finite reduced word into a group element.
1313
+
1314
+ EXAMPLES::
1315
+
1316
+ sage: ExtendedAffineWeylGroup(['A',2,1]).PW0().from_reduced_word([1,0,1,2])
1317
+ t[-Lambdacheck[1] + 2*Lambdacheck[2]]
1318
+ """
1319
+
1320
+ return self.from_affine_weyl(self.realization_of().affine_weyl().from_reduced_word(word))
1321
+
1322
+ class ElementMethods:
1323
+
1324
+ @abstract_method
1325
+ def has_descent(self, i, side='right', positive=False) -> bool:
1326
+ r"""
1327
+ Return whether ``self`` * `s_i` < ``self`` where `s_i` is the `i`-th simple
1328
+ reflection in the realized group.
1329
+
1330
+ INPUT:
1331
+
1332
+ - ``i`` -- an affine Dynkin index
1333
+
1334
+ OPTIONAL:
1335
+
1336
+ - ``side`` -- ``'right'`` or ``'left'`` (default: ``'right'``)
1337
+ - ``positive`` -- boolean (default: ``False``)
1338
+
1339
+ If ``side='left'``, then the reflection acts
1340
+ on the left. If ``positive=True``, then the inequality is reversed.
1341
+
1342
+ EXAMPLES::
1343
+
1344
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); WF = E.WF()
1345
+ sage: F = E.fundamental_group()
1346
+ sage: x = WF.an_element(); x
1347
+ S0*S1*S2*S3 * pi[3]
1348
+ sage: I = E.cartan_type().index_set()
1349
+ sage: [(i, x.has_descent(i)) for i in I]
1350
+ [(0, True), (1, False), (2, False), (3, False)]
1351
+ sage: [(i, x.has_descent(i,side='left')) for i in I]
1352
+ [(0, True), (1, False), (2, False), (3, False)]
1353
+ sage: [(i, x.has_descent(i,positive=True)) for i in I]
1354
+ [(0, False), (1, True), (2, True), (3, True)]
1355
+
1356
+ .. WARNING::
1357
+
1358
+ This method is abstract because it is used in the recursive coercions
1359
+ between "PW0" and "WF" and other methods use this coercion.
1360
+ """
1361
+
1362
+ def first_descent(self, side='right', positive=False, index_set=None):
1363
+ r"""
1364
+ Return the first descent of ``self``.
1365
+
1366
+ INPUT:
1367
+
1368
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'right'``)
1369
+ - ``positive`` -- boolean (default: ``False``)
1370
+ - ``index_set`` -- an optional subset of Dynkin nodes
1371
+
1372
+ If ``index_set`` is not ``None``, then the descent must be in the ``index_set``.
1373
+
1374
+ EXAMPLES::
1375
+
1376
+ sage: x = ExtendedAffineWeylGroup(['A',3,1]).WF().an_element(); x
1377
+ S0*S1*S2*S3 * pi[3]
1378
+ sage: x.first_descent()
1379
+ 0
1380
+ sage: x.first_descent(side='left')
1381
+ 0
1382
+ sage: x.first_descent(positive=True)
1383
+ 1
1384
+ sage: x.first_descent(side='left',positive=True)
1385
+ 1
1386
+ """
1387
+ if index_set is None:
1388
+ index_set = self.parent().realization_of().cartan_type().index_set()
1389
+ for i in index_set:
1390
+ if self.has_descent(i, side=side, positive=positive):
1391
+ return i
1392
+ return None
1393
+
1394
+ def apply_simple_reflection(self, i, side='right'):
1395
+ r"""
1396
+ Apply the `i`-th simple reflection to ``self``.
1397
+
1398
+ EXAMPLES::
1399
+
1400
+ sage: x = ExtendedAffineWeylGroup(['A',3,1]).WF().an_element(); x
1401
+ S0*S1*S2*S3 * pi[3]
1402
+ sage: x.apply_simple_reflection(1)
1403
+ S0*S1*S2*S3*S0 * pi[3]
1404
+ sage: x.apply_simple_reflection(0, side='left')
1405
+ S1*S2*S3 * pi[3]
1406
+ """
1407
+ s = self.parent().simple_reflection(i)
1408
+ if side == 'right':
1409
+ return self*s
1410
+ else:
1411
+ return s*self
1412
+
1413
+ def apply_simple_projection(self, i, side='right', length_increasing=True):
1414
+ r"""
1415
+ Return the product of ``self`` by the simple reflection `s_i` if that product is
1416
+ of greater length than ``self`` and otherwise return ``self``.
1417
+
1418
+ INPUT:
1419
+
1420
+ - ``self`` -- an element of the extended affine Weyl group
1421
+ - ``i`` -- a Dynkin node (index of a simple reflection `s_i`)
1422
+ - ``side`` -- ``'right'`` or ``'left'`` (default: ``'right'``)
1423
+ according to which side of ``self`` the reflection `s_i`
1424
+ should be multiplied
1425
+ - ``length_increasing`` -- boolean (default: ``True``);
1426
+ if ``False``, do the above with the word "greater" replaced by "less"
1427
+
1428
+ EXAMPLES::
1429
+
1430
+ sage: x = ExtendedAffineWeylGroup(['A',3,1]).WF().an_element(); x
1431
+ S0*S1*S2*S3 * pi[3]
1432
+ sage: x.apply_simple_projection(1)
1433
+ S0*S1*S2*S3*S0 * pi[3]
1434
+ sage: x.apply_simple_projection(1, length_increasing=False)
1435
+ S0*S1*S2*S3 * pi[3]
1436
+ """
1437
+ if self.has_descent(i, side=side, positive=length_increasing):
1438
+ return self.apply_simple_reflection(i, side=side)
1439
+ return self
1440
+
1441
+ def to_fundamental_group(self):
1442
+ r"""
1443
+ Return the image of ``self`` under the homomorphism to the fundamental group.
1444
+
1445
+ EXAMPLES::
1446
+
1447
+ sage: PW0 = ExtendedAffineWeylGroup(['A',3,1]).PW0()
1448
+ sage: b = PW0.realization_of().lattice_basis()
1449
+ sage: [(x, PW0.from_translation(x).to_fundamental_group()) for x in b]
1450
+ [(Lambdacheck[1], pi[1]), (Lambdacheck[2], pi[2]), (Lambdacheck[3], pi[3])]
1451
+
1452
+ .. WARNING::
1453
+
1454
+ Must be implemented in style "WF".
1455
+ """
1456
+ WF = self.parent().realization_of().WF()
1457
+ return WF(self).to_fundamental_group()
1458
+
1459
+ def to_classical_weyl(self):
1460
+ r"""
1461
+ Return the image of ``self`` under the homomorphism to the classical Weyl group.
1462
+
1463
+ EXAMPLES::
1464
+
1465
+ sage: ExtendedAffineWeylGroup(['A',3,1]).WF().simple_reflection(0).to_classical_weyl()
1466
+ s1*s2*s3*s2*s1
1467
+
1468
+ .. WARNING::
1469
+
1470
+ Must be implemented in style "PW0".
1471
+ """
1472
+ PW0 = self.parent().realization_of().PW0()
1473
+ return PW0(self).to_classical_weyl()
1474
+
1475
+ def to_dual_classical_weyl(self):
1476
+ r"""
1477
+ Return the image of ``self`` under the homomorphism to the dual form of the classical Weyl group.
1478
+
1479
+ EXAMPLES::
1480
+
1481
+ sage: x = ExtendedAffineWeylGroup(['A',3,1]).WF().simple_reflection(0).to_dual_classical_weyl(); x
1482
+ s1*s2*s3*s2*s1
1483
+ sage: x.parent()
1484
+ Weyl Group of type ['A', 3] (as a matrix group acting on the weight lattice)
1485
+
1486
+ .. WARNING::
1487
+
1488
+ Must be implemented in style "PvW0".
1489
+ """
1490
+ PvW0 = self.parent().realization_of().PvW0()
1491
+ return PvW0(self).to_dual_classical_weyl()
1492
+
1493
+ def to_affine_weyl_left(self):
1494
+ r"""
1495
+ Return the projection of ``self`` to the affine Weyl group on the left,
1496
+ after factorizing using the style "WF".
1497
+
1498
+ EXAMPLES::
1499
+
1500
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); PW0 = E.PW0()
1501
+ sage: b = E.lattice_basis()
1502
+ sage: [(x, PW0.from_translation(x).to_affine_weyl_left()) for x in b]
1503
+ [(Lambdacheck[1], S0*S3*S2),
1504
+ (Lambdacheck[2], S0*S3*S1*S0),
1505
+ (Lambdacheck[3], S0*S1*S2)]
1506
+
1507
+ .. WARNING::
1508
+
1509
+ Must be implemented in style "WF".
1510
+ """
1511
+ WF = self.parent().realization_of().WF()
1512
+ return WF(self).to_affine_weyl_left()
1513
+
1514
+ def to_affine_weyl_right(self):
1515
+ r"""
1516
+ Return the projection of ``self`` to the affine Weyl group on the right,
1517
+ after factorizing using the style "FW".
1518
+
1519
+ EXAMPLES::
1520
+
1521
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); PW0 = E.PW0()
1522
+ sage: b = E.lattice_basis()
1523
+ sage: [(x, PW0.from_translation(x).to_affine_weyl_right()) for x in b]
1524
+ [(Lambdacheck[1], S3*S2*S1),
1525
+ (Lambdacheck[2], S2*S3*S1*S2),
1526
+ (Lambdacheck[3], S1*S2*S3)]
1527
+
1528
+ .. WARNING::
1529
+
1530
+ Must be implemented in style "FW".
1531
+ """
1532
+ FW = self.parent().realization_of().FW()
1533
+ return FW(self).to_affine_weyl_right()
1534
+
1535
+ def to_translation_left(self):
1536
+ r"""
1537
+ Return the projection of ``self`` to the translation lattice after factorizing
1538
+ it to the left using the style "PW0".
1539
+
1540
+ EXAMPLES::
1541
+
1542
+ sage: ExtendedAffineWeylGroup(['A',3,1]).PW0().simple_reflection(0).to_translation_left()
1543
+ Lambdacheck[1] + Lambdacheck[3]
1544
+
1545
+ .. WARNING::
1546
+
1547
+ Must be implemented in style "PW0".
1548
+ """
1549
+ PW0 = self.parent().realization_of().PW0()
1550
+ return PW0(self).to_translation_left()
1551
+
1552
+ def to_translation_right(self):
1553
+ r"""
1554
+ Return the projection of ``self`` to the translation lattice after factorizing
1555
+ it to the right using the style "W0P".
1556
+
1557
+ EXAMPLES::
1558
+
1559
+ sage: ExtendedAffineWeylGroup(['A',3,1]).PW0().simple_reflection(0).to_translation_right()
1560
+ -Lambdacheck[1] - Lambdacheck[3]
1561
+
1562
+ .. WARNING::
1563
+
1564
+ Must be implemented in style "W0P".
1565
+ """
1566
+ W0P = self.parent().realization_of().W0P()
1567
+ return W0P(self).to_translation_right()
1568
+
1569
+ def to_dual_translation_left(self):
1570
+ r"""
1571
+ Return the projection of ``self`` to the dual translation lattice after factorizing
1572
+ it to the left using the style "PvW0".
1573
+
1574
+ EXAMPLES::
1575
+
1576
+ sage: ExtendedAffineWeylGroup(['A',3,1]).PvW0().simple_reflection(0).to_dual_translation_left()
1577
+ Lambda[1] + Lambda[3]
1578
+
1579
+ .. WARNING::
1580
+
1581
+ Must be implemented in style "PvW0".
1582
+ """
1583
+ PvW0 = self.parent().realization_of().PvW0()
1584
+ return PvW0(self).to_dual_translation_left()
1585
+
1586
+ def to_dual_translation_right(self):
1587
+ r"""
1588
+ Return the projection of ``self`` to the dual translation lattice after factorizing
1589
+ it to the right using the style "W0Pv".
1590
+
1591
+ EXAMPLES::
1592
+
1593
+ sage: ExtendedAffineWeylGroup(['A',3,1]).PW0().simple_reflection(0).to_dual_translation_right()
1594
+ -Lambda[1] - Lambda[3]
1595
+
1596
+ .. WARNING::
1597
+
1598
+ Must be implemented in style "W0Pv".
1599
+ """
1600
+ W0Pv = self.parent().realization_of().W0Pv()
1601
+ return W0Pv(self).to_dual_translation_right()
1602
+
1603
+ def length(self):
1604
+ r"""
1605
+ Return the length of ``self`` in the Coxeter group sense.
1606
+
1607
+ EXAMPLES::
1608
+
1609
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); PW0 = E.PW0()
1610
+ sage: I0 = E.cartan_type().classical().index_set()
1611
+ sage: [PW0.from_translation(E.lattice_basis()[i]).length() for i in I0]
1612
+ [3, 4, 3]
1613
+ """
1614
+ return self.to_affine_weyl_left().length()
1615
+
1616
+ def coset_representative(self, index_set, side='right'):
1617
+ r"""
1618
+ Return the minimum length representative in the coset of ``self`` with respect to
1619
+ the subgroup generated by the reflections given by ``index_set``.
1620
+
1621
+ INPUT:
1622
+
1623
+ - ``self`` -- an element of the extended affine Weyl group
1624
+ - ``index_set`` -- a subset of the set of Dynkin nodes
1625
+ - ``side`` -- ``'right'`` or ``'left'`` (default: ``'right'``)
1626
+ the side on which the subgroup acts
1627
+
1628
+ EXAMPLES::
1629
+
1630
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); WF = E.WF()
1631
+ sage: b = E.lattice_basis()
1632
+ sage: I0 = E.cartan_type().classical().index_set()
1633
+ sage: [WF.from_translation(x).coset_representative(index_set=I0) for x in b]
1634
+ [pi[1], pi[2], pi[3]]
1635
+ """
1636
+ while True:
1637
+ i = self.first_descent(index_set=index_set, side=side)
1638
+ if i is None:
1639
+ return self
1640
+ self = self.apply_simple_reflection(i,side=side)
1641
+
1642
+ def is_grassmannian(self, index_set, side='right'):
1643
+ r"""
1644
+ Return whether ``self`` is of minimum length in its coset with respect to the
1645
+ subgroup generated by the reflections of ``index_set``.
1646
+
1647
+ EXAMPLES::
1648
+
1649
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); PW0 = E.PW0()
1650
+ sage: x = PW0.from_translation(E.lattice_basis()[1]); x
1651
+ t[Lambdacheck[1]]
1652
+ sage: I = E.cartan_type().index_set()
1653
+ sage: [(i, x.is_grassmannian(index_set=[i])) for i in I]
1654
+ [(0, True), (1, False), (2, True), (3, True)]
1655
+ sage: [(i, x.is_grassmannian(index_set=[i], side='left')) for i in I]
1656
+ [(0, False), (1, True), (2, True), (3, True)]
1657
+ """
1658
+ return self == self.coset_representative(index_set=index_set,side=side)
1659
+
1660
+ def to_affine_grassmannian(self):
1661
+ r"""
1662
+ Return the unique affine Grassmannian element in the same coset of ``self``
1663
+ with respect to the finite Weyl group acting on the right.
1664
+
1665
+ EXAMPLES::
1666
+
1667
+ sage: elts = ExtendedAffineWeylGroup(['A',2,1]).PW0().some_elements()
1668
+ sage: [(x, x.to_affine_grassmannian()) for x in elts]
1669
+ [(t[2*Lambdacheck[1] + 2*Lambdacheck[2]] * s1*s2,
1670
+ t[2*Lambdacheck[1] + 2*Lambdacheck[2]] * s1*s2*s1)]
1671
+ """
1672
+
1673
+ return self.coset_representative(index_set=self.parent().realization_of().cartan_type().classical().index_set())
1674
+
1675
+ def is_affine_grassmannian(self):
1676
+ r"""
1677
+ Return whether ``self`` is affine Grassmannian.
1678
+
1679
+ EXAMPLES::
1680
+
1681
+ sage: E = ExtendedAffineWeylGroup(['A',2,1]); PW0 = E.PW0()
1682
+ sage: F = E.fundamental_group()
1683
+ sage: [(x,PW0.from_fundamental(x).is_affine_grassmannian()) for x in F]
1684
+ [(pi[0], True), (pi[1], True), (pi[2], True)]
1685
+ sage: b = E.lattice_basis()
1686
+ sage: [(-x,PW0.from_translation(-x).is_affine_grassmannian()) for x in b]
1687
+ [(-Lambdacheck[1], True), (-Lambdacheck[2], True)]
1688
+ """
1689
+
1690
+ return self == self.to_affine_grassmannian()
1691
+
1692
+ def bruhat_le(self, x):
1693
+ r"""
1694
+ Return whether ``self`` <= `x` in Bruhat order.
1695
+
1696
+ INPUT:
1697
+
1698
+ - ``self`` -- an element of the extended affine Weyl group
1699
+ - ``x`` -- another element with the same parent as ``self``
1700
+
1701
+ EXAMPLES::
1702
+
1703
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], print_tuple=True); WF = E.WF()
1704
+ sage: W = E.affine_weyl()
1705
+ sage: v = W.from_reduced_word([2,1,0])
1706
+ sage: w = W.from_reduced_word([2,0,1,0])
1707
+ sage: v.bruhat_le(w)
1708
+ True
1709
+ sage: vx = WF.from_affine_weyl(v); vx
1710
+ (S2*S1*S0, pi[0])
1711
+ sage: wx = WF.from_affine_weyl(w); wx
1712
+ (S2*S0*S1*S0, pi[0])
1713
+ sage: vx.bruhat_le(wx)
1714
+ True
1715
+ sage: F = E.fundamental_group()
1716
+ sage: f = WF.from_fundamental(F(2))
1717
+ sage: vx.bruhat_le(wx*f)
1718
+ False
1719
+ sage: (vx*f).bruhat_le(wx*f)
1720
+ True
1721
+
1722
+ .. WARNING::
1723
+
1724
+ Must be implemented by "WF".
1725
+ """
1726
+ WF = self.parent().realization_of().WF()
1727
+ return WF(self).bruhat_le(WF(x))
1728
+
1729
+ def is_translation(self):
1730
+ r"""
1731
+ Return whether ``self`` is a translation element or not.
1732
+
1733
+ EXAMPLES::
1734
+
1735
+ sage: E = ExtendedAffineWeylGroup(['A',2,1]); FW = E.FW()
1736
+ sage: F = E.fundamental_group()
1737
+ sage: FW.from_affine_weyl(E.affine_weyl().from_reduced_word([1,2,1,0])).is_translation()
1738
+ True
1739
+ sage: FW.from_translation(E.lattice_basis()[1]).is_translation()
1740
+ True
1741
+ sage: FW.simple_reflection(0).is_translation()
1742
+ False
1743
+ """
1744
+ w = self.to_classical_weyl()
1745
+ return w == w.parent().one()
1746
+
1747
+ def action(self, la):
1748
+ r"""
1749
+ Action of ``self`` on a lattice element ``la``.
1750
+
1751
+ INPUT:
1752
+
1753
+ - ``self`` -- an element of the extended affine Weyl group
1754
+ - ``la`` -- an element of the translation lattice of the extended
1755
+ affine Weyl group, the lattice denoted by the mnemonic "P" in the
1756
+ documentation for :meth:`ExtendedAffineWeylGroup`.
1757
+
1758
+ EXAMPLES::
1759
+
1760
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], affine='s')
1761
+ sage: x = E.FW().an_element(); x
1762
+ pi[2] * s0*s1*s2
1763
+ sage: la = E.lattice().an_element(); la
1764
+ 2*Lambdacheck[1] + 2*Lambdacheck[2]
1765
+ sage: x.action(la)
1766
+ 5*Lambdacheck[1] - 3*Lambdacheck[2]
1767
+ sage: E = ExtendedAffineWeylGroup(['C',2,1], affine='s')
1768
+ sage: x = E.PW0().from_translation(E.lattice_basis()[1])
1769
+ sage: x.action(E.lattice_basis()[2])
1770
+ Lambdacheck[1] + Lambdacheck[2]
1771
+
1772
+ .. WARNING::
1773
+
1774
+ Must be implemented by style "PW0".
1775
+ """
1776
+ PW0 = self.parent().realization_of().PW0()
1777
+ return PW0(self).action(la)
1778
+
1779
+ def dual_action(self, la):
1780
+ r"""
1781
+ Action of ``self`` on a dual lattice element ``la``.
1782
+
1783
+ INPUT:
1784
+
1785
+ - ``self`` -- an element of the extended affine Weyl group
1786
+ - ``la`` -- an element of the dual translation lattice of the extended
1787
+ affine Weyl group, the lattice denoted by the mnemonic "Pv" in
1788
+ the documentation for :meth:`ExtendedAffineWeylGroup`.
1789
+
1790
+ EXAMPLES::
1791
+
1792
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], affine='s')
1793
+ sage: x = E.FW().an_element(); x
1794
+ pi[2] * s0*s1*s2
1795
+ sage: la = E.dual_lattice().an_element(); la
1796
+ 2*Lambda[1] + 2*Lambda[2]
1797
+ sage: x.dual_action(la)
1798
+ 5*Lambda[1] - 3*Lambda[2]
1799
+ sage: E = ExtendedAffineWeylGroup(['C',2,1], affine='s')
1800
+ sage: x = E.PvW0().from_dual_translation(E.dual_lattice_basis()[1])
1801
+ sage: x.dual_action(E.dual_lattice_basis()[2])
1802
+ Lambda[1] + Lambda[2]
1803
+
1804
+ .. WARNING::
1805
+
1806
+ Must be implemented by style "PvW0".
1807
+ """
1808
+ PvW0 = self.parent().realization_of().PvW0()
1809
+ return PvW0(self).dual_action(la)
1810
+
1811
+ def action_on_affine_roots(self, beta):
1812
+ r"""
1813
+ Act by ``self`` on the affine root lattice element ``beta``.
1814
+
1815
+ EXAMPLES::
1816
+
1817
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
1818
+ sage: beta = E.cartan_type().root_system().root_lattice().an_element(); beta
1819
+ 2*alpha[0] + 2*alpha[1] + 3*alpha[2]
1820
+ sage: x = E.FW().an_element(); x
1821
+ pi[2] * S0*S1*S2
1822
+ sage: x.action_on_affine_roots(beta)
1823
+ alpha[0] + alpha[1]
1824
+
1825
+ .. WARNING::
1826
+
1827
+ Must be implemented by style "FW".
1828
+ """
1829
+ E = self.parent().realization_of()
1830
+ assert beta in RootSystem(E.cartan_type()).root_lattice()
1831
+ return E.FW()(self).action_on_affine_roots(beta)
1832
+
1833
+ def face_data(self, i):
1834
+ r"""
1835
+ Return a description of one of the bounding hyperplanes of the alcove of an extended affine Weyl group element.
1836
+
1837
+ INPUT:
1838
+
1839
+ - ``self`` -- an element of the extended affine Weyl group
1840
+ - ``i`` -- an affine Dynkin node
1841
+
1842
+ OUTPUT:
1843
+
1844
+ - A 2-tuple `(m,\beta)` defined as follows.
1845
+
1846
+ ALGORITHM:
1847
+
1848
+ Each element of the extended affine Weyl group corresponds to an alcove,
1849
+ and each alcove has a face for each affine Dynkin node. Given the data of ``self`` and `i`,
1850
+ let the extended affine Weyl group element ``self`` act on the affine simple root `\alpha_i`,
1851
+ yielding a real affine root, which can be expressed uniquely as
1852
+
1853
+ .. MATH::
1854
+
1855
+ ``self`` \cdot \alpha_i = m \delta + \beta
1856
+
1857
+ where `m` is an integer (the height of the `i`-th bounding hyperplane of the alcove of ``self``)
1858
+ and `\beta` is a classical root (the normal vector for the hyperplane which points towards the alcove).
1859
+
1860
+ EXAMPLES::
1861
+
1862
+ sage: x = ExtendedAffineWeylGroup(['A',2,1]).PW0().an_element(); x
1863
+ t[2*Lambdacheck[1] + 2*Lambdacheck[2]] * s1*s2
1864
+ sage: x.face_data(0)
1865
+ (-1, alpha[1])
1866
+ """
1867
+ Qaf = self.parent().realization_of().cartan_type().root_system().root_lattice()
1868
+ gamma = self.action_on_affine_roots(Qaf.simple_root(i))
1869
+ return gamma[0], Qaf.classical()(gamma)
1870
+
1871
+ def alcove_walk_signs(self):
1872
+ r"""
1873
+ Return a signed alcove walk for ``self``.
1874
+
1875
+ INPUT:
1876
+
1877
+ - An element ``self`` of the extended affine Weyl group.
1878
+
1879
+ OUTPUT:
1880
+
1881
+ - A 3-tuple (`g`, ``rw``, ``signs``).
1882
+
1883
+ ALGORITHM:
1884
+
1885
+ The element ``self`` can be uniquely written ``self`` = `g` * `w`
1886
+ where `g` has length zero and `w` is an element of the nonextended affine Weyl group.
1887
+ Let `w` have reduced word ``rw``.
1888
+ Starting with `g` and applying simple reflections from ``rw``, one obtains
1889
+ a sequence of extended affine Weyl group elements (that is, alcoves) and simple roots.
1890
+ The signs give the sequence of sides on which the alcoves lie, relative to the face
1891
+ indicated by the simple roots.
1892
+
1893
+ EXAMPLES::
1894
+
1895
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); FW=E.FW()
1896
+ sage: w = FW.from_reduced_word([0,2,1,3,0])*FW.from_fundamental(1); w
1897
+ pi[1] * S3*S1*S2*S0*S3
1898
+ sage: w.alcove_walk_signs()
1899
+ (pi[1], [3, 1, 2, 0, 3], [-1, 1, -1, -1, 1])
1900
+ """
1901
+ We = self.parent()
1902
+ gw = We.realization_of().FW()(self)
1903
+ g = gw.cartesian_projection(0)
1904
+ w = gw.cartesian_projection(1)
1905
+ rw = w.reduced_word()
1906
+ u_curr = We.from_fundamental(g.value())
1907
+ signs = []
1908
+ for i in rw:
1909
+ m, beta = u_curr.face_data(i)
1910
+ if beta.is_positive_root():
1911
+ signs = signs + [1]
1912
+ else:
1913
+ signs = signs + [-1]
1914
+ u_curr = u_curr * We.simple_reflection(i)
1915
+ return g, rw, signs
1916
+
1917
+ class ExtendedAffineWeylGroupPW0Element(GroupSemidirectProduct.Element):
1918
+ r"""
1919
+ The element class for the "PW0" realization.
1920
+ """
1921
+
1922
+ def has_descent(self, i, side='right', positive=False) -> bool:
1923
+ r"""
1924
+ Return whether ``self`` has `i` as a descent.
1925
+
1926
+ INPUT:
1927
+
1928
+ - ``i`` -- an affine Dynkin node
1929
+
1930
+ OPTIONAL:
1931
+
1932
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'right'``)
1933
+ - ``positive`` -- boolean (default: ``False``)
1934
+
1935
+ EXAMPLES::
1936
+
1937
+ sage: w = ExtendedAffineWeylGroup(['A',4,2]).PW0().from_reduced_word([0,1]); w
1938
+ t[Lambda[1]] * s1*s2
1939
+ sage: w.has_descent(0, side='left')
1940
+ True
1941
+ """
1942
+
1943
+ E = self.parent().realization_of()
1944
+ if side == 'right':
1945
+ self = ~self
1946
+ if positive:
1947
+ return not self.has_descent(i, side='left')
1948
+ la = self.cartesian_projection(0).value
1949
+ w = self.cartesian_projection(1)
1950
+ if i == 0:
1951
+ ip = la.scalar(E._special_translation_covector) * E._a0check
1952
+ if ip > 1:
1953
+ return True
1954
+ if ip < 1:
1955
+ return False
1956
+ return E._special_root.weyl_action(w, inverse=True).is_positive_root()
1957
+ ip = la.scalar(E._simpleR0[i]) # test height versus simple (co)root
1958
+ if ip < 0:
1959
+ return True
1960
+ if ip > 0:
1961
+ return False
1962
+ return w.has_descent(i, side='left')
1963
+
1964
+ def action(self, la):
1965
+ r"""
1966
+ Return the action of ``self`` on an element ``la`` of the translation lattice.
1967
+
1968
+ EXAMPLES::
1969
+
1970
+ sage: E = ExtendedAffineWeylGroup(['A',2,1]); PW0 = E.PW0()
1971
+ sage: x = PW0.an_element(); x
1972
+ t[2*Lambdacheck[1] + 2*Lambdacheck[2]] * s1*s2
1973
+ sage: la = E.lattice().an_element(); la
1974
+ 2*Lambdacheck[1] + 2*Lambdacheck[2]
1975
+ sage: x.action(la)
1976
+ -2*Lambdacheck[1] + 4*Lambdacheck[2]
1977
+ """
1978
+ w = self.cartesian_projection(1)
1979
+ assert la in w.parent().domain()
1980
+ return self.cartesian_projection(0).value + w.action(la)
1981
+
1982
+ def to_translation_left(self):
1983
+ r"""
1984
+ The image of ``self`` under the map that projects to the translation lattice
1985
+ factor after factoring it to the left as in style "PW0".
1986
+
1987
+ EXAMPLES::
1988
+
1989
+ sage: s = ExtendedAffineWeylGroup(['A',2,1]).PW0().S0(); s
1990
+ t[Lambdacheck[1] + Lambdacheck[2]] * s1*s2*s1
1991
+ sage: s.to_translation_left()
1992
+ Lambdacheck[1] + Lambdacheck[2]
1993
+ """
1994
+ return self.cartesian_projection(0).value # undo the GroupExp
1995
+
1996
+ def to_classical_weyl(self):
1997
+ r"""
1998
+ Return the image of ``self`` under the homomorphism that projects to the classical
1999
+ Weyl group factor after rewriting it in either style "PW0" or "W0P".
2000
+
2001
+ EXAMPLES::
2002
+
2003
+ sage: s = ExtendedAffineWeylGroup(['A',2,1]).PW0().S0(); s
2004
+ t[Lambdacheck[1] + Lambdacheck[2]] * s1*s2*s1
2005
+ sage: s.to_classical_weyl()
2006
+ s1*s2*s1
2007
+ """
2008
+ return self.cartesian_projection(1)
2009
+
2010
+ class ExtendedAffineWeylGroupPW0(GroupSemidirectProduct, BindableClass):
2011
+ r"""
2012
+ Extended affine Weyl group, realized as the semidirect product of the translation lattice
2013
+ by the finite Weyl group.
2014
+
2015
+ INPUT:
2016
+
2017
+ - ``E`` -- a parent with realization in :class:`ExtendedAffineWeylGroup_Class`
2018
+
2019
+ EXAMPLES::
2020
+
2021
+ sage: ExtendedAffineWeylGroup(['A',2,1]).PW0()
2022
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
2023
+ Multiplicative form of Coweight lattice of the Root system of type ['A', 2]
2024
+ acted upon by Weyl Group of type ['A', 2]
2025
+ (as a matrix group acting on the coweight lattice)
2026
+ """
2027
+
2028
+ def __init__(self, E):
2029
+ r"""
2030
+ Create the PW0 realization of the extended affine Weyl group.
2031
+
2032
+ EXAMPLES::
2033
+
2034
+ sage: PW0 = ExtendedAffineWeylGroup(['D',3,2]).PW0()
2035
+ sage: TestSuite(PW0).run()
2036
+ """
2037
+ # note that we have to use the multiplicative version of the translation lattice
2038
+ # and change the twist to deal with this
2039
+ def twist(w, l):
2040
+ return E.exp_lattice()(w.action(l.value))
2041
+
2042
+ GroupSemidirectProduct.__init__(self, E.exp_lattice(), E.classical_weyl(), twist=twist, act_to_right=False, prefix0=E._prefixt, print_tuple=E._print_tuple, category=E.Realizations())
2043
+ self._style = "PW0"
2044
+
2045
+ def _repr_(self):
2046
+ r"""
2047
+ A string representing ``self``.
2048
+
2049
+ EXAMPLES::
2050
+
2051
+ sage: ExtendedAffineWeylGroup(['A',4,2]).PW0()._repr_()
2052
+ "Extended affine Weyl group of type ['BC', 2, 2] realized by Semidirect product of Multiplicative form of Weight lattice of the Root system of type ['C', 2] acted upon by Weyl Group of type ['C', 2] (as a matrix group acting on the weight lattice)"
2053
+ """
2054
+ return self.realization_of()._repr_() + " realized by " + super()._repr_()
2055
+
2056
+ def from_translation(self, la):
2057
+ r"""
2058
+ Map the translation lattice element ``la`` into ``self``.
2059
+
2060
+ EXAMPLES::
2061
+
2062
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], translation='tau',
2063
+ ....: print_tuple=True)
2064
+ sage: la = E.lattice().an_element(); la
2065
+ 2*Lambdacheck[1] + 2*Lambdacheck[2]
2066
+ sage: E.PW0().from_translation(la)
2067
+ (tau[2*Lambdacheck[1] + 2*Lambdacheck[2]], 1)
2068
+ """
2069
+ E = self.realization_of()
2070
+ return self((E.exp_lattice()(la),self.cartesian_factors()[1].one()))
2071
+
2072
+ @cached_method
2073
+ def S0(self):
2074
+ r"""
2075
+ Return the affine simple reflection.
2076
+
2077
+ EXAMPLES::
2078
+
2079
+ sage: ExtendedAffineWeylGroup(['B',2]).PW0().S0()
2080
+ t[Lambdacheck[2]] * s2*s1*s2
2081
+ """
2082
+ E = self.realization_of()
2083
+ return self((E.exp_lattice()(E.lattice()(E._special_translation)), E._special_reflection))
2084
+
2085
+ @cached_method
2086
+ def simple_reflection(self, i):
2087
+ r"""
2088
+ Return the `i`-th simple reflection in ``self``.
2089
+
2090
+ EXAMPLES::
2091
+
2092
+ sage: E = ExtendedAffineWeylGroup("G2")
2093
+ sage: [(i, E.PW0().simple_reflection(i)) for i in E.cartan_type().index_set()]
2094
+ [(0, t[Lambdacheck[2]] * s2*s1*s2*s1*s2), (1, s1), (2, s2)]
2095
+ """
2096
+ if i == 0:
2097
+ return self.S0()
2098
+ else:
2099
+ E = self.realization_of()
2100
+ return self.from_classical_weyl(E.classical_weyl().simple_reflection(i))
2101
+
2102
+ @cached_method
2103
+ def simple_reflections(self):
2104
+ r"""
2105
+ Return a family for the simple reflections of ``self``.
2106
+
2107
+ EXAMPLES::
2108
+
2109
+ sage: ExtendedAffineWeylGroup("A3").PW0().simple_reflections()
2110
+ Finite family {0: t[Lambdacheck[1] + Lambdacheck[3]] * s1*s2*s3*s2*s1,
2111
+ 1: s1, 2: s2, 3: s3}
2112
+ """
2113
+ return Family(self.realization_of().cartan_type().index_set(), self.simple_reflection)
2114
+
2115
+ def from_classical_weyl(self, w):
2116
+ r"""
2117
+ Return the image of `w` under the homomorphism of the classical Weyl group into ``self``.
2118
+
2119
+ EXAMPLES::
2120
+
2121
+ sage: E = ExtendedAffineWeylGroup("A3",print_tuple=True)
2122
+ sage: E.PW0().from_classical_weyl(E.classical_weyl().from_reduced_word([1,2]))
2123
+ (t[0], s1*s2)
2124
+ """
2125
+ return self((self.cartesian_factors()[0].one(),w))
2126
+
2127
+ class ExtendedAffineWeylGroupW0PElement(GroupSemidirectProduct.Element):
2128
+ r"""
2129
+ The element class for the W0P realization.
2130
+ """
2131
+
2132
+ def has_descent(self, i, side='right', positive=False) -> bool:
2133
+ r"""
2134
+ Return whether ``self`` has `i` as a descent.
2135
+
2136
+ INPUT:
2137
+
2138
+ - ``i`` -- an index
2139
+
2140
+ OPTIONAL:
2141
+
2142
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'right'``)
2143
+ - ``positive`` -- boolean (default: ``False``)
2144
+
2145
+ EXAMPLES::
2146
+
2147
+ sage: W0P = ExtendedAffineWeylGroup(['A',4,2]).W0P()
2148
+ sage: w = W0P.from_reduced_word([0,1]); w
2149
+ s1*s2 * t[Lambda[1] - Lambda[2]]
2150
+ sage: w.has_descent(0, side='left')
2151
+ True
2152
+ """
2153
+ E = self.parent().realization_of()
2154
+ if side == 'left':
2155
+ self = ~self
2156
+ if positive:
2157
+ return not self.has_descent(i, side='right')
2158
+ w = self.cartesian_projection(0)
2159
+ la = self.cartesian_projection(1).value
2160
+ if i == 0:
2161
+ ip = la.scalar(E._special_translation_covector) * E._a0check
2162
+ if ip < -1:
2163
+ return True
2164
+ if ip > -1:
2165
+ return False
2166
+ return E._special_root.weyl_action(w).is_positive_root()
2167
+ ip = la.scalar(E._simpleR0[i]) # test height versus simple (co)root
2168
+ if ip > 0:
2169
+ return True
2170
+ if ip < 0:
2171
+ return False
2172
+ return w.has_descent(i, side='right')
2173
+
2174
+ def to_classical_weyl(self):
2175
+ r"""
2176
+ Project ``self`` into the classical Weyl group.
2177
+
2178
+ EXAMPLES::
2179
+
2180
+ sage: x = ExtendedAffineWeylGroup(['A',2,1]).W0P().simple_reflection(0); x
2181
+ s1*s2*s1 * t[-Lambdacheck[1] - Lambdacheck[2]]
2182
+ sage: x.to_classical_weyl()
2183
+ s1*s2*s1
2184
+ """
2185
+ return self.cartesian_projection(0)
2186
+
2187
+ def to_translation_right(self):
2188
+ r"""
2189
+ Project onto the right (translation) factor in the "W0P" style.
2190
+
2191
+ EXAMPLES::
2192
+
2193
+ sage: x = ExtendedAffineWeylGroup(['A',2,1]).W0P().simple_reflection(0); x
2194
+ s1*s2*s1 * t[-Lambdacheck[1] - Lambdacheck[2]]
2195
+ sage: x.to_translation_right()
2196
+ -Lambdacheck[1] - Lambdacheck[2]
2197
+ """
2198
+ return self.cartesian_projection(1).value
2199
+
2200
+ class ExtendedAffineWeylGroupW0P(GroupSemidirectProduct, BindableClass):
2201
+ r"""
2202
+ Extended affine Weyl group, realized as the semidirect product of the finite Weyl group
2203
+ by the translation lattice.
2204
+
2205
+ INPUT:
2206
+
2207
+ - ``E`` -- a parent with realization in :class:`ExtendedAffineWeylGroup_Class`
2208
+
2209
+ EXAMPLES::
2210
+
2211
+ sage: ExtendedAffineWeylGroup(['A',2,1]).W0P()
2212
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
2213
+ Weyl Group of type ['A', 2] (as a matrix group acting on the coweight lattice)
2214
+ acting on Multiplicative form of Coweight lattice of the Root system of type ['A', 2]
2215
+ """
2216
+
2217
+ def __init__(self, E):
2218
+ r"""
2219
+ EXAMPLES::
2220
+
2221
+ sage: W0P = ExtendedAffineWeylGroup(['D',3,2]).W0P()
2222
+ sage: TestSuite(W0P).run()
2223
+ """
2224
+ def twist(w, l):
2225
+ return E.exp_lattice()(w.action(l.value))
2226
+
2227
+ GroupSemidirectProduct.__init__(self, E.classical_weyl(), E.exp_lattice(), twist=twist, act_to_right=True, prefix1=E._prefixt, print_tuple=E._print_tuple, category=E.Realizations())
2228
+ self._style = "W0P"
2229
+
2230
+ def _repr_(self):
2231
+ r"""
2232
+ A string representing ``self``.
2233
+
2234
+ EXAMPLES::
2235
+
2236
+ sage: ExtendedAffineWeylGroup(['A',4,2]).W0P()._repr_()
2237
+ "Extended affine Weyl group of type ['BC', 2, 2] realized by Semidirect product of Weyl Group of type ['C', 2] (as a matrix group acting on the weight lattice) acting on Multiplicative form of Weight lattice of the Root system of type ['C', 2]"
2238
+ """
2239
+ return self.realization_of()._repr_() + " realized by " + super()._repr_()
2240
+
2241
+ def S0(self):
2242
+ r"""
2243
+ Return the zero-th simple reflection in style "W0P".
2244
+
2245
+ EXAMPLES::
2246
+
2247
+ sage: ExtendedAffineWeylGroup(["A",3,1]).W0P().S0()
2248
+ s1*s2*s3*s2*s1 * t[-Lambdacheck[1] - Lambdacheck[3]]
2249
+ """
2250
+ E = self.realization_of()
2251
+ return self((E._special_reflection,E.exp_lattice()(E.lattice()(-E._special_translation))))
2252
+
2253
+ def simple_reflection(self, i):
2254
+ r"""
2255
+ Return the `i`-th simple reflection in ``self``.
2256
+
2257
+ EXAMPLES::
2258
+
2259
+ sage: E = ExtendedAffineWeylGroup(['A',3,1]); W0P = E.W0P()
2260
+ sage: [(i, W0P.simple_reflection(i)) for i in E.cartan_type().index_set()]
2261
+ [(0, s1*s2*s3*s2*s1 * t[-Lambdacheck[1] - Lambdacheck[3]]),
2262
+ (1, s1), (2, s2), (3, s3)]
2263
+ """
2264
+ if i == 0:
2265
+ return self.S0()
2266
+ E = self.realization_of()
2267
+ return self.from_classical_weyl(E.classical_weyl().simple_reflection(i))
2268
+
2269
+ @cached_method
2270
+ def simple_reflections(self):
2271
+ r"""
2272
+ Return the family of simple reflections.
2273
+
2274
+ EXAMPLES::
2275
+
2276
+ sage: ExtendedAffineWeylGroup(["A",3,1]).W0P().simple_reflections()
2277
+ Finite family {0: s1*s2*s3*s2*s1 * t[-Lambdacheck[1] - Lambdacheck[3]],
2278
+ 1: s1, 2: s2, 3: s3}
2279
+ """
2280
+ return Family(self.realization_of().cartan_type().index_set(), self.simple_reflection)
2281
+
2282
+ def from_classical_weyl(self, w):
2283
+ r"""
2284
+ Return the image of the classical Weyl group element `w` in ``self``.
2285
+
2286
+ EXAMPLES::
2287
+
2288
+ sage: E = ExtendedAffineWeylGroup(['A',2,1],print_tuple=True)
2289
+ sage: E.W0P().from_classical_weyl(E.classical_weyl().from_reduced_word([2,1]))
2290
+ (s2*s1, t[0])
2291
+ """
2292
+ return self((w,self.cartesian_factors()[1].one()))
2293
+
2294
+ def from_translation(self, la):
2295
+ r"""
2296
+ Return the image of the lattice element ``la`` in ``self``.
2297
+
2298
+ EXAMPLES::
2299
+
2300
+ sage: E = ExtendedAffineWeylGroup(['A',2,1],print_tuple=True)
2301
+ sage: E.W0P().from_translation(E.lattice().an_element())
2302
+ (1, t[2*Lambdacheck[1] + 2*Lambdacheck[2]])
2303
+ """
2304
+ return self((self.cartesian_factors()[0].one(),self.realization_of().exp_lattice()(la)))
2305
+
2306
+ class ExtendedAffineWeylGroupWFElement(GroupSemidirectProduct.Element):
2307
+ r"""
2308
+ Element class for the "WF" realization.
2309
+ """
2310
+
2311
+ def has_descent(self, i, side='right', positive=False) -> bool:
2312
+ r"""
2313
+ Return whether ``self`` has `i` as a descent.
2314
+
2315
+ INPUT:
2316
+
2317
+ - ``i`` -- an affine Dynkin index
2318
+
2319
+ OPTIONAL:
2320
+
2321
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'right'``)
2322
+ - ``positive`` -- boolean (default: ``False``)
2323
+
2324
+ EXAMPLES::
2325
+
2326
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2327
+ sage: x = E.WF().an_element(); x
2328
+ S0*S1*S2 * pi[2]
2329
+ sage: [(i, x.has_descent(i)) for i in E.cartan_type().index_set()]
2330
+ [(0, True), (1, False), (2, False)]
2331
+ """
2332
+ if side == 'right':
2333
+ self = ~self
2334
+ if positive:
2335
+ return not self.has_descent(i, side='left')
2336
+ return self.cartesian_projection(0).has_descent(i, side='left')
2337
+
2338
+ def to_fundamental_group(self):
2339
+ r"""
2340
+ Project ``self`` to the right (fundamental group) factor in the "WF" style.
2341
+
2342
+ EXAMPLES::
2343
+
2344
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2345
+ sage: x = E.WF().from_translation(E.lattice_basis()[1]); x
2346
+ S0*S2 * pi[1]
2347
+ sage: x.to_fundamental_group()
2348
+ pi[1]
2349
+ """
2350
+ return self.cartesian_projection(1)
2351
+
2352
+ def to_affine_weyl_left(self):
2353
+ r"""
2354
+ Project ``self`` to the left (affine Weyl group) factor in the "WF" style.
2355
+
2356
+ EXAMPLES::
2357
+
2358
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2359
+ sage: x = E.WF().from_translation(E.lattice_basis()[1]); x
2360
+ S0*S2 * pi[1]
2361
+ sage: x.to_affine_weyl_left()
2362
+ S0*S2
2363
+ """
2364
+ return self.cartesian_projection(0)
2365
+
2366
+ def bruhat_le(self, x):
2367
+ r"""
2368
+ Return whether ``self`` is less than or equal to `x` in the Bruhat order.
2369
+
2370
+ EXAMPLES::
2371
+
2372
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], affine='s',
2373
+ ....: print_tuple=True); WF = E.WF()
2374
+ sage: r = E.affine_weyl().from_reduced_word
2375
+ sage: v = r([1,0])
2376
+ sage: w = r([1,2,0])
2377
+ sage: v.bruhat_le(w)
2378
+ True
2379
+ sage: vv = WF.from_affine_weyl(v); vv
2380
+ (s1*s0, pi[0])
2381
+ sage: ww = WF.from_affine_weyl(w); ww
2382
+ (s1*s2*s0, pi[0])
2383
+ sage: vv.bruhat_le(ww)
2384
+ True
2385
+ sage: f = E.fundamental_group()(2); f
2386
+ pi[2]
2387
+ sage: ff = WF.from_fundamental(f); ff
2388
+ (1, pi[2])
2389
+ sage: vv.bruhat_le(ww*ff)
2390
+ False
2391
+ sage: (vv*ff).bruhat_le(ww*ff)
2392
+ True
2393
+ """
2394
+ if self.cartesian_projection(1) != x.cartesian_projection(1):
2395
+ return False
2396
+ return self.cartesian_projection(0).bruhat_le(x.cartesian_projection(0))
2397
+
2398
+ class ExtendedAffineWeylGroupWF(GroupSemidirectProduct, BindableClass):
2399
+ r"""
2400
+ Extended affine Weyl group, realized as the semidirect product of the affine Weyl group
2401
+ by the fundamental group.
2402
+
2403
+ INPUT:
2404
+
2405
+ - ``E`` -- a parent with realization in :class:`ExtendedAffineWeylGroup_Class`
2406
+
2407
+ EXAMPLES::
2408
+
2409
+ sage: ExtendedAffineWeylGroup(['A',2,1]).WF()
2410
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
2411
+ Weyl Group of type ['A', 2, 1] (as a matrix group acting on the root lattice)
2412
+ acted upon by Fundamental group of type ['A', 2, 1]
2413
+ """
2414
+
2415
+ def __init__(self, E):
2416
+ r"""
2417
+ EXAMPLES::
2418
+
2419
+ sage: WF = ExtendedAffineWeylGroup(['D',3,2]).WF()
2420
+ sage: TestSuite(WF).run()
2421
+ """
2422
+ def twist(g, w):
2423
+ return g.act_on_affine_weyl(w)
2424
+
2425
+ GroupSemidirectProduct.__init__(self, E.affine_weyl(), E.fundamental_group(), twist=twist, act_to_right=False, print_tuple=E._print_tuple, category=E.Realizations())
2426
+ self._style = "WF"
2427
+
2428
+ def _repr_(self):
2429
+ r"""
2430
+ A string representing ``self``.
2431
+
2432
+ EXAMPLES::
2433
+
2434
+ sage: ExtendedAffineWeylGroup(['A',4,2]).WF()._repr_()
2435
+ "Extended affine Weyl group of type ['BC', 2, 2] realized by Semidirect product of Weyl Group of type ['BC', 2, 2] (as a matrix group acting on the root lattice) acted upon by Fundamental group of type ['BC', 2, 2]"
2436
+ """
2437
+ return self.realization_of()._repr_() + " realized by " + super()._repr_()
2438
+
2439
+ def from_affine_weyl(self, w):
2440
+ r"""
2441
+ Return the image of the affine Weyl group element `w` in ``self``.
2442
+
2443
+ EXAMPLES::
2444
+
2445
+ sage: E = ExtendedAffineWeylGroup(['C',2,1], print_tuple=True)
2446
+ sage: E.WF().from_affine_weyl(E.affine_weyl().from_reduced_word([1,2,1,0]))
2447
+ (S1*S2*S1*S0, pi[0])
2448
+ """
2449
+ return self((w,self.cartesian_factors()[1].one()))
2450
+
2451
+ @cached_method
2452
+ def simple_reflections(self):
2453
+ r"""
2454
+ Return the family of simple reflections.
2455
+
2456
+ EXAMPLES::
2457
+
2458
+ sage: ExtendedAffineWeylGroup(["A",3,1], affine='r').WF().simple_reflections()
2459
+ Finite family {0: r0, 1: r1, 2: r2, 3: r3}
2460
+ """
2461
+ E = self.realization_of()
2462
+ W = E.affine_weyl()
2463
+ return Family(E.cartan_type().index_set(), lambda i: self.from_affine_weyl(W.simple_reflection(i)))
2464
+
2465
+ @cached_method
2466
+ def from_fundamental(self, f):
2467
+ r"""
2468
+ Return the image of `f` under the homomorphism from the fundamental group into
2469
+ the right (fundamental group) factor in "WF" style.
2470
+
2471
+ EXAMPLES::
2472
+
2473
+ sage: E = ExtendedAffineWeylGroup(['E',6,1], print_tuple=True); WF = E.WF()
2474
+ sage: F = E.fundamental_group()
2475
+ sage: [(x, WF.from_fundamental(x)) for x in F]
2476
+ [(pi[0], (1, pi[0])), (pi[1], (1, pi[1])), (pi[6], (1, pi[6]))]
2477
+ """
2478
+ return self((self.cartesian_factors()[0].one(),f))
2479
+
2480
+ class ExtendedAffineWeylGroupFWElement(GroupSemidirectProduct.Element):
2481
+ r"""
2482
+ The element class for the "FW" realization.
2483
+ """
2484
+
2485
+ def has_descent(self, i, side='right', positive=False) -> bool:
2486
+ r"""
2487
+ Return whether ``self`` has descent at `i`.
2488
+
2489
+ INPUT:
2490
+
2491
+ - ``i`` -- an affine Dynkin index
2492
+
2493
+ OPTIONAL:
2494
+
2495
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'right'``)
2496
+ - ``positive`` -- boolean (default: ``False``)
2497
+
2498
+ EXAMPLES::
2499
+
2500
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2501
+ sage: x = E.FW().an_element(); x
2502
+ pi[2] * S0*S1*S2
2503
+ sage: [(i, x.has_descent(i)) for i in E.cartan_type().index_set()]
2504
+ [(0, False), (1, False), (2, True)]
2505
+ """
2506
+ if side == 'left':
2507
+ self = ~self
2508
+ if positive:
2509
+ return not self.has_descent(i, side='right')
2510
+ return self.cartesian_projection(1).has_descent(i, side='right')
2511
+
2512
+ def to_fundamental_group(self):
2513
+ r"""
2514
+ Return the projection of ``self`` to the fundamental group in the "FW" style.
2515
+
2516
+ EXAMPLES::
2517
+
2518
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2519
+ sage: x = E.FW().from_translation(E.lattice_basis()[2]); x
2520
+ pi[2] * S1*S2
2521
+ sage: x.to_fundamental_group()
2522
+ pi[2]
2523
+ """
2524
+ return self.cartesian_projection(0)
2525
+
2526
+ def to_affine_weyl_right(self):
2527
+ r"""
2528
+ Project ``self`` to the right (affine Weyl group) factor in the "FW" style.
2529
+
2530
+ EXAMPLES::
2531
+
2532
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2533
+ sage: x = E.FW().from_translation(E.lattice_basis()[1]); x
2534
+ pi[1] * S2*S1
2535
+ sage: x.to_affine_weyl_right()
2536
+ S2*S1
2537
+ """
2538
+ return self.cartesian_projection(1)
2539
+
2540
+ def action_on_affine_roots(self, beta):
2541
+ r"""
2542
+ Act by ``self`` on the affine root lattice element ``beta``.
2543
+
2544
+ EXAMPLES::
2545
+
2546
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], affine='s')
2547
+ sage: x = E.FW().an_element(); x
2548
+ pi[2] * s0*s1*s2
2549
+ sage: v = RootSystem(['A',2,1]).root_lattice().an_element(); v
2550
+ 2*alpha[0] + 2*alpha[1] + 3*alpha[2]
2551
+ sage: x.action_on_affine_roots(v)
2552
+ alpha[0] + alpha[1]
2553
+ """
2554
+ g = self.cartesian_projection(0)
2555
+ w = self.cartesian_projection(1)
2556
+ return g.act_on_affine_lattice(w.action(beta))
2557
+
2558
+ class ExtendedAffineWeylGroupFW(GroupSemidirectProduct, BindableClass):
2559
+ r"""
2560
+ Extended affine Weyl group, realized as the semidirect product of the affine Weyl group
2561
+ by the fundamental group.
2562
+
2563
+ INPUT:
2564
+
2565
+ - ``E`` -- a parent with realization in :class:`ExtendedAffineWeylGroup_Class`
2566
+
2567
+ EXAMPLES::
2568
+
2569
+ sage: ExtendedAffineWeylGroup(['A',2,1]).FW()
2570
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
2571
+ Fundamental group of type ['A', 2, 1] acting on Weyl Group of type ['A', 2, 1]
2572
+ (as a matrix group acting on the root lattice)
2573
+ """
2574
+
2575
+ def __init__(self, E):
2576
+ r"""
2577
+
2578
+ EXAMPLES::
2579
+
2580
+ sage: FW = ExtendedAffineWeylGroup(['D',3,2]).FW()
2581
+ sage: TestSuite(FW).run()
2582
+ """
2583
+ def twist(g, w):
2584
+ return g.act_on_affine_weyl(w)
2585
+
2586
+ GroupSemidirectProduct.__init__(self, E.fundamental_group(), E.affine_weyl(), twist=twist, act_to_right=True, print_tuple=E._print_tuple, category=E.Realizations())
2587
+ self._style = "FW"
2588
+
2589
+ def _repr_(self):
2590
+ r"""
2591
+ A string representing ``self``.
2592
+
2593
+ EXAMPLES::
2594
+
2595
+ sage: ExtendedAffineWeylGroup(['A',4,2]).FW()._repr_()
2596
+ "Extended affine Weyl group of type ['BC', 2, 2] realized by Semidirect product of Fundamental group of type ['BC', 2, 2] acting on Weyl Group of type ['BC', 2, 2] (as a matrix group acting on the root lattice)"
2597
+ """
2598
+ return self.realization_of()._repr_() + " realized by " + super()._repr_()
2599
+
2600
+ @cached_method
2601
+ def simple_reflections(self):
2602
+ r"""
2603
+ Return the family of simple reflections of ``self``.
2604
+
2605
+ EXAMPLES::
2606
+
2607
+ sage: ExtendedAffineWeylGroup(['A',2,1],print_tuple=True).FW().simple_reflections()
2608
+ Finite family {0: (pi[0], S0), 1: (pi[0], S1), 2: (pi[0], S2)}
2609
+ """
2610
+ E = self.realization_of()
2611
+ W = E.affine_weyl()
2612
+ return Family(E.cartan_type().index_set(), lambda i: self.from_affine_weyl(W.simple_reflection(i)))
2613
+
2614
+ def from_affine_weyl(self, w):
2615
+ r"""
2616
+ Return the image of `w` under the map of the affine Weyl group into the right
2617
+ (affine Weyl group) factor in the "FW" style.
2618
+
2619
+ EXAMPLES::
2620
+
2621
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], print_tuple=True)
2622
+ sage: E.FW().from_affine_weyl(E.affine_weyl().from_reduced_word([0,2,1]))
2623
+ (pi[0], S0*S2*S1)
2624
+ """
2625
+ return self((self.cartesian_factors()[0].one(),w))
2626
+
2627
+ @cached_method
2628
+ def from_fundamental(self, f):
2629
+ r"""
2630
+ Return the image of the fundamental group element `f` into ``self``.
2631
+
2632
+ EXAMPLES::
2633
+
2634
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], print_tuple=True)
2635
+ sage: E.FW().from_fundamental(E.fundamental_group()(2))
2636
+ (pi[2], 1)
2637
+ """
2638
+ return self((f,self.cartesian_factors()[1].one()))
2639
+
2640
+ class ExtendedAffineWeylGroupPvW0Element(GroupSemidirectProduct.Element):
2641
+ r"""
2642
+ The element class for the "PvW0" realization.
2643
+ """
2644
+
2645
+ def has_descent(self, i, side='right', positive=False) -> bool:
2646
+ r"""
2647
+ Return whether ``self`` has `i` as a descent.
2648
+
2649
+ INPUT:
2650
+
2651
+ - ``i`` -- an affine Dynkin index
2652
+
2653
+ OPTIONAL:
2654
+
2655
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'right'``)
2656
+ - ``positive`` -- boolean (default: ``False``)
2657
+
2658
+ EXAMPLES::
2659
+
2660
+ sage: E = ExtendedAffineWeylGroup(['A',4,2])
2661
+ sage: w = E.PvW0().from_reduced_word([0,1]); w
2662
+ t[Lambda[1]] * s1*s2
2663
+ sage: [(i, w.has_descent(i, side='left')) for i in E.cartan_type().index_set()]
2664
+ [(0, True), (1, False), (2, False)]
2665
+ """
2666
+ return self.parent().realization_of().PW0()(self).has_descent(i, side=side, positive=positive)
2667
+
2668
+ def dual_action(self, la):
2669
+ r"""
2670
+ Return the action of ``self`` on an element ``la`` of the dual version of the translation lattice.
2671
+
2672
+ EXAMPLES::
2673
+
2674
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2675
+ sage: x = E.PvW0().an_element(); x
2676
+ t[2*Lambda[1] + 2*Lambda[2]] * s1*s2
2677
+ sage: la = E.dual_lattice().an_element(); la
2678
+ 2*Lambda[1] + 2*Lambda[2]
2679
+ sage: x.dual_action(la)
2680
+ -2*Lambda[1] + 4*Lambda[2]
2681
+ """
2682
+ w = self.cartesian_projection(1)
2683
+ assert la in w.parent().domain()
2684
+ return self.cartesian_projection(0).value + w.action(la)
2685
+
2686
+ def to_dual_translation_left(self):
2687
+ r"""
2688
+ The image of ``self`` under the map that projects to the dual translation lattice
2689
+ factor after factoring it to the left as in style "PvW0".
2690
+
2691
+ EXAMPLES::
2692
+
2693
+ sage: s = ExtendedAffineWeylGroup(['A',2,1]).PvW0().simple_reflection(0); s
2694
+ t[Lambda[1] + Lambda[2]] * s1*s2*s1
2695
+ sage: s.to_dual_translation_left()
2696
+ Lambda[1] + Lambda[2]
2697
+ """
2698
+ return self.cartesian_projection(0).value # undo the GroupExp
2699
+
2700
+ def to_dual_classical_weyl(self):
2701
+ r"""
2702
+ Return the image of ``self`` under the homomorphism that projects to the dual classical
2703
+ Weyl group factor after rewriting it in either style "PvW0" or "W0Pv".
2704
+
2705
+ EXAMPLES::
2706
+
2707
+ sage: s = ExtendedAffineWeylGroup(['A',2,1]).PvW0().simple_reflection(0); s
2708
+ t[Lambda[1] + Lambda[2]] * s1*s2*s1
2709
+ sage: s.to_dual_classical_weyl()
2710
+ s1*s2*s1
2711
+ """
2712
+ return self.cartesian_projection(1)
2713
+
2714
+ def is_translation(self):
2715
+ r"""
2716
+ Return whether ``self`` is a translation element or not.
2717
+
2718
+ EXAMPLES::
2719
+
2720
+ sage: PvW0 = ExtendedAffineWeylGroup(['A',2,1]).PvW0()
2721
+ sage: t = PvW0.from_reduced_word([1,2,1,0])
2722
+ sage: t.is_translation()
2723
+ True
2724
+ sage: PvW0.simple_reflection(0).is_translation()
2725
+ False
2726
+ """
2727
+ w = self.to_dual_classical_weyl()
2728
+ return w == w.parent().one()
2729
+
2730
+ class ExtendedAffineWeylGroupPvW0(GroupSemidirectProduct, BindableClass):
2731
+ r"""
2732
+ Extended affine Weyl group, realized as the semidirect product of the dual form of the translation lattice
2733
+ by the finite Weyl group.
2734
+
2735
+ INPUT:
2736
+
2737
+ - ``E`` -- a parent with realization in :class:`ExtendedAffineWeylGroup_Class`
2738
+
2739
+ EXAMPLES::
2740
+
2741
+ sage: ExtendedAffineWeylGroup(['A',2,1]).PvW0()
2742
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
2743
+ Multiplicative form of Weight lattice of the Root system of type ['A', 2] acted
2744
+ upon by Weyl Group of type ['A', 2] (as a matrix group acting on the weight lattice)
2745
+ """
2746
+
2747
+ def __init__(self, E):
2748
+ r"""
2749
+
2750
+ EXAMPLES::
2751
+
2752
+ sage: PvW0 = ExtendedAffineWeylGroup(['D',3,2]).PvW0()
2753
+ sage: TestSuite(PvW0).run()
2754
+ """
2755
+ # note that we have to use the multiplicative version of the translation lattice
2756
+ # and change the twist to deal with this
2757
+ def twist(w, l):
2758
+ return E.exp_dual_lattice()(w.action(l.value))
2759
+
2760
+ GroupSemidirectProduct.__init__(self, E.exp_dual_lattice(), E.dual_classical_weyl(), twist=twist, act_to_right=False, prefix0=E._prefixt, print_tuple=E._print_tuple, category=E.Realizations())
2761
+ self._style = "PvW0"
2762
+
2763
+ def _repr_(self):
2764
+ r"""
2765
+ A string representing ``self``.
2766
+
2767
+ EXAMPLES::
2768
+
2769
+ sage: ExtendedAffineWeylGroup(['A',4,2]).PvW0()._repr_()
2770
+ "Extended affine Weyl group of type ['BC', 2, 2] realized by Semidirect product of Multiplicative form of Weight lattice of the Root system of type ['C', 2] acted upon by Weyl Group of type ['C', 2] (as a matrix group acting on the weight lattice)"
2771
+ """
2772
+ return self.realization_of()._repr_() + " realized by " + super()._repr_()
2773
+
2774
+ def from_dual_translation(self, la):
2775
+ r"""
2776
+ Map the dual translation lattice element ``la`` into ``self``.
2777
+
2778
+ EXAMPLES::
2779
+
2780
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], translation='tau',
2781
+ ....: print_tuple=True)
2782
+ sage: la = E.dual_lattice().an_element(); la
2783
+ 2*Lambda[1] + 2*Lambda[2]
2784
+ sage: E.PvW0().from_dual_translation(la)
2785
+ (tau[2*Lambda[1] + 2*Lambda[2]], 1)
2786
+ """
2787
+ E = self.realization_of()
2788
+ return self((E.exp_dual_lattice()(la),self.cartesian_factors()[1].one()))
2789
+
2790
+ @cached_method
2791
+ def simple_reflections(self):
2792
+ r"""
2793
+ Return a family for the simple reflections of ``self``.
2794
+
2795
+ EXAMPLES::
2796
+
2797
+ sage: ExtendedAffineWeylGroup(['A',3,1]).PvW0().simple_reflections()
2798
+ Finite family {0: t[Lambda[1] + Lambda[3]] * s1*s2*s3*s2*s1,
2799
+ 1: s1, 2: s2, 3: s3}
2800
+ """
2801
+ E = self.realization_of()
2802
+ return Family(E.cartan_type().index_set(), lambda i: self(E.PW0().simple_reflection(i)))
2803
+
2804
+ def from_dual_classical_weyl(self, w):
2805
+ r"""
2806
+ Return the image of `w` under the homomorphism of the dual form of the classical Weyl group into ``self``.
2807
+
2808
+ EXAMPLES::
2809
+
2810
+ sage: E = ExtendedAffineWeylGroup(['A',3,1], print_tuple=True)
2811
+ sage: E.PvW0().from_dual_classical_weyl(
2812
+ ....: E.dual_classical_weyl().from_reduced_word([1,2]))
2813
+ (t[0], s1*s2)
2814
+ """
2815
+ return self((self.cartesian_factors()[0].one(),w))
2816
+
2817
+ class ExtendedAffineWeylGroupW0PvElement(GroupSemidirectProduct.Element):
2818
+ r"""
2819
+ The element class for the "W0Pv" realization.
2820
+ """
2821
+
2822
+ def dual_action(self, la):
2823
+ r"""
2824
+ Return the action of ``self`` on an element ``la`` of the dual version of the translation lattice.
2825
+
2826
+ EXAMPLES::
2827
+
2828
+ sage: E = ExtendedAffineWeylGroup(['A',2,1])
2829
+ sage: x = E.W0Pv().an_element(); x
2830
+ s1*s2 * t[2*Lambda[1] + 2*Lambda[2]]
2831
+ sage: la = E.dual_lattice().an_element(); la
2832
+ 2*Lambda[1] + 2*Lambda[2]
2833
+ sage: x.dual_action(la)
2834
+ -8*Lambda[1] + 4*Lambda[2]
2835
+ """
2836
+ w = self.cartesian_projection(0)
2837
+ assert la in w.parent().domain()
2838
+ return w.action(self.cartesian_projection(1).value + la)
2839
+
2840
+ def has_descent(self, i, side='right', positive=False) -> bool:
2841
+ r"""
2842
+ Return whether ``self`` has `i` as a descent.
2843
+
2844
+ INPUT:
2845
+
2846
+ - ``i`` -- an affine Dynkin index
2847
+
2848
+ OPTIONAL:
2849
+
2850
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'right'``)
2851
+ - ``positive`` -- boolean (default: ``False``)
2852
+
2853
+ EXAMPLES::
2854
+
2855
+ sage: w = ExtendedAffineWeylGroup(['A',4,2]).W0Pv().from_reduced_word([0,1]); w
2856
+ s1*s2 * t[Lambda[1] - Lambda[2]]
2857
+ sage: w.has_descent(0, side='left')
2858
+ True
2859
+ """
2860
+ return self.parent().realization_of().W0P()(self).has_descent(i, side=side, positive=positive)
2861
+
2862
+ def to_dual_translation_right(self):
2863
+ r"""
2864
+ The image of ``self`` under the map that projects to the dual translation lattice
2865
+ factor after factoring it to the right as in style "W0Pv".
2866
+
2867
+ EXAMPLES::
2868
+
2869
+ sage: s = ExtendedAffineWeylGroup(['A',2,1]).W0Pv().simple_reflection(0); s
2870
+ s1*s2*s1 * t[-Lambda[1] - Lambda[2]]
2871
+ sage: s.to_dual_translation_right()
2872
+ -Lambda[1] - Lambda[2]
2873
+ """
2874
+ return self.cartesian_projection(1).value # undo the GroupExp
2875
+
2876
+ def to_dual_classical_weyl(self):
2877
+ r"""
2878
+ Return the image of ``self`` under the homomorphism that projects to the dual classical
2879
+ Weyl group factor after rewriting it in either style "PvW0" or "W0Pv".
2880
+
2881
+ EXAMPLES::
2882
+
2883
+ sage: s = ExtendedAffineWeylGroup(['A',2,1]).W0Pv().simple_reflection(0); s
2884
+ s1*s2*s1 * t[-Lambda[1] - Lambda[2]]
2885
+ sage: s.to_dual_classical_weyl()
2886
+ s1*s2*s1
2887
+ """
2888
+ return self.cartesian_projection(0)
2889
+
2890
+ def is_translation(self):
2891
+ r"""
2892
+ Return whether ``self`` is a translation element or not.
2893
+
2894
+ EXAMPLES::
2895
+
2896
+ sage: ExtendedAffineWeylGroup(['A',2,1]).W0Pv().from_reduced_word([1,2,1,0]).is_translation()
2897
+ True
2898
+ """
2899
+ w = self.to_dual_classical_weyl()
2900
+ return w == w.parent().one()
2901
+
2902
+ class ExtendedAffineWeylGroupW0Pv(GroupSemidirectProduct, BindableClass):
2903
+ r"""
2904
+ Extended affine Weyl group, realized as the semidirect product of the finite Weyl group, acting on the
2905
+ dual form of the translation lattice.
2906
+
2907
+ INPUT:
2908
+
2909
+ - ``E`` -- a parent with realization in :class:`ExtendedAffineWeylGroup_Class`
2910
+
2911
+ EXAMPLES::
2912
+
2913
+ sage: ExtendedAffineWeylGroup(['A',2,1]).W0Pv()
2914
+ Extended affine Weyl group of type ['A', 2, 1] realized by Semidirect product of
2915
+ Weyl Group of type ['A', 2] (as a matrix group acting on the weight lattice)
2916
+ acting on Multiplicative form of Weight lattice of the Root system of type ['A', 2]
2917
+ """
2918
+
2919
+ def __init__(self, E):
2920
+ r"""
2921
+ EXAMPLES::
2922
+
2923
+ sage: W0Pv = ExtendedAffineWeylGroup(['D',3,2]).W0Pv()
2924
+ sage: TestSuite(W0Pv).run()
2925
+ """
2926
+ # note that we have to use the multiplicative version of the translation lattice
2927
+ # and change the twist to deal with this
2928
+ def twist(w, l):
2929
+ return E.exp_dual_lattice()(w.action(l.value))
2930
+
2931
+ GroupSemidirectProduct.__init__(self, E.dual_classical_weyl(), E.exp_dual_lattice(), twist=twist, act_to_right=True, prefix1=E._prefixt, print_tuple=E._print_tuple, category=E.Realizations())
2932
+ self._style = "W0Pv"
2933
+
2934
+ def _repr_(self):
2935
+ r"""
2936
+ A string representing ``self``.
2937
+
2938
+ EXAMPLES::
2939
+
2940
+ sage: ExtendedAffineWeylGroup(['A',4,2]).W0Pv()._repr_()
2941
+ "Extended affine Weyl group of type ['BC', 2, 2] realized by Semidirect product of Weyl Group of type ['C', 2] (as a matrix group acting on the weight lattice) acting on Multiplicative form of Weight lattice of the Root system of type ['C', 2]"
2942
+ """
2943
+ return self.realization_of()._repr_() + " realized by " + super()._repr_()
2944
+
2945
+ def from_dual_translation(self, la):
2946
+ r"""
2947
+ Map the dual translation lattice element ``la`` into ``self``.
2948
+
2949
+ EXAMPLES::
2950
+
2951
+ sage: E = ExtendedAffineWeylGroup(['A',2,1], translation='tau',
2952
+ ....: print_tuple=True)
2953
+ sage: la = E.dual_lattice().an_element(); la
2954
+ 2*Lambda[1] + 2*Lambda[2]
2955
+ sage: E.W0Pv().from_dual_translation(la)
2956
+ (1, tau[2*Lambda[1] + 2*Lambda[2]])
2957
+ """
2958
+ E = self.realization_of()
2959
+ return self((self.cartesian_factors()[0].one(),E.exp_dual_lattice()(la)))
2960
+
2961
+ @cached_method
2962
+ def simple_reflections(self):
2963
+ r"""
2964
+ Return a family for the simple reflections of ``self``.
2965
+
2966
+ EXAMPLES::
2967
+
2968
+ sage: ExtendedAffineWeylGroup(['A',3,1]).W0Pv().simple_reflections()
2969
+ Finite family {0: s1*s2*s3*s2*s1 * t[-Lambda[1] - Lambda[3]],
2970
+ 1: s1, 2: s2, 3: s3}
2971
+ """
2972
+ E = self.realization_of()
2973
+ return Family(E.cartan_type().index_set(), lambda i: self(E.PW0().simple_reflection(i)))
2974
+
2975
+ def from_dual_classical_weyl(self, w):
2976
+ r"""
2977
+ Return the image of `w` under the homomorphism of the dual form of the classical Weyl group into ``self``.
2978
+
2979
+ EXAMPLES::
2980
+
2981
+ sage: E = ExtendedAffineWeylGroup(['A',3,1],print_tuple=True)
2982
+ sage: E.W0Pv().from_dual_classical_weyl(E.dual_classical_weyl().from_reduced_word([1,2]))
2983
+ (s1*s2, t[0])
2984
+ """
2985
+ return self((w,self.cartesian_factors()[1].one()))
2986
+
2987
+
2988
+ ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupPW0.Element = ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupPW0Element
2989
+ ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupW0P.Element = ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupW0PElement
2990
+ ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupWF.Element = ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupWFElement
2991
+ ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupFW.Element = ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupFWElement
2992
+ ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupPvW0.Element = ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupPvW0Element
2993
+ ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupW0Pv.Element = ExtendedAffineWeylGroup_Class.ExtendedAffineWeylGroupW0PvElement