#include <fstream>
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+// S exam
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+
/*
* The data in the following include file has been produced by the following
* Mathematica (V4.1) script:
*
*
- * x={0.2,0.7 ,1,1.4,3.0 }
- * y={0,0.3,-0.8,3.0}
+ * x={2/10,1,14/10,30/10}
+ * y={0,3/10,-14/10}
* st = OpenAppend["exam_inifcns_nstdsums_data.raw"]
+ * $NumberMarks = False
* Do[
* Do[
* Do[Write[st, i]; Write[st,j]; Write[st,x[[k]]+I*y[[l]]];
- * Write[ st,N[PolyLog[i,j,x[[k]]+I*y[[l]]]]],{i,3},{j,3}], {k,5}],{l,4}]
+ * Write[st,Chop[N[PolyLog[i,j,x[[k]]+I*y[[l]]],25]]],{i,3},{j,3}], {k,4}],{l,3}]
* Do[
* Do[
* Do[Write[st, i]; Write[st,j]; Write[st,-x[[k]]+I*y[[l]]];
- * Write[ st,N[PolyLog[i,j,-x[[k]]+I*y[[l]]]]],{i,3},{j,3}], {k,5}], {l,4}]
+ * Write[st,Chop[N[PolyLog[i,j,-x[[k]]+I*y[[l]]],25]]],{i,3},{j,3}], {k,4}], {l,3}]
* Close[st]
*
*
#include "exam_inifcns_nstdsums.h"
-// adjust this if you want to process more S(n,p,x) data
-const int MAX_NDIM = 5;
-const int MAX_PDIM = 5;
-
// signals end of data
const int ENDMARK = -999;
-struct point
-{
- ex x;
- ex res;
-};
-
-typedef vector<point> vp;
-
-vp pp[MAX_NDIM][MAX_PDIM];
-
-
-static unsigned inifcns_consist_S(void)
+static unsigned inifcns_test_S()
{
+ int digitsbuf = Digits;
+ // precision of data
+ Digits = 22;
+ ex prec = 5 * pow(10, -(int)Digits);
+
unsigned result = 0;
- point ppbuf;
int i = 0;
while (true) {
- ex en(data[i++],symbol());
- if (en == ENDMARK) {
+ ex n(data[i++],symbol());
+ if (n == ENDMARK) {
break;
}
- numeric n = ex_to<numeric>(en);
- ex ep(data[i++],symbol());
- numeric p = ex_to<numeric>(ep);
+ ex p(data[i++],symbol());
ex x(data[i++],symbol());
ex res(data[i++],symbol());
-
- ppbuf.x = x;
- ppbuf.res = res;
-
- pp[n.to_int()-1][p.to_int()-1].push_back(ppbuf);
+ ex res2 = S(n, p, x).evalf();
+ if (abs(res-res2) > prec) {
+ clog << "S(" << n << "," << p << "," << x << ") seems to be wrong:" << endl;
+ clog << "GiNaC : " << res2 << endl;
+ clog << "Reference : " << res << endl;
+ clog << "Abs. Difference : " << res2-res << endl;
+ if (res2 != 0) {
+ ex reldiff = abs((res2-res)/res2);
+ clog << "Rel. Difference : " << reldiff << endl;
+ }
+ result++;
+ }
+ if (i % 80) {
+ cout << "." << flush;
+ }
}
+
+ Digits = digitsbuf;
+
+ return result;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+// H/Li exam
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+
+static unsigned inifcns_test_HLi()
+{
+ int digitsbuf = Digits;
+ Digits = 17;
+ ex prec = 5 * pow(10, -(int)Digits);
+ numeric almostone("0.999999999999999999");
+ unsigned result = 0;
+
+ lst res;
- vp::iterator it;
- int error = 0;
-
-// cout << endl << "Calculating ";
- for (int sum=2; sum<=3; sum++) {
- for (int nn=1; nn<sum; nn++) {
- vp& da = pp[nn-1][sum-nn-1];
- for (it = da.begin(); it!=da.end(); it++) {
-// cout << "S(" << nn << "," << sum-nn << "," << it->x << ") " << flush;
- ex res = S(nn,sum-nn,it->x).evalf();
- if (!is_a<numeric>(res)) {
- if ((it->x != -1) || ((sum-nn) == 1)) {
- clog << "S(" << nn << "," << sum-nn << "," << it->x << ") didn't give numerical result!" << endl;
- result++;
- }
- }
- else {
- ex reldiff = abs((it->res-res)/it->res);
- if ((!is_a<numeric>(res)) || (reldiff > numeric("1E-10"))) {
- clog << "S(" << nn << "," << sum-nn << "," << it->x << ") seems to be wrong:" << endl;
- clog << "GiNaC : " << res << endl;
- clog << "Reference : " << it->res << endl;
- clog << "Abs. Difference : " << it->res-res << endl;
- clog << "Rel. Difference : " << reldiff << endl;
- result++;
- }
- }
- }
+ res.append(H(lst(2,1),numeric(1)/2).hold() - (zeta(3)/8 - pow(log(2),3)/6));
+ res.append(H(lst(2,1,3),numeric(1)/3).hold() - Li(lst(2,1,3),lst(numeric(1)/3,1,1)).hold());
+ res.append(H(lst(2,1,3),numeric(98)/100).hold() - Li(lst(2,1,3),lst(numeric(98)/100,1,1)).hold());
+ res.append(H(lst(2,1,3),numeric(245)/100).hold() - Li(lst(2,1,3),lst(numeric(245)/100,1,1)).hold());
+ res.append(H(lst(4,1,1,1),numeric(1)/3).hold() - S(3,4,numeric(1)/3).hold());
+ res.append(H(lst(4,1,1,1),numeric(98)/100).hold() - S(3,4,numeric(98)/100).hold());
+ res.append(H(lst(4,1,1,1),numeric(245)/100).hold() - S(3,4,numeric(245)/100).hold());
+ res.append(H(lst(2,2,3),almostone).hold() - zeta(lst(2,2,3)));
+ res.append(H(lst(-3,-1,2,1),almostone).hold() - zeta(lst(3,1,2,1),lst(-1,1,-1,1)));
+ res.append(H(lst(-2,1,3),numeric(1)/3).hold() - -Li(lst(2,1,3),lst(-numeric(1)/3,-1,1)).hold());
+ res.append(H(lst(-2,1,3),numeric(98)/100).hold() - -Li(lst(2,1,3),lst(-numeric(98)/100,-1,1)).hold());
+ res.append(H(lst(-2,1,3),numeric(245)/100).hold() - -Li(lst(2,1,3),lst(-numeric(245)/100,-1,1)).hold());
+ res.append(H(lst(-3,1,-2,0,0),numeric(3)/10).hold() - convert_H_to_Li(lst(-3,1,-2,0,0),numeric(3)/10).eval());
+
+ for (lst::const_iterator it = res.begin(); it != res.end(); it++) {
+ ex diff = abs((*it).evalf());
+ if (diff > prec) {
+ clog << *it << " seems to be wrong: " << diff << endl;
+ result++;
}
+ cout << "." << flush;
+ }
+
+ Digits = digitsbuf;
+
+ // conjugate test
+ numeric cdif = ex_to<numeric>(H(lst(2,2,1),5.0-5.0*I) - H(lst(2,2,1),5.0+5.0*I));
+ numeric cadd = ex_to<numeric>(H(lst(2,2,1),5.0-5.0*I) + H(lst(2,2,1),5.0+5.0*I));
+ if ((cdif.real() > prec) || (cadd.imag() > prec)) {
+ clog << "complex conjugation test of H({2,2,1},5.0-5.0*I) seems to be wrong: " << cdif << " " << cadd << endl;
+ result++;
+ }
+
+ return result;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+// zeta exam
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+
+static unsigned inifcns_test_zeta()
+{
+ int digitsbuf = Digits;
+
+ unsigned result = 0;
+
+ lst res;
+
+ res.append(zeta(lst(2,1)) - zeta(3));
+ res.append(zeta(lst(2,1,1,1,1)) - zeta(6));
+ res.append(zeta(lst(6,3)) - (zeta(9)*83/2 - zeta(2)*zeta(7)*21 - zeta(2)*zeta(2)*zeta(5)*12/5));
+ res.append(zeta(lst(4,2,3)) - (-zeta(9)*59 + zeta(2)*zeta(7)*28 + pow(zeta(2),2)*zeta(5)*4 -
+ pow(zeta(3),3)/3 + pow(zeta(2),3)*zeta(3)*8/21));
+ res.append(zeta(lst(3,1,3,1,3,1,3,1)) - (2*pow(Pi,16)/factorial(18)));
+ res.append(zeta(lst(2),lst(-1)) - -zeta(2)/2);
+ res.append(zeta(lst(1,2),lst(-1,1)) - (-zeta(3)/4 - zeta(lst(1),lst(-1))*zeta(2)/2));
+ res.append(zeta(lst(2,1,1),lst(-1,-1,1)) - (-pow(zeta(2),2)*23/40 - pow(zeta(lst(1),lst(-1)),2)*zeta(2)*3/4
+ - zeta(lst(3,1),lst(-1,1))*3/2 - zeta(lst(1),lst(-1))*zeta(3)*21/8));
+
+ for (lst::const_iterator it = res.begin(); it != res.end(); it++) {
+ Digits = 17;
+ ex prec = 5 * pow(10, -(int)Digits);
+ ex diff = abs((*it).evalf());
+ if (diff > prec) {
+ clog << *it << " seems to be wrong: " << diff << endl;
+ clog << "Digits: " << Digits << endl;
+ result++;
+ }
+ cout << "." << flush;
+ Digits = 40;
+ prec = 5 * pow(10, -(int)Digits);
+ diff = abs((*it).evalf());
+ if (diff > prec) {
+ clog << *it << " seems to be wrong: " << diff << endl;
+ clog << "Digits: " << Digits << endl;
+ result++;
+ }
+ cout << "." << flush;
}
-// cout << endl;
+
+ Digits = digitsbuf;
return result;
}
cout << "examining consistency of nestedsums functions" << flush;
clog << "----------consistency of nestedsums functions:" << endl;
- result += inifcns_consist_S(); cout << '.' << flush;
+ result += inifcns_test_zeta();
+ result += inifcns_test_S();
+ result += inifcns_test_HLi();
if (!result) {
cout << " passed " << endl;