晚安,我正在一个需要计算nTh顺序的伯努利数的项目。我在互联网上尝试了很多算法,主要是在C ++中对我来说没什么用处。而且总是我会编辑错误或错误的数字结果!计算它的最快方法是什么? Odd的数字总是0.00000,我需要计算任何偶数......我只需要我在函数上放的数字的结果,不需要列出数字直到nTh,就像我在互联网上看到的每个算法一样确实。最后我尝试了编译错误并在修复后给出了错误的答案以上...是的,对于会问我是否将代码库放在代码上的人,是的,我做到了!问题不是库,它是错误的算法。我在Code :: Blocks for Windows 10 Pro上使用C on GCC mingw 32-bit。
#include <float.h>
#include <math.h>
void bernoulli_B( int iMax, double* dB )
{
dB[0] = 1.0;
dB[1] = -0.5;
for( int j = 3; j <= iMax; j += 2 )
dB[j] = 0.0;
const double eps = DBL_EPSILON;
const double TwoPi = 6.2831853071795860;
double dCoeff = 2.0 / (TwoPi * TwoPi);
double d2 = 2.0;
for( int n = 1; n <= iMax/2; n++ )
{
double g1 = 1.0,
g2 = 1.0;
for( int j = 0; j < n; j++ )
{
g1 *= 4.0;
g2 *= 9.0;
}
double S1 = 1.0 - 1.0/g1,
S2 = S1 + 1.0/g2, S3;
double T1 = S1 + 1.0/(g2 + g1),
T2;
long r = 4;
double s = -1.0;
int nSuccess = 0;
while( !nSuccess )
{
double r2 = double(r*r);
double g3 = 1.0;
for( int j = 0; j < n; j++ )
g3 *= r2;
S3 = S2 + s/g3;
T2 = S2 + s/(g3 + g2);
if( fabs(T2-T1) > eps*fabs(T2) )
{
g2 = g3;
S2 = S3;
T1 = T2;
s = -s;
r++;
}
else
{
nSuccess = 1;
}
}
d2 /= 4.0;
dB[2*n] = 2.0 * dCoeff / (1.0-d2) * T2;
dCoeff *= -double((2*n+1)*(2*n+2)) / (TwoPi * TwoPi);
}
}
我之前从未使用过这种类型的东西,但是在系列中我工作需要伯努利数字。所以我不知道我在做什么来找到这些数字。这不是我的区域。可能我在这里做了一些蠢事。
我会告诉你我如何陷入伯努利的这个问题,我最初是在研究黎曼泽塔的功能。我制作了C代码,但它仅适用于> 1,所以我开始研究如何计算负奇数,我看到Bn(N阶的伯努利数)在公式中!我不知道如何计算伯努利数,当我开始编码泽塔的函数时,我对伯努利一无所知!
我的建议是使用库或包来执行此计算;很容易为处理简单情况的数学函数编写一些代码,并且正确处理所有情况非常困难和耗时。据推测,伯努利数的计算只是你需要在你感兴趣的真实主题上取得进展的东西。如果是这样,您最好找到现有的库或包。 (即使您在使用库时遇到问题,解决该问题仍然要容易得多,而不必重新实现该算法。)
Sage(https://sagemath.org)可以计算伯努利数,并且可能还有许多其他数论的东西。另请参阅Maxima(http://maxima.sourceforge.net),也可能还有GAP和PARI-GP(网络搜索会找到这些)。