图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

347 lines
13 KiB

  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)