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,1655 @@
1
+ ///////////////////////////////////////////////////////////////////////
2
+ version="version decomp.lib 4.1.2.0 Feb_2019 "; // $Id: 02da61c043667a4cf1ba811664707362a6947bfc $
3
+
4
+ // last changed 21.5.12 C.G. reversal wieder eingefuegt (standalone)
5
+ category = "general";
6
+ info =
7
+ "
8
+ LIBRARY: decomp.lib Functional Decomposition of Polynomials
9
+ AUTHOR: Christian Gorzel, University of Muenster
10
+ email: gorzelc@math.uni-muenster.de
11
+
12
+
13
+ OVERVIEW:
14
+ @texinfo
15
+ This library implements functional uni-multivariate decomposition
16
+ of multivariate polynomials.
17
+
18
+ A (multivariate) polynomial f is a composite if it can be written as
19
+ @math{g \\circ h} where g is univariate and h is multivariate,
20
+ where @math{\\deg(g), \\deg(h)>1}.
21
+
22
+ Uniqueness for monic polynomials is up to linear coordinate change
23
+ @tex
24
+ $g\\circ h = g(x/c -d) \\circ c(h(x)+d)$.
25
+ @end tex
26
+
27
+ If f is a composite, then @code{decompose(f);} returns an ideal (g,h);
28
+ such that @math{\\deg(g) < \\deg(f)} is maximal, (@math{\\deg(h)\\geq 2}).
29
+ The polynomial h is, by the maximality of @math{\\deg(g)}, not a composite.
30
+
31
+ The polynomial g is univariate in the (first) variable vvar of f,
32
+ such that deg_vvar(f) is maximal.
33
+
34
+ @code{decompose(f,1);} computes a full decomposition, i.e. if f is a
35
+ composite, then an ideal @math{(g_1,\\dots ,g_m,h)} is returned, where
36
+ @math{g_i} are univariate and each entry is primitive such that
37
+ @math{f=g_1\\circ \\dots \\circ g_m\\circ h}.
38
+
39
+ If f is not a composite, for instance if @math{\\deg(f)} is prime,
40
+ then @code{decompose(f);} returns f.
41
+
42
+ The command @code{decompose} is the inverse: @code{compose(decompose(f,1))==f}.
43
+
44
+ Recall, that Chebyshev polynomials of the first kind commute by composition. @*
45
+
46
+ The decomposition algorithms work in the tame case, that is if
47
+ char(basering)=0 or p:=char(basering) > 0 but deg(g) is not divisible by
48
+ p.
49
+ Additionally, it works for monic polynomials over @math{Z} and in some
50
+ cases for monic polyomials over coefficient rings. @* See
51
+ @code{is_composite} for examples. (It also works over the reals but
52
+ there it seems not be numerical stable.) @*
53
+
54
+ More information on the univariate resp. multivariate case. @*
55
+
56
+ Univariate decomposition is created, with the additional assumption
57
+ @math{\\deg(g), \\deg(h)>1}. @*
58
+
59
+ A multivariate polynomial f is a composite, if f can be written as
60
+ @math{g \\circ h}, where @math{g} is a univariate polynomial and @math{h}
61
+ is multivariate. Note, that unlike in the univariate case, the polynomial
62
+ @math{h} may be of degree @math{1}. @*
63
+ E.g. @math{f = (x+y)^2+ 2(x+y) +1} is the composite of
64
+ @math{g = x^2+2x+1} and @math{h = x+y}. @*
65
+
66
+ If @code{nvars(basering)>1}, then, by default, a single-variable
67
+ multivariate polynomial is not considered to be the same as in the
68
+ one-variable polynomial ring; it will always be decomposed. That is: @*
69
+ @code{> ring r1=0,x,dp;} @*
70
+ @code{> decompose(x3+2x+1);} @*
71
+ @code{x3+2x+1} @*
72
+ but: @*
73
+ @code{> ring r2=0,(x,y),dp;} @*
74
+ @code{> decompose(x3+2x+1);} @*
75
+ @code{_[1]=x3+2x+1} @*
76
+ @code{_[2]=x} @*
77
+
78
+ In particular: @*
79
+ @code{is_composite(x3+2x+1)==1;} in @code{ring r1} but @*
80
+ @code{is_composite(x3+2x+1)==0;} in @code{ring r2}. @*
81
+
82
+ This is justified by interpreting the polynomial decomposition as an
83
+ affine Stein factorization of the mapping @math{f:k^n \\to k, n\\geq 2}.
84
+
85
+ The behaviour can changed by the some global variables.
86
+
87
+ @code{int DECMETH;} choose von zur Gathen's or Kozen-Landau's method.
88
+ @* @code{int MINS;} compute f = g o h, such that h(0) = 0. @*
89
+ @code{int IMPROVE;} simplify the coefficients of g and h if f is
90
+ not monic. @*
91
+ @code{int DEGONE;} single-variable multivariate are
92
+ considered uni-variate. @*
93
+
94
+ See @code{decompopts;} for more information.
95
+
96
+ Additional information is displayed if @code{printlevel > 0}.
97
+ @end texinfo
98
+ REFERENCES:
99
+ @texinfo
100
+ @tex
101
+ D. Kozen, S. Landau: Polynomial Decomposition Algorithms, \\par
102
+ \\quad \\qquad J. Symb. Comp. (1989), 7, 445-456. \\par
103
+ J. von zu Gathen: Functional Decomposition of Polynomials: the Tame Case,\\par
104
+ \\quad \\qquad J. Symb. Comp. (1990), 9, 281-299. \\par
105
+ J. von zur Gathen, J. Gerhard: Modern computer algebra, \\par
106
+ \\quad \\qquad Cambridge University Press, Cambridge, 2003.
107
+ @end tex
108
+ @end texinfo
109
+ PROCEDURES:
110
+ // decompunivmonic(f,r);
111
+ // decompmultivmonic(f,var,s);
112
+ decompopts([\"reset\"]); displays resp. resets global options
113
+ decompose(f[,1]); [complete] functional decomposition of poly f
114
+ is_composite(f); predicate, is f a composite polynomial?
115
+ chebyshev(n[,1]); the nth Chebyshev polynomial of the first kind
116
+ compose(f1,..,fn); compose f1 (f2 (...(fn))), f_i polys of ideal
117
+
118
+ AUXILIARY PROCEDURES:
119
+ makedistinguished(f,var); transforms f to a var-distinguished polynomial
120
+ // divisors(n[,1]); intvec [increasing] of the divisors d of n
121
+ // gcdv(v); the gcd of the entries in intvec v
122
+ // maxdegs(f); maximal degree for each variable of the poly f
123
+ // randomintvec(n,a,b[,1]); random intvec size n, [non-zero] entries in {a,b}
124
+ KEYWORDS: Functional decomposition
125
+ ";
126
+
127
+ /*
128
+ decompunivpoly(poly f,list #) // f = goh; r = deg g, s = deg h;
129
+
130
+ Ablauf ist:
131
+
132
+ decompose(f)
133
+ | check whether f is the composite by a monomial
134
+ | check whether f is univariate
135
+ | transformation to a distinguished polynomial
136
+ decompmultivmonic(f,vvar,r)
137
+ decompunivmonic(f,r) // detect vvar by maxdegs
138
+ |lift univariate decomposition
139
+ | back-transformation
140
+ | fulldecompose, iterate
141
+ | decompuniv for g
142
+
143
+ */
144
+ ///////////////////////////////////////////////////////////////////////////////
145
+
146
+
147
+ proc decompopts(list #)
148
+ "USAGE: decompopts(); or decompopts(\"reset\");
149
+ RETURN: nothing
150
+ NOTE:
151
+ @texinfo
152
+ in the first case, it shows the setting of the control parameters;@*
153
+ in the second case, it kills the user-defined control parameters and@*
154
+ resets to the default setting which will then
155
+ be displayed. @* @*
156
+ int DECMETH; Method for computing the univariate decomposition@*
157
+ 0 : (default) Kozen-Landau @*
158
+ 1 : von zur Gathen @*
159
+
160
+ int IMPROVE Choice of coefficients for the decomposition @*
161
+ @math{(g_1,\ldots,g_l,h)} of a non-monic polynomials f. @*
162
+ 0 : leadcoef(@math{g_1}) = leadcoef(@math{f})
163
+ and @math{g_2,\ldots,g_l,h} are monic @*
164
+ 1 : (default), content(@math{g_i}) = 1 @*
165
+
166
+ int MINS @*
167
+ @math{f=g\circ h, (g_1,\ldots,g_m,h)} of a non-monic polynomials f.@*
168
+ 0 : g(0) = f(0), h(0) = 0 [ueberlegen fuer complete] @*
169
+ 1 : (default), g(0)=0, h(0) = f(0) @*
170
+ 2 : Tschirnhaus @*
171
+
172
+ int DECORD; The order in which the decomposition will be computed@*
173
+ 0 : minfirst @*
174
+ 1 : (default) maxfirst @*
175
+
176
+ int DEGONE; decompose also polynomials built on linear ones @*
177
+ 0 : (default) @*
178
+ 1 :
179
+ @end texinfo
180
+ EXAMPLE: example decompopts; shows an example
181
+ "
182
+ {
183
+ /*
184
+ siehe Erlaeuterungen, globale Variablen wie im Header angegeben,
185
+ suchen mit CTRL-S Top::
186
+ diese eintragen
187
+ */
188
+ if (size(#))
189
+ {
190
+ if (string(#[1]) == "reset")
191
+ {
192
+ if (defined(DECMETH)) {kill DECMETH;}
193
+ // if (defined(DECORD)) {kill DECORD;}
194
+ if (defined(MINS)) {kill MINS;}
195
+ if (defined(IMPROVE)) {kill IMPROVE;}
196
+ }
197
+ }
198
+
199
+ if (voice==2)
200
+ {
201
+ "";
202
+ " === Global variables for decomp.lib === ";
203
+ "";
204
+
205
+ if (!defined(DECMETH)) {" -- DECMETH (int) not defined, implicitly 1";}
206
+ else
207
+ {
208
+ if (DECMETH!=0 and DECMETH!=1) { DECMETH=1; }
209
+ " -- DECMETH =", DECMETH;
210
+ }
211
+ /*
212
+ if (!defined(DECORD)) {" -- DECORD (int) not defined, implicitly 1";}
213
+ else
214
+ {
215
+ if (DECORD!=0 and DECORD!=1) { DECORD=1; }
216
+ " -- (int) DECORD =", DECORD;
217
+ }
218
+ */
219
+ if (!defined(MINS)) {" -- MINS (int) not defined, implicitly 0";}
220
+ else
221
+ {
222
+ if (MINS!=0 and MINS!=1) { MINS = 0; }
223
+ " -- (int) MINS =", MINS;
224
+ }
225
+
226
+ if (!defined(IMPROVE)) {" -- IMPROVE (int) not defined, implicitly 1";}
227
+ else
228
+ {
229
+ if (IMPROVE!=0 and IMPROVE!=1) { IMPROVE=1; }
230
+ " -- (int) IMPROVE =", IMPROVE;
231
+ }
232
+ }
233
+ }
234
+ example;
235
+ { "EXAMPLE:"; echo =2;
236
+ decompopts();
237
+ }
238
+ ///////////////////////////////////////////////////////////////////////////////
239
+
240
+ //static
241
+ proc decompmonom(poly f, list #)
242
+ "USAGE: decompmonom(f[,vvar]); f poly, vvar poly
243
+ PURPOSE: compute a maximal decomposition in case that
244
+ f = g o h, where g is univariate and h is a single monomial
245
+ RETURN: ideal, (g,h); g univariate, h monomial if such a decomposition exist,
246
+ poly, the input, otherwise
247
+ ASSUME: f is non-constant
248
+ EXAMPLE: example decompmonom; shows an example
249
+ "
250
+ {
251
+ int i,k;
252
+ poly g;
253
+
254
+ poly vvar = var(1);
255
+ if (size(#)) { vvar = var(rvar(#[1])); }
256
+
257
+ //poly vvar = maxdeg(f);
258
+ poly zeropart = jet(f,0);
259
+ poly ff = f - zeropart;
260
+ int mindeg = -deg(ff,-1:nvars(basering));
261
+ poly minff = jet(ff,mindeg);
262
+ if (size(minff)>1) { return(f); }
263
+ intvec minv = leadexp(minff);
264
+ minv = minv/gcdv(minv);
265
+ for (i=1;i<=size(ff);i++)
266
+ {
267
+ k = divintvecs(leadexp(ff[i]),minv);
268
+ if (k==0) { return(f); }
269
+ else { g = g + leadcoef(ff[i])*vvar^k; }
270
+ }
271
+ g = g + zeropart;
272
+ dbprint("* Successfully multivariate decomposed by a monomial"+newline);
273
+ return(ideal(g,monomial(minv)));
274
+ }
275
+ example
276
+ { "EXAMPLE:"; echo =2;
277
+ ring r = 0,(x,y),dp;
278
+ poly f = subst((x2+x3)^150,x,x2y3);
279
+ decompmonom(f);
280
+
281
+ ring rxyz = 0,(x,y,z),dp;
282
+ poly g = 1+x2+x3+x5;
283
+ poly G = subst(g,x,x7y5z3);
284
+ ideal I = decompmonom(G^50);
285
+ I[2];
286
+ }
287
+ ///////////////////////////////////////////////////////////////////////////////
288
+
289
+ static proc divintvecs(intvec v,intvec w)
290
+ "USAGE: divintvecs(v,w); v,w intvec, w!=0
291
+ RETURN: int, k if v = k*w,
292
+ 0 otherwise
293
+ NOTE: if w==0, then an Error message occurs
294
+ EXAMPLE: example divintevcs; shows an example
295
+ "
296
+ {
297
+ if (w==0) {
298
+ ERROR("// Error: proc divintvecs: the second argument has to be non-zero.");
299
+ return(0);
300
+ }
301
+ int i=1;
302
+ while (w[i]==0) { i++; }
303
+ int k = v[i] div w[i];
304
+ if (v == k*w) { return(k); }
305
+ else { return(0); }
306
+ }
307
+ example
308
+ { "EXAMPLE:"; echo =2;
309
+ intvec v = 1,2,3;
310
+ intvec w = 2,4,6;
311
+ divintvecs(w,v);
312
+ divintvecs(intvec(3,2,9),v);
313
+ }
314
+ ///////////////////////////////////////////////////////////////////////////////
315
+
316
+ static proc gcdv(intvec v)
317
+ "USAGE: gcdv(v); intvec v
318
+ RETURN: int, the gcd of the entries in v
319
+ NOTE: if v=0, then gcdv(v)=1 @*
320
+ this is different from Singular's builtin gcd, where gcd(0,0)==0
321
+ EXAMPLE: example gcdv; shows an example
322
+ "
323
+ {
324
+ int ggt;
325
+ int i,n;
326
+
327
+ ggt = v[1];
328
+ for (i=2;i<=size(v);i++)
329
+ {
330
+ ggt = gcd(ggt,v[i]);
331
+ }
332
+ if (ggt==0)
333
+ {
334
+ ggt = 1;
335
+ }
336
+ return(ggt);
337
+ }
338
+ example
339
+ { "EXAMPLE:"; echo =2;
340
+ intvec v = 6,15,21;
341
+ gcdv(v);
342
+ gcdv(0:3);
343
+ }
344
+ ///////////////////////////////////////////////////////////////////////////////
345
+
346
+ static proc divisors(int n,list #)
347
+ "USAGE: divisors(n); n int
348
+ divisors(n,1); n int
349
+ RETURN: intvec, the positive divisors of n @*
350
+ in decreasing order (default) @*
351
+ in increasing order in the second case
352
+ EXAMPLE: example divisors; shows an example
353
+ "
354
+ {
355
+ int i,j;
356
+ intvec v = 1;
357
+
358
+ list l = primefactors(n);
359
+ list primesl = l[1];
360
+ list multl = l[2];
361
+
362
+ for (i=1;i<=size(primesl);i++)
363
+ {
364
+ for (j=1;j<=multl[i];j++)
365
+ { v = v,primesl[i]*v;}
366
+ }
367
+
368
+ ring rhelp =0,x,dp; // sort the intvec
369
+ poly h;
370
+ for(i=1;i<=size(v);i++)
371
+ {
372
+ h = h+x^v[i];
373
+ }
374
+ v=0;
375
+ for(i=1;i<=size(h);i++)
376
+ {
377
+ v[i]=leadexp(h[i])[1];
378
+ }
379
+ if (size(#)) {
380
+ return(intvec(v[size(v)..1]));
381
+ }
382
+
383
+ return(v);
384
+ }
385
+ example
386
+ { "EXAMPLE:"; echo = 2;
387
+ divisors(30);
388
+ divisors(-24,1);
389
+ }
390
+ ///////////////////////////////////////////////////////////////////////////////
391
+ //
392
+ // Dies wirkt sich nur aus wenn Brueche vorhanden sind?!
393
+ // Laeuft dann so statt cleardenom usw. problemlos ueber Z,Z_m
394
+ // ansehen.
395
+ //
396
+ static proc improvecoef(poly g0,poly h0,number lc)
397
+ "USAGE: improvecoef(g0,h0,lc); g0, h0 poly; lc number
398
+ RETURN: poly, poly, number
399
+ ASSUME: global ordering
400
+ EXAMPLE: example improvecoef; shows an example
401
+ "
402
+ {
403
+ int Zcoefs = find(charstr(basering),"integer");
404
+ poly vvar = var(univariate(g0));
405
+ number lch0 = leadcoef(h0);
406
+ number denom;
407
+
408
+ if (Zcoefs and lch0<0) // da cleardenom fuer integer buggy ist.
409
+ {
410
+ h0 = h0/(-1);
411
+ denom = -1;
412
+ }
413
+ else
414
+ {
415
+ h0 = cleardenom(h0);
416
+ denom = leadcoef(h0)/lch0;
417
+ }
418
+ g0 = subst(g0,vvar,1/denom*vvar);
419
+ g0 = lc*g0;
420
+ lc = leadcoef(g0);
421
+ g0= 1/lc*g0;
422
+ return(g0,h0,lc);
423
+ }
424
+ example
425
+ { "EXAMPLE:"; echo = 2;
426
+ ring r = 0,x,dp;
427
+
428
+ poly g = 3x2+5x;
429
+ poly h = 4x3+2/3x;
430
+ number lc = 7;
431
+
432
+ improvecoef(g,h,lc);
433
+ }
434
+ ///////////////////////////////////////////////////////////////////////////////
435
+
436
+ proc compose(list #)
437
+ "USAGE: compose(f1,...,fn); f1,...,fn poly
438
+ compose(I); I ideal, @*
439
+ ASSUME: the ideal consists of n=ncols(I) >= 1 entries, @*
440
+ where I[1],...,I[n-1] are univariate in the same variable @*
441
+ but I[n] may be multivariate.
442
+ RETURN: poly, the composition I[1](I[2](...I[n]))
443
+ NOTE: this procedure is the inverse of decompose
444
+ EXAMPLE: example compose; shows some examples
445
+ SEE: decompose
446
+ "
447
+ {
448
+ def d = basering; // Ohne dies kommt es zu Fehler, wenn auf Toplevel
449
+ // ring r definiert ist.
450
+
451
+ ideal I = ideal(#[1..size(#)]);
452
+ int n=ncols(I);
453
+ poly f=I[1];
454
+ map phisubst;
455
+ ideal phiid = maxideal(1);
456
+
457
+ int varnum = univariate(f);
458
+
459
+ if (varnum<0) {
460
+ " // the first polynomial is a constant";
461
+ return(f);
462
+ }
463
+ if (varnum==0 and n>1) {
464
+ " // the first polynomial is not univariate";
465
+ return(f);
466
+ }
467
+ // Hier noch einen Test ergaenzen
468
+
469
+ poly vvar = var(varnum);
470
+
471
+ for(int i=2;i<=n;i++)
472
+ {
473
+ phiid[varnum]=I[i];
474
+ // phisubst=d,phiid;
475
+ phisubst=basering,phiid;
476
+ f = phisubst(f);
477
+ }
478
+ return(f);
479
+ }
480
+ example
481
+ { "EXAMPLE:"; echo =2;
482
+ ring r = 0,(x,y),dp;
483
+ compose(x3+1,x2,y3+x);
484
+ // or the input as one ideal
485
+ compose(ideal(x3+1,x2,x3+y));
486
+ }
487
+ ///////////////////////////////////////////////////////////////////////////////
488
+
489
+ proc is_composite(poly f)
490
+ "USAGE: is_composite(f); f poly
491
+ RETURN: int @*
492
+ 1, if f is decomposable @*
493
+ 0, if f is not decomposable @*
494
+ -1, if char(basering)>0 and deg(f) is divisible by char(basering) but no
495
+ decomposition has been found.
496
+ NOTE: The last case means that it could exist a decomposition f=g o h with
497
+ char(basering)|deg(g), but this wild case cannot be decided by the algorithm.@*
498
+ Some additional information will be displayed when called by the user.
499
+ EXAMPLE: example is_composite; shows some examples
500
+ "
501
+ {
502
+ int d = deg(f,nvars(basering));
503
+ int cb = char(basering);
504
+
505
+ if (d<1)
506
+ {
507
+ " The polynomial is constant ";
508
+ return(0);
509
+ }
510
+ if (d==1)
511
+ {
512
+ " The polynomial is linear ";
513
+ return(0);
514
+ }
515
+
516
+ if (nvars(basering)==1 and d==prime(d))
517
+ {
518
+ " The degree is prime.";
519
+ return(0);
520
+ }
521
+
522
+ if (nvars(basering)>1 and univariate(f)) // and not(defined(DEGONE))
523
+ {
524
+ return(1);
525
+ }
526
+
527
+ // else try to decompose
528
+ int nc = ncols(ideal(decompose(f)));
529
+
530
+ if (cb > 0) // check the not covered wild case
531
+ {
532
+ if ((d mod cb == 0) and (nc == 1))
533
+ {
534
+ if (voice==2)
535
+ {
536
+ "// -- Warning: wild case, cannot decide whether the polynomial has a";
537
+ "// -- decomposition goh with deg(g) divisible by char(basering) = "
538
+ + string(cb) + ".";
539
+ }
540
+ return(-1);
541
+ }
542
+ }
543
+ // in the tame case, decompose gives the correct result
544
+ return(nc>1);
545
+ }
546
+ example
547
+ { "EXAMPLE:"; echo =2;
548
+
549
+ ring r0 = 0,x,dp;
550
+ is_composite(x4+5x2+6); // biquadratic polynomial
551
+
552
+ is_composite(2x2+x+1); // prime degree
553
+ // -----------------------------------------------------------------------
554
+ // polynomial ring with several variables
555
+ ring R = 0,(x,y),dp;
556
+ // -----------------------------------------------------------------------
557
+ // single-variable multivariate polynomials
558
+ is_composite(2x+1);
559
+ is_composite(2x2+x+1);
560
+ // -----------------------------------------------------------------------
561
+ // prime characteristic
562
+ ring r7 = 7,x,dp;
563
+ is_composite(compose(ideal(x2+x,x14))); // is_composite(x14+x7);
564
+ is_composite(compose(ideal(x14+x,x2))); // is_composite(x14+x2);
565
+
566
+ }
567
+ ///////////////////////////////////////////////////////////////////////////////
568
+
569
+ proc decompose(poly f,list #)
570
+ "USAGE: decompose(f); f poly
571
+ decompose(f,1); f poly
572
+ RETURN: poly, the input, if f is not a composite
573
+ ideal, if the input is a composite
574
+ NOTE: computes a full decomposition if called by the second variant
575
+ EXAMPLE: example decompose; shows some examples
576
+ SEE: compose
577
+ "
578
+ {
579
+ if (!defined(IMPROVE)){ int IMPROVE = 1; }
580
+ if (!defined(MINFIRST)){ int MINFIRST = 0; }
581
+ int fulldecompose;
582
+
583
+ if (size(#)) { // cf. ERROR-msg in randomintvec
584
+ if (typeof(#[1])=="int") {
585
+ fulldecompose = (#[1]==1);
586
+ }
587
+ }
588
+
589
+ int m,iscomposed;
590
+ int globalord = 1;
591
+ ideal I;
592
+
593
+ // --- preparatory stuff ----------------------------------------------------
594
+ // The degree is not independent of the term order
595
+ int n = deg(f,1:nvars(basering));
596
+ int varnum = univariate(f); // to avoid transformation if f is univariate
597
+
598
+ // if (deg(f)<=1) {return(f);} //steigt automatisch bei der for-schleife aus m = 2
599
+ if (n==prime(n) and nvars(basering)==1
600
+ // or (varnum>0 and nvars(basering))
601
+ ) {return(f);}
602
+
603
+ if (varnum<0)
604
+ {
605
+ ERROR("// -- Error proc decompoly: the polynomial is constant.");
606
+ }
607
+ //--------------------------------------------------------------------------
608
+
609
+ int minfirst = MINFIRST!=0;
610
+ list mdeg;
611
+ intvec maxdegv,degcand;
612
+
613
+ // -- switch to global order, necessary for division -- // Weiter nach oben
614
+ if (typeof(attrib(basering,"global"))!="int") {
615
+ globalord = 0;
616
+ }
617
+ else {
618
+ globalord = attrib(basering,"global");
619
+ }
620
+
621
+ if (!globalord) {
622
+ def d = basering;
623
+ list ll = ringlist(basering);
624
+ ll[3] = list(list("dp",1:nvars(basering)),list("C",0));
625
+ def rneu = ring(ll);
626
+ setring rneu;
627
+ poly f = fetch(d,f);
628
+ ideal I;
629
+ }
630
+ // -----------------------------------------------------------------------
631
+
632
+ map phiback;
633
+ poly f0,g0,h0,vvar;
634
+ number lc;
635
+ ideal J; // wird erst in fulldecompose benoetigt
636
+
637
+ // --- Determine the candidates for deg(g) a decreasing sequence of divisors
638
+ poly lf = jet(f,n)-jet(f,n-1);
639
+ //"lf = ",lf;
640
+ if (size(lf)==1) // the leading homogeneous part is a monomial
641
+ {
642
+ degcand = divisors(gcdv(leadexp(lf)));
643
+ }
644
+ else
645
+ {
646
+ degcand = divisors(n); // Das ist absteigend
647
+ }
648
+
649
+ if(printlevel>0) {degcand;}
650
+
651
+ // --- preparatory steps for the multivariate case -------------------------
652
+
653
+ if (varnum>0) // -- univariate polynomial
654
+ {
655
+ vvar = var(varnum);
656
+ f0 = f; // save f
657
+ }
658
+ else // i.e. multivariate (varnum==0),the case varnum < 0 is excluded above
659
+ {
660
+ // -- find variable with maximal degree
661
+ mdeg = maxdegs(f);
662
+ maxdegv = mdeg[2];
663
+ varnum = maxdegv[2];
664
+ vvar = var(varnum);
665
+ phiback = maxideal(1);
666
+
667
+ // special case, the polynomial is a composite of a single monomial //20.6.10
668
+ if (qhweight(f)!=0) { I = decompmonom(f,vvar); }
669
+ iscomposed = size(I)>1;
670
+ if (iscomposed) // 3.6.11 - dies decompmonom
671
+ { //I;
672
+ ideal J = decompunivmonic(I[1],deg(I[1]));
673
+ I[2]= subst(J[2],vvar,I[2]);
674
+ I[1] = J[1];
675
+ //I;
676
+ }
677
+
678
+ if (!iscomposed) // -- transform into a distinguished polynomial
679
+ {
680
+ f0,phiback = makedistinguished(f,vvar);
681
+ }
682
+ }
683
+ // ------ Start computation ------------------------------------------------
684
+ // -- normalize and save the leading coefficient
685
+ lc = 1;
686
+ //f0;
687
+ //"vvar = ",vvar;
688
+
689
+ // --- 11.4.11 hier auch noch gewichteten Grad beruecksichtigen ? --
690
+
691
+ if (!iscomposed) { lc = leadcoef(coeffs(f0,vvar)[deg(f0)+1,1]); } // 20.6.10
692
+
693
+ // if Z, Z_m, and f is not monic (and content !=1) // if (f0/lc*lc!=f0)
694
+ if (find(charstr(basering),"integer") and not(lc==1 or lc==-1)) // 6.4.11
695
+ {
696
+ ERROR("// -- Error proc decompose: Can not decompose non-monic polynomial over Z!");
697
+ }
698
+
699
+ if (lc!=1){ f0 = 1/number(lc)*f0;} // --- normalize the polynomial
700
+
701
+ // -- Now the input is prepared to be monic and vvar-distinguished
702
+ //----------------------------------------------------------------
703
+ m = 1;
704
+
705
+ // --- Special case: a multivariate can be composite of a linear polynom
706
+ if (univariate(f) and nvars(basering)==1) // 11.8.09 d.h.
707
+ { // --- if univariate ----------------------------------------
708
+ if(minfirst) {degcand = divisors(n,1);} // dies ist aufsteigend
709
+ m = 2; // skip first entry
710
+ }
711
+ // if decomposed as the decomposition with a monomial
712
+ // then skip the multivariate process // 20.6.10 detected as decompmonomial
713
+ if (iscomposed) { degcand = 1; }
714
+
715
+ if (printlevel>0 and !iscomposed) { "* Degree candidates are", degcand; }
716
+
717
+ // -- check succesively for each candidate
718
+ // whether f is decomposable with deg g = r
719
+
720
+ for(;m<size(degcand);m++) // decreasing
721
+ { //r = degcand[m];
722
+ I = decompmultivmonic(f0,vvar,degcand[m]);
723
+ if (size(I)>1)
724
+ {
725
+ iscomposed = 1;
726
+ break;
727
+ }
728
+ }
729
+ // -- all candidates have be checked but f is primitive
730
+ if(!iscomposed) {
731
+ if (!globalord) { setring d; } // restore old ring
732
+ dbprint("** not decomposable: linear / not tame / prime degree --");
733
+ return(f);
734
+ }
735
+
736
+ // -- the monic vvar-distinguished polynomial f0 is decomposed -------
737
+ // -- retransformation for the multivariate case ---------------------
738
+ g0,h0 = I;
739
+
740
+ if (!univariate(f)) { h0 = phiback(h0);}
741
+
742
+ if (IMPROVE) { g0,h0,lc=improvecoef(g0,h0,lc);} // ueber switch
743
+ I = h0;
744
+
745
+ // -- Full decomposition: try to decompose g further ------------------
746
+ if (fulldecompose) {
747
+ dbprint(newline+"** Compute a complete decomposition");
748
+ while (iscomposed) {
749
+ iscomposed=0;
750
+ degcand=divisors(deg(g0,1:nvars(basering))); // absteigend
751
+ if (printlevel> 0) { "** Degree candidates are now: ", degcand; }
752
+ for (m=2;m<size(degcand);m++) //OK, ergibt lexicographically ..
753
+ {
754
+ J =decompunivmonic(g0,degcand[m]); /* J =decompuniv(g0);*/
755
+ g0 = J[1];
756
+ h0=J[2];
757
+ iscomposed = deg(h0,1:nvars(basering))>1;
758
+ if (iscomposed) {
759
+ if (IMPROVE) { g0,h0,lc=improvecoef(g0,h0,lc); } // ueber switch
760
+ I = h0,I;
761
+ break;
762
+ }
763
+ }
764
+ }
765
+ dbprint("** completely decomposed"+newline);
766
+ }
767
+ I = lc*g0,I;
768
+ if (!globalord) {
769
+ setring d;
770
+ I = fetch(rneu,I);
771
+ }
772
+ return(I);
773
+ }
774
+ example
775
+ { "EXAMPLE:"; echo =2;
776
+ ring r2 = 0,(x,y),dp;
777
+
778
+ decompose(((x3+2y)^6+x3+2y)^4);
779
+
780
+ // complete decomposition
781
+ decompose(((x3+2y)^6+x3+2y)^4,1);
782
+ // -----------------------------------------------------------------------
783
+ // decompose over the integers
784
+ ring rZ = integer,x,dp;
785
+ decompose(compose(ideal(x3,x2+2x,x3+2)),1);
786
+ // -----------------------------------------------------------------------
787
+ // prime characteristic
788
+ ring r7 = 7,x,dp;
789
+ decompose(compose(ideal(x2+x,x7))); // tame case
790
+ // -----------------------------------------------------------------------
791
+ decompose(compose(ideal(x7+x,x2))); // wild case
792
+ // -----------------------------------------------------------------------
793
+ ring ry = (0,y),x,dp; // y is now a parameter
794
+ compose(x2+yx+5,x5-2yx3+x);
795
+ decompose(_);
796
+
797
+ // Usage of variable IMPROVE
798
+ ideal J = x2+10x, 64x7-112x5+56x3-7x, 4x3-3x;
799
+ decompose(compose(J),1);
800
+ int IMPROVE=0;
801
+ exportto(Decomp,IMPROVE);
802
+ decompose(compose(J),1);
803
+ }
804
+ ///////////////////////////////////////////////////////////////////////////////
805
+ /* ring rt =(0,t),x,dp;
806
+ poly f = 36*x6+12*x4+15*x3+x2+5/2*x+(-t);
807
+ decompose(f);
808
+ */
809
+
810
+
811
+ // Dies gibt stets ein ideal zurueck, wenn f composite ist
812
+ // gibt das polynom zurueck, wenn es primitiv ist
813
+ // static
814
+ proc decompmultivmonic(poly f,poly vvar,int r)
815
+ "USAGE: decompmultivmonic(f,vvar,r); f,vvar poly; r int
816
+ RETURN: ideal, I = ideal(g,h) if f = g o h with deg(g) = r@*
817
+ poly f, if f is not a composite or char(basering) divides r
818
+ ASSUME: f is monic and distinguished w.r.t. vvar,
819
+ 1<=r<=deg(f) is a divisor of deg(f)
820
+ and char(basering) does not divide r.
821
+ EXAMPLE: example decompmultivmonic; shows an example
822
+ "
823
+ {
824
+ def d = basering;
825
+ int i,isprimitive;
826
+ int m = nvars(basering);
827
+ int n = deg(f);
828
+ int varnum = rvar(vvar);
829
+ intvec v = 1:m; // weight-vector for jet
830
+ v[varnum]=0;
831
+ int s = n div r;
832
+ // r = deg g; s = deg h;
833
+
834
+ poly f0 = f;
835
+ poly h,h0,g,gp,fgp,k,t,u;
836
+ ideal I,rem,phiid;
837
+ list l;
838
+ map phisubst;
839
+
840
+ // -- entscheidet intern, abhaengig von der Anzahl der Ringvariablen,
841
+ // -- ob f0 primitive ist.
842
+ // " r = ",r;
843
+
844
+ if (s*r!=n)
845
+ {
846
+ ERROR("// -- Error proc decompmultivmonic: r = "+string(r)+
847
+ " does not divide deg(f) = "+string(n)+".");
848
+ }
849
+
850
+ int cb = char(basering); // oder dies in decompunivmonic
851
+ if (cb>0)
852
+ {
853
+ if (r mod cb == 0)
854
+ {
855
+ if (voice == 2)
856
+ {
857
+ "// Warning: wild case in characteristic " + string(cb) +
858
+ ". We cannot decide";
859
+ "// whether a decomposition goh with deg(g) = " + string(r)+
860
+ " exists.";"";
861
+ }
862
+ return(f);
863
+ }
864
+ }
865
+ //---------------------------------------------------------------------------
866
+
867
+ for (i=1;i<=m;i++)
868
+ {
869
+ if (i!=varnum) {f0 = subst(f0,var(i),0);}
870
+ }
871
+ //" f0 = ",f0;
872
+ // f0 ist nun das univariate
873
+
874
+ // 24.3.09 // 11.8.09 nochmals ansehen
875
+ if (r==deg(f0)) // the case of a linear multivarcomposite
876
+ {
877
+ dbprint("** try to decompose in linear h, deg g = "+string(r));
878
+ I = f0,vvar; // Das ist hier wichtig
879
+ }
880
+ else // find decomposition of the univariate f0
881
+ {
882
+ I = decompunivmonic(f0,r);
883
+ // dbprint(" ** monic decomposed");//" I = ";I;
884
+
885
+ isprimitive=(deg(I[2])==1);
886
+ if (isprimitive) {return(f);}
887
+ }
888
+
889
+ //---- proceed in the multivariate case
890
+ //---- lift the univariate decomposition
891
+ if (!univariate(f))
892
+ {
893
+ dbprint("* Lift the univariate decomposition");
894
+ g,h0 = I;
895
+ k = h0;
896
+ gp = diff(g,vvar);
897
+
898
+ // -- This is substitution ----
899
+ // t = substitute(gp,vvar,h0);
900
+ phiid = maxideal(1);
901
+ phiid[varnum]=h0;
902
+ phisubst=basering,phiid;
903
+ t = phisubst(gp);
904
+ // -- substitution ende
905
+ fgp = 1;
906
+ i = 0;
907
+ while(fgp!=0)
908
+ {
909
+ i++;
910
+ // -- This is substitution ----
911
+ //gp = substitute(g,vvar,k);
912
+ phiid[varnum]=k;
913
+ phisubst=basering,phiid;
914
+ gp = phisubst(g);
915
+ // -- substitution ende
916
+
917
+ fgp = f - gp;
918
+ u = jet(fgp,i,v) - jet(fgp,i-1,v); // oder mit reduce(maxideal(x))
919
+ l = division(u,t); // die kleineren Terme abschneiden
920
+ rem = l[2];
921
+ u = l[1][1,1]; // the factor
922
+ if (rem!=0)
923
+ {
924
+ isprimitive = 1;
925
+ break;
926
+ }
927
+ k = k + u;
928
+ }
929
+ h = k;
930
+ I = g,h;
931
+ //"decomposed as =";
932
+ //I;
933
+ }
934
+ if (isprimitive) {
935
+ dbprint(">>> not multivariate decomposed"+newline);
936
+ return(f);
937
+ }
938
+ else {
939
+ dbprint("* Successfully multivariate decomposed"+newline);
940
+ return(I);
941
+ }
942
+ }
943
+ example
944
+ { "EXAMPLE:"; echo = 2;
945
+ ring r = 0,(x,y),lp;
946
+ poly f = 3xy4 + 2xy2 + x5y3 + x + y6;
947
+ decompmultivmonic(f,y,2);
948
+
949
+ ring rx = 0,x,lp;
950
+ decompmultivmonic(x8,x,4);
951
+ }
952
+ ///////////////////////////////////////////////////////////////////////////////
953
+ //static
954
+ proc decompunivmonic(poly f,int r)
955
+ "USAGE: decompunivmonic(f,r); f poly, r int
956
+ RETURN: ideal, (g,h) such that f = goh and deg(g) = r
957
+ poly f, if such a decomposition does not exist.
958
+ ASSUME: f is univariate, r is a divisor of deg(f) @*
959
+ and char(basering) does not divide r in case that char(basering) > 0.
960
+ global order of the basering is assumed.
961
+ EXAMPLE: example decompunivmonic; shows an example
962
+ "
963
+ {
964
+ int d = deg(f);
965
+ int s; // r = deg g; s = deg h;
966
+ int minf,mins;
967
+ int iscomposed = 1;
968
+
969
+ if (!defined(MINS)) { int MINS = 0; }
970
+ if (!defined(DECMETH)) { int DECMETH = 1; }
971
+ int savedecmeth = DECMETH;
972
+ int Zcoefs =charstr(basering)=="integer";//find(charstr(basering),"integer");
973
+
974
+ number cf;
975
+ poly h,g;
976
+ ideal I;
977
+ matrix cc;
978
+
979
+ // --- Check input and create the results for the simple cases
980
+
981
+ if (deg(f)<1){return(ideal(f,var(1)));} // wird dies aufgerufen?
982
+ //-------------------------
983
+
984
+ int varnum = univariate(f);
985
+
986
+ if (varnum==0)
987
+ {
988
+ "// -- The polynomial is not univariate";
989
+ return(f);
990
+ }
991
+
992
+ poly vvar = var(varnum);
993
+ I = f,vvar;
994
+
995
+ if (leadcoef(f)!=1)
996
+ {
997
+ "// -- Error proc decompunivmonic: the polynomial is not monic.";
998
+ return(f);
999
+ }
1000
+ /* Dies einklammern, wenn (x+1)^2 zerlegt werden sollte
1001
+ // aus decompose heraus, wird dies gar nicht aufgerufen!
1002
+ if (deg(f)==1 or deg(f)==prime(deg(f)))
1003
+ {
1004
+ "// -- The polynomial is not a composite.";
1005
+ return(I);
1006
+ }
1007
+ */
1008
+ /* ---------------------------------------------------- */
1009
+ s = d div r;
1010
+
1011
+ if (d!=s*r)
1012
+ {
1013
+ ERROR("// -- Error proc decompunivmonic: the second argument does not divide deg f.");
1014
+ }
1015
+ int cb = char(basering);
1016
+ if (cb>0)
1017
+ {
1018
+ if (r mod cb ==0)
1019
+ {
1020
+ "wild case: cannot determine a decomposition";
1021
+ return(I);
1022
+ }
1023
+ }
1024
+ // -------------------------------------------------------------------------
1025
+ // The Newton iteration only works over coefficient *fields*
1026
+ // Therefore use in this case the Kozen-Landau method i.e. set DECMETH = 1;
1027
+ if (savedecmeth==0 and Zcoefs) { DECMETH=1; }
1028
+
1029
+ // -- Start the computation ----------------------------------------------
1030
+
1031
+ dbprint("* STEP 1: Determine h");
1032
+ dbprint(" d = deg f = " +string(n) + " f = goh"," r = deg g = "+string(r),
1033
+ " s = deg h = " +string(s));
1034
+ int tt = timer;
1035
+
1036
+ if(DECMETH==1) { // Kozen-Landau
1037
+ dbprint("* Kozen-Landau method");
1038
+
1039
+ // Determine ord(f);
1040
+ //cc = coef(f,vvar); // extract coefficients of f
1041
+ //print(cc); read("");
1042
+
1043
+ // dbprint("time: "+string(timer-tt)); tt = timer;
1044
+ // minf = deg(cc[1,ncols(cc)]); // 11.8.09 Doch OK.
1045
+ minf = -deg(f,-1:nvars(basering)); // this is local ord 15.3.10
1046
+
1047
+ // oder: mins = 1; if (minf) { .. dies .. }
1048
+ mins = (minf div r) + (minf mod r) > 0; // i.e. ceil(minf/r)
1049
+
1050
+ if (mins==0 and MINS) { mins=1; } // omit the constant term i.e. h(0) = 0
1051
+
1052
+ dbprint("** min f = "+string(minf) + " | min s = "+string(mins) +
1053
+ " | s-mins = "+ string(s-mins));
1054
+
1055
+ // Dies wird wohl nicht benoetigt.
1056
+ // int minr= (minf div s) + ((minf mod s)>0); // ceil
1057
+ dbprint("** extract the coeffs ");
1058
+ cc = coeffs(f,vvar);
1059
+
1060
+ dbprint("time: "+ string(timer -tt));
1061
+
1062
+ h = vvar^s;
1063
+ for (int j=1;j<=s-mins;j++)
1064
+ {
1065
+ /*
1066
+ timer = 1;H = Power(h,r); "Power H"; timer;
1067
+ timer = 1;G = h^r; "h^r"; timer;
1068
+ */
1069
+ cf = (number(cc[d-j+1,1])-number(coeffs(h^r,vvar)[d-j+1,1]));
1070
+
1071
+ // d-j+1,"cf =",cf, " r= ",r;
1072
+ // dbprint("*** "+ string(d-j+1) + " cf = "+string(cf) + " r= "+string(r));
1073
+
1074
+ if (Zcoefs) { if (bigint(cf) mod r != 0) { iscomposed = 0; break; }}
1075
+ cf = cf/r;
1076
+
1077
+ //else { cf = cf/r; }
1078
+ h = h + cf*vvar^(s-j);
1079
+ // " h = ",h;
1080
+ }
1081
+ } else {
1082
+ dbprint("* von zur Gathen-method");
1083
+ // "f=",f;
1084
+ h = reversal(newtonrroot(reversal(f,d),r,s+!MINS),s,vvar); // verdreht OK
1085
+ // " h = ",h;
1086
+ dbprint("* END STEP 1: time: "+string(timer -tt));
1087
+ }
1088
+ DECMETH=savedecmeth; // restore the original method
1089
+
1090
+ if (iscomposed == 0) {
1091
+ dbprint("** Failed in STEP 1: not decomposed with deg h = "+string(s)+newline);
1092
+ return(I);
1093
+ }
1094
+
1095
+ // -- Step 2: try to rewrite f as a sum of powers of h ---
1096
+ dbprint("* STEP 2: Determine g");
1097
+ poly H = h^r;
1098
+ int dalt = r;
1099
+ int ds;
1100
+ number c;
1101
+ while (d >= 0) // i.e. f!=0
1102
+ {
1103
+ //dbprint("d = ",d);
1104
+ ds = d div s;
1105
+ if (ds * s !=d) // d mod s != 0, i.e. remaining f is a power of h
1106
+ {
1107
+ iscomposed = 0;
1108
+ break;
1109
+ }
1110
+ c = leadcoef(f);
1111
+ g = g + c*vvar^ds;
1112
+ H = division(H,h^(dalt - ds))[1][1,1]; // 10.3.10
1113
+ // H = H / h^(dalt - ds);
1114
+ f = f - c*H;
1115
+ //"f = ",f;
1116
+
1117
+ dalt = ds;
1118
+ d = deg(f);
1119
+ }
1120
+ dbprint("* END STEP 2: time: "+string(timer -tt));
1121
+ if (iscomposed)
1122
+ {
1123
+ dbprint("** Successfully univariate decomposed with deg g = "+string(r)+newline);
1124
+ I = g,h;
1125
+ } else {
1126
+ dbprint("** Failed in STEP 2: not decomposed with deg g = "+string(r)+newline);
1127
+ }
1128
+
1129
+ return(I);
1130
+ }
1131
+ example
1132
+ { "EXAMPLE:"; echo = 2;
1133
+ ring r=0,(x,y),dp;
1134
+ decompunivmonic((x2+x+1)^3,3);
1135
+ decompunivmonic((x2+x)^3,3);
1136
+
1137
+ decompunivmonic((y2+y+1)^3,3);
1138
+ }
1139
+ ///////////////////////////////////////////////////////////////////////////////
1140
+ // aus polyaux.lib
1141
+ proc reversal(poly f,list #)
1142
+ "USAGE: reversal(f); f poly
1143
+ reversal(f,k); f poly, k int
1144
+ reversal(f,k,vvar); f poly, k int, vvar poly (a ring variable)
1145
+ RETURN: poly, the reversal x^k*f(1/x) of the input f
1146
+ ASSUME: f is univariate and that k>=deg(f)
1147
+ @* since no negative exponents are possible in Singular
1148
+ @* if k<deg(f) then k = deg(f) is used
1149
+ NOTE: reversal(f); is by default reversal(f,deg(f));
1150
+ the third variant is needed if f is a non-zero constant and k>0 @*
1151
+ @* reversal is only idempotent,
1152
+ @* if called twice with the deg(f) as second argument
1153
+ EXAMPLE: example reversal; shows an example
1154
+ "
1155
+ {
1156
+ int k = 0;
1157
+ poly vvar = var(1);
1158
+
1159
+ if (size(#)) {
1160
+ k = #[1] - deg(f) ;
1161
+ if (k<0) { k=0; }
1162
+ if (size(#)==2){ // check whether second optional argument
1163
+ vvar = var(univariate(#[2])); // is a ring variable
1164
+ }
1165
+ }
1166
+
1167
+ int varnum = univariate(f);
1168
+
1169
+ if (varnum==0) {
1170
+ ERROR("// -- the input is not univariate.");
1171
+ }
1172
+ if (varnum<0) { // the polynomial is constant
1173
+ return(f*vvar^k);
1174
+ }
1175
+
1176
+ def d = basering;
1177
+ list l = ringlist(d);
1178
+ list varl = l[2];
1179
+ varl = insert(varl,"@z",size(varl));
1180
+ l[2] = varl;
1181
+ def rnew = ring(l);
1182
+ setring rnew;
1183
+ poly f = fetch(d,f);
1184
+ f = subst(homog(f,@z),var(varnum),1,@z,var(varnum))*var(varnum)^k;
1185
+
1186
+ setring d;
1187
+ f = fetch(rnew,f);
1188
+ return(f);
1189
+ }
1190
+ example
1191
+ { "EXAMPLE:"; echo = 2;
1192
+ ring r = 0,x,dp;
1193
+ poly f = x3+2x+5;
1194
+ reversal(f);
1195
+ // the same as
1196
+ reversal(f,3);
1197
+ reversal(f,5);
1198
+
1199
+ poly g = x3+2x;
1200
+ reversal(g);
1201
+
1202
+ // Not idempotent
1203
+ reversal(reversal(g));
1204
+
1205
+ // idempotent
1206
+ reversal(reversal(g,deg(g)),deg(g));
1207
+ // or for short
1208
+ // reversal(reversal(g),deg(g));
1209
+ }
1210
+ ///////////////////////////////////////////////////////////////////////////////
1211
+ // aus polyaux.lib
1212
+ proc newtonrroot(poly f,int r,int l)
1213
+ "USAGE: newtonrroot(f,r,l); f poly; r int; l int
1214
+ RETURN: poly h, the solution of h^r = f modulo vvar^l
1215
+ ASSUME: f(0) = 1
1216
+ NOTE: this uses p-adic Newton iteration. It is the adaption of Algorithm 9.22@*
1217
+ of von zur Gathen & Gerhard p. 264 for the special case: phi = Y^r - f
1218
+ EXAMPLE: example newtonrroot; shows some examples
1219
+ "
1220
+ {
1221
+ // phi = Y^r - f
1222
+
1223
+ poly g = 1; // start polynomial
1224
+
1225
+ poly s = 1/number(r); // initial solution
1226
+ int i = 2;
1227
+ //"s initial",s;
1228
+
1229
+ while(i<l) {
1230
+ // "iteration i",i;
1231
+
1232
+ // g = (g -(g^r-f)*s) mod x^i;
1233
+ g = jet((g -(g^r-f)*s), i-1);
1234
+ // s = 2*s - (r*g^(r-1)*s^2) mod x^i;
1235
+ s = jet(2*s - (r*g^(r-1)*s^2),i-1);
1236
+ // "s is now ",s;
1237
+
1238
+ i = 2*i;
1239
+ }
1240
+ //"return newtonrroot";
1241
+ //jet((g -(g^r-f)*s),l-1);
1242
+
1243
+ return(jet((g -(g^r-f)*s),l-1));
1244
+ }
1245
+ example
1246
+ { "EXAMPLE:"; echo = 2;
1247
+ ring r = 0,x,dp;
1248
+
1249
+ ring r3 = 3,x,dp;
1250
+ poly f = x+1;
1251
+ // determine square root of f modulo x^4
1252
+ poly g = newtonrroot(f,2,4);
1253
+ g;
1254
+ g^2;
1255
+ ring R = (0,b,c,d),x,ds;
1256
+ // poly f = 1 + bx +cx2+dx3;
1257
+ poly f = 1 + 5bx +5cx2+5dx3;
1258
+ poly g2 = newtonrroot(f,2,4);
1259
+ g2;
1260
+ f-g2^2;
1261
+ poly f5 = 1 +5*(bx+cx2+dx3);
1262
+ poly g5 = newtonrroot(f5,5,4);
1263
+ g5;
1264
+ f5-g5^5;
1265
+ // Multivariate polynomials
1266
+ ring r = 0,(x,y,z),ds;
1267
+ ring r2 =(0,a,b,c,d,e),(x,y),ds;
1268
+ // poly f = 1 +ax+by+cx2+dxy+ey2;
1269
+ poly f3 = 1 +9*(ax+by+cx2+dxy+ey2);
1270
+ poly g3 = newtonrroot(f3,3,4);
1271
+ jet(g3^3-f3,5);
1272
+ }
1273
+ ///////////////////////////////////////////////////////////////////////////////
1274
+
1275
+ static proc randomintvec(int n,int a,int b,list #)
1276
+ "USAGE: randomintvec(n,a,b); n,a,b int;
1277
+ randomintvec(n,a,b,1); n,a,b int;
1278
+ RETURN: intvec, say v, of length n
1279
+ with entries a<=v[i]<=b, in the first case, resp.
1280
+ with entries a<=v[i]<=b, where v[i]!=0, in the second case
1281
+ NOTE: a<=b should be satisfied, otherwise always v[i]=b (due to random).
1282
+ EXAMPLE: example randomintvec; shows some examples
1283
+ "
1284
+ {
1285
+ int i,randint,nozeroes;
1286
+ intvec v;
1287
+
1288
+ if (size(#)) {
1289
+ if (typeof(#[1])!="int") {
1290
+ ERROR("4th argument can only be an integer, assumed 1.");
1291
+ }
1292
+ nozeroes = #[1]==1;
1293
+ }
1294
+
1295
+ for (i=1;i<=n;i++)
1296
+ {
1297
+ randint = random(a,b);
1298
+ while (nozeroes and randint==0) { randint = random(a,b); }
1299
+ v[i] = randint;
1300
+ }
1301
+ return(v);
1302
+ }
1303
+ example
1304
+ { "EXAMPLE:"; echo = 1;
1305
+ int randval = system("--random"); // store initial value
1306
+ system("--random",0815);
1307
+ echo = 2;
1308
+ randomintvec(7,-1,1); // 7 entries in {-1,0,1}
1309
+ randomintvec(7,-1,1,1); // 7 entries either -1 or 1
1310
+ randomintvec(3,-10,10);
1311
+ echo = 1;
1312
+ system("--random",randval); // reset random generator
1313
+ }
1314
+ ///////////////////////////////////////////////////////////////////////////////
1315
+
1316
+ proc makedistinguished(poly f,poly vvar)
1317
+ "USAGE: makedistinguished(f,vvar); f, vvar poly; where vvar is a ring variable
1318
+ RETURN: (poly, ideal): the transformed polynomial and an ideal defining
1319
+ the map which reverses the transformation.
1320
+ PURPOSE: let vvar = var(1). Then f is transformed by a random linear
1321
+ coordinate change
1322
+ phi = (var(1), var(2)+c_2*vvar,...,var(n)+c_n*vvar) @*
1323
+ such that phi(f) = f o phi becomes distinguished with respect
1324
+ to vvar. That is, the new polynomial contains the monomial vvar^d,
1325
+ where d is the degree of f. @*
1326
+ If already f is distinguished w.r.t. vvar, then f is left unchanged
1327
+ and the re-transformation is the identity.
1328
+ NOTE 1: (this proc correctly works independent of the term ordering.)
1329
+ to apply the reverse transformation, either define a map
1330
+ or use substitute (to be loaded from poly.lib).
1331
+ NOTE 2: If p=char(basering) > 0, then there exist polynomials of degree d>=p,
1332
+ e.g. @math{(p-1)x^p y + xy^p}, that cannot be transformed to a
1333
+ vvar-distinguished polynomial. @*
1334
+ In this case, *p random trials will be made and the proc
1335
+ may leave with an ERROR message.
1336
+ EXAMPLE: example makedistinguished; shows some examples
1337
+ "
1338
+ {
1339
+ def d = basering; // eigentlich ueberfluessig // wg Bug mit example part
1340
+ map phi; // erforderlich
1341
+ ideal Db= maxideal(1);
1342
+ int n,b = nvars(basering),1;
1343
+ intvec v= 0:n;
1344
+ intvec w =v;
1345
+ int varnum = rvar(vvar);
1346
+ w[varnum]=1; // weight vector for deg
1347
+
1348
+ poly g = f;
1349
+ int degg = deg(g);
1350
+
1351
+ int count = 1; // limit the number of trials in char(p) > 0
1352
+ //int count =2*char(basering);
1353
+
1354
+ while(deg(g,w)!=degg and (count-2*char(basering))) // do a transformation
1355
+ {
1356
+ v = randomintvec(n,-b,b,1); // n non-zero entries
1357
+ v[varnum] = 0;
1358
+ phi = d,ideal(matrix(maxideal(1),n,1) + var(varnum)*v); // transformation;
1359
+ g = phi(f);
1360
+ b++; // increase the range for the random values
1361
+ // count--;
1362
+ count++;
1363
+ }
1364
+ if (deg(g,w)!=degg) {
1365
+ ERROR("it could not be transform to a "+string(vvar)+"-distinguished polynomial.");
1366
+ }
1367
+ Db = ideal(matrix(maxideal(1),n,1) - var(varnum)*v); // back transformation
1368
+ return(g,Db);
1369
+ }
1370
+ example
1371
+ { "EXAMPLE:";
1372
+ int randval = system("--random"); // store initial value
1373
+ system("--random",0815);
1374
+ echo = 2;
1375
+
1376
+ ring r = 0,(x,y),dp;
1377
+ poly g;
1378
+ map phi;
1379
+ // -----------------------------------------------------------------------
1380
+ // Example 1:
1381
+ poly f = 3xy4 + 2xy2 + x5y3 + x + y6; // degree 8
1382
+ // make the polynomial y-distinguished
1383
+ g, phi = makedistinguished(f,y);
1384
+ g;
1385
+ phi;
1386
+
1387
+ // to reverse the transformation apply the map
1388
+ f == phi(g);
1389
+
1390
+ // -----------------------------------------------------------------------
1391
+ // Example 2:
1392
+ // The following polynomial is already x-distinguished
1393
+ f = x6+y4+xy;
1394
+ g,phi = makedistinguished(f,x);
1395
+ g; // f is left unchanged
1396
+ phi; // the transformation is the identity.
1397
+ echo = 1;
1398
+
1399
+ system("--random",randval); // reset random generator
1400
+ // -----------------------------------------------------------------------
1401
+ echo = 2;
1402
+ // Example 3: // polynomials which cannot be transformed
1403
+ // If p=char(basering)>0, then (p-1)*x^p*y + x*y^p factorizes completely
1404
+ // in linear factors, since (p-1)*x^p+x equiv 0 on F_p. Hence,
1405
+ // such polynomials cannot be transformed to a distinguished polynomial.
1406
+
1407
+ ring r3 = 3,(x,y),dp;
1408
+ makedistinguished(2x3y+xy3,y);
1409
+ }
1410
+ ///////////////////////////////////////////////////////////////////////////////
1411
+
1412
+ static proc maxdegs(poly f)
1413
+ "USAGE: maxdegs(f); f poly
1414
+ RETURN: list of two intvecs
1415
+ _[1] intvec: degree for variable i, 1<=i<=nvars(basering) @*
1416
+ _[2] intvec: max of _[1], index of first variable with this max degree
1417
+ EXAMPLE: example maxdegs; shows an example
1418
+ "
1419
+ {
1420
+ int i,n;
1421
+ intvec degs,maxdeg;
1422
+ list l;
1423
+
1424
+ n = nvars(basering);
1425
+
1426
+ for (i=1;i<=n;i++)
1427
+ {
1428
+ degs[i] = nrows(coeffs(f,var(i)))-1;
1429
+ if (degs[i] > maxdeg)
1430
+ {
1431
+ maxdeg[1] = degs[i];
1432
+ maxdeg[2] = i;
1433
+ }
1434
+ }
1435
+ return(list(degs,maxdeg));
1436
+ }
1437
+ example
1438
+ { "EXAMPLE:"; echo =2;
1439
+ ring r = 0,(x,y,z),lp;
1440
+ poly f = 3xy4 + 2xy2 + x5y3 + xz6 + y6;
1441
+ maxdegs(f);
1442
+ }
1443
+ ///////////////////////////////////////////////////////////////////////////////
1444
+
1445
+ proc chebyshev(int n,list #)
1446
+ "USAGE: chebyshev(n); n int, n >= 0
1447
+ chebyshev(n,c); n int, n >= 0, c number, c!=0
1448
+ RETURN: poly, the [monic] nth Chebyshev polynomial of the first kind. @*
1449
+ The polynomials are defined in the first variable, say x, of the
1450
+ basering.
1451
+ NOTE: @texinfo
1452
+ The (generalized) Chebyshev polynomials of the first kind can be
1453
+ defined by the recursion:
1454
+ @tex
1455
+ $C_0 = c,\ C_1 = x,\ C_n = 2/c\cdot x\cdot C_{n-1}-C_{n-2},\ n \geq 2,c\neq 0$.
1456
+ @end tex
1457
+ @end texinfo
1458
+ These polynomials commute by composition:
1459
+ @math{C_m \circ C_n = C_n\circ C_m}. @*
1460
+ For c=1, we obtain the standard (non monic) Chebyshev polynomials
1461
+ @math{T_n} which satisfy @math{T_n(x) = \cos(n \cdot \arccos(x))}. @*
1462
+ For c=2 (default), we obtain the monic Chebyshev polynomials @math{P_n}
1463
+ which satisfy the relation @math{P_n(x+ 1/x) = x^n+ 1/x^n}. @*
1464
+ By default the monic Chebyshev polynomials are returned:
1465
+ @math{P_n =}@code{chebyshev(n)} and @math{T_n=}@code{chebyshev(n,1)}.@*
1466
+ It holds @math{P_n(x) = 2\cdot T_n(x/2)} and more generally
1467
+ @math{C_n(c\cdot x) = c\cdot T_n(x)} @*
1468
+ That is @code{subst(chebyshev(n,c),var(1),c*var(1))= c*chebyshev(n,1)}.
1469
+
1470
+ If @code{char(basering) = 2}, then
1471
+ @math{C_0 = 1, C_1 = x, C_2 = 1, C_3 = x}, and so on.
1472
+ EXAMPLE: example chebyshev; shows some examples
1473
+ "
1474
+ {
1475
+ number startv = 2;
1476
+
1477
+ if (size(#)){ startv = #[1]; }
1478
+ if (startv == 0) { startv = 1; }
1479
+
1480
+ poly f0,f1 = startv,var(1);
1481
+ poly fneu,falt = f1,f0;
1482
+ poly fh;
1483
+
1484
+ if (n<=0) {return(f0);}
1485
+ if (n==1) {return(f1);}
1486
+
1487
+ for(int i=2;i<=n;i++)
1488
+ {
1489
+ fh = 2/startv*var(1)*fneu - falt;
1490
+ // fh = 2*var(1)*fneu - falt;
1491
+ falt = fneu;
1492
+ fneu = fh;
1493
+ }
1494
+ return(fh);
1495
+ }
1496
+ example
1497
+ { "EXAMPLE:"; echo = 2;
1498
+ ring r = 0,x,lp;
1499
+
1500
+ // The monic Chebyshev polynomials
1501
+ chebyshev(0);
1502
+ chebyshev(1);
1503
+ chebyshev(2);
1504
+ chebyshev(3);
1505
+
1506
+ // These polynomials commute
1507
+ compose(chebyshev(2),chebyshev(6)) ==
1508
+ compose(chebyshev(6),chebyshev(2));
1509
+
1510
+ // The standard Chebyshev polynomials
1511
+ chebyshev(0,1);
1512
+ chebyshev(1,1);
1513
+ chebyshev(2,1);
1514
+ chebyshev(3,1);
1515
+ // -----------------------------------------------------------------------
1516
+ // The relation for the various Chebyshev polynomials
1517
+ 5*chebyshev(3,1)==subst(chebyshev(3,5),x,5x);
1518
+ // -----------------------------------------------------------------------
1519
+ // char 2 case
1520
+ ring r2 = 2,x,dp;
1521
+ chebyshev(2);
1522
+ chebyshev(3);
1523
+ }
1524
+ ///////////////////////////////////////////////////////////////////////////////
1525
+
1526
+ /*
1527
+
1528
+ // Examples for decomp.lib
1529
+
1530
+ ring r02 = 0,(x,y),dp;
1531
+
1532
+ decompose(compose(x6,chebyshev(4),x2+y3+x5y7),1);
1533
+
1534
+ int MINS = 0;
1535
+ decompose((xy+1)^7);
1536
+ //_[1]=x7
1537
+ //_[2]=xy+1
1538
+
1539
+ decompose((x2y3+1)^7);
1540
+ //_[1]=y7
1541
+ //_[2]=x2y3+1
1542
+
1543
+ MINS = 1;
1544
+ ring r01 = 0,x,dp;
1545
+ decompose((x+1)^7);
1546
+ //x7+7x6+21x5+35x4+35x3+21x2+7x+1
1547
+
1548
+ decompunivmonic((x+1)^7,7);
1549
+ //_[1]=x7
1550
+ //_[2]=x+1
1551
+
1552
+ int MINS =1;
1553
+ decompunivmonic((x+1)^7,7);
1554
+ //_[1]=x7+7x6+21x5+35x4+35x3+21x2+7x+1
1555
+ //_[2]=x
1556
+
1557
+ // -- Example -------------
1558
+
1559
+ // Comparison Kozen-Landau vs. von zur Gathen
1560
+
1561
+ ring r02 = 0,(x,y),dp;
1562
+
1563
+ // printlevel = 5;
1564
+
1565
+ decompopts("reset");
1566
+
1567
+ poly F = compose(x6,chebyshev(4)+3,8x2+y3+7x5y7+2);
1568
+ deg(F);
1569
+
1570
+ timer = 1;decompose(F,1);timer;
1571
+
1572
+ int MINS = 1;
1573
+ timer = 1;decompose(F,1);timer;
1574
+ int IMPROVE =0;
1575
+ timer = 1;decompose(F,1);timer;
1576
+
1577
+ decompopts("reset");
1578
+ int DECMETH = 0; // von zur Gathen
1579
+
1580
+ timer = 1;decompose(F,1);timer;
1581
+
1582
+ decompopts("reset");
1583
+
1584
+ // -- Example -------------
1585
+
1586
+ ring rZ10 = (integer,10),x,dp;
1587
+ chebyshev(2);
1588
+ //x2+8
1589
+ chebyshev(3);
1590
+ //x3+7x
1591
+
1592
+ compose(chebyshev(2),chebyshev(3));
1593
+ //x6+4x4+9x2+8
1594
+ decompose(_);
1595
+ int MINS =1;
1596
+ decompose(compose(chebyshev(2),chebyshev(3)));
1597
+ compose(_);
1598
+
1599
+ decompopts("reset");
1600
+
1601
+ // -- Example -------------
1602
+
1603
+ ring rT =(0,y),x,dp;
1604
+ compose(x2,x3+y,(y+1)*x2);
1605
+ //(y6+6y5+15y4+20y3+15y2+6y+1)*x12+(2y4+6y3+6y2+2y)*x6+(y2)
1606
+
1607
+ decompose(_,1);
1608
+ //_[1]=(y6+6y5+15y4+20y3+15y2+6y+1)*x2
1609
+ //_[2]=x3+(y)/(y3+3y2+3y+1)
1610
+ //_[3]=x2
1611
+
1612
+ int MINS =1;
1613
+ compose(x2,x3+y,(y+1)*x2);
1614
+ //(y6+6y5+15y4+20y3+15y2+6y+1)*x12+(2y4+6y3+6y2+2y)*x6+(y2)
1615
+
1616
+ decompose(_,1);
1617
+ //_[1]=(y6+6y5+15y4+20y3+15y2+6y+1)*x2+(2y4+6y3+6y2+2y)*x+(y2)
1618
+ //_[2]=x3
1619
+ //_[3]=x2
1620
+
1621
+ //ring rt =(0,t),x,dp;
1622
+ //compose(x2+tx+5,x5-2tx3+x);
1623
+ //x10+(-4t)*x8+(4t2+2)*x6+(t)*x5+(-4t)*x4+(-2t2)*x3+x2+(t)*x+5
1624
+
1625
+ decompose(_);
1626
+ //_[1]=x2+(-1/4t2+5)
1627
+ //_[2]=x5+(-2t)*x3+x+(1/2t)
1628
+
1629
+ int IMPROVE = 1;
1630
+ compose(x2+tx+5,x5-2tx3+x);
1631
+ //x10+(-4t)*x8+(4t2+2)*x6+(t)*x5+(-4t)*x4+(-2t2)*x3+x2+(t)*x+5
1632
+
1633
+ decompose(_);
1634
+ //_[1]=x2+(-1/4t2+5)
1635
+ //_[2]=x5+(-2t)*x3+x+(1/2t)
1636
+
1637
+ int IMPROVE = 0;
1638
+ compose(x2+tx+5,x5-2tx3+x);
1639
+ //x10+(-4t)*x8+(4t2+2)*x6+(t)*x5+(-4t)*x4+(-2t2)*x3+x2+(t)*x+5
1640
+ decompose(_);
1641
+ //_[1]=x2+(-1/4t2+5)
1642
+ //_[2]=x5+(-2t)*x3+x+(1/2t)
1643
+
1644
+ int MINS = 1;
1645
+ compose(x2+tx+5,x5-2tx3+x);
1646
+ //x10+(-4t)*x8+(4t2+2)*x6+(t)*x5+(-4t)*x4+(-2t2)*x3+x2+(t)*x+5
1647
+
1648
+ decompose(_);
1649
+ //_[1]=x2+(t)*x+5
1650
+ //_[2]=x5+(-2t)*x3+x
1651
+
1652
+ */
1653
+ ///////////////////////////////////////////////////////////////////////////////
1654
+ // --- End of decomp.lib --------------------------------------------------- //
1655
+ ///////////////////////////////////////////////////////////////////////////////