对于二项式函数nCr = k,给定r和k找到n

时间:2016-03-02 16:44:27

标签: matlab scipy combinations itertools discrete-mathematics

我需要一个可以解决以下问题的函数:对于二项式函数nCr = k,给定r和k找到n。在数学中nCr = n!/ r!(n-r)!     我试过跟随,但它没有解决它。例如8C6 = 28,对于我的函数,输入是6和28,我想找到8.这可能没有完整的整数,所以我想找到一个x> = n。

"""I am approaching it this way, i.e. find the solution of a polynomial function iteratively, hope there is a better way"""
def find_n(r,k):
    #solve_for_n_in(n*(n-1)...(n-r)=math.factorial(r)*k
    #in the above example solve_for_n(n*(n-1)(n-2)(n-3)(n-4)(n-5)=720*28)

    sum=math.factorial(r)*k
    n=r+1
    p=1

    while p<sum:
        p=1
        for i in range(0,r+2):
            p*=(n-i)
        n+=1
    return n-1

感谢。

2 个答案:

答案 0 :(得分:0)

我通过以下方式解决了它,即迭代地找到多项式函数的解,希望有更好的方法。

#

答案 1 :(得分:0)

以下是使用fminsearch的解决方案。您希望最小化nchoosek(n, r)k之间的绝对差异。但是,您可能会遇到nchoosek的未定义值,因此最好从头开始定义它。不要使用factorial,因为它对于负整数是未定义的。相反,请使用gamma(如果您不知道,请在维基百科上阅读此内容)。

r = 6;
k = 28;
toMinimize = @(n) abs(gamma(n+1) / (gamma(r+1) * gamma(n-r+1)) - k);

对初始条件保持警惕:

for n = 1:10
    [res(n, 1), fval(n, 1)] = fminsearch(toMinimize, n);
end
[res fval]

现在您将看到您应该只信任初始条件n0 >= 5,其答案为n = 8

ans =
             1.42626953125          27.9929874410369
             1.42626953125          27.9929874410369
           3.5737060546875          27.9929874410073
             3.57373046875          27.9929874410369
                         8                         0
          8.00000152587891       5.2032510172495e-05
          8.00000152587891      5.20325100552554e-05
                         8                         0
          7.99999694824218      0.000104064784270719
                         8                         0