Reputation: 849
I am currently learning C++, so I am a beginner. I thought I'd make a small program to generate the Bessel polynomial terms. This is the program:
#include <iostream>
// x!
long long fact(const long long &x)
{
long long z {1};
for (long long i=1; i<=x; ++i)
z *= i;
return z;
}
// 2^n
long long pwr2(const int &n)
{
long long z {1};
for (long long i=0; i<n; ++i)
z *= 2;
return (n == 0 ? 1 : z);
}
// Bessel coefficients
long long bessel(long long *a, const long long &N)
{
for (long long i=0; i<=N; ++i)
a[i] = fact(N + i) / (pwr2(i) * fact(N - i) * fact(i));
return *a;
}
int main()
{
std::cout << "N = ";
long long N;
std::cin >> N;
long long *a {new long long[N + 1]};
*a = bessel(a, N);
for (long long i=0; i<=N; ++i)
std::cout << a[i] << ( i<N ? " " : "\n");
delete a;
a = nullptr;
return 0;
}
N=10 seems to be the limit. sizeof(long long)
shows 8 (archlinux x64). fact(20) > (2^64)-1, so I'm stuck, even with long long. Is there a way to circumvent this limit?
The code, as you see it, is after I got desperate and modified all int to long long. I even added "ll" to all the numbers, there's no effect. I even removed the main parenthesis from the denominator and arranged the terms so that they divide, progressively, to somehow balance themselves, e.g.:
fact(N+i)/fact(N-i)/fact(i)/pwr2(i)
, also no effect.
Upvotes: 1
Views: 116
Reputation: 472
You can't do what you want to with native types as they are limited by bit sizes. However you can use some libraries to accomplish those (This is one such example) if you really need it (But as per your question , you are just learning c++ so I guess you dont need those)
Upvotes: 1