- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12785
- 在线时间
- 小时
|
楼主 |
发表于 2016-4-14 20:39:42
|
显示全部楼层
这里给出C语言的源代码,可在VC下编译并运行。
- #include <stdlib.h>
- #include <stdio.h>
- #include <limits.h>
- typedef unsigned __int64 UINT64;
- typedef unsigned long DWORD;
- /*
- Get more details from http://bbs.emath.ac.cn/thread-8885-1-1.html
- The numerator of a_i = http://oeis.org/A028329
- let x=2y, then
- arcsin(x)
- = 2y + (2^3)(1!!/2!!)(y^3)/3 + 2^5(3!!/4!!)(y^5)/5 + (2^7)(5!!/6!!)(y^7/7) +...
- = 2y + (2^2)(1!!/1!)(y^3)/3 + 2^3(3!!/2!)(y^5)/5 + (2^4)(5!!/3!)(y^7/7) +...
- a_n
- = (2^n) ((2n-3)!!/(n-1)!)(y^(2n-1))/(2n-1)
- */
- void print_arcsin_cofficient( int len)
- {
- UINT64 p0,p1;
- UINT64 d,n;
- UINT64 c1,c2,c4,c6;
- UINT64 max_uint64;
- int i;
- max_uint64=ULLONG_MAX;
- c1=1; c2=2; c4=4; c6=6;
-
- i=1;p0=2;d=1;
- printf("$a_%d=%I64u/%I64u$\n",i,p0,d);
-
- for (i=2;i<=(UINT64)len;i++)
- {
- UINT64 r;
-
- n=i;
- if ( p0 > max_uint64/(c4*n-c6) ) //the next step will overflow
- break;
- p1= p0 * ( c4*n-c6); // p1=p0 * 2 * (2*n-3)=p0*(4*n-6)
- r= p1 % (n-c1);
- if ( r != 0 )
- {
- printf("Error when i=%u64\n", i); return ;
- }
-
- p1/=(n-c1); //p1=p0*2*(2*n-3)/(n-1);
- d=c2*n-c1; //d=2n-1
-
- p0=p1;
- printf("$a_%d=%I64u/%I64u$\n",i,p0,d);
- }
- }
- int main(int argc, char* argv[])
- {
- print_arcsin_cofficient(40);
- return 0;
- }
复制代码
|
|