Hi, >> {{{ >> sage: e = WordMorphismExtensionDual('a->ab,b->ac,c->a') >> sage: e >> E*(WordMorphism: a->ab, b->ac, c->a) >> sage: f1 = Face((0,0,0),1) # the face 1 or a at (0,0,0) >> sage: f2 = Face((0,0,0),2) # the face 2 or b at (0,0,0) >> sage: f3 = Face((0,0,0),3) # the face 3 or c at (0,0,0) >> sage: e(f1) # the image of f1 >> Patch([((0, 1, -1), 2), ((1, 0, -1), 1), ((0, 0, 0), 3)]) >> sage: e(f2) # the image of f2 >> Patch([((0, 0, 0), 1)]) >> sage: e(f3) # the image of f3 >> Patch([((0, 0, 0), 2)]) >> }}}
Instead of adding WordMorphismExtensionDual to the namespace, I prefer the following : sage: m = WordMorphism('a->ab,b->ac,c->a') sage: e = e.extension_dual() sage: e Extension dual of WordMorphism: a->ab, b->ac, c->a >> And one can iterates and this is the way we obtain our beautiful >> pictures (is there a standard for the option iterations ?) >> {{{ >> sage: e(f1,iterations=5) >> Patch([((1, -3, 4), 1), ((0, -1, 2), 3), ((1, -1, 1), 1), ((-1, -1, >> 4), 2), ((0, -1, 2), 1), ((1, -3, 3), 3), ((-1, -1, 4), 3), ((1, -2, >> 2), 2), ((1, -1, 0), 1), ((2, -2, 0), 1), ((1, -3, 3), 1), ((0, -2, >> 4), 2), ((0, -3, 5), 3), ((2, -2, 1), 1), ((-1, 0, 2), 2), ((0, 0, 1), >> 2), ((0, -1, 2), 2), ((0, -2, 4), 3), ((2, -3, 1), 1), ((1, -2, 3), >> 1), ((1, -1, 1), 2), ((0, 0, 0), 2), ((1, -2, 2), 3), ((0, -1, 3), 2), >> ((1, -2, 2), 1), ((2, -3, 2), 1), ((-1, -2, 5), 3), ((0, -1, 3), 1), >> ((1, -1, 0), 2), ((-1, 0, 3), 2), ((0, -2, 4), 1)]) >> }}} Right now, with word morphism, one can do either of the following sage: m = WordMorphism('a->ab,b->ac,c->a') sage: (m^5)('a') word: abacabaabacababacabaabac sage: m('a', 5) word: abacabaabacababacabaabac You obtain the fixed point using : sage: m('a', oo) word: abacabaabacababacabaabacabacabaabacababa... Hence, you could follow the same idea : sage: (e^5)(f1) A patch ... sage: e(f1, 5) A patch ... sage: e(f1, oo) The limit fractal! Does the name of "patch" is really used by Arnoux, Ito? Or is it Franco who used that name? Instead of patch, I would use another name that evoques a little bit more the idea of a finite domain of a discrete plane. So why not, "finite domain of a discrete plane" which says what it is!? > Thanks! So, somehow, e is a function from the set of patches to > itself, right? I have no clue on the subject, so this might be > completely silly, but what about: > > {{{ > sage: Patches = e.codomain() # or e.domain()? > }}} > > ``patches`` would be a parent modeling the collection of all > patches. And then, one could do things like: > > {{{ > sage: f1 = Patches.face((0,0,0),1) # builds a face > sage: p = Patches( ( ((0,0,0),1), ((0,0,0),2) ) ) # builds a patch from an > iterable of face-data > }}} +1 : I agree with the ideas of Nicolas After speaking with Timo (now in Montpellier), I think the extension (before taking the dual) of word morphism corresponds to something I use quite often for example to construct a Christoffel Tile : sage: P = WordPaths('abAB') sage: P Word Paths on the square grid sage: P.letters_to_steps() {'a': (1, 0), 'A': (-1, 0), 'B': (0, -1), 'b': (0, 1)} sage: L = WordMorphism('a->aBab,b->ab,A->AbAB,B->AB', codomain=P) sage: bar = WordMorphism('a->A,b->B,A->a,B->b', codomain=P) sage: w = P(words.ChristoffelWord(5,8, alphabet='ab')) sage: L(w*bar(w)).plot(endarrow=False) Maybe it can be usefull ... Sébastien -- You received this message because you are subscribed to the Google Groups "sage-combinat-devel" group. To post to this group, send email to sage-combinat-de...@googlegroups.com. To unsubscribe from this group, send email to sage-combinat-devel+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sage-combinat-devel?hl=en.