def quasisymmetrize(cls, word, zeta): if len(word) == 0: return Vector({(): 1}) ans = defaultdict(int) for i in range(1, len(word) + 1): pre = word[:i] sub = word[i:] z = zeta(pre) if z != 0: for k, v in cls.quasisymmetrize(sub, zeta).items(): ans[(i,) + k] += z * v ans = Vector({k: v for k, v in ans.items() if v != 0}) return ans