python实现第二类斯特林数详细所有情况
要想实现python实现第二类斯特林数详细所有情况,首先我们要了解将一个整数拆分非0整数的所有情况(已经写了相应的博客),详细的理论这个博客就不讲了,大家可以去参考我的其他两篇博客
将一个整数拆分各种情况之后,我们就要对里面的数字排列组合了,之后去重
#-*-encoding=utf-8-*-
import itertools
from itertools import product
import numpy as np
#作者huangquan
def detail(x):
l=[]
def max_values(n,x):
max_value=0
iters=np.arange(0,x,1)
for i in iters:
max_value= np.power((n-x+2),i)*(n-x+1)+max_value
return max_value
def min_values(n,x):
min_value=0
iters=np.arange(0,x,1)
for i in iters:
min_value= np.power((n-x+2),i)*1+min_value
return min_value
def f(n,x):
#n这里设置范围30以下,不够的朋友自己加
a=range(1,30,1)
b=[]
while True:
s=n//x
y=n%x
b=b+[y]
if s==0:
break
n=s
b.reverse()
b=list(b)
return b
a=list(set(x))
iters=np.arange(1,a.__len__()+1,1)
contianer=list()
discontianer=list()
count=0
for i in iters:
for j in (np.arange(min_values(a.__len__(),i),max_values(a.__len__(),i)+1,1)):
b=f(j,a.__len__()-i+2)
if sum(b)==a.__len__() and (0 not in b):
contianer.append(tuple(sorted(b)))
discontianer=list(set(contianer))
#print(discontianer)
def strlingnumfun(a):
finrestult=[]
for i in np.arange(0,a.__len__(),1):
z=[]
listrestult=[]
for j in np.arange(0,a[i].__len__(),1):
result=list(itertools.combinations(list(np.arange(1,sum(a[1])+1,1)),a[i][j]))
z.append(result)
for x in product(*z):
listrestult.append(list(x))
for zz in listrestult:
zzzs=[]
for zzz in zz:
zzzz=list(zzz)
zzzs.extend(zzzz)
zzzs=list(set(zzzs))
if zzzs.__len__()==sum(a[1]):
finrestult.append(zz)
return finrestult
result=strlingnumfun(discontianer)
#print(result)
for qq in result:
qqs=sorted(qq)
if qqs not in l:
l.append(qqs)
def S(n,m):
if m>n or m==0:
return 0
if n==m:
return 1
if m==1:
return 1
return S(n-1,m-1)+S(n-1,m)*m
def total(n):
sumtotal=0
for i in np.arange(0,n+1,1):
sumtotal=sumtotal+S(n,i)
print(sumtotal)
return l
# print("===========程序结果=============")
# for i in l:
# print(i)
# print ("==========结果个数==============")
# print(l.__len__())
# print("===========第二类斯特林验证程序是否合格============")
# total(sum(discontianer[1]))
调用函数
#程序主入口,其中x可以从文件中读取
#我们要拆分的整数取的整数在这里取的是列表的长度(去重)
#输入[1,2,6,5]与[2,2,1,5,6]结果一致
#x的长度就是第二类斯特林数的输入,这里x=4
x=[1,2,5,6]
print(detail(x))
#x的长度就是第二类斯特林数的输入,这里x=5(列表长度)
x=[1,2,5,6,10]
print(detail(x))
输出结果
[[(1,), (2, 3, 4)], [(1, 3, 4), (2,)], [(1, 2, 4), (3,)], [(1, 2, 3), (4,)], [(1,), (2,), (3,), (4,)], [(1,), (2,), (3, 4)], [(1,), (2, 4), (3,)], [(1,), (2, 3), (4,)], [(1, 4), (2,), (3,)], [(1, 3), (2,), (4,)], [(1, 2), (3,), (4,)], [(1, 2, 3, 4)], [(1, 2), (3, 4)], [(1, 3), (2, 4)], [(1, 4), (2, 3)]]
[[(1,), (2,), (3, 4, 5)], [(1,), (2, 4, 5), (3,)], [(1,), (2, 3, 5), (4,)], [(1,), (2, 3, 4), (5,)], [(1, 4, 5), (2,), (3,)], [(1, 3, 5), (2,), (4,)], [(1, 3, 4), (2,), (5,)], [(1, 2, 5), (3,), (4,)], [(1, 2, 4), (3,), (5,)], [(1, 2, 3), (4,), (5,)], [(1,), (2, 3), (4, 5)], [(1,), (2, 4), (3, 5)], [(1,), (2, 5), (3, 4)], [(1, 3), (2,), (4, 5)], [(1, 4), (2,), (3, 5)], [(1, 5), (2,), (3, 4)], [(1, 2), (3,), (4, 5)], [(1, 4), (2, 5), (3,)], [(1, 5), (2, 4), (3,)], [(1, 2), (3, 5), (4,)], [(1, 3), (2, 5), (4,)], [(1, 5), (2, 3), (4,)], [(1, 2), (3, 4), (5,)], [(1, 3), (2, 4), (5,)], [(1, 4), (2, 3), (5,)], [(1,), (2, 3, 4, 5)], [(1, 3, 4, 5), (2,)], [(1, 2, 4, 5), (3,)], [(1, 2, 3, 5), (4,)], [(1, 2, 3, 4), (5,)], [(1, 2, 3, 4, 5)], [(1, 2), (3, 4, 5)], [(1, 3), (2, 4, 5)], [(1, 4), (2, 3, 5)], [(1, 5), (2, 3, 4)], [(1, 4, 5), (2, 3)], [(1, 3, 5), (2, 4)], [(1, 3, 4), (2, 5)], [(1, 2, 5), (3, 4)], [(1, 2, 4), (3, 5)], [(1, 2, 3), (4, 5)], [(1,), (2,), (3,), (4, 5)], [(1,), (2,), (3, 5), (4,)], [(1,), (2,), (3, 4), (5,)], [(1,), (2, 5), (3,), (4,)], [(1,), (2, 4), (3,), (5,)], [(1,), (2, 3), (4,), (5,)], [(1, 5), (2,), (3,), (4,)], [(1, 4), (2,), (3,), (5,)], [(1, 3), (2,), (4,), (5,)], [(1, 2), (3,), (4,), (5,)], [(1,), (2,), (3,), (4,), (5,)]]