用户:Peter Luschny/P-Transform
目录
♦ P-多项式
def PartialPtrans(n,f,norm=无): 如果n==0:返回[1] R=[0]*(n+1) 对于分区(n)中的q: p=q+[0] R[q[0]]+=(-1)^q[0]*mul(二项式(p[j],p[j+1])*f(j+1)^p[j) 对于范围内的j(len(q)) 如果norm==无:返回R return[(0..n)中k的范数(n,k)*R[k]] Ptrans=λn,f,范数=无:总和(部分Ptrans(n,f、范数))
f=λn:var('x'+str(n)) 对于范围(5)中的n:打印Ptrans(n,f) 1, -x1, x1^2-x1*x2, -x1^3+2*x1^2*x2-x1*x2*x3, x1^4-3*x1^3*x2+x1^2*x2^2+2*x1^2*x2*x3-x1*x2*x3*x4。
对于范围(5)中的n:打印PartialPtrans(n,f) [1] [0,-x1] [0,-x1*x2,x1^2] [0,-x1*x2*x3,2*x1^2*x2,-x1^3] [0,-x1*x2*x3*x4,x1^2*x2^2+2*x1^2*x2*x3,-3*x1^3*x2,x1^4]
def PEvaluateAt(n,f,val=无,normal=无): P=部分Ptrans(n,f,范数) p=总和([x^k*g代表k,g代表枚举(p)]) 如果val==无:返回p 返回p.substitute(x=val)
AsPolynomials=lambda n,f,norm=None:PEvaluateAt(n,f、norm=norm)
对于范围(6)中的n:打印为多项式(n,λn:1) 1, -x、, x^2-x, -x^3+2*x^2-x, x^4-3*x^3+3*x^2-x, -x^5+4*x^4-6*x^3+4*x^2-x。 对于范围(6)中的n:打印为多项式(n,λn:n) 1 -x个 x^2-2*x -x^3+4*x^2-6*x x^4-6*x^3+16*x^2-24*x -x^5+8*x^4-30*x^3+72*x^2-120*x
提取多项式的系数, 在x=1时计算多项式, 在x=-1时计算多项式, 计算x=1/2处的多项式,并将结果乘以2^n, 计算x=-1/2处的多项式,并将结果乘以2^n。
打印“作为多项式:” 对于范围内的n(Len-2):打印为多项式(n,f,范数) 打印“系数:” 对于范围内的n(Len-2):打印PartialPtransRec(n,f,范数) 打印“x=1:”,[PEvaluateAt(n,f,1,normal)for n in range(Len)] 打印“x=-1:”,[PEvaluateAt(n,f,-1,normal)for n in range(Len)] 打印“x=1/2:”,[PEvaluateAt(n,f,1/2,normal)*2^n代表范围内的n(Len)] 打印“x=-1/2:”,[PEvaluateAt(n,f,-1/2,normal)*2^n代表范围内的n(Len)]
f=λn:1 norm=无 作为多项式: 1 -x个 x^2-x -x^3+2*x^2-x x^4-3*x^3+3*x^2-x -x^5+4*x^4-6*x^3+4*x^2-x 系数: [[1], [0, -1], [0, -1, 1], [0, -1, 2, -1], [0, -1, 3, -3, 1], [0, -1, 4, -6, 4, -1]] # A097805号 , A071919号 , x=1:[1,-1,0,0,0,0,0,1,0]# A154955号 x=-1:[1、1、2、4、8、16、32、64、128、256]# A011782号 x=1/2:[1,-1,-1,-1-,-1# A153881号 x=-1/2:[1、1、3、9、27、81、243、729、2187、6561]# A133494号
f=λn:n 作为多项式: 1 -x个 x^2-2*x -x^3+4*x^2-6*x x^4-6*x^3+16*x^2-24*x -x^5+8*x^4-30*x^3+72*x^2-120*x 系数: [[1], [0, -1], [0, -2, 1], [0, -6, 4, -1], [0,-24,16,-6,1], [0, -120, 72, -30, 8, -1]] # A090238号 , A059369号 x=1:[1,-1,-1,-3,-13,-71,-461,-3447,-29093,-273343]# A167894号 , A003319号 x=-1:[1,1,3,11,47,231,1303,8431,62391,524495]# A051296号 x=1/2:[1,-1,-3,-17,-139,-1449,-18131,-263233] x=-1/2:[1、1、5、33、269、2633、30421、408945、6307549]
♦ 欧拉数和伯努利数的表示
欧拉数
f=λn:1/((2*n-1)*(2*n)) 范数=λn,k:阶乘(2*n) 长度=8 打印“作为多项式:” 对于范围内的n(Len-2):打印为多项式(n,f,范数) 打印“系数:” 对于范围内的n(Len-2):打印PartialPtransRec(n,f,normal) 打印“x=1:”,[PEvaluateAt(n,f,1,normal)for n in range(Len)] print“x=-1:”,[PE范围(Len)内n的赋值At(n,f,-1,范数)] 打印“x=1/2:”,[PEvaluateAt(n,f,1/2,normal)*2^n代表范围内的n(Len)] 打印“x=-1/2:”,[PEvaluateAt(n,f,-1/2,normal)*2^n代表范围内的n(Len)]
#作为多项式: 1 -x 6*x^2-x -90*x^3+30*x^2-x 2520*x^4-1260*x^3+126*x^2-x -113400*x^5+75600*x^4-13230*x^3+510*x^2-x #系数: A241171型 Joffe的中心差为零,符号为。 [1] [0, -1] [0, -1, 6] [0, -1, 30, -90] [0, -1, 126, -1260, 2520] [0, -1, 510, -13230, 75600, -113400] #x=1: A000364号 欧拉数字签名, A028296号 古德曼语 [1, -1, 5, -61, 1385, -50521, 2702765, -199360981] #x=-1: A094088号 例如1/(2-cosh(x))(偶数系数)。 [1, 1, 7, 121, 3907, 202741, 15430207, 1619195761] #x=1/2: A002105号 减少切线数,有符号。 [1, -1, 4, -34, 496, -11056, 349504, -14873104] #x=-1/2:数据库中缺少 [1, 1, 8, 154, 5552, 321616, 27325088, 3200979664]
|
伯努利数
f=λn:1/((2*n)*(2*n+1)) 范数=λn,k:阶乘(2*n)/(2-2^(2*n))
print“\n#作为多项式:” 对于范围内的n(Len-2):打印为多项式(n,f,范数) 打印“\n#系数” 对于范围内的n(Len-2):打印PartialPtransRec(n,f,normal) print“\n#x=1:”,[PEvaluateAt(n,f,1,normal)for n in range(Len)] 打印“\n#x=-1:”,[PEvaluateAt(n,f,-1,norm)for n in range(Len)]
#作为多项式: 1 1/6*x -1/21*x^2+1/70*x 93年5月3日至31年1月31日 -140/1143*x^4+14/127*x^3-41/1905*x^2+1/2286*x 100/219*x^5-40/73*x^4+93/511*x^3-23/1533*x^2+1/11242*x #系数 [1] [0, 1/6] [0, 1/70, -1/21] [0, 1/434, -1/31, 5/93] [0, 1/2286, -41/1905, 14/127, -140/1143] [0, 1/11242, -23/1533, 93/511, -40/73, 100/219] #x=1: A000367号 / A002445号 [1, 1/6, -1/30, 1/42, -1/30, 5/66, -691/2730, 7/6] # [1, 1, -1, 1, -1, 5, -691, 7] #[1、6、30、42、30、66、2730、6] #x=-1: [1, -1/6, -13/210, -115/1302, -2911/11430, -13509/11242] # [1, -1, -13, -115, -2911, -13509, -46675903] # [1, 6, 210, 1302, 11430, 11242, 5588310]
|
♦ P变换的逆
def Inverse PartialPtrans(dim,f,norm=无): A=[范围(dim)内n的部分Ptrans(n,f)] M=[[0代表k in(0..n)]代表n in range(dim)] M[0][0]=1 对于n in(1..dim-1): 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 如果norm==无:返回M 对于n in(1..dim-1): 对于k in(1..n):M[n][k]*=范数(n,k) 返回M
f=λn:var('x'+str(n)) 对于InversePartialPtrans(5,f)中的p:打印p [1], [0,-1/x1], [0,-x2/x1^2,1/x1^2], [0,-2*x2^2/x1^3+x2*x3/x1^3,2*x2/x1^3、-1/x1^3], [0,-5*x2^3/x1^4+5*x2^2*x3/x1^4-x2*x3*x4/x1^4,5*x2^2/x1^4-2*x2*x3/x1^4,-3*x2/x1^4,1/x1^4]
对于Inverse PartialPtrans(5,f)中的P:打印[P.substitute(x1=1)for P in P] [1] [0, -1] [0,-x2,1] [0,-2*x2^2+x2*x3,2*x2,-1] [0,-5*x2^3+5*x2^2*x3-x2*x3*x4,5*x2^2-2*x2*x3,-3*x2,1]
M=反向部分Ptrans(8,λn:n) 对于范围(8)中的n:打印[m代表m中的m[n]] [1], [0, -1], [0, -2, 1], [0, -2, 4, -1], [0, -4, 8, -6, 1], [0, 4, 16, -18, 8, -1], [0, -48, 12, -44, 32, -10, 1], [0, 336, 96, -72, 96, -50, 12, -1].
def InverseP序列(n,f,范数=无): M=反部分Ptrans(n,f,范数) 对于(1..n-1)中的j,返回[M[j][1] 打印反转序列(8,λn:n) [-1, -2, -2, -4, 4, -48, 336]
♦ 情况x=1的复发
定义Pcoeffsum(len,f,norm=无): R、 C=[1],[1]+[0]*(透镜-1) 对于n in(1..len-1): 对于范围(n,0,-1)中的k: C[k]=C[k-1]*f(k) C[0]=-总和((1..n)中k的C[k]) 如果范数==无:R.append(C[0]) else:R.append(C[0]*范数(n)) 返回R
打印Pcoeffsum(9,λn:n) [1, -1, -1, -3, -13, -71, -461, -3447, -29093] 打印[PEvaluteAt(n,lambda n:n,1)for n in range(9)] [1, -1, -1, -3, -13, -71, -461, -3447, -29093]
定义A001896_list(len): R、 C=[1],[1]+[0]*(透镜-1) 对于n in(1..len-1): 对于范围(n,0,-1)中的k: C[k]=C[k-1]/(8*k*(2*k+1)) C[0]=-总和((1..n)中k的C[k]) R.append((C[0]*阶乘(2*n)).numerator()) 返回R 打印A001896_list(8)
定义bernoulli列表(len): f、 R,C=1,[1],[1]+[0]*(透镜-1) 对于n in(1..len-1): f*=n 对于范围(n,0,-1)中的k: C[k]=C[k-1]/(k+1) C[0]=-总和((1..n)中k的C[k]) R.追加(C[0]*f) 返回R 打印伯努利列表(17)
P=绘图([1/2*x^2-1/3*x,-3/4*x^3+x^2-1/4*x,3/2*x^4-3*x^3+5/3*x^2 -1/5*x,-15/4*x^5+10*x^4-35/4*x^3+8/3*x^2-1/6*x,45/4*x*^6-75/2*x^5 +45*x^4-137/6*x^3+17/4*x^2-1/7*x],(x,0,1) 显示(P,帧=真,标题= 'p_n(0)=0且p_n“1”=B(n)=BernoulliNumber(n)的多项式')
♦ 一般情况下的周期
def PartialPtransRec(n,f,norm=无): i=1; F=[1] 而i<=n:F.append(F[i-1]*F(i)); i+=1 @缓存函数 定义PRec(n,k): 如果k==0且n==0:返回1 如果k==0:返回0 如果k==n:返回-PRec(n-1,n-1)*F[1] (1..n-k+1)中i的返回和(F[i]*PRec(n-i,k-1)) R=[PRec(n,k)for k in(0..n)] 如果norm==无:返回R return[(0..n)中k的范数(n,k)*R[k]]
lah2=λn:1,如果n==1其他((n-1)^2+1)/(n*(4*n-2)) 范数=λn,k:(-1)^k*阶乘(2*n)/阶乘(2*k) 对于(0..6)中的n: 打印部分PtransRec(n,lah2,normal) [1] [0, 1] [0, 2, 1] [0, 10, 10, 1] [0, 100, 140, 28, 1] [0, 1700, 2900, 840, 60, 1] [0,44200,85800,31460,3300,110,1]
def InversePartialPtransRec(n,f,范数=无): i=1; F=[1] 而i<=n:F.append(F[i-1]*F(i)); i+=1 @cached_函数 定义PRec(n,k): 如果k==0且n==0:返回1 如果k==0:返回0 如果k==n:返回-PRec(n-1,n-1)/F[1] 返回-(PRec(n-1,k-1)+总和(F[i]*(2..n-k+1)中i的PRec[n,k+i-1))/F[1] R=[PRec(n,k)for k in(0..n)] 如果norm==无:返回R return[(0..n)中k的范数(n,k)*R[k]]
eul=λn:1/((2*n-1)*(2*n)) nrm=λn,k:阶乘(2*n)/4^k 对于(0..6)中的n: 打印InversePartialPtransRec(n,eul,nrm) [1] [0, -1] [0, -2, 6] [0, -16, 60, -90] [0, -288, 1176, -2520, 2520] [0, -9216, 39360, -98280, 151200, -113400]
♦ 基准
导入时间 def timeit(语句): 持续时间=[] 对于范围(3)中的i: start=time.time() eval(语句) end=time.time() t=结束-开始 持续时间追加(t) 返回最小值(持续时间) def基准(stmt): t=时间(stmt) r=圆形(t*1000,3) 打印“%s最佳时间:%s毫秒”%(stmt,r)
对于范围(10,50,10)内的n: 基准(“PartialPtrans(%d,lambda n:n)”%n)
PartialPtrans(10,λn:n)最佳时间:28.879 ms PartialPtrans(20,λn:n)最佳时间:591.164 ms PartialPtrans(30,λn:n)最佳时间:7204.341 ms PartialPtrans(40,λn:n)最佳时间:57720.778 ms
对于范围(10,50,10)内的n: 基准测试(“PartialPtransRec(%d,lambda n:n)”%n)
PartialPtransRec(10,λn:n)最佳时间:10.783 ms PartialPtransRec(20,λn:n)最佳时间:33.621 ms PartialPtransRec(30,λn:n)最佳时间:80.299 ms PartialPtransRec(40,λn:n)最佳时间:161.223 ms
定义PtransMatrix(dim,f,norm=无,inverse=假,reduced=假): i=1; F=[1] 如果减少: 而i<=dim:F.append(F(i)); i+=1 其他: 而i<=dim:F.append(F[i-1]*F(i)); i+=1 C=[[0代表范围(m+1)中的k]代表范围(dim)中的m] C[0][0]=1 如果相反: 对于m in(1..dim-1): C[m][m]=-C[m-1][m-1]/F[1] 对于范围(m-1,0,-1)内的k: C[m][k]=-(C[m-1][k-1]+总和(F[i]*C[m][k+i-1] 对于i in(2..m-k+1))/F[1] 其他: 对于m in(1..dim-1): C[m][m]=-C[m-1][m-1]*F[1] 对于范围(m-1,0,-1)内的k: C[m][k]=-和(F[i]*C[m-i][k-1]用于(1..m-k+1)中的i) 如果norm==无:返回C 对于m in(1..dim-1): 对于k in(1..m):C[m][k]*=范数(m,k) 返回C
对于范围(10,50,10)内的n: 基准测试(“PtransMatrix(%d,lambda n:n)”%n) PtransMatrix(10,λn:n)最佳时间:6.345 ms PtransMatrix(20,λn:n)最佳时间:31.637 ms PtransMatrix(30,λn:n)最佳时间:74.013 ms PtransMatrix(40,λn:n)最佳时间:140.953 ms
♦ 简化的P变换
i=1; F=[1]; 而i<=n:F.append(F[i-1]*F(i)); i+=1
♦ 多元P-多项式的系数
def P多系数(dim,normal=None,inverse=False): def系数(p):#无可否认,有些模糊 c=SR(p).分数(ZZ).数字().系数() 如果不是c,则返回[0] f=λn:var('x'+str(n)) P=PtransMatrix(dim,f,范数,逆) return[[L中p的系数(p)]p中L的系数]
P系数(8) [[1]], [[0], [-1]], [[0],[-1],[1]], [[0], [-1], [2], [-1]], [[0], [-1], [1, 2], [-3], [1]], [[0], [-1], [2, 2], [-3, -3], [4], [-1]], [[0], [-1], [1, 2, 2], [-1, -6, -3], [6, 4], [-5], [1]], [0],[-1],[2,2,2],[-3,-3,-6,-3],[4,12,4],[-10,-5],[6],[-1]]
P多系数(7,逆=真) [[1]], [[0], [-1]], [[0],[-1],[1]], [[0], [-2, 1], [2], [-1]], [[0], [-5, 5, -1], [5, -2], [-3], [1]], [[0], [-14, 21, -3, -6, 1], [14, -12, 2], [-9, 3], [4], [-1]]], [[0], [-42,84,-28,-28,7,7,-1],[42,-56,7,14,-2],[-28,21,-3],[14,-4],[-5],[1]]
[[1], [0, -1], [0, -1, 1], [0, -1, 2, -1], [0, -1, 3, -3, 1], [0, -1, 4, -6, 4, -1], [0, -1, 5, -10, 10, -5, 1], [0, -1, 6, -15, 20, -15, 6, -1], [0, -1, 7, -21, 35, -35, 21, -7, 1]]
♦ 原型示例
stirset2=λn:1,如果n==1,其他1/(n*(4*n-2)) stircycle2=λn:1如果n==1其他(n-1)^2/(n*(4*n-2)) lah2=λn:1,如果n==1其他((n-1)^2+1)/(n*(4*n-2)) 范数=λn,k:(-1)^k*阶乘(2*n)/阶乘(2*k)
M=PtransMatrix(7,stirset2,范数) 对于m中的m:打印m [1] [0, 1] [0, 1, 1] [0, 1, 5, 1] [0, 1, 21, 14, 1] [0,1,85147,30,1] [0, 1, 341, 1408, 627, 55, 1] M=PtransMatrix(7,stirset2,范数,逆=真) 对于m中的m:打印m [1] [0, 1] [0,1,1] [0, 4, 5, 1] [0, 36, 49, 14, 1] [0, 576, 820, 273, 30, 1] [0, 14400, 21076, 7645, 1023, 55, 1]
M=PtransMatrix(7,stircycle2,范数)# A204579型 对于m中的m:打印m [1], [0, 1], [0, 1, 1], [0, 4, 5, 1], [0, 36, 49, 14, 1], [0, 576, 820, 273, 30, 1], [0, 14400, 21076, 7645, 1023, 55, 1] M=PtransMatrix(7,stircycle2,范数,逆=真) 对于m中的m:打印m [1] [0, 1] [0, 1, 1] [0, 1, 5, 1] [0, 1, 21, 14, 1] [0, 1, 85, 147, 30, 1] [0, 1, 341, 1408, 627, 55, 1]
M=PtransMatrix(7,lah2,范数) 对于m中的m:打印m [1] [0, 1] [0, 2, 1] [0,10,10,1] [0, 100, 140, 28, 1] [0, 1700, 2900, 840, 60, 1] [0, 44200, 85800, 31460, 3300, 110, 1]
♦ 高阶斯特林数和拉赫数
定义T(n,k,w): 如果n==k:返回1 如果k<0或k>n:返回0 返回T(n-1,k-1,w)+w(n,k)*T(n-1,k,w)
stirset3=λn,k:k^3 stircycle3=λn,k:(n-1)^3 lah3=λn,k:stircycle3(n,k)+stirset3(n、k) 对于范围(8)中的n:打印[T(n,k,lah3)对于范围(0..n)中的k] [1] [0, 1] [0,2,1] [0, 18, 18, 1] [0, 504, 648, 72, 1] [0, 32760, 47160, 7200, 200, 1] [0, 4127760, 6305040, 1141560, 45000, 450, 1] [0,895723920,1416456720,283704120,13741560,198450,882,1]
♦ 一些额外的斯特林数恒等式
♦ Maple代码
C:=(n,k)->二项式(n,k): R:=(n,k)->冲击波(n,k): F:=(n,k)->(-1)^k*R(-n,k): N:=(N,k)->(2*N)/ F(n+k,n)): S:=(n,k)->箍筋2(n,k): s:=(n,k)->abs(斯特林1(n,k)): B:=(n,k)->n(n,k)*加((-1)^(m+k)*C(n+k,n+m)*S(n+m,m),m=0..k): b:=(n,k)->n(n,k)*加((-1)^(m+k)*C(n+k,n+m)*s(n+m,m),m=0..k): A1:=(n,k)->R(n-k+1,n-k)*S(n,k): A2:=(n,k)->C(n,k)*加(C(k,i)*B(n-k,i,i=0..k): A3:=(n,k)->C(-k,-n)*加(C(-n,i)*b(n-k,i),i=0..n-k): B1:=(n,k)->R(n-k+1,n-k)*s(n,k): B2:=(n,k)->C(n,k)*加(C(k,i)*b(n-k,i,i=0..k): B3:=(n,k)->C(-k,-n)*加(C(-n,i)*B(n-k,i),i=0..n-k):
测试:=f->seq(打印(seq(f(n,k),k=0..n)),n=0..6): 试验(A1); 试验(A2); 测试(A3); 试验(B1); 试验(B2); 试验(B3);
partial_ptrans:=proc(n,f:=NULL)局部q,p,r,g,r; 如果n=0,则返回[1]fi; 如果f=NULL,则g:=n->x[n]否则g:=f fi; R:=[序列(0,j=0..n)]; 对于组合中的q:-分区(n)do p:=[op(ListTools:反向(q)),0]; r:=p[1]+1; mul(二项式(p[j],p[j+1])*g(j)^p[j],j=1..nops(q)); R[R]:=R[R]-(-1)^R*%; od; R端: p_trans:=proc(n,f:=NULL)add(k,k=partial_ptrans(n,f))end:
部分反式(5); 部分反式(6,m->m); seq(p_trans(n,m->1/(m+1))*n!, n=0..10); [0,-x[1]x[2]x[3]x[4]x[5], 2x[1]^2 x[2]x[3]x[4]+2x[1]^2 x[2]^2 x[3], -3x[1]^3 x[2]x[3]-3x[1]^3 x[2]^2,4x[1]^4 x[2],-x[1]^5] [0,-720,372,-152,48,-10,1] 1, -1/2, 1/6, 0, -1/30, 0, 1/42, 0, -1/30, 0, 5/66
p_矩阵:=进程(dim,生成器:=空,正常:=空) 局部n,k,w,M,T; M:=矩阵(尺寸,形状=三角形[下]); M[1,1]:=1; 如果normal=NULL,则w:=(n,k)->1,否则w:=normal fi; 对于n从1到dim do T:=部分反式(n-1,发生器); 对于从1到n的k,做M[n,k]:=w(n-1,k-1)*T[k]od; od; M端:
p_矩阵(6); p_矩阵(6,m->m); f:=n->`如果`(n=1,1,1/(n*(4*n-2)): w:=(n,k)->(-1)^k*(2*n)/ (2*k)!: p矩阵(6,f,w);
p_coeffsum:=进程(len,f)局部R,C,n,k; R:=阵列(0..len-1); C:=阵列(0..len-1); R[0]:=1; C[0]:=1; 对于从1到len-1的n do 对于k从n乘以-1到1做C[k]:=C[k-1]*f(k)od; C[0]:=-加(C[k],k=1..n); R[n]:=%; od; 转换(R,列表)结束: p_coeffsum(9,m->m); [1, -1, -1, -3, -13, -71, -461, -3447, -29093]