passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_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-singular might be problematic. Click here for more details.

Files changed (490) hide show
  1. PySingular.cpython-314-aarch64-linux-gnu.so +0 -0
  2. passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
  3. passagemath_singular-10.6.31rc3.dist-info/RECORD +490 -0
  4. passagemath_singular-10.6.31rc3.dist-info/WHEEL +6 -0
  5. passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
  6. passagemath_singular.libs/libSingular-4-6a2a8666.4.1.so +0 -0
  7. passagemath_singular.libs/libcddgmp-ac579979.so.0.1.3 +0 -0
  8. passagemath_singular.libs/libfactory-4-66e33516.4.1.so +0 -0
  9. passagemath_singular.libs/libflint-81de1160.so.21.0.0 +0 -0
  10. passagemath_singular.libs/libgf2x-fbd36f80.so.3.0.0 +0 -0
  11. passagemath_singular.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  12. passagemath_singular.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  13. passagemath_singular.libs/libgsl-e3525837.so.28.0.0 +0 -0
  14. passagemath_singular.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  15. passagemath_singular.libs/libntl-0043a3a2.so.44.0.1 +0 -0
  16. passagemath_singular.libs/libomalloc-0-06512335.9.6.so +0 -0
  17. passagemath_singular.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  18. passagemath_singular.libs/libpolys-4-cb7246b5.4.1.so +0 -0
  19. passagemath_singular.libs/libreadline-28330744.so.8.2 +0 -0
  20. passagemath_singular.libs/libsingular_resources-4-8c425241.4.1.so +0 -0
  21. passagemath_singular.libs/libtinfo-f81c2d16.so.6.3 +0 -0
  22. sage/algebras/all__sagemath_singular.py +3 -0
  23. sage/algebras/fusion_rings/all.py +19 -0
  24. sage/algebras/fusion_rings/f_matrix.py +2448 -0
  25. sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-aarch64-linux-gnu.so +0 -0
  26. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
  27. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
  28. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-aarch64-linux-gnu.so +0 -0
  29. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
  30. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
  31. sage/algebras/fusion_rings/fusion_double.py +899 -0
  32. sage/algebras/fusion_rings/fusion_ring.py +1580 -0
  33. sage/algebras/fusion_rings/poly_tup_engine.cpython-314-aarch64-linux-gnu.so +0 -0
  34. sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
  35. sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
  36. sage/algebras/fusion_rings/shm_managers.cpython-314-aarch64-linux-gnu.so +0 -0
  37. sage/algebras/fusion_rings/shm_managers.pxd +24 -0
  38. sage/algebras/fusion_rings/shm_managers.pyx +780 -0
  39. sage/algebras/letterplace/all.py +1 -0
  40. sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  41. sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
  42. sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
  43. sage/algebras/letterplace/free_algebra_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
  45. sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
  46. sage/algebras/letterplace/letterplace_ideal.cpython-314-aarch64-linux-gnu.so +0 -0
  47. sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
  48. sage/algebras/quatalg/all.py +2 -0
  49. sage/algebras/quatalg/quaternion_algebra.py +4778 -0
  50. sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-aarch64-linux-gnu.so +0 -0
  51. sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
  52. sage/algebras/quatalg/quaternion_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  53. sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
  54. sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
  55. sage/all__sagemath_singular.py +11 -0
  56. sage/ext_data/all__sagemath_singular.py +1 -0
  57. sage/ext_data/singular/function_field/core.lib +98 -0
  58. sage/interfaces/all__sagemath_singular.py +1 -0
  59. sage/interfaces/singular.py +2835 -0
  60. sage/libs/all__sagemath_singular.py +1 -0
  61. sage/libs/singular/__init__.py +1 -0
  62. sage/libs/singular/decl.pxd +1168 -0
  63. sage/libs/singular/function.cpython-314-aarch64-linux-gnu.so +0 -0
  64. sage/libs/singular/function.pxd +87 -0
  65. sage/libs/singular/function.pyx +1901 -0
  66. sage/libs/singular/function_factory.py +61 -0
  67. sage/libs/singular/groebner_strategy.cpython-314-aarch64-linux-gnu.so +0 -0
  68. sage/libs/singular/groebner_strategy.pxd +22 -0
  69. sage/libs/singular/groebner_strategy.pyx +582 -0
  70. sage/libs/singular/option.cpython-314-aarch64-linux-gnu.so +0 -0
  71. sage/libs/singular/option.pyx +671 -0
  72. sage/libs/singular/polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/libs/singular/polynomial.pxd +39 -0
  74. sage/libs/singular/polynomial.pyx +661 -0
  75. sage/libs/singular/ring.cpython-314-aarch64-linux-gnu.so +0 -0
  76. sage/libs/singular/ring.pxd +58 -0
  77. sage/libs/singular/ring.pyx +893 -0
  78. sage/libs/singular/singular.cpython-314-aarch64-linux-gnu.so +0 -0
  79. sage/libs/singular/singular.pxd +72 -0
  80. sage/libs/singular/singular.pyx +1944 -0
  81. sage/libs/singular/standard_options.py +145 -0
  82. sage/matrix/all__sagemath_singular.py +1 -0
  83. sage/matrix/matrix_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  84. sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
  85. sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
  86. sage/rings/all__sagemath_singular.py +1 -0
  87. sage/rings/function_field/all__sagemath_singular.py +1 -0
  88. sage/rings/function_field/derivations_polymod.py +911 -0
  89. sage/rings/function_field/element_polymod.cpython-314-aarch64-linux-gnu.so +0 -0
  90. sage/rings/function_field/element_polymod.pyx +406 -0
  91. sage/rings/function_field/function_field_polymod.py +2611 -0
  92. sage/rings/function_field/ideal_polymod.py +1775 -0
  93. sage/rings/function_field/order_polymod.py +1475 -0
  94. sage/rings/function_field/place_polymod.py +681 -0
  95. sage/rings/polynomial/all__sagemath_singular.py +1 -0
  96. sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
  98. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
  99. sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  100. sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
  101. sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
  102. sage/rings/polynomial/plural.cpython-314-aarch64-linux-gnu.so +0 -0
  103. sage/rings/polynomial/plural.pxd +48 -0
  104. sage/rings/polynomial/plural.pyx +3171 -0
  105. sage/symbolic/all__sagemath_singular.py +1 -0
  106. sage/symbolic/comparison_impl.pxi +428 -0
  107. sage/symbolic/constants_c_impl.pxi +178 -0
  108. sage/symbolic/expression.cpython-314-aarch64-linux-gnu.so +0 -0
  109. sage/symbolic/expression.pxd +7 -0
  110. sage/symbolic/expression.pyx +14200 -0
  111. sage/symbolic/getitem_impl.pxi +202 -0
  112. sage/symbolic/pynac.pxi +572 -0
  113. sage/symbolic/pynac_constant_impl.pxi +133 -0
  114. sage/symbolic/pynac_function_impl.pxi +206 -0
  115. sage/symbolic/pynac_impl.pxi +2576 -0
  116. sage/symbolic/pynac_wrap.h +124 -0
  117. sage/symbolic/series_impl.pxi +272 -0
  118. sage/symbolic/substitution_map_impl.pxi +94 -0
  119. sage_wheels/bin/ESingular +0 -0
  120. sage_wheels/bin/Singular +0 -0
  121. sage_wheels/bin/TSingular +0 -0
  122. sage_wheels/lib/singular/MOD/cohomo.la +41 -0
  123. sage_wheels/lib/singular/MOD/cohomo.so +0 -0
  124. sage_wheels/lib/singular/MOD/customstd.la +41 -0
  125. sage_wheels/lib/singular/MOD/customstd.so +0 -0
  126. sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
  127. sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
  128. sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
  129. sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
  130. sage_wheels/lib/singular/MOD/gitfan.la +41 -0
  131. sage_wheels/lib/singular/MOD/gitfan.so +0 -0
  132. sage_wheels/lib/singular/MOD/interval.la +41 -0
  133. sage_wheels/lib/singular/MOD/interval.so +0 -0
  134. sage_wheels/lib/singular/MOD/loctriv.la +41 -0
  135. sage_wheels/lib/singular/MOD/loctriv.so +0 -0
  136. sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
  137. sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
  138. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
  139. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
  140. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
  141. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
  142. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
  143. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
  144. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
  145. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
  146. sage_wheels/lib/singular/MOD/partialgb.la +41 -0
  147. sage_wheels/lib/singular/MOD/partialgb.so +0 -0
  148. sage_wheels/lib/singular/MOD/pyobject.la +41 -0
  149. sage_wheels/lib/singular/MOD/pyobject.so +0 -0
  150. sage_wheels/lib/singular/MOD/singmathic.la +41 -0
  151. sage_wheels/lib/singular/MOD/singmathic.so +0 -0
  152. sage_wheels/lib/singular/MOD/sispasm.la +41 -0
  153. sage_wheels/lib/singular/MOD/sispasm.so +0 -0
  154. sage_wheels/lib/singular/MOD/subsets.la +41 -0
  155. sage_wheels/lib/singular/MOD/subsets.so +0 -0
  156. sage_wheels/lib/singular/MOD/systhreads.la +41 -0
  157. sage_wheels/lib/singular/MOD/systhreads.so +0 -0
  158. sage_wheels/lib/singular/MOD/syzextra.la +41 -0
  159. sage_wheels/lib/singular/MOD/syzextra.so +0 -0
  160. sage_wheels/libexec/singular/MOD/change_cost +0 -0
  161. sage_wheels/libexec/singular/MOD/singularsurf +11 -0
  162. sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
  163. sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
  164. sage_wheels/libexec/singular/MOD/solve_IP +0 -0
  165. sage_wheels/libexec/singular/MOD/surfex +16 -0
  166. sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
  167. sage_wheels/share/factory/gftables/10201 +342 -0
  168. sage_wheels/share/factory/gftables/1024 +37 -0
  169. sage_wheels/share/factory/gftables/10609 +356 -0
  170. sage_wheels/share/factory/gftables/11449 +384 -0
  171. sage_wheels/share/factory/gftables/11881 +398 -0
  172. sage_wheels/share/factory/gftables/121 +6 -0
  173. sage_wheels/share/factory/gftables/12167 +408 -0
  174. sage_wheels/share/factory/gftables/125 +7 -0
  175. sage_wheels/share/factory/gftables/12769 +428 -0
  176. sage_wheels/share/factory/gftables/128 +7 -0
  177. sage_wheels/share/factory/gftables/1331 +47 -0
  178. sage_wheels/share/factory/gftables/1369 +48 -0
  179. sage_wheels/share/factory/gftables/14641 +490 -0
  180. sage_wheels/share/factory/gftables/15625 +523 -0
  181. sage_wheels/share/factory/gftables/16 +3 -0
  182. sage_wheels/share/factory/gftables/16129 +540 -0
  183. sage_wheels/share/factory/gftables/16384 +549 -0
  184. sage_wheels/share/factory/gftables/16807 +563 -0
  185. sage_wheels/share/factory/gftables/1681 +58 -0
  186. sage_wheels/share/factory/gftables/169 +8 -0
  187. sage_wheels/share/factory/gftables/17161 +574 -0
  188. sage_wheels/share/factory/gftables/1849 +64 -0
  189. sage_wheels/share/factory/gftables/18769 +628 -0
  190. sage_wheels/share/factory/gftables/19321 +646 -0
  191. sage_wheels/share/factory/gftables/19683 +659 -0
  192. sage_wheels/share/factory/gftables/2048 +71 -0
  193. sage_wheels/share/factory/gftables/2187 +75 -0
  194. sage_wheels/share/factory/gftables/2197 +76 -0
  195. sage_wheels/share/factory/gftables/2209 +76 -0
  196. sage_wheels/share/factory/gftables/22201 +742 -0
  197. sage_wheels/share/factory/gftables/22801 +762 -0
  198. sage_wheels/share/factory/gftables/2401 +82 -0
  199. sage_wheels/share/factory/gftables/243 +11 -0
  200. sage_wheels/share/factory/gftables/24389 +815 -0
  201. sage_wheels/share/factory/gftables/24649 +824 -0
  202. sage_wheels/share/factory/gftables/25 +3 -0
  203. sage_wheels/share/factory/gftables/256 +11 -0
  204. sage_wheels/share/factory/gftables/26569 +888 -0
  205. sage_wheels/share/factory/gftables/27 +3 -0
  206. sage_wheels/share/factory/gftables/27889 +932 -0
  207. sage_wheels/share/factory/gftables/2809 +96 -0
  208. sage_wheels/share/factory/gftables/28561 +954 -0
  209. sage_wheels/share/factory/gftables/289 +12 -0
  210. sage_wheels/share/factory/gftables/29791 +995 -0
  211. sage_wheels/share/factory/gftables/29929 +1000 -0
  212. sage_wheels/share/factory/gftables/3125 +107 -0
  213. sage_wheels/share/factory/gftables/32 +4 -0
  214. sage_wheels/share/factory/gftables/32041 +1070 -0
  215. sage_wheels/share/factory/gftables/32761 +1094 -0
  216. sage_wheels/share/factory/gftables/32768 +1095 -0
  217. sage_wheels/share/factory/gftables/343 +14 -0
  218. sage_wheels/share/factory/gftables/3481 +118 -0
  219. sage_wheels/share/factory/gftables/361 +14 -0
  220. sage_wheels/share/factory/gftables/36481 +1218 -0
  221. sage_wheels/share/factory/gftables/3721 +126 -0
  222. sage_wheels/share/factory/gftables/37249 +1244 -0
  223. sage_wheels/share/factory/gftables/38809 +1296 -0
  224. sage_wheels/share/factory/gftables/39601 +1322 -0
  225. sage_wheels/share/factory/gftables/4 +3 -0
  226. sage_wheels/share/factory/gftables/4096 +139 -0
  227. sage_wheels/share/factory/gftables/44521 +1486 -0
  228. sage_wheels/share/factory/gftables/4489 +152 -0
  229. sage_wheels/share/factory/gftables/49 +4 -0
  230. sage_wheels/share/factory/gftables/4913 +166 -0
  231. sage_wheels/share/factory/gftables/49729 +1660 -0
  232. sage_wheels/share/factory/gftables/5041 +170 -0
  233. sage_wheels/share/factory/gftables/50653 +1691 -0
  234. sage_wheels/share/factory/gftables/512 +20 -0
  235. sage_wheels/share/factory/gftables/51529 +1720 -0
  236. sage_wheels/share/factory/gftables/52441 +1750 -0
  237. sage_wheels/share/factory/gftables/529 +20 -0
  238. sage_wheels/share/factory/gftables/5329 +180 -0
  239. sage_wheels/share/factory/gftables/54289 +1812 -0
  240. sage_wheels/share/factory/gftables/57121 +1906 -0
  241. sage_wheels/share/factory/gftables/58081 +1938 -0
  242. sage_wheels/share/factory/gftables/59049 +1971 -0
  243. sage_wheels/share/factory/gftables/6241 +210 -0
  244. sage_wheels/share/factory/gftables/625 +23 -0
  245. sage_wheels/share/factory/gftables/63001 +2102 -0
  246. sage_wheels/share/factory/gftables/64 +5 -0
  247. sage_wheels/share/factory/gftables/6561 +221 -0
  248. sage_wheels/share/factory/gftables/6859 +231 -0
  249. sage_wheels/share/factory/gftables/6889 +232 -0
  250. sage_wheels/share/factory/gftables/729 +27 -0
  251. sage_wheels/share/factory/gftables/7921 +266 -0
  252. sage_wheels/share/factory/gftables/8 +3 -0
  253. sage_wheels/share/factory/gftables/81 +5 -0
  254. sage_wheels/share/factory/gftables/8192 +276 -0
  255. sage_wheels/share/factory/gftables/841 +30 -0
  256. sage_wheels/share/factory/gftables/9 +3 -0
  257. sage_wheels/share/factory/gftables/9409 +316 -0
  258. sage_wheels/share/factory/gftables/961 +34 -0
  259. sage_wheels/share/info/singular.info +191898 -0
  260. sage_wheels/share/singular/LIB/GND.lib +1359 -0
  261. sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
  262. sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
  263. sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
  264. sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
  265. sage_wheels/share/singular/LIB/VecField.lib +1542 -0
  266. sage_wheels/share/singular/LIB/absfact.lib +959 -0
  267. sage_wheels/share/singular/LIB/ainvar.lib +730 -0
  268. sage_wheels/share/singular/LIB/aksaka.lib +419 -0
  269. sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
  270. sage_wheels/share/singular/LIB/algebra.lib +1193 -0
  271. sage_wheels/share/singular/LIB/all.lib +136 -0
  272. sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
  273. sage_wheels/share/singular/LIB/arnold.lib +4553 -0
  274. sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
  275. sage_wheels/share/singular/LIB/arr.lib +3486 -0
  276. sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
  277. sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
  278. sage_wheels/share/singular/LIB/bfun.lib +1964 -0
  279. sage_wheels/share/singular/LIB/bimodules.lib +774 -0
  280. sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
  281. sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
  282. sage_wheels/share/singular/LIB/central.lib +2169 -0
  283. sage_wheels/share/singular/LIB/chern.lib +4162 -0
  284. sage_wheels/share/singular/LIB/cimonom.lib +571 -0
  285. sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
  286. sage_wheels/share/singular/LIB/classify.lib +3239 -0
  287. sage_wheels/share/singular/LIB/classify2.lib +1462 -0
  288. sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
  289. sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
  290. sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
  291. sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
  292. sage_wheels/share/singular/LIB/combinat.lib +91 -0
  293. sage_wheels/share/singular/LIB/compregb.lib +276 -0
  294. sage_wheels/share/singular/LIB/control.lib +1636 -0
  295. sage_wheels/share/singular/LIB/crypto.lib +3795 -0
  296. sage_wheels/share/singular/LIB/curveInv.lib +667 -0
  297. sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
  298. sage_wheels/share/singular/LIB/customstd.lib +100 -0
  299. sage_wheels/share/singular/LIB/deRham.lib +5979 -0
  300. sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
  301. sage_wheels/share/singular/LIB/decomp.lib +1655 -0
  302. sage_wheels/share/singular/LIB/deflation.lib +872 -0
  303. sage_wheels/share/singular/LIB/deform.lib +925 -0
  304. sage_wheels/share/singular/LIB/difform.lib +3055 -0
  305. sage_wheels/share/singular/LIB/divisors.lib +750 -0
  306. sage_wheels/share/singular/LIB/dmod.lib +5817 -0
  307. sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
  308. sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
  309. sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
  310. sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
  311. sage_wheels/share/singular/LIB/dummy.lib +17 -0
  312. sage_wheels/share/singular/LIB/elim.lib +1009 -0
  313. sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
  314. sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
  315. sage_wheels/share/singular/LIB/equising.lib +2127 -0
  316. sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
  317. sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
  318. sage_wheels/share/singular/LIB/findifs.lib +778 -0
  319. sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
  320. sage_wheels/share/singular/LIB/finvar.lib +7989 -0
  321. sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
  322. sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
  323. sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
  324. sage_wheels/share/singular/LIB/freegb.lib +3853 -0
  325. sage_wheels/share/singular/LIB/general.lib +1350 -0
  326. sage_wheels/share/singular/LIB/gfan.lib +1768 -0
  327. sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
  328. sage_wheels/share/singular/LIB/gkdim.lib +99 -0
  329. sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
  330. sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
  331. sage_wheels/share/singular/LIB/goettsche.lib +909 -0
  332. sage_wheels/share/singular/LIB/graal.lib +1366 -0
  333. sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
  334. sage_wheels/share/singular/LIB/graphics.lib +360 -0
  335. sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
  336. sage_wheels/share/singular/LIB/groups.lib +1123 -0
  337. sage_wheels/share/singular/LIB/grwalk.lib +507 -0
  338. sage_wheels/share/singular/LIB/hdepth.lib +194 -0
  339. sage_wheels/share/singular/LIB/help.cnf +57 -0
  340. sage_wheels/share/singular/LIB/hess.lib +1946 -0
  341. sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
  342. sage_wheels/share/singular/LIB/hodge.lib +400 -0
  343. sage_wheels/share/singular/LIB/homolog.lib +1965 -0
  344. sage_wheels/share/singular/LIB/hyperel.lib +975 -0
  345. sage_wheels/share/singular/LIB/inout.lib +679 -0
  346. sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
  347. sage_wheels/share/singular/LIB/interval.lib +1418 -0
  348. sage_wheels/share/singular/LIB/intprog.lib +778 -0
  349. sage_wheels/share/singular/LIB/invar.lib +443 -0
  350. sage_wheels/share/singular/LIB/involut.lib +980 -0
  351. sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
  352. sage_wheels/share/singular/LIB/kskernel.lib +534 -0
  353. sage_wheels/share/singular/LIB/latex.lib +3146 -0
  354. sage_wheels/share/singular/LIB/lejeune.lib +651 -0
  355. sage_wheels/share/singular/LIB/linalg.lib +2040 -0
  356. sage_wheels/share/singular/LIB/locnormal.lib +212 -0
  357. sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
  358. sage_wheels/share/singular/LIB/makedbm.lib +294 -0
  359. sage_wheels/share/singular/LIB/mathml.lib +813 -0
  360. sage_wheels/share/singular/LIB/matrix.lib +1372 -0
  361. sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
  362. sage_wheels/share/singular/LIB/methods.lib +212 -0
  363. sage_wheels/share/singular/LIB/moddiq.lib +322 -0
  364. sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
  365. sage_wheels/share/singular/LIB/modnormal.lib +218 -0
  366. sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
  367. sage_wheels/share/singular/LIB/modquotient.lib +269 -0
  368. sage_wheels/share/singular/LIB/modstd.lib +1024 -0
  369. sage_wheels/share/singular/LIB/modular.lib +545 -0
  370. sage_wheels/share/singular/LIB/modules.lib +2561 -0
  371. sage_wheels/share/singular/LIB/modwalk.lib +609 -0
  372. sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
  373. sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
  374. sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
  375. sage_wheels/share/singular/LIB/mregular.lib +1863 -0
  376. sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
  377. sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
  378. sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
  379. sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
  380. sage_wheels/share/singular/LIB/ncall.lib +31 -0
  381. sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
  382. sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
  383. sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
  384. sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
  385. sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
  386. sage_wheels/share/singular/LIB/ncloc.lib +361 -0
  387. sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
  388. sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
  389. sage_wheels/share/singular/LIB/nctools.lib +1887 -0
  390. sage_wheels/share/singular/LIB/nets.lib +1456 -0
  391. sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
  392. sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
  393. sage_wheels/share/singular/LIB/noether.lib +1106 -0
  394. sage_wheels/share/singular/LIB/normal.lib +8700 -0
  395. sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
  396. sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
  397. sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
  398. sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
  399. sage_wheels/share/singular/LIB/olga.lib +1933 -0
  400. sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
  401. sage_wheels/share/singular/LIB/parallel.lib +319 -0
  402. sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
  403. sage_wheels/share/singular/LIB/perron.lib +202 -0
  404. sage_wheels/share/singular/LIB/pfd.lib +2223 -0
  405. sage_wheels/share/singular/LIB/phindex.lib +642 -0
  406. sage_wheels/share/singular/LIB/pointid.lib +673 -0
  407. sage_wheels/share/singular/LIB/polybori.lib +1430 -0
  408. sage_wheels/share/singular/LIB/polyclass.lib +525 -0
  409. sage_wheels/share/singular/LIB/polylib.lib +1174 -0
  410. sage_wheels/share/singular/LIB/polymake.lib +1902 -0
  411. sage_wheels/share/singular/LIB/presolve.lib +1533 -0
  412. sage_wheels/share/singular/LIB/primdec.lib +9576 -0
  413. sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
  414. sage_wheels/share/singular/LIB/primitiv.lib +401 -0
  415. sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
  416. sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
  417. sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
  418. sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
  419. sage_wheels/share/singular/LIB/random.lib +455 -0
  420. sage_wheels/share/singular/LIB/ratgb.lib +489 -0
  421. sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
  422. sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
  423. sage_wheels/share/singular/LIB/realrad.lib +1197 -0
  424. sage_wheels/share/singular/LIB/recover.lib +2628 -0
  425. sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
  426. sage_wheels/share/singular/LIB/reesclos.lib +465 -0
  427. sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
  428. sage_wheels/share/singular/LIB/resgraph.lib +789 -0
  429. sage_wheels/share/singular/LIB/resjung.lib +820 -0
  430. sage_wheels/share/singular/LIB/resolve.lib +5110 -0
  431. sage_wheels/share/singular/LIB/resources.lib +170 -0
  432. sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
  433. sage_wheels/share/singular/LIB/ring.lib +1328 -0
  434. sage_wheels/share/singular/LIB/ringgb.lib +343 -0
  435. sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
  436. sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
  437. sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
  438. sage_wheels/share/singular/LIB/rootsur.lib +886 -0
  439. sage_wheels/share/singular/LIB/rstandard.lib +607 -0
  440. sage_wheels/share/singular/LIB/rwalk.lib +336 -0
  441. sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
  442. sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
  443. sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
  444. sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
  445. sage_wheels/share/singular/LIB/schreyer.lib +321 -0
  446. sage_wheels/share/singular/LIB/schubert.lib +2551 -0
  447. sage_wheels/share/singular/LIB/sets.lib +524 -0
  448. sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
  449. sage_wheels/share/singular/LIB/signcond.lib +437 -0
  450. sage_wheels/share/singular/LIB/sing.lib +1094 -0
  451. sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
  452. sage_wheels/share/singular/LIB/solve.lib +2243 -0
  453. sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
  454. sage_wheels/share/singular/LIB/spectrum.lib +62 -0
  455. sage_wheels/share/singular/LIB/sresext.lib +757 -0
  456. sage_wheels/share/singular/LIB/ssi.lib +143 -0
  457. sage_wheels/share/singular/LIB/standard.lib +2769 -0
  458. sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
  459. sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
  460. sage_wheels/share/singular/LIB/stratify.lib +1070 -0
  461. sage_wheels/share/singular/LIB/surf.lib +506 -0
  462. sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
  463. sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
  464. sage_wheels/share/singular/LIB/surfex.lib +1462 -0
  465. sage_wheels/share/singular/LIB/swalk.lib +877 -0
  466. sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
  467. sage_wheels/share/singular/LIB/systhreads.lib +74 -0
  468. sage_wheels/share/singular/LIB/tasks.lib +1324 -0
  469. sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
  470. sage_wheels/share/singular/LIB/teachstd.lib +858 -0
  471. sage_wheels/share/singular/LIB/template.lib +116 -0
  472. sage_wheels/share/singular/LIB/toric.lib +1119 -0
  473. sage_wheels/share/singular/LIB/transformation.lib +116 -0
  474. sage_wheels/share/singular/LIB/triang.lib +1197 -0
  475. sage_wheels/share/singular/LIB/tropical.lib +8741 -0
  476. sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
  477. sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
  478. sage_wheels/share/singular/LIB/tst.lib +1108 -0
  479. sage_wheels/share/singular/LIB/weierstr.lib +241 -0
  480. sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
  481. sage_wheels/share/singular/emacs/.emacs-general +184 -0
  482. sage_wheels/share/singular/emacs/.emacs-singular +234 -0
  483. sage_wheels/share/singular/emacs/COPYING +44 -0
  484. sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
  485. sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
  486. sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
  487. sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
  488. sage_wheels/share/singular/emacs/singular.el +4273 -0
  489. sage_wheels/share/singular/emacs/singular.xpm +39 -0
  490. sage_wheels/share/singular/singular.idx +5002 -0
