def test_schreier_sims_algorithm_fixed_base(self): cf =Permutation.read_cycle_form a = cf([[1, 2]],4) b = cf([[1,2,3,4]], 4) c = cf([[2, 3, 4]], 4) d = cf([[2, 3], [1,4]], 4) e = cf([], 4) info = schreier_sims_algorithm_fixed_base([], [1,2,3,4], e) self.assertEquals(info, ([],[],[],[])) info = schreier_sims_algorithm_fixed_base([e,e,e,e], [1,2,3,4], e) self.assertEquals(info, ([],[],[],[])) base, gens, c_gens, graphs = schreier_sims_algorithm_fixed_base([a,b], [4,3], e) self.assertEquals(len(base), 3) self.assertEquals(base[:2], [4,3]) base, gens, c_gens, graphs = schreier_sims_algorithm_fixed_base([c,d], [4,1], e) self.assertEquals(base[:2], [4,1]) siftee = membership_siftee(a, graphs, base, e) self.assertNotEqual(siftee, e) siftee = membership_siftee(cf([[1,2,3]],4), graphs, base, e) self.assertEqual(siftee, e) base, gens, c_gens, graphs = schreier_sims_algorithm_fixed_base([c], [1,2,3,4], e) self.assertEquals(base[:2], [1,2]) siftee = membership_siftee(a, graphs, base, e) self.assertNotEqual(siftee, e) siftee = membership_siftee(cf([[2,4,3]],4), graphs, base, e) self.assertEqual(siftee, e)
def test_group_size(self): cf = Permutation.read_cycle_form a = cf([[1, 2, 3,4,5]],5) b = cf([[1,2,3]], 5) e = cf([],5) base, _, _, graphs = schreier_sims_algorithm_fixed_base([a,b],[1,2,3,4,5], e) self.assertEqual(group_size(graphs),60)
def fixed_base_group(cls, gens, base): if len(gens) > 0: g = gens[0] e = g ** -1 * g else: e = Permutation([1]) return cls(gens, schreier_sims_info=schreier_sims_tools.schreier_sims_algorithm_fixed_base(gens, base, e))
def test_base_image_member(self): cf =Permutation.read_cycle_form a = cf([[1, 2]],4) b = cf([[1,2,3,4]], 4) c = cf([[2,3]], 4) e = cf([],4) base, gens, c_gens, graphs = schreier_sims_algorithm_fixed_base([a,b],[1,2,3,4], e) self.assertEqual(base_image_member(base,[1,3,2],graphs,e), c)
def change_base(self, new_base): prefix_size = min(len(self.base), len(new_base)) if self.base[:prefix_size] != new_base[:prefix_size]: # the bases diverge at some (possibly redundant) point. # in the future this should be smarter and check for redundant elements # too but on the other hand that can also be taken care of in a # future version of schreier_sims_tools (i.e. provide support for base change) ss_info = schreier_sims_tools.schreier_sims_algorithm_fixed_base(self.generators, new_base, self.identity) self.base = ss_info[0] self.strong_generators = ss_info[1] self.chain_generators = ss_info[2] self.schreier_graphs = ss_info[3]
def test_memebership_index(self): cf = Permutation.read_cycle_form a = cf([[1, 2, 3,4,5]],5) b = cf([[1,2,3]], 5) c = cf([[1,2]], 5) e = cf([],5) ordering = [3,5,2,1,4] base, _, _, graphs = schreier_sims_algorithm_fixed_base([a,b], ordering, e) S5_base, _, _, S5_graphs = schreier_sims_algorithm_fixed_base([a,c], ordering, e) real_group = [] S5_group = [] ele_key = ordering_to_key(ordering) perm_key = ordering_to_perm_key(ordering) for index in range(group_size(S5_graphs)): S5_group.append(element_at_index(S5_base, S5_graphs, index, e, key=ele_key)) self.assertEquals(len(S5_group), 120) self.assertEquals(S5_group, sorted(S5_group, key = perm_key)) for index in range(group_size(graphs)): real_group.append(element_at_index(base, graphs, index, e, key=ele_key)) self.assertEquals(len(real_group), 60) self.assertEquals(real_group, sorted(real_group, key = perm_key)) for ele in S5_group: cand_index = membership_index(ele, graphs, base, e, key = ele_key) if cand_index > -1: #print("{}: {} {}?".format(cand_index, ele, real_group[cand_index])) self.assertTrue(ele in real_group) self.assertEquals(real_group[cand_index], ele) else: self.assertFalse(ele in real_group)
def test_element_at_index(self): cf = Permutation.read_cycle_form a = cf([[1, 2, 3,4,5]],5) b = cf([[1,2,3]], 5) e = cf([],5) ordering = [3,5,2,1,4] base, _, _, graphs = schreier_sims_algorithm_fixed_base([a,b], ordering, e) full_group = [] ele_key = ordering_to_key(ordering) perm_key = ordering_to_perm_key(ordering) for index in range(group_size(graphs)): full_group.append(element_at_index(base, graphs, index, e, key=ele_key)) ordered_group = sorted(full_group, key = perm_key) #for x,y in zip(full_group, ordered_group): #print("{!s:<20} {!s:<20}".format(x,y)) self.assertEqual(full_group, ordered_group)
def change_base(self, new_base): ss_info = schreier_sims_tools.schreier_sims_algorithm_fixed_base(self.generators, new_base, self.identity) self.base = ss_info[0] self.strong_generators = ss_info[1] self.chain_generators = ss_info[2] self.schreier_graphs = ss_info[3]