test_distributedmodules.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. """Tests for sparse distributed modules. """
  2. from sympy.polys.distributedmodules import (
  3. sdm_monomial_mul, sdm_monomial_deg, sdm_monomial_divides,
  4. sdm_add, sdm_LM, sdm_LT, sdm_mul_term, sdm_zero, sdm_deg,
  5. sdm_LC, sdm_from_dict,
  6. sdm_spoly, sdm_ecart, sdm_nf_mora, sdm_groebner,
  7. sdm_from_vector, sdm_to_vector, sdm_monomial_lcm
  8. )
  9. from sympy.polys.orderings import lex, grlex, InverseOrder
  10. from sympy.polys.domains import QQ
  11. from sympy.abc import x, y, z
  12. def test_sdm_monomial_mul():
  13. assert sdm_monomial_mul((1, 1, 0), (1, 3)) == (1, 2, 3)
  14. def test_sdm_monomial_deg():
  15. assert sdm_monomial_deg((5, 2, 1)) == 3
  16. def test_sdm_monomial_lcm():
  17. assert sdm_monomial_lcm((1, 2, 3), (1, 5, 0)) == (1, 5, 3)
  18. def test_sdm_monomial_divides():
  19. assert sdm_monomial_divides((1, 0, 0), (1, 0, 0)) is True
  20. assert sdm_monomial_divides((1, 0, 0), (1, 2, 1)) is True
  21. assert sdm_monomial_divides((5, 1, 1), (5, 2, 1)) is True
  22. assert sdm_monomial_divides((1, 0, 0), (2, 0, 0)) is False
  23. assert sdm_monomial_divides((1, 1, 0), (1, 0, 0)) is False
  24. assert sdm_monomial_divides((5, 1, 2), (5, 0, 1)) is False
  25. def test_sdm_LC():
  26. assert sdm_LC([((1, 2, 3), QQ(5))], QQ) == QQ(5)
  27. def test_sdm_from_dict():
  28. dic = {(1, 2, 1, 1): QQ(1), (1, 1, 2, 1): QQ(1), (1, 0, 2, 1): QQ(1),
  29. (1, 0, 0, 3): QQ(1), (1, 1, 1, 0): QQ(1)}
  30. assert sdm_from_dict(dic, grlex) == \
  31. [((1, 2, 1, 1), QQ(1)), ((1, 1, 2, 1), QQ(1)),
  32. ((1, 0, 2, 1), QQ(1)), ((1, 0, 0, 3), QQ(1)), ((1, 1, 1, 0), QQ(1))]
  33. # TODO test to_dict?
  34. def test_sdm_add():
  35. assert sdm_add([((1, 1, 1), QQ(1))], [((2, 0, 0), QQ(1))], lex, QQ) == \
  36. [((2, 0, 0), QQ(1)), ((1, 1, 1), QQ(1))]
  37. assert sdm_add([((1, 1, 1), QQ(1))], [((1, 1, 1), QQ(-1))], lex, QQ) == []
  38. assert sdm_add([((1, 0, 0), QQ(1))], [((1, 0, 0), QQ(2))], lex, QQ) == \
  39. [((1, 0, 0), QQ(3))]
  40. assert sdm_add([((1, 0, 1), QQ(1))], [((1, 1, 0), QQ(1))], lex, QQ) == \
  41. [((1, 1, 0), QQ(1)), ((1, 0, 1), QQ(1))]
  42. def test_sdm_LM():
  43. dic = {(1, 2, 3): QQ(1), (4, 0, 0): QQ(1), (4, 0, 1): QQ(1)}
  44. assert sdm_LM(sdm_from_dict(dic, lex)) == (4, 0, 1)
  45. def test_sdm_LT():
  46. dic = {(1, 2, 3): QQ(1), (4, 0, 0): QQ(2), (4, 0, 1): QQ(3)}
  47. assert sdm_LT(sdm_from_dict(dic, lex)) == ((4, 0, 1), QQ(3))
  48. def test_sdm_mul_term():
  49. assert sdm_mul_term([((1, 0, 0), QQ(1))], ((0, 0), QQ(0)), lex, QQ) == []
  50. assert sdm_mul_term([], ((1, 0), QQ(1)), lex, QQ) == []
  51. assert sdm_mul_term([((1, 0, 0), QQ(1))], ((1, 0), QQ(1)), lex, QQ) == \
  52. [((1, 1, 0), QQ(1))]
  53. f = [((2, 0, 1), QQ(4)), ((1, 1, 0), QQ(3))]
  54. assert sdm_mul_term(f, ((1, 1), QQ(2)), lex, QQ) == \
  55. [((2, 1, 2), QQ(8)), ((1, 2, 1), QQ(6))]
  56. def test_sdm_zero():
  57. assert sdm_zero() == []
  58. def test_sdm_deg():
  59. assert sdm_deg([((1, 2, 3), 1), ((10, 0, 1), 1), ((2, 3, 4), 4)]) == 7
  60. def test_sdm_spoly():
  61. f = [((2, 1, 1), QQ(1)), ((1, 0, 1), QQ(1))]
  62. g = [((2, 3, 0), QQ(1))]
  63. h = [((1, 2, 3), QQ(1))]
  64. assert sdm_spoly(f, h, lex, QQ) == []
  65. assert sdm_spoly(f, g, lex, QQ) == [((1, 2, 1), QQ(1))]
  66. def test_sdm_ecart():
  67. assert sdm_ecart([((1, 2, 3), 1), ((1, 0, 1), 1)]) == 0
  68. assert sdm_ecart([((2, 2, 1), 1), ((1, 5, 1), 1)]) == 3
  69. def test_sdm_nf_mora():
  70. f = sdm_from_dict({(1, 2, 1, 1): QQ(1), (1, 1, 2, 1): QQ(1),
  71. (1, 0, 2, 1): QQ(1), (1, 0, 0, 3): QQ(1), (1, 1, 1, 0): QQ(1)},
  72. grlex)
  73. f1 = sdm_from_dict({(1, 1, 1, 0): QQ(1), (1, 0, 2, 0): QQ(1),
  74. (1, 0, 0, 0): QQ(-1)}, grlex)
  75. f2 = sdm_from_dict({(1, 1, 1, 0): QQ(1)}, grlex)
  76. (id0, id1, id2) = [sdm_from_dict({(i, 0, 0, 0): QQ(1)}, grlex)
  77. for i in range(3)]
  78. assert sdm_nf_mora(f, [f1, f2], grlex, QQ, phantom=(id0, [id1, id2])) == \
  79. ([((1, 0, 2, 1), QQ(1)), ((1, 0, 0, 3), QQ(1)), ((1, 1, 1, 0), QQ(1)),
  80. ((1, 1, 0, 1), QQ(1))],
  81. [((1, 1, 0, 1), QQ(-1)), ((0, 0, 0, 0), QQ(1))])
  82. assert sdm_nf_mora(f, [f2, f1], grlex, QQ, phantom=(id0, [id2, id1])) == \
  83. ([((1, 0, 2, 1), QQ(1)), ((1, 0, 0, 3), QQ(1)), ((1, 1, 1, 0), QQ(1))],
  84. [((2, 1, 0, 1), QQ(-1)), ((2, 0, 1, 1), QQ(-1)), ((0, 0, 0, 0), QQ(1))])
  85. f = sdm_from_vector([x*z, y**2 + y*z - z, y], lex, QQ, gens=[x, y, z])
  86. f1 = sdm_from_vector([x, y, 1], lex, QQ, gens=[x, y, z])
  87. f2 = sdm_from_vector([x*y, z, z**2], lex, QQ, gens=[x, y, z])
  88. assert sdm_nf_mora(f, [f1, f2], lex, QQ) == \
  89. sdm_nf_mora(f, [f2, f1], lex, QQ) == \
  90. [((1, 0, 1, 1), QQ(1)), ((1, 0, 0, 1), QQ(-1)), ((0, 1, 1, 0), QQ(-1)),
  91. ((0, 1, 0, 1), QQ(1))]
  92. def test_conversion():
  93. f = [x**2 + y**2, 2*z]
  94. g = [((1, 0, 0, 1), QQ(2)), ((0, 2, 0, 0), QQ(1)), ((0, 0, 2, 0), QQ(1))]
  95. assert sdm_to_vector(g, [x, y, z], QQ) == f
  96. assert sdm_from_vector(f, lex, QQ) == g
  97. assert sdm_from_vector(
  98. [x, 1], lex, QQ) == [((1, 0), QQ(1)), ((0, 1), QQ(1))]
  99. assert sdm_to_vector([((1, 1, 0, 0), 1)], [x, y, z], QQ, n=3) == [0, x, 0]
  100. assert sdm_from_vector([0, 0], lex, QQ, gens=[x, y]) == sdm_zero()
  101. def test_nontrivial():
  102. gens = [x, y, z]
  103. def contains(I, f):
  104. S = [sdm_from_vector([g], lex, QQ, gens=gens) for g in I]
  105. G = sdm_groebner(S, sdm_nf_mora, lex, QQ)
  106. return sdm_nf_mora(sdm_from_vector([f], lex, QQ, gens=gens),
  107. G, lex, QQ) == sdm_zero()
  108. assert contains([x, y], x)
  109. assert contains([x, y], x + y)
  110. assert not contains([x, y], 1)
  111. assert not contains([x, y], z)
  112. assert contains([x**2 + y, x**2 + x], x - y)
  113. assert not contains([x + y + z, x*y + x*z + y*z, x*y*z], x**2)
  114. assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x**3)
  115. assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x**4)
  116. assert not contains([x + y + z, x*y + x*z + y*z, x*y*z], x*y**2)
  117. assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x**4 + y**3 + 2*z*y*x)
  118. assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x*y*z)
  119. assert contains([x, 1 + x + y, 5 - 7*y], 1)
  120. assert contains(
  121. [x**3 + y**3, y**3 + z**3, z**3 + x**3, x**2*y + x**2*z + y**2*z],
  122. x**3)
  123. assert not contains(
  124. [x**3 + y**3, y**3 + z**3, z**3 + x**3, x**2*y + x**2*z + y**2*z],
  125. x**2 + y**2)
  126. # compare local order
  127. assert not contains([x*(1 + x + y), y*(1 + z)], x)
  128. assert not contains([x*(1 + x + y), y*(1 + z)], x + y)
  129. def test_local():
  130. igrlex = InverseOrder(grlex)
  131. gens = [x, y, z]
  132. def contains(I, f):
  133. S = [sdm_from_vector([g], igrlex, QQ, gens=gens) for g in I]
  134. G = sdm_groebner(S, sdm_nf_mora, igrlex, QQ)
  135. return sdm_nf_mora(sdm_from_vector([f], lex, QQ, gens=gens),
  136. G, lex, QQ) == sdm_zero()
  137. assert contains([x, y], x)
  138. assert contains([x, y], x + y)
  139. assert not contains([x, y], 1)
  140. assert not contains([x, y], z)
  141. assert contains([x**2 + y, x**2 + x], x - y)
  142. assert not contains([x + y + z, x*y + x*z + y*z, x*y*z], x**2)
  143. assert contains([x*(1 + x + y), y*(1 + z)], x)
  144. assert contains([x*(1 + x + y), y*(1 + z)], x + y)
  145. def test_uncovered_line():
  146. gens = [x, y]
  147. f1 = sdm_zero()
  148. f2 = sdm_from_vector([x, 0], lex, QQ, gens=gens)
  149. f3 = sdm_from_vector([0, y], lex, QQ, gens=gens)
  150. assert sdm_spoly(f1, f2, lex, QQ) == sdm_zero()
  151. assert sdm_spoly(f3, f2, lex, QQ) == sdm_zero()
  152. def test_chain_criterion():
  153. gens = [x]
  154. f1 = sdm_from_vector([1, x], grlex, QQ, gens=gens)
  155. f2 = sdm_from_vector([0, x - 2], grlex, QQ, gens=gens)
  156. assert len(sdm_groebner([f1, f2], sdm_nf_mora, grlex, QQ)) == 2