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

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

Potentially problematic release.


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

Files changed (491) hide show
  1. PySingular.cpython-314-x86_64-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 +491 -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-20aec911.4.1.so +0 -0
  7. passagemath_singular.libs/libcddgmp-21acf0c6.so.0.1.3 +0 -0
  8. passagemath_singular.libs/libfactory-4-fcee31da.4.1.so +0 -0
  9. passagemath_singular.libs/libflint-66e12231.so.21.0.0 +0 -0
  10. passagemath_singular.libs/libgf2x-a4cdec90.so.3.0.0 +0 -0
  11. passagemath_singular.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
  12. passagemath_singular.libs/libgmp-6e109695.so.10.5.0 +0 -0
  13. passagemath_singular.libs/libgsl-cda90e79.so.28.0.0 +0 -0
  14. passagemath_singular.libs/libmpfr-82690d50.so.6.2.1 +0 -0
  15. passagemath_singular.libs/libntl-e6f0d543.so.44.0.1 +0 -0
  16. passagemath_singular.libs/libomalloc-0-5c9e866e.9.6.so +0 -0
  17. passagemath_singular.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
  18. passagemath_singular.libs/libpolys-4-5c0a87e0.4.1.so +0 -0
  19. passagemath_singular.libs/libquadmath-2284e583.so.0.0.0 +0 -0
  20. passagemath_singular.libs/libreadline-ea270e21.so.8.2 +0 -0
  21. passagemath_singular.libs/libsingular_resources-4-a1aafc6d.4.1.so +0 -0
  22. passagemath_singular.libs/libtinfo-ceb117d9.so.6.3 +0 -0
  23. sage/algebras/all__sagemath_singular.py +3 -0
  24. sage/algebras/fusion_rings/all.py +19 -0
  25. sage/algebras/fusion_rings/f_matrix.py +2448 -0
  26. sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-x86_64-linux-gnu.so +0 -0
  27. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
  28. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
  29. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-x86_64-linux-gnu.so +0 -0
  30. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
  31. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
  32. sage/algebras/fusion_rings/fusion_double.py +899 -0
  33. sage/algebras/fusion_rings/fusion_ring.py +1580 -0
  34. sage/algebras/fusion_rings/poly_tup_engine.cpython-314-x86_64-linux-gnu.so +0 -0
  35. sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
  36. sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
  37. sage/algebras/fusion_rings/shm_managers.cpython-314-x86_64-linux-gnu.so +0 -0
  38. sage/algebras/fusion_rings/shm_managers.pxd +24 -0
  39. sage/algebras/fusion_rings/shm_managers.pyx +780 -0
  40. sage/algebras/letterplace/all.py +1 -0
  41. sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-x86_64-linux-gnu.so +0 -0
  42. sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
  43. sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
  44. sage/algebras/letterplace/free_algebra_letterplace.cpython-314-x86_64-linux-gnu.so +0 -0
  45. sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
  46. sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
  47. sage/algebras/letterplace/letterplace_ideal.cpython-314-x86_64-linux-gnu.so +0 -0
  48. sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
  49. sage/algebras/quatalg/all.py +2 -0
  50. sage/algebras/quatalg/quaternion_algebra.py +4778 -0
  51. sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-x86_64-linux-gnu.so +0 -0
  52. sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
  53. sage/algebras/quatalg/quaternion_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
  54. sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
  55. sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
  56. sage/all__sagemath_singular.py +11 -0
  57. sage/ext_data/all__sagemath_singular.py +1 -0
  58. sage/ext_data/singular/function_field/core.lib +98 -0
  59. sage/interfaces/all__sagemath_singular.py +1 -0
  60. sage/interfaces/singular.py +2835 -0
  61. sage/libs/all__sagemath_singular.py +1 -0
  62. sage/libs/singular/__init__.py +1 -0
  63. sage/libs/singular/decl.pxd +1168 -0
  64. sage/libs/singular/function.cpython-314-x86_64-linux-gnu.so +0 -0
  65. sage/libs/singular/function.pxd +87 -0
  66. sage/libs/singular/function.pyx +1901 -0
  67. sage/libs/singular/function_factory.py +61 -0
  68. sage/libs/singular/groebner_strategy.cpython-314-x86_64-linux-gnu.so +0 -0
  69. sage/libs/singular/groebner_strategy.pxd +22 -0
  70. sage/libs/singular/groebner_strategy.pyx +582 -0
  71. sage/libs/singular/option.cpython-314-x86_64-linux-gnu.so +0 -0
  72. sage/libs/singular/option.pyx +671 -0
  73. sage/libs/singular/polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
  74. sage/libs/singular/polynomial.pxd +39 -0
  75. sage/libs/singular/polynomial.pyx +661 -0
  76. sage/libs/singular/ring.cpython-314-x86_64-linux-gnu.so +0 -0
  77. sage/libs/singular/ring.pxd +58 -0
  78. sage/libs/singular/ring.pyx +893 -0
  79. sage/libs/singular/singular.cpython-314-x86_64-linux-gnu.so +0 -0
  80. sage/libs/singular/singular.pxd +72 -0
  81. sage/libs/singular/singular.pyx +1944 -0
  82. sage/libs/singular/standard_options.py +145 -0
  83. sage/matrix/all__sagemath_singular.py +1 -0
  84. sage/matrix/matrix_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  85. sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
  86. sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
  87. sage/rings/all__sagemath_singular.py +1 -0
  88. sage/rings/function_field/all__sagemath_singular.py +1 -0
  89. sage/rings/function_field/derivations_polymod.py +911 -0
  90. sage/rings/function_field/element_polymod.cpython-314-x86_64-linux-gnu.so +0 -0
  91. sage/rings/function_field/element_polymod.pyx +406 -0
  92. sage/rings/function_field/function_field_polymod.py +2611 -0
  93. sage/rings/function_field/ideal_polymod.py +1775 -0
  94. sage/rings/function_field/order_polymod.py +1475 -0
  95. sage/rings/function_field/place_polymod.py +681 -0
  96. sage/rings/polynomial/all__sagemath_singular.py +1 -0
  97. sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-x86_64-linux-gnu.so +0 -0
  98. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
  99. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
  100. sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-x86_64-linux-gnu.so +0 -0
  101. sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
  102. sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
  103. sage/rings/polynomial/plural.cpython-314-x86_64-linux-gnu.so +0 -0
  104. sage/rings/polynomial/plural.pxd +48 -0
  105. sage/rings/polynomial/plural.pyx +3171 -0
  106. sage/symbolic/all__sagemath_singular.py +1 -0
  107. sage/symbolic/comparison_impl.pxi +428 -0
  108. sage/symbolic/constants_c_impl.pxi +178 -0
  109. sage/symbolic/expression.cpython-314-x86_64-linux-gnu.so +0 -0
  110. sage/symbolic/expression.pxd +7 -0
  111. sage/symbolic/expression.pyx +14200 -0
  112. sage/symbolic/getitem_impl.pxi +202 -0
  113. sage/symbolic/pynac.pxi +572 -0
  114. sage/symbolic/pynac_constant_impl.pxi +133 -0
  115. sage/symbolic/pynac_function_impl.pxi +206 -0
  116. sage/symbolic/pynac_impl.pxi +2576 -0
  117. sage/symbolic/pynac_wrap.h +124 -0
  118. sage/symbolic/series_impl.pxi +272 -0
  119. sage/symbolic/substitution_map_impl.pxi +94 -0
  120. sage_wheels/bin/ESingular +0 -0
  121. sage_wheels/bin/Singular +0 -0
  122. sage_wheels/bin/TSingular +0 -0
  123. sage_wheels/lib/singular/MOD/cohomo.la +41 -0
  124. sage_wheels/lib/singular/MOD/cohomo.so +0 -0
  125. sage_wheels/lib/singular/MOD/customstd.la +41 -0
  126. sage_wheels/lib/singular/MOD/customstd.so +0 -0
  127. sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
  128. sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
  129. sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
  130. sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
  131. sage_wheels/lib/singular/MOD/gitfan.la +41 -0
  132. sage_wheels/lib/singular/MOD/gitfan.so +0 -0
  133. sage_wheels/lib/singular/MOD/interval.la +41 -0
  134. sage_wheels/lib/singular/MOD/interval.so +0 -0
  135. sage_wheels/lib/singular/MOD/loctriv.la +41 -0
  136. sage_wheels/lib/singular/MOD/loctriv.so +0 -0
  137. sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
  138. sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
  139. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
  140. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
  141. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
  142. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
  143. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
  144. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
  145. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
  146. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
  147. sage_wheels/lib/singular/MOD/partialgb.la +41 -0
  148. sage_wheels/lib/singular/MOD/partialgb.so +0 -0
  149. sage_wheels/lib/singular/MOD/pyobject.la +41 -0
  150. sage_wheels/lib/singular/MOD/pyobject.so +0 -0
  151. sage_wheels/lib/singular/MOD/singmathic.la +41 -0
  152. sage_wheels/lib/singular/MOD/singmathic.so +0 -0
  153. sage_wheels/lib/singular/MOD/sispasm.la +41 -0
  154. sage_wheels/lib/singular/MOD/sispasm.so +0 -0
  155. sage_wheels/lib/singular/MOD/subsets.la +41 -0
  156. sage_wheels/lib/singular/MOD/subsets.so +0 -0
  157. sage_wheels/lib/singular/MOD/systhreads.la +41 -0
  158. sage_wheels/lib/singular/MOD/systhreads.so +0 -0
  159. sage_wheels/lib/singular/MOD/syzextra.la +41 -0
  160. sage_wheels/lib/singular/MOD/syzextra.so +0 -0
  161. sage_wheels/libexec/singular/MOD/change_cost +0 -0
  162. sage_wheels/libexec/singular/MOD/singularsurf +11 -0
  163. sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
  164. sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
  165. sage_wheels/libexec/singular/MOD/solve_IP +0 -0
  166. sage_wheels/libexec/singular/MOD/surfex +16 -0
  167. sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
  168. sage_wheels/share/factory/gftables/10201 +342 -0
  169. sage_wheels/share/factory/gftables/1024 +37 -0
  170. sage_wheels/share/factory/gftables/10609 +356 -0
  171. sage_wheels/share/factory/gftables/11449 +384 -0
  172. sage_wheels/share/factory/gftables/11881 +398 -0
  173. sage_wheels/share/factory/gftables/121 +6 -0
  174. sage_wheels/share/factory/gftables/12167 +408 -0
  175. sage_wheels/share/factory/gftables/125 +7 -0
  176. sage_wheels/share/factory/gftables/12769 +428 -0
  177. sage_wheels/share/factory/gftables/128 +7 -0
  178. sage_wheels/share/factory/gftables/1331 +47 -0
  179. sage_wheels/share/factory/gftables/1369 +48 -0
  180. sage_wheels/share/factory/gftables/14641 +490 -0
  181. sage_wheels/share/factory/gftables/15625 +523 -0
  182. sage_wheels/share/factory/gftables/16 +3 -0
  183. sage_wheels/share/factory/gftables/16129 +540 -0
  184. sage_wheels/share/factory/gftables/16384 +549 -0
  185. sage_wheels/share/factory/gftables/16807 +563 -0
  186. sage_wheels/share/factory/gftables/1681 +58 -0
  187. sage_wheels/share/factory/gftables/169 +8 -0
  188. sage_wheels/share/factory/gftables/17161 +574 -0
  189. sage_wheels/share/factory/gftables/1849 +64 -0
  190. sage_wheels/share/factory/gftables/18769 +628 -0
  191. sage_wheels/share/factory/gftables/19321 +646 -0
  192. sage_wheels/share/factory/gftables/19683 +659 -0
  193. sage_wheels/share/factory/gftables/2048 +71 -0
  194. sage_wheels/share/factory/gftables/2187 +75 -0
  195. sage_wheels/share/factory/gftables/2197 +76 -0
  196. sage_wheels/share/factory/gftables/2209 +76 -0
  197. sage_wheels/share/factory/gftables/22201 +742 -0
  198. sage_wheels/share/factory/gftables/22801 +762 -0
  199. sage_wheels/share/factory/gftables/2401 +82 -0
  200. sage_wheels/share/factory/gftables/243 +11 -0
  201. sage_wheels/share/factory/gftables/24389 +815 -0
  202. sage_wheels/share/factory/gftables/24649 +824 -0
  203. sage_wheels/share/factory/gftables/25 +3 -0
  204. sage_wheels/share/factory/gftables/256 +11 -0
  205. sage_wheels/share/factory/gftables/26569 +888 -0
  206. sage_wheels/share/factory/gftables/27 +3 -0
  207. sage_wheels/share/factory/gftables/27889 +932 -0
  208. sage_wheels/share/factory/gftables/2809 +96 -0
  209. sage_wheels/share/factory/gftables/28561 +954 -0
  210. sage_wheels/share/factory/gftables/289 +12 -0
  211. sage_wheels/share/factory/gftables/29791 +995 -0
  212. sage_wheels/share/factory/gftables/29929 +1000 -0
  213. sage_wheels/share/factory/gftables/3125 +107 -0
  214. sage_wheels/share/factory/gftables/32 +4 -0
  215. sage_wheels/share/factory/gftables/32041 +1070 -0
  216. sage_wheels/share/factory/gftables/32761 +1094 -0
  217. sage_wheels/share/factory/gftables/32768 +1095 -0
  218. sage_wheels/share/factory/gftables/343 +14 -0
  219. sage_wheels/share/factory/gftables/3481 +118 -0
  220. sage_wheels/share/factory/gftables/361 +14 -0
  221. sage_wheels/share/factory/gftables/36481 +1218 -0
  222. sage_wheels/share/factory/gftables/3721 +126 -0
  223. sage_wheels/share/factory/gftables/37249 +1244 -0
  224. sage_wheels/share/factory/gftables/38809 +1296 -0
  225. sage_wheels/share/factory/gftables/39601 +1322 -0
  226. sage_wheels/share/factory/gftables/4 +3 -0
  227. sage_wheels/share/factory/gftables/4096 +139 -0
  228. sage_wheels/share/factory/gftables/44521 +1486 -0
  229. sage_wheels/share/factory/gftables/4489 +152 -0
  230. sage_wheels/share/factory/gftables/49 +4 -0
  231. sage_wheels/share/factory/gftables/4913 +166 -0
  232. sage_wheels/share/factory/gftables/49729 +1660 -0
  233. sage_wheels/share/factory/gftables/5041 +170 -0
  234. sage_wheels/share/factory/gftables/50653 +1691 -0
  235. sage_wheels/share/factory/gftables/512 +20 -0
  236. sage_wheels/share/factory/gftables/51529 +1720 -0
  237. sage_wheels/share/factory/gftables/52441 +1750 -0
  238. sage_wheels/share/factory/gftables/529 +20 -0
  239. sage_wheels/share/factory/gftables/5329 +180 -0
  240. sage_wheels/share/factory/gftables/54289 +1812 -0
  241. sage_wheels/share/factory/gftables/57121 +1906 -0
  242. sage_wheels/share/factory/gftables/58081 +1938 -0
  243. sage_wheels/share/factory/gftables/59049 +1971 -0
  244. sage_wheels/share/factory/gftables/6241 +210 -0
  245. sage_wheels/share/factory/gftables/625 +23 -0
  246. sage_wheels/share/factory/gftables/63001 +2102 -0
  247. sage_wheels/share/factory/gftables/64 +5 -0
  248. sage_wheels/share/factory/gftables/6561 +221 -0
  249. sage_wheels/share/factory/gftables/6859 +231 -0
  250. sage_wheels/share/factory/gftables/6889 +232 -0
  251. sage_wheels/share/factory/gftables/729 +27 -0
  252. sage_wheels/share/factory/gftables/7921 +266 -0
  253. sage_wheels/share/factory/gftables/8 +3 -0
  254. sage_wheels/share/factory/gftables/81 +5 -0
  255. sage_wheels/share/factory/gftables/8192 +276 -0
  256. sage_wheels/share/factory/gftables/841 +30 -0
  257. sage_wheels/share/factory/gftables/9 +3 -0
  258. sage_wheels/share/factory/gftables/9409 +316 -0
  259. sage_wheels/share/factory/gftables/961 +34 -0
  260. sage_wheels/share/info/singular.info +191898 -0
  261. sage_wheels/share/singular/LIB/GND.lib +1359 -0
  262. sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
  263. sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
  264. sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
  265. sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
  266. sage_wheels/share/singular/LIB/VecField.lib +1542 -0
  267. sage_wheels/share/singular/LIB/absfact.lib +959 -0
  268. sage_wheels/share/singular/LIB/ainvar.lib +730 -0
  269. sage_wheels/share/singular/LIB/aksaka.lib +419 -0
  270. sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
  271. sage_wheels/share/singular/LIB/algebra.lib +1193 -0
  272. sage_wheels/share/singular/LIB/all.lib +136 -0
  273. sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
  274. sage_wheels/share/singular/LIB/arnold.lib +4553 -0
  275. sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
  276. sage_wheels/share/singular/LIB/arr.lib +3486 -0
  277. sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
  278. sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
  279. sage_wheels/share/singular/LIB/bfun.lib +1964 -0
  280. sage_wheels/share/singular/LIB/bimodules.lib +774 -0
  281. sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
  282. sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
  283. sage_wheels/share/singular/LIB/central.lib +2169 -0
  284. sage_wheels/share/singular/LIB/chern.lib +4162 -0
  285. sage_wheels/share/singular/LIB/cimonom.lib +571 -0
  286. sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
  287. sage_wheels/share/singular/LIB/classify.lib +3239 -0
  288. sage_wheels/share/singular/LIB/classify2.lib +1462 -0
  289. sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
  290. sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
  291. sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
  292. sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
  293. sage_wheels/share/singular/LIB/combinat.lib +91 -0
  294. sage_wheels/share/singular/LIB/compregb.lib +276 -0
  295. sage_wheels/share/singular/LIB/control.lib +1636 -0
  296. sage_wheels/share/singular/LIB/crypto.lib +3795 -0
  297. sage_wheels/share/singular/LIB/curveInv.lib +667 -0
  298. sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
  299. sage_wheels/share/singular/LIB/customstd.lib +100 -0
  300. sage_wheels/share/singular/LIB/deRham.lib +5979 -0
  301. sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
  302. sage_wheels/share/singular/LIB/decomp.lib +1655 -0
  303. sage_wheels/share/singular/LIB/deflation.lib +872 -0
  304. sage_wheels/share/singular/LIB/deform.lib +925 -0
  305. sage_wheels/share/singular/LIB/difform.lib +3055 -0
  306. sage_wheels/share/singular/LIB/divisors.lib +750 -0
  307. sage_wheels/share/singular/LIB/dmod.lib +5817 -0
  308. sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
  309. sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
  310. sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
  311. sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
  312. sage_wheels/share/singular/LIB/dummy.lib +17 -0
  313. sage_wheels/share/singular/LIB/elim.lib +1009 -0
  314. sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
  315. sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
  316. sage_wheels/share/singular/LIB/equising.lib +2127 -0
  317. sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
  318. sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
  319. sage_wheels/share/singular/LIB/findifs.lib +778 -0
  320. sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
  321. sage_wheels/share/singular/LIB/finvar.lib +7989 -0
  322. sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
  323. sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
  324. sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
  325. sage_wheels/share/singular/LIB/freegb.lib +3853 -0
  326. sage_wheels/share/singular/LIB/general.lib +1350 -0
  327. sage_wheels/share/singular/LIB/gfan.lib +1768 -0
  328. sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
  329. sage_wheels/share/singular/LIB/gkdim.lib +99 -0
  330. sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
  331. sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
  332. sage_wheels/share/singular/LIB/goettsche.lib +909 -0
  333. sage_wheels/share/singular/LIB/graal.lib +1366 -0
  334. sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
  335. sage_wheels/share/singular/LIB/graphics.lib +360 -0
  336. sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
  337. sage_wheels/share/singular/LIB/groups.lib +1123 -0
  338. sage_wheels/share/singular/LIB/grwalk.lib +507 -0
  339. sage_wheels/share/singular/LIB/hdepth.lib +194 -0
  340. sage_wheels/share/singular/LIB/help.cnf +57 -0
  341. sage_wheels/share/singular/LIB/hess.lib +1946 -0
  342. sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
  343. sage_wheels/share/singular/LIB/hodge.lib +400 -0
  344. sage_wheels/share/singular/LIB/homolog.lib +1965 -0
  345. sage_wheels/share/singular/LIB/hyperel.lib +975 -0
  346. sage_wheels/share/singular/LIB/inout.lib +679 -0
  347. sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
  348. sage_wheels/share/singular/LIB/interval.lib +1418 -0
  349. sage_wheels/share/singular/LIB/intprog.lib +778 -0
  350. sage_wheels/share/singular/LIB/invar.lib +443 -0
  351. sage_wheels/share/singular/LIB/involut.lib +980 -0
  352. sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
  353. sage_wheels/share/singular/LIB/kskernel.lib +534 -0
  354. sage_wheels/share/singular/LIB/latex.lib +3146 -0
  355. sage_wheels/share/singular/LIB/lejeune.lib +651 -0
  356. sage_wheels/share/singular/LIB/linalg.lib +2040 -0
  357. sage_wheels/share/singular/LIB/locnormal.lib +212 -0
  358. sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
  359. sage_wheels/share/singular/LIB/makedbm.lib +294 -0
  360. sage_wheels/share/singular/LIB/mathml.lib +813 -0
  361. sage_wheels/share/singular/LIB/matrix.lib +1372 -0
  362. sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
  363. sage_wheels/share/singular/LIB/methods.lib +212 -0
  364. sage_wheels/share/singular/LIB/moddiq.lib +322 -0
  365. sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
  366. sage_wheels/share/singular/LIB/modnormal.lib +218 -0
  367. sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
  368. sage_wheels/share/singular/LIB/modquotient.lib +269 -0
  369. sage_wheels/share/singular/LIB/modstd.lib +1024 -0
  370. sage_wheels/share/singular/LIB/modular.lib +545 -0
  371. sage_wheels/share/singular/LIB/modules.lib +2561 -0
  372. sage_wheels/share/singular/LIB/modwalk.lib +609 -0
  373. sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
  374. sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
  375. sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
  376. sage_wheels/share/singular/LIB/mregular.lib +1863 -0
  377. sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
  378. sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
  379. sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
  380. sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
  381. sage_wheels/share/singular/LIB/ncall.lib +31 -0
  382. sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
  383. sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
  384. sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
  385. sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
  386. sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
  387. sage_wheels/share/singular/LIB/ncloc.lib +361 -0
  388. sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
  389. sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
  390. sage_wheels/share/singular/LIB/nctools.lib +1887 -0
  391. sage_wheels/share/singular/LIB/nets.lib +1456 -0
  392. sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
  393. sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
  394. sage_wheels/share/singular/LIB/noether.lib +1106 -0
  395. sage_wheels/share/singular/LIB/normal.lib +8700 -0
  396. sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
  397. sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
  398. sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
  399. sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
  400. sage_wheels/share/singular/LIB/olga.lib +1933 -0
  401. sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
  402. sage_wheels/share/singular/LIB/parallel.lib +319 -0
  403. sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
  404. sage_wheels/share/singular/LIB/perron.lib +202 -0
  405. sage_wheels/share/singular/LIB/pfd.lib +2223 -0
  406. sage_wheels/share/singular/LIB/phindex.lib +642 -0
  407. sage_wheels/share/singular/LIB/pointid.lib +673 -0
  408. sage_wheels/share/singular/LIB/polybori.lib +1430 -0
  409. sage_wheels/share/singular/LIB/polyclass.lib +525 -0
  410. sage_wheels/share/singular/LIB/polylib.lib +1174 -0
  411. sage_wheels/share/singular/LIB/polymake.lib +1902 -0
  412. sage_wheels/share/singular/LIB/presolve.lib +1533 -0
  413. sage_wheels/share/singular/LIB/primdec.lib +9576 -0
  414. sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
  415. sage_wheels/share/singular/LIB/primitiv.lib +401 -0
  416. sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
  417. sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
  418. sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
  419. sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
  420. sage_wheels/share/singular/LIB/random.lib +455 -0
  421. sage_wheels/share/singular/LIB/ratgb.lib +489 -0
  422. sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
  423. sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
  424. sage_wheels/share/singular/LIB/realrad.lib +1197 -0
  425. sage_wheels/share/singular/LIB/recover.lib +2628 -0
  426. sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
  427. sage_wheels/share/singular/LIB/reesclos.lib +465 -0
  428. sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
  429. sage_wheels/share/singular/LIB/resgraph.lib +789 -0
  430. sage_wheels/share/singular/LIB/resjung.lib +820 -0
  431. sage_wheels/share/singular/LIB/resolve.lib +5110 -0
  432. sage_wheels/share/singular/LIB/resources.lib +170 -0
  433. sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
  434. sage_wheels/share/singular/LIB/ring.lib +1328 -0
  435. sage_wheels/share/singular/LIB/ringgb.lib +343 -0
  436. sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
  437. sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
  438. sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
  439. sage_wheels/share/singular/LIB/rootsur.lib +886 -0
  440. sage_wheels/share/singular/LIB/rstandard.lib +607 -0
  441. sage_wheels/share/singular/LIB/rwalk.lib +336 -0
  442. sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
  443. sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
  444. sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
  445. sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
  446. sage_wheels/share/singular/LIB/schreyer.lib +321 -0
  447. sage_wheels/share/singular/LIB/schubert.lib +2551 -0
  448. sage_wheels/share/singular/LIB/sets.lib +524 -0
  449. sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
  450. sage_wheels/share/singular/LIB/signcond.lib +437 -0
  451. sage_wheels/share/singular/LIB/sing.lib +1094 -0
  452. sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
  453. sage_wheels/share/singular/LIB/solve.lib +2243 -0
  454. sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
  455. sage_wheels/share/singular/LIB/spectrum.lib +62 -0
  456. sage_wheels/share/singular/LIB/sresext.lib +757 -0
  457. sage_wheels/share/singular/LIB/ssi.lib +143 -0
  458. sage_wheels/share/singular/LIB/standard.lib +2769 -0
  459. sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
  460. sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
  461. sage_wheels/share/singular/LIB/stratify.lib +1070 -0
  462. sage_wheels/share/singular/LIB/surf.lib +506 -0
  463. sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
  464. sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
  465. sage_wheels/share/singular/LIB/surfex.lib +1462 -0
  466. sage_wheels/share/singular/LIB/swalk.lib +877 -0
  467. sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
  468. sage_wheels/share/singular/LIB/systhreads.lib +74 -0
  469. sage_wheels/share/singular/LIB/tasks.lib +1324 -0
  470. sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
  471. sage_wheels/share/singular/LIB/teachstd.lib +858 -0
  472. sage_wheels/share/singular/LIB/template.lib +116 -0
  473. sage_wheels/share/singular/LIB/toric.lib +1119 -0
  474. sage_wheels/share/singular/LIB/transformation.lib +116 -0
  475. sage_wheels/share/singular/LIB/triang.lib +1197 -0
  476. sage_wheels/share/singular/LIB/tropical.lib +8741 -0
  477. sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
  478. sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
  479. sage_wheels/share/singular/LIB/tst.lib +1108 -0
  480. sage_wheels/share/singular/LIB/weierstr.lib +241 -0
  481. sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
  482. sage_wheels/share/singular/emacs/.emacs-general +184 -0
  483. sage_wheels/share/singular/emacs/.emacs-singular +234 -0
  484. sage_wheels/share/singular/emacs/COPYING +44 -0
  485. sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
  486. sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
  487. sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
  488. sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
  489. sage_wheels/share/singular/emacs/singular.el +4273 -0
  490. sage_wheels/share/singular/emacs/singular.xpm +39 -0
  491. sage_wheels/share/singular/singular.idx +5002 -0
