图片解析应用
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.

95 lines
3.1 KiB

  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