"""Revision check (referee finding F2): for which 11 <= n <= 60 is the layer-swapping map
psi(v_{5j}) = u_j, psi(u_{5j}) = v_j (defined when gcd(n,5) = 1) an automorphism of P(n,5)?
By Frucht-Graver-Watkins (1971) Aut(P(n,k)) is larger than D_n exactly when k^2 = +-1 (mod n)
(plus the seven sporadic small cases, none with k = 5 and n >= 11). Writes results/revision/aut_check.json."""
import json, math, os
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

def edges(n, k):
    E = set()
    for i in range(n):
        E.add(frozenset((("u", i), ("u", (i + 1) % n))))
        E.add(frozenset((("u", i), ("v", i))))
        E.add(frozenset((("v", i), ("v", (i + k) % n))))
    return E

out = []
for n in range(11, 61):
    rec = {"n": n, "k2_mod_n": 25 % n, "k2_is_pm1": (25 % n) in (1, n - 1)}
    if math.gcd(n, 5) == 1:
        inv = pow(5, -1, n)
        E = edges(n, 5)
        psi = lambda x: (("u", (x[1] * inv) % n) if x[0] == "v" else ("v", (x[1] * inv) % n))
        rec["psi_is_automorphism"] = ({frozenset(psi(x) for x in e) for e in E} == E)
    else:
        rec["psi_is_automorphism"] = None  # psi undefined (5 not invertible mod n)
    out.append(rec)
extra = [r["n"] for r in out if r["psi_is_automorphism"]]
print("n with psi an automorphism of P(n,5):", extra)
print("n with 5^2 = +-1 mod n:", [r["n"] for r in out if r["k2_is_pm1"]])
assert extra == [r["n"] for r in out if r["k2_is_pm1"]]
json.dump({"psi_automorphism_n": extra, "rows": out}, open(os.path.join(ROOT, "results", "revision", "aut_check.json"), "w"), indent=1)
