geometry_tools.utils.words
1import re 2from collections import defaultdict 3 4def invert_gen(generator): 5 if generator.lower() == generator: 6 return generator.upper() 7 return generator.lower() 8 9def formal_inverse(word, simple=True): 10 joinchar = "" 11 if not simple: 12 joinchar = "*" 13 return joinchar.join([invert_gen(g) for g in word[::-1]]) 14 15def asym_gens(generators): 16 """Get an iterable of semigroup generators from an iterable of group generators. 17 18 Given a sequence of lowercase/uppercase letters, return only the 19 lowercase ones. 20 21 Parameters 22 ---------- 23 generators : iterable of strings 24 Sequence of semigroup generators 25 26 Yields 27 ------ 28 gen : string 29 the lowercase characters in `generators` 30 31 """ 32 for gen in generators: 33 if gen.lower() == gen: 34 yield gen 35 36def simplify_word(word): 37 simp = "" 38 for let in word: 39 if len(simp) == 0 or let != invert_gen(simp[-1]): 40 simp += let 41 else: 42 simp = simp[:-1] 43 return simp 44 45def simplify(zmod): 46 return defaultdict(int, {simplify_word(word):zmod[word] for word in zmod}) 47 48def aug(zmod): 49 return sum(zmod.values()) 50 51def commutator(w1, w2): 52 return simplify_word(w1 + w2 + formal_inverse(w1) + formal_inverse(w2)) 53 54def act_left(word, zmod): 55 prod = {word + zword:zmod[zword] for zword in zmod} 56 return simplify(prod) 57 58def act_right(zmod1, zmod2): 59 mult = aug(zmod2) 60 return defaultdict(int, {word:zmod1[word] * mult for word in zmod1}) 61 62def zmod_sum(z1, z2): 63 z_sum = defaultdict(int, {word:coeff for word, coeff in z1.items()}) 64 for word in z2: 65 z_sum[word] += z2[word] 66 return z_sum 67 68def fox_word_derivative(differential, word): 69 if len(word) == 1: 70 if word == differential: 71 return defaultdict(int, {"":1}) 72 if word == formal_inverse(differential): 73 return defaultdict(int, {word:-1}) 74 return defaultdict(int, {}) 75 76 return zmod_sum( 77 fox_word_derivative(differential, word[0]), 78 act_left(word[0], fox_word_derivative(differential, word[1:])) 79 )
def
invert_gen(generator):
def
formal_inverse(word, simple=True):
def
asym_gens(generators):
16def asym_gens(generators): 17 """Get an iterable of semigroup generators from an iterable of group generators. 18 19 Given a sequence of lowercase/uppercase letters, return only the 20 lowercase ones. 21 22 Parameters 23 ---------- 24 generators : iterable of strings 25 Sequence of semigroup generators 26 27 Yields 28 ------ 29 gen : string 30 the lowercase characters in `generators` 31 32 """ 33 for gen in generators: 34 if gen.lower() == gen: 35 yield gen
Get an iterable of semigroup generators from an iterable of group generators.
Given a sequence of lowercase/uppercase letters, return only the lowercase ones.
Parameters
- generators (iterable of strings): Sequence of semigroup generators
Yields
- gen (string):
the lowercase characters in
generators
def
simplify_word(word):
def
simplify(zmod):
def
aug(zmod):
def
commutator(w1, w2):
def
act_left(word, zmod):
def
act_right(zmod1, zmod2):
def
zmod_sum(z1, z2):
def
fox_word_derivative(differential, word):
69def fox_word_derivative(differential, word): 70 if len(word) == 1: 71 if word == differential: 72 return defaultdict(int, {"":1}) 73 if word == formal_inverse(differential): 74 return defaultdict(int, {word:-1}) 75 return defaultdict(int, {}) 76 77 return zmod_sum( 78 fox_word_derivative(differential, word[0]), 79 act_left(word[0], fox_word_derivative(differential, word[1:])) 80 )