passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

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

Potentially problematic release.


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

Files changed (490) hide show
  1. PySingular.cpython-314-aarch64-linux-gnu.so +0 -0
  2. passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
  3. passagemath_singular-10.6.31rc3.dist-info/RECORD +490 -0
  4. passagemath_singular-10.6.31rc3.dist-info/WHEEL +6 -0
  5. passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
  6. passagemath_singular.libs/libSingular-4-6a2a8666.4.1.so +0 -0
  7. passagemath_singular.libs/libcddgmp-ac579979.so.0.1.3 +0 -0
  8. passagemath_singular.libs/libfactory-4-66e33516.4.1.so +0 -0
  9. passagemath_singular.libs/libflint-81de1160.so.21.0.0 +0 -0
  10. passagemath_singular.libs/libgf2x-fbd36f80.so.3.0.0 +0 -0
  11. passagemath_singular.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  12. passagemath_singular.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  13. passagemath_singular.libs/libgsl-e3525837.so.28.0.0 +0 -0
  14. passagemath_singular.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  15. passagemath_singular.libs/libntl-0043a3a2.so.44.0.1 +0 -0
  16. passagemath_singular.libs/libomalloc-0-06512335.9.6.so +0 -0
  17. passagemath_singular.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  18. passagemath_singular.libs/libpolys-4-cb7246b5.4.1.so +0 -0
  19. passagemath_singular.libs/libreadline-28330744.so.8.2 +0 -0
  20. passagemath_singular.libs/libsingular_resources-4-8c425241.4.1.so +0 -0
  21. passagemath_singular.libs/libtinfo-f81c2d16.so.6.3 +0 -0
  22. sage/algebras/all__sagemath_singular.py +3 -0
  23. sage/algebras/fusion_rings/all.py +19 -0
  24. sage/algebras/fusion_rings/f_matrix.py +2448 -0
  25. sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-aarch64-linux-gnu.so +0 -0
  26. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
  27. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
  28. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-aarch64-linux-gnu.so +0 -0
  29. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
  30. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
  31. sage/algebras/fusion_rings/fusion_double.py +899 -0
  32. sage/algebras/fusion_rings/fusion_ring.py +1580 -0
  33. sage/algebras/fusion_rings/poly_tup_engine.cpython-314-aarch64-linux-gnu.so +0 -0
  34. sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
  35. sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
  36. sage/algebras/fusion_rings/shm_managers.cpython-314-aarch64-linux-gnu.so +0 -0
  37. sage/algebras/fusion_rings/shm_managers.pxd +24 -0
  38. sage/algebras/fusion_rings/shm_managers.pyx +780 -0
  39. sage/algebras/letterplace/all.py +1 -0
  40. sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  41. sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
  42. sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
  43. sage/algebras/letterplace/free_algebra_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
  45. sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
  46. sage/algebras/letterplace/letterplace_ideal.cpython-314-aarch64-linux-gnu.so +0 -0
  47. sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
  48. sage/algebras/quatalg/all.py +2 -0
  49. sage/algebras/quatalg/quaternion_algebra.py +4778 -0
  50. sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-aarch64-linux-gnu.so +0 -0
  51. sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
  52. sage/algebras/quatalg/quaternion_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  53. sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
  54. sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
  55. sage/all__sagemath_singular.py +11 -0
  56. sage/ext_data/all__sagemath_singular.py +1 -0
  57. sage/ext_data/singular/function_field/core.lib +98 -0
  58. sage/interfaces/all__sagemath_singular.py +1 -0
  59. sage/interfaces/singular.py +2835 -0
  60. sage/libs/all__sagemath_singular.py +1 -0
  61. sage/libs/singular/__init__.py +1 -0
  62. sage/libs/singular/decl.pxd +1168 -0
  63. sage/libs/singular/function.cpython-314-aarch64-linux-gnu.so +0 -0
  64. sage/libs/singular/function.pxd +87 -0
  65. sage/libs/singular/function.pyx +1901 -0
  66. sage/libs/singular/function_factory.py +61 -0
  67. sage/libs/singular/groebner_strategy.cpython-314-aarch64-linux-gnu.so +0 -0
  68. sage/libs/singular/groebner_strategy.pxd +22 -0
  69. sage/libs/singular/groebner_strategy.pyx +582 -0
  70. sage/libs/singular/option.cpython-314-aarch64-linux-gnu.so +0 -0
  71. sage/libs/singular/option.pyx +671 -0
  72. sage/libs/singular/polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/libs/singular/polynomial.pxd +39 -0
  74. sage/libs/singular/polynomial.pyx +661 -0
  75. sage/libs/singular/ring.cpython-314-aarch64-linux-gnu.so +0 -0
  76. sage/libs/singular/ring.pxd +58 -0
  77. sage/libs/singular/ring.pyx +893 -0
  78. sage/libs/singular/singular.cpython-314-aarch64-linux-gnu.so +0 -0
  79. sage/libs/singular/singular.pxd +72 -0
  80. sage/libs/singular/singular.pyx +1944 -0
  81. sage/libs/singular/standard_options.py +145 -0
  82. sage/matrix/all__sagemath_singular.py +1 -0
  83. sage/matrix/matrix_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  84. sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
  85. sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
  86. sage/rings/all__sagemath_singular.py +1 -0
  87. sage/rings/function_field/all__sagemath_singular.py +1 -0
  88. sage/rings/function_field/derivations_polymod.py +911 -0
  89. sage/rings/function_field/element_polymod.cpython-314-aarch64-linux-gnu.so +0 -0
  90. sage/rings/function_field/element_polymod.pyx +406 -0
  91. sage/rings/function_field/function_field_polymod.py +2611 -0
  92. sage/rings/function_field/ideal_polymod.py +1775 -0
  93. sage/rings/function_field/order_polymod.py +1475 -0
  94. sage/rings/function_field/place_polymod.py +681 -0
  95. sage/rings/polynomial/all__sagemath_singular.py +1 -0
  96. sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
  98. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
  99. sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  100. sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
  101. sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
  102. sage/rings/polynomial/plural.cpython-314-aarch64-linux-gnu.so +0 -0
  103. sage/rings/polynomial/plural.pxd +48 -0
  104. sage/rings/polynomial/plural.pyx +3171 -0
  105. sage/symbolic/all__sagemath_singular.py +1 -0
  106. sage/symbolic/comparison_impl.pxi +428 -0
  107. sage/symbolic/constants_c_impl.pxi +178 -0
  108. sage/symbolic/expression.cpython-314-aarch64-linux-gnu.so +0 -0
  109. sage/symbolic/expression.pxd +7 -0
  110. sage/symbolic/expression.pyx +14200 -0
  111. sage/symbolic/getitem_impl.pxi +202 -0
  112. sage/symbolic/pynac.pxi +572 -0
  113. sage/symbolic/pynac_constant_impl.pxi +133 -0
  114. sage/symbolic/pynac_function_impl.pxi +206 -0
  115. sage/symbolic/pynac_impl.pxi +2576 -0
  116. sage/symbolic/pynac_wrap.h +124 -0
  117. sage/symbolic/series_impl.pxi +272 -0
  118. sage/symbolic/substitution_map_impl.pxi +94 -0
  119. sage_wheels/bin/ESingular +0 -0
  120. sage_wheels/bin/Singular +0 -0
  121. sage_wheels/bin/TSingular +0 -0
  122. sage_wheels/lib/singular/MOD/cohomo.la +41 -0
  123. sage_wheels/lib/singular/MOD/cohomo.so +0 -0
  124. sage_wheels/lib/singular/MOD/customstd.la +41 -0
  125. sage_wheels/lib/singular/MOD/customstd.so +0 -0
  126. sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
  127. sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
  128. sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
  129. sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
  130. sage_wheels/lib/singular/MOD/gitfan.la +41 -0
  131. sage_wheels/lib/singular/MOD/gitfan.so +0 -0
  132. sage_wheels/lib/singular/MOD/interval.la +41 -0
  133. sage_wheels/lib/singular/MOD/interval.so +0 -0
  134. sage_wheels/lib/singular/MOD/loctriv.la +41 -0
  135. sage_wheels/lib/singular/MOD/loctriv.so +0 -0
  136. sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
  137. sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
  138. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
  139. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
  140. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
  141. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
  142. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
  143. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
  144. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
  145. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
  146. sage_wheels/lib/singular/MOD/partialgb.la +41 -0
  147. sage_wheels/lib/singular/MOD/partialgb.so +0 -0
  148. sage_wheels/lib/singular/MOD/pyobject.la +41 -0
  149. sage_wheels/lib/singular/MOD/pyobject.so +0 -0
  150. sage_wheels/lib/singular/MOD/singmathic.la +41 -0
  151. sage_wheels/lib/singular/MOD/singmathic.so +0 -0
  152. sage_wheels/lib/singular/MOD/sispasm.la +41 -0
  153. sage_wheels/lib/singular/MOD/sispasm.so +0 -0
  154. sage_wheels/lib/singular/MOD/subsets.la +41 -0
  155. sage_wheels/lib/singular/MOD/subsets.so +0 -0
  156. sage_wheels/lib/singular/MOD/systhreads.la +41 -0
  157. sage_wheels/lib/singular/MOD/systhreads.so +0 -0
  158. sage_wheels/lib/singular/MOD/syzextra.la +41 -0
  159. sage_wheels/lib/singular/MOD/syzextra.so +0 -0
  160. sage_wheels/libexec/singular/MOD/change_cost +0 -0
  161. sage_wheels/libexec/singular/MOD/singularsurf +11 -0
  162. sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
  163. sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
  164. sage_wheels/libexec/singular/MOD/solve_IP +0 -0
  165. sage_wheels/libexec/singular/MOD/surfex +16 -0
  166. sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
  167. sage_wheels/share/factory/gftables/10201 +342 -0
  168. sage_wheels/share/factory/gftables/1024 +37 -0
  169. sage_wheels/share/factory/gftables/10609 +356 -0
  170. sage_wheels/share/factory/gftables/11449 +384 -0
  171. sage_wheels/share/factory/gftables/11881 +398 -0
  172. sage_wheels/share/factory/gftables/121 +6 -0
  173. sage_wheels/share/factory/gftables/12167 +408 -0
  174. sage_wheels/share/factory/gftables/125 +7 -0
  175. sage_wheels/share/factory/gftables/12769 +428 -0
  176. sage_wheels/share/factory/gftables/128 +7 -0
  177. sage_wheels/share/factory/gftables/1331 +47 -0
  178. sage_wheels/share/factory/gftables/1369 +48 -0
  179. sage_wheels/share/factory/gftables/14641 +490 -0
  180. sage_wheels/share/factory/gftables/15625 +523 -0
  181. sage_wheels/share/factory/gftables/16 +3 -0
  182. sage_wheels/share/factory/gftables/16129 +540 -0
  183. sage_wheels/share/factory/gftables/16384 +549 -0
  184. sage_wheels/share/factory/gftables/16807 +563 -0
  185. sage_wheels/share/factory/gftables/1681 +58 -0
  186. sage_wheels/share/factory/gftables/169 +8 -0
  187. sage_wheels/share/factory/gftables/17161 +574 -0
  188. sage_wheels/share/factory/gftables/1849 +64 -0
  189. sage_wheels/share/factory/gftables/18769 +628 -0
  190. sage_wheels/share/factory/gftables/19321 +646 -0
  191. sage_wheels/share/factory/gftables/19683 +659 -0
  192. sage_wheels/share/factory/gftables/2048 +71 -0
  193. sage_wheels/share/factory/gftables/2187 +75 -0
  194. sage_wheels/share/factory/gftables/2197 +76 -0
  195. sage_wheels/share/factory/gftables/2209 +76 -0
  196. sage_wheels/share/factory/gftables/22201 +742 -0
  197. sage_wheels/share/factory/gftables/22801 +762 -0
  198. sage_wheels/share/factory/gftables/2401 +82 -0
  199. sage_wheels/share/factory/gftables/243 +11 -0
  200. sage_wheels/share/factory/gftables/24389 +815 -0
  201. sage_wheels/share/factory/gftables/24649 +824 -0
  202. sage_wheels/share/factory/gftables/25 +3 -0
  203. sage_wheels/share/factory/gftables/256 +11 -0
  204. sage_wheels/share/factory/gftables/26569 +888 -0
  205. sage_wheels/share/factory/gftables/27 +3 -0
  206. sage_wheels/share/factory/gftables/27889 +932 -0
  207. sage_wheels/share/factory/gftables/2809 +96 -0
  208. sage_wheels/share/factory/gftables/28561 +954 -0
  209. sage_wheels/share/factory/gftables/289 +12 -0
  210. sage_wheels/share/factory/gftables/29791 +995 -0
  211. sage_wheels/share/factory/gftables/29929 +1000 -0
  212. sage_wheels/share/factory/gftables/3125 +107 -0
  213. sage_wheels/share/factory/gftables/32 +4 -0
  214. sage_wheels/share/factory/gftables/32041 +1070 -0
  215. sage_wheels/share/factory/gftables/32761 +1094 -0
  216. sage_wheels/share/factory/gftables/32768 +1095 -0
  217. sage_wheels/share/factory/gftables/343 +14 -0
  218. sage_wheels/share/factory/gftables/3481 +118 -0
  219. sage_wheels/share/factory/gftables/361 +14 -0
  220. sage_wheels/share/factory/gftables/36481 +1218 -0
  221. sage_wheels/share/factory/gftables/3721 +126 -0
  222. sage_wheels/share/factory/gftables/37249 +1244 -0
  223. sage_wheels/share/factory/gftables/38809 +1296 -0
  224. sage_wheels/share/factory/gftables/39601 +1322 -0
  225. sage_wheels/share/factory/gftables/4 +3 -0
  226. sage_wheels/share/factory/gftables/4096 +139 -0
  227. sage_wheels/share/factory/gftables/44521 +1486 -0
  228. sage_wheels/share/factory/gftables/4489 +152 -0
  229. sage_wheels/share/factory/gftables/49 +4 -0
  230. sage_wheels/share/factory/gftables/4913 +166 -0
  231. sage_wheels/share/factory/gftables/49729 +1660 -0
  232. sage_wheels/share/factory/gftables/5041 +170 -0
  233. sage_wheels/share/factory/gftables/50653 +1691 -0
  234. sage_wheels/share/factory/gftables/512 +20 -0
  235. sage_wheels/share/factory/gftables/51529 +1720 -0
  236. sage_wheels/share/factory/gftables/52441 +1750 -0
  237. sage_wheels/share/factory/gftables/529 +20 -0
  238. sage_wheels/share/factory/gftables/5329 +180 -0
  239. sage_wheels/share/factory/gftables/54289 +1812 -0
  240. sage_wheels/share/factory/gftables/57121 +1906 -0
  241. sage_wheels/share/factory/gftables/58081 +1938 -0
  242. sage_wheels/share/factory/gftables/59049 +1971 -0
  243. sage_wheels/share/factory/gftables/6241 +210 -0
  244. sage_wheels/share/factory/gftables/625 +23 -0
  245. sage_wheels/share/factory/gftables/63001 +2102 -0
  246. sage_wheels/share/factory/gftables/64 +5 -0
  247. sage_wheels/share/factory/gftables/6561 +221 -0
  248. sage_wheels/share/factory/gftables/6859 +231 -0
  249. sage_wheels/share/factory/gftables/6889 +232 -0
  250. sage_wheels/share/factory/gftables/729 +27 -0
  251. sage_wheels/share/factory/gftables/7921 +266 -0
  252. sage_wheels/share/factory/gftables/8 +3 -0
  253. sage_wheels/share/factory/gftables/81 +5 -0
  254. sage_wheels/share/factory/gftables/8192 +276 -0
  255. sage_wheels/share/factory/gftables/841 +30 -0
  256. sage_wheels/share/factory/gftables/9 +3 -0
  257. sage_wheels/share/factory/gftables/9409 +316 -0
  258. sage_wheels/share/factory/gftables/961 +34 -0
  259. sage_wheels/share/info/singular.info +191898 -0
  260. sage_wheels/share/singular/LIB/GND.lib +1359 -0
  261. sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
  262. sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
  263. sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
  264. sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
  265. sage_wheels/share/singular/LIB/VecField.lib +1542 -0
  266. sage_wheels/share/singular/LIB/absfact.lib +959 -0
  267. sage_wheels/share/singular/LIB/ainvar.lib +730 -0
  268. sage_wheels/share/singular/LIB/aksaka.lib +419 -0
  269. sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
  270. sage_wheels/share/singular/LIB/algebra.lib +1193 -0
  271. sage_wheels/share/singular/LIB/all.lib +136 -0
  272. sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
  273. sage_wheels/share/singular/LIB/arnold.lib +4553 -0
  274. sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
  275. sage_wheels/share/singular/LIB/arr.lib +3486 -0
  276. sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
  277. sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
  278. sage_wheels/share/singular/LIB/bfun.lib +1964 -0
  279. sage_wheels/share/singular/LIB/bimodules.lib +774 -0
  280. sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
  281. sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
  282. sage_wheels/share/singular/LIB/central.lib +2169 -0
  283. sage_wheels/share/singular/LIB/chern.lib +4162 -0
  284. sage_wheels/share/singular/LIB/cimonom.lib +571 -0
  285. sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
  286. sage_wheels/share/singular/LIB/classify.lib +3239 -0
  287. sage_wheels/share/singular/LIB/classify2.lib +1462 -0
  288. sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
  289. sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
  290. sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
  291. sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
  292. sage_wheels/share/singular/LIB/combinat.lib +91 -0
  293. sage_wheels/share/singular/LIB/compregb.lib +276 -0
  294. sage_wheels/share/singular/LIB/control.lib +1636 -0
  295. sage_wheels/share/singular/LIB/crypto.lib +3795 -0
  296. sage_wheels/share/singular/LIB/curveInv.lib +667 -0
  297. sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
  298. sage_wheels/share/singular/LIB/customstd.lib +100 -0
  299. sage_wheels/share/singular/LIB/deRham.lib +5979 -0
  300. sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
  301. sage_wheels/share/singular/LIB/decomp.lib +1655 -0
  302. sage_wheels/share/singular/LIB/deflation.lib +872 -0
  303. sage_wheels/share/singular/LIB/deform.lib +925 -0
  304. sage_wheels/share/singular/LIB/difform.lib +3055 -0
  305. sage_wheels/share/singular/LIB/divisors.lib +750 -0
  306. sage_wheels/share/singular/LIB/dmod.lib +5817 -0
  307. sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
  308. sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
  309. sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
  310. sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
  311. sage_wheels/share/singular/LIB/dummy.lib +17 -0
  312. sage_wheels/share/singular/LIB/elim.lib +1009 -0
  313. sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
  314. sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
  315. sage_wheels/share/singular/LIB/equising.lib +2127 -0
  316. sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
  317. sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
  318. sage_wheels/share/singular/LIB/findifs.lib +778 -0
  319. sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
  320. sage_wheels/share/singular/LIB/finvar.lib +7989 -0
  321. sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
  322. sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
  323. sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
  324. sage_wheels/share/singular/LIB/freegb.lib +3853 -0
  325. sage_wheels/share/singular/LIB/general.lib +1350 -0
  326. sage_wheels/share/singular/LIB/gfan.lib +1768 -0
  327. sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
  328. sage_wheels/share/singular/LIB/gkdim.lib +99 -0
  329. sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
  330. sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
  331. sage_wheels/share/singular/LIB/goettsche.lib +909 -0
  332. sage_wheels/share/singular/LIB/graal.lib +1366 -0
  333. sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
  334. sage_wheels/share/singular/LIB/graphics.lib +360 -0
  335. sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
  336. sage_wheels/share/singular/LIB/groups.lib +1123 -0
  337. sage_wheels/share/singular/LIB/grwalk.lib +507 -0
  338. sage_wheels/share/singular/LIB/hdepth.lib +194 -0
  339. sage_wheels/share/singular/LIB/help.cnf +57 -0
  340. sage_wheels/share/singular/LIB/hess.lib +1946 -0
  341. sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
  342. sage_wheels/share/singular/LIB/hodge.lib +400 -0
  343. sage_wheels/share/singular/LIB/homolog.lib +1965 -0
  344. sage_wheels/share/singular/LIB/hyperel.lib +975 -0
  345. sage_wheels/share/singular/LIB/inout.lib +679 -0
  346. sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
  347. sage_wheels/share/singular/LIB/interval.lib +1418 -0
  348. sage_wheels/share/singular/LIB/intprog.lib +778 -0
  349. sage_wheels/share/singular/LIB/invar.lib +443 -0
  350. sage_wheels/share/singular/LIB/involut.lib +980 -0
  351. sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
  352. sage_wheels/share/singular/LIB/kskernel.lib +534 -0
  353. sage_wheels/share/singular/LIB/latex.lib +3146 -0
  354. sage_wheels/share/singular/LIB/lejeune.lib +651 -0
  355. sage_wheels/share/singular/LIB/linalg.lib +2040 -0
  356. sage_wheels/share/singular/LIB/locnormal.lib +212 -0
  357. sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
  358. sage_wheels/share/singular/LIB/makedbm.lib +294 -0
  359. sage_wheels/share/singular/LIB/mathml.lib +813 -0
  360. sage_wheels/share/singular/LIB/matrix.lib +1372 -0
  361. sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
  362. sage_wheels/share/singular/LIB/methods.lib +212 -0
  363. sage_wheels/share/singular/LIB/moddiq.lib +322 -0
  364. sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
  365. sage_wheels/share/singular/LIB/modnormal.lib +218 -0
  366. sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
  367. sage_wheels/share/singular/LIB/modquotient.lib +269 -0
  368. sage_wheels/share/singular/LIB/modstd.lib +1024 -0
  369. sage_wheels/share/singular/LIB/modular.lib +545 -0
  370. sage_wheels/share/singular/LIB/modules.lib +2561 -0
  371. sage_wheels/share/singular/LIB/modwalk.lib +609 -0
  372. sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
  373. sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
  374. sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
  375. sage_wheels/share/singular/LIB/mregular.lib +1863 -0
  376. sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
  377. sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
  378. sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
  379. sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
  380. sage_wheels/share/singular/LIB/ncall.lib +31 -0
  381. sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
  382. sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
  383. sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
  384. sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
  385. sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
  386. sage_wheels/share/singular/LIB/ncloc.lib +361 -0
  387. sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
  388. sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
  389. sage_wheels/share/singular/LIB/nctools.lib +1887 -0
  390. sage_wheels/share/singular/LIB/nets.lib +1456 -0
  391. sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
  392. sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
  393. sage_wheels/share/singular/LIB/noether.lib +1106 -0
  394. sage_wheels/share/singular/LIB/normal.lib +8700 -0
  395. sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
  396. sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
  397. sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
  398. sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
  399. sage_wheels/share/singular/LIB/olga.lib +1933 -0
  400. sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
  401. sage_wheels/share/singular/LIB/parallel.lib +319 -0
  402. sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
  403. sage_wheels/share/singular/LIB/perron.lib +202 -0
  404. sage_wheels/share/singular/LIB/pfd.lib +2223 -0
  405. sage_wheels/share/singular/LIB/phindex.lib +642 -0
  406. sage_wheels/share/singular/LIB/pointid.lib +673 -0
  407. sage_wheels/share/singular/LIB/polybori.lib +1430 -0
  408. sage_wheels/share/singular/LIB/polyclass.lib +525 -0
  409. sage_wheels/share/singular/LIB/polylib.lib +1174 -0
  410. sage_wheels/share/singular/LIB/polymake.lib +1902 -0
  411. sage_wheels/share/singular/LIB/presolve.lib +1533 -0
  412. sage_wheels/share/singular/LIB/primdec.lib +9576 -0
  413. sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
  414. sage_wheels/share/singular/LIB/primitiv.lib +401 -0
  415. sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
  416. sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
  417. sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
  418. sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
  419. sage_wheels/share/singular/LIB/random.lib +455 -0
  420. sage_wheels/share/singular/LIB/ratgb.lib +489 -0
  421. sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
  422. sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
  423. sage_wheels/share/singular/LIB/realrad.lib +1197 -0
  424. sage_wheels/share/singular/LIB/recover.lib +2628 -0
  425. sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
  426. sage_wheels/share/singular/LIB/reesclos.lib +465 -0
  427. sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
  428. sage_wheels/share/singular/LIB/resgraph.lib +789 -0
  429. sage_wheels/share/singular/LIB/resjung.lib +820 -0
  430. sage_wheels/share/singular/LIB/resolve.lib +5110 -0
  431. sage_wheels/share/singular/LIB/resources.lib +170 -0
  432. sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
  433. sage_wheels/share/singular/LIB/ring.lib +1328 -0
  434. sage_wheels/share/singular/LIB/ringgb.lib +343 -0
  435. sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
  436. sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
  437. sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
  438. sage_wheels/share/singular/LIB/rootsur.lib +886 -0
  439. sage_wheels/share/singular/LIB/rstandard.lib +607 -0
  440. sage_wheels/share/singular/LIB/rwalk.lib +336 -0
  441. sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
  442. sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
  443. sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
  444. sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
  445. sage_wheels/share/singular/LIB/schreyer.lib +321 -0
  446. sage_wheels/share/singular/LIB/schubert.lib +2551 -0
  447. sage_wheels/share/singular/LIB/sets.lib +524 -0
  448. sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
  449. sage_wheels/share/singular/LIB/signcond.lib +437 -0
  450. sage_wheels/share/singular/LIB/sing.lib +1094 -0
  451. sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
  452. sage_wheels/share/singular/LIB/solve.lib +2243 -0
  453. sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
  454. sage_wheels/share/singular/LIB/spectrum.lib +62 -0
  455. sage_wheels/share/singular/LIB/sresext.lib +757 -0
  456. sage_wheels/share/singular/LIB/ssi.lib +143 -0
  457. sage_wheels/share/singular/LIB/standard.lib +2769 -0
  458. sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
  459. sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
  460. sage_wheels/share/singular/LIB/stratify.lib +1070 -0
  461. sage_wheels/share/singular/LIB/surf.lib +506 -0
  462. sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
  463. sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
  464. sage_wheels/share/singular/LIB/surfex.lib +1462 -0
  465. sage_wheels/share/singular/LIB/swalk.lib +877 -0
  466. sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
  467. sage_wheels/share/singular/LIB/systhreads.lib +74 -0
  468. sage_wheels/share/singular/LIB/tasks.lib +1324 -0
  469. sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
  470. sage_wheels/share/singular/LIB/teachstd.lib +858 -0
  471. sage_wheels/share/singular/LIB/template.lib +116 -0
  472. sage_wheels/share/singular/LIB/toric.lib +1119 -0
  473. sage_wheels/share/singular/LIB/transformation.lib +116 -0
  474. sage_wheels/share/singular/LIB/triang.lib +1197 -0
  475. sage_wheels/share/singular/LIB/tropical.lib +8741 -0
  476. sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
  477. sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
  478. sage_wheels/share/singular/LIB/tst.lib +1108 -0
  479. sage_wheels/share/singular/LIB/weierstr.lib +241 -0
  480. sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
  481. sage_wheels/share/singular/emacs/.emacs-general +184 -0
  482. sage_wheels/share/singular/emacs/.emacs-singular +234 -0
  483. sage_wheels/share/singular/emacs/COPYING +44 -0
  484. sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
  485. sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
  486. sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
  487. sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
  488. sage_wheels/share/singular/emacs/singular.el +4273 -0
  489. sage_wheels/share/singular/emacs/singular.xpm +39 -0
  490. sage_wheels/share/singular/singular.idx +5002 -0
