test_puiseux.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #
  2. # Tests for PuiseuxRing and PuiseuxPoly
  3. #
  4. from sympy.testing.pytest import raises
  5. from sympy import ZZ, QQ, ring
  6. from sympy.polys.puiseux import PuiseuxRing, PuiseuxPoly, puiseux_ring
  7. from sympy.abc import x, y
  8. def test_puiseux_ring():
  9. R, px = puiseux_ring('x', QQ)
  10. R2, px2 = puiseux_ring([x], QQ)
  11. assert isinstance(R, PuiseuxRing)
  12. assert isinstance(px, PuiseuxPoly)
  13. assert R == R2
  14. assert px == px2
  15. assert R == PuiseuxRing('x', QQ)
  16. assert R == PuiseuxRing([x], QQ)
  17. assert R != PuiseuxRing('y', QQ)
  18. assert R != PuiseuxRing('x', ZZ)
  19. assert R != PuiseuxRing('x, y', QQ)
  20. assert R != QQ
  21. assert str(R) == 'PuiseuxRing((x,), QQ)'
  22. def test_puiseux_ring_attributes():
  23. R1, px1, py1 = ring('x, y', QQ)
  24. R2, px2, py2 = puiseux_ring('x, y', QQ)
  25. assert R2.domain == QQ
  26. assert R2.symbols == (x, y)
  27. assert R2.gens == (px2, py2)
  28. assert R2.ngens == 2
  29. assert R2.poly_ring == R1
  30. assert R2.zero == PuiseuxPoly(R1.zero, R2)
  31. assert R2.one == PuiseuxPoly(R1.one, R2)
  32. assert R2.zero_monom == R1.zero_monom == (0, 0) # type: ignore
  33. assert R2.monomial_mul((1, 2), (3, 4)) == (4, 6)
  34. def test_puiseux_ring_methods():
  35. R1, px1, py1 = ring('x, y', QQ)
  36. R2, px2, py2 = puiseux_ring('x, y', QQ)
  37. assert R2({(1, 2): 3}) == 3*px2*py2**2
  38. assert R2(px1) == px2
  39. assert R2(1) == R2.one
  40. assert R2(QQ(1,2)) == QQ(1,2)*R2.one
  41. assert R2.from_poly(px1) == px2
  42. assert R2.from_poly(px1) != py2
  43. assert R2.from_dict({(1, 2): QQ(3)}) == 3*px2*py2**2
  44. assert R2.from_dict({(QQ(1,2), 2): QQ(3)}) == 3*px2**QQ(1,2)*py2**2
  45. assert R2.from_int(3) == 3*R2.one
  46. assert R2.domain_new(3) == QQ(3)
  47. assert QQ.of_type(R2.domain_new(3))
  48. assert R2.ground_new(3) == 3*R2.one
  49. assert isinstance(R2.ground_new(3), PuiseuxPoly)
  50. assert R2.index(px2) == 0
  51. assert R2.index(py2) == 1
  52. def test_puiseux_poly():
  53. R1, px1 = ring('x', QQ)
  54. R2, px2 = puiseux_ring('x', QQ)
  55. assert PuiseuxPoly(px1, R2) == px2
  56. assert px2.ring == R2
  57. assert px2.as_expr() == px1.as_expr() == x
  58. assert px1 != px2
  59. assert R2.one == px2**0 == 1
  60. assert px2 == px1
  61. assert px2 != 2.0
  62. assert px2**QQ(1,2) != px1
  63. def test_puiseux_poly_normalization():
  64. R, x = puiseux_ring('x', QQ)
  65. assert (x**2 + 1) / x == x + 1/x == R({(1,): 1, (-1,): 1})
  66. assert (x**QQ(1,6))**2 == x**QQ(1,3) == R({(QQ(1,3),): 1})
  67. assert (x**QQ(1,6))**(-2) == x**(-QQ(1,3)) == R({(-QQ(1,3),): 1})
  68. assert (x**QQ(1,6))**QQ(1,2) == x**QQ(1,12) == R({(QQ(1,12),): 1})
  69. assert (x**QQ(1,6))**6 == x == R({(1,): 1})
  70. assert x**QQ(1,6) * x**QQ(1,3) == x**QQ(1,2) == R({(QQ(1,2),): 1})
  71. assert 1/x * x**2 == x == R({(1,): 1})
  72. assert 1/x**QQ(1,3) * x**QQ(1,3) == 1 == R({(0,): 1})
  73. def test_puiseux_poly_monoms():
  74. R, x = puiseux_ring('x', QQ)
  75. assert x.monoms() == [(1,)]
  76. assert list(x) == [(1,)]
  77. assert (x**2 + 1).monoms() == [(2,), (0,)]
  78. assert R({(1,): 1, (-1,): 1}).monoms() == [(1,), (-1,)]
  79. assert R({(QQ(1,3),): 1}).monoms() == [(QQ(1,3),)]
  80. assert R({(-QQ(1,3),): 1}).monoms() == [(-QQ(1,3),)]
  81. p = x**QQ(1,6)
  82. assert p[(QQ(1,6),)] == 1
  83. raises(KeyError, lambda: p[(1,)])
  84. assert p.to_dict() == {(QQ(1,6),): 1}
  85. assert R(p.to_dict()) == p
  86. assert PuiseuxPoly.from_dict({(QQ(1,6),): 1}, R) == p
  87. def test_puiseux_poly_repr():
  88. R, x = puiseux_ring('x', QQ)
  89. assert repr(x) == 'x'
  90. assert repr(x**QQ(1,2)) == 'x**(1/2)'
  91. assert repr(1/x) == 'x**(-1)'
  92. assert repr(2*x**2 + 1) == '1 + 2*x**2'
  93. assert repr(R.one) == '1'
  94. assert repr(2*R.one) == '2'
  95. def test_puiseux_poly_unify():
  96. R, x = puiseux_ring('x', QQ)
  97. assert 1/x + x == x + 1/x == R({(1,): 1, (-1,): 1})
  98. assert repr(1/x + x) == 'x**(-1) + x'
  99. assert 1/x + 1/x == 2/x == R({(-1,): 2})
  100. assert repr(1/x + 1/x) == '2*x**(-1)'
  101. assert x**QQ(1,2) + x**QQ(1,2) == 2*x**QQ(1,2) == R({(QQ(1,2),): 2})
  102. assert repr(x**QQ(1,2) + x**QQ(1,2)) == '2*x**(1/2)'
  103. assert x**QQ(1,2) + x**QQ(1,3) == R({(QQ(1,2),): 1, (QQ(1,3),): 1})
  104. assert repr(x**QQ(1,2) + x**QQ(1,3)) == 'x**(1/3) + x**(1/2)'
  105. assert x + x**QQ(1,2) == R({(1,): 1, (QQ(1,2),): 1})
  106. assert repr(x + x**QQ(1,2)) == 'x**(1/2) + x'
  107. assert 1/x**QQ(1,2) + 1/x**QQ(1,3) == R({(-QQ(1,2),): 1, (-QQ(1,3),): 1})
  108. assert repr(1/x**QQ(1,2) + 1/x**QQ(1,3)) == 'x**(-1/2) + x**(-1/3)'
  109. assert 1/x + x**QQ(1,2) == x**QQ(1,2) + 1/x == R({(-1,): 1, (QQ(1,2),): 1})
  110. assert repr(1/x + x**QQ(1,2)) == 'x**(-1) + x**(1/2)'
  111. def test_puiseux_poly_arit():
  112. R, x = puiseux_ring('x', QQ)
  113. R2, y = puiseux_ring('y', QQ)
  114. p = x**2 + 1
  115. assert +p == p
  116. assert -p == -1 - x**2
  117. assert p + p == 2*p == 2*x**2 + 2
  118. assert p + 1 == 1 + p == x**2 + 2
  119. assert p + QQ(1,2) == QQ(1,2) + p == x**2 + QQ(3,2)
  120. assert p - p == 0
  121. assert p - 1 == -1 + p == x**2
  122. assert p - QQ(1,2) == -QQ(1,2) + p == x**2 + QQ(1,2)
  123. assert 1 - p == -p + 1 == -x**2
  124. assert QQ(1,2) - p == -p + QQ(1,2) == -x**2 - QQ(1,2)
  125. assert p * p == x**4 + 2*x**2 + 1
  126. assert p * 1 == 1 * p == p
  127. assert 2 * p == p * 2 == 2*x**2 + 2
  128. assert p * QQ(1,2) == QQ(1,2) * p == QQ(1,2)*x**2 + QQ(1,2)
  129. assert x**QQ(1,2) * x**QQ(1,2) == x
  130. raises(ValueError, lambda: x + y)
  131. raises(ValueError, lambda: x - y)
  132. raises(ValueError, lambda: x * y)
  133. raises(TypeError, lambda: x + None)
  134. raises(TypeError, lambda: x - None)
  135. raises(TypeError, lambda: x * None)
  136. raises(TypeError, lambda: None + x)
  137. raises(TypeError, lambda: None - x)
  138. raises(TypeError, lambda: None * x)
  139. def test_puiseux_poly_div():
  140. R, x = puiseux_ring('x', QQ)
  141. R2, y = puiseux_ring('y', QQ)
  142. p = x**2 - 1
  143. assert p / 1 == p
  144. assert p / QQ(1,2) == 2*p == 2*x**2 - 2
  145. assert p / x == x - 1/x == R({(1,): 1, (-1,): -1})
  146. assert 2 / x == 2*x**-1 == R({(-1,): 2})
  147. assert QQ(1,2) / x == QQ(1,2)*x**-1 == 1/(2*x) == 1/x/2 == R({(-1,): QQ(1,2)})
  148. raises(ZeroDivisionError, lambda: p / 0)
  149. raises(ValueError, lambda: (x + 1) / (x + 2))
  150. raises(ValueError, lambda: (x + 1) / (x + 1))
  151. raises(ValueError, lambda: x / y)
  152. raises(TypeError, lambda: x / None)
  153. raises(TypeError, lambda: None / x)
  154. def test_puiseux_poly_pow():
  155. R, x = puiseux_ring('x', QQ)
  156. Rz, xz = puiseux_ring('x', ZZ)
  157. assert x**0 == 1 == R({(0,): 1})
  158. assert x**1 == x == R({(1,): 1})
  159. assert x**2 == x*x == R({(2,): 1})
  160. assert x**QQ(1,2) == R({(QQ(1,2),): 1})
  161. assert x**-1 == 1/x == R({(-1,): 1})
  162. assert x**-QQ(1,2) == 1/x**QQ(1,2) == R({(-QQ(1,2),): 1})
  163. assert (2*x)**-1 == 1/(2*x) == QQ(1,2)/x == QQ(1,2)*x**-1 == R({(-1,): QQ(1,2)})
  164. assert 2/x**2 == 2*x**-2 == R({(-2,): 2})
  165. assert 2/xz**2 == 2*xz**-2 == Rz({(-2,): 2})
  166. raises(TypeError, lambda: x**None)
  167. raises(ValueError, lambda: (x + 1)**-1)
  168. raises(ValueError, lambda: (x + 1)**QQ(1,2))
  169. raises(ValueError, lambda: (2*x)**QQ(1,2))
  170. raises(ValueError, lambda: (2*xz)**-1)
  171. def test_puiseux_poly_diff():
  172. R, x, y = puiseux_ring('x, y', QQ)
  173. assert (x**2 + 1).diff(x) == 2*x
  174. assert (x**2 + 1).diff(y) == 0
  175. assert (x**2 + y**2).diff(x) == 2*x
  176. assert (x**QQ(1,2) + y**QQ(1,2)).diff(x) == QQ(1,2)*x**-QQ(1,2)
  177. assert ((x*y)**QQ(1,2)).diff(x) == QQ(1,2)*y**QQ(1,2)*x**-QQ(1,2)