阅读 151

Catalan数以及相关性质的证明

Catalan数以及相关性质的证明

CatalanCatalan数的定义

给定一个凸n+1n+1边形, 通过在内部不相交的对角线,把它划分成为三角形的组合,不同的划分方案的个数称为CatalanCatalan数,记作hnhn

比如说正对于五边形的CatalanCatalanh4h4,可以可视化为下面的形式。

递推定义

分析

CatalanCatalan数的定义是描述一个凸多边形被不相交的直线分割为三角形的方案数,记这样一件事为AA

创建确定一条边A1Ak+1

确定一个点B在上述边已经占用的其他边里面

左右两边的Catalan数的乘积是其整体的组合数

注意在这个解决AA事件过程中,只需要定一条边就可以了,这是由于其他的边会由n1l=1hkhnk∑l=1n−1hkhn−k遍历得到,如果此时选择所有边,就会导致算出出现重复

依据递推方程求解CatalanCatalan数的解

牛顿二项式定理

αα R∈R,且0|x||y|0≤|x|≤|y|,那么有:


(x+y)a=k=0(αk)xkyak(αk)=α(α1)(α2)(αk+1)k!(x+y)a=∑k=0∞(αk)xkya−k(αk)=α(α−1)(α−2)…(α−k+1)k!


现在计算(1+x)12(1+x)12的展开式


(1+x)12=k=012(121)(122)(12k+1)k!xk=1+k=1(1)k1135(2k3)2kk!xk=1+k=1(1)k1(2k2)!2kk!2k1(k1)!xk=1+k=1(1)k122k1k(2k2k1)xk(1+x)12=∑k=0∞12(12−1)(12−2)…(12−k+1)k!xk=1+∑k=1∞(−1)k−11⋅3⋅5…(2k−3)2kk!xk=1+∑k=1∞(−1)k−1(2k−2)!2kk!⋅2k−1(k−1)!xk=1+∑k=1∞(−1)k−122k−1k(2k−2k−1)xk


CatalanCatalan数证明

H(x)H(x)CatalanCatalan数的生成函数

那么


H(x)=n=1hnxnH(x)=∑n=1∞hnxn


两边平方


H2(x)===n=1hnxnk=1hkxkn=1k=1hnhkxn+kn=2xnk=1n1hkhnkH2(x)=∑n=1∞hnxn∑k=1∞hkxk=∑n=1∞∑k=1∞hnhkxn+k=∑n=2∞xn∑k=1n−1hkhn−k


由于


k=1n1hkhnk=hn∑k=1n−1hkhn−k=hn


所以


H2(x)=n=2hnxn=H(x)h1xH2(x)=∑n=2∞hnxn=H(x)−h1x


使用二次函数的求解得出

由于H(0)=0H(0)=0,过滤得出的解,故


H(x)=1(14x)122(1)H(x)=1−(1−4x)122………(1)


由于牛顿二项式展开定理


(14x)12=1+k=1(1)k122k1k(2k2k1)(4x)k(1−4x)12=1+∑k=1∞(−1)k−122k−1k(2k−2k−1)(−4x)k


带入上式(1)(1)


H(x)=n=1(1)nn22n(2n2n1)(1)nx2nxn=n=11n(2n2n1)xnH(x)=∑n=1∞(−1)nn22n(2n−2n−1)(−1)nx2nxn=∑n=1∞1n(2n−2n−1)xn



hn=1n(2n2n1)hn=1n(2n−2n−1)


Python代码

import timedef combinatorial_number(m: int, n: int) -> int:
    '''

    :param n: 下标
    :param m: 上标
    :return: 返回组合数
    '''
    begin = n - m + 1
    if m != 0:
        result: int = int(factorial(begin=begin, end=n) / factorial(end=m))    else:
        result: int = 1
    return result    passdef factorial(end: int, begin: int = 1) -> int:
    result: int = begin    if end != 0:        for i in range(begin, end):
            result *= i + 1
    else:
        result = 1
    return result    passdef catalan(num: int) -> int:
    return int (combinatorial_number(n = 2 * num - 2, m = num - 1) / num)

t1 = time.time()for i in range(1, 11):
    print("h{} = ".format(i), catalan(i))
t2 = time.time()

print("一共所花时间是{}".format(t2 - t1))
h1 =  1h2 =  1h3 =  2h4 =  5h5 =  14h6 =  42h7 =  132h8 =  429h9 =  1430h10 =  4862一共所花时间是0.0005903244018554688

来源:https://www.cnblogs.com/mushrain/p/14770578.html

服务器评测 http://www.cncsto.com/ 

服务器测评 http://www.cncsto.com/ 


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