@@ -0,0 +1,2802 @@
1
+ /////////////////////////////////////////////////////////////////////////
2
+ version="version resbinomial.lib 4.1.2.0 Feb_2019 "; // $Id: b58960134e9770e5033adaa66a216cf929b04412 $
3
+ category="Resolution of singularities";
4
+ info="
5
+ LIBRARY: resbinomial.lib Combinatorial algorithm of resolution of singularities
6
+ of binomial ideals in arbitrary characteristic.
7
+ Binomial resolution algorithm of Blanco
8
+
9
+ AUTHORS: R. Blanco, mariarocio.blanco@uclm.es,
10
+ @* G. Pfister, pfister@mathematik.uni-kl.de
11
+
12
+ PROCEDURES:
13
+ BINresol(J); computes a E-resolution of singularities of (J) (THE SECOND PART IS NOT IMPLEMENTED YET)
14
+
15
+ Eresol(J); computes a E-resolution of singularities of (J) in char 0
16
+ determinecenter(L1,L2,c,n,Y,a,mb,flag,control3); computes the next blowing-up center
17
+ Blowupcenter(L1,id,m,L2,c,n,h); makes the blowing-up
18
+ Nonhyp(Coef,expJ,sJ,n,flag,sums); computes the ideal generated by the non hyperbolic generators of expJ
19
+
20
+ identifyvar(); identifies status of variables
21
+ Edatalist(Coef,Exp,k,n,flag); gives the E-order of each term in Exp
22
+ EOrdlist(Coef,Exp,k,n,flag); computes the E-order of an ideal (giving in the language of lists)
23
+ maxEord(Coef,Exp,k,n,flag); computes de maximum E-order of an ideal given by Coef and Exp
24
+ ECoef(Coef,expP,sP,V,auxc,n,flag); Computes a simplified version of the E-Coeff ideal. The E-orders are correct,
25
+ but transformations of coefficients of the generators and powers of binomials
26
+ cannot be computed easily in terms of lists.
27
+ elimrep(L); removes repeated terms from a list
28
+ Emaxcont(Coef,Exp,k,n,flag); computes a list of hypersurfaces of E-maximal contact
29
+ cleanunit(mon,n,flag); clean the units in a monomial mon
30
+ resfunction(t,auxinv,nchart,n); composes the E-resolution function
31
+ calculateI(Coef,J,c,n,Y,a,b,D); computes the order of the non monomial part of an ideal J
32
+ Maxord(L,n); computes the maximum exponent of an exceptional monomial ideal
33
+ Gamma(L,c,n); computes the Gamma function for an exceptional monomial ideal given by L
34
+
35
+ convertdata(C,L,n,flag); computes the ideal corresponding to C,L
36
+ lcmofall(nchart,mobile); computes the lcm of the denominators of the E-orders for all the charts
37
+ computemcm(Eolist); computes the lcm of the denominators of the E-orders for one chart
38
+
39
+ constructH(Hhist,n,flag); construct the list of exceptional divisors accumulated at this chart
40
+ constructblwup(blwhist,n,chy,flag); construct the ideal defining the map K[W] --> K[Wi],
41
+ which gives the composition map of all the blowing up leading to this chart
42
+ constructlastblwup(blwhist,n,chy,flag); construct the ideal defining the last blowup leading to this chart
43
+
44
+ genoutput(chart,mobile,nchart,nsons,n,q,p); generates the output for visualization
45
+ salida(idchart,chart,mobile,numson,previousa,n,q); generates the output for one chart
46
+
47
+ iniD(n); creates a list of lists of zeros of size n
48
+ sumlist(L1,L2); sums two lists component to component
49
+ reslist(L1,L2); subtracts two lists component to component
50
+ multiplylist(L,a); multiplies a list by a number, component to component
51
+ dividelist(L1,L2); divides two lists component to component
52
+ createlist(L1,L2); creates a list of lists of two elements
53
+ ";
54
+ // inidata(K,k); verifies input data, a binomial ideal K of k generators
55
+ // data(K,k,n); transforms data on lists of length n
56
+ // list0(n); creates a list of zeros of size n
57
+
58
+ LIB "general.lib";
59
+ LIB "qhmoduli.lib";
60
+ LIB "inout.lib";
61
+ LIB "polylib.lib";
62
+ LIB "resolve.lib";
63
+ LIB "reszeta.lib";
64
+ LIB "resgraph.lib";
65
+ ////////////////////////////////////////////////////////////////////////////
66
+
67
+ static proc inidata(ideal K,int k)
68
+ "USAGE: inidata(K,k); K any ideal, k integer (!=0)
69
+ COMPUTE: Verifies the input data
70
+ RETURN: flag indicating if the ideal is binomial or not
71
+ EXAMPLE: example inidata; shows an example
72
+ "
73
+ {
74
+ int i;
75
+ for (i=1;i<=k; i++)
76
+ { if (size(K[i])>2){return(0);}
77
+ }
78
+ return(1);
79
+ }
80
+ example
81
+ {"EXAMPLE:"; echo = 2;
82
+ ring r = 0,(x(1..3)),dp;
83
+ ideal J1=x(1)^4*x(2)^2, x(1)^2+x(3)^3;
84
+ inidata(J1,2);
85
+
86
+ ideal J2=x(1)^4*x(2)^2, x(1)^2+x(2)^3+x(3)^5;
87
+ inidata(J2,2);
88
+ }
89
+ /////////////////////////////////////////////////////////////////////////////////
90
+
91
+ proc changeoriginalvar()
92
+ "USAGE: changeoriginalvar();
93
+ COMPUTE: Change the name of the variables to x(1...n), only necessary at the beginning
94
+ RETURN: the new ring with the suitable names
95
+ EXAMPLE: example changeoriginalvar; shows an example
96
+ "
97
+ {
98
+ int i,n,cont;
99
+
100
+ n=nvars(basering);
101
+ cont=0;
102
+ def r=basering;
103
+
104
+ // check the name of the variables
105
+
106
+ for (i=1;i<=n; i++){if (varstr(i)[1]=="x" or varstr(i)[1]=="y"){cont=cont+1;}}
107
+
108
+ // change them if there exists some variable different from x(i) or y(i)
109
+
110
+ if (cont!=n or n<=2){
111
+ // making the change
112
+ def Rnew=changevar ("x()");
113
+ setring Rnew;
114
+ // print("INVERTIBLE VARIABLES NOT CONSIDERED AT THE BEGINNING");
115
+ return(Rnew,1);
116
+ }
117
+ else{ // print("INVERTIBLE VARIABLES ALREADY CONSIDERED AT THE BEGINNING");
118
+ return(r,0);
119
+ }
120
+ }
121
+ example
122
+ {"EXAMPLE:"; echo = 2;
123
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
124
+ changeoriginalvar();
125
+
126
+ ring r = 0,(x,y,z,w),dp;
127
+ changeoriginalvar();
128
+ }
129
+
130
+ /////////////////////////////////////////////////////////////////////////////////
131
+
132
+ proc identifyvar()
133
+ "USAGE: identifyvar();
134
+ COMPUTE: Assign 0 to variables x and 1 to variables y, only necessary at the beginning
135
+ RETURN: list, say l, of size the dimension of the basering
136
+ l[i] is: 0 if the i-th variable is x(i),
137
+ 1 if the i-th variable is y(i)
138
+ EXAMPLE: example identifyvar; shows an example
139
+ "
140
+ {
141
+ int i,n;
142
+ list flaglist;
143
+
144
+ n=nvars(basering);
145
+ flaglist=list0(n);
146
+
147
+ for (i=1;i<=n; i++){if (varstr(i)[1]=="y"){flaglist[i]=1;}}
148
+
149
+ return(flaglist);
150
+ }
151
+ example
152
+ {"EXAMPLE:"; echo = 2;
153
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
154
+ identifyvar();
155
+ }
156
+ /////////////////////////////////////////////////////////////////////////////////
157
+
158
+ proc data(ideal K,int k,int n)
159
+ "USAGE: data(K,k,n); K any ideal, k integer (!=0), n integer (!=0)
160
+ COMPUTE: Constructs a list with the coefficients and exponents of one ideal
161
+ RETURN: lists of coefficients and exponents of K
162
+ EXAMPLE: example data; shows an example
163
+ "
164
+ {int i,j,lon;
165
+ number aa;
166
+ intvec cc;
167
+ list bb,dd,aux,ddaux,Coef,Exp;
168
+
169
+ for (i=1;i<=k; i++)
170
+ { lon=size(K[i]);
171
+
172
+ // binomial
173
+ if (lon==2){aa=leadcoef(K[i][1]);
174
+ bb=aa;
175
+ Coef[i]=bb; // coefficients
176
+ cc=leadexp(K[i][1]); // exponents
177
+
178
+ // cc is an intvec, transform cc in dd, a list of lists
179
+ dd=cc[1..n];
180
+ aux[1]=dd;
181
+ // the same for the second term
182
+
183
+ aa=leadcoef(K[i][2]);
184
+ bb=aa;
185
+ Coef[i]=Coef[i] + bb; // all the coefficients of i-th generator of K
186
+ cc=leadexp(K[i][2]);
187
+
188
+ dd=cc[1..n];
189
+ aux[2]=dd;
190
+ Exp[i]=aux;}
191
+
192
+ // monomial
193
+ if (lon==1){aux=list();
194
+ aa=leadcoef(K[i][1]);
195
+ bb=aa;
196
+ Coef[i]=bb;
197
+ cc=leadexp(K[i][1]);
198
+ dd=cc[1..n];
199
+ aux[1]=dd;
200
+ Exp[i]=aux;}
201
+ } //end for
202
+ return(Coef,Exp);
203
+ }
204
+ example
205
+ {"EXAMPLE:"; echo = 2;
206
+ ring r = 0,(x(1..3)),dp;
207
+ ideal J=x(1)^4*x(2)^2, x(1)^2-x(3)^3;
208
+ data(J,2,3);
209
+ }
210
+ //////////////////////////////////////////////////////
211
+
212
+ proc Edatalist(list Coef,list Exp,int k,int n,list flaglist)
213
+ "USAGE: Edatalist(Coef,Exp,k,n,flaglist);
214
+ Coef,Exp,flaglist lists, k,n, integers
215
+ Exp is a list of lists of exponents, k=size(Exp)
216
+ COMPUTE: computes a list with the E-order of each term
217
+ RETURN: a list with the E-order of each term
218
+ EXAMPLE: example Edatalist; shows an example
219
+ "
220
+ {int i,j,lon,mm;
221
+ list dd,ss,sums;
222
+ number aux,aux1,aux2;
223
+
224
+ for (i=1;i<=k;i++){lon=size(Coef[i]);
225
+ if (lon==1) { for (j=1;j<=n;j++){if (flaglist[j]==0){aux=aux+Exp[i][1][j];}}
226
+ ss=aux; aux=0;} // monomial
227
+ else { for (j=1;j<=n;j++){if (flaglist[j]==0){ aux1=aux1+Exp[i][1][j];
228
+ aux2=aux2+Exp[i][2][j];}}
229
+ ss=aux1,aux2; aux1=0; aux2=0; } // binomial
230
+ sums[i]=ss;}
231
+ return(sums);
232
+ }
233
+ example
234
+ {"EXAMPLE:"; echo = 2;
235
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
236
+ list flag=identifyvar();
237
+ ideal J=x(1)^3*x(3)-y(2)*y(4)^2,x(5)*y(2)-x(7)*y(4)^2,x(6)^2*(1-y(4)*y(8)^5);
238
+ list L=data(J,3,8);
239
+ list EL=Edatalist(L[1],L[2],3,8,flag);
240
+ EL; // E-order of each term
241
+
242
+
243
+ ring r = 2,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
244
+ list flag=identifyvar();
245
+ ideal J=x(1)^3*x(3)-y(2)*y(4)^2,x(5)*y(2)-x(7)*y(4)^2,x(6)^2*(1-y(4)*y(8)^5);
246
+ list L=data(J,3,8);
247
+ list EL=Edatalist(L[1],L[2],3,8,flag);
248
+ EL; // E-order of each term IN CHAR 2, COMPUTATIONS NEED TO BE DONE IN CHAR 0
249
+
250
+
251
+ ring r = 0,(x(1..3)),dp;
252
+ list flag=identifyvar();
253
+ ideal J=x(1)^4*x(2)^2, x(1)^2-x(3)^3;
254
+ list L=data(J,2,3);
255
+ list EL=Edatalist(L[1],L[2],2,3,flag);
256
+ EL; // E-order of each term
257
+ }
258
+ ///////////////////////////////////////////////////////////////////////////////////
259
+
260
+ proc EOrdlist(list Coef,list Exp,int k,int n,list flaglist)
261
+ "USAGE: EOrdlist(Coef,Exp,k,n,flaglist);
262
+ Coef,Exp,flaglist lists, k,n, integers
263
+ Exp is a list of lists of exponents, k=size(Exp)
264
+ COMPUTE: computes de E-order of an ideal given by a list (Coef,Exp) and extra information
265
+ RETURN: maximal E-order, and its position=number of generator and term
266
+ EXAMPLE: example EOrdlist; shows an example
267
+ "
268
+ {int i,can,canpost,lon;
269
+ number canmin;
270
+ list sums;
271
+
272
+ sums=Edatalist(Coef,Exp,k,n,flaglist);
273
+
274
+ canmin=sums[1][1]; // inicializating, works also with a monomial
275
+ for (i=1;i<=k; i++){lon=size(sums[i]); // this is 2 for binomial and 1 for monomial generators
276
+ if (sums[i][1]<=canmin and Coef[i][1]!=0){canmin=sums[i][1];
277
+ can=i; canpost=1;}
278
+
279
+ // if the generator is a binomial we check the second term
280
+
281
+ if (lon==2) {if (sums[i][2]<canmin and Coef[i][2]!=0){canmin=sums[i][2];
282
+ can=i; canpost=2;}}
283
+ }
284
+ return(canmin,can,canpost);
285
+ }
286
+ example
287
+ {"EXAMPLE:"; echo = 2;
288
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
289
+ list flag=identifyvar();
290
+ ideal J=x(1)^3*x(3)-y(2)*y(4)^2,x(5)*y(2)-x(7)*y(4)^2,x(6)^2*(1-y(4)*y(8)^5),x(7)^4*y(8)^2;
291
+ list L=data(J,4,8);
292
+ list Eo=EOrdlist(L[1],L[2],4,8,flag);
293
+ Eo[1]; // E-order
294
+ Eo[2]; // generator giving the E-order
295
+ Eo[3]; // term giving the E-order
296
+ }
297
+
298
+ //////////////////////////////////////////////////////
299
+
300
+ proc maxEord(list Coef,list Exp,int k,int n,list flaglist)
301
+ "USAGE: maxEord(Coef,Exp,k,n,flaglist);
302
+ Coef,Exp,flaglist lists, k,n, integers
303
+ Exp is a list of lists of exponents, k=size(Exp)
304
+ RETURN: computes de maximal E-order of an ideal given by Coef,Exp
305
+ EXAMPLE: example maxEord; shows an example
306
+ "
307
+ {
308
+ int i,lon;
309
+ number canmin; // THE ASSIGNMENT IS NOT OK BECAUSE IT IS OF TYPE NUMBER
310
+ list sums;
311
+
312
+ sums=Edatalist(Coef,Exp,k,n,flaglist);
313
+
314
+ canmin=sums[1][1]; // inicializating, works also with a monomial
315
+ for (i=1;i<=k; i++){lon=size(sums[i]); // this is 2 for binomial and 1 for monomial generators
316
+ if (sums[i][1]<=canmin and Coef[i][1]!=0){canmin=sums[i][1];}
317
+
318
+ // if the generator is a binomial we check the second term
319
+
320
+ if (lon==2) {if (sums[i][2]<canmin and Coef[i][2]!=0){canmin=sums[i][2];}}
321
+ }
322
+ return(canmin,sums);
323
+ }
324
+ example
325
+ {"EXAMPLE:"; echo = 2;
326
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
327
+ list flag=identifyvar();
328
+ ideal J=x(1)^3*x(3)-y(2)*y(4)^2*x(3),x(5)*y(2)-x(7)*y(4)^2,x(6)^2*(1-y(4)*y(8)^5),x(7)^4*y(8)^2;
329
+ list L=data(J,4,8);
330
+ list M=maxEord(L[1],L[2],4,8,flag);
331
+ M[1]; // E-order
332
+ }
333
+ //////////////////////////////////////////////////////
334
+
335
+ proc elimrep(list maxvar)
336
+ "USAGE: elimrep(L); L is a list
337
+ COMPUTE: Eliminate repeated terms from a list
338
+ RETURN: the same list without repeated terms
339
+ EXAMPLE: example elimrep; shows an example
340
+ "
341
+ {
342
+ int i,j;
343
+ list aux2;
344
+
345
+ aux2=maxvar;
346
+ for (i=1;i<=size(aux2); i++)
347
+ { for (j=i+1;j<=size(aux2); j++){if (aux2[i]==aux2[j] and i!=j){aux2=delete(aux2,j);}}
348
+ }
349
+ maxvar=aux2;
350
+ return(maxvar);
351
+ }
352
+ example
353
+ {"EXAMPLE:"; echo = 2;
354
+ ring r = 0,(x(1..3)),dp;
355
+ list L=4,5,2,5,7,8,6,3,2;
356
+ elimrep(L);
357
+ }
358
+ //////////////////////////////////////////////////////
359
+
360
+ proc Emaxcont(list Coef,list Exp,int k,int n,list flag)
361
+ "USAGE: Emaxcont(Coef,Exp,k,n,flag);
362
+ Coef,Exp,flag lists, k,n, integers
363
+ Exp is a list of lists of exponents, k=size(Exp)
364
+ COMPUTE: Identify ALL the variables of E-maximal contact
365
+ RETURN: a list with the indexes of the variables of E-maximal contact
366
+ EXAMPLE: example Emaxcont; shows an example
367
+ "
368
+ {
369
+ int i,j,lon;
370
+ number maxEo;
371
+ list L,sums,bx,maxvar;
372
+
373
+ L=maxEord(Coef,Exp,k,n,flag);
374
+
375
+ maxEo=L[1];
376
+ sums=L[2];
377
+
378
+ if (maxEo>0){
379
+
380
+ for (i=1;i<=k; i++){lon=size(sums[i]);
381
+ if (lon==2){if (sums[i][1]==maxEo) // variables of the first term
382
+ {for (j=1;j<=n; j++){if(Exp[i][1][j]!=0 and flag[j]==0){bx=j; maxvar=maxvar + bx;}}}
383
+
384
+ if (sums[i][2]==maxEo) // variables of the second term
385
+ {for (j=1;j<=n; j++){if(Exp[i][2][j]!=0 and flag[j]==0){bx=j; maxvar=maxvar + bx;}}}}
386
+ else {if (sums[i][1]==maxEo)
387
+ {for (j=1;j<=n; j++){if(Exp[i][1][j]!=0 and flag[j]==0){bx=j; maxvar=maxvar + bx;}}}}
388
+
389
+ }}
390
+ else {maxvar=list();}
391
+
392
+ // eliminating repeated terms
393
+ maxvar=elimrep(maxvar);
394
+
395
+ // It is necessary to check if flag[j]==0 in order to avoid the selection of y variables
396
+
397
+ return(maxEo,maxvar);
398
+ }
399
+ example
400
+ {"EXAMPLE:"; echo = 2;
401
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
402
+ list flag=identifyvar();
403
+ ideal J=x(1)^3*x(3)-y(2)*y(4)^2,x(5)*y(2)-x(7)*y(4)^2,x(6)^2*(1-y(4)*y(8)^5),x(7)^4*y(8)^2;
404
+ list L=data(J,4,8);
405
+ list hyp=Emaxcont(L[1],L[2],4,8,flag);
406
+ hyp[1]; // max E-order=0
407
+ hyp[2]; // There are no hypersurfaces of E-maximal contact
408
+
409
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7),y(8)),dp;
410
+ list flag=identifyvar();
411
+ ideal J=x(1)^3*x(3)-y(2)*y(4)^2*x(3),x(5)*y(2)-x(7)*y(4)^2,x(6)^2*(1-y(4)*y(8)^5),x(7)^4*y(8)^2;
412
+ list L=data(J,4,8);
413
+ list hyp=Emaxcont(L[1],L[2],4,8,flag);
414
+ hyp[1]; // the E-order is 1
415
+ hyp[2]; // {x(3)=0},{x(5)=0},{x(7)=0} are hypersurfaces of E-maximal contact
416
+
417
+ }
418
+ ///////////////////////////////////////////////////////
419
+
420
+ proc cleanunit(list mon,int n,list flaglist)
421
+ "USAGE: cleanunit(mon,n,flaglist);
422
+ mon, flaglist lists, n integer
423
+ COMPUTE: We clean (or forget) the units in a monomial, given by "y" variables
424
+ RETURN: The list defining the monomial ideal already cleaned
425
+ EXAMPLE: example cleanunit; shows an example
426
+ "
427
+ {
428
+ int i;
429
+
430
+ for (i=1;i<=n;i++){if (flaglist[i]==1){mon[i]=0;}}
431
+
432
+ // coef[1]=coef[1]*y(i)^mon[i]; IS NOT ALLOWED because mon[i] can be a number
433
+ // therefore, the coefficients remain constant
434
+
435
+ return(mon);
436
+ }
437
+ example
438
+ {"EXAMPLE:"; echo = 2;
439
+ ring r = 0,(x(1),y(2),x(3),y(4)),dp;
440
+ list flag=identifyvar();
441
+ ideal J=x(1)^3*y(2)*x(3)^5*y(4)^8;
442
+ list L=data(J,1,4);
443
+ L[2][1][1]; // list of exponents of the monomial J
444
+ list M=cleanunit(L[2][1][1],4,flag);
445
+ M; // new list without units
446
+ }
447
+ //////////////////////////////////////////////////////
448
+ // Classification of the ideal E-Coeff_V(P):
449
+ // ccase=1, E-Coeff_V(P)=0
450
+ // 2,3 Bold regular case
451
+ // 4 P=1 monomial case (detected before)
452
+ // 0 Otherwise
453
+
454
+ proc ECoef(list Coef,list expP,int sP,int V,number auxc,int n,list flaglist)
455
+ "USAGE: ECoef(Coef,expP,sP,V,auxc,n,flaglist);
456
+ Coef, expP, flaglist lists, sP, V, n integers, auxc number
457
+ COMPUTE: The ideal E-Coeff_V(P), where V is a permissible hypersurface which belongs to the center
458
+ RETURN: list of exponents, list of coefficients and classification of the ideal E-Coeff_V(P)
459
+ EXAMPLE: example ECoef; shows an example
460
+ "
461
+ {
462
+ int i,j,k,l,numg,ccase,cont2,cont3,val;
463
+ number aa;
464
+ list Eco,newcoef,auxexp,newL,rs,rs2,aux,aux2,aux3,aux4,L;
465
+
466
+ auxexp=expP;
467
+
468
+ l=1;
469
+ for (i=1;i<=sP;i++)
470
+ {rs[i]=size(Coef[i]);
471
+ if (rs[i]==2){ // binomials
472
+ if (auxexp[i][1][V]!=auxexp[i][2][V]) // no common factors for the variable in V
473
+
474
+ {for (j=1;j<=2;j++){if (auxexp[i][j][V]<auxc){aa=auxc/(auxc-auxexp[i][j][V]);
475
+ auxexp[i][j][V]=0;
476
+ aux4[1]=multiplylist(auxexp[i][j],aa);
477
+ Eco[l]=aux4;
478
+ // newcoef[l]=Coef[i][j]^aa; IT IS NO ALLOWED!!!
479
+ newcoef[l]=Coef[i][j]; // we leave it constant
480
+ l=l+1;}}}
481
+
482
+ else // common factors for the variable in V, of zero in both terms
483
+
484
+ {if (auxexp[i][1][V]<auxc){aa=auxc/(auxc-auxexp[i][1][V]);
485
+ auxexp[i][1][V]=0; auxexp[i][2][V]=0;
486
+
487
+ // this generator is a power of a binomial
488
+ // one possibility is Eco[l]=auxexp[i]; we leave it constant and add some extra number aa, or
489
+ // define a binomial again. The E-order coincides!!!
490
+
491
+ aux=multiplylist(auxexp[i][1],aa);
492
+ aux2=multiplylist(auxexp[i][2],aa);
493
+ aux3[1]=aux;
494
+ aux3[2]=aux2;
495
+ Eco[l]=aux3;
496
+ newcoef[l]=Coef[i];
497
+ l=l+1;}}
498
+ }
499
+
500
+ else // monomials
501
+ {if (auxexp[i][1][V]<auxc){aa=auxc/(auxc-auxexp[i][1][V]);
502
+ auxexp[i][1][V]=0;
503
+ aux4=list();
504
+ aux4[1]=multiplylist(auxexp[i][1],aa);
505
+ Eco[l]=aux4;
506
+ newcoef[l]=Coef[i];
507
+ l=l+1;}}
508
+ }
509
+
510
+ // cleaning units from the monomial generators of Eco
511
+ // If there are hyperbolic equations in Eco, such that Eco=1, we detect it later, computing the E-order
512
+
513
+ numg=size(Eco);
514
+ for (k=1;k<=numg;k++){ if (size(newcoef[k])==1){Eco[k][1]=cleanunit(Eco[k][1],n,flaglist);}}
515
+
516
+ // checking Eco
517
+
518
+ ccase=0;
519
+ cont2=0;
520
+ cont3=0;
521
+ val=0;
522
+
523
+ // CASE Eco=0: If Eco=empty list then as ideal Eco=0
524
+
525
+ if (numg==0){ccase=1;}
526
+ else
527
+ {
528
+ for (i=1;i<=numg;i++) {rs2[i]=size(newcoef[i]);
529
+ if (rs2[i]==1){val=val+n; // monomials
530
+ for (l=1;l<=n; l++) {if (Eco[i][1][l]==0) {cont2=cont2+1;}}
531
+ }
532
+ else{val=val+(2*n); // binomials
533
+ for (l=1;l<=n; l++) {if (Eco[i][1][l]==0) {cont2=cont2+1;}
534
+ if (Eco[i][2][l]==0) {cont2=cont2+1;}}
535
+ }
536
+ }
537
+
538
+ // If cont2=val then all the entries of Eco are zero!! As ideal Eco=1
539
+
540
+ for (i=1;i<=sP;i++){if (rs[i]==2){ // binomials
541
+ for (l=1;l<=n;l++) {if (expP[i][1][l]!=0) {cont3=cont3+1;}
542
+ if (expP[i][2][l]!=0) {cont3=cont3+1;}}
543
+ }
544
+ else{ // monomials
545
+ for (l=1;l<=n;l++) {if (expP[i][1][l]!=0) {cont3=cont3+1;}}
546
+ }
547
+ }
548
+
549
+ // If cont3=0 all the entries of expP are zero!! As ideal P=1 this is detected before
550
+ // If cont3=1 then P is bold regular
551
+
552
+
553
+ // CASE Eco=1
554
+
555
+ if (cont2==val and cont3==1){ccase=2;} // BOLD REGULAR CASE
556
+ if (cont2==val and cont3>1){ccase=3;} // CASE P=x^{\alpha},x^{\beta}, IN FACT, BOLD REGULAR
557
+ if (cont2==val and cont3==0){ccase=4;} // P=1, then I=1 monomial case
558
+
559
+ // Case BOLD REGULAR P=x^{\alpha}*(1-\mu y^{\delta})
560
+ // IT IS NON NECESSARY TO CHECK IT, Eco=empty list, already done!
561
+
562
+ L=maxEord(newcoef,Eco,numg,n,flaglist); // L[1] is the E-order of Eco
563
+ if (L[1]==0){ccase=2; print("E-order zero!");} // BOLD REGULAR CASE
564
+
565
+ // we leave it to check the computations
566
+
567
+ } // close else
568
+
569
+ return(Eco,newcoef,ccase);
570
+ }
571
+ example
572
+ {"EXAMPLE:"; echo = 2;
573
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7)),dp;
574
+ list flag=identifyvar();
575
+ ideal P=x(1)^2*x(3)^5-x(5)^7*y(4),x(6)^3*y(2)^5-x(7)^5,x(5)^3*x(6)-y(4)^3*x(1)^5;
576
+ list L=data(P,3,7);
577
+ list L2=ECoef(L[1],L[2],3,1,3,7,flag);
578
+ L2[1]; // exponents of the E-Coefficient ideal respect to x(1)
579
+ L2[2]; // its coefficients
580
+ L2[3]; // classify the type of ideal obtained
581
+
582
+ ring r = 0,(x(1),y(2),x(3),y(4)),dp;
583
+ list flag=identifyvar();
584
+ ideal J=x(1)^3*(1-2*y(2)*y(4)^2); // Bold regular case
585
+ list L=data(J,1,4);
586
+ list L2=ECoef(L[1],L[2],1,1,3,4,flag);
587
+ L2;
588
+
589
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7)),dp;
590
+ list flag=identifyvar();
591
+ ideal J=x(1)^3-x(3)^2*y(4)^2,x(1)*x(7)*y(2)-x(6)^3*x(5)*y(4)^3,x(5)^3-x(5)^3*y(2)^2;
592
+ list L=data(J,3,7);
593
+ list L2=ECoef(L[1],L[2],3,1,2,7,flag);
594
+ L2;
595
+
596
+ ring r = 3,(x(1),y(2),x(3),y(4),x(5..7)),dp;
597
+ list flag=identifyvar();
598
+ ideal J=x(1)^3-x(3)^2*y(4)^2,x(1)*x(7)*y(2)-x(6)^3*x(5)*y(4)^3,x(5)^3-x(5)^3*y(2)^2;
599
+ list L=data(J,3,7);
600
+ list L2=ECoef(L[1],L[2],3,1,2,7,flag);
601
+ L2; // THE COMPUTATIONS ARE NOT CORRECT IN CHARACTERISTIC p>0
602
+ // because numbers are treated as 0 in assignments
603
+
604
+ }
605
+ ////////////////////////////////////////////////////////////////////////////
606
+ // The intvec a indicates the previous center
607
+ // Hhist = intvec of exceptional divisors of the parent chart
608
+
609
+ proc determinecenter(list Coef,list expJ,number c,int n,int Y,intvec a,list listmb,list flag,int control3,intvec Hhist)
610
+ "USAGE: determinecenter(Coef,expJ,c,n,Y,a,listmb,flag,control3,Hhist);
611
+ Coef, expJ, listmb, flag lists, c number, n, Y, control3 integers, a, Hhist intvec
612
+ COMPUTE: next center of blowing up and related information, see example
613
+ RETURN: several lists defining the center and related information
614
+ EXAMPLE: example determinecenter; shows an example
615
+ "
616
+ {int i,j,rstep,l,mm,cont,cont1,cont2,cont3,a4,sI,sP,V,V2,ccase,b,Mindx,tip,mval;
617
+ number auxc,a1,a2,ex,maxEo,aux;
618
+
619
+ list D,H,auxJ; // lists of D_n,D_n-1,...,D_1; H_n,H_n-1,...,H_1; J_n,J_n-1,...,J_1
620
+
621
+ list oldOlist,oldC,oldt,oldD,oldH,allH; // information of the previous step
622
+
623
+ list Olist,C,t,Dstar,center,expI,expP,newJ,maxset;
624
+
625
+ list maxvar,auxlist,aux3,auxD,auxolist,auxdiv,auxaux,L,rs,auxgamma,auxg2,aux1; // auxiliary lists
626
+ list auxinvlist,newcoef,EL,Ecoaux,Hplus,transH,Hsum,auxset,sumnewH; // auxiliary lists
627
+ list auxcoefI,auxcent,center2;
628
+
629
+ intvec oldinfobo7,infobo7;
630
+ int infaux,leh,leh2,leh3;
631
+
632
+ tip=listmb[1]; // It is not used in this procedure, it is used to compute the lcm of the denominators
633
+ oldOlist=listmb[2];
634
+ oldC=listmb[3];
635
+ oldt=listmb[4]; // t= resolution function
636
+ oldD=listmb[5];
637
+
638
+ oldH=listmb[6];
639
+ allH=listmb[7];
640
+
641
+ oldinfobo7=listmb[8]; // auxiliary intvec, it is used to define BO[7]
642
+
643
+ // inicializating lists
644
+ Olist=list();
645
+ C=list();
646
+ auxinvlist=list();
647
+
648
+ auxJ[1]=expJ;
649
+ rstep=n; // we are in dimension rstep
650
+ auxc=c;
651
+ cont=1;
652
+
653
+ if (Y==0) {D=iniD(n); H=iniD(n); infobo7=-1;} // first center, inicializate previous information
654
+
655
+ if (Y!=0 and rstep==n) // In dimension n, D'_n is always of this form
656
+ { auxdiv=list0(n);
657
+ Dstar[1]=oldD[1];
658
+
659
+ b=size(a);
660
+ for (i=1;i<=n;i++) {for (j=1;j<=b;j++) {if (a[j]==i) {aux=aux+oldD[1][i];}}}
661
+ Dstar[1][Y]=aux;
662
+ aux=0;
663
+
664
+ auxdiv[Y]=oldOlist[1]-oldC[1];
665
+ D[1]=sumlist(Dstar[1],auxdiv);} // list defining D_n
666
+
667
+ // computing strict transforms of the exceptional divisors H
668
+
669
+ if (Y!=0){transH=iniD(n);
670
+ for (i=1;i<=size(oldH);i++){transH[i]=oldH[i]; transH[i][Y]=0;} // Note: size(oldH)<=n
671
+ allH[Y]=1;} // transform of |H|=H_nU...UH_1
672
+
673
+ // We put here size(oldH) instead of n because maybe we have not
674
+ // calculated all the dimensions in the previous step
675
+
676
+ // STARTING THE LOOP
677
+
678
+ while (rstep>=1)
679
+ {
680
+ if (Y!=0 and rstep!=n) // transformation law of D_i for i<n
681
+ {
682
+ if (cont!=0) // the resolution function did not drop in higher dimensions
683
+ {
684
+ if (oldt[n-rstep]==a1/a2 and c==oldC[1] and control3==0)
685
+ {auxD=list0(n);
686
+ auxD[Y]=oldOlist[n-rstep+1]-oldC[n-rstep+1];
687
+ Dstar[n-rstep+1]=oldD[n-rstep+1];
688
+
689
+ for (i=1;i<=n;i++) {for (j=1;j<=b;j++) {if (a[j]==i) {aux=aux+oldD[n-rstep+1][i];}}}
690
+ Dstar[n-rstep+1][Y]=aux;
691
+ aux=0;
692
+
693
+ D[n-rstep+1]=sumlist(Dstar[n-rstep+1],auxD);
694
+
695
+ }
696
+ else
697
+ {cont=0;
698
+ for (j=n-rstep+1;j<=n; j++){D[j]=list0(n);}
699
+ }
700
+ }
701
+ }
702
+
703
+ // Factorizing J=M*I
704
+
705
+ cont1=0;
706
+ for (i=1;i<=n;i++) {if (D[n-rstep+1][i]==0) {cont1=cont1+1;}} // if it fails write: listO(n)[i]
707
+
708
+ if (cont1==n) {expI=expJ;} // D[n-rstep+1]=0 (is a list of zeros)
709
+ else {
710
+ for (i=1;i<=size(expJ);i++)
711
+ {rs[i]=size(Coef[i]);
712
+ if (rs[i]==2){ aux1=list();
713
+ aux1[1]=reslist(expJ[i][1],D[n-rstep+1]);
714
+ aux1[2]=reslist(expJ[i][2],D[n-rstep+1]);
715
+ expI[i]=aux1;} // binomial
716
+ else {aux1=list();
717
+ aux1[1]=reslist(expJ[i][1],D[n-rstep+1]);
718
+ expI[i]=aux1;}} // monomial
719
+ }
720
+
721
+ // NOTE: coefficients of I = coefficients of J, because I and J differ in a monomial
722
+
723
+ // Detecting errors, negative exponents in expI
724
+
725
+ sI=size(expI);
726
+
727
+ for (i=1;i<=sI;i++)
728
+ {rs[i]=size(Coef[i]);
729
+ if (rs[i]==2){for (j=1;j<=2;j++){for (l=1;l<=n; l++)
730
+ {if (expI[i][j][l]<0) {print("ERROR, the BINOMIAL ideal I has negative components");
731
+ // print("M ideal"); print(D[n-rstep+1]); print(expI); print("dimension"); print(rstep);
732
+ // print("previous chart"); print(size(finalchart)); ~;
733
+ }}}}
734
+ else {for (l=1;l<=n; l++)
735
+ {if (expI[i][1][l]<0) {print("ERROR, the MONOMIAL ideal I has negative components");
736
+ // print("M ideal"); print(D[n-rstep+1]); print(expI); print("dimension"); print(rstep);
737
+ // print("previous chart"); print(size(finalchart)); ~;
738
+ }}}
739
+ }
740
+
741
+ // Compute the maximal E-order of I
742
+
743
+ L=maxEord(Coef,expI,sI,n,flag);
744
+ maxEo=L[1]; // E-order of I
745
+
746
+ // Inicializating information
747
+
748
+ auxolist=maxEo;
749
+ a1=maxEo;
750
+ a2=auxc;
751
+ Olist=Olist+auxolist; // list of new maximal E-orders o_n,o_{n-1},...o_1
752
+ aux3=auxc;
753
+ C=C+aux3; // list of new critical values c=c_{n+1},c_{n},...c_2
754
+
755
+ // It is necessary to check if the first coordinate of the invariant has dropped or not
756
+ // NOTE: By construction, the first coordinate is always 1 !!
757
+ // It has dropped is equivalent to: CURRENT C<c of the previous step
758
+
759
+ // Calculate new H, this is done for every dimension
760
+
761
+ if (Y!=0){a4=size(oldt);
762
+ if (n-rstep+1>a4){cont=0; oldt[n-rstep+1]=0; } // VERIFICAR!!!!
763
+
764
+ if (cont!=0 and oldt[n-rstep+1]==a1/a2 and c==oldC[1] and control3==0){H[n-rstep+1]=transH[n-rstep+1];
765
+
766
+ // we fill now the value for BO[7]
767
+ if (oldinfobo7[n-rstep+1]==-1){leh=size(Hhist);
768
+ infobo7[n-rstep+1]=Hhist[leh];} // suitable index !!!
769
+ else{ infaux=oldinfobo7[n-rstep+1];
770
+ infobo7[n-rstep+1]=infaux;} // the same as the previous step
771
+
772
+ }
773
+ else {
774
+ if (rstep<n) {sumnewH=list0(n);
775
+ for (i=1;i<n-rstep+1;i++){sumnewH=sumlist(sumnewH,H[i]);}
776
+ H[n-rstep+1]=reslist(allH,sumnewH);}
777
+ else {H[n-rstep+1]=allH;}
778
+
779
+ // we fill the value for BO[7] too, we complete it at the end if necessary
780
+ infobo7[n-rstep+1]=-1;
781
+ }
782
+ }
783
+
784
+ // It is necessary to detect the monomial case AFTER inicializate the information
785
+ // OTHERWISE WE WILL HAVE EMPTY COMPONENTS IN THE RESOLUTION FUNCTION
786
+
787
+ // If maxEo=0 but maxo!=0 MONOMIAL CASE (because E-Sing(J,c) still !=emptyset)
788
+ // If maxEo=0 and maxo=0 then I=1, (real) monomial case, the same case for us
789
+ // NOTE THAT IT DOESN'T MATTER IF THERE IS A p-TH POWER OF A HYPERBOLIC EQ, THE E-ORDER IS ZERO ANYWAY
790
+
791
+ if (maxEo==0){auxgamma=Gamma(D[n-rstep+1],auxc,n); // Gamma gives (maxlist,gamma,center)
792
+ auxg2=auxgamma[3];
793
+ center=center+auxg2;
794
+ center=elimrep(center);
795
+ auxinvlist=auxgamma[2];
796
+
797
+ // print("gamma"); print(auxg2);
798
+
799
+ break;}
800
+
801
+ // Calculate P // P=I+M^{o/(c-o)} with weight o
802
+
803
+ if (maxEo>=auxc) {expP=expI; Mindx=0;} // The coefficients also remain constant
804
+ else {ex=maxEo/(auxc-maxEo);
805
+ auxlist=list();
806
+ Mindx=1;
807
+ auxlist[1]=multiplylist(D[n-rstep+1],ex); // weighted monomial part: D[n-rstep+1]^ex;
808
+ expP=insert(expI,auxlist); // P=I+D[n-rstep+1]^ex;
809
+ auxcoefI=Coef;
810
+ Coef=insert(Coef,list(1));} // Adding the coefficient for M
811
+
812
+ // NOTE: IT IS NECESSARY TO ADD COEFFICIENT 1 TO THE MONOMIAL PART M
813
+ // E-ord(P_i)=E-ord(I_i) so to compute the E-order of P_i we can compute E-ord(I_i)
814
+
815
+ // Calculate variables of E-maximal contact, ALWAYS WITH RESPECT TO THE IDEAL I !!
816
+
817
+ sP=size(expP); // Can be different from size(expI)
818
+
819
+ if (Mindx==1){ maxvar=Emaxcont(auxcoefI,expI,sI,n,flag);}
820
+ else{ maxvar=Emaxcont(Coef,expP,sP,n,flag);}
821
+
822
+ auxc=maxvar[1]; // E-order of P, critical value for the next step, ALSO VALID auxc=maxEo;
823
+ if (auxc!=maxEo){print("ERROR, the E-order is not well computed");}
824
+
825
+ maxset=maxvar[2];
826
+
827
+ // center=center + maxset; // HACER DESPUES Y A?ADIR SOLO V!!!!!!
828
+ // Cleaning the center: eliminating repeated variables
829
+ // center=elimrep(center);
830
+
831
+ // if (rstep==1) {break;} // Induction finished, is not necessary to compute the rest
832
+
833
+ // Calculate Hplus=set of non permissible hypersurfaces
834
+ // RESET Hplus if c has dropped or we have eliminated hyperbolic generators
835
+
836
+ // ES NECESARIO PONER CONDICION DE SI INVARIANTE BAJA O NO??? SI BAJA HPLUS NO SE USA...
837
+
838
+ if (Y==0 or c<oldC[1] or control3==1) {Hplus=list0(n);}
839
+ else {Hsum=list0(n);
840
+ Hplus=allH;
841
+ for (i=1;i<=n-rstep+1;i++){Hsum=sumlist(Hsum,H[i]);}
842
+ Hplus=reslist(Hplus,Hsum); // CHEQUEAR QUE NO SALEN -1'S
843
+ }
844
+
845
+ // Taking into account variables of maxset outside of Hplus (so inside Hminus)
846
+
847
+ if (Y==0 or c<oldC[1] or control3==1){V=maxset[1]; // Hplus=0 so any variable is permissible
848
+ maxset=delete(maxset,1);} // eliminating this variable V from maxset
849
+ else{
850
+ // If the invariant remains constant V comes from the previous step
851
+
852
+ if (cont!=0 and oldt[n-rstep+1]==a1/a2 and c==oldC[1]){
853
+ if (Mindx==1){
854
+ //----------------------------USING HPLUS----------------------------------------
855
+ // REMIND THAT IN THIS CASE maxset=HYPERSURFACES OF E-MAXIMAL CONTACT FOR I, INSTEAD OF P
856
+
857
+ V2=a[n-rstep+1]; // V can be different from the variable coming from the previous step
858
+ // check that V2 belongs to maxset
859
+
860
+ for (i=1;i<=size(maxset);i++){
861
+ if (V2==maxset[i]){mval=1; break;}
862
+ else{mval=0;}
863
+ }
864
+
865
+ if (Hplus[V2]==0 and mval==1){V=V2;} // V2 is permissible
866
+ else{
867
+ cont2=1;
868
+ cont3=1;
869
+ auxset=maxset;
870
+ while (cont2!=0){mm=auxset[1];
871
+ if (Hplus[mm]!=0) {auxset=delete(auxset,1); cont3=cont3+1;}
872
+ // eliminating non permissible variables from maxset
873
+ else {cont2=0;}}
874
+ V=maxset[cont3]; // first permissible variable
875
+ maxset=delete(maxset,cont3);
876
+ }
877
+ }
878
+
879
+ //-------------------------------------------------------------------------------
880
+ else{ V=a[n-rstep+1];}
881
+ }
882
+ else {V=maxset[1]; // Hplus=0 so any variable is permissible
883
+ maxset=delete(maxset,1);
884
+ }
885
+
886
+ }
887
+
888
+
889
+ // if (V!=V2 and V2!=0){print(a); print(rstep); print(V); print(V2); print("num cartas"); print(size(finalchart)); ~;}
890
+
891
+ V2=0;
892
+
893
+ // Adding the new hypersurface of E-maximal contact to the center
894
+
895
+ auxcent[1]=V;
896
+
897
+ center=center + auxcent; // print("num cartas"); print(size(finalchart)); print(center); if (size(finalchart)==2){~~;}
898
+
899
+ auxcent=list();
900
+
901
+ // Cleaning the center: eliminating repeated variables CREO QUE NO HACE FALTA
902
+
903
+ center2=elimrep(center); // print(center2); print("-----------");
904
+
905
+ // if (size(center2)!=size(center)){print("MAL");}
906
+
907
+ // for (i=1;i<=size(center);i++){if (center2[i]!=center[i]){print("cambia");}}
908
+
909
+
910
+ if (rstep==1) {break;} // Induction finished, is not necessary to compute the rest
911
+
912
+
913
+ // Calculate Eco=E-Coeff_V(P) where V is a permissible hypersurface which belongs to the center
914
+ // Eco can have rational exponents
915
+
916
+ Ecoaux=ECoef(Coef,expP,sP,V,auxc,n,flag);
917
+
918
+ // SPECIAL CASES: BOLD REGULAR CASE
919
+ //--------------------------------------------------------------------
920
+
921
+ if (Ecoaux[3]==1){ // Eco=EMPTY LIST, Eco=0 AS IDEAL
922
+ aux1[1]=list0(n);
923
+ newJ[1]=aux1; // monomial with zero entries, newJ=1 as ideal
924
+ newcoef[1]=list(1); // the new coefficient is only 1
925
+ auxaux=list();
926
+ auxaux[1]=newJ;
927
+ auxJ=auxJ+auxaux; // auxJ list of ideals J_i
928
+ auxinvlist=1;
929
+ break;}
930
+
931
+ //-----------------------------------------------------------
932
+ // THIS CASE IS NOT GOING TO APPEAR, BUT WE LEAVE IT TO CHECK COMPUTATIONS
933
+
934
+ if (Ecoaux[3]==2 or Ecoaux[3]==3){ // Eco=0 LIST, Eco=1 AS IDEAL
935
+ aux1[1]=list0(n);
936
+ newJ[1]=aux1;
937
+ newcoef[1]=list(1); // print("Strange case happens"); ~;
938
+ auxaux=list();
939
+ auxaux[1]=newJ;
940
+ auxJ=auxJ + auxaux; // auxJ list of ideals J_i
941
+ auxinvlist=1;
942
+ break;}
943
+ //-----------------------------------------------------------
944
+ // THIS CASE IS NOT GOING TO APPEAR, BUT WE LEAVE IT TO CHECK COMPUTATIONS
945
+
946
+ // P=1 THIS CANNOT HAPPEN SINCE P=1 IFF I=1 (or I is equivalent to 1)
947
+ // and this is the monomial case, already checked
948
+
949
+ if (Ecoaux[3]==4){print("ERROR in ECoef"); break;}
950
+ //-----------------------------------------------------------
951
+
952
+ // If we are here Ecoaux[3]=0, then continue
953
+
954
+ // Filling the list of "ideals", auxJ=J_n,J_{n-1},...
955
+
956
+ newJ=Ecoaux[1];
957
+ newcoef=Ecoaux[2];
958
+
959
+ auxJ=insert(auxJ,newJ,n-rstep+1); // newJ is inserted after n-rstep+1 position, so in position n-rstep+2
960
+
961
+ // New input for the loop, if we are here newJ is different from 0
962
+
963
+ expJ=newJ;
964
+ Coef=newcoef;
965
+
966
+ newJ=list();
967
+ expI=list();
968
+ expP=list();
969
+ rstep=rstep-1; // print(size(auxJ));
970
+ }
971
+
972
+ // EXIT LOOP "while"
973
+ // we do NOT construct the center as an ideal because WE USE LISTS
974
+
975
+ t=dividelist(Olist,C); // resolution function t
976
+
977
+ // Complete the intvec infobo7 if necessary
978
+
979
+ if (control3==1){infobo7=-1;} // We reset the value after clean hyperbolic equations
980
+ leh2=size(Olist);
981
+ leh3=size(infobo7);
982
+ if (leh3<leh2){for (j=leh3+1;j<=leh2; j++){infobo7[j]=-1;}}
983
+
984
+ // Auxiliary list to complete the resolution function in special cases
985
+ if (size(auxinvlist)==0) {auxinvlist[1]=0;}
986
+
987
+ return(center,auxJ,Olist,C,t,D,H,allH,auxinvlist,infobo7);
988
+ }
989
+ example
990
+ {"EXAMPLE:"; echo = 2;
991
+ ring r = 0,(x(1..4)),dp;
992
+ list flag=identifyvar();
993
+ ideal J=x(1)^2-x(2)^2*x(3)^5, x(1)*x(3)^3+x(4)^6;
994
+ list Lmb=1,list(0,0,0,0),list(0,0,0,0),list(0,0,0,0),iniD(4),iniD(4),list(0,0,0,0),-1;
995
+ list L=data(J,2,4);
996
+ list LL=determinecenter(L[1],L[2],2,4,0,0,Lmb,flag,0,-1); // Compute the first center
997
+ LL[1]; // index of variables in the center
998
+ LL[2]; // exponents of ideals J_4,J_3,J_2,J_1
999
+ LL[3]; // list of orders of J_4,J_3,J_2,J_1
1000
+ LL[4]; // list of critical values
1001
+ LL[5]; // components of the resolution function t
1002
+ LL[6]; // list of D_4,D_3,D_2,D_1
1003
+ LL[7]; // list of H_4,H_3,H_2,H_1 (exceptional divisors)
1004
+ LL[8]; // list of all exceptional divisors accumulated
1005
+ LL[9]; // auxiliary invariant
1006
+ LL[10]; // intvec pointing out the last step where the function t has dropped
1007
+
1008
+ ring r= 0,(x(1..4)),dp;
1009
+ list flag=identifyvar();
1010
+ ideal J=x(1)^3-x(2)^2*x(3)^5, x(1)*x(3)^3+x(4)^5;
1011
+ list Lmb=2,list(0,0,0,0),list(0,0,0,0),list(0,0,0,0),iniD(4),iniD(4),list(0,0,0,0),-1;
1012
+ list L2=data(J,2,4);
1013
+ list L3=determinecenter(L2[1],L2[2],2,4,0,0,Lmb,flag,0,-1); // Example with rational exponents in E-Coeff
1014
+ L3[1]; // index of variables in the center
1015
+ L3[2]; // exponents of ideals J_4,J_3,J_2,J_1
1016
+ L3[3]; // list of orders of J_4,J_3,J_2,J_1
1017
+ L3[4]; // list of critical values
1018
+ L3[5]; // components of the resolution function
1019
+ }
1020
+ ////////////////////////////////////////////////////////
1021
+ // idchart= identity number of the current chart
1022
+ // infochart=chart[idchart] information related to the chart to blow up
1023
+ // infochart= int parent,int Y,intvec a,list expJ,list Coef, list flag, // NEEDED FOR THE RESOLUTION
1024
+ // intvec Hhist, list blwhist, module path, list hipercoef, list hiperexp // NEEDED FOR THE OUTPUT
1025
+
1026
+ // NOTE: IT IS NOT NECESSARY TAKE INTO ACCOUNT "y" VARIABLES BECAUSE THE CENTER IS ALREADY GIVEN
1027
+
1028
+ proc Blowupcenter(list center,int idchart,int nchart,list infochart,number c,int n,int currentstep)
1029
+ "USAGE: Blowupcenter(center,id,nchart,infochart,c,n,cstep);
1030
+ center, infochart lists, id, nchart, n, cstep integers, c number
1031
+ COMPUTE: The blowing up at the chart IDCHART along the given center
1032
+ RETURN: new affine charts and related information, see example
1033
+ EXAMPLE: example Blowupcenter; shows an example
1034
+ "
1035
+ {int num,i,j,k,l,parent,Y,lon,m,m2;
1036
+ intvec a,Hhist,auxHhist;
1037
+ number auxsum, auxsum2;
1038
+ list sons,aux,expJ,blexpJ,blD;
1039
+ list auxstep,Coef;
1040
+ list auxchart,auxchart1,info,flaglist;
1041
+ list auxblwhist,blwhist,hipercoef,hiperexp;
1042
+ module auxpath,auxp2;
1043
+
1044
+ parent=idchart;
1045
+ num=size(center);
1046
+
1047
+ // Transform to intvec the list of variables defining the center
1048
+ a=center[1];
1049
+ for (i=2;i<=num;i++){a=a,center[i];}
1050
+
1051
+ expJ=infochart[4];
1052
+ Coef=infochart[5];
1053
+ flaglist=infochart[6];
1054
+ Hhist=infochart[7];
1055
+ blwhist=infochart[8];
1056
+ auxpath=infochart[9];
1057
+ hipercoef=infochart[10];
1058
+ hiperexp=infochart[11];
1059
+
1060
+ l=size(expJ);
1061
+
1062
+ // input for the loop
1063
+ blexpJ=expJ;
1064
+
1065
+ // making the blowing up in the i-th chart
1066
+ for (i=1;i<=num;i++)
1067
+ {
1068
+ // we assign the current number of charts +1 to the i-th chart
1069
+ idchart=nchart+1;
1070
+ nchart=nchart+1;
1071
+ aux=idchart;
1072
+ sons=sons+aux;
1073
+
1074
+ auxstep[i]=currentstep+1;
1075
+
1076
+ Y=center[i];
1077
+
1078
+ // The blowing up
1079
+
1080
+ for (j=1;j<=l;j++){lon=size(Coef[j]);
1081
+ if (lon==1){for (m=1;m<=n;m++){for (m2=1;m2<=num;m2++){
1082
+ if (m==center[m2]){auxsum=auxsum+ expJ[j][1][m];}}}
1083
+ blexpJ[j][1][Y]=auxsum-c;
1084
+ auxsum=0;} // monomial
1085
+ else {for (m=1;m<=n;m++){for (m2=1;m2<=num;m2++){
1086
+ if (m==center[m2]){auxsum=auxsum+expJ[j][1][m];
1087
+ auxsum2=auxsum2+expJ[j][2][m];}}}
1088
+ blexpJ[j][1][Y]=auxsum-c;
1089
+ blexpJ[j][2][Y]=auxsum2-c;
1090
+ auxsum=0; auxsum2=0;} // binomial
1091
+ }
1092
+
1093
+
1094
+ auxHhist=Hhist,Y; // history of the exceptional divisors in this chart
1095
+ auxblwhist=tradblwup(blwhist,n,Y,a,num); // history of the blow ups in this chart
1096
+
1097
+ auxp2=auxpath,[parent,i];
1098
+
1099
+ auxchart1=parent,Y,a,blexpJ,Coef,flaglist,auxHhist,auxblwhist,auxp2,hipercoef,hiperexp;
1100
+
1101
+ // Coef, flaglist are not modified after the blowing-up, the hyperbolic information is the same as in the parent chart
1102
+
1103
+ auxchart[i]=auxchart1;
1104
+
1105
+ // Inicializating the exponents of J for the next chart
1106
+
1107
+ blexpJ=expJ;
1108
+ }
1109
+ // end of the loop
1110
+
1111
+ // we add its sons to the current chart
1112
+ infochart=infochart+sons;
1113
+ info[1]=infochart;
1114
+
1115
+ return(info,auxchart,nchart,auxstep,num);
1116
+ }
1117
+ example
1118
+ {"EXAMPLE:"; echo = 2;
1119
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7)),dp;
1120
+ list flag=identifyvar();
1121
+ ideal J=x(1)^3-x(3)^2*y(4)^2,x(1)*x(7)*y(2)-x(6)^3*x(5)*y(4)^3,x(5)^3-x(5)^3*y(2)^2;
1122
+ list Lmb=2,list(0,0,0,0,0,0,0),list(0,0,0,0,0,0,0),list(0,0,0,0,0,0,0),iniD(7),iniD(7),list(0,0,0,0,0,0,0),-1;
1123
+ list L=data(J,3,7);
1124
+ list L2=determinecenter(L[1],L[2],2,7,0,0,Lmb,flag,0,-1); // Computing the center
1125
+ module auxpath=[0,-1];
1126
+ list infochart=0,0,0,L[2],L[1],flag,0,list(0,0,0,0,0,0,0),auxpath,list(),list();
1127
+ list L3=Blowupcenter(L2[1],1,1,infochart,2,7,0);
1128
+ L3[1]; // current chart (parent,Y,center,expJ,Coef,flag,Hhist,blwhist,path,hipercoef,hiperexp) with sons: [12],...,[16]
1129
+ L3[2][1]; // information of its first son, write L3[2][2],...,L3[2][5] to see the other sons
1130
+ L3[3]; // current number of charts
1131
+ L3[4]; // step/level associated to each son
1132
+ L3[5]; // number of variables in the center
1133
+ }
1134
+ //////////////////////////////////////////////////////////////
1135
+
1136
+ proc tradblwup(list blwhist,int n,int Y,intvec a,int num)
1137
+ "Internal procedure - no help and no example available
1138
+ "
1139
+ {
1140
+ int i,j,blwnew;
1141
+ intvec aux,aux2;
1142
+
1143
+ for (j=1;j<=n;j++){
1144
+ for (i=1;i<=num;i++){
1145
+ if (j==a[i] and a[i]!=Y){blwnew=Y; break;}
1146
+ else {blwnew=0;}
1147
+ }
1148
+ aux=blwhist[j];
1149
+ aux2=aux,blwnew;
1150
+ blwhist[j]=aux2;
1151
+ }
1152
+ return(blwhist);
1153
+ }
1154
+ //////////////////////////////////////////////////////////////
1155
+ // It is called only when Eord(J)=0, and J!=1 it is checked inside
1156
+ // SO IT IS CALLED AFTER: maxEord(Coef,expJ,sJ,n,flaglist); --> gives (max E-order,sums)
1157
+
1158
+ proc Nonhyp(list Coef,list expJ,int sJ,int n,list flaglist,list sums)
1159
+ "USAGE: Nonhyp(Coef,expJ,sJ,n,flaglist,sums);
1160
+ Coef, expJ, flaglist, sums lists, sJ, n integers
1161
+ COMPUTE: The "ideal" generated by the non hyperbolic generators of J
1162
+ RETURN: lists with the following information
1163
+ newcoef,newJ: coefficients and exponents of the non hyperbolic generators
1164
+ totalhyp,totalgen: coefficients and exponents of the hyperbolic generators
1165
+ flaglist: new list saying status of variables
1166
+ NOTE: the basering r is supposed to be a polynomial ring K[x,y],
1167
+ in fact, we work in a localization of K[x,y], of type K[x,y]_y with y invertible variables.
1168
+ EXAMPLE: example Nonhyp; shows an example
1169
+ "
1170
+ {
1171
+ int i,j,k,h,lon,lon2,cont;
1172
+ number eordcontrol;
1173
+ list genhyp,listgen,listid,posnumJ,newJ,newcoef,hypcoef,hyp,aux1,aux2,aux3,aux,midlist;
1174
+ list totalhyp,totalgen;
1175
+
1176
+ eordcontrol=0;
1177
+
1178
+ while (eordcontrol==0 and sJ!=0)
1179
+ {
1180
+
1181
+ // Give a positional number/flag to each generator of expJ
1182
+
1183
+ for (i=1;i<=sJ; i++){listgen=expJ[i]; listid=i; posnumJ[i]=listgen+listid; }
1184
+
1185
+ // Select the non hyperbolic and hyperbolic generators
1186
+
1187
+ for (j=1;j<=sJ; j++){lon=size(Coef[j]);
1188
+ if (lon==1){
1189
+
1190
+ // IS NOT NECESSARY TO CHECK IF THERE EXIST A MONOMIAL WITH ONLY UNITS, ALREADY DONE!!
1191
+
1192
+ aux1=aux1+posnumJ[j];
1193
+ aux3=list();
1194
+ aux3[1]=expJ[j];
1195
+ newJ=newJ+aux3;
1196
+ aux3[1]=Coef[j];
1197
+ newcoef=newcoef+aux3;
1198
+ }
1199
+
1200
+ else{ // CHECKING BINOMIALS, ONE TERM WITH E-ORDER ZERO GIVES HYPERBOLIC EQ
1201
+
1202
+ if (sums[j][1]==0 or sums[j][2]==0){aux2=aux2+posnumJ[j];
1203
+ aux3=list();
1204
+ aux3[1]=expJ[j];
1205
+ genhyp=genhyp+aux3;
1206
+ aux3[1]=Coef[j];
1207
+ hypcoef=hypcoef+aux3;
1208
+ if (sums[j][1]==0){aux3[1]=expJ[j][2]; hyp=hyp+aux3;}
1209
+ if (sums[j][2]==0){aux3[1]=expJ[j][1]; hyp=hyp+aux3;}
1210
+ }
1211
+ else {aux1=aux1+posnumJ[j];
1212
+ aux3=list();
1213
+ aux3[1]=expJ[j];
1214
+ newJ=newJ+aux3;
1215
+ aux3[1]=Coef[j];
1216
+ newcoef=newcoef+aux3;}
1217
+
1218
+ }
1219
+ }
1220
+
1221
+ // NOTE: aux1 and aux2 are no needed right now!
1222
+
1223
+ // Identify new y variables, that is, x variables in the monomials contained in hyp
1224
+
1225
+ h=size(hyp);
1226
+
1227
+ for (k=1;k<=h; k++){ for(i=1;i<=n; i++){ if (hyp[k][i]!=0 and flaglist[i]==0) {flaglist[i]=1;}}}
1228
+
1229
+ // To replace x by y IT IS NECESSARY TO CHANGE THE BASERING!!! We change only the list flaglist
1230
+
1231
+ // CHECK IF THE IDEAL IS ALREADY GENERATED BY MONOMIALS, in this case
1232
+ // WE HAVE FINISHED THE E-RESOLUTION PART, J GENERATED BY MONOMIALS AND HYPERBOLIC EQS
1233
+
1234
+ cont=0;
1235
+ lon2=size(newJ);
1236
+ for (j=1;j<=lon2; j++){if (size(newJ[j])==1){cont=cont+1;}}
1237
+
1238
+ if (cont==lon2){newcoef=list();
1239
+ newJ=list();
1240
+ totalgen=totalgen+genhyp;
1241
+ totalhyp=totalhyp+hypcoef;
1242
+ break;}
1243
+
1244
+ // CHECK IF THERE ARE MORE HYPERBOLIC EQUATIONS AFTER UPDATE THE FLAG LIST
1245
+ // CHECK THE MAXIMAL E-ORDER AGAIN
1246
+
1247
+ if (lon2==0){ // we are in the previous case, newJ=empty list, save values and exit
1248
+
1249
+ totalgen=totalgen+genhyp;
1250
+ totalhyp=totalhyp+hypcoef;
1251
+ break;
1252
+ }
1253
+
1254
+ midlist=maxEord(newcoef,newJ,lon2,n,flaglist);
1255
+
1256
+ eordcontrol=midlist[1];
1257
+
1258
+ if (eordcontrol==0){ // new input for the loop
1259
+ Coef=newcoef;
1260
+ expJ=newJ;
1261
+ sJ=lon2;
1262
+ sums=midlist[2]; // flaglist is already updated
1263
+
1264
+ totalgen=totalgen+genhyp;
1265
+ totalhyp=totalhyp+hypcoef;
1266
+
1267
+ hypcoef=list();
1268
+ genhyp=list();
1269
+
1270
+ newJ=list();
1271
+ newcoef=list();
1272
+ }
1273
+ else{ // If the process is already finished we save the values and exit
1274
+
1275
+ totalgen=totalgen+genhyp;
1276
+ totalhyp=totalhyp+hypcoef;
1277
+ }
1278
+
1279
+ } // closing while
1280
+
1281
+ return(newcoef,newJ,totalhyp,totalgen,flaglist);
1282
+ }
1283
+ example
1284
+ {"EXAMPLE:"; echo = 2;
1285
+ ring r = 0,(x(1),y(2),x(3),y(4),x(5..7)),dp;
1286
+ list flag=identifyvar(); // List giving flag=1 to invertible variables: y(2),y(4)
1287
+ ideal J=x(1)^3-x(3)^2*y(4)^2,x(1)*x(7)*y(2)-x(6)^3*x(5)*y(4)^3,1-x(5)^2*y(2)^2;
1288
+ list L=data(J,3,7);
1289
+ list L2=maxEord(L[1],L[2],3,7,flag);
1290
+ L2[1]; // Maximum E-order
1291
+ list New=Nonhyp(L[1],L[2],3,7,flag,L2[2]);
1292
+ New[1]; // Coefficients of the non hyperbolic part
1293
+ New[2]; // Exponents of the non hyperbolic part
1294
+ New[3]; // Coefficients of the hyperbolic part
1295
+ New[4]; // New hyperbolic equations
1296
+ New[5]; // New list giving flag=1 to invertible variables: y(2),y(4),y(5)
1297
+
1298
+ ring r = 0,(x(1..4)),dp;
1299
+ list flag=identifyvar();
1300
+ ideal J=1-x(1)^5*x(2)^2*x(3)^5, x(1)^2*x(3)^3+x(1)^4*x(4)^6;
1301
+ list L=data(J,2,4);
1302
+ list L2=maxEord(L[1],L[2],2,4,flag);
1303
+ L2[1]; // Maximum E-order
1304
+ list New=Nonhyp(L[1],L[2],2,4,flag,L2[2]);
1305
+ New;
1306
+
1307
+ }
1308
+ //////////////////////////////////////////////////////////////
1309
+
1310
+ proc calculateI(list Coef,list expJ,number c,int n,int Y,intvec a,number oldordI,list oldD)
1311
+ "USAGE: calculateI(Coef,expJ,c,n,Y,a,b,D);
1312
+ Coef, expJ, D lists, c, b numbers, n,Y integers, a intvec
1313
+ RETURN: ideal I, non monomial part of J
1314
+ EXAMPLE: example calculateI; shows an example
1315
+ "
1316
+ {
1317
+ int i,cont1,b,j;
1318
+ number EordI,aux;
1319
+ list D,L,expI;
1320
+ list auxdiv,Dstar,aux1,rs;
1321
+
1322
+ // WE NEED THE MONOMIAL PART, BUT ONLY IN DIMENSION n
1323
+
1324
+ auxdiv=list0(n);
1325
+ auxdiv[Y]=oldordI-c;
1326
+ Dstar[1]=oldD[1];
1327
+
1328
+ b=size(a);
1329
+ for (i=1;i<=n;i++) {for (j=1;j<=b;j++) {if (a[j]==i) {aux=aux+oldD[1][i];}}}
1330
+ Dstar[1][Y]=aux;
1331
+ aux=0;
1332
+
1333
+ D[1]=sumlist(Dstar[1],auxdiv);
1334
+
1335
+ cont1=0;
1336
+ for (i=1;i<=n;i++) {if (D[1][i]==0) {cont1=cont1+1;}} // if it fails write listO(n)[i]
1337
+
1338
+ if (cont1==n) {expI=expJ;}
1339
+ else {
1340
+ for (i=1;i<=size(expJ);i++)
1341
+ {rs[i]=size(Coef[i]);
1342
+ if (rs[i]==2){ aux1=list();
1343
+ aux1[1]=reslist(expJ[i][1],D[1]);
1344
+ aux1[2]=reslist(expJ[i][2],D[1]);
1345
+ expI[i]=aux1;} // binomial
1346
+ else {aux1=list();
1347
+ aux1[1]=reslist(expJ[i][1],D[1]);
1348
+ expI[i]=aux1;}} // monomial
1349
+ }
1350
+
1351
+ return(expI);
1352
+ }
1353
+ example
1354
+ {"EXAMPLE:"; echo = 2;
1355
+ ring r = 0,(x(1..3)),dp;
1356
+ list flag=identifyvar();
1357
+ ideal J=x(1)^4*x(2)^2, x(3)^3;
1358
+ list Lmb=1,list(0,0,0),list(0,0,0),list(3),iniD(3),iniD(3),list(0,0,0),-1;
1359
+ list L=data(J,2,3);
1360
+ list LL=determinecenter(L[1],L[2],3,3,0,0,Lmb,flag,0,-1); // Calculate the center
1361
+ module auxpath=[0,-1];
1362
+ list infochart=0,0,0,L[2],L[1],flag,0,list(0,0,0),auxpath,list(),list();
1363
+ list L3=Blowupcenter(LL[1],1,1,infochart,3,3,0); // blowing-up and looking to the x(3) chart
1364
+ calculateI(L3[2][1][5],L3[2][1][4],3,3,3,L3[2][1][3],3,iniD(3)); // (I_3)
1365
+ // looking to the x(1) chart
1366
+ calculateI(L3[2][2][5],L3[2][2][4],3,3,1,L3[2][2][3],3,iniD(3)); // (I_3)
1367
+ }
1368
+ //////////////////////////////////////////////////////////////////////////////////////
1369
+ // //
1370
+ // E-RESOLUTION: Eresol(J) subroutine computing the E-resolution of J, char 0 //
1371
+ // //
1372
+ //////////////////////////////////////////////////////////////////////////////////////
1373
+
1374
+ proc Eresol(ideal J)
1375
+ "USAGE: Eresol(J); J ideal
1376
+ RETURN: The E-resolution of singularities of J in terms of the affine charts, see example
1377
+ EXAMPLE: example Eresol; shows an example
1378
+ "
1379
+ {int i,n,k,idchart,nchart,parent,Y,oldid,tnum,s,cont,control,control2,control3,cont2,val,rs2,l,cont3,tip;
1380
+ intvec a,Hhist;
1381
+ number c,EordJ,EordI,oldordI;
1382
+ list L,LL,oldD,t,auxL,finalchart,chart,auxchart,newL,auxp,auxfchart,L2;
1383
+ list Coef,expJ,expI,sons,oldOlist,oldC,oldt,oldH,allH,auxordJ,auxordI,auxmb,mobile,invariant;
1384
+ list step,nsons,auxinv,extraL,totalinv,auxsum;
1385
+ string empstring;
1386
+ module auxpath;
1387
+
1388
+ // ADDED LATER
1389
+
1390
+ list flag,newflag,blwhist,hipercoef,hiperexp,hipercoefson,hiperexpson;
1391
+ intvec infobo7;
1392
+
1393
+ export finalchart;
1394
+ // export nsons;
1395
+ // export tnum;
1396
+ // export nchart;
1397
+ // export step;
1398
+ export invariant;
1399
+ export auxinv;
1400
+ export mobile;
1401
+
1402
+ n=nvars(basering);
1403
+ flag=identifyvar();
1404
+
1405
+ k=size(J);
1406
+ // Checking input data
1407
+ if (inidata(J,k)==0){return("This library only works for binomial ideals.");}
1408
+
1409
+ idchart=1;
1410
+ nchart=1;
1411
+ parent=0;
1412
+ step=0;
1413
+ control=0;
1414
+ control2=0;
1415
+ control3=0;
1416
+
1417
+ // Translate the input ideal to a list
1418
+ auxL=data(J,k,n); // data gives (Coef,Exp)
1419
+
1420
+ // THEREAFTER WE WORK ALL THE TIME WITH LISTS
1421
+
1422
+ L=maxEord(auxL[1],auxL[2],k,n,flag); // gives (max E-ord, sums)
1423
+ EordJ=L[1];
1424
+
1425
+ // before the first blow up I=J
1426
+ EordI=EordJ;
1427
+
1428
+ // main loop AT EACH CHART WE MUST INICIALIZATE ALL THE VALUES AND
1429
+ // CONSTRUCT THE FIRST CHART chart[1] BEFORE THE LOOP
1430
+
1431
+ // at the first step, before the blow up, there are no exceptional divisors, Y=0
1432
+ Y=0;
1433
+ expJ=auxL[2];
1434
+ Coef=auxL[1];
1435
+ Hhist=0;
1436
+ blwhist=list0(n);
1437
+ auxpath=[0,-1];
1438
+ hipercoef=list(); // this is for the first chart
1439
+ hiperexp=list();
1440
+ auxp=parent,Y,a,expJ,Coef,flag,Hhist,blwhist,auxpath,hipercoef,hiperexp;
1441
+ chart[1]=auxp; // information of the first chart
1442
+
1443
+ tip=1;
1444
+ oldOlist=list0(n);
1445
+ oldC=list0(n);
1446
+ oldC[1]=EordJ; // non necessary here
1447
+ c=EordJ; // the value c is given by the previous step
1448
+ oldt=list0(n);
1449
+ oldD=iniD(n);
1450
+ oldH=iniD(n);
1451
+ allH=list0(n);
1452
+
1453
+ for (i=1;i<=n;i++){infobo7[i]=-1;}
1454
+
1455
+ auxmb=tip,oldOlist,oldC,oldt,oldD,oldH,allH,infobo7;
1456
+ mobile[1]=auxmb; // mobile corresponding to the first chart
1457
+ auxinv[1]=list(0);
1458
+
1459
+ // NOTE: oldC[1] is the value c to classify the chart in one of the next cases
1460
+
1461
+ // HERE BEGIN THE LOOP
1462
+
1463
+ while (idchart<=nchart) // WE PROCEED WHILE THERE EXIST UNSOLVED CHARTS
1464
+ {
1465
+ if (idchart!=1) // WE ARE NOT IN THE FIRST CHART, INICIALIZATE ALL THE VALUES
1466
+ {
1467
+
1468
+ parent=chart[idchart][1];
1469
+ Y=chart[idchart][2];
1470
+ a=chart[idchart][3];
1471
+ expJ=chart[idchart][4];
1472
+ Coef=chart[idchart][5];
1473
+ flag=chart[idchart][6];
1474
+ Hhist=chart[idchart][7]; // it is not necessary for the computations
1475
+ blwhist=chart[idchart][8];
1476
+ auxpath=chart[idchart][9];
1477
+ hipercoef=chart[idchart][10];
1478
+ hiperexp=chart[idchart][11];
1479
+
1480
+ k=size(Coef); // IT IS NECESSARY TO COMPUTE IT BECAUSE IT DECREASES IF THERE ARE HYPERBOLIC EQS
1481
+
1482
+ auxordJ=maxEord(Coef,expJ,k,n,flag);
1483
+ EordJ=auxordJ[1];
1484
+
1485
+ if (control==0){c=mobile[parent+1][3][1];} // we keep c from the last step
1486
+ else {c=EordJ; control=0; } // we reset the value of c
1487
+
1488
+ if (control2==1){c=EordJ; control2=0; control3=1;} // we reset the value of c
1489
+
1490
+ // NOTE: oldC[1] is the value c to classify the chart in one of the next cases
1491
+
1492
+ }
1493
+
1494
+ // The E-order must be computed here
1495
+
1496
+ oldid=idchart;
1497
+
1498
+ if (EordJ<0) {print("ERROR in J in chart"); print(idchart); ~; break;}
1499
+
1500
+
1501
+ //-------------------------------------------------------------
1502
+ // CASE J=1, if we reset c, can happen Eord=c=0
1503
+
1504
+ // or if there are hyperbolic equations at the beginning!!! A?ADIR!!!!
1505
+
1506
+ // if (EordJ==0){auxfchart[1]=chart[idchart]; // WE HAVE FINISHED
1507
+ // finalchart=finalchart+auxfchart;
1508
+ // empstring="#"; print("reset c and Eord=c=0"); print(idchart);
1509
+ // invariant[idchart]=empstring;
1510
+ // auxinv[idchart]=list(0);
1511
+ // nsons[idchart]=0;
1512
+ // idchart=idchart+1;}
1513
+
1514
+
1515
+ //----------------------------------------------------------------------
1516
+ if (EordJ>=c and EordJ!=0) // subroutine: E-RESOLUTION OF PAIRS
1517
+ {
1518
+ if (parent>0)
1519
+ { LL=determinecenter(Coef,expJ,c,n,Y,a,mobile[parent+1],flag,control3,chart[parent][7]); }
1520
+ else { LL=determinecenter(Coef,expJ,c,n,Y,a,mobile[parent+1],flag,control3,Hhist); }
1521
+
1522
+ // determinecenter gives (center,auxJ,Olist,C,t,D,H,allH,auxinvlist,infobo7)
1523
+
1524
+ // save current values, before the blow up
1525
+ oldOlist=LL[3];
1526
+ tip=computemcm(oldOlist);
1527
+ oldC=LL[4];
1528
+ oldt=LL[5];
1529
+ oldD=LL[6];
1530
+ oldH=LL[7];
1531
+ allH=LL[8];
1532
+ auxinv[idchart]=LL[9];
1533
+ infobo7=LL[10];
1534
+
1535
+ auxmb=tip,oldOlist,oldC,oldt,oldD,oldH,allH,infobo7;
1536
+ mobile[idchart+1]=auxmb;
1537
+ invariant[idchart]=oldt;
1538
+
1539
+ newL=Blowupcenter(LL[1],idchart,nchart,chart[idchart],c,n,step[idchart]);
1540
+
1541
+ // Blowupcenter gives (info,auxchart,nchart,auxstep,num)
1542
+
1543
+ // IMPORTANT: ADD THE NEW CHARTS AFTER EACH BLOW UP, IN ORDER TO KEEP THEM CORRECTLY
1544
+
1545
+ step=step+newL[4];
1546
+ nsons[idchart]=newL[5];
1547
+
1548
+ chart=chart+newL[2];
1549
+ finalchart=finalchart+newL[1];
1550
+
1551
+ // new input for the loop
1552
+
1553
+ idchart=idchart+1;
1554
+ nchart=newL[3];
1555
+
1556
+ control3=0;
1557
+
1558
+ } // END OF CASE EordJ>=c
1559
+ //---------------------------------------------------------------------
1560
+
1561
+ else{
1562
+
1563
+ // compute EordI=max E-order(I)
1564
+
1565
+ expI=calculateI(Coef,expJ,c,n,Y,a,mobile[parent+1][2][1],mobile[parent+1][5]);
1566
+ k=size(expJ); // probably non necessary
1567
+ auxordI=maxEord(Coef,expI,k,n,flag);
1568
+ EordI=auxordI[1];
1569
+ auxsum=auxordI[2];
1570
+
1571
+ // CASE EordI>0 DROP c AND CONTINUE
1572
+
1573
+ if (EordI>0){idchart=idchart; // keep the chart and back to the main loop while, dropping the value of c
1574
+ control=1;}
1575
+ else{ // EordI=0, so check if I=1 or not
1576
+
1577
+ cont2=0; // If cont2=val then all the entries of expI are zero!!
1578
+ val=0;
1579
+
1580
+ for (i=1;i<=k;i++) {rs2=size(Coef[i]);
1581
+ if (rs2==1){if (auxsum[i][1]==0){cont2=val; break;} // THERE EXIST A MONOMIAL WITH ONLY UNITS
1582
+
1583
+ val=val+n; // monomials
1584
+ for (l=1;l<=n; l++) {if (expI[i][1][l]==0) {cont2=cont2+1;}}
1585
+ }
1586
+ else{val=val+(2*n); // binomials
1587
+ for (l=1;l<=n; l++) {if (expI[i][1][l]==0) {cont2=cont2+1;}
1588
+ if (expI[i][2][l]==0) {cont2=cont2+1;}}
1589
+ }
1590
+ }
1591
+
1592
+
1593
+ // CASE EordI==0 AND I=1 THIS CHART IS DONE, FINISH
1594
+
1595
+ // NOTE: THIS CASE IS NOT MONOMIAL BECAUSE E-Sing(J,c) is empty
1596
+
1597
+ if (cont2==val){auxfchart[1]=chart[idchart];
1598
+ finalchart=finalchart+auxfchart;
1599
+ empstring="#";
1600
+ invariant[idchart]=empstring;
1601
+ auxinv[idchart]=list(0);
1602
+ nsons[idchart]=0;
1603
+
1604
+ // information for the mobile
1605
+ tip=1;
1606
+ oldOlist=list(0);
1607
+ oldC=list(0);
1608
+ oldt=list(0);
1609
+ oldD=list(0);
1610
+ oldH=list(0);
1611
+ allH=list(0); // the value of the parent + the new one
1612
+ infobo7=-1;
1613
+
1614
+ auxmb=tip,oldOlist,oldC,oldt,oldD,oldH,allH,infobo7;
1615
+ mobile[idchart+1]=auxmb;
1616
+
1617
+ idchart=idchart+1;}
1618
+
1619
+ else{ // CASE EordI==0 AND I!=1 --> HYPERBOLIC EQUATIONS
1620
+
1621
+ // COMPUTE THE IDEAL OF NON HYPERBOLIC ELEMENTS
1622
+
1623
+ extraL=Nonhyp(Coef,expI,k,n,flag,auxordI[2]); // gives (newcoef,newI,hypcoef,genhyp,flaglist)
1624
+
1625
+ // CHECK IF ALL THE VARIABLES ARE ALREADY INVERTIBLE
1626
+
1627
+ newflag=extraL[5];
1628
+ chart[idchart][6]=extraL[5]; // update the status of variables
1629
+
1630
+ cont3=0;
1631
+ for (i=1;i<=n;i++){if (newflag[i]==1){cont3=cont3+1;}}
1632
+
1633
+ if (cont3==n){ // ALL THE VARIABLES ARE INVERTIBLE
1634
+ auxfchart[1]=chart[idchart];
1635
+ finalchart=finalchart+auxfchart;
1636
+ empstring="@";
1637
+ invariant[idchart]=empstring;
1638
+ auxinv[idchart]=list(0);
1639
+ nsons[idchart]=0;
1640
+
1641
+ // information for the mobile
1642
+ tip=1;
1643
+ oldOlist=list(0);
1644
+ oldC=list(0);
1645
+ oldt=list(0);
1646
+ oldD=list(0);
1647
+ oldH=list(0);
1648
+ allH=list(0);
1649
+ infobo7=-1;
1650
+
1651
+ auxmb=tip,oldOlist,oldC,oldt,oldD,oldH,allH,infobo7;
1652
+ mobile[idchart+1]=auxmb;
1653
+
1654
+ idchart=idchart+1;}
1655
+ else{ // OTHERWISE, CONTINUE CHECKING IF newI=0 or not
1656
+
1657
+ Coef=extraL[1];
1658
+ expI=extraL[2];
1659
+
1660
+ hipercoefson=extraL[3]; // Information about hyperbolic generators
1661
+ hiperexpson=extraL[4];
1662
+
1663
+ k=size(expI);
1664
+
1665
+ if (k==0){auxfchart[1]=chart[idchart]; // WE HAVE FINISHED
1666
+ finalchart=finalchart+auxfchart;
1667
+ empstring="#"; // no more non-hyperbolic generators in this chart
1668
+ invariant[idchart]=empstring;
1669
+ auxinv[idchart]=list(0);
1670
+ nsons[idchart]=0;
1671
+
1672
+ // information for the mobile
1673
+ tip=1;
1674
+ oldOlist=list(0);
1675
+ oldC=list(0);
1676
+ oldt=list(0);
1677
+ oldD=list(0);
1678
+ oldH=list(0);
1679
+ allH=list(0);
1680
+ infobo7=-1;
1681
+
1682
+ auxmb=tip,oldOlist,oldC,oldt,oldD,oldH,allH,infobo7;
1683
+ mobile[idchart+1]=auxmb;
1684
+
1685
+ idchart=idchart+1;}
1686
+
1687
+ else{ // CONTINUE WITH THE IDEAL OF NON HYPERBOLIC EQS
1688
+
1689
+ chart[idchart][4]=expI; // new input ideal and coefficients
1690
+ chart[idchart][5]=Coef;
1691
+ chart[idchart][10]=hipercoef+hipercoefson;
1692
+ chart[idchart][11]=hiperexp+hiperexpson;
1693
+
1694
+ idchart=idchart;
1695
+ control2=1; // it is necessary to reset the value of c
1696
+ control3=1; // and the previous exceptional divisors
1697
+ }
1698
+
1699
+ // PROBABLY IT IS NEC MORE INFORMATION !!!
1700
+
1701
+ } // closing else otherwise
1702
+
1703
+ } // closing else case I!=1
1704
+
1705
+ } // closing else for EordI=0
1706
+
1707
+ if (EordI<0) {print("ERROR in chart"); print(idchart); ~; break;}
1708
+
1709
+ //----------------------- guardar de momento--------
1710
+ // if (EordI==0) {auxfchart[1]=chart[idchart];
1711
+ // finalchart=finalchart+auxfchart;
1712
+ // L2=Gamma(expJ,c,n); // HAY QUE APLICARLO AL M NO AL J
1713
+ // invariant[idchart]=L2[2];
1714
+ // auxinv[idchart]=list(0);
1715
+ // nsons[idchart]=0;
1716
+ // idchart=idchart+1;}
1717
+ //------------------------------------------------
1718
+
1719
+
1720
+ } // END ELSE
1721
+ //---------------------------------------------------
1722
+
1723
+ } // END LOOP WHILE
1724
+
1725
+ tnum=step[nchart];
1726
+
1727
+ totalinv=resfunction(invariant,auxinv,nchart,n);
1728
+
1729
+ return(chart,finalchart,invariant,nchart,step,nsons,auxinv,mobile,totalinv);
1730
+ }
1731
+ example
1732
+ {"EXAMPLE:"; echo = 2;
1733
+ ring r = 0,(x(1..2)),dp;
1734
+ ideal J=x(1)^2-x(2)^3;
1735
+ list L=Eresol(J);
1736
+ "Please press return after each break point to see the next element of the output list";
1737
+ L[1][1]; // information of the first chart, L[1] list of charts
1738
+ ~;
1739
+ L[2]; // list of charts with information about sons
1740
+ ~;
1741
+ L[3]; // invariant, "#" means solved chart
1742
+ ~;
1743
+ L[4]; // number of charts, 7 in this example
1744
+ ~;
1745
+ L[5]; // height corresponding to each chart
1746
+ ~;
1747
+ L[6]; // number of sons
1748
+ ~;
1749
+ L[7]; // auxiliary invariant
1750
+ ~;
1751
+ L[8]; // H exceptional divisors and more information
1752
+ ~;
1753
+ L[9]; // complete resolution function
1754
+
1755
+ "Second example, write L[i] to see the i-th component of the list";
1756
+ ring r = 0,(x(1..3)),dp;
1757
+ ideal J=x(1)^2*x(2),x(3)^3; // SOLVED!
1758
+ list L=Eresol(J);
1759
+ L[4]; // 16 charts
1760
+ L[9]; // complete resolution function
1761
+ ~;
1762
+
1763
+ "Third example, write L[i] to see the i-th component of the list";
1764
+ ring r = 0,(x(1..2)),dp;
1765
+ ideal J=x(1)^3-x(1)*x(2)^3;
1766
+ list L=Eresol(J);
1767
+ L[4]; // 8 charts, rational exponents
1768
+ L[9]; // complete resolution function
1769
+ ~;
1770
+ }
1771
+
1772
+ //////////////////////////////////////////////////////////////////////////////////////
1773
+
1774
+ proc resfunction(list invariant, list auxinv, int nchart,int n)
1775
+ "USAGE: resfunction(invariant,auxinv,nchart,n);
1776
+ invariant, auxinv lists, nchart, n integers
1777
+ COMPUTE: Patch the resolution function
1778
+ RETURN: The complete resolution function
1779
+ EXAMPLE: example resfunction; shows an example
1780
+ "
1781
+ {
1782
+ int i,j,l,k;
1783
+ list patchfun,aux;
1784
+
1785
+ for (i=1;i<=nchart;i++){patchfun[i]=invariant[i];}
1786
+
1787
+ for (i=1;i<=nchart;i++){if (auxinv[i][1]!=0 and size(auxinv[i])==3){l=size(invariant[i]);
1788
+ for (j=1;j<=l;j++){
1789
+ if (invariant[i][j]==0){aux=auxinv[i];
1790
+ patchfun[i][j]=aux;
1791
+ if (l<n){for (k=j+1;k<=n;k++){patchfun[i][k]="*";}}}}
1792
+
1793
+ }
1794
+ else{
1795
+ if (auxinv[i][1]==1 and size(auxinv[i])==1){l=size(invariant[i]);
1796
+ if (l<n){for (k=l+1;k<=n;k++){patchfun[i][k]="*";}}
1797
+ }
1798
+ }
1799
+ }
1800
+
1801
+ return(patchfun);
1802
+ }
1803
+ example
1804
+ {"EXAMPLE:"; echo = 2;
1805
+ ring r = 0,(x(1..2)),dp;
1806
+ ideal J=x(1)^2-x(2)^3;
1807
+ list L=Eresol(J);
1808
+ L[3]; // incomplete resolution function
1809
+ resfunction(L[3],L[7],7,2); // complete resolution function
1810
+ }
1811
+ //////////////////////////////////////////////////////////////////////////////////////
1812
+ // //
1813
+ // MAIN PROCEDURE //
1814
+ // //
1815
+ //////////////////////////////////////////////////////////////////////////////////////
1816
+
1817
+ proc BINresol(ideal J)
1818
+ "USAGE: BINresol(J); J ideal
1819
+ RETURN: E-resolution of singularities of a binomial ideal J in terms of the affine charts, see example
1820
+ EXAMPLE: example BINresol; shows an example
1821
+ "
1822
+ {
1823
+
1824
+ int p,n;
1825
+
1826
+ p=char(basering);
1827
+ n=nvars(basering); // already computed in Eresol, it can be improved
1828
+
1829
+ def rr=basering;
1830
+
1831
+ // INTERNAL CHANGE: changing the name of the variables, only if it is necessary
1832
+
1833
+ list Mout=changeoriginalvar();
1834
+
1835
+ if (Mout[2]==1){
1836
+ def r=Mout[1];
1837
+ setring r;
1838
+ ideal chy=maxideal(1);
1839
+ map frr=rr,chy;
1840
+ ideal J=frr(J);
1841
+ }
1842
+ // else{def r=basering;} // CHECK THAT IS NECESSARY !!!
1843
+
1844
+ // IF WE ARE IN POSITIVE CHAR
1845
+
1846
+ if (p>0){list Lring=ringlist(basering);
1847
+ Lring[1]=0;
1848
+ // def r=basering;
1849
+ def Rnew=ring(Lring);
1850
+ setring Rnew;
1851
+ ideal chy=maxideal(1);
1852
+ map fRnew=r,chy;
1853
+ ideal J=fRnew(J);
1854
+
1855
+ // E-RESOLUTION, Computations in char 0
1856
+
1857
+ list L=Eresol(J);
1858
+
1859
+ // STEP 2: WRITE THE LOCALLY MONOMIAL IDEAL AS A MONOMIAL IDEAL
1860
+
1861
+ // not implemented yet, CHAR p !!!!
1862
+
1863
+ // STEP 3: DO THE E-RESOLUTION AGAIN (char 0 again)
1864
+
1865
+
1866
+ // generating output in char p
1867
+
1868
+ int q=lcmofall(L[4],L[8]); // lcm of the denominators
1869
+
1870
+ list B=genoutput(L[1],L[8],L[4],L[6],n,q,p); // generate output needed for visualization
1871
+
1872
+
1873
+ // setring r; // Back to the basering
1874
+ // ideal chy=maxideal(1);
1875
+ // map fr=Rnew,chy;
1876
+ // list L=fr(L);
1877
+ // list B=fr(B);
1878
+
1879
+ }
1880
+
1881
+ else{
1882
+
1883
+ // E-RESOLUTION
1884
+
1885
+ list L=Eresol(J);
1886
+
1887
+ // STEP 2: WRITE THE LOCALLY MONOMIAL IDEAL AS A MONOMIAL IDEAL
1888
+
1889
+ // not implemented yet
1890
+
1891
+ // STEP 3: DO THE E-RESOLUTION AGAIN
1892
+
1893
+
1894
+ // generating output
1895
+
1896
+ int q=lcmofall(L[4],L[8]);
1897
+
1898
+ list B=genoutput(L[1],L[8],L[4],L[6],n,q,p);
1899
+
1900
+ }
1901
+
1902
+ return(B);
1903
+ }
1904
+ example
1905
+ {"EXAMPLE:"; echo = 2;
1906
+ ring r = 0,(x(1..2)),dp;
1907
+ ideal J=x(1)^2-x(2)^3;
1908
+ list B=BINresol(J);
1909
+ B[1]; // list of final charts
1910
+ B[2]; // list of all charts
1911
+
1912
+ ring r = 2,(x(1..3)),dp;
1913
+ ideal J=x(1)^2-x(2)^2*x(3)^2;
1914
+ list B=BINresol(J);
1915
+ B[2]; // list of all charts
1916
+ }
1917
+ ///////////////////////////////////////////////////////
1918
+
1919
+ proc Maxord(list L,int n)
1920
+ "USAGE: Maxord(L,n); L list, n integer
1921
+ COMPUTE: Find the maximal entry of a list, input is a list defining a monomial
1922
+ RETURN: maximum entry of a list and its position
1923
+ EXAMPLE: example Maxord; shows an example
1924
+ "
1925
+ {int i,can;
1926
+ number canmax;
1927
+ list aux;
1928
+
1929
+ canmax=1;
1930
+ can=1;
1931
+ for (i=1;i<=n;i++)
1932
+ { if (L[i]>=canmax and i>=can)
1933
+ {canmax=L[i]; can=i;}}
1934
+
1935
+ return(canmax,can);
1936
+ }
1937
+ example
1938
+ {"EXAMPLE:"; echo = 2;
1939
+ ring r = 0,(x(1..3)),dp;
1940
+ ideal J=x(1)^2*x(2)*x(3)^5;
1941
+ list L=data(J,1,3);
1942
+ L[2]; // list of exponents
1943
+ Maxord(L[2][1][1],3);
1944
+ }
1945
+ ///////////////////////////////////////////////////////
1946
+
1947
+ proc Gamma(list expM,number c,int n)
1948
+ "USAGE: Gamma(L,c,n); L list, c number, n integer
1949
+ COMPUTE: The Gamma function, resolution function corresponding to the monomial case
1950
+ RETURN: lists of maximum exponents in L, value of Gamma function, center of blow up
1951
+ EXAMPLE: example Gamma; shows an example
1952
+ "
1953
+ {int i,j,k,l,cont,can;
1954
+ intvec upla;
1955
+ number canmax;
1956
+ list expM2,gamma,L,aux,maxlist,center,aux2;
1957
+
1958
+ i=1;
1959
+ cont=0;
1960
+ expM2=expM;
1961
+
1962
+ while (cont==0 and i<=n)
1963
+ {
1964
+
1965
+ L=Maxord(expM2,n);
1966
+ aux=L[1];
1967
+ maxlist=maxlist + aux;
1968
+ can=L[2];
1969
+
1970
+ if (i==1) {upla=can; center=can;}
1971
+ else {upla=upla,can; aux2=can; center=center+aux2;}
1972
+
1973
+ canmax=sum(maxlist);
1974
+ if (canmax>=c)
1975
+ {gamma[1]=-i; gamma[2]=canmax/c; gamma[3]=upla; cont=1;}
1976
+ else {expM2[can]=0;}
1977
+ i=i+1;
1978
+ }
1979
+ return(maxlist,gamma,center);
1980
+ }
1981
+ example
1982
+ {"EXAMPLE:"; echo = 2;
1983
+ ring r = 0,(x(1..5)),dp;
1984
+ ideal J=x(1)^2*x(2)*x(3)^5*x(4)^2*x(5)^3;
1985
+ list L=data(J,1,5);
1986
+ list G=Gamma(L[2][1][1],9,5); // critical value c=9
1987
+ G[1]; // maximum exponents in the ideal
1988
+ G[2]; // maximal value of Gamma function
1989
+ G[3]; // center given by Gamma
1990
+ }
1991
+ ///////////////////////////////////////////////////////
1992
+
1993
+ proc convertdata(list C,list L, int n, list flaglist)
1994
+ "USAGE: convertdata(C,L,n,flaglist);
1995
+ C, L, flaglist lists, n integer
1996
+ COMPUTE: Compute the ideal corresponding to the given lists C,L
1997
+ RETURN: an ideal whose coefficients are given by C, exponents given by L
1998
+ EXAMPLE: example convertdata; shows an example
1999
+ "
2000
+ {int i,j,k,a,b,lon;
2001
+ poly aux,aux1,aux2,aux3,f;
2002
+ ideal J;
2003
+
2004
+ aux=poly(0);
2005
+ aux1=poly(1);
2006
+ aux2=poly(0);
2007
+ aux3=poly(1);
2008
+
2009
+
2010
+ k=size(L);
2011
+ for (i=1;i<=k;i++){lon=size(C[i]);
2012
+ if (lon==1){ // variables in the monomial
2013
+ for (j=1;j<=n;j++){a=int(poly(L[i][1][j]));
2014
+ if (a!=0){
2015
+ if (flaglist[j]==0){aux=poly(x(j)^a);
2016
+ aux1=aux1*aux;}
2017
+ else {aux=poly(y(j)^a);
2018
+ aux1=aux1*aux;}
2019
+ }
2020
+ }
2021
+ if (C[i][1]!=0){aux1=C[i][1]*aux1;} // we add the coefficient
2022
+ else {aux1=0;}
2023
+
2024
+ J[i]=aux1;
2025
+ aux1=poly(1);
2026
+ }
2027
+
2028
+ else{ // variables in the binomial
2029
+
2030
+ for (j=1;j<=n;j++){a=int(poly(L[i][1][j])); b=int(poly(L[i][2][j]));
2031
+
2032
+ if (a!=0){
2033
+ if (flaglist[j]==0){aux=poly(x(j)^a);
2034
+ aux1=aux1*aux;}
2035
+ else {aux=poly(y(j)^a);
2036
+ aux1=aux1*aux;}
2037
+ }
2038
+
2039
+ if (b!=0){
2040
+ if (flaglist[j]==0){aux2=poly(x(j)^b);
2041
+ aux3=aux3*aux2;}
2042
+ else {aux2=poly(y(j)^b);
2043
+ aux3=aux3*aux2;}
2044
+ }
2045
+ }
2046
+ // we add the coefficients
2047
+ if (C[i][1]!=0){aux1=C[i][1]*aux1;}
2048
+ else {aux1=0;}
2049
+ if (C[i][2]!=0){aux3=C[i][2]*aux3;}
2050
+ else {aux3=0;}
2051
+
2052
+ f=aux1+aux3;
2053
+ J[i]=f;
2054
+ aux1=poly(1);
2055
+ aux3=poly(1);
2056
+
2057
+ }
2058
+ }
2059
+ return(J);
2060
+ }
2061
+ example
2062
+ {"EXAMPLE:"; echo = 2;
2063
+ ring r = 0,(x(1..4),y(5)),dp;
2064
+ list M=identifyvar();
2065
+ ideal J=x(1)^2*y(5)^2-x(2)^2*x(3)^2,6*x(4)^2;
2066
+ list L=data(J,2,5);
2067
+ L[1]; // Coefficients
2068
+ L[2]; // Exponents
2069
+ ideal J2=convertdata(L[1],L[2],5,M);
2070
+ J2;
2071
+ }
2072
+
2073
+ /////////////////////////////////////////////////////////////////////////////
2074
+
2075
+ proc lcmofall(int nchart,list mobile)
2076
+ "USAGE: lcmofall(nchart,mobile);
2077
+ nchart integer, mobile list of lists
2078
+ COMPUTE: Compute the lcm of the denominators of the E-orders of all the charts
2079
+ RETURN: an integer given the lcm
2080
+ NOTE: CALL BEFORE salida
2081
+ EXAMPLE: example lcmofall; shows an example
2082
+ "
2083
+
2084
+ {
2085
+ int i,m,tip,mcmall;
2086
+ intvec numall;
2087
+
2088
+ for (i=2;i<=nchart+1;i++){
2089
+ tip=mobile[i][1];
2090
+ if (tip!=1){numall=numall,tip;}
2091
+ }
2092
+ m=size(numall);
2093
+
2094
+ if (m==1){mcmall=1;}
2095
+ else{
2096
+ if (numall[1]==0){numall=numall[2..m];}
2097
+ mcmall=lcm(numall);}
2098
+
2099
+ return(mcmall);
2100
+ }
2101
+ example
2102
+ {"EXAMPLE:"; echo = 2;
2103
+ ring r = 0,(x(1..2)),dp;
2104
+ ideal J=x(1)^3-x(1)*x(2)^3;
2105
+ list L=Eresol(J);
2106
+ L[4]; // 8 charts, rational exponents
2107
+ L[8][2][2]; // E-orders at the first chart
2108
+ lcmofall(8,L[8]);
2109
+ }
2110
+ /////////////////////////////////////////////////////////////////////////////
2111
+
2112
+ proc salida(int idchart,list chart,list mobile,int numson,intvec previousa,int n,int q,int p)
2113
+ "USAGE: salida(idchart,chart,mobile,numson,previousa,n,q,p);
2114
+ idchart, numson, n, q, p integers, chart, mobile, lists, previousa intvec
2115
+ COMPUTE: CONVERT THE OUTPUT OF A CHART IN A RING, WHERE DEFINE A BASIC OBJECT (BO)
2116
+ RETURN: the ring corresponding to the chart
2117
+ EXAMPLE: example salida; shows an example
2118
+ "
2119
+ {
2120
+ int l,i,m,aux,parent,m4,j;
2121
+ intvec Hhist,EOhist,aux7,aux9;
2122
+ list expJ,Coef,BO,blwhist,Eolist,hipercoef,hiperexp;
2123
+ list flag;
2124
+
2125
+ // chart gives: parent,Y,a,expJ,Coef,flag,Hhist,blwhist,path,hipercoef,hiperexp
2126
+ // mobile gives: tip,oldOlist,oldC,oldt,oldD,oldH,allH,infobo7; NOTE: Eolist=mobile[2];
2127
+
2128
+ // we need to define the suitable ring at this chart
2129
+
2130
+ list Lring=ringlist(basering);
2131
+ def RR2=basering;
2132
+
2133
+ flag=chart[6];
2134
+ string newl;
2135
+
2136
+ for (l=1;l<=n; l++){if (flag[l]==1){newl=string(l);
2137
+ Lring[2][l]="y("+newl+")";} }
2138
+
2139
+
2140
+ def RRnew=ring(Lring);
2141
+ setring RRnew;
2142
+ ideal chy=maxideal(1);
2143
+ map fRnew=RR2,chy;
2144
+
2145
+ list chart=fRnew(chart);
2146
+
2147
+ list mobile2=fRnew(mobile);
2148
+
2149
+
2150
+ flag=chart[6];
2151
+
2152
+ // we need to convert expJ and Coef to an ideal
2153
+
2154
+ expJ=chart[4];
2155
+ Coef=chart[5];
2156
+ Hhist=chart[7];
2157
+ blwhist=chart[8];
2158
+
2159
+ // now the ideal will be correctly defined in the ring Rnew
2160
+
2161
+ ideal J2=convertdata(Coef,expJ,n,flag); // Computations in RRnew
2162
+
2163
+ //------------------------------------------------------------------------------
2164
+ // START TO CREATE THE BO corresponding to this chart
2165
+
2166
+ BO=createBO(J2);
2167
+
2168
+ // MODIFY BO WITH THE INFORMATION OF THE CHART
2169
+
2170
+ // BO[1] an ideal, say W_i, defining the ambient space of the i-th chart of the blowing up
2171
+ // If there are hyperbolic equations, we put them here
2172
+
2173
+ hipercoef=chart[10];
2174
+ hiperexp=chart[11];
2175
+
2176
+ if (size(hipercoef)!=0){
2177
+ ideal ambJ=convertdata(hipercoef,hiperexp,n,flag);
2178
+ BO[1]=ambJ;
2179
+ }
2180
+
2181
+ // BO[2] an ideal defining the controlled transform
2182
+
2183
+ BO[2]=J2;
2184
+
2185
+ // BO[3] intvec, tupla containing the maximal E-order of BO[2]
2186
+
2187
+ if (numson==0){BO[3]=1;} // we write 1 if the chart is a final chart
2188
+ else{
2189
+ Eolist=mobile2[2]; // otherwise, convert the list of E-orders in an intvec
2190
+ m=size(Eolist);
2191
+ aux=int(Eolist[1]*q);
2192
+ EOhist=aux;
2193
+
2194
+ if (m>1){for (i=2;i<=m;i++){aux=int(Eolist[i]*q); EOhist=EOhist,aux;}}
2195
+
2196
+ BO[3]=EOhist;
2197
+ }
2198
+
2199
+ // BO[4] the list of exceptional divisors given by Hhist
2200
+
2201
+ BO[4]=constructH(Hhist,n,flag);
2202
+
2203
+ // BO[5] an ideal defining the map K[W] ----> K[Wi] given by blwhist
2204
+
2205
+ BO[5]=constructblwup(blwhist,n,chy,flag);
2206
+
2207
+ // BO[6] an intvec, BO[6][j]=1 indicates that <BO[4][j],BO[2]>=1, i.e. the
2208
+ // strict transform does not meet the j-th exceptional divisor
2209
+
2210
+ m4=size(BO[4]);
2211
+ ideal auxydeal;
2212
+ ideal Jint;
2213
+
2214
+ for (j=1;j<=m4;j++){
2215
+
2216
+ auxydeal=BO[4][j]+J2;
2217
+ Jint=std(auxydeal);
2218
+
2219
+ if (size(Jint)==1 and Jint[1]==1){BO[6][j]=1;}
2220
+ else{BO[6][j]=0;}
2221
+ }
2222
+
2223
+ // BO[7] intvec, the index of the first blown-up object in the resolution process
2224
+ // leading to this object for which the value of b was BO[3]
2225
+ // the subsequent ones are the indices for the Coeff-Objects
2226
+ // of BO[2] used when determining the center
2227
+ // index of last element of H^- in H
2228
+
2229
+
2230
+ if (numson!=0){BO[7]=mobile2[8];} // it is always -1 at the final charts
2231
+
2232
+ // BO[8] a matrix indicating that BO[4][i] meets BO[4][j] by BO[8][i,j]=1 for i < j
2233
+
2234
+ if (m4>0){
2235
+ matrix aux8[m4][m4];
2236
+
2237
+ BO[8]=aux8;
2238
+
2239
+ ideal auxydeal2;
2240
+ ideal Jint2;
2241
+
2242
+ for (i=1;i<=m4;i++){
2243
+ for (j=i+1;j<=m4;j++){
2244
+ auxydeal2=BO[4][i]+BO[4][j];
2245
+ Jint2=std(auxydeal2);
2246
+
2247
+ if (size(Jint2)==1 and Jint2[1]==1){BO[8][i,j]=0;}
2248
+ else{ for (l=1;l<j;l++){BO[8][l,j]=1;} }
2249
+ }
2250
+
2251
+ }
2252
+ }
2253
+ else{ matrix aux8[1][1];
2254
+ BO[8]=aux8;}
2255
+
2256
+
2257
+ // BO[9] INTERNAL DATA, second component of Villamayor resolution function,
2258
+ // only needed to use the visualization procedures
2259
+
2260
+ int m3=size(BO[3]);
2261
+
2262
+ if (m3==1){aux9=intvec(0);}
2263
+ else{ aux9[1]=0;
2264
+ for (i=2;i<=m3;i++){aux9=aux9,0;}
2265
+ }
2266
+
2267
+ BO[9]=aux9;
2268
+
2269
+ //------------------------------------------------------------------------------
2270
+
2271
+ // START TO CREATE THE extra information corresponding to this chart
2272
+
2273
+ /////////////// Short description of data in a chart ///////////////////
2274
+ // All chart data is stored in an object of type ring, the following
2275
+ // variables are always present in such a ring:
2276
+
2277
+ // BO: already created
2278
+
2279
+ // cent: ideal, describing the upcoming center determined by the algorithm
2280
+
2281
+ ideal cent=tradtoideal(previousa,J2,flag);
2282
+
2283
+
2284
+ // path= module (autoconverted to matrix)
2285
+ // path[1][idchart]=parent[idchart] index of the parent-chart in resolution history of this chart
2286
+ // path[2][idchart]=index of this chart in relation with its brother-charts
2287
+
2288
+ module path=chart[9];
2289
+
2290
+
2291
+ // lastMap: ideal, describing the preceding blow up leading to this chart
2292
+
2293
+ ideal lastMap=constructlastblwup(blwhist,n,chy,flag);
2294
+
2295
+
2296
+ //------------------------------------------------------------------------------
2297
+
2298
+ // EXTRA INFORMATION NEEDED
2299
+
2300
+ list invSat=ideal(0),aux9;
2301
+
2302
+
2303
+ // BACK TO THE CHAR OF THE ORIGINAL RING, IF IT HAD p>0
2304
+
2305
+ if (p>0){
2306
+
2307
+ list Lring;
2308
+ Lring=ringlist(RRnew);
2309
+ Lring[1]=p;
2310
+ def auxRnew=ring(Lring);
2311
+
2312
+ kill Lring;
2313
+ setring auxRnew;
2314
+ ideal chy=maxideal(1);
2315
+ map frnew=RRnew,chy;
2316
+ def BO=frnew(BO);
2317
+
2318
+ // def chart=frr(chart);
2319
+ def invSat=frnew(invSat);
2320
+ def lastMap=frnew(lastMap);
2321
+ def cent=frnew(cent);
2322
+ def path=frnew(path);
2323
+
2324
+ }
2325
+
2326
+ // export everything needed
2327
+
2328
+ export BO;
2329
+ export(invSat);
2330
+ export lastMap;
2331
+ export path;
2332
+ export cent;
2333
+
2334
+ if (p==0){return(RRnew);}
2335
+ else{
2336
+ return(auxRnew);}
2337
+ }
2338
+ example
2339
+ {"EXAMPLE:"; echo = 2;
2340
+ ring r = 0,(x(1..2)),dp;
2341
+ ideal J=x(1)^2-x(2)^3;
2342
+ list L=Eresol(J);
2343
+ list B=salida(5,L[1][5],L[8][6],2,L[1][3][3],2,1,0); // chart 5
2344
+ def RR=B[1];
2345
+ setring RR;
2346
+ BO;
2347
+ "press return to see next example"; ~;
2348
+
2349
+ ring r = 0,(x(1..2)),dp;
2350
+ ideal J=x(1)^2-x(2)^3;
2351
+ list L=Eresol(J);
2352
+ list B=salida(7,L[1][7],L[8][8],0,L[1][5][3],2,1,0); // chart 7
2353
+ def RR=B[1];
2354
+ setring RR;
2355
+ BO;
2356
+ showBO(BO);
2357
+ "press return to see next example"; ~;
2358
+
2359
+ ring r = 0,(x(1..2)),dp;
2360
+ ideal J=x(1)^3-x(1)*x(2)^3;
2361
+ list L=Eresol(J); // 8 charts, rational exponents
2362
+ list B=salida(1,L[1][1],L[8][2],2,0,2,2,0); // CHART 1
2363
+ def RR=B[1];
2364
+ setring RR;
2365
+ BO;
2366
+
2367
+ }
2368
+
2369
+ /////////////////////////////////////////////////////////////////////////////
2370
+ // CONVERT THE OUTPUT OF Eresol IN A LIST OF RINGS, WHERE A BASIC OBJECT (BO) IS DEFINED
2371
+ // IN ORDER TO INTEGRATE THIS LIBRARY INSIDE THE LIBRARY resolve.lib
2372
+
2373
+ proc genoutput(list chart,list mobile,int nchart,list nsons,int n,int q, int p)
2374
+ "USAGE: genoutput(chart,mobile,nchart,nsons,n,q,p);
2375
+ chart, mobile, nsons lists, nchart, n,q, p integers
2376
+ RETURN: two lists, the first one gives the rings corresponding to the final charts,
2377
+ the second one is the list of all rings corresponding to the affine charts of the resolution process
2378
+ EXAMPLE: example genoutput; shows an example
2379
+ "
2380
+ {
2381
+ int idchart,parent;
2382
+ list auxlist,solvedrings,totalringlist,previousa;
2383
+ list auxlistenp,solvedringsenp,totalringenp;
2384
+
2385
+ // chart gives: parent,Y,a,expJ,Coef,flag,Hhist,blwhist,path,hipercoef,hiperexp
2386
+ // mobile gives: tip,oldOlist,oldC,oldt,oldD,oldH,allH,infobo7; NOTE: Eolist=mobile[2];
2387
+
2388
+ idchart=1;
2389
+
2390
+ // first loop, construct list previousa
2391
+
2392
+ while (idchart<=nchart)
2393
+ {
2394
+ if (idchart==1){previousa[1]=chart[2][3];}
2395
+ else
2396
+ {
2397
+ // if there are no sons, the next center is nothing
2398
+ if (nsons[idchart]==0){previousa[idchart]=0;}
2399
+ // always fill the parent
2400
+ parent=chart[idchart][1];
2401
+ previousa[parent]=chart[idchart][3];
2402
+ }
2403
+ idchart=idchart+1;
2404
+ }
2405
+ // HERE BEGIN THE LOOP
2406
+ idchart=1;
2407
+ while (idchart<=nchart)
2408
+ {
2409
+ def auxexit=salida(idchart,chart[idchart],mobile[idchart+1],nsons[idchart],previousa[idchart],n,q,p);
2410
+ if (p>0)
2411
+ { // we need the computations in char 0 too
2412
+ def auxexitenp=salida(idchart,chart[idchart],mobile[idchart+1],nsons[idchart],previousa[idchart],n,q,0);
2413
+ }
2414
+ else{def auxexitenp=auxexit;}
2415
+ // we add the ring to the list of all rings
2416
+ auxlist[1]=auxexit;
2417
+ totalringlist=totalringlist+auxlist;
2418
+ auxlistenp[1]=auxexitenp;
2419
+ totalringenp=totalringenp+auxlistenp;
2420
+ // if the chart has no sons, add it to the list of final charts
2421
+ if (nsons[idchart]==0)
2422
+ {
2423
+ solvedrings=solvedrings+auxlist;
2424
+ solvedringsenp=solvedringsenp+auxlistenp;
2425
+ }
2426
+ auxlist=list();
2427
+ auxlistenp=list();
2428
+ kill auxexit;
2429
+ kill auxexitenp;
2430
+ idchart=idchart+1;
2431
+ } // EXIT WHILE
2432
+ return(solvedrings,totalringlist,solvedringsenp,totalringenp);
2433
+ }
2434
+ example
2435
+ {"EXAMPLE:"; echo = 2;
2436
+ ring r = 0,(x(1..2)),dp;
2437
+ ideal J=x(1)^3-x(1)*x(2)^3;
2438
+ list L=Eresol(J); // 8 charts, rational exponents
2439
+ list B=genoutput(L[1],L[8],L[4],L[6],2,2,0); // generates the output
2440
+ presentTree(B);
2441
+ list iden0=collectDiv(B);
2442
+ ResTree(B,iden0[1]); // generates the resolution tree
2443
+
2444
+ // Use presentTree(B); to see the final charts
2445
+ // To see the tree type in another shell
2446
+ // dot -Tjpg ResTree.dot -o ResTree.jpg
2447
+ // /usr/bin/X11/xv ResTree.jpg
2448
+
2449
+ }
2450
+ /////////////////////////////////////////////////////////////////////
2451
+
2452
+ proc computemcm(list Eolist)
2453
+ "USAGE: computemcm(Eolist); Eolist list
2454
+ RETURN: an integer, the least common multiple of the denominators of the E-orders
2455
+ NOTE: Make the same as lcmofall but for one chart. NECESSARY BECAUSE THE E-ORDERS ARE OF TYPE NUMBER!!
2456
+ EXAMPLE: example computemcm; shows an example
2457
+ "
2458
+ {
2459
+ int m,i,aux,mcmchart;
2460
+ intvec num;
2461
+ m=size(Eolist);
2462
+ if (m==1){mcmchart=int(denominator(Eolist[1])); return(mcmchart);}
2463
+ if (m>1)
2464
+ {
2465
+ num=int(denominator(Eolist[1]));
2466
+ for (i=2;i<=m;i++)
2467
+ {aux=int(denominator(Eolist[i])); num=num,aux; }
2468
+ }
2469
+ mcmchart=lcm(num);
2470
+ return(mcmchart);
2471
+ }
2472
+ example
2473
+ {"EXAMPLE:"; echo = 2;
2474
+ ring r = 0,(x(1..2)),dp;
2475
+ ideal J=x(1)^3-x(1)*x(2)^3;
2476
+ list L=Eresol(J); // 8 charts, rational exponents
2477
+ L[8][2][2]; // maximal E-order at the first chart
2478
+ computemcm(L[8][2][2]);
2479
+
2480
+ }
2481
+ /////////////////////////////////////////////////////////////////////
2482
+
2483
+ proc constructH(intvec Hhist,int n,list flag)
2484
+ "USAGE: constructH(Hhist,n,flag);
2485
+ Hhist intvec, n integer, flag list
2486
+ RETURN: the list of exceptional divisors accumulated at this chart
2487
+ EXAMPLE: example constructH; shows an example
2488
+ "
2489
+ {
2490
+ int i,j,m,l;
2491
+ list exceplist;
2492
+ ideal aux;
2493
+ m=size(Hhist);
2494
+ if (Hhist[1]==0 and m>1)
2495
+ {
2496
+ Hhist=Hhist[2..m]; m=m-1;
2497
+ for (i=1;i<=m;i++)
2498
+ {
2499
+ l=Hhist[i];
2500
+ if (flag[l]==0){aux=ideal(poly(x(l))); }
2501
+ else {aux=ideal(poly(y(l))); }
2502
+ exceplist[i]=aux;
2503
+ }
2504
+ // eliminate repeated variables
2505
+ for (i=1;i<=m;i++)
2506
+ {
2507
+ for (j=1;j<=m;j++)
2508
+ {
2509
+ if (Hhist[i]==Hhist[j] and i!=j)
2510
+ {
2511
+ if (i<j){exceplist[i]=ideal(1);}
2512
+ if (i>j){exceplist[j]=ideal(1);}
2513
+ }
2514
+ }
2515
+ }
2516
+ }
2517
+ else {exceplist=list();}
2518
+ // else {exceplist=list(ideal(0));} // IF IT FAILS USE THIS
2519
+ return(exceplist);
2520
+ }
2521
+ example
2522
+ {"EXAMPLE:"; echo = 2;
2523
+ ring r = 0,(x(1..3)),dp;
2524
+ list flag=identifyvar();
2525
+ ideal J=x(1)^4*x(2)^2, x(1)^2+x(3)^3;
2526
+ list L=Eresol(J); // 7 charts
2527
+ // history of the exceptional divisors at the 7-th chart
2528
+ L[1][7][7]; // blow ups at x(3)-th, x(1)-th and x(1)-th charts
2529
+ constructH(L[1][7][7],3,flag);
2530
+ }
2531
+ /////////////////////////////////////////////////////////////////////
2532
+
2533
+ proc constructblwup(list blwhist,int n,ideal chy,list flag)
2534
+ "USAGE: constructblwup(blwhist,n,chy,flag);
2535
+ blwhist, flag lists, n integer, chy ideal
2536
+ RETURN: the ideal defining the map K[W] --> K[Wi],
2537
+ which gives the composition map of all the blowing up leading to this chart
2538
+ NOTE: NECESSARY START WITH COLUMNS
2539
+ EXAMPLE: example constructblwup; shows an example
2540
+ "
2541
+ {
2542
+ int i,j,m,m2;
2543
+ poly aux2;
2544
+
2545
+ m=size(blwhist[1]);
2546
+
2547
+ for (j=1;j<=m;j++)
2548
+ {
2549
+ for (i=1;i<=n;i++)
2550
+ {
2551
+ m2=blwhist[i][j];
2552
+ // If m2!=0 this variable changes. First decide if the variable to multiply is invertible or not
2553
+ if (m2!=0)
2554
+ {
2555
+ if (flag[m2]==0){aux2=poly(x(m2));}
2556
+ else {aux2=poly(y(m2));}
2557
+ // And then substitute this variable for the corresponding product in the whole ideal
2558
+ if (flag[i]==0){chy=subst(chy,x(i),x(i)*aux2);}
2559
+ else {chy=subst(chy,y(i),y(i)*aux2);}
2560
+ }
2561
+ }
2562
+ }
2563
+ return(chy);
2564
+ }
2565
+ example
2566
+ {"EXAMPLE:"; echo = 2;
2567
+ ring r = 0,(x(1..3)),dp;
2568
+ list flag=identifyvar();
2569
+ ideal chy=maxideal(1);
2570
+ ideal J=x(1)^4*x(2)^2, x(1)^2+x(3)^3;
2571
+ list L=Eresol(J); // 7 charts
2572
+ // history of the blow ups at the 7-th chart, center {x(1)=x(3)=0} every time
2573
+ L[1][7][8]; // blow ups at x(3)-th, x(1)-th and x(1)-th charts
2574
+ constructblwup(L[1][7][8],3,chy,flag);
2575
+ }
2576
+ /////////////////////////////////////////////////////////////////////
2577
+
2578
+ proc constructlastblwup(list blwhist,int n,ideal chy,list flag)
2579
+ "USAGE: constructlastblwup(blwhist,n,chy,flag);
2580
+ blwhist, flag lists, n integer, chy ideal
2581
+ RETURN: the ideal defining the last blow up
2582
+ NOTE: NECESSARY START WITH COLUMNS
2583
+ EXAMPLE: example constructlastblwup; shows an example
2584
+ "
2585
+ {
2586
+ int i,j,m,m2;
2587
+ poly aux2;
2588
+ m=size(blwhist[1]);
2589
+
2590
+ if (m>0)
2591
+ {
2592
+ for (i=1;i<=n;i++){ m2=blwhist[i][m];
2593
+
2594
+ // If m2!=0 this variable changes. First decide if the variable to multiply is invertible or not
2595
+
2596
+ if (m2!=0)
2597
+ {
2598
+ if (flag[m2]==0){aux2=poly(x(m2));}
2599
+ else {aux2=poly(y(m2));}
2600
+
2601
+ // And then substitute this variable for the corresponding product in the whole ideal
2602
+
2603
+ if (flag[i]==0){chy=subst(chy,x(i),x(i)*aux2);}
2604
+ else {chy=subst(chy,y(i),y(i)*aux2);}
2605
+ }
2606
+ }
2607
+ }
2608
+
2609
+ return(chy);
2610
+ }
2611
+ example
2612
+ {"EXAMPLE:"; echo = 2;
2613
+ ring r = 0,(x(1..3)),dp;
2614
+ list flag=identifyvar();
2615
+ ideal chy=maxideal(1);
2616
+ ideal J=x(1)^4*x(2)^2, x(1)^2+x(3)^3;
2617
+ list L=Eresol(J); // 7 charts
2618
+ // history of the blow ups at the 7-th chart, center {x(1)=x(3)=0} every time
2619
+ L[1][7][8]; // blow ups at x(3)-th, x(1)-th and x(1)-th charts
2620
+ constructlastblwup(L[1][7][8],3,chy,flag);
2621
+ }
2622
+ /////////////////////////////////////////////////////////////////////
2623
+
2624
+ proc tradtoideal(intvec a,ideal J2,list flag)
2625
+ "USAGE: tradtoideal(a,J2,flag);
2626
+ a intvec, J2 ideal, flag list
2627
+ COMPUTE: translate to an ideal the intvec defining the center
2628
+ RETURN: the ideal of the center, given by the intvec a, or J2 if a=0
2629
+ EXAMPLE: example tradtoideal; shows an example
2630
+ "
2631
+ {
2632
+ int i,m;
2633
+ ideal acenter,aux2;
2634
+
2635
+ if (a==0)
2636
+ {acenter=J2;}
2637
+ else
2638
+ {
2639
+ m=size(a);
2640
+ for (i=1;i<=m;i++)
2641
+ {
2642
+ if (flag[a[i]]==0){aux2=poly(x(a[i]));}
2643
+ else {aux2=poly(y(a[i]));}
2644
+
2645
+ acenter=acenter+aux2;
2646
+ }
2647
+ }
2648
+ return(acenter);
2649
+ }
2650
+ example
2651
+ {"EXAMPLE:"; echo = 2;
2652
+ ring r = 0,(x(1..3)),dp;
2653
+ list flag=identifyvar();
2654
+ ideal J=x(1)^4*x(2)^2, x(1)^2+x(3)^3;
2655
+ intvec a=1,3; // first center of blowing up
2656
+ tradtoideal(a,J,flag);
2657
+ }
2658
+ //////////////////////////////////////////////////////////////////////////////////////
2659
+ // OPERATIONS WITH LISTS
2660
+ //////////////////////////////////////////////////////////////////////////////////////
2661
+
2662
+ proc iniD(int n)
2663
+ "USAGE: iniD(n); n integer
2664
+ RETURN: list of lists of zeros of size n
2665
+ EXAMPLE: example iniD; shows an example
2666
+ "
2667
+ {int i,j;
2668
+ list D,auxD;
2669
+ for (j=1;j<=n; j++) {auxD[j]=0;}
2670
+ for (i=1;i<=n; i++) {D[i]=auxD;}
2671
+ return(D);
2672
+ }
2673
+ example
2674
+ {"EXAMPLE:"; echo = 2;
2675
+ iniD(3);
2676
+ }
2677
+ /////////////////////////////////////////////////////////
2678
+
2679
+ proc sumlist(list L1,list L2)
2680
+ "USAGE: sumlist(L1,L2); L1,L2 lists, (size(L1)==size(L2))
2681
+ RETURN: a list, sum of L1 and L2
2682
+ EXAMPLE: example sumlist; shows an example
2683
+ "
2684
+ {
2685
+ int i,k;
2686
+ list sumL;
2687
+ k=size(L1);
2688
+ if (size(L2)!=k) {return("ERROR en sumlist, lists must have the same size");}
2689
+ for (i=1;i<=k;i++) {sumL[i]=L1[i]+L2[i];}
2690
+ return(sumL);
2691
+ }
2692
+ example
2693
+ {"EXAMPLE:"; echo = 2;
2694
+ list L1=1,2,3;
2695
+ list L2=5,9,7;
2696
+ sumlist(L1,L2);
2697
+ }
2698
+ ///////////////////////////////////////////////////////
2699
+
2700
+ proc reslist(list L1,list L2)
2701
+ "USAGE: reslist(L1,L2); L1,L2 lists, (size(L1)==size(L2))
2702
+ RETURN: a list, subtraction of L1 and L2
2703
+ EXAMPLE: example reslist; shows an example
2704
+ "
2705
+ {
2706
+ int i,k;
2707
+ list resL;
2708
+ k=size(L1);
2709
+ if (size(L2)!=k) {return("ERROR en reslist, lists must have the same size");}
2710
+ for (i=1;i<=k;i++) {resL[i]=L1[i]-L2[i];}
2711
+ return(resL);
2712
+ }
2713
+ example
2714
+ {"EXAMPLE:"; echo = 2;
2715
+ list L1=1,2,3;
2716
+ list L2=5,9,7;
2717
+ reslist(L1,L2);
2718
+ }
2719
+ //////////////////////////////////////////////////////
2720
+
2721
+ proc multiplylist(list L,number a)
2722
+ "USAGE: multiplylist(L,a); L list, a number
2723
+ RETURN: list of elements of type number, multiplication of L times a
2724
+ EXAMPLE: example multiplylist; shows an example
2725
+ "
2726
+ {int i,k;
2727
+ list newL,bb;
2728
+ number b;
2729
+ k=size(L);
2730
+ for (i=1;i<=k;i++) {b=L[i]*a; bb=b; newL=newL+bb;}
2731
+ return(newL);
2732
+ }
2733
+ example
2734
+ {"EXAMPLE:"; echo = 2;
2735
+ ring r = 0,(x(1..3)),dp;
2736
+ list L=1,2,3;
2737
+ multiplylist(L,1/5);
2738
+ }
2739
+ ///////////////////////////////////////////////////////
2740
+
2741
+ proc dividelist(list L1,list L2)
2742
+ "USAGE: dividelist(L1,L2); L1,L2 lists
2743
+ RETURN: list of elements of type number, division of L1 by L2
2744
+ EXAMPLE: example dividelist; shows an example
2745
+ "
2746
+ {int i,k,k1,k2;
2747
+ list LL,bb;
2748
+ number a1,a2,b;
2749
+ k1=size(L1);
2750
+ k2=size(L2);
2751
+ if (k2!=k1) {print("ERROR en dividelist, lists must have the same size");}
2752
+ if (k1<=k2) {k=k1;}
2753
+ else {k=k2;}
2754
+ for (i=1;i<=k;i++)
2755
+ {a1=L1[i]; a2=L2[i]; b=a1/a2; bb=b; LL=LL+bb;}
2756
+ return(LL);
2757
+ }
2758
+ example
2759
+ {"EXAMPLE:"; echo = 2;
2760
+ ring r = 0,(x(1..3)),dp;
2761
+ list L1=1,2,3;
2762
+ list L2=5,9,7;
2763
+ dividelist(L1,L2);
2764
+ }
2765
+ ///////////////////////////////////////////////////////
2766
+
2767
+ proc createlist(list L1,list L2)
2768
+ "USAGE: createlist(L1,L2); L1,L2 lists, (size(L1)==size(L2))
2769
+ RETURN: list of lists of two elements, the first one of L1 and the second of L2
2770
+ EXAMPLE: example createlist; shows an example
2771
+ "
2772
+ {int i,k;
2773
+ list L,aux;
2774
+ k=size(L1);
2775
+ if (size(L2)!=k) {return("ERROR en createlist, lists must have the same size");}
2776
+ L=list0(k);
2777
+ for (i=1;i<=k;i++) {if (L1[i]!=0) {aux=L1[i],L2[i]; L[i]=aux;}
2778
+ else {L=delete(L,i);}}
2779
+ return(L);
2780
+ }
2781
+ example
2782
+ {"EXAMPLE:"; echo = 2;
2783
+ list L1=1,2,3;
2784
+ list L2=5,9,7;
2785
+ createlist(L1,L2);
2786
+ }
2787
+ ///////////////////////////////////////////////////////
2788
+ static proc list0(int n)
2789
+ "USAGE: list0(n); n integer
2790
+ RETURN: list of n zeros
2791
+ EXAMPLE: example list0; shows an example
2792
+ "
2793
+ {int i;
2794
+ list L0;
2795
+ for (i=1;i<=n;i++) {L0[i]=0;}
2796
+ return(L0);
2797
+ }
2798
+ example
2799
+ {"EXAMPLE:"; echo = 2;
2800
+ list0(4);
2801
+ }
2802
+ ////////////////////////////////////////////////////////////