免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: softsongs
打印 上一主题 下一主题

计算 1000! 源代码 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-04-29 22:15 |只看该作者

  1. (define (factorial n)
  2.   (define (f p i)
  3.     (if (> i n) p
  4.       (f (* i p) (+ i 1))))
  5.   (f 1 1))
复制代码


很土的实现,没用任何技巧。不过 guile 在背后使用 gmp,所以大整数乘法是由 gmp 做的,但没有用 gmp 的阶乘函数。

看一下时间:

[ 本帖最后由 win_hate 于 2007-4-29 22:19 编辑 ]

fc1.PNG (11.47 KB, 下载次数: 50)

不带输出

不带输出

fc2.PNG (12.54 KB, 下载次数: 45)

带输出

带输出

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
12 [报告]
发表于 2007-04-29 22:34 |只看该作者
gmp的结果是:
real    0m0.193s
user    0m0.080s
sys     0m0.000s


  1. #include <stdio.h>
  2. #include <gmp.h>

  3. void show(mpz_t show)
  4. {
  5.         char* str=mpz_get_str(NULL,10,show);
  6.         printf("%s\n",str);
  7.         free(str);       
  8. }
  9. int main()
  10. {
  11.         mpz_t mul,res,one;
  12.         mpz_init(mul);
  13.         mpz_init(res);
  14.         mpz_init(one);
  15.         mpz_set_ui(mul,1L);  //mul=1;
  16.         mpz_set_ui(res,1L);        //res=1;
  17.         mpz_set_ui(one,1L);        //one=1;

  18.         int i;
  19.         for(i=0;i<10000;i++)
  20.         {
  21.                 mpz_mul(res,res,mul);        //res=res*mul;
  22.                 mpz_add(mul,mul,one);        //mul++;
  23.         }
  24.        
  25.         show(res);

  26.         return (0);
  27. }
复制代码

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
13 [报告]
发表于 2007-04-29 22:38 |只看该作者
原帖由 win_hate 于 2007-4-29 21:52 发表
gmp 是这样处理的:

1) n! 分解成 2^m p_1^a_1 p_2^a_2 ... p_r^a_r

2)2^m 只不过是移位

3)其余素因子按方幂分组,即同次的放在一起,变成 (q_1 q_2 ... q_t)^a 的形式。由于我们能快速计算方幂,所以 ...


gmp中求n!的函数是哪个?我没找到啊!

论坛徽章:
0
14 [报告]
发表于 2007-04-29 23:14 |只看该作者
是这个吧:


  1. void mpz_fac_ui (mpz t rop, unsigned long int op)
复制代码


  1. #include <stdio.h>
  2. #include <gmp.h>

  3. int
  4. main ()
  5. {
  6.         int n=10000;
  7.         mpz_t r;

  8.         mpz_init (r);
  9.         mpz_fac_ui (r, n);
  10.         mpz_out_str (stdout, 10, r);
  11. }
复制代码

[ 本帖最后由 win_hate 于 2007-4-29 23:19 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2007-04-30 08:55 |只看该作者
还是Gmp快.
大数的运算一般来说是没有必要自己实现的.

我也看过一个基于gmp计算圆周率的数值程序, 速度比日本人写的Super Pai要快.

论坛徽章:
0
16 [报告]
发表于 2007-04-30 09:01 |只看该作者
FreeBSD中ports里面的libgmp对gmp如下评述
GMP is believed to be faster than any other similar library. The
advantage for GMP increases with the operand sizes for certain
operations, since GMP in many cases has asymptotically faster
algorithms.

论坛徽章:
0
17 [报告]
发表于 2007-04-30 09:01 |只看该作者
原帖由 doctorjxd 于 2007-4-29 16:55 发表
还是Gmp快.
大数的运算一般来说是没有必要自己实现的.

我也看过一个基于gmp计算圆周率的数值程序, 速度比日本人写的Super Pai要快.


super \pi算法其实不快的,主要用来测cpu速度了,呵呵。

论坛徽章:
0
18 [报告]
发表于 2007-04-30 09:10 |只看该作者
原帖由 emacsnw 于 2007-4-30 09:01 发表


super \pi算法其实不快的,主要用来测cpu速度了,呵呵。


同意, 但是一开始这个项目是用来在大型机上计算Pai的.

论坛徽章:
0
19 [报告]
发表于 2007-04-30 10:12 |只看该作者
恩,学习了,谢谢!
等哪天需要更加快速的计算大数阶乘时,我可能会考虑GMP算法。

原帖由 win_hate 于 2007-4-29 21:52 发表
gmp 是这样处理的:

1) n! 分解成 2^m p_1^a_1 p_2^a_2 ... p_r^a_r

2)2^m 只不过是移位

3)其余素因子按方幂分组,即同次的放在一起,变成 (q_1 q_2 ... q_t)^a 的形式。由于我们能快速计算方幂,所以 ...

论坛徽章:
0
20 [报告]
发表于 2007-04-30 10:14 |只看该作者
看来俺的速度gmp还有一个数量级的差距。
主要原因是没有利用计算机计算方幂快的性质, 恩。

谢谢醉卧水云间 兄的关注!

原帖由 醉卧水云间 于 2007-4-29 22:34 发表
gmp的结果是:
real    0m0.193s
user    0m0.080s
sys     0m0.000s

[code]
#include <stdio.h>
#include <gmp.h>

void show(mpz_t show)
{
        char* str=mpz_get_str(NULL,10,show);
         ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP