Source code for gepard.adim

"""QCD anomalous dimensions.

Note:
    Functions in this module have as first argument Mellin moment
    n=j+1, where j is conformal moment used everywhere else.
    Thus, they should always be called as f(j+1, ...).

"""
# from cmath import exp
# from scipy.special import loggamma as clngamma

import numpy as np

from .constants import CA, CF, CG, TF
from .special import (S1, S2, S3, MellinF2, S2_prime, S2_tilde, S3_prime, poch,
                      psi, zeta)


[docs] def non_singlet_LO(n: np.ndarray, nf: int, prty: int = 1) -> complex: """Non-singlet LO anomalous dimension. Args: n (complex): which moment (= Mellin moment for integer n) nf (int): number of active quark flavors prty (int): 1 for NS^{+}, -1 for NS^{-}, irrelevant at LO Returns: Non-singlet LO anomalous dimension. """ return CF*(-3.0-2.0/(n*(1.0+n))+4.0*S1(n))
[docs] def singlet_LO(n: np.ndarray, nf: int, prty: int = 1) -> np.ndarray: """Singlet LO anomalous dimensions. Args: n (complex): which moment (= Mellin moment for integer n) nf (int): number of active quark flavors prty (int): C parity, irrelevant at LO Returns: 2x2 complex matrix ((QQ, QG), (GQ, GG)) """ qq0 = CF*(-3.0-2.0/(n*(1.0+n))+4.0*S1(n)) qg0 = (-4.0*nf*TF*(2.0+n+n*n))/(n*(1.0+n)*(2.0+n)) gq0 = (-2.0*CF*(2.0+n+n*n))/((-1.0+n)*n*(1.0+n)) gg0 = (-22*CA/3.-8.0*CA*(1/((-1.0+n)*n)+1/((1.0+n)*(2.0+n))-S1(n))+8*nf*TF/3.)/2. arr = np.array([[qq0, qg0], [gq0, gg0]]) # before returning transpose array so that flavor indices are at the end: return np.transpose(arr, axes=(*range(2, arr.ndim), 0, 1))
[docs] def non_singlet_NLO(n: complex, nf: int, prty: int) -> complex: """Non-singlet anomalous dimension. Args: n (complex): which moment (= Mellin moment for integer n) nf (int): number of active quark flavors prty (int): 1 for NS^{+}, -1 for NS^{-} Returns: Non-singlet NLO anomalous dimension. """ # From Curci et al. nlo = (CF * CG * ( 16*S1(n)*(2*n+1)/poch(n, 2)**2 + 16*(2*S1(n) - 1/poch(n, 2)) * (S2(n)-S2_prime(n/2, prty)) + 64 * S2_tilde(n, prty) + 24*S2(n) - 3 - 8*S3_prime(n/2, prty) - 8*(3*n**3 + n**2 - 1)/poch(n, 2)**3 - 16*prty*(2*n**2 + 2*n + 1)/poch(n, 2)**3) + CF * CA * (S1(n)*(536/9 + 8*(2*n+1)/poch(n, 2)**2) - 16*S1(n)*S2(n) + S2(n)*(-52/3 + 8/poch(n, 2)) - 43/6 - 4*(151*n**4 + 263*n**3 + 97*n**2 + 3*n + 9)/9/poch(n, 2)**3) + CF * nf * TF * (-(160/9)*S1(n) + (32/3)*S2(n) + 4/3 + 16*(11*n**2 + 5*n - 3)/9/poch(n, 2)**2)) / 4 return nlo
[docs] def singlet_NLO(n: complex, nf: int, prty: int = 1) -> np.ndarray: """Singlet NLO anomalous dimensions matrix. Args: n (complex): which moment (= Mellin moment for integer n) nf (int): number of active quark flavors prty (int): C parity Returns: Matrix (LO, NLO) where each is in turn 2x2 complex matrix ((QQ, QG), (GQ, GG)) """ qq1 = non_singlet_NLO(n, nf, 1) - 4*CF*TF*nf*( 5*n**5+32*n**4+49*n**3+38*n**2 + 28*n+8)/((n-1)*n**3*(n+1)**3*(n+2)**2) qg1 = (-8*CF*nf*TF*( (-4*S1(n))/n**2+(4+8*n + 26*n**3 + 11*n**4 + 15*(n*n))/(n**3*(1+n)**3*(2+n)) + ((2+n+n*n)*(5-2*S2(n) + 2*(S1(n)*S1(n))))/(n*(1+n)*(2+n))) - 8*CA*nf*TF*((8*(3+2*n)*S1(n))/((1+n)**2*(2+n)**2) + (2*(16+64*n+128*n**3+85*n**4+36*n**5+25*n**6 + 15*n**7+6*n**8+n**9+104*(n*n)))/( (-1+n)*n**3*(1+n)**3*(2+n)**3)+( (2+n+n*n)*(2*S2(n)-2*(S1(n)*S1(n))-2*S2(n/2)))/(n*(1+n)*(2+n))))/4 gq1 = (-(32/3)*CF*nf*TF*((1+n)**(-2) + ((-(8/3)+S1(n))*(2+n+n*n))/((-1+n)*n*(1+n))) - 4*(CF*CF)*((-4*S1(n))/(1+n)**2-( -4-12*n+28*n**3+43*n**4 + 30*n**5+12*n**6-n*n)/((-1+n)*n**3*(1+n)**3) + ((2+n+n*n)*(10*S1(n)-2*S2(n)-2*(S1(n)*S1(n))))/((-1+n)*n*(1+n))) - 8*CF*CA*(((1/9)*(144+432*n-1304*n**3-1031*n**4 + 695*n**5+1678*n**6+1400*n**7+621*n**8+109*n**9 - 152*(n*n)))/((-1+n)**2*n**3*(1+n)**3*(2+n)**2) - ((1/3)*S1(n)*(-12-22*n+17*n**4 + 41*(n*n)))/((-1+n)**2*n**2*(1+n))+( (2+n+n*n)*(S2(n) + S1(n)*S1(n)-S2(n/2)))/((-1+n)*n*(1+n))))/4 gg1 = ( CF*nf*TF*(8+(16*(-4-4*n-10*n**3+n**4+4*n**5+2*n**6 - 5*(n*n)))/((-1+n)*n**3*(1+n)**3*(2+n))) + CA*nf*TF*(32/3 - (160/9)*S1(n)+( (16/9)*(12+56*n+76*n**3+38*n**4+94*(n*n)))/((-1+n)*n**2*(1+n)**2*(2+n))) + CA*CA*(-64/3+(536/9)*S1(n)+(64*S1(n)*( -2-2*n+8*n**3+5*n**4+2*n**5+7*(n*n)))/((-1+n)**2*n**2*(1+n)**2*(2+n)**2) - ((4/9)*(576+1488*n-1632*n**3-2344*n**4+1567*n**5 + 6098*n**6+6040*n**7+2742*n**8+457*n**9+560*(n*n)))/( (-1+n)**2*n**3*(1+n)**3*(2+n)**3) - 16*S1(n)*S2(n/2)+(32*(1+n+n*n)*S2(n/2))/( (-1+n)*n*(1+n)*(2+n))-4*S3(n/2) + 32*(S1(n)/n**2-(5/8)*zeta(3)+MellinF2(n) - zeta(2)*(-psi(n/2)+psi((1+n)/2))/2)))/4 arr = np.array([[qq1, qg1], [gq1, gg1]]) # before returning transpose array so that flavor indices are at the end: return np.transpose(arr, axes=(*range(2, arr.ndim), 0, 1))
[docs] def block(n: complex, nf: int) -> np.ndarray: """LO+NLO block anomalous dimensions matrix. Args: n (complex): which moment (= Mellin moment for integer n) nf (int): number of active quark flavors Returns: block[k, p, i, j] - k is index if n is array, otherwise 0 - p is pQCD order (0=LO, 1=NLO) - i, j in [Q, G, NS+, NS-], forming 4x4 complex matrix ((QQ, QG, 0, 0), (GQ, GG, 0, 0), ( 0, 0, NS+, 0), ( 0, 0, 0, NS-)) """ lo_SI = singlet_LO(n, nf) lo_NS = non_singlet_LO(n, nf) nlo_SI = singlet_NLO(n, nf) nlo_plus_NS = non_singlet_NLO(n, nf, prty=1) nlo_minus_NS = non_singlet_NLO(n, nf, prty=-1) res = np.zeros(n.shape + (2, 4, 4), dtype=lo_NS.dtype) res[..., 0, :2, :2] = lo_SI res[..., 0, 2, 2] = lo_NS res[..., 0, 3, 3] = lo_NS res[..., 1, :2, :2] = nlo_SI res[..., 1, 2, 2] = nlo_plus_NS res[..., 1, 3, 3] = nlo_minus_NS return res