Integer 查找给定总数、部分数和最大和的整数分区数

Integer 查找给定总数、部分数和最大和的整数分区数,integer,combinatorics,number-theory,Integer,Combinatorics,Number Theory,我在寻找一个总的N的整数分区的数量,其中有许多部分S,最大部分正好是X,而不枚举所有部分 例如:100的所有分区都有10个部分,42个部分是最大部分 我没有发现解决这个问题的定理或划分恒等式,我怀疑这是一个不容易从已知定理推导出来的非平凡问题(例如Nijenhuis和Wilf 1978,Andrews等人2004,Bona 2006): 例如:N的分区数正好是S部分等于N的分区数,其中S部分正好是最大部分 这个问题与我的研究有关,这远远超出了纯数学的范畴 更新:下面回答了这个问题,但我想发布我用

我在寻找一个总的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) 
n=100#总数
s=10#零件数量
x=20#最大部分
打印分区(n,长度=s,最大部分=x)
def部件(n、s、x):
如果n==0和s==0:返回1
如果没有:
_总和=0
对于范围(0,s+1)内的i:
_总和+=部分x(n-i*x,s-i,x-1)
返回和
打印零件(n、s、x)

对于这个数量的分区,递归
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
P(n,s,x)=和P(n-i*x,s-i,x-1),对于i=0,…,s
P(0,0,x)=1

P(n,s,x)=0,如果n是一个小优化:
P(n,s,x)=0如果n>s*x,1如果n==s*x,上和如果nca你能解释一下为什么/如何进行上述实现吗?我知道这类似于限制较少的整数分区问题的递归关系,但对特定示例的解释确实会有帮助,特别是因为这个问题的其他示例不多。我希望有帮助。
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