test_euclidtools.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. """Tests for Euclidean algorithms, GCDs, LCMs and polynomial remainder sequences. """
  2. from sympy.polys.rings import ring
  3. from sympy.polys.domains import ZZ, QQ, RR
  4. from sympy.polys.specialpolys import (
  5. f_polys,
  6. dmp_fateman_poly_F_1,
  7. dmp_fateman_poly_F_2,
  8. dmp_fateman_poly_F_3)
  9. f_0, f_1, f_2, f_3, f_4, f_5, f_6 = f_polys()
  10. def test_dup_gcdex():
  11. R, x = ring("x", QQ)
  12. f = x**4 - 2*x**3 - 6*x**2 + 12*x + 15
  13. g = x**3 + x**2 - 4*x - 4
  14. s = -QQ(1,5)*x + QQ(3,5)
  15. t = QQ(1,5)*x**2 - QQ(6,5)*x + 2
  16. h = x + 1
  17. assert R.dup_half_gcdex(f, g) == (s, h)
  18. assert R.dup_gcdex(f, g) == (s, t, h)
  19. f = x**4 + 4*x**3 - x + 1
  20. g = x**3 - x + 1
  21. s, t, h = R.dup_gcdex(f, g)
  22. S, T, H = R.dup_gcdex(g, f)
  23. assert R.dup_add(R.dup_mul(s, f),
  24. R.dup_mul(t, g)) == h
  25. assert R.dup_add(R.dup_mul(S, g),
  26. R.dup_mul(T, f)) == H
  27. f = 2*x
  28. g = x**2 - 16
  29. s = QQ(1,32)*x
  30. t = -QQ(1,16)
  31. h = 1
  32. assert R.dup_half_gcdex(f, g) == (s, h)
  33. assert R.dup_gcdex(f, g) == (s, t, h)
  34. def test_dup_invert():
  35. R, x = ring("x", QQ)
  36. assert R.dup_invert(2*x, x**2 - 16) == QQ(1,32)*x
  37. def test_dup_euclidean_prs():
  38. R, x = ring("x", QQ)
  39. f = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  40. g = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  41. assert R.dup_euclidean_prs(f, g) == [
  42. f,
  43. g,
  44. -QQ(5,9)*x**4 + QQ(1,9)*x**2 - QQ(1,3),
  45. -QQ(117,25)*x**2 - 9*x + QQ(441,25),
  46. QQ(233150,19773)*x - QQ(102500,6591),
  47. -QQ(1288744821,543589225)]
  48. def test_dup_primitive_prs():
  49. R, x = ring("x", ZZ)
  50. f = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  51. g = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  52. assert R.dup_primitive_prs(f, g) == [
  53. f,
  54. g,
  55. -5*x**4 + x**2 - 3,
  56. 13*x**2 + 25*x - 49,
  57. 4663*x - 6150,
  58. 1]
  59. def test_dup_subresultants():
  60. R, x = ring("x", ZZ)
  61. assert R.dup_resultant(0, 0) == 0
  62. assert R.dup_resultant(1, 0) == 0
  63. assert R.dup_resultant(0, 1) == 0
  64. f = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  65. g = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  66. a = 15*x**4 - 3*x**2 + 9
  67. b = 65*x**2 + 125*x - 245
  68. c = 9326*x - 12300
  69. d = 260708
  70. assert R.dup_subresultants(f, g) == [f, g, a, b, c, d]
  71. assert R.dup_resultant(f, g) == R.dup_LC(d)
  72. f = x**2 - 2*x + 1
  73. g = x**2 - 1
  74. a = 2*x - 2
  75. assert R.dup_subresultants(f, g) == [f, g, a]
  76. assert R.dup_resultant(f, g) == 0
  77. f = x**2 + 1
  78. g = x**2 - 1
  79. a = -2
  80. assert R.dup_subresultants(f, g) == [f, g, a]
  81. assert R.dup_resultant(f, g) == 4
  82. f = x**2 - 1
  83. g = x**3 - x**2 + 2
  84. assert R.dup_resultant(f, g) == 0
  85. f = 3*x**3 - x
  86. g = 5*x**2 + 1
  87. assert R.dup_resultant(f, g) == 64
  88. f = x**2 - 2*x + 7
  89. g = x**3 - x + 5
  90. assert R.dup_resultant(f, g) == 265
  91. f = x**3 - 6*x**2 + 11*x - 6
  92. g = x**3 - 15*x**2 + 74*x - 120
  93. assert R.dup_resultant(f, g) == -8640
  94. f = x**3 - 6*x**2 + 11*x - 6
  95. g = x**3 - 10*x**2 + 29*x - 20
  96. assert R.dup_resultant(f, g) == 0
  97. f = x**3 - 1
  98. g = x**3 + 2*x**2 + 2*x - 1
  99. assert R.dup_resultant(f, g) == 16
  100. f = x**8 - 2
  101. g = x - 1
  102. assert R.dup_resultant(f, g) == -1
  103. def test_dmp_subresultants():
  104. R, x, y = ring("x,y", ZZ)
  105. assert R.dmp_resultant(0, 0) == 0
  106. assert R.dmp_prs_resultant(0, 0)[0] == 0
  107. assert R.dmp_zz_collins_resultant(0, 0) == 0
  108. assert R.dmp_qq_collins_resultant(0, 0) == 0
  109. assert R.dmp_resultant(1, 0) == 0
  110. assert R.dmp_resultant(1, 0) == 0
  111. assert R.dmp_resultant(1, 0) == 0
  112. assert R.dmp_resultant(0, 1) == 0
  113. assert R.dmp_prs_resultant(0, 1)[0] == 0
  114. assert R.dmp_zz_collins_resultant(0, 1) == 0
  115. assert R.dmp_qq_collins_resultant(0, 1) == 0
  116. f = 3*x**2*y - y**3 - 4
  117. g = x**2 + x*y**3 - 9
  118. a = 3*x*y**4 + y**3 - 27*y + 4
  119. b = -3*y**10 - 12*y**7 + y**6 - 54*y**4 + 8*y**3 + 729*y**2 - 216*y + 16
  120. r = R.dmp_LC(b)
  121. assert R.dmp_subresultants(f, g) == [f, g, a, b]
  122. assert R.dmp_resultant(f, g) == r
  123. assert R.dmp_prs_resultant(f, g)[0] == r
  124. assert R.dmp_zz_collins_resultant(f, g) == r
  125. assert R.dmp_qq_collins_resultant(f, g) == r
  126. f = -x**3 + 5
  127. g = 3*x**2*y + x**2
  128. a = 45*y**2 + 30*y + 5
  129. b = 675*y**3 + 675*y**2 + 225*y + 25
  130. r = R.dmp_LC(b)
  131. assert R.dmp_subresultants(f, g) == [f, g, a]
  132. assert R.dmp_resultant(f, g) == r
  133. assert R.dmp_prs_resultant(f, g)[0] == r
  134. assert R.dmp_zz_collins_resultant(f, g) == r
  135. assert R.dmp_qq_collins_resultant(f, g) == r
  136. R, x, y, z, u, v = ring("x,y,z,u,v", ZZ)
  137. f = 6*x**2 - 3*x*y - 2*x*z + y*z
  138. g = x**2 - x*u - x*v + u*v
  139. r = y**2*z**2 - 3*y**2*z*u - 3*y**2*z*v + 9*y**2*u*v - 2*y*z**2*u \
  140. - 2*y*z**2*v + 6*y*z*u**2 + 12*y*z*u*v + 6*y*z*v**2 - 18*y*u**2*v \
  141. - 18*y*u*v**2 + 4*z**2*u*v - 12*z*u**2*v - 12*z*u*v**2 + 36*u**2*v**2
  142. assert R.dmp_zz_collins_resultant(f, g) == r.drop(x)
  143. R, x, y, z, u, v = ring("x,y,z,u,v", QQ)
  144. f = x**2 - QQ(1,2)*x*y - QQ(1,3)*x*z + QQ(1,6)*y*z
  145. g = x**2 - x*u - x*v + u*v
  146. r = QQ(1,36)*y**2*z**2 - QQ(1,12)*y**2*z*u - QQ(1,12)*y**2*z*v + QQ(1,4)*y**2*u*v \
  147. - QQ(1,18)*y*z**2*u - QQ(1,18)*y*z**2*v + QQ(1,6)*y*z*u**2 + QQ(1,3)*y*z*u*v \
  148. + QQ(1,6)*y*z*v**2 - QQ(1,2)*y*u**2*v - QQ(1,2)*y*u*v**2 + QQ(1,9)*z**2*u*v \
  149. - QQ(1,3)*z*u**2*v - QQ(1,3)*z*u*v**2 + u**2*v**2
  150. assert R.dmp_qq_collins_resultant(f, g) == r.drop(x)
  151. Rt, t = ring("t", ZZ)
  152. Rx, x = ring("x", Rt)
  153. f = x**6 - 5*x**4 + 5*x**2 + 4
  154. g = -6*t*x**5 + x**4 + 20*t*x**3 - 3*x**2 - 10*t*x + 6
  155. assert Rx.dup_resultant(f, g) == 2930944*t**6 + 2198208*t**4 + 549552*t**2 + 45796
  156. def test_dup_discriminant():
  157. R, x = ring("x", ZZ)
  158. assert R.dup_discriminant(0) == 0
  159. assert R.dup_discriminant(x) == 1
  160. assert R.dup_discriminant(x**3 + 3*x**2 + 9*x - 13) == -11664
  161. assert R.dup_discriminant(5*x**5 + x**3 + 2) == 31252160
  162. assert R.dup_discriminant(x**4 + 2*x**3 + 6*x**2 - 22*x + 13) == 0
  163. assert R.dup_discriminant(12*x**7 + 15*x**4 + 30*x**3 + x**2 + 1) == -220289699947514112
  164. def test_dmp_discriminant():
  165. R, x = ring("x", ZZ)
  166. assert R.dmp_discriminant(0) == 0
  167. R, x, y = ring("x,y", ZZ)
  168. assert R.dmp_discriminant(0) == 0
  169. assert R.dmp_discriminant(y) == 0
  170. assert R.dmp_discriminant(x**3 + 3*x**2 + 9*x - 13) == -11664
  171. assert R.dmp_discriminant(5*x**5 + x**3 + 2) == 31252160
  172. assert R.dmp_discriminant(x**4 + 2*x**3 + 6*x**2 - 22*x + 13) == 0
  173. assert R.dmp_discriminant(12*x**7 + 15*x**4 + 30*x**3 + x**2 + 1) == -220289699947514112
  174. assert R.dmp_discriminant(x**2*y + 2*y) == (-8*y**2).drop(x)
  175. assert R.dmp_discriminant(x*y**2 + 2*x) == 1
  176. R, x, y, z = ring("x,y,z", ZZ)
  177. assert R.dmp_discriminant(x*y + z) == 1
  178. R, x, y, z, u = ring("x,y,z,u", ZZ)
  179. assert R.dmp_discriminant(x**2*y + x*z + u) == (-4*y*u + z**2).drop(x)
  180. R, x, y, z, u, v = ring("x,y,z,u,v", ZZ)
  181. assert R.dmp_discriminant(x**3*y + x**2*z + x*u + v) == \
  182. (-27*y**2*v**2 + 18*y*z*u*v - 4*y*u**3 - 4*z**3*v + z**2*u**2).drop(x)
  183. def test_dup_gcd():
  184. R, x = ring("x", ZZ)
  185. f, g = 0, 0
  186. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (0, 0, 0)
  187. f, g = 2, 0
  188. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, 1, 0)
  189. f, g = -2, 0
  190. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, -1, 0)
  191. f, g = 0, -2
  192. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, 0, -1)
  193. f, g = 0, 2*x + 4
  194. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2*x + 4, 0, 1)
  195. f, g = 2*x + 4, 0
  196. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2*x + 4, 1, 0)
  197. f, g = 2, 2
  198. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, 1, 1)
  199. f, g = -2, 2
  200. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, -1, 1)
  201. f, g = 2, -2
  202. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, 1, -1)
  203. f, g = -2, -2
  204. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, -1, -1)
  205. f, g = x**2 + 2*x + 1, 1
  206. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (1, x**2 + 2*x + 1, 1)
  207. f, g = x**2 + 2*x + 1, 2
  208. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (1, x**2 + 2*x + 1, 2)
  209. f, g = 2*x**2 + 4*x + 2, 2
  210. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, x**2 + 2*x + 1, 1)
  211. f, g = 2, 2*x**2 + 4*x + 2
  212. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (2, 1, x**2 + 2*x + 1)
  213. f, g = 2*x**2 + 4*x + 2, x + 1
  214. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (x + 1, 2*x + 2, 1)
  215. f, g = x + 1, 2*x**2 + 4*x + 2
  216. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (x + 1, 1, 2*x + 2)
  217. f, g = x - 31, x
  218. assert R.dup_zz_heu_gcd(f, g) == R.dup_rr_prs_gcd(f, g) == (1, f, g)
  219. f = x**4 + 8*x**3 + 21*x**2 + 22*x + 8
  220. g = x**3 + 6*x**2 + 11*x + 6
  221. h = x**2 + 3*x + 2
  222. cff = x**2 + 5*x + 4
  223. cfg = x + 3
  224. assert R.dup_zz_heu_gcd(f, g) == (h, cff, cfg)
  225. assert R.dup_rr_prs_gcd(f, g) == (h, cff, cfg)
  226. f = x**4 - 4
  227. g = x**4 + 4*x**2 + 4
  228. h = x**2 + 2
  229. cff = x**2 - 2
  230. cfg = x**2 + 2
  231. assert R.dup_zz_heu_gcd(f, g) == (h, cff, cfg)
  232. assert R.dup_rr_prs_gcd(f, g) == (h, cff, cfg)
  233. f = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  234. g = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  235. h = 1
  236. cff = f
  237. cfg = g
  238. assert R.dup_zz_heu_gcd(f, g) == (h, cff, cfg)
  239. assert R.dup_rr_prs_gcd(f, g) == (h, cff, cfg)
  240. R, x = ring("x", QQ)
  241. f = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5
  242. g = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21
  243. h = 1
  244. cff = f
  245. cfg = g
  246. assert R.dup_qq_heu_gcd(f, g) == (h, cff, cfg)
  247. assert R.dup_ff_prs_gcd(f, g) == (h, cff, cfg)
  248. R, x = ring("x", ZZ)
  249. f = - 352518131239247345597970242177235495263669787845475025293906825864749649589178600387510272*x**49 \
  250. + 46818041807522713962450042363465092040687472354933295397472942006618953623327997952*x**42 \
  251. + 378182690892293941192071663536490788434899030680411695933646320291525827756032*x**35 \
  252. + 112806468807371824947796775491032386836656074179286744191026149539708928*x**28 \
  253. - 12278371209708240950316872681744825481125965781519138077173235712*x**21 \
  254. + 289127344604779611146960547954288113529690984687482920704*x**14 \
  255. + 19007977035740498977629742919480623972236450681*x**7 \
  256. + 311973482284542371301330321821976049
  257. g = 365431878023781158602430064717380211405897160759702125019136*x**21 \
  258. + 197599133478719444145775798221171663643171734081650688*x**14 \
  259. - 9504116979659010018253915765478924103928886144*x**7 \
  260. - 311973482284542371301330321821976049
  261. assert R.dup_zz_heu_gcd(f, R.dup_diff(f, 1))[0] == g
  262. assert R.dup_rr_prs_gcd(f, R.dup_diff(f, 1))[0] == g
  263. R, x = ring("x", QQ)
  264. f = QQ(1,2)*x**2 + x + QQ(1,2)
  265. g = QQ(1,2)*x + QQ(1,2)
  266. h = x + 1
  267. assert R.dup_qq_heu_gcd(f, g) == (h, g, QQ(1,2))
  268. assert R.dup_ff_prs_gcd(f, g) == (h, g, QQ(1,2))
  269. R, x = ring("x", ZZ)
  270. f = 1317378933230047068160*x + 2945748836994210856960
  271. g = 120352542776360960*x + 269116466014453760
  272. h = 120352542776360960*x + 269116466014453760
  273. cff = 10946
  274. cfg = 1
  275. assert R.dup_zz_heu_gcd(f, g) == (h, cff, cfg)
  276. def test_dmp_gcd():
  277. R, x, y = ring("x,y", ZZ)
  278. f, g = 0, 0
  279. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (0, 0, 0)
  280. f, g = 2, 0
  281. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, 1, 0)
  282. f, g = -2, 0
  283. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, -1, 0)
  284. f, g = 0, -2
  285. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, 0, -1)
  286. f, g = 0, 2*x + 4
  287. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2*x + 4, 0, 1)
  288. f, g = 2*x + 4, 0
  289. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2*x + 4, 1, 0)
  290. f, g = 2, 2
  291. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, 1, 1)
  292. f, g = -2, 2
  293. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, -1, 1)
  294. f, g = 2, -2
  295. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, 1, -1)
  296. f, g = -2, -2
  297. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, -1, -1)
  298. f, g = x**2 + 2*x + 1, 1
  299. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (1, x**2 + 2*x + 1, 1)
  300. f, g = x**2 + 2*x + 1, 2
  301. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (1, x**2 + 2*x + 1, 2)
  302. f, g = 2*x**2 + 4*x + 2, 2
  303. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, x**2 + 2*x + 1, 1)
  304. f, g = 2, 2*x**2 + 4*x + 2
  305. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (2, 1, x**2 + 2*x + 1)
  306. f, g = 2*x**2 + 4*x + 2, x + 1
  307. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (x + 1, 2*x + 2, 1)
  308. f, g = x + 1, 2*x**2 + 4*x + 2
  309. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (x + 1, 1, 2*x + 2)
  310. R, x, y, z, u = ring("x,y,z,u", ZZ)
  311. f, g = u**2 + 2*u + 1, 2*u + 2
  312. assert R.dmp_zz_heu_gcd(f, g) == R.dmp_rr_prs_gcd(f, g) == (u + 1, u + 1, 2)
  313. f, g = z**2*u**2 + 2*z**2*u + z**2 + z*u + z, u**2 + 2*u + 1
  314. h, cff, cfg = u + 1, z**2*u + z**2 + z, u + 1
  315. assert R.dmp_zz_heu_gcd(f, g) == (h, cff, cfg)
  316. assert R.dmp_rr_prs_gcd(f, g) == (h, cff, cfg)
  317. assert R.dmp_zz_heu_gcd(g, f) == (h, cfg, cff)
  318. assert R.dmp_rr_prs_gcd(g, f) == (h, cfg, cff)
  319. R, x, y, z = ring("x,y,z", ZZ)
  320. f, g, h = map(R.from_dense, dmp_fateman_poly_F_1(2, ZZ))
  321. H, cff, cfg = R.dmp_zz_heu_gcd(f, g)
  322. assert H == h and R.dmp_mul(H, cff) == f \
  323. and R.dmp_mul(H, cfg) == g
  324. H, cff, cfg = R.dmp_rr_prs_gcd(f, g)
  325. assert H == h and R.dmp_mul(H, cff) == f \
  326. and R.dmp_mul(H, cfg) == g
  327. R, x, y, z, u, v = ring("x,y,z,u,v", ZZ)
  328. f, g, h = map(R.from_dense, dmp_fateman_poly_F_1(4, ZZ))
  329. H, cff, cfg = R.dmp_zz_heu_gcd(f, g)
  330. assert H == h and R.dmp_mul(H, cff) == f \
  331. and R.dmp_mul(H, cfg) == g
  332. R, x, y, z, u, v, a, b = ring("x,y,z,u,v,a,b", ZZ)
  333. f, g, h = map(R.from_dense, dmp_fateman_poly_F_1(6, ZZ))
  334. H, cff, cfg = R.dmp_zz_heu_gcd(f, g)
  335. assert H == h and R.dmp_mul(H, cff) == f \
  336. and R.dmp_mul(H, cfg) == g
  337. R, x, y, z, u, v, a, b, c, d = ring("x,y,z,u,v,a,b,c,d", ZZ)
  338. f, g, h = map(R.from_dense, dmp_fateman_poly_F_1(8, ZZ))
  339. H, cff, cfg = R.dmp_zz_heu_gcd(f, g)
  340. assert H == h and R.dmp_mul(H, cff) == f \
  341. and R.dmp_mul(H, cfg) == g
  342. R, x, y, z = ring("x,y,z", ZZ)
  343. f, g, h = map(R.from_dense, dmp_fateman_poly_F_2(2, ZZ))
  344. H, cff, cfg = R.dmp_zz_heu_gcd(f, g)
  345. assert H == h and R.dmp_mul(H, cff) == f \
  346. and R.dmp_mul(H, cfg) == g
  347. H, cff, cfg = R.dmp_rr_prs_gcd(f, g)
  348. assert H == h and R.dmp_mul(H, cff) == f \
  349. and R.dmp_mul(H, cfg) == g
  350. f, g, h = map(R.from_dense, dmp_fateman_poly_F_3(2, ZZ))
  351. H, cff, cfg = R.dmp_zz_heu_gcd(f, g)
  352. assert H == h and R.dmp_mul(H, cff) == f \
  353. and R.dmp_mul(H, cfg) == g
  354. H, cff, cfg = R.dmp_rr_prs_gcd(f, g)
  355. assert H == h and R.dmp_mul(H, cff) == f \
  356. and R.dmp_mul(H, cfg) == g
  357. R, x, y, z, u, v = ring("x,y,z,u,v", ZZ)
  358. f, g, h = map(R.from_dense, dmp_fateman_poly_F_3(4, ZZ))
  359. H, cff, cfg = R.dmp_inner_gcd(f, g)
  360. assert H == h and R.dmp_mul(H, cff) == f \
  361. and R.dmp_mul(H, cfg) == g
  362. R, x, y = ring("x,y", QQ)
  363. f = QQ(1,2)*x**2 + x + QQ(1,2)
  364. g = QQ(1,2)*x + QQ(1,2)
  365. h = x + 1
  366. assert R.dmp_qq_heu_gcd(f, g) == (h, g, QQ(1,2))
  367. assert R.dmp_ff_prs_gcd(f, g) == (h, g, QQ(1,2))
  368. R, x, y = ring("x,y", RR)
  369. f = 2.1*x*y**2 - 2.2*x*y + 2.1*x
  370. g = 1.0*x**3
  371. assert R.dmp_ff_prs_gcd(f, g) == \
  372. (1.0*x, 2.1*y**2 - 2.2*y + 2.1, 1.0*x**2)
  373. def test_dup_lcm():
  374. R, x = ring("x", ZZ)
  375. assert R.dup_lcm(2, 6) == 6
  376. assert R.dup_lcm(2*x**3, 6*x) == 6*x**3
  377. assert R.dup_lcm(2*x**3, 3*x) == 6*x**3
  378. assert R.dup_lcm(x**2 + x, x) == x**2 + x
  379. assert R.dup_lcm(x**2 + x, 2*x) == 2*x**2 + 2*x
  380. assert R.dup_lcm(x**2 + 2*x, x) == x**2 + 2*x
  381. assert R.dup_lcm(2*x**2 + x, x) == 2*x**2 + x
  382. assert R.dup_lcm(2*x**2 + x, 2*x) == 4*x**2 + 2*x
  383. def test_dmp_lcm():
  384. R, x, y = ring("x,y", ZZ)
  385. assert R.dmp_lcm(2, 6) == 6
  386. assert R.dmp_lcm(x, y) == x*y
  387. assert R.dmp_lcm(2*x**3, 6*x*y**2) == 6*x**3*y**2
  388. assert R.dmp_lcm(2*x**3, 3*x*y**2) == 6*x**3*y**2
  389. assert R.dmp_lcm(x**2*y, x*y**2) == x**2*y**2
  390. f = 2*x*y**5 - 3*x*y**4 - 2*x*y**3 + 3*x*y**2
  391. g = y**5 - 2*y**3 + y
  392. h = 2*x*y**7 - 3*x*y**6 - 4*x*y**5 + 6*x*y**4 + 2*x*y**3 - 3*x*y**2
  393. assert R.dmp_lcm(f, g) == h
  394. f = x**3 - 3*x**2*y - 9*x*y**2 - 5*y**3
  395. g = x**4 + 6*x**3*y + 12*x**2*y**2 + 10*x*y**3 + 3*y**4
  396. h = x**5 + x**4*y - 18*x**3*y**2 - 50*x**2*y**3 - 47*x*y**4 - 15*y**5
  397. assert R.dmp_lcm(f, g) == h
  398. def test_dmp_content():
  399. R, x,y = ring("x,y", ZZ)
  400. assert R.dmp_content(-2) == 2
  401. f, g, F = 3*y**2 + 2*y + 1, 1, 0
  402. for i in range(0, 5):
  403. g *= f
  404. F += x**i*g
  405. assert R.dmp_content(F) == f.drop(x)
  406. R, x,y,z = ring("x,y,z", ZZ)
  407. assert R.dmp_content(f_4) == 1
  408. assert R.dmp_content(f_5) == 1
  409. R, x,y,z,t = ring("x,y,z,t", ZZ)
  410. assert R.dmp_content(f_6) == 1
  411. def test_dmp_primitive():
  412. R, x,y = ring("x,y", ZZ)
  413. assert R.dmp_primitive(0) == (0, 0)
  414. assert R.dmp_primitive(1) == (1, 1)
  415. f, g, F = 3*y**2 + 2*y + 1, 1, 0
  416. for i in range(0, 5):
  417. g *= f
  418. F += x**i*g
  419. assert R.dmp_primitive(F) == (f.drop(x), F / f)
  420. R, x,y,z = ring("x,y,z", ZZ)
  421. cont, f = R.dmp_primitive(f_4)
  422. assert cont == 1 and f == f_4
  423. cont, f = R.dmp_primitive(f_5)
  424. assert cont == 1 and f == f_5
  425. R, x,y,z,t = ring("x,y,z,t", ZZ)
  426. cont, f = R.dmp_primitive(f_6)
  427. assert cont == 1 and f == f_6
  428. def test_dup_cancel():
  429. R, x = ring("x", ZZ)
  430. f = 2*x**2 - 2
  431. g = x**2 - 2*x + 1
  432. p = 2*x + 2
  433. q = x - 1
  434. assert R.dup_cancel(f, g) == (p, q)
  435. assert R.dup_cancel(f, g, include=False) == (1, 1, p, q)
  436. f = -x - 2
  437. g = 3*x - 4
  438. F = x + 2
  439. G = -3*x + 4
  440. assert R.dup_cancel(f, g) == (f, g)
  441. assert R.dup_cancel(F, G) == (f, g)
  442. assert R.dup_cancel(0, 0) == (0, 0)
  443. assert R.dup_cancel(0, 0, include=False) == (1, 1, 0, 0)
  444. assert R.dup_cancel(x, 0) == (1, 0)
  445. assert R.dup_cancel(x, 0, include=False) == (1, 1, 1, 0)
  446. assert R.dup_cancel(0, x) == (0, 1)
  447. assert R.dup_cancel(0, x, include=False) == (1, 1, 0, 1)
  448. f = 0
  449. g = x
  450. one = 1
  451. assert R.dup_cancel(f, g, include=True) == (f, one)
  452. def test_dmp_cancel():
  453. R, x, y = ring("x,y", ZZ)
  454. f = 2*x**2 - 2
  455. g = x**2 - 2*x + 1
  456. p = 2*x + 2
  457. q = x - 1
  458. assert R.dmp_cancel(f, g) == (p, q)
  459. assert R.dmp_cancel(f, g, include=False) == (1, 1, p, q)
  460. assert R.dmp_cancel(0, 0) == (0, 0)
  461. assert R.dmp_cancel(0, 0, include=False) == (1, 1, 0, 0)
  462. assert R.dmp_cancel(y, 0) == (1, 0)
  463. assert R.dmp_cancel(y, 0, include=False) == (1, 1, 1, 0)
  464. assert R.dmp_cancel(0, y) == (0, 1)
  465. assert R.dmp_cancel(0, y, include=False) == (1, 1, 0, 1)