qcd.py โ€” src/27-fields

The file src/27-fields/qcd.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/qcd.py ยท 6.0 KBqcd.py
1# framed-rational status: MIXED -- exact framed-rational core; continuum constructs are confined to clearly-labelled [approx] / degenerate-idealisation comparisons (Tier 2/3/5 or measured-data), never to an exact claim.2"""3Strong sector: QCD-1 (confinement) and QCD-2 (the SU(3) rank-three frame).45QCD-1.  Confinement is the area law of the Wilson loop in the strong-coupling6        (saturated) regime of the COMPACT finite gauge group.  We compute the7        strong-coupling string tension sigma(beta) for compact U(1) and for Z_N8        and exhibit the linear potential V(r)=sigma*r, with the crossover to the9        weak-coupling Coulomb phase.  The finite gauge group is compact, so the10        confined phase exists; non-abelian asymptotic freedom puts the IR there.1112QCD-2.  SU(3) is the special unitary group of a Hermitian 3-form over the13        quadratic extension K=F_{q^2} (the spinor channel) with Frobenius14        conjugation.  Built exactly for q=2 (F_4): order 216, centre Z_315        (colour triality), controlled by the cube-root structure 3 | q+1.16"""17import numpy as np18import itertools19from fractions import Fraction as Fr20import math2122# =====================================================================23# QCD-1 : strong-coupling string tension and the linear potential24# =====================================================================25def besselratio(beta, kmax=60):26    """I1(beta)/I0(beta) by series -- the U(1) single-plaquette character coeff."""27    I0 = sum((beta/2)**(2*k) / (math.factorial(k)**2) for k in range(kmax))28    I1 = sum((beta/2)**(2*k+1) / (math.factorial(k)*math.factorial(k+1))29             for k in range(kmax))30    return I1 / I03132def sigma_U1(beta):       # string tension, strong-coupling leading order33    return -math.log(besselratio(beta))3435def sigma_ZN(beta, N):36    """Z_N gauge: single-plaquette character coeff c1 = <cos th e^{b cos th}>/<...>."""37    ths = [2*math.pi*k/N for k in range(N)]38    Z = sum(math.exp(beta*math.cos(t)) for t in ths)39    c1 = sum(math.cos(t)*math.exp(beta*math.cos(t)) for t in ths) / Z40    return -math.log(c1)4142def qcd1():43    print("QCD-1  confinement = area law in the saturated (strong-coupling) regime")44    print("  string tension sigma(beta) = -ln(plaquette character coeff):")45    print("    beta   sigma_U(1)   sigma_Z2    sigma_Z3   phase")46    for beta in (0.2, 0.5, 1.0, 2.0, 4.0):47        sU = sigma_U1(beta); s2 = sigma_ZN(beta, 2); s3 = sigma_ZN(beta, 3)48        phase = "confined (linear V)" if sU > 0.3 else "-> Coulomb (deconfined)"49        print(f"    {beta:4.1f}   {sU:8.4f}   {s2:8.4f}   {s3:8.4f}   {phase}")50    # linear potential: V(r) = -lim_T (1/T) ln <W(r,T)> = sigma * r  (area law)51    beta = 0.5; s = sigma_U1(beta)52    print(f"\n  linear potential at beta={beta} (sigma={s:.4f}):  V(r) from area law")53    print("    r :   " + "  ".join(f"{r}" for r in range(1, 7)))54    print("    V(r): " + "  ".join(f"{s*r:.3f}" for r in range(1, 7))55          + "   (V/r constant => linear => confining)")56    print("  capacity link: small beta = low channel capacity = saturated;")57    print("  sigma ~ ln(1/beta) is the string tension; sqrt(sigma) sets Lambda_QCD.\n")585960# =====================================================================61# QCD-2 : SU(3, F_q) as the special unitary group of a Hermitian 3-form62#          over K = F_{q^2}.  Exact construction for q=2 (K=F_4).63# =====================================================================64# F_4 = {0,1,2=w,3=w^2}, char 2.  Frobenius conjugation x -> x^2.65ADD = np.array([[0,1,2,3],[1,0,3,2],[2,3,0,1],[3,2,1,0]])66MUL = np.array([[0,0,0,0],[0,1,2,3],[0,2,3,1],[0,3,1,2]])67CONJ = np.array([0,1,3,2])          # x -> x^q = x^2 (Frobenius over F_2)6869def f4_matmul(A, B):70    """batched 3x3 matmul over F_4.  A,B: (...,3,3) int arrays."""71    C = np.zeros(A.shape[:-2] + (3, 3), dtype=np.int64)72    for i in range(3):73        for j in range(3):74            acc = np.zeros(A.shape[:-2], dtype=np.int64)75            for k in range(3):76                acc = ADD[acc, MUL[A[..., i, k], B[..., k, j]]]77            C[..., i, j] = acc78    return C7980def f4_det(M):81    a,b,c = M[...,0,0],M[...,0,1],M[...,0,2]82    d,e,f = M[...,1,0],M[...,1,1],M[...,1,2]83    g,h,i = M[...,2,0],M[...,2,1],M[...,2,2]84    def m(x,y): return MUL[x,y]85    t1 = m(a, ADD[m(e,i), m(f,h)])86    t2 = m(b, ADD[m(d,i), m(f,g)])87    t3 = m(c, ADD[m(d,h), m(e,g)])88    return ADD[ADD[t1, t2], t3]8990def qcd2():91    print("QCD-2  SU(3,2): special unitary group of a Hermitian 3-form over F_4")92    # all 3x3 matrices over F_493    N = 4**994    digits = np.array(np.unravel_index(np.arange(N), (4,)*9)).T  # (N,9)95    M = digits.reshape(N, 3, 3)96    # conjugate-transpose  M^dagger = conj(M)^T97    Mdag = CONJ[M].transpose(0, 2, 1)98    # Hermitian form H = identity:  unitary  <=>  M^dag M = I99    prod = f4_matmul(Mdag, M)100    I3 = np.eye(3, dtype=np.int64)101    unitary = np.all(prod == I3, axis=(1, 2))102    det1 = (f4_det(M) == 1)103    su3 = unitary & det1104    order = int(su3.sum())105    formula = 2**3 * (2**2 - 1) * (2**3 + 1)        # q^3 (q^2-1)(q^3+1)106    print(f"    |SU(3,2)| enumerated = {order}    formula q^3(q^2-1)(q^3+1) = {formula}"107          f"    match: {order == formula}")108    # centre: scalar matrices xI with x^3=1 and norm(x)=1109    centre = []110    for x in range(4):111        S = (x * I3)               # not F_4 scalar mult; build xI by hand112        S = np.zeros((3,3), dtype=np.int64)113        for j in range(3): S[j,j] = x114        Sd = CONJ[S].T115        if np.all(f4_matmul(Sd[None], S[None])[0] == I3) and f4_det(S[None])[0] == 1:116            centre.append(x)117    print(f"    centre = scalar cube-roots of unity {{x I : x in {centre}}}  ->  Z_{len(centre)}"118          f"   (colour triality)")119    print(f"    cube roots of unity in F_4^x = C_3 present (3 | q^2-1); centre Z_3 since 3 | q+1.")120    print(f"    the defining 3-module over K is the colour triplet.\n")121    return order, formula, len(centre)122123124if __name__ == "__main__":125    print("=" * 70)126    print("STRONG SECTOR  (QCD-1 confinement, QCD-2 the SU(3) rank-three frame)")127    print("=" * 70 + "\n")128    qcd1()129    qcd2()130    print("=" * 70)131