mirror of
https://github.com/vale981/arb
synced 2025-03-06 09:51:39 -05:00
412 lines
14 KiB
C
412 lines
14 KiB
C
/*=============================================================================
|
|
|
|
This file is part of ARB.
|
|
|
|
ARB is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ARB is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with ARB; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
=============================================================================*/
|
|
/******************************************************************************
|
|
|
|
Copyright (C) 2013 Fredrik Johansson
|
|
|
|
******************************************************************************/
|
|
|
|
#include "acb_poly.h"
|
|
|
|
#define EPS 1e-13
|
|
#define NUM_DERIVS 3
|
|
#define NUM_TESTS 56
|
|
|
|
const double polylog_testdata[NUM_TESTS][10] = {
|
|
{-2.0, 0.0, 0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0},
|
|
{-2.0, 0.0, -0.5, 0.0,
|
|
-0.0740740740740740741, 0.0,
|
|
-0.158799035455864473, 0.0,
|
|
0.00278425812292977954, 0.0},
|
|
{-2.0, 0.0, 0.99609375, 0.0,
|
|
33358080.0, 0.0,
|
|
-215693527.719090182, 0.0,
|
|
703924885.809675425, 0.0},
|
|
{-2.0, 0.0, 1.00390625, 0.0,
|
|
-33751296.0, 0.0,
|
|
218367905.967311029, -106032823.56283664,
|
|
-546519337.1290267, 686023009.262281684},
|
|
{-2.0, 0.0, -4.25, 0.0,
|
|
0.0954540546377281071, 0.0,
|
|
-0.0297817299750221174, 0.0,
|
|
-0.196648773789941696, 0.0},
|
|
{-2.0, 0.0, 3.5, 0.0,
|
|
-1.008, 0.0,
|
|
0.691243661008350802, -3.19575256895409845,
|
|
4.53340070033764442, 2.22882281653983385},
|
|
{-2.0, 0.0, 0.0, -1.0,
|
|
0.0, 0.5,
|
|
-0.852556797635011582, -0.25189536315108886,
|
|
0.345626503121598963, -0.46292146649778986},
|
|
{-2.0, 0.0, 0.125, 0.125,
|
|
0.071424, 0.280832,
|
|
0.0646851488459364134, -0.118051747326526959,
|
|
-0.0396751348737248634, 0.0452067417426917285},
|
|
{-1.0, 0.0, 0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0},
|
|
{-1.0, 0.0, -0.5, 0.0,
|
|
-0.222222222222222222, 0.0,
|
|
-0.131883201632587537, 0.0,
|
|
0.0199225628389378777, 0.0},
|
|
{-1.0, 0.0, 0.99609375, 0.0,
|
|
65280.0, 0.0,
|
|
-389461.499432291984, 0.0,
|
|
1182814.77437627002, 0.0},
|
|
{-1.0, 0.0, 1.00390625, 0.0,
|
|
65792.0, 0.0,
|
|
-392773.095775796478, 206691.925664168516,
|
|
868954.597422132011, -1233932.55215831045},
|
|
{-1.0, 0.0, -4.25, 0.0,
|
|
-0.154195011337868481, 0.0,
|
|
-0.474824989764482489, 0.0,
|
|
-0.21428706813151403, 0.0},
|
|
{-1.0, 0.0, 3.5, 0.0,
|
|
0.56, 0.0,
|
|
-0.322735710701998933, 2.00176023742981729,
|
|
-3.09698193717149541, -0.395213225234415973},
|
|
{-1.0, 0.0, 0.0, -1.0,
|
|
-0.5, 0.0,
|
|
-0.183855151549436048, -0.58312180806163756,
|
|
0.254077251327014729, 0.0351429519611278982},
|
|
{-1.0, 0.0, 0.125, 0.125,
|
|
0.1088, 0.1984,
|
|
0.0192018441183911, -0.0548368329876085499,
|
|
-0.0115465156713130216, 0.020954643261003461},
|
|
{0.0, 0.0, 0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0},
|
|
{0.0, 0.0, -0.5, 0.0,
|
|
-0.333333333333333333, 0.0,
|
|
-0.0904116649848191551, 0.0,
|
|
0.0199028637728058217, 0.0},
|
|
{0.0, 0.0, 0.99609375, 0.0,
|
|
255.0, 0.0,
|
|
-1269.73106874463507, 0.0,
|
|
3359.60296533314103, 0.0},
|
|
{0.0, 0.0, 1.00390625, 0.0,
|
|
-257.0, 0.0,
|
|
1273.86116119868176, -805.817494984366455,
|
|
-2113.9649224353639, 4004.84182305521042},
|
|
{0.0, 0.0, -4.25, 0.0,
|
|
-0.809523809523809524, 0.0,
|
|
-0.795769271870623909, 0.0,
|
|
-0.0965372637237445457, 0.0},
|
|
{0.0, 0.0, 3.5, 0.0,
|
|
-1.4, 0.0,
|
|
-1.78816683065098841, -2.50773109725857055,
|
|
1.83790031889197745, -2.01262260402527512},
|
|
{0.0, 0.0, 0.0, -1.0,
|
|
-0.5, -0.5,
|
|
0.120782237635245222, -0.391594392706836776,
|
|
0.0669079578849868665, 0.116416441749488305},
|
|
{0.0, 0.0, 0.125, 0.125,
|
|
0.12, 0.16,
|
|
0.00583206536388767829, -0.0256940749384562616,
|
|
-0.00344424777009813297, 0.00965046958017889366},
|
|
{-0.5, 0.0, 0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0},
|
|
{-0.5, 0.0, -0.5, 0.0,
|
|
-0.283012810746506023, 0.0,
|
|
-0.111080563146094489, 0.0,
|
|
0.0211430885590715694, 0.0},
|
|
{-0.5, 0.0, 0.99609375, 0.0,
|
|
3619.14124113924805, 0.0,
|
|
-20195.2825251289493, 0.0,
|
|
58032.3050555790807, 0.0},
|
|
{-0.5, 0.0, 1.00390625, 0.0,
|
|
-0.207985517845521836, 3640.61848390552728,
|
|
-11437.7014354502895, -20327.8206114649109,
|
|
63861.4335397379033, 40487.2831296029499},
|
|
{-0.5, 0.0, -4.25, 0.0,
|
|
-0.441427843410865187, 0.0,
|
|
-0.665497904840929966, 0.0,
|
|
-0.162969337925229287, 0.0},
|
|
{-0.5, 0.0, 3.5, 0.0,
|
|
-0.232043460812781422, 0.63203565652521718,
|
|
-2.44367789279529917, 0.119367210264842707,
|
|
-0.763914228371074801, -2.81228485141461073},
|
|
{-0.5, 0.0, 0.0, -1.0,
|
|
-0.537549381115898973, -0.27517974122882025,
|
|
0.0158915835170861709, -0.505981074388456133,
|
|
0.147999289996985447, 0.105632732120539676},
|
|
{-0.5, 0.0, 0.125, 0.125,
|
|
0.116021225799463628, 0.175602658223910358,
|
|
0.0105539353881710306, -0.0374742285737420805,
|
|
-0.0062875342272019156, 0.0142081398192247589},
|
|
{1.0, 0.0, 0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0},
|
|
{1.0, 0.0, -0.5, 0.0,
|
|
-0.405465108108164382, 0.0,
|
|
-0.0556552111040376179, 0.0,
|
|
0.0145754167941056437, 0.0},
|
|
{1.0, 0.0, 0.99609375, 0.0,
|
|
5.54517744447956248, 0.0,
|
|
-13.0766609768056118, 0.0,
|
|
24.0940545588450487, 0.0},
|
|
{1.0, 0.0, 1.00390625, 0.0,
|
|
5.54517744447956248, -3.14159265358979324,
|
|
-8.16844417312495553, 15.6134381896777968,
|
|
-0.38789687903338657, -36.2148484363837508},
|
|
{1.0, 0.0, -4.25, 0.0,
|
|
-1.65822807660353238, 0.0,
|
|
-0.861140718490863904, 0.0,
|
|
0.0240108114276114004, 0.0},
|
|
{1.0, 0.0, 3.5, 0.0,
|
|
-0.916290731874155065, -3.14159265358979324,
|
|
2.57284574234941582, -2.52133906787958123,
|
|
1.44241441233798233, 1.57208443290129947},
|
|
{1.0, 0.0, 0.0, -1.0,
|
|
-0.346573590279972655, -0.78539816339744831,
|
|
0.160292055087885226, -0.192901316796912429,
|
|
-0.0115066749133700615, 0.0770708622146679417},
|
|
{1.0, 0.0, 0.125, 0.125,
|
|
0.123430038965762899, 0.141897054604163923,
|
|
0.00180689203856968544, -0.0122114794810442984,
|
|
-0.00105066979284378462, 0.00449853805632375062},
|
|
{2.0, 0.0, 0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0},
|
|
{2.0, 0.0, -0.5, 0.0,
|
|
-0.448414206923646202, 0.0,
|
|
-0.0320237060779612787, 0.0,
|
|
0.0092536571135294828, 0.0},
|
|
{2.0, 0.0, 0.99609375, 0.0,
|
|
1.61932072927810507, 0.0,
|
|
-0.863010139919679163, 0.0,
|
|
0.825515949454683347, 0.0},
|
|
{2.0, 0.0, 1.00390625, 0.0,
|
|
1.6704551616562229, -0.0122479400888173039,
|
|
-0.992661633138610541, 0.0731191212424626706,
|
|
1.04852574935488925, -0.214307793003452771},
|
|
{2.0, 0.0, -4.25, 0.0,
|
|
-2.46898738747224279, 0.0,
|
|
-0.739287387997829118, 0.0,
|
|
0.0874470644522297429, 0.0},
|
|
{2.0, 0.0, 3.5, 0.0,
|
|
2.1959348115757808, -3.93567093851438969,
|
|
2.87640729249480637, 0.777030723254221356,
|
|
-0.81939570865486996, 1.19241843763256774},
|
|
{2.0, 0.0, 0.0, -1.0,
|
|
-0.205616758356028305, -0.915965594177219015,
|
|
0.117193531789480469, -0.0815807361165927951,
|
|
-0.0255408233794369879, 0.0372076062178391175},
|
|
{2.0, 0.0, 0.125, 0.125,
|
|
0.124500148439393858, 0.133240721203487057,
|
|
0.000569113907620539642, -0.00588251562210034232,
|
|
-0.000326714635669985778, 0.00213086661076891839},
|
|
{-2.0, 2.0, 0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0},
|
|
{-2.0, 2.0, -0.5, 0.0,
|
|
-0.132203419506655614, -0.390689361106274866,
|
|
-0.256343261725123592, 0.106175177622871437,
|
|
0.0749290443999118563, 0.0319207027895210173},
|
|
{-2.0, 2.0, 0.99609375, 0.0,
|
|
13841369.6929212372, -8339597.62269406988,
|
|
-87251051.2148652244, 65225350.0315463319,
|
|
273254167.909661771, -247710863.316563213},
|
|
{-2.0, 2.0, 1.00390625, 0.0,
|
|
-26028.6661639721745, 15961.1559569935978,
|
|
113847.512122984734, -206358.723605581203,
|
|
6578.40068463757013, 908971.828153761815},
|
|
{-2.0, 2.0, -4.25, 0.0,
|
|
1.26205464628714387, 0.274313692011971484,
|
|
0.442242006131113713, -1.61799252235272836,
|
|
-0.927785295033312282, -0.172205994085466244},
|
|
{-2.0, 2.0, 3.5, 0.0,
|
|
0.0870998538268457367, 0.0980699787750225838,
|
|
0.152937181587789832, -0.0211963252018165386,
|
|
0.0431921445114569281, -0.0695183434413184998},
|
|
{-2.0, 2.0, 0.0, -1.0,
|
|
0.199312975007554535, -0.0775592701795263651,
|
|
-0.0210851901426345675, -0.167326332453265841,
|
|
-0.0632997708310078762, -0.0392019115527122943},
|
|
{-2.0, 2.0, 0.125, 0.125,
|
|
0.315234332693229892, 0.165559827416958489,
|
|
-0.16530664867351669, -0.0392852937947218337,
|
|
0.0780220225006149953, 0.0215283250955342792},
|
|
};
|
|
|
|
int main()
|
|
{
|
|
long iter;
|
|
flint_rand_t state;
|
|
|
|
printf("polylog_cpx....");
|
|
fflush(stdout);
|
|
|
|
flint_randinit(state);
|
|
|
|
/* check particular values against table */
|
|
{
|
|
acb_t s, z, t;
|
|
acb_ptr w1, w2;
|
|
long i, j, prec;
|
|
|
|
acb_init(s);
|
|
acb_init(z);
|
|
acb_init(t);
|
|
w1 = _acb_vec_init(NUM_DERIVS);
|
|
w2 = _acb_vec_init(NUM_DERIVS);
|
|
|
|
for (prec = 32; prec <= 512; prec *= 4)
|
|
{
|
|
for (i = 0; i < NUM_TESTS; i++)
|
|
{
|
|
acb_zero(s);
|
|
arf_set_d(arb_midref(acb_realref(s)), polylog_testdata[i][0]);
|
|
arf_set_d(arb_midref(acb_imagref(s)), polylog_testdata[i][1]);
|
|
|
|
acb_zero(z);
|
|
arf_set_d(arb_midref(acb_realref(z)), polylog_testdata[i][2]);
|
|
arf_set_d(arb_midref(acb_imagref(z)), polylog_testdata[i][3]);
|
|
|
|
_acb_poly_polylog_cpx_small(w1, s, z, NUM_DERIVS, prec);
|
|
_acb_poly_polylog_cpx_zeta(w2, s, z, NUM_DERIVS, prec);
|
|
|
|
for (j = 0; j < NUM_DERIVS; j++)
|
|
{
|
|
arf_set_d(arb_midref(acb_realref(t)), polylog_testdata[i][4+2*j]);
|
|
mag_set_d(arb_radref(acb_realref(t)), fabs(polylog_testdata[i][4+2*j]) * EPS);
|
|
arf_set_d(arb_midref(acb_imagref(t)), polylog_testdata[i][4+2*j+1]);
|
|
mag_set_d(arb_radref(acb_imagref(t)), fabs(polylog_testdata[i][4+2*j+1]) * EPS);
|
|
|
|
if (!acb_overlaps(w1 + j, t) || !acb_overlaps(w2 + j, t)
|
|
|| !acb_overlaps(w1 + j, w2 + j))
|
|
{
|
|
printf("FAIL\n\n");
|
|
printf("s = "); acb_printd(s, 15); printf("\n\n");
|
|
printf("z = "); acb_printd(z, 15); printf("\n\n");
|
|
printf("t = "); acb_printd(t, 15); printf("\n\n");
|
|
printf("w1 = "); acb_printd(w1 + j, 15); printf("\n\n");
|
|
printf("w2 = "); acb_printd(w2 + j, 15); printf("\n\n");
|
|
abort();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
_acb_vec_clear(w1, NUM_DERIVS);
|
|
_acb_vec_clear(w2, NUM_DERIVS);
|
|
acb_clear(s);
|
|
acb_clear(z);
|
|
acb_clear(t);
|
|
}
|
|
|
|
for (iter = 0; iter < 250; iter++)
|
|
{
|
|
acb_t s, z;
|
|
acb_ptr w1, w2;
|
|
long i, len1, len2, prec1, prec2;
|
|
|
|
acb_init(s);
|
|
acb_init(z);
|
|
|
|
if (n_randint(state, 2))
|
|
acb_randtest(s, state, 1 + n_randint(state, 300), 3);
|
|
else
|
|
acb_set_si(s, n_randint(state, 20) - 10);
|
|
|
|
switch (n_randint(state, 3))
|
|
{
|
|
case 0:
|
|
acb_randtest(z, state, 1 + n_randint(state, 300), 10);
|
|
break;
|
|
case 1:
|
|
arb_randtest(acb_realref(z), state, 1 + n_randint(state, 300), 10);
|
|
break;
|
|
case 2:
|
|
acb_one(z);
|
|
break;
|
|
}
|
|
|
|
prec1 = 2 + n_randint(state, 300);
|
|
prec2 = prec1 + 30;
|
|
len1 = 1 + n_randint(state, 20);
|
|
len2 = 1 + n_randint(state, 20);
|
|
|
|
w1 = _acb_vec_init(len1);
|
|
w2 = _acb_vec_init(len2);
|
|
|
|
switch (n_randint(state, 5))
|
|
{
|
|
case 0:
|
|
_acb_poly_polylog_cpx_small(w1, s, z, len1, prec1);
|
|
break;
|
|
case 1:
|
|
_acb_poly_polylog_cpx_zeta(w1, s, z, len1, prec1);
|
|
break;
|
|
default:
|
|
_acb_poly_polylog_cpx(w1, s, z, len1, prec1);
|
|
break;
|
|
}
|
|
|
|
switch (n_randint(state, 5))
|
|
{
|
|
case 0:
|
|
_acb_poly_polylog_cpx_small(w2, s, z, len2, prec2);
|
|
break;
|
|
case 1:
|
|
_acb_poly_polylog_cpx_zeta(w2, s, z, len2, prec2);
|
|
break;
|
|
default:
|
|
_acb_poly_polylog_cpx(w2, s, z, len2, prec2);
|
|
break;
|
|
}
|
|
|
|
for (i = 0; i < FLINT_MIN(len1, len2); i++)
|
|
{
|
|
if (!acb_overlaps(w1 + i, w2 + i))
|
|
{
|
|
printf("FAIL: overlap\n\n");
|
|
printf("iter = %ld\n", iter);
|
|
printf("len1 = %ld, len2 = %ld, i = %ld\n\n", len1, len2, i);
|
|
printf("s = "); acb_printd(s, prec1 / 3.33); printf("\n\n");
|
|
printf("z = "); acb_printd(z, prec1 / 3.33); printf("\n\n");
|
|
printf("w1 = "); acb_printd(w1 + i, prec1 / 3.33); printf("\n\n");
|
|
printf("w2 = "); acb_printd(w2 + i, prec2 / 3.33); printf("\n\n");
|
|
abort();
|
|
}
|
|
}
|
|
|
|
acb_clear(s);
|
|
acb_clear(z);
|
|
_acb_vec_clear(w1, len1);
|
|
_acb_vec_clear(w2, len2);
|
|
}
|
|
|
|
flint_randclear(state);
|
|
flint_cleanup();
|
|
printf("PASS\n");
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|