@@ -0,0 +1,1964 @@
1
+ /////////////////////////////////////////////////////////////////////////////
2
+ version="version bfun.lib 4.3.1.3 Feb_2023 "; // $Id: a7fb178fc64d45b6d2539c9f85efaac32ad2aec4 $
3
+ category="Noncommutative";
4
+ info="
5
+ LIBRARY: bfun.lib Algorithms for b-functions and Bernstein-Sato polynomial
6
+ AUTHORS: Daniel Andres, daniel.andres@math.rwth-aachen.de
7
+ @* Viktor Levandovskyy, levandov@math.rwth-aachen.de
8
+
9
+ OVERVIEW:
10
+ Given a polynomial ring R = K[x_1,...,x_n] and a polynomial F in R,
11
+ one is interested in the global b-function (also known as Bernstein-Sato
12
+ polynomial) b(s) in K[s], defined to be the non-zero monic polynomial of minimal
13
+ degree, satisfying a functional identity L * F^{s+1} = b(s) F^s,
14
+ for some operator L in D[s] (* stands for the action of differential operator)@*
15
+ By D one denotes the n-th Weyl algebra
16
+ K<x_1,...,x_n,d_1,...,d_n | d_j x_j = x_j d_j +1>.
17
+ One is interested in the following data:@*
18
+ - Bernstein-Sato polynomial b(s) in K[s],@*
19
+ - the list of its roots, which are known to be rational@*
20
+ - the multiplicities of the roots.@*
21
+
22
+ There is a constructive definition of a b-function of a holonomic ideal I in D
23
+ (that is, an ideal I in a Weyl algebra D, such that D/I is holonomic module)
24
+ with respect to the given weight vector w: For a polynomial p in D, its initial
25
+ form w.r.t. (-w,w) is defined as the sum of all terms of p which have
26
+ maximal weighted total degree where the weight of x_i is -w_i and the weight
27
+ of d_i is w_i. Let J be the initial ideal of I w.r.t. (-w,w), i.e. the
28
+ K-vector space generated by all initial forms w.r.t (-w,w) of elements of I.
29
+ Put s = w_1 x_1 d_1 + ... + w_n x_n d_n. Then the monic generator b_w(s) of
30
+ the intersection of J with the PID K[s] is called the b-function of I w.r.t. w.
31
+ Unlike Bernstein-Sato polynomial, general b-function with respect to
32
+ arbitrary weights need not have rational roots at all. However, b-function
33
+ of a holonomic ideal is known to be non-zero as well.
34
+
35
+ REFERENCES: [SST] Saito, Sturmfels, Takayama: Groebner Deformations of
36
+ Hypergeometric Differential Equations (2000),@*
37
+ Noro: An Efficient Modular Algorithm for Computing the Global b-function,
38
+ (2002).
39
+
40
+
41
+ PROCEDURES:
42
+ bfct(f[,s,t,v]); compute the BS polynomial of f with linear reductions
43
+ bfctSyz(f[,r,s,t,u,v]); compute the BS polynomial of f with syzygy-solver
44
+ bfctAnn(f[,s]); compute the BS polynomial of f via Ann f^s + f
45
+ bfctOneGB(f[,s,t]); compute the BS polynomial of f by just one GB computation
46
+ bfctIdeal(I,w[,s,t]); compute the b-function of ideal w.r.t. weight
47
+ pIntersect(f,I[,s]); intersection of ideal with subalgebra K[f] for a polynomial f
48
+ pIntersectSyz(f,I[,p,s,t]); intersection of ideal with subalgebra K[f] with syz-solver
49
+ linReduce(f,I[,s]); reduce a polynomial by linear reductions w.r.t. ideal
50
+ linReduceIdeal(I,[s,t]); interreduce generators of ideal by linear reductions
51
+ linSyzSolve(I[,s]); compute a linear dependency of elements of ideal I
52
+
53
+ allPositive(v); checks whether all entries of an intvec are positive
54
+ scalarProd(v,w); computes the standard scalar product of two intvecs
55
+ vec2poly(v[,i]); constructs an univariate polynomial with given coefficients
56
+
57
+
58
+ SEE ALSO: dmod_lib, dmodapp_lib, dmodvar_lib, gmssing_lib
59
+
60
+ KEYWORDS: D-module; global Bernstein-Sato polynomial; Bernstein-Sato polynomial; b-function;
61
+ graded Weyl algebra; initial ideal; initial form; principal intersection; linear interreduction;
62
+ initial ideal approach
63
+ ";
64
+
65
+
66
+
67
+ /*
68
+ CHANGELOG
69
+
70
+ 03.03.11:
71
+ - simplified scalarProd
72
+ - fixed bug in bfct when user used vars t,Dt
73
+ - now bFactor is used by bfct, bfctAnn, i.e. the static procs
74
+ addRoot, listofroots are superfluous
75
+ - fixed printlevel/debug message issue in bfct, bfctAnn
76
+ - fixed small issue for zero ideal input in linReduceIdeal
77
+
78
+ 16.03.11
79
+ - fixed bug in linReduceIdeal when ideal contained unlucky constellation
80
+ of zeros
81
+ - fixed printlevel/debug message issue in linReduceIdeal
82
+ */
83
+
84
+
85
+
86
+ LIB "qhmoduli.lib"; // for Max
87
+ LIB "dmod.lib"; // for SannfsBFCT etc
88
+ LIB "dmodapp.lib"; // for initialIdealW etc
89
+ LIB "nctools.lib"; // for isWeyl etc
90
+ LIB "presolve.lib"; // for valvars
91
+
92
+ //--------------- auxiliary procedures ----------------------------------------
93
+
94
+ /*
95
+ static proc gradedWeyl (intvec u,intvec v)
96
+ "USAGE: gradedWeyl(u,v); u,v intvecs
97
+ RETURN: a ring, the associated graded ring of the basering w.r.t. u and v
98
+ PURPOSE: compute the associated graded ring of the basering w.r.t. u and v
99
+ ASSUME: basering is a Weyl algebra
100
+ EXAMPLE: example gradedWeyl; shows examples
101
+ NOTE: u[i] is the weight of x(i), v[i] the weight of D(i).
102
+ @* u+v has to be a non-negative intvec.
103
+ "
104
+ {
105
+ // todo check assumption
106
+ int i;
107
+ def save = basering;
108
+ int n = nvars(save) div 2;
109
+ if (nrows(u)<>n || nrows(v)<>n)
110
+ {
111
+ ERROR("weight vectors have wrong dimension");
112
+ }
113
+ intvec uv,gr;
114
+ uv = u+v;
115
+ for (i=1; i<=n; i++)
116
+ {
117
+ if (uv[i]>=0)
118
+ {
119
+ if (uv[i]==0)
120
+ {
121
+ gr[i] = 0;
122
+ }
123
+ else
124
+ {
125
+ gr[i] = 1;
126
+ }
127
+ }
128
+ else
129
+ {
130
+ ERROR("the sum of the weight vectors has to be a non-negative intvec");
131
+ }
132
+ }
133
+ list l = ringlist(save);
134
+ list l2 = l[2];
135
+ matrix l6 = l[6];
136
+ for (i=1; i<=n; i++)
137
+ {
138
+ if (gr[i] == 1)
139
+ {
140
+ l2[n+i] = "xi("+string(i)+")";
141
+ l6[i,n+i] = 0;
142
+ }
143
+ }
144
+ l[2] = l2;
145
+ l[6] = l6;
146
+ def G = ring(l);
147
+ return(G);
148
+ }
149
+ example
150
+ {
151
+ "EXAMPLE:"; echo = 2;
152
+ ring @D = 0,(x,y,z,Dx,Dy,Dz),dp;
153
+ def D = Weyl();
154
+ setring D;
155
+ intvec u = -1,-1,1; intvec v = 2,1,1;
156
+ def G = gradedWeyl(u,v);
157
+ setring G; G;
158
+ }
159
+ */
160
+
161
+ static proc safeVarName (string s)
162
+ {
163
+ string S = "," + charstr(basering) + "," + varstr(basering) + ",";
164
+ s = "," + s + ",";
165
+ while (find(S,s) <> 0)
166
+ {
167
+ s[1] = "@";
168
+ s = "," + s;
169
+ }
170
+ s = s[2..size(s)-1];
171
+ return(s)
172
+ }
173
+
174
+ proc allPositive (intvec v)
175
+ "USAGE: allPositive(v); v an intvec
176
+ RETURN: int, 1 if all components of v are positive, or 0 otherwise
177
+ PURPOSE: check whether all components of an intvec are positive
178
+ EXAMPLE: example allPositive; shows an example
179
+ "
180
+ {
181
+ int i;
182
+ for (i=1; i<=size(v); i++)
183
+ {
184
+ if (v[i]<=0)
185
+ {
186
+ return(0);
187
+ break;
188
+ }
189
+ }
190
+ return(1);
191
+ }
192
+ example
193
+ {
194
+ "EXAMPLE:"; echo = 2;
195
+ intvec v = 1,2,3;
196
+ allPositive(v);
197
+ intvec w = 1,-2,3;
198
+ allPositive(w);
199
+ }
200
+
201
+ static proc findFirst (list l, def i)
202
+ "USAGE: findFirst(l,i); l a list, i an argument of any type
203
+ RETURN: int, the position of the first appearance of i in l,
204
+ @* or 0 if i is not a member of l
205
+ PURPOSE: check whether the second argument is a member of a list
206
+ EXAMPLE: example findFirst; shows an example
207
+ "
208
+ {
209
+ int j;
210
+ for (j=1; j<=size(l); j++)
211
+ {
212
+ if (l[j]==i)
213
+ {
214
+ return(j);
215
+ break;
216
+ }
217
+ }
218
+ return(0);
219
+ }
220
+ // findFirst(list(1, 2, list(1)),2); // seems to be a bit buggy,
221
+ // findFirst(list(1, 2, list(1)),3); // but works for the purposes
222
+ // findFirst(list(1, 2, list(1)),list(1)); // of this library
223
+ // findFirst(l,list(2));
224
+ example
225
+ {
226
+ "EXAMPLE:"; echo = 2;
227
+ ring r = 0,x,dp;
228
+ list l = 1,2,3;
229
+ findFirst(l,4);
230
+ findFirst(l,2);
231
+ }
232
+
233
+ proc scalarProd (intvec v, intvec w)
234
+ "USAGE: scalarProd(v,w); v,w intvecs
235
+ RETURN: int, the standard scalar product of v and w
236
+ PURPOSE: computes the scalar product of two intvecs
237
+ ASSUME: the arguments are of the same size
238
+ EXAMPLE: example scalarProd; shows examples
239
+ "
240
+ {
241
+ if (size(v)!=size(w))
242
+ {
243
+ ERROR("non-matching dimensions");
244
+ }
245
+ else
246
+ {
247
+ intvec u = transpose(v)*w;
248
+ }
249
+ return(u[1]);
250
+ }
251
+ example
252
+ {
253
+ "EXAMPLE:"; echo = 2;
254
+ intvec v = 1,2,3;
255
+ intvec w = 4,5,6;
256
+ scalarProd(v,w);
257
+ }
258
+
259
+ //-------------- main procedures -------------------------------------------------------
260
+
261
+ proc linReduceIdeal(ideal I, list #)
262
+ "USAGE: linReduceIdeal(I [,s,t,u]); I an ideal, s,t,u optional ints
263
+ RETURN: ideal or list, linear reductum (over field) of I by its elements
264
+ PURPOSE: reduces a list of polys only by linear reductions (no monomial
265
+ @* multiplications)
266
+ NOTE: If s<>0, a list consisting of the reduced ideal and the coefficient
267
+ @* vectors of the used reductions given as module is returned.
268
+ @* Otherwise (and by default), only the reduced ideal is returned.
269
+ @* If t<>0 (and by default) all monomials are reduced (if possible),
270
+ @* otherwise, only leading monomials are reduced.
271
+ @* If u<>0 (and by default), the ideal is first sorted in increasing order.
272
+ @* If u is set to 0 and the given ideal is not sorted in the way described,
273
+ @* the result might not be as expected.
274
+ DISPLAY: If @code{printlevel}=1, progress debug messages will be printed,
275
+ @* if printlevel>=2, all the debug messages will be printed.
276
+ EXAMPLE: example linReduceIdeal; shows examples
277
+ "
278
+ {
279
+ // #[1] = remembercoeffs
280
+ // #[2] = redtail
281
+ // #[3] = sortideal
282
+ int ppl = printlevel - voice + 2;
283
+ int remembercoeffs = 0; // default
284
+ int redtail = 1; // default
285
+ int sortideal = 1; // default
286
+ if (size(#)>0)
287
+ {
288
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
289
+ {
290
+ remembercoeffs = #[1];
291
+ }
292
+ if (size(#)>1)
293
+ {
294
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
295
+ {
296
+ redtail = #[2];
297
+ }
298
+ if (size(#)>2)
299
+ {
300
+ if (typeof(#[3])=="int" || typeof(#[3])=="number")
301
+ {
302
+ sortideal = #[3];
303
+ }
304
+ }
305
+ }
306
+ }
307
+ int sI = ncols(I);
308
+ int sZeros = sI - size(I);
309
+ int i,j,k;
310
+ ideal J,lmJ,ordJ;
311
+ list lJ = sort(I);
312
+ intvec iv,iv2; //todo
313
+ module M; // for the coefficients
314
+ // step 1: prepare, e.g. sort I
315
+ if (sortideal <> 0)
316
+ {
317
+ if (sZeros > 0) // I contains zeros
318
+ {
319
+ if (remembercoeffs <> 0)
320
+ {
321
+ j = 0;
322
+ k = 0;
323
+ intvec posNonZero;
324
+ for (i=1; i<=sI; i++)
325
+ {
326
+ if (I[i] == 0)
327
+ {
328
+ j++;
329
+ J[j] = 0;
330
+ ordJ[j] = -1;
331
+ M[j] = gen(i);
332
+ }
333
+ else
334
+ {
335
+ k++;
336
+ M[k+sZeros] = gen(lJ[2][k]);
337
+ posNonZero = posNonZero,i;
338
+ }
339
+ }
340
+ if (size(I)>0)
341
+ {
342
+ posNonZero = posNonZero[2..nrows(posNonZero)];
343
+ posNonZero = posNonZero[lJ[2]];
344
+ for (i=1; i<=size(lJ[1]); i++)
345
+ {
346
+ M[i+sZeros] = gen(posNonZero[i]);
347
+ }
348
+ kill posNonZero;
349
+ }
350
+ }
351
+ else
352
+ {
353
+ for (i=1; i<=sZeros; i++)
354
+ {
355
+ J[i] = 0;
356
+ ordJ[i] = -1;
357
+ }
358
+ }
359
+ I = J,lJ[1];
360
+ }
361
+ else // I contains no zeros
362
+ {
363
+ I = lJ[1];
364
+ if (remembercoeffs <> 0)
365
+ {
366
+ for (i=1; i<=size(lJ[1]); i++) { M[i] = gen(lJ[2][i]); }
367
+ }
368
+ }
369
+ }
370
+ else // assume I is already sorted
371
+ {
372
+ if (remembercoeffs <> 0)
373
+ {
374
+ for (i=1; i<=ncols(I); i++) { M[i] = gen(i); }
375
+ }
376
+ }
377
+ dbprint(ppl,"// initially sorted ideal:", I);
378
+ if (remembercoeffs <> 0) { dbprint(ppl,"// used permutations:", M); }
379
+ // step 2: reduce leading monomials by linear reductions
380
+ poly lm,c,redpoly,maxlmJ;
381
+ J[sZeros+1] = I[sZeros+1];
382
+ lm = I[sZeros+1];
383
+ maxlmJ = leadmonom(lm);
384
+ lmJ[sZeros+1] = maxlmJ;
385
+ int ordlm,reduction;
386
+ ordJ[sZeros+1] = ord(lm);
387
+ vector v;
388
+ int noRedPast;
389
+ for (i=sZeros+2; i<=sI; i++)
390
+ {
391
+ redpoly = I[i];
392
+ lm = leadmonom(redpoly);
393
+ ordlm = ord(lm);
394
+ if (remembercoeffs <> 0) { v = M[i]; }
395
+ reduction = 1;
396
+ while (reduction == 1) // while there was a reduction
397
+ {
398
+ noRedPast = i;
399
+ reduction = 0;
400
+ for (j=sZeros+1; j<noRedPast; j++)
401
+ {
402
+ if (lm == 0) { break; } // nothing more to reduce
403
+ if (lm > maxlmJ) { break; } //lm is bigger than maximal monomial to reduce with
404
+ if (ordlm == ordJ[j])
405
+ {
406
+ if (lm == lmJ[j])
407
+ {
408
+ dbprint(ppl-1,"// reducing " + string(redpoly));
409
+ dbprint(ppl-1,"// with " + string(J[j]));
410
+ c = leadcoef(redpoly)/leadcoef(J[j]);
411
+ redpoly = redpoly - c*J[j];
412
+ dbprint(ppl-1,"// to " + string(redpoly));
413
+ lm = leadmonom(redpoly);
414
+ ordlm = ord(lm);
415
+ if (remembercoeffs <> 0) { M[i] = M[i] - c * M[j]; }
416
+ noRedPast = j;
417
+ reduction = 1;
418
+ }
419
+ }
420
+ }
421
+ }
422
+ for (j=sZeros+1; j<i; j++)
423
+ {
424
+ if (redpoly < J[j]) { break; }
425
+ }
426
+ J = insertGenerator(J,redpoly,j);
427
+ lmJ = insertGenerator(lmJ,lm,j);
428
+ ordJ = insertGenerator(ordJ,poly(ordlm),j);
429
+ if (remembercoeffs <> 0)
430
+ {
431
+ v = M[i];
432
+ M = deleteGenerator(M,i);
433
+ M = insertGenerator(M,v,j);
434
+ }
435
+ maxlmJ = lmJ[i];
436
+ }
437
+ // step 3: reduce tails by linear reductions as well
438
+ if (redtail <> 0)
439
+ {
440
+ dbprint(ppl,"// finished reducing leading monomials");
441
+ dbprint(ppl-1,string(J));
442
+ if (remembercoeffs <> 0) { dbprint(ppl-1,"// used reductions:" + string(M)); }
443
+ for (i=sZeros+1; i<=sI; i++)
444
+ {
445
+ lm = lmJ[i];
446
+ for (j=i+1; j<=sI; j++)
447
+ {
448
+ for (k=2; k<=size(J[j]); k++) // run over all terms in J[j]
449
+ {
450
+ if (ordJ[i] == ord(J[j][k]))
451
+ {
452
+ if (lm == normalize(J[j][k]))
453
+ {
454
+ c = leadcoef(J[j][k])/leadcoef(J[i]);
455
+ dbprint(ppl-1,"// reducing " + string(J[j]));
456
+ dbprint(ppl-1,"// with " + string(J[i]));
457
+ J[j] = J[j] - c*J[i];
458
+ dbprint(ppl-1,"// to " + string(J[j]));
459
+ if (remembercoeffs <> 0) { M[j] = M[j] - c * M[i]; }
460
+ }
461
+ }
462
+ }
463
+ }
464
+ }
465
+ }
466
+ if (sI == sZeros) // if I=0,0,...,0, we now have one too much by construction due to sort
467
+ {
468
+ J = J[1..sZeros];
469
+ }
470
+ if (remembercoeffs <> 0) { return(list(J,M)); }
471
+ else { return(J); }
472
+ }
473
+ example
474
+ {
475
+ "EXAMPLE:"; echo = 2;
476
+ ring r = 0,(x,y),dp;
477
+ ideal I = 3,x+9,y4+5x,2y4+7x+2;
478
+ linReduceIdeal(I); // reduces tails
479
+ linReduceIdeal(I,0,0); // no reductions of tails
480
+ list l = linReduceIdeal(I,1); // reduces tails and shows reductions used
481
+ l;
482
+ module M = I;
483
+ matrix(l[1]) - matrix(M)*matrix(l[2]);
484
+ }
485
+
486
+ proc linReduce(poly f, ideal I, list #)
487
+ "USAGE: linReduce(f, I [,s,t,u]); f a poly, I an ideal, s,t,u optional ints
488
+ RETURN: poly or list, linear reductum (over field) of f by elements from I
489
+ PURPOSE: reduce a polynomial only by linear reductions (no monomial multiplications)
490
+ NOTE: If s<>0, a list consisting of the reduced polynomial and the coefficient
491
+ @* vector of the used reductions is returned, otherwise (and by default)
492
+ @* only reduced polynomial is returned.
493
+ @* If t<>0 (and by default) all monomials are reduced (if possible),
494
+ @* otherwise, only leading monomials are reduced.
495
+ @* If u<>0 (and by default), the ideal is linearly pre-reduced, i.e.
496
+ @* instead of the given ideal, the output of @code{linReduceIdeal} is used.
497
+ @* If u is set to 0 and the given ideal does not equal the output of
498
+ @* @code{linReduceIdeal}, the result might not be as expected.
499
+ DISPLAY: If @code{printlevel}=1, progress debug messages will be printed,
500
+ @* if printlevel>=2, all the debug messages will be printed.
501
+ EXAMPLE: example linReduce; shows examples
502
+ "
503
+ {
504
+ int ppl = printlevel - voice + 2;
505
+ int remembercoeffs = 0; // default
506
+ int redtail = 1; // default
507
+ int prepareideal = 1; // default
508
+ if (size(#)>0)
509
+ {
510
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
511
+ {
512
+ remembercoeffs = #[1];
513
+ }
514
+ if (size(#)>1)
515
+ {
516
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
517
+ {
518
+ redtail = #[2];
519
+ }
520
+ if (size(#)>2)
521
+ {
522
+ if (typeof(#[3])=="int" || typeof(#[3])=="number")
523
+ {
524
+ prepareideal = #[3];
525
+ }
526
+ }
527
+ }
528
+ }
529
+ int i,j,k;
530
+ int sI = ncols(I);
531
+ // pre-reduce I:
532
+ module M;
533
+ if (prepareideal <> 0)
534
+ {
535
+ if (remembercoeffs <> 0)
536
+ {
537
+ list sortedI = linReduceIdeal(I,1,redtail);
538
+ I = sortedI[1];
539
+ M = sortedI[2];
540
+ dbprint(ppl-1,"// prepared ideal:" +string(I));
541
+ dbprint(ppl-1,"// with operations:" +string(M));
542
+ }
543
+ else { I = linReduceIdeal(I,0,redtail); }
544
+ }
545
+ else
546
+ {
547
+ if (remembercoeffs <> 0)
548
+ {
549
+ for (i=1; i<=sI; i++) { M[i] = gen(i); }
550
+ }
551
+ }
552
+ ideal lmI,lcI,ordI;
553
+ for (i=1; i<=sI; i++)
554
+ {
555
+ lmI[i] = leadmonom(I[i]);
556
+ lcI[i] = leadcoef(I[i]);
557
+ ordI[i] = ord(lmI[i]);
558
+ }
559
+ vector v;
560
+ poly c;
561
+ // === reduce leading monomials ===
562
+ poly lm = leadmonom(f);
563
+ int ordf = ord(lm);
564
+ for (i=sI; i>=1; i--) // I is sorted: smallest lm's on top
565
+ {
566
+ if (lm == 0) { break; }
567
+ else
568
+ {
569
+ if (ordf == ordI[i])
570
+ {
571
+ if (lm == lmI[i])
572
+ {
573
+ c = leadcoef(f)/lcI[i];
574
+ f = f - c*I[i];
575
+ lm = leadmonom(f);
576
+ ordf = ord(lm);
577
+ if (remembercoeffs <> 0) { v = v - c * M[i]; }
578
+ }
579
+ }
580
+ }
581
+ }
582
+ // === reduce tails as well ===
583
+ if (redtail <> 0)
584
+ {
585
+ dbprint(ppl,"// finished reducing leading monomials");
586
+ dbprint(ppl-1,string(f));
587
+ if (remembercoeffs <> 0) { dbprint(ppl-1,"// used reductions:" + string(v)); }
588
+ for (i=1; i<=sI; i++)
589
+ {
590
+ dbprint(ppl,"// testing ideal entry "+string(i));
591
+ for (j=1; j<=size(f); j++)
592
+ {
593
+ if (ord(f[j]) == ordI[i])
594
+ {
595
+ if (normalize(f[j]) == lmI[i])
596
+ {
597
+ c = leadcoef(f[j])/lcI[i];
598
+ f = f - c*I[i];
599
+ dbprint(ppl-1,"// reducing with " + string(I[i]));
600
+ dbprint(ppl-1,"// to " + string(f));
601
+ if (remembercoeffs <> 0) { v = v - c * M[i]; }
602
+ }
603
+ }
604
+ }
605
+ }
606
+ }
607
+ if (remembercoeffs <> 0)
608
+ {
609
+ list l = f,v;
610
+ return(l);
611
+ }
612
+ else { return(f); }
613
+ }
614
+ example
615
+ {
616
+ "EXAMPLE:"; echo = 2;
617
+ ring r = 0,(x,y),dp;
618
+ ideal I = 1,y,xy;
619
+ poly f = 5xy+7y+3;
620
+ poly g = 7x+5y+3;
621
+ linReduce(g,I); // reduces tails
622
+ linReduce(g,I,0,0); // no reductions of tails
623
+ linReduce(f,I,1); // reduces tails and shows reductions used
624
+ f = x3+y2+x2+y+x;
625
+ I = x3-y3, y3-x2,x3-y2,x2-y,y2-x;
626
+ list l = linReduce(f,I,1);
627
+ l;
628
+ module M = I;
629
+ f - (l[1]-(M*l[2])[1,1]);
630
+ }
631
+
632
+ proc linSyzSolve (ideal I, list #)
633
+ "USAGE: linSyzSolve(I[,s]); I an ideal, s an optional int
634
+ RETURN: vector, coefficient vector of linear combination of 0 in elements of I
635
+ PURPOSE: compute a linear dependency between the elements of an ideal
636
+ @* if such one exists
637
+ NOTE: If s<>0, @code{std} is used for Groebner basis computations,
638
+ @* otherwise, @code{slimgb} is used.
639
+ @* By default, @code{slimgb} is used in char 0 and @code{std} in char >0.
640
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
641
+ @* if printlevel>=2, all the debug messages will be printed.
642
+ EXAMPLE: example linSyzSolve; shows examples
643
+ "
644
+ {
645
+ int whichengine = 0; // default
646
+ int enginespecified = 0; // default
647
+ if (size(#)>0)
648
+ {
649
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
650
+ {
651
+ whichengine = int( #[1]);
652
+ enginespecified = 1;
653
+ }
654
+ }
655
+ int ppl = printlevel - voice +2;
656
+ int sI = ncols(I);
657
+ // check if we are done
658
+ if (I[sI]==0)
659
+ {
660
+ vector v = gen(sI);
661
+ }
662
+ else
663
+ {
664
+ // ------- 1. introduce undefined coeffs ------------------
665
+ def save = basering;
666
+ list RL = ringlist(save);
667
+ int nv = nvars(save);
668
+ int np = npars(save);
669
+ int p = char(save);
670
+ string cs = "(" + charstr(save) + ")";
671
+ if (enginespecified == 0)
672
+ {
673
+ if (p <> 0)
674
+ {
675
+ whichengine = 1;
676
+ }
677
+ }
678
+ int i;
679
+ list Lvar;
680
+ for (i=1; i<=sI; i++)
681
+ {
682
+ Lvar[i] = safeVarName("@a(" + string(i) + ")");
683
+ }
684
+ list L@A = RL[1..4];
685
+ L@A[2] = Lvar;
686
+ L@A[3] = list(list("lp",intvec(1:sI)),list("C",intvec(0)));
687
+ def @A = ring(L@A);
688
+ L@A[2] = list(safeVarName("@z"));
689
+ L@A[3][1] = list("dp",intvec(1));
690
+ if (size(L@A[1])>1)
691
+ {
692
+ L@A[1][2] = L@A[1][2] + Lvar;
693
+ L@A[1][3][size(L@A[1][3])+1] = list("lp",intvec(1:sI));
694
+ }
695
+ else
696
+ {
697
+ L@A[1] = list(p,Lvar,list(list("lp",intvec(1:sI))),ideal(0));
698
+ }
699
+ def @aA = ring(L@A);
700
+ def @B = save + @aA;
701
+ setring @B;
702
+ ideal I = imap(save,I);
703
+ // ------- 2. form the linear system for the undef coeffs ---
704
+ poly W; ideal QQ;
705
+ for (i=1; i<=sI; i++)
706
+ {
707
+ W = W + par(np+i)*I[i];
708
+ }
709
+ while (W!=0)
710
+ {
711
+ QQ = QQ,leadcoef(W);
712
+ W = W - lead(W);
713
+ }
714
+ // QQ consists of polynomial expressions in @a(i) of type number
715
+ setring @A;
716
+ ideal QQ = imap(@B,QQ);
717
+ // ------- 3. this QQ is a polynomial ideal, so "solve" the system -----
718
+ dbprint(ppl, "// linSyzSolve: starting Groebner basis computation with engine:", whichengine);
719
+ QQ = engine(QQ,whichengine);
720
+ dbprint(ppl, "// QQ after engine:", QQ);
721
+ if (dim(QQ) == -1)
722
+ {
723
+ dbprint(ppl+1, "// no solutions by linSyzSolve");
724
+ // output zeroes
725
+ setring save;
726
+ kill @A,@aA,@B;
727
+ return(v);
728
+ }
729
+ // ------- 4. in order to get the numeric values -------
730
+ matrix AA = matrix(maxideal(1));
731
+ module MQQ = std(module(QQ));
732
+ AA = NF(AA,MQQ); // todo: we still receive NF warnings
733
+ dbprint(ppl, "// AA after NF:",AA);
734
+ // "AA after NF:"; print(AA);
735
+ for(i=1; i<=sI; i++)
736
+ {
737
+ AA = subst(AA,var(i),1);
738
+ }
739
+ dbprint(ppl, "// AA after subst:",AA);
740
+ // "AA after subst: "; print(AA);
741
+ vector v = (module(transpose(AA)))[1];
742
+ setring save;
743
+ vector v = imap(@A,v);
744
+ kill @A,@aA,@B;
745
+ }
746
+ return(v);
747
+ }
748
+ example
749
+ {
750
+ "EXAMPLE:"; echo = 2;
751
+ ring r = 0,x,dp;
752
+ ideal I = x,2x;
753
+ linSyzSolve(I);
754
+ ideal J = x,x2;
755
+ linSyzSolve(J);
756
+ }
757
+
758
+ proc pIntersect (poly s, ideal I, list #)
759
+ "USAGE: pIntersect(f, I [,s]); f a poly, I an ideal, s an optional int
760
+ RETURN: vector, coefficient vector of the monic polynomial
761
+ PURPOSE: compute the intersection of ideal I with the subalgebra K[f]
762
+ ASSUME: I is given as Groebner basis, basering is not a qring.
763
+ NOTE: If the intersection is zero, this proc might not terminate.
764
+ @* If s>0 is given, it is searched for the generator of the intersection
765
+ @* only up to degree s. Otherwise (and by default), no bound is assumed.
766
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
767
+ @* if printlevel>=2, all the debug messages will be printed.
768
+ EXAMPLE: example pIntersect; shows examples
769
+ "
770
+ {
771
+ def save = basering;
772
+ int n = nvars(save);
773
+ list RL = ringlist(save);
774
+ int i,j,k;
775
+ if (RL[4]<>0)
776
+ {
777
+ ERROR ("basering must not be a qring");
778
+ }
779
+ // assume I is given in Groebner basis
780
+ if (attrib(I,"isSB") <> 1)
781
+ {
782
+ print("// WARNING: The input has no SB attribute!");
783
+ print("// Treating it as if it were a Groebner basis and proceeding...");
784
+ attrib(I,"isSB",1); // set attribute for suppressing NF messages
785
+ }
786
+ int bound = 0; // default
787
+ if (size(#)>0)
788
+ {
789
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
790
+ {
791
+ bound = #[1];
792
+ }
793
+ }
794
+ int ppl = printlevel-voice+2;
795
+ // ---case 1: I = basering---
796
+ if (size(I) == 1)
797
+ {
798
+ if (simplify(I,2)[1] == 1)
799
+ {
800
+ return(gen(1)); // = 1
801
+ }
802
+ }
803
+ // ---case 2: intersection is zero---
804
+ intvec degs = leadexp(s);
805
+ intvec possdegbounds;
806
+ list degI;
807
+ i = 1;
808
+ while (i <= ncols(I))
809
+ {
810
+ if (i == ncols(I)+1) { break; }
811
+ degI[i] = leadexp(I[i]);
812
+ for (j=1; j<=n; j++)
813
+ {
814
+ if (degs[j] == 0)
815
+ {
816
+ if (degI[i][j] <> 0) { break; }
817
+ }
818
+ if (j == n)
819
+ {
820
+ k++;
821
+ possdegbounds[k] = Max(degI[i]);
822
+ }
823
+ }
824
+ i++;
825
+ }
826
+ int degbound = Min(possdegbounds);
827
+ if (bound>0 && bound<degbound) // given bound is too small
828
+ {
829
+ print("// Try a bound of at least " + string(degbound));
830
+ return(vector(0));
831
+ }
832
+ dbprint(ppl,"// lower bound for the degree of the insection is " +string(degbound));
833
+ if (degbound == 0) // lm(s) does not appear in lm(I)
834
+ {
835
+ print("// Intersection is zero");
836
+ return(vector(0));
837
+ }
838
+ // ---case 3: intersection is non-trivial---
839
+ ideal redNI = 1;
840
+ vector v;
841
+ list l,ll;
842
+ l[1] = vector(0);
843
+ poly toNF,tobracket,newNF,rednewNF,oldNF,secNF;
844
+ i = 1;
845
+ while (1)
846
+ {
847
+ if (bound>0 && i>bound) { return(vector(0)); }
848
+ dbprint(ppl,"// Testing degree "+string(i));
849
+ if (i>1)
850
+ {
851
+ oldNF = newNF;
852
+ tobracket = s^(i-1) - oldNF;
853
+ if (tobracket==0) // todo bug in bracket?
854
+ {
855
+ toNF = 0;
856
+ }
857
+ else
858
+ {
859
+ toNF = bracket(tobracket,secNF);
860
+ }
861
+ newNF = NF(toNF+oldNF*secNF,I); // = NF(s^i,I)
862
+ }
863
+ else
864
+ {
865
+ newNF = NF(s,I);
866
+ secNF = newNF;
867
+ }
868
+ ll = linReduce(newNF,redNI,1);
869
+ rednewNF = ll[1];
870
+ l[i+1] = ll[2];
871
+ dbprint(ppl-1,"// newNF is: "+string(newNF));
872
+ dbprint(ppl-1,"// rednewNF is: "+string(rednewNF));
873
+ if (rednewNF != 0) // no linear dependency
874
+ {
875
+ redNI[i+1] = rednewNF;
876
+ i++;
877
+ }
878
+ else // there is a linear dependency, hence we are done
879
+ {
880
+ dbprint(ppl,"// degree of the generator of the intersection is: "+string(i));
881
+ break;
882
+ }
883
+ }
884
+ dbprint(ppl-1,"// used linear reductions:", l);
885
+ // we obtain the coefficients of the generator by the used reductions:
886
+ list Lvar;
887
+ for (j=1; j<=i+1; j++)
888
+ {
889
+ Lvar[j] = safeVarName("a("+string(j)+")");
890
+ }
891
+ list Lord = list("dp",intvec(1:(i+1))),list("C",intvec(0));
892
+ list L@R = RL[1..4];
893
+ L@R[2] = Lvar; L@R[3] = Lord;
894
+ def @R = ring(L@R); setring @R;
895
+ list l = imap(save,l);
896
+ ideal C;
897
+ for (j=1;j<=i+1;j++)
898
+ {
899
+ C[j] = 0;
900
+ for (k=1;k<=j;k++)
901
+ {
902
+ C[j] = C[j]+l[j][k]*var(k);
903
+ }
904
+ }
905
+ for (j=i;j>=1;j--)
906
+ {
907
+ C[i+1]= subst(C[i+1],var(j),var(j)+C[j]);
908
+ }
909
+ matrix m = coeffs(C[i+1],maxideal(1));
910
+ vector v = gen(i+1);
911
+ for (j=1;j<=i+1;j++)
912
+ {
913
+ v = v + m[j,1]*gen(j);
914
+ }
915
+ setring save;
916
+ v = imap(@R,v);
917
+ kill @R;
918
+ return(v);
919
+ }
920
+ example
921
+ {
922
+ "EXAMPLE:"; echo = 2;
923
+ ring r = 0,(x,y),dp;
924
+ poly f = x^2+y^3+x*y^2;
925
+ def D = initialMalgrange(f);
926
+ setring D;
927
+ inF;
928
+ pIntersect(t*Dt,inF);
929
+ pIntersect(t*Dt,inF,1);
930
+ }
931
+
932
+ proc pIntersectSyz (poly s, ideal I, list #)
933
+ "USAGE: pIntersectSyz(f, I [,p,s,t]); f poly, I ideal, p,t optial ints, p prime
934
+ RETURN: vector, coefficient vector of the monic polynomial
935
+ PURPOSE: compute the intersection of an ideal I with the subalgebra K[f]
936
+ ASSUME: I is given as Groebner basis.
937
+ NOTE: If the intersection is zero, this procedure might not terminate.
938
+ @* If p>0 is given, this proc computes the generator of the intersection in
939
+ @* char p first and then only searches for a generator of the obtained
940
+ @* degree in the basering. Otherwise, it searches for all degrees by
941
+ @* computing syzygies.
942
+ @* If s<>0, @code{std} is used for Groebner basis computations in char 0,
943
+ @* otherwise, and by default, @code{slimgb} is used.
944
+ @* If t<>0 and by default, @code{std} is used for Groebner basis
945
+ @* computations in char >0, otherwise, @code{slimgb} is used.
946
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
947
+ @* if printlevel>=2, all the debug messages will be printed.
948
+ EXAMPLE: example pIntersectSyz; shows examples
949
+ "
950
+ {
951
+ // assume I is given as Groebner basis
952
+ if (attrib(I,"isSB") <> 1)
953
+ {
954
+ print("// WARNING: The input has no SB attribute!");
955
+ print("// Treating it as if it were a Groebner basis and proceeding...");
956
+ attrib(I,"isSB",1); // set attribute for suppressing NF messages
957
+ }
958
+ int ppl = printlevel-voice+2;
959
+ int whichengine = 0; // default
960
+ int modengine = 1; // default
961
+ int solveincharp = 0; // default
962
+ def save = basering;
963
+ int n = nvars(save);
964
+ if (size(#)>0)
965
+ {
966
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
967
+ {
968
+ solveincharp = int(#[1]);
969
+ }
970
+ if (size(#)>1)
971
+ {
972
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
973
+ {
974
+ whichengine = int(#[2]);
975
+ }
976
+ if (size(#)>2)
977
+ {
978
+ if (typeof(#[3])=="int" || typeof(#[3])=="number")
979
+ {
980
+ modengine = int(#[3]);
981
+ }
982
+ }
983
+ }
984
+ }
985
+ int i,j;
986
+ vector v;
987
+ poly tobracket,toNF,newNF,p;
988
+ ideal NI = 1;
989
+ newNF = NF(s,I);
990
+ NI[2] = newNF;
991
+ list RL = ringlist(save);
992
+ if (solveincharp)
993
+ {
994
+ int psolveincharp = prime(solveincharp);
995
+ if (solveincharp <> psolveincharp)
996
+ {
997
+ print("// " + string(solveincharp) + " is invalid characteristic of ground field.");
998
+ print("// " + string(psolveincharp) + " is used.");
999
+ solveincharp = psolveincharp;
1000
+ kill psolveincharp;
1001
+ }
1002
+ list RLp = RL[1..4];
1003
+ if (typeof(RL[1]) == "int") { RLp[1] = solveincharp; }
1004
+ else { RLp[1][1] = solveincharp; } // parameters
1005
+ def @Rp = ring(RLp);
1006
+ setring @Rp;
1007
+ number c;
1008
+ setring save;
1009
+ int shortSave = short; // workaround for maps Q(a_i) -> Z/p(a_i)
1010
+ short = 0;
1011
+ string str;
1012
+ int badprime;
1013
+ i=1;
1014
+ number c;
1015
+ while (badprime == 0 && i<=size(s)) // detect bad primes
1016
+ {
1017
+ c=denominator(leadcoef(s[i]));
1018
+ setring @Rp;
1019
+ c=fetch(save,c);
1020
+ if (c == 0) { badprime = 1; }
1021
+ setring save;
1022
+ i++;
1023
+ }
1024
+ str = "poly s = " + string(s) + ";";
1025
+ if (size(RL) > 4) // basering is NC-algebra
1026
+ {
1027
+ matrix @C=RL[5];
1028
+ matrix @D=RL[6];
1029
+ setring @Rp;
1030
+ matrix @C[n][n]=fetch(save,@C);
1031
+ matrix @D[n][n]=fetch(save,@D);
1032
+ def Rp = nc_algebra(@C,@D);
1033
+ }
1034
+ else { def Rp = @Rp; }
1035
+ setring Rp;
1036
+ kill @Rp;
1037
+ dbprint(ppl-1,"// solving in ring ", Rp);
1038
+ poly s=fetch(save,s);
1039
+ vector v;
1040
+ number c;
1041
+ ideal NI = 1;
1042
+ setring save;
1043
+ i=1;
1044
+ while (badprime == 0 && i<=size(I)) // detect bad primes
1045
+ {
1046
+ c=leadcoef(cleardenom(I[i]));
1047
+ setring Rp;
1048
+ c=fetch(save,c);
1049
+ if (c == 0) { badprime = 1; }
1050
+ setring save;
1051
+ i++;
1052
+ }
1053
+ if (badprime == 1)
1054
+ {
1055
+ print("// WARNING: bad prime");
1056
+ short = shortSave;
1057
+ return(vector(0));
1058
+ }
1059
+ }
1060
+ i = 1;
1061
+ dbprint(ppl,"// pIntersectSyz starts...");
1062
+ dbprint(ppl-1,"// with ideal I=", I);
1063
+ while (1)
1064
+ {
1065
+ dbprint(ppl,"// testing degree: "+string(i));
1066
+ if (i>1)
1067
+ {
1068
+ tobracket = s^(i-1)-NI[i];
1069
+ if (tobracket!=0)
1070
+ {
1071
+ toNF = bracket(tobracket,NI[2]) + NI[i]*NI[2];
1072
+ }
1073
+ else
1074
+ {
1075
+ toNF = NI[i]*NI[2];
1076
+ }
1077
+ newNF = NF(toNF,I);
1078
+ NI[i+1] = newNF;
1079
+ }
1080
+ // look for a solution
1081
+ dbprint(ppl-1,"// linSyzSolve starts with: "+string(matrix(NI)));
1082
+ if (solveincharp) // modular method
1083
+ {
1084
+ for (j=1; j<=size(newNF); j++)
1085
+ {
1086
+ c=denominator(leadcoef(s[i]));
1087
+ setring Rp;
1088
+ c=fetch(save,c);
1089
+ if (c == 0)
1090
+ {
1091
+ print("// WARNING: bad prime");
1092
+ setring save;
1093
+ short = shortSave;
1094
+ return(vector(0));
1095
+ }
1096
+ setring save;
1097
+ }
1098
+ str = "NI[" + string(i) + "+1] = " + string(newNF) + ";";
1099
+ setring Rp;
1100
+ NI[i+1]=fetch(save,newNF);
1101
+ // NI[i+1] = [newNF]_{solveincharp}
1102
+ v = linSyzSolve(NI,modengine);
1103
+ if (v!=0) // there is a modular solution
1104
+ {
1105
+ dbprint(ppl,"// got solution in char "+string(solveincharp)+" of degree "+string(i));
1106
+ setring save;
1107
+ v = linSyzSolve(NI,whichengine);
1108
+ if (v==0)
1109
+ {
1110
+ break;
1111
+ }
1112
+ }
1113
+ else // no modular solution
1114
+ {
1115
+ setring save;
1116
+ v = 0;
1117
+ }
1118
+ }
1119
+ else // non-modular method
1120
+ {
1121
+ v = linSyzSolve(NI,whichengine);
1122
+ }
1123
+ matrix MM[1][nrows(v)] = matrix(v);
1124
+ dbprint(ppl-1,"// linSyzSolve ready with: "+string(MM));
1125
+ kill MM;
1126
+ // "linSyzSolve ready with"; print(v);
1127
+ if (v!=0)
1128
+ {
1129
+ // a solution:
1130
+ //check for the reality of the solution
1131
+ p = 0;
1132
+ for (j=1; j<=i+1; j++)
1133
+ {
1134
+ p = p + v[j]*NI[j];
1135
+ }
1136
+ if (p!=0)
1137
+ {
1138
+ dbprint(ppl,"// linSyzSolve: bad solution!");
1139
+ }
1140
+ else
1141
+ {
1142
+ dbprint(ppl,"// linSyzSolve: got solution!");
1143
+ // "got solution!";
1144
+ break;
1145
+ }
1146
+ }
1147
+ // no solution:
1148
+ i++;
1149
+ }
1150
+ dbprint(ppl,"// pIntersectSyz finished");
1151
+ if (solveincharp) { short = shortSave; }
1152
+ return(v);
1153
+ }
1154
+ example
1155
+ {
1156
+ "EXAMPLE:"; echo = 2;
1157
+ ring r = 0,(x,y),dp;
1158
+ poly f = x^2+y^3+x*y^2;
1159
+ def D = initialMalgrange(f);
1160
+ setring D;
1161
+ inF;
1162
+ poly s = t*Dt;
1163
+ pIntersectSyz(s,inF);
1164
+ int p = prime(20000);
1165
+ pIntersectSyz(s,inF,p,0,0);
1166
+ }
1167
+
1168
+ proc vec2poly (list #)
1169
+ "USAGE: vec2poly(v [,i]); v a vector or an intvec, i an optional int
1170
+ RETURN: poly, an univariate polynomial in i-th variable with coefficients given by v
1171
+ PURPOSE: constructs an univariate polynomial in K[var(i)] with given coefficients,
1172
+ @* such that the coefficient at var(i)^{j-1} is v[j].
1173
+ NOTE: The optional argument i must be positive, by default i is 1.
1174
+ EXAMPLE: example vec2poly; shows examples
1175
+ "
1176
+ {
1177
+ def save = basering;
1178
+ int i,ringvar;
1179
+ ringvar = 1; // default
1180
+ if (size(#) > 0)
1181
+ {
1182
+ if (typeof(#[1])=="vector" || typeof(#[1])=="intvec")
1183
+ {
1184
+ def v = #[1];
1185
+ }
1186
+ else
1187
+ {
1188
+ ERROR("wrong input: expected vector/intvec expression");
1189
+ }
1190
+ if (size(#) > 1)
1191
+ {
1192
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
1193
+ {
1194
+ ringvar = int(#[2]);
1195
+ }
1196
+ }
1197
+ }
1198
+ if (ringvar > nvars(save))
1199
+ {
1200
+ ERROR("var out of range");
1201
+ }
1202
+ poly p;
1203
+ for (i=1; i<=nrows(v); i++)
1204
+ {
1205
+ p = p + v[i]*(var(ringvar))^(i-1);
1206
+ }
1207
+ return(p);
1208
+ }
1209
+ example
1210
+ {
1211
+ "EXAMPLE:"; echo = 2;
1212
+ ring r = 0,(x,y),dp;
1213
+ vector v = gen(1) + 3*gen(3) + 22/9*gen(4);
1214
+ intvec iv = 3,2,1;
1215
+ vec2poly(v,2);
1216
+ vec2poly(iv);
1217
+ }
1218
+
1219
+ /*
1220
+ // // listofroots and addRoots aren't needed anymore due to some modifications
1221
+ //
1222
+ // static proc listofroots (list #)
1223
+ // {
1224
+ // def save = basering;
1225
+ // int n = nvars(save);
1226
+ // int i;
1227
+ // poly p;
1228
+ // if (typeof(#[1])=="vector")
1229
+ // {
1230
+ // vector b = #[1];
1231
+ // for (i=1; i<=nrows(b); i++)
1232
+ // {
1233
+ // p = p + b[i]*(var(1))^(i-1);
1234
+ // }
1235
+ // }
1236
+ // else
1237
+ // {
1238
+ // p = #[1];
1239
+ // }
1240
+ // int substitution = int(#[2]);
1241
+ // string s = safeVarName("s");
1242
+ // list RL = ringlist(save); RL = RL[1..4];
1243
+ // RL[2] = list(s); RL[3] = list(list("dp",intvec(1)),list("C",0));
1244
+ // def S = ring(RL); setring S;
1245
+ // ideal J;
1246
+ // for (i=1; i<=n; i++)
1247
+ // {
1248
+ // J[i] = var(1);
1249
+ // }
1250
+ // map @m = save,J;
1251
+ // poly p = @m(p);
1252
+ // if (substitution == 1)
1253
+ // {
1254
+ // p = subst(p,var(1),-var(1)-1);
1255
+ // }
1256
+ // // the rest of this proc is nicked from bernsteinBM from dmod.lib
1257
+ // list P = factorize(p);//with constants and multiplicities
1258
+ // ideal bs; intvec m; //the BS polynomial is monic, so we are not interested in constants
1259
+ // for (i=2; i<= size(P[1]); i++) //we delete P[1][1] and P[2][1]
1260
+ // {
1261
+ // bs[i-1] = P[1][i];
1262
+ // m[i-1] = P[2][i];
1263
+ // }
1264
+ // bs = normalize(bs);
1265
+ // bs = -subst(bs,var(1),0);
1266
+ // setring save;
1267
+ // ideal bs = imap(S,bs);
1268
+ // kill S;
1269
+ // list BS = bs,m;
1270
+ // return(BS);
1271
+ // }
1272
+ //
1273
+ //
1274
+ // static proc addRoot(number q, list L)
1275
+ // {
1276
+ // // add root to list in bFactor format
1277
+ // int i,qInL;
1278
+ // ideal I = L[1];
1279
+ // intvec v = L[2];
1280
+ // list LL;
1281
+ // if (v == 0)
1282
+ // {
1283
+ // I = poly(q);
1284
+ // v = 1;
1285
+ // LL = I,v;
1286
+ // }
1287
+ // else
1288
+ // {
1289
+ // for (i=1; i<=ncols(I); i++)
1290
+ // {
1291
+ // if (I[i] == q)
1292
+ // {
1293
+ // qInL = i;
1294
+ // break;
1295
+ // }
1296
+ // }
1297
+ // if (qInL)
1298
+ // {
1299
+ // v[qInL] = v[qInL] + 1;
1300
+ // }
1301
+ // else
1302
+ // {
1303
+ // I = q,I;
1304
+ // v = 1,v;
1305
+ // }
1306
+ // }
1307
+ // LL = I,v;
1308
+ // if (size(L) == 3) // irreducible factor
1309
+ // {
1310
+ // if (L[3] <> "0" && L[3] <> "1")
1311
+ // {
1312
+ // LL = LL + list(L[3]);
1313
+ // }
1314
+ // }
1315
+ // return(LL);
1316
+ // }
1317
+ */
1318
+
1319
+ static proc bfctengine (poly f, int inorann, int whichengine, int addPD, int stdsum, int methodord, int methodpIntersect, int pIntersectchar, int modengine, intvec u0)
1320
+ {
1321
+ int printlevelsave = printlevel;
1322
+ printlevel = printlevel + 1;
1323
+ int ppl = printlevel - voice + 2;
1324
+ int i;
1325
+ def save = basering;
1326
+ int n = nvars(save);
1327
+ if (isCommutative() == 0) { ERROR("basering must be commutative"); }
1328
+ if (char(save) <> 0) { ERROR("characteristic of basering has to be 0"); }
1329
+ list L = ringlist(save);
1330
+ int qr;
1331
+ if (L[4] <> 0) // qring
1332
+ {
1333
+ print("// basering is qring:");
1334
+ print("// discarding the quotient and proceeding...");
1335
+ L[4] = ideal(0);
1336
+ qr = 1;
1337
+ def save2 = ring(L); setring save2;
1338
+ poly f = imap(save,f);
1339
+ }
1340
+ if (inorann == 0) // bfct using initial ideal
1341
+ {
1342
+ // list L = ringlist(basering);
1343
+ intvec iv = valvars(f)[1]; // heuristacally better ordering for initialMalgrange
1344
+ list varL = L[2];
1345
+ varL = varL[iv];
1346
+ L[2] = varL;
1347
+ if (u0 <> 0)
1348
+ {
1349
+ u0 = u0[iv];
1350
+ }
1351
+ def newr = ring(L);
1352
+ kill varL,iv,L;
1353
+ setring newr;
1354
+ poly f = imap(save,f);
1355
+ dbprint(ppl,"// starting computation of the initial ideal of the Malgrange ideal...");
1356
+ def D = initialMalgrange(f,whichengine,methodord,u0);
1357
+ dbprint(ppl,"// ...done");
1358
+ setring D;
1359
+ ideal J = inF;
1360
+ kill inF;
1361
+ poly s = var(1)*var(n+2);
1362
+ }
1363
+ else // bfct using Ann(f^s)
1364
+ {
1365
+ dbprint(ppl,"// starting computation of the s-parametric annihilator...");
1366
+ def D = SannfsBFCT(f,addPD,whichengine,stdsum);
1367
+ dbprint(ppl,"// ...done");
1368
+ setring D;
1369
+ ideal J = LD;
1370
+ kill LD;
1371
+ poly s = var(1);
1372
+ }
1373
+ vector b;
1374
+ dbprint(ppl,"// starting to intersect with subalgebra...");
1375
+ // try it modular
1376
+ if (methodpIntersect <> 0) // pIntersectSyz
1377
+ {
1378
+ if (pIntersectchar == 0) // pIntersectSyz::modular
1379
+ {
1380
+ list L = ringlist(D);
1381
+ int lb = 10000; int ub = 536870909; // bounds for random primes
1382
+ list usedprimes;
1383
+ int sJ = size(J);
1384
+ int sLJq;
1385
+ ideal LJ;
1386
+ for (i=1; i<=sJ; i++)
1387
+ {
1388
+ LJ[i] = leadcoef(cleardenom(J[i]));
1389
+ }
1390
+ int short_save = short; // workaround for map Q(a_i) -> Z/q(a_i)
1391
+ short = 0;
1392
+ int nD = nvars(D);
1393
+ matrix @C[nD][nD] = L[5];
1394
+ matrix @D[nD][nD] = L[6];
1395
+ L = L[1..4];
1396
+ i = 1;
1397
+ while (b == 0)
1398
+ {
1399
+ dbprint(ppl,"// number of run in the loop: "+string(i));
1400
+ int q = prime(random(lb,ub));
1401
+ if (findFirst(usedprimes,q)==0) // if q has not been used already
1402
+ {
1403
+ usedprimes = usedprimes,q;
1404
+ dbprint(ppl,"// using prime: "+string(q));
1405
+ if (typeof(L[1]) == "int") { L[1] = q; }
1406
+ else { L[1][1] = q; } // parameters
1407
+ def @Rq = ring(L); setring @Rq;
1408
+ matrix @C=fetch(D,@C);
1409
+ matrix @D=fetch(D,@D);
1410
+ def Rq = nc_algebra(@C,@D); // def Rq = nc_algebra(1,@D);
1411
+ setring Rq; kill @Rq;
1412
+ ideal LJq=fetch(D,LJ);
1413
+ sLJq = size(LJq);
1414
+ setring D; kill Rq;
1415
+ if (sLJq <> sJ ) // detect unlucky prime
1416
+ {
1417
+ dbprint(ppl,"// " +string(q) + " is unlucky");
1418
+ b = 0;
1419
+ }
1420
+ else
1421
+ {
1422
+ b = pIntersectSyz(s,J,q,whichengine,modengine);
1423
+ }
1424
+ }
1425
+ i++;
1426
+ }
1427
+ short = short_save;
1428
+ }
1429
+ else // pIntersectSyz::non-modular
1430
+ {
1431
+ b = pIntersectSyz(s,J,0,whichengine);
1432
+ }
1433
+ }
1434
+ else // pIntersect: linReduce
1435
+ {
1436
+ b = pIntersect(s,J);
1437
+ }
1438
+ dbprint(ppl,"// ...done"); // with the intersection
1439
+ poly pb = vec2poly(b);
1440
+ if (inorann == 0)
1441
+ {
1442
+ pb = subst(pb,var(1),-var(1)-1);
1443
+ }
1444
+ else // bfctAnn
1445
+ {
1446
+ if (addPD)
1447
+ {
1448
+ pb = pb*(var(1)+1);
1449
+ }
1450
+ }
1451
+ list l = bFactor(pb);
1452
+ setring save;
1453
+ list l = imap(D,l);
1454
+ printlevel = printlevelsave;
1455
+ return(l);
1456
+ }
1457
+
1458
+ proc bfct (poly f, list #)
1459
+ "USAGE: bfct(f [,s,t,v]); f a poly, s,t optional ints, v an optional intvec
1460
+ RETURN: list of ideal and intvec
1461
+ PURPOSE: computes the roots of the Bernstein-Sato polynomial b(s)
1462
+ @* for the hypersurface defined by f.
1463
+ ASSUME: The basering is commutative and of characteristic 0.
1464
+ BACKGROUND: In this proc, the initial Malgrange ideal is computed according to
1465
+ @* the algorithm by Masayuki Noro and then a system of linear equations is
1466
+ @* solved by linear reductions.
1467
+ NOTE: In the output list, the ideal contains all the roots
1468
+ @* and the intvec their multiplicities.
1469
+ @* If s<>0, @code{std} is used for GB computations,
1470
+ @* otherwise, and by default, @code{slimgb} is used.
1471
+ @* If t<>0, a matrix ordering is used for Groebner basis computations,
1472
+ @* otherwise, and by default, a block ordering is used.
1473
+ @* If v is a positive weight vector, v is used for homogenization
1474
+ @* computations, otherwise and by default, no weights are used.
1475
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
1476
+ @* if printlevel>=2, all the debug messages will be printed.
1477
+ EXAMPLE: example bfct; shows examples
1478
+ "
1479
+ {
1480
+ int ppl = printlevel - voice +2;
1481
+ int i;
1482
+ int n = nvars(basering);
1483
+ // in # we have two switches:
1484
+ // one for the engine used for Groebner basis computations,
1485
+ // one for M() ordering or its realization
1486
+ // in # can also be the optional weight vector
1487
+ int whichengine = 0; // default
1488
+ int methodord = 0; // default
1489
+ intvec u0 = 0; // default
1490
+ if (size(#)>0)
1491
+ {
1492
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
1493
+ {
1494
+ whichengine = int(#[1]);
1495
+ }
1496
+ if (size(#)>1)
1497
+ {
1498
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
1499
+ {
1500
+ methodord = int(#[2]);
1501
+ }
1502
+ if (size(#)>2)
1503
+ {
1504
+ if (typeof(#[3])=="intvec" && size(#[3])==n && allPositive(#[3])==1)
1505
+ {
1506
+ u0 = #[3];
1507
+ }
1508
+ }
1509
+ }
1510
+ }
1511
+ list b = bfctengine(f,0,whichengine,0,0,methodord,0,0,0,u0);
1512
+ return(b);
1513
+ }
1514
+ example
1515
+ {
1516
+ "EXAMPLE:"; echo = 2;
1517
+ ring r = 0,(x,y),dp;
1518
+ poly f = x^2+y^3+x*y^2;
1519
+ bfct(f);
1520
+ intvec v = 3,2;
1521
+ bfct(f,1,0,v);
1522
+ }
1523
+
1524
+ proc bfctSyz (poly f, list #)
1525
+ "USAGE: bfctSyz(f [,r,s,t,u,v]); f poly, r,s,t,u optional ints, v opt. intvec
1526
+ RETURN: list of ideal and intvec
1527
+ PURPOSE: computes the roots of the Bernstein-Sato polynomial b(s)
1528
+ @* for the hypersurface defined by f
1529
+ ASSUME: The basering is commutative and of characteristic 0.
1530
+ BACKGROUND: In this proc, the initial Malgrange ideal is computed according to
1531
+ @* the algorithm by Masayuki Noro and then a system of linear equations is
1532
+ @* solved by computing syzygies.
1533
+ NOTE: In the output list, the ideal contains all the roots and the intvec
1534
+ @* their multiplicities.
1535
+ @* If r<>0, @code{std} is used for GB computations in characteristic 0,
1536
+ @* otherwise, and by default, @code{slimgb} is used.
1537
+ @* If s<>0, a matrix ordering is used for GB computations, otherwise,
1538
+ @* and by default, a block ordering is used.
1539
+ @* If t<>0, the computation of the intersection is solely performed over
1540
+ @* charasteristic 0, otherwise and by default, a modular method is used.
1541
+ @* If u<>0 and by default, @code{std} is used for GB computations in
1542
+ @* characteristic >0, otherwise, @code{slimgb} is used.
1543
+ @* If v is a positive weight vector, v is used for homogenization
1544
+ @* computations, otherwise and by default, no weights are used.
1545
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
1546
+ @* if printlevel>=2, all the debug messages will be printed.
1547
+ EXAMPLE: example bfctSyz; shows examples
1548
+ "
1549
+ {
1550
+ int ppl = printlevel - voice +2;
1551
+ int i;
1552
+ // in # we have four switches:
1553
+ // one for the engine used for Groebner basis computations in char 0,
1554
+ // one for M() ordering or its realization
1555
+ // one for a modular method when computing the intersection
1556
+ // and one for the engine used for Groebner basis computations in char >0
1557
+ // in # can also be the optional weight vector
1558
+ int n = nvars(basering);
1559
+ int whichengine = 0; // default
1560
+ int methodord = 0; // default
1561
+ int pIntersectchar = 0; // default
1562
+ int modengine = 1; // default
1563
+ intvec u0 = 0; // default
1564
+ if (size(#)>0)
1565
+ {
1566
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
1567
+ {
1568
+ whichengine = int(#[1]);
1569
+ }
1570
+ if (size(#)>1)
1571
+ {
1572
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
1573
+ {
1574
+ methodord = int(#[2]);
1575
+ }
1576
+ if (size(#)>2)
1577
+ {
1578
+ if (typeof(#[3])=="int" || typeof(#[3])=="number")
1579
+ {
1580
+ pIntersectchar = int(#[3]);
1581
+ }
1582
+ if (size(#)>3)
1583
+ {
1584
+ if (typeof(#[4])=="int" || typeof(#[4])=="number")
1585
+ {
1586
+ modengine = int(#[4]);
1587
+ }
1588
+ if (size(#)>4)
1589
+ {
1590
+ if (typeof(#[5])=="intvec" && size(#[5])==n && allPositive(#[5])==1)
1591
+ {
1592
+ u0 = #[5];
1593
+ }
1594
+ }
1595
+ }
1596
+ }
1597
+ }
1598
+ }
1599
+ list b = bfctengine(f,0,whichengine,0,0,methodord,1,pIntersectchar,modengine,u0);
1600
+ return(b);
1601
+ }
1602
+ example
1603
+ {
1604
+ "EXAMPLE:"; echo = 2;
1605
+ ring r = 0,(x,y),dp;
1606
+ poly f = x^2+y^3+x*y^2;
1607
+ bfctSyz(f);
1608
+ intvec v = 3,2;
1609
+ bfctSyz(f,0,1,1,0,v);
1610
+ }
1611
+
1612
+ proc bfctIdeal (ideal I, intvec w, list #)
1613
+ "USAGE: bfctIdeal(I,w[,s,t]); I an ideal, w an intvec, s,t optional ints
1614
+ RETURN: list of ideal and intvec
1615
+ PURPOSE: computes the roots of the global b-function of I w.r.t. the weight (-w,w).
1616
+ ASSUME: The basering is the n-th Weyl algebra in characteristic 0 and for all
1617
+ @* 1<=i<=n the identity var(i+n)*var(i)=var(i)*var(i+1)+1 holds, i.e. the
1618
+ @* sequence of variables is given by x(1),...,x(n),D(1),...,D(n),
1619
+ @* where D(i) is the differential operator belonging to x(i).
1620
+ @* Further we assume that I is holonomic.
1621
+ BACKGROUND: In this proc, the initial ideal of I is computed according to the
1622
+ @* algorithm by Masayuki Noro and then a system of linear equations is
1623
+ @* solved by linear reductions.
1624
+ NOTE: In the output list, say L,
1625
+ @* - L[1] of type ideal contains all the rational roots of a b-function,
1626
+ @* - L[2] of type intvec contains the multiplicities of above roots,
1627
+ @* - optional L[3] of type string is the part of b-function without rational roots.
1628
+ @* Note, that a b-function of degree 0 is encoded via L[1][1]=0, L[2]=0 and
1629
+ @* L[3] is 1 (for nonzero constant) or 0 (for zero b-function).
1630
+ @* If s<>0, @code{std} is used for GB computations in characteristic 0,
1631
+ @* otherwise, and by default, @code{slimgb} is used.
1632
+ @* If t<>0, a matrix ordering is used for GB computations, otherwise,
1633
+ @* and by default, a block ordering is used.
1634
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
1635
+ @* if printlevel>=2, all the debug messages will be printed.
1636
+ EXAMPLE: example bfctIdeal; shows examples
1637
+ "
1638
+ {
1639
+ int ppl = printlevel - voice +2;
1640
+ int i;
1641
+ def save = basering;
1642
+ int n = nvars(save) div 2;
1643
+ int whichengine = 0; // default
1644
+ int methodord = 0; // default
1645
+ if (size(#)>0)
1646
+ {
1647
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
1648
+ {
1649
+ whichengine = int(#[1]);
1650
+ }
1651
+ if (size(#)>1)
1652
+ {
1653
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
1654
+ {
1655
+ methodord = int(#[2]);
1656
+ }
1657
+ }
1658
+ }
1659
+ if (isWeyl()==0) { ERROR("basering is not a Weyl algebra"); }
1660
+ for (i=1; i<=n; i++)
1661
+ {
1662
+ if (bracket(var(i+n),var(i))<>1)
1663
+ {
1664
+ ERROR(string(var(i+n))+" is not a differential operator for " +string(var(i)));
1665
+ }
1666
+ }
1667
+ int isH = isHolonomic(I);
1668
+ if (isH<>1)
1669
+ {
1670
+ print("WARNING: given ideal is not holonomic");
1671
+ print("... setting bound for degree of b-function to 10 and proceeding");
1672
+ isH = 10;
1673
+ }
1674
+ else { isH = 0; } // no degree bound for pIntersect
1675
+ ideal J = initialIdealW(I,-w,w,whichengine,methodord);
1676
+ poly s;
1677
+ for (i=1; i<=n; i++)
1678
+ {
1679
+ s = s + w[i]*var(i)*var(n+i);
1680
+ }
1681
+ vector b = pIntersect(s,J,isH);
1682
+ list RL = ringlist(save); RL = RL[1..4];
1683
+ RL[2] = list(safeVarName("s"));
1684
+ RL[3] = list(list("dp",intvec(1)),list("C",intvec(0)));
1685
+ def @S = ring(RL); setring @S;
1686
+ vector b = imap(save,b);
1687
+ poly bs = vec2poly(b);
1688
+ list l = bFactor(bs);
1689
+ setring save;
1690
+ list l = imap(@S,l);
1691
+ return(l);
1692
+ }
1693
+ example
1694
+ {
1695
+ "EXAMPLE:"; echo = 2;
1696
+ ring @D = 0,(x,y,Dx,Dy),dp;
1697
+ def D = Weyl();
1698
+ setring D;
1699
+ ideal I = 3*x^2*Dy+2*y*Dx,2*x*Dx+3*y*Dy+6; I = std(I);
1700
+ intvec w1 = 0,1;
1701
+ intvec w2 = 2,3;
1702
+ bfctIdeal(I,w1);
1703
+ bfctIdeal(I,w2,0,1);
1704
+ ideal J = I[size(I)]; // J is not holonomic by construction
1705
+ bfctIdeal(J,w1); // b-function of D/J w.r.t. w1 is non-zero
1706
+ bfctIdeal(J,w2); // b-function of D/J w.r.t. w2 is zero
1707
+ }
1708
+
1709
+ proc bfctOneGB (poly f,list #)
1710
+ "USAGE: bfctOneGB(f [,s,t]); f a poly, s,t optional ints
1711
+ RETURN: list of ideal and intvec
1712
+ PURPOSE: computes the roots of the Bernstein-Sato polynomial b(s) for the
1713
+ @* hypersurface defined by f, using only one GB computation
1714
+ ASSUME: The basering is commutative and of characteristic 0.
1715
+ BACKGROUND: In this proc, the initial Malgrange ideal is computed based on the
1716
+ @* algorithm by Masayuki Noro and combined with an elimination ordering.
1717
+ NOTE: In the output list, the ideal contains all the roots and the intvec
1718
+ @* their multiplicities.
1719
+ @* If s<>0, @code{std} is used for the GB computation, otherwise,
1720
+ @* and by default, @code{slimgb} is used.
1721
+ @* If t<>0, a matrix ordering is used for GB computations,
1722
+ @* otherwise, and by default, a block ordering is used.
1723
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
1724
+ @* if printlevel>=2, all the debug messages will be printed.
1725
+ EXAMPLE: example bfctOneGB; shows examples
1726
+ "
1727
+ {
1728
+ int ppl = printlevel - voice +2;
1729
+ if (!isCommutative()) { ERROR("Basering must be commutative"); }
1730
+ def save = basering;
1731
+ int n = nvars(save);
1732
+ if (char(save) <> 0)
1733
+ {
1734
+ ERROR("characteristic of basering has to be 0");
1735
+ }
1736
+ list L = ringlist(save);
1737
+ int qr;
1738
+ if (L[4] <> 0) // qring?
1739
+ {
1740
+ print("// basering is qring:");
1741
+ print("// discarding the quotient and proceeding...");
1742
+ L[4] = ideal(0);
1743
+ qr = 1;
1744
+ def save2 = ring(L);
1745
+ setring save2;
1746
+ poly f = imap(save,f);
1747
+ }
1748
+ int N = 2*n+4;
1749
+ int i;
1750
+ int whichengine = 0; // default
1751
+ int methodord = 0; // default
1752
+ if (size(#)>0)
1753
+ {
1754
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
1755
+ {
1756
+ whichengine = int(#[1]);
1757
+ }
1758
+ if (size(#)>1)
1759
+ {
1760
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
1761
+ {
1762
+ methodord = int(#[2]);
1763
+ }
1764
+ }
1765
+ }
1766
+ // creating the homogenized extended Weyl algebra
1767
+ // create names for vars
1768
+ list Lvar;
1769
+ Lvar[1] = safeVarName("t");
1770
+ Lvar[2] = safeVarName("s");
1771
+ Lvar[n+3] = safeVarName("D"+Lvar[1]);
1772
+ Lvar[N] = safeVarName("h");
1773
+ for (i=1; i<=n; i++)
1774
+ {
1775
+ Lvar[i+2] = string(var(i));
1776
+ Lvar[i+n+3] = safeVarName("D" + string(var(i)));
1777
+ }
1778
+ // create ordering
1779
+ intvec uv = -1; uv[n+3] = 1; uv[N] = 0;
1780
+ intvec @a = 1:N; @a[2] = 2;
1781
+ intvec @a2 = @a; @a2[2] = 0; @a2[2*n+4] = 0;
1782
+ list Lord;
1783
+ Lord[1] = list("a",@a); Lord[2] = list("a",@a2);
1784
+ if (methodord == 0) // default: block ordering
1785
+ {
1786
+ //ring @Dh = 0,(t,s,x(n..1),Dt,D(n..1),h),(a(@a),a(@a2),a(uv),dp(N-1),lp(1));
1787
+ Lord[3] = list("a",uv);
1788
+ Lord[4] = list("dp",intvec(1:(N-1)));
1789
+ Lord[5] = list("lp",intvec(1));
1790
+ Lord[6] = list("C",intvec(0));
1791
+ }
1792
+ else // M() ordering
1793
+ {
1794
+ intmat @Ord[N][N];
1795
+ @Ord[1,1..N] = uv; @Ord[2,1..N] = 1:(N-1);
1796
+ for (i=1; i<=N-2; i++) { @Ord[2+i,N - i] = -1; }
1797
+ dbprint(ppl,"// weights for ordering: "+string(transpose(@a)));
1798
+ dbprint(ppl,"// the ordering matrix:",@Ord);
1799
+ //ring @Dh = 0,(t,s,x(n..1),Dt,D(n..1),h),(a(@a),a(@a2),M(@Ord));
1800
+ Lord[3] = list("M",intvec(@Ord));
1801
+ Lord[4] = list("C",intvec(0));
1802
+ }
1803
+ // create commutative ring
1804
+ list L@Dh = ringlist(basering);
1805
+ L@Dh = L@Dh[1..4]; // if basering is commutative nc_algebra
1806
+ L@Dh[2] = Lvar; L@Dh[3] = Lord;
1807
+ def @Dh = ring(L@Dh); setring @Dh;
1808
+ dbprint(ppl,"// the ring @Dh:",@Dh);
1809
+ // create non-commutative relations
1810
+ matrix @relD[N][N];
1811
+ @relD[1,2] = var(1)*var(N)^2; // s*t = t*s + t*h^2
1812
+ @relD[2,n+3] = var(n+3)*var(N)^2; // Dt*s = s*Dt+Dt*h^2
1813
+ @relD[1,n+3] = var(N)^2;
1814
+ for (i=1; i<=n; i++)
1815
+ {
1816
+ @relD[i+2,n+3+i] = var(N)^2;
1817
+ }
1818
+ dbprint(ppl,"// nc relations:",@relD);
1819
+ def Dh = nc_algebra(1,@relD);
1820
+ setring Dh; kill @Dh;
1821
+ dbprint(ppl,"// computing in ring",Dh);
1822
+ poly f = imap(save,f);
1823
+ f = homog(f,h);
1824
+ // create the Malgrange ideal
1825
+ ideal I = var(1) - f, var(1)*var(n+3) - var(2);
1826
+ for (i=1; i<=n; i++)
1827
+ {
1828
+ I[3+i] = var(i+n+3)+diff(f,var(i+2))*var(n+3);
1829
+ }
1830
+ dbprint(ppl-1, "// the Malgrange ideal: " +string(I));
1831
+ // the hard part: Groebner basis computation
1832
+ dbprint(ppl, "// starting Groebner basis computation with engine: "+string(whichengine));
1833
+ I = engine(I, whichengine);
1834
+ dbprint(ppl, "// finished Groebner basis computation");
1835
+ I = subst(I,h,1); // dehomogenization
1836
+ dbprint(ppl-1,string(I));
1837
+ // 3.3 the initial form
1838
+ I = inForm(I,uv);
1839
+ dbprint(ppl, "// the initial ideal:", string(matrix(I)));
1840
+ // read off the solution
1841
+ intvec tonselect = 1;
1842
+ for (i=3; i<=2*n+4; i++) { tonselect = tonselect,i; }
1843
+ I = nselect(I,tonselect);
1844
+ dbprint(ppl, "// generators containing only s:", string(matrix(I)));
1845
+ I = engine(I, whichengine); // is now a principal ideal;
1846
+ if (qr == 1) { setring save2; }
1847
+ else { setring save; }
1848
+ ideal J; J[2] = var(1);
1849
+ map @m = Dh,J;
1850
+ ideal I = @m(I);
1851
+ poly p = I[1];
1852
+ p = subst(p,var(1),-var(1)-1);
1853
+ list l = bFactor(p);
1854
+ if (qr == 1)
1855
+ {
1856
+ setring save;
1857
+ list l = imap(save2,l);
1858
+ }
1859
+ return(l);
1860
+ }
1861
+ example
1862
+ {
1863
+ "EXAMPLE:"; echo = 2;
1864
+ ring r = 0,(x,y),dp;
1865
+ poly f = x^2+y^3+x*y^2;
1866
+ bfctOneGB(f);
1867
+ bfctOneGB(f,1,1);
1868
+ }
1869
+
1870
+
1871
+
1872
+ proc bfctAnn (poly f, list #)
1873
+ "USAGE: bfctAnn(f [,a,b,c]); f a poly, a, b, c optional ints
1874
+ RETURN: list of ideal and intvec
1875
+ PURPOSE: computes the roots of the Bernstein-Sato polynomial b(s) for the
1876
+ @* hypersurface defined by f.
1877
+ ASSUME: The basering is commutative and of characteristic 0.
1878
+ BACKGROUND: In this proc, Ann(f^s) is computed and then a system of linear
1879
+ @* equations is solved by linear reductions.
1880
+ NOTE: In the output list, the ideal contains all the roots and the intvec
1881
+ @* their multiplicities.
1882
+ @* If a<>0, only f is appended to Ann(f^s), otherwise, and by default,
1883
+ @* f and all its partial derivatives are appended.
1884
+ @* If b<>0, @code{std} is used for GB computations, otherwise, and by
1885
+ @* default, @code{slimgb} is used.
1886
+ @* If c<>0, @code{std} is used for Groebner basis computations of ideals
1887
+ @* <I+J> when I is already a Groebner basis of <I>.
1888
+ @* Otherwise, and by default the engine determined by the switch b is used.
1889
+ @* Note that in the case c<>0, the choice for b will be overwritten only
1890
+ @* for the types of ideals mentioned above.
1891
+ @* This means that if b<>0, specifying c has no effect.
1892
+ DISPLAY: If printlevel=1, progress debug messages will be printed,
1893
+ @* if printlevel>=2, all the debug messages will be printed.
1894
+ EXAMPLE: example bfctAnn; shows examples
1895
+ "
1896
+ {
1897
+ def save = basering;
1898
+ int ppl = printlevel - voice + 2;
1899
+ int addPD = 1; // default
1900
+ int whichengine = 0; // default
1901
+ int stdsum = 0; // default
1902
+ if (size(#)>0)
1903
+ {
1904
+ if (typeof(#[1])=="int" || typeof(#[1])=="number")
1905
+ {
1906
+ addPD = int(#[1]);
1907
+ }
1908
+ if (size(#)>1)
1909
+ {
1910
+ if (typeof(#[2])=="int" || typeof(#[2])=="number")
1911
+ {
1912
+ whichengine = int(#[2]);
1913
+ }
1914
+ if (size(#)>2)
1915
+ {
1916
+ if (typeof(#[3])=="int" || typeof(#[3])=="number")
1917
+ {
1918
+ stdsum = int(#[3]);
1919
+ }
1920
+ }
1921
+ }
1922
+ }
1923
+ list b = bfctengine(f,1,whichengine,addPD,stdsum,0,0,0,0,0);
1924
+ return(b);
1925
+ }
1926
+ example
1927
+ {
1928
+ "EXAMPLE:"; echo = 2;
1929
+ ring r = 0,(x,y),dp;
1930
+ poly f = x^2+y^3+x*y^2;
1931
+ bfctAnn(f);
1932
+ def R = reiffen(4,5); setring R;
1933
+ RC; // the Reiffen curve in 4,5
1934
+ bfctAnn(RC,0,1);
1935
+ }
1936
+
1937
+ /*
1938
+ static proc hardexamples ()
1939
+ {
1940
+ // some hard examples
1941
+ ring r1 = 0,(x,y,z,w),dp;
1942
+ // ab34
1943
+ poly ab34 = (z3+w4)*(3z2x+4w3y);
1944
+ bfct(ab34);
1945
+ // ha3
1946
+ poly ha3 = xyzw*(x+y)*(x+z)*(x+w)*(y+z+w);
1947
+ bfct(ha3);
1948
+ // ha4
1949
+ poly ha4 = xyzw*(x+y)*(x+z)*(x+w)*(y+z)*(y+w);
1950
+ bfct(ha4);
1951
+ // chal4: reiffen(4,5)*reiffen(5,4)
1952
+ ring r2 = 0,(x,y),dp;
1953
+ poly chal4 = (x4+xy4+y5)*(x5+x4y+y4);
1954
+ bfct(chal4);
1955
+ // (xy+z)*reiffen(4,5)
1956
+ ring r3 = 0,(x,y,z),dp;
1957
+ poly xyzreiffen45 = (xy+z)*(y4+yz4+z5);
1958
+ bfct(xyzreiffen45);
1959
+
1960
+ // sparse ideal as suggested by Alex; gives 1 as std
1961
+ ideal I1 = 28191*y^2+14628*x*Dy, 24865*x^2+24072*x*Dx+17756*Dy^2;
1962
+ std(I1);
1963
+ }
1964
+ */