"""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)