C#,欧拉常数(Euler Constant)的算法与源代码
1 欧拉常数
欧拉常数最先由瑞士数学家莱昂哈德· 欧拉 (Leonhard Euler) 在1735年发表的文章《De Progressionibus harmonicus observationes》中定义。欧拉曾经使用γ作为它的符号,并计算出了它的前6位,1761年他又将该值计算到了16位 。
欧拉常数最先由瑞士数学家莱昂哈德·欧拉(Leonhard Euler)在1735年发表的文章 De Progressionibus harmonicus observationes 中定义。欧拉曾经使用C作为它的符号,并计算出了它的前6位小数。1761年他又将该值计算到了16位小数。1790年,意大利数学家马歇罗尼(Lorenzo Mascheroni)引入了γ作为这个常数的符号,并将该常数计算到小数点后32位。但后来的计算显示他在第20位的时候出现了错误。欧拉数以世界著名数学家欧拉名字命名;还有一个鲜为人知的名字纳皮尔常数,用来纪念苏格兰数学家约翰·纳皮尔 (John Napier) 引进对数 。
2 计算结果
3 源程序
using System;
namespace Legalsoft.Truffer.Algorithm
{
public static partial class Number_Sequence
{
private static double doubleFactorial(int n)
{
if (n == 1) return 1;
else return n * doubleFactorial(n - 1);
}
public static double Euler_Constant(int n)
{
if (n == 0) return 1;
else return (1 / doubleFactorial(n) + Euler_Constant(n - 1));
}
}
}
欧拉常数(Euler-Mascheroni constant)
欧拉-马歇罗尼常数(Euler-Mascheroni constant)是一个主要应用于数论的数学常数。它的定义是调和级数与自然对数的差值。
学过高等数学的人都知道,调和级数S=1+1/2+1/3+……是发散的,证明如下:
由于ln(1+1/n)<1/n (n=1,2,3,…)
于是调和级数的前n项部分和满足
Sn=1+1/2+1/3+…+1/n>ln(1+1)+ln(1+1/2)+ln(1+1/3)+…+ln(1+1/n)
=ln2+ln(3/2)+ln(4/3)+…+ln[(n+1)/n]
=ln[2*3/2*4/3*…*(n+1)/n]=ln(n+1)
由于
lim Sn(n→∞)≥lim ln(n+1)(n→∞)=+∞
所以Sn的极限不存在,调和级数发散。
但极限S=lim[1+1/2+1/3+…+1/n-ln(n)](n→∞)却存在,因为
Sn=1+1/2+1/3+…+1/n-ln(n)>ln(1+1)+ln(1+1/2)+ln(1+1/3)+…+ln(1+1/n)-ln(n)
=ln(n+1)-ln(n)=ln(1+1/n)
由于
lim Sn(n→∞)≥lim ln(1+1/n)(n→∞)=0
因此Sn有下界
而
Sn-S(n+1)=1+1/2+1/3+…+1/n-ln(n)-[1+1/2+1/3+…+1/(n+1)-ln(n+1)]
=ln(n+1)-ln(n)-1/(n+1)=ln(1+1/n)-1/(n+1)
将ln(1+1/n)展开,取其前两项,由于舍弃的项之和大于0,故
ln(1+1/n)-1/(n+1)>1/n-1/(2n^2)-1/(n+1)=1/(n^2+n)-1/(2n^2)>0
即ln(1+1/n)-1/(n+1)>0,所以Sn单调递减。由单调有界数列极限定理,可知Sn必有极限,因此
S=lim[1+1/2+1/3+…+1/n-ln(n)](n→∞)存在。
于是设这个数为γ,这个数就叫作欧拉常数,他的近似值约为0.57721566490153286060651209,目前还不知道它是有理数还是无理数。在微积分学中,欧拉常数γ有许多应用,如求某些数列的极限,某些收敛数项级数的和等。例如求lim[1/(n+1)+1/(n+2)+…+1/(n+n)](n→∞),可以这样做:
lim[1/(n+1)+1/(n+2)+…+1/(n+n)](n→∞)=lim[1+1/2+1/3+…+1/(n+n)-ln(n+n)](n→∞)-lim[1+1/2+1/3+…+1/n-ln(n)](n→∞)+lim[ln(n+n)-ln(n)](n→∞)=γ-γ+ln2=ln2
4 代码格式
using System;
namespace Legalsoft.Truffer.Algorithm
{
public static partial class Number_Sequence
{
private static double doubleFactorial(int n)
{
if (n == 1) return 1;
else return n * doubleFactorial(n - 1);
}
public static double Euler_Constant(int n)
{
if (n == 0) return 1;
else return (1 / doubleFactorial(n) + Euler_Constant(n - 1));
}
}
}