Пример #1
0
def make_random_homogeneous():
    # use rotation group

    #seed(1)

    ngens = 6
    a, ai, b, bi, c, ci = range(ngens)
    i_rels = [
        (ai, a),
        (bi, b),
        (ci, c),
        (a, ) * 5,
        (b, ) * 2,
        (c, ) * 4,
        (a, b, c),
    ]

    while 1:
        rels = []
        for i in range(argv.get("nwords", 2)):
            gen = tuple(
                choice([a, b, c]) for k in range(argv.get("wordlen", 100)))
            rels.append(gen)
            gen = (ci, ) + gen + (c, )
            rels.append(gen)
            gen = (ci, ) + gen + (c, )
            rels.append(gen)

        rels = [reduce_word(i_rels, rel) for rel in rels]

        graph = Schreier(ngens, i_rels)
        if not graph.build(rels, maxsize=10400):
            print(choice("/\\"), end="", flush=True)
            continue

        n = len(graph)
        if n <= argv.get("minsize", 12):
            print('.', end="", flush=True)
            continue

        print("[%d]" % n, flush=True, end="")

        # how big did the graph get? compare with maxsize above
        print("(%d) " % len(graph.neighbors), flush=True, end="")

        try:
            gens = graph.get_gens()
        except AssertionError:
            print("** FAIL **")
            continue

        items = list(range(n))
        print()
        break

        N = argv.get("N", 10000)
        perms = mulclose(gens, maxsize=N)
        if len(perms) >= N:
            #print("|G| = ?")
            continue

        print()
        print(rels)
        G = Group(perms, items)
        G.gens = gens
        print("|G| =", len(G))

        rels = [reduce(mul, [gens[i] for i in rel]) for rel in rels]
        H = Coset(mulclose(rels), items)
        print("|H| =", len(H))
        assert len(G) % len(H) == 0
        print("[H:G] = ", len(G) // len(H))

        N = []
        for g in G:
            lhs = g * H
            rhs = H * g
            if lhs == rhs:
                N.append(g)
        assert len(N) % len(H) == 0
        print("[H:N(H)] =", len(N) // len(H))

    print(rels)

    a, ai, b, bi, c, ci = gens
    assert (a**5).is_identity()
    assert (b**2).is_identity()
    assert (c**4).is_identity()
    assert (a * b * c).is_identity()

    print(a.fixed())
    print(b.fixed())
    print(c.fixed())

    print(a.orbits())
    print(b.orbits())
    print(c.orbits())
Пример #2
0
def make_random_homogeneous_refl():

    seed(1)

    ngens = 6
    a, ai, b, bi, c, ci = range(ngens)
    i_rels = [
        (ai, a),
        (bi, b),
        (ci, c),
        (a, ) * 2,
        (b, ) * 2,
        (c, ) * 2,
        (a, b) * 5,
        (b, c) * 5,
        (a, c) * 2,
    ]

    while 1:
        rels = []
        for i in range(4):
            gen = ()
            for k in range(20):
                gen += choice([(a, b), (a, c), (b, c)])
            rels.append(gen)

        # G/H = 720/24 = 30, N(H)=24
        _rels = [(0, 2, 2, 4, 0, 4, 2, 4, 2, 4, 0, 4, 0, 4, 2, 4, 0, 2, 0, 4,
                  2, 4, 0, 4, 2, 4, 0, 2, 0, 2, 0, 2, 2, 4, 2, 4, 2, 4, 2, 4),
                 (0, 2, 2, 4, 0, 4, 2, 4, 0, 2, 0, 4, 0, 2, 0, 4, 0, 4, 0, 2,
                  0, 2, 0, 2, 0, 4, 0, 4, 2, 4, 0, 4, 0, 2, 0, 2, 2, 4, 0, 2),
                 (0, 2, 2, 4, 2, 4, 2, 4, 2, 4, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4,
                  0, 2, 0, 2, 0, 4, 0, 2, 0, 2, 2, 4, 0, 4, 0, 2, 0, 4, 0, 2),
                 (0, 2, 0, 4, 0, 4, 2, 4, 0, 4, 0, 2, 0, 2, 2, 4, 0, 4, 0, 4,
                  0, 2, 0, 4, 0, 2, 0, 2, 2, 4, 0, 2, 2, 4, 2, 4, 0, 4, 0, 2)]

        # G/H = 9720/324 = 30, N(H)=1944
        _rels = [(0, 4, 0, 2, 0, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 0, 4, 0, 2,
                  0, 2, 0, 4, 2, 4, 0, 2, 0, 2, 0, 2, 2, 4, 0, 2, 0, 4, 0, 4),
                 (0, 4, 2, 4, 0, 2, 0, 2, 0, 2, 2, 4, 0, 2, 0, 2, 2, 4, 2, 4,
                  0, 4, 2, 4, 0, 4, 2, 4, 0, 4, 0, 2, 2, 4, 0, 2, 2, 4, 0, 2),
                 (0, 4, 0, 4, 0, 4, 0, 2, 0, 4, 0, 4, 2, 4, 0, 4, 0, 2, 0, 2,
                  0, 4, 0, 2, 0, 2, 0, 2, 0, 4, 0, 4, 0, 4, 2, 4, 0, 2, 2, 4),
                 (2, 4, 2, 4, 0, 4, 2, 4, 0, 2, 0, 4, 0, 4, 2, 4, 2, 4, 2, 4,
                  2, 4, 2, 4, 0, 4, 0, 4, 2, 4, 2, 4, 2, 4, 0, 4, 0, 2, 2, 4)]

        graph = Schreier(ngens, i_rels)
        if not graph.build(rels, maxsize=10400):
            print(choice("/\\"), end="", flush=True)
            continue

        n = len(graph)
        if n <= 24:
            continue

        print("\n[%d]" % n)  #, flush=True, end="")
        print(len(graph.neighbors)
              )  # how big did the graph get? compare with maxsize above

        try:
            gens = graph.get_gens()
        except AssertionError:
            print("** FAIL **")
            continue

        N = 10000
        perms = mulclose(gens, maxsize=N)
        if len(perms) >= N:
            print("|G| = ?")
            continue

        print(rels)
        items = list(range(n))
        G = Group(perms, items)
        G.gens = gens
        print("|G| =", len(G))
        print()

        break

    rels = [reduce(mul, [gens[i] for i in rel]) for rel in rels]
    H = Coset(mulclose(rels), items)
    print(len(H))
    print(len(G) / len(H))

    N = []
    for g in G:
        lhs = g * H
        rhs = H * g
        if lhs == rhs:
            N.append(g)
    print(len(N))