test_modulargcd.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. from sympy.polys.rings import ring
  2. from sympy.polys.domains import ZZ, QQ, AlgebraicField
  3. from sympy.polys.modulargcd import (
  4. modgcd_univariate,
  5. modgcd_bivariate,
  6. _chinese_remainder_reconstruction_multivariate,
  7. modgcd_multivariate,
  8. _to_ZZ_poly,
  9. _to_ANP_poly,
  10. func_field_modgcd,
  11. _func_field_modgcd_m)
  12. from sympy.functions.elementary.miscellaneous import sqrt
  13. def test_modgcd_univariate_integers():
  14. R, x = ring("x", ZZ)
  15. f, g = R.zero, R.zero
  16. assert modgcd_univariate(f, g) == (0, 0, 0)
  17. f, g = R.zero, x
  18. assert modgcd_univariate(f, g) == (x, 0, 1)
  19. assert modgcd_univariate(g, f) == (x, 1, 0)
  20. f, g = R.zero, -x
  21. assert modgcd_univariate(f, g) == (x, 0, -1)
  22. assert modgcd_univariate(g, f) == (x, -1, 0)
  23. f, g = 2*x, R(2)
  24. assert modgcd_univariate(f, g) == (2, x, 1)
  25. f, g = 2*x + 2, 6*x**2 - 6
  26. assert modgcd_univariate(f, g) == (2*x + 2, 1, 3*x - 3)
  27. f = x**4 + 8*x**3 + 21*x**2 + 22*x + 8
  28. g = x**3 + 6*x**2 + 11*x + 6
  29. h = x**2 + 3*x + 2
  30. cff = x**2 + 5*x + 4
  31. cfg = x + 3
  32. assert modgcd_univariate(f, g) == (h, cff, cfg)
  33. f = x**4 - 4
  34. g = x**4 + 4*x**2 + 4
  35. h = x**2 + 2
  36. cff = x**2 - 2
  37. cfg = x**2 + 2
  38. assert modgcd_univariate(f, g) == (h, cff, cfg)
  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. h = 1
  42. cff = f
  43. cfg = g
  44. assert modgcd_univariate(f, g) == (h, cff, cfg)
  45. f = - 352518131239247345597970242177235495263669787845475025293906825864749649589178600387510272*x**49 \
  46. + 46818041807522713962450042363465092040687472354933295397472942006618953623327997952*x**42 \
  47. + 378182690892293941192071663536490788434899030680411695933646320291525827756032*x**35 \
  48. + 112806468807371824947796775491032386836656074179286744191026149539708928*x**28 \
  49. - 12278371209708240950316872681744825481125965781519138077173235712*x**21 \
  50. + 289127344604779611146960547954288113529690984687482920704*x**14 \
  51. + 19007977035740498977629742919480623972236450681*x**7 \
  52. + 311973482284542371301330321821976049
  53. g = 365431878023781158602430064717380211405897160759702125019136*x**21 \
  54. + 197599133478719444145775798221171663643171734081650688*x**14 \
  55. - 9504116979659010018253915765478924103928886144*x**7 \
  56. - 311973482284542371301330321821976049
  57. assert modgcd_univariate(f, f.diff(x))[0] == g
  58. f = 1317378933230047068160*x + 2945748836994210856960
  59. g = 120352542776360960*x + 269116466014453760
  60. h = 120352542776360960*x + 269116466014453760
  61. cff = 10946
  62. cfg = 1
  63. assert modgcd_univariate(f, g) == (h, cff, cfg)
  64. def test_modgcd_bivariate_integers():
  65. R, x, y = ring("x,y", ZZ)
  66. f, g = R.zero, R.zero
  67. assert modgcd_bivariate(f, g) == (0, 0, 0)
  68. f, g = 2*x, R(2)
  69. assert modgcd_bivariate(f, g) == (2, x, 1)
  70. f, g = x + 2*y, x + y
  71. assert modgcd_bivariate(f, g) == (1, f, g)
  72. f, g = x**2 + 2*x*y + y**2, x**3 + y**3
  73. assert modgcd_bivariate(f, g) == (x + y, x + y, x**2 - x*y + y**2)
  74. f, g = x*y**2 + 2*x*y + x, x*y**3 + x
  75. assert modgcd_bivariate(f, g) == (x*y + x, y + 1, y**2 - y + 1)
  76. f, g = x**2*y**2 + x**2*y + 1, x*y**2 + x*y + 1
  77. assert modgcd_bivariate(f, g) == (1, f, g)
  78. f = 2*x*y**2 + 4*x*y + 2*x + y**2 + 2*y + 1
  79. g = 2*x*y**3 + 2*x + y**3 + 1
  80. assert modgcd_bivariate(f, g) == (2*x*y + 2*x + y + 1, y + 1, y**2 - y + 1)
  81. f, g = 2*x**2 + 4*x + 2, x + 1
  82. assert modgcd_bivariate(f, g) == (x + 1, 2*x + 2, 1)
  83. f, g = x + 1, 2*x**2 + 4*x + 2
  84. assert modgcd_bivariate(f, g) == (x + 1, 1, 2*x + 2)
  85. f = 2*x**2 + 4*x*y - 2*x - 4*y
  86. g = x**2 + x - 2
  87. assert modgcd_bivariate(f, g) == (x - 1, 2*x + 4*y, x + 2)
  88. f = 2*x**2 + 2*x*y - 3*x - 3*y
  89. g = 4*x*y - 2*x + 4*y**2 - 2*y
  90. assert modgcd_bivariate(f, g) == (x + y, 2*x - 3, 4*y - 2)
  91. def test_chinese_remainder():
  92. R, x, y = ring("x, y", ZZ)
  93. p, q = 3, 5
  94. hp = x**3*y - x**2 - 1
  95. hq = -x**3*y - 2*x*y**2 + 2
  96. hpq = _chinese_remainder_reconstruction_multivariate(hp, hq, p, q)
  97. assert hpq.trunc_ground(p) == hp
  98. assert hpq.trunc_ground(q) == hq
  99. T, z = ring("z", R)
  100. p, q = 3, 7
  101. hp = (x*y + 1)*z**2 + x
  102. hq = (x**2 - 3*y)*z + 2
  103. hpq = _chinese_remainder_reconstruction_multivariate(hp, hq, p, q)
  104. assert hpq.trunc_ground(p) == hp
  105. assert hpq.trunc_ground(q) == hq
  106. def test_modgcd_multivariate_integers():
  107. R, x, y = ring("x,y", ZZ)
  108. f, g = R.zero, R.zero
  109. assert modgcd_multivariate(f, g) == (0, 0, 0)
  110. f, g = 2*x**2 + 4*x + 2, x + 1
  111. assert modgcd_multivariate(f, g) == (x + 1, 2*x + 2, 1)
  112. f, g = x + 1, 2*x**2 + 4*x + 2
  113. assert modgcd_multivariate(f, g) == (x + 1, 1, 2*x + 2)
  114. f = 2*x**2 + 2*x*y - 3*x - 3*y
  115. g = 4*x*y - 2*x + 4*y**2 - 2*y
  116. assert modgcd_multivariate(f, g) == (x + y, 2*x - 3, 4*y - 2)
  117. f, g = x*y**2 + 2*x*y + x, x*y**3 + x
  118. assert modgcd_multivariate(f, g) == (x*y + x, y + 1, y**2 - y + 1)
  119. f, g = x**2*y**2 + x**2*y + 1, x*y**2 + x*y + 1
  120. assert modgcd_multivariate(f, g) == (1, f, g)
  121. f = x**4 + 8*x**3 + 21*x**2 + 22*x + 8
  122. g = x**3 + 6*x**2 + 11*x + 6
  123. h = x**2 + 3*x + 2
  124. cff = x**2 + 5*x + 4
  125. cfg = x + 3
  126. assert modgcd_multivariate(f, g) == (h, cff, cfg)
  127. R, x, y, z, u = ring("x,y,z,u", ZZ)
  128. f, g = x + y + z, -x - y - z - u
  129. assert modgcd_multivariate(f, g) == (1, f, g)
  130. f, g = u**2 + 2*u + 1, 2*u + 2
  131. assert modgcd_multivariate(f, g) == (u + 1, u + 1, 2)
  132. f, g = z**2*u**2 + 2*z**2*u + z**2 + z*u + z, u**2 + 2*u + 1
  133. h, cff, cfg = u + 1, z**2*u + z**2 + z, u + 1
  134. assert modgcd_multivariate(f, g) == (h, cff, cfg)
  135. assert modgcd_multivariate(g, f) == (h, cfg, cff)
  136. R, x, y, z = ring("x,y,z", ZZ)
  137. f, g = x - y*z, x - y*z
  138. assert modgcd_multivariate(f, g) == (x - y*z, 1, 1)
  139. f, g, h = R.fateman_poly_F_1()
  140. H, cff, cfg = modgcd_multivariate(f, g)
  141. assert H == h and H*cff == f and H*cfg == g
  142. R, x, y, z, u, v = ring("x,y,z,u,v", ZZ)
  143. f, g, h = R.fateman_poly_F_1()
  144. H, cff, cfg = modgcd_multivariate(f, g)
  145. assert H == h and H*cff == f and H*cfg == g
  146. R, x, y, z, u, v, a, b = ring("x,y,z,u,v,a,b", ZZ)
  147. f, g, h = R.fateman_poly_F_1()
  148. H, cff, cfg = modgcd_multivariate(f, g)
  149. assert H == h and H*cff == f and H*cfg == g
  150. R, x, y, z, u, v, a, b, c, d = ring("x,y,z,u,v,a,b,c,d", ZZ)
  151. f, g, h = R.fateman_poly_F_1()
  152. H, cff, cfg = modgcd_multivariate(f, g)
  153. assert H == h and H*cff == f and H*cfg == g
  154. R, x, y, z = ring("x,y,z", ZZ)
  155. f, g, h = R.fateman_poly_F_2()
  156. H, cff, cfg = modgcd_multivariate(f, g)
  157. assert H == h and H*cff == f and H*cfg == g
  158. f, g, h = R.fateman_poly_F_3()
  159. H, cff, cfg = modgcd_multivariate(f, g)
  160. assert H == h and H*cff == f and H*cfg == g
  161. R, x, y, z, t = ring("x,y,z,t", ZZ)
  162. f, g, h = R.fateman_poly_F_3()
  163. H, cff, cfg = modgcd_multivariate(f, g)
  164. assert H == h and H*cff == f and H*cfg == g
  165. def test_to_ZZ_ANP_poly():
  166. A = AlgebraicField(QQ, sqrt(2))
  167. R, x = ring("x", A)
  168. f = x*(sqrt(2) + 1)
  169. T, x_, z_ = ring("x_, z_", ZZ)
  170. f_ = x_*z_ + x_
  171. assert _to_ZZ_poly(f, T) == f_
  172. assert _to_ANP_poly(f_, R) == f
  173. R, x, t, s = ring("x, t, s", A)
  174. f = x*t**2 + x*s + sqrt(2)
  175. D, t_, s_ = ring("t_, s_", ZZ)
  176. T, x_, z_ = ring("x_, z_", D)
  177. f_ = (t_**2 + s_)*x_ + z_
  178. assert _to_ZZ_poly(f, T) == f_
  179. assert _to_ANP_poly(f_, R) == f
  180. def test_modgcd_algebraic_field():
  181. A = AlgebraicField(QQ, sqrt(2))
  182. R, x = ring("x", A)
  183. one = A.one
  184. f, g = 2*x, R(2)
  185. assert func_field_modgcd(f, g) == (one, f, g)
  186. f, g = 2*x, R(sqrt(2))
  187. assert func_field_modgcd(f, g) == (one, f, g)
  188. f, g = 2*x + 2, 6*x**2 - 6
  189. assert func_field_modgcd(f, g) == (x + 1, R(2), 6*x - 6)
  190. R, x, y = ring("x, y", A)
  191. f, g = x + sqrt(2)*y, x + y
  192. assert func_field_modgcd(f, g) == (one, f, g)
  193. f, g = x*y + sqrt(2)*y**2, R(sqrt(2))*y
  194. assert func_field_modgcd(f, g) == (y, x + sqrt(2)*y, R(sqrt(2)))
  195. f, g = x**2 + 2*sqrt(2)*x*y + 2*y**2, x + sqrt(2)*y
  196. assert func_field_modgcd(f, g) == (g, g, one)
  197. A = AlgebraicField(QQ, sqrt(2), sqrt(3))
  198. R, x, y, z = ring("x, y, z", A)
  199. h = x**2*y**7 + sqrt(6)/21*z
  200. f, g = h*(27*y**3 + 1), h*(y + x)
  201. assert func_field_modgcd(f, g) == (h, 27*y**3+1, y+x)
  202. h = x**13*y**3 + 1/2*x**10 + 1/sqrt(2)
  203. f, g = h*(x + 1), h*sqrt(2)/sqrt(3)
  204. assert func_field_modgcd(f, g) == (h, x + 1, R(sqrt(2)/sqrt(3)))
  205. A = AlgebraicField(QQ, sqrt(2)**(-1)*sqrt(3))
  206. R, x = ring("x", A)
  207. f, g = x + 1, x - 1
  208. assert func_field_modgcd(f, g) == (A.one, f, g)
  209. # when func_field_modgcd suppors function fields, this test can be changed
  210. def test_modgcd_func_field():
  211. D, t = ring("t", ZZ)
  212. R, x, z = ring("x, z", D)
  213. minpoly = (z**2*t**2 + z**2*t - 1).drop(0)
  214. f, g = x + 1, x - 1
  215. assert _func_field_modgcd_m(f, g, minpoly) == R.one