Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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_Numpy_Combinatorics_Itertools_Discrete Mathematics - Fatal编程技术网

Python函数求解二项式函数

Python函数求解二项式函数,python,numpy,combinatorics,itertools,discrete-mathematics,Python,Numpy,Combinatorics,Itertools,Discrete Mathematics,我需要一个能解决以下问题的函数:对于二项式函数nCr=k,给定r和k,求n。在数学上,nCr=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""" """

我需要一个能解决以下问题的函数:对于二项式函数nCr=k,给定r和k,求n。在数学上,nCr=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"""
"""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
    p=1
    while p<sum: 
        p=1
        for i in range(0,r+2):
            p*=(n-i+1)
        n+=1
    return n
“”“
我用这种方法,也就是迭代地找到多项式函数的解,希望有更好的方法
“我是这样做的,即迭代地找到多项式函数的解,希望有更好的方法”
def查找(r,k):
#求出(n*(n-1)…(n-r)=数学阶乘(r)*k中的n
#在上面的例子中,求出n(n*(n-1)(n-2)(n-3)(n-4)(n-5)=720*28)的
总和=数学阶乘(r)*k
n=r
p=1

而p我在你的代码中发现了一个错误

sum=n
您正在将sum设置为n 那么


while sum这只是一个如何解决这个问题的想法,同时保持高度的可读性

nCr=n!/{{r!}{n-r}!}=n(n-1)…(n-r+1)/{r!}
右侧是某个值
k

n=2*(r+1)
开始

nCr
=>n太小=>增加n

nCr>RHS
=>n太大=>减少n

nCr==RHS
=>找到n

。。。 ... 继续这样做,直到发现
n
或出现问题

import math

def find_n(r,k):

    if k==1:
        return r         # RHS is 1 when n and r are the same

    RHS = math.factorial(r) * k

    possible_n = 2 * r;
    possible_numerator = math.factorial(possible_n)
    possible_denom = math.factorial(possible_n - r)

    while True:
        # current n is too small 
        if ( possible_numerator // possible_denom ) < RHS:
            # try possible_n + 1
            possible_n = possible_n + 1
            possible_numerator = math.factorial(possible_n)
            possible_denom = math.factorial(possible_n - r)

        elif ( possible_numerator // possible_denom ) > RHS:
            # try possible_n - 1
            possible_n = possible_n - 1
            possible_numerator = math.factorial(possible_n)
            possible_denom = math.factorial(possible_n - r)

        elif ( possible_n == r):
            print ("***n smaller than r***");
            sys.exit(0);

        elif ( possible_numerator // possible_denom ) == RHS:
            return possible_n





print( find_n(6, 28) )      # should print 8

print( find_n(6, 462) )     # should print 11 

print( find_n(6, 3003) )        # should print 14

print( find_n(5, 3003) )        # should print 15
导入数学
def查找(r,k):
如果k==1:
当n和r相同时,返回r#RHS为1
RHS=数学阶乘(r)*k
可能的n=2*r;
可能分子=数学阶乘(可能分子)
可能的n=math.factorial(可能的n-r)
尽管如此:
#电流n太小
如果(可能的分子//可能的名称)RHS:
#尽可能地尝试
可能的\u n=可能的\u n-1
可能分子=数学阶乘(可能分子)
可能的n=math.factorial(可能的n-r)
elif(可能的n==r):
打印(***n小于r****);
系统出口(0);
elif(可能的分子//可能的名称)=RHS:
可能返回\u n
打印(查找(6,28))#应打印8
打印(查找n(6462))#应打印11
打印(查找n(63003))#应打印14
打印(查找n(53003))#应打印15

我使用了一个计算二项式系数的函数来实现特征nCr

def binomial(n,k):
    return 1 if k==0 else (0 if n==0 else binomial(n-1, k) + binomial(n-1, k-1))

def nCr(r,c):
    n=0
    b=binomial(n,r)
    while b<c:
        n=n+1
        b=binomial(n,r)
        if b==c:
            return n

    return None
def二项式(n,k):
如果k==0 else返回1(如果n==0 else二项式(n-1,k)+二项式(n-1,k-1))返回0)
def nCr(r、c):
n=0
b=二项式(n,r)

当B必须正确地进行计算时…您的想法显然是将n/(n-r)!存储在“sum”中,并将其与r!k进行比较,但“sum”计算错误。在第一次迭代中,sum等于n,然后(n-1)^2,然后(n-2)^2*(n-1),等等…hi@jomuel的可能副本我修改了它,但有时不会得到结果。如果性能有问题,开始在映射或数组中缓存阶乘值。第一个灵感来自于你提到的
x>=n
。现在,从
r+1
开始搜索没有多大意义因为如果你开始在一个映射中缓存值,这不会有多大帮助。
2*r+1
如果
r
很小,那也没什么大不了的,但是随着
r
大小的增加,阶乘会变得昂贵,缓存会让你从本质上得到O(1)中的阶乘。这似乎是最简单的方法,要记住可读性。如果从r+1开始缓存阶乘值并继续,堆空间很快就会用完(在Java中测试)。因此,它不具有可伸缩性。
import math

def find_n(r,k):

    if k==1:
        return r         # RHS is 1 when n and r are the same

    RHS = math.factorial(r) * k

    possible_n = 2 * r;
    possible_numerator = math.factorial(possible_n)
    possible_denom = math.factorial(possible_n - r)

    while True:
        # current n is too small 
        if ( possible_numerator // possible_denom ) < RHS:
            # try possible_n + 1
            possible_n = possible_n + 1
            possible_numerator = math.factorial(possible_n)
            possible_denom = math.factorial(possible_n - r)

        elif ( possible_numerator // possible_denom ) > RHS:
            # try possible_n - 1
            possible_n = possible_n - 1
            possible_numerator = math.factorial(possible_n)
            possible_denom = math.factorial(possible_n - r)

        elif ( possible_n == r):
            print ("***n smaller than r***");
            sys.exit(0);

        elif ( possible_numerator // possible_denom ) == RHS:
            return possible_n





print( find_n(6, 28) )      # should print 8

print( find_n(6, 462) )     # should print 11 

print( find_n(6, 3003) )        # should print 14

print( find_n(5, 3003) )        # should print 15
def binomial(n,k):
    return 1 if k==0 else (0 if n==0 else binomial(n-1, k) + binomial(n-1, k-1))

def nCr(r,c):
    n=0
    b=binomial(n,r)
    while b<c:
        n=n+1
        b=binomial(n,r)
        if b==c:
            return n

    return None