• 指数函数的应用——自然数幂求和、第二类斯特林数与 Bell 数


    指数函数

    定义 (e^x) 为使得 ((e^x)'=e^x) 的数,由泰勒展开可以得到:

    [e^x=sum _{i=0}^infty frac {x^i}{i!} ]

    这个形式的特点在于指数的幂和下面的阶乘。它是 (f_i=i!) 的普通生成函数,(f_i=1) 的指数生成函数。它简单的形式和特殊的性质有很多应用。

    下面是最近发现的几个。

    自然数幂求和

    观察到

    [e^{nx}=sum _{i=0}^infty frac {n^i}{i!}x^i ]

    实际上是 (f_i=n^i) 的指数生成函数。由于 (e^{nx})(n) 为等差数列的时候是等比数列,若我们对 (n) 求和,就能得到等比数列求和的很好的形式。

    (S_d(n)=sum _{i=0}^{n-1}i^d)

    [egin{aligned} sum _{k=0}^{n-1}e^{kx}&=sum _{k=0}^{n-1}sum _{i=0}^infty frac {k^i}{i!}x^i \ &=sum _{i=0}^infty frac {x^i}{i!}sum _{k=0}^{n-1}k^i \ &=sum _{i=0}^infty S_i(n)frac {x^i}{i!} end{aligned} ]

    这是 (f_i=S_i(n)) 的指数生成函数。而上面的式子同样可以用等比数列求和计算,得到:

    [sum _{i=0}^infty S_i(n)frac {x^i}{i!}=frac {e^{nx}-1}{e^x-1} ]

    这就令我们能够在 (O(dlog d)) 的时间内,对于一个 (n) ,对所有的 (iin [0,d]) 求出 (S_i(n)) ,十分优秀。

    继续观察,发现上式的分子 (e^{nx}-1) 的形式其实是:

    [e^{nx}-1=sum _{i=1}^infty frac {n^ix^i}{i!} ]

    若我们考虑对这个式子进行一些卷积的操作,事实上就能得到一个 (n) 的多项式!我们尝试通过它得到自然数幂求和的多项式形式。我们希望把 (n) 的项分离出来。

    [egin{aligned} S_d(n)&=d![x^d]frac {e^{nx}-1}{e^x-1} \ &=d![x^d](frac {e^{nx}-1}{x}*frac {x}{e^x-1}) end{aligned} ]

    这一步是因为 (e^x-1) 没有常数项,因此没有逆元,我们在中间添加一个 (x) 来消除这个问题。因为 (e^{nx}-1) 同样没有常数项,所以可以这样做。

    注意到右边是一个常量,并且存在逆元,那么它的展开是某个东西的生成函数,不妨设它为 (B_n) 的指数生成函数。这样设是因为

    [frac {e^{nx}-1}{x}=sum _{i=0}^infty frac {n^{i+1}x^i}{(i+1)!} ]

    类似一个指数生成函数的形式。我们知道,两个指数生成函数的普通卷积就是原函数的二项卷积的指数生成函数,有比较好的形式。

    那么我们已经知道了

    [egin{aligned} S_d(n)&=d!sum _{i=0}^dfrac {B_i}{i!}*frac {n^{d+1-i}}{(d+1-i)!} \ &=frac 1 {d+1}sum _{i=0}^dinom {d+1} iB_in^{d+1-i} end{aligned} ]

    这就说明了,(S_d(n)) 是一个 (n)(d+1) 次多项式,而且我们得到了多项式的系数 (B_i) 。一般称 (B_i) 为伯努利数,因为是伯努利首先直接找出了这个规律。

    推导过程给出了伯努利数的生成函数 (frac x {e^x-1}) ,因此可以 (O(nlog n)) 预处理出前 (n) 项。

    由于整个推导过程中,我们只用到了等比数列求和,所以可以把这个方法推广到等差数列幂的求和:

    [S_d(n)=sum _{i=0}^{n-1}(ai+b)^d ]

    形式是类似的。

    第二类斯特林数与 Bell 数

    第二类斯特林数 (genfrac {}0{} n m) 定义为把 (n) 个不同元素分成 (m) 个无序集合,每个集合都有元素的方案数。

    为了得到它的公式,考虑先求出分成 (m) 个有序集合的方案数,再除以 (m!) 即可得到分成无序集合的方案数。

    (n) 个不同元素分成 (m) 个有序集合,每个集合都有元素,相当于是:

    [egin{aligned} ext{ans}&=sum _{sum a_i=n,a_i>0}inom n {a_1}inom {n-a_1}{a_2}cdotsinom {n-sum _{i=1}^{m-1}a_i}{a_m} \ &=frac {n!}{prod (a_i!)} end{aligned} ]

    下面这个形式称为多项式系数,表示把 (n) 个不同元素放进 (m) 个有序集合,每个集合大小为 (a_i) 的方案数。

    我们要对所有不同的划分方案 (a) 计算上式的和。可以发现,这其实就是

    [egin{aligned} ans&=n![x^n](sum _{i=1}^infty frac {x^i}{i!})^m \ &=n![x^n](e^x-1)^m \ &=n![x^n]sum _{i=0}^minom m i e^{ix}(-1)^{m-i} \ &=n!sum _{i=0}^minom m i frac {i^n}{n!}(-1)^{m-i} \ &=sum _{i=0}^minom m i i^n (-1)^{m-i} end{aligned} ]

    那么就有

    [genfrac {}00 n m =frac 1 {m!}sum _{i=0}^minom m i i^n(-1)^{m-i} ]

    这支持了 (O(nlog n)) 计算出第 (n) 行的斯特林数。

    尝试利用一下中间推出来的斯特林数的生成函数表示:

    [genfrac {}00 n m=frac {n!} {m!}[x^n](e^x-1)^m ]

    也就是说,对于一个固定的 (m) ,有

    [sum _{i=0}^infty genfrac {}00 i mfrac {x^i}{i!}=frac {(e^x-1)^m}{m!} ]

    我们得到了 (O(nlog n)) (ln exp) 计算出斯特林数第 (m) 列的前 (n) 个的方法。

    计算 Bell 数的生成函数:

    [egin{aligned} B_n&=sum _{i=0}^ngenfrac {}00 n i \ &=sum _{i=0}^nfrac {n!}{i!}[x^n](e^x-1)^i \ & =n![x^n]sum _{i=0}^nfrac {(e^x-1)^i} {i!} end{aligned} ]

    由于 ((e^x-1)^{n+1}) 之后的项对此处完全没有影响,故可以更换表示:

    [egin{aligned} B_n=n![x^n]e^{e^x-1} \ frac {B_n}{n!}=[x^n]e^{e^x-1} \ end{aligned} ]

    即 Bell 数 的指数生成函数为

    [B(x)=sum _{i=0}^infty B_nfrac {x^n}{n!} =e^{e^x-1} ]

  • 相关阅读:
    JavaScript-警告(alert 消息对话框)
    JavaScript中4种document.write()输出展示
    JavaScript-什么是函数
    JavaScript-判断语句(if...else)
    javascript里面什么是变量
    [学习笔记] IT项目管理
    [学习笔记] IT项目管理
    [学习笔记] Oracle基础增删改查用法
    [学习笔记] Oracle字段类型、建表语句、添加约束
    [学习笔记] RabbitMQ的简单使用
  • 原文地址:https://www.cnblogs.com/owenyu/p/8708364.html
Copyright © 2020-2023  润新知