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())
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))