23 template <
typename T,
int N>
24 T horner(T x,
const T (&c)[N]) noexcept
27 for (
int i = N - 1; i >= 0; --i) {
33 template <
int Nstart,
typename T,
int N>
34 Complex<T> horner(
const Complex<T>& z,
const T (&coeffs)[N]) noexcept
36 static_assert(0 <= Nstart && Nstart < N && N >= 2,
"invalid array bounds");
38 const T
r = z.re + z.re;
39 const T
s = z.re * z.re + z.im * z.im;
40 T
a = coeffs[N - 1], b = coeffs[N - 2];
42 for (
int i = N - 3; i >= Nstart; --i) {
45 b = coeffs[i] - s * t;
48 return Complex<T>(z.re*a + b, z.im*
a);
64 const double PI = 3.1415926535897932;
66 1.0706105563309304277e+0,
67 -4.5353562730201404017e+0,
68 7.4819657596286408905e+0,
69 -6.0516124315132409155e+0,
70 2.4733515209909815443e+0,
71 -4.6937565143754629578e-1,
72 3.1608910440687221695e-2,
73 -2.4630612614645039828e-4
76 1.0000000000000000000e+0,
77 -4.5355682121856044935e+0,
78 8.1790029773247428573e+0,
79 -7.4634190853767468810e+0,
80 3.6245392503925290187e+0,
81 -8.9936784740041174897e-1,
82 9.8554565816757007266e-2,
83 -3.2116618742475189569e-3
86 double y = 0,
r = 0,
s = 1;
97 const double l = std::log1p(-x);
103 }
else if (x < 0.5) {
116 r = PI*PI/6 - l*(
std::log(1 - 1/x) + 0.5*l);
121 r = PI*PI/3 - 0.5*l*l;
125 const double z = y - 0.25;
127 const double p = horner(z, P);
128 const double q = horner(z, Q);
141 std::complex<double>
dilog(
const std::complex<double>& z_) noexcept
143 const double PI = 3.1415926535897932;
148 const double bf[10] = {
155 - 4.0647616451442255e-11,
156 + 8.9216910204564526e-13,
157 - 1.9939295860721076e-14,
158 + 4.5189800296199182e-16
172 if (nz < std::numeric_limits<double>::epsilon()) {
183 u = -
log(1.0 - 1.0 / z);
184 rest = -0.5*lz*lz - PI*PI/6;
194 rest = u*
log(1.0 - z) + PI*PI/6;
198 u = -
log(1.0 - 1.0 / z);
199 rest = -0.5*lz*lz - PI*PI/6;
206 return sgn*(u + u2*(bf[0] + u*horner<1>(u2, bf))) + rest;
216 const double PI = 3.141592653589793;
217 const std::complex<double> i(0.0, 1.0);
227 if (std::abs(x) < std::numeric_limits<double>::epsilon() ||
228 std::abs(x - PI) < std::numeric_limits<double>::epsilon() ||
229 std::abs(x - 2*PI) < std::numeric_limits<double>::epsilon()) {
233 return std::imag(
dilog(std::exp(i*x)));
HimalayaCalculateDMh3L [a___,(settings|parameters) -> s_List, r___] Sequence r
Declaration of the dilogarithm function.
double clausen_2(double x) noexcept
Clausen function .
double dilog(double x) noexcept
Real dilogarithm .
constexpr T norm_sqr(const Complex< T > &z) noexcept
HimalayaErrorMessage [s_] s
Complex< T > log(const Complex< T > &z_) noexcept