missing_rank.py โ€” src/27-fields

The file src/27-fields/missing_rank.py of the validation package of the paper 27-fld, rendered with an anchor per line; the file itself is beside this page.

27-fields ledgersrc/27-fields/missing_rank.py ยท 6.6 KBmissing_rank.py
1# framed-rational status: EXACT -- integer / modular-F_p / cyclotomic arithmetic; no float in any asserted check (float, if present, only formats an exact rational for display).2"""3missing_rank.py -- develops the open residue of sec:strong / sec:matter:4the *forcing* of the rank-three colour frame ("the missing rank") and the rank tower5U(1)/SU(2)/SU(3) on ranks 1/2/3, lifted off the degenerate q=2 case (prop:su3) onto the6smallest admissible substrate residue Omega = 5, where PSU(3,5) is simple.78FRC register: every check is an exact identity in finite-field / integer arithmetic.9No RNG, no floats, no logs/trigs/integrals; framed-rational throughout (1-algebra).1011Claims verified12  A. Centre tower. Z(SU(n,Omega)) = Z_{gcd(n,Omega+1)}.  With the forced residue13     Omega = 5 (mod 12), Omega+1 = 6 (mod 12), so 2|Omega+1 and 3|Omega+1.  The minimal14     Hermitian rank over K = F_{Omega^2} carrying each torsion as the full SU centre is15        n=1 -> Z_1 (phase, U(1)),  n=2 -> Z_2 (spinor/isospin),  n=3 -> Z_3 (colour).16     => rank 3 is the MINIMAL rank realising the substrate-forced Z_3 triality centre,17        which is exactly the cubic of prop:residue read inside the structure group.18  B. SU(3,5) over F_25 (the smallest admissible non-degenerate case): |SU(3,5)| = 37800019     by the orthonormal-frame counting argument (no brute force of the group); the20     3-element triality centre (norm-one cube roots of unity); exact Wilson gauge21     invariance of Tr(U_plaq) under conjugation; non-abelian self-coupling [U1,U2] != I.22  C. dim Lambda^even(C^5) = 16 = the SO(10) chiral spinor (thm:gen).23"""24from math import gcd, comb2526# ----------------------------------------------------------------------27# F_25 = F_5[t]/(t^2 - 2).  Element = (a,b) ~ a + b t,  a,b in F_5.28# Frobenius conjugation x -> x^5 sends t -> -t.  Norm N(x) = x*conj(x) in F_5.29# ----------------------------------------------------------------------30P = 531def fadd(x, y): return ((x[0]+y[0]) % P, (x[1]+y[1]) % P)32def fsub(x, y): return ((x[0]-y[0]) % P, (x[1]-y[1]) % P)33def fmul(x, y):34    a, b = x; c, d = y35    return ((a*c + 2*b*d) % P, (a*d + b*c) % P)        # t^2 = 236def conj(x): return (x[0] % P, (-x[1]) % P)            # x -> x^537def norm(x): return fmul(x, conj(x))[0]38ZERO, ONE = (0, 0), (1, 0)39F25 = [(a, b) for a in range(P) for b in range(P)]40def finv(x):41    ninv = pow(norm(x), P-2, P)42    c = conj(x)43    return ((c[0]*ninv) % P, (c[1]*ninv) % P)4445# ---- A. centre tower / minimality of rank 3 ------------------------------------------46def centre_order(n, Omega): return gcd(n, Omega + 1)47admissible = [q for q in range(5, 200)48              if q % 12 == 5 and all(q % d for d in range(2, q) if d*d <= q)]49A_ok = all([centre_order(n, Om) for n in (1, 2, 3)] == [1, 2, 3] for Om in admissible[:8])50rank_for_3 = min(n for n in range(1, 13) if centre_order(n, 5) % 3 == 0)51rank_for_2 = min(n for n in range(1, 13) if centre_order(n, 5) % 2 == 0)52print("A. centre tower [n=1,2,3]=[1,2,3] over admissible Omega:", A_ok, " (", admissible[:8], ")")53print("   minimal rank with 3 | centre =", rank_for_3, "(colour = minimal triality carrier)")54print("   minimal rank with 2 | centre =", rank_for_2, "(isospin = minimal spinor carrier)")5556# ---- B. SU(3,5) over F_25 -------------------------------------------------------------57def herm_ip(u, v):58    s = ZERO59    for ui, vi in zip(u, v):60        s = fadd(s, fmul(conj(ui), vi))61    return s62nrm = [norm(x) for x in F25]63def unit_count(m):64    if m == 1:65        return sum(1 for x in F25 if norm(x) == 1)66    if m == 2:67        return sum(1 for i in range(25) for j in range(25) if (nrm[i]+nrm[j]) % P == 1)68    if m == 3:69        c = 070        for i in range(25):71            for j in range(25):72                target = (1 - nrm[i] - nrm[j]) % P73                c += sum(1 for k in range(25) if nrm[k] == target)74        return c75N1, N2, N3 = unit_count(1), unit_count(2), unit_count(3)76U3 = N3 * N2 * N177SU3 = U3 // (P + 1)78print("B1. (N1,N2,N3) =", (N1, N2, N3), "-> |U(3,5)| =", U3, " |SU(3,5)| =", SU3,79      " == 378000:", SU3 == 378000)8081cube_roots = [x for x in F25 if fmul(fmul(x, x), x) == ONE]82centre_unitary = [x for x in cube_roots if norm(x) == 1]83print("B2. norm-one cube roots of 1 (triality centre):", len(centre_unitary), " == 3:",84      len(centre_unitary) == 3)8586def mat_dagger(M): return [[conj(M[j][i]) for j in range(3)] for i in range(3)]87def mat_mul(A, B):88    C = [[ZERO]*3 for _ in range(3)]89    for i in range(3):90        for j in range(3):91            s = ZERO92            for k in range(3):93                s = fadd(s, fmul(A[i][k], B[k][j]))94            C[i][j] = s95    return C96def is_identity(M):97    return all(M[i][j] == (ONE if i == j else ZERO) for i in range(3) for j in range(3))98def det3(M):99    a,b,c = M[0]; d,e,f = M[1]; g,h,i = M[2]100    t1 = fmul(a, fsub(fmul(e,i), fmul(f,h)))101    t2 = fmul(b, fsub(fmul(d,i), fmul(f,g)))102    t3 = fmul(c, fsub(fmul(d,h), fmul(e,g)))103    return fadd(fsub(t1, t2), t3)104def trace(M): return fadd(fadd(M[0][0], M[1][1]), M[2][2])105def scale_col(M, j, lam):106    return [[fmul(M[r][j], lam) if cc == j else M[r][cc] for cc in range(3)] for r in range(3)]107def orthonormal_basis(reverse):108    vecs3 = [(x, y, z) for x in F25 for y in F25 for z in F25]109    order = list(reversed(vecs3)) if reverse else vecs3110    cols = []111    for v in order:112        if (nrm[F25.index(v[0])] + nrm[F25.index(v[1])] + nrm[F25.index(v[2])]) % P != 1:113            continue114        if all(herm_ip(c, v) == ZERO for c in cols):115            cols.append(v)116            if len(cols) == 3:117                break118    M = [[cols[j][i] for j in range(3)] for i in range(3)]119    return scale_col(M, 2, finv(det3(M)))           # force det = 1 (norm-one scaling stays unitary)120121U1, U2 = orthonormal_basis(False), orthonormal_basis(True)122unit_ok = is_identity(mat_mul(mat_dagger(U1), U1)) and is_identity(mat_mul(mat_dagger(U2), U2))123det_ok = det3(U1) == ONE and det3(U2) == ONE124Uplaq = mat_mul(mat_mul(U1, U2), mat_mul(mat_dagger(U1), mat_dagger(U2)))   # U1 U2 U1^-1 U2^-1125gi_ok = trace(mat_mul(mat_mul(U2, Uplaq), mat_dagger(U2))) == trace(Uplaq)126self_ok = not is_identity(Uplaq)127print("B3. SU(3,5) matrices unitary:", unit_ok, " det=1:", det_ok,128      " Wilson Tr gauge-invariant:", gi_ok, " non-abelian [U1,U2]!=I:", self_ok)129130# ---- C. generation count -------------------------------------------------------------131dim_even = comb(5, 0) + comb(5, 2) + comb(5, 4)132print("C. dim Lambda^even(C^5) =", dim_even, " == 16:", dim_even == 16)133134print("\nALL PASS:", all([A_ok, rank_for_3 == 3, rank_for_2 == 2, SU3 == 378000,135                          len(centre_unitary) == 3, unit_ok, det_ok, gi_ok, self_ok,136                          dim_even == 16]))137