首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有复变元的Riemann zeta函数

具有复变元的Riemann zeta函数
EN

Stack Overflow用户
提问于 2017-01-09 21:49:57
回答 1查看 446关注 0票数 8

Riemann Zeta函数可以在复平面上定义。为什么除了它的复杂性之外,在C++17GSLBoost C++中,参数只能是real(double)

EN

回答 1

Stack Overflow用户

发布于 2021-10-27 21:13:28

下面是C++中的一个实现

代码语言:javascript
复制
const long double LOWER_THRESHOLD = 1.0e-6;
const long double UPPER_BOUND = 1.0e+4;
const int MAXNUM = 100;

std::complex<long double> zeta(const std::complex<long double>& s)
{
    std::complex<long double> a_arr[MAXNUM + 1];
    std::complex<long double> half(0.5, 0.0);
    std::complex<long double> one(1.0, 0.0);
    std::complex<long double> two(2.0, 0.0);
    std::complex<long double> rev(-1.0, 0.0);
    std::complex<long double> sum(0.0, 0.0);
    std::complex<long double> prev(1.0e+20, 0.0);
    
    a_arr[0] = half / (one - std::pow(two, (one - s))); //initialize with a_0 = 0.5 / (1 - 2^(1-s))
    sum += a_arr[0];

    for (int n = 1; n <= MAXNUM; n++)
    {
        std::complex<long double> nCplx(n, 0.0); //complex index

        for (int k = 0; k < n; k++)
        {
            std::complex<long double> kCplx(k, 0.0); //complex index

            a_arr[k] *= half * (nCplx / (nCplx - kCplx));
            sum += a_arr[k];
        }

        a_arr[n] = (rev * a_arr[n - 1] * std::pow((nCplx / (nCplx + one)), s) / nCplx);
        sum += a_arr[n];


        if (std::abs(prev - sum) < LOWER_THRESHOLD)//If the difference is less than or equal to the threshold value, it is considered to be convergent and the calculation is terminated.
            break;

        if (std::abs(sum) > UPPER_BOUND)//doesn't work for large values, so it gets terminated when it exceeds UPPER_BOUND
            break;

        prev = sum;
    }

    return sum;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41549533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档