Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python实现多系数_Python_Combinatorics - Fatal编程技术网

用python实现多系数

用python实现多系数,python,combinatorics,Python,Combinatorics,问题是: 假设有9个不同的对象,找到将其划分为2、3和4组的所有方法 从数学上讲,除法的总数可以表示为9/2.3.4! 这是我尝试过的 import itertools def multiCoef(seta, n1, n2): seta = set(seta) for comba in itertools.combinations(seta, n1): comba = set(comba) for combb in itertools.combinations(seta-

问题是: 假设有9个不同的对象,找到将其划分为2、3和4组的所有方法

从数学上讲,除法的总数可以表示为9/2.3.4!

这是我尝试过的

import itertools
def multiCoef(seta, n1, n2):
  seta = set(seta)
  for comba in itertools.combinations(seta, n1):
    comba = set(comba)
    for combb in itertools.combinations(seta-comba, n2):
      combb = set(combb)
      yield comba, combb, seta-comba-combb
你可以用这样的东西试试,它运行得很好:

>>> y = multiCoef(x, 2, 3)
>>> for i in y: print i

但一旦群体数量增加,这种方法就会变得麻烦。有更好的方法吗?

一旦定义了函数子集(a,b),就可以枚举a中大小为b的所有子集

for i in subsets(mySet,2):
    for j in subsets(mySet.difference(i),3):
        for k in subsets(j.difference(k),4)
            print i,j,k

一旦定义了用于枚举a中大小为b的所有子集的函数子集(a,b)

for i in subsets(mySet,2):
    for j in subsets(mySet.difference(i),3):
        for k in subsets(j.difference(k),4)
            print i,j,k
见itertools

参见itertools


要找到划分
(m+n+p)
项目组
m,n,p
的方法,首先将集合划分为
m
组,然后将这些组中的每一个分组除以
n
,然后除以
p

现在,将(m+n+p)项分成(n+p)组的方法如下

==>(n+m+n)Cn+p

==>(m+n+p)/(m!*(n+p)!)

现在把(n+p)项分成n组的方法是

==>(n+p)Cn

==>(n+p)/(n!*(p)!)

所以(n+m+n)Cm*(n+p)Cn=(m+n+p)/(m!*(n+p)!)*(n+p)/(n!*(p)!)

==>(m+n+p)/(m!*n!*p!)

做我们可以使用的组合

给定m=4,n=3,p=2

将小组分成(n+p)=5项

>>> g1=(x for x in itertools.combinations(xrange(9),5))
注意:您可以将其保留为生成器

将这些组中的每一组分为n个项目=3个项目的子组

>>> groups=[(x,tuple(set(g)-set(x))) for g in g1 for x in itertools.combinations(g,3)]
注意::tuple(set(g)-set(x))将为您提供不是x的元素,即组的另一部分

团体规模为

>>> len(groups)
1260
>>>
现在验证

>>> factorial(9)/(factorial(2)*factorial(3)*factorial(4))
1260

要想找到划分
(m+n+p)
项在
m,n,p
组中的方法,首先要将集合划分为
m
组,然后将这些组中的每一个除以
n
,然后再除以
p

现在,将(m+n+p)项分成(n+p)组的方法如下

==>(n+m+n)Cn+p

==>(m+n+p)/(m!*(n+p)!)

现在把(n+p)项分成n组的方法是

==>(n+p)Cn

==>(n+p)/(n!*(p)!)

所以(n+m+n)Cm*(n+p)Cn=(m+n+p)/(m!*(n+p)!)*(n+p)/(n!*(p)!)

==>(m+n+p)/(m!*n!*p!)

做我们可以使用的组合

给定m=4,n=3,p=2

将小组分成(n+p)=5项

>>> g1=(x for x in itertools.combinations(xrange(9),5))
注意:您可以将其保留为生成器

将这些组中的每一组分为n个项目=3个项目的子组

>>> groups=[(x,tuple(set(g)-set(x))) for g in g1 for x in itertools.combinations(g,3)]
注意::tuple(set(g)-set(x))将为您提供不是x的元素,即组的另一部分

团体规模为

>>> len(groups)
1260
>>>
现在验证

>>> factorial(9)/(factorial(2)*factorial(3)*factorial(4))
1260

下面是一个递归生成器,它获取数字范围(
first
last
)和
avail
,即所需集合大小的列表。假设
sum(avail)=last-first+1)

在循环的每一次迭代中,算法都会尝试将第一个赋值给其中一个集合,然后为
first+1,…,last
生成所有赋值。generate生成集合赋值的元组:元组中每个位置的值标识对应索引的集合赋值。换句话说,
t(k)
first+k
的设置赋值,一个范围为
0..len(avail)-1

def生成(第一个、最后一个、可用):
对于索引,枚举中的n(可用):
如果n==0:
持续
新的可用性=列表(可用性)
新的可用性[索引]-=1
如果第一次<最后一次:
对于生成中的d(第一个+1,最后一个,新的可用):
d=(不精确,)+d
产量d
elif first==last:
收益率(指数)
对于generate(1,9,[2,3,4])中的perm:
烫发

以下是一个递归生成器,它获取数字范围(
first
last
)和
avail
,即所需集合大小的列表。假设
sum(avail)=last-first+1)

在循环的每一次迭代中,算法都会尝试将第一个赋值给其中一个集合,然后为
first+1,…,last
生成所有赋值。generate生成集合赋值的元组:元组中每个位置的值标识对应索引的集合赋值。换句话说,
t(k)
first+k
的设置赋值,一个范围为
0..len(avail)-1

def生成(第一个、最后一个、可用):
对于索引,枚举中的n(可用):
如果n==0:
持续
新的可用性=列表(可用性)
新的可用性[索引]-=1
如果第一次<最后一次:
对于生成中的d(第一个+1,最后一个,新的可用):
d=(不精确,)+d
产量d
elif first==last:
收益率(指数)
对于generate(1,9,[2,3,4])中的perm:
烫发

我理解这个问题。这是组合数学,我理解这个问题。这是组合数学,我想你可能没抓住重点。g2应该从剩下的5个选项中选择?@CravingSpirit,抱歉错过了。我想你可能错过了要点。g2应该从剩下的5个中选择?@CravingSpirit,抱歉错过了