基于多数约束在python中过滤笛卡尔积(笛卡尔幂)

时间:2015-02-13 11:23:15

标签: python combinatorics cartesian-product

我想知道基数幂X ^ n中的元素数量(一组X的主要乘积本身,n次)和多数约束:X ^ n中有多少元素具有(相对)多数集合中的一个元素(比如x)?

最重要的是,我想将基本功率中的一个元素固定到某个值(比如第二个),并用这个固定值计算可能性的数量。

我们举个简单的例子,X = {A,B,C},n = 4。问题是:在第二个位置有多少四个字母的单词有一个(相对)多数的A(答案:13,见here)?有多少人有(相对)多数的B?

在具有3行({A,B,C})和n = 4列的网络中,假设从左到右的路径(例如,使用节点A1,然后是B2,然后是A3,最后是C3),问题变为:有多少路径通过节点A2并且(相对)大多数是A节点?

I'm looking for a closed form formula,但找不到一个。

是否可以枚举所有产品并在python中过滤它们?

我的原始集合中有8个元素,我重复它们n = 24次。它非常大(> 10'9),但可能会简化,也许?

2 个答案:

答案 0 :(得分:1)

我不能给你一个理论上的答案,但这里有一些python代码可以帮助你入门。

import itertools, collections

items = 'ABCDEFGH'
n = 4

r = collections.Counter()

# for symmetry reasons, it doesn't matter which position you "fix"
# so to count `'ABCD'^n` with fixed 'A' 
# we have to count `'ABCD'^n-1` and just add 1 for 'A'.    

for p in itertools.product(items, repeat=n-1):
    c = collections.Counter(p)
    c['A'] += 1
    m = c.most_common(2)
    if len(m) == 1 or m[0][1] > m[1][1]:
        r[m[0][0]] += 1
    else:
        r['no_major'] += 1

print r

关于您的具体数字,迭代8^24项目听起来并不现实。在你走到这一步之前,你必须得出一个公式!

答案 1 :(得分:0)

无法过滤,并且有一个封闭的表格公式(参见数学here)。

以下是如何在python中解决这个问题(灵感来自here):

  1. 安装sympy ,以便在python中发现符号代数download,解压缩,转到文件夹python setup.py install ,那就是它)
  2. 导入内容
  3.   

    来自sympy.abc import x

         

    来自sympy import expand

         

    来自sympy import factorial

    小心:不要使用数学中的因子,而应该使用同情的因子;所以不要from math import factorial(见here)。

    1. 展开 多项式
    2.   

      d1 = expand()

      1. 提取 系数
      2.   

        打印d1 [x ** n]


        对于简单示例 here(n = 4,m = 3),我们需要在其上导入求和,字母j,k,

          

        来自sympy import summation

             

        来自sympy.abc import j,k

             

        导入数学

             

        d1 =展开(求和(x **(k-1)/阶乘(k-1)*求和(x **(j-1)/阶乘(j-1),(j,1,k) )** 2,(k,0,4)))。as_coefficients_dict()

             

        d1 [x ** 3] * math.factorial(3)

        解决方案是13。


        对于大例子,,n = 24,m = 8:

          

        d2 =展开(求和(x **(k-1)/阶乘(k-1)*求和(x **(j-1)/阶乘(j-1),(j,1,k) )** 7,(k,0,24)))。as_coefficients_dict()

             

        d2 [x ** 23] * math.factorial(23)

        解决方案是105097074808684277656。计算需要1-2小时。