2

我正在寻找总共 N 的整数分区数,其中有多个部分 S,最大部分正好是 X,但没有枚举所有部分。

例如:所有 100 的分区有 10 个部分和 42 作为最大部分。

我没有找到解决这个问题的定理或划分恒等式,我怀疑这是一个不容易从已知定理推导出来的非平凡问题(例如 Nijenhuis 和 Wilf 1978,Andrews et al. 2004,Bona 2006):

例如:N 中恰好 S 部分的分区数等于 N 中恰好 S 为最大部分的分区数。

这个问题与我的研究有关,这远远超出了纯数学。

更新:这个问题在下面得到了回答,但我想发布我用来实现它的 Python 脚本。我可能会推动它通过 Cython 以获得一些速度。

n = 100 # the total
s = 10  # number of parts
x = 20  # largest part
print Partitions(n,length=s,max_part=x).cardinality() # Sage is very slow at this

def parts_nsx(n,s,x):
    if n==0 and s==0:return 1
    if n<=0 or s<=0 or x<=0:return 0
    if n>0 and s>0 and x>0:
        _sum = 0
        for i in range(0,s+1):
            _sum += parts_nsx(n-i*x, s-i, x-1)
        return _sum    
print parts_nsx(n,s,x) 
4

1 回答 1

1

对于这个数量的分区递归P(n,s,x)成立:

P(n,s,x) = sum P(n-i*x, s-i, x-1), for i=0,...,s 
P(0,0,x) = 1
P(n,s,x) = 0, if n <= 0 or s <= 0 or x <= 0

计算效率不高,也许在你的例子中它会足够快。

最好使用 memoization 来实现。

编辑:

带记忆的 Python 实现:

D = {}
def P(n,s,x):
  if n > s*x or x <= 0: return 0
  if n == s*x: return 1
  if (n,s,x) not in D:
    D[(n,s,x)] = sum(P(n-i*x, s-i, x-1) for i in xrange(s))
  return D[(n,s,x)]

P(100, 10, 42)
2685871

更新:

满足参数的分区n,s,x可以具有i最大大小的分区x。通过删除这些i具有大小的部分,x我们会遇到与参数相同的问题 n-i*x, s-i, x-1。例如,100 个分区,有 10 个部分,最大部分为 42,可以有 0、1 或 2 个大小为 42 的部分。

P(0,0,x) = 1意味着我们在之前的迭代中已经有了分区。

P(n,s,x) = 0, if n>s*x意味着我们不能用最大大小的所有分区对 n 进行分区,因此不可能组合参数。边界条件是

于 2012-09-16T14:25:49.227 回答