【问题标题】:Finding the number of integer partitions given a total, a number of parts, and a maximum summand在给定总数、部分数和最大和数的情况下查找整数分区的数量
【发布时间】:2012-09-15 03:37:45
【问题描述】:

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

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

我没有找到解决这个问题的定理或划分恒等式,我怀疑这是一个不容易从已知定理推导出来的重要问题(例如 Nijenhuis 和 Wilf 1978、Andrews 等人 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) 

【问题讨论】:

    标签: integer combinatorics number-theory


    【解决方案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 的分区。 通过删除这些大小为xi 部分,我们会遇到与参数相同的问题 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&gt;s*x 表示我们不能用最大大小的所有分区对 n 进行分区,因此不可能组合参数。 边界条件是

    【讨论】:

    • 小优化:P(n,s,x) = 0 if n&gt;s*x, 1 if n==s*x, upper sum if n&lt;s*x
    • 您能否解释一下上述实现为何/如何工作?我知道它类似于限制较少的整数分区问题的递归关系,但是对特定示例的解释确实会有所帮助,特别是因为没有很多/任何其他解决此问题的示例。
    • 我添加了一些 cmets。我希望它有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2020-02-23
    • 2014-11-26
    相关资源
    最近更新 更多