Лучший способ вычислить nTh числа Бернулли в C с CodeBlocks на Windows 10 Pro - PullRequest
0 голосов
/ 19 сентября 2018

Спокойной ночи, я работаю в проекте, который должен рассчитать числа Бернулли для 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 Ответ

0 голосов
/ 19 сентября 2018

Мой совет - использовать библиотеку или пакет для выполнения этих вычислений;легко написать некоторый код для математической функции, которая обрабатывает простые случаи, и очень сложно и трудоемко обрабатывать все случаи правильно.Предположительно, вычисление чисел Бернулли - это то, что вам нужно, чтобы добиться прогресса в вашей реальной теме, представляющей интерес.Если это так, вам лучше найти существующую библиотеку или пакет.(Даже если у вас возникли проблемы с библиотекой, решить эту проблему гораздо проще, чем переопределять алгоритм.)

Sage (https://sagemath.org) может вычислять числа Бернулли и, вероятно, имеетмного других вещей, связанных с теорией чисел. См. также Maxima (http://maxima.sourceforge.net), а также, возможно, GAP и PARI-GP (поиск по сети найдет их).

...