test_monomials.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. """Tests for tools and arithmetics for monomials of distributed polynomials. """
  2. from sympy.polys.monomials import (
  3. itermonomials, monomial_count,
  4. monomial_mul, monomial_div,
  5. monomial_gcd, monomial_lcm,
  6. monomial_max, monomial_min,
  7. monomial_divides, monomial_pow,
  8. Monomial,
  9. )
  10. from sympy.polys.polyerrors import ExactQuotientFailed
  11. from sympy.abc import a, b, c, x, y, z
  12. from sympy.core import S, symbols
  13. from sympy.testing.pytest import raises
  14. def test_monomials():
  15. # total_degree tests
  16. assert set(itermonomials([], 0)) == {S.One}
  17. assert set(itermonomials([], 1)) == {S.One}
  18. assert set(itermonomials([], 2)) == {S.One}
  19. assert set(itermonomials([], 0, 0)) == {S.One}
  20. assert set(itermonomials([], 1, 0)) == {S.One}
  21. assert set(itermonomials([], 2, 0)) == {S.One}
  22. raises(StopIteration, lambda: next(itermonomials([], 0, 1)))
  23. raises(StopIteration, lambda: next(itermonomials([], 0, 2)))
  24. raises(StopIteration, lambda: next(itermonomials([], 0, 3)))
  25. assert set(itermonomials([], 0, 1)) == set()
  26. assert set(itermonomials([], 0, 2)) == set()
  27. assert set(itermonomials([], 0, 3)) == set()
  28. raises(ValueError, lambda: set(itermonomials([], -1)))
  29. raises(ValueError, lambda: set(itermonomials([x], -1)))
  30. raises(ValueError, lambda: set(itermonomials([x, y], -1)))
  31. assert set(itermonomials([x], 0)) == {S.One}
  32. assert set(itermonomials([x], 1)) == {S.One, x}
  33. assert set(itermonomials([x], 2)) == {S.One, x, x**2}
  34. assert set(itermonomials([x], 3)) == {S.One, x, x**2, x**3}
  35. assert set(itermonomials([x, y], 0)) == {S.One}
  36. assert set(itermonomials([x, y], 1)) == {S.One, x, y}
  37. assert set(itermonomials([x, y], 2)) == {S.One, x, y, x**2, y**2, x*y}
  38. assert set(itermonomials([x, y], 3)) == \
  39. {S.One, x, y, x**2, x**3, y**2, y**3, x*y, x*y**2, y*x**2}
  40. i, j, k = symbols('i j k', commutative=False)
  41. assert set(itermonomials([i, j, k], 0)) == {S.One}
  42. assert set(itermonomials([i, j, k], 1)) == {S.One, i, j, k}
  43. assert set(itermonomials([i, j, k], 2)) == \
  44. {S.One, i, j, k, i**2, j**2, k**2, i*j, i*k, j*i, j*k, k*i, k*j}
  45. assert set(itermonomials([i, j, k], 3)) == \
  46. {S.One, i, j, k, i**2, j**2, k**2, i*j, i*k, j*i, j*k, k*i, k*j,
  47. i**3, j**3, k**3,
  48. i**2 * j, i**2 * k, j * i**2, k * i**2,
  49. j**2 * i, j**2 * k, i * j**2, k * j**2,
  50. k**2 * i, k**2 * j, i * k**2, j * k**2,
  51. i*j*i, i*k*i, j*i*j, j*k*j, k*i*k, k*j*k,
  52. i*j*k, i*k*j, j*i*k, j*k*i, k*i*j, k*j*i,
  53. }
  54. assert set(itermonomials([x, i, j], 0)) == {S.One}
  55. assert set(itermonomials([x, i, j], 1)) == {S.One, x, i, j}
  56. assert set(itermonomials([x, i, j], 2)) == {S.One, x, i, j, x*i, x*j, i*j, j*i, x**2, i**2, j**2}
  57. assert set(itermonomials([x, i, j], 3)) == \
  58. {S.One, x, i, j, x*i, x*j, i*j, j*i, x**2, i**2, j**2,
  59. x**3, i**3, j**3,
  60. x**2 * i, x**2 * j,
  61. x * i**2, j * i**2, i**2 * j, i*j*i,
  62. x * j**2, i * j**2, j**2 * i, j*i*j,
  63. x * i * j, x * j * i
  64. }
  65. # degree_list tests
  66. assert set(itermonomials([], [])) == {S.One}
  67. raises(ValueError, lambda: set(itermonomials([], [0])))
  68. raises(ValueError, lambda: set(itermonomials([], [1])))
  69. raises(ValueError, lambda: set(itermonomials([], [2])))
  70. raises(ValueError, lambda: set(itermonomials([x], [1], [])))
  71. raises(ValueError, lambda: set(itermonomials([x], [1, 2], [])))
  72. raises(ValueError, lambda: set(itermonomials([x], [1, 2, 3], [])))
  73. raises(ValueError, lambda: set(itermonomials([x], [], [1])))
  74. raises(ValueError, lambda: set(itermonomials([x], [], [1, 2])))
  75. raises(ValueError, lambda: set(itermonomials([x], [], [1, 2, 3])))
  76. raises(ValueError, lambda: set(itermonomials([x, y], [1, 2], [1, 2, 3])))
  77. raises(ValueError, lambda: set(itermonomials([x, y, z], [1, 2, 3], [0, 1])))
  78. raises(ValueError, lambda: set(itermonomials([x], [1], [-1])))
  79. raises(ValueError, lambda: set(itermonomials([x, y], [1, 2], [1, -1])))
  80. raises(ValueError, lambda: set(itermonomials([], [], 1)))
  81. raises(ValueError, lambda: set(itermonomials([], [], 2)))
  82. raises(ValueError, lambda: set(itermonomials([], [], 3)))
  83. raises(ValueError, lambda: set(itermonomials([x, y], [0, 1], [1, 2])))
  84. raises(ValueError, lambda: set(itermonomials([x, y, z], [0, 0, 3], [0, 1, 2])))
  85. assert set(itermonomials([x], [0])) == {S.One}
  86. assert set(itermonomials([x], [1])) == {S.One, x}
  87. assert set(itermonomials([x], [2])) == {S.One, x, x**2}
  88. assert set(itermonomials([x], [3])) == {S.One, x, x**2, x**3}
  89. assert set(itermonomials([x], [3], [1])) == {x, x**3, x**2}
  90. assert set(itermonomials([x], [3], [2])) == {x**3, x**2}
  91. assert set(itermonomials([x, y], 3, 3)) == {x**3, x**2*y, x*y**2, y**3}
  92. assert set(itermonomials([x, y], 3, 2)) == {x**2, x*y, y**2, x**3, x**2*y, x*y**2, y**3}
  93. assert set(itermonomials([x, y], [0, 0])) == {S.One}
  94. assert set(itermonomials([x, y], [0, 1])) == {S.One, y}
  95. assert set(itermonomials([x, y], [0, 2])) == {S.One, y, y**2}
  96. assert set(itermonomials([x, y], [0, 2], [0, 1])) == {y, y**2}
  97. assert set(itermonomials([x, y], [0, 2], [0, 2])) == {y**2}
  98. assert set(itermonomials([x, y], [1, 0])) == {S.One, x}
  99. assert set(itermonomials([x, y], [1, 1])) == {S.One, x, y, x*y}
  100. assert set(itermonomials([x, y], [1, 2])) == {S.One, x, y, x*y, y**2, x*y**2}
  101. assert set(itermonomials([x, y], [1, 2], [1, 1])) == {x*y, x*y**2}
  102. assert set(itermonomials([x, y], [1, 2], [1, 2])) == {x*y**2}
  103. assert set(itermonomials([x, y], [2, 0])) == {S.One, x, x**2}
  104. assert set(itermonomials([x, y], [2, 1])) == {S.One, x, y, x*y, x**2, x**2*y}
  105. assert set(itermonomials([x, y], [2, 2])) == \
  106. {S.One, y**2, x*y**2, x, x*y, x**2, x**2*y**2, y, x**2*y}
  107. i, j, k = symbols('i j k', commutative=False)
  108. assert set(itermonomials([i, j, k], 2, 2)) == \
  109. {k*i, i**2, i*j, j*k, j*i, k**2, j**2, k*j, i*k}
  110. assert set(itermonomials([i, j, k], 3, 2)) == \
  111. {j*k**2, i*k**2, k*i*j, k*i**2, k**2, j*k*j, k*j**2, i*k*i, i*j,
  112. j**2*k, i**2*j, j*i*k, j**3, i**3, k*j*i, j*k*i, j*i,
  113. k**2*j, j*i**2, k*j, k*j*k, i*j*i, j*i*j, i*j**2, j**2,
  114. k*i*k, i**2, j*k, i*k, i*k*j, k**3, i**2*k, j**2*i, k**2*i,
  115. i*j*k, k*i
  116. }
  117. assert set(itermonomials([i, j, k], [0, 0, 0])) == {S.One}
  118. assert set(itermonomials([i, j, k], [0, 0, 1])) == {1, k}
  119. assert set(itermonomials([i, j, k], [0, 1, 0])) == {1, j}
  120. assert set(itermonomials([i, j, k], [1, 0, 0])) == {i, 1}
  121. assert set(itermonomials([i, j, k], [0, 0, 2])) == {k**2, 1, k}
  122. assert set(itermonomials([i, j, k], [0, 2, 0])) == {1, j, j**2}
  123. assert set(itermonomials([i, j, k], [2, 0, 0])) == {i, 1, i**2}
  124. assert set(itermonomials([i, j, k], [1, 1, 1])) == {1, k, j, j*k, i*k, i, i*j, i*j*k}
  125. assert set(itermonomials([i, j, k], [2, 2, 2])) == \
  126. {1, k, i**2*k**2, j*k, j**2, i, i*k, j*k**2, i*j**2*k**2,
  127. i**2*j, i**2*j**2, k**2, j**2*k, i*j**2*k,
  128. j**2*k**2, i*j, i**2*k, i**2*j**2*k, j, i**2*j*k,
  129. i*j**2, i*k**2, i*j*k, i**2*j**2*k**2, i*j*k**2, i**2, i**2*j*k**2
  130. }
  131. assert set(itermonomials([x, j, k], [0, 0, 0])) == {S.One}
  132. assert set(itermonomials([x, j, k], [0, 0, 1])) == {1, k}
  133. assert set(itermonomials([x, j, k], [0, 1, 0])) == {1, j}
  134. assert set(itermonomials([x, j, k], [1, 0, 0])) == {x, 1}
  135. assert set(itermonomials([x, j, k], [0, 0, 2])) == {k**2, 1, k}
  136. assert set(itermonomials([x, j, k], [0, 2, 0])) == {1, j, j**2}
  137. assert set(itermonomials([x, j, k], [2, 0, 0])) == {x, 1, x**2}
  138. assert set(itermonomials([x, j, k], [1, 1, 1])) == {1, k, j, j*k, x*k, x, x*j, x*j*k}
  139. assert set(itermonomials([x, j, k], [2, 2, 2])) == \
  140. {1, k, x**2*k**2, j*k, j**2, x, x*k, j*k**2, x*j**2*k**2,
  141. x**2*j, x**2*j**2, k**2, j**2*k, x*j**2*k,
  142. j**2*k**2, x*j, x**2*k, x**2*j**2*k, j, x**2*j*k,
  143. x*j**2, x*k**2, x*j*k, x**2*j**2*k**2, x*j*k**2, x**2, x**2*j*k**2
  144. }
  145. def test_monomial_count():
  146. assert monomial_count(2, 2) == 6
  147. assert monomial_count(2, 3) == 10
  148. def test_monomial_mul():
  149. assert monomial_mul((3, 4, 1), (1, 2, 0)) == (4, 6, 1)
  150. def test_monomial_div():
  151. assert monomial_div((3, 4, 1), (1, 2, 0)) == (2, 2, 1)
  152. def test_monomial_gcd():
  153. assert monomial_gcd((3, 4, 1), (1, 2, 0)) == (1, 2, 0)
  154. def test_monomial_lcm():
  155. assert monomial_lcm((3, 4, 1), (1, 2, 0)) == (3, 4, 1)
  156. def test_monomial_max():
  157. assert monomial_max((3, 4, 5), (0, 5, 1), (6, 3, 9)) == (6, 5, 9)
  158. def test_monomial_pow():
  159. assert monomial_pow((1, 2, 3), 3) == (3, 6, 9)
  160. def test_monomial_min():
  161. assert monomial_min((3, 4, 5), (0, 5, 1), (6, 3, 9)) == (0, 3, 1)
  162. def test_monomial_divides():
  163. assert monomial_divides((1, 2, 3), (4, 5, 6)) is True
  164. assert monomial_divides((1, 2, 3), (0, 5, 6)) is False
  165. def test_Monomial():
  166. m = Monomial((3, 4, 1), (x, y, z))
  167. n = Monomial((1, 2, 0), (x, y, z))
  168. assert m.as_expr() == x**3*y**4*z
  169. assert n.as_expr() == x**1*y**2
  170. assert m.as_expr(a, b, c) == a**3*b**4*c
  171. assert n.as_expr(a, b, c) == a**1*b**2
  172. assert m.exponents == (3, 4, 1)
  173. assert m.gens == (x, y, z)
  174. assert n.exponents == (1, 2, 0)
  175. assert n.gens == (x, y, z)
  176. assert m == (3, 4, 1)
  177. assert n != (3, 4, 1)
  178. assert m != (1, 2, 0)
  179. assert n == (1, 2, 0)
  180. assert (m == 1) is False
  181. assert m[0] == m[-3] == 3
  182. assert m[1] == m[-2] == 4
  183. assert m[2] == m[-1] == 1
  184. assert n[0] == n[-3] == 1
  185. assert n[1] == n[-2] == 2
  186. assert n[2] == n[-1] == 0
  187. assert m[:2] == (3, 4)
  188. assert n[:2] == (1, 2)
  189. assert m*n == Monomial((4, 6, 1))
  190. assert m/n == Monomial((2, 2, 1))
  191. assert m*(1, 2, 0) == Monomial((4, 6, 1))
  192. assert m/(1, 2, 0) == Monomial((2, 2, 1))
  193. assert m.gcd(n) == Monomial((1, 2, 0))
  194. assert m.lcm(n) == Monomial((3, 4, 1))
  195. assert m.gcd((1, 2, 0)) == Monomial((1, 2, 0))
  196. assert m.lcm((1, 2, 0)) == Monomial((3, 4, 1))
  197. assert m**0 == Monomial((0, 0, 0))
  198. assert m**1 == m
  199. assert m**2 == Monomial((6, 8, 2))
  200. assert m**3 == Monomial((9, 12, 3))
  201. raises(ExactQuotientFailed, lambda: m/Monomial((5, 2, 0)))
  202. mm = Monomial((1, 2, 3))
  203. raises(ValueError, lambda: mm.as_expr())
  204. assert str(mm) == 'Monomial((1, 2, 3))'
  205. assert str(m) == 'x**3*y**4*z**1'
  206. raises(NotImplementedError, lambda: m*1)
  207. raises(NotImplementedError, lambda: m/1)
  208. raises(ValueError, lambda: m**-1)
  209. raises(TypeError, lambda: m.gcd(3))
  210. raises(TypeError, lambda: m.lcm(3))