test_free_groups.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. from sympy.combinatorics.free_groups import free_group, FreeGroup
  2. from sympy.core import Symbol
  3. from sympy.testing.pytest import raises
  4. from sympy.core.numbers import oo
  5. F, x, y, z = free_group("x, y, z")
  6. def test_FreeGroup__init__():
  7. x, y, z = map(Symbol, "xyz")
  8. assert len(FreeGroup("x, y, z").generators) == 3
  9. assert len(FreeGroup(x).generators) == 1
  10. assert len(FreeGroup(("x", "y", "z"))) == 3
  11. assert len(FreeGroup((x, y, z)).generators) == 3
  12. def test_FreeGroup__getnewargs__():
  13. x, y, z = map(Symbol, "xyz")
  14. assert FreeGroup("x, y, z").__getnewargs__() == ((x, y, z),)
  15. def test_free_group():
  16. G, a, b, c = free_group("a, b, c")
  17. assert F.generators == (x, y, z)
  18. assert x*z**2 in F
  19. assert x in F
  20. assert y*z**-1 in F
  21. assert (y*z)**0 in F
  22. assert a not in F
  23. assert a**0 not in F
  24. assert len(F) == 3
  25. assert str(F) == '<free group on the generators (x, y, z)>'
  26. assert not F == G
  27. assert F.order() is oo
  28. assert F.is_abelian == False
  29. assert F.center() == {F.identity}
  30. (e,) = free_group("")
  31. assert e.order() == 1
  32. assert e.generators == ()
  33. assert e.elements == {e.identity}
  34. assert e.is_abelian == True
  35. def test_FreeGroup__hash__():
  36. assert hash(F)
  37. def test_FreeGroup__eq__():
  38. assert free_group("x, y, z")[0] == free_group("x, y, z")[0]
  39. assert free_group("x, y, z")[0] is free_group("x, y, z")[0]
  40. assert free_group("x, y, z")[0] != free_group("a, x, y")[0]
  41. assert free_group("x, y, z")[0] is not free_group("a, x, y")[0]
  42. assert free_group("x, y")[0] != free_group("x, y, z")[0]
  43. assert free_group("x, y")[0] is not free_group("x, y, z")[0]
  44. assert free_group("x, y, z")[0] != free_group("x, y")[0]
  45. assert free_group("x, y, z")[0] is not free_group("x, y")[0]
  46. def test_FreeGroup__getitem__():
  47. assert F[0:] == FreeGroup("x, y, z")
  48. assert F[1:] == FreeGroup("y, z")
  49. assert F[2:] == FreeGroup("z")
  50. def test_FreeGroupElm__hash__():
  51. assert hash(x*y*z)
  52. def test_FreeGroupElm_copy():
  53. f = x*y*z**3
  54. g = f.copy()
  55. h = x*y*z**7
  56. assert f == g
  57. assert f != h
  58. def test_FreeGroupElm_inverse():
  59. assert x.inverse() == x**-1
  60. assert (x*y).inverse() == y**-1*x**-1
  61. assert (y*x*y**-1).inverse() == y*x**-1*y**-1
  62. assert (y**2*x**-1).inverse() == x*y**-2
  63. def test_FreeGroupElm_type_error():
  64. raises(TypeError, lambda: 2/x)
  65. raises(TypeError, lambda: x**2 + y**2)
  66. raises(TypeError, lambda: x/2)
  67. def test_FreeGroupElm_methods():
  68. assert (x**0).order() == 1
  69. assert (y**2).order() is oo
  70. assert (x**-1*y).commutator(x) == y**-1*x**-1*y*x
  71. assert len(x**2*y**-1) == 3
  72. assert len(x**-1*y**3*z) == 5
  73. def test_FreeGroupElm_eliminate_word():
  74. w = x**5*y*x**2*y**-4*x
  75. assert w.eliminate_word( x, x**2 ) == x**10*y*x**4*y**-4*x**2
  76. w3 = x**2*y**3*x**-1*y
  77. assert w3.eliminate_word(x, x**2) == x**4*y**3*x**-2*y
  78. assert w3.eliminate_word(x, y) == y**5
  79. assert w3.eliminate_word(x, y**4) == y**8
  80. assert w3.eliminate_word(y, x**-1) == x**-3
  81. assert w3.eliminate_word(x, y*z) == y*z*y*z*y**3*z**-1
  82. assert (y**-3).eliminate_word(y, x**-1*z**-1) == z*x*z*x*z*x
  83. #assert w3.eliminate_word(x, y*x) == y*x*y*x**2*y*x*y*x*y*x*z**3
  84. #assert w3.eliminate_word(x, x*y) == x*y*x**2*y*x*y*x*y*x*y*z**3
  85. def test_FreeGroupElm_array_form():
  86. assert (x*z).array_form == ((Symbol('x'), 1), (Symbol('z'), 1))
  87. assert (x**2*z*y*x**-2).array_form == \
  88. ((Symbol('x'), 2), (Symbol('z'), 1), (Symbol('y'), 1), (Symbol('x'), -2))
  89. assert (x**-2*y**-1).array_form == ((Symbol('x'), -2), (Symbol('y'), -1))
  90. def test_FreeGroupElm_letter_form():
  91. assert (x**3).letter_form == (Symbol('x'), Symbol('x'), Symbol('x'))
  92. assert (x**2*z**-2*x).letter_form == \
  93. (Symbol('x'), Symbol('x'), -Symbol('z'), -Symbol('z'), Symbol('x'))
  94. def test_FreeGroupElm_ext_rep():
  95. assert (x**2*z**-2*x).ext_rep == \
  96. (Symbol('x'), 2, Symbol('z'), -2, Symbol('x'), 1)
  97. assert (x**-2*y**-1).ext_rep == (Symbol('x'), -2, Symbol('y'), -1)
  98. assert (x*z).ext_rep == (Symbol('x'), 1, Symbol('z'), 1)
  99. def test_FreeGroupElm__mul__pow__():
  100. x1 = x.group.dtype(((Symbol('x'), 1),))
  101. assert x**2 == x1*x
  102. assert (x**2*y*x**-2)**4 == x**2*y**4*x**-2
  103. assert (x**2)**2 == x**4
  104. assert (x**-1)**-1 == x
  105. assert (x**-1)**0 == F.identity
  106. assert (y**2)**-2 == y**-4
  107. assert x**2*x**-1 == x
  108. assert x**2*y**2*y**-1 == x**2*y
  109. assert x*x**-1 == F.identity
  110. assert x/x == F.identity
  111. assert x/x**2 == x**-1
  112. assert (x**2*y)/(x**2*y**-1) == x**2*y**2*x**-2
  113. assert (x**2*y)/(y**-1*x**2) == x**2*y*x**-2*y
  114. assert x*(x**-1*y*z*y**-1) == y*z*y**-1
  115. assert x**2*(x**-2*y**-1*z**2*y) == y**-1*z**2*y
  116. a = F.identity
  117. for n in range(10):
  118. assert a == x**n
  119. assert a**-1 == x**-n
  120. a *= x
  121. def test_FreeGroupElm__len__():
  122. assert len(x**5*y*x**2*y**-4*x) == 13
  123. assert len(x**17) == 17
  124. assert len(y**0) == 0
  125. def test_FreeGroupElm_comparison():
  126. assert not (x*y == y*x)
  127. assert x**0 == y**0
  128. assert x**2 < y**3
  129. assert not x**3 < y**2
  130. assert x*y < x**2*y
  131. assert x**2*y**2 < y**4
  132. assert not y**4 < y**-4
  133. assert not y**4 < x**-4
  134. assert y**-2 < y**2
  135. assert x**2 <= y**2
  136. assert x**2 <= x**2
  137. assert not y*z > z*y
  138. assert x > x**-1
  139. assert not x**2 >= y**2
  140. def test_FreeGroupElm_syllables():
  141. w = x**5*y*x**2*y**-4*x
  142. assert w.number_syllables() == 5
  143. assert w.exponent_syllable(2) == 2
  144. assert w.generator_syllable(3) == Symbol('y')
  145. assert w.sub_syllables(1, 2) == y
  146. assert w.sub_syllables(3, 3) == F.identity
  147. def test_FreeGroup_exponents():
  148. w1 = x**2*y**3
  149. assert w1.exponent_sum(x) == 2
  150. assert w1.exponent_sum(x**-1) == -2
  151. assert w1.generator_count(x) == 2
  152. w2 = x**2*y**4*x**-3
  153. assert w2.exponent_sum(x) == -1
  154. assert w2.generator_count(x) == 5
  155. def test_FreeGroup_generators():
  156. assert (x**2*y**4*z**-1).contains_generators() == {x, y, z}
  157. assert (x**-1*y**3).contains_generators() == {x, y}
  158. def test_FreeGroupElm_words():
  159. w = x**5*y*x**2*y**-4*x
  160. assert w.subword(2, 6) == x**3*y
  161. assert w.subword(3, 2) == F.identity
  162. assert w.subword(6, 10) == x**2*y**-2
  163. assert w.substituted_word(0, 7, y**-1) == y**-1*x*y**-4*x
  164. assert w.substituted_word(0, 7, y**2*x) == y**2*x**2*y**-4*x