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

打印欧拉$\gamma$常数的前1000位(小数点后999位),其中 $$\gamma=\lim_{n\to\infty}(\sum_{k=1}^n\frac{1}{k})-\ln n.$$
本题难度:



解答

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

查询Sympy中关于该常数的源代码,使用的是所谓Brent-McMillan公式: $$\gamma=\lim_{n\to\infty}\frac{\sum_{k=0}^{\infty}(\frac{n^k}{k!})^2H_k}{\sum_{k=0}^{\infty}(\frac{n^k}{k!})^2}-\ln n,$$ 其中$H_0=0$,$H_k=1+1/2+1/3+\ldots+1/k$,误差界大约是$O(e^{-4n})$,收敛非常快。

不过Sympy中封装了一层十进制与二进制之间的精度转换控制,计算比较繁琐,因而此处的代码改写自此页面的Mathematica代码,使用的公式相同。

最终代码有七行。

代码长度:165字节 vs. 全站第一:81字节。

from decimal import*
getcontext().prec,d=1002,Decimal
n=d(999)
a=u=-d(n).ln()
b=v=i=d(1)
while i<2900:k=(n/i)**2;a*=k;b*=k;a+=b/i;u+=a;v+=b;i+=1
print(str(u/v)[:-2])