test_constructor.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. """Tests for tools for constructing domains for expressions. """
  2. from sympy.polys.constructor import construct_domain
  3. from sympy.polys.domains import ZZ, QQ, ZZ_I, QQ_I, RR, CC, EX
  4. from sympy.polys.domains.realfield import RealField
  5. from sympy.polys.domains.complexfield import ComplexField
  6. from sympy.core import (Catalan, GoldenRatio)
  7. from sympy.core.numbers import (E, Float, I, Rational, pi)
  8. from sympy.core.singleton import S
  9. from sympy.functions.elementary.exponential import exp
  10. from sympy.functions.elementary.miscellaneous import sqrt
  11. from sympy.functions.elementary.trigonometric import sin
  12. from sympy.abc import x, y
  13. def test_construct_domain():
  14. assert construct_domain([1, 2, 3]) == (ZZ, [ZZ(1), ZZ(2), ZZ(3)])
  15. assert construct_domain([1, 2, 3], field=True) == (QQ, [QQ(1), QQ(2), QQ(3)])
  16. assert construct_domain([S.One, S(2), S(3)]) == (ZZ, [ZZ(1), ZZ(2), ZZ(3)])
  17. assert construct_domain([S.One, S(2), S(3)], field=True) == (QQ, [QQ(1), QQ(2), QQ(3)])
  18. assert construct_domain([S.Half, S(2)]) == (QQ, [QQ(1, 2), QQ(2)])
  19. result = construct_domain([3.14, 1, S.Half])
  20. assert isinstance(result[0], RealField)
  21. assert result[1] == [RR(3.14), RR(1.0), RR(0.5)]
  22. result = construct_domain([3.14, I, S.Half])
  23. assert isinstance(result[0], ComplexField)
  24. assert result[1] == [CC(3.14), CC(1.0j), CC(0.5)]
  25. assert construct_domain([1.0+I]) == (CC, [CC(1.0, 1.0)])
  26. assert construct_domain([2.0+3.0*I]) == (CC, [CC(2.0, 3.0)])
  27. assert construct_domain([1, I]) == (ZZ_I, [ZZ_I(1, 0), ZZ_I(0, 1)])
  28. assert construct_domain([1, I/2]) == (QQ_I, [QQ_I(1, 0), QQ_I(0, S.Half)])
  29. assert construct_domain([3.14, sqrt(2)], extension=None) == (EX, [EX(3.14), EX(sqrt(2))])
  30. assert construct_domain([3.14, sqrt(2)], extension=True) == (EX, [EX(3.14), EX(sqrt(2))])
  31. assert construct_domain([1, sqrt(2)], extension=None) == (EX, [EX(1), EX(sqrt(2))])
  32. assert construct_domain([x, sqrt(x)]) == (EX, [EX(x), EX(sqrt(x))])
  33. assert construct_domain([x, sqrt(x), sqrt(y)]) == (EX, [EX(x), EX(sqrt(x)), EX(sqrt(y))])
  34. alg = QQ.algebraic_field(sqrt(2))
  35. assert construct_domain([7, S.Half, sqrt(2)], extension=True) == \
  36. (alg, [alg.convert(7), alg.convert(S.Half), alg.convert(sqrt(2))])
  37. alg = QQ.algebraic_field(sqrt(2) + sqrt(3))
  38. assert construct_domain([7, sqrt(2), sqrt(3)], extension=True) == \
  39. (alg, [alg.convert(7), alg.convert(sqrt(2)), alg.convert(sqrt(3))])
  40. dom = ZZ[x]
  41. assert construct_domain([2*x, 3]) == \
  42. (dom, [dom.convert(2*x), dom.convert(3)])
  43. dom = ZZ[x, y]
  44. assert construct_domain([2*x, 3*y]) == \
  45. (dom, [dom.convert(2*x), dom.convert(3*y)])
  46. dom = QQ[x]
  47. assert construct_domain([x/2, 3]) == \
  48. (dom, [dom.convert(x/2), dom.convert(3)])
  49. dom = QQ[x, y]
  50. assert construct_domain([x/2, 3*y]) == \
  51. (dom, [dom.convert(x/2), dom.convert(3*y)])
  52. dom = ZZ_I[x]
  53. assert construct_domain([2*x, I]) == \
  54. (dom, [dom.convert(2*x), dom.convert(I)])
  55. dom = ZZ_I[x, y]
  56. assert construct_domain([2*x, I*y]) == \
  57. (dom, [dom.convert(2*x), dom.convert(I*y)])
  58. dom = QQ_I[x]
  59. assert construct_domain([x/2, I]) == \
  60. (dom, [dom.convert(x/2), dom.convert(I)])
  61. dom = QQ_I[x, y]
  62. assert construct_domain([x/2, I*y]) == \
  63. (dom, [dom.convert(x/2), dom.convert(I*y)])
  64. dom = RR[x]
  65. assert construct_domain([x/2, 3.5]) == \
  66. (dom, [dom.convert(x/2), dom.convert(3.5)])
  67. dom = RR[x, y]
  68. assert construct_domain([x/2, 3.5*y]) == \
  69. (dom, [dom.convert(x/2), dom.convert(3.5*y)])
  70. dom = CC[x]
  71. assert construct_domain([I*x/2, 3.5]) == \
  72. (dom, [dom.convert(I*x/2), dom.convert(3.5)])
  73. dom = CC[x, y]
  74. assert construct_domain([I*x/2, 3.5*y]) == \
  75. (dom, [dom.convert(I*x/2), dom.convert(3.5*y)])
  76. dom = CC[x]
  77. assert construct_domain([x/2, I*3.5]) == \
  78. (dom, [dom.convert(x/2), dom.convert(I*3.5)])
  79. dom = CC[x, y]
  80. assert construct_domain([x/2, I*3.5*y]) == \
  81. (dom, [dom.convert(x/2), dom.convert(I*3.5*y)])
  82. dom = ZZ.frac_field(x)
  83. assert construct_domain([2/x, 3]) == \
  84. (dom, [dom.convert(2/x), dom.convert(3)])
  85. dom = ZZ.frac_field(x, y)
  86. assert construct_domain([2/x, 3*y]) == \
  87. (dom, [dom.convert(2/x), dom.convert(3*y)])
  88. dom = RR.frac_field(x)
  89. assert construct_domain([2/x, 3.5]) == \
  90. (dom, [dom.convert(2/x), dom.convert(3.5)])
  91. dom = RR.frac_field(x, y)
  92. assert construct_domain([2/x, 3.5*y]) == \
  93. (dom, [dom.convert(2/x), dom.convert(3.5*y)])
  94. dom = RealField(prec=336)[x]
  95. assert construct_domain([pi.evalf(100)*x]) == \
  96. (dom, [dom.convert(pi.evalf(100)*x)])
  97. assert construct_domain(2) == (ZZ, ZZ(2))
  98. assert construct_domain(S(2)/3) == (QQ, QQ(2, 3))
  99. assert construct_domain(Rational(2, 3)) == (QQ, QQ(2, 3))
  100. assert construct_domain({}) == (ZZ, {})
  101. def test_complex_exponential():
  102. w = exp(-I*2*pi/3, evaluate=False)
  103. alg = QQ.algebraic_field(w)
  104. assert construct_domain([w**2, w, 1], extension=True) == (
  105. alg,
  106. [alg.convert(w**2),
  107. alg.convert(w),
  108. alg.convert(1)]
  109. )
  110. def test_composite_option():
  111. assert construct_domain({(1,): sin(y)}, composite=False) == \
  112. (EX, {(1,): EX(sin(y))})
  113. assert construct_domain({(1,): y}, composite=False) == \
  114. (EX, {(1,): EX(y)})
  115. assert construct_domain({(1, 1): 1}, composite=False) == \
  116. (ZZ, {(1, 1): 1})
  117. assert construct_domain({(1, 0): y}, composite=False) == \
  118. (EX, {(1, 0): EX(y)})
  119. def test_precision():
  120. f1 = Float("1.01")
  121. f2 = Float("1.0000000000000000000001")
  122. for u in [1, 1e-2, 1e-6, 1e-13, 1e-14, 1e-16, 1e-20, 1e-100, 1e-300,
  123. f1, f2]:
  124. result = construct_domain([u])
  125. v = float(result[1][0])
  126. assert abs(u - v) / u < 1e-14 # Test relative accuracy
  127. result = construct_domain([f1])
  128. y = result[1][0]
  129. assert y-1 > 1e-50
  130. result = construct_domain([f2])
  131. y = result[1][0]
  132. assert y-1 > 1e-50
  133. def test_issue_11538():
  134. for n in [E, pi, Catalan]:
  135. assert construct_domain(n)[0] == ZZ[n]
  136. assert construct_domain(x + n)[0] == ZZ[x, n]
  137. assert construct_domain(GoldenRatio)[0] == EX
  138. assert construct_domain(x + GoldenRatio)[0] == EX