passagemath-singular 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl

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

Potentially problematic release.


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

Files changed (493) hide show
  1. PySingular.cpython-314-x86_64-linux-musl.so +0 -0
  2. passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
  3. passagemath_singular-10.6.31rc3.dist-info/RECORD +493 -0
  4. passagemath_singular-10.6.31rc3.dist-info/WHEEL +5 -0
  5. passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
  6. passagemath_singular.libs/libSingular-4-67059f19.4.1.so +0 -0
  7. passagemath_singular.libs/libcddgmp-30166d29.so.0.1.3 +0 -0
  8. passagemath_singular.libs/libfactory-4-9d37bcf4.4.1.so +0 -0
  9. passagemath_singular.libs/libflint-fd6f12fc.so.21.0.0 +0 -0
  10. passagemath_singular.libs/libgcc_s-0cd532bd.so.1 +0 -0
  11. passagemath_singular.libs/libgf2x-9e30c3e3.so.3.0.0 +0 -0
  12. passagemath_singular.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  13. passagemath_singular.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  14. passagemath_singular.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  15. passagemath_singular.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  16. passagemath_singular.libs/libncursesw-9c9e32c3.so.6.5 +0 -0
  17. passagemath_singular.libs/libntl-26885ca2.so.44.0.1 +0 -0
  18. passagemath_singular.libs/libomalloc-0-e9ff96db.9.6.so +0 -0
  19. passagemath_singular.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  20. passagemath_singular.libs/libpolys-4-8bcf8e7d.4.1.so +0 -0
  21. passagemath_singular.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  22. passagemath_singular.libs/libreadline-06542304.so.8.2 +0 -0
  23. passagemath_singular.libs/libsingular_resources-4-73bf7623.4.1.so +0 -0
  24. passagemath_singular.libs/libstdc++-5d72f927.so.6.0.33 +0 -0
  25. sage/algebras/all__sagemath_singular.py +3 -0
  26. sage/algebras/fusion_rings/all.py +19 -0
  27. sage/algebras/fusion_rings/f_matrix.py +2448 -0
  28. sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-x86_64-linux-musl.so +0 -0
  29. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
  30. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
  31. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-x86_64-linux-musl.so +0 -0
  32. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
  33. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
  34. sage/algebras/fusion_rings/fusion_double.py +899 -0
  35. sage/algebras/fusion_rings/fusion_ring.py +1580 -0
  36. sage/algebras/fusion_rings/poly_tup_engine.cpython-314-x86_64-linux-musl.so +0 -0
  37. sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
  38. sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
  39. sage/algebras/fusion_rings/shm_managers.cpython-314-x86_64-linux-musl.so +0 -0
  40. sage/algebras/fusion_rings/shm_managers.pxd +24 -0
  41. sage/algebras/fusion_rings/shm_managers.pyx +780 -0
  42. sage/algebras/letterplace/all.py +1 -0
  43. sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-x86_64-linux-musl.so +0 -0
  44. sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
  45. sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
  46. sage/algebras/letterplace/free_algebra_letterplace.cpython-314-x86_64-linux-musl.so +0 -0
  47. sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
  48. sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
  49. sage/algebras/letterplace/letterplace_ideal.cpython-314-x86_64-linux-musl.so +0 -0
  50. sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
  51. sage/algebras/quatalg/all.py +2 -0
  52. sage/algebras/quatalg/quaternion_algebra.py +4778 -0
  53. sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-x86_64-linux-musl.so +0 -0
  54. sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
  55. sage/algebras/quatalg/quaternion_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  56. sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
  57. sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
  58. sage/all__sagemath_singular.py +11 -0
  59. sage/ext_data/all__sagemath_singular.py +1 -0
  60. sage/ext_data/singular/function_field/core.lib +98 -0
  61. sage/interfaces/all__sagemath_singular.py +1 -0
  62. sage/interfaces/singular.py +2835 -0
  63. sage/libs/all__sagemath_singular.py +1 -0
  64. sage/libs/singular/__init__.py +1 -0
  65. sage/libs/singular/decl.pxd +1168 -0
  66. sage/libs/singular/function.cpython-314-x86_64-linux-musl.so +0 -0
  67. sage/libs/singular/function.pxd +87 -0
  68. sage/libs/singular/function.pyx +1901 -0
  69. sage/libs/singular/function_factory.py +61 -0
  70. sage/libs/singular/groebner_strategy.cpython-314-x86_64-linux-musl.so +0 -0
  71. sage/libs/singular/groebner_strategy.pxd +22 -0
  72. sage/libs/singular/groebner_strategy.pyx +582 -0
  73. sage/libs/singular/option.cpython-314-x86_64-linux-musl.so +0 -0
  74. sage/libs/singular/option.pyx +671 -0
  75. sage/libs/singular/polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  76. sage/libs/singular/polynomial.pxd +39 -0
  77. sage/libs/singular/polynomial.pyx +661 -0
  78. sage/libs/singular/ring.cpython-314-x86_64-linux-musl.so +0 -0
  79. sage/libs/singular/ring.pxd +58 -0
  80. sage/libs/singular/ring.pyx +893 -0
  81. sage/libs/singular/singular.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/libs/singular/singular.pxd +72 -0
  83. sage/libs/singular/singular.pyx +1944 -0
  84. sage/libs/singular/standard_options.py +145 -0
  85. sage/matrix/all__sagemath_singular.py +1 -0
  86. sage/matrix/matrix_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  87. sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
  88. sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
  89. sage/rings/all__sagemath_singular.py +1 -0
  90. sage/rings/function_field/all__sagemath_singular.py +1 -0
  91. sage/rings/function_field/derivations_polymod.py +911 -0
  92. sage/rings/function_field/element_polymod.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/rings/function_field/element_polymod.pyx +406 -0
  94. sage/rings/function_field/function_field_polymod.py +2611 -0
  95. sage/rings/function_field/ideal_polymod.py +1775 -0
  96. sage/rings/function_field/order_polymod.py +1475 -0
  97. sage/rings/function_field/place_polymod.py +681 -0
  98. sage/rings/polynomial/all__sagemath_singular.py +1 -0
  99. sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-x86_64-linux-musl.so +0 -0
  100. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
  101. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
  102. sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
  104. sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
  105. sage/rings/polynomial/plural.cpython-314-x86_64-linux-musl.so +0 -0
  106. sage/rings/polynomial/plural.pxd +48 -0
  107. sage/rings/polynomial/plural.pyx +3171 -0
  108. sage/symbolic/all__sagemath_singular.py +1 -0
  109. sage/symbolic/comparison_impl.pxi +428 -0
  110. sage/symbolic/constants_c_impl.pxi +178 -0
  111. sage/symbolic/expression.cpython-314-x86_64-linux-musl.so +0 -0
  112. sage/symbolic/expression.pxd +7 -0
  113. sage/symbolic/expression.pyx +14200 -0
  114. sage/symbolic/getitem_impl.pxi +202 -0
  115. sage/symbolic/pynac.pxi +572 -0
  116. sage/symbolic/pynac_constant_impl.pxi +133 -0
  117. sage/symbolic/pynac_function_impl.pxi +206 -0
  118. sage/symbolic/pynac_impl.pxi +2576 -0
  119. sage/symbolic/pynac_wrap.h +124 -0
  120. sage/symbolic/series_impl.pxi +272 -0
  121. sage/symbolic/substitution_map_impl.pxi +94 -0
  122. sage_wheels/bin/ESingular +0 -0
  123. sage_wheels/bin/Singular +0 -0
  124. sage_wheels/bin/TSingular +0 -0
  125. sage_wheels/lib/singular/MOD/cohomo.la +41 -0
  126. sage_wheels/lib/singular/MOD/cohomo.so +0 -0
  127. sage_wheels/lib/singular/MOD/customstd.la +41 -0
  128. sage_wheels/lib/singular/MOD/customstd.so +0 -0
  129. sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
  130. sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
  131. sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
  132. sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
  133. sage_wheels/lib/singular/MOD/gitfan.la +41 -0
  134. sage_wheels/lib/singular/MOD/gitfan.so +0 -0
  135. sage_wheels/lib/singular/MOD/interval.la +41 -0
  136. sage_wheels/lib/singular/MOD/interval.so +0 -0
  137. sage_wheels/lib/singular/MOD/loctriv.la +41 -0
  138. sage_wheels/lib/singular/MOD/loctriv.so +0 -0
  139. sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
  140. sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
  141. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
  142. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
  143. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
  144. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
  145. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
  146. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
  147. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
  148. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
  149. sage_wheels/lib/singular/MOD/partialgb.la +41 -0
  150. sage_wheels/lib/singular/MOD/partialgb.so +0 -0
  151. sage_wheels/lib/singular/MOD/pyobject.la +41 -0
  152. sage_wheels/lib/singular/MOD/pyobject.so +0 -0
  153. sage_wheels/lib/singular/MOD/singmathic.la +41 -0
  154. sage_wheels/lib/singular/MOD/singmathic.so +0 -0
  155. sage_wheels/lib/singular/MOD/sispasm.la +41 -0
  156. sage_wheels/lib/singular/MOD/sispasm.so +0 -0
  157. sage_wheels/lib/singular/MOD/subsets.la +41 -0
  158. sage_wheels/lib/singular/MOD/subsets.so +0 -0
  159. sage_wheels/lib/singular/MOD/systhreads.la +41 -0
  160. sage_wheels/lib/singular/MOD/systhreads.so +0 -0
  161. sage_wheels/lib/singular/MOD/syzextra.la +41 -0
  162. sage_wheels/lib/singular/MOD/syzextra.so +0 -0
  163. sage_wheels/libexec/singular/MOD/change_cost +0 -0
  164. sage_wheels/libexec/singular/MOD/singularsurf +11 -0
  165. sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
  166. sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
  167. sage_wheels/libexec/singular/MOD/solve_IP +0 -0
  168. sage_wheels/libexec/singular/MOD/surfex +16 -0
  169. sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
  170. sage_wheels/share/factory/gftables/10201 +342 -0
  171. sage_wheels/share/factory/gftables/1024 +37 -0
  172. sage_wheels/share/factory/gftables/10609 +356 -0
  173. sage_wheels/share/factory/gftables/11449 +384 -0
  174. sage_wheels/share/factory/gftables/11881 +398 -0
  175. sage_wheels/share/factory/gftables/121 +6 -0
  176. sage_wheels/share/factory/gftables/12167 +408 -0
  177. sage_wheels/share/factory/gftables/125 +7 -0
  178. sage_wheels/share/factory/gftables/12769 +428 -0
  179. sage_wheels/share/factory/gftables/128 +7 -0
  180. sage_wheels/share/factory/gftables/1331 +47 -0
  181. sage_wheels/share/factory/gftables/1369 +48 -0
  182. sage_wheels/share/factory/gftables/14641 +490 -0
  183. sage_wheels/share/factory/gftables/15625 +523 -0
  184. sage_wheels/share/factory/gftables/16 +3 -0
  185. sage_wheels/share/factory/gftables/16129 +540 -0
  186. sage_wheels/share/factory/gftables/16384 +549 -0
  187. sage_wheels/share/factory/gftables/16807 +563 -0
  188. sage_wheels/share/factory/gftables/1681 +58 -0
  189. sage_wheels/share/factory/gftables/169 +8 -0
  190. sage_wheels/share/factory/gftables/17161 +574 -0
  191. sage_wheels/share/factory/gftables/1849 +64 -0
  192. sage_wheels/share/factory/gftables/18769 +628 -0
  193. sage_wheels/share/factory/gftables/19321 +646 -0
  194. sage_wheels/share/factory/gftables/19683 +659 -0
  195. sage_wheels/share/factory/gftables/2048 +71 -0
  196. sage_wheels/share/factory/gftables/2187 +75 -0
  197. sage_wheels/share/factory/gftables/2197 +76 -0
  198. sage_wheels/share/factory/gftables/2209 +76 -0
  199. sage_wheels/share/factory/gftables/22201 +742 -0
  200. sage_wheels/share/factory/gftables/22801 +762 -0
  201. sage_wheels/share/factory/gftables/2401 +82 -0
  202. sage_wheels/share/factory/gftables/243 +11 -0
  203. sage_wheels/share/factory/gftables/24389 +815 -0
  204. sage_wheels/share/factory/gftables/24649 +824 -0
  205. sage_wheels/share/factory/gftables/25 +3 -0
  206. sage_wheels/share/factory/gftables/256 +11 -0
  207. sage_wheels/share/factory/gftables/26569 +888 -0
  208. sage_wheels/share/factory/gftables/27 +3 -0
  209. sage_wheels/share/factory/gftables/27889 +932 -0
  210. sage_wheels/share/factory/gftables/2809 +96 -0
  211. sage_wheels/share/factory/gftables/28561 +954 -0
  212. sage_wheels/share/factory/gftables/289 +12 -0
  213. sage_wheels/share/factory/gftables/29791 +995 -0
  214. sage_wheels/share/factory/gftables/29929 +1000 -0
  215. sage_wheels/share/factory/gftables/3125 +107 -0
  216. sage_wheels/share/factory/gftables/32 +4 -0
  217. sage_wheels/share/factory/gftables/32041 +1070 -0
  218. sage_wheels/share/factory/gftables/32761 +1094 -0
  219. sage_wheels/share/factory/gftables/32768 +1095 -0
  220. sage_wheels/share/factory/gftables/343 +14 -0
  221. sage_wheels/share/factory/gftables/3481 +118 -0
  222. sage_wheels/share/factory/gftables/361 +14 -0
  223. sage_wheels/share/factory/gftables/36481 +1218 -0
  224. sage_wheels/share/factory/gftables/3721 +126 -0
  225. sage_wheels/share/factory/gftables/37249 +1244 -0
  226. sage_wheels/share/factory/gftables/38809 +1296 -0
  227. sage_wheels/share/factory/gftables/39601 +1322 -0
  228. sage_wheels/share/factory/gftables/4 +3 -0
  229. sage_wheels/share/factory/gftables/4096 +139 -0
  230. sage_wheels/share/factory/gftables/44521 +1486 -0
  231. sage_wheels/share/factory/gftables/4489 +152 -0
  232. sage_wheels/share/factory/gftables/49 +4 -0
  233. sage_wheels/share/factory/gftables/4913 +166 -0
  234. sage_wheels/share/factory/gftables/49729 +1660 -0
  235. sage_wheels/share/factory/gftables/5041 +170 -0
  236. sage_wheels/share/factory/gftables/50653 +1691 -0
  237. sage_wheels/share/factory/gftables/512 +20 -0
  238. sage_wheels/share/factory/gftables/51529 +1720 -0
  239. sage_wheels/share/factory/gftables/52441 +1750 -0
  240. sage_wheels/share/factory/gftables/529 +20 -0
  241. sage_wheels/share/factory/gftables/5329 +180 -0
  242. sage_wheels/share/factory/gftables/54289 +1812 -0
  243. sage_wheels/share/factory/gftables/57121 +1906 -0
  244. sage_wheels/share/factory/gftables/58081 +1938 -0
  245. sage_wheels/share/factory/gftables/59049 +1971 -0
  246. sage_wheels/share/factory/gftables/6241 +210 -0
  247. sage_wheels/share/factory/gftables/625 +23 -0
  248. sage_wheels/share/factory/gftables/63001 +2102 -0
  249. sage_wheels/share/factory/gftables/64 +5 -0
  250. sage_wheels/share/factory/gftables/6561 +221 -0
  251. sage_wheels/share/factory/gftables/6859 +231 -0
  252. sage_wheels/share/factory/gftables/6889 +232 -0
  253. sage_wheels/share/factory/gftables/729 +27 -0
  254. sage_wheels/share/factory/gftables/7921 +266 -0
  255. sage_wheels/share/factory/gftables/8 +3 -0
  256. sage_wheels/share/factory/gftables/81 +5 -0
  257. sage_wheels/share/factory/gftables/8192 +276 -0
  258. sage_wheels/share/factory/gftables/841 +30 -0
  259. sage_wheels/share/factory/gftables/9 +3 -0
  260. sage_wheels/share/factory/gftables/9409 +316 -0
  261. sage_wheels/share/factory/gftables/961 +34 -0
  262. sage_wheels/share/info/singular.info +191898 -0
  263. sage_wheels/share/singular/LIB/GND.lib +1359 -0
  264. sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
  265. sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
  266. sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
  267. sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
  268. sage_wheels/share/singular/LIB/VecField.lib +1542 -0
  269. sage_wheels/share/singular/LIB/absfact.lib +959 -0
  270. sage_wheels/share/singular/LIB/ainvar.lib +730 -0
  271. sage_wheels/share/singular/LIB/aksaka.lib +419 -0
  272. sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
  273. sage_wheels/share/singular/LIB/algebra.lib +1193 -0
  274. sage_wheels/share/singular/LIB/all.lib +136 -0
  275. sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
  276. sage_wheels/share/singular/LIB/arnold.lib +4553 -0
  277. sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
  278. sage_wheels/share/singular/LIB/arr.lib +3486 -0
  279. sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
  280. sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
  281. sage_wheels/share/singular/LIB/bfun.lib +1964 -0
  282. sage_wheels/share/singular/LIB/bimodules.lib +774 -0
  283. sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
  284. sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
  285. sage_wheels/share/singular/LIB/central.lib +2169 -0
  286. sage_wheels/share/singular/LIB/chern.lib +4162 -0
  287. sage_wheels/share/singular/LIB/cimonom.lib +571 -0
  288. sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
  289. sage_wheels/share/singular/LIB/classify.lib +3239 -0
  290. sage_wheels/share/singular/LIB/classify2.lib +1462 -0
  291. sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
  292. sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
  293. sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
  294. sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
  295. sage_wheels/share/singular/LIB/combinat.lib +91 -0
  296. sage_wheels/share/singular/LIB/compregb.lib +276 -0
  297. sage_wheels/share/singular/LIB/control.lib +1636 -0
  298. sage_wheels/share/singular/LIB/crypto.lib +3795 -0
  299. sage_wheels/share/singular/LIB/curveInv.lib +667 -0
  300. sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
  301. sage_wheels/share/singular/LIB/customstd.lib +100 -0
  302. sage_wheels/share/singular/LIB/deRham.lib +5979 -0
  303. sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
  304. sage_wheels/share/singular/LIB/decomp.lib +1655 -0
  305. sage_wheels/share/singular/LIB/deflation.lib +872 -0
  306. sage_wheels/share/singular/LIB/deform.lib +925 -0
  307. sage_wheels/share/singular/LIB/difform.lib +3055 -0
  308. sage_wheels/share/singular/LIB/divisors.lib +750 -0
  309. sage_wheels/share/singular/LIB/dmod.lib +5817 -0
  310. sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
  311. sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
  312. sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
  313. sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
  314. sage_wheels/share/singular/LIB/dummy.lib +17 -0
  315. sage_wheels/share/singular/LIB/elim.lib +1009 -0
  316. sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
  317. sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
  318. sage_wheels/share/singular/LIB/equising.lib +2127 -0
  319. sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
  320. sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
  321. sage_wheels/share/singular/LIB/findifs.lib +778 -0
  322. sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
  323. sage_wheels/share/singular/LIB/finvar.lib +7989 -0
  324. sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
  325. sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
  326. sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
  327. sage_wheels/share/singular/LIB/freegb.lib +3853 -0
  328. sage_wheels/share/singular/LIB/general.lib +1350 -0
  329. sage_wheels/share/singular/LIB/gfan.lib +1768 -0
  330. sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
  331. sage_wheels/share/singular/LIB/gkdim.lib +99 -0
  332. sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
  333. sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
  334. sage_wheels/share/singular/LIB/goettsche.lib +909 -0
  335. sage_wheels/share/singular/LIB/graal.lib +1366 -0
  336. sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
  337. sage_wheels/share/singular/LIB/graphics.lib +360 -0
  338. sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
  339. sage_wheels/share/singular/LIB/groups.lib +1123 -0
  340. sage_wheels/share/singular/LIB/grwalk.lib +507 -0
  341. sage_wheels/share/singular/LIB/hdepth.lib +194 -0
  342. sage_wheels/share/singular/LIB/help.cnf +57 -0
  343. sage_wheels/share/singular/LIB/hess.lib +1946 -0
  344. sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
  345. sage_wheels/share/singular/LIB/hodge.lib +400 -0
  346. sage_wheels/share/singular/LIB/homolog.lib +1965 -0
  347. sage_wheels/share/singular/LIB/hyperel.lib +975 -0
  348. sage_wheels/share/singular/LIB/inout.lib +679 -0
  349. sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
  350. sage_wheels/share/singular/LIB/interval.lib +1418 -0
  351. sage_wheels/share/singular/LIB/intprog.lib +778 -0
  352. sage_wheels/share/singular/LIB/invar.lib +443 -0
  353. sage_wheels/share/singular/LIB/involut.lib +980 -0
  354. sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
  355. sage_wheels/share/singular/LIB/kskernel.lib +534 -0
  356. sage_wheels/share/singular/LIB/latex.lib +3146 -0
  357. sage_wheels/share/singular/LIB/lejeune.lib +651 -0
  358. sage_wheels/share/singular/LIB/linalg.lib +2040 -0
  359. sage_wheels/share/singular/LIB/locnormal.lib +212 -0
  360. sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
  361. sage_wheels/share/singular/LIB/makedbm.lib +294 -0
  362. sage_wheels/share/singular/LIB/mathml.lib +813 -0
  363. sage_wheels/share/singular/LIB/matrix.lib +1372 -0
  364. sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
  365. sage_wheels/share/singular/LIB/methods.lib +212 -0
  366. sage_wheels/share/singular/LIB/moddiq.lib +322 -0
  367. sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
  368. sage_wheels/share/singular/LIB/modnormal.lib +218 -0
  369. sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
  370. sage_wheels/share/singular/LIB/modquotient.lib +269 -0
  371. sage_wheels/share/singular/LIB/modstd.lib +1024 -0
  372. sage_wheels/share/singular/LIB/modular.lib +545 -0
  373. sage_wheels/share/singular/LIB/modules.lib +2561 -0
  374. sage_wheels/share/singular/LIB/modwalk.lib +609 -0
  375. sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
  376. sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
  377. sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
  378. sage_wheels/share/singular/LIB/mregular.lib +1863 -0
  379. sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
  380. sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
  381. sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
  382. sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
  383. sage_wheels/share/singular/LIB/ncall.lib +31 -0
  384. sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
  385. sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
  386. sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
  387. sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
  388. sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
  389. sage_wheels/share/singular/LIB/ncloc.lib +361 -0
  390. sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
  391. sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
  392. sage_wheels/share/singular/LIB/nctools.lib +1887 -0
  393. sage_wheels/share/singular/LIB/nets.lib +1456 -0
  394. sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
  395. sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
  396. sage_wheels/share/singular/LIB/noether.lib +1106 -0
  397. sage_wheels/share/singular/LIB/normal.lib +8700 -0
  398. sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
  399. sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
  400. sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
  401. sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
  402. sage_wheels/share/singular/LIB/olga.lib +1933 -0
  403. sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
  404. sage_wheels/share/singular/LIB/parallel.lib +319 -0
  405. sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
  406. sage_wheels/share/singular/LIB/perron.lib +202 -0
  407. sage_wheels/share/singular/LIB/pfd.lib +2223 -0
  408. sage_wheels/share/singular/LIB/phindex.lib +642 -0
  409. sage_wheels/share/singular/LIB/pointid.lib +673 -0
  410. sage_wheels/share/singular/LIB/polybori.lib +1430 -0
  411. sage_wheels/share/singular/LIB/polyclass.lib +525 -0
  412. sage_wheels/share/singular/LIB/polylib.lib +1174 -0
  413. sage_wheels/share/singular/LIB/polymake.lib +1902 -0
  414. sage_wheels/share/singular/LIB/presolve.lib +1533 -0
  415. sage_wheels/share/singular/LIB/primdec.lib +9576 -0
  416. sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
  417. sage_wheels/share/singular/LIB/primitiv.lib +401 -0
  418. sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
  419. sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
  420. sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
  421. sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
  422. sage_wheels/share/singular/LIB/random.lib +455 -0
  423. sage_wheels/share/singular/LIB/ratgb.lib +489 -0
  424. sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
  425. sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
  426. sage_wheels/share/singular/LIB/realrad.lib +1197 -0
  427. sage_wheels/share/singular/LIB/recover.lib +2628 -0
  428. sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
  429. sage_wheels/share/singular/LIB/reesclos.lib +465 -0
  430. sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
  431. sage_wheels/share/singular/LIB/resgraph.lib +789 -0
  432. sage_wheels/share/singular/LIB/resjung.lib +820 -0
  433. sage_wheels/share/singular/LIB/resolve.lib +5110 -0
  434. sage_wheels/share/singular/LIB/resources.lib +170 -0
  435. sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
  436. sage_wheels/share/singular/LIB/ring.lib +1328 -0
  437. sage_wheels/share/singular/LIB/ringgb.lib +343 -0
  438. sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
  439. sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
  440. sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
  441. sage_wheels/share/singular/LIB/rootsur.lib +886 -0
  442. sage_wheels/share/singular/LIB/rstandard.lib +607 -0
  443. sage_wheels/share/singular/LIB/rwalk.lib +336 -0
  444. sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
  445. sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
  446. sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
  447. sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
  448. sage_wheels/share/singular/LIB/schreyer.lib +321 -0
  449. sage_wheels/share/singular/LIB/schubert.lib +2551 -0
  450. sage_wheels/share/singular/LIB/sets.lib +524 -0
  451. sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
  452. sage_wheels/share/singular/LIB/signcond.lib +437 -0
  453. sage_wheels/share/singular/LIB/sing.lib +1094 -0
  454. sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
  455. sage_wheels/share/singular/LIB/solve.lib +2243 -0
  456. sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
  457. sage_wheels/share/singular/LIB/spectrum.lib +62 -0
  458. sage_wheels/share/singular/LIB/sresext.lib +757 -0
  459. sage_wheels/share/singular/LIB/ssi.lib +143 -0
  460. sage_wheels/share/singular/LIB/standard.lib +2769 -0
  461. sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
  462. sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
  463. sage_wheels/share/singular/LIB/stratify.lib +1070 -0
  464. sage_wheels/share/singular/LIB/surf.lib +506 -0
  465. sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
  466. sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
  467. sage_wheels/share/singular/LIB/surfex.lib +1462 -0
  468. sage_wheels/share/singular/LIB/swalk.lib +877 -0
  469. sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
  470. sage_wheels/share/singular/LIB/systhreads.lib +74 -0
  471. sage_wheels/share/singular/LIB/tasks.lib +1324 -0
  472. sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
  473. sage_wheels/share/singular/LIB/teachstd.lib +858 -0
  474. sage_wheels/share/singular/LIB/template.lib +116 -0
  475. sage_wheels/share/singular/LIB/toric.lib +1119 -0
  476. sage_wheels/share/singular/LIB/transformation.lib +116 -0
  477. sage_wheels/share/singular/LIB/triang.lib +1197 -0
  478. sage_wheels/share/singular/LIB/tropical.lib +8741 -0
  479. sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
  480. sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
  481. sage_wheels/share/singular/LIB/tst.lib +1108 -0
  482. sage_wheels/share/singular/LIB/weierstr.lib +241 -0
  483. sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
  484. sage_wheels/share/singular/emacs/.emacs-general +184 -0
  485. sage_wheels/share/singular/emacs/.emacs-singular +234 -0
  486. sage_wheels/share/singular/emacs/COPYING +44 -0
  487. sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
  488. sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
  489. sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
  490. sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
  491. sage_wheels/share/singular/emacs/singular.el +4273 -0
  492. sage_wheels/share/singular/emacs/singular.xpm +39 -0
  493. sage_wheels/share/singular/singular.idx +5002 -0
