Skip to content

Commit d47291c

Browse files
authored
Feature: test symmetries of Clausen functions (#42)
1 parent 206653f commit d47291c

File tree

8 files changed

+151
-3
lines changed

8 files changed

+151
-3
lines changed

test/test.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
#endif
1010

1111

12+
#ifndef M_PIL
13+
#define M_PIL 3.14159265358979323846264338327950288L
14+
#endif
15+
16+
1217
#define CHECK_CLOSE(a,b,eps) \
1318
do { \
1419
if (std::isinf(a) && std::isinf(b)) { \

test/test_Cl.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,15 @@ TEST_CASE("test_fixed_values")
137137
INFO("n = " << n << ", x = " << x);
138138
CHECK_CLOSE(polylogarithm::Cl(n, x), cl_expected, 1e-13);
139139
CHECK_CLOSE(Cl_via_Li(n, x), cl_expected, 1e-9);
140+
141+
// test symmetries
142+
if (std::abs(std::fmod(x, 2*M_PI)) > 0.1 && std::abs(x - 2*M_PI) > 0.1) {
143+
const int sgn = n % 2 == 0 ? -1 : 1;
144+
CHECK_CLOSE(polylogarithm::Cl(n, x + 2*M_PI), cl_expected, 1e-10);
145+
CHECK_CLOSE(polylogarithm::Cl(n, x - 2*M_PI), cl_expected, 1e-10);
146+
CHECK_CLOSE(polylogarithm::Cl(n, -x ), sgn*cl_expected, 1e-10);
147+
CHECK_CLOSE(polylogarithm::Cl(n, -x ), sgn*cl_expected, 1e-10);
148+
}
140149
}
141150
}
142151
}

test/test_Cl2.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,5 +264,30 @@ TEST_CASE("test_real_fixed_values")
264264
CHECK_CLOSE(cl128_koelbig, cl128_expected, 50*eps128);
265265
}
266266
CHECK_CLOSE(cl128_li2 , cl128_expected, 10*eps128);
267+
268+
// test symmetries
269+
if (std::abs(std::fmod(x64, 2*M_PI)) > 0.1 && std::abs(x64 - 2*M_PI) > 0.1) {
270+
CHECK_CLOSE( polylogarithm::Cl2(x64 + 2*M_PI), cl64_expected , 10*eps64);
271+
CHECK_CLOSE( polylogarithm::Cl2(x64 - 2*M_PI), cl64_expected , 10*eps64);
272+
CHECK_CLOSE( polylogarithm::Cl2(-x64 ), -cl64_expected , 10*eps64);
273+
CHECK_CLOSE( polylogarithm::Cl2(-x64 ), -cl64_expected , 10*eps64);
274+
275+
CHECK_CLOSE( cl2(x64 + 2*M_PI), cl64_expected , 10*eps64);
276+
CHECK_CLOSE( cl2(x64 - 2*M_PI), cl64_expected , 10*eps64);
277+
CHECK_CLOSE( cl2(-x64 ), -cl64_expected , 10*eps64);
278+
CHECK_CLOSE( cl2(-x64 ), -cl64_expected , 10*eps64);
279+
280+
#ifdef ENABLE_FORTRAN
281+
CHECK_CLOSE( poly_Cl2_fortran(x64 + 2*M_PI), cl64_expected , 10*eps64);
282+
CHECK_CLOSE( poly_Cl2_fortran(x64 - 2*M_PI), cl64_expected , 10*eps64);
283+
CHECK_CLOSE( poly_Cl2_fortran(-x64 ), -cl64_expected , 10*eps64);
284+
CHECK_CLOSE( poly_Cl2_fortran(-x64 ), -cl64_expected , 10*eps64);
285+
#endif
286+
287+
CHECK_CLOSE(polylogarithm::Cl2(x128 + 2*M_PIL), cl128_expected, 10*eps128);
288+
CHECK_CLOSE(polylogarithm::Cl2(x128 - 2*M_PIL), cl128_expected, 10*eps128);
289+
CHECK_CLOSE(polylogarithm::Cl2(-x128 ), -cl128_expected, 10*eps128);
290+
CHECK_CLOSE(polylogarithm::Cl2(-x128 ), -cl128_expected, 10*eps128);
291+
}
267292
}
268293
}

