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,2127 @@
1
+ ///////////////////////////////////////////////////////////////////////
2
+ version="version equising.lib 4.4.0.6 Oct_2024 "; // $Id: 3688e8b0af5cae69265251bb9b3019141eb319a0 $
3
+ category="Singularities";
4
+ info="
5
+ LIBRARY: equising.lib Equisingularity Stratum of a Family of Plane Curves
6
+ AUTHOR: Christoph Lossen, lossen@mathematik.uni-kl.de
7
+ Andrea Mindnich, mindnich@mathematik.uni-kl.de
8
+
9
+ PROCEDURES:
10
+ tau_es(f); codim of mu-const stratum in semi-universal def. base
11
+ esIdeal(f); (Wahl's) equisingularity ideal of f
12
+ esStratum(F[,m,L]); equisingularity stratum of a family F
13
+ isEquising(F[,m,L]); tests if a given deformation is equisingular
14
+
15
+ control_Matrix(M); computes list of blowing-up data
16
+ ";
17
+
18
+ LIB "hnoether.lib";
19
+ LIB "polylib.lib";
20
+ LIB "elim.lib";
21
+ LIB "deform.lib";
22
+ LIB "sing.lib";
23
+
24
+ ////////////////////////////////////////////////////////////////////////////////
25
+ //
26
+ // The following (static) procedures are used by esComputation
27
+ //
28
+ ////////////////////////////////////////////////////////////////////////////////
29
+ // COMPUTES a weight vector. x and y get weight 1 and all other
30
+ // variables get weight 0.
31
+ static proc xyVector()
32
+ {
33
+ intvec iv ;
34
+ iv[nvars(basering)]=0 ;
35
+ iv[rvar(x)] =1;
36
+ iv[rvar(y)] =1;
37
+ return (iv);
38
+ }
39
+
40
+ ////////////////////////////////////////////////////////////////////////////////
41
+ // exchanges the variables x and y in the polynomial f
42
+ static proc swapXY(poly f)
43
+ {
44
+ def r_base = basering;
45
+ ideal MI = maxideal(1);
46
+ MI[rvar(x)]=y;
47
+ MI[rvar(y)]=x;
48
+ map phi = r_base, MI;
49
+ f=phi(f);
50
+ return (f);
51
+ }
52
+
53
+ ////////////////////////////////////////////////////////////////////////////////
54
+ // computes m-jet w.r.t. the variables x,y (other variables weighted 0
55
+ static proc m_Jet(poly F,int m);
56
+ {
57
+ intvec w=xyVector();
58
+ poly Fd=jet(F,m,w);
59
+ return(Fd);
60
+ }
61
+
62
+
63
+ ////////////////////////////////////////////////////////////////////////////////
64
+ // computes the 4 control matrices (input is multsequence(L))
65
+ proc control_Matrix(list M);
66
+ "USAGE: control_Matrix(L); L list
67
+ ASSUME: L is the output of multsequence(hnexpansion(f)).
68
+ RETURN: list M of 4 intmat's:
69
+ @format
70
+ M[1] contains the multiplicities at the respective infinitely near points
71
+ p[i,j] (i=step of blowup+1, j=branch) -- if branches j=k,...,k+m pass
72
+ through the same p[i,j] then the multiplicity is stored in M[1][k,j],
73
+ while M[1][k+1]=...=M[1][k+m]=0.
74
+ M[2] contains the number of branches meeting at p[i,j] (again, the information
75
+ is stored according to the above rule)
76
+ M[3] contains the information about the splitting of M[1][i,j] with respect to
77
+ different tangents of branches at p[i,j] (information is stored only for
78
+ minimal j>=k corresponding to a new tangent direction).
79
+ The entries are the sum of multiplicities of all branches with the
80
+ respective tangent.
81
+ M[4] contains the maximal sum of higher multiplicities for a branch passing
82
+ through p[i,j] ( = degree Bound for blowing up)
83
+ @end format
84
+ NOTE: the branches are ordered in such a way that only consecutive branches
85
+ can meet at an infinitely near point. @*
86
+ the final rows of the matrices M[1],...,M[3] is (1,1,1,...,1), and
87
+ correspond to infinitely near points such that the strict transforms
88
+ of the branches are smooth and intersect the exceptional divisor
89
+ transversally.
90
+ SEE ALSO: multsequence
91
+ EXAMPLE: example control_Matrix; shows an example
92
+ "
93
+ {
94
+ int i,j,k,dummy;
95
+
96
+ dummy=0;
97
+ for (j=1;j<=ncols(M[2]);j++)
98
+ {
99
+ dummy=dummy+M[1][nrows(M[1])-1,j]-M[1][nrows(M[1]),j];
100
+ }
101
+ intmat S[nrows(M[1])+dummy][ncols(M[1])];
102
+ intmat T[nrows(M[1])+dummy][ncols(M[1])];
103
+ intmat U[nrows(M[1])+dummy][ncols(M[1])];
104
+ intmat maxDeg[nrows(M[1])+dummy][ncols(M[1])];
105
+
106
+ for (i=1;i<=nrows(M[2]);i++)
107
+ {
108
+ dummy=1;
109
+ for (j=1;j<=ncols(M[2]);j++)
110
+ {
111
+ for (k=dummy;k<dummy+M[2][i,j];k++)
112
+ {
113
+ T[i,dummy]=T[i,dummy]+1;
114
+ S[i,dummy]=S[i,dummy]+M[1][i,k];
115
+ if (i>1)
116
+ {
117
+ U[i-1,dummy]=U[i-1,dummy]+M[1][i-1,k];
118
+ }
119
+ }
120
+ dummy=k;
121
+ }
122
+ }
123
+
124
+ // adding an extra row (in some cases needed to control ES-Stratum
125
+ // computation)
126
+ for (i=nrows(M[1]);i<=nrows(S);i++)
127
+ {
128
+ for (j=1;j<=ncols(M[2]);j++)
129
+ {
130
+ S[i,j]=1;
131
+ T[i,j]=1;
132
+ U[i,j]=1;
133
+ }
134
+ }
135
+
136
+ // Computing the degree Bounds to be stored in M[4]:
137
+ for (i=1;i<=nrows(S);i++)
138
+ {
139
+ dummy=1;
140
+ for (j=1;j<=ncols(S);j++)
141
+ {
142
+ for (k=dummy;k<dummy+T[i,j];k++)
143
+ {
144
+ maxDeg[i,k]=S[i,dummy]; // multiplicity at i-th blowup
145
+ }
146
+ dummy=k;
147
+ }
148
+ }
149
+ // adding up multiplicities
150
+ for (i=nrows(S);i>=2;i--)
151
+ {
152
+ for (j=1;j<=ncols(S);j++)
153
+ {
154
+ maxDeg[i-1,j]=maxDeg[i-1,j]+maxDeg[i,j];
155
+ }
156
+ }
157
+
158
+ list L=S,T,U,maxDeg;
159
+ return(L);
160
+ }
161
+
162
+
163
+ ////////////////////////////////////////////////////////////////////////////////
164
+ // matrix of higher tangent directions:
165
+ // returns list: 1) tangent directions
166
+ // 2) swapping information (x <--> y)
167
+ static proc inf_Tangents(list L,int s); // L aus hnexpansion,
168
+ {
169
+ int nv=nvars(basering);
170
+ matrix M;
171
+ matrix B[s][size(L)];
172
+ intvec V;
173
+ intmat Mult=multsequence(L)[1];
174
+
175
+ int i,j,k,counter,e;
176
+ for (k=1;k<=size(L);k++)
177
+ {
178
+ V[k]=L[k][3]; // switch: 0 --> tangent 2nd parameter
179
+ // 1 --> tangent 1st parameter
180
+ e=0;
181
+ M=L[k][1];
182
+ counter=1;
183
+ B[counter,k]=M[1,1];
184
+
185
+ for (i=1;i<=nrows(M);i++)
186
+ {
187
+ for (j=2;j<=ncols(M);j++)
188
+ {
189
+ counter=counter+1;
190
+ if (M[i,j]==var(nv-1))
191
+ {
192
+ if (i<>nrows(M))
193
+ {
194
+ B[counter,k]=M[i,j];
195
+ j=ncols(M)+1; // goto new row of HNmatrix...
196
+ if (counter<>s)
197
+ {
198
+ if (counter+1<=nrows(Mult))
199
+ {
200
+ e=Mult[counter-1,k]-Mult[counter,k]-Mult[counter+1,k];
201
+ }
202
+ else
203
+ {
204
+ e=Mult[counter-1,k]-Mult[counter,k]-1;
205
+ }
206
+ }
207
+ }
208
+ else
209
+ {
210
+ B[counter,k]=0;
211
+ j=ncols(M)+1; // goto new row of HNmatrix...
212
+ }
213
+ }
214
+ else
215
+ {
216
+ if (e<=0)
217
+ {
218
+ B[counter,k]=M[i,j];
219
+ }
220
+ else // point is still proximate to an earlier point
221
+ {
222
+ B[counter,k]=y; // marking proximity (without swap....)
223
+ if (counter+1<=nrows(Mult))
224
+ {
225
+ e=e-Mult[counter+1,k];
226
+ }
227
+ else
228
+ {
229
+ e=e-1;
230
+ }
231
+ }
232
+ }
233
+
234
+ if (counter==s) // given number of points determined
235
+ {
236
+ j=ncols(M)+1;
237
+ i=nrows(M)+1;
238
+ // leave procedure
239
+ }
240
+ }
241
+ }
242
+ }
243
+ L=B,V;
244
+ return(L);
245
+ }
246
+
247
+ ////////////////////////////////////////////////////////////////////////////////
248
+ // compute "good" upper bound for needed number of help variables
249
+ //
250
+ static proc Determine_no_b(intmat U,matrix B)
251
+ // U is assumed to be 3rd output of control_Matrix
252
+ // B is assumed to be 1st output of inf_Tangents
253
+ {
254
+ int nv=nvars(basering);
255
+ int i,j,counter;
256
+ for (j=1;j<=ncols(U);j++)
257
+ {
258
+ for (i=1;i<=nrows(U);i++)
259
+ {
260
+ if (U[i,j]>1)
261
+ {
262
+ if (B[i,j]<>var(nv-1) and B[i,j]<>var(nv))
263
+ {
264
+ counter=counter+1;
265
+ }
266
+ }
267
+
268
+ }
269
+ }
270
+ counter=counter+ncols(U);
271
+ return(counter);
272
+ }
273
+
274
+ ////////////////////////////////////////////////////////////////////////////////
275
+ // compute number of infinitely near free points corresponding to non-zero
276
+ // entries in control_Matrix[1] (except first row)
277
+ //
278
+ static proc no_freePoints(intmat Mult,matrix B)
279
+ // Mult is assumed to be 1st output of control_Matrix
280
+ // U is assumed to be 3rd output of control_Matrix
281
+ // B is assumed to be 1st output of inf_Tangents
282
+ {
283
+ int i,j,k,counter;
284
+ for (j=1;j<=ncols(Mult);j++)
285
+ {
286
+ for (i=2;i<=nrows(Mult);i++)
287
+ {
288
+ if (Mult[i,j]>=1)
289
+ {
290
+ if (B[i-1,j]<>x and B[i-1,j]<>y)
291
+ {
292
+ counter=counter+1;
293
+ }
294
+ }
295
+ }
296
+ }
297
+ return(counter);
298
+ }
299
+
300
+
301
+ ///////////////////////////////////////////////////////////////////////////////
302
+ // COMPUTES string(minpoly) and substitutes the parameter by newParName
303
+ static proc makeMinPolyString (string newParName)
304
+ {
305
+ int i;
306
+ string parName = parstr(basering);
307
+ int parNameSize = size(parName);
308
+
309
+ string oldMinPolyStr = string (minpoly);
310
+ int minPolySize = size(oldMinPolyStr);
311
+
312
+ string newMinPolyStr = "";
313
+
314
+ for (i=1;i <= minPolySize; i++)
315
+ {
316
+ if (oldMinPolyStr[i,parNameSize] == parName)
317
+ {
318
+ newMinPolyStr = newMinPolyStr + newParName;
319
+ i = i + parNameSize-1;
320
+ }
321
+ else
322
+ {
323
+ newMinPolyStr = newMinPolyStr + oldMinPolyStr[i];
324
+ }
325
+ }
326
+
327
+ return(newMinPolyStr);
328
+ }
329
+
330
+ ///////////////////////////////////////////////////////////////////////////////
331
+ //
332
+ // DEFINES: A new basering, "myRing",
333
+ // with new names for the parameters and variables.
334
+ // The new names for the parameters are a(1..k),
335
+ // and t(1..s),x,y for the variables
336
+ // The ring ordering is ordStr.
337
+ // NOTE: This proc uses 'execute'.
338
+ static proc createMyRing_new(poly p_F, string ordStr,
339
+ string minPolyStr, int no_b)
340
+ {
341
+ def r_old = basering;
342
+
343
+ int chara = char(basering);
344
+ string charaStr;
345
+ int i;
346
+ string helpStr;
347
+ int nDefParams = nvars(r_old)-2;
348
+
349
+ ideal qIdeal = ideal(basering);
350
+
351
+ if ((npars(basering)==0) and (minPolyStr==""))
352
+ {
353
+ helpStr = "ring myRing1 ="
354
+ + string(chara)+ ", (t(1..nDefParams), x, y),("+ ordStr +");";
355
+ execute(helpStr);
356
+ }
357
+ else
358
+ {
359
+ charaStr = charstr(basering);
360
+ if ((charaStr == string(chara) + "," + parstr(basering)) or (minPolyStr<>""))
361
+ {
362
+ if (minPolyStr<>"")
363
+ {
364
+ helpStr = "ring myRing1 =
365
+ (" + string(chara) + ",a),
366
+ (t(1..nDefParams), x, y),(" + ordStr + ");";
367
+ execute(helpStr);
368
+
369
+ execute (minPolyStr);
370
+ }
371
+ else // no minpoly given
372
+ {
373
+ helpStr = "ring myRing1 =
374
+ (" + string(chara) + ",a(1..npars(basering)) ),
375
+ (t(1..nDefParams), x, y),(" + ordStr + ");";
376
+ execute(helpStr);
377
+ }
378
+ }
379
+ else
380
+ {
381
+ // ground field is of type (p^k,a)....
382
+ i = find (charaStr,",");
383
+ helpStr = "ring myRing1 = (" + charaStr[1,i] + "a),
384
+ (t(1..nDefParams), x, y),(" + ordStr + ");";
385
+ execute (helpStr);
386
+ }
387
+ }
388
+
389
+ ideal mIdeal = maxideal(1);
390
+ ideal qIdeal = fetch(r_old, qIdeal);
391
+ poly p_F = fetch(r_old, p_F);
392
+ export p_F,mIdeal;
393
+
394
+ // Extension by no_b auxiliary variables
395
+ if (no_b>0)
396
+ {
397
+ if (npars(basering) == 0)
398
+ {
399
+ ordStr = "(dp("+string(no_b)+"),"+ordStr+")";
400
+ helpStr = "ring myRing ="
401
+ + string(chara)+ ", (b(1..no_b), t(1..nDefParams), x, y),"
402
+ + ordStr +";";
403
+ execute(helpStr);
404
+ }
405
+ else
406
+ {
407
+ charaStr = charstr(basering);
408
+ if (charaStr == string(chara) + "," + parstr(basering))
409
+ {
410
+ if (minpoly !=0)
411
+ {
412
+ ordStr = "(dp(" + string(no_b) + ")," + ordStr + ")";
413
+ minPolyStr = makeMinPolyString("a");
414
+ helpStr = "ring myRing =
415
+ (" + string(chara) + ",a),
416
+ (b(1..no_b), t(1..nDefParams), x, y)," + ordStr + ";";
417
+ execute(helpStr);
418
+
419
+ helpStr = "minpoly =" + minPolyStr + ";";
420
+ execute (helpStr);
421
+ }
422
+ else // no minpoly given
423
+ {
424
+ ordStr = "(dp(" + string(no_b) + ")," + ordStr + ")";
425
+ helpStr = "ring myRing =
426
+ (" + string(chara) + ",a(1..npars(basering)) ),
427
+ (b(1..no_b), t(1..nDefParams), x, y)," + ordStr + ";";
428
+ execute(helpStr);
429
+ }
430
+ }
431
+ else
432
+ {
433
+ i = find (charaStr,",");
434
+ ordStr = "(dp(" + string(no_b) + ")," + ordStr + ")";
435
+ helpStr = "ring myRing =
436
+ (" + charaStr[1,i] + "a),
437
+ (b(1..no_b), t(1..nDefParams), x, y)," + ordStr + ";";
438
+ execute (helpStr);
439
+ }
440
+ }
441
+ ideal qIdeal = imap(myRing1, qIdeal);
442
+
443
+ if(size(qIdeal) != 0)
444
+ {
445
+ def r_base = basering;
446
+ setring r_base;
447
+ kill myRing;
448
+ qring myRing = std(qIdeal);
449
+ }
450
+
451
+ poly p_F = imap(myRing1, p_F);
452
+ ideal mIdeal = imap(myRing1, mIdeal);
453
+ export p_F,mIdeal;
454
+ kill myRing1;
455
+ }
456
+ else
457
+ {
458
+ if(size(qIdeal) != 0)
459
+ {
460
+ def r_base = basering;
461
+ setring r_base;
462
+ kill myRing1;
463
+ qring myRing = std(qIdeal);
464
+ poly p_F = imap(myRing1, p_F);
465
+ ideal mIdeal = imap(myRing1, mIdeal);
466
+ export p_F,mIdeal;
467
+ }
468
+ else
469
+ {
470
+ def myRing=myRing1;
471
+ }
472
+ kill myRing1;
473
+ }
474
+
475
+ setring r_old;
476
+ return(myRing);
477
+ }
478
+
479
+ ////////////////////////////////////////////////////////////////////////////////
480
+ // returns list of coef, leadmonomial
481
+ //
482
+ static proc determine_coef (poly Fm)
483
+ {
484
+ def r_base = basering; // is assumed to be the result of createMyRing
485
+
486
+ int chara = char(basering);
487
+ string charaStr;
488
+ int i;
489
+ string minPolyStr = "";
490
+ string helpStr = "";
491
+
492
+ if (npars(basering) == 0)
493
+ {
494
+ ring myRing1 = create_ring("("+string(chara)+")", "(y,x)", "ds");
495
+ }
496
+ else
497
+ {
498
+ charaStr = charstr(basering);
499
+ if (charaStr == string(chara) + "," + parstr(basering))
500
+ {
501
+ if (minpoly !=0)
502
+ {
503
+ minPolyStr = makeMinPolyString("a");
504
+ ring myRing1 = create_ring("(" + string(chara) + ",a)", "(y,x)", "ds");
505
+
506
+ helpStr = "minpoly =" + minPolyStr + ";";
507
+ execute (helpStr);
508
+ }
509
+ else // no minpoly given
510
+ {
511
+ list l5;
512
+ for (int zz = 1; zz <= npars(basering); zz++)
513
+ {
514
+ l5[size(l5)+1] = "a("+string(zz)+")";
515
+ }
516
+ ring myRing1 = create_ring("("+string(chara)+","+string(l5)+")", "(y,x)", "ds");
517
+ }
518
+ }
519
+ else
520
+ {
521
+ i = find (charaStr,",");
522
+
523
+ ring myRing1 = create_ring("(" + charaStr[1,i] + ",a)", "(y,x)", "ds");
524
+ }
525
+ }
526
+ poly f=imap(r_base,Fm);
527
+ poly g=leadmonom(f);
528
+ setring r_base;
529
+ poly g=imap(myRing1,g);
530
+ kill myRing1;
531
+ def M=coef(Fm,xy);
532
+
533
+ for (i=1; i<=ncols(M); i++)
534
+ {
535
+ if (M[1,i]==g)
536
+ {
537
+ poly h=M[2,i]; // determine coefficient of leading monomial (in K[t])
538
+ i=ncols(M)+1;
539
+ }
540
+ }
541
+ return(list(h,g));
542
+ }
543
+
544
+ ///////////////////////////////////////////////////////////////////////////////
545
+ // RETURNS: 1, if p_f = 0 or char(basering) divides the order of p_f
546
+ // or p_f is not squarefree.
547
+ // 0, otherwise
548
+ static proc checkPoly (poly p_f)
549
+ {
550
+ int i_print = printlevel - voice + 3;
551
+ int i_ord;
552
+
553
+ if (p_f == 0)
554
+ {
555
+ print("Input is a 'deformation' of the zero polynomial!");
556
+ return(1);
557
+ }
558
+
559
+ i_ord = mindeg1(p_f);
560
+
561
+ if (number(i_ord) == 0)
562
+ {
563
+ print("Characteristic of coefficient field "
564
+ +"divides order of zero-fiber !");
565
+ return(1);
566
+ }
567
+
568
+ if (squarefree(p_f) != p_f)
569
+ {
570
+ print("Original polynomial (= zero-fiber) is not reduced!");
571
+ return(1);
572
+ }
573
+
574
+ return(0);
575
+ }
576
+
577
+ ////////////////////////////////////////////////////////////////////////////////
578
+ static proc make_ring_small(ideal J)
579
+ // returns varstr for new ring, the map and the number of vars
580
+ {
581
+ attrib(J,"isSB",1);
582
+ int counter=0;
583
+ ideal newmap;
584
+ string newvar="";
585
+ for (int i=1; i<=nvars(basering); i++)
586
+ {
587
+ if (reduce(var(i),J)<>0)
588
+ {
589
+ newmap[i]=var(i);
590
+
591
+ if (newvar=="")
592
+ {
593
+ newvar=newvar+string(var(i));
594
+ counter=counter+1;
595
+ }
596
+ else
597
+ {
598
+ newvar=newvar+","+string(var(i));
599
+ counter=counter+1;
600
+ }
601
+ }
602
+ else
603
+ {
604
+ newmap[i]=0;
605
+ }
606
+ }
607
+ list L=newvar,newmap,counter;
608
+ attrib(J,"isSB",0);
609
+ return(L);
610
+ }
611
+
612
+ ///////////////////////////////////////////////////////////////////////////////
613
+ // The following procedure is called by esStratum (typ=0), resp. by
614
+ // isEquising (typ=1)
615
+ ///////////////////////////////////////////////////////////////////////////////
616
+
617
+ static proc esComputation (int typ, poly p_F, list #)
618
+ {
619
+ // Initialize variables
620
+ int branch=1;
621
+ int blowup=1;
622
+ int auxVar=1;
623
+ int nVars;
624
+
625
+ intvec upper_bound, upper_bound_old, fertig, soll;
626
+ list blowup_string;
627
+ int i_print= printlevel-voice+2;
628
+
629
+ int no_b, number_of_branches, swapped;
630
+ int i,j,k,m, counter, dummy;
631
+ string helpStr = "";
632
+ string ordStr = "";
633
+ string MinPolyStr = "";
634
+
635
+ if (nvars(basering)<=2)
636
+ {
637
+ print("family is trivial (no deformation parameters)!");
638
+ if (typ==1) //isEquising
639
+ {
640
+ return(1);
641
+ }
642
+ else
643
+ {
644
+ return(list(ideal(0),0));
645
+ }
646
+ }
647
+
648
+ if (size(#)>0)
649
+ {
650
+ if (typeof(#[1])=="int")
651
+ {
652
+ def artin_bd=#[1]; // compute modulo maxideal(artin_bd)
653
+ if (artin_bd <= 1)
654
+ {
655
+ print("Do you really want to compute over Basering/maxideal("
656
+ +string(artin_bd)+") ?");
657
+ print("No computation performed !");
658
+ if (typ==1) //isEquising
659
+ {
660
+ return(1);
661
+ }
662
+ else
663
+ {
664
+ return(list(ideal(0),int(1)));
665
+ }
666
+ }
667
+ if (size(#)>1)
668
+ {
669
+ if (typeof(#[2])=="list")
670
+ {
671
+ def @L=#[2]; // is assumed to be the Hamburger-Noether matrix
672
+ }
673
+ }
674
+ }
675
+ else
676
+ {
677
+ if (typeof(#)=="list")
678
+ {
679
+ def @L=#; // is assumed to be the Hamburger-Noether matrix
680
+ }
681
+ }
682
+ }
683
+ intvec ov=option(get); // store options
684
+ option(redSB);
685
+ int ring_is_changed;
686
+ def old_ring=basering;
687
+ if(defined(@L)<=0)
688
+ {
689
+ // define a new ring without deformation-parameters and change to it:
690
+ string str;
691
+ string minpolyStr = string(minpoly);
692
+ ring HNERing = create_ring(ring_list(basering)[1], "(x,y)", "ls", "no_minpoly");
693
+ if (minpolyStr!="0")
694
+ {str = "minpoly ="+ minpolyStr+";";execute(str);}
695
+ ring_is_changed=1;
696
+ // Basering changed to HNERing (variables x,y, with ls ordering)
697
+
698
+ k=nvars(old_ring);
699
+ matrix Map_Phi[1][k];
700
+ Map_Phi[1,k-1]=x;
701
+ Map_Phi[1,k]=y;
702
+ map phi=old_ring,Map_Phi;
703
+ poly f=phi(p_F);
704
+
705
+ // Heuristics: if x,y are transversal parameters then computation of HNE
706
+ // can be much faster when exchanging variables...!
707
+ if (2*size(coeffs(f,x))<size(coeffs(f,y)))
708
+ {
709
+ swapped=1;
710
+ f=swapXY(f);
711
+ }
712
+
713
+ int error=checkPoly(f);
714
+ if (error)
715
+ {
716
+ setring old_ring;
717
+ if (typ==1) //isEquising
718
+ {
719
+ print("Return value (=0) has no meaning!");
720
+ option(set,ov);
721
+ return(0);
722
+ }
723
+ else
724
+ {
725
+ option(set,ov);
726
+ return(list( ideal(0),error));
727
+ }
728
+ }
729
+
730
+ dbprint(i_print,"// ");
731
+ dbprint(i_print,"// Compute HN expansion");
732
+ dbprint(i_print,"// ---------------------");
733
+ i=printlevel;
734
+ printlevel=printlevel-5;
735
+ list LLL=hnexpansion(f);
736
+
737
+ if (size(LLL)==0) { // empty list returned by hnexpansion
738
+ setring old_ring;
739
+ print(i_print,"Unable to compute HN expansion !");
740
+ if (typ==1) //isEquising
741
+ {
742
+ print("Return value (=0) has no meaning!");
743
+ option(set,ov);
744
+ return(0);
745
+ }
746
+ else
747
+ {
748
+ option(set,ov);
749
+ return(list(ideal(0),int(1)));
750
+ }
751
+ option(set,ov);
752
+ return(0);
753
+ }
754
+ else
755
+ {
756
+ if (typeof(LLL[1])=="ring") {
757
+ def HNering = LLL[1];
758
+ setring HNering;
759
+ def @L=stripHNE(hne);
760
+ }
761
+ else {
762
+ def @L=stripHNE(LLL);
763
+ }
764
+ }
765
+ printlevel=i;
766
+ dbprint(i_print,"// finished");
767
+ dbprint(i_print,"// ");
768
+ }
769
+ def HNEring=basering;
770
+ list M=multsequence(@L);
771
+ M=control_Matrix(M); // this returns the 4 control matrices
772
+ def maxDeg=M[4];
773
+
774
+ list L1=inf_Tangents(@L,nrows(M[1]));
775
+ matrix B=L1[1];
776
+ intvec V=L1[2];
777
+ kill L1;
778
+
779
+ // if we have computed the HNE for f after swapping x and y, we have
780
+ // to reinterprete the (swap) matrix V:
781
+ if (swapped==1)
782
+ {
783
+ for (i=1;i<=size(V);i++) { V[i]=V[i]-1; } // turns 0 into -1, 1 into 0
784
+ }
785
+
786
+ // Determine maximal number of needed auxiliary parameters (free tangents):
787
+ no_b=Determine_no_b(M[3],B);
788
+
789
+ // test whether HNexpansion needed field extension....
790
+ string minPolyStr = "";
791
+ if (minpoly !=0)
792
+ {
793
+ minPolyStr = makeMinPolyString("a");
794
+ minPolyStr = "minpoly =" + minPolyStr + ";";
795
+ }
796
+
797
+ setring old_ring;
798
+
799
+ def myRing=createMyRing_new(p_F,"dp",minPolyStr,no_b);
800
+ setring myRing; // comes with mIdeal
801
+ map hole=HNEring,mIdeal;
802
+ // basering has changed to myRing, in particular, the "old"
803
+ // variable names, e.g., A,B,C,z,y are replaced by t(1),t(2),t(3),x,y
804
+
805
+ ideal bNodes;
806
+
807
+ // Initialize some variables:
808
+ map phi;
809
+ poly G, F_save;
810
+ poly b_dummy;
811
+ ideal J,Jnew,final_Map;
812
+ number_of_branches=ncols(M[1]);
813
+ for (i=1;i<=number_of_branches;i++)
814
+ {
815
+ poly F(i);
816
+ ideal bl_Map(i);
817
+ }
818
+ upper_bound[number_of_branches]=0;
819
+ upper_bound[1]=number_of_branches;
820
+ upper_bound_old=upper_bound;
821
+ fertig[number_of_branches]=0;
822
+ for (i=1;i<=number_of_branches;i++){ soll[i]=1; }
823
+
824
+ // Hole: B = matrix of blowup points
825
+ if (ring_is_changed==0) { matrix B=hole(B); }
826
+ else { matrix B=imap(HNEring,B); }
827
+ m=M[1][blowup,branch]; // multiplicity at 0
828
+
829
+ // now, we start by checking equimultiplicity along trivial section
830
+ poly Fm=m_Jet(p_F,m-1);
831
+
832
+ matrix coef_Mat = coef(Fm,xy);
833
+ Jnew=coef_Mat[2,1..ncols(coef_Mat)];
834
+ J=J,Jnew;
835
+
836
+ if (defined(artin_bd)) // the artin_bd-th power of the maxideal of
837
+ // deformation parameters can be cutted off
838
+ {
839
+ J=jet(J,artin_bd-1);
840
+ }
841
+
842
+ J=interred(J);
843
+ if (defined(artin_bd)) { J=jet(J,artin_bd-1); }
844
+
845
+ // J=std(J);
846
+
847
+ if (typ==1) // isEquising
848
+ {
849
+ if(ideal(nselect(J,1..no_b))<>0)
850
+ {
851
+ setring old_ring;
852
+ option(set,ov);
853
+ return(0);
854
+ }
855
+ }
856
+
857
+ F(1)=p_F;
858
+
859
+ // and reduce the remaining terms in F(1):
860
+ bl_Map(1)=maxideal(1);
861
+
862
+ attrib(J,"isSB",1);
863
+ bl_Map(1)=reduce(bl_Map(1),J);
864
+ attrib(J,"isSB",0);
865
+
866
+ phi=myRing,bl_Map(1);
867
+ F(1)=phi(F(1));
868
+
869
+ // simplify F(1)
870
+ attrib(J,"isSB",1);
871
+ F(1)=reduce(F(1),J);
872
+ attrib(J,"isSB",0);
873
+
874
+ // now we compute the m-jet:
875
+ Fm=m_Jet(F(1),m);
876
+
877
+ G=1;
878
+ counter=branch;
879
+ k=upper_bound[branch];
880
+
881
+ F_save=F(1); // is truncated differently in the following loop
882
+
883
+ while(counter<=k)
884
+ {
885
+ F(counter)=m_Jet(F_save,maxDeg[blowup,counter]);
886
+ if (V[counter]==0) // 2nd ring variable is tangent to this branch
887
+ {
888
+ G=G*(y-(b(auxVar)+B[blowup,counter])*x)^(M[3][blowup,counter]);
889
+ }
890
+ else // 1st ring variable is tangent to this branch
891
+ {
892
+ G=G*(x-(b(auxVar)+B[blowup,counter])*y)^(M[3][blowup,counter]);
893
+ F(counter)=swapXY(F(counter));
894
+ }
895
+ bl_Map(counter)=maxideal(1);
896
+ bl_Map(counter)[nvars(basering)]=xy+(b(auxVar)+B[blowup,counter])*x;
897
+
898
+ bNodes[counter]=b(auxVar);
899
+
900
+ auxVar=auxVar+1;
901
+ upper_bound[counter]=counter+M[2][blowup+1,counter]-1;
902
+ counter=counter+M[2][blowup+1,counter];
903
+ }
904
+
905
+ list LeadDataFm=determine_coef(Fm);
906
+ def LeadDataG=coef(G,xy);
907
+
908
+ for (i=1; i<=ncols(LeadDataG); i++)
909
+ {
910
+ if (LeadDataG[1,i]==LeadDataFm[2])
911
+ {
912
+ poly LeadG = LeadDataG[2,i]; // determine the coefficient of G
913
+ i=ncols(LeadDataG)+1;
914
+ }
915
+ }
916
+
917
+ G=LeadDataFm[1]*G-LeadG*Fm; // leading terms in y should cancel...
918
+
919
+ coef_Mat = coef(G,xy);
920
+ Jnew=coef_Mat[2,1..ncols(coef_Mat)];
921
+
922
+ // simplification of Jnew
923
+
924
+ if (defined(artin_bd)) // the artin_bd-th power of the maxideal of
925
+ // deformation parameters can be cutted off
926
+ {
927
+ Jnew=jet(Jnew,artin_bd-1);
928
+ }
929
+ Jnew=interred(Jnew);
930
+ if (defined(artin_bd)) { Jnew=jet(Jnew,artin_bd-1); }
931
+ J=J,Jnew;
932
+
933
+ if (typ==1) // isEquising
934
+ {
935
+ if(ideal(nselect(J,1..no_b))<>0)
936
+ {
937
+ setring old_ring;
938
+ option(set,ov);
939
+ return(0);
940
+ }
941
+ }
942
+
943
+ while (fertig<>soll and blowup<nrows(M[3]))
944
+ {
945
+ upper_bound_old=upper_bound;
946
+ dbprint(i_print,"// Blowup Step "+string(blowup)+" completed");
947
+ blowup=blowup+1;
948
+
949
+ for (branch=1;branch<=number_of_branches;branch=branch+1)
950
+ {
951
+ Jnew=0;
952
+
953
+ // First we check if the branch still has to be considered:
954
+ if (branch==upper_bound_old[branch] and fertig[branch]<>1)
955
+ {
956
+ if (M[3][blowup-1,branch]==1 and
957
+ ((B[blowup,branch]<>x and B[blowup,branch]<>y)
958
+ or (blowup==nrows(M[3])) ))
959
+ {
960
+ fertig[branch]=1;
961
+ dbprint(i_print,"// 1 branch finished");
962
+ }
963
+ }
964
+
965
+ if (branch<=upper_bound_old[branch] and fertig[branch]<>1)
966
+ {
967
+ for (i=branch;i>=1;i--)
968
+ {
969
+ if (M[1][blowup-1,i]<>0)
970
+ {
971
+ m=M[1][blowup-1,i]; // multiplicity before blowup
972
+ i=0;
973
+ }
974
+ }
975
+
976
+ // we blow up the branch and take the strict transform:
977
+ attrib(J,"isSB",1);
978
+ bl_Map(branch)=reduce(bl_Map(branch),J);
979
+ attrib(J,"isSB",0);
980
+
981
+ phi=myRing,bl_Map(branch);
982
+ F(branch)=phi(F(branch))/x^m;
983
+
984
+ // simplify F
985
+ attrib(Jnew,"isSB",1);
986
+
987
+ F(branch)=reduce(F(branch),Jnew);
988
+ attrib(Jnew,"isSB",0);
989
+
990
+ m=M[1][blowup,branch]; // multiplicity after blowup
991
+ Fm=m_Jet(F(branch),m); // homogeneous part of lowest degree
992
+
993
+
994
+ // we check for Fm=F[k]*...*F[k+s] where
995
+ //
996
+ // F[j]=(y-b'(j)*x)^m(j), respectively F[j]=(-b'(j)*y+x)^m(j)
997
+ //
998
+ // according to the entries m(j)= M[3][blowup,j] and
999
+ // b'(j) mod m_A = B[blowup,j]
1000
+ // computed from the HNE of the special fibre of the family:
1001
+ G=1;
1002
+ counter=branch;
1003
+ k=upper_bound[branch];
1004
+
1005
+ F_save=F(branch);
1006
+
1007
+ while(counter<=k)
1008
+ {
1009
+ F(counter)=m_Jet(F_save,maxDeg[blowup,counter]);
1010
+
1011
+ if (B[blowup,counter]<>x and B[blowup,counter]<>y)
1012
+ {
1013
+ G=G*(y-(b(auxVar)+B[blowup,counter])*x)^(M[3][blowup,counter]);
1014
+ bl_Map(counter)=maxideal(1);
1015
+ bl_Map(counter)[nvars(basering)]=
1016
+ xy+(b(auxVar)+B[blowup,counter])*x;
1017
+ bNodes[counter]=b(auxVar);
1018
+ auxVar=auxVar+1;
1019
+ }
1020
+ else
1021
+ {
1022
+ if (B[blowup,counter]==x)
1023
+ {
1024
+ G=G*x^(M[3][blowup,counter]); // branch has tangent x !!
1025
+ F(counter)=swapXY(F(counter)); // will turn x to y for blow up
1026
+ bl_Map(counter)=maxideal(1);
1027
+ bl_Map(counter)[nvars(basering)]=xy;
1028
+ }
1029
+ else
1030
+ {
1031
+ G=G*y^(M[3][blowup,counter]); // tangent has to be y
1032
+ bl_Map(counter)=maxideal(1);
1033
+ bl_Map(counter)[nvars(basering)]=xy;
1034
+ }
1035
+ bNodes[counter]=0;
1036
+ }
1037
+ upper_bound[counter]=counter+M[2][blowup+1,counter]-1;
1038
+ counter=counter+M[2][blowup+1,counter];
1039
+ }
1040
+ G=determine_coef(Fm)[1]*G-Fm; // leading terms in y should cancel
1041
+ coef_Mat = coef(G,xy);
1042
+ Jnew=coef_Mat[2,1..ncols(coef_Mat)];
1043
+ if (defined(artin_bd)) // the artin_bd-th power of the maxideal of
1044
+ // deformation parameters can be cutted off
1045
+ {
1046
+ Jnew=jet(Jnew,artin_bd-1);
1047
+ }
1048
+
1049
+ // simplification of J
1050
+ Jnew=interred(Jnew);
1051
+
1052
+ J=J,Jnew;
1053
+ if (typ==1) // isEquising
1054
+ {
1055
+ if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
1056
+ if(ideal(nselect(J,1..no_b))<>0)
1057
+ {
1058
+ setring old_ring;
1059
+ option(set,ov);
1060
+ return(0);
1061
+ }
1062
+ }
1063
+ }
1064
+ }
1065
+ if (number_of_branches>=2)
1066
+ {
1067
+ J=interred(J);
1068
+ if (typ==1) // isEquising
1069
+ {
1070
+ if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
1071
+ if(ideal(nselect(J,1..no_b))<>0)
1072
+ {
1073
+ setring old_ring;
1074
+ option(set,ov);
1075
+ return(0);
1076
+ }
1077
+ }
1078
+ }
1079
+ }
1080
+
1081
+ // Computation for all equimultiple sections being trivial (I^s(f))
1082
+ ideal Jtriv=J;
1083
+ for (i=1;i<=no_b; i++)
1084
+ {
1085
+ if (reduce(b(i),std(bNodes))!=0){
1086
+ Jtriv=subst(Jtriv,b(i),0);
1087
+ }
1088
+ }
1089
+ option(pure_gb);
1090
+ Jtriv=std(Jtriv);
1091
+
1092
+
1093
+
1094
+ dbprint(i_print,"// ");
1095
+ dbprint(i_print,"// Elimination starts:");
1096
+ dbprint(i_print,"// -------------------");
1097
+
1098
+ poly gg;
1099
+ int b_left=no_b;
1100
+
1101
+ for (i=1;i<=no_b; i++)
1102
+ {
1103
+ attrib(J,"isSB",1);
1104
+ gg=reduce(b(i),J);
1105
+ if (gg==0)
1106
+ {
1107
+ b_left = b_left-1; // another b(i) has to be 0
1108
+ }
1109
+ J = subst(J, b(i), gg);
1110
+ attrib(J,"isSB",0);
1111
+ }
1112
+ J=simplify(J,10);
1113
+ if (typ==1) // isEquising
1114
+ {
1115
+ if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
1116
+ if(ideal(nselect(J,1..no_b))<>0)
1117
+ {
1118
+ setring old_ring;
1119
+ option(set,ov);
1120
+ return(0);
1121
+ }
1122
+ }
1123
+
1124
+ //new CL 11/06: check in which equations b(k) appears and remove those b(k)
1125
+ // which appear in exactly one of the equations (by removing this
1126
+ // equation)
1127
+ dbprint(i_print,"// ");
1128
+ dbprint(i_print,"// Remove superfluous equations:");
1129
+ dbprint(i_print,"// -----------------------------");
1130
+ int Z,App_in;
1131
+ ideal J_Tmp;
1132
+ int ncJ=ncols(J);
1133
+
1134
+ intmat Mdet[ncJ][1];
1135
+ for (Z=1;Z<=ncJ;Z++){ Mdet[Z,1]=Z; }
1136
+
1137
+ for (i=1;i<=no_b; i++)
1138
+ {
1139
+ ideal b_appears_in(i); // Eintraege sind spaeter 1 oder 0
1140
+ intmat b_app_in(i)[1][ncJ]; // Eintraege sind spaeter 1 oder 0
1141
+ b_appears_in(i)[ncJ]=0;
1142
+ J_Tmp = matrix(J)-subst(J,b(i),0);
1143
+ for (Z=1; Z<=ncJ; Z++) {
1144
+ if (J_Tmp[Z]<>0) { // b(i) appear in J_Tmp[Z]
1145
+ b_appears_in(i)[Z]=1;
1146
+ b_app_in(i)[1,Z]=1;
1147
+ }
1148
+ }
1149
+ if (size(b_appears_in(i))==1) { //b(i) appears only in one J_Tmp[Z]
1150
+ App_in = (b_app_in(i)*Mdet)[1,1]; // determines Z
1151
+ J[App_in]=0;
1152
+ b_appears_in(i)[App_in]=0;
1153
+ b_app_in(i)[1,App_in]=0;
1154
+ }
1155
+ }
1156
+
1157
+ for (i=1;i<=no_b; i++)
1158
+ {
1159
+ if (size(b_appears_in(i))==1) { //b(i) appears only in one J_Tmp[Z]
1160
+ App_in = (b_app_in(i)*Mdet)[1,1]; // determines Z
1161
+ J[App_in]=0;
1162
+ b_appears_in(i)[App_in]=0;
1163
+ b_app_in(i)[1,Z]=1;
1164
+ i=0;
1165
+ }
1166
+ }
1167
+
1168
+ Jtriv = nselect(Jtriv,1..no_b);
1169
+ ideal J_no_b = nselect(J,1..no_b);
1170
+ if (size(J) > size(J_no_b))
1171
+ {
1172
+ dbprint(i_print,"// std computation started");
1173
+ // some b(i) didn't appear in linear conditions and have to be eliminated
1174
+ if (defined(artin_bd))
1175
+ {
1176
+ // first we make the ring smaller (removing variables, which are
1177
+ // forced to 0 by J
1178
+ list LL=make_ring_small(J);
1179
+ ideal Shortmap=LL[2];
1180
+ minPolyStr = "";
1181
+ if (minpoly !=0)
1182
+ {
1183
+ minPolyStr = "minpoly = "+string(minpoly);
1184
+ }
1185
+ ordStr = "dp(" + string(b_left) + "),dp";
1186
+ ideal qId = ideal(basering);
1187
+
1188
+ ring Shortring = create_ring(ring_list(basering)[1], "("+ LL[1] +")", "("+ ordStr +")", "no_minpoly");
1189
+ execute(minPolyStr);
1190
+ // ring has changed to "Shortring"
1191
+
1192
+ ideal MM=maxideal(artin_bd);
1193
+ MM=subst(MM,x,0);
1194
+ MM=subst(MM,y,0);
1195
+ MM=simplify(MM,2);
1196
+ dbprint(i_print-1,"// maxideal("+string(artin_bd)+") has "
1197
+ +string(size(MM))+" elements");
1198
+ dbprint(i_print-1,"//");
1199
+
1200
+ // we change to the qring mod m^artin_bd
1201
+ // first, we have to check if we were in a qring when starting
1202
+ ideal qId = imap(myRing, qId);
1203
+ if (size(qId) == 0)
1204
+ {
1205
+ attrib(MM,"isSB",1);
1206
+ qring QQ=MM;
1207
+ }
1208
+ else
1209
+ {
1210
+ qId=qId,MM;
1211
+ qring QQ = std(qId);
1212
+ }
1213
+
1214
+ ideal Shortmap=imap(myRing,Shortmap);
1215
+ map phiphi=myRing,Shortmap;
1216
+
1217
+ ideal J=phiphi(J);
1218
+ option(redSB);
1219
+ J=std(J);
1220
+ J=nselect(J,1..no_b);
1221
+
1222
+ setring myRing;
1223
+ // back to "myRing"
1224
+
1225
+ J=nselect(J,1..no_b);
1226
+ Jnew=imap(QQ,J);
1227
+
1228
+ J=J,Jnew;
1229
+ J=interred(J);
1230
+ if (defined(artin_bd)){ J=jet(J,artin_bd-1); }
1231
+ }
1232
+ else
1233
+ {
1234
+ J=std(J);
1235
+ J=nselect(J,1..no_b);
1236
+ if (defined(artin_bd)){ J=jet(J,artin_bd-1); }
1237
+ }
1238
+ }
1239
+
1240
+ dbprint(i_print,"// finished");
1241
+ dbprint(i_print,"// ");
1242
+
1243
+ minPolyStr = "";option(set,ov);
1244
+ if (minpoly !=0)
1245
+ {
1246
+ minPolyStr = "minpoly = "+string(minpoly);
1247
+ }
1248
+
1249
+ kill HNEring;
1250
+
1251
+ if (typ==1) // isEquising
1252
+ {
1253
+ if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
1254
+ if(J<>0)
1255
+ {
1256
+ setring old_ring;
1257
+ option(set,ov);
1258
+ return(0);
1259
+ }
1260
+ else
1261
+ {
1262
+ setring old_ring;
1263
+ option(set,ov);
1264
+ return(1);
1265
+ }
1266
+ }
1267
+
1268
+ setring old_ring;
1269
+ // we are back in the original ring
1270
+
1271
+ if (npars(myRing)<>0)
1272
+ {
1273
+ ideal qIdeal = ideal(basering);
1274
+ ring ESSring = create_ring("("+ string(char(basering))+ "," + parstr(myRing) +")", "("+ varstr(basering)+")", "("+ ordstr(basering) +")");
1275
+ execute(minPolyStr);
1276
+ // basering has changed to ESSring
1277
+
1278
+ ideal qIdeal = fetch(old_ring, qIdeal);
1279
+ if(qIdeal != 0)
1280
+ {
1281
+ def r_base = basering;
1282
+ kill ESSring;
1283
+ qring ESSring = std(qIdeal);
1284
+ }
1285
+ kill qIdeal;
1286
+
1287
+ ideal SSS;
1288
+ for (int ii=1;ii<=nvars(basering);ii++)
1289
+ {
1290
+ SSS[ii+no_b]=var(ii);
1291
+ }
1292
+ map phi=myRing,SSS; // b(i) variables are mapped to zero
1293
+
1294
+ ideal ES=phi(J);
1295
+ ideal ES_all_triv=phi(Jtriv);
1296
+ kill phi;
1297
+
1298
+ if (defined(p_F)<=0)
1299
+ {
1300
+ poly p_F=fetch(old_ring,p_F);
1301
+ export(p_F);
1302
+ }
1303
+ export(ES);
1304
+ export(ES_all_triv);
1305
+ setring old_ring;
1306
+ dbprint(i_print+2,"
1307
+ // 'esStratum' created a list M of a ring and an integer.
1308
+ // To access the ideal defining the equisingularity stratum, type:
1309
+ def ESSring = M[1]; setring ESSring; ES; ");
1310
+
1311
+ option(set,ov);
1312
+ return(list(ESSring,0));
1313
+ }
1314
+ else
1315
+ {
1316
+ // no new ring definition necessary
1317
+ ideal SSS;
1318
+ for (int ii=1;ii<=nvars(basering);ii++)
1319
+ {
1320
+ SSS[ii+no_b]=var(ii);
1321
+ }
1322
+ map phi=myRing,SSS; // b(i) variables are mapped to zero
1323
+
1324
+ ideal ES=phi(J);
1325
+ ideal ES_all_triv=phi(Jtriv);
1326
+ kill phi;
1327
+
1328
+ setring old_ring;
1329
+ dbprint(i_print,"// output of 'esStratum' is a list consisting of:
1330
+ // _[1][1] = ideal defining the equisingularity stratum
1331
+ // _[1][2] = ideal defining the part of the equisingularity stratum
1332
+ // where all equimultiple sections are trivial
1333
+ // _[2] = 0");
1334
+
1335
+ option(set,ov);
1336
+ return(list(list(ES,ES_all_triv),0));
1337
+ }
1338
+
1339
+ }
1340
+
1341
+ ////////////////////////////////////////////////////////////////////////////////
1342
+
1343
+ proc tau_es (poly f,list #)
1344
+ "USAGE: tau_es(f); f poly
1345
+ ASSUME: f is a reduced bivariate polynomial, the basering has precisely
1346
+ two variables, is local and no qring.
1347
+ RETURN: int, the codimension of the mu-const stratum in the semi-universal
1348
+ deformation base.
1349
+ NOTE: printlevel>=1 displays additional information.
1350
+ When called with any additional parameter, the computation of the
1351
+ Milnor number is avoided (no check for NND).
1352
+ SEE ALSO: esIdeal, tjurina, invariants
1353
+ EXAMPLE: example tau_es; shows an example.
1354
+ "
1355
+ {
1356
+ int i,j,k,s;
1357
+ int slope_x, slope_y, upper;
1358
+ int i_print = printlevel - voice + 3;
1359
+ string MinPolyStr;
1360
+
1361
+ // some checks first
1362
+ if ( nvars(basering)<>2 )
1363
+ {
1364
+ print("// basering has not the correct number (two) of variables !");
1365
+ print("// computation stopped");
1366
+ return(0);
1367
+ }
1368
+ if ( mult(std(1+var(1)+var(2))) <> 0)
1369
+ {
1370
+ print("// basering is not local !");
1371
+ print("// computation stopped");
1372
+ return(0);
1373
+ }
1374
+
1375
+ if (mult(std(f))<=1)
1376
+ {
1377
+ // f is rigid
1378
+ return(0);
1379
+ }
1380
+
1381
+ if ( deg(squarefree(f))!=deg(f) )
1382
+ {
1383
+ print("// input polynomial was not reduced");
1384
+ print("// try squarefree(f); first");
1385
+ return(0);
1386
+ }
1387
+
1388
+ def old_ring=basering;
1389
+ ring @myRing = create_ring(ring_list(basering)[1], "("+varstr(basering)+")", "ds", "no_minpoly");
1390
+ poly f=imap(old_ring,f);
1391
+
1392
+ ideal Jacobi_Id = jacob(f);
1393
+
1394
+ // check for A_k singularity
1395
+ // ----------------------------------------
1396
+ if (mult(std(f))==2)
1397
+ {
1398
+ dbprint(i_print-1,"// ");
1399
+ dbprint(i_print-1,"// polynomial defined A_k singularity");
1400
+ dbprint(i_print-1,"// ");
1401
+ return( vdim(std(Jacobi_Id)) );
1402
+ }
1403
+
1404
+ // check for D_k singularity
1405
+ // ----------------------------------------
1406
+ if (mult(std(f))==3 and size(factorize(jet(f,3))[1])>=3)
1407
+ {
1408
+ dbprint(i_print,"// ");
1409
+ dbprint(i_print,"// polynomial defined D_k singularity");
1410
+ dbprint(i_print,"// ");
1411
+ ideal ES_Id = f, jacob(f);
1412
+ return( vdim(std(Jacobi_Id)));
1413
+ }
1414
+
1415
+
1416
+ if (size(#)==0)
1417
+ {
1418
+ // check if Newton polygon non-degenerate
1419
+ // ----------------------------------------
1420
+ Jacobi_Id=std(Jacobi_Id);
1421
+ int mu = vdim(Jacobi_Id);
1422
+ poly f_tilde=f+var(1)^mu+var(2)^mu; //to obtain convenient Newton-polygon
1423
+
1424
+ list NP=newtonpoly(f_tilde);
1425
+ dbprint(i_print-1,"// Newton polygon:");
1426
+ dbprint(i_print-1,NP);
1427
+ dbprint(i_print-1,"");
1428
+
1429
+ if(is_NND(f,mu,NP)) // f is Newton non-degenerate
1430
+ {
1431
+ upper=NP[1][2];
1432
+ ideal ES_Id= x^k*y^upper;
1433
+ dbprint(i_print-1,"polynomial is Newton non-degenerate");
1434
+ dbprint(i_print-1,"");
1435
+ k=0;
1436
+ for (i=1;i<=size(NP)-1;i++)
1437
+ {
1438
+ slope_x=NP[i+1][1]-NP[i][1];
1439
+ slope_y=NP[i][2]-NP[i+1][2];
1440
+ for (k=NP[i][1]+1; k<=NP[i+1][1]; k++)
1441
+ {
1442
+ while ( slope_x*upper + slope_y*k >=
1443
+ slope_x*NP[i][2] + slope_y*NP[i][1])
1444
+ {
1445
+ upper=upper-1;
1446
+ }
1447
+ upper=upper+1;
1448
+ ES_Id=ES_Id, x^k*y^upper;
1449
+ }
1450
+ }
1451
+ ES_Id=std(ES_Id);
1452
+ dbprint(i_print-2,"ideal of monomials above Newton bd. is generated by:");
1453
+ dbprint(i_print-2,ES_Id);
1454
+ ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
1455
+ ES_Id = ES_Id, Jacobi_Id;
1456
+ ES_Id = std(ES_Id);
1457
+ dbprint(i_print-1,"// ");
1458
+ dbprint(i_print-1,"// Equisingularity ideal is computed!");
1459
+ dbprint(i_print-1,"");
1460
+ return(vdim(ES_Id));
1461
+ }
1462
+ else
1463
+ {
1464
+ dbprint(i_print-1,"polynomial is Newton degenerate !");
1465
+ dbprint(i_print-1,"");
1466
+ }
1467
+ }
1468
+
1469
+ // for Newton degenerate polynomials, we compute the HN expansion, and
1470
+ // count the number of free points .....
1471
+
1472
+ dbprint(i_print-1,"// ");
1473
+ dbprint(i_print-1,"// Compute HN expansion");
1474
+ dbprint(i_print-1,"// ---------------------");
1475
+ i=printlevel;
1476
+ printlevel=printlevel-5;
1477
+ if (2*size(coeffs(f,x))<size(coeffs(f,y)))
1478
+ {
1479
+ f=swapXY(f);
1480
+ }
1481
+ list LLL=hnexpansion(f);
1482
+ if (size(LLL)==0) { // empty list returned by hnexpansion
1483
+ setring old_ring;
1484
+ ERROR("Unable to compute HN expansion !");
1485
+ }
1486
+ else
1487
+ {
1488
+ if (typeof(LLL[1])=="ring") {
1489
+ def HNering = LLL[1];
1490
+ setring HNering;
1491
+ def @L=hne;
1492
+ }
1493
+ else {
1494
+ def @L=LLL;
1495
+ }
1496
+ }
1497
+ def HNEring=basering;
1498
+
1499
+ printlevel=i;
1500
+ dbprint(i_print-1,"// finished");
1501
+ dbprint(i_print-1,"// ");
1502
+
1503
+ list M=multsequence(@L);
1504
+ M=control_Matrix(M); // this returns the 4 control matrices
1505
+ intmat Mult=M[1];
1506
+
1507
+ list L1=inf_Tangents(@L,nrows(M[1]));
1508
+ matrix B=L1[1];
1509
+
1510
+ // determine sum_i m_i(m_i+1)/2 (over inf. near points)
1511
+ int conditions=0;
1512
+ for (i=1;i<=nrows(Mult);i++)
1513
+ {
1514
+ for (j=1;j<=ncols(Mult);j++)
1515
+ {
1516
+ conditions=conditions+(Mult[i,j]*(Mult[i,j]+1) div 2);
1517
+ }
1518
+ }
1519
+ int freePts=no_freePoints(M[1],B);
1520
+ int taues=conditions-freePts-2;
1521
+
1522
+ setring old_ring;
1523
+ return(taues);
1524
+ }
1525
+ example
1526
+ {
1527
+ "EXAMPLE:"; echo=2;
1528
+ ring r=32003,(x,y),ds;
1529
+ poly f=(x4-y4)^2-x10;
1530
+ tau_es(f);
1531
+ }
1532
+
1533
+
1534
+ ////////////////////////////////////////////////////////////////////////////////
1535
+
1536
+ proc esIdeal (poly f,list #)
1537
+ "USAGE: esIdeal(f[,any]]); f poly
1538
+ ASSUME: f is a reduced bivariate polynomial, the basering has precisely
1539
+ two variables, is local and no qring, and the characteristic of
1540
+ the ground field does not divide mult(f).
1541
+ RETURN: if called with only one parameter: list of two ideals,
1542
+ @format
1543
+ _[1]: equisingularity ideal of f (in sense of Wahl),
1544
+ _[2]: ideal of equisingularity with fixed position of the
1545
+ singularity;
1546
+ @end format
1547
+ if called with more than one parameter: list of three ideals,
1548
+ @format
1549
+ _[1]: equisingularity ideal of f (in sense of Wahl)
1550
+ _[2]: ideal of equisingularity with fixed position of the
1551
+ singularity;
1552
+ _[3]: ideal of all g such that the deformation defined by f+eg
1553
+ (e^2=0) is isomorphic to an equisingular deformation
1554
+ of V(f) with all equimultiple sections being trivial.
1555
+ @end format
1556
+ NOTE: if some of the above condition is not satisfied then return
1557
+ value is list(0,0).
1558
+ SEE ALSO: tau_es, esStratum
1559
+ KEYWORDS: equisingularity ideal
1560
+ EXAMPLE: example esIdeal; shows examples.
1561
+ "
1562
+ {
1563
+
1564
+ int typ;
1565
+ if (size(#)>0) { typ=1; } // I^s is also computed
1566
+ int i,k,s;
1567
+ int slope_x, slope_y, upper;
1568
+ int i_print = printlevel - voice + 3;
1569
+ string MinPolyStr;
1570
+
1571
+ // some checks first
1572
+ if ( nvars(basering)<>2 )
1573
+ {
1574
+ print("// basering has not the correct number (two) of variables !");
1575
+ print("// computation stopped");
1576
+ return(list(0,0));
1577
+ }
1578
+ if ( mult(std(1+var(1)+var(2))) <> 0)
1579
+ {
1580
+ print("// basering is not local !");
1581
+ print("// computation stopped");
1582
+ return(list(0,0));
1583
+ }
1584
+
1585
+ if (mult(std(f))<=1)
1586
+ {
1587
+ // f is rigid
1588
+ if (typ==0)
1589
+ {
1590
+ return(list(ideal(1),ideal(1)));
1591
+ }
1592
+ else
1593
+ {
1594
+ return(list(ideal(1),ideal(1),ideal(1)));
1595
+ }
1596
+ }
1597
+
1598
+ if ( deg(squarefree(f))!=deg(f) )
1599
+ {
1600
+ print("// input polynomial was not squarefree");
1601
+ print("// try squarefree(f); first");
1602
+ return(list(0,0));
1603
+ }
1604
+
1605
+ if (char(basering)<>0)
1606
+ {
1607
+ if (mult(std(f)) mod char(basering)==0)
1608
+ {
1609
+ print("// characteristic of ground field divides "
1610
+ + "multiplicity of polynomial !");
1611
+ print("// computation stopped");
1612
+ return(list(0,0));
1613
+ }
1614
+ }
1615
+
1616
+ // check for A_k singularity
1617
+ // ----------------------------------------
1618
+ if (mult(std(f))==2)
1619
+ {
1620
+ dbprint(i_print,"// ");
1621
+ dbprint(i_print,"// polynomial defined A_k singularity");
1622
+ dbprint(i_print,"// ");
1623
+ ideal ES_Id = f, jacob(f);
1624
+ ES_Id = interred(ES_Id);
1625
+ ideal ESfix_Id = f, maxideal(1)*jacob(f);
1626
+ ESfix_Id= interred(ESfix_Id);
1627
+ if (typ==0) // only for computation of I^es and I^es_fix
1628
+ {
1629
+ return( list(ES_Id,ESfix_Id) );
1630
+ }
1631
+ else
1632
+ {
1633
+ return( list(ES_Id,ESfix_Id,ES_Id) );
1634
+ }
1635
+ }
1636
+
1637
+ // check for D_k singularity
1638
+ // ----------------------------------------
1639
+ if (mult(std(f))==3 and size(factorize(jet(f,3))[1])>=3)
1640
+ {
1641
+ dbprint(i_print,"// ");
1642
+ dbprint(i_print,"// polynomial defined D_k singularity");
1643
+ dbprint(i_print,"// ");
1644
+ ideal ES_Id = f, jacob(f);
1645
+ ES_Id = interred(ES_Id);
1646
+ ideal ESfix_Id = f, maxideal(1)*jacob(f);
1647
+ ESfix_Id= interred(ESfix_Id);
1648
+ if (typ==0) // only for computation of I^es and I^es_fix
1649
+ {
1650
+ return( list(ES_Id,ESfix_Id) );
1651
+ }
1652
+ else
1653
+ {
1654
+ return( list(ES_Id,ESfix_Id,ES_Id) );
1655
+ }
1656
+ }
1657
+
1658
+ // check if Newton polygon non-degenerate
1659
+ // ----------------------------------------
1660
+ int mu = milnor(f);
1661
+ poly f_tilde=f+var(1)^mu+var(2)^mu; //to obtain a convenient Newton-polygon
1662
+
1663
+ list NP=newtonpoly(f_tilde);
1664
+ dbprint(i_print-1,"// Newton polygon:");
1665
+ dbprint(i_print-1,NP);
1666
+ dbprint(i_print-1,"");
1667
+
1668
+ if(is_NND(f,mu,NP)) // f is Newton non-degenerate
1669
+ {
1670
+ upper=NP[1][2];
1671
+ ideal ES_Id= x^k*y^upper;
1672
+ dbprint(i_print,"polynomial is Newton non-degenerate");
1673
+ dbprint(i_print,"");
1674
+ k=0;
1675
+ for (i=1;i<=size(NP)-1;i++)
1676
+ {
1677
+ slope_x=NP[i+1][1]-NP[i][1];
1678
+ slope_y=NP[i][2]-NP[i+1][2];
1679
+ for (k=NP[i][1]+1; k<=NP[i+1][1]; k++)
1680
+ {
1681
+ while ( slope_x*upper + slope_y*k >=
1682
+ slope_x*NP[i][2] + slope_y*NP[i][1])
1683
+ {
1684
+ upper=upper-1;
1685
+ }
1686
+ upper=upper+1;
1687
+ ES_Id=ES_Id, x^k*y^upper;
1688
+ }
1689
+ }
1690
+ ES_Id=std(ES_Id);
1691
+ dbprint(i_print-1,"ideal of monomials above Newton bd. is generated by:");
1692
+ dbprint(i_print-1,ES_Id);
1693
+ ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
1694
+ ES_Id = ES_Id, f, jacob(f);
1695
+ dbprint(i_print,"// ");
1696
+ dbprint(i_print,"// equisingularity ideal is computed!");
1697
+ if (typ==0)
1698
+ {
1699
+ return(list(ES_Id,ESfix_Id));
1700
+ }
1701
+ else
1702
+ {
1703
+ return(list(ES_Id,ESfix_Id,ES_Id));
1704
+ }
1705
+ }
1706
+ else
1707
+ {
1708
+ dbprint(i_print,"polynomial is Newton degenerate !");
1709
+ dbprint(i_print,"");
1710
+ }
1711
+
1712
+ def old_ring=basering;
1713
+
1714
+ dbprint(i_print,"// ");
1715
+ dbprint(i_print,"// versal deformation with triv. section");
1716
+ dbprint(i_print,"// =====================================");
1717
+ dbprint(i_print,"// ");
1718
+
1719
+ ideal JJ=maxideal(1)*jacob(f);
1720
+ ideal kbase_versal=kbase(std(JJ));
1721
+ s=size(kbase_versal);
1722
+ ring @Pt=QQ,(t(1..s)),ds;
1723
+ def @Px=@Pt+old_ring;
1724
+ setring @Px;
1725
+ // basering has changed to @Px
1726
+
1727
+ poly F=imap(old_ring,f);
1728
+ ideal kbase_versal=imap(old_ring,kbase_versal);
1729
+ for (i=1; i<=s; i++)
1730
+ {
1731
+ F=F+var(i)*kbase_versal[i];
1732
+ }
1733
+ dbprint(i_print-1,F);
1734
+ dbprint(i_print-1,"");
1735
+
1736
+
1737
+ ideal ES_Id,ES_Id_all_triv;
1738
+ poly Ftriv=F;
1739
+
1740
+ dbprint(i_print,"// ");
1741
+ dbprint(i_print,"// Compute equisingularity Stratum over Spec(C[t]/t^2)");
1742
+ dbprint(i_print,"// ===================================================");
1743
+ dbprint(i_print,"// ");
1744
+ list M=esStratum(F,2);
1745
+ dbprint(i_print,"// finished");
1746
+ dbprint(i_print,"// ");
1747
+
1748
+ if (M[2]==1) // error occurred during esStratum computation
1749
+ {
1750
+ print("Some error has occurred during the computation");
1751
+ return(list(0,0));
1752
+ }
1753
+
1754
+ if ( typeof(M[1])=="list" )
1755
+ {
1756
+ int defpars = nvars(basering)-2;
1757
+ poly Fred,Ftrivred;
1758
+ poly g;
1759
+ F=reduce(F,std(M[1][1]));
1760
+ Ftriv=reduce(Ftriv,std(M[1][2]));
1761
+
1762
+ for (i=1; i<=defpars; i++)
1763
+ {
1764
+ Fred=reduce(F,std(var(i)));
1765
+ Ftrivred=reduce(Ftriv,std(var(i)));
1766
+
1767
+ g=subst(F-Fred,var(i),1);
1768
+ ES_Id=ES_Id, g;
1769
+ F=Fred;
1770
+
1771
+ g=subst(Ftriv-Ftrivred,var(i),1);
1772
+ ES_Id_all_triv=ES_Id_all_triv, g;
1773
+ Ftriv=Ftrivred;
1774
+ }
1775
+
1776
+ setring old_ring;
1777
+ // back to original ring
1778
+
1779
+ ideal ES_Id = imap(@Px,ES_Id);
1780
+ ES_Id = interred(ES_Id);
1781
+
1782
+ ideal ES_Id_all_triv = imap(@Px,ES_Id_all_triv);
1783
+ ES_Id_all_triv = interred(ES_Id_all_triv);
1784
+
1785
+ ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
1786
+ ES_Id = ES_Id, f, jacob(f);
1787
+ ES_Id_all_triv = ES_Id_all_triv, f, jacob(f);
1788
+
1789
+ if (typ==0)
1790
+ {
1791
+ return(list(ES_Id,ESfix_Id));
1792
+ }
1793
+ else
1794
+ {
1795
+ return(list(ES_Id,ESfix_Id,ES_Id_all_triv));
1796
+ }
1797
+ }
1798
+ else
1799
+ {
1800
+ def AuxRing=M[1];
1801
+
1802
+ dbprint(i_print,"// ");
1803
+ dbprint(i_print,"// change ring to ESSring");
1804
+
1805
+ setring AuxRing; // contains p_F, ES
1806
+
1807
+ int defpars = nvars(basering)-2;
1808
+ poly Fred,Fredtriv;
1809
+ poly g;
1810
+ ideal ES_Id,ES_Id_all_triv;
1811
+
1812
+ poly p_Ftriv=p_F;
1813
+
1814
+ p_F=reduce(p_F,std(ES));
1815
+ p_Ftriv=reduce(p_Ftriv,std(ES_all_triv));
1816
+ for (i=1; i<=defpars; i++)
1817
+ {
1818
+ Fred=reduce(p_F,std(var(i)));
1819
+ Fredtriv=reduce(p_Ftriv,std(var(i)));
1820
+
1821
+ g=subst(p_F-Fred,var(i),1);
1822
+ ES_Id=ES_Id, g;
1823
+ p_F=Fred;
1824
+
1825
+ g=subst(p_Ftriv-Fredtriv,var(i),1);
1826
+ ES_Id_all_triv=ES_Id_all_triv, g;
1827
+ p_Ftriv=Fredtriv;
1828
+
1829
+ }
1830
+
1831
+ dbprint(i_print,"// ");
1832
+ dbprint(i_print,"// back to the original ring");
1833
+
1834
+ setring old_ring;
1835
+ // back to original ring
1836
+
1837
+ ideal ES_Id = imap(AuxRing,ES_Id);
1838
+ ES_Id = interred(ES_Id);
1839
+
1840
+ ideal ES_Id_all_triv = imap(AuxRing,ES_Id_all_triv);
1841
+ ES_Id_all_triv = interred(ES_Id_all_triv);
1842
+
1843
+ kill @Px;
1844
+ kill AuxRing;
1845
+
1846
+ ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
1847
+ ES_Id = ES_Id, f, jacob(f);
1848
+ ES_Id_all_triv = ES_Id_all_triv, f, jacob(f);
1849
+ dbprint(i_print,"// ");
1850
+ dbprint(i_print,"// equisingularity ideal is computed!");
1851
+ if (typ==0)
1852
+ {
1853
+ return(list(ES_Id,ESfix_Id));
1854
+ }
1855
+ else
1856
+ {
1857
+ return(list(ES_Id,ESfix_Id,ES_Id_all_triv));
1858
+ }
1859
+ }
1860
+ }
1861
+ example
1862
+ {
1863
+ "EXAMPLE:"; echo=2;
1864
+ ring r=0,(x,y),ds;
1865
+ poly f=x7+y7+(x-y)^2*x2y2;
1866
+ list K=esIdeal(f);
1867
+ option(redSB);
1868
+ // Wahl's equisingularity ideal:
1869
+ std(K[1]);
1870
+
1871
+ ring rr=0,(x,y),ds;
1872
+ poly f=x4+4x3y+6x2y2+4xy3+y4+2x2y15+4xy16+2y17+xy23+y24+y30+y31;
1873
+ list K=esIdeal(f);
1874
+ vdim(std(K[1]));
1875
+ // the latter should be equal to:
1876
+ tau_es(f);
1877
+ }
1878
+
1879
+ ///////////////////////////////////////////////////////////////////////////////
1880
+
1881
+ proc esStratum (poly p_F, list #)
1882
+ "USAGE: esStratum(F[,m,L]); F poly, m int, L list
1883
+ ASSUME: F defines a deformation of a reduced bivariate polynomial f
1884
+ and the characteristic of the basering does not divide mult(f). @*
1885
+ If nv is the number of variables of the basering, then the first
1886
+ nv-2 variables are the deformation parameters. @*
1887
+ If the basering is a qring, ideal(basering) must only depend
1888
+ on the deformation parameters.
1889
+ COMPUTE: equations for the stratum of equisingular deformations with
1890
+ fixed (trivial) section.
1891
+ RETURN: list l: either consisting of a list and an integer, where
1892
+ @format
1893
+ l[1][1]=ideal defining the equisingularity stratum
1894
+ l[1][2]=ideal defining the part of the equisingularity stratum where all
1895
+ equimultiple sections through the non-nodes of the reduced total
1896
+ transform are trivial sections
1897
+ l[2]=1 if some error has occurred, l[2]=0 otherwise;
1898
+ @end format
1899
+ or consisting of a ring and an integer, where
1900
+ @format
1901
+ l[1]=ESSring is a ring extension of basering containing the ideal ES
1902
+ (describing the ES-stratum), the ideal ES_all_triv (describing the
1903
+ part with trivial equimultiple sections) and the polynomial p_F=F,
1904
+ l[2]=1 if some error has occurred, l[2]=0 otherwise.
1905
+ @end format
1906
+ NOTE: L is supposed to be the output of hnexpansion (with the given ordering
1907
+ of the variables appearing in f). @*
1908
+ If m is given, the ES Stratum over A/maxideal(m) is computed. @*
1909
+ This procedure uses @code{execute} or calls a procedure using
1910
+ @code{execute}.
1911
+ printlevel>=2 displays additional information.
1912
+ SEE ALSO: esIdeal, isEquising
1913
+ KEYWORDS: equisingularity stratum
1914
+ EXAMPLE: example esStratum; shows examples.
1915
+ "
1916
+ {
1917
+ list l=esComputation (0,p_F,#);
1918
+ return(l);
1919
+ }
1920
+ example
1921
+ {
1922
+ "EXAMPLE:"; echo=2;
1923
+ int p=printlevel;
1924
+ printlevel=1;
1925
+ ring r = 0,(a,b,c,d,e,f,g,x,y),ds;
1926
+ poly F = (x2+2xy+y2+x5)+ax+by+cx2+dxy+ey2+fx3+gx4;
1927
+ list M = esStratum(F);
1928
+ M[1][1];
1929
+
1930
+ printlevel=3; // displays additional information
1931
+ esStratum(F,2) ; // ES-stratum over Q[a,b,c,d,e,f,g] / <a,b,c,d,e,f,g>^2
1932
+
1933
+ ideal I = f-fa,e+b;
1934
+ qring q = std(I);
1935
+ poly F = imap(r,F);
1936
+ esStratum(F);
1937
+ printlevel=p;
1938
+ }
1939
+
1940
+ ///////////////////////////////////////////////////////////////////////////////
1941
+
1942
+ proc isEquising (poly p_F, list #)
1943
+ "USAGE: isEquising(F[,m,L]); F poly, m int, L list
1944
+ ASSUME: F defines a deformation of a reduced bivariate polynomial f
1945
+ and the characteristic of the basering does not divide mult(f). @*
1946
+ If nv is the number of variables of the basering, then the first
1947
+ nv-2 variables are the deformation parameters. @*
1948
+ If the basering is a qring, ideal(basering) must only depend
1949
+ on the deformation parameters.
1950
+ COMPUTE: tests if the given family is equisingular along the trivial
1951
+ section.
1952
+ RETURN: int: 1 if the family is equisingular, 0 otherwise.
1953
+ NOTE: L is supposed to be the output of hnexpansion (with the given ordering
1954
+ of the variables appearing in f). @*
1955
+ If m is given, the family is considered over A/maxideal(m). @*
1956
+ This procedure uses @code{execute} or calls a procedure using
1957
+ @code{execute}.
1958
+ printlevel>=2 displays additional information.
1959
+ EXAMPLE: example isEquising; shows examples.
1960
+ "
1961
+ {
1962
+ int check=esComputation (1,p_F,#);
1963
+ return(check);
1964
+ }
1965
+ example
1966
+ {
1967
+ "EXAMPLE:"; echo=2;
1968
+ ring r = 0,(a,b,x,y),ds;
1969
+ poly F = (x2+2xy+y2+x5)+ay3+bx5;
1970
+ isEquising(F);
1971
+ ideal I = ideal(a);
1972
+ qring q = std(I);
1973
+ poly F = imap(r,F);
1974
+ isEquising(F);
1975
+
1976
+ ring rr=0,(A,B,C,x,y),ls;
1977
+ poly f=x7+y7+(x-y)^2*x2y2;
1978
+ poly F=f+A*y*diff(f,x)+B*x*diff(f,x);
1979
+ isEquising(F);
1980
+ isEquising(F,2); // computation over Q[a,b] / <a,b>^2
1981
+ }
1982
+
1983
+
1984
+
1985
+ /* Examples:
1986
+
1987
+ LIB "equising.lib";
1988
+ ring r = 0,(x,y),ds;
1989
+ poly p1 = y^2+x^3;
1990
+ poly p2 = p1^2+x5y;
1991
+ poly p3 = p2^2+x^10*p1;
1992
+ poly p=p3^2+x^20*p2;
1993
+ p;
1994
+ list L=versal(p);
1995
+ def Px=L[1];
1996
+ setring Px;
1997
+ poly F=Fs[1,1];
1998
+ int t=timer;
1999
+ list M=esStratum(F);
2000
+ timer-t; //-> 3
2001
+
2002
+ LIB "equising.lib";
2003
+ option(prot);
2004
+ printlevel=2;
2005
+ ring r=0,(x,y),ds;
2006
+ poly f=(x-yx+y2)^2-(y+x)^31;
2007
+ list L=versal(f);
2008
+ def Px=L[1];
2009
+ setring Px;
2010
+ poly F=Fs[1,1];
2011
+ int t=timer;
2012
+ list M=esStratum(F);
2013
+ timer-t; //-> 233
2014
+
2015
+ LIB "equising.lib";
2016
+ printlevel=2;
2017
+ option(prot);
2018
+ timer=1;
2019
+ ring r=0,(x,y),ls;
2020
+ poly f=(x4-y4)^2-x10;
2021
+ list L=versal(f);
2022
+ def Px=L[1];
2023
+ setring Px;
2024
+ poly F=Fs[1,1];
2025
+ int t=timer;
2026
+ list M=esStratum(F,3);
2027
+ timer-t; //-> 8
2028
+
2029
+ LIB "equising.lib";
2030
+ printlevel=2;
2031
+ timer=1;
2032
+ ring rr=0,(x,y),ls;
2033
+ poly f=x7+y7+(x-y)^2*x2y2;
2034
+ list K=esIdeal(f);
2035
+ // tau_es
2036
+ vdim(std(K[1])); //-> 22
2037
+ // tau_es_fix
2038
+ vdim(std(K[2])); //-> 24
2039
+
2040
+ LIB "equising.lib";
2041
+ printlevel=2;
2042
+ timer=1;
2043
+ ring rr=0,(x,y),ls;
2044
+ poly f=x7+y7+(x-y)^2*x2y2+x2y4; // Newton non-deg.
2045
+ list K=esIdeal(f);
2046
+ // tau_es
2047
+ vdim(std(K[1])); //-> 21
2048
+ // tau_es_fix
2049
+ vdim(std(K[2])); //-> 23
2050
+
2051
+ LIB "equising.lib";
2052
+ ring r=0,(w,v),ds;
2053
+ poly f=w2-v199;
2054
+ list L=hnexpansion(f);
2055
+ list LL=versal(f);
2056
+ def Px=LL[1];
2057
+ setring Px;
2058
+ list L=imap(r,L);
2059
+ poly F=Fs[1,1];
2060
+ list M=esStratum(F,2,L);
2061
+
2062
+ LIB "equising.lib";
2063
+ printlevel=2;
2064
+ timer=1;
2065
+ ring rr=0,(A,B,C,x,y),ls;
2066
+ poly f=x7+y7+(x-y)^2*x2y2;
2067
+ poly F=f+A*y*diff(f,x)+B*x*diff(f,x)+C*diff(f,y);
2068
+ list M=esStratum(F,6);
2069
+ std(M[1][1]); // standard basis of equisingularity ideal
2070
+
2071
+ LIB "equising.lib";
2072
+ printlevel=2;
2073
+ timer=1;
2074
+ ring rr=0,(x,y),ls;
2075
+ poly f=x20+y7+(x-y)^2*x2y2+x2y4; // Newton non-degenerate
2076
+ list K=esIdeal(f);
2077
+ K;
2078
+
2079
+ ring rr=0,(x,y),ls;
2080
+ poly f=x6y-3x4y4-x4y5+3x2y7-x4y6+2x2y8-y10+2x2y9-y11+x2y10-y12-y13;
2081
+ list K=esIdeal(f);
2082
+ list L=versal(f);
2083
+ def Px=L[1];
2084
+ setring Px;
2085
+ poly F=Fs[1,1];
2086
+ list M=esStratum(F,2);
2087
+
2088
+ LIB "equising.lib";
2089
+ ring R=0,(A,B,C,D,x,y),ds;
2090
+ poly f=x6y-3x4y4-x4y5+3x2y7-x4y6+2x2y8-y10+2x2y9-y11+x2y10-y12-y13;
2091
+ poly F=f+Ax9+Bx7y2+Cx9y+Dx8y2;
2092
+ list M=esStratum(F,2);
2093
+
2094
+ LIB "equising.lib";
2095
+ printlevel=2;
2096
+ ring rr=0,(x,y),ls;
2097
+ poly f=x6y-3x4y4-x4y5+3x2y7-x4y6+2x2y8-y10+2x2y9-y11+x2y10-y12-y13;
2098
+ list K=esIdeal(f);
2099
+ vdim(std(K[1])); //-> 51
2100
+ tau_es(f); //-> 51
2101
+
2102
+ printlevel=3;
2103
+ f=f*(y-x2)*(y2-x3)*(x-y5);
2104
+ int t=timer;
2105
+ list L=esIdeal(f);
2106
+ vdim(std(L[1])); //-> 99
2107
+ timer-t; //-> 42
2108
+ t=timer;
2109
+ tau_es(f); //-> 99
2110
+ timer-t; //-> 23
2111
+
2112
+ LIB "equising.lib";
2113
+ printlevel=3;
2114
+ ring rr=0,(x,y),ds;
2115
+ poly f=x4+4x3y+6x2y2+4xy3+y4+2x2y15+4xy16+2y17+xy23+y24+y30+y31;
2116
+ list K=esIdeal(f);
2117
+ vdim(std(K[1])); //-> 68
2118
+ tau_es(f); //-> 68
2119
+
2120
+ list L=versal(f);
2121
+ def Px=L[1];
2122
+ setring Px;
2123
+ poly F=Fs[1,1];
2124
+ list M=esStratum(F);
2125
+ timer-t; //-> 0
2126
+
2127
+ */