定义式收敛非常慢,无法直接用于计算。
我在网上找了一些公式,但都没能成功计算出结果,最后查询了Sympy中关于该常数的源代码,并将之缩写为本程序。
本程序基于Lupas于2000年提出的以下公式(见此页面的说明和参考文献),这也是Sympy和Wolfram Alpha中所使用的公式。
$$K=\frac{1}{64}\sum_{n=1}^{\infty}\frac{(-1)^{n-1}2^{8n}(40n^2-24n+3)[(2n)!]^3(n!)^2}{n^3(2n-1)[(4n)!]^2}.$$
用一个循环来求和,每个求和项可以拆分为两部分
$$a_n=\frac{2^{8n}[(2n)!]^3(n!)^2}{[(4n)!]^2} \quad \text{和} \quad b_n=\frac{(-1)^{n-1}(40n^2-24n+3)}{n^3(2n-1)}$$
$a_n$涉及到阶乘,因此需要随循环动态更新,$b_n$只需由循环变量$n$即时生成。其中
\begin{align*}
\frac{a_n}{a_{n-1}}&=\frac{2^{8n}[(2n)!]^3(n!)^2}{[(4n)!]^2}\cdot\frac{[\left(4(n-1)\right)!]^2}{2^{8(n-1)}[\left(2(n-1)\right)!]^3[(n-1)!]^2} \\
&=\frac{2^8[(2n-1)(2n)]^3n^2}{[(4n-3)(4n-2)(4n-1)(4n)]^2} \\
&=\frac{2^{11}(2n-1)^3n^5}{8^2(4n-3)^2(2n-1)^2(4n-1)^2n^2} \\
&=\frac{32(2n-1)n^3}{(16n^2-16n+3)^2}. \\
\end{align*}
即以下源码中关于变量$a$的代码由来。
循环应当在$s$不再增加时终止,因本题中需要的精度固定,测算出此时$n=1668$。以此作为while语句的条件从而进一步压缩代码。
注意:与符号计算不同,a*=32*x*n**3与s//64中的公因子32不能直接约去,否则(因循环节的求和中有许多整除计算)会有很大误差。
最终代码只有三行。
代码长度:150字节 vs. 全站第一:74字节。
a,s,n=10**1002,0,1
while(x:=2*n-1)<3336:a*=32*x*n**3;a//=(3-16*n+16*n*n)**2;s+=a*(-1)**(n-1)*(40*n*n-24*n+3)//x//n**3;n+=1
print("0."+str(s//64)[:-2])
|