贝尔数
贝尔数是专业术语,拼音为bèi ěr shù,在组合数学里,贝尔数给出了集合划分的数目,以数学家埃里克·坦普尔·贝尔(Eric Temple Bell)命名,是组合数学中的一组整数数列。
定义
是基数为n的集合划分数目。集合S的一个划分是定义为S的两两不相交的非空子集的族,它们的并是S。是1。例如因为3个元素的集合有5种不同的划分方法:
B是1因为空集 正好有1种划分方法。划分的定义要求空集的划分中的每个成员都是非空集合,而它们的并是 本身。所以 是它自身的唯一划分。(这是定义所允许的因为)
公式
贝尔数适合递推公式:
它们也适合“Dobinski公式”:
期望值为1的泊松分布的''n''次矩。
它们也适合“Touchard同余”:若p是任意质数,那么
每个贝尔数都是"第二类Stirling数"的和
Stirling数S(n, k)是把基数为n的集划分为正好k个非空集的方法的数目。
把任一概率分布的n次矩以首n个累积量表示的多项式,其系数和正是第n个贝尔数。这种数划分的方法不像用Stirling数那个方法粗糙。
贝尔数的指数母函数是
贝尔三角形
用以下方法建构一个三角矩阵(形式类似杨辉三角形):
(1) 第一行第一项是1()
(2) 对于,第n行第一项等同第行最后一项。( )
(3) 对于,第n行第m项等于它左边和左上方的两个数之和。( )
结果如下:(OEIS的A011971数列)
每行首项是贝尔数。
这个三角形称为贝尔三角形、Aitken阵列或Peirce三角形(Bell triangle, Aitken's array, Peirce triangle)。
程序
计算贝尔数的程序如下:(VC++环境下调试通过)
#include\u003ciostream\u003e
#include \u003cstdio.h\u003e
using namespace std;
unsigned __int64 c(int n,int m){
if(m\u003en/2)
m=n-m;
int i;
unsigned __int64 a=1,b=1;
for(i=n;i\u003en-m;i--)
a*=i;
for(i=2;i\u003c=m;i++)
b*=i;
return a/b;
}
unsigned __int64 bell(int n){
unsigned __int64 t=0;
int i;
if(n==0)
return 1;
else{
for(i=0;i\u003c=n-1;i++)
t+=c(n-1,i)*bell(i);
}
return t;
}
int main(){
int n;
while(scanf("%d",\u0026n)!=EOF)
printf("%I64u\n",bell(n));
return 0;
}