test/test_Cl3.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,5 +124,30 @@ TEST_CASE("test_real_fixed_values")
124124
CHECK_CLOSE(cl128_poly , cl128_expected, 5*eps128);
125125
CHECK_CLOSE(cl128_poly_c, cl128_expected, 5*eps128);
126126
CHECK_CLOSE(cl128_li3 , cl128_expected, 2*eps128);
127+
128+
// test symmetries
129+
if (std::abs(std::fmod(x64, 2*M_PI)) > 0.1 && std::abs(x64 - 2*M_PI) > 0.1) {
130+
CHECK_CLOSE( polylogarithm::Cl3(x64 + 2*M_PI), cl64_expected , 10*eps64);
131+
CHECK_CLOSE( polylogarithm::Cl3(x64 - 2*M_PI), cl64_expected , 10*eps64);
132+
CHECK_CLOSE( polylogarithm::Cl3(-x64 ), cl64_expected , 10*eps64);
133+
CHECK_CLOSE( polylogarithm::Cl3(-x64 ), cl64_expected , 10*eps64);
134+
135+
CHECK_CLOSE( cl3(x64 + 2*M_PI), cl64_expected , 10*eps64);
136+
CHECK_CLOSE( cl3(x64 - 2*M_PI), cl64_expected , 10*eps64);
137+
CHECK_CLOSE( cl3(-x64 ), cl64_expected , 10*eps64);
138+
CHECK_CLOSE( cl3(-x64 ), cl64_expected , 10*eps64);
139+
140+
#ifdef ENABLE_FORTRAN
141+
CHECK_CLOSE( poly_Cl3_fortran(x64 + 2*M_PI), cl64_expected , 10*eps64);
142+
CHECK_CLOSE( poly_Cl3_fortran(x64 - 2*M_PI), cl64_expected , 10*eps64);
143+
CHECK_CLOSE( poly_Cl3_fortran(-x64 ), cl64_expected , 10*eps64);
144+
CHECK_CLOSE( poly_Cl3_fortran(-x64 ), cl64_expected , 10*eps64);
145+
#endif
146+
147+
CHECK_CLOSE(polylogarithm::Cl3(x128 + 2*M_PIL), cl128_expected, 10*eps128);
148+
CHECK_CLOSE(polylogarithm::Cl3(x128 - 2*M_PIL), cl128_expected, 10*eps128);
149+
CHECK_CLOSE(polylogarithm::Cl3(-x128 ), cl128_expected, 10*eps128);
150+
CHECK_CLOSE(polylogarithm::Cl3(-x128 ), cl128_expected, 10*eps128);
151+
}
127152
}
128153
}

