我的总密度为N。我需要找到所有方法,可以将密度分成k组,并假设某些最小可分的部分d。
所以,如果N = 4,k = 3,d = 1,我需要:
[
(1, 1, 2),
(1, 2, 1),
(2, 1, 1),
]
如果N = 5,k = 3,d = 1:
[
(1, 1, 3),
(1, 3, 1),
(3, 1, 1),
(1, 2, 2),
(2, 1, 2),
(2, 2, 1),
]
这样的感觉应该符合一些基本的组合问题,但我想不到。 This post引用了R中非常相似的操作,但没有引用python。
一种朴素的处理方式是将itertools.product
的结果仅过滤到总和为N的元组,但这感觉并不雅致:
import itertools
def compositions(N, k, d=1):
for seq in itertools.product(*[range(d, N, d)] * k):
if sum(seq) == N:
yield seq
示例
>>> list(compositions(7, 3))
[(1, 1, 5),
(1, 2, 4),
(1, 3, 3),
(1, 4, 2),
(1, 5, 1),
(2, 1, 4),
(2, 2, 3),
(2, 3, 2),
(2, 4, 1),
(3, 1, 3),
(3, 2, 2),
(3, 3, 1),
(4, 1, 2),
(4, 2, 1),
(5, 1, 1)]
还有其他想法吗?
答案 0 :(得分:1)
您可以假设d = 1,因为如果没有,则可以用d归一化N,即N'= N / d,现在d = 1。
代码如下:
php bin/console regenerate-app-secret