25 constexpr
double EPSTOL = 1.0e-15;
28 constexpr
double sign(
double x) noexcept
30 return x >= 0.0 ? 1.0 : -1.0;
36 std::complex<T> fast_log(
const std::complex<T>& z) noexcept
38 const T rz = std::real(z);
39 const T iz = std::imag(z);
41 return std::complex<T>(0.5*
std::log(rz*rz + iz*iz), std::atan2(iz, rz));
45 double fB(
const std::complex<double>& x) noexcept
47 const double re = std::real(x);
48 const double im = std::imag(x);
50 if ((std::abs(re) == 0.0 || std::abs(re) == 1.0) && im == 0.0) {
54 if (std::abs(re - 1.0) < 1e-3) {
55 const auto d = x - 1.0;
56 const auto logd = fast_log(d);
57 return std::real(-1.0 + d*(1.0 - logd + d*(0.5 - d/6.)));
60 if (std::abs(re) > 1e3) {
61 return std::real(-0.5/x - 1.0/(6.0*x*x) + fast_log(-x));
64 return std::real(-1.0 + fast_log(1.0 - x) - x*fast_log(1.0 - 1.0/x));
71 double a0(
double m2,
double q2) noexcept
91 double b0xx(
double p2,
double m2,
double q2) noexcept
97 if (p2 < EPSTOL * q2 && m2 < EPSTOL * q2) {
99 }
else if (p2 < EPSTOL) {
101 }
else if (p2 <= 4 * m2) {
103 2 * std::sqrt(4 * m2 / p2 - 1) *
104 std::asin(std::sqrt(p2 / (4 * m2)));
105 }
else if (p2 <= 5e2 * m2) {
106 const double sq = std::sqrt(1 - 4 * m2 / p2);
108 sq *
std::log(p2 * (1 - sq) / (2 * m2) - 1);
109 }
else if (p2*EPSTOL < m2) {
110 const double d = m2 / p2;
113 + d * (2 * (1 - logd)
115 + d * (-10./3 - 4 * logd
116 + d * (-59./6 - 10 * logd
117 + d * (-449./15 - 28 * logd
118 + d * (-1417./15 - 84 * logd
119 + d * (-32254./105 - 264 * logd)))))));
130 double b0(
double p2,
double m12,
double m22,
double q2) noexcept
138 if (p2 < EPSTOL * q2 && m12 < EPSTOL * q2 && m22 < EPSTOL * q2) {
146 if (m12*(1 + EPSTOL) > m22) {
147 return b0xx(p2, m12, q2);
150 if (p2 <= 1e-11 * m12) {
151 if (m12 < EPSTOL * m22) {
158 if (m12 < EPSTOL * EPSTOL * m22) {
159 const double del = std::hypot(m22 - p2, EPSTOL * m22);
163 const double s = p2 - m22 + m12;
164 const std::complex<double> imin(m12, -EPSTOL * m12);
165 const std::complex<double> x = std::sqrt(pow2(s) - 4 * p2 * imin);
166 const std::complex<double> xp = (s + sign(s) * x) / (2 * p2);
167 const std::complex<double> xm = imin / (xp * p2);
169 return -
std::log(p2 / q2) - fB(xp) - fB(xm);
182 double d1_b0(
double m12,
double m22) noexcept
187 if ((m12 < 1e-14*m22) != (m22 < 1e-14*m12)) {
188 return (m12 - m22) * (m12 + m22) / (2 * pow3(m12 - m22));
189 }
else if (m12 < EPSTOL && m22 < EPSTOL) {
191 }
else if (std::abs(m22 - m12) < 5e-2*m12) {
192 return 1 / (6 * m12) +
193 (m12 - m22) / (12 * pow2(m12)) +
194 pow2(m12 - m22) / (20 * pow3(m12)) +
195 pow3(m12 - m22) / (30 * pow4(m12)) +
196 pow4(m12 - m22) / (42 * pow5(m12)) +
197 pow5(m12 - m22) / (56 * pow6(m12));
200 return ((m12 - m22) * (m12 + m22) + 2 * m12 * m22 *
std::log(m22 / m12)) /
201 (2 * pow3(m12 - m22));
double b0xx(double p2, double m2, double q2) noexcept
B0(s,x,x,q2) Passarino-Veltman function.
double d1_b0(double m12, double m22) noexcept
derivative of B0 Passarino-Veltman function w.r.t. p^2, for p^2 = 0
Declaration of real Passarino-Veltman loop functions with squared arguments.
HimalayaErrorMessage [s_] s
Complex< T > log(const Complex< T > &z_) noexcept
double b0(double p2, double m12, double m22, double q2) noexcept
B0 Passarino-Veltman function.
double a0(double m2, double q2) noexcept
A0 Passarino-Veltman function.