Лучший способ вычислить nTh числа Бернулли в C с CodeBlocks на Windows 10 Pro
Спокойной ночи, я работаю в проекте, который должен рассчитать числа Бернулли для n-го порядка. Я исчерпывающе перепробовал множество алгоритмов в интернете, в основном это на C++, что для меня бесполезно. И всегда я получал ошибки в компиляциях или неправильные результаты с числами! Какой самый быстрый способ рассчитать это? Нечетные числа всегда равны 0,00000, и мне нужно вычислять для любых четных чисел... Мне просто нужен результат числа, которое я поставил на функцию, не нужно перечислять числа до тех пор, пока nTh не будет похож на каждый алгоритм, который я видел в интернете. делает. Последнее, что я пробовал, это было с ошибками компиляции и после исправления, дайте мне неправильные ответы выше... Да, для людей, которые спросят меня, если я добавлю библиотеки в код, да, я сделал это! Проблема не в библиотеках, а в неправильных алгоритмах. Я использую C на 32-битном GCC MINGW на Code::Blocks для Windows 10 Pro.
#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-го порядка) находятся в формулах! Я не знаю, как рассчитать числа Бернулли, и когда я начал кодировать функцию Зеты, я ничего не знал о Бернулли!
1 ответ
Мой совет - использовать библиотеку или пакет для выполнения этих вычислений; легко написать некоторый код для математической функции, которая обрабатывает простые случаи, и очень сложно и трудоемко обрабатывать все случаи правильно. Предположительно, вычисление чисел Бернулли - это просто то, что вам нужно, чтобы добиться прогресса в вашей реальной теме, представляющей интерес. Если это так, вам лучше найти существующую библиотеку или пакет. (Даже если у вас возникли проблемы с библиотекой, решить эту проблему гораздо проще, чем заново реализовывать алгоритм.)
Мудрец ( https://sagemath.org/) может рассчитывать числа Бернулли и, вероятно, имеет много других вещей теории чисел. См. Также Maxima ( http://maxima.sourceforge.net/) и, возможно, также GAP и PARI-GP (поиск в Интернете найдет их).