用户:Peter Luschny/BellTransform
目录
♦ 贝尔多项式
a=a_0,a_1,a_2,。。。
T(0,0) T(1,0)T(1,1) T(2,0)T(2,1)T(2,2) T(3.0)T(3.1)T(3.2)T(3.3)
T(n,k)=和{j=0..n-k+1}二项式(n-1,j-1)*a_j*T(n-j,k-1) 如果k!= 否则T(n,k)=(a_0)^n。
定义bell_trans(n,k,a): @缓存函数 定义T(n,k): 如果k==0:返回a[0]^n 返回和((0..n-k+1)中j的二项式(n-1,j-1)*a[j]*T(n-j,k-1)) 返回T(n,k)
(*) a_0^0(0 ^0) a_0^1,a_1 a_0^2,a_1*a_0+a_2,a_1^2 a_0^3,a_1*a_0^2+2*a_2*a_0+a_3,a_1^2*a_0+3*a_2*a_1,a_1^3 a_0^4,a_1*a_0^3+3*a_2*a_0 ^2+3*a_3*a_0+a_4 +4*a_3*a_1+3*a_2^2,a_1^3*a_0+6*a_2*a_1^2,a_1^4
s=[0]+[(0..5)中i的阶乘(i)] 对于(0..5)中的n:[对于(0..n)中的k,bell_trans(n,k,s)] [1] [0, 1] [0, 1, 1] [0, 2, 3, 1] [0, 6, 11, 6, 1] [0, 24, 50, 35, 10, 1]
N=6 t=[2^(1-j),如果is_add(j),则在(0..N)中j为0 对于(0..n)中的n:[(0..n)中k的bell_trans(n,k,t)] [1] [0, 1] [0, 0, 1] [0, 1/4, 0, 1] [0, 0, 1, 0, 1] [0, 1/16, 0, 5/2, 0, 1] [0, 0, 1, 0, 5, 0, 1]
定义partial_bell_polyminal(n,k): v=var(['x_'+str(i)代表(0..n+1)中的i) 返回bell_trans(n,k,v).exexpand() 对于(0..4)中的n: [(0..n)中k的partial_bell_polyminal(n,k)] [1] [x_0,x_1] [x_0^2,x_0*x_1+x_2,x_1^2] [x_0^3,x_0^2*x_1+2*x_0*x_2+x_3,x_0*x_1^2+3*x_1*x_2,x_1^3] [x_0^4,x_0^3*x_1+3*x_0^2*x_2+3*x_0*x_3+x_4,x_0^2*x_1^2+ 5*x_0*x_1*x_2+3*x_2^2+4*x_1*x_3,x_0*x_1^3+6*x_1^2*x_2,x_1^4]
对于(0..4)中的n: [(0..n)中k的partial_bell_polynomial(n,k).subs(x_0=0)] [1] [0,x_1] [0,x_2,x_1^2] [0,x_3,3*x_1*x_2,x_1^3] [0,x_4,3*x_2^2+4*x_1*x_3,6*x_1^2*x_2,x_1^4]
B_n=和{k=0..n}B_{n,k}。 定义贝尔多项式(n): 返回和(0..n)中k的partial_bell_polynomial(n,k)) 对于(0..3)中的n:贝尔多项式(n) 1 x0+x1 x_0 ^2+x_0*x_1+x_1 ^2+x_2 x_0^3+x_0^2*x_1+x_0*x_1^2+x_1^3+2*x_0*x2+3*x_1*x_2+x_3
定义单变量贝尔多项式(n): p=贝尔多项式(n).subs(x0=0) q=p({p.variables()[i]:x表示范围内的i(len(p.variaables())}) R=多项式环(QQ,'x') 返回R(q) 对于(0..6)中的n:单变量bell_polymonial(n) 1 x个 x^2+x x^3+3*x^2+x x^4+6*x^3+7*x^2+x x^5+10*x^4+25*x^3+15*x^2+x x ^6+15*x ^5+65*x ^4+90*x ^3+31*x ^2+x
对于(0..6)中的n:单变量bell_polynomial(n).list() [1] [0, 1] [0, 1, 1] [0, 1, 3, 1] [0, 1, 7, 6, 1] [0, 1, 15, 25, 10, 1] [0, 1, 31, 90, 65, 15, 1]
定义x0基单变量bell_polyminal(n): p=贝尔多项式(n) q=p({p.variables()[i]:x表示范围内的i(len(p.variables()))}) R=多项式环(QQ,'x') 返回R(q) 对于(0..6)中的n:x0_based_singlevariable_bell_polynomial(n) 1 2*x个 3*x^2+x 4*x^3+5*x^2+x 5*x^4+14*x^3+10*x^2+x 6*x^5+30*x^4+48*x^3+19*x^2+x 7*x^6+55*x^5+158*x^4+149*x^3+36*x^2+x 对于(0..6)中的n:x0_based_univariate_bell_polynomial(n).list() [1] [0, 2] [0,1,3] [0, 1, 5, 4] [0, 1, 10, 14, 5] [0, 1, 19, 48, 30, 6] [0, 1, 36, 149, 158, 55, 7]
1, 2, 4, 10, 30, 104, 406, 1754, 8280, 42294, 231950, ...
♦ 基于分区的Bell变换
定义贝尔多项式(n): X=var(['X_'+str(i)代表(0..n+1)中的i) @缓存函数 定义T(n,k): 如果k==0:返回k^n 返回和(二项式(n-1,j-1)*T(n-j,k-1)*X[j] 用于(0..n-k+1)中的j。expand() (0..n)中k的返回和(T(n,k))
定义分区基于单变量bell_polyminal(n): 多项式=x^n fn=阶乘(n) 对于k in(0..n-1): 结果=0 对于分区(n,长度=k)中的p: factorial_product=1 power_factorial_product=1 对于零件,在p.to_exp_dict().iteritems()中计数: factorial_product*=阶乘(计数) power_factorial_product*=阶乘(部分)**计数 系数=fn//(阶乘乘积*power_factorial_product) 结果+=系数 polynom+=结果*x^k 返回多项式
%timeit单变量bell_polynomial(10) 5个回路,每个回路最好为3:105 ms %timeit分区基于单变量bell_polynomial(10) 5个回路,最好为3:14.1 ms/回路 %timeit单变量bell_polynomial(20) 5个回路,每个回路最好为3:632ms %timeit分区基于单变量bell_polynomial(20) 5个环路,3个最佳值:每个环路79.4ms %timeit单变量bell_polynomial(30) 5个回路,最好为3:2.15秒/回路 %timeit分区_基数_单变量_细胞_多项式(30) 5个回路,最好为3:1.16秒/回路
定义bell_transform(f,n):#partition_based 行=[] fn=阶乘(n) 对于k in(0..n): 结果=0 对于分区(n,长度=k)中的p: factorial_product=1 power_factorial_product=1 对于零件,在p.to_exp_dict().iteritems()中计数: factorial_product*=阶乘(计数) power_factorial_product*=阶乘(部分)**计数 系数=fn//(阶乘乘积*power_factorial_product) 结果+=系数*prod([f(i-1)for i in p]) row.append(结果) 返回行
♦ 贝尔矩阵
对于(0..7)中的n:bell_transform(阶乘,n) [1] [0, 1] [0, 1, 1] [0, 2, 3, 1] [0, 6, 11, 6, 1] [0, 24, 50, 35, 10, 1] [0,120,274,225,85,15,1] [0, 720, 1764, 1624, 735, 175, 21, 1] 第一类无符号斯特林数, A132393号 . 对于(0..7)中的n: bell_transform(λx:阶乘(x+1),n) [1] [0, 1] [0, 2, 1] [0,6,6,1] [0, 24, 36, 12, 1] [0, 120, 240, 120, 20, 1] [0, 720, 1800, 1200, 300, 30, 1] [0, 5040, 15120, 12600, 4200, 630, 42, 1] 无符号Lah数,参见。 A111596号 . 对于(0..7)中的n: bell_transform(λx:阶乘(x+2),n) [1] [0, 2] [0, 6, 4] [0, 24, 36, 8] [0, 120, 300, 144, 16] [0, 720, 2640, 2040, 480, 32] [0, 5040, 25200, 27720, 10320, 1440, 64] [0, 40320, 262080, 383040, 199920, 43680, 4032, 128] 重写广义下降的无符号系数 阶乘到普通下降阶乘, A136656号 .
定义bell_matrix(发电机,尺寸): 行=λn:bell_transform(生成器,n) 返回矩阵(ZZ,[行(n)+[0]*(dim-n-1)表示范围(dim)中的n)]
def Bell_Matrix(发电机,尺寸): A=[[0]*(n+1),对于范围(dim)内的n 对于范围内的n(dim): A[n][0]=1,如果n==0,则为0 如果n>0:A[n][1]=发电机(n-1) 对于k in(2..n): A[n][k]=和(二项式(n-1,j-1)*A[n-j][k-1]*A[j][1],对于(1..n-k+1)中的j) 返回A
♦ 逆Bell变换
bell_matrix(阶乘,8) [ 1 0 0 0 0 0 0 0] [ 0 1 0 0 0 0 0 0] [ 0 1 1 0 0 0 0 0] [ 0 2 3 1 0 0 0 0] [ 0 6 11 6 1 0 0 0] [ 0 24 50 35 10 1 0 0] [ 0 120 274 225 85 15 1 0] [ 0 720 1764 1624 735 175 21 1]
bell_matrix(阶乘,8).逆() [ 1 0 0 0 0 0 0 0] [ 0 1 0 0 0 0 0 0] [ 0 -1 1 0 0 0 0 0] [ 0 1 -3 1 0 0 0 0] [ 0 -1 7 -6 1 0 0 0] [ 0 1 -15 25 -10 1 0 0] [ 0 -1 31 -90 65 -15 1 0] [ 0 1 -63 301 -350 140 -21 1]
贝尔矩阵(λn:n+1,8).逆() [ 1 0 0 0 0 0 0 0] [ 0 1 0 0 0 0 0 0] [ 0 -2 1 0 0 0 0 0] [ 0 9 -6 1 0 0 0 0] [0-64 48-12 1 0 0] [ 0 625 -500 150 -20 1 0 0] [ 0 -7776 6480 -2160 360 -30 1 0] [0 117649-100842 36015-6860 735-42 1]
bell_matrix(λn:n+1,8) [ 1 0 0 0 0 0 0 0] [ 0 1 0 0 0 0 0 0] [ 0 2 1 0 0 0 0 0] [ 0 3 6 1 0 0 0 0] [ 0 4 24 12 1 0 0 0] [ 0 5 80 90 20 1 0 0] [ 0 6 240 540 240 30 1 0] [ 0 7 672 2835 2240 525 42 1]
定义反向单元格矩阵(f,dim): A=钟形矩阵(f,dim) M=[[0]*(n+1),对于范围(dim)内的n 对于范围内的n(dim): M[n][n]=1/A[n][n] 对于范围(n-1,0,-1)中的k: M[n][k]=-总和(A[i][k]*M[n][i] 对于范围(n,k,-1)/A[k][k]中的i 返回M 逆Bell_Matrix(阶乘,7)
♦ 序列的Bell逆
#给定一个序列f返回f的逆Bell序列。 定义反转单元格顺序(f,dim): M=反向单元格矩阵(f,dim) 返回[M[n][1]表示n in(1..dim-1)]
#[1,-1,1,-1,-1,-1,-1,-1,-1,-1,…]映射到 # [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, ...] 打印反转单元格顺序(λn:(-1)^n,9) #[1,2,2,0,0,0,0,0,0,0,…]映射到 # [1, -2, 10, -80, 880, -12320, 209440, -4188800, ...] 打印反转单元格顺序(λn:[1,2,2][n],如果n<3,则0,9) #[1,2,1,0,0,0,0,0,0,0,…]映射到 # [1, -2, 11, -100, 1270, -20720, 413000, -9726640, ...] 打印反转单元格顺序(λn:[1,2,1][n],如果n<3,则0,9)
1/a,-b/a^3,(-c*a+3*b^2)/a^5,-(d*a^2-10*b*c*a+15*b^3)/a^7。。。
1,-b,-c+3*b^2,-d+10*b*c-15*b^3。。。
♦ Bell多项式的系数
定义bell_polynomial_matrix(dim,逆): 定义贝尔多项式(n): X=var(['X'+str(i)for i in(0..dim)]) @缓存函数 定义T(n,k): 如果k==0:返回k^n 返回和(二项式(n-1,j-1)*T(n-j,k-1)*X[j-1] 对于j in(0..n-k+1)).exexpand() return[T(n,k)for k in(0..n)] A=[[f代表bell_polyminal(n)中的f]代表范围(dim)中的n] 如果不是反向:返回A M=[[0代表k in(0..n)]代表n in range(dim)] 对于范围内的n(dim): M[n][n]=1/A[n][n] 对于范围(n-1,-1,-1)中的k: M[n][k]=展开(-和(A[i][k]*M[n][i] 对于范围(n,k,-1)/A[k][k]中的i 返回M def系数矩阵(M): def系数(p): c=SR(p).分数(ZZ).数字().系数() 如果不是c,则返回[0] return[[M中p的系数(p)[n]]范围内n的系数(len(M))]
M=贝尔多项式矩阵(8,逆=真) 系数矩阵(M)
L=贝尔多项式矩阵(8,逆=假) 系数矩阵(L)
♦ 高阶铃数
第0期= A000012号 = <1,1,1,...> T0类= A048993号 #斯特林子集数, S1(第一阶段)= A000110号 #铃声号码, 时间T1= A264428型 #贝尔数的贝尔变换, S2系列= A187761号 #二阶Bell数, T2段= A264430型 #二阶Bell数的Bell变换, 第3章= A264432型 #三阶贝尔数。
定义bell_second_order(生成器,n): G=[范围(n)内k的发电机(k)] 行=λn:bell_transform(n,G) S=[范围(n)中k的总和(行(k))] 返回bell_transform(n,S)
[范围(10)中的n的bell_second_order(lambda k:1,n)中的s的sum(s)]]
[范围(8)中的n的bell_second_order(bell_number,n)] [[1], [0, 1], [0, 1, 1], [0, 2, 3, 1], [0, 6, 11, 6, 1], [0, 23, 50, 35, 10, 1], [0, 106, 268, 225, 85, 15, 1], [0, 568, 1645, 1603, 735, 175, 21, 1]]
♦ 关联的斯特林子集数
hht=λk:λn:1,如果n>=k,否则为0 对于(0..5)中的n:打印bell_matrix(hht(n),12)
A048993号 , A008299号 , A059022号 , A059023号 , A059024号 , A059025型 .
♦ 多因子的Bell变换
多因子=lambda a,b:lambda n:prod((0..n-1)中k的a*k+b)
对于in(1..4): 对于(1..a)中的b: 打印“多因子生成的贝尔矩阵”,(a,b) bell_matrix(多因素(a,b),6) 打印“由多因子生成的逆Bell矩阵”,(a,b) 逆细胞矩阵(多因子(a,b),6)
♦ 贝尔权力转换
多因子=lambda a,b:lambda n:prod((0..n-1)中k的a*k+b)
对于范围(6)中的n: bell_matrix(λk:n^k,7)
对于(0..5)中的n: bell_matrix(λk:n^k,7).逆()
♦ 上升阶乘的Bell变换
risingfactorial=lambda n:lambda k:rising_factorial(n,k) 对于(0..7)中的n: 打印bell_matrix(升阶乘(n),7) 打印inverse_bell_matrix(升阶乘(n),7)
♦ 下降阶乘的Bell变换
fallingfactorial=lambda n:lambda k:falling_factorial(n,k) 对于(0..5)中的n: 打印bell_matrix(下降阶乘(n),7) 打印inverse_bell_matrix(下降阶乘(n),7)
♦ 单调阶乘的Bell变换
单调阶乘=lambda r:lambda n:rising_factorial(r,n)/阶乘(n)
对于(0..4)中的n: 打印bell_matrix(单调阶乘(n),7) 打印inverse_bell_matrix(单调阶乘(n),7)
♦ Maple的实现
#贝尔:计算序列的贝尔矩阵。 #给定列表[a(0),…,a(dim)]返回Bell矩阵 #序列a的尺寸dim+1。 铃:=proc(a)局部M,dim,n,k: 如果whattype(a)<>列表,则RETURN([])fi: 尺寸:=nops(a); M:=矩阵(尺寸,形状=三角形[下]); M[1,1]:=1; 对于从1到dim-1的n,做M[n+1,2]:=a[n]od; 对于n从1到dim-1 do对于k从1到n do M[n+1,k+1]:=加法(二项式(n-1,j-1)*M[n-j+1,k]*M[j+1,2], j=1..n-k+1)od; 返回(M)结束: BELLi:=程序(a) 如果是whattype(a)<>列表,则返回([])fi: 返回(直线[反向](钟形(a))结束: #示例: a:=[序列(1,n=0..8)]:贝尔(a)# A048993号 b:=[序列(n!,n=0..8)]:贝尔(b)# A132393号 c:=[seq(n,n=1..9)]:贝尔(c)# A059297号 d:=[seq((-1)^n*(n+1)^n,n=0..8)]:贝尔(d)# A137452号 e:=[seq(`if`(n::奇数,0,2*n!),n=0..8)]:贝尔(e)# A137513型 f:=[seq(`if`(n<2,(-1)^n,0),n=0..8)]:贝尔(f)# A104556号 g:=[seq(双阶乘(2*n-1),n=0..8)]:贝尔(g)# A001497号
♦ Bell变换生成的三角形索引
♦ 参考文献
D.E.Knuth, 卷积多项式 《数学杂志》2.1(1992),第4期,第67-78页。