@@ -0,0 +1,2092 @@
1
+ ////////////////////////////////////////////////////////////////////////////////
2
+ version="version classifyceq.lib 4.1.2.0 Feb_2019 "; // $Id: 78cfe9b03a9bc27e8153b19733bf1eb0d0b1c85a $
3
+ category="Singularities";
4
+
5
+ info="
6
+ LIBRARY: classifyCeq.lib simple hypersurface singularities in characteristic p > 0
7
+ AUTHORS: Deeba Afzal deebafzal@gmail.com
8
+ Faira Kanwal Janjua fairakanwaljanjua@gmail.com
9
+
10
+ OVERVIEW:
11
+ A library for classifying the simple singularities with respect to contact equivalence in characteristic p > 0 .
12
+ Simple hypersurface singularities in characteristic p > 0 were classified by Greuel and
13
+ Kroening [1] with respect to contact equivalence. The classifier we use has been proposed in [2].
14
+
15
+ REFERENCES:
16
+ [1] Greuel, G.-M.; Kroening, H.: Simple singularities in positive characteristic.
17
+ Math.Z. 203, 339-354 (1990).
18
+ [2] Afzal,D.;Binyamin,M.A.;Janjua,F.K.: On the classification of simple singularities in positive characteristic.
19
+
20
+ PROCEDURES:
21
+ classifyCeq(f); simple hypersurface singularities in characteristic p > 0
22
+ ";
23
+ LIB "sing.lib";
24
+ LIB "classify.lib";
25
+ LIB "primdec.lib";
26
+ LIB "ring.lib";
27
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
28
+ proc classifyCeq(poly f)
29
+ "USAGE: classifyCeq(f); f poly
30
+ RETURN: string including the Tjurina number of f and its type in the classification of Greuel and Kroening
31
+ EXAMPLE: example classifyCeq; shows an example
32
+ "
33
+ {
34
+ def R=basering;
35
+ def S=changeord(list(list("ds",1:nvars(basering))));
36
+ setring S;
37
+ poly f=imap(R,f);
38
+ string re;
39
+ if(char(basering)==0)
40
+ {
41
+ re=(string(classify(f)));
42
+ }
43
+ if(char(basering)!=2)
44
+ {
45
+ re=classifyCeq1(f);
46
+ }
47
+ if(char(basering)==2)
48
+ {
49
+ re=classifyCeq2(f);
50
+ }
51
+ setring R;
52
+ return(re);
53
+ }
54
+ example
55
+ {
56
+ "EXAMPLE:"; echo=2;
57
+ ring R=3,(x,y,z,u,v,w),ds;
58
+ classifyCeq(-x2+xy+y2+xz-yz-z2+w2+u3+v4);
59
+ }
60
+ /////////////////////////////////////////////////////////// char p > 2 //////////////////////////////////////////
61
+ static proc blowupone(poly f)
62
+ {
63
+ //=== input f smooth or isolated simple singularity at zero
64
+ //=== output var(1) or poly with isolated singularity at zero
65
+ def R=basering;
66
+ def S=changeord(list(list("ds",1:nvars(basering))));
67
+ setring S;
68
+ int n=nvars(basering);
69
+ int i;
70
+ poly f=imap(R,f);
71
+ if(deg(lead(f))<=1){setring R;return(var(1));}
72
+ def T=changeord(list(list("lp",1:nvars(basering))));
73
+ setring T;
74
+ map phi;
75
+ ideal mphi, sing;
76
+ poly p,q;
77
+ //=========== blow up =======================================================
78
+ for(i=1;i<=n;i++)
79
+ {
80
+ mphi=var(i)*maxideal(1);
81
+ mphi[i]=var(i);
82
+ phi=S,mphi;
83
+ p=phi(f);
84
+ q=p/var(i);
85
+ while(size(p)==size(q))
86
+ {
87
+ p=q;
88
+ q=q/var(i);
89
+ }
90
+ //=============== p is the strict transform var(i) exceptional divisor ====
91
+ //=============== analysis of singularities ================================
92
+ sing=jacob(p),p,var(i);
93
+ sing=radical(sing);
94
+ option(redSB);
95
+ sing=std(sing);
96
+ sing=simplify(sing,1);
97
+ if(size(sing)>1)
98
+ {
99
+ if(size(sing)!=n){ERROR("not simple");}
100
+ ideal mpsi=maxideal(1);
101
+ for(i=1;i<=n;i++){mpsi[i]=var(i)-sing[n-i+1][2];}
102
+ map psi=T,mpsi;
103
+ p=psi(p);
104
+ setring R;
105
+ poly p=imap(T,p);
106
+ return(p);
107
+ }
108
+ }
109
+ setring R;
110
+ return(var(1));
111
+ }
112
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
113
+ static proc classifyCeq1(poly f)
114
+ //====Classify Simple hypersurface singularities when characteristic p!=2
115
+ {
116
+ // char!=2
117
+ //====input poly f
118
+ //====output The function defines ......not an isolated singularity or not a simple singularity and tjurina
119
+ // of the singularity or a simple singularity ,tjurina of the singularity and type of the singularity.
120
+ def R=basering;
121
+ int d;
122
+ int m=tjurina(f);
123
+
124
+ if(m==-1)
125
+ {
126
+ return("The given function defines not an isolated singularity" );
127
+
128
+ }
129
+ poly g;
130
+ int c;
131
+ c=corank(f);
132
+ if(c<=1)
133
+ {
134
+
135
+ if(c==0)
136
+ {
137
+ return("The given function defines a simple singularity.
138
+ The tjurina number is "+string(m)+".
139
+ A[1]:"+string(var(1))+"^2+"+string(var(2))+"^2");
140
+ }
141
+
142
+ if(c==1)
143
+
144
+ {
145
+ poly w=blowupone(f);
146
+ int n=tjurina(w);
147
+
148
+ int b=m-n;
149
+ if(b<=2)
150
+ {
151
+ return( "The given function defines a simple singularity.
152
+ The tjurina number is "+string(m)+".
153
+ A["+string(m)+"]:"+string(var(1))+"^2+"+string(var(2))+"^"+string(m+1)+"");
154
+ }
155
+ else
156
+ {
157
+
158
+ return("The given function defines a simple singularity.
159
+ The tjurina number is "+string(m)+".
160
+ A["+string(m-1)+"]:"+string(var(1))+"^2+"+string(var(2))+"^"+string(m)+"");
161
+ }
162
+
163
+ }
164
+ }
165
+ if(c==2)
166
+ {
167
+ g=jet(f,3);
168
+ if(g==0)
169
+ {
170
+ return( "The given function defines not a simple singularity.
171
+ The tjurina number is "+string(m)+".");
172
+ }
173
+ if(g!=0)
174
+ {
175
+
176
+ def S=GDsplitting(f);
177
+ setring S;
178
+
179
+
180
+ poly g=jet(f,3);
181
+ if(g==0)
182
+ {
183
+ setring(R);
184
+ return("The given function defines not a simple singularity.
185
+ The tjurina number is "+string(m)+".");
186
+ }
187
+ list L=factorize(g);
188
+ if(size(L[1])==2)
189
+ {
190
+ ideal M=var(1),var(2)^2;
191
+ ideal N=std(M^3);
192
+ poly h=reduce(f,N);
193
+ if(h==0)
194
+ {
195
+ return(" The given function defines not a simple singularity
196
+ The tjurina number is "+string(m)+".");
197
+ }
198
+ if(h!=0)
199
+ {
200
+ if((char(R)!=3)&&(char(R)!=5))
201
+ {
202
+ setring R;
203
+ if(m==6)
204
+ {
205
+ return("The given function defines a simple singularity.
206
+ The tjurina number is "+string(m)+".
207
+ E^0[6]:"+string(var(1))+"^3+"+string(var(2))+"^4");
208
+ }
209
+ if(m==7)
210
+ {
211
+ return("The given function defines a simple singularity.
212
+ The tjurina number is "+string(m)+".
213
+ E^0[7]:"+string(var(1))+"^3+"+string(var(1))+"*"+string(var(2))+"^3");
214
+ }
215
+ if(m==8)
216
+ {
217
+ return("The given function defines a simple singularity.
218
+ The tjurina number is "+string(m)+".
219
+ E^0[8]:"+string(var(1))+"^3+"+string(var(2))+"^5");
220
+ }
221
+ }
222
+ if(char(R)==5)
223
+ {
224
+ setring R;
225
+ if(m==6)
226
+ {
227
+ return("The given function defines a simple singularity.
228
+ The tjurina number is "+string(m)+".
229
+ E^0[6]:"+string(var(1))+"^3+"+string(var(2))+"^4");
230
+ }
231
+ if(m==7)
232
+ {
233
+ return("The given function defines a simple singularity.
234
+ The tjurina number is "+string(m)+".
235
+ E^0[7]:"+string(var(1))+"^3+"+string(var(1))+"*"+string(var(2))+"^3");
236
+ }
237
+ if(m==10)
238
+ {
239
+ return("The given function defines a simple singularity.
240
+ The tjurina number is "+string(m)+".
241
+ E^0[8]:"+string(var(1))+"^3+"+string(var(2))+"^5");
242
+ }
243
+ if(m==8)
244
+ {
245
+ return("The given function defines a simple singularity.
246
+ The tjurina number is "+string(m)+".
247
+ E^1[8]:"+string(var(1))+"^3+"+string(var(2))+"^5+"+string(var(1))+"*"+string(var(2))+"^4");
248
+ }
249
+ }
250
+ if(char(R)==3)
251
+ {
252
+ poly p=blowupone(f);
253
+ int e=(std(jacob(p)+ideal(p))==1);
254
+ setring R;
255
+ if((m==7)&&e)
256
+ {
257
+ return("The given function defines a simple singularity.
258
+ The tjurina number is "+string(m)+".
259
+ E^1[6]:"+string(var(1))+"^3+"+string(var(2))+"^4+"+string(var(1))+"^2*"+string(var(2))+"^2");
260
+ }
261
+ if((m==7)&&!e)
262
+ {
263
+ return("The given function defines a simple singularity.
264
+ The tjurina number is "+string(m)+".
265
+ E^1[7]:"+string(var(1))+"^3+"+string(var(1))+"*"+string(var(2))+"^3+"+string(var(1))+"^2*"+string(var(2))+"^2");
266
+ }
267
+ if(m==8)
268
+ {
269
+
270
+ return("The given function defines a simple singularity.
271
+ The tjurina number is "+string(m)+".
272
+ E^2[8]:"+string(var(1))+"^3+"+string(var(2))+"^5+"+string(var(1))+"^2*"+string(var(2))+"^2");
273
+ }
274
+ if(m==10)
275
+ {
276
+ return("The given function defines a simple singularity.
277
+ The tjurina number is "+string(m)+".
278
+ E^1[8]:"+string(var(1))+"^3+"+string(var(2))+"^5+"+string(var(1))+"^2*"+string(var(2))+"^3");
279
+ }
280
+ if((m==9)&&e)
281
+ {
282
+
283
+ return("The given function defines a simple singularity.
284
+ The tjurina number is "+string(m)+".
285
+ E^0[6]:"+string(var(1))+"^3+"+string(var(2))+"^4");
286
+ }
287
+ if((m==9)&&!e)
288
+ {
289
+
290
+ return("The given function defines a simple singularity.
291
+ The tjurina number is "+string(m)+".
292
+ E^0[7]:"+string(var(1))+"^3+"+string(var(1))+"*"+string(var(2))+"^3");
293
+ }
294
+ if(m==12)
295
+ {
296
+
297
+ return("The given function defines a simple singularity.
298
+ The tjurina number is "+string(m)+".
299
+ E^0[8]:"+string(var(1))+"^3+"+string(var(2))+"^5");
300
+ }
301
+
302
+ }
303
+ else
304
+ {
305
+ return( "The given function defines not a simple singularity");
306
+ }
307
+
308
+ }
309
+
310
+ }
311
+
312
+ if(size(L[1])==3)
313
+ {
314
+ setring R;
315
+ return("The given function defines a simple singularity.
316
+ The tjurina number is "+string(m)+".
317
+ D["+string(m)+"]:"+string(var(1))+"^2*"+string(var(2))+"+"+string(var(2))+"^"+string(m-1)+"");
318
+ }
319
+ if(size(L[1])==4)
320
+ {
321
+ setring R;
322
+ return("The given function defines a simple singularity.
323
+ The tjurina number is "+string(m)+".
324
+ D[4]:"+string(var(1))+"^2*"+string(var(2))+"+"+string(var(1))+"^3");
325
+ }
326
+ }
327
+ }
328
+ if(c>=3)
329
+ {
330
+ return( "The given function defines not a simple singularity.
331
+ The tjurina number is "+string(m)+".");
332
+ }
333
+
334
+ } // ends classifyCeq1
335
+ example
336
+ {
337
+ "EXAMPLE:"; echo=2;
338
+ ring R=5,(x,y),ds;
339
+ classifyCeq1(x2y+y22);
340
+ }
341
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
342
+ static proc GDsplitting(poly f)
343
+ { // the result of the splitting lemma (myMorsesplitting) in a special ring of 2 variables
344
+ // input a poly f of order >=2
345
+ // output ring S=char(basering),(x,y),ds; and a poly f in <x,y>^3 in S with the following properties:
346
+ // f + a sum of squares of further variables is contact equivalentt to the input polynomial
347
+ def R=basering;
348
+ intvec t;
349
+ int b,i;
350
+ b=tjurina(f);
351
+ f=myMorsesplitting(f,b);
352
+ t=forv(findVar(f));
353
+ ring S=char(basering),(x,y),ds;
354
+ ideal M;
355
+ M[t[1]]=var(1);
356
+ M[t[2]]=var(2);
357
+ i=1;
358
+ if((i!=t[1])&&(i!=t[2]))
359
+ {
360
+ M[i]=0;
361
+ }
362
+ map phi=R,M;
363
+ poly f=phi(f);
364
+ export(f);
365
+ setring(R);
366
+ return(S);
367
+ }
368
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
369
+ static proc myMorsesplitting(poly f,int b)
370
+ {
371
+ // splitting lemma
372
+ // input poly f=f(x(1),...,x(n)) jet(f,2)!=0
373
+ // output a polynomial in 2 variables of order >=3 such that a sum of squares of the remaining variables plus this
374
+ // polynomial is contact equivalent to the input polynomial
375
+ intvec w;
376
+ f=simplify(jet(f,b),1);
377
+ while(jet(f,2)!=0)
378
+ {
379
+ w=findlead(f);
380
+ if(w[1]==w[2])
381
+ {
382
+ f=splitting_one(f,w[1],b);
383
+ }
384
+ else
385
+ {
386
+ f=splitting_two(f,w[1],w[2],b);
387
+ }
388
+ }
389
+ return(f);
390
+ }
391
+ example
392
+ {
393
+ "EXAMPLE:"; echo=2;
394
+ ring R=3,(x,y,z,u,v),ds;
395
+ poly f=x2+x3z+u2+v2+z3+y11;
396
+ myMorsesplitting(f,30);
397
+ }
398
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
399
+ static proc findlead(poly f)
400
+
401
+ {
402
+ // input poly f=x(i)^2+h or poly f=x(i)*x(j)+h , h of order >=2
403
+ // output intvec w w[1]=i,w[2]=i or w[1]=i ,w[2]=j
404
+ intvec v=leadexp(f);
405
+ int i,k,n;
406
+ intvec w;
407
+ n=nvars(basering);
408
+ for(i=1;i<=n;i++)
409
+ {
410
+ if(v[i]==2)
411
+ {
412
+ w[1]=i;
413
+ w[2]=i;
414
+ break;
415
+ }
416
+ if(v[i]==1)
417
+ {
418
+ k++;
419
+ w[k]=i;
420
+ }
421
+ }
422
+ return(w);
423
+ }
424
+ example
425
+ {
426
+ "EXAMPLE:"; echo=2;
427
+ ring R=3,(x,y,z,u,v),ds;
428
+ poly f=x2+x3z+u2+v2+z3+y11;
429
+ findlead(f);
430
+ }
431
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
432
+ static proc splitting_one(poly p, int i, int b)
433
+ {
434
+ // assumes that p=x_i^2+h, no x_i^2 in h, h of order >=2
435
+ // returns q(x_1,??x_i-1,x_i+1,...,x_n) such that x_i^2 +q is right equivalent to p mod
436
+ // <x_1,??,x_n>^b
437
+
438
+ if(b<2){b=2;}
439
+ def R=basering;
440
+ ideal M=maxideal(1);
441
+ map phi;
442
+ poly q=jet((p-var(i)^2)/var(i),b);
443
+ while(q!=0)
444
+ {
445
+ p=quickSubst(p,var(i)-1/2*q,i,b);
446
+ q=jet((p-var(i)^2)/var(i),b);
447
+ }
448
+ return(simplify(jet(p,b)-var(i)^2,1)); //make the leading coefficient 1
449
+ }
450
+ example
451
+ {
452
+ "EXAMPLE:"; echo=2;
453
+ ring R=3,(x,y,z,u,v),ds;
454
+ poly f=x2+y3+z4+xy3+u2+v2;
455
+ splitting_one(f,1,18);
456
+ }
457
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
458
+ static proc splitting_two(poly p, int i, int j, int b)
459
+ {
460
+ // assumes that p=x_i*x_j+h, no x_i^2 in h, h of order >=2
461
+ // returns q(x_1,???,x_i-1,x_i+1,...,x_j-1,x_j+1,...,x_n) such that x_i*x_j +q is right equivalent to p mod
462
+ // <x_1,??,x_n>^b
463
+
464
+ if(b<2){b=2;}
465
+ def R=basering;
466
+ ideal M=maxideal(1);
467
+ map phi;
468
+ poly q=jet((p-var(i)*var(j))/var(i),b);
469
+ while(q!=0)
470
+ {
471
+ p=quickSubst(p,var(j)-q,j,b);
472
+ q=jet((p-var(i)*var(j))/var(i),b);
473
+ }
474
+ return(simplify(substitute(jet(p,b),var(j),0),1)); //make the leading coefficient 1
475
+ }
476
+ example
477
+ {
478
+ "EXAMPLE:"; echo=2;
479
+ ring R=5,(u,v,w,s,t),ds;
480
+ poly f=uv+t2+u4s+u11+v7+s9+w8;
481
+ splitting_two(f,1,2,128);
482
+ }
483
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
484
+ static proc quickSubst(poly h, poly r, int i, int b)
485
+ {
486
+ //=== assume h, r is in Q[x_1,...,x_n], computes jet(h(x_i=r),b)
487
+ h=jet(h,b);
488
+ r=jet(r,b);
489
+ matrix M=coef(h,var(i));
490
+ poly q = 1;
491
+ int j,k,d;
492
+ intvec v;
493
+ d=deg(M[1,1]);
494
+ v[d+1]=1;
495
+ for(k = 2; k <= ncols(M); k++)
496
+ {
497
+ v[deg(M[1,k])+1]=1;
498
+ }
499
+ h=0;
500
+ for(k=1;k<=d+1;k++)
501
+ {
502
+ if(v[k]==1)
503
+ {
504
+ h=h+jet(q*M[2,ncols(M)-j],b);
505
+ j++;
506
+ }
507
+ q=jet(q*r,b);
508
+ }
509
+ return(h);
510
+ }
511
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
512
+ static proc findVar(poly p)
513
+ {
514
+ // input poly f
515
+ // output intvec v v[i]=0 if f is not depending on var(i) and v[j]=1 if f is depending on var(j)
516
+ intvec v;
517
+ int i,n;
518
+ n=nvars(basering);
519
+ for(i=1;i<=n;i++)
520
+ {
521
+ if(subst(p,var(i),0)==p)
522
+ {
523
+ v[i]=0;
524
+ }
525
+ else
526
+ {
527
+ v[i]=1;
528
+ }
529
+ }
530
+ return(v);
531
+ }
532
+ example
533
+ {
534
+ "EXAMPLE:"; echo=2;
535
+ ring R=3,(x,y,z,u,v),ds;
536
+ poly f=y3+u5;
537
+ findlead(f);
538
+ }
539
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
540
+ static proc forv(intvec v)
541
+ {
542
+ //returns the places of v which are different from zero
543
+ intvec w;
544
+ int i,j;
545
+ j=1;
546
+ for(i=1;i<=nvars(basering);i++)
547
+ {
548
+ if(v[i]!=0)
549
+ {
550
+ w[j]=i;
551
+ j++;
552
+ }
553
+ }
554
+ return(w);
555
+ }
556
+
557
+ /////////////////////////////////////////// char p=2 ////////////////////////////////////////////////////////////////////////////
558
+ static proc classifyCeq2(poly p)
559
+ //====Classification of hypersurface singularities in Characteristic p=2.
560
+ {
561
+ // input poly p
562
+ // output The normal form to which f is contact equivalent or the function is not simple.
563
+ def R=basering;
564
+ int t=tjurina(p);
565
+ list T;
566
+ if(t==-1)
567
+ {
568
+ return("The given function defines not an isolated singularity");
569
+ }
570
+ int b=t+1;
571
+ p=SPILPRO(p,b);
572
+ list L=findVAR(p);
573
+ if(L[2]>=4)
574
+ {
575
+
576
+ return("The given function defines not a simple singularity.
577
+ The Tjurina Number is "+string(t)+". ");
578
+ }
579
+ if(L[2]==1)
580
+ {
581
+ def S=redvar2(p);
582
+ setring S;
583
+
584
+ string a="The given function defines an isolated Singularity.
585
+ The Tjurina number is "+string(t)+".
586
+ A_"+string(leadexp(p)[1]-1)+":xy+z"+string(leadexp(p)[1])+".";
587
+ setring R;
588
+ return(a);
589
+ }
590
+
591
+ if(jet(p,2)==0)
592
+ {
593
+ if(L[2]==3)
594
+ {
595
+ return("The given function defines not a simple singularity.
596
+ The Tjurina Number is "+string(t)+". ");
597
+
598
+ }
599
+ def S=redvar2(p);
600
+ setring S;
601
+ string a=curCeq2(p);
602
+ setring R;
603
+ return(a);
604
+ }
605
+ else
606
+ {
607
+ if(L[2]==3)
608
+ {
609
+ int B=t div 2+1;
610
+ p=splitting_SQUA(p,B);
611
+ def S=redvar2(p);
612
+ setring S;
613
+ string a=surCeq2(p);
614
+ setring R;
615
+ return(a);
616
+ }
617
+ p=splitting_SQUA(p,b);
618
+ def S=redvar2(p);
619
+ setring S;
620
+ string a=curCeq2(p);
621
+ setring R;
622
+ return(a);
623
+ }
624
+ }
625
+ example
626
+ {
627
+ "EXAMPLE:"; echo=2;
628
+ ring r=2,(x,y,z,w,t,v),ds;
629
+ poly f=xy+zw+t5+v3;
630
+ classifyCeq2(f);
631
+ }
632
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
633
+ static proc SPILPRO(poly p,int B)
634
+ {
635
+ //Splitting lemma in characteristic 2
636
+ //input a polynomial f and a bound B
637
+ //output a polynomial q, the result of the splitting lemma applied to f up to the order B
638
+ int i,j;
639
+ def R=basering;
640
+ int n=nvars(R);
641
+ poly q=splittingLchar2(p);
642
+ list T=FindPRO(q);
643
+
644
+ while(size(T)!=0)
645
+ {
646
+ i=T[1]; j=T[2];
647
+ q=splitting_two2(q,i,j,B);
648
+
649
+ T=FindPRO(q);
650
+ }
651
+ return(q);
652
+ }
653
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
654
+ static proc surCeq2(poly f)
655
+ //====Classification of Surface Singularaties in case when p=2
656
+ {
657
+ //===input a funation defined in the ring whose Characteristic is 2.
658
+ //===output is a Normal Form to which Given function is contact equivalent or function is not simple.
659
+ def R=basering;
660
+ int n=nvars(R);
661
+ list L;
662
+ int k=tjurina(f);
663
+ if(k==-1)
664
+ {
665
+ return("The given function defines not an isolated singularity.");
666
+ }
667
+ return(surEsing(f));
668
+ }
669
+ example
670
+ {
671
+ "EXAMPLE:"; echo=2;
672
+ ring R=2,(x,y,z),Ds;
673
+ surCeq(xy+y2+yz+x2y+xy2+xyz+z21+xz21);
674
+
675
+ }
676
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
677
+ static proc surEsing(poly f)
678
+ //====Classification of Ek singularities.
679
+ {
680
+ //===input: A function which is an isolated singularity.
681
+ //===output: Normal form to which given function is contact equivalent.
682
+ list M;
683
+ def R=basering;
684
+ f=formf(f);
685
+ poly p=jet(f,2);
686
+ int k=tjurina(f);
687
+
688
+ list L=factorize(p);
689
+ poly g=subst(f,leadmonom(L[1][2]),0);
690
+ poly j=jet(g,3)-jet(g,2);
691
+ poly C=f-g;
692
+ C=C/leadmonom(L[1][2]);
693
+ poly h=subst(C,leadmonom(L[1][2]),0);
694
+ h=jet(h,2);
695
+ poly h1=j+h*leadmonom(L[1][2]);
696
+
697
+ if(h!=0)
698
+ {
699
+ list P=factorize(h1);
700
+ list N=factorize(j);
701
+
702
+ if((size(P[1])==2)&&(size(P[2])==2)&&(P[2][2]==1)&&(N[2][2]==3))
703
+ {
704
+ if(k==6)
705
+ {
706
+
707
+ return(" The given function defines an isolated Singularity.
708
+ The Tjurina number is "+string(tjurina(f))+".
709
+ E^1[6]:z2+x3+y2z+xyz.");
710
+
711
+ }
712
+ if(k==8)
713
+ {
714
+ return("The given function defines an isolated Singularity.
715
+ The Tjurina number is "+string(tjurina(f))+".
716
+ E^0[6]:z2+x3+y2z.");
717
+
718
+ }
719
+ }
720
+ if(((size(P[1])==4)&&(size(P[2])==4))||((size(N[1])==4)&&(size(N[2])==4)))
721
+ {
722
+ if(k==8)
723
+ {
724
+ return("The given function defines an isolated Singularity.
725
+ The Tjurina number is "+string(tjurina(f))+".
726
+ D[4]:z2+x2y+xy2.");
727
+ }
728
+ if(k==6)
729
+ {
730
+ return("The given function defines an isolated Singularity.
731
+ The Tjurina number is "+string(tjurina(f))+".
732
+ D^1[4]:z2+x2y+xy2+xyz.");
733
+
734
+ }
735
+ }
736
+ if((size(P[1])<=3)&&(size(P[2])<=3))
737
+ {
738
+
739
+ if(k==6)
740
+ {
741
+ return("The given function defines an isolated Singularity.
742
+ The Tjurina number is "+string(tjurina(f))+".
743
+ D^1[5]:z2+x2y+y2z+xyz.");
744
+ }
745
+ if(k==8)
746
+ {
747
+
748
+ if(size(lengthBL(f))==4)
749
+ {
750
+ return("The given function defines an isolated Singularity.
751
+ The Tjurina number is "+string(tjurina(f))+".
752
+ E^3[7]:z2+x3+xy3+xyz.");
753
+
754
+ }
755
+ else
756
+ {
757
+ if(size(lengthBL(f))==5)
758
+ {
759
+
760
+ return("The given function defines an isolated Singularity.
761
+ The Tjurina number is "+string(tjurina(f))+".
762
+ E^4[8]:z2+x3+y5+xyz.");
763
+ }
764
+ else
765
+ {
766
+ return("The given function defines an isolated Singularity.
767
+ The Tjurina number is "+string(tjurina(f))+".
768
+ D^0[5]:z2+x2y+y2z.");
769
+
770
+ }
771
+ }
772
+
773
+ }
774
+
775
+ }
776
+ list Q=factorize(j);
777
+ if((size(Q[1])==3)&&(size(Q[2])==3))
778
+ {
779
+
780
+ return(surDsing(f));
781
+ }
782
+ else
783
+ {
784
+ if(k==10)
785
+ {
786
+ if(size(lengthBL(f))==4)
787
+ {
788
+ return("The given function defines an isolated Singularity.
789
+ The Tjurina number is "+string(tjurina(f))+".
790
+ E^2[7]:z2+x3+xy3+y3z.");
791
+
792
+ }
793
+ if(size(lengthBL(f))==5)
794
+ {
795
+ return("The given function defines an isolated Singularity.
796
+ The Tjurina number is "+string(tjurina(f))+".
797
+ E^3[8]:z2+x3+y5+y3z.");
798
+
799
+ }
800
+ }
801
+ if(k==12)
802
+ {
803
+
804
+ if(size(lengthBL(f))==4)
805
+ {
806
+ return("The given function defines an isolated Singularity.
807
+ The Tjurina number is "+string(tjurina(f))+".
808
+ E^1[7]:z2+x3+xy3+xy3z.");
809
+
810
+ }
811
+ if(size(lengthBL(f))==5)
812
+ {
813
+ return("The given function defines an isolated Singularity.
814
+ The Tjurina number is "+string(tjurina(f))+".
815
+ E^2[8]:z2+x3+y5+xy2z.");
816
+
817
+ }
818
+ }
819
+ if(k==14)
820
+ {
821
+
822
+ if(size(lengthBL(f))==4)
823
+ {
824
+ return("The given function defines an isolated Singularity.
825
+ The Tjurina number is "+string(tjurina(f))+".
826
+ E^0[7]:z2+x3+xy3.");
827
+
828
+ }
829
+ if(size(lengthBL(f))==5)
830
+ {
831
+ return("The given function defines an isolated Singularity.
832
+ The Tjurina number is "+string(tjurina(f))+".
833
+ E^1[8]:z2+x3+y5+xy3z.");
834
+ }
835
+ }
836
+ if(k==16)
837
+ {
838
+ return("The given function defines an isolated Singularity.
839
+ The Tjurina number is "+string(tjurina(f))+".
840
+ E^0[8]:z2+x3+y5.");
841
+ }
842
+ }
843
+ }
844
+ if(h==0)
845
+ {
846
+ list P=factorize(j);
847
+ if((size(P[1])==2)&&(size(P[2])==2)&&((P[2][2])==1))
848
+ {
849
+ if(k==6)
850
+ {
851
+ return("The given function defines an isolated Singularity.
852
+ The Tjurina number is "+string(tjurina(f))+".
853
+ E^1[6]:z2+x3+y2z+xyz.");
854
+ }
855
+ if(k==8)
856
+ {
857
+ return("The given function defines an isolated Singularity.
858
+ The Tjurina number is "+string(tjurina(f))+".
859
+ E^0[6]:z2+x3+y2z.");
860
+
861
+ }
862
+ }
863
+ if((size(P[1])==4)&&(size(P[2])==4))
864
+ {
865
+ if(k==8)
866
+ {
867
+ return("The given function defines an isolated Singularity.
868
+ The Tjurina number is "+string(tjurina(f))+".
869
+ D^0[4]:z2+x2y+xy2.");
870
+
871
+ }
872
+ if(k==6)
873
+ {
874
+ return("The given function defines an isolated Singularity.
875
+ The Tjurina number is "+string(tjurina(f))+".
876
+ D^1[4]:z2+x2y+xy2+xyz.");
877
+
878
+ }
879
+ }
880
+
881
+ if((size(P[1])==3)&&(size(P[2])==3))
882
+ {
883
+ if(((P[2][2])==1)&&((P[2][3])==1))
884
+ {
885
+ if(k==6)
886
+ {
887
+ return("The given function defines an isolated Singularity.
888
+ The Tjurina number is "+string(tjurina(f))+".
889
+ D^1[5]:z2+x2y+y2z+xyz.");
890
+ }
891
+ if(k==8)
892
+ {
893
+ if(size(lengthBL(f))==4)
894
+ {
895
+ return("The given function defines an isolated Singularity.
896
+ The Tjurina number is "+string(tjurina(f))+".
897
+ E^3[7]:z2+x3+xy3+xyz.");
898
+ }
899
+ else
900
+ {
901
+ if(size(lengthBL(f))==5)
902
+ {
903
+ return("The given function defines an isolated Singularity.
904
+ The Tjurina number is "+string(tjurina(f))+".
905
+ E^4[8]:z2+x3+y5+xyz.");
906
+
907
+ }
908
+ else
909
+ {
910
+ return("The given function defines an isolated Singularity.
911
+ The Tjurina number is "+string(tjurina(f))+".
912
+ D^0[5]:z2+x2y+y2z.");
913
+
914
+ }
915
+ }
916
+ }
917
+ }
918
+
919
+ }
920
+
921
+ if((size(P[1])==2)&&((P[2][2])==3))
922
+ {
923
+ if(k==10)
924
+ {
925
+ if(size(lengthBL(f))==4)
926
+ {
927
+ return("The given function defines an isolated Singularity.
928
+ The Tjurina number is "+string(tjurina(f))+".
929
+ E^2[7]:z2+x3+xy3+y3z.");
930
+
931
+ }
932
+ if(size(lengthBL(f))==5)
933
+ {
934
+ return("The given function defines an isolated Singularity.
935
+ The Tjurina number is "+string(tjurina(f))+".
936
+ E^3[8]:z2+x3+y5+y3z.");
937
+
938
+ }
939
+ }
940
+ if(k==12)
941
+ {
942
+
943
+ if(size(lengthBL(f))==4)
944
+ {
945
+ return("The given function defines an isolated Singularity.
946
+ The Tjurina number is "+string(tjurina(f))+".
947
+ E^1[7]:z2+x3+xy3+xy3z.");
948
+
949
+ }
950
+ if(size(lengthBL(f))==5)
951
+ {
952
+ return("The given function defines an isolated Singularity.
953
+ The Tjurina number is "+string(tjurina(f))+".
954
+ E^2[8]:z2+x3+y5+xy2z.");
955
+
956
+ }
957
+ }
958
+ if(k==14)
959
+ {
960
+
961
+ if(size(lengthBL(f))==4)
962
+ {
963
+ return("The given function defines an isolated Singularity.
964
+ The Tjurina number is "+string(tjurina(f))+".
965
+ E^0[7]:z2+x3+xy3.");
966
+
967
+ }
968
+ if(size(lengthBL(f))==5)
969
+ {
970
+ return("The given function defines an isolated Singularity.
971
+ The Tjurina number is "+string(tjurina(f))+".
972
+ E^1[8]:z2+x3+y5+xy3z.");
973
+
974
+ }
975
+ }
976
+ if(k==16)
977
+ {
978
+ return("The given function defines an isolated Singularity.
979
+ The Tjurina number is "+string(tjurina(f))+".
980
+ E^0[8]:z2+x3+y5.");
981
+
982
+ }
983
+ }
984
+ return(surDsing(f));
985
+ }
986
+ }
987
+
988
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
989
+ static proc surDsing(poly f)
990
+ //====Classification of Dk singularaties========================
991
+
992
+ {
993
+ //===input: A function which is an isolated singularity.
994
+ //===output: Normal form to which given function is contact equivalent.
995
+
996
+ def R=basering;
997
+ int n=nvars(R);
998
+ f=formf(f);
999
+ int k=tjurina(f);
1000
+
1001
+ list M=factorize(jet(f,2));
1002
+
1003
+ poly g=subst(f,leadmonom(M[1][2]),0);
1004
+ poly j=jet(g,3);
1005
+ if(j==0)
1006
+ {
1007
+
1008
+ return("The given function defines not a simple singularity.
1009
+ The Tjurina Number is "+string(k)+".");
1010
+
1011
+ }
1012
+ list P=factorize(j);
1013
+ if((size(P[1])==4)&&(size(P[2])==4))
1014
+ {
1015
+ if(k==8)
1016
+ {
1017
+
1018
+ return("The given function defines an isolated Singularity.
1019
+ The Tjurina number is "+string(tjurina(f))+".
1020
+ D^0 [4]:z2+x2y+xy2.");
1021
+
1022
+ }
1023
+ if(k==6)
1024
+ {
1025
+ return("The given function defines an isolated Singularity.
1026
+ The Tjurina number is "+string(tjurina(f))+".
1027
+ D^1 [4]:z2+x2y+xy2+xyz.");
1028
+
1029
+ }
1030
+ }
1031
+ if((size(P[1])==3)&&(size(P[2])==3))
1032
+ {
1033
+
1034
+ poly q=BlowUpO(f);
1035
+
1036
+ if((tjurina(f)-tjurina(q))==4)
1037
+ {
1038
+ list Q=whichSUR(f);
1039
+
1040
+ j=subst(Q[2],leadmonom(M[1][2]),0);
1041
+ poly j1=jet(j,3);
1042
+ list L=factorize(j1);
1043
+
1044
+ if((size(L[1])==4)&&(size(L[2])==4))
1045
+ {
1046
+ return("The given function defines an isolated Singularity.
1047
+ The Tjurina number is "+string(tjurina(f))+".
1048
+ D^0 ["+string(tjurina(f) div 2)+"]:z2+x2y+xy"+string(tjurina(f) div 4)+". ");
1049
+
1050
+ }
1051
+ if((size(L[1])==3)&&(size(L[2])==3))
1052
+ {
1053
+ return("The given function defines an isolated Singularity.
1054
+ The Tjurina number is "+string(tjurina(f))+".
1055
+ D^0 ["+string((tjurina(f) div 2)+1)+"]:z2+x2y+y"+string(tjurina(f) div 4)+"z.");
1056
+
1057
+ }
1058
+ }
1059
+ if((tjurina(f)-tjurina(q))==2)
1060
+ {
1061
+
1062
+ list Q=whichSUR(f);
1063
+ if(Q[1]==8){Q[2]=BlowUpO(Q[2]);}
1064
+ j=subst(Q[2],leadmonom(M[1][2]),0);
1065
+ poly j1=jet(j,3);
1066
+
1067
+ list L=factorize(j1);
1068
+ if((size(L[1])==4)&&(size(L[2])==4))
1069
+ {
1070
+ return("The given function defines an isolated Singularity.
1071
+ The Tjurina number is "+string(tjurina(f))+".
1072
+ D^"+string(findSUR(f))+" ["+string((tjurina(f)+2*findSUR(f)) div 2)+"]:z2+x2y+xy^"+string((tjurina(f)+2*findSUR(f)) div 4)+"+ xy"+string(((tjurina(f)+2*findSUR(f)) div 4)-findSUR(f))+" z.");
1073
+
1074
+ }
1075
+ if((size(L[1])==3)&&(size(L[2])==3))
1076
+ {
1077
+ return("The given function defines an isolated Singularity.
1078
+ The Tjurina number is "+string(tjurina(f))+".
1079
+ D^"+string(findRSUR(f))+" ["+string(((tjurina(f)+2*findRSUR(f)) div 2)+1)+"]:z2+x2y+y"+string((tjurina(f)+2*findRSUR(f)) div 4)+"z+xy"+string(((tjurina(f)+2*findRSUR(f)) div 4)-findRSUR(f))+"z.");
1080
+
1081
+ }
1082
+ }
1083
+ }
1084
+ }
1085
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1086
+ static proc formf(poly f)
1087
+ //=====Transform jet(f,2) in to the polynomial var(3)^2.
1088
+ //=====This is the case when We are in Dk and Ek surface singularaties.
1089
+ {
1090
+
1091
+ poly j=jet(f,2);
1092
+ list L=factorize(j);
1093
+ def r=basering;
1094
+ if(leadmonom(L[1][2])==var(1))
1095
+ {
1096
+ f=subst(f,var(1),L[1][2]);
1097
+ map phi=r,var(3),var(2),var(1);
1098
+ return(phi(f));
1099
+
1100
+ }
1101
+ if(leadmonom(L[1][2])==var(2))
1102
+ {
1103
+ f=subst(f,var(2),L[1][2]);
1104
+ map phi=r,var(1),var(3),var(2);
1105
+ return(phi(f));
1106
+
1107
+ }
1108
+ if(leadmonom(L[1][2])==var(3))
1109
+ {
1110
+ return(f);
1111
+ }
1112
+ }
1113
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1114
+ static proc whichSUR(poly f)
1115
+ //====This procedure is required to separate the Surface Case D_2m from D_2m+1 as describes in [2].
1116
+ {
1117
+ int d=tjurina(f);
1118
+ list L;
1119
+ while(1)
1120
+ {
1121
+ f=BlowUpO(f);
1122
+ d=tjurina(f);
1123
+
1124
+ if((d==6)||(d==8))
1125
+ {
1126
+ L[1]=d;
1127
+ L[2]=f;
1128
+
1129
+ return(L);
1130
+ }
1131
+ }
1132
+ return(d);
1133
+ }
1134
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1135
+ static proc findSUR(poly f)//D2m,r
1136
+ //====Number of blowup required in order either to get the difference equal to 4 or the Tjurina number is less than 6.
1137
+ {
1138
+
1139
+ int a, r,b;
1140
+ while(1)
1141
+ {
1142
+ r++;
1143
+ a=tjurina(f);
1144
+ if(a<=1)
1145
+ {
1146
+ return(r);
1147
+ }
1148
+ f=BlowUpO(f);
1149
+ b=tjurina(f);
1150
+ if((a-b)==4)
1151
+ {
1152
+ if(b==2)
1153
+ {
1154
+ return(r);
1155
+ }
1156
+ return(r-1);
1157
+ }
1158
+ if(b<6)
1159
+ {
1160
+ return(r-1);
1161
+ }
1162
+
1163
+ }
1164
+ }
1165
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1166
+ static proc findRSUR(poly f)//D2m+1,r
1167
+ //====Calculate the number of blow ups required by a polynomial in order to get the difference 4.
1168
+ {
1169
+
1170
+ int a, r,b;
1171
+ while(1)
1172
+ {
1173
+ r++;
1174
+ a=tjurina(f);
1175
+
1176
+ if(a==2)
1177
+ {
1178
+ return(r);
1179
+ }
1180
+
1181
+ f=BlowUpO(f);
1182
+ b=tjurina(f);
1183
+
1184
+ if((a-b)==4)
1185
+ {
1186
+ return(r-1);
1187
+ }
1188
+ if(b<6)
1189
+ {
1190
+ return(r);
1191
+ }
1192
+ }
1193
+ }
1194
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1195
+ static proc BlowUpO(poly f)
1196
+ //====Gives the procedure of Blowing up ingeneral
1197
+ {
1198
+ //=== input f smooth or isolated singularity at zero
1199
+ //=== output var(1) or poly with isolated singularity at zero, the transformation
1200
+ //=== of the singularity of the blowing up to zero
1201
+ def R=basering;
1202
+ def S=changeord(list(list("ds",1:nvars(basering))));
1203
+ setring S;
1204
+ int n=nvars(basering);
1205
+ int i,t,c,d,e,j,k;
1206
+ poly f=imap(R,f);
1207
+ if(deg(lead(f))<=1){setring R;return(var(1));}
1208
+ poly p;
1209
+ def T=changeord(list(list("lp",1:nvars(basering))));
1210
+ setring T;
1211
+ list L;
1212
+ map phi,psi;
1213
+ ideal mphi, mpsi,sing;
1214
+ poly p,q,m,l;
1215
+ poly h=var(1);
1216
+ //=========== blow up=======================================================
1217
+ for(i=1;i<=n;i++)
1218
+ {
1219
+ mphi=var(i)*maxideal(1);
1220
+ mphi[i]=var(i);
1221
+ phi=S,mphi;
1222
+ p=phi(f);
1223
+ q=p/var(i);
1224
+ while(size(p)==size(q))
1225
+ {
1226
+ p=q;
1227
+ q=q/var(i);
1228
+ }
1229
+ //=============== p is the strict transform var(i) exceptional divisor ====
1230
+ //=============== analysis of singularities ================================
1231
+ sing=jacob(p),p,var(i);
1232
+ sing=radical(sing);
1233
+ option(redSB);
1234
+ sing=std(sing);
1235
+ if(dim(sing)>0){ERROR("not simple");}
1236
+ sing=std(simplify(sing,1));
1237
+ if(dim(sing)==0)
1238
+ {
1239
+ if(vdim(sing)==1)
1240
+ {
1241
+ mpsi=maxideal(1);
1242
+ for(k=1;k<=n;k++){mpsi[k]=var(k)-sing[n-k+1][2];}
1243
+ psi=T,mpsi;
1244
+ p=psi(p);
1245
+ }
1246
+ else
1247
+ { //this can only happen in case of a D-singularity
1248
+ L=minAssGTZ(sing);
1249
+ d=0;
1250
+ for(j=1;j<=size(L);j++)
1251
+ {
1252
+ sing=std(L[j]);
1253
+ sing=std(simplify(sing,1));
1254
+ if(vdim(sing)!=1){ERROR("something is wrong in blowUpO");}
1255
+ mpsi=maxideal(1);
1256
+ for(k=1;k<=n;k++){mpsi[k]=var(k)-sing[n-k+1][2];}
1257
+ psi=T,mpsi;
1258
+ m=psi(p);
1259
+ setring S;
1260
+ p=imap(T,m);
1261
+ e=tjurina(p);
1262
+ setring T;
1263
+ if(e>d)
1264
+ {
1265
+ d=e;
1266
+ l=m;
1267
+ }
1268
+ }
1269
+ p=l;
1270
+ }
1271
+ setring S;
1272
+ p=imap(T,p);
1273
+ c=tjurina(p);
1274
+ setring T;
1275
+ if(c>t)
1276
+ {
1277
+ t=c;
1278
+ h=p;
1279
+ }
1280
+ }
1281
+ }
1282
+ setring R;
1283
+ poly h=imap(T,h);
1284
+ return(h);
1285
+ }
1286
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1287
+ static proc lengthBL(poly f)
1288
+ //====Return the list of Tjurina numbers of each blowing up in the resolution before it becomes smooth.
1289
+ {
1290
+ list L;
1291
+ int i=1;
1292
+ int d=tjurina(f);
1293
+ while(d>=2)
1294
+ {
1295
+ f=BlowUpO(f);
1296
+ L[i]=d;
1297
+ d=tjurina(f);
1298
+
1299
+ i=i+1;
1300
+ }
1301
+ return(L);
1302
+ }
1303
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1304
+ static proc curCeq2(poly f)
1305
+ //====Classification of Curves in Case when p=2.
1306
+ {
1307
+
1308
+ int c;
1309
+ int k;
1310
+ number m,a,b;
1311
+ ideal I;
1312
+ int d;
1313
+ k=tjurina(f);
1314
+ if(k==-1)
1315
+ {
1316
+ return("The given function defines not an isolated singularity");
1317
+
1318
+ }
1319
+ if(deg(lead(f))==2)
1320
+ {
1321
+ poly f1=jet(f,2);
1322
+ list T=factorize(f1);
1323
+ if(size(T[1])==3)
1324
+ {
1325
+ return("The given function defines an isolated Singularity.
1326
+ The Tjurina number is "+string(tjurina(f))+".
1327
+ A1:x2+xy.");
1328
+
1329
+ }
1330
+ if(size(T[1])==2)
1331
+ {
1332
+ poly g=BlowUpO(f);
1333
+ if((tjurina(f)-tjurina(g))==4)
1334
+ {
1335
+ return("The given function defines an isolated Singularity.
1336
+ The Tjurina number is "+string(tjurina(f))+".
1337
+ A["+string(k div 2)+"]:x2+y "+string(tjurina(f) div 2+1)+". where r=0. ");
1338
+ }
1339
+ else
1340
+ {
1341
+ d=whichtru(f);
1342
+ if(d==1)
1343
+ {
1344
+ if((k mod 4)==0)
1345
+ {
1346
+
1347
+ return("The given function defines an isolated Singularity.
1348
+ The Tjurina number is "+string(tjurina(f))+".
1349
+ A["+string(2*(tjurina(f) div 2)-1)+"]:x2+xy"+string(tjurina(f) div 2)+".");
1350
+ }
1351
+ else
1352
+ {
1353
+ return("The given function defines an isolated Singularity.
1354
+ The Tjurina number is "+string(tjurina(f))+".
1355
+ A["+string((2*(tjurina(f)+1) div 2)-1)+"]:x2+xy"+string((tjurina(f)+1) div 2)+".");
1356
+
1357
+ }
1358
+ }
1359
+ if(d==0)
1360
+ {
1361
+ if((findR(f) mod 2)==0)
1362
+ {
1363
+ return("The given function defines an isolated Singularity.
1364
+ The Tjurina number is "+string(tjurina(f))+".
1365
+ A^"+string(findR(f))+" ["+string(2*((tjurina(f)+2*findR(f)) div 4))+"]:x2+y"+string(((tjurina(f)+2*findR(f)) div 2)+1)+"+xy"+string(((tjurina(f)+2*findR(f)) div 2)-findR(f))+".");
1366
+ }
1367
+ if((findR(f) mod 2)!=0)
1368
+ {
1369
+ return("The given function defines an isolated Singularity.
1370
+ The Tjurina number is "+string(tjurina(f))+".
1371
+ A^"+string(findR(f))+" ["+string(2*(((tjurina(f)+1)+2*findR(f)) div 4))+"]:x2+y"+string((((tjurina(f)+1)+2*findR(f)) div 2)+1)+"+xy"+string((((tjurina(f)+1)+2*findR(f)) div 2)-findR(f))+".");
1372
+
1373
+ }
1374
+ }
1375
+
1376
+ }
1377
+
1378
+ }
1379
+
1380
+ }
1381
+ if(deg(lead(f))==3)
1382
+ {
1383
+ if(jet(f,3)==0)
1384
+ {return("The given function defines not a simple Singularity.
1385
+ The Tjurina number is "+string(tjurina(f))+".")}
1386
+ poly f1=jet(f,3);
1387
+ list L=factorize(f1);
1388
+ if(size(L[1])==4)
1389
+ {
1390
+ return("The given function defines an isolated Singularity.
1391
+ The Tjurina number is "+string(tjurina(f))+".
1392
+ D[4]:x2y+xy2.");
1393
+
1394
+ }
1395
+ if(size(L[1])==3)
1396
+ {
1397
+ poly g=BlowUpO(f);
1398
+ if((tjurina(f)-tjurina(g))==8)
1399
+ {
1400
+ return("The given function defines an isolated Singularity.
1401
+ The Tjurina number is "+string(tjurina(f))+".
1402
+ D^0["+string((tjurina(f) div 2)+1)+"]:x2y+y"+string(tjurina(f) div 2)+". where m="+string(tjurina(f)/4)+".");
1403
+
1404
+ }
1405
+ else
1406
+ {
1407
+ if(whichtru(f)==1)
1408
+ {
1409
+ return("The given function defines an isolated Singularity.
1410
+ The Tjurina number is "+string(tjurina(f))+".
1411
+ D["+string(tjurina(f))+"]:x2y+xy"+string(tjurina(f) div 2)+". ");
1412
+ }
1413
+ if(whichtru(f)==0)
1414
+ {
1415
+ if((findRD(f) mod 2)==0)
1416
+ {
1417
+ return("The given function defines an isolated Singularity.
1418
+ The Tjurina number is "+string(tjurina(f))+".
1419
+ D^"+string(findRD(f))+"["+string(2*((tjurina(f) div 2+findRD(f)) div 2)+1)+"]:x2y+y"+string((tjurina(f) div 2+findRD(f)))+"+xy"+string((tjurina(f) div 2+findRD(f))-findRD(f))+" where even r="+string(findRD(f))+".");
1420
+ }
1421
+ else
1422
+ {
1423
+ return("The given function defines an isolated Singularity.
1424
+ The Tjurina number is "+string(tjurina(f))+".
1425
+ D^"+string(findRD(f))+"["+string(2*(((tjurina(f)+1) div 2+findRD(f)) div 2)+1)+"]:x2y+y"+string(((tjurina(f)+1) div 2+findRD(f)))+"+xy"+string(((tjurina(f)+1) div 2+findRD(f))-findRD(f))+",odd r="+string(findRD(f))+".");
1426
+ }
1427
+ }
1428
+ }
1429
+ }
1430
+ a=leadcoef(f);
1431
+ b=leadcoef(f-lead(f));
1432
+ f=subst(f,var(1),1/a*(var(1)-a*b*var(2)));
1433
+ I=var(1),var(2)^2;
1434
+ I=std(I^3);
1435
+ if(reduce(f,I)!=0)
1436
+ {
1437
+ if(k==6)
1438
+ {
1439
+ return("The given function defines an isolated Singularity.
1440
+ The Tjurina number is "+string(tjurina(f))+".
1441
+ E^1[6]:x3+y4+xy3.");
1442
+
1443
+ }
1444
+ if(k==7)
1445
+ {
1446
+ return("The given function defines an isolated Singularity.
1447
+ The Tjurina number is "+string(tjurina(f))+".
1448
+ E[7]:x3+xy3.");
1449
+ }
1450
+ if(k==8)
1451
+ {
1452
+ poly t=BlowUpO(f);
1453
+ if(tjurina(t)==0)
1454
+ {
1455
+ return("The given function defines an isolated Singularity.
1456
+ The Tjurina number is "+string(tjurina(f))+".
1457
+ E^0[6]:x3+y4.");
1458
+ }
1459
+ else
1460
+ {
1461
+ return("The given function defines an isolated Singularity.
1462
+ The Tjurina number is "+string(tjurina(f))+".
1463
+ E[8]:x3+y5.");
1464
+ }
1465
+ }
1466
+ }
1467
+ else
1468
+ {return("The given function defines not a simple singularity.
1469
+ The Tjurina number is "+string(tjurina(f))+".");}
1470
+ }
1471
+
1472
+ if(deg(lead(f))>3)
1473
+ {
1474
+
1475
+ return("The given function defines not a simple singularity.
1476
+ The Tjurina number is "+string(tjurina(f))+".");
1477
+
1478
+ }
1479
+ }
1480
+ example
1481
+ {
1482
+ "EXAMPLE:"; echo=2;
1483
+ ring R=2,(x,y),Ds;
1484
+ curCeq2(x3+x2y+xy2+y3+xy3+y4);
1485
+
1486
+ }
1487
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1488
+ static proc whichtru(poly f)
1489
+ //====Gives the information that we do successive blowups and the last singularaty before becoming smmoth has Tjurina
1490
+ //====number 1 if not than returns 0.(returns either a singularaty or smooth surve)============
1491
+ {
1492
+ int d=tjurina(f);
1493
+ while(1)
1494
+ {
1495
+ f=BlowUpO(f);
1496
+ d=tjurina(f);
1497
+ if(d==1)
1498
+ {
1499
+ return(d);
1500
+ }
1501
+ if(d==0)
1502
+ {
1503
+ return(d);
1504
+ }
1505
+ }
1506
+ return(d);
1507
+ }
1508
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1509
+ static proc findR(poly f)
1510
+ //====Find the number of blowups required by polynomial such that
1511
+ //====difference between two consecutive blowups become 4
1512
+ //====this procedure find the value of r in case of Ak singularaties as in [1].
1513
+ {
1514
+ int a, r,b;
1515
+ while(1)
1516
+ {
1517
+ r++;
1518
+ a=tjurina(f);
1519
+ if(a<=1)
1520
+ {
1521
+ return(-1);
1522
+ }
1523
+ f=BlowUpO(f);
1524
+
1525
+ b=tjurina(f);
1526
+
1527
+ if((a-b)==4)
1528
+ {
1529
+ return(r-1);
1530
+ }
1531
+ }
1532
+ }
1533
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1534
+ static proc findRD(poly p)
1535
+ //=====Find the number of blowups required by polynomial such
1536
+ //=====that difference between two consecutive blowups become 4
1537
+ //=====this procedure find the value of r in case of Dk singularaties as in [1].
1538
+ {
1539
+
1540
+ int k=tjurina(p);
1541
+ poly q=BlowUpO(p);
1542
+ int t=tjurina(q);
1543
+ int r;
1544
+
1545
+ if((k mod 4)==0)
1546
+ {
1547
+ r=findR(BlowUpO(p))+2;
1548
+ return(r);
1549
+ }
1550
+ if((k mod 4 !=0)&&(t mod 4==0))
1551
+ {
1552
+ if(t!=0)
1553
+ {
1554
+ r=findR(BlowUpO(p))+1;
1555
+ return(r);
1556
+ }
1557
+ }
1558
+ if((k mod 2)==0)
1559
+ {
1560
+ r=findR(BlowUpO(p))+2;
1561
+ return(r);
1562
+ }
1563
+
1564
+ }
1565
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////
1566
+ static proc splitting_SQUA(poly p, int b)
1567
+ {
1568
+ // assumes that p=x_i^2+h, h of order >=3
1569
+ // returns q(x_1,??,x_n) such that x_i^2 +q is right equivalent to p mod
1570
+ // <x_1,??,x_n>^b and x_i is only linear in q
1571
+ def R=basering; int n=nvars(R);
1572
+ ideal M=maxideal(1);
1573
+ int j;
1574
+ map phi;
1575
+ p=jet(p,b);
1576
+ p=simplify(p,1);
1577
+ list T=FindSQUA(p);
1578
+ int i=T[1];
1579
+ poly q=p/var(i)^2;
1580
+ while(q!=1)
1581
+ {
1582
+ for(j=1;j<=n;j++)
1583
+ {
1584
+ M[j]=var(j)*q;
1585
+ }
1586
+ phi=R,M;
1587
+ p=phi(p);
1588
+ p=p*inverseUnit(q,b);
1589
+ p=jet(p,b);
1590
+ q=p/var(i)^2;
1591
+ }
1592
+ return(p);
1593
+ }
1594
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
1595
+ static proc splitting_two2(poly p, int i, int j, int b)
1596
+ {
1597
+ // assumes that p=x_i*x_j+h, no x_i^2, no in h, h of order >=2
1598
+ // returns q(x_1,??x_i-1,x_i+1,...,x_j-1,x_j+1,...,x_n) such that x_i*x_j +q is right equivalent to p mod
1599
+ // <x_1,??,x_n>^b
1600
+ if(b<2){b=2;}
1601
+ def R=basering;
1602
+ poly q=jet((p-var(i)*var(j))/var(i),b);
1603
+ while(q!=0)
1604
+ {
1605
+ p=quickSubst2(p,var(j)-q,j,b);
1606
+ q=jet((p-var(i)*var(j))/var(i),b);
1607
+ }
1608
+ return(simplify(substitute(jet(p,b),var(j),0),1)); //make the leading coefficient 1
1609
+
1610
+ }
1611
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1612
+ static proc quickSubst2(poly h, poly r, int i, int b)
1613
+ {
1614
+ //=== assume h, r is in Q[x_1,...,x_n], computes jet(h(x_i=r),b)
1615
+ h=jet(h,b);
1616
+ r=jet(r,b);
1617
+ matrix M=coef(h,var(i));
1618
+ poly q = 1;
1619
+ int j,k,d;
1620
+ intvec v;
1621
+ d=deg(M[1,1]);
1622
+ v[d+1]=1;
1623
+ for(k = 2; k <= ncols(M); k++)
1624
+ {
1625
+ v[deg(M[1,k])+1]=1;
1626
+ }
1627
+ h=0;
1628
+ for(k=1;k<=d+1;k++)
1629
+ {
1630
+ if(v[k]==1)
1631
+ {
1632
+ h=h+jet(q*M[2,ncols(M)-j],b);
1633
+ j++;
1634
+ }
1635
+ q=jet(q*r,b);
1636
+ }
1637
+ return(h);
1638
+ }
1639
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1640
+ static proc FindPRO(poly f)
1641
+ {
1642
+ //input the polynomial
1643
+ // output is a list T where T[1]=the first variable which appear as product in the quadraic form.
1644
+ // T[2]=the second variable which appear as product with the var(T[1]) in the quadraic form.
1645
+ def R=basering;
1646
+ int n=nvars(R);
1647
+ int i,j,k;
1648
+ list T;
1649
+ for(i=1;i<=n;i++)
1650
+ {
1651
+ for(k=i+1;k<=n;k++)
1652
+ {
1653
+ for(j=1;j<=size(f);j++)
1654
+ {
1655
+ if(leadmonom(f[j])==var(i)*var(k))
1656
+ {
1657
+
1658
+ T[1]=i;
1659
+ T[2]=k;
1660
+ return(T);
1661
+ }
1662
+ }
1663
+ }
1664
+
1665
+ }
1666
+ return(T);
1667
+ }
1668
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1669
+ static proc FindSQUA(poly f)
1670
+ {
1671
+ //input the polynomial
1672
+ // output is a list T where T[1]=the first variable which appears as a square in the quadraic part of f.
1673
+ // T[2]= the number of squares appearing in the quadraic part of f.
1674
+ def R=basering;
1675
+ int n=nvars(R);
1676
+ int i,j,k;
1677
+ list T;
1678
+ for(i=1;i<=n;i++)
1679
+ {
1680
+ for(j=1;j<=size(f);j++)
1681
+ {
1682
+ if(leadmonom(f[j])==var(i)^2)
1683
+ {
1684
+ k++;
1685
+ T[1]=i;
1686
+ T[2]=k;
1687
+ return(T);
1688
+ }
1689
+ }
1690
+ }
1691
+ return(T);
1692
+ }
1693
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1694
+ static proc findVAR(poly f)
1695
+ {
1696
+ //input: a poly f
1697
+ //output a list L=v,k v an intvec, v[i]=0, if depends on var(i), v[i]=1 else
1698
+ //k is the number of variables occurring in f
1699
+ intvec v;
1700
+ int i,k;int n=nvars(basering);
1701
+ list L;
1702
+ for(i=1;i<=n;i++)
1703
+ {
1704
+ if(f==subst(f,var(i),0))
1705
+ {
1706
+ v[i]=1;
1707
+ }
1708
+ else
1709
+ {
1710
+ v[i]=0;
1711
+ k++;
1712
+ }
1713
+ }
1714
+ L=v,k;
1715
+ return(L);
1716
+ }
1717
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1718
+ static proc redvar2(poly p)
1719
+ {
1720
+ //input a polynomial depending on x_i_1,...,x_i_k
1721
+ //output a new ring with k variables containing the polynomial
1722
+ def R=basering;
1723
+ int n=nvars(R);
1724
+ list N=findVAR(p);
1725
+ int m=N[2];
1726
+ intvec v=N[1];
1727
+ int l;
1728
+ int i;
1729
+ if(n==m)
1730
+ {
1731
+
1732
+ def S=R;
1733
+ if(defined(h))
1734
+ {
1735
+ kill h;
1736
+ }
1737
+ poly h;
1738
+ export h;
1739
+
1740
+ }
1741
+ else
1742
+ {
1743
+ def S=defring("2",m,"u","ds");
1744
+ setring S;
1745
+ ideal M;
1746
+ for(i=1;i<=n;i++)
1747
+ {
1748
+ if(v[i]==1)
1749
+ {
1750
+ M[i]=0;
1751
+ }
1752
+ else
1753
+ {
1754
+ l++;
1755
+ M[i]=var(l);
1756
+ }
1757
+ }
1758
+ map phi=R,M;
1759
+ poly p=phi(p);
1760
+ export p;
1761
+ setring R;
1762
+ }
1763
+ return(S);
1764
+ }
1765
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1766
+ static proc inverseUnit(poly q,int b)
1767
+ {
1768
+ //input a polynomial q with non-zero constant part
1769
+ //output the inverse of q up to order b as a power series
1770
+ number c=leadcoef(q);
1771
+ q=q/c;
1772
+ int i;
1773
+ poly u=1;
1774
+ poly a=q-1;
1775
+ poly s=-a;
1776
+ for(i=1;i<=b;i++)
1777
+ {
1778
+ u=u+s;
1779
+ s=s*a;
1780
+ }
1781
+ return(u/c);
1782
+ }
1783
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1784
+ static proc splittingLchar2(poly f)
1785
+ {
1786
+ //the quadratic part of the splitting lemma in characteristic 2
1787
+ //input: poly f
1788
+ //output: a polynomial right equivalent to the input polynomial such that the quadratic part is in normal form
1789
+ poly p=jet(f,2);
1790
+ if(p==0){return(f);}
1791
+ if(!homog(p)){return(jet(f,1));}
1792
+ def R=basering;
1793
+ def S=changeord(list(list("lp",1:nvars(basering))));
1794
+ setring S;
1795
+ ideal ma=maxideal(1);
1796
+ number a;
1797
+ int c=ringlist(S)[1][1];
1798
+ poly f=imap(R,f);
1799
+ poly p=imap(R,p);
1800
+ poly h,q;
1801
+ intvec v=leadexp(p);
1802
+ int i,j,k;
1803
+ intvec w;
1804
+ for(k=1;k<=size(v);k++)
1805
+ {
1806
+ if(v[k]!=0){w[size(w)+1]=k;}
1807
+ }
1808
+ i=w[2];
1809
+ if(size(w)==3){j=w[3];}
1810
+ if(j>0)
1811
+ {
1812
+ a=1/leadcoef(p);
1813
+ ma[j]=a*(var(j)+(p-lead(p))/var(i));
1814
+ map phi=S,ma;
1815
+ p=phi(p);
1816
+ f=phi(f);
1817
+ q=(p-lead(p))/var(j);
1818
+ ma=maxideal(1);
1819
+ ma[i]=var(i)+q;
1820
+ phi=S,ma;
1821
+ f=phi(f);
1822
+ h=splittingLchar2(f-var(i)*var(j));
1823
+ if(jet(h,2)==0)
1824
+ {
1825
+ setring R;
1826
+ f=imap(S,f);
1827
+ return(f);
1828
+ }
1829
+ v=leadexp(h);
1830
+ for(k=1;k<=size(v);k++)
1831
+ {
1832
+ if(v[k]!=0){break;}
1833
+ }
1834
+ if(v[k]==2)
1835
+ {
1836
+ ma=maxideal(1);
1837
+ ma[i]=var(j);
1838
+ ma[j]=var(k);
1839
+ ma[k]=var(i);
1840
+ phi=S,ma;
1841
+ h=phi(h);
1842
+ f=h+var(j)*var(k);
1843
+ }
1844
+ else
1845
+ {
1846
+ f=h+var(i)*var(j);
1847
+ }
1848
+ setring R;
1849
+ f=imap(S,f);
1850
+ return(f);
1851
+ }
1852
+
1853
+ a= leadcoef(p)^(c div 2);
1854
+ ma[i]=1/a*var(i);
1855
+ map phi=S,ma;
1856
+ p=phi(p);
1857
+ f=phi(f);
1858
+ q=p/var(i);
1859
+ if(size(q)==1)
1860
+ {
1861
+ if(p==var(i)^2)
1862
+ {
1863
+ setring R;
1864
+ f=imap(S,f);
1865
+ return(f);
1866
+ }
1867
+ h=splittingLchar2(f-var(i)^2);
1868
+ p=jet(h,2);
1869
+ v=leadexp(p);
1870
+ h=h+var(i)^2;
1871
+
1872
+ for(k=1;k<=size(v);k++)
1873
+ {
1874
+ if(v[k]!=0){j=k;break;}
1875
+ }
1876
+ if(v[j]==2)
1877
+ {
1878
+ ma=maxideal(1);
1879
+ ma[i]=var(i)+var(j);
1880
+ phi=S,ma;
1881
+ h=phi(h);
1882
+ h=splittingLchar2(h);
1883
+ }
1884
+ setring R;
1885
+ f=imap(S,h);
1886
+ return(f);
1887
+ }
1888
+ else
1889
+ {
1890
+ q=q-lead(q);
1891
+ v=leadexp(q);
1892
+ for(k=1;k<=size(v);k++)
1893
+ {
1894
+ if(v[k]!=0){j=k;break;}
1895
+ }
1896
+ ma=maxideal(1);
1897
+ ma[j]=1/leadcoef(q)*(var(j)+q-lead(q));
1898
+ phi=S,ma;
1899
+ f=phi(f);
1900
+ ma=maxideal(1);
1901
+ ma[j]=var(i);
1902
+ ma[i]=var(j);
1903
+ phi=S,ma;
1904
+ f=phi(f);
1905
+ p=jet(f,2);
1906
+ if(leadmonom(p)==var(i)^2)
1907
+ {
1908
+ f=phi(f);
1909
+ p=jet(f,2);
1910
+ ma=maxideal(1);
1911
+ ma[i]=p/var(j)-var(j);
1912
+ phi=S,ma;
1913
+ f=phi(f);
1914
+ h=splittingLchar2(f-var(i)^2-var(i)*var(j)-var(j)^2);
1915
+ p=jet(h,2);
1916
+
1917
+ f=var(i)^2+var(i)*var(j)+var(j)^2+h;
1918
+ if(p!=0)
1919
+ {
1920
+ v=leadexp(p);
1921
+ for(k=1;k<=size(v);k++)
1922
+ {
1923
+ if(v[k]!=0){break;}
1924
+ }
1925
+ if(v[k]==2)
1926
+ {
1927
+ ma=maxideal(1);
1928
+ ma[k]=var(i)+var(k);
1929
+ phi=S,ma;
1930
+ f=phi(f);
1931
+ setring R;
1932
+ f=imap(S,f);
1933
+ return(splittingLchar2(f));
1934
+ }
1935
+ setring R;
1936
+ f=imap(S,f);
1937
+ return(f);
1938
+ }
1939
+ else //we return (x_i)^2+x_i*x_j+(x_j)^2 since we need a field extension
1940
+ { //to transform it to x_i*x_j
1941
+ setring R;
1942
+ f=imap(S,f);
1943
+ return(f);
1944
+ }
1945
+ }
1946
+ setring R;
1947
+ f=imap(S,f);
1948
+ return(splittingLchar2(f));
1949
+ }
1950
+ }
1951
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////
1952
+ /*
1953
+ =============================== Examples for characteristic 2 ==========================================
1954
+ ring r=2,(x,y,z,w,t,v),ds;
1955
+ poly p=xy+zw+t5+v3;
1956
+ classifyCeq(p);
1957
+
1958
+ map phi=r,v,t,w,z,y,x;
1959
+ poly c=1+x+y+z;
1960
+ poly q=c*p;
1961
+ q=phi(q);
1962
+ q=zw+tv+x3+zw2+zwt+zwv+wtv+t2v+tv2+x3w+x3t+x3v+y5+y5w+y5t+y5v;
1963
+ classifyCeq(q);
1964
+
1965
+ poly p=ztv+x3+zw2+zwt+zwv+wtv+tv2+tv2+x3w+x3t+x3v+xy3+xy3w+xy3v;
1966
+ classifyCeq(p);
1967
+
1968
+ poly p=zw+tv+x3+zw2+zwt+wtv+t2v+tv2+x3w+x3t+x3v+y4+y4w+y4t+y4v;
1969
+ classifyCeq(p);//E^0[6]
1970
+
1971
+ poly p=zw+tv+x3+zw2+zwt+zwv+wtv+t2v+tv2+x3w+x3t+x3v+xy3+y4+xy3w+xy3t+xy3v+y4w+y4t+y4v;
1972
+ classifyCeq(p);//E^1[6]
1973
+
1974
+ poly p=y2+zw+tv+y2w+y2t+y2v+zw2+zwt+zwv+wtv+t2v+tv2+x11+x11w+x11t+x11v;
1975
+ classifyCeq(p);//A[10] r=0;
1976
+
1977
+ poly p=zw+tv+xy2+zw2+zwv+zwt+wtv+t2v+tv2+xy2w+xy2t+xy2v+x14y+x14yw+x14yt+x14yv+x26+x26w+x26t+x26v;
1978
+ classifyCeq(p);
1979
+
1980
+ ring r=2,(x,y,z,t,w,u,v),Ds;
1981
+ ideal I=z+t,x+t+w,v,y,u,t,w+z;
1982
+ det(jacob(I));
1983
+ map phi=r,I;
1984
+ poly a=1+x+u+v;
1985
+ poly p=xy+zt+wu+v19;
1986
+ poly q=a*p;
1987
+ poly j=phi(q);
1988
+ classifyCeq(j);
1989
+ classifyCeq(p);
1990
+
1991
+ poly p=x2+yz+tw+u3+v2x;
1992
+ classifyCeq(p);
1993
+
1994
+ poly q=a*p;
1995
+ poly j=phi(q);
1996
+ classifyCeq(j);
1997
+
1998
+ poly p=xy+zw+t2+u2v+v19u;
1999
+ classifyCeq(p);
2000
+
2001
+ poly q=a*p;
2002
+ poly j=phi(q);
2003
+ classifyCeq(j);
2004
+
2005
+ poly p=xy+zw+t2+u2v+v5t+uvt;
2006
+ classifyCeq(p);
2007
+
2008
+ poly q=a*p;
2009
+ poly j=phi(q);
2010
+ classifyCeq(j);
2011
+
2012
+ poly p=xy+zw+t2+u2v+v5u+uvt;
2013
+ classifyCeq(p);
2014
+
2015
+ poly q=a*p;
2016
+ poly j=phi(q);
2017
+ classifyCeq(j);
2018
+
2019
+ ring r=2,(x,y,z,t,w,u,v,e),Ds;
2020
+ ideal I=x+y+z+t+w,y+z+t+w,e,v,u,t,w,z;
2021
+ map si=r,I;
2022
+
2023
+ poly p=xy+zt+wu+v2+e81;
2024
+ poly j=si(p);
2025
+ classifyCeq(j);
2026
+
2027
+ poly p=xy+zt+wu+v2+e81+e^(80-12)*v;
2028
+ classifyCeq(p);
2029
+ poly j=si(p);
2030
+ classifyCeq(j);
2031
+
2032
+ poly p=xy+zt+wu+v2e+e60+e31v;
2033
+ classifyCeq(p);
2034
+
2035
+ poly p=xy+zt+wu+v2e+e60+e59v;
2036
+ poly j=si(p);
2037
+ classifyCeq(j);
2038
+ =============================== Examples for characteristic > 2 ========================================
2039
+ ring R=3,(x,y,z,u,v,w,s,t),ds;
2040
+ ideal M=maxideal(1);
2041
+ M[3]=x-y+z+u+w-s+t;
2042
+ poly f=u3+v4+u2v2+x2+y2+z2+s2+t2+w2;
2043
+ classifyCeq(f);
2044
+
2045
+ map phi=R,M;
2046
+ f=phi(f);
2047
+ classifyCeq(f);
2048
+
2049
+ f=u2+y32+s2+t2+v2+x2+z2+w2;
2050
+ classifyCeq(f);
2051
+
2052
+ map phi=R,M;
2053
+ f=phi(f);
2054
+ classifyCeq(f);
2055
+
2056
+
2057
+ f=v2w+w61+x2+y2+z2+t2+z2+s2+u2;
2058
+ classifyCeq(f);
2059
+
2060
+ f=phi(f);
2061
+ classifyCeq(f);
2062
+
2063
+ f=u2+v2+w2+s2+t2-x2y+xy2+z6+y11+xy11+x14+z53; // f is of corank=3
2064
+ classifyCeq(f);
2065
+
2066
+ f=x3+y4+xy5+s2+t2;
2067
+ classifyCeq(f);
2068
+
2069
+ f=u3+v5+u2v2+x2+y2+z2+t2+s2+w2;
2070
+ classifyCeq(f);
2071
+
2072
+ ideal M=maxideal(1);
2073
+ M[2]=x+y+2s+t;
2074
+ map phi=R,M;
2075
+ f=phi(f);
2076
+ classifyCeq(f);
2077
+
2078
+ ring R=3,(u,v,w,s,t),ds;
2079
+ poly f=w2s+s21+u2+v2+t2;
2080
+ classifyCeq(f);
2081
+
2082
+ ideal M=maxideal(1);
2083
+ M[3]=u+2v+w+2t+2s;
2084
+ map phi=R,M;
2085
+ f=phi(f);
2086
+ classifyCeq(f);
2087
+
2088
+ ring R=5,(x,y,z,u,v,w,s,t),dp;
2089
+ poly f=v2w+w61+x2+y2+z2+t2+z2+s2+u2;
2090
+ classifyCeq(f);
2091
+
2092
+ */