[Scilab-users] Riemann Zeta update
Stéphane Mottelet
stephane.mottelet at utc.fr
Wed May 25 11:22:10 CEST 2022
Hi,
For real argument, we could easily interface std::riemann_zeta :
https://en.cppreference.com/w/cpp/numeric/special_functions/riemann_zeta
If you have a compiler (under windows you can install the minGW atoms
module), you can run the following script:
code=[
"#define __STDCPP_WANT_MATH_SPEC_FUNCS__ 1 "
"#include <cmath>"
"#include ""double.hxx"" "
"#include ""function.hxx"" "
"extern ""C"" "
"{ "
"#include ""Scierror.h"" "
"#include ""localization.h"" "
"} "
"/* ====================================================================
*/ "
"types::Function::ReturnValue sci_zeta(types::typed_list &in, int
_iRetCount, types::typed_list &out) "
"{ "
"types::Double* pDblOut; "
"types::Double* pDblIn; "
"if (in.size() != 1) "
"{ "
"Scierror(77, _(""%s: Wrong number of input argument(s): %d
expected.\n""), ""zeta"", 1); "
"return types::Function::Error; "
"} "
"if (_iRetCount >1) "
"{ "
"Scierror(78, _(""%s: Wrong number of output argument(s): %d
expected.""), ""zeta"", 1); "
"return types::Function::Error; "
"} "
"if (in[0]->isDouble() == false ||
in[0]->getAs<types::Double>()->isComplex()) "
"{ "
"Scierror(999, _(""%s: Wrong type for input argument #%d: real
expected.\n""), ""zeta"", 1); "
"return types::Function::Error; "
"} "
"pDblIn = in[0]->getAs<types::Double>(); "
"pDblOut = pDblIn->clone(); "
"for (int i = 0 ; i <pDblIn->getSize() ; ++i) "
"{ "
"pDblOut->set(i,std::riemann_zeta(pDblIn->get(i))); "
"} "
"out.push_back(pDblOut); "
"return types::Function::OK; "
"} "
];
ulink
files = fullfile(TMPDIR,"sci_zeta.cpp");
mputl(code,files)
ilib_verbose(1)
ilib_build("zeta", ["zeta" "sci_zeta" "cppsci"],files,[])
exec loader.sce
tic
disp(zeta(0.5))
disp(toc())
Le 22/05/2022 à 08:31, Lester Anderson a écrit :
> Hi all,
>
> After a lot of trial and error, I have managed to get a set of
> functions to compute the approximations of Riemann's Zeta for negative
> and positive real values; values of n > 1e6 seem to give better results:
>
> function zs=zeta_s(z, n)
> // Summation loop
> zs=1;
> if z == 0
> zs = -0.5
> elseif z == 1
> zs = %inf
> else
> for i = 2: n-1
> zs = zs + i.^-z;
> end
> end
> endfunction
>
> function zfn=zeta_functional_eqn(s)
> // Riemann's functional equation
> // Analytic continuation for negative values
> zfn = 2.^s .* %pi.^(s - 1) .* sin(%pi.*s./2) .* gamma(1 - s) .* zeta_s((1 - s),n)
> endfunction
> For even values of s < -20 the values of Zeta(s) increase in value and
> are not as close to zero as expected e.g. zeta_functional_eqn(-40)
> gives 7.5221382. At small even values e.g. -10, the result is of the
> order of ~1e-18 (close enough to zero). Any ideas why the even zeta
> values increase or how to reduce that response?
>
> The solution over the critical strip (zero to one) is not so efficient
> unless n is very large( > 1e8), and there seems to be a performance
> issue when using a for-loop compared to vectorisation. Vectorised n
> speeds things up quite a bit.
>
> function zs2=zeta_0_1(s, n)
> zs2=0
> for i = 1: n
> zs2 = zs2 + (-1).^(i + 1)./(i.^s );
> end
> zs2 = 1./(1 - 2.^( 1-s )).*zs2;
> endfunction
>
> function zs1=zeta_0_1(s, n)
> // Vectorised version
> zs1=0
> k=linspace(1,n,n);
> zs1 = sum((-1).^(k+ 1)./(k.^s ));
> zs1 = 1./(1 - 2.^( 1-s )).*zs1;
> endfunction
> For example, calculating the approximation of Zeta(0.5) using a
> for-loop takes ~150s to give a value of -1.4602337981325388 (quite
> close), whereas the vectorised version does the computation in under
> 20s, both tested using n=1e8. Can the functions be optimised to
> improve speed and accuracy?
>
> Using Scilab 6.1.1 on Windows 10 (16 Gb RAM).
>
> Thanks
> Lester
>
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users
--
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20220525/9e7c9d1c/attachment.htm>
More information about the users
mailing list