Catalan常数
* * * *
拉格朗日计划
* * * *
Catalan常数

Catalan常数是 $$K=\sum_{n=1}^{\infty}\frac{(-1)^{n-1}}{(2n-1)^2}=1-\frac{1}{3^2}+\frac{1}{5^2}-\frac{1}{7^2}+\ldots$$ 注意该常数与组合数学中的Catalan数无关。

打印Catalan常数的前1000位(小数点后999位)。

本题难度:



解答

定义式收敛非常慢,无法直接用于计算。

我在网上找了一些公式,但都没能成功计算出结果,最后查询了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])