Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
special_generic.cpp
Go to the documentation of this file.
1#include "special_generic.h"
2
3double kron(int x, int y) {
4 return (x == y) ? 1.0 : 0.0;
5}
6
7double I0(double x) {
8 double y;
9 double absx = std::fabs(x);
10
11 if (absx < 3.75) {
12 y = x / 3.75;
13 y = y * y;
14 return 1.0 + y * (3.5156229 + y * (3.0899424 + y * (1.2067492 + y * (0.2659732 + y * (0.0360768 + y * 0.0045813)))));
15 } else {
16 y = 3.75 / absx;
17 return (std::exp(absx) / std::sqrt(absx)) * (0.39894228 + y * (0.01328592 + y * (0.00225319 + y * (-0.00157565 + y * (0.00916281 + y * (-0.02057706 + y * (0.02635537 + y * (-0.01647633 + y * 0.00392377))))))));
18 }
19}
20
21// J. Olivares et al 2018 J. Phys.: Conf. Ser. 1043 012003
22// double I0(double x) {
23// double xs = x * x;
24// return std::cosh(x) * (1 + 0.24273 * xs) / (std::pow(1 + 0.25 * xs, 0.25) * (1 + 0.43023 * xs));
25// }
26
27
28double I1(double x) {
29 double y, tmp;
30 double I1 = 0.0;
31 double absx = std::fabs(x);
32
33 if (absx < 3.75) {
34 y = x / 3.75;
35 y = y * y;
36 I1 = absx * (0.5 + y * (0.87890594 + y * (0.51498869 + y * (0.15084934 + y * (0.02658733 + y * (0.00301532 + y * 0.00032411))))));
37 } else {
38 y = 3.75 / absx;
39 tmp = 0.02282967 + y * (-0.02895312 + y * (0.01787654 - y * 0.00420059));
40 tmp = 0.39894228 + y * (-0.03988024 + y * (-0.00362018 + y * (0.00163801 + y * (-0.01031555 + y * tmp))));
41 I1 *= (std::exp(absx) / std::sqrt(absx));
42 }
43
44 if (x < 0.0) {
45 return -I1;
46 } else {
47 return I1;
48 }
49}
50
51double K0(double x) {
52 double y, result;
53
54 if (x <= 2.0) {
55 y = x * x / 4.0;
56 result = (-std::log(x / 2.0) * I0(x)) + (-0.57721566 + y * (0.42278420 + y * (0.23069756 + y * (0.03488590e-1 + y * (0.00262698e-2 + y * (0.00010750e-3 + y * 0.74e-5))))));
57 } else {
58 y = 2.0 / x;
59 result = (std::exp(-x) / std::sqrt(x)) * (1.25331414 + y * (-0.07832358e-1 + y * (0.02189568e-1 + y * (-0.01062446e-1 + y * (0.00587872e-2 + y * (-0.00251540e-2 + y * 0.00053208e-3))))));
60 }
61
62 return result;
63}
64
65
66double K1(double x) {
67 double y, result;
68
69 if (x <= 2.0) {
70 y = x * x / 4.0;
71 result = (std::log(x / 2.0) * I1(x)) + (1.0 / x) * (1.0 + y * (0.15443144 + y * (-0.67278579 + y * (-0.18156897 + y * (-0.01919402e-1 + y * (-0.00110404e-2 + y * (-0.4686e-4)))))));
72 } else {
73 y = 2.0 / x;
74 result = (std::exp(-x) / std::sqrt(x)) * (1.25331414 + y * (0.23498619 + y * (-0.03655620e-1 + y * (0.01504268e-1 + y * (-0.00780353e-2 + y * (0.00325614e-2 + y * (-0.0068245e-3)))))));
75 }
76
77 return result;
78}
79
80
81double K2(double x)
82/* calculates the Modified Bessel functions of second type and of order 2 of x */
83{
84 return K0(x)+2./x*K1(x);
85}
86
87
88double K3(double x)
89/* calculates the Modified Bessel functions of second type and of order 3 of x */
90{
91 return K1(x)+4./x*K2(x);
92}
93
94
95double K4(double x)
96/* calculates the Modified Bessel functions of second type and of order 4 of x */
97{
98 return K2(x)+6./x*K3(x);
99}
100
101
102double Lbessel(double x)
103/* calculates L(x)=K2(x)/x */
104{
105 return K2(x)/x;
106}
107
108
109double Mbessel(double x)
110/* calculates M(x)=(3*K3(x)+K1(x))/4x */
111{
112 return (0.75*K3(x)+0.25*K1(x))/x;
113}
114
115
116double Nbessel(double x)
117/* calculates N(x)=(K4(x)+K2(x))/2x */
118{
119 return (0.5*K4(x)+0.5*K2(x))/x;
120}
121
122
123
124double K0exp(double x, double z) {
125 /* calculates the extended Modified Bessel functions of second type and of order 0 of x and z */
126 double y, result;
127
128 if (x <= 2.0) {
129 y = x * x / 4.0;
130 result = ((-std::log(x / 2.0) * I0(x)) + (-0.57721566 + y * (0.42278420 + y * (0.23069756 + y * (0.03488590e-1 + y * (0.0262698e-2 + y * (0.0010750e-3 + y * 0.74e-5))))))) * std::exp(z) * std::sqrt(z);
131 } else {
132 y = 2.0 / x;
133 result = (std::exp(z - x) / std::sqrt(x / z)) * (1.25331414 + y * (-0.07832358e-1 + y * (0.02189568e-1 + y * (-0.01062446e-1 + y * (0.00587872e-2 + y * (-0.00251540e-2 + y * 0.53208e-3))))));
134 }
135
136 return result;
137}
138
139
140double K1exp(double x, double z) {
141 double y, result;
142
143 if (x <= 2.0) {
144 y = x * x / 4.0;
145 result = ((std::log(x / 2.0) * I1(x)) + (1.0 / x) * (1.0 + y * (0.15443144 + y * (-0.67278579 + y * (-0.18156897 + y * (-0.01919402e-1 + y * (-0.00110404e-2 + y * -0.4686e-4))))))) * std::exp(z) * std::sqrt(z);
146 } else {
147 y = 2.0 / x;
148 result = (std::exp(z - x) / std::sqrt(x / z)) * (1.25331414 + y * (0.23498619 + y * (-0.03655620e-1 + y * (0.01504268e-1 + y * (-0.00780353e-2 + y * (0.00325614e-2 + y * -0.68245e-3))))));
149 }
150
151 return result;
152}
153
154double K2exp(double x,double z)
155/* calculates the extended Modified Bessel functions of second type and of order 2 of x and z */
156{
157 return K0exp(x,z)+2./x*K1exp(x,z);
158}
double K0exp(double x, double z)
double K3(double x)
double Nbessel(double x)
double K2exp(double x, double z)
double I1(double x)
double K1(double x)
double I0(double x)
double Mbessel(double x)
double K1exp(double x, double z)
double Lbessel(double x)
double K2(double x)
double K0(double x)
double kron(int x, int y)
Kronecker delta function.
double K4(double x)