python实现第二类斯特林数详细所有情况

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,)]]

猜你喜欢

转载自blog.csdn.net/LuYi_WeiLin/article/details/86307499
今日推荐