X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=check%2Fexam_inifcns_nstdsums.cpp;h=35f9ddbbb32dddc698da42963b18ff4cdeeb7b8e;hp=f6864aa5f4d7112a95bbdcdf8b642fe4977f5492;hb=4405b29465293f3b6ab37745ff601f519b0256e2;hpb=0d70177235893dba01cc04e3c84a98d99aa6c878 diff --git a/check/exam_inifcns_nstdsums.cpp b/check/exam_inifcns_nstdsums.cpp index f6864aa5..35f9ddbb 100644 --- a/check/exam_inifcns_nstdsums.cpp +++ b/check/exam_inifcns_nstdsums.cpp @@ -4,7 +4,7 @@ * functions. */ /* - * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2004 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,22 +26,30 @@ #include +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// 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] * * @@ -60,80 +68,153 @@ #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 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(en); - ex ep(data[i++],symbol()); - numeric p = ex_to(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; nnx << ") " << flush; - ex res = S(nn,sum-nn,it->x).evalf(); - if (!is_a(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(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(H(lst(2,2,1),5.0-5.0*I) - H(lst(2,2,1),5.0+5.0*I)); + numeric cadd = ex_to(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; } @@ -146,7 +227,9 @@ unsigned exam_inifcns_nstdsums(void) 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;