计算表达式长度而不计算表达式本身

时间:2017-08-08 18:39:02

标签: algorithm math formula

我需要计算复杂表达式十进制长度(包含阶乘)而不计算表达式本身。 例如: ( 400! / ( 100! * 300!) )的十进制长度 任何可以执行任务或数学公式的方法都可能有用。 谢谢。

2 个答案:

答案 0 :(得分:0)

如果近似值足够,我们可以使用斯特林近似值

N! ~sqrt(2×πn)×(n / e) n

这个结果对我们的目标不是很有意思,但是我们可以使用log10来获取位数:

log 10 (n!)~log 10 (sqrt(2×πn))+ n×log 10 (n / e )

现在我们可以使用以下方法计算!/(b!×c!)的位数:

log(a!/(b!×c!))= log(a!) - log(b!) - log(c!)

等于:

log(a!/(b!×c!))= log 10 (sqrt(2×πa))+ a×log 10 (a / e )-log <子> 10 (SQRT(2×πB)) - b×日志<子> 10 (b / E)-log <子> 10 (SQRT(2 ×πC)) - C×日志<子> 10 (C / E)

数字 n 的位数大致为⌊log(n)⌋+ 1。

因此,例如在Python中,我们可以近似

from math import log10, pi, e, sqrt, floor

def approx_fac_log10(n):
    return log10(sqrt(2.0*pi*n))+n*log10(n/e)

def approx_length(a,b,c):
    return 1+floor(approx_fac_log10(a)-approx_fac_log10(b)-approx_fac_log10(c))

对于您的公式,我们获得:

>>> approx_length(400,100,300)
97

如果我们计算结果,我们得到:

>>> factorial(400)//(factorial(100)*factorial(300))
2241854791554337561923210387201698554845411177476295990399942258896013007429693894018935107174320
>>> factorial(400)/(factorial(100)*factorial(300))
2.2418547915543375e+96

如果我们将结果转换为字符串,然后获取该字符串的长度,我们得到:

>>> len(str(factorial(400)//(factorial(100)*factorial(300))))
97

所以近似是正确的:结果确实有97位数。

您可以使用 Stirling approximation 中的 more 项来提高近似值的质量。最终,如果你采用无限量的术语,你的确会完全计算出结果:

approximation

答案 1 :(得分:0)

数字x中的位数是floor(log(x))+ 1: a proof on math.stackexchange

因此,根据您的效率需求,添加和减去对数的简单方法可能就足够了。