Exemplo n.º 1
0
 def test_insert(self):
     self.assertEqual(self.group.order(), 1)
     self.group.insert(Perm()(0, 1, 2)(3, 5, 4))
     self.assertEqual(self.group.order(), 3)
     self.group.insert(Perm()(0, 3)(1, 4)(2, 5))
     self.assertEqual(self.group.order(), 6)
     self.group.insert(Perm()(0, 6)(1, 7)(2, 8))
     self.assertEqual(self.group.order(), 6 * 9)
Exemplo n.º 2
0
 def test_orbits2(self):
     self.N = 4
     self.group = Group()
     self.group.insert(Perm()(0, 1))
     self.group.insert(Perm()(2, 3))
     self.assertFalse(self.group.is_transitive(points=range(self.N)))
     self.assertEqual(self.group.orbits(range(self.N)), [[0, 1], [2, 3]])
     self.assertEqual(self.group.orbits([0, 1]), [[0, 1]])
     self.assertEqual(self.group.orbits([0, 1, 2]), [[0, 1], [2, 3]])
Exemplo n.º 3
0
 def test_lehmer(self):
     size = 4
     p = Perm()(0,3)(1,2)   # [3, 2, 1, 0]
     self.assertEqual(p.inversion_vector(size), [3, 2, 1, 0])
     self.assertEqual(self.E.rank_lex(size), 0)
     self.assertEqual(self.R1.rank_lex(size), 7)
     self.assertEqual(self.P1.rank_lex(size), 2)
     self.assertEqual(self.H.rank_lex(size), 10)
     self.assertEqual(Perm.unrank_lex(size, 17), Perm()(0, 2, 1, 3))
Exemplo n.º 4
0
 def test_group(self):
     self.assertEqual(self.group.order(), 4)
     self.assertFalse(self.group.is_trivial())
     self.assertTrue(Perm() in self.group)
     self.assertTrue(self.H in self.group)
     points = range(self.N)
     self.assertFalse(Perm()(*points) in self.group)
     self.assertEqual(self.group.orbits(points), [[0, 4, 2, 1], [3, 5]])
     self.assertEqual(len(self.group.orbits(points)), 2)
     self.assertFalse(self.group.is_transitive(points))
Exemplo n.º 5
0
 def test_is_normal(self):
     a = Perm()(0, 1, 2)
     b = Perm()(0, 1)
     c = Perm()(0, 2, 1)
     G = Group()
     G.insert(a)
     G.insert(b)
     self.assertEqual(G.order(), 6)  # G = S_3
     H = Group()
     H.insert(a)
     H.insert(c)
     self.assertEqual(H.order(), 3)  # H = A_3
     self.assertTrue(H.is_normal(G))
Exemplo n.º 6
0
 def test_alt_5(self):
     self.N = 5
     self.group = Group()
     self.assertEqual(self.group.order(), 1)
     self.group.insert(Perm()(0, 1, 2))
     self.assertEqual(self.group.order(), 3)
     self.group.insert(Perm()(1, 2, 3))
     self.assertEqual(self.group.order(), 12)
     self.group.insert(Perm()(2, 3, 4))
     self.assertEqual(self.group.order(), 60)
     self.assertFalse(Perm()(0, 1) in self.group)
     self.assertTrue(Perm()(*range(self.N)) in self.group)  # N is odd
     self.assertTrue(self.group.is_transitive(points=range(self.N)))
     self.assertEqual(len(self.group.orbits(range(self.N))), 1)
Exemplo n.º 7
0
 def setUp(self):
     self.N = 6
     self.assertTrue(self.N > 2)
     self.group = Group()
     self.H = Perm()(*range(self.N))
     self.group.insert(self.H)
     left = 1
     right = self.N - 1
     perm = Perm()
     while left < right:
         perm = perm * Perm()(left, right)
         left = left + 1
         right = right - 1
     self.group.insert(perm)
Exemplo n.º 8
0
 def test_normal_closure(self):
     n = 5
     # Tworze grupe cykliczna C_5.
     C5 = Group()
     C5.insert(Perm()(*range(n)))
     self.assertEqual(C5.order(), n)
     # Make Sym(5).
     S5 = Group()
     S5.insert(Perm()(*range(n)))
     S5.insert(Perm()(0, 1))
     self.assertEqual(S5.order(), 120)
     A5 = S5.normal_closure(C5)
     self.assertEqual(A5.order(), 60)
     for perm in A5.iterperms():
         self.assertTrue(perm.is_even())
