为何n较大时Bell数计算结果不准确?
整数分拆结合Faà di Bruno公式计算Bell数出错排查
我尝试通过整数分拆和Faà di Bruno公式计算大集合的Bell数(Bell数表示n个元素集合的所有可能划分方式总数),思路是遍历n的所有整数分拆,计算每个分拆对应的组合数后累加得到Bell数。
我采用Nicolas Blanc的整数分拆代码,结合视频介绍的Faà di Bruno公式计算组合数:公式逻辑为用n!除以分拆中每个子集大小的阶乘乘积,再除以各相同大小子集数量的阶乘乘积,得到该分拆对应的集合划分数目,最终累加所有分拆的结果得到Bell数。
小数值n的计算结果正常,比如n=4时能得到正确的Bell数15,但当n≥12时结果出现偏差:
- 输入n=12时,代码输出4213663,正确值应为4213597
- 输入n=13时,代码输出27645945,正确值应为27644437
我无法定位问题根源,可能是公式使用错误、代码存在bug或其他未知问题。相关参考方向:Bell多项式、集合划分、Bell数。
附Python代码:
import math in_par = [] stack = [] bell = 0 def partitions(remainder, start_number = 1): if remainder == 0: in_par.append(list(stack)) #print(stack) else: for nb_to_add in range(start_number, remainder+1): stack.append(nb_to_add) partitions(remainder - nb_to_add, nb_to_add) stack.pop() x = partitions(13) # <------- 输入元素数量 for part in in_par: combo = 1 n = 13 # <------- 输入元素数量 part.reverse() refined = [] counts = [] for elem in part: if str(refined).find(str(elem)) == -1: refined.append(elem) #print(str(combo) + " * " + str(math.factorial(elem)) + " a") combo = combo * math.factorial(elem) for elem in refined: #print(str(combo) + " * !" + str(part.count(elem)) + " b") combo = combo * math.factorial(part.count(elem)) counts.append(str(part.count(elem))) for i in range(len(part)): part[i] = str(part[i]) print(str(n) + "! / (" + ("!").join(part) + "! * " + ("!").join(counts) + "!)") for i in range(len(part)): part[i] = int(part[i]) combo = math.factorial(n) // combo bell = bell + combo part.append([combo]) print(part) print("") #print(str(bell)) print("Bell Number: " + str(bell))
内容的提问来源于stack exchange,提问作者lordfoog
相关产品推荐
相关产品推荐