test/test_Cl4.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,5 +167,30 @@ TEST_CASE("test_real_fixed_values")
167167
CHECK_CLOSE(cl128_li4 , cl128_expected, 2*eps128);
168168
CHECK_CLOSE(cl128_poly , cl128_expected, 2*eps128);
169169
CHECK_CLOSE(cl128_poly_c, cl128_expected, 2*eps128);
170+
171+
// test symmetries
172+
if (std::abs(std::fmod(x64, 2*M_PI)) > 0.1 && std::abs(x64 - 2*M_PI) > 0.1) {
173+
CHECK_CLOSE( polylogarithm::Cl4(x64 + 2*M_PI), cl64_expected , 10*eps64);
174+
CHECK_CLOSE( polylogarithm::Cl4(x64 - 2*M_PI), cl64_expected , 10*eps64);
175+
CHECK_CLOSE( polylogarithm::Cl4(-x64 ), -cl64_expected , 10*eps64);
176+
CHECK_CLOSE( polylogarithm::Cl4(-x64 ), -cl64_expected , 10*eps64);
177+
178+
CHECK_CLOSE( cl4(x64 + 2*M_PI), cl64_expected , 10*eps64);
179+
CHECK_CLOSE( cl4(x64 - 2*M_PI), cl64_expected , 10*eps64);
180+
CHECK_CLOSE( cl4(-x64 ), -cl64_expected , 10*eps64);
181+
CHECK_CLOSE( cl4(-x64 ), -cl64_expected , 10*eps64);
182+
183+
#ifdef ENABLE_FORTRAN
184+
CHECK_CLOSE( poly_Cl4_fortran(x64 + 2*M_PI), cl64_expected , 10*eps64);
185+
CHECK_CLOSE( poly_Cl4_fortran(x64 - 2*M_PI), cl64_expected , 10*eps64);
186+
CHECK_CLOSE( poly_Cl4_fortran(-x64 ), -cl64_expected , 10*eps64);
187+
CHECK_CLOSE( poly_Cl4_fortran(-x64 ), -cl64_expected , 10*eps64);
188+
#endif
189+
190+
CHECK_CLOSE(polylogarithm::Cl4(x128 + 2*M_PIL), cl128_expected, 10*eps128);
191+
CHECK_CLOSE(polylogarithm::Cl4(x128 - 2*M_PIL), cl128_expected, 10*eps128);
192+
CHECK_CLOSE(polylogarithm::Cl4(-x128 ), -cl128_expected, 10*eps128);
193+
CHECK_CLOSE(polylogarithm::Cl4(-x128 ), -cl128_expected, 10*eps128);
194+
}
170195
}
171196
}

test/test_Cl5.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,5 +117,30 @@ TEST_CASE("test_real_fixed_values")
117117
CHECK_CLOSE(cl128_li , cl128_expected, 4*eps128);
118118
CHECK_CLOSE(cl128_poly , cl128_expected, 7*eps128);
119119
CHECK_CLOSE(cl128_poly_c, cl128_expected, 7*eps128);
120+
121+
// test symmetries
122+
if (std::abs(std::fmod(x64, 2*M_PI)) > 0.1 && std::abs(x64 - 2*M_PI) > 0.1) {
123+
CHECK_CLOSE( polylogarithm::Cl5(x64 + 2*M_PI), cl64_expected , 10*eps64);
124+
CHECK_CLOSE( polylogarithm::Cl5(x64 - 2*M_PI), cl64_expected , 10*eps64);
125+
CHECK_CLOSE( polylogarithm::Cl5(-x64 ), cl64_expected , 10*eps64);
126+
CHECK_CLOSE( polylogarithm::Cl5(-x64 ), cl64_expected , 10*eps64);
127+
128+
CHECK_CLOSE( cl5(x64 + 2*M_PI), cl64_expected , 10*eps64);
129+
CHECK_CLOSE( cl5(x64 - 2*M_PI), cl64_expected , 10*eps64);
130+
CHECK_CLOSE( cl5(-x64 ), cl64_expected , 10*eps64);
131+
CHECK_CLOSE( cl5(-x64 ), cl64_expected , 10*eps64);
132+
133+
#ifdef ENABLE_FORTRAN
134+
CHECK_CLOSE( poly_Cl5_fortran(x64 + 2*M_PI), cl64_expected , 10*eps64);
135+
CHECK_CLOSE( poly_Cl5_fortran(x64 - 2*M_PI), cl64_expected , 10*eps64);
136+
CHECK_CLOSE( poly_Cl5_fortran(-x64 ), cl64_expected , 10*eps64);
137+
CHECK_CLOSE( poly_Cl5_fortran(-x64 ), cl64_expected , 10*eps64);
138+
#endif
139+
140+
CHECK_CLOSE(polylogarithm::Cl5(x128 + 2*M_PIL), cl128_expected, 10*eps128);
141+
CHECK_CLOSE(polylogarithm::Cl5(x128 - 2*M_PIL), cl128_expected, 10*eps128);
142+
CHECK_CLOSE(polylogarithm::Cl5(-x128 ), cl128_expected, 10*eps128);
143+
CHECK_CLOSE(polylogarithm::Cl5(-x128 ), cl128_expected, 10*eps128);
144+
}
120145
}
121146
}