Exemplo n.º 9
0
 def test_normal_closure(self):
     n = 5
     # Make Cyclic(5).
     C5 = Group()
     C5.insert(Perm()(*range(n)))
     self.assertEqual(C5.order(), n)
     # Make Sym(5).
     S5 = Group()
     S5.insert(Perm()(*range(n)))
     S5.insert(Perm()(0, 1))
     self.assertEqual(S5.order(), 120)
     A5 = S5.normal_closure(C5)  # we get Alt(5)
     self.assertEqual(A5.order(), 60)
     for perm in A5:
         self.assertTrue(perm.is_even())
Exemplo n.º 10
0
 def test_orbits4(self):
     self.N = 10
     self.group = Group()
     self.group.insert(Perm()(0, 1, 2))
     self.assertFalse(self.group.is_transitive(points=range(self.N)))
     self.assertTrue(
         self.group.is_transitive(strict=False, points=range(self.N)))
Exemplo n.º 11
0
 def test_cyclic6(self):
     points = range(5)
     C6 = Group()
     C6.insert(Perm()(0, 1, 2)(3, 4))
     self.assertEqual(C6.order(), 6)
     self.assertEqual(C6.orbits(points), [[0, 2, 1], [3, 4]])
     self.assertEqual(len(C6.orbits(points)), 2)
     self.assertFalse(C6.is_transitive(points))
Exemplo n.º 12
0
 def test_is_subgroup(self):
     self.group2 = Group()
     # Make cyclic group C_N.
     self.group2.insert(Perm()(*range(self.N)))
     self.assertEqual(self.group2.order(), self.N)
     self.assertTrue(self.group2.is_subgroup(self.group1))
     self.assertTrue(self.group2.is_abelian())
     self.assertFalse(self.group1.is_abelian())
     self.assertFalse(self.group2.is_normal(self.group1))
Exemplo n.º 13
0
 def test_orbits1(self):
     self.N = 3
     self.group = Group()
     self.group.insert(Perm()(0, 1))
     self.assertEqual(self.group.orbits(range(self.N)), [[0, 1], [2]])
     self.assertEqual(self.group.orbits([0, 1]), [[0, 1]])
     self.assertFalse(self.group.is_transitive(points=range(self.N)))
     self.assertTrue(
         self.group.is_transitive(points=range(self.N), strict=False))
Exemplo n.º 14
0
 def test_is_subgroup(self):
     self.group2 = Group()
     # Tworze grupe cykliczna C_N.
     self.group2.insert(Perm()(*range(self.N)))
     self.assertEqual(self.group2.order(), self.N)
     self.assertTrue(self.group2.is_subgroup(self.group1))
     self.assertTrue(self.group2.is_abelian())
     self.assertFalse(self.group1.is_abelian())
     self.assertFalse(self.group2.is_normal(self.group1))
Exemplo n.º 15
0
 def test_alt_n(self):
     self.N = 5
     self.assertTrue(self.N > 2)
     self.group = Group()
     order = 1
     for i in range(self.N - 2):
         self.group.insert(Perm()(i, i + 1, i + 2))
         order = order * (i + 3)
         self.assertEqual(self.group.order(), order)
     self.assertTrue(self.group.is_transitive(points=range(self.N)))
     self.assertEqual(len(self.group.orbits(range(self.N))), 1)
Exemplo n.º 16
0
 def test_centralizer(self):
     # Tworze grupe cykliczna.
     self.group2 = Group()
     self.group2.insert(Perm()(*range(self.N)))
     self.assertEqual(self.group2.order(), self.N)
     # centrum grupy abelowej cyklicznej to cala grupa
     self.group3 = self.group2.center()
     self.assertEqual(self.group3.order(), self.N)
     # Dalej dla grupy symetrycznej.
     self.group2 = self.group1.center()
     self.assertEqual(self.group2.order(), 1)
Exemplo n.º 17
0
 def action(self, points):
     """Return a new group induced by the action."""
     # Sprawdzamy, czy grupa jest tranzytywna na punktach.
     if not self.is_transitive(points):
         raise TypeError("the group is not transitive on points")
     adict = dict()
     for i, pt in enumerate(points):
         adict[pt] = i
     new_group = Group()
     for perm in self:
         new_data = [adict[perm[pt]] for pt in points]
         new_group.insert(Perm(data=new_data))
     return new_group
