Note
Go to the end to download the full example code.
One-loop integrals at any precision#
Scalar \(B_0\) and \(C_0\) in LoopTools conventions, to double precision and to 50 digits, and the Method-of-Brackets series for \(B_0\) compared with its closed form.
B0(5; 1, 1) = (1.56959105903599596111056676705 + 1.40496294620814527863127492864j)
C0(0,0,10; 1, 2, 3) = (-0.421932531674735453559401494473 - 0.336732268033680194357509591725j)
C0(0,0,10; 1, 2, 3) = (-0.421932531674735453559401494473027777240303185 - 0.336732268033680194357509591724866396568161785j)
B0 closed form = (1.5695910590359959611105667670493946 + 1.404962946208145278631274928640979j)
B0 MoB 2F1 series = (1.5695910590359959611105667670493946 + 1.404962946208145278631274928640979j)
B0(5;1,2), mu2=91.19^2, delta=1/eps: (10.6675243794782430572441296241 + 0.0j)
import mpmath as mp
from ramanujan_qft import B0, B0_mob, C0
# Double precision: identical to LoopTools 2.16
print("B0(5; 1, 1) =", B0(5, 1, 1)) # LoopTools: 1.5695910590 + 1.4049629462i
print("C0(0,0,10; 1, 2, 3) =", C0(10, 1, 2, 3)) # LoopTools: -0.4219325317 - 0.3367322680i
# 50 digits, e.g. to validate another code or for cancellations in large expressions
print("C0(0,0,10; 1, 2, 3) =", mp.nstr(C0(10, 1, 2, 3, dps=50), 45))
# The Method-of-Brackets series gives the same B0, continued across threshold:
print("B0 closed form =", mp.nstr(B0(5, 1, 1, dps=40), 35))
print("B0 MoB 2F1 series =", mp.nstr(B0_mob(5, 1, dps=40), 35))
# UV pole and scale: B0 = delta + log(mu^2) + ...
print("B0(5;1,2), mu2=91.19^2, delta=1/eps:", B0(5, 1, 2, mu2=91.19**2, delta=1))
Total running time of the script: (0 minutes 0.052 seconds)