test_util.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from sympy.combinatorics.named_groups import SymmetricGroup, DihedralGroup,\
  2. AlternatingGroup
  3. from sympy.combinatorics.permutations import Permutation
  4. from sympy.combinatorics.util import _check_cycles_alt_sym, _strip,\
  5. _distribute_gens_by_base, _strong_gens_from_distr,\
  6. _orbits_transversals_from_bsgs, _handle_precomputed_bsgs, _base_ordering,\
  7. _remove_gens
  8. from sympy.combinatorics.testutil import _verify_bsgs
  9. def test_check_cycles_alt_sym():
  10. perm1 = Permutation([[0, 1, 2, 3, 4, 5, 6], [7], [8], [9]])
  11. perm2 = Permutation([[0, 1, 2, 3, 4, 5], [6, 7, 8, 9]])
  12. perm3 = Permutation([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
  13. assert _check_cycles_alt_sym(perm1) is True
  14. assert _check_cycles_alt_sym(perm2) is False
  15. assert _check_cycles_alt_sym(perm3) is False
  16. def test_strip():
  17. D = DihedralGroup(5)
  18. D.schreier_sims()
  19. member = Permutation([4, 0, 1, 2, 3])
  20. not_member1 = Permutation([0, 1, 4, 3, 2])
  21. not_member2 = Permutation([3, 1, 4, 2, 0])
  22. identity = Permutation([0, 1, 2, 3, 4])
  23. res1 = _strip(member, D.base, D.basic_orbits, D.basic_transversals)
  24. res2 = _strip(not_member1, D.base, D.basic_orbits, D.basic_transversals)
  25. res3 = _strip(not_member2, D.base, D.basic_orbits, D.basic_transversals)
  26. assert res1[0] == identity
  27. assert res1[1] == len(D.base) + 1
  28. assert res2[0] == not_member1
  29. assert res2[1] == len(D.base) + 1
  30. assert res3[0] != identity
  31. assert res3[1] == 2
  32. def test_distribute_gens_by_base():
  33. base = [0, 1, 2]
  34. gens = [Permutation([0, 1, 2, 3]), Permutation([0, 1, 3, 2]),
  35. Permutation([0, 2, 3, 1]), Permutation([3, 2, 1, 0])]
  36. assert _distribute_gens_by_base(base, gens) == [gens,
  37. [Permutation([0, 1, 2, 3]),
  38. Permutation([0, 1, 3, 2]),
  39. Permutation([0, 2, 3, 1])],
  40. [Permutation([0, 1, 2, 3]),
  41. Permutation([0, 1, 3, 2])]]
  42. def test_strong_gens_from_distr():
  43. strong_gens_distr = [[Permutation([0, 2, 1]), Permutation([1, 2, 0]),
  44. Permutation([1, 0, 2])], [Permutation([0, 2, 1])]]
  45. assert _strong_gens_from_distr(strong_gens_distr) == \
  46. [Permutation([0, 2, 1]),
  47. Permutation([1, 2, 0]),
  48. Permutation([1, 0, 2])]
  49. def test_orbits_transversals_from_bsgs():
  50. S = SymmetricGroup(4)
  51. S.schreier_sims()
  52. base = S.base
  53. strong_gens = S.strong_gens
  54. strong_gens_distr = _distribute_gens_by_base(base, strong_gens)
  55. result = _orbits_transversals_from_bsgs(base, strong_gens_distr)
  56. orbits = result[0]
  57. transversals = result[1]
  58. base_len = len(base)
  59. for i in range(base_len):
  60. for el in orbits[i]:
  61. assert transversals[i][el](base[i]) == el
  62. for j in range(i):
  63. assert transversals[i][el](base[j]) == base[j]
  64. order = 1
  65. for i in range(base_len):
  66. order *= len(orbits[i])
  67. assert S.order() == order
  68. def test_handle_precomputed_bsgs():
  69. A = AlternatingGroup(5)
  70. A.schreier_sims()
  71. base = A.base
  72. strong_gens = A.strong_gens
  73. result = _handle_precomputed_bsgs(base, strong_gens)
  74. strong_gens_distr = _distribute_gens_by_base(base, strong_gens)
  75. assert strong_gens_distr == result[2]
  76. transversals = result[0]
  77. orbits = result[1]
  78. base_len = len(base)
  79. for i in range(base_len):
  80. for el in orbits[i]:
  81. assert transversals[i][el](base[i]) == el
  82. for j in range(i):
  83. assert transversals[i][el](base[j]) == base[j]
  84. order = 1
  85. for i in range(base_len):
  86. order *= len(orbits[i])
  87. assert A.order() == order
  88. def test_base_ordering():
  89. base = [2, 4, 5]
  90. degree = 7
  91. assert _base_ordering(base, degree) == [3, 4, 0, 5, 1, 2, 6]
  92. def test_remove_gens():
  93. S = SymmetricGroup(10)
  94. base, strong_gens = S.schreier_sims_incremental()
  95. new_gens = _remove_gens(base, strong_gens)
  96. assert _verify_bsgs(S, base, new_gens) is True
  97. A = AlternatingGroup(7)
  98. base, strong_gens = A.schreier_sims_incremental()
  99. new_gens = _remove_gens(base, strong_gens)
  100. assert _verify_bsgs(A, base, new_gens) is True
  101. D = DihedralGroup(2)
  102. base, strong_gens = D.schreier_sims_incremental()
  103. new_gens = _remove_gens(base, strong_gens)
  104. assert _verify_bsgs(D, base, new_gens) is True