计算器上阶乘如何实现?
阶乘一般写为 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的收敛性分析?)
有没有其他合适的计算公式推荐?
计算器上支持小数的阶乘运算,一般内部为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的收敛性分析?)
有没有其他合适的计算公式推荐?
...全文
相关推荐
大整数计算器四则运算,阶乘
以字符形式存储,可进行上百位大整数之间的四则元素,加减,阶乘
Java递归阶乘计算器实现与GUI设计
在数学中,阶乘表示的是从1乘到某个给定正整数的所有正整数的乘积。用符号n!表示,定义如下:当n是正整数且n>=1时,n!。特殊地,规定0!= 1。阶乘的计算在组合数学中经常出现,它描述了在没有任何重复元素的情况下,从n个不同元素中取出kk<=n)个元素的组合数,即C(n,k) = n!/ (k!* (n-k)!。随着n的增大,n!的值迅速增长,这对计算机算法的设计和性能优化提出了挑战。
阶乘计算器
尽我所能以较快的速度可以完成10000!运算(可以算更大的),这里将算法共享给大家
阶乘计算器(delphi)
编程实现计算:1!+2!+3!+……+N!的值,N的值由用户输入。要求定义并调用函数计算N!。
java阶乘计算器,用来计算阶乘
java窗体程序阶乘计算器,输入整形数据,然后输出结果。如果数据过大,会造成输出有误。


