test_subresultants_qq_zz.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. from sympy.core.symbol import var
  2. from sympy.polys.polytools import (pquo, prem, sturm, subresultants)
  3. from sympy.matrices import Matrix
  4. from sympy.polys.subresultants_qq_zz import (sylvester, res, res_q, res_z, bezout,
  5. subresultants_sylv, modified_subresultants_sylv,
  6. subresultants_bezout, modified_subresultants_bezout,
  7. backward_eye,
  8. sturm_pg, sturm_q, sturm_amv, euclid_pg, euclid_q,
  9. euclid_amv, modified_subresultants_pg, subresultants_pg,
  10. subresultants_amv_q, quo_z, rem_z, subresultants_amv,
  11. modified_subresultants_amv, subresultants_rem,
  12. subresultants_vv, subresultants_vv_2)
  13. def test_sylvester():
  14. x = var('x')
  15. assert sylvester(x**3 -7, 0, x) == sylvester(x**3 -7, 0, x, 1) == Matrix([[0]])
  16. assert sylvester(0, x**3 -7, x) == sylvester(0, x**3 -7, x, 1) == Matrix([[0]])
  17. assert sylvester(x**3 -7, 0, x, 2) == Matrix([[0]])
  18. assert sylvester(0, x**3 -7, x, 2) == Matrix([[0]])
  19. assert sylvester(x**3 -7, 7, x).det() == sylvester(x**3 -7, 7, x, 1).det() == 343
  20. assert sylvester(7, x**3 -7, x).det() == sylvester(7, x**3 -7, x, 1).det() == 343
  21. assert sylvester(x**3 -7, 7, x, 2).det() == -343
  22. assert sylvester(7, x**3 -7, x, 2).det() == 343
  23. assert sylvester(3, 7, x).det() == sylvester(3, 7, x, 1).det() == sylvester(3, 7, x, 2).det() == 1
  24. assert sylvester(3, 0, x).det() == sylvester(3, 0, x, 1).det() == sylvester(3, 0, x, 2).det() == 1
  25. assert sylvester(x - 3, x - 8, x) == sylvester(x - 3, x - 8, x, 1) == sylvester(x - 3, x - 8, x, 2) == Matrix([[1, -3], [1, -8]])
  26. assert sylvester(x**3 - 7*x + 7, 3*x**2 - 7, x) == sylvester(x**3 - 7*x + 7, 3*x**2 - 7, x, 1) == Matrix([[1, 0, -7, 7, 0], [0, 1, 0, -7, 7], [3, 0, -7, 0, 0], [0, 3, 0, -7, 0], [0, 0, 3, 0, -7]])
  27. assert sylvester(x**3 - 7*x + 7, 3*x**2 - 7, x, 2) == Matrix([
  28. [1, 0, -7, 7, 0, 0], [0, 3, 0, -7, 0, 0], [0, 1, 0, -7, 7, 0], [0, 0, 3, 0, -7, 0], [0, 0, 1, 0, -7, 7], [0, 0, 0, 3, 0, -7]])
  29. def test_subresultants_sylv():
  30. x = var('x')
  31. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  32. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  33. assert subresultants_sylv(p, q, x) == subresultants(p, q, x)
  34. assert subresultants_sylv(p, q, x)[-1] == res(p, q, x)
  35. assert subresultants_sylv(p, q, x) != euclid_amv(p, q, x)
  36. amv_factors = [1, 1, -1, 1, -1, 1]
  37. assert subresultants_sylv(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  38. p = x**3 - 7*x + 7
  39. q = 3*x**2 - 7
  40. assert subresultants_sylv(p, q, x) == euclid_amv(p, q, x)
  41. def test_modified_subresultants_sylv():
  42. x = var('x')
  43. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  44. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  45. amv_factors = [1, 1, -1, 1, -1, 1]
  46. assert modified_subresultants_sylv(p, q, x) == [i*j for i, j in zip(amv_factors, subresultants_amv(p, q, x))]
  47. assert modified_subresultants_sylv(p, q, x)[-1] != res_q(p + x**8, q, x)
  48. assert modified_subresultants_sylv(p, q, x) != sturm_amv(p, q, x)
  49. p = x**3 - 7*x + 7
  50. q = 3*x**2 - 7
  51. assert modified_subresultants_sylv(p, q, x) == sturm_amv(p, q, x)
  52. assert modified_subresultants_sylv(-p, q, x) != sturm_amv(-p, q, x)
  53. def test_res():
  54. x = var('x')
  55. assert res(3, 5, x) == 1
  56. def test_res_q():
  57. x = var('x')
  58. assert res_q(3, 5, x) == 1
  59. def test_res_z():
  60. x = var('x')
  61. assert res_z(3, 5, x) == 1
  62. assert res(3, 5, x) == res_q(3, 5, x) == res_z(3, 5, x)
  63. def test_bezout():
  64. x = var('x')
  65. p = -2*x**5+7*x**3+9*x**2-3*x+1
  66. q = -10*x**4+21*x**2+18*x-3
  67. assert bezout(p, q, x, 'bz').det() == sylvester(p, q, x, 2).det()
  68. assert bezout(p, q, x, 'bz').det() != sylvester(p, q, x, 1).det()
  69. assert bezout(p, q, x, 'prs') == backward_eye(5) * bezout(p, q, x, 'bz') * backward_eye(5)
  70. def test_subresultants_bezout():
  71. x = var('x')
  72. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  73. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  74. assert subresultants_bezout(p, q, x) == subresultants(p, q, x)
  75. assert subresultants_bezout(p, q, x)[-1] == sylvester(p, q, x).det()
  76. assert subresultants_bezout(p, q, x) != euclid_amv(p, q, x)
  77. amv_factors = [1, 1, -1, 1, -1, 1]
  78. assert subresultants_bezout(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  79. p = x**3 - 7*x + 7
  80. q = 3*x**2 - 7
  81. assert subresultants_bezout(p, q, x) == euclid_amv(p, q, x)
  82. def test_modified_subresultants_bezout():
  83. x = var('x')
  84. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  85. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  86. amv_factors = [1, 1, -1, 1, -1, 1]
  87. assert modified_subresultants_bezout(p, q, x) == [i*j for i, j in zip(amv_factors, subresultants_amv(p, q, x))]
  88. assert modified_subresultants_bezout(p, q, x)[-1] != sylvester(p + x**8, q, x).det()
  89. assert modified_subresultants_bezout(p, q, x) != sturm_amv(p, q, x)
  90. p = x**3 - 7*x + 7
  91. q = 3*x**2 - 7
  92. assert modified_subresultants_bezout(p, q, x) == sturm_amv(p, q, x)
  93. assert modified_subresultants_bezout(-p, q, x) != sturm_amv(-p, q, x)
  94. def test_sturm_pg():
  95. x = var('x')
  96. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  97. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  98. assert sturm_pg(p, q, x)[-1] != sylvester(p, q, x, 2).det()
  99. sam_factors = [1, 1, -1, -1, 1, 1]
  100. assert sturm_pg(p, q, x) == [i*j for i,j in zip(sam_factors, euclid_pg(p, q, x))]
  101. p = -9*x**5 - 5*x**3 - 9
  102. q = -45*x**4 - 15*x**2
  103. assert sturm_pg(p, q, x, 1)[-1] == sylvester(p, q, x, 1).det()
  104. assert sturm_pg(p, q, x)[-1] != sylvester(p, q, x, 2).det()
  105. assert sturm_pg(-p, q, x)[-1] == sylvester(-p, q, x, 2).det()
  106. assert sturm_pg(-p, q, x) == modified_subresultants_pg(-p, q, x)
  107. def test_sturm_q():
  108. x = var('x')
  109. p = x**3 - 7*x + 7
  110. q = 3*x**2 - 7
  111. assert sturm_q(p, q, x) == sturm(p)
  112. assert sturm_q(-p, -q, x) != sturm(-p)
  113. def test_sturm_amv():
  114. x = var('x')
  115. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  116. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  117. assert sturm_amv(p, q, x)[-1] != sylvester(p, q, x, 2).det()
  118. sam_factors = [1, 1, -1, -1, 1, 1]
  119. assert sturm_amv(p, q, x) == [i*j for i,j in zip(sam_factors, euclid_amv(p, q, x))]
  120. p = -9*x**5 - 5*x**3 - 9
  121. q = -45*x**4 - 15*x**2
  122. assert sturm_amv(p, q, x, 1)[-1] == sylvester(p, q, x, 1).det()
  123. assert sturm_amv(p, q, x)[-1] != sylvester(p, q, x, 2).det()
  124. assert sturm_amv(-p, q, x)[-1] == sylvester(-p, q, x, 2).det()
  125. assert sturm_pg(-p, q, x) == modified_subresultants_pg(-p, q, x)
  126. def test_euclid_pg():
  127. x = var('x')
  128. p = x**6+x**5-x**4-x**3+x**2-x+1
  129. q = 6*x**5+5*x**4-4*x**3-3*x**2+2*x-1
  130. assert euclid_pg(p, q, x)[-1] == sylvester(p, q, x).det()
  131. assert euclid_pg(p, q, x) == subresultants_pg(p, q, x)
  132. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  133. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  134. assert euclid_pg(p, q, x)[-1] != sylvester(p, q, x, 2).det()
  135. sam_factors = [1, 1, -1, -1, 1, 1]
  136. assert euclid_pg(p, q, x) == [i*j for i,j in zip(sam_factors, sturm_pg(p, q, x))]
  137. def test_euclid_q():
  138. x = var('x')
  139. p = x**3 - 7*x + 7
  140. q = 3*x**2 - 7
  141. assert euclid_q(p, q, x)[-1] == -sturm(p)[-1]
  142. def test_euclid_amv():
  143. x = var('x')
  144. p = x**3 - 7*x + 7
  145. q = 3*x**2 - 7
  146. assert euclid_amv(p, q, x)[-1] == sylvester(p, q, x).det()
  147. assert euclid_amv(p, q, x) == subresultants_amv(p, q, x)
  148. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  149. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  150. assert euclid_amv(p, q, x)[-1] != sylvester(p, q, x, 2).det()
  151. sam_factors = [1, 1, -1, -1, 1, 1]
  152. assert euclid_amv(p, q, x) == [i*j for i,j in zip(sam_factors, sturm_amv(p, q, x))]
  153. def test_modified_subresultants_pg():
  154. x = var('x')
  155. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  156. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  157. amv_factors = [1, 1, -1, 1, -1, 1]
  158. assert modified_subresultants_pg(p, q, x) == [i*j for i, j in zip(amv_factors, subresultants_pg(p, q, x))]
  159. assert modified_subresultants_pg(p, q, x)[-1] != sylvester(p + x**8, q, x).det()
  160. assert modified_subresultants_pg(p, q, x) != sturm_pg(p, q, x)
  161. p = x**3 - 7*x + 7
  162. q = 3*x**2 - 7
  163. assert modified_subresultants_pg(p, q, x) == sturm_pg(p, q, x)
  164. assert modified_subresultants_pg(-p, q, x) != sturm_pg(-p, q, x)
  165. def test_subresultants_pg():
  166. x = var('x')
  167. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  168. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  169. assert subresultants_pg(p, q, x) == subresultants(p, q, x)
  170. assert subresultants_pg(p, q, x)[-1] == sylvester(p, q, x).det()
  171. assert subresultants_pg(p, q, x) != euclid_pg(p, q, x)
  172. amv_factors = [1, 1, -1, 1, -1, 1]
  173. assert subresultants_pg(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  174. p = x**3 - 7*x + 7
  175. q = 3*x**2 - 7
  176. assert subresultants_pg(p, q, x) == euclid_pg(p, q, x)
  177. def test_subresultants_amv_q():
  178. x = var('x')
  179. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  180. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  181. assert subresultants_amv_q(p, q, x) == subresultants(p, q, x)
  182. assert subresultants_amv_q(p, q, x)[-1] == sylvester(p, q, x).det()
  183. assert subresultants_amv_q(p, q, x) != euclid_amv(p, q, x)
  184. amv_factors = [1, 1, -1, 1, -1, 1]
  185. assert subresultants_amv_q(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  186. p = x**3 - 7*x + 7
  187. q = 3*x**2 - 7
  188. assert subresultants_amv(p, q, x) == euclid_amv(p, q, x)
  189. def test_rem_z():
  190. x = var('x')
  191. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  192. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  193. assert rem_z(p, -q, x) != prem(p, -q, x)
  194. def test_quo_z():
  195. x = var('x')
  196. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  197. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  198. assert quo_z(p, -q, x) != pquo(p, -q, x)
  199. y = var('y')
  200. q = 3*x**6 + 5*y**4 - 4*x**2 - 9*x + 21
  201. assert quo_z(p, -q, x) == pquo(p, -q, x)
  202. def test_subresultants_amv():
  203. x = var('x')
  204. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  205. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  206. assert subresultants_amv(p, q, x) == subresultants(p, q, x)
  207. assert subresultants_amv(p, q, x)[-1] == sylvester(p, q, x).det()
  208. assert subresultants_amv(p, q, x) != euclid_amv(p, q, x)
  209. amv_factors = [1, 1, -1, 1, -1, 1]
  210. assert subresultants_amv(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  211. p = x**3 - 7*x + 7
  212. q = 3*x**2 - 7
  213. assert subresultants_amv(p, q, x) == euclid_amv(p, q, x)
  214. def test_modified_subresultants_amv():
  215. x = var('x')
  216. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  217. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  218. amv_factors = [1, 1, -1, 1, -1, 1]
  219. assert modified_subresultants_amv(p, q, x) == [i*j for i, j in zip(amv_factors, subresultants_amv(p, q, x))]
  220. assert modified_subresultants_amv(p, q, x)[-1] != sylvester(p + x**8, q, x).det()
  221. assert modified_subresultants_amv(p, q, x) != sturm_amv(p, q, x)
  222. p = x**3 - 7*x + 7
  223. q = 3*x**2 - 7
  224. assert modified_subresultants_amv(p, q, x) == sturm_amv(p, q, x)
  225. assert modified_subresultants_amv(-p, q, x) != sturm_amv(-p, q, x)
  226. def test_subresultants_rem():
  227. x = var('x')
  228. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  229. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  230. assert subresultants_rem(p, q, x) == subresultants(p, q, x)
  231. assert subresultants_rem(p, q, x)[-1] == sylvester(p, q, x).det()
  232. assert subresultants_rem(p, q, x) != euclid_amv(p, q, x)
  233. amv_factors = [1, 1, -1, 1, -1, 1]
  234. assert subresultants_rem(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  235. p = x**3 - 7*x + 7
  236. q = 3*x**2 - 7
  237. assert subresultants_rem(p, q, x) == euclid_amv(p, q, x)
  238. def test_subresultants_vv():
  239. x = var('x')
  240. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  241. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  242. assert subresultants_vv(p, q, x) == subresultants(p, q, x)
  243. assert subresultants_vv(p, q, x)[-1] == sylvester(p, q, x).det()
  244. assert subresultants_vv(p, q, x) != euclid_amv(p, q, x)
  245. amv_factors = [1, 1, -1, 1, -1, 1]
  246. assert subresultants_vv(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  247. p = x**3 - 7*x + 7
  248. q = 3*x**2 - 7
  249. assert subresultants_vv(p, q, x) == euclid_amv(p, q, x)
  250. def test_subresultants_vv_2():
  251. x = var('x')
  252. p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  253. q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  254. assert subresultants_vv_2(p, q, x) == subresultants(p, q, x)
  255. assert subresultants_vv_2(p, q, x)[-1] == sylvester(p, q, x).det()
  256. assert subresultants_vv_2(p, q, x) != euclid_amv(p, q, x)
  257. amv_factors = [1, 1, -1, 1, -1, 1]
  258. assert subresultants_vv_2(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))]
  259. p = x**3 - 7*x + 7
  260. q = 3*x**2 - 7
  261. assert subresultants_vv_2(p, q, x) == euclid_amv(p, q, x)