计算器上阶乘如何实现?
阶乘一般写为 n! ,如果为正整数则,n!=n*(n-1)*(n-2)...*3*2*1;
计算器上支持小数的阶乘运算,一般内部为gamma函数(Γ函数)实现, gamma(n+1)=n!
如果只支持到双精度浮点(1e-16)以内,那么一般用近似公式就可实现,如: http://www.rskey.org/CMS/index.php/the-library/11;
gamma函数,wiki上的介绍: http://en.wikipedia.org/wiki/Gamma_function
我现在想实现更高的精度(上千位),并支持更大的n输入值
当n为正整数数时,n!=n*(n-1)*(n-2)...*3*2*1 ; 可以用统计表达式质因数个数的方法(素数筛法,并快速获得因数个数),这样n在千万级别速度都不是太大问题;
( 当n<0.5时 , gamma(n)=PI/(gamma(1-n)*sin(PI*n)) ,这样,就只剩下>0.5的正实数的通用求解方法 (当输入为正整数+0.5 时, gamma(n+0.5)= (2n)!*PI^0.5/(n!*4^n); ) )
当n为正实数时,我借鉴了这篇文章,gamma函数表达为一个级数和一个连分数:
http://www.cws.net.cn/Journal/slxb/199912/13.html
其中,连分数的收敛性很差,运行慢;
我从该文章整理的计算公式: Γ(x)=e^(x*ln(y)-(y))*[S(x,y)+U(x,y)]
S(x,y)=y^0/x + y^1/(x*(x+1)) + y^2/(x*(x+1)*(x+2)) + ...
U(x,y)=a0/(Q0*Q1)-a0*a1/(Q1*Q2)+a0*a1*a2/(Q2*Q3)- ...
a0=1; a(k)= ((k+1)>>1)-x ,k%2==1; a(k)=((k+1)>>1), k%2==0;
b0=0; b(k)= y ,k%2==1; b(k)=1,k%2==0;
Q(-1)=0; Q0=1; Q(k)=b(k)*Q(k-1)+a(k-1)*Q(k-2);
其中(作者建议)y取,y=x+1
但Γ(x)当x==172时,计算结果不对(文章作者也应该只是在双精度内验证过),这时修改y为其他值,还可以继续计算,我寻找了更多的可能y值,但当x==244时,适应性最强的y=x+718也失败; 有没有可能得到其他合适的y的计算方法?(根据U的收敛性分析?)
有没有其他合适的计算公式推荐?