@@ -0,0 +1,2169 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ version="version central.lib 4.1.2.0 Feb_2019 "; // $Id: 9184c80d887b25be9279e50d3aaba0ac22c21b2f $
3
+ category="Noncommutative";
4
+ info="
5
+ LIBRARY: central.lib Computation of central elements of GR-algebras
6
+
7
+ AUTHOR: Oleksandr Motsak, U@D, where U={motsak}, D={mathematik.uni-kl.de}
8
+
9
+ OVERVIEW: A library for computing elements of the center and centralizers of sets of elements in GR-algebras.
10
+
11
+ KEYWORDS: center; centralizer; reduce; centralize; PBW
12
+
13
+ PROCEDURES:
14
+ centralizeSet(F, V) v.s. basis of the centralizer of F within V
15
+ centralizerVS(F, D) v.s. basis of the centralizer of F
16
+ centralizerRed(F, D[, N]) reduced basis of the centralizer of F
17
+ centerVS(D) v.s. basis of the center
18
+ centerRed(D[, k]) reduced basis of the center
19
+ center(D[, k]) reduced basis of the center
20
+ centralizer(F, D[, k]) reduced bais of the centralizer of F
21
+ sa_reduce(V) 's.a. reduction' of pairwise commuting elements
22
+ sa_poly_reduce(p, V) 's.a. reduction' of p by pairwise commuting elements
23
+ inCenter(T) checks the centrality of list/ideal/poly T
24
+ inCentralizer(T, S) checks whether list/ideal/poly T commute with S
25
+ isCartan(p) checks whether polynomial p is a Cartan element
26
+ applyAdF(Basis, f) images of elements under the k-linear map Ad_f
27
+ linearMapKernel(Images) kernel of a linear map given by images
28
+ linearCombinations(Basis, C) k-linear combinations of elements
29
+ variablesStandard() set of algebra generators in their natural order
30
+ variablesSorted() heuristically sorted set of algebra generators
31
+ PBW_eqDeg(Deg) PBW monomials of given degree
32
+ PBW_maxDeg(MaxDeg) PBW monomials up to given degree
33
+ PBW_maxMonom(MaxMonom) PBW monomials up to given maximal monomial
34
+ ";
35
+
36
+ LIB "general.lib" // for "sort"
37
+ LIB "polylib.lib" // for "maxdeg"
38
+
39
+
40
+ /******************************************************/
41
+ // ::DefaultStuff:: Shortcuts to useful short functions. Just to avoid if( if( if( ... ))).
42
+ /******************************************************/
43
+
44
+
45
+ /******************************************************/
46
+ static proc DefaultValue ( def s, list # ) // Process general variable parameters list
47
+ "
48
+ RETURN: s or (typeof(s))(#)
49
+ "
50
+ {
51
+ def @p = s;
52
+ if ( size(#) > 0 )
53
+ {
54
+ if ( typeof(#[1]) == typeof(s) )
55
+ {
56
+ @p = #[1];
57
+ }
58
+ }
59
+ return( @p );
60
+ }
61
+
62
+ /******************************************************/
63
+ static proc DefaultInt( list # ) // Process variable parameters list with 'int' default value
64
+ "
65
+ RETURN: 0 or int(#)
66
+ "
67
+ {
68
+ int @p = 0;
69
+ return( DefaultValue( @p, # ) );
70
+ }
71
+
72
+ /******************************************************/
73
+ static proc DefaultIdeal ( list # ) // Process variable parameters list with 'ideal' default value
74
+ "
75
+ RETURN: 0 or ideal(#)
76
+ "
77
+ {
78
+ ideal @p = 0;
79
+ return( DefaultValue( @p, # ) );
80
+ }
81
+
82
+
83
+
84
+ /******************************************************/
85
+ // ::Debug:: Shortcuts to used debugging functions.
86
+ /******************************************************/
87
+
88
+
89
+ /******************************************************/
90
+ static proc toprint( int pl ) // To print or not to print?!? The answer is here!
91
+ "
92
+ RETURN: 1 means to print, otherwise 0.
93
+ "
94
+ {
95
+ return( printlevel >= ( 3 - pl) ); // voice + ?
96
+ }
97
+
98
+ /******************************************************/
99
+ static proc DBPrint( int pl, list # ) // My 'dbprint' which uses toprint(i).
100
+ "
101
+ USAGE:
102
+ "
103
+ {
104
+ if( toprint(pl) )
105
+ {
106
+ dbprint(1, #);
107
+ }
108
+ }
109
+
110
+ /******************************************************/
111
+ static proc BCall( string Name, list # ) // This function must be called at the beginning of every 'mathematical' function.
112
+ "
113
+ USAGE: Name is a name of a mathematical function to trace. # means parameters into the function.
114
+ "
115
+ {
116
+ if( toprint(0) )
117
+ {
118
+ "CALL: ", Name, "( ";
119
+ dbprint(1, #);
120
+ " )";
121
+ }
122
+ }
123
+
124
+ /******************************************************/
125
+ static proc ECall(string Name, list #) // This function must be called at the end of every 'mathematical' function.
126
+ "
127
+ USAGE: Name is a name of a mathematical function to trace. # means result of the function.
128
+ "
129
+ {
130
+ if( toprint(0) )
131
+ {
132
+ "RET : ", Name, " => Result: {";
133
+ dbprint(1, #);
134
+ " }";
135
+ }
136
+ }
137
+
138
+
139
+
140
+ /******************************************************/
141
+ // ::Helpers:: Small functions used in this library.
142
+ /******************************************************/
143
+
144
+ /******************************************************/
145
+ static proc makeNice( def l )
146
+ "
147
+ RETURN: the same as input
148
+ PURPOSE: make 'nice' polynomials, kill scalars
149
+ "
150
+ {
151
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "makeNice", l ); } /*4DEBUG*/
152
+
153
+ poly p;
154
+
155
+ if( typeof(l) == "poly" )
156
+ {
157
+ // "normal" polynomial form == no denominators, gcd of coeffs is a unit
158
+ l = cleardenom( l );
159
+ if ( maxdegInt(l) > 0 )
160
+ {
161
+ l = cleardenom( l / leadcoef(l) );
162
+ }
163
+ } else
164
+ {
165
+ if( typeof(l) == "ideal" )
166
+ {
167
+ for( int i = 1; i <= size(l); i++ )
168
+ {
169
+ p = l[i];
170
+ p = cleardenom( p );
171
+
172
+ // Now make polynomials look nice:
173
+ if ( maxdegInt(p) > 0 ) // throw away scalars!
174
+ {
175
+ // "normal" polynomial form == no denominators, gcd of coeffs is a unit
176
+ p = cleardenom( p / leadcoef(p) );
177
+ } else
178
+ {
179
+ p = 0; // no constants
180
+ }
181
+ l[i] = p;
182
+
183
+ }
184
+
185
+ l = simplify(l, 2 + 8);
186
+ }
187
+ }
188
+
189
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "makeNice", l ); } /*4DEBUG*/
190
+ return( l );
191
+ }
192
+
193
+
194
+
195
+ /******************************************************/
196
+ static proc monomialForm( def p )
197
+ "
198
+ : p is either poly or ideal
199
+ RETURN: polynomial with all monomials from p but without coefficients.
200
+ "
201
+ {
202
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "monomialForm", p ); } /*4DEBUG*/
203
+
204
+ poly result = 0; int k, j; poly m;
205
+
206
+ if( typeof(p) == "ideal" ) //
207
+ {
208
+ if( ncols(p) > 0 )
209
+ {
210
+ result = uni_poly( p[1] );
211
+
212
+ for ( k = ncols(p); k > 1; k -- )
213
+ {
214
+ for( j = size(p[k]); j > 0; j-- )
215
+ {
216
+ m = leadmonom( p[k][j] );
217
+
218
+ if( size(result + m) > size(result) ) // trick!
219
+ {
220
+ result = result + m;
221
+ }
222
+ }
223
+
224
+ }
225
+ }
226
+ }
227
+ else
228
+ {
229
+ if( typeof(p) == "poly" ) //
230
+ {
231
+ result = uni_poly(p);
232
+ } else
233
+ {
234
+ ERROR( "ERROR: Wrong input! Expected polynomial or ideal!" );
235
+ }
236
+ }
237
+
238
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "monomialForm", result ); } /*4DEBUG*/
239
+ return( result );
240
+ }
241
+
242
+ /******************************************************/
243
+ static proc uni_poly( poly p )
244
+ "
245
+ returns polynomial with the same monomials but without coefficients.
246
+ "
247
+ {
248
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "uni_poly", p ); } /*4DEBUG*/
249
+
250
+ poly result = 0;
251
+
252
+ for ( int k = size(p); k > 0; k -- )
253
+ {
254
+ result = result + leadmonom( p[k] );
255
+ }
256
+
257
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "uni_poly", result ); } /*4DEBUG*/
258
+ return( result );
259
+ }
260
+
261
+
262
+
263
+
264
+
265
+ /******************************************************/
266
+ static proc smoothQideal( ideal I, list #)
267
+ "
268
+ PURPOSE: smooths the ideal in a current QUOTIENT(!) ring.
269
+ "
270
+ {
271
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "smoothQideal", I ); } /*4DEBUG*/
272
+
273
+ ideal A = matrix(I) - matrix(NF( I, twostd(DefaultIdeal(#)), 1 )); // component wise
274
+
275
+ if( size(A) > 0 ) // Were there any changes (any non-zero component)?
276
+ {
277
+ ideal T;
278
+
279
+ int j = 1;
280
+
281
+ for( int i = 1; i <= ncols(I); i++ )
282
+ {
283
+ if( size(A[i]) == 0 ) // keep only unchanged elements
284
+ {
285
+ T[ j ] = I[i]; j++;
286
+ }
287
+ }
288
+ I = T;
289
+ }
290
+
291
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "smoothQideal", I ); } /*4DEBUG*/
292
+
293
+ return( I );
294
+ }
295
+
296
+
297
+
298
+
299
+ /******************************************************/
300
+ // ::PBW:: PBW basis construction.
301
+ /******************************************************/
302
+
303
+
304
+
305
+
306
+ /******************************************************/
307
+ proc PBW_maxDeg( int MaxDeg )
308
+ "
309
+ USAGE: PBW_maxDeg(MaxDeg); MaxDeg int
310
+ PURPOSE: Compute PBW elements up to a given maximal degree.
311
+ RETURN: ideal consisting of found elements.
312
+ NOTE: unit is omitted. Weights are ignored!
313
+ "
314
+ {
315
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "PBW_maxDeg", MaxDeg ); } /*4DEBUG*/
316
+
317
+ ideal Basis = 0;
318
+
319
+ for (int k = 1; k <= MaxDeg; k ++ )
320
+ {
321
+ Basis = Basis + maxideal(k);
322
+ }
323
+
324
+ Basis = smoothQideal( Basis );
325
+
326
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "PBW_maxDeg", Basis ); } /*4DEBUG*/
327
+ return( Basis );
328
+ }
329
+ example
330
+ {
331
+ "EXAMPLE:"; echo = 2;
332
+ ring AA = 0,(e,f,h),dp;
333
+ matrix D[3][3]=0;
334
+ D[1,2]=-h; D[1,3]=2*e; D[2,3]=-2*f;
335
+ def A = nc_algebra(1,D); // this algebra is U(sl_2)
336
+ setring A;
337
+
338
+ // PBW Basis of A_2 - monomials of degree <= 2, without unit:
339
+ PBW_maxDeg( 2 );
340
+ }
341
+
342
+
343
+ /******************************************************/
344
+ proc PBW_eqDeg( int Deg )
345
+ "
346
+ USAGE: PBW_eqDeg(Deg); Deg int
347
+ PURPOSE: Compute PBW elements of a given degree.
348
+ RETURN: ideal consisting of found elements.
349
+ NOTE: Unit is omitted. Weights are ignored!
350
+ "
351
+ {
352
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "PBW_eqDeg", Deg ); } /*4DEBUG*/
353
+
354
+ ideal Basis = smoothQideal( maxideal( Deg ) );
355
+
356
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "PBW_eqDeg", Basis ); } /*4DEBUG*/
357
+ return( Basis );
358
+ }
359
+ example
360
+ {
361
+ "EXAMPLE:"; echo = 2;
362
+ ring AA = 0,(e,f,h),dp;
363
+ matrix D[3][3]=0;
364
+ D[1,2]=-h; D[1,3]=2*e; D[2,3]=-2*f;
365
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
366
+
367
+ // PBW Basis of A_2 \ A_1 - monomials of degree == 2:
368
+ PBW_eqDeg( 2 );
369
+ }
370
+
371
+
372
+ /******************************************************/
373
+ proc PBW_maxMonom( poly MaxMonom )
374
+ "
375
+ USAGE: PBW_maxMonom(m); m poly
376
+ PURPOSE: Compute PBW elements up to a given maximal one.
377
+ RETURN: ideal consisting of found elements.
378
+ NOTE: Unit is omitted. Weights are ignored!
379
+ "
380
+ {
381
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "PBW_maxMonom", MaxMonom ); } /*4DEBUG*/
382
+
383
+ ideal K = 0;
384
+
385
+ intvec exp = leadexp( MaxMonom );
386
+
387
+ for ( int k = 1; k <= size(exp); k ++ )
388
+ {
389
+ K[ 1 + size(K) ] = var(k)^( 1 + exp[k] );
390
+ }
391
+
392
+ attrib(K, "isSB", 1);
393
+
394
+ K = kbase(K);
395
+
396
+ K = K[ (ncols(K)-1)..1]; // reverse, kill last 1
397
+
398
+ K = smoothQideal( K );
399
+
400
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "PBW_maxMonom", K ); } /*4DEBUG*/
401
+
402
+ return( K );
403
+ }
404
+ example
405
+ {
406
+ "EXAMPLE:"; echo = 2;
407
+ ring AA = 0,(e,f,h),dp;
408
+ matrix D[3][3]=0;
409
+ D[1,2]=-h; D[1,3]=2*e; D[2,3]=-2*f;
410
+ def A = nc_algebra(1,D); // this algebra is U(sl_2)
411
+ setring A;
412
+
413
+ // At most 1st degree in e, h and at most 2nd degree in f, unit is omitted:
414
+ PBW_maxMonom( e*(f^2)* h );
415
+ }
416
+
417
+
418
+
419
+
420
+ /******************************************************/
421
+ // ::CORE:: Core procedures...
422
+ /******************************************************/
423
+
424
+
425
+
426
+ /******************************************************/
427
+ proc applyAdF( ideal I, poly p )
428
+ "
429
+ USAGE: applyAdF(B, f); B ideal, f poly
430
+ PURPOSE: Apply Ad_f to every element of B
431
+ RETURN: ideal, generated by Ad_f(B[i]), 1<=i<=size(B)
432
+ NOTE: Ad_f(v) := [f, v] = f*v - v*f
433
+ SEE ALSO: linearMapKernel; linearMapKernel
434
+ "
435
+ {
436
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "applyAdF", I, p ); } /*4DEBUG*/
437
+
438
+ poly t; ideal II = 0;
439
+
440
+ for ( int k = ncols(I); k > 0; k --)
441
+ {
442
+ t = I[k];
443
+ II[k] = p * t - t * p; // we have to reduce smooth images in Qrings...
444
+ }
445
+
446
+ II = NF( II, twostd(0) ); // ... now!
447
+
448
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "applyAdF", II ); } /*4DEBUG*/
449
+ return( II );
450
+ }
451
+ example
452
+ {
453
+ "EXAMPLE:"; echo = 2;
454
+ ring AA = 0,(e,f,h),dp;
455
+ matrix D[3][3]=0;
456
+ D[1,2]=-h; D[1,3]=2*e; D[2,3]=-2*f;
457
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
458
+
459
+ // Let us consider the linear map Ad_{e} from A_2 into A.
460
+
461
+ // Compute the PBW basis of A_2:
462
+ ideal Basis = PBW_maxDeg( 2 ); Basis;
463
+
464
+ // Compute images of basis elements under the linear map Ad_e:
465
+ ideal Image = applyAdF( Basis, e ); Image;
466
+
467
+ // Now we have a linear map given by: Basis_i --> Image_i
468
+ // Let's compute its kernel K:
469
+
470
+ // 1. compute syzygy module C:
471
+ module C = linearMapKernel( Image ); C;
472
+
473
+ // 2. compute corresponding combinations of basis vectors:
474
+ ideal K = linearCombinations(Basis, C); K;
475
+
476
+ // Let's check that Ad_e(K) is zero:
477
+ applyAdF( K, e );
478
+ }
479
+
480
+
481
+
482
+ /******************************************************/
483
+ proc linearMapKernel( ideal Images )
484
+ "
485
+ USAGE: linearMapKernel( Images ); Images ideal
486
+ PURPOSE: Computes the syzygy module of the linear map given by Images.
487
+ RETURN: syzygy module, or int(0) if all images are zeroes
488
+ SEE ALSO: applyAdF; linearMapKernel
489
+ "
490
+ {
491
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "linearMapKernel", Images ); } /*4DEBUG*/
492
+
493
+ // This must be a list of monomials in a form of polynomial (sum with coeffs == 1)
494
+ poly Monomials = monomialForm( Images );
495
+
496
+ int N = size( Monomials ); // number of different monomials
497
+
498
+ if ( N == 0 ) // & ncols( Images ) > 0 => all Images == 0
499
+ {
500
+ int result = 0;
501
+
502
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "linearMapKernel", result ); } /*4DEBUG*/
503
+ return( result );
504
+ }
505
+
506
+ // Compute matrix MD
507
+ module MD; // zero
508
+
509
+ int x, y;
510
+
511
+ vector w;
512
+
513
+ poly p, m;
514
+
515
+ int V = ncols(Images); // must be equal to ncols(Basis) and size(Basis)!
516
+
517
+ // We take monomials as vector space basis of <Image>_k...
518
+
519
+ // TODO: Is there any other way to compute a basis of it and represent images as
520
+ // linear combination of them???
521
+
522
+ // Maybe some 'free resolution' stuff??? But we need linear maps only!!!
523
+
524
+ for ( x = 1; x <= V; x++ ) // For every Image vector
525
+ {
526
+ w = 0;
527
+
528
+ p = Images[x];
529
+
530
+ y = 1; // from 1st monomial in Monomials...
531
+
532
+ while( size(p) > 0 )
533
+ {
534
+ m = leadmonom(p);
535
+
536
+ // y < N!
537
+ while( Monomials[y] != m )
538
+ // There MUST be this monomial because of the construction of Monomials polynomial!
539
+ {
540
+ y++; // to size()
541
+ }
542
+
543
+ // found monomial m at position y.
544
+
545
+ w = w + leadcoef(p) * gen(y); // leadcoef(p) MUST be nonzero!
546
+ p = p - lead(p); // kill lead term
547
+ }
548
+
549
+ MD[x] = w;
550
+ }
551
+
552
+ /*******************************************/
553
+
554
+ // save options
555
+ intvec v = option( get );
556
+
557
+ // set right options
558
+ option( redSB );
559
+ option( redTail );
560
+
561
+ // compute everything in a right form
562
+ MD = simplify( groebner( syz(MD) ), 1 + 2 + 8 );
563
+ // note that MD is a matrix of numbers - no polynomials...
564
+
565
+ // restore options
566
+ option( set, v );
567
+
568
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "linearMapKernel", MD ); } /*4DEBUG*/
569
+
570
+ return( MD );
571
+ }
572
+ example
573
+ {
574
+ "EXAMPLE:"; echo = 2;
575
+ ring AA = 0,(e,f,h),dp;
576
+ matrix D[3][3]=0;
577
+ D[1,2]=-h; D[1,3]=2*e; D[2,3]=-2*f;
578
+ def A = nc_algebra(1,D); // this algebra is U(sl_2)
579
+ setring A;
580
+
581
+ // Let us consider the linear map Ad_{e} from A_2 into A.
582
+
583
+ // Compute the PBW basis of A_2:
584
+ ideal Basis = PBW_maxDeg( 2 ); Basis;
585
+
586
+ // Compute images of basis elements under the linear map Ad_e:
587
+ ideal Image = applyAdF( Basis, e ); Image;
588
+
589
+ // Now we have a linear map given by: Basis_i --> Image_i
590
+ // Let's compute its kernel K:
591
+
592
+ // 1. compute syzygy module C:
593
+ module C = linearMapKernel( Image ); C;
594
+
595
+ // 2. compute corresponding combinations of basis vectors:
596
+ ideal K = linearCombinations(Basis, C); K;
597
+
598
+ // Let's check that Ad_e(K) is zero:
599
+ ideal Z = applyAdF( K, e ); Z;
600
+
601
+ // Now linearMapKernel will return a single integer 0:
602
+ def CC = linearMapKernel(Z); typeof(CC); CC;
603
+ }
604
+
605
+
606
+ /******************************************************/
607
+ proc linearCombinations( ideal Basis, module KER )
608
+ "
609
+ USAGE: linearCombinations( Basis, C ); Basis ideal, C module
610
+ PURPOSE: forms linear combinations of elements from Basis by replacing gen(i) by Basis[i] in C
611
+ RETURN: ideal generated by computed linear combinations
612
+ SEE ALSO: linearMapKernel; applyAdF
613
+ "
614
+ {
615
+
616
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "linearCombinations", Basis, KER ); } /*4DEBUG*/
617
+
618
+
619
+ number c;
620
+
621
+ int x, y;
622
+
623
+ vector w;
624
+
625
+ poly p;
626
+
627
+ ideal result = 0;
628
+
629
+ // Kernel' basis translation
630
+ for ( x = 1; x <= ncols(KER); x++ )
631
+ {
632
+ p = 0;
633
+ w = KER[x];
634
+
635
+ for ( y = 1; y <= nrows(w); y++ )
636
+ {
637
+ c = leadcoef( w[y] );
638
+
639
+ if ( c != 0 )
640
+ {
641
+ p = p + c * Basis[y]; // linear combination of base vectors { Basis[y] }
642
+ }
643
+ }
644
+ result[ x ] = p;
645
+ }
646
+
647
+
648
+ // no reduction in quotient algebras is needed. No multiplications were done!
649
+
650
+
651
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "linearCombinations", result ); } /*4DEBUG*/
652
+
653
+ return( result );
654
+ }
655
+ example
656
+ {
657
+ "EXAMPLE:"; echo = 2;
658
+ ring AA = 0,(e,f,h),dp;
659
+ matrix D[3][3]=0;
660
+ D[1,2]=-h; D[1,3]=2*e; D[2,3]=-2*f;
661
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
662
+
663
+ // Let us consider the linear map Ad_{e} from A_2 into A.
664
+
665
+ // Compute the PBW basis of A_2:
666
+ ideal Basis = PBW_maxDeg( 2 ); Basis;
667
+
668
+ // Compute images of basis elements under the linear map Ad_e:
669
+ ideal Image = applyAdF( Basis, e ); Image;
670
+
671
+ // Now we have a linear map given by: Basis_i --> Image_i
672
+ // Let's compute its kernel K:
673
+
674
+ // 1. compute syzygy module C:
675
+ module C = linearMapKernel( Image ); C;
676
+
677
+ // 2. compute corresponding combinations of basis vectors:
678
+ ideal K = linearCombinations(Basis, C); K;
679
+
680
+ // Let's check that Ad_e(K) is zero:
681
+ applyAdF( K, e );
682
+ }
683
+
684
+
685
+
686
+ /******************************************************/
687
+ static proc LINEAR_MAP_KERNEL(ideal Basis, ideal Images ) // Ker of the linear map given by its values on basis vectors
688
+ "
689
+ PURPOSE: Computation of the kernel basis of the linear map given by the list @given
690
+ "
691
+ {
692
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "LINEAR_MAP_KERNEL", Basis, Images ); } /*4DEBUG*/
693
+
694
+ ideal result = 0;
695
+
696
+ if ( size( Basis ) == 0 )
697
+ {
698
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "LINEAR_MAP_KERNEL", result ); } /*4DEBUG*/
699
+ return( result );
700
+ }
701
+
702
+ // compute fundamental solutions system
703
+ def T = linearMapKernel( Images );
704
+
705
+
706
+ // check result of linearMapKernel
707
+ if( typeof(T) == "int" )
708
+ {
709
+ if( T == 0 )
710
+ {
711
+ // All zeroes! Return Basis:
712
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "LINEAR_MAP_KERNEL", Basis ); } /*4DEBUG*/
713
+ return( Basis );
714
+ }
715
+ }
716
+ else
717
+ {
718
+ if( typeof(T) != "module" )
719
+ {
720
+ ERROR( "Wrong output from the 'linearMapKernel' function!" );
721
+ }
722
+ }
723
+
724
+ result = linearCombinations( Basis, T );
725
+
726
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "LINEAR_MAP_KERNEL", result ); } /*4DEBUG*/
727
+ return( result );
728
+ }
729
+
730
+
731
+
732
+
733
+ /******************************************************/
734
+ static proc ZeroKer( ideal Basis, ideal Images ) // VS Basis of a Kernel of the linear map AD_h, h is a Cartan element
735
+ "
736
+ PURPOSE: Computes VS Basis of a Kernel of the linear map AD_h, when h is a Cartan element
737
+ NOTE: the result is a set of all basis vectors having a zero image
738
+ "
739
+ {
740
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "ZeroKer", Basis, Images ); } /*4DEBUG*/
741
+
742
+ ideal result = 0;
743
+
744
+ for( int i = 1; i <= ncols( Basis ); i++ )
745
+ {
746
+ if( size( Images[i] ) == 0 ) // zero image?
747
+ {
748
+ result[ 1 + size(result) ] = Basis[i]; // take this basis vector!
749
+ }
750
+ }
751
+
752
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "ZeroKer", result ); } /*4DEBUG*/
753
+ return( result );
754
+ }
755
+
756
+
757
+
758
+
759
+ /******************************************************/
760
+ // ::Variables:: Computes a set of variables
761
+ /******************************************************/
762
+
763
+
764
+
765
+ /******************************************************/
766
+ // Returns an ideal of variables in a current base ring.
767
+ proc variablesStandard()
768
+ "
769
+ USAGE: variablesStandard();
770
+ RETURN: ideal, generated by algebra variables
771
+ PURPOSE: computes the set of algebra variables taken in their natural order
772
+ SEE ALSO: variablesSorted
773
+ EXAMPLE: example variablesStandard; shows an example
774
+ "
775
+ {
776
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "variablesStandard" ); } /*4DEBUG*/
777
+
778
+ ideal result = maxideal(1);
779
+
780
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "variablesStandard", result ); } /*4DEBUG*/
781
+ return( result );
782
+ }
783
+ example
784
+ {
785
+ "EXAMPLE:"; echo = 2;
786
+ ring AA = 0,(x,y,z),dp;
787
+ matrix D[3][3]=0;
788
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
789
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
790
+ // Variables in their natural order:
791
+ variablesStandard();
792
+ }
793
+
794
+ /******************************************************/
795
+ // Sorts variables into an ideal. This is a kind of heuristics!
796
+ proc variablesSorted()
797
+ "
798
+ USAGE: variablesSorted();
799
+ RETURN: ideal, generated by sorted algebra variables
800
+ PURPOSE: computes the set of algebra variables sorted so that
801
+ @* Cartan variables go first
802
+ NOTE: This is a heuristics for the computation of the center:
803
+ @* it is better to compute centralizers of Cartan variables first since in this
804
+ @* case we can omit solving the system of equations.
805
+ SEE ALSO: variablesStandard
806
+ EXAMPLE: example variablesSorted; shows an example
807
+ "{
808
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "variablesSorted" ); } /*4DEBUG*/
809
+
810
+ ideal V = variablesStandard();
811
+ int N = size( V ); // == nvars( basering )
812
+
813
+ ideal result = 0;
814
+
815
+ int r_begin = 1;
816
+ int r_end = N;
817
+
818
+ poly v;
819
+
820
+ for( int k = 1; k <= N; k++ )
821
+ {
822
+ v = V[k];
823
+
824
+ if( isCartan(v) == 1 ) // Cartan elements go 1st
825
+ {
826
+ result[r_begin] = v;
827
+ r_begin++;
828
+ } else // Other - in the end...
829
+ {
830
+ result[r_end] = v;
831
+ r_end--;
832
+ }
833
+ }
834
+
835
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "variablesSorted", result ); } /*4DEBUG*/
836
+ return( result );
837
+ }
838
+ example
839
+ {
840
+ "EXAMPLE:"; echo = 2;
841
+ ring AA = 0,(x,y,z),dp;
842
+ matrix D[3][3]=0;
843
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
844
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
845
+ // There is only one Cartan variable - z in U(sl_2),
846
+ // it must go 1st:
847
+ variablesSorted();
848
+ }
849
+
850
+
851
+
852
+
853
+
854
+ /******************************************************/
855
+ /******************************************************/
856
+ // ::BasicCentralizerComputation:: Basic functions for centralize' computation.
857
+ /******************************************************/
858
+ /******************************************************/
859
+
860
+
861
+
862
+
863
+
864
+ /******************************************************/
865
+ // HL 'core' function
866
+ proc centralizeSet( ideal F, ideal V )
867
+ "
868
+ USAGE: centralizeSet( F, V ); F, V ideals
869
+ INPUT: F, V finite sets of elements of the base algebra
870
+ RETURN: ideal, generated by computed elements
871
+ PURPOSE: computes a vector space basis of the centralizer of the set F in the vector space generated by V over the ground field
872
+ SEE ALSO: centralizerVS; centralizer; inCentralizer
873
+ EXAMPLE: example centralizeSet; shows an example
874
+ "
875
+ {
876
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "centralizeSet", F, V ); } /*4DEBUG*/
877
+
878
+ int N = size(F);
879
+
880
+ if( N == 0)
881
+ {
882
+ ERROR( "F MUST be non empty!!!" );
883
+ }
884
+
885
+ DBPrint(1, "BasisSize: " + string(size(V)) );
886
+
887
+ ideal Images;
888
+
889
+ for( int v = 1; (v <= N) and (size(V) > 0); v++ )
890
+ {
891
+ DBPrint(1, "Centralizing " + string(F[v]) );
892
+
893
+ Images = applyAdF( V, F[v] );
894
+
895
+ if( (isCartan(F[v]) == 1) or (size(V) == 1) )
896
+ {
897
+ V = ZeroKer( V, Images );
898
+ } else
899
+ {
900
+ V = LINEAR_MAP_KERNEL( V, Images );
901
+ }
902
+
903
+ // Printing...
904
+ DBPrint(1, "Progress: [ " + string(v) + " / " + string(N) + " ]"+
905
+ " => BasisSize: " + string(size(V)) );
906
+ }
907
+
908
+ V = makeNice(V);
909
+
910
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "centralizeSet", V ); } /*4DEBUG*/
911
+
912
+ return( V );
913
+ }
914
+ example
915
+ {
916
+ "EXAMPLE:"; echo = 2;
917
+ ring A = 0,(e(1..4)),dp;
918
+ matrix D[4][4]=0;
919
+ D[2,4] = -e(1);
920
+ D[3,4] = -e(2);
921
+ // This is A_4_1 - the first real Lie algebra of dimension 4.
922
+ def A_4_1 = nc_algebra(1,D); setring A_4_1;
923
+
924
+ ideal F = variablesSorted(); F;
925
+
926
+ // the center of A_4_1 is generated by
927
+ // e(1) and -1/2*e(2)^2+e(1)*e(3)
928
+ // therefore one may consider computing it in the following way:
929
+
930
+ // 1. Compute a PBW basis consisting of
931
+ // monomials with exponent <= (1,2,1,0)
932
+ ideal V = PBW_maxMonom( e(1) * e(2)^ 2 * e(3) );
933
+
934
+ // 2. Compute the centralizer of F within the vector space
935
+ // spanned by these monomials:
936
+ ideal C = centralizeSet( F, V ); C;
937
+
938
+ inCenter(C); // check the result
939
+ }
940
+
941
+
942
+
943
+ /******************************************************/
944
+ proc centralizerVS( ideal F, int d )
945
+ "
946
+ USAGE: centralizerVS( F, D ); F ideal, D int
947
+ RETURN: ideal, generated by computed elements
948
+ PURPOSE: computes a vector space basis of centralizer(F) up to degree D
949
+ NOTE: D must be non-negative
950
+ SEE ALSO: centerVS; centralizer; inCentralizer
951
+ EXAMPLE: example centralizerVS; shows an example
952
+ "
953
+ {
954
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "centralizerVS", F, d ); } /*4DEBUG*/
955
+
956
+ if( size(F) == 0)
957
+ {
958
+ ERROR( "F MUST be non-empty!!!" );
959
+ }
960
+
961
+ ideal V = centralizeSet( F, PBW_maxDeg( d ) ); // basis of the Centralizer of S in PBW basis
962
+
963
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "centralizerVS", V ); } /*4DEBUG*/
964
+
965
+ return( V );
966
+ }
967
+ example
968
+ {
969
+ "EXAMPLE:"; echo = 2;
970
+ ring AA = 0,(x,y,z),dp;
971
+ matrix D[3][3]=0;
972
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
973
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
974
+ ideal F = x, y;
975
+ // find generators of the vector space of elements
976
+ // of degree <= 4 commuting with x and y:
977
+ ideal C = centralizerVS(F, 4);
978
+ C;
979
+ inCentralizer(C, F); // check the result
980
+ }
981
+
982
+
983
+
984
+
985
+ /******************************************************/
986
+ // ::CenterAliases:: Basic functions/aliases for center' computation.
987
+ /******************************************************/
988
+
989
+
990
+
991
+
992
+ /******************************************************/
993
+ proc centerVS( int D )
994
+ "
995
+ USAGE: centerVS( D ); D int
996
+ RETURN: ideal, generated by computed elements
997
+ PURPOSE: computes a vector space basis of the center up to degree D
998
+ NOTE: D must be non-negative
999
+ SEE ALSO: centralizerVS; center; inCenter
1000
+ EXAMPLE: example centerVS; shows an example
1001
+ "
1002
+ {
1003
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "centerVS", D ); } /*4DEBUG*/
1004
+
1005
+
1006
+ if( nameof( basering ) == "basering" )
1007
+ {
1008
+ // ERROR( "No current ring!" );
1009
+ }
1010
+
1011
+ if( D < 0 )
1012
+ {
1013
+ ERROR( "Degree D must be non-negative!" );
1014
+ }
1015
+
1016
+ ideal result = centralizerVS( variablesSorted(), D );
1017
+
1018
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "centerVS", result ); } /*4DEBUG*/
1019
+
1020
+ return( result );
1021
+ }
1022
+ example
1023
+ {
1024
+ "EXAMPLE:"; echo = 2;
1025
+ ring AA = 0,(x,y,z),dp;
1026
+ matrix D[3][3]=0;
1027
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
1028
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
1029
+ // find a basis of the vector space of all
1030
+ // central elements of degree <= 4:
1031
+ ideal Z = centerVS(4);
1032
+ Z;
1033
+ // note that the second element is the square of the first
1034
+ // plus a multiple of the first:
1035
+ Z[2] - Z[1]^2 + 8*Z[1];
1036
+ inCenter(Z); // check the result
1037
+ }
1038
+
1039
+
1040
+ /******************************************************/
1041
+ proc centralizerRed( ideal F, int D, list # )
1042
+ "
1043
+ USAGE: centralizerRed( F, D[, N] ); F ideal, D int, N optional int
1044
+ RETURN: ideal, generated by computed elements
1045
+ PURPOSE: computes subalgebra generators of centralizer(F) up to degree D.
1046
+ NOTE: In general, one cannot compute the whole centralizer(F).
1047
+ @* Hence, one has to specify a termination condition via arguments D and/or N.
1048
+ @* If D is positive, only centralizing elements up to degree D are computed.
1049
+ @* If D is negative, the termination is determined by N only.
1050
+ @* If N is given, the computation stops if at least N elements have been found.
1051
+ @* Warning: if N is given and bigger than the actual number of generators,
1052
+ @* the procedure may not terminate.
1053
+ @* Current ordering must be a degree compatible well-ordering.
1054
+ SEE ALSO: centralizerVS; centerRed; centralizer; inCentralizer
1055
+ EXAMPLE: example centralizerRed; shows an example
1056
+ "
1057
+ {
1058
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "centralizerRed", F, D, # ); } /*4DEBUG*/
1059
+
1060
+ if( nameof( basering ) == "basering" )
1061
+ {
1062
+ // ERROR( "No current ring!" );
1063
+ }
1064
+
1065
+ if( size(F) == 0)
1066
+ {
1067
+ ERROR( "F MUST be non-empty!!!" );
1068
+ }
1069
+
1070
+ /////////////////////////////////////////////////////////////////////////////
1071
+
1072
+ int i, j, l, d;
1073
+
1074
+ /////////////////////////////////////////////////////////////////////////////
1075
+
1076
+ int k = DefaultInt(#);
1077
+
1078
+ int m = (k > 0);
1079
+
1080
+ int @MinDeg = 6; // starting guess for Maximal Bounding Degree, 6
1081
+ int @Delta = 4; // increment of it, 4
1082
+
1083
+ if( m and (D <= 0) )
1084
+ {
1085
+ // minimal guess
1086
+ D = @MinDeg;
1087
+ }
1088
+
1089
+ if( !m and D < 0)
1090
+ {
1091
+ ERROR("Wrong bounding condition!");
1092
+ }
1093
+
1094
+ /////////////////////////////////////////////////////////////////////////////
1095
+
1096
+ def NCRING = basering; // Non-commutative ring
1097
+ list L = ringlist( NCRING );
1098
+ def L1, L2, L3, L4 = L[1..4]; // General components
1099
+
1100
+ def COMMRING = ring( list( L1, L2, L3, L4 ) ); // Underlying commutative ring
1101
+
1102
+
1103
+ /////////////////////////////////////////////////////////////////////////////
1104
+
1105
+ // we keep the list of found leading monomials in the commutative ring!
1106
+ setring COMMRING;
1107
+
1108
+ // Init
1109
+ list FOUND_LEADING_MONOMIALS = list();
1110
+
1111
+ for( i = 1; i <= D; i++ )
1112
+ {
1113
+ FOUND_LEADING_MONOMIALS[i] = ideal();
1114
+ }
1115
+
1116
+ ideal FLM, NEW, T; // in COMMRING
1117
+
1118
+ /////////////////////////////////////////////////////////////////////////////
1119
+
1120
+ setring NCRING;
1121
+
1122
+ ideal result, FLM, PBW, NEW, T, P; // in NCRING
1123
+
1124
+ // Main loop:
1125
+ i = 1;
1126
+
1127
+ while( i <= D )
1128
+ {
1129
+ DBPrint( 1, "Current degree is " + string(i) );
1130
+
1131
+ /////////////////////////////////////////////////////////////////////////////
1132
+
1133
+ // Compute current "reduced" PBW basis...
1134
+
1135
+ // Prepare current found leading monomials
1136
+ setring COMMRING;
1137
+ FLM = FOUND_LEADING_MONOMIALS[i];
1138
+
1139
+ // And back to NCRing
1140
+ setring NCRING;
1141
+
1142
+ FLM = imap(COMMRING, FLM); // We cannot write imap(COMMRING, FOUND_LEADING_MONOMIALS[i]) :(((
1143
+
1144
+ attrib(FLM, "isSB", 1); // just to avoid "no standard basis" warning.
1145
+
1146
+ // degrees should not change,
1147
+ // no monomials should be multiplied here
1148
+ T = reduce( PBW_eqDeg( i ), FLM, 1 );
1149
+
1150
+ // we simply kill in T monomials occurring in FOUND_LEADING_MONOMIALS[i]
1151
+ P = PBW + T; // + simplifies
1152
+
1153
+ // Compute current centralizer
1154
+ NEW = centralizeSet( F, P );
1155
+
1156
+ if( size(NEW) > 0 )
1157
+ {
1158
+ // In order to speedup multiplications we are going into a commutative ring:
1159
+ setring COMMRING;
1160
+
1161
+ // we can perform commutative interreduction
1162
+ // since no monomials should be multiplied!
1163
+ // degrees should not change
1164
+ NEW = interred( imap( NCRING, NEW ) );
1165
+
1166
+ // Go back!
1167
+ setring NCRING;
1168
+
1169
+ NEW = imap( COMMRING, NEW );
1170
+
1171
+ DBPrint( 1, "Found: ", NEW );
1172
+
1173
+ // Add them to result...
1174
+ result = result + NEW;
1175
+ }
1176
+
1177
+ // Did we find needed number of generators? Or reached the bound?
1178
+ if( (m and (size(result) >= k)) or (!m and (i == D)) )
1179
+ {
1180
+ break; // Get out of here!!!
1181
+ }
1182
+
1183
+ // otherwise we must update FOUND_LEADING_MONOMIALS
1184
+ if( size(NEW) > 0 )
1185
+ {
1186
+ setring COMMRING;
1187
+
1188
+ FLM = 0;
1189
+
1190
+ // We must update FOUND_LEADING_MONOMIALS!!!
1191
+ for( j = 1; j <= size(NEW); j++ )
1192
+ {
1193
+ FLM[j] = leadmonom( NEW[j] ); // we are interested in leading monomials only!
1194
+ }
1195
+
1196
+ FOUND_LEADING_MONOMIALS[i] = FOUND_LEADING_MONOMIALS[i] + FLM;
1197
+
1198
+ for( j = 1; j <= D; j = j + i ) // For every degree (j*i) of LNEW, do:
1199
+ {
1200
+ for( l = j; (l+i) <= D; l++ )
1201
+ {
1202
+ FOUND_LEADING_MONOMIALS[l+i] =
1203
+ FOUND_LEADING_MONOMIALS[l+i] + FOUND_LEADING_MONOMIALS[l] * FLM;
1204
+ }
1205
+ }
1206
+
1207
+ // Return to NCRING
1208
+ setring NCRING;
1209
+
1210
+ FLM = imap(COMMRING, FLM);
1211
+ attrib(FLM, "isSB", 1);// just to avoid "no standard basis" warning.
1212
+
1213
+ // we simply kill in T monomials occurring in FOUND_LEADING_MONOMIALS[i]
1214
+ T = reduce( T, FLM, 1 );
1215
+
1216
+ PBW = PBW + T;
1217
+ } else
1218
+ {
1219
+ PBW = P;
1220
+ }
1221
+
1222
+
1223
+ if( m and (i == D) ) // Was the previous estimation too small???
1224
+ {
1225
+ // We must update FOUND_LEADING_MONOMIALS in their Commutative world:
1226
+ setring COMMRING;
1227
+
1228
+ // Init new grades:
1229
+ for( j = D + 1; j <= (D + @Delta); j++ )
1230
+ {
1231
+ FOUND_LEADING_MONOMIALS[j] = ideal();
1232
+ }
1233
+
1234
+ FLM = 0;
1235
+
1236
+ // All previously computed elements in their order!
1237
+ NEW = imap( NCRING, result );
1238
+
1239
+ for( j = 1; j <= size(NEW); j++ )
1240
+ {
1241
+ FLM[j] = leadmonom( NEW[j] ); // we are interested in leading monomials only!
1242
+ }
1243
+
1244
+ while( size(FLM) > 0 )
1245
+ {
1246
+ // minimal degree:
1247
+ d = mindegInt(FLM); /// ### ///
1248
+
1249
+ // take all of minimal degree:
1250
+ T = jet( FLM, d );
1251
+
1252
+ // there are size(T) elements of smallest degree (deg(FLM[1])) in FLM!
1253
+
1254
+ // Add them in the same way:
1255
+ for( j = 1; j <= (D + @Delta); j = j + d ) // For every degree (j*d) of T, do:
1256
+ {
1257
+ for( l = j; (l + d) <= (D + @Delta); l++ )
1258
+ {
1259
+ if( (l + d) > D ) // Only new should be updated!
1260
+ {
1261
+ FOUND_LEADING_MONOMIALS[l+d] =
1262
+ FOUND_LEADING_MONOMIALS[l+d] + FOUND_LEADING_MONOMIALS[l] * T;
1263
+ }
1264
+ }
1265
+ }
1266
+
1267
+ // Kill them from FLM:
1268
+ if( size(T) < size(FLM) )
1269
+ {
1270
+ FLM = FLM[ (size(T)+1) .. size(FLM) ];
1271
+ } else
1272
+ {
1273
+ FLM = 0; // break;
1274
+ }
1275
+
1276
+ }
1277
+
1278
+ // Go back...
1279
+ setring NCRING;
1280
+
1281
+ /*
1282
+ if(toprint())
1283
+ {
1284
+ typeof(@Delta); @Delta;
1285
+ typeof(D); D;
1286
+ }
1287
+ */
1288
+ // And set new Bound
1289
+ D = D + @Delta;
1290
+ }
1291
+
1292
+ i++;
1293
+ }
1294
+
1295
+ result = makeNice(result);
1296
+
1297
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "centralizerRed", result ); } /*4DEBUG*/
1298
+
1299
+ return( result );
1300
+ }
1301
+ example
1302
+ {
1303
+ "EXAMPLE:"; echo = 2;
1304
+ ring AA = 0,(x,y,z),dp;
1305
+ matrix D[3][3]=0;
1306
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
1307
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
1308
+ ideal F = x, y;
1309
+ // find subalgebra generators of degree <= 4 of the subalgebra of
1310
+ // all elements commuting with x and y:
1311
+ ideal C = centralizerRed(F, 4);
1312
+ C;
1313
+ inCentralizer(C, F); // check the result
1314
+ }
1315
+
1316
+
1317
+ /******************************************************/
1318
+ proc centerRed( int D, list # )
1319
+ "
1320
+ USAGE: centerRed( D[, N] ); D int, N optional int
1321
+ RETURN: ideal, generated by computed elements
1322
+ PURPOSE: computes subalgebra generators of the center up to degree D
1323
+ NOTE: In general, one cannot compute the whole center.
1324
+ @* Hence, one has to specify a termination condition via arguments D and/or N.
1325
+ @* If D is positive, only central elements up to degree D will be found.
1326
+ @* If D is negative, the termination is determined by N only.
1327
+ @* If N is given, the computation stops if at least N elements have been found.
1328
+ @* Warning: if N is given and bigger than the actual number of generators,
1329
+ @* the procedure may not terminate.
1330
+ @* Current ordering must be a degree compatible well-ordering.
1331
+ SEE ALSO: centralizerRed; centerVS; center; inCenter
1332
+ EXAMPLE: example centerRed; shows an example
1333
+ "
1334
+ {
1335
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "centerRed", D, # ); } /*4DEBUG*/
1336
+
1337
+ if( nameof( basering ) == "basering" )
1338
+ {
1339
+ // ERROR( "No current ring!" );
1340
+ }
1341
+
1342
+ ideal result = centralizerRed( variablesSorted(), D, # );
1343
+
1344
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "centerRed", result ); } /*4DEBUG*/
1345
+
1346
+ return( result );
1347
+ }
1348
+ example
1349
+ {
1350
+ "EXAMPLE:"; echo = 2;
1351
+ ring AA = 0,(x,y,z),dp;
1352
+ matrix D[3][3]=0;
1353
+ D[1,2]=z;
1354
+ def A = nc_algebra(1,D); setring A; // it is a Heisenberg algebra
1355
+ // find a basis of the vector space of
1356
+ // central elements of degree <= 3:
1357
+ ideal VSZ = centerVS(3);
1358
+ // There should be 3 degrees of z.
1359
+ VSZ;
1360
+ inCenter(VSZ); // check the result
1361
+ // find "minimal" central elements of degree <= 3
1362
+ ideal SAZ = centerRed(3);
1363
+ // Only 'z' must be computed
1364
+ SAZ;
1365
+ inCenter(SAZ); // check the result
1366
+ }
1367
+
1368
+
1369
+ /******************************************************/
1370
+ /******************************************************/
1371
+ // ::SubAlgebraReduction:: A kind of subalgebra reduction...
1372
+ /******************************************************/
1373
+ /******************************************************/
1374
+
1375
+ /******************************************************/
1376
+ static proc INTERRED( ideal S )
1377
+ "
1378
+ USAGE: INTERRED( S ); S ideal
1379
+ RETURN: ideal, interreduced S
1380
+ PURPOSE: interreduction without monomial multiplication,
1381
+ just make every leading monomial occur in a single polynomial
1382
+ "
1383
+ {
1384
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "INTERRED", S ); } /*4DEBUG*/
1385
+
1386
+ ideal result = S;
1387
+
1388
+ int flag = 1;
1389
+
1390
+ int i, j, N;
1391
+
1392
+ poly p, lm;
1393
+
1394
+ while( flag == 1 )
1395
+ {
1396
+ flag = 0;
1397
+
1398
+ result = sort( simplify( result, 1 + 2 + 8) )[1];
1399
+ // sorting w.r.t. actual monomial ordering
1400
+ // generators with SMALLER(!) leading term come FIRST
1401
+
1402
+ N = size(result);
1403
+
1404
+ // kill leading monomials:
1405
+
1406
+ i = 1;
1407
+ while( i < N )
1408
+ {
1409
+ p = result[i];
1410
+ lm = leadmonom(p);
1411
+
1412
+ j = i + 1;
1413
+ while( leadmonom(result[j]) == lm )
1414
+ {
1415
+ result[j] = result[j] - p; // leadcoefs are 1 because of simplify.
1416
+ flag = 1; // we have changed something => we do still need to care about it...
1417
+ j++;
1418
+
1419
+ if( j > N )
1420
+ {
1421
+ break;
1422
+ }
1423
+ }
1424
+
1425
+ i = j;
1426
+ }
1427
+ }
1428
+
1429
+ // We are done! No common leading monomials!
1430
+ // The result is sorted
1431
+
1432
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "INTERRED", result ); } /*4DEBUG*/
1433
+
1434
+ return( result );
1435
+ }
1436
+
1437
+
1438
+ /******************************************************/
1439
+ static proc SANF( poly p, list FOUND_LEADING_MONOMIALS )
1440
+ "
1441
+ reduce p w.r.t. found multiples without ANY polynomial multiplications!
1442
+ "
1443
+ {
1444
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "SANF", p, FOUND_LEADING_MONOMIALS); } /*4DEBUG*/
1445
+
1446
+ poly q = p;
1447
+ poly head = 0;
1448
+
1449
+ int d; int N = size(FOUND_LEADING_MONOMIALS);
1450
+
1451
+ while( size(q) > 0 )
1452
+ {
1453
+ d = maxdegInt(p); /// ### ///
1454
+
1455
+ if( (0 < d) and (d <= N) )
1456
+ {
1457
+ if( size(FOUND_LEADING_MONOMIALS[d]) > 0 )
1458
+ {
1459
+ attrib( FOUND_LEADING_MONOMIALS[d], "isSB", 1);
1460
+ q = reduce( p, FOUND_LEADING_MONOMIALS[d] );
1461
+ }
1462
+
1463
+ DBPrint(1, string(p) + " --> " + string(q) );
1464
+ }
1465
+
1466
+ if( q == p )
1467
+ {
1468
+ p = lead(q);
1469
+
1470
+ if( d > 0 )
1471
+ {
1472
+ // No scalars!
1473
+ head = head + p;
1474
+ }
1475
+
1476
+ q = q - p;
1477
+ }
1478
+
1479
+ p = q;
1480
+ }
1481
+
1482
+
1483
+
1484
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "SANF", head ); } /*4DEBUG*/
1485
+
1486
+ return( head );
1487
+ }
1488
+
1489
+
1490
+ /******************************************************/
1491
+ static proc maxdegInt( ideal I )
1492
+ {
1493
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "maxdegInt", I ); } /*4DEBUG*/
1494
+
1495
+ intmat D = maxdeg(I);
1496
+
1497
+ int max = D[1, 1]; int m;
1498
+
1499
+ for( int c = 2; c <= ncols(D); c++ )
1500
+ {
1501
+ m = D[1, c];
1502
+
1503
+ if( m > max )
1504
+ {
1505
+ max = m;
1506
+ }
1507
+ }
1508
+
1509
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "maxdegInt", max ); } /*4DEBUG*/
1510
+
1511
+ return( max );
1512
+ }
1513
+
1514
+
1515
+ /******************************************************/
1516
+ static proc mindegInt( ideal I )
1517
+ {
1518
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "mindegInt", I ); } /*4DEBUG*/
1519
+
1520
+ intmat D = mindeg(I);
1521
+
1522
+ int min = D[1, 1]; int m;
1523
+
1524
+ for( int c = 2; c <= ncols(D); c++ )
1525
+ {
1526
+ m = D[1, c];
1527
+
1528
+ if( m < min )
1529
+ {
1530
+ min = m;
1531
+ }
1532
+ }
1533
+
1534
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "mindegInt", min ); } /*4DEBUG*/
1535
+
1536
+ return( min );
1537
+ }
1538
+
1539
+ /******************************************************/
1540
+ // 'subalgebra basis' computation
1541
+ proc sa_reduce( ideal V )
1542
+ "
1543
+ USAGE: sa_reduce(V); V ideal
1544
+ RETURN: ideal, generated by computed elements
1545
+ PURPOSE: compute a subalgebra basis of an algebra generated by the elements of V
1546
+ NOTE: At the moment the usage of this procedure is limited to G-algebras
1547
+ SEE ALSO: sa_poly_reduce
1548
+ EXAMPLE: example sa_reduce; shows an example
1549
+ "
1550
+ {
1551
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "sa_reduce", V ); } /*4DEBUG*/
1552
+
1553
+ ideal result = ideal();
1554
+
1555
+ ideal FLM = INTERRED( V ); // The output is sorted "[1]<[2]<[3]<..."
1556
+
1557
+ // We are bounded by maximal degree!!!
1558
+ int D = maxdegInt( FLM );
1559
+
1560
+ // Init
1561
+ list FOUND_LEADING_MONOMIALS = list();
1562
+
1563
+ int i;
1564
+
1565
+ for( i = 1; i <= D; i++ )
1566
+ {
1567
+ FOUND_LEADING_MONOMIALS[i] = ideal();
1568
+ }
1569
+
1570
+ int d, j, l;
1571
+
1572
+ poly p, q; ideal T;
1573
+
1574
+
1575
+ int c = 1; // polynomials in FLM commute pairwise
1576
+
1577
+ for( j = 1; (j < size(FLM)) and (c == 1); j++ )
1578
+ {
1579
+ p = FLM[j];
1580
+
1581
+ for( l = j+1; (l <= size(FLM)) and (c == 1); l++ )
1582
+ {
1583
+ q = FLM[l];
1584
+
1585
+ if( NF(p*q - q*p, twostd(0)) != 0 )
1586
+ {
1587
+ c = 0; // There exists non-commuting pair
1588
+ }
1589
+ }
1590
+ }
1591
+
1592
+ while( size(FLM) > 0 )
1593
+ {
1594
+ // FLM;
1595
+
1596
+ // Take the 1st element of FLM...
1597
+ p = FLM[1]; // SANF( FLM[1], FOUND_LEADING_MONOMIALS );
1598
+
1599
+ FLM[1] = 0; // ...and kill it from FLM
1600
+
1601
+ d = maxdegInt( p );
1602
+ T = ideal(p);
1603
+
1604
+ // d; size(FOUND_LEADING_MONOMIALS);
1605
+
1606
+ if( d > 0 )
1607
+ {
1608
+
1609
+ FOUND_LEADING_MONOMIALS[d] = FOUND_LEADING_MONOMIALS[d] + T;
1610
+
1611
+ for( j = 1; j <= D; j = j + d ) // For every degree (j*d) of T, do:
1612
+ {
1613
+ for( l = j; (l + d) <= D; l++ )
1614
+ {
1615
+ FOUND_LEADING_MONOMIALS[l+d] =
1616
+ FOUND_LEADING_MONOMIALS[l+d] + FOUND_LEADING_MONOMIALS[l] * T;
1617
+
1618
+ if( c != 1 )
1619
+ {
1620
+ FOUND_LEADING_MONOMIALS[l+d] =
1621
+ FOUND_LEADING_MONOMIALS[l+d] + T * FOUND_LEADING_MONOMIALS[l];
1622
+ }
1623
+ }
1624
+ }
1625
+ }
1626
+
1627
+ if( size(FLM) > 0 )
1628
+ {
1629
+ for( i = 2; i <= ncols(FLM); i++ )
1630
+ {
1631
+ FLM[i] = SANF( FLM[i], FOUND_LEADING_MONOMIALS );
1632
+ }
1633
+ FLM = INTERRED( FLM );
1634
+ }
1635
+
1636
+ if( size(T) > 0 )
1637
+ {
1638
+ DBPrint(1, "Found: " + string(T) );
1639
+ result = result + T;
1640
+ }
1641
+
1642
+ }
1643
+
1644
+ result = makeNice(result);
1645
+
1646
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "sa_reduce", result ); } /*4DEBUG*/
1647
+
1648
+ return( result );
1649
+ }
1650
+ example
1651
+ { "EXAMPLE:"; echo = 2;
1652
+ ring AA = 0,(x,y,z),dp;
1653
+ matrix D[3][3]=0;
1654
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
1655
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
1656
+ poly f = 4*x*y+z^2-2*z; // a central polynomial
1657
+ ideal I = f, f*f, f*f*f - 10*f*f, f+3*z^3; I;
1658
+ sa_reduce(I); // should be just f and z^3
1659
+ }
1660
+
1661
+
1662
+
1663
+ /******************************************************/
1664
+ // subalgebra reduction of a polynomial
1665
+ proc sa_poly_reduce( poly p, ideal V )
1666
+ "
1667
+ USAGE: sa_poly_reduce(p, V); p poly, V ideal
1668
+ RETURN: polynomial, a reduction of p w.r.t. V
1669
+ PURPOSE: computes a reduction of the polynomial p w.r.t. the subalgebra generated by elements of V
1670
+ NOTE: At the moment the usage of this procedure is limited to G-algebras
1671
+ SEE ALSO: sa_reduce
1672
+ EXAMPLE: example sa_poly_reduce; shows an example
1673
+ "
1674
+ {
1675
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "sa_poly_reduce", p, V ); } /*4DEBUG*/
1676
+ // As previous...
1677
+
1678
+ ideal FLM = INTERRED( V ); // The output is sorted "[1]<[2]<[3]<..."
1679
+
1680
+ // We are bounded by maximal degree!!!
1681
+ int D = maxdegInt( FLM + ideal(p) );
1682
+
1683
+ // Init
1684
+ list FOUND_LEADING_MONOMIALS = list();
1685
+
1686
+ int i;
1687
+
1688
+ for( i = 1; i <= D; i++ )
1689
+ {
1690
+ FOUND_LEADING_MONOMIALS[i] = ideal();
1691
+ }
1692
+
1693
+ int d, j, l;
1694
+
1695
+ poly f, q; ideal T;
1696
+
1697
+
1698
+ int c = 1; // polynomials in FLM commute pairwise
1699
+
1700
+ for( j = 1; (j < size(FLM)) and (c == 1); j++ )
1701
+ {
1702
+ f = FLM[j];
1703
+
1704
+ for( l = j+1; (l <= size(FLM)) and (c == 1); l++ )
1705
+ {
1706
+ q = FLM[l];
1707
+
1708
+ if( NF(f*q - q*f, twostd(0)) != 0 )
1709
+ {
1710
+ c = 0;
1711
+ }
1712
+ }
1713
+ }
1714
+
1715
+
1716
+ while( size(FLM) > 0 )
1717
+ {
1718
+ // Take the 1st element of FLM...
1719
+ q = SANF( FLM[1], FOUND_LEADING_MONOMIALS );
1720
+
1721
+ FLM[1] = 0; // ...and kill it from FLM
1722
+
1723
+ d = maxdegInt(q);
1724
+ T = ideal(q);
1725
+
1726
+ FOUND_LEADING_MONOMIALS[d] = FOUND_LEADING_MONOMIALS[d] + T;
1727
+
1728
+ for( j = 1; j <= D; j = j + d ) // For every degree (j*d) of T, do:
1729
+ {
1730
+ for( l = j; (l + d) <= D; l++ )
1731
+ {
1732
+ FOUND_LEADING_MONOMIALS[l+d] =
1733
+ FOUND_LEADING_MONOMIALS[l+d] + FOUND_LEADING_MONOMIALS[l] * T;
1734
+
1735
+ if( c != 1 )
1736
+ {
1737
+ FOUND_LEADING_MONOMIALS[l+d] =
1738
+ FOUND_LEADING_MONOMIALS[l+d] + T * FOUND_LEADING_MONOMIALS[l];
1739
+ }
1740
+ }
1741
+ }
1742
+
1743
+ if( size(FLM) > 0 )
1744
+ {
1745
+ for( i = 2; i <= ncols(FLM); i++ )
1746
+ {
1747
+ FLM[i] = SANF( FLM[i], FOUND_LEADING_MONOMIALS );
1748
+ }
1749
+ FLM = INTERRED( FLM );
1750
+ }
1751
+ }
1752
+
1753
+ poly result = SANF(p, FOUND_LEADING_MONOMIALS);
1754
+
1755
+ result = makeNice( result );
1756
+
1757
+
1758
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "sa_poly_reduce", result ); } /*4DEBUG*/
1759
+
1760
+ return( result );
1761
+ }
1762
+ example
1763
+ { "EXAMPLE:"; echo = 2;
1764
+ ring AA = 0,(x,y,z),dp;
1765
+ matrix D[3][3]=0;
1766
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
1767
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
1768
+ poly f = 4*x*y+z^2-2*z; // a central polynomial
1769
+ sa_poly_reduce(f + 3*f*f + x, ideal(f) ); // should be just 'x'
1770
+ }
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+ /******************************************************/
1779
+ // ::inStuff:: inCentralizer, inCenter, isCartan helpers
1780
+ /******************************************************/
1781
+
1782
+
1783
+ /******************************************************/
1784
+ static proc inCentralizer_poly( poly p, ideal S )
1785
+ "
1786
+ if p in centralizer(S) => return 1, otherwise return 0
1787
+ "
1788
+ {
1789
+ poly f;
1790
+
1791
+ for( int k = 1; k <= size(S); k++ )
1792
+ {
1793
+ f = S[k];
1794
+
1795
+ if( NF( f * p - p * f, twostd(0) ) != 0 )
1796
+ {
1797
+ DBPrint( 1, "POLY: " + string (p) +
1798
+ " is NOT in the centralizer of polynomial {" + string(f) + "}" );
1799
+ return (0);
1800
+ }
1801
+ }
1802
+
1803
+ return( 1 );
1804
+ }
1805
+
1806
+ /******************************************************/
1807
+ static proc inCentralizer_list( def l, ideal S )
1808
+ {
1809
+ for( int @i = 1; @i <= size(l); @i++ )
1810
+ {
1811
+ if( (typeof(l[@i])=="poly") or (typeof(l[@i]) == "int") or (typeof(l[@i]) == "number") )
1812
+ {
1813
+ if(! inCentralizer_poly(l[@i], S) )
1814
+ {
1815
+ return(0);
1816
+ }
1817
+
1818
+ } else
1819
+ {
1820
+ if( (typeof(l[@i])=="list") or (typeof(l[@i])=="ideal") )
1821
+ {
1822
+ if(! inCentralizer_list(l[@i], S) )
1823
+ {
1824
+ return(0);
1825
+ }
1826
+ }
1827
+ }
1828
+ }
1829
+ return(1);
1830
+ }
1831
+
1832
+
1833
+ /******************************************************************************/
1834
+ // Checks the commutativity of polynomials of a with the polynomials in S
1835
+ proc inCentralizer( def a, ideal S )
1836
+ "
1837
+ USAGE: inCentralizer(E, S); E poly/list/ideal, S poly/ideal
1838
+ RETURN: integer, 1 if E is in the centralizer(S), 0 otherwise
1839
+ PURPOSE: check whether the elements of E are in the centralizer(S)
1840
+ EXAMPLE: example inCentralizer; shows examples
1841
+ "
1842
+ {
1843
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "inCentralizer", a, S ); } /*4DEBUG*/
1844
+
1845
+ if( nameof( basering ) == "basering" )
1846
+ {
1847
+ // ERROR( "No current ring!" );
1848
+ }
1849
+
1850
+
1851
+ int res;
1852
+
1853
+ if( (typeof(a) == "poly") or (typeof(a) == "int") or (typeof(a) == "number") )
1854
+ {
1855
+ res = inCentralizer_poly(a, S);
1856
+ } else
1857
+ {
1858
+ if( (typeof(a)=="list") or (typeof(a)=="ideal") )
1859
+ {
1860
+ res = inCentralizer_list(a, S);
1861
+ } else
1862
+ {
1863
+ res = -1;
1864
+ }
1865
+ }
1866
+
1867
+ if( res == -1 )
1868
+ {
1869
+ ERROR( "Wrong argument!" );
1870
+ }
1871
+
1872
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "inCentralizer", res ); } /*4DEBUG*/
1873
+
1874
+ return (res);
1875
+ }
1876
+ example
1877
+ {
1878
+ "EXAMPLE:";echo=2;
1879
+ ring R = 0,(x,y,z),dp;
1880
+ matrix D[3][3]=0;
1881
+ D[1,2]=-z;
1882
+ def r = nc_algebra(1,D); setring r; // the Heisenberg algebra
1883
+ poly f = x^2;
1884
+ poly a = z; // 'z' is central => it lies in every centralizer!
1885
+ poly b = y^2;
1886
+ inCentralizer(a, f);
1887
+ inCentralizer(b, f);
1888
+ list l = list(1, a);
1889
+ inCentralizer(l, f);
1890
+ ideal I = a, b;
1891
+ inCentralizer(I, f);
1892
+ printlevel = 2;
1893
+ inCentralizer(a, f); // yes
1894
+ inCentralizer(b, f); // no
1895
+ }
1896
+
1897
+ /******************************************************/
1898
+ // Checks the centrality of a
1899
+ proc inCenter( def a )
1900
+ "
1901
+ USAGE: inCenter(E); E poly/list/ideal
1902
+ RETURN: integer, 1 if E is in the center, 0 otherwise
1903
+ PURPOSE: check whether the elements of E are central
1904
+ EXAMPLE: example inCenter; shows examples
1905
+ "
1906
+ {
1907
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "inCenter", a ); } /*4DEBUG*/
1908
+
1909
+ if( nameof( basering ) == "basering" )
1910
+ {
1911
+ // ERROR( "No current ring!" );
1912
+ }
1913
+
1914
+ int result = inCentralizer( a, variablesStandard() );
1915
+
1916
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "inCenter", result ); } /*4DEBUG*/
1917
+
1918
+ return( result );
1919
+ }
1920
+ example
1921
+ {
1922
+ "EXAMPLE:";echo=2;
1923
+ ring R=0,(x,y,z),dp;
1924
+ matrix D[3][3]=0;
1925
+ D[1,2]=-z;
1926
+ D[1,3]=2*x;
1927
+ D[2,3]=-2*y;
1928
+ def r = nc_algebra(1,D); setring r; // this is U(sl_2)
1929
+ poly p=4*x*y+z^2-2*z;
1930
+ inCenter(p);
1931
+ poly f=4*x*y;
1932
+ inCenter(f);
1933
+ list l= list( 1, p, p^2, p^3);
1934
+ inCenter(l);
1935
+ ideal I= p, f;
1936
+ inCenter(I);
1937
+ }
1938
+
1939
+
1940
+ /******************************************************/
1941
+ // Checks whether f is a Cartan element.
1942
+ proc isCartan( poly f )
1943
+ "
1944
+ USAGE: isCartan(f); f poly
1945
+ PURPOSE: check whether f is a Cartan element.
1946
+ RETURN: integer, 1 if f is a Cartan element and 0 otherwise.
1947
+ NOTE: f is a Cartan element of the algebra A
1948
+ @* if and only if for all g in A there exists C in K such that [f, g] = C * g
1949
+ @* if and only if for all variables v_i there exist C in K such that [f, v_i] = C * v_i.
1950
+ "
1951
+ {
1952
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ BCall( "isCartan", f ); } /*4DEBUG*/
1953
+
1954
+ if( nameof( basering ) == "basering" )
1955
+ {
1956
+ // ERROR( "No current ring!" );
1957
+ }
1958
+
1959
+
1960
+ ideal V = variablesStandard();
1961
+
1962
+ int r = 1; poly v, g;
1963
+
1964
+ for( int i = size(V); i > 0; i-- )
1965
+ {
1966
+ v = leadmonom(V[i]); // V[i] must be just a variable, but...
1967
+
1968
+ g = NF( f*v - v*f, twostd(0) ); // [f, V[i]]
1969
+
1970
+ if( size(g) > 0 )
1971
+ {
1972
+ if( size(g) > 1 ) // it is not just \alpha * v_i.
1973
+ {
1974
+ r = 0;
1975
+ break;
1976
+ }
1977
+
1978
+ if( leadmonom(g) != v ) // g = \alpha * v_j, j != i.
1979
+ {
1980
+ r = 0;
1981
+ break;
1982
+ }
1983
+
1984
+ } // else \alpha = 0
1985
+ }
1986
+
1987
+ /*4DEBUG*/ if( defined( @@@DEBUG ) ){ ECall( "isCartan", r ); } /*4DEBUG*/
1988
+ return( r );
1989
+ }
1990
+ example
1991
+ {
1992
+ "EXAMPLE:";echo=2;
1993
+ ring R=0,(x,y,z),dp;
1994
+ matrix D[3][3]=0;
1995
+ D[1,2]=-z;
1996
+ D[1,3]=2*x;
1997
+ D[2,3]=-2*y;
1998
+ def r = nc_algebra(1,D); setring r; // this is U(sl_2) with cartan - z
1999
+ isCartan(z); // yes!
2000
+ poly p=4*x*y+z^2-2*z;
2001
+ isCartan(p); // central elements are Cartan elements!
2002
+ poly f=4*x*y;
2003
+ isCartan(f); // no way!
2004
+ isCartan( 10 + p + z ); // scalar + central + cartan
2005
+ }
2006
+
2007
+
2008
+
2009
+
2010
+ /******************************************************/
2011
+ /******************************************************/
2012
+ // ::MainAliases:: The main non-static functions, visible to user are here. They are wrappers around basic functions.
2013
+ /******************************************************/
2014
+ /******************************************************/
2015
+
2016
+
2017
+
2018
+
2019
+ /******************************************************/
2020
+ // Computes the generators of the center of a basering
2021
+ proc center( int D, list # )
2022
+ "
2023
+ USAGE: center(D[, N]); D int, N optional int
2024
+ RETURN: ideal, generated by computed elements
2025
+ PURPOSE: computes subalgebra generators of the center up to degree D
2026
+ NOTE: In general, one cannot compute the whole center.
2027
+ @* Hence, one has to specify a termination condition via arguments D and/or N.
2028
+ @* If D is positive, only central elements up to degree D will be found.
2029
+ @* If D is negative, the termination is determined by N only.
2030
+ @* If N is given, the computation stops if at least N elements have been found.
2031
+ @* Warning: if N is given and bigger than the actual number of generators,
2032
+ @* the procedure may not terminate.
2033
+ @* Current ordering must be a degree compatible well-ordering.
2034
+ SEE ALSO: centralizer; inCenter
2035
+ EXAMPLE: example center; shows an example
2036
+ "
2037
+ {
2038
+ if( nameof( basering ) == "basering" )
2039
+ {
2040
+ // ERROR( "No current ring!" );
2041
+ }
2042
+
2043
+ if( DefaultInt( # ) > 0 )
2044
+ {
2045
+ return( centerRed( D, # ) );
2046
+ }
2047
+
2048
+ if( D >= 0 )
2049
+ {
2050
+ return( sa_reduce( centerVS(D) ) ); // Experimental! May be wrong!!!
2051
+ }
2052
+
2053
+ ERROR( "Wrong arguments!" );
2054
+ }
2055
+ example
2056
+ {
2057
+ "EXAMPLE:"; echo = 2;
2058
+ ring AA = 0,(x,y,z,t),dp;
2059
+ matrix D[4][4]=0;
2060
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
2061
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2) tensored with K[t]
2062
+ // find generators of the center of degree <= 3:
2063
+ ideal Z = center(3);
2064
+ Z;
2065
+ inCenter(Z); // check the result
2066
+ // find at least one generator of the center:
2067
+ ideal Z2 = center(-1, 1);
2068
+ Z2;
2069
+ inCenter(Z2); // check the result
2070
+ }
2071
+
2072
+ /******************************************************/
2073
+ // Computes the generators of the centralizer of S in a basering
2074
+ proc centralizer( ideal S, int D, list # )
2075
+ "
2076
+ USAGE: centralizer(F, D[, N]); F poly/ideal, D int, N optional int
2077
+ RETURN: ideal, generated by computed elements
2078
+ PURPOSE: computes subalgebra generators of centralizer(F) up to degree D
2079
+ NOTE: In general, one cannot compute the whole centralizer(F).
2080
+ @* Hence, one has to specify a termination condition via arguments D and/or N.
2081
+ @* If D is positive, only centralizing elements up to degree D will be found.
2082
+ @* If D is negative, the termination is determined by N only.
2083
+ @* If N is given, the computation stops if at least N elements have been found.
2084
+ @* Warning: if N is given and bigger than the actual number of generators,
2085
+ @* the procedure may not terminate.
2086
+ @* Current ordering must be a degree compatible well-ordering.
2087
+ SEE ALSO: center; inCentralizer
2088
+ EXAMPLE: example centralizer; shows an example
2089
+ "
2090
+ {
2091
+ if( nameof( basering ) == "basering" )
2092
+ {
2093
+ // ERROR( "No current ring!" );
2094
+ }
2095
+
2096
+ if( DefaultInt( # ) > 0 )
2097
+ {
2098
+ return( centralizerRed( S, D, # ) );
2099
+ }
2100
+
2101
+ if( D >= 0 )
2102
+ {
2103
+ return( sa_reduce( centralizerVS(S, D) ) ); // Experimental! May be wrong!!!
2104
+ }
2105
+
2106
+ ERROR( "Wrong arguments!" );
2107
+ }
2108
+ example
2109
+ {
2110
+ "EXAMPLE:"; echo = 2;
2111
+ ring AA = 0,(x,y,z),dp;
2112
+ matrix D[3][3]=0;
2113
+ D[1,2]=-z; D[1,3]=2*x; D[2,3]=-2*y;
2114
+ def A = nc_algebra(1,D); setring A; // this algebra is U(sl_2)
2115
+ poly f = 4*x*y+z^2-2*z; // a central polynomial
2116
+ f;
2117
+ // find generators of the centralizer of f of degree <= 2:
2118
+ ideal c = centralizer(f, 2);
2119
+ c; // since f is central, the answer consists of generators of A
2120
+ inCentralizer(c, f); // check the result
2121
+ // find at least two generators of the centralizer of f:
2122
+ ideal cc = centralizer(f,-1,2);
2123
+ cc;
2124
+ inCentralizer(cc, f); // check the result
2125
+ poly g = z^2-2*z; // some non-central polynomial
2126
+ // find generators of the centralizer of g of degree <= 2:
2127
+ c = centralizer(g, 2);
2128
+ c;
2129
+ inCentralizer(c, g); // check the result
2130
+ // find at least one generator of the centralizer of g:
2131
+ centralizer(g,-1,1);
2132
+ // find at least two generators of the centralizer of g:
2133
+ cc = centralizer(g,-1,2);
2134
+ cc;
2135
+ inCentralizer(cc, g); // check the result
2136
+ }
2137
+
2138
+
2139
+ /*******************************************************
2140
+ // normally one should use this library together with ncalg.lib in the following way:
2141
+
2142
+ LIB "ncalg.lib";
2143
+ def Usl3 = makeUsl(3); // U(sl_3)
2144
+ setring Usl3;
2145
+
2146
+ // show current ring:
2147
+ basering;
2148
+
2149
+ LIB "central.lib";
2150
+
2151
+ // easy example(few seconds), must compute two polynomials of degrees 2 and 3.
2152
+ center(3);
2153
+
2154
+ kill Usl3;
2155
+
2156
+ def Ug2 = makeUg2(); // U(g_2)
2157
+ setring Ug2;
2158
+
2159
+ // show current ring:
2160
+ basering;
2161
+
2162
+ // easy example(few seconds), must compute one polynomial of degree 2.
2163
+ center(2);
2164
+
2165
+ // hard example (~hours), must compute two polynomials of degrees 2 and 6.
2166
+ center(6);
2167
+
2168
+ quit;
2169
+ *******************************************************/