test_sqfreetools.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. """Tests for square-free decomposition algorithms and related tools. """
  2. from sympy.polys.rings import ring
  3. from sympy.polys.domains import FF, ZZ, QQ
  4. from sympy.polys.specialpolys import f_polys
  5. from sympy.testing.pytest import raises
  6. f_0, f_1, f_2, f_3, f_4, f_5, f_6 = f_polys()
  7. def test_dup_sqf():
  8. R, x = ring("x", ZZ)
  9. assert R.dup_sqf_part(0) == 0
  10. assert R.dup_sqf_p(0) is True
  11. assert R.dup_sqf_part(7) == 1
  12. assert R.dup_sqf_p(7) is True
  13. assert R.dup_sqf_part(2*x + 2) == x + 1
  14. assert R.dup_sqf_p(2*x + 2) is True
  15. assert R.dup_sqf_part(x**3 + x + 1) == x**3 + x + 1
  16. assert R.dup_sqf_p(x**3 + x + 1) is True
  17. assert R.dup_sqf_part(-x**3 + x + 1) == x**3 - x - 1
  18. assert R.dup_sqf_p(-x**3 + x + 1) is True
  19. assert R.dup_sqf_part(2*x**3 + 3*x**2) == 2*x**2 + 3*x
  20. assert R.dup_sqf_p(2*x**3 + 3*x**2) is False
  21. assert R.dup_sqf_part(-2*x**3 + 3*x**2) == 2*x**2 - 3*x
  22. assert R.dup_sqf_p(-2*x**3 + 3*x**2) is False
  23. assert R.dup_sqf_list(0) == (0, [])
  24. assert R.dup_sqf_list(1) == (1, [])
  25. assert R.dup_sqf_list(x) == (1, [(x, 1)])
  26. assert R.dup_sqf_list(2*x**2) == (2, [(x, 2)])
  27. assert R.dup_sqf_list(3*x**3) == (3, [(x, 3)])
  28. assert R.dup_sqf_list(-x**5 + x**4 + x - 1) == \
  29. (-1, [(x**3 + x**2 + x + 1, 1), (x - 1, 2)])
  30. assert R.dup_sqf_list(x**8 + 6*x**6 + 12*x**4 + 8*x**2) == \
  31. ( 1, [(x, 2), (x**2 + 2, 3)])
  32. assert R.dup_sqf_list(2*x**2 + 4*x + 2) == (2, [(x + 1, 2)])
  33. R, x = ring("x", QQ)
  34. assert R.dup_sqf_list(2*x**2 + 4*x + 2) == (2, [(x + 1, 2)])
  35. R, x = ring("x", FF(2))
  36. assert R.dup_sqf_list(x**2 + 1) == (1, [(x + 1, 2)])
  37. R, x = ring("x", FF(3))
  38. assert R.dup_sqf_list(x**10 + 2*x**7 + 2*x**4 + x) == \
  39. (1, [(x, 1),
  40. (x + 1, 3),
  41. (x + 2, 6)])
  42. R1, x = ring("x", ZZ)
  43. R2, y = ring("y", FF(3))
  44. f = x**3 + 1
  45. g = y**3 + 1
  46. assert R1.dup_sqf_part(f) == f
  47. assert R2.dup_sqf_part(g) == y + 1
  48. assert R1.dup_sqf_p(f) is True
  49. assert R2.dup_sqf_p(g) is False
  50. R, x, y = ring("x,y", ZZ)
  51. A = x**4 - 3*x**2 + 6
  52. D = x**6 - 5*x**4 + 5*x**2 + 4
  53. f, g = D, R.dmp_sub(A, R.dmp_mul(R.dmp_diff(D, 1), y))
  54. res = R.dmp_resultant(f, g)
  55. h = (4*y**2 + 1).drop(x)
  56. assert R.drop(x).dup_sqf_list(res) == (45796, [(h, 3)])
  57. Rt, t = ring("t", ZZ)
  58. R, x = ring("x", Rt)
  59. assert R.dup_sqf_list_include(t**3*x**2) == [(t**3, 1), (x, 2)]
  60. def test_dmp_sqf():
  61. R, x, y = ring("x,y", ZZ)
  62. assert R.dmp_sqf_part(0) == 0
  63. assert R.dmp_sqf_p(0) is True
  64. assert R.dmp_sqf_part(7) == 1
  65. assert R.dmp_sqf_p(7) is True
  66. assert R.dmp_sqf_list(3) == (3, [])
  67. assert R.dmp_sqf_list_include(3) == [(3, 1)]
  68. R, x, y, z = ring("x,y,z", ZZ)
  69. assert R.dmp_sqf_p(f_0) is True
  70. assert R.dmp_sqf_p(f_0**2) is False
  71. assert R.dmp_sqf_p(f_1) is True
  72. assert R.dmp_sqf_p(f_1**2) is False
  73. assert R.dmp_sqf_p(f_2) is True
  74. assert R.dmp_sqf_p(f_2**2) is False
  75. assert R.dmp_sqf_p(f_3) is True
  76. assert R.dmp_sqf_p(f_3**2) is False
  77. assert R.dmp_sqf_p(f_5) is False
  78. assert R.dmp_sqf_p(f_5**2) is False
  79. assert R.dmp_sqf_p(f_4) is True
  80. assert R.dmp_sqf_part(f_4) == -f_4
  81. assert R.dmp_sqf_part(f_5) == x + y - z
  82. R, x, y, z, t = ring("x,y,z,t", ZZ)
  83. assert R.dmp_sqf_p(f_6) is True
  84. assert R.dmp_sqf_part(f_6) == f_6
  85. R, x = ring("x", ZZ)
  86. f = -x**5 + x**4 + x - 1
  87. assert R.dmp_sqf_list(f) == (-1, [(x**3 + x**2 + x + 1, 1), (x - 1, 2)])
  88. assert R.dmp_sqf_list_include(f) == [(-x**3 - x**2 - x - 1, 1), (x - 1, 2)]
  89. R, x, y = ring("x,y", ZZ)
  90. f = -x**5 + x**4 + x - 1
  91. assert R.dmp_sqf_list(f) == (-1, [(x**3 + x**2 + x + 1, 1), (x - 1, 2)])
  92. assert R.dmp_sqf_list_include(f) == [(-x**3 - x**2 - x - 1, 1), (x - 1, 2)]
  93. f = -x**2 + 2*x - 1
  94. assert R.dmp_sqf_list_include(f) == [(-1, 1), (x - 1, 2)]
  95. R, x, y = ring("x,y", FF(2))
  96. raises(NotImplementedError, lambda: R.dmp_sqf_list(y**2 + 1))
  97. def test_dup_gff_list():
  98. R, x = ring("x", ZZ)
  99. f = x**5 + 2*x**4 - x**3 - 2*x**2
  100. assert R.dup_gff_list(f) == [(x, 1), (x + 2, 4)]
  101. g = x**9 - 20*x**8 + 166*x**7 - 744*x**6 + 1965*x**5 - 3132*x**4 + 2948*x**3 - 1504*x**2 + 320*x
  102. assert R.dup_gff_list(g) == [(x**2 - 5*x + 4, 1), (x**2 - 5*x + 4, 2), (x, 3)]
  103. raises(ValueError, lambda: R.dup_gff_list(0))