test_dispersion.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from sympy.core import Symbol, S, oo
  2. from sympy.functions.elementary.miscellaneous import sqrt
  3. from sympy.polys import poly
  4. from sympy.polys.dispersion import dispersion, dispersionset
  5. def test_dispersion():
  6. x = Symbol("x")
  7. a = Symbol("a")
  8. fp = poly(S.Zero, x)
  9. assert sorted(dispersionset(fp)) == [0]
  10. fp = poly(S(2), x)
  11. assert sorted(dispersionset(fp)) == [0]
  12. fp = poly(x + 1, x)
  13. assert sorted(dispersionset(fp)) == [0]
  14. assert dispersion(fp) == 0
  15. fp = poly((x + 1)*(x + 2), x)
  16. assert sorted(dispersionset(fp)) == [0, 1]
  17. assert dispersion(fp) == 1
  18. fp = poly(x*(x + 3), x)
  19. assert sorted(dispersionset(fp)) == [0, 3]
  20. assert dispersion(fp) == 3
  21. fp = poly((x - 3)*(x + 3), x)
  22. assert sorted(dispersionset(fp)) == [0, 6]
  23. assert dispersion(fp) == 6
  24. fp = poly(x**4 - 3*x**2 + 1, x)
  25. gp = fp.shift(-3)
  26. assert sorted(dispersionset(fp, gp)) == [2, 3, 4]
  27. assert dispersion(fp, gp) == 4
  28. assert sorted(dispersionset(gp, fp)) == []
  29. assert dispersion(gp, fp) is -oo
  30. fp = poly(x*(3*x**2+a)*(x-2536)*(x**3+a), x)
  31. gp = fp.as_expr().subs(x, x-345).as_poly(x)
  32. assert sorted(dispersionset(fp, gp)) == [345, 2881]
  33. assert sorted(dispersionset(gp, fp)) == [2191]
  34. gp = poly((x-2)**2*(x-3)**3*(x-5)**3, x)
  35. assert sorted(dispersionset(gp)) == [0, 1, 2, 3]
  36. assert sorted(dispersionset(gp, (gp+4)**2)) == [1, 2]
  37. fp = poly(x*(x+2)*(x-1), x)
  38. assert sorted(dispersionset(fp)) == [0, 1, 2, 3]
  39. fp = poly(x**2 + sqrt(5)*x - 1, x, domain='QQ<sqrt(5)>')
  40. gp = poly(x**2 + (2 + sqrt(5))*x + sqrt(5), x, domain='QQ<sqrt(5)>')
  41. assert sorted(dispersionset(fp, gp)) == [2]
  42. assert sorted(dispersionset(gp, fp)) == [1, 4]
  43. # There are some difficulties if we compute over Z[a]
  44. # and alpha happenes to lie in Z[a] instead of simply Z.
  45. # Hence we can not decide if alpha is indeed integral
  46. # in general.
  47. fp = poly(4*x**4 + (4*a + 8)*x**3 + (a**2 + 6*a + 4)*x**2 + (a**2 + 2*a)*x, x)
  48. assert sorted(dispersionset(fp)) == [0, 1]
  49. # For any specific value of a, the dispersion is 3*a
  50. # but the algorithm can not find this in general.
  51. # This is the point where the resultant based Ansatz
  52. # is superior to the current one.
  53. fp = poly(a**2*x**3 + (a**3 + a**2 + a + 1)*x, x)
  54. gp = fp.as_expr().subs(x, x - 3*a).as_poly(x)
  55. assert sorted(dispersionset(fp, gp)) == []
  56. fpa = fp.as_expr().subs(a, 2).as_poly(x)
  57. gpa = gp.as_expr().subs(a, 2).as_poly(x)
  58. assert sorted(dispersionset(fpa, gpa)) == [6]
  59. # Work with Expr instead of Poly
  60. f = (x + 1)*(x + 2)
  61. assert sorted(dispersionset(f)) == [0, 1]
  62. assert dispersion(f) == 1
  63. f = x**4 - 3*x**2 + 1
  64. g = x**4 - 12*x**3 + 51*x**2 - 90*x + 55
  65. assert sorted(dispersionset(f, g)) == [2, 3, 4]
  66. assert dispersion(f, g) == 4
  67. # Work with Expr and specify a generator
  68. f = (x + 1)*(x + 2)
  69. assert sorted(dispersionset(f, None, x)) == [0, 1]
  70. assert dispersion(f, None, x) == 1
  71. f = x**4 - 3*x**2 + 1
  72. g = x**4 - 12*x**3 + 51*x**2 - 90*x + 55
  73. assert sorted(dispersionset(f, g, x)) == [2, 3, 4]
  74. assert dispersion(f, g, x) == 4