import sys, os; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# Part (3): S = C[Lambda_S]^{S3}; R = im r.  Show P := M30 + M03 in R (so S^sigma = C[M11, P] in R) and S = S^sigma + S^sigma M30.
from e6core import *
from collections import defaultdict
from fractions import Fraction as Fr
def s1(v): a, b = v; return (-a, a + b)
def s6(v): a, b = v; return (a + b, -b)
def dom(v):
    a, b = v
    while a < 0 or b < 0:
        a, b = s1((a, b)) if a < 0 else s6((a, b))
    return (a, b)
def orb2(v):
    s = {v}; fr = [v]
    while fr:
        nf = []
        for x in fr:
            for y in (s1(x), s6(x)):
                if y not in s: s.add(y); nf.append(y)
        fr = nf
    return s
# Laurent polynomials in t = q^{1/2}: dict exp -> int
def padd(p, q_, c=1):
    r = dict(p)
    for e, v in q_.items(): r[e] = r.get(e, 0) + c*v
    return {e: v for e, v in r.items() if v}
def pmul(p, q_):
    r = defaultdict(int)
    for e1, v1 in p.items():
        for e2, v2 in q_.items(): r[e1+e2] += v1*v2
    return {e: v for e, v in r.items() if v}
# elements of S as dict kappa(dominant) -> poly
def sadd(x, y, c=1):
    r = {k: dict(v) for k, v in x.items()}
    for k, v in y.items(): r[k] = padd(r.get(k, {}), v, c)
    return {k: v for k, v in r.items() if v}
def smul(x, y):
    # product of orbit sums: M_k M_l = sum over orbit elements
    r = {}
    for k, pk in x.items():
        for l, pl in y.items():
            cnt = defaultdict(int)
            for u in orb2(k):
                for w in orb2(l):
                    s = (u[0]+w[0], u[1]+w[1])
                    if s == dom(s): cnt[s] += 1
            for m, c in cnt.items():
                r = sadd(r, {m: pmul(pmul(pk, pl), {0: c})})
    return r
def sscale(x, p): return {k: pmul(v, p) for k, v in x.items() if pmul(v, p)}
def r_of(mu):
    res = defaultdict(lambda: defaultdict(int))
    for nu in orbit(mu):
        k = ab(nu)
        if k == dom(k): res[k][ip(two_rhoL, nu)] += 1
    return {k: {e: v for e, v in d.items()} for k, d in res.items()}
def fw_old(c):
    from c3_wall import Ainv
    v = [sum(Ainv[i][j]*c[j] for j in range(n)) for i in range(n)]
    assert all(x.denominator == 1 for x in v); return tuple(int(x) for x in v)
