计算大数幂

计算大数幂

我实际上正在寻找一种能够计算此 Excel 公式的解决方案:

=1-PERMUT(1.15*10^77,358*10^7)/(1.15*10^77)^(358*10^7)

我也尝试用 Octave 来解决它。

有没有什么办法可以解决如此大的数字计算呢?

答案1

您不能使用直接计算,而必须使用快捷方式和简化方法,因为直接计算不适合系统数学的数值表示:

octave:1> (1.15*10^77)^(358*10^7)
ans =  Inf

对较小的 x 使用近似值
https://en.wikipedia.org/wiki/Taylor_series

log(1+x) = x + O(x^2)
exp(x) = 1 + x + O(x^2)

因为你的数字比例证明了这一点:

octave:1> n=1.15*10^77
n =    1.1500e+77
octave:2> k=358*10^7
k =  3580000000
octave:3> k/n
ans =    3.1130e-68

我们可以使用以下方法开始修改计算的第二部分

P(n,k) = n! / (n-k)!

因此比例

PERMUT(1.15*10^77,358*10^7)/(1.15*10^77)^(358*10^7)

可以重写为:

P(n,k) / n^k = 

= n! / (n-k)! / n^k
= (n/n) *(n-1)/n * (n-2) /n * .... *(n-k+1)/n=
= 1 * (1-1/n) * (1-2/n) * ... * (1-(k-1)/n) 

传递到对数

log( P(n,k) / n^k ) = 
= log (1 * (1-1/n) * (1-2/n) * ... * (1-(k-1)/n) ) =
= log(1) + log(1-1/n)+ log(1-2/n) + ... + log(1-(k-1)/n) =
=~ 0 + (-1/n) + (-2/n) + ... + (-(k-1)/n) = 
= - ( 1+2+..+(k-1) )/n = - k*(k-1)/(2*n)

然后返回

P(n,k) / n^k = exp(log( P(n,k) / n^k ) ) =~ exp(- k*(k-1)/(2*n))
=~ 1 - k*(k-1)/(2*n)

所以最后

1-PERMUT(1.15*10^77,358*10^7)/(1.15*10^77)^(358*10^7)=
= 1 - (1 - k*(k-1)/(2*n) ) = 
= k*(k-1)/(2*n) 

octave:4> k*(k-1)/(2*n)
ans =    5.5723e-59

相关内容