Integer 查找给定总数、部分数和最大和的整数分区数
我在寻找一个总的N的整数分区的数量,其中有许多部分S,最大部分正好是X,而不枚举所有部分 例如:100的所有分区都有10个部分,42个部分是最大部分 我没有发现解决这个问题的定理或划分恒等式,我怀疑这是一个不容易从已知定理推导出来的非平凡问题(例如Nijenhuis和Wilf 1978,Andrews等人2004,Bona 2006): 例如:N的分区数正好是S部分等于N的分区数,其中S部分正好是最大部分 这个问题与我的研究有关,这远远超出了纯数学的范畴 更新:下面回答了这个问题,但我想发布我用来实现它的Python脚本。我可能会把它推过Cython以加快速度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 = 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