【问题标题】:For binomial function nCr=k, given r and k find n对于二项式函数 nCr=k,给定 r 和 k 找到 n
【发布时间】:2016-06-15 15:50:04
【问题描述】:

我需要一个可以解决以下问题的函数:对于二项式函数 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

谢谢。

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在发布者已经尝试自己解决问题时才提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • 我还是不知道你的问题是什么?这是否符合您的要求?如果不是,请提供有关示例输入和输出不适用的具体细节。
  • 例如 **8C6**=28,对于我的函数,输入是 6 和 28,我想找到 8。
  • 谢谢大家,我已经解决了。欢迎 cmets 和建议。寻找更有效的解决方案。

标签: matlab scipy combinations itertools discrete-mathematics


【解决方案1】:

我是通过以下方式解决的,即迭代求多项式函数的解,希望有更好的方法。

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)

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

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

【讨论】:

    【解决方案2】:

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

    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 &gt;= 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
    

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多