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

打印欧拉γ常数的前1000位(小数点后999位),其中 γ=limn(k=1n1k)lnn.
本题难度:



解答

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

查询Sympy中关于该常数的源代码,使用的是所谓Brent-McMillan公式: γ=limnk=0(nkk!)2Hkk=0(nkk!)2lnn, 其中H0=0Hk=1+1/2+1/3++1/k,误差界大约是O(e4n),收敛非常快。

不过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])