test/test_Cl6.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,5 +166,30 @@ TEST_CASE("test_real_fixed_values")
166166
CHECK_CLOSE(cl128_li , cl128_expected, 4*eps128);
167167
CHECK_CLOSE(cl128_poly , cl128_expected, 8*eps128);
168168
CHECK_CLOSE(cl128_poly_c, cl128_expected, 8*eps128);
169+
170+
// test symmetries
171+
if (std::abs(std::fmod(x64, 2*M_PI)) > 0.1 && std::abs(x64 - 2*M_PI) > 0.1) {
172+
CHECK_CLOSE( polylogarithm::Cl6(x64 + 2*M_PI), cl64_expected , 10*eps64);
173+
CHECK_CLOSE( polylogarithm::Cl6(x64 - 2*M_PI), cl64_expected , 10*eps64);
174+
CHECK_CLOSE( polylogarithm::Cl6(-x64 ), -cl64_expected , 10*eps64);
175+
CHECK_CLOSE( polylogarithm::Cl6(-x64 ), -cl64_expected , 10*eps64);
176+
177+
CHECK_CLOSE( cl6(x64 + 2*M_PI), cl64_expected , 10*eps64);
178+
CHECK_CLOSE( cl6(x64 - 2*M_PI), cl64_expected , 10*eps64);
179+
CHECK_CLOSE( cl6(-x64 ), -cl64_expected , 10*eps64);
180+
CHECK_CLOSE( cl6(-x64 ), -cl64_expected , 10*eps64);
181+
182+
#ifdef ENABLE_FORTRAN
183+
CHECK_CLOSE( poly_Cl6_fortran(x64 + 2*M_PI), cl64_expected , 10*eps64);
184+
CHECK_CLOSE( poly_Cl6_fortran(x64 - 2*M_PI), cl64_expected , 10*eps64);
185+
CHECK_CLOSE( poly_Cl6_fortran(-x64 ), -cl64_expected , 10*eps64);
186+
CHECK_CLOSE( poly_Cl6_fortran(-x64 ), -cl64_expected , 10*eps64);
187+
#endif
188+
189+
CHECK_CLOSE(polylogarithm::Cl6(x128 + 2*M_PIL), cl128_expected, 10*eps128);
190+
CHECK_CLOSE(polylogarithm::Cl6(x128 - 2*M_PIL), cl128_expected, 10*eps128);
191+
CHECK_CLOSE(polylogarithm::Cl6(-x128 ), -cl128_expected, 10*eps128);
192+
CHECK_CLOSE(polylogarithm::Cl6(-x128 ), -cl128_expected, 10*eps128);
193+
}
169194
}
170195
}

test/test_Sl.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,19 @@ TEST_CASE("test_fixed_values")
5353

5454
for (const auto& v: fixed_values) {
5555
const auto x = v.first;
56-
const auto cl_expected = v.second;
56+
const auto sl_expected = v.second;
5757
INFO("n = " << n << ", x = " << x);
58-
CHECK_CLOSE(polylogarithm::Sl(n, x), cl_expected, 1e-13);
59-
CHECK_CLOSE(Sl_via_Li(n, x), cl_expected, 1e-9);
58+
CHECK_CLOSE(polylogarithm::Sl(n, x), sl_expected, 1e-13);
59+
CHECK_CLOSE(Sl_via_Li(n, x), sl_expected, 1e-9);
60+
61+
// test symmetries
62+
if (std::abs(std::fmod(x, 2*M_PI)) > 0.1 && std::abs(x - 2*M_PI) > 0.1) {
63+
const int sgn = n % 2 == 0 ? 1 : -1;
64+
CHECK_CLOSE(polylogarithm::Sl(n, x + 2*M_PI), sl_expected, 1e-10);
65+
CHECK_CLOSE(polylogarithm::Sl(n, x - 2*M_PI), sl_expected, 1e-10);
66+
CHECK_CLOSE(polylogarithm::Sl(n, -x ), sgn*sl_expected, 1e-10);
67+
CHECK_CLOSE(polylogarithm::Sl(n, -x ), sgn*sl_expected, 1e-10);
68+
}
6069
}
6170
}
6271
}

0 commit comments

Comments
 (0)