def test_is_normal():
    gens_s5 = [Permutation(p) for p in [[1, 2, 3, 4, 0], [2, 1, 4, 0, 3]]]
    G1 = PermutationGroup(gens_s5)
    assert G1.order() == 120
    gens_a5 = [Permutation(p) for p in [[1, 0, 3, 2, 4], [2, 1, 4, 3, 0]]]
    G2 = PermutationGroup(gens_a5)
    assert G2.order() == 60
    assert G2.is_normal(G1)
    gens3 = [Permutation(p) for p in [[2, 1, 3, 0, 4], [1, 2, 0, 3, 4]]]
    G3 = PermutationGroup(gens3)
    assert not G3.is_normal(G1)
    assert G3.order() == 12
    G4 = G1.normal_closure(G3.generators)
    assert G4.order() == 60
    gens5 = [Permutation(p) for p in [[1, 2, 3, 0, 4], [1, 2, 0, 3, 4]]]
    G5 = PermutationGroup(gens5)
    assert G5.order() == 24
    G6 = G1.normal_closure(G5.generators)
    assert G6.order() == 120
    assert G1.is_subgroup(G6)
    assert not G1.is_subgroup(G4)
    assert G2.is_subgroup(G4)
    s4 = PermutationGroup(Permutation(0, 1, 2, 3), Permutation(3)(0, 1))
    s6 = PermutationGroup(Permutation(0, 1, 2, 3, 5), Permutation(5)(0, 1))
    assert s6.is_normal(s4, strict=False)
    assert not s4.is_normal(s6, strict=False)
Exemple #2
0
def test_PermutationGroup():
    assert PermutationGroup() == PermutationGroup(Permutation())

    a = Permutation(1, 2)
    b = Permutation(2, 3, 1)
    G = PermutationGroup(a, b, degree=5)
    assert G.contains(G[0])

    A = AlternatingGroup(4)
    A.schreier_sims()
    assert A.base == [0, 1]
    assert A.basic_stabilizers == [
        PermutationGroup(Permutation(0, 1, 2), Permutation(1, 2, 3)),
        PermutationGroup(Permutation(1, 2, 3))
    ]

    D = DihedralGroup(12)
    assert D.is_primitive(randomized=False) is False

    D = DihedralGroup(10)
    assert D.is_primitive() is False

    p = Permutation(0, 1, 2, 3, 4, 5)
    G1 = PermutationGroup([Permutation(0, 1, 2), Permutation(0, 1)])
    G2 = PermutationGroup([Permutation(0, 2), Permutation(0, 1, 2)])
    G3 = PermutationGroup([p, p**2])
    assert G1.order() == G2.order() == G3.order() == 6
    assert G1.is_subgroup(G2) is True
    assert G1.is_subgroup(G3) is False

    a, b = [Permutation([1, 0, 3, 2]), Permutation([1, 3, 0, 2])]
    G = PermutationGroup([a, b])
    assert G.make_perm([0, 1, 0]) == Permutation(0, 2, 3, 1)

    S = SymmetricGroup(5)
    base, strong_gens = S.schreier_sims_random()
    assert _verify_bsgs(S, base, strong_gens)

    D = DihedralGroup(4)
    assert D.strong_gens == [
        Permutation(0, 1, 2, 3),
        Permutation(0, 3)(1, 2),
        Permutation(1, 3)
    ]

    a = Permutation([1, 2, 0])
    b = Permutation([1, 0, 2])
    G = PermutationGroup([a, b])
    assert G.transitivity_degree == 3

    a = Permutation([1, 2, 0, 4, 5, 6, 3])
    G = PermutationGroup([a])
    assert G.orbit(0) == {0, 1, 2}
    assert G.orbit([0, 4], 'union') == {0, 1, 2, 3, 4, 5, 6}
    assert G.orbit([0, 4], 'sets') == {(0, 3), (0, 4), (0, 5), (0, 6), (1, 3),
                                       (1, 4), (1, 5), (1, 6), (2, 3), (2, 4),
                                       (2, 5), (2, 6)}
    assert G.orbit([0, 4], 'tuples') == {(0, 3), (0, 4), (0, 5), (0, 6),
                                         (1, 3), (1, 4), (1, 5), (1, 6),
                                         (2, 3), (2, 4), (2, 5), (2, 6)}
def test_rubik1():
    gens = rubik_cube_generators()
    gens1 = [gens[-1]] + [p**2 for p in gens[1:]]
    G1 = PermutationGroup(gens1)
    assert G1.order() == 19508428800
    gens2 = [p**2 for p in gens]
    G2 = PermutationGroup(gens2)
    assert G2.order() == 663552
    assert G2.is_subgroup(G1, 0)
    C1 = G1.derived_subgroup()
    assert C1.order() == 4877107200
    assert C1.is_subgroup(G1, 0)
    assert not G2.is_subgroup(C1, 0)

    G = RubikGroup(2)
    assert G.order() == 3674160

    pytest.raises(ValueError, lambda: RubikGroup(0))
    pytest.raises(ValueError, lambda: rubik(1))

    G = RubikGroup(3)
    assert G.order() == 43252003274489856000
def test_derived_subgroup():
    a = Permutation([1, 0, 2, 4, 3])
    b = Permutation([0, 1, 3, 2, 4])
    G = PermutationGroup([a, b])
    C = G.derived_subgroup()
    assert C.order() == 3
    assert C.is_normal(G)
    assert C.is_subgroup(G, 0)
    assert not G.is_subgroup(C, 0)
    gens_cube = [[1, 3, 5, 7, 0, 2, 4, 6], [1, 3, 0, 2, 5, 7, 4, 6]]
    gens = [Permutation(p) for p in gens_cube]
    G = PermutationGroup(gens)
    C = G.derived_subgroup()
    assert C.order() == 12
def test_eq():
    a = [[1, 2, 0, 3, 4, 5], [1, 0, 2, 3, 4, 5], [2, 1, 0, 3, 4, 5], [
        1, 2, 0, 3, 4, 5]]
    a = [Permutation(p) for p in a + [[1, 2, 3, 4, 5, 0]]]
    g = Permutation([1, 2, 3, 4, 5, 0])
    G1, G2, G3 = [PermutationGroup(x) for x in [a[:2], a[2:4], [g, g**2]]]
    assert G1.order() == G2.order() == G3.order() == 6
    assert G1.is_subgroup(G2)
    assert not G1.is_subgroup(G3)
    G4 = PermutationGroup([Permutation([0, 1])])
    assert not G1.is_subgroup(G4)
    assert G4.is_subgroup(G1, 0)
    assert PermutationGroup(g, g).is_subgroup(PermutationGroup(g))
    assert SymmetricGroup(3).is_subgroup(SymmetricGroup(4), 0)
    assert SymmetricGroup(3).is_subgroup(SymmetricGroup(3)*CyclicGroup(5), 0)
    assert not CyclicGroup(5).is_subgroup(SymmetricGroup(3)*CyclicGroup(5), 0)
    assert CyclicGroup(3).is_subgroup(SymmetricGroup(3)*CyclicGroup(5), 0)