Exemplo n.º 18
0
 def setUp(self):
     self.N = 21
     self.group = Group()
     self.order_rubik2 = 3674160  # 6 * 9 * 12 * 15 * 18 * 21
     R1 = Perm()(2, 13, 19, 4) * Perm()(3, 11, 0, 6) * Perm()(7, 8, 10, 9)
     D1 = Perm()(5, 9, 13, 16) * Perm()(6, 10, 14, 17) * Perm()(18, 19, 0,
                                                                20)
     B1 = Perm()(1, 16, 0, 8) * Perm()(2, 15, 20, 10) * Perm()(11, 12, 14,
                                                               13)
     R2 = R1 * R1
     R3 = R1 * R2
     D2 = D1 * D1
     D3 = D1 * D2
     B2 = B1 * B1
     B3 = B1 * B2
     self.generators = [R1, D1, B1]
     # cwiartki i polowki
     self.face_turns = [R1, R2, R3, D1, D2, D3, B1, B2, B3]
     # tylko cwiartki
     self.quarter_turns = [R1, R3, D1, D3, B1, B3]
Exemplo n.º 19
0
 def setUp(self):
     self.E = Perm()
     self.R1 = Perm()(0, 1)(2, 3)
     self.R2 = Perm()(0, 2)(1, 3)
     self.P1 = Perm()(1, 2)
     self.H = Perm()(0, 1, 3, 2)
Exemplo n.º 20
0
 def test_insert(self):
     self.assertEqual(self.group.order(), 2 * self.N)
     self.assertTrue(Perm() in self.group)
     self.assertTrue(self.H in self.group)
Exemplo n.º 21
0
 def __init__(self):
     """Load up a Group instance."""
     self.add(Perm())
Exemplo n.º 22
0
 def setUp(self):
     self.N = 4
     # Tworze grupe symetryczna.
     self.group1 = Group()
     self.group1.insert(Perm()(0, 1))
     self.group1.insert(Perm()(*range(self.N)))
Exemplo n.º 23
0
 def setUp(self):
     # The cyclic group from the paper by Knuth.
     self.N = 6
     self.H = Perm()(0, 1, 2, 4)(3, 5)
     self.group = Group()
     self.group.insert(self.H)
Exemplo n.º 24
0
 def __init__(self):
     """Load up a Group instance."""
     perm = Perm()
     self[perm.label()] = perm
Exemplo n.º 25
0
 def test_orbits3(self):  # grupa cykliczna
     self.N = 10
     self.group = Group()
     self.group.insert(Perm()(*range(self.N)))
     self.assertTrue(self.group.is_transitive(points=range(self.N)))
