Я пытаюсь вычислить
,
, где C i - это i-й каталонский номер.
Чтобы решитьпроблема, я делаю петлю от 0 до n и суммирую произведение двух каталонских чисел:
BigInteger catalanSum = 0;
for (int i = 0; i <= n; i++)
catalanSum += catalan(i) * catalan(n - i);
Функция каталона возвращает биномиальный коэффициент, деленный на n + 1:
BigInteger catalan(int n)
{
return NchooseK(2 * n, n) / (n + 1);
}
И для вычисления биномиального коэффициента я использую эту функцию:
BigInteger NchooseK(int n, int k)
{
BigInteger res = 1;
if (k > n - k)
k = n - k;
for (int i = 0; i < k; ++i)
{
res *= (n - i);
res /= (i + 1);
}
return res;
}
Он отлично работает до n = 1000, но как только он становится выше, он действительно сильно замедляется.Можно ли как-нибудь оптимизировать этот расчет?
РЕДАКТИРОВАТЬ:
Я ускорил вычисления, сначала сохранив каталонцы, используя следующий фрагмент кода, благодаря ответу xanatos:
BigInteger[] catalans = new BigInteger[n+1];
BigInteger catalanSum = 0;
for (int i = 0; i <= n; i++)
catalans[i] = catalan(i);
for (int i = 0; i <= n; i++)
catalanSum += catalans[i] * catalans[n - i];
РЕДАКТИРОВАТЬ 2: Когда каталанский [i] == каталанский [n - i], разве оставшаяся половина вычислений не будет иметь тот же продукт, что и первая половина?