import sys, os; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# Exact (symbolic in t = q^{1/2}) proof data for: im r = K = {g in S : g(y1) = g(sigma y1)}.
from c4_cyclic import *
from fractions import Fraction as Fr
def eq(x, y): return sadd(x, y, -1) == {}
one = {(0,0): {0: 1}}; M11 = {(1,1): {0: 1}}; M30 = {(3,0): {0: 1}}; M03 = {(0,3): {0: 1}}
P = sadd(M30, M03); D = sadd(M30, M03, -1)
def odd2(x):
    r = {}
    for k, v in x.items():
        r = sadd(r, {k: v}); r = sadd(r, {(k[1], k[0]): v}, -1)
    return r
R2 = r_of(fw((0,1,0,0,0,0))); R16 = r_of(fw((1,0,0,0,0,1))); R13 = r_of(fw((1,0,1,0,0,0))); R3 = r_of(fw((3,0,0,0,0,0)))
c8 = R2[(1,1)]; c0 = R2[(0,0)]
# (i) M11 in R: r(m_{w2}) = c8 M11 + c0
assert eq(R2, sadd(sscale(M11, c8), sscale(one, c0))); print('(i)  r(m_w2) = c8*M11 + c0 ; c8 =', dict(sorted(c8.items())))
# (ii) r(m_{w1+w6}) - M11^2 = (c8 - 2) P + e1 M11 + e0
rest = sadd(R16, smul(M11, M11), -1)
assert rest.get((3,0)) == rest.get((0,3)) == padd(c8, {0: -2}) and set(rest) <= {(3,0),(0,3),(1,1),(0,0)}
print('(ii) r(m_{w1+w6}) - M11^2 = (c8-2)*P + e1*M11 + e0, with c8-2 =', dict(sorted(padd(c8, {0:-2}).items())))
# (iii) 2*odd(r(m_{w1+w3})) = (M30 - M03) * (c8*M11 - d)
d = R13[(0,3)]
lhs = odd2(R13); rhs = smul(D, sadd(sscale(M11, c8), sscale(one, d), -1))
assert eq(lhs, rhs); print('(iii) 2*odd r(m_{w1+w3}) = (M30-M03)(c8*M11 - d) ; d =', dict(sorted(d.items())))
# (iv) 2*odd(r(m_{3w1})) = (M30 - M03) * (P + 2 - c)
c = R3[(0,3)]
lhs = odd2(R3); rhs = smul(D, sadd(sadd(P, sscale(one, {0: 2})), sscale(one, c), -1))
assert eq(lhs, rhs); print('(iv) 2*odd r(m_{3w1}) = (M30-M03)(P + 2 - c) ; c =', dict(sorted(c.items())))
# (v) sigma-structure: M30*M03 in S^sigma, M30^2 = P*M30 - M30*M03
assert eq(smul(M30, M30), sadd(smul(P, M30), smul(M30, M03), -1)); print('(v) M30^2 = P*M30 - M30*M03, M30*M03 =', smul(M30, M03))
# (vi) numerical consistency at y1 = (u,v) = (q^-5, q): M11(y1) = d/c8, P(y1) = c - 2, (M30-M03)(y1) != 0
def ev_poly(p, t): return sum(Fr(v) * Fr(t)**e for e, v in p.items())
def ev_S(x, u, v):
    tot = Fr(0)
    for k, p in x.items():
        for (a, b) in orb2(k):
            c1, c6 = (2*a + b)//3, (a + 2*b)//3
            tot += ev_poly(p, T) * u**c1 * v**c6
    return tot
for T in (Fr(2), Fr(3), Fr(5), Fr(7)):
    q = T*T; u, v = q**-5, q
    x1 = ev_S(M11, u, v); p1 = ev_S(P, u, v); dd = ev_S(D, u, v)
    assert x1 == ev_poly(d, T) / ev_poly(c8, T) and p1 == ev_poly(c, T) - 2 and dd != 0
    # sigma y1 = (v,u): same M11, P ; and y2 = (q^-5, q^4) glued (A6-6): check M11, P agree there too
    assert ev_S(M11, v, u) == x1 and ev_S(P, q**-5, q**4) == p1 and ev_S(M11, q**-5, q**4) == x1
    print('q = %s: M11(y1) = d/c8 and P(y1) = c-2 hold; (M30-M03)(y1) = %s' % (q, float(dd)))
print('all identities verified')
