计算加泰罗尼亚数字高达十亿

时间:2016-09-09 15:44:41

标签: python catalan

我是python的新手(以及一般的编程),我班上被要求计算高达10亿的加泰罗尼亚语数字,但我为它编写的程序没有按预期工作。

    from numpy import division 
    C=1
    n=0
    while C<=10000000000:
        print (C)
        C=(4*n+2)/(n+2)*C
        n=n+1

这是打印的内容

1, 1, 2, 4, 8, 24, 72, 216, 648, 1944年, 5832, 17496, 52488, 157464, 472392, 1417176, 4251528, 12754584, 38263752, 114791256, 344373768, 1033121304, 3099363912, 9298091736,

正如你从我的第四次迭代中看到的那样,我得到了错误的数字,我不明白为什么。

编辑: 我使用的数学定义没有错!我知道Wiki有另一个定义,但这个没有错。 Co = 1,Cn + 1 =(4 * n + 2)/(n + 2)* Cn

5 个答案:

答案 0 :(得分:3)

        C=(4*n+2)/(n+2)*C

这会以错误的顺序应用计算。因为您使用整数运算,如果您尚未考虑(4*n+2)/(n+2)C会丢失信息。正确的计算是:

        C=C*(4*n+2)/(n+2)

答案 1 :(得分:0)

试试这个:

from scipy.special import factorial

C = 1
n = 0
while C <= 10000000000:
    print(C)
    C = factorial(2*n, exact=True)/(factorial((n+1), exact=True)*factorial(n, exact=True))
    n = n + 1

它对我有用:)

答案 2 :(得分:0)

问题

在翻译成代码时,您对加泰罗尼亚语数字的数学定义不正确。

这是因为Python等编程语言中的运算符优先级。

乘法和除法都具有相同的优先级,因此它们从左到右计算。发生的事情是除法运算(4*n+2)/(n+2)在与C相乘之前发生。当n为2时,2*(2*n+2)/(n+2)变为10/4,整数算术为2。在此阶段1*C2,会4而不是给出预期的5。 一旦系列中的数字不正确,迭代计算就不正确。

可能的解决方法

这里的定义为Catalan Numbers

enter image description here

这意味着,第n个加泰罗尼亚语号由下式给出:

import operator as op

def ncr(n, r):
    r = min(r, n-r)
    if r == 0: return 1
    numer = reduce(op.mul, xrange(n, n-r, -1))
    denom = reduce(op.mul, xrange(1, r+1))
    return numer//denom


def catalan(n):
    return ncr(2*n, n)/(n+1)

这不是很有效,但它至少是正确的。

正确修复

要计算系列,您可以使用递归公式。

enter image description here

N=1000000 # limit
C=1
for i in xrange(0, N+1):
    print i,C
    C = (2*(2*i +1)*C)/(i+2)

对于前几个,它看起来像这样:

0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796

答案 3 :(得分:0)

这是使用递归解决的:

def catalan(n):
    if n <=1 :
        return 1

    res = 0
    for i in range(n):
        res += catalan(i) * catalan(n-i-1)

    return res

for i in range(10000000000):
    print (catalan(i))

您可以阅读有关加泰罗尼亚数字herehere

的更多信息

答案 4 :(得分:0)

基于Catalan Numbers的表达式:

enter image description here

from math import factorial

C = 1
n = 0
while C <= 10000000000:
    print(C)
    C = (factorial(2 * n)) / (factorial(n + 1) * factorial(n))
    n = n + 1

<强>返回:

1
1.0
1.0
2.0
5.0
14.0
42.0
132.0
429.0
1430.0
4862.0
16796.0
58786.0
208012.0
742900.0
2674440.0
9694845.0
35357670.0
129644790.0
477638700.0
1767263190.0
6564120420.0