在python中模拟二项式系数(nCr)

Posted

技术标签:

【中文标题】在python中模拟二项式系数(nCr)【英文标题】:simulate binominal coefficent (nCr) in python 【发布时间】:2018-05-31 16:13:57 【问题描述】:

出于好奇,我想知道是否有办法通过在 python 中模拟来解决二项式系数。我尝试了一点,但数字变得如此之快,以至于我无法解决任何问题,只能解决非常小的数字。

我知道question,但无法确定一种仅使用蛮力求解系数的解决方案。但我必须承认,我并不了解其中列出的所有实现。

这是我幼稚的做法:

import random
import numpy as np
from math import factorial as fac

# Calculating the reference with help of factorials

def comb(n,k):
    return fac(n) // fac(k) // fac(n-k)

# trying a simple simulation with help of random.sample

random.seed(42)
n,k = 30,3
n_sim = 100000
samples = np.empty([n_sim,k], dtype=int)


for i in range(n_sim):
    x = random.sample(range(n),k)
    samples[i] = sorted(x)

u = np.unique(samples, axis=0)

print(len(u))
print(comb(n,k))

是否有可能高效、快速地处理大量数据?

【问题讨论】:

Statistics: combinations in Python的可能重复 我没有得到你的代码:8行来构建“u”,它没有被使用......另外:你的代码中定义的函数comb在我的计算机上很快并且可以处理很大数字,即使它是一个相当模糊的定义...... 【参考方案1】:

我用这个,它对大数字非常有效:

def nck(n, k):
    if k < 0 or k > n:
        return 0
    if k == 0 or k == n:
        return 1
    k = min(k, n - k)  # take advantage of symmetry
    c = 1
    for i in range(k):
        c = c * (n - i) // (i + 1)
    return c

【讨论】:

这可能很神奇,但使用 timeit 显示比使用 fac 慢两到三倍 不适合大数字。试试:nck(10**6,50*10**3) vs comb(10**6,50*10**3)(我的电脑上是 4s vs 46s)

以上是关于在python中模拟二项式系数(nCr)的主要内容,如果未能解决你的问题,请参考以下文章

TZOJ--4858: 多项式输出 (模拟)

python 在python中计算二项式系数的快速方法(Andrew Dalke)

二项式系数的和是啥?

团体程序设计天梯赛 L2-018. 多项式A除以B(模拟)

多项式的系数怎么求

二项式系数和公式