Exemplo n.º 26
0
class TestPerm(unittest.TestCase):

    def setUp(self):
        self.E = Perm()
        self.R1 = Perm()(0, 1)(2, 3)
        self.R2 = Perm()(0, 2)(1, 3)
        self.P1 = Perm()(1, 2)
        self.H = Perm()(0, 1, 3, 2)

    def test_init(self):
        self.assertEqual(self.P1, Perm()(*(1, 2)))
        self.assertEqual(self.P1, Perm(data=[0, 2, 1]))
        self.assertEqual(Perm(), Perm()(1)(2)) # singletony

    def test_repr(self):
        self.assertEqual(repr(self.E), "Perm()")
        self.assertEqual(repr(self.R1), "Perm()(0, 1)(2, 3)")
        self.assertEqual(repr(self.R2), "Perm()(0, 2)(1, 3)")
        self.assertEqual(repr(self.P1), "Perm()(1, 2)")
        self.assertEqual(repr(self.H), "Perm()(0, 1, 3, 2)")

    def test_label(self):
        self.assertEqual(self.E.label(), "0")
        self.assertEqual(self.E.label(3), "012")
        self.assertEqual(self.R1.label(), "1032")
        self.assertEqual(self.P1.label(), "021")
        self.assertEqual(self.H.label(), "1302")

    def test_identity(self):
        self.assertTrue(self.E.is_identity())
        self.assertFalse(self.R1.is_identity())
        self.assertFalse(self.H.is_identity())

    def test_mul(self):
        self.assertEqual(self.E * self.E, self.E)
        self.assertEqual(self.R1 * self.E, self.R1)
        self.assertEqual(self.R1 * self.R1, self.E)
        self.assertNotEqual(self.R1 * self.R2, self.E)

    def test_invert(self):
        self.assertEqual(~self.E, self.E)
        self.assertEqual(~self.R1, self.R1)
        self.assertEqual(~self.R2, self.R2)
        self.assertNotEqual(~self.H, self.H)
        self.assertEqual(self.H * ~self.H, self.E)

    def test_order(self):
        self.assertEqual(self.E.order(), 1)
        self.assertEqual(self.R1.order(), 2)
        self.assertEqual(self.P1.order(), 2)
        self.assertEqual(self.H.order(), 4)

    def test_cmp(self):
        self.assertTrue(self.E == Perm(data=[0, 1, 2]))
        self.assertFalse(self.H == self.E)
        self.assertTrue(self.H != self.H * self.H)
        self.assertTrue(self.E != self.H)

    def test_parity(self):
        self.assertEqual(self.E.parity(), 0)
        self.assertEqual(self.R1.parity(), 0)
        self.assertEqual(self.P1.parity(), 1)
        self.assertEqual(self.H.parity(), 1)
        self.assertFalse(self.H.is_even())
        self.assertTrue(self.H.is_odd())
        self.assertEqual(self.H.sign(), -1)

    def test_call(self):
        self.assertEqual(Perm()(0)(2)()(1, 3), Perm()(1, 3))
        self.assertEqual(Perm()(2, 3) * Perm()(1, 2), Perm()(1, 3, 2))
        self.assertEqual(Perm()(2, 3)(1,2), Perm()(1, 3, 2))
        self.assertEqual(Perm()(1, 2) * Perm()(2, 3), Perm()(1, 2, 3))
        self.assertEqual(Perm()(1, 2)(2, 3), Perm()(1, 2, 3))

    def test_getitem(self):
        self.assertEqual(self.H[0], 1)
        self.assertEqual(self.H[1], 3)
        self.assertEqual(self.H[2], 0)
        self.assertEqual(self.H[3], 2)
        self.assertEqual(self.H[8], 8)

    def test_pow(self):
        self.assertEqual(pow(self.H,0), self.E)
        self.assertEqual(pow(self.H,1), self.H)
        self.assertEqual(pow(self.H,-1), ~self.H)
        self.assertEqual(pow(self.H,4), self.E)
        self.assertEqual(pow(self.H,3), ~self.H)

    def test_min_max(self):
        self.assertEqual(self.E.min(), 0)  # konwencja
        self.assertEqual(self.E.max(), 0)  # konwencja
        self.assertEqual(self.H.min(), 0)
        self.assertEqual(self.H.max(), 3)
        self.assertEqual(self.P1.min(), 1)
        self.assertEqual(self.P1.max(), 2)

    def test_list(self):  # domyslnie wypisuje do perm.max()
        self.assertEqual(self.E.list(), [0])
        self.assertEqual(self.E.list(4), [0, 1, 2, 3])
        self.assertEqual(self.P1.list(), [0, 2, 1])
        # assertRaises(exception, callable, ...)
        self.assertRaises(ValueError, lambda: self.H.list(2))

    def test_support(self):
        self.assertEqual(self.E.support(), [])
        self.assertEqual(self.R1.support(), [0, 1, 2, 3])
        self.assertEqual(self.P1.support(), [1, 2])
        self.assertEqual(self.H.support(), [0, 1, 2, 3])

    def test_commutator(self):
        self.assertTrue(self.E.commutes_with(self.H))
        self.assertTrue(self.R1.commutes_with(self.R2))
        self.assertNotEqual(self.H.commutator(self.R1), self.E)

    def test_lehmer(self):
        size = 4
        p = Perm()(0,3)(1,2)   # [3, 2, 1, 0]
        self.assertEqual(p.inversion_vector(size), [3, 2, 1, 0])
        self.assertEqual(self.E.rank_lex(size), 0)
        self.assertEqual(self.R1.rank_lex(size), 7)
        self.assertEqual(self.P1.rank_lex(size), 2)
        self.assertEqual(self.H.rank_lex(size), 10)
        self.assertEqual(Perm.unrank_lex(size, 17), Perm()(0, 2, 1, 3))

    def test_hash(self):
        aset = set()
        aset.add(self.E)
        aset.add(self.E)  # ignored
        self.assertEqual(len(aset), 1)
        aset.add(self.H)
        aset.add(self.H)  # ignored
        self.assertEqual(len(aset), 2)

    def tearDown(self): pass
Exemplo n.º 27
0
 def __init__(self):
     """Load up a Group instance."""
     perm = Perm()
     self[perm.label()] = perm
Exemplo n.º 28
0
 def setUp(self):
     self.N = 4
     # Make symmetric group S_N.
     self.group1 = Group()
     self.group1.insert(Perm()(0, 1))
     self.group1.insert(Perm()(*range(self.N)))