def nonisomorphic_cubes_Z2(n, avoid_complete=False): """ Returns a generator for all n-dimensional Cube-like graphs (Cayley graphs over Z_2^n) with their generators. With avoid_complete=True avoids the complete graph. Iterates over tuples (generatorSet, G). """ vs = VectorSpace(GF(2), n) basegens = vs.gens() optgens = [v for v in vs if sum(map(int,v)) >= 2] total = 2**len(optgens) seen_graphs = set() c = 0 for g in powerset(optgens): c += 1 gens = tuple(list(basegens) + g) if c % (total / 100 + 1) == 0: log.debug("Generating (%d of %d)" % (c, total)) if avoid_complete: if len(g) >= len(optgens): continue G = CayleyGraph(vs, gens) canon = tuple(Graph(G).canonical_label().edges()) if canon in seen_graphs: continue log.debug("Unique graph (%d of %d) gens=%s" % (c, total, gens)) seen_graphs.add(canon) yield (gens, G)
def nonisomorphic_cubes_Z2(n, avoid_complete=False): """ Returns a generator for all n-dimensional Cube-like graphs (Cayley graphs over Z_2^n) with their generators. With avoid_complete=True avoids the complete graph. Iterates over tuples (generatorSet, G). """ vs = VectorSpace(GF(2), n) basegens = vs.gens() optgens = [v for v in vs if sum(map(int, v)) >= 2] total = 2**len(optgens) seen_graphs = set() c = 0 for g in powerset(optgens): c += 1 gens = tuple(list(basegens) + g) if c % (total / 100 + 1) == 0: log.debug("Generating (%d of %d)" % (c, total)) if avoid_complete: if len(g) >= len(optgens): continue G = CayleyGraph(vs, gens) canon = tuple(Graph(G).canonical_label().edges()) if canon in seen_graphs: continue log.debug("Unique graph (%d of %d) gens=%s" % (c, total, gens)) seen_graphs.add(canon) yield (gens, G)
class SimilarityGroup(UniqueRepresentation,Group): r'''Group representing all similarities in the plane. This is the group generated by rotations, translations and dilations. ''' Element = Similarity def _element_constructor_(self, *args, **kwds): if len(args)!=1: return self.element_class(self, *args, **kwds) x = args[0] p=parent(x) if self._f.has_coerce_map_from(p): return self.element_class( self,self._f(x), self._f.zero(), self._f.zero(), self._f.zero()) if isinstance(p, SimilarityGroup): return self.element_class(self, x.a(), x.b(), x.s(), x.t()) if isinstance(p, TranslationGroup): return self.element_class( self,self._f.one(), self._f.zero(), x.s(), x.t() ) return self.element_class(self, x, **kwds) def _coerce_map_from_(self, S): if self._f.has_coerce_map_from(S): return True if isinstance(S, SimilarityGroup): return self._f.has_coerce_map_from(S._f) if isinstance(S, TranslationGroup): return self._f.has_coerce_map_from(S.base_field()) def __init__(self, base_field): self._f=base_field # The vector space of vectors self._vs = VectorSpace(self._f,2) Group.__init__(self, category=Groups().Infinite()) def _repr_(self): return "SimilarityGroup over field "+str(self._f) def one(self): return self.element_class(self,self._f.one(),self._f.zero(),self._f.zero(),self._f.zero()) def an_element(self): return self.element_class(self,self._f(ZZ_3),self._f(ZZ_4),self._f(ZZ_2),self._f(-ZZ_1)) def is_abelian(self): return False def gens(self): pairs=[ (self._f.one(),self._f.zero()), (self._f(ZZ_2),self._f.zero()), (self._f.zero(),self._f(ZZ_2)), (self._f(ZZ_3),self._f(ZZ_4))] l=[] for p in pairs: for v in self._vs.gens(): l.append(self.element_class(self,p[0],p[1],v[0],v[1])) return l # For pickling: #def __reduce__(self): # return self.__class__, (self._f,) #def _cmp_(self, other): # return self._f == other._f #__cmp__=_cmp_ def base_field(self): return self._f