Python函数求解二项式函数
我需要一个能解决以下问题的函数:对于二项式函数nCr=k,给定r和k,求n。在数学上,nCr=n/R(右)!我试着跟随,但没有解决它。例如8C6=28,对于我的函数,输入是6和28,我想找到8。这可能没有精确的整数,所以我想找到一个x>=nPython函数求解二项式函数,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""